| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
jparrot2
Registrado: 03 Oct 2012 Mensajes: 45
| Publicado: 23/12/2012 3:01 am | | | Título: Cantador letras |
| Muy buenas, Tengo que hacer una programa que al introducir un texto cuente el numero que veces que aparece una letra, por exemplo: Si introducimos la frase: Los niños y las niñas Por pantalla tendria que salir: La L aparece 1 vez. La o aparece 2 vezes. La s aparece 3 vezes. El aparece 4 vezes. La n aparece 4 vezes. La i aparece 2 vezes. La ñ aparece 2 vezes. La y aparece 1 vezes. La a aparece 2 vezes. tengo hecho el siguinte codigo, pero nose como continuar:
| Código: | #include <stdio.h> #include <stdlib.h> #define MAX 100
int main() { char text[MAX+1]; char caracter[MAX]; char repeticion[MAX]; int index=0; int index2=0; int cops=0;
printf("Escriu un text:\n"); scanf("%100[^\n]",text);
while(text[index]!='\0'){ caracter[index2]=text[index]; index++; index2++; caracter[index2]='\0'; printf("La %s apareces %d veces.\n",caracter,index2); index2=0; caracter[index2]='\0'; }
return 0; }
|
Un saludo. |
| | Volver arriba | |  | Masakre
Registrado: 06 Jun 2012 Mensajes: 245
| Publicado: 23/12/2012 8:44 am | | | Título: |
| Bueno, acabo de escribir este programa:
| Código: | #include <iostream> using namespace std;
const int MAX = 100; // 99 Caracteres + Marca de fin de cadena.
int main() { bool yaEsta=0; char frase[MAX], c_unicos[MAX]; int veces[MAX], i=0, x, unicos=0;
cout<<"Ingrese frase: "; cin.getline(frase, MAX);
while(frase[i] != '\0'){ yaEsta=0; for(x=0; x<unicos; x++) if(c_unicos[x] == frase[i]) { yaEsta=1; veces[x]++; } if(!yaEsta) { c_unicos[x] = frase[i]; veces[x] = 1; unicos++; } ++ i; }
cout<<"\nSe encontraron "<<unicos<<" caracteres unicos:"; for(x=0; x<unicos; x++) { cout<<"\nEl caracter \'"<<c_unicos[x]<<"\' se repite "<<veces[x]<<" veces !"; } return 0; } |
Está en C++. Para pasarlo a C bastaría con cambiar los flujos de entrada y salida estandar cout y cin por funciones de C (printf, scanf) ... Espero te sirva de orientación.
| Cita: | Funcionamiento: La variable yaEsta verifica si el caracter frase[i] ya se encuentra registrado como caracter único (i permite una iteración a lo largo de todo el texto ingresado). A medida que va haciendo comparaciones, si encuentra caracteres iguales, aumenta en 1 la cantidad de veces que se ha repetido dicho caracter, pero esas cantidades se almacenan en otro arreglo (que podríamos decir está en paralelo), que es veces. Es decir, la cantidad de veces que se repite c_unicos[z] está en veces[z]. Si todavía no está registrado, lo registra, inicializando su cantidad de veces en 1, y aumentando en 1 la variable unicos (que lleva un conteo de cuantos caracteres únicos se han ido encontrando). En realidad en un inicio quería usar una comparación con '\0' para determinar la dimensión de c_unicos cada vez que se recorriera en el for, pero como no es una cadena, no tiene esa marca de fin de cadena. Esta es la razón de existencia de unicos, para saber en qué momento detener el for, y además lo uso para mostrar la cantidad de caracteres únicos. Finalmente solo muestra los resultados. |
* Hay forma de crear el programa sin la constante MAX. Pero he tratado de seguir la idea que has estado construyendo. |
| | Volver arriba | |  | Masakre
Registrado: 06 Jun 2012 Mensajes: 245
| Publicado: 23/12/2012 10:36 am | | | Título: |
| Esta otra solución es usando la clase string y algunas funciones para hacerlo más entendible:
| Código: | #include <iostream> #include <string> using namespace std;
bool noEsta(string, char); // Determina si está un caracter en una cadena.
int veces(string, char); // Cuenta la cantidad de veces de un caracter en una cadena.
int main() { string frase, c_unicos; cout <<"Ingrese frase: "; cin>>frase;
for(int x=0; x<frase.length(); x++) if( noEsta(c_unicos, frase[x]) ) c_unicos += frase[x];
cout<<"\nSe encontraron "<<c_unicos.length()<<" caracteres unicos:"; for(int x=0; x<c_unicos.length(); x++) cout<<"\nEl caracter '"<<c_unicos[x]<<"\' se ha repetido "<<veces(frase, c_unicos[x])<<" veces."; return 0; }
bool noEsta(string str, char c){ for(int i=0; i<str.size(); i++) if(str.at(i) == c) return 0; return 1; }
int veces(string str, char c){ int veces=0; for(int i=0; i<str.size(); i++) if(str[i] == c) veces++; return veces; } |
|
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |