Individuare sequenza di numeri in un file.txt

di Anonimizzato18903 il
2 risposte
Salve a tutti.
Tra poche settimane ho l'esame di fondamenti di informatica e mi esercitavo sulla seguente traccia:

"Sia assegnato un file di testo contenente una sequenza di numeri interi molto lunga.
Scrivere un programma che, richiesto il nome del file da tastiera e l’immissione di una sequenza di numeri di cui è preventivamente fornita la lunghezza (maggiore di 1), verifichi quante volte la sequenza si presenti all’interno del file."

Ho scritto il seguente codice:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

#define MAX 20
#define dim 50

void apri_file (int riemp, int sequenza[])
{
    fstream numeri;
    char nome_file[MAX];
    cout <<"Inserisci nome file: ";
    cin.getline (nome_file, MAX-1, '\n');
    numeri.open (nome_file, ios::in);
    if (!numeri)
    {
        cout <<"\nFile " <<nome_file <<" non trovato";
    };
    while (!numeri.eof())
    {
        numeri >> sequenza[riemp++];
    };
    riemp--;
    numeri.close();
}

void inserisci_stringa (int lunghezza, int riemp, int sequenza[], int stringa[])
{
    do
    {
        cout <<"Inserisci lunghezza sequenza (maggiore di 1): ";
        cin >>lunghezza;
        if (lunghezza <= 1)
        {
            cout <<"Inserimento non valido\n";
        };
    }
    while (lunghezza <= 1);
    cout <<"Inserisci sequenza da controllare:\n";
    for (int i = 0; i < lunghezza; i++)
    {
        cin >>stringa [i];
    };
}

int calcolo (int stringa[], int sequenza[], int lunghezza, int riemp, int &contatore)
{
    int i,j;
    for (i = 0; i <= riemp - lunghezza; i++)
    {
        if (sequenza[i] == stringa[0])
        {
            bool seqok = true;
            for (j = 1; j < lunghezza; j++)
            {
                if (sequenza[i+j] != stringa[j])
                {
                    seqok = false;
                };
            };
            if (seqok == true)
            {
                contatore++;
            };
        };
    };
    return contatore;
}

int main ()
{
    int contatore = 0;
    int riemp = 0;
    int sequenza[dim];
    int stringa [dim];
    int lunghezza;
    apri_file (riemp, sequenza);
    inserisci_stringa (lunghezza, riemp, sequenza, stringa);
    cout <<"Sequenza incontrata " <<calcolo (stringa, sequenza, lunghezza, riemp, contatore) <<" volte";
}
Il problema è che la funzione "calcolo" sembra non funzionare: qualunque sequenza inserisca, "contatore" resta zero.
Che cosa sbaglio?
Vi prego di aiutarmi, sono disperato

2 Risposte

  • Ti consiglio caldamente di inserire delle "stampe" di debug su cout, ad esempio stampare il contenuto di 'sequenza' dopo aver richiamato la funzione apri_file(), il contenuto di 'stringa' dopo aver richiamato inserisci_stringa() così ti accerti che l'input sia corretto.
  • Penso di aver capito qual è il problema: ho usato la sostituzione per riferimento con riemp, sequenza e contatore e adesso funziona!
    Grazie mille per l'aiuto, candaluar!
Devi accedere o registrarti per scrivere nel forum
2 risposte