• Sábado 14 de Diciembre de 2024, 12:27

Autor Tema:  funcion recursiva  (Leído 6779 veces)

maduco

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
funcion recursiva
« en: Martes 23 de Noviembre de 2010, 18:34 »
0
estoy teniendo problemas con las funciones recursivas.

en especial con este ejercicio:

Escribid una función que reciba una cadena de caracteres terminados en un punto , leídos uno a uno con la función getche() y la devuelva de forma inversa:
Ejemplo: ‘hola’
Salida:   ‘aloh’

lo complicado es que no se puede tratar como una cadena de caracteres sino que hay que introducir uno a uno y no se como acerlo
si alguien me puede ayudar lo agradezco

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: funcion recursiva
« Respuesta #1 en: Miércoles 24 de Noviembre de 2010, 09:20 »
0
Tu problema realmente no tiene nada que ver con recursividad, sino con getch() (getche() no existe)  <_< A ver si ponemos títulos adecuados a los hilos...

En el curro no tengo entorno para C, pero algo así debería funcionar, ya me dices:

Código: C
  1. char* leer_hasta(char* buffer, char fin)
  2. {
  3.     if (buffer != NULL)
  4.     {
  5.         char c;
  6.         int i = 0;
  7.         do
  8.         {
  9.             c = getch();
  10.             buffer[i++] = c;
  11.         } while (c != fin)
  12.     }
  13.    
  14.     return buffer;
  15. }
  16.  

maduco

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: funcion recursiva
« Respuesta #2 en: Miércoles 24 de Noviembre de 2010, 10:47 »
0
muxas gracias moskito pero ando muy perdido en este tema y no se que tengo que acer en el modulo principal, si me puedes ayudar te lo agradeceria muxisimo

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: funcion recursiva
« Respuesta #3 en: Miércoles 24 de Noviembre de 2010, 14:56 »
0
Ponme un poco lo que tienes hecho y lo vemos.

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: funcion recursiva
« Respuesta #4 en: Miércoles 24 de Noviembre de 2010, 17:38 »
0
Buenas.

Si no me equivoco la funcion getche() es de conio. Y no lee del buffer de entrada sino del teclado.

La idea es hace una funcion que capture un caracter con getche(), si este es '.' entonces retorna, sino se llama a si misma, imprime el caracter y retorna.

De esa forma cuando se ingrese el . se va a ir saliendo de las funciones e imprimiendo los caracteres en el orden inverso al que se ingresaron.

En el main simplemente tendrias que llamar a esa funcion.

Eso es lo que entendi por lo menos, espero que sirva.

Saludos
The sweet smell of a great sorrow lies over the land.


m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: funcion recursiva
« Respuesta #5 en: Miércoles 24 de Noviembre de 2010, 17:46 »
0
Buenas Epa.

Creo que te contradices, o no te he entendido:

Cita de: "Epa"
La idea es hace una funcion que capture un caracter con getche(), si este es '.' entonces retorna, sino se llama a si misma, imprime el caracter y retorna
Cita de: "Epa"
De esa forma cuando se ingrese el . se va a ir saliendo de las funciones
:huh:

Y efectivamente, getche() existe en conio.h. Mis disculpas. Pero creo que te equivocas, sí lee de la entrada estándar, sólo que no hace eco del carácter en pantalla.

Personalmente, no usaría conio.h, pero eso ya es decisión de cada uno.

Saludos

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: funcion recursiva
« Respuesta #6 en: Miércoles 24 de Noviembre de 2010, 18:03 »
0
la cosa es algo asi :P

Código: C
  1. int funcion()
  2. {
  3. char c;
  4.  
  5. c = getche();
  6.  
  7. if(c == '.')
  8.  return 0;
  9. funcion();
  10. printf("%c", c);
  11. return 0;
  12. }
  13.  

Citar
Personalmente, no usaría conio.h, pero eso ya es decisión de cada uno.

Totalmente de acuerdo, sin embargo, hacerlo sin esa funcion seria bastante tedioso, ya que habria que leer desde el buffer de stdio. Ya que (que yo sepa) no hay ninguna funcion standard que lea el caracter antes de que se apriente enter.
The sweet smell of a great sorrow lies over the land.


