Se me plantea el siguiente ejercicio con la función principal definida y yo tengo que definir los subprogramas. Acabo de terminar de escribir todo el código, he ido a probar la función longitud y me encuentro con que no me devuelve ningún valor. Le he metido un cout para ver el valor que toma "i" pero tampoco me muestra nada.
Es bastante raro. Ya había tenido este problema.
Os paso el código, a ver si me podéis decir qué le pasa.
Código C++:
Ver original
#include <iostream> using namespace std; typedef char TCadena []; int longitud(const TCadena cad); // Calcula el nº de caracteres de la cadena //- Caracteres en cadenas ---------------------------------------------- unsigned ocurrencias(const char c, const TCadena cad); // Calcula el nº de veces que aparece el caracter c en la cadena cad bool aparece(const char c, const TCadena cad); // Determina si el caracter c aparece o no en la cadena cad int posicion(const char c, const TCadena cad); // Calcula la primera posición en la que aparece c en la cadena cad. // Devuelve -1 cuando no aparece //- Subcadenas en textos ----------------------------------------------- bool es_prefijo(const TCadena pref, const TCadena cad); // Determina si pref es o no prefijo de cad bool aparece(const TCadena subcad, const TCadena cad, const unsigned pos); // Determina si subcad aparece o no en la posición pos dentro de cad int posicion(const TCadena subcad, const TCadena cad); // Calcula la primera posición en la que aparece subcad dentro de cad. // Devuelve -1 cuando no aparece. //- Programa de prueba ------------------------------------------------- int main(){ char c, cadena[80], subcadena[80]; unsigned opcion; bool ok; do{ cout << "[1] - Calcular la longitud de una cadena\n"; cout << "[2] - Buscar un carácter en una cadena\n"; cout << "[3] - Buscar una palabra en un texto\n"; cout << "[0] - Terminar\n"; cout << "Elija una opción: "; cin >> opcion; switch(opcion){ case 0: break; case 1: cout << "Escriba una cadena: \n"; cin >> ws; cin.getline(cadena,79); cout << "La cadena tiene " << longitud(cadena) << " caracteres\n"; break; case 2: cout << "Escriba una cadena: \n"; cin >> ws; cin.getline(cadena,79); cout << "Escriba un carácter: "; cin >> c; cout << "El carácter " << (aparece(c, cadena)? "" : " no ") << "aparece en la cadena\n"; cout << "El carácter está " << ocurrencias(c, cadena) << " veces en la cadena\n"; cout << "La primera aparición es en la posición " << posicion(c,cadena) << endl; break; case 3: cout << "Escriba un texto: \n"; cin >> ws; cin.getline(cadena,79); cout << "Escriba una cadena: \n"; cin >> ws; cin.getline(subcadena,79); cout << "La cadena " << (es_prefijo(subcadena,cadena)? "es" : "no es") << " prefijo del texto\n"; if (posicion(subcadena, cadena) >= 0) cout << "La cadena aparece en la posición " << posicion(subcadena,cadena) << " del texto\n"; else cout << "La cadena no aparece en el texto\n"; break; } cout << endl; } while(opcion != 0); return 0; } // Definiciones de funciones ------------------------------------------- int longitud(const TCadena cad){ int i=0; while(cad[i]!='/0') ++i; return i; } bool aparece(const char c, const TCadena cad){ bool esta=false; int i=0; while(!esta && cad[i]!='/0'){ if(cad[i]==c) esta=true; else ++i; }//end while return esta; } unsigned ocurrencias(const char c, const TCadena cad){ int i=0; unsigned veces=0; while(cad[i]!='/0'){ if(cad[i]==c) ++veces; ++i; }//end while return veces; } int posicion(const char c, const TCadena cad){ int i=0, pos=-1; while (cad[i]!='/0' and pos==-1){ if(cad[i]==c) pos=i; ++i; }//end while return pos; } bool es_prefijo(const TCadena pref, const TCadena cad){ bool prefijo=true; int i=0; do{ if(pref[i]!=cad[i]) prefijo=false; ++i; }while(prefijo and pref[i]!='/0'); return prefijo; } bool aparece(const TCadena subcad, const TCadena cad, const unsigned pos){ bool esta=true; int i=pos; do{ if(subcad[i]!=cad[i]) esta=false; ++i; }while(esta and subcad[i]!='/0'); return esta; } int posicion(const TCadena subcad, const TCadena cad){ int a=0, b=0; while(b<=(longitud(cad)-longitud(subcad))){ if(subcad[a]==cad[b]) ++a; ++b; }//end while if(subcad[a]=='/0') return b-a; else return -1; }