/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Cantador letras

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
jparrot2



Registrado: 03 Oct 2012
Mensajes: 45

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com