m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: funcion recursiva
« Respuesta #7 en: Miércoles 24 de Noviembre de 2010, 18:10 »
0
Ok, pero antes lo habías formulado mal  ^_^

maduco

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: funcion recursiva
« Respuesta #8 en: Jueves 25 de Noviembre de 2010, 15:06 »
0
ya lo e resuelto es asi:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void inversa(char car);
main()
{
   char car;
   printf("nt     PROGRAMA QUE LEE UNA PALABRA Y LA IMPRIME AL REVESn");
   printf("_____________________________________________________________________________n");

   printf("nIntroducir palabra : ");
   inversa(car);
   printf("nn");
   system("pause");
}
void inversa(char car)
{
   car=getche();

   if(car!='.')

   inversa(car);
   printf("%c",car);
}

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: funcion recursiva
« Respuesta #9 en: Jueves 25 de Noviembre de 2010, 16:29 »
0
Es lo mismo que te ha puesto Epa dos posts más arriba. De todas formas, enhorabuena.

morfus_bedxhed

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: funcion recursiva
« Respuesta #10 en: Viernes 26 de Noviembre de 2010, 00:18 »
0
¡Hola a todos!

A míme corrio con unos cambios, uso geany  y no me reconoció la librería conio.h, ni tampoco la función getche sino getchar.

#include <stdio.h>
#include <stdlib.h>

void inversa (char car);

main()
{
   char car;
   printf("nPalabra regresada al revés: ");
   inversa (car);
   printf("nn");
   /*system("pause");*/
}

void inversa (char car)
{
   car=getchar();
   
   if (car != '.')
   inversa (car);
   printf("%c",car);
}


solo una duda, si char solo tiene límite de un 1byte, ¿por qué me recibe una cadena larga de hasta 20 caracteres? y por cierto el system("pause") tampoco me jaló, para que la pusiste cuate?


saludos al foro!

morfus_bedxhed

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: funcion recursiva
« Respuesta #11 en: Viernes 26 de Noviembre de 2010, 00:24 »
0
¡Hola a todos!

A míme corrio con unos cambios, uso geany  y no me reconoció la librería conio.h, ni tampoco la función getche sino getchar.

#include <stdio.h>
#include <stdlib.h>

void inversa (char car);

main()
{
   char car;
   printf("nPalabra regresada al revés: ");
   inversa (car);
   printf("nn");
   /*system("pause");*/
}

void inversa (char car)
{
   car=getchar();
   
   if (car != '.')
   inversa (car);
   printf("%c",car);
}


solo una duda, si char solo tiene límite de un 1byte, ¿por qué me recibe una cadena larga de hasta 20 caracteres? y por cierto el system("pause") tampoco me jaló, para que la pusiste cuate?


saludos al foro!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: funcion recursiva
« Respuesta #12 en: Viernes 26 de Noviembre de 2010, 09:36 »
0
Cita de: "morfus_bedxhed"
no me reconoció la librería conio.h, ni tampoco la función getche sino getchar
Cita de: "morfus_bedxhed"
por cierto el system("pause") tampoco me jaló
Cita de: "morfus_bedxhed"
solo una duda, si char solo tiene límite de un 1byte, ¿por qué me recibe una cadena larga de hasta 20 caracteres?
Él usa Windows y tú al parecer no. Esas funciones no son estándar, de ahí mi comentario anterior:

Cita de: "m0skit0"
Personalmente, no usaría conio.h, pero eso ya es decisión de cada uno.

Cita de: "morfus_bedxhed"
solo una duda, si char solo tiene límite de un 1byte, ¿por qué me recibe una cadena larga de hasta 20 caracteres?
Es un char local a cada llamda de función. Mientras la función no retorne, ese valor sigue almacenado en la pila temporal de la función. Si quieres entenderlo más en profundidad, tendría que explicarte cómo se implementan las funciones C en ensamblador, pero para ello tienes que saber un poco de arquitectura de computadores. Si te interesa me dices y te lo cuento.

morfus_bedxhed

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: funcion recursiva
« Respuesta #13 en: Domingo 28 de Noviembre de 2010, 19:52 »
0
Cita de: "m0skit0"
[Es un char local a cada llamda de función. Mientras la función no retorne, ese valor sigue almacenado en la pila temporal de la función. Si quieres entenderlo más en profundidad, tendría que explicarte cómo se implementan las funciones C en ensamblador, pero para ello tienes que saber un poco de arquitectura de computadores. Si te interesa me dices y te lo cuento.

¿Lo que te refieres es qué el valor se guarda en el espacio almacenado para la función? ¿ ese espacio tiene límite?, por que está definido como void (sin retorno) y no como un tipo de dato del C?

Claro que también aceptaría unas clasesitas de como se implementan las funciones C en padre ensamblador..

¡saludos!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: funcion recursiva
« Respuesta #14 en: Lunes 29 de Noviembre de 2010, 11:43 »
0
Cita de: "morfus_bedxhed"
¿Lo que te refieres es qué el valor se guarda en el espacio almacenado para la función?
Algo parecido. En realidad es un espacio que comparten la función que llama y la función llamada.

Cita de: "morfus_bedxhed"
¿ ese espacio tiene límite?
Por supuesto, la memoria no es infinita.

Cita de: "morfus_bedxhed"
por que está definido como void (sin retorno) y no como un tipo de dato del C?
No está definido como void
Cita de: "morfus_bedxhed"
void inversa (char car)

Cita de: "morfus_bedxhed"
Claro que también aceptaría unas clasesitas de como se implementan las funciones C en padre ensamblador..
En IA32 (comúnmente llamada x86), el paso de argumentos a funciones se realiza a través de la pila. Esto es, se ponen en la pila los argumentos de la función en orden inverso a los declarados en C, usando la instrucción PUSH. En este caso, se pasa el char en la pila a inversa(). La función lo recupera con la instrucción POP. Acto seguido, inversa se llama a sí misma, con lo que inserta otro char en la pila usando igualmente PUSH, y la segunda llamada lo recupera igualmente con POP (ya que es el mismo código). Así se van acumulando los caracteres en la pila. Al volver, se leen los caracteres en orden inverso, y se libera el espacio en la pila al finalizar las funciones. Algunas veces el compilador también usa el registro EBP para indicar el comienzo de los argumentos para la función, evitando así acceder usando ESP (el puntero de pila). Las instrucciones PUSH y POP modifican ESP automáticamente.

Para más detalles, mira el fichero ensamblador que genera el compilador para este ejemplo, así lo verás más claro. Cualquier duda te la intento aclarar.

Saludos.

morfus_bedxhed

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: funcion recursiva
« Respuesta #15 en: Lunes 29 de Noviembre de 2010, 16:29 »
0
Gracias por la explicada, ya se con quien dirigrime cuando tenga problemas.

!Saludos!

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: funcion recursiva
« Respuesta #16 en: Lunes 29 de Noviembre de 2010, 22:09 »
0
Gracias, espero que tú también compartas con nosotros tus conocimientos  ^_^  :good:

alb

  • Nuevo Miembro
  • *
  • Mensajes: 24
    • Ver Perfil
Re: funcion recursiva
« Respuesta #17 en: Martes 30 de Noviembre de 2010, 20:43 »
0
Hola,
Cita de: "m0skit0"
Cita de: "morfus_bedxhed"
En IA32 (comúnmente llamada x86), el paso de argumentos a funciones se realiza a través de la pila. Esto es, se ponen en la pila los argumentos de la función en orden inverso a los declarados en C, usando la instrucción PUSH. En este caso, se pasa el char en la pila a inversa(). La función lo recupera con la instrucción POP.
Eso depiende del modo de llamada de una funccion : cdecl/stdcall pasa por la pila, pero fastcall utiliza ecx y edx para los dos primeros parametros. Luego hay differencia en quien tiene la responsabilidad de limpiar la pila. Antes existia tambien __pascal para indicar que se pasaba de hizquierda hacia derecha. Y otro modo register que utilizaba eax. En C++, this puede ser pasado en ECX o en la pila. Todo eso depiende del compilador y del 'calling conventions' de la function. No es nada estandar. ver aqui : x86 calling conventions

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: funcion recursiva
« Respuesta #18 en: Miércoles 1 de Diciembre de 2010, 01:00 »
0
Tienes toda la razón, pero sólo era un ejemplo. En MIPS se pasan por los registros $aX y se devuelve el valor de la función en $v0 (y también soportaba 2 valores de retorno, en $v1), pero también se podrían pasar por pila. De todas formas, esas son meras convenciones, uno lo puede hacer como prefiera.