STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

di il
30 risposte

STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

Ciao a tutti, ho il seguente programma da scrivere: scrivere un programma in C++ che, letti da input un intero positivo N, un intero positivo M e una stringa di al più 100 caratteri, stampi “OK” se esistono almeno N vocali che precedono di esattamente M consonanti un’altra vocale e stampi “NO” altrimenti. Si può supporre che la stringa contenga solo lettere dell’alfabeto minuscole.

Mi funzionano tutti i casi tranne quello in cui il numero di vocali è pari a 0, ho provato a gestirlo cosi:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int N,M,num=1,cont=0;
string A;
bool cond = false,ok = false;

cin>>N>>M;

cin>>A;

if(M!=0)
{
cout<<"La dimensione di A quando entro nell'if: "<<A.size()<<endl;
for(unsigned int i=0;i<A.size();i++)
{
if( (A == 'a' ) || (A == 'e') || (A == 'i') || (A == 'o') || (A == 'u') )
{
cout<<"Vocale con cui entro: "<<A<<endl;

while(num <= M)
{
if((A[i+num] != 'a') && (A[i+num] != 'e') && (A[i+num] != 'i') && (A[i+num] != 'o') && (A[i+num] != 'u'))
{
cout<<"Consonante "<<num<<": "<<A[i+num]<<endl;
cond = true;
}
else
{
cout<<"La lettera in questo caso e' -> "<< A[i+num] << ",una vocale quindi esco e riparto. "<<endl;
cond = false;
num=1;
break;
}

num++;
}

if(cond)
{

if((A[i+M+1] == 'a') || (A[i+M+1] == 'e') || (A[i+M+1] == 'i') || (A[i+M+1] == 'o') || (A[i+M+1] == 'u'))
{
cout<<"Vocale con cui esco: "<<A[i+M+1]<<endl;
cont++;
i = i+M;

if(cont == N)
{
ok = true;
break;
}
}
else
{
cout<<"Non trovo una vocale la sequenza dunque non e' valida "<<endl;
cond = false;
ok = false;
}

num=1;
}
}
if(ok)
break;
}
}
else
{
cout<<"La dimensione di A quando entro nell'else e': "<<A.size()<<endl;

for(int i=0;i<A.size();i++)
{
if((A == 'a' ) || (A == 'e') || (A == 'i') || (A == 'o') || (A[i] == 'u'))
{
cout<<A[i]<<" "<<A[i+1]<<endl;

if(A[i] == A[i+1])
{
if( N == 1)
{
ok = true;
break;
}
}
}
}
}

if(ok)
cout<<"OK";
else
cout<<"NO";
}


Nel momento in cui però entro nell'else corrispondente alla prima if, la dimensione di A non sarà il numero di lettere che leggo in A ma solamente 1, qualcuno potrebbe spiegarmi perchè?

30 Risposte

  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    Il codice è leggibile solo da un compilatore. Usa le tabulazioni e poi scrivi dentro
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    Aggiungo che l'impostazione logica del programma può essere notevolmente semplificata.
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    Weierstrass ha scritto:


    Il codice è leggibile solo da un compilatore. Usa le tabulazioni e poi scrivi dentro
    Che significa?
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    Nippolo ha scritto:


    Aggiungo che l'impostazione logica del programma può essere notevolmente semplificata.
    In che modo?
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    FND1 ha scritto:


    Weierstrass ha scritto:


    Il codice è leggibile solo da un compilatore. Usa le tabulazioni e poi scrivi dentro
    Che significa?
    Leggi il regolamento! Regola 7.
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    FND1 ha scritto:


    Weierstrass ha scritto:


    Il codice è leggibile solo da un compilatore. Usa le tabulazioni e poi scrivi dentro
    Che significa?
    
    if(M!=0)
    {
    	cout<<"La dimensione di A quando entro nell'if: "<<A.size()<<endl;
    	for(unsigned int i=0;i<A.size();i++)
    	{
    		if( (A == 'a' ) || (A == 'e') || (A == 'i') || (A == 'o') || (A == 'u') )
    		{
     /* ECCETERA */		
    
    Altrimenti come fai a capire dove sei nel codice? Tieni a mente le parentesi graffe ancora aperte come fa il compilatore?
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    
    #include<iostream>
    #include<string>
    using namespace std;
    int main()
    {
    	int N,M,num=1,cont=0;
    	string A;
    	bool cond = false,ok = false;
    	
    	cin>>N>>M;
    	
    	cin>>A;
    
    	if(M!=0)
    	{
    		cout<<"La dimensione di A quando entro nell'if: "<<A.size()<<endl;
    		for(unsigned int i=0;i<A.size();i++)
    		{
    			if( (A[i] == 'a' ) || (A[i] == 'e') || (A[i] == 'i') || (A[i] == 'o') || (A[i] == 'u') )
    			{
    				cout<<"Vocale con cui entro: "<<A[i]<<endl;
    
    				while(num <= M)
    				{
    					if((A[i+num] != 'a') && (A[i+num] != 'e') && (A[i+num] != 'i') && (A[i+num] != 'o') && (A[i+num] != 'u'))
    					{
    						cout<<"Consonante "<<num<<": "<<A[i+num]<<endl;
    						cond = true;
    					}
    					else
    					{
    						cout<<"La lettera in questo caso e' -> "<< A[i+num] << ",una vocale quindi esco e riparto. "<<endl;
    						cond = false;	
    						num=1;
    						break;
    					}
    					
    					num++;
    				}				
    	
    				if(cond)
    				{
    				
    					if((A[i+M+1] == 'a') || (A[i+M+1] == 'e') || (A[i+M+1] == 'i') || (A[i+M+1] == 'o') || (A[i+M+1] == 'u'))
    					{	
    						cout<<"Vocale con cui esco: "<<A[i+M+1]<<endl;
    						cont++;
    						i = i+M;
    								
    						if(cont == N)
    						{
    							ok = true;
    							break;
    						}
    					}
    					else
    					{
    						cout<<"Non trovo una vocale la sequenza dunque non e' valida "<<endl;
    						cond = false;
    						ok = false;
    					}
    				
    					num=1;
    				}
    			}
    			if(ok)
    				break;		
    		}
    	}
    		else
    		{
    			cout<<"La dimensione di A quando entro nell'else e': "<<A.size()<<endl;
    	
    			for(int i=0;i<A.size();i++)		
    			{
    				if((A[i] == 'a' ) || (A[i] == 'e') || (A[i] == 'i') || (A[i] == 'o') || (A[i] == 'u')) 
    				{
    					cout<<A[i]<<" "<<A[i+1]<<endl;
    
    					if(A[i] == A[i+1])
    					{
    						if( N == 1)
    						{
    							ok = true;
    							break;
    						}
    					}
    				}
    			}
    		}
    		
    	if(ok)
    		cout<<"OK";
    	else 
    		cout<<"NO";
    }
    
    

    Ecco a te !
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    - Devi imparare a leggere con maggior attenzione il testo dell'esercizio: mancano delle cose.
    - Usa meglio la spaziatura, in modo da rendere più leggibile il testo.
    - Inserisci dei commenti che spieghino PERCHÉ e COME.
    - Usa nomi più lunghi e significativi per le variabili.
    - Non si scrive e' ma è...
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    Ok, dato che è un esercizio e stai evidentemente imparando ti posso dare solo degli indizi

    1) prima di iniziare i calcoli, devi mandare i messaggi in output se N < 0 , M < 0 o la lunghezza di A > 100, poi uscire dal programma

    2) se N == 0 e M == 0 il messaggio è automaticamente OK, scrivi ed esci

    3) se N == 0 e M != 0, cioè il caso che non ti torna, il programma diventa banalmente controllare che esistano M consonanti consecutive nella stringa, prova ad analizzarlo a parte

    4) manca il return value nel main


    Poi comunque si potrebbe riscrivere il tutto in maniera molto più semplice
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    nicolap ha scritto:


    - Devi imparare a leggere con maggior attenzione il testo dell'esercizio: mancano delle cose.
    - Usa meglio la spaziatura, in modo da rendere più leggibile il testo.
    - Inserisci dei commenti che spieghino PERCHÉ e COME.
    - Usa nomi più lunghi e significativi per le variabili.
    - Non si scrive e' ma è...
    Normalmente quando programmo evito di usare è perchè ogni volta il compliatore genera degli errori, ma poi che cazzo commenti a fare se non mi dai concretamente una mano?
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    Weierstrass ha scritto:


    Ok, dato che è un esercizio e stai evidentemente imparando ti posso dare solo degli indizi

    1) prima di iniziare i calcoli, devi mandare i messaggi in output se N < 0 , M < 0 o la lunghezza di A > 100, poi uscire dal programma

    2) se N == 0 e M == 0 il messaggio è automaticamente OK, scrivi ed esci

    3) se N == 0 e M != 0, cioè il caso che non ti torna, il programma diventa banalmente controllare che esistano M consonanti consecutive nella stringa, prova ad analizzarlo a parte

    4) manca il return value nel main


    Poi comunque si potrebbe riscrivere il tutto in maniera molto più semplice
    Grazie per i consigli, concretamente secondo il tuo punto di vista, come potrei organizzare meglio il codice?
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    Che vuoi dire con "concretamente"?
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    FND1 ha scritto:


    Normalmente quando programmo evito di usare è perchè ogni volta il compliatore genera degli errori, ma poi che cazzo commenti a fare se non mi dai concretamente una mano?
    Normalmente sei un cafone maleducato! Cambia forum, grazie!
  • Re: STRINGHE C++, DIMENSIONE DIVERSE DELLA STESSA STRINGA

    nicolap ha scritto:


    FND1 ha scritto:


    Normalmente quando programmo evito di usare è perchè ogni volta il compliatore genera degli errori, ma poi che cazzo commenti a fare se non mi dai concretamente una mano?
    Normalmente sei un cafone maleducato! Cambia forum, grazie!
    Stavo per dare altri suggerimenti ma a questo punto evito: l'aiuto bisogna anche imparare a guadagnarselo nella vita
Devi accedere o registrarti per scrivere nel forum
30 risposte