Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [c++] problemi con programmino frequenze lettere

    ciao,mi chiamo francesca e ho appena inizaito un corso di programmazione.Ho da svolgere degli esercizi e non sono molto pratica.Il progarmma seguente dovrebbe contare la frequenza delle lettere delle parole che dai in input; la prima parte del codice l'ha già scritta il mio professore mentre io ho scritto solo
    codice:
    if (isalpha(ch))
    
    {ch=ch-'a';
    ++freq[ch];}
      }
    questo programma nei computer in facoltà funzionava senza problemi mentre sul mio (uso knoppix per la prima volta) dopo che do l'imput non da alcun risultato e non capisco il perchè dato che il compilatore è lo stesso dei computer in facoltà ovvero g++.
    codice:
    #include <iostream>
    #include <vector>
    #include <cctype>   // Per le funzioni isalpha e tolower.
    using namespace std;
    
    // Programma che conta e stampa le frequenze delle lettere.
    int main()
    {
      vector<int> freq(26);  // Caselle automaticamente azzerate.
    
      while (true)
      {
        char ch = cin.get(); // Legge un carattere dall'input e lo mette in ch
        if (!cin) { break; } // Uscire dal ciclo, se non ci sono piu` caratteri da leggere.
        ch = tolower(ch);    // Converte maiuscole in minuscolo
    if (isalpha(ch))
    
    {ch=ch-'a';
    ++freq[ch];}
      }
    
      // Stampiamo le frequenze...
      cout << "Lettera  Frequenza\n";
      for (int i=0; i < 26; ++i)
      {
        cout << "   " << char('a'+i) << "       " << freq[i] << endl;
      }
      return 0;
    }
    grazie.

  2. #2
    Cosa succede esattamente dopo che dai l'input? Sparisce la finestra? Hai provato ad aggiungere prima del return 0; un
    codice:
    cout<<"Premere Invio per uscire...";
    cin.ignore();
    ?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    ho provato ad aggiungere le due linee di codice che mi hai consigliato ma il risultato non cambia:quando do invio il cursore si sposta alla linea successiva che però rimane vuota..ho provato anche con un altro compilatore (devc++) perchè non ho sempre la possibilità di usare il computer con g++ ma anche questo mi da lo stesso risultato...praticamente è come se non leggesse l'imput..non capisco davvero cos'è che non va..

  4. #4
    Premetto che dev usa g++ di default e che non è un compilatore ma un IDE ...
    codice:
       while (true)
          {
          char ch = cin.get(); // Legge un carattere dall'input e lo mette in ch
          if (!cin)
             {
             break;
             } // Uscire dal ciclo, se non ci sono piu` caratteri da leggere.
          ch = tolower(ch);    // Converte maiuscole in minuscolo
          if (isalpha(ch))
             {
             ch=ch-'a';
             ++freq[ch];
             }
          }
    Cosa significa if (!cin) ??
    Un alternativa può essere: if (ch == '\n')
    (<cctype> puoi toglierla)
    Experience is what you get when you don’t get what you want

  5. #5
    non so bene cosa significhi (!cin) perchè quella parte di codice l'ha scritta il mio professore..ho aggiunto il codice che mi hai sugggerito e il programmino funziona!l'alternativa che hai proposto ovvero if (ch == '\n') significa che esce dal ciclo se trova uno spazio,giusto? per esercizio dovrei modificare lo stesso programmino in maniera che conti solo la freq delle ultime lettere delle parole:io avevo pensato di fare cosi
    codice:
                                   
    
    
    int main()
    {
      vector<int> freq(26);  // Caselle automaticamente azzerate.
      char ult;
      while (true)
      {
        char ch = cin.get(); // Legge un carattere dall'input e lo mette in ch
        if (ch=='\n') { break; } 
        ch = tolower(ch);    // Converte maiuscole in minuscolo
         if (isalpha(ch))
         {ch=ult;}
        else ch=ult-'a';
         ++freq[ch];
         
      }
    però chiaramente non funziona..qualche suggerimento su dove ho sbagliato?

  6. #6
    non so bene cosa significhi (!cin) perchè quella parte di codice l'ha scritta il mio professore..ho aggiunto il codice che mi hai sugggerito e il programmino funziona!l'alternativa che hai proposto ovvero if (ch == '\n') significa che esce dal ciclo se trova uno spazio,giusto?
    Esce se viene premuto invio ...
    Che intendi per ultime lettere delle parole ?
    Se ti riferisci all'ultima lettera di ogni parola ti basta mantenere uno storico della lettera precedente alla lettura di uno spazio ...
    Tuttavia cin.get trascura gli spazi quindi devi cambiare metodo di acquisizione ...
    Experience is what you get when you don’t get what you want

  7. #7
    il metodo l'avevo capito,il problema è che non sapevo esattamente il funzionamento di cin.get.Quale altro metodo di acquisizione posso usare in modo che legga un carattere alla volta (che è quello che fa cin.get giusto?) senza ignorare gli spazi? scusate le domande banali ma sono alle primissime armi..

  8. #8
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,563
    Che brutto ciclo... un while(true) e poi un break all'interno di esso...perchè non un
    codice:
     while (cin.get() = '\n')
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Occhio che però non recuperi il carattere.
    Codice PHP:
    char ch;
    while ((
    ch cin.get()) != '\n') {
       
    cout << ch
    }
    cout << endl
    Risolve il problema.

  10. #10
    Il problema è che cin.get () trascura gli spazi ...
    Personalmente, non trovo una funzione cpp che non li ignori ...
    Experience is what you get when you don’t get what you want

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 © 2026 vBulletin Solutions, Inc. All rights reserved.