Autor
|
Tema: Ayuda (Leído 6,011 veces)
|
agustinp99
Desconectado
Mensajes: 6
|
|
Ayuda
« en: 10 Octubre 2019, 15:01 pm » |
|
Hola buen dia, tengo una duda con un ejercicio que me dieron. Tengo que armar una calculadora de polaca inversa y estoy tratando de, a partir de la ecuación brindada por el usuario, tomar el primer numero, el segundo, luego el signo y asi sucesivamente. El problema es que no logro hacerlo, ya que no encuentro alguna funcion o algo que me detecte si el caracter es un numero o un signo (ya que si es un espacio lo salteo con un if antes). Si alguien puede tirarme algun consejo se lo agradeceria!
|
|
|
En línea
|
|
|
|
agustinp99
Desconectado
Mensajes: 6
|
|
Re: Ayuda
« Respuesta #1 en: 10 Octubre 2019, 15:01 pm » |
|
Esto es en codigo C
|
|
|
En línea
|
|
|
|
K-YreX
|
|
Re: Ayuda
« Respuesta #2 en: 10 Octubre 2019, 15:09 pm » |
|
En vez de poner dos mensajes seguidos es mejor que modifiques el primero e incluyas lo que necesites. Para lo que quieres hacer tienes una librería que es <ctype.h> en la que tienes funciones como <isdigit()>, <isspace()>, <ispunct()>, <isgraph()>, etc. Vamos, para saber qué tipo de carácter tienes. Te dejo un enlace donde aparecen las funciones que tienes y una tabla para que veas qué caracteres se consideran de puntuación y cuáles se consideran graficables, etc. http://www.cplusplus.com/reference/cctype/?kw=cctype
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
agustinp99
Desconectado
Mensajes: 6
|
|
Re: Ayuda
« Respuesta #3 en: 10 Octubre 2019, 15:16 pm » |
|
Uh perfecto, ahora averiguo bien. Muchisimas gracias
|
|
|
En línea
|
|
|
|
agustinp99
Desconectado
Mensajes: 6
|
|
Re: Ayuda
« Respuesta #4 en: 10 Octubre 2019, 15:29 pm » |
|
En vez de poner dos mensajes seguidos es mejor que modifiques el primero e incluyas lo que necesites. Para lo que quieres hacer tienes una librería que es <ctype.h> en la que tienes funciones como <isdigit()>, <isspace()>, <ispunct()>, <isgraph()>, etc. Vamos, para saber qué tipo de carácter tienes. Te dejo un enlace donde aparecen las funciones que tienes y una tabla para que veas qué caracteres se consideran de puntuación y cuáles se consideran graficables, etc. http://www.cplusplus.com/reference/cctype/?kw=cctypeTengo otra duda, porque yo tengo que ingresar la ecuacion en notacion polaca al programa. Como puedo hacer para ir guardando el primer numero, el segundo y su signo? He visto que lo hacian con pilas pero mi profesor me dijo que lo trate de hacer de otra forma pero no me sale una idea ESTO ES LO QUE VENIA PENSANDO #include <stdio.h> #include <string.h> #include <ctype.h> int main() { char c[100]; char str[10]; int i; int u; printf ("Ingrese notacion polaca inversa: "); scanf ("%s",c); for (i=0;i<= strlen(c);i++){ if (isdigit(c ) && c!= " "){ str=c; u++; } } printf ("El numero guardado es %s", str); }
|
|
« Última modificación: 10 Octubre 2019, 15:31 pm por agustinp99 »
|
En línea
|
|
|
|
K-YreX
|
|
Re: Ayuda
« Respuesta #5 en: 11 Octubre 2019, 01:33 am » |
|
No está mal aunque hay que pulir un par de cosas: Antes de nada, los códigos ponlos entre etiquetas de Código GeSHi porque sino los índices no se ven y la i entre corchetes se convierte en cursiva y la u entre corchetes, en subrayado... - Para pedir una cadena al usuario no se usa <scanf()>, se usa <fgets()>
#define SIZE 100 // definimos un maximo de longitud para la cadena. Esto se pone justo despues de las librerias char cadena[SIZE]; printf("Introduce una cadena: "); fgets(cadena , SIZE , stdin );
El siguiente problema es que al introducir una cadena y pulsar ENTER, el ENTER también se guardará en la cadena. Esto lo arreglamos rápido así: cadena [strlen(cadena )-1] = '\0';
- La segunda condición de tu bucle <while()> es innecesaria. Preguntas si <c> es un dígito Y si no es un espacio... Siempre que se cumpla que es un dígito, se cumplirá también que no es un espacio. Y si no es un dígito, la segunda condición dará igual.
Si lo que quieres conseguir es el resultado de calcular la expresión en notación polaca inversa, te falta esa parte.
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
dijsktra
Desconectado
Mensajes: 110
Mr Edsger Dijsktra (Tribute to)
|
|
Re: Ayuda
« Respuesta #6 en: 11 Octubre 2019, 15:37 pm » |
|
Tengo otra duda, porque yo tengo que ingresar la ecuacion en notacion polaca al programa. Como puedo hacer para ir guardando el primer numero, el segundo y su signo? He visto que lo hacian con pilas pero mi profesor me dijo que lo trate de hacer de otra forma pero no me sale una idea
Las pilas por debajo están simuladas con vectores... O sea, que expones los vectores que se ocultarían en la implementación de una pila normalemente... EDITOEn esta versión implemento un analizador de notación polaca inversa. Esto es, primero los operandos y después el operador. Como en (3 4 -) /* An stack can be simulated by a vector +-----+ | | +-----+ N | 2 | +-----+ | 1 | +-----+ | + | +-----+ 0 */ #include <stdlib.h> #include <stdio.h> #include <assert.h> #include <string.h> #define MAX 100000 #define DEBUG int polish (const char V[][25], const int N) { int n,top; int S[MAX]; for( n=top=0;n<N;n++) { #ifdef DEBUG int i; for( i=n ; i < N ; i++) printf("%s ",V[i]); printf("\n\n"); #endif if (strtol(V[n],NULL,10)) S[top++]=atoi(V[n]); else { assert(top>1); const int a = S[--top]; const int b = S[--top]; if (!strcmp(V[n],"+")) S[top++] = a + b; else if (!strcmp(V[n],"-")) S[top++] = a - b; else if (!strcmp(V[n],"*")) S[top++] = a * b; else if (!strcmp(V[n],"/")) { assert(!b); S[top++] = a / b; } } #ifdef DEBUG for( i=0 ; i < top-1 ; i++) printf("%d ",S[i]); printf("%d\n\n",S[top-1]); #endif }; assert(top==1); return S[--top]; } int main(int argc, char* args[]) { char V[MAX][25]; int N; for(N=0;scanf("%s",V[N])==1 && strcmp(V[N],"\n");N++); printf("%d\n",polish(V,N)); return 0; }
Y un ejemplo de ejecuci'on. Para la expresi'on en notaci'on polaca 3 4 + 7 * 9 10 5 6 + * - - En la ejecución se da la evoluición de la cadena de entrada y del estado de la pila... 3 4 + 7 * 9 10 5 6 + * - -
3
4 + 7 * 9 10 5 6 + * - -
3 4
+ 7 * 9 10 5 6 + * - -
7
7 * 9 10 5 6 + * - -
7 7
* 9 10 5 6 + * - -
49
9 10 5 6 + * - -
49 9
10 5 6 + * - -
49 9 10
5 6 + * - -
49 9 10 5
6 + * - -
49 9 10 5 6
+ * - -
49 9 10 11
* - -
49 9 110
- -
49 101
-
52
|
|
« Última modificación: 13 Octubre 2019, 17:58 pm por dijsktra »
|
En línea
|
Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
|
|
|
agustinp99
Desconectado
Mensajes: 6
|
|
Re: Ayuda
« Respuesta #7 en: 11 Octubre 2019, 17:05 pm » |
|
Las pilas por debajo están simuladas con vectores... O sea, que expones los vectores que se ocultarían en la implementación de una pila normalemente... ¡Atención ! mi solución entiende que notación polaca es + 3 4 , en lugar de 3 + 4 o 3 4 +. (Solo hay que cambiar el orden de lectura de los operandos) El programa solo evalua una expresion polaca metida correctamente... y sin parantesis... no se puede + 3 (4+4) , sino que hay que escribir + 3 4 4 + REPITO, no se si es lo que buscas... /* An stack can be simulated by a vector +-----+ | | +-----+ N | 2 | +-----+ | 1 | +-----+ | + | +-----+ 0 */ #include <cstdlib> #include <iostream> #include <cassert> #include <cstring> using namespace std; int polish(char S[][25], int N) { for(N; N > 1 ; ) { const int b = atoi(S[--N]); const int a = atoi(S[--N]); const char op = *S[--N]; cout << b << " " << a << " " << op << endl; switch (op) { case '+': sprintf(S[N++],"%d",a+b); break; case '-': sprintf(S[N++],"%d",a-b); break; case '*': sprintf(S[N++],"%d",a*b); break; case '/': assert(b!=0); sprintf(S[N++],"%d",a/b); break; } } return atoi(S[N-1]); } #define MAX 100000 int main(int argc, char* args[]) { char S[MAX][25]; int top ; for(top=0;scanf("%s",S[top])==1 && strcmp(S[top],"\n");top++ ); printf("%d\n",polish(S,top)); return 0; }
Y un ejemplo de ejecuci'on. Para la expresi'on en notaci'on polaca el programa da Hola!! Si me sirve un monton, te hago una pregunta nomas, que hace el args en el main? porque yo uso el argv pero nose si es lo mismo Ademas de que no entiendo que hace el for de esa forma
|
|
« Última modificación: 11 Octubre 2019, 17:08 pm por agustinp99 »
|
En línea
|
|
|
|
agustinp99
Desconectado
Mensajes: 6
|
|
Re: Ayuda
« Respuesta #8 en: 11 Octubre 2019, 19:33 pm » |
|
No está mal aunque hay que pulir un par de cosas: Antes de nada, los códigos ponlos entre etiquetas de Código GeSHi porque sino los índices no se ven y la i entre corchetes se convierte en cursiva y la u entre corchetes, en subrayado... - Para pedir una cadena al usuario no se usa <scanf()>, se usa <fgets()>
#define SIZE 100 // definimos un maximo de longitud para la cadena. Esto se pone justo despues de las librerias char cadena[SIZE]; printf("Introduce una cadena: "); fgets(cadena , SIZE , stdin );
El siguiente problema es que al introducir una cadena y pulsar ENTER, el ENTER también se guardará en la cadena. Esto lo arreglamos rápido así: cadena [strlen(cadena )-1] = '\0';
- La segunda condición de tu bucle <while()> es innecesaria. Preguntas si <c> es un dígito Y si no es un espacio... Siempre que se cumpla que es un dígito, se cumplirá también que no es un espacio. Y si no es un dígito, la segunda condición dará igual.
Si lo que quieres conseguir es el resultado de calcular la expresión en notación polaca inversa, te falta esa parte. Voy entendiendo, el problema es que sigo sin poder guardar lo numeros en alguna variable, ya que hago un for que vaya desde 1 hasta el argc y lo que quiero hacer ahora es preguntar si el argv es un digito(que eso sé como se hace) y luego, a partir de ese numero guardarlo en una variable entera, por ejemplo x. Al hacer esta iteracion con la condicion, si yo tengo mas de dos numeros ya la variable x tomaria solamente el ultimo y no se como hacer para poder guardar todo en distintas variables
|
|
|
En línea
|
|
|
|
K-YreX
|
|
Re: Ayuda
« Respuesta #9 en: 11 Octubre 2019, 23:37 pm » |
|
La función <main()> puede recibir dos parámetros: un <int> y un <char*[]>. El primero indica el número de parámetros que le pasas al programa cuando lo ejecutas desde línea de comandos y el segundo es como una matriz donde cada fila es uno de los parámetros y cada columna es una letra. El nombre que le des da igual, siempre es lo mismo. Como te han dicho, una pila internamente se puede implementar con un <array>. Entonces lo que tienes que hacer es un <array> de números en donde guardar los números hasta encontrar un operador. Yo estoy hablando para una notación polaca inversa, es decir, 3 4 +. Te dejo el siguiente pseudocódigo. Esto es para que lo entiendas. Cuando entiendas cómo funciona tienes que pasarlo a C ya que el pseudocódigo no está escrito en C. INICIO posicionActual := 0 PEDIR expresion PARA i := 0 HASTA expresion.longitud - 1 HACER SEGUN expresion[i] HACER numero: numeros[posicionActual++] = expresion[i] +: numeros[posicionActual - 2] := numeros[posicionActual - 2] + numeros[posicionActual - 1] posicionActual := posicionActual - 2 *: numeros[posicionActual - 2] := numeros[posicionActual - 2] + numeros[posicionActual - 1] posicionActual := posicionActual - 2
//...igual para el resto de operadores
FIN SEGUN FIN PARA
MOSTRAR numeros[0] FIN
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[Ayuda] Necesito ayuda para crear un buen video uso AF y Flash.
Diseño Gráfico
|
XXXXXX
|
1
|
5,877
|
11 Noviembre 2009, 00:17 am
por Sub_Cero
|
|
|
Ayuda por davor ayuda os ruego ayuda XD (SOLUCIONADO)
Hardware
|
XxRekcahlExX
|
6
|
11,273
|
24 Mayo 2010, 00:56 am
por Aprendiz-Oscuro
|
|
|
AYUDA -.- ahora no entro más en 4chan (tengo una duda, ayuda por favor)
Foro Libre
|
Draklit
|
6
|
9,272
|
15 Octubre 2010, 03:14 am
por Draklit
|
|
|
[PYTHON][AYUDA][ERROR] Necesito ayuda para instalar PyGTK 2 en windows 7
Python
|
Noxware
|
2
|
8,476
|
20 Septiembre 2014, 00:05 am
por Noxware
|
|
|
[AYUDA] Ayuda para poner en modo monitor mi tarjeta de red! Kali LInux
GNU/Linux
|
Santi__
|
1
|
9,757
|
12 Noviembre 2016, 18:25 pm
por Will21
|
|