[C++] Lettura sequenza da file e numero di occorrenze

di il
2 risposte

[C++] Lettura sequenza da file e numero di occorrenze

Ciao ragazzi, ho fatto questo programmino in C++ (una vecchia traccia d'esame del mio prof di fondamenti di informatica) che prevede la lettura di una sequenza di numeri da file di testo e di confrontarla con un'altra sequenza presa da tastiera. Lo scopo è verificare se la seconda sequenza (quella inserita da tastiera) è presente all'interno di quella del file e quante volte questa sequenza è presenta (numero di occorrenze della seconda nella prima). Il mio programma gira e fa quello che la traccia chiede, volevo solo avere un'eventuale correzione perchè il codice che ho scritto mi sembra un po' "maccheronico" non so xD
#include <iostream>
#include <fstream>
#define MAX 50
using namespace std;

void controllo_file(fstream& file, char nome[MAX]);
int lettura(fstream& file, int sequenza[], int& dim);
void occorrenze(fstream& file, int sequenza[],  int& dim, int& cont);

int main(int argc, char** argv) {
	int sequenza[MAX], dim=0, cont=0;
	char nome[MAX];
	fstream file;
	cout<<"***Programma realizzato da Andrea Barra Matricola N46002375***\n\n";
	controllo_file(file, nome);
	dim=lettura(file, sequenza, dim);
	cout<<"\nParole Lette:\n";
	for (int i=0; i<dim; i++){
		cout<<sequenza[i]<<" ";
	}
	occorrenze(file, sequenza, dim, cont);
	cout<<"\n\nLa sequenza inserita è presente "<<cont<<" volte nel file!";
	return 0;
}

void controllo_file(fstream& file, char nome [MAX])
{
	cout<<"Inserire nome del file: ";
	cin>>nome;
	file.open("sequenza.txt", ios::in);
	if (!file){
		cout<<"Impossibile aprire il file specificato!";
		exit (1);
	}
}

int lettura(fstream& file, int sequenza[], int& dim)
{
	int i=0;
	while(!file.eof()){
		file>>sequenza[i];
		i++;
	}
	
	return i;
}

void occorrenze(fstream& file, int sequenza[],  int& dim, int& cont)
{
	int vet[MAX];
	cout<<"\n\nInserire la sequenza da controllare:";
	for (int i=0; i<4; i++){
		cout<<"Inserire l'elemento "<<i+1<<":";
		cin>>vet[i];
	}
	
	for (int i=0; i<dim; i++){
		for (int j=0; j<4; j++){
			if (sequenza[i]==vet[j])
			cont++;
		}
	}
	cont=cont/4;
}
Grazie in anticipo!

EDIT: Mentre continuavo a testare il programma, mi sono accorto che se inserisco nel vettore vet lo stesso numero ma che è presente anche nella prima sequenza, il programma mi dice che il numero è presente due volte, quindi presumo che il mio ciclo di controllo sia errato. Come potrei risolvere?

2 Risposte

  • Re: [C++] Lettura sequenza da file e numero di occorrenze

    Salve, Slash c:
    La funzione che conta le occorrenze era impostata in modo errato.

    Supponiamo che nel file stiamo cercando 1 2 3 4:
    
    void occorrenze(fstream& file, int sequenza[],  int& dim, int& cont)
    {
       int vet[MAX];
       cout<<"\n\nInserire la sequenza da controllare:";
       for (int i=0; i<4; i++){
          cout<<"Inserire l'elemento "<<i+1<<":";
          cin>>vet[i];
       }
       
       for (int i=0; i<dim; i++){
       //quando sequenza[i] = 1:
          for (int j=0; j<4; j++){
             if (sequenza[i]==vet[j])
             cont++;
             //seq[i] == vet[0]: vero (1 e 1) -> cont++
             //seq[i] == vet[1]: falso (1 e 2)
             //seq[i] == vet[2]: falso (1 e 3)
             //seq[i] == vet[3]: falso (1 e 4)
             //Conforti ogni elemento di vet con un singolo valore per volta!
          }
       }
       cont=cont/4;
    }
    
    Ho provato a correggere il codice:
    
    void occorrenze(fstream& file, int sequenza[],  int& dim, int& cont)
    {
       int vet[MAX];
       cout<<"\n\nInserire la sequenza da controllare:";
       for (int i=0; i<4; i++){
          cout<<"Inserire l'elemento "<<i+1<<":";
          cin>>vet[i];
       }
       
       int temp = 0;
       for (int i=0; i<dim; i++)
       {
          for (int j=0, k = i; j<4; j++)
          {
             //Confronto ogni elemento di sequenza[] da sequenza[i] (j = 0) a sequenza [i+3] (j = 3) con il corrispondente valore di vec[].
             //Se corrispondono, aumento cont
             if (sequenza[i+j]==vet[j]) cont++;
             //Altrimenti elimino i cont che ho erroneamente aggiunto e interrompo il "for" più interno.
             else
             {
             	cont -= j;
             	break;
             }
          }
       }
       cont=(cont)/4;
    }
    
    Con questa semplice modifica, dovrebbe funzionare tutto correttamente c:
  • Re: [C++] Lettura sequenza da file e numero di occorrenze

    Ti ringrazio per la risposta! Mi sono accorto poi che avevo impostato male quella funzione, solo che non sapevo come fare per confrontare un gruppo di elementi della prima sequenza con quella ottenuta da tastiera. Grazie mille
Devi accedere o registrarti per scrivere nel forum
2 risposte