Autor
|
Tema: Duda con mi código, compila pero el resultado es erróneo (Leído 2,393 veces)
|
estudianteuv
Desconectado
Mensajes: 10
|
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++); }
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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.
|
|
|
En línea
|
|
|
|
estudianteuv
Desconectado
Mensajes: 10
|
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!
|
|
|
En línea
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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.
|
|
|
En línea
|
|
|
|
estudianteuv
Desconectado
Mensajes: 10
|
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!
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Compila bien, pero no ejecuta !! Solucionado
Java
|
Vingilot
|
4
|
4,152
|
8 Enero 2008, 15:20 pm
por Vingilot
|
|
|
[Urgente] Ayuda codigo erroneo VB6
Análisis y Diseño de Malware
|
kaskull
|
2
|
3,010
|
6 Febrero 2012, 18:52 pm
por xSundeRx
|
|
|
Ejercicio compila pero no se ejecuta
« 1 2 »
Programación C/C++
|
David8
|
15
|
8,833
|
20 Abril 2014, 22:47 pm
por David8
|
|
|
Duda C++. Compila pero no corre.
Programación C/C++
|
Gaspi
|
9
|
4,373
|
20 Febrero 2015, 20:58 pm
por Gaspi
|
|
|
matriz 5*5 no me da error pero no compila
« 1 2 »
Programación C/C++
|
creiko
|
11
|
5,135
|
29 Mayo 2016, 00:04 am
por creiko
|
|