Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - K-YreX

#641
Programación C/C++ / Re: funcion coseno
29 Marzo 2019, 02:29 AM
Hay un problema con el factorial que si intentamos calcular factoriales muy grandes como por ejemplo 24! que llega a calcularse en ese programa que muestras, se produce un desbordamiento. El <num_terminos> muestra la precisión porque determina el número de términos que se van a calcular.

Además hay que tener en cuenta que los ángulos se pasan en radianes. Por lo que 10 radianes es mucho. Para que funcione correctamente hay que reducir el ángulo a la primera vuelta. Reduciendo un poco el número de términos para evitar el desbordamiento del factorial, ya salen resultados bastante bien aproximados.
Código (cpp) [Seleccionar]

// aproximacion del numero PI
const double PI = 3.141592;

long double coseno(double numero)
{
        // reduce el angulo a la primera vuelta de forma simple
while(numero > 2*PI)
numero -= 2*PI;
long double cos=0;
int terminos=10, exponente=0;
for(size_t i = 0; i < terminos; i += 2, exponente++)
    cos += pow(-1,exponente) * pow(numero,i)/factorial(i);
    return cos;
}
#642
Programación C/C++ / Re: funcion coseno
29 Marzo 2019, 01:20 AM
En C++ el bucle para calcular la fórmula sería algo así:
Código (cpp) [Seleccionar]

double cos = 0;
int exponente = 0;
for(size_t i = 0; i < num_terminos * num_terminos; i += 2, exponente++)
    cos += pow(-1,exponente) * pow(x,i)/factorial(i);


Y si la función factorial la modificas un poco, te ahorras una llamada para calcular cada factorial:
Código (cpp) [Seleccionar]

int factorial(int n){
    if(n < 1)
        return 1;
    else
        return n * factorial(n-1);
}
#643
No sé qué parte es la que quieres que te explique pero imagino que es la solución a tu pregunta. Tienes un fichero de texto que guarda:

string (VARIABLE) + char (A/B/C) + char (=) + int (numero)

Lo que tú haces es guardar caracter a caracter en <c> e ir mostrándolos. En lugar de eso crea una variable de tipo <string>, otras dos de tipo <char> y otra de tipo <int>. Entonces guardas en la de tipo <string> la palabra "VARIABLE", en la primera de tipo <char> la letra y en la segunda el "=" y en la de tipo <int> el número. Entonces puedes mostrar sólo la de tipo <int> para mostrar el número o hacer un condicional que si la variable que guarda la letra es igual a {A, B, C} muestre el valor de la de tipo <int> y sino no.
Una vez tienes toda la información del fichero en variables puedes hacer lo que quieras con ello. Las variables las puedes sobreescribir para ahorrar en memoria ya que siempre vas a guardar "VARIABLE" e "=". Si quieres almacenar cada letra con su número correspondiente de forma más "permanente" (que puedas usarlas luego en el programa) entonces ya podrías hacerlo con un array de <char> y otro de <int> o usando clases o estructuras. Pero para lo que quieres hacer no es necesario.
#644
  • Aunque en el título pone C++ tiene toda la pinta de estar en C...
  • No uses la librería <conio.h> (no es estándar). La función <getch()> de <conio.h> se puede sustituir por <cin.get()> de <iostream> (C++) o por <getchar()> de <stdio.h> (C).
  • En vez de hacer un <if> para ver si la opción es distinta de 1 y 2, usa un filtro <do while> que es más común en vez de llamar a la función <main> dentro del propio <main>.
  • Cuando escribes en el fichero, escribes siempre A, cambialo para escribir B y C.
  • <return main()> mejor que no. Si quieres que se puedan hacer más veces las operaciones haz un bucle (por ejemplo mientras la opción sea distinta a 3 y si es 3 acabas)
  • Esas funciones mejor que sean void.


    Como conoces la estructura del fichero:

    string + char + char + int

    Crea una variable para guardar cada valor y luego ya haz lo que quieras con ello. Es decir para leer una línea, léela por palabras y luego muestra solo la variable de tipo <int> que es donde has guardado el número. Suerte :-X
#645
Programación C/C++ / Re: funcion coseno
28 Marzo 2019, 13:39 PM
Imagino que quieres una función que calcule el <cos(x)> usando el Polinomio de Taylor. La forma de pasar un único argumento es predefinir un número constante para <terminos>. Al fin y al cabo cuanto mayor sea <terminos>, mayor será la precisión/exactitud del resultado. Entonces puedes declarar como constante <terminos = 10> y usar siempre ese número.


Además me parece que el Polinomio de Taylor para la función <coseno> no es esa. La función <cos(x)> se aproxima usando el polinomio:

P(x) = 1 - x²/2! + x⁴/4! - x⁶/6! + x⁸/8!...

Y en tu caso estás calculando:

P(x) = - x²/2! + x⁴/3! - x⁶/4!...
#646
Coloca el código entre etiquetas de código GeSHi (hay un desplegable encima del cuadro de texto)...

El problema es que la función <strtok()> no se usa así. La primera vez se pasa la cadena original, y el resto de veces del bucle se pasa NULL como primer parámetro. Puedes mirar más información en otras fuentes. Suerte  :-X
#647
Cita de: sebapoli00 en 26 Marzo 2019, 18:56 PM
lo he intentado como dices pero no ha funcionado, aclaro que es en c++

el siguiente codigo es lo que he intentado pero no ha funcionado

char* invertirPalabra(char* palabra){
   int tamano = longitud(palabra);
   char * palabra2 = palabra;
   for (int i = 0; i<tamano; i++) {
      if (int (palabra) >= 97 && int(palabra) <= 122) {
         palabra2 = 'A' + (int(palabra) - 'a');
      }
      else if (int(palabra) >= 65 && int(palabra) <= 90) {
         palabra2 = 'a' + (int(palabra) - 'A');
      }
      else {
         palabra2 = palabra;
      }
   }
   return palabra;
}

int longitud(char *cadena)
{
   int i = 0;
   while (cadena != '\0')
      i++;
   return i;
}

Coloca el código entre etiquetas de código GeSHi (hay un desplegable encima del cuadro de texto)...


Lo primero decir que no hace falta que lo pases a ASCII. Los operadores < y > se pueden aplicar directamente a una variable de tipo <char>
Código (cpp) [Seleccionar]

if(caracter >= 'a' && caracter <= 'z')
    caracter = caracter - ('a' - 'A');
else if(caracter >= 'A' && caracter <= 'Z')
    //... este te lo dejo a ti;


Supongo que quieres cambiar la que se pasa como parámetro, no crear una nueva no?
Puedes usar el propio índice del <for> para recorrer toda la cadena y cambiar el valor que sea necesario sin usar punteros auxiliares. Suerte :rolleyes:
#648
Si quieres hacerlo usando alguna función predefinida, en la librería <cctype> (<ctype.h> para C) tienes dos funciones: <islower()> e <isupper()> que te indican si el caracter que le pasas está en mayúsculas o minúsculas. Pero el cambio de uno a otro lo tienes que hacer usando la idea de @CalgaryCorpus de todas formas.

Si no lo consigues puedes poner tu código (entre etiquetas) para que lo veamos y poder ayudarte.
Suerte :-X
#649
Pon el código que tengas para ver tus avances. Entonces podremos ayudarte, si te hacemos nosotros el trabajo no sirve de nada... :-X
PD: Tampoco sé si estás con C o con C++...
#650
Programación C/C++ / Re: Analisador Lexico
25 Marzo 2019, 12:45 PM
A qué te refieres con un analizador léxico??
Y si necesitas uno siempre puedes programarlo y comentar si te surge algún problema en el proceso y te podremos ayudar :-X