Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ++c en 24 Septiembre 2014, 22:47 pm



Título: Ayuda con este codigo recursivo
Publicado por: ++c en 24 Septiembre 2014, 22:47 pm
Hola me estoy iniciando en la recursividad y me encuentro estancado en este código para arrojar de forma recursiva la devolución de una frase al revés.

Había pensado en guardar la frase en un array, seguidamente con un índice ir moviendome por este array recursivamente, pero me encuentro que no se como devolver el retorno de la función a la función principal, independientemente de que esté bien ideado el código......

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void alreves (char vector[],int posicion);
  6.  
  7. void main(int argc, char *argv[]){
  8.  
  9.    char cadena[50];
  10.    int n;
  11.    printf("\nIntroduzca frase: ");
  12.    gets(cadena);
  13.    n=strlen(cadena);
  14. alreves(cadena,n);
  15. }
  16.  
  17. void alreves (char vector[],int posicion){
  18.  
  19.    if(posicion=='\0')
  20.        return 0 ;
  21.    else
  22.        alreves(vector,posicion-1);
  23. }
  24.  

Gracias!!


Título: Re: Ayuda con este codigo recursivo
Publicado por: rir3760 en 25 Septiembre 2014, 05:01 am
Lo primero que debes hacer es cambiar el tipo de retorno de la función main a int y ya que no utilizas los argumentos de linea de comandos su definición debe terminar como "int main(void) ...".

También hay que eliminar la variable "n" ya que solo pasa la cubeta y sustituir el uso de gets por fgets, la explicación de esto en el tema |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).

----

En cuanto a la función no es necesario el segundo argumento, esta en pseudocodigo es:
Código:
funcion -- argumento es la direccion en memoria de la cadena
   Si el -carácter actual- es diferente de '\0'
      llamada recursiva pasando la direccion del -siguiente caracter-
      imprimir el -caracter actual-
   fin si
fin funcion

Un saludo


Título: Re: Ayuda con este codigo recursivo
Publicado por: ++c en 25 Septiembre 2014, 20:09 pm
Hola rir3760 gracias por contestar.

Te cuento el uso de gets porque fgets me arroja ' \n ', ya me avisaste hace un tiempo de este mal uso.

Las indicaciones que me has puesto creo que son con punteros ya que me indicas direcciones, pero aún no he llegado a ese tema, cuando acabe estos ejercicios de recursividad me pondré con ello. No obstante he visto ahora algo por encima pero tengo que verlo con más detalle como trabajan ya que se me queda colgado el código, te cuelgo lo que he modificado del programa pero me gustaría me guiaras también para hacerlo sin punteros.

Código
  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #define N 50
  6.  
  7. void alreves (char *vector);
  8.  
  9. int main(void){
  10.  
  11.    char cadena[N];
  12.    printf("\nIntroduzca frase: ");
  13.    fgets(cadena,sizeof cadena,stdin);
  14.    printf("\nFrase invertida: ");
  15.    alreves(cadena);
  16. }
  17.  
  18. void alreves (char *vector){
  19.  
  20.    if(*vector!='\0'){ /*Estado general*/
  21.            alreves(vector+1);
  22.            putchar(*vector);
  23.    }
  24.    else return ; /*Estado base*/
  25. }

Gracias !!


Título: Re: Ayuda con este codigo recursivo
Publicado por: rir3760 en 26 Septiembre 2014, 17:38 pm
Te cuento el uso de gets porque fgets me arroja ' \n ', ya me avisaste hace un tiempo de este mal uso.
Nada impide que elimines el avance de linea mediante la función strchr (prototipo en <string.h>) o un bucle.

No obstante he visto ahora algo por encima pero tengo que verlo con más detalle como trabajan ya que se me queda colgado el código
Ese programa funciona correctamente, si el programa en un momento dado se congela asegúrate de publicar la versión tal cual, sin cambios.

Las indicaciones que me has puesto creo que son con punteros ya que me indicas direcciones, pero aún no he llegado a ese tema [...] te cuelgo lo que he modificado del programa pero me gustaría me guiaras también para hacerlo sin punteros.
No es posible por lo siguiente:

1) Todo parámetro de una función declarado en la forma "T identificador[N]" se procesa en realidad como "T *identificador", en otras palabras cada parámetro declarado como array se procesa como un puntero.

2) El operador "[]" requiere de dos operandos: un entero y un puntero sin importar el orden, cuando uno de ellos es el nombre de un array este genera de forma automática el puntero necesario.

Como espero entenderás no hay escape: se utilizan punteros (direcciones de memoria) si o si.

Un saludo


Título: Re: Ayuda con este codigo recursivo
Publicado por: ++c en 26 Septiembre 2014, 18:56 pm
Citar
Nada impide que elimines el avance de linea mediante la función strchr (prototipo en <string.h>) o un bucle.
Tomo nota  ;D

Citar
Ese programa funciona correctamente, si el programa en un momento dado se congela asegúrate de publicar la versión tal cual, sin cambios.
Sí que funciona!! Lo más probable que tocara algo... ;)

Citar
No es posible por lo siguiente:

1) Todo parámetro de una función declarado en la forma "T identificador[N]" se procesa en realidad como "T *identificador", en otras palabras cada parámetro declarado como array se procesa como un puntero.

2) El operador "[]" requiere de dos operandos: un entero y un puntero sin importar el orden, cuando uno de ellos es el nombre de un array este genera de forma automática el puntero necesario.

Como espero entenderás no hay escape: se utilizan punteros (direcciones de memoria) si o si.
Más claro imposible  ;-)

Gracias!!