Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    43

    [C++] conteggio vocali

    Ciao a tutti, oggi mi sono imbattuto in un esercizio che trovo particolarmente difficile, almeno per me, e quindi mi rivolgo a voi per poter avere un aiuto.
    L'esercizio chiede di creare un programma che, inserite 20 frasi da massimo 80 parole ciascuna, conti il numero di vocali presente in ciascuna frase e stampi, il numero di vocali a, e, ecc... e poi il numero totale delle vocali.
    Per iniziare ho pensato intato di scrivere il programma che prenda in ingresso le frasi e poi le stampi.
    Alloco dinamicamente un array con dimensiome 20, e poi con l'istruzione cin.getline acquisisco le frasi cosi' da poter determinare la lunghezza massima di ogni singola frase.
    Infine con cout.write stampo le frasi acquisite.

    Ecco il codice, per comodita' ora lavoro con solo due frasi:

    codice:
    #include <iostream>
    using namespace std;
    
    int main ()
    {
    	int n = 2;
    	char* p = new char[2];	
    	cout << "Inserie un testo di massimo 80 parole" << endl;
    	for(int i=0; i<n; ++i)
    	{
    		cin.getline(p+i, 81);
    	}	
    	for(int i=0; i<n; ++i)
    	{
    		cout.write (p+i, 80);
    		cout << endl;
    	}
    	return 0;
    }
    E qui mi imbatto nel primo problema, se ipotiziamo di inserire le frasi:

    ciao
    prova prova

    ecco cosa ottengo per output:

    cprova prova(ed una serie di caratteri vari)
    prova prova(ed una serie di caratteri vari)

    come mai ottengo questi output, e come posso risolvere la cosa?
    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    Hai allocato soltanto due caratteri.. come è possibile farcene stare 160?
    Dovresti allocare una serie di puntatori a char e su ognuno allocare 80 caratteri.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    43
    Potrei quindi allocare un array di puntatori lungo 20 ed ogni puntatore farlo puntare ad un are di memoria lunga 80?

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    131
    Originariamente inviato da cryspolo
    Potrei quindi allocare un array di puntatori lungo 20 ed ogni puntatore farlo puntare ad un are di memoria lunga 80?
    Si.

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

    ciao

    potresti , usare un approccio diverso
    visto che disponi del tipo stringa , usare un semplice array di stringhe

    string frasi[20];

    durante l'ingresso della frase controlli che la lunghezza sia inferiore a tot caratteri

    for(int i=0; i<n; ++i)
    {
    cout << "Inserie un testo di massimo 80 parole" << endl;
    getline (cin, frasi[i]);
    // se lunghezza frasi[i] > 80 allora inserisci una frase più corta
    }


    poi trasformi la stringa in un array di char ed esegui la lettura delle vocali

    char temp[80];

    strcpy(temp,frasi[k].c_str());

    for(int j=0;temp[j]!=0;j++)
    {

    switch(temp[j])
    {

    case'a': a++ ; break;
    case'e': e++ ; break;
    case'i': i++ ; break;
    case'o': o++ ; break;
    case'u': u++ ; break;
    }

    }
    Tecnologia

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    43
    Devo per forza copiare la stringa nell'array? non posso ciclare la stringa stessa?

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

    ciao

    si puoi ciclare la stringa

    for(k=0;k<20;k++)//ripete per le 20 frasi
    {
    for(j=0;j<frase[k].length();j++)//scorre la frase
    {
    switch(frase[k][j])//preleva un carattere dalla frase
    ....
    ....
    ...

    conosco un po il C ma non il C++
    Tecnologia

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    43
    Usando il metodo che mi hai detto, pero' il programma acquisisce sempre la prima lettera della frase, non tutta la frase, se prima di contare le vocali io volessi stampare le singole frasi non riesco

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

    ciao

    Ciao ho detto che non conosco il C++

    io ho provato a farlo e sono riuscito tranquillamente ad stampare le frasi

    comunque , ripensandoci non è poi cosi una buona idea usare le stringhe string, perchè
    ti agevolano la programmazione , ma occupano più risorse rispetto ad una matrice di char
    char [20][80]

    ti posto un esempio del programma con l'uso dell string , ma tu dovresti adattarlo per l'uso
    di matrici di char



    codice:
    
    #include <iostream>
    #include <stdlib.h>
    #include<cstdio>
    using namespace std;
    
    
    
    int main ()
    {
        int a=0,e=0,i=0,o=0,u=0;
        int totaleVocali=0;
    	int n = 4;
    	string frasi[20];
    	
    	
    	for(int i=0; i<n; ++i)
    	{
        cout << "Inserie un testo di massimo 80 parole" << endl;	    
    	getline (cin, frasi[i]);
    	}	
    	cout<<"**********************************************"<<endl;
    	 
        cout << "stampa frasi"<<endl;
        cout<<"**********************************************"<<endl;
    	for(int i=0; i<n; ++i)
    	{
    	   
    		cout <<"FRASE "<<i+1<<"  -->  "<< frasi[i]<<endl;
    
    	}
    	cout<<"**********************************************"<<endl;
    	//elaborazione delle frasi 
    	
    	for(int k=0; k<n;k++)
    	{
    	    //strcpy(temp,frasi[k].c_str());
    	    
    	    for(int j=0;frasi[k][j]!=0;j++)
    	    {
             
              switch(frasi[k][j])
              {
                  
                  case'a': a++ ; break;
                  case'e': e++ ; break;
                  case'i': i++ ; break;
                  case'o': o++ ; break;
                  case'u': u++ ; break;
                  case'A': a++ ; break;
                  case'E': e++ ; break;
                  case'I': i++ ; break;
                  case'O': o++ ; break;
                  case'U': u++ ; break;
                  }
             
             }
             totaleVocali+=(a+e+i+o+u);
             //stampa
             cout<< "FRASE NUMERO   "<< k+1 <<endl << "  numero di a --> "<<a <<" numero di e  -->"<< e<<" numero di i -->  "<<i<< endl<<" numero di o -->  "<< o<<" numero di u -->  "<< u<<endl;
             a=e=i=o=u=0;
    	} 
         cout<<"NUMERO VOCALI IN TUTTE LE FRASI --> "<<totaleVocali<<endl;   
    	getchar();
            getchar();
    	return 0;
    }
    Tecnologia

  10. #10
    Utente di HTML.it
    Registrato dal
    Jun 2011
    Messaggi
    43
    Grazie per la risposta. Ho trovato un esempio su un libro, in cui si contavano le lettere di alcune frasi e con entrambi gli esempi sono riuscito a scrivere il codice in c++.
    Lo scrivo qui di seguito cosi' come l'ho risolto io.

    codice:
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int r=20, c=80;
    	char frase[r][c]; 
    	int count=0, a=0, e=0, i=0, o=0, u=0;
    	cout << "Inserisci 2 frasi da 80 caratteri al massimo:\n";
    	for(int k=0; k<r; ++k)
    	{
    		cin.getline(frase[k], 81);
    	}
    	for (int k=0; k <r; ++k)
    	{
    		for(int j=0; frase[k][j]!='\0'; ++j)
    		{
    			switch(frase[k][j])
    			{
    				case 'a' : case 'A': ++a; ++count; break;
    				case 'e' : case 'E': ++e; ++count; break;
    				case 'i' : case 'I': ++i; ++count; break;
    				case 'o' : case 'O': ++o; ++count; break;
    				case 'u' : case 'U': ++u; ++count; break;
    			}
    		}
    		cout << "La frase " << frase[k] << " ha: "<< endl <<
    a << " vocale/i a o A" << endl <<
    e << " vocale/i e o E" << endl <<
    i << " vocale/i i o I" << endl <<
    o << " vocale/i o o O" << endl <<
    u << " vocale/i u o U" << endl;
    		cout << "Il numero totale di vocali e': " << count << endl;
    		count = a = e = i = o = u = 0;
    	}
    	return 0;
    }
    Credo possa essere ricuramente ottimizzato, se qualcuno avesse qualche idea in proposito magari scrivetelo di seguito, io sto imparando a programmare in questi giorni e qualche consiglio non mi dispiacerebbe.
    Grazie a tutti.

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.