Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: david_BS en 19 Abril 2012, 05:47 am



Título: Recursividad
Publicado por: david_BS en 19 Abril 2012, 05:47 am
Hola, hice un programita tonto que utiliza una función recursiva, solamente para mostrar algunos detalles..

El programa se trata de tener un texto que debe ser superior a los 168 caracteres, ya sea en un array o para ser ingresado, luego el texto debe ser manejado por un puntero char* y debe ser examinado por una función recursiva.

con un sólo llamado a la función recursiva en el main, se debe poder obtener ciertos datos del texto.

1) cantidad de letras
2) cantidad de vocales
3) cantidad de consonantes
4) cantidad de espacios

El programa requiere el uso de aritmética de punteros como van a ver en el código.

además esta técnica es dependiente de un vector declarado como 'static' para que no cambie su dirección en memoria y pueda ser accesible durante todo el programa.

dejo el código a continuación..

Este sería el texto contenido en un array
Código:
char texto[200] = {


'a','s','d','x','x','x','x','x','x','x',
'x','a','s','d','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x',' ','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x',0};

Esta es la función recursiva. devuelve un puntero a vector int de 4.
El número 4 hace referencia a los 4 resultados que debemos obtener del texto.
Código:
int* arreglo_final_re(char* str, char letra){

static int vec[4]={0};
int estado=0;
if(*str!=NULL){
if(*str==letra) estado=1;
if((*str=='a')||(*str=='e')||(*str=='i')||(*str=='o')||(*str=='u')) estado=2;
if((*str!='a')&&(*str!='e')&&(*str!='i')&&(*str!='o')&&(*str!='u')) estado=3;
if(*str==' ') estado=4;
str++;
for(unsigned int i=1; i<=estado;i++){
if(estado==3&&i==2)continue;
if(estado==4&&(i==2||i==3))continue;
vec[i-1]++;
}

//arreglo_final_re(str,letra);//esto dejaria en la pila varios ret+address los cuales deben popearse luego..
return arreglo_final_re(str,letra);
}

printf("----------------------------------------\n");
printf("cantidad letras: %d\n",vec[0]);
printf("cantidad vocales: %d\n",vec[1]);
printf("cantidad consonantes: %d\n",vec[2]);
printf("cantidad blancos: %d\n",vec[3]);
printf("----------------------------------------\n");
printf("----------------------------------------\n");
printf("Direccion del vector static: %x\n",vec);
printf("----------------------------------------\n");

return &vec[0];

}

Este sería el punto de entrada del programa
Código:
int main(){

char* t = texto;
printf("Texto: %s\n",t);
printf("----------------------------------------\n");

int* p =arreglo_final_re(t,'x');
printf("----------------------------------------\n");
printf("Direccion rescatada desde el Main: %x\n",p);
printf("----------------------------------------\n");
printf("Letras: %d\n",*(p+0));
printf("Vocales: %d\n",*(p+1));
printf("Consonantes: %d\n",*(p+2));
printf("Blancos: %d\n",*(p+3));
printf("----------------------------------------\n");

system("pause");
return 0;
}


dejo el proyecto en MSVC++ 6.0 por si lo desean descargar

Proyecto (http://www.mediafire.com/?4k641ox4k473geg)






Título: Re: Recursividad
Publicado por: luke92 en 22 Abril 2012, 18:38 pm
Muy buen aporte!
Lo vi anteriormente en una entrevista de Java trainee, es algo basico en programación. Si lo analizas bien, funciona como un while o un for.