elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Un desafío para los interesados
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 [3] 4 Ir Abajo Respuesta Imprimir
Autor Tema: Un desafío para los interesados  (Leído 13,437 veces)
Valkyr


Desconectado Desconectado

Mensajes: 646


Divide y vencerás


Ver Perfil
Re: Un desafío para los interesados
« Respuesta #20 en: 13 Septiembre 2011, 22:46 pm »

Una solución (en pseudocódigo) podría ser algo así? :

Código:
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 Desconectado

Mensajes: 1.639


Ver Perfil
Re: Un desafío para los interesados
« Respuesta #21 en: 14 Septiembre 2011, 01:34 am »

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 Desconectado

Mensajes: 646


Divide y vencerás


Ver Perfil
Re: Un desafío para los interesados
« Respuesta #22 en: 14 Septiembre 2011, 01:52 am »

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 Desconectado

Mensajes: 67


Ver Perfil
Re: Un desafío para los interesados
« Respuesta #23 en: 14 Septiembre 2011, 02:15 am »

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 Desconectado

Mensajes: 646


Divide y vencerás


Ver Perfil
Re: Un desafío para los interesados
« Respuesta #24 en: 14 Septiembre 2011, 02:32 am »

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

Código
  1. #include<iostream>
  2. #include<cctype>
  3. using namespace std;
  4.  
  5. void procedimiento(){
  6. int caracter = cin.get();
  7. if(isdigit((char)caracter)){
  8. procedimiento();
  9. cout<<(char)caracter;
  10. }
  11. }
  12.  
  13. int main(void){
  14. procedimiento();
  15. }

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 Desconectado

Mensajes: 67


Ver Perfil
Re: Un desafío para los interesados
« Respuesta #25 en: 14 Septiembre 2011, 02:43 am »

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 Desconectado

Mensajes: 646


Divide y vencerás


Ver Perfil
Re: Un desafío para los interesados
« Respuesta #26 en: 14 Septiembre 2011, 02:54 am »

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 Desconectado

Mensajes: 113


adada


Ver Perfil
Re: Un desafío para los interesados
« Respuesta #27 en: 14 Septiembre 2011, 03:12 am »

Eso parece una tarea dizfrasada... :silbar:
En línea

adada
LearningSpanishProgrammer

Desconectado Desconectado

Mensajes: 67


Ver Perfil
Re: Un desafío para los interesados
« Respuesta #28 en: 14 Septiembre 2011, 04:27 am »

Valkyr, tu estas correcto, yo escribí incorrectamente
En línea

Estoy aprendiendo español, y tu estas aprendiendo programación
ghastlyX
Ex-Staff
*
Desconectado Desconectado

Mensajes: 1.900



Ver Perfil
Re: Un desafío para los interesados
« Respuesta #29 en: 14 Septiembre 2011, 11:31 am »

En efecto, la solución que esperaba era la recursiva, pongo aquí la solución que había hecho yo:
Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void rec() {
  5.    char c;
  6.    if (cin >> c) {
  7.        rec();
  8.        cout << c;
  9.    }
  10. }
  11.  
  12. int main() {
  13.    rec();
  14.    cout << endl;
  15. }

Respecto a lo que se comentaba de la pila, aguanta perfectamente 100 llamadas recursivas (y bastantes más):
Código:
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

Páginas: 1 2 [3] 4 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Desafio para Todos !!!!!!!!
Electrónica
K_zeed 0 1,912 Último mensaje 18 Julio 2006, 18:01 pm
por K_zeed
Ayuda y desafio para todos
Ingeniería Inversa
Jorgezenzerovich 0 1,856 Último mensaje 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 Último mensaje 30 Diciembre 2015, 16:44 pm
por Hadess_inf
nueva página para los interesados.
Mensajería
buite 0 2,242 Último mensaje 23 Octubre 2017, 00:51 am
por buite
Herramientas para interesados
Hacking
Serapis 1 3,267 Último mensaje 5 Abril 2021, 06:54 am
por Xyzed
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines