Esercizio Array - soluzione errata - C++

di il
16 risposte

Esercizio Array - soluzione errata - C++

Salve, ho appena finito di scrivere un codice in C++ ma sembra non funzionare, la traccia dell'esercizio è la seguente:
Dati in input una frase e una parola chiave, controllare quante volte questa parola compare nella frase inserita.
Il codice da me scritto è il seguente:
#include <iostream>
using namespace std;
int main(){
int m=-1,n=-1,contatore=0,s=0,posizione=0;
char frase[n],parola[m];
char tasto1='s',tasto2='s',tasto3='s';
cout << "Scrivi una frase.\n";
while (tasto1!='n'){
n++;
cout << "Digita una lettera.\n";
cin >> frase[n];
cout << "Vuoi continuare?\n";
cin >> tasto1;
}
cout << "Scrivi una parola.\n";
while (tasto2!='n'){
m++;
cout << "Digita una lettera.\n";
cin >> parola[m];
cout << "Vuoi continuare?\n";
cin >> tasto2;
}
//Qua inizia la porzione di codice utile a fare il conteggio
for (int i=0;i<=n;i++){
for (int cicloparola=0;cicloparola<=m;cicloparola++){
while (parola[posizione]==frase[cicloparola]){
contatore++;
posizione++;
}
if (contatore==m){
s++;
}
contatore=0;
posizione=0;
}
}
cout << s <<endl;
return 0;
}
P.S Essendo uno studente e non avendo ancora fatto le stringhe se poteste evitare di correggerlo utilizzandole sarebbe meglio, grazie mille

16 Risposte

  • Re: Esercizio Array - soluzione errata - C++

    Cosa intendi quando dici "di non avere ancora fatto le stringhe"? Non hai fatto le stringhe tipo C++ (ossia gli oggetti della classe string) o non hai fatto nemmeno le stringhe tipo C (per intenderci quelle che terminano con il carattere \0)?

    Inoltre mi sorge un altro dubbio... almeno gli array li hai fatti? Chiedo perché non ho mai visto array di dimensione negativa!

    Per quanto riguarda la ricerca della parola nella frase sapresti spiegare a parole come dovrebbe funzionare l'algoritmo che hai ideato? Chiedo, perché da un'occhiata veloce dubito fortemente che sia funzionante.
  • Re: Esercizio Array - soluzione errata - C++

    Allora:
    1) In effetti rivedendo il codice non mi sono accorto di questo errore, in ogni caso non verrà mai salvato niente lì, dato che lo aumento non appena inizia il ciclo, tutto ciò era per poter aumentare ad ogni ciclo quella determinata variabile;
    2) Non ho fatto nessun tipo di stringa, dato che abbiamo iniziato subito da C++ tralasciando C, scelta del professore;
    3) In pratica secondo il mio ragionamento bisognerebbe controllare a blocchi di n caratteri (i caratteri della parola) se coincidono con quelli della frase. L'analisi della correttezza che ho fatto su foglio te la riassumo velocemente:
    Parola: Cane
    Frase: Il Cane Mangia L'osso
    Praticamente si controllerà se Cane coincide con IlCa, poi con lCan, poi Cane, poi aneM, poi neMa e così via, non so se hai capito.
  • Re: Esercizio Array - soluzione errata - C++

    In alternativa posso dichiare gli array dopo il ciclo in modo tale da sapere esattamente la loro grandezza?
  • Re: Esercizio Array - soluzione errata - C++

    Nel momento in cui dichiari un array devi anche precisare la sua dimensione, in quanto è proprio in base ad essa (oltre ovviamente al tipo degli elementi) che il compilatore saprà quanto spazio in memoria destinare all'array.
    Quello che ti consiglio è di fissare una dimensione massima (per esempio pari a 30 per la parola e 500 per la frase), dopodiché inserisci lettera per lettera finché la parola/frase non è completa, a patto ovviamente che non venga superata la dimensione massima fissata in precedenza. Quindi andrai ad usare un ciclo simile a quello presente nel tuo codice, ma nella condizione del while dovrai anche controllare che sia m<30 e n<500.

    Per quanto riguarda la ricerca della parola nella frase, il tuo non mi sembra l'approccio migliore. Quello che farei è scorrere la frase dall'inizio finché c'è la possibilità effettiva di trovare la parola... mi spiego meglio, consideriamo
    PAROLA: panettone
    FRASE: buon natale
    nello scorrere la FRASE possiamo tranquillamente fermarci alla lettera "o", in quanto andando oltre non c'è lo spazio materiale per contenere la PAROLA "panettone".
    Scorrendo la FRASE quindi cerchiamo una lettera uguale alla lettera iniziale della PAROLA, se la troviamo possiamo quindi continuare con le successive.
  • Re: Esercizio Array - soluzione errata - C++

    Ok.. ho capito il ragionamento, ma questo scorrimento tu come lo faresti, con la porzione di codice che ho scritto io, ovvero questa:
    for (int i=0;i<=n;i++){ //n sarebbe la dimensione dell'array della frase
    			for (int cicloparola=0;cicloparola<=m;cicloparola++){ //m sarebbe la dimensione dell'array della parola, quindi il numero di caratteri
    			while (parola[posizione]==frase[cicloparola]){ //parola[0]==frase[0], la posizione viene aumentata sempre di 1, fino ad m (caratteri della parola)
    				contatore++;
    				posizione++;
    			}
    			if (contatore==m){
    				s++;
    			}
    			contatore=0; //Gli viene assegnato 0 in modo tale da poter rifare tutto il processo
    			posizione=0;
    			}
    		}
  • Re: Esercizio Array - soluzione errata - C++

    Come "scorciatoia", potrebbe valere usare strstr() da cstring (o string.h)?

    http://www.cplusplus.com/reference/cstring/strstr
  • Re: Esercizio Array - soluzione errata - C++

    @AldoBaldo
    Premesso che la mia conoscenza delle varie librerie/funzioni è quasi nulla, da un'occhiata veloce al link direi che (IN TEORIA) si tratta molto più di una scorciatoia!
    Sottolineo IN TEORIA, perché quelle utilizzate da Shark44 non sono vere e proprie C-stringhe!

    @Shark44
    Praticamente quello sarebbe il codice di prima con l'aggiunta di commenti?
    In ogni caso inizia ad implementare la parte relativa all'acquisizione di frase e parola e posta il codice, dopo ragioniamo insieme sull'algoritmo per cercare la parola all'interno della frase.
  • Re: Esercizio Array - soluzione errata - C++

    	do {
    		n++;
    		cout << "Digita una lettera.\n";
    		cin >> frase[n];
    		cout << "Vuoi continuare?\n";
    		cin >> tasto1;
    	}while (tasto1!='n');
    	cout << "Scrivi una parola.\n";
    	do {
    		m++;
    		cout << "Digita una lettera.\n";
    		cin >> parola[m];
    		cout << "Vuoi continuare?\n";
    		cin >> tasto2;
    	} while (tasto2!='n');
    	
    Io credo vada bene questo codice, dato che, pur essendo molto meccanico, fa inserire un carattere nell'array parola e nell'array frase uno per volta, non sarà la migliore soluzione ma è una soluzione, dimmi che ne pesi.
    P.S la variabile n servirà per salvare i caratteri nelle varie posizioni, la inizializzo -1, come m, per poter incrementarlo ogni volta di uno. (il for non andava bene in questo caso perchè l'utente deve inserire volta per volta un carattere, e terminare cliccando il tasto n.
  • Re: Esercizio Array - soluzione errata - C++

    Nel post precedente ti sei limitato ad aggiungere dei commenti, qui invece hai semplicemente sostituito il while con un do/while e inoltre manca tutta la parte delle dichiarazioni... sinceramente non vedo molta buona volontà da parte tua!

    Prima ti ho dato dei consigli, li hai letti? Non li hai seguiti perchè non ti piacciono o perchè non li hai capiti? Se non li hai capiti, perchè non lo dici?

    In ogni caso posta un codice compilabile che permetta all'utente di inserire una parola di max 30 caratteri e una frase di max 500 caratteri.
  • Re: Esercizio Array - soluzione errata - C++

    Premetto che ho capito cosa hai detto, ma non essendo in grado di concretizzare in codice cosa hai detto ho commentato la parte di codice che già avevo scritto in modo tale che tu mi dicessi se era giusto o no, in ogni caso ti allego il codice per una richiesta di una parola e una frase, anche se non so come distribuire i caratteri in un array.
    int m=-1,n=-1;
    	char frase[500],parola[30]; //Massima lunghezza della frase: 500 caratteri; massima lunghezza della parola: 30 caratteri
    	char tasto1='s',tasto2='s';
    	cout << "Scrivi una frase.\n";
    	do {
    		cout << "Digita una lettera.\n";
    		cin >> frase[n];
    		cout << "Vuoi continuare?\n";
    		cin >> tasto1;
    		n++;
    		if (n>499){
    		cout << "Errore";
    		return 0;
    		}
    	} while (tasto1!='n');
    	cout << "Scrivi una parola.\n";
    	do {
    		cout << "Digita una lettera.\n";
    		cin >> parola[m]; //Verrà inserito un carattere alla volta nell'array parola
    		cout << "Vuoi continuare?\n";
    		cin >> tasto2;
    		m++;
    		if (m>29){
    		cout << "Errore";
    		return 0;
    		}
    	}while (tasto2!='n');
    Non sapendo come distribuirlo io riproporrei questo, che, anche se poco pratico perché mette un carattere alla volta, userei.
  • Re: Esercizio Array - soluzione errata - C++

    Non sapendo come distribuirlo io riproporrei questo, che, anche se poco pratico perché mette un carattere alla volta, userei.
    Se non hai fatto le stringhe resta un buon modo per acquisire un array di char.
    Ti mostro come modificherei il codice relativamente all'inserimento della parola:
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        const unsigned int M = 30;
        char frase[M];
        unsigned int m = 0;
        bool continua = true;
        while(continua && m < M)
        {
            cout << M - m << " SPAZI ANCORA DISPONIBILI. INSERISCI CARATTERE: ";
            cin >> frase[m++];
            cout << "INSERIRE 1 PER CONTINUARE L'INSERIMENTO, 0 PER TERMINARLO: ";
            cin >> continua;
        }
        cout << "PAROLA INSERITA: ";
        for(unsigned int i = 0; i < m; ++i)
        {
            cout << frase[i];
        }
    }
    Se qualcosa non ti è chiaro chiedi pure.

    Provvedi anche all'inserimento della frase e inizia a ragionare sulla ricerca della parola nella frase.
  • Re: Esercizio Array - soluzione errata - C++

    Ho aggiunto la richiesta della frase al tuo codice, semplificandolo togliendo le cose che non conoscevo, dato che nel caso in cui poi mi chiedessero di spiegare farei scena muta, ti allego il codice modificato.
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int M = 30, m = 0, N = 500, n = 0;
        char parola[M],frase[N];
        bool continua = true;
        cout << "Inserire una parola.\n";
        while(continua && m < M)
        {
            cout << M - m << " SPAZI ANCORA DISPONIBILI. INSERISCI CARATTERE: ";
            cin >> parola[m++];
            cout << "INSERIRE 1 PER CONTINUARE L'INSERIMENTO, 0 PER TERMINARLO: ";
            cin >> continua;
        }
        cout << "PAROLA INSERITA: ";
        for(int i = 0; i < m; i++)
        {
            cout << parola[i];
        }
        continua=true;
        cout << ".\nInserire una frase.\n";
        while(continua && n < N)
        {
            cout << N - n << " SPAZI ANCORA DISPONIBILI. INSERISCI CARATTERE: ";
            cin >> frase[n++];
            cout << "INSERIRE 1 PER CONTINUARE L'INSERIMENTO, 0 PER TERMINARLO: ";
            cin >> continua;
        }
        cout << "FRASE INSERITA: ";
        for(int i = 0; i < n; i++)
        {
            cout << frase[i];
        }
    }
    
    Per quanto riguarda l'inserimento della frase non avrei alcuna idea al di fuori della mia di cercare ad intervalli di 1 carattere la parola nella frase.
  • Re: Esercizio Array - soluzione errata - C++

    ...togliendo le cose che non conoscevo...
    Per la cronaca:
    - un unsigned int è un int che non può assumere valori negativi. Visto che la dimensione di un array non può essere negativa allora ho scelto per M e m il tipo unsigned int;
    - la parola chiave const introduce una costante, che a differenza delle variabili deve essere obbligatoriamente inizializzata e non può essere successivamente modificata. Secondo lo standard del C++ la dimensione di un array statico deve essere una costante, è per questo che ho utilizzato const. Nel tuo codice invece stai utilizzando come dimensione degli array delle variabili... il tuo compilatore accetta la cosa, ma non è detto che lo facciano tutti i compilatori.
    Per quanto riguarda l'inserimento della frase non avrei alcuna idea al di fuori della mia di cercare ad intervalli di 1 carattere la parola nella frase.
    In un precedente post ti ho scritto:

    Per quanto riguarda la ricerca della parola nella frase, il tuo non mi sembra l'approccio migliore. Quello che farei è scorrere la frase dall'inizio finché c'è la possibilità effettiva di trovare la parola... mi spiego meglio, consideriamo
    PAROLA: panettone
    FRASE: buon natale
    nello scorrere la FRASE possiamo tranquillamente fermarci alla lettera "o", in quanto andando oltre non c'è lo spazio materiale per contenere la PAROLA "panettone".
    Scorrendo la FRASE quindi cerchiamo una lettera uguale alla lettera iniziale della PAROLA, se la troviamo possiamo quindi continuare con le successive.


    cosa non ti è chiaro?
  • Re: Esercizio Array - soluzione errata - C++

    Dopo un pò di ragionamento ho capito l'errore che stavo facendo, ti allego il codice corretto e funzionante, grazie mille per l'aiuto
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int LunghezzaMaxParola = 30, m = 0, N = 500, n = 0, S = 0, nparole = 0, cont = 0, ciclo=0;
        bool continua = true;
        char parola[LunghezzaMaxParola],frase[N];
        cout << "Inserire una parola.\n";
        while(continua && m < LunghezzaMaxParola)
        {
            cout << LunghezzaMaxParola - m << " SPAZI ANCORA DISPONIBILI. INSERISCI CARATTERE: ";
            cin >> parola[m++];
            cout << "INSERIRE 1 PER CONTINUARE L'INSERIMENTO, 0 PER TERMINARLO: ";
            cin >> continua;
        }
        cout << "PAROLA INSERITA: ";
        for(int i = 0; i < m; i++)
        {
            cout << parola[i];
        }
        continua=true; //prima di questo assegnamento cintinua era falsa, quindi non verrebbe mai attivato il ciclo while della frase.
        cout << ".\nInserire una frase.\n";
        while(continua && n < N) //se continua è vera e se n è minore di N allora il ciclo si ripeterà, dato che, superati i 30 caratteri, l'array non potrà più salvare nulla al suo interno
        {
            cout << N - n << " SPAZI ANCORA DISPONIBILI. INSERISCI CARATTERE: ";
            cin >> frase[n++];
            cout << "INSERIRE 1 PER CONTINUARE L'INSERIMENTO, 0 PER TERMINARLO: ";
            cin >> continua;
        }
        cout << "FRASE INSERITA: ";
        for(int i = 0; i < n; i++)
        {
            cout << frase[i];
    }
    	for (int i=0;i<n;i++){ //qua inizia la parte di conteggio
        	cont=i;
        	int j=0;
        	while(parola[j]==frase[i] && j<m){
        		S++;
        		i++;
        		j++;
    		}
    		if (S==m){
    			nparole++;
    		}
    		S=0;
    		i=cont;
    	}
    	cout << "\nLa parola e' presente nella frase " << nparole << " volte.";
    	return 0;
    }
Devi accedere o registrarti per scrivere nel forum
16 risposte