Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    684

    [C++] Frequenza delle lettere usate in una stringa

    Ciao ragazzi,
    dovrei realizzare un programmino che mi permetta di:

    1)inserire una stringa
    2) visualizzare quante volte viene ripetuta ogni singola lettera della stringa digitata

    Esempio:

    Stringa: ciccio

    C=3
    i=2
    c=3
    c=3
    i=2
    0=1

    Sto testando il tutto utilizzando prima un array:

    #include <iostream>
    #include <stdlib.h>
    #include <iomanip>

    using namespace std;

    int main()
    {
    const int responsesize = 40, frequencysize = 10;
    int m[responsesize] = {1,6,8,3,9,8,4,4,5,7,4,6,2,3,4,5,4,1,1,4,6,8,9,7,
    5,6,9,9,4,8,4,7,6,4,3,4,5,6,1,4};
    int frequency[frequencysize] = {0};

    for (int i = 0; i < responsesize; i++)
    ++frequency[m[i]];

    cout <<"Voto" << setw(17) << "Frequenza" << endl;

    for (int voto = 1; voto<frequencysize; voto++)
    cout << setw(4) << voto << setw(16) << frequency[voto] << endl;


    system("PAUSE");
    return 0;
    }


    ma con le stringhe ho qualche problemino...qualcuno mi sa dare una mano??

    Grazie


  2. #2
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Fai prima a fare cosi':
    1: Crei un array di interi con tanti elementi quanti il numero di lettere:
    2: Azzeri tutti gli elementi
    3: Scanni la stringa lettera per lettera, incrementando il valore dell'array corrispondente

    Eccoti uno spunto minimale... dovrai definire le variabili che uso e correggere gli errori che sicuramente ci commettero':
    codice:
    int lettere[26];
    for ( i = 0; i < 26; i ++ ) {
            lettere[i] = 0;
    }
    
    for ( i = 0; i < strlen(stringa); i ++ ) {
            if ( stringa[i] >= 'a' && stringa[i] <= 'z' )
                    lettere[ stringa[i] - 'a' ] ++;
            if ( stringa[i] >= 'A' && stringa[i] <= 'Z' )
                    lettere[ stringa[i] - 'A' ] ++;
            /* else
                    non e' una lettera */
    }
    
    for ( i = 0; i < 26; i ++ ) {
            if ( lettere[i] )
                    cout << "Sono state trovate " << lettere[i] << " '" << (char)('a'+i) << "'.\n";
    }
    Ovviamente la stringa che vuoi scannare sara' la variabile "stringa"


    Fammi sapere


    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    684
    Scusami ma sono alle prime armi..
    stringa come va definita nel main? :master:

  4. #4
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Puoi fare:
    char stringa [1024];


    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    684
    Grazie Dev, funziona tutto alla perfezione.

    Un'ultima cosa: mi potresti spiegare i vari cicli for ed if del programma? E poi perchè "sottrai" la 'A' - la 'a' ?

    Grazie


  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    684
    E se volessi poi invece visualizzare le sole lettere della stringa inserita nell'ordine in cui sono digitate con il valore della frequenza a fianco??

    Esempio:

    C: 1
    i: 1
    a: 1
    o: 1


    Qualcuno mi aiuta?


  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    684
    Nessuno sa darmi una mano?

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2001
    Messaggi
    74
    Ho usato le mappe , sono molto utili.
    codice:
    #pragma warning(disable:4786)
    #include <iostream>
    #include <map>
    #include <string>
    int main()
    {
    typedef std::map<char,int>	strint_map;
    	strint_map				lett_freq;
    	strint_map::iterator	lett_freqIt;
    
    int i=0;
    
    //Frase
    //std::string str = "Questa qui e' molto grande per vedere come funziona";
    std::string str = "ciao a tutti";
    
    //Raccoglie le frequenze
    for(i=0;i<str.size();i++)
    {
    lett_freq[str[i]]++;
    //std::cout<<""<<str[i]<<" "<<lett_freq[str[i]]<<std::endl;
    }
    
    std::cout<<std::endl;
    
    //Primo tipo di stampa
    lett_freqIt = lett_freq.begin();
    do{
    	std::cout<<"["<<(*lett_freqIt).first<<"] = "<<(*lett_freqIt).second<<std::endl;
    }while(++lett_freqIt!=lett_freq.end() );
    
    std::cout<<std::endl;
    
    //Secondo tipo di stampa
    for(i=0;i<str.size();i++)
    std::cout<<"["<<str[i]<<"]= "<<lett_freq[str[i]]<<std::endl;
    
    return 0;
    }
    /*Output
    [ ] = 2
    [a] = 2
    [c] = 1
    [i] = 2
    [o] = 1
    [t] = 3
    [u] = 1
    
    [c]= 1
    [i]= 2
    [a]= 2
    [o]= 1
    [ ]= 2
    [a]= 2
    [ ]= 2
    [t]= 3
    [u]= 1
    [t]= 3
    [t]= 3
    [i]= 2
    */
    Vedi se ti va bene.

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    684
    Molten sei stato gentilissimo però per me è troppo difficile, non so nemmeno cosa siano le mappe! Sono alle prime armi con il c++ e sono arrivato a manipolare array,stringhe,puntatori e strutture


    Puoi spiegarmi il perchè di questa "sottrazione" lettere[ stringa[i] - 'a' ] ++;

    e magari rifare il programmino in maniera moooolto + semplice??

    Grazie mille

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2002
    Messaggi
    684
    E se volessi ricercare, usando il codice sopra, l'elemento che ricorre più volte come dovrei fare?

    Esempio: cout << "L'elemento " << ???? << " ricorre più volte";

    Please help

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.