Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: firius2010 en 21 Marzo 2012, 22:56 pm



Título: ayuda porfavor es urgente
Publicado por: firius2010 en 21 Marzo 2012, 22:56 pm
Buenas, un gusto en conocerlos mi nombre es fausto Orozco estudiante de ing electronica de colombia y ps lo que pasa es q acudo a uds porq no e sido capaz de hacer un programa que me pusieron como ejercicio en la u apenas voy en 3 semestre y ps el programa consiste en que:
tiene que recivir una ecuacion f(x) ej
3x/2x↑2
ademas debe de recibir un valor  para x eje
x=5
y mi programa debe de mostrar en pantalla la funcion tabulada
de antemano muchas gracias


Título: Re: ayuda porfavor es urgente
Publicado por: $Edu$ en 21 Marzo 2012, 23:02 pm
Si es tan urgente apurate ya ya ya y deja tu intento


Título: Re: ayuda porfavor es urgente
Publicado por: firius2010 en 22 Marzo 2012, 00:00 am
ps e escrito esto pero en realidad tengo varios problemas

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    char ecu1[100],cad,ecu[200],cad1;
    int a,i=0;
    printf("si va a ingresar por ej 2x+3x ingrese 2*x+3*x\n");
    printf("ingrese ecuacion:\n");
    gets(ecu1);
    printf("valor de x:");
    scanf("%c",&cad);
    printf("\n");
    a=strlen(ecu1);
    for(i=0;i<a;i++)
    {
        if(ecu1=='x')
        {
            ecu1=cad;
        }
    }
    if((ecu1!='+')&&(ecu1!='*')&&(ecu1!='-')&&(ecu1!='/')&&(ecu1!='R')&&(ecu1!='^'))
    {
        for(i=0;i<a;i++)
        {
            cad1=ecu1;
            strcpy(ecu,cad1);
            if((ecu1[i+1]!='+')&&(ecu1[i+1]!='*')&&(ecu1[i+1]!='-')&&(ecu1[i+1]!='/')&&(ecu1[i+1]!='R')&&(ecu1[i+1]!='^'))
            {
               cad1=ecu1(i+1);
               strcat(ecu,)
            }

        }
    }
    return(0);
}


bueno mi problema radica en que quiero por ej tengo en una cadena de caracteres supongamos  32*85+65 supongamos y lo que pasa es q no puedo operar con ellos ya que el 32 no esta en una posicion sino en 2  posiciones diferentes y no se como hacer para crear el codigo que me interprete eso como el numero completo hasta llegar al operador logico no se si me hago entender muchas gracias


Título: Re: ayuda porfavor es urgente
Publicado por: $Edu$ en 22 Marzo 2012, 00:34 am
Deja un ejemplo de que tiene que ingresar el usuario y que mostrara tu programa porque no he entendido bien y tal vez los demas tampoco. Con dejar 2 o 3 ejemplos siempre sirve mucho


Título: Re: ayuda porfavor es urgente
Publicado por: firius2010 en 22 Marzo 2012, 02:25 am
ok vale
entonces el usuario debera de ingresar alguna funcion que el desee evaluar ej
(x^2+3 x-2)/x^3
e ingresa el valor de x q quiere evaluar entocnes mi programa de be de tabular ese punto es decir si ingreso 1 por ej como valor de x mi progrma debera de hacer
(1^2+3(1)-2)/1^3=2
 espero haberme echo entender


Título: Re: ayuda porfavor es urgente
Publicado por: x64core en 22 Marzo 2012, 09:53 am
con una variable int es suficiente para lo basico, el dato lo obtienes con cualquier funcion para
recibir datos y luego pasas esa variables por todas tus operaciones :P
por ejemplo:

// valor con 5
int value;


int function_operations(int nvalue)
{
     nvalue = (nvalue * 3 ) -  (nvalue += 30);
    return nvalue;
}


nose esas son operaciones simples que sé yo que es lo que queres hacer...
podes usar una variables temporal en donde podas almacenar el resultado temporal, y retornarlo a la funcion esto si es el caso que te
preocupa que se modifique la variables pasada a la funcion pero no te preocupes si es así porque así como muestro se pasa por valor,
no se modificara.


Título: Re: ayuda porfavor es urgente
Publicado por: Xandrete en 22 Marzo 2012, 11:05 am
ok vale
entonces el usuario debera de ingresar alguna funcion que el desee evaluar ej
(x^2+3 x-2)/x^3
e ingresa el valor de x q quiere evaluar entocnes mi programa de be de tabular ese punto es decir si ingreso 1 por ej como valor de x mi progrma debera de hacer
(1^2+3(1)-2)/1^3=2
 espero haberme echo entender

¿Cómo dice usted? Si lo he entendido bien, se ha de ingresar nada más y nada menos que una expresión con literales (ocurrencias de x). sustituir el literal por un valor que ingresa el usuario posteriormente y efectuar la operación.

Creo que, o no has entendido bien el problema, o se pasan en tu universidad (sobre todo teniendo en cuenta que haces el 3er semestre de una ingeniería electrónica), o te has expresado con ambigüedad. ¿Te das cuenta de la envergadura de lo que dices?

El programa tendría que ser una especie de intérprete. Debería reconocer varias funciones básicas y variantes(exponenciación, funciones trigonométricas, cociente, logaritmos, composición, multiplicación por constantes, suma de constantes, suma de funciones, producto de funciones...). Además tendrías que decidir qué hace tu programa si el usuario ingresa una expresión con errores de sintaxis si no te garantizan que la entrada va a ser válida siempre. Es decir, poco más o menos te están pidiendo una calculadora científica. Comprueba bien qué es lo que te piden, porque dudo mucho que sea eso. Otra cosa es que te pidan evaluar siempre la misma función, o que simplemente tengas que sustituir las x de la cadena de entrada por el valor numérico ingresado por el usuario, y retornar la cadena con los valores sustituidos (sin efectuar ninguna operación). Estaría bien que pusieras un ejemplo de entrada/salida tal y como dice $EdU$, pero en el siguiente formato:

Entrada

x^2+2x+1
-1

1/(x-1)
0

Salida

0

1

Este ejemplo de entrada/salida correspondería al de una calculadora científica.

Otro ejemplo es:

x^2+2x+1
-1

1/(x-1)
0

Salida

(-1)^2+2(-1)+1

1/((0)-1)

Este ejemplo se correspondería a un programa que únicamente cambiara las x por el número que te da el usuario.

Saludos


Título: Re: ayuda porfavor es urgente
Publicado por: $Edu$ en 22 Marzo 2012, 14:11 pm
Claro, pregunta bien a tu profesor que es lo que quiere.., lo que quieres hacer lo hice hace 1 año y me costo como 2 meses, que el usuario ponga una ecuacion por ejemplo: 2x^2+3x(4+5x)3-6=9x+8-20x  y mi programa te resuelve el valor de X. En tu caso seria un poquito mas facil porque solo tendrias que sustituir la X con lo que ingreso el usuario, es distinto, pero tienes muchas cosas igual, pensa como harias para dividir la ecuacion en los terminos que tenga y luego ubicar la X en cada caso para sustituirla por el numero que ingreso el usuario (todo esto siempre usando el string que ingreso el usuario, mucho manejo de cadenas) y luego que sustituiste en cada termino la X por el num que ingreso el usuario, empiezas a ver como lo interpretas para poder hacer la operacion en cada termino y luego sumarlos.

Veras que es complicado y muchas horas debuggeando te pasaras xD Por que tienes que fijarte todas las posibles ecuaciones que te pondria el usuario, la pueden embarrar tanto que te cagaria tu codigo xD


Título: Re: ayuda porfavor es urgente
Publicado por: Caballo_Alado en 22 Marzo 2012, 15:02 pm
Claro, pregunta bien a tu profesor que es lo que quiere.., lo que quieres hacer lo hice hace 1 año y me costo como 2 meses, que el usuario ponga una ecuacion por ejemplo: 2x^2+3x(4+5x)3-6=9x+8-20x  y mi programa te resuelve el valor de X. En tu caso seria un poquito mas facil porque solo tendrias que sustituir la X con lo que ingreso el usuario, es distinto, pero tienes muchas cosas igual, pensa como harias para dividir la ecuacion en los terminos que tenga y luego ubicar la X en cada caso para sustituirla por el numero que ingreso el usuario (todo esto siempre usando el string que ingreso el usuario, mucho manejo de cadenas) y luego que sustituiste en cada termino la X por el num que ingreso el usuario, empiezas a ver como lo interpretas para poder hacer la operacion en cada termino y luego sumarlos.

Veras que es complicado y muchas horas debuggeando te pasaras xD Por que tienes que fijarte todas las posibles ecuaciones que te pondria el usuario, la pueden embarrar tanto que te cagaria tu codigo xD


Pienso igual, es muy, muy complicado... A menos de que haya alguna función (que desconozco ) que te interprete bien las operaciones suma,resta,etc te llevara mucho tiempo

Quizá te sirva esto  :xD :

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {   int x,ecu;
  5.    printf("VALOR PARA X: ");
  6.    scanf("%d",&x);
  7.    ecu=x*2+3-2; //ESTO ES LO QUE CAMBIAS XD
  8.    printf("EL RESULTADO ES: %d",ecu);
  9. }

salu2


Título: Re: ayuda porfavor es urgente
Publicado por: theluigy13etv en 22 Marzo 2012, 16:38 pm
Waaaaa te piden algo así como un analizador sintáctico.... leélo en una cadena y después no sé que haces, pero ufff, eso es complicado.


Título: Re: ayuda porfavor es urgente
Publicado por: durasno en 22 Marzo 2012, 18:08 pm
Hola firius2010! Es verdad como dicen todos el problema q planteas es bastante complicado pero como todo nada es imposible. El problema es cuanto sabes vos, lo primero que se me ocurre es con funciones como strpbrk( para buscar una subcadena en otra), strtod ( para convertir el numero de la cadena en double), tambien podria servir la funcion issdigit
Lo pasos seria algo asi:
1º pedir la formula al usuario
2º pedir el valor de 'x'
3º reemplazar la 'x' en la formula
4º Convertir el primer numero de la ecuacion a su representacion numerica(lo mas probable sea q se tenga q almacenar en una variable auxiliar)
5º Si se encuentra una operacion,* / -  +, tambien lo mas conveniente seria almacenarla
6º repetir pasos 4 y 5 hasta q sea fin de la cadena
7º imprimir resultado


Título: Re: ayuda porfavor es urgente
Publicado por: $Edu$ en 22 Marzo 2012, 18:51 pm
Pero esque es mas complicado que eso, cuando hay parentesis se complica todo, te digo porque yo lo hice. Fijate cuando pongan una ecuacion con parentesis y todo, se tiene que hacer primero lo del parentesis para despues hacer lo demas y todo asi es complicado xD

Si de verdad es eso lo que tienes que hacer y te dieron mucho tiempo para hacerlo te puedo detallar todo como lo hice, luego tu le implementas en C++ cosa que yo no se.


Título: Re: ayuda porfavor es urgente
Publicado por: nirvguy en 22 Marzo 2012, 19:01 pm
Usa Bison y Lex se hace más rápido.


Título: Re: ayuda porfavor es urgente
Publicado por: Xandrete en 23 Marzo 2012, 09:35 am
Usa Bison y Lex se hace más rápido.

Por otro lado, si nos apartamos de C/C++, también hay lenguajes de programación como el de Matlab que te permiten hacer un eval sobre una cadena de carácteres y entonces pasan el contenido de esa cadena al intérprete. Diría que con Python tienes algo parecido. Si puedes usar alguno de estos lenguajes, podrías hacer esto en un periquete.

Hola firius2010! Es verdad como dicen todos el problema q planteas es bastante complicado pero como todo nada es imposible.

¡Claro que no es imposible! De hecho, es lo que hace el intérprete del Python, por ejemplo (que se puede usar como una simple calculadora). Sin embargo, para que el usuario que ha iniciado este post se haga una idea de lo que se puede complicar este programa, le sugiero realizar el siguiente problema, que es una versión mucho más suave de éste que nos plantea: https://www.jutge.org/problems/P45102_en (https://www.jutge.org/problems/P45102_en)

Saludos

P.S. Ah, y otra cosa que se me olvidó comentar e el anterior post. También sugiero usar títulos más descriptivos para sus temas en el foro. "ayuda porfavor es urgente" está muy manido y no ofrece ninguna información de antemano que motive a leerlo. Además es antiestético ver un puñado de temas con nombres de este estilo.