Un desafío para los interesados

Iniciado por LearningSpanishProgrammer, 9 Septiembre 2011, 03:30 AM

0 Miembros y 2 Visitantes están viendo este tema.

Valkyr

#20
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.

rir3760

Segun los dos enunciados no pueden utilizarse arrays.

Un saludo
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

#22
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.

LearningSpanishProgrammer

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.
Estoy aprendiendo español, y tu estas aprendiendo programación

Valkyr

Después de pensar una alternativa que no use char * sólo se me ocurre una función recursiva, es decir, esto:

Código (cpp) [Seleccionar]
#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.

LearningSpanishProgrammer

#25
yo cometi un error, disconsiderar

EDIT: Estaba a hablar de mí proprio puesto
Estoy aprendiendo español, y tu estas aprendiendo programación

Valkyr

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.

Danyel_Casvill

adada

LearningSpanishProgrammer

Valkyr, tu estas correcto, yo escribí incorrectamente
Estoy aprendiendo español, y tu estas aprendiendo programación

ghastlyX

En efecto, la solución que esperaba era la recursiva, pongo aquí la solución que había hecho yo:
Código (cpp) [Seleccionar]
#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