Problema conta occorrenze in una sequenza

di il
23 risposte

Problema conta occorrenze in una sequenza

Buonasera a tutti, sto sbattendo la testa sul C++ e avrei bisogno di una mano con questo esercio:
"Scrivere un programma C++ che, letta da input una sequenza X di 0 e 1 terminata dal carattere * e una
sequenza Y di 0 e 1 di 3 caratteri, stampi il numero di volte in cui Y occorre in X.
Si può supporre che sia X che Y siano ben formate, ovvero X contenga solo 0,1,* ed Y solo 0,1.

Esempi:
Se la sequenza X fosse 0 1 0 1 1 0 1 0 0 1 0 * e la sequenza Y fosse 1 0 1 il programma stamperebbe 2
perché la sequenza Y è presente 2 volte in X: 0 1 0 1 1 0 1 0 0 1 0 *.
Se la sequenza X fosse 0 1 0 1 1 0 1 0 1 0 1 * e la sequenza Y fosse 1 0 1 il programma stamperebbe 3
perché la sequenza Y è presente 3 volte in X: 0 1 0 1 1 0 1 0 1 0 1 *.
Se la sequenza X fosse 0 1 0 1 1 0 * e la sequenza Y fosse 1 1 1 il programma stamperebbe 0 perché la
sequenza Y non è presente in X."

Questo è il mio codice, so certamente che l'errore è nell'ultimo blocco for con conseguente if, sapreste darmi una mano e spiegare dove sbaglio?
La mia idea è quella di scandire tutto l'array contenente la prima sequenza e confrontarlo con quello della seconda sequenza confrontando i numeri uno per volta, ma probabilmente ciò che ho scritto non corrisponde con ciò che vorrei scriver
Grazie in anticipo a chiunque mi aiuterà

#include <iostream>
using namespace std;

int main()
{
	char seq1[100];
	char seq2[3];
	char car;
	int cont=0;
	int occ=0;
	

	
	while (car != '*')
	{
		cin>>car;
		seq1[cont]=car;
		cont++;
	}
	
	for (int i=0; i<3;i++)
	{
		cin>>seq2[i];
	}
	
	for (int i=0; i<cont; i++)
	{
		if ((seq1[cont]==seq2[i]) && (seq1[cont+1]==seq2[i+1]) && (seq1[cont+2]==seq2[i+2]))
		{
			occ++;
		}
	}
	
	cout<<occ;
	
	return 0;
}

23 Risposte

  • Re: Problema conta occorrenze in una sequenza

    
    char seq1[100];
    char seq2[100];
    int i = 0;
    int occ = 0;
    	
    cin >> seq1;
    cin >> seq2;
    	
    while (seq1[i] != '*'){
    	if(seq1[i] == seq2[0] && seq1[i+1] == seq2[1] && seq1[i+2] == seq2[2])
    		   occ++;
    	i++;
    }
    
  • Re: Problema conta occorrenze in una sequenza

    Weierstrass ha scritto:


    
    char seq1[100];
    char seq2[100];
    int i = 0;
    int occ = 0;
    	
    cin >> seq1;
    cin >> seq2;
    	
    while (seq1[i] != '*'){
    	if(seq1[i] == seq2[0] && seq1[i+1] == seq2[1] && seq1[i+2] == seq2[2])
    		   occ++;
    	i++;
    }
    
    Ciao, ti ringrazio per la tua risposta, ma il tuo programma non funziona correttamente
  • Re: Problema conta occorrenze in una sequenza

    Ho aggiornato il codice ed ora funziona meglio, c'è solo un problema. Io vorrei che le occorrenze venissero controllate 3 per volta, quindi nel caso di 0 1 0 1 1 0 1 0 1 0 1 le occorrenze dovrebbero essere solo 3 cioè "0 1 0 1 1 0 1 0 1 0 1 invece mi viene contata anche una sequenza in più, cioè quella posta tra l'ultimo elemento della seconda sequenza ed il primo della terza. Come posso risolvere questo problema?
    char seq1[100];
    	char seq2[3];
    	char car;
    	int cont=0;
    	int occ=0;
    	
    
    	
    	while (car != '*')
    	{
    		cin>>car;
    		seq1[cont]=car;
    		cont++;
    	}
    	
    	for (int j=0; j<3;j++)
    	{
    		cin>>seq2[j];
    	}
    	
    	for (int i=0; i<cont; i++)
    		for (int j=0; j<3; j++)
    		{
    			if (seq1[i]==seq2[j] && seq1[i+1]==seq2[j+1] && seq1[i+2]==seq2[j+2] )
    			{
    				occ++;
    			}
    		}
    	
    	cout<<occ;
    	return 0;
    
    }
  • Re: Problema conta occorrenze in una sequenza

    Relativamente all'ultimo codice che hai postato:
    - quanto vale car la prima volta che entri nel while?
    - relativamente al suddetto while, cosa succede se immetti più di 100 caratteri diversi da *?
    - consideriamo la sequenza 0101010*. Avremo che cont=8, ma l'ultima occorrenza possibile è quella che inizia dal carattere evidenziato in rosso. Andare oltre non genera errori nel caso specifico, ma risulta cmq inutile. La condizione del for potrebbe quindi essere modificata in
    i < cont - 3
    In ogni caso, volendo restare sul generico, io farei qualcosa del genere:
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        string x = "110101000101011010100101011010101";
        string y = "01011";
        int n = 0;
        int j;
        for(int i = 0; i <= int(x.size() - y.size()); ++i)
        {
            for(j = 0; j < y.size() && y[j] == x[j + i]; ++j);
            n += j / y.size();
        }
        cout << n;
    }
    ... Io vorrei che le occorrenze venissero controllate 3 per volta, quindi nel caso di 0 1 0 1 1 0 1 0 1 0 1 le occorrenze dovrebbero essere solo 3 cioè ...
    In realtà avrebbe più senso dire che quella sequenza presenta 4 occorrenze... in ogni caso per fare quello che dici ti basta incrementare i di 2 quando trovi un'occorrenza.
  • Re: Problema conta occorrenze in una sequenza

    Nippolo ha scritto:


    Relativamente all'ultimo codice che hai postato:
    - quanto vale car la prima volta che entri nel while?
    - relativamente al suddetto while, cosa succede se immetti più di 100 caratteri diversi da *?
    - consideriamo la sequenza 0101010*. Avremo che cont=8, ma l'ultima occorrenza possibile è quella che inizia dal carattere evidenziato in rosso. Andare oltre non genera errori nel caso specifico, ma risulta cmq inutile. La condizione del for potrebbe quindi essere modificata in
    i < cont - 3
    In ogni caso, volendo restare sul generico, io farei qualcosa del genere:
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        string x = "110101000101011010100101011010101";
        string y = "01011";
        int n = 0;
        int j;
        for(int i = 0; i <= int(x.size() - y.size()); ++i)
        {
            for(j = 0; j < y.size() && y[j] == x[j + i]; ++j);
            n += j / y.size();
        }
        cout << n;
    }
    ... Io vorrei che le occorrenze venissero controllate 3 per volta, quindi nel caso di 0 1 0 1 1 0 1 0 1 0 1 le occorrenze dovrebbero essere solo 3 cioè ...
    In realtà avrebbe più senso dire che quella sequenza presenta 4 occorrenze... in ogni caso per fare quello che dici ti basta incrementare i di 2 quando trovi un'occorrenza.
    Ciao, ti ringrazio per la risposta, soprattutto con l'ultimo aiuto cioè di aumentare i di 2 ogni qual volta trovo un'occorrenza sono riuscito a risolvere correttamente l'esercizio ed il valutatore automatico ha confermato l'esito positivo dell'esercizio.
    Per quanto riguarda le domande car vale 0 prima del while, essendo solo inizializzato.
    Mentre ho preferito mettere la costante (inizializzata fuori dal main) all'interno dell'array invece che il 100, e se si superano quei numeri ritorno 0 al 101.
  • Re: Problema conta occorrenze in una sequenza

    Ciao, ti ringrazio per la risposta, soprattutto con l'ultimo aiuto cioè di aumentare i di 2 ogni qual volta trovo un'occorrenza sono riuscito a risolvere correttamente l'esercizio ed il valutatore automatico ha confermato l'esito positivo dell'esercizio.
    Di niente!
    Per quanto riguarda le domande car vale 0 prima del while, essendo solo inizializzato.
    In realtà non è inizializzato, è proprio questo il problema.
    Mentre ho preferito mettere la costante (inizializzata fuori dal main) all'interno dell'array invece che il 100, e se si superano quei numeri ritorno 0 al 101.
    Credo di non aver capito quello che intendi dire.
  • Re: Problema conta occorrenze in una sequenza

    WinterSoldier ha scritto:


    Weierstrass ha scritto:


    
    char seq1[100];
    char seq2[100];
    int i = 0;
    int occ = 0;
    	
    cin >> seq1;
    cin >> seq2;
    	
    while (seq1[i] != '*'){
    	if(seq1[i] == seq2[0] && seq1[i+1] == seq2[1] && seq1[i+2] == seq2[2])
    		   occ++;
    	i++;
    }
    
    Ciao, ti ringrazio per la tua risposta, ma il tuo programma non funziona correttamente
    Il programma funziona correttamente, te lo riscrivo completo:
    
    #include <iostream>
    using namespace std;
    
    int main()
    {
     char seq1[100];
     char seq2[100];
     int i = 0;
     int occ = 0;
    	
     printf("Inserisci la sequenza terminata da * : ");
     cin >> seq1;
     printf("\nInserisci il pattern da 3 caratteri : ");
     cin >> seq2;
    	
     while (seq1[i] != '*'){
        if(seq1[i] == seq2[0] && seq1[i+1] == seq2[1] && seq1[i+2] == seq2[2])
            occ++;
        i++;
     }
     
     printf("Il numero di occorrenze del pattern nella sequenza e' : ");
     cout << occ;
    	
     return 0;
    }
    
    Quello che e' sbagliato è il tuo test. Tu scrivi
    Se la sequenza X fosse 0 1 0 1 1 0 1 0 1 0 1 * e la sequenza Y fosse 1 0 1 il programma stamperebbe 3
    perché la sequenza Y è presente 3 volte in X: 0 1 0 1 1 0 1 0 1 0 1 *.
    Ma questo non è vero perché nella sequenza 01011010101* il pattern 101 occorre 4 volte, non 3

    01011010101*
    01011010101*
    01011010101*
    01011010101*
  • Re: Problema conta occorrenze in una sequenza

    In realtà non è inizializzato, è proprio questo il problema.
    Sì hai ragione, non è inizializzata però non credo che dia qualche problema il fatto che non lo sia, correggimi se sbaglio.
    Credo di non aver capito quello che intendi dire.
    Mi spiego meglio, ho posto una condizione che se i caratteri inseriti prima del * superassero i 100 faccio un "return 0" che pone fine al programma.
    [/quote]
  • Re: Problema conta occorrenze in una sequenza

    Weierstrass ha scritto:


    WinterSoldier ha scritto:


    Weierstrass ha scritto:


    
    char seq1[100];
    char seq2[100];
    int i = 0;
    int occ = 0;
    	
    cin >> seq1;
    cin >> seq2;
    	
    while (seq1[i] != '*'){
    	if(seq1[i] == seq2[0] && seq1[i+1] == seq2[1] && seq1[i+2] == seq2[2])
    		   occ++;
    	i++;
    }
    
    Ciao, ti ringrazio per la tua risposta, ma il tuo programma non funziona correttamente
    Il programma funziona correttamente, te lo riscrivo completo:
    
    #include <iostream>
    using namespace std;
    
    int main()
    {
     char seq1[100];
     char seq2[100];
     int i = 0;
     int occ = 0;
    	
     printf("Inserisci la sequenza terminata da * : ");
     cin >> seq1;
     printf("\nInserisci il pattern da 3 caratteri : ");
     cin >> seq2;
    	
     while (seq1[i] != '*'){
        if(seq1[i] == seq2[0] && seq1[i+1] == seq2[1] && seq1[i+2] == seq2[2])
            occ++;
        i++;
     }
     
     printf("Il numero di occorrenze del pattern nella sequenza e' : ");
     cout << occ;
    	
     return 0;
    }
    
    Quello che e' sbagliato è il tuo test. Tu scrivi
    Se la sequenza X fosse 0 1 0 1 1 0 1 0 1 0 1 * e la sequenza Y fosse 1 0 1 il programma stamperebbe 3
    perché la sequenza Y è presente 3 volte in X: 0 1 0 1 1 0 1 0 1 0 1 *.
    Ma questo non è vero perché nella sequenza 01011010101* il pattern 101 occorre 4 volte, non 3

    01011010101*
    01011010101*
    01011010101*
    01011010101*
    Ciao, ti ringrazio ed in effetti ora funziona correttamente il tuo programma.
    Per quanto riguarda gli esempi, teoricamente è come dici tu, ma nella traccia la prof chiede proprio che non vengano accettare le occorrenze "concatenate", spero tu capisca ciò che intendo. Semplicemente ogni occorrenza deve iniziare da un carattere che non è stato utilizzato da nessuna occorrenza precedente.
  • Re: Problema conta occorrenze in una sequenza

    WinterSoldier ha scritto:


    Sì hai ragione, non è inizializzata però non credo che dia qualche problema il fatto che non lo sia, correggimi se sbaglio.
    E se sfortunatamente fosse proprio uguale * ?
  • Re: Problema conta occorrenze in una sequenza

    Nippolo ha scritto:


    E se sfortunatamente fosse proprio uguale * ?
    Ho provato e non succede nulla, inserisco * successivamente inserisco gli altri 3 elementi richiesti ed il programma stampa giustamente 0.
  • Re: Problema conta occorrenze in una sequenza

    Una variabile non inizializzata risulta indeterminata, ossia può assumere qualsiasi valore, compreso il valore '*'. E in tale "sfortunata" circostanza il programma non entrerebbe affatto all'interno del while e l'utente non avrebbe modo di inserire seq1.

    A questo punto però una domanda sorge spontanea... perché le variabili cont e occ le inizializzi invece?
  • Re: Problema conta occorrenze in una sequenza

    Nippolo ha scritto:


    Una variabile non inizializzata risulta indeterminata, ossia può assumere qualsiasi valore, compreso il valore '*'. E in tale "sfortunata" circostanza il programma non entrerebbe affatto all'interno del while e l'utente non avrebbe modo di inserire seq1.

    A questo punto però una domanda sorge spontanea... perché le variabili cont e occ le inizializzi invece?
    Diciamo che appunto se inserisco direttamente * è come se la seq1 fosse vuota, quindi per come la vedo io è giusto che non entri mai nel while.
    Invece le variabili cont e occ mi servono rispettivamente per capire la dimensione dell'array di seq1, quindi per vedere poi su quanti elementi devo ciclare, invece l'altra per contare appunto le occorrenze, quindi essendo due "contatori" ho bisogno di inizializzarle.
  • Re: Problema conta occorrenze in una sequenza

    Ci rinuncio!
Devi accedere o registrarti per scrivere nel forum
23 risposte