Duda con mi código, compila pero el resultado es erróneo

Iniciado por estudianteuv, 23 Mayo 2018, 20:03 PM

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

estudianteuv

Hola.

Tengo este programa donde el usuario ingresa una cadena y luego en esa misma; busca la letra y el programa imprime cuantas veces aparece dicho caracter

El problema es que solo me da la longitud, soy nuevo en esto, me gustaría que lo revisarán y me digan lo que le falta y claro, el por qué y como funciona para aprender

Muchas gracias!

#include<stdio.h>
int buscar_c (char *cad,char c,int cont);
int main(){
char let;
char pal[10];
int result;
printf("Inserte una palabra: ");
gets(pal);
printf("Letra a buscar: ");
scanf("%c",&let);
result=buscar_c(pal,let,result);
printf("Numero de veces que se repite %c son: %i",let,result);
return 0;
}

int buscar_c(char *cad,char c,int i=0){
if(*cad=='\0')return 0;
else(*cad==c);return 1+buscar_c(++cad,c,i++);
}

MAFUS

Para hacerla recursiva sería:
int buscar_c(char *cad, char c) {
   if(*cad=='\0')
       return 0;
   return (*cad==c)+buscar_c(cad+1,c);
}


El else tuyo no tiene sentido.
Éste código funciona para las implementaciones que consideren 1 como resultado de un true, que son todas las que conozco.

estudianteuv

Cita de: MAFUS en 23 Mayo 2018, 20:15 PM
Para hacerla recursiva sería:
int buscar_c(char *cad, char c) {
    if(*cad=='\0')
        return 0;
    return (*cad==c)+buscar_c(cad+1,c);
}


El else tuyo no tiene sentido.
Éste código funciona para las implementaciones que consideren 1 como resultado de un true, que son todas las que conozco.

¡Gracias! No sabía lo del else, funciona totalmente, pero una duda... No sé si me podrías explicar.

Al poner el segundo return, ¿cómo es que automáticamente sabe el programa que es 1?
Aparte, nunca había visto ponerle return y después una condición ¿retorna una condición...?

Entendí todo a excepción de la linea 5 que escribiste, ¿me la podrías explicar? ¡De ante mano, gracias!

MAFUS

Cómo te había explicado una operación booleana en C se evalúa a 1 si el resultado es true y 0 si el resultado es false. El código aprovecha este hecho en el trozo de código *cad==c, es decir, si el carácter actual de la cadena es igual a carácter c devolverá 1, caso contrario 0.
Este resultado se suma a lo que devuelva la siguiente llamada a buscar_c apuntando al siguiente carácter de la cadena. Y todo esto es lo que retornará la función.
Por recursividad los resultados se irán acumulando y cuando hayan retornado todas las funciones la última entregará el resultado esperado.

-------------------- Fuera del tema ---------------------------
Por otra parte es importante recalcar el cad+1 en vez de ++cad en el argumento de buscar_c. Esto es debido a que además de incrementar cad en 1 en otra parte se hace uso del valor de esa variable. Uno no sabe qué operando evaluará antes C en una operación matemática. Si hubiera sido ++cad, al evaluar *cad==c lo haría con el siguiente carácter al que nos interesa y el programa fallaría y por eso he optado por no modificar dicha variable. Pero todo esto tiene que ver con los puntos de secuencia, algo de lo que tendrás oportunidad de aprender más adelante.

estudianteuv

Cita de: MAFUS en 23 Mayo 2018, 23:19 PM
Cómo te había explicado una operación booleana en C se evalúa a 1 si el resultado es true y 0 si el resultado es false. El código aprovecha este hecho en el trozo de código *cad==c, es decir, si el carácter actual de la cadena es igual a carácter c devolverá 1, caso contrario 0.
Este resultado se suma a lo que devuelva la siguiente llamada a buscar_c apuntando al siguiente carácter de la cadena. Y todo esto es lo que retornará la función.
Por recursividad los resultados se irán acumulando y cuando hayan retornado todas las funciones la última entregará el resultado esperado.

-------------------- Fuera del tema ---------------------------
Por otra parte es importante recalcar el cad+1 en vez de ++cad en el argumento de buscar_c. Esto es debido a que además de incrementar cad en 1 en otra parte se hace uso del valor de esa variable. Uno no sabe qué operando evaluará antes C en una operación matemática. Si hubiera sido ++cad, al evaluar *cad==c lo haría con el siguiente carácter al que nos interesa y el programa fallaría y por eso he optado por no modificar dicha variable. Pero todo esto tiene que ver con los puntos de secuencia, algo de lo que tendrás oportunidad de aprender más adelante.

¡Que grande! Muchas gracias, amigo. Justamente esa también era una de mis dudas, por qupe el cad+1 si con un ++cad bastaba para mover el puntero, en fin, ¡muchísimas gracias por la explicación!