Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2014
    Messaggi
    13

    [C++] Occorrenze lettere in una stringa

    Salve a tutti vorrei un aiuto in questo programma sulle stringhe.
    Devo calcolare le occorrenze di ogni carattere in una frase inserita dall'utente (cioè devo riportare quante volta ogni lettera si ripete in una frase) solamente che devo contare solo le minuscole.
    Ho provato a realizzare un programma di questo tipo:
    codice:
    int main(){
        int n, i, j;
        char stringa[200];
        cout << "Inserisci la stringa: " << endl;
        gets(stringa);
        n = strlen(stringa);
        int conta[200];
    
    
        for (i = 0; i < n; i++)
        {
            conta[i] = 1;
            for (j = i + 1; j < n; j++)
            if (stringa[i] == stringa[j])
                conta[i]++;
        }
        cout << "Nella stringa ci sono: " << endl;
        for (i = 0; i<n; i++)
        {
                cout << stringa[i] << " = " << conta[i] << endl;
        }
        system("pause");
        return 0;
    }
    Solo che così facendo non mi conta solo le lettere minuscole ma anche tutti gli altri caratteri.

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    Ciao

    Visto che per stringhe, usi array di char, suggerisco una soluzione stile linguaggio C.

    In C, il confronto tra un carattere e il suo codice ascii non necessita di conversioni,
    esempio if('a'==97) equivale a if(97==97).

    devi controllare quante occorrenze ci sono in una stringa dei caratteri da 'a' a 'z',
    quindi ti potresti creare un array di 26 elementi.

    codice:
    int lettere[26]={0};//inizializzato a zero
    Tenendo conto che l'indice zero 0 rappresenta 'a', l'indice 1 rappresenta'b' ,
    e che quindi per ottenere il codice ascii della lettera voluta basta che fai indice+97
    se esempio indice è 1 + 97 diventa 98 codice ascii di 'b'
    e puoi fare il confronto if(indice+97==carattere) che equivale if(98==carattere).

    puoi impostare il tuo programma in un modo simile a quello che ti suggerisco.

    codice:
    for(i=0;i<26;i++) // Ripete per tutte le lettere 
      {
          
          for(j=0;frase[j]!=0;j++)//Scorre la frase da esaminare, carattere per carattere
          {
              if(frase[j]==i+97)// Se il carattere esaminato, è uguale  al carattere da valutare i+97 
                  lettere[i]++;// Incrementa l'array lettere nella posizione che rappresenta quel carattere 
          }    
          
      }

    Probabilmente non ti sarà tutto chiaro, ma certe volte è più complicato spiegare a parole, che postare un codice di esempio
    Ultima modifica di torn24; 30-09-2014 a 08:20
    Tecnologia

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Dopo le considerazioni di @torn24, è molto più efficiente
    codice:
    for(i=0; i < n; ++i) {
      if(frase[i] >= 'a' && frase[i] <= 'z') {
        ++lettere[frase[i]-'a'];
      }
    }
    Con n la lunghezza della stringa.

    (@torn24 lo stesso si potrebbe fare usando string)
    Ultima modifica di Scara95; 30-09-2014 a 08:43
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    Ciao

    @Scara95 in effetti la tua soluzione è ottimale, ma a me non sarebbe mai venuta in mente

    Se non ti dispiace, commento il codice, molto chiaro per un professionista, ma forse difficile da capire per uno alle prime armi.

    ==============================
    Premessa, i caratteri che si usano nelle condizioni e espressioni, devono essere considerati come il codice ascii del carattere e non il carattere stesso.


    codice:
    for(i=0; i < n;++i){ //Scorre la frase carattere per carattere 
      if(frase[i]>='a'&& frase[i]<='z'){// controlla se il carattere è una lettera minuscola
                                              
        ++lettere[frase[i]-'a']; // incrementa array lettere nella posizione corrispondente 
                                 // esempio: frase[i]='b'  diviene  'b'-'a' ossia  98-97= posizione uno
      }
    }
    Tecnologia

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.