elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con mi código, compila pero el resultado es erróneo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con mi código, compila pero el resultado es erróneo  (Leído 2,421 veces)
estudianteuv

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Duda con mi código, compila pero el resultado es erróneo
« en: 23 Mayo 2018, 20:03 pm »

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!

Código:
#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 Desconectado

Mensajes: 1.603



Ver Perfil
Re: Duda con mi código, compila pero el resultado es erróneo
« Respuesta #1 en: 23 Mayo 2018, 20:15 pm »

Para hacerla recursiva sería:
Código
  1. int buscar_c(char *cad, char c) {
  2.    if(*cad=='\0')
  3.        return 0;
  4.    return (*cad==c)+buscar_c(cad+1,c);
  5. }

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 Desconectado

Mensajes: 10


Ver Perfil
Re: Duda con mi código, compila pero el resultado es erróneo
« Respuesta #2 en: 23 Mayo 2018, 20:24 pm »

Para hacerla recursiva sería:
Código
  1. int buscar_c(char *cad, char c) {
  2.    if(*cad=='\0')
  3.        return 0;
  4.    return (*cad==c)+buscar_c(cad+1,c);
  5. }

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 Desconectado

Mensajes: 1.603



Ver Perfil
Re: Duda con mi código, compila pero el resultado es erróneo
« Respuesta #3 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.
En línea

estudianteuv

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Duda con mi código, compila pero el resultado es erróneo
« Respuesta #4 en: 24 Mayo 2018, 00:45 am »

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

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Compila bien, pero no ejecuta !! Solucionado
Java
Vingilot 4 4,167 Último mensaje 8 Enero 2008, 15:20 pm
por Vingilot
[Urgente] Ayuda codigo erroneo VB6
Análisis y Diseño de Malware
kaskull 2 3,035 Último mensaje 6 Febrero 2012, 18:52 pm
por xSundeRx
Ejercicio compila pero no se ejecuta « 1 2 »
Programación C/C++
David8 15 8,908 Último mensaje 20 Abril 2014, 22:47 pm
por David8
Duda C++. Compila pero no corre.
Programación C/C++
Gaspi 9 4,414 Último mensaje 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,200 Último mensaje 29 Mayo 2016, 00:04 am
por creiko
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines