Autor
|
Tema: Un desafío para los interesados (Leído 13,437 veces)
|
Valkyr
Desconectado
Mensajes: 646
Divide y vencerás
|
Una solución (en pseudocódigo) podría ser algo así? : VARIABLES Caracter a; Cadena reverso;
PROGRAMA leer_caracter(a); MIENTRAS(esDigito(a)) HACER concatena(a, reverso, reverso); leer_caracter(a); FIN_MIENTRAS
Esto se podría hacer en C/C++ usando tipos básicos (bueno, para la cadena habría que usar char*). Se supone que leer_caracter(a) lee un carácter de la entrada estándar (se podría hacer en C++ con cin.get() y en C con get() me parece) y lo deja en la variable a. Luego, la condición del bucle comprueba que el valor introducido sea un dígito (esto se podría implementar fácilmente comprobando que el valor del carácter esté en el rango ASCII concreto de los números aunque en ya está implementado en la librería <cctype>). La función concatena lo que haría es, concatena la variable a al principio de reverso y guarda el resultado en reverso. Se vuelve a leer otro carácter y así sucesivamente. ¿Está bien la solución o he metido una buena gamba por algún sitio? xD Saludos.
|
|
« Última modificación: 13 Septiembre 2011, 22:48 pm por Valkyr »
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
Segun los dos enunciados no pueden utilizarse arrays.
Un saludo
|
|
|
En línea
|
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language
|
|
|
Valkyr
Desconectado
Mensajes: 646
Divide y vencerás
|
Pues hombre hasta donde yo se de C (que la verdad es más bien poco) char * no se considera un array, ¿O estoy equivocado?.
EDIT: Pensandolo ahora un poco mejor sí que se puede considerar como un array.
Saludos.
|
|
« Última modificación: 14 Septiembre 2011, 01:57 am por Valkyr »
|
En línea
|
|
|
|
LearningSpanishProgrammer
Desconectado
Mensajes: 67
|
Valkyr, su error es muy común, el papel dual del puntero (como uno puntero para un char o un puntero para um arreglo del char). Es, en mi opiníon, un error del linguaje de programación.
No pasa nada.
|
|
|
En línea
|
Estoy aprendiendo español, y tu estas aprendiendo programación
|
|
|
Valkyr
Desconectado
Mensajes: 646
Divide y vencerás
|
Después de pensar una alternativa que no use char * sólo se me ocurre una función recursiva, es decir, esto: #include<iostream> #include<cctype> using namespace std; void procedimiento(){ int caracter = cin.get(); if(isdigit((char)caracter)){ procedimiento(); cout<<(char)caracter; } } int main(void){ procedimiento(); }
y efectivamente funciona para el caso 100. Se podría cambiar el programa para que se pudiesen ingresar varios números ya que ahora mismo solo se puede ingresar uno. También si el número fuese excesivamente largo podría haber problemas con la pila ya que acumularía demasiadas llamadas a la función. ¿A alguien se le ocurre alguna alternativa?. Saludos.
|
|
|
En línea
|
|
|
|
LearningSpanishProgrammer
Desconectado
Mensajes: 67
|
yo cometi un error, disconsiderar
EDIT: Estaba a hablar de mí proprio puesto
|
|
« Última modificación: 14 Septiembre 2011, 04:21 am por LearningSpanishProgrammer »
|
En línea
|
Estoy aprendiendo español, y tu estas aprendiendo programación
|
|
|
Valkyr
Desconectado
Mensajes: 646
Divide y vencerás
|
Ummm... si no me equivoco al hacer la llamada recursiva la variable caracter se guardará dentro de la pila, ya que es un valor que al volver de la llamada necesitamos y por tanto si se guarda en un registro del procesador debe asegurarse que al volver de la llamada el valor seguirá estando ahí, y si nos pusiesemos a guardar valores en registros distintos nos quedaríamos sin registros.
No se que código generará en ensamblador este programa, pero por lógica yo pienso que haría eso. Incluso puede ser que guarde más información todavía como por ejemplo el PC de la instrucción que realizó la llamada o cosas similares. Teniendo esto en cuenta si el número introducido es exageradamente grande podría provocar un overflow en la pila.
Saludos.
|
|
|
En línea
|
|
|
|
Danyel_Casvill
Desconectado
Mensajes: 113
adada
|
Eso parece una tarea dizfrasada...
|
|
|
En línea
|
adada
|
|
|
LearningSpanishProgrammer
Desconectado
Mensajes: 67
|
Valkyr, tu estas correcto, yo escribí incorrectamente
|
|
|
En línea
|
Estoy aprendiendo español, y tu estas aprendiendo programación
|
|
|
ghastlyX
Ex-Staff
Desconectado
Mensajes: 1.900
|
En efecto, la solución que esperaba era la recursiva, pongo aquí la solución que había hecho yo: #include <iostream> using namespace std; void rec() { char c; if (cin >> c) { rec(); cout << c; } } int main() { rec(); cout << endl; }
Respecto a lo que se comentaba de la pila, aguanta perfectamente 100 llamadas recursivas (y bastantes más): alex@portatil:~/codigos$ cat entrada.in 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 alex@portatil:~/codigos$ wc -c entrada.in 102 entrada.in alex@portatil:~/codigos$ g++ prueba.cc alex@portatil:~/codigos$ ./a.out < entrada.in 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Desafio para Todos !!!!!!!!
Electrónica
|
K_zeed
|
0
|
1,912
|
18 Julio 2006, 18:01 pm
por K_zeed
|
|
|
Ayuda y desafio para todos
Ingeniería Inversa
|
Jorgezenzerovich
|
0
|
1,856
|
8 Octubre 2012, 03:41 am
por Jorgezenzerovich
|
|
|
Noticia para los interesados en astronomia; descubren un planeta potencialmente.
« 1 2 »
Foro Libre
|
crazykenny
|
11
|
4,700
|
30 Diciembre 2015, 16:44 pm
por Hadess_inf
|
|
|
nueva página para los interesados.
Mensajería
|
buite
|
0
|
2,242
|
23 Octubre 2017, 00:51 am
por buite
|
|
|
Herramientas para interesados
Hacking
|
Serapis
|
1
|
3,267
|
5 Abril 2021, 06:54 am
por Xyzed
|
|