Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77

    [C++] Ricerca sequenza in un'array

    Buonasera,ho un problema con questo programma: ho un'array costituito da interi che devo leggere da file e devo ricercare in essa una sequenza inserita da tastiera a mio piacimento,il programma mi deve restituire quante volte � presente la sequenza.
    Esempio: array = 1 2 3 4 5 6 1 2 3 4 la sequenza da ricercare � 1 2
    come output mi deve restituire 2.
    Ora il punto � che non so come affrontare il problema,non so se gestire il tutto con gli array e tenermi i numeri come tali oppure passare tutto a caratteri e quindi stringhe utilizzando cos� magari anche le funzioni della libreria string. Cosa risulta essere pi� agevole?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    A parte il fatto che un numero intero potrebbe essere molto grande rispetto al codice di un carattere, non ti serve fare trasformazioni. Opera direttamente con i valori numerici.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77
    Okkey il programma funziona però vorrei comunque uno sguardo di qualcuno più esperto riguardo la correttezza dell'algoritmo,ho tentavo vari scenari per vedere se era tutto giusto ma ho paura che sia solo una coincidenza che mi da le risposte giuste.

    codice:
    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    
    
    using namespace std;
    
    
    
    
    void leggi (char *nome,int *vet,int dim);
    void stampa(int *vet,int n);
    int ricerca_sequenza (int *vet,int *ricerca,int dim,int n);
    
    
    int main ()
    {
    
    
    	char nome[30];
    	cout<<"Inserisci nome file: ";
    	cin>>nome;
    
    
    
    
    	fstream file;
    	int numeri;
    	file.open(nome,ios::in);
    	if(!file)
    	{
    		cout<<"File non trovato"<<endl;
    	}
    
    
        int dim=0;
        while (file>>numeri)
    	dim++;
    
    
        cout << "La dimensione del vettore e': " << dim <<endl;
    	int *vet;
    	vet = new int[dim];
    
    
    	leggi(nome,vet,dim);
    
    
    	int n;
    	cout << "Inserisci la dimensione della sequenza da cercare: ";
    	cin >> n;
    
    
    	int *ricerca;
    	ricerca = new int[n];
    
    
    	int cont = 0;
    	for (int i=0;i<n;i++)
    	{
    	 cout << "Inserisci l'elemento " << cont+1 << ": ";
    	 cin >> ricerca[i];
    	 cont = cont +1;
    	}
    
    
    
    
    
    
    	cout << "Nel vettore la sequenza cercata si ripete " << ricerca_sequenza (vet,ricerca,dim,n) << " volte";
    
    
    	file.close();
    	cout << "\n\n";
        system("pause");
    }
    
    
    void leggi (char*nome,int *vet,int dim)
    {
    	fstream file;
    	file.open(nome,ios::in);
    	if(!file)
    	{
    		cout<<"File non trovato"<<endl;
    	}
    
    
    
    
    	 for(int i=0;i<dim;i++)
    	{
    	 	file>>vet[i];
    	}
    		file.close();
    
    
    
    
        cout << "Il vettore stampato e': ";
        stampa(vet,dim);
    }
    
    
    void stampa(int *vet,int dim)
    {
        for(int i=0;i<dim;i++)
    	 {
    	 	cout<< " | " << vet[i]<< " | ";
    	 }
    
    
        cout << "\n\n";
    }
    
    
    int ricerca_sequenza (int *vet,int *ricerca,int dim,int n)
    {
        int trovato = 0;
    	for (int i=0;i<dim;i++)
        {
            int j = 0;
            while (j<n && vet[i]==ricerca[j])
            {
                j++;
                i++;
                if (j==n)
                trovato++;
            }
    
    
    
    
        }
    
    
        return trovato;
    }

  4. #4
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Secondo me, non funziona se ci sono sequenze parzialmente (all'inizio) uguali, esempio:

    codice:
    int main()
    {
      int vet[10]{1,1,2,3,4,5,1,3,3,9};
      int src[3]{1,2,3};
      std::cout << ricerca_sequenza(vet,src,10,3);
    }
    Dovresti ottenere 1, invece il tuo algoritmo da 0. Questo perchè mandi avanti i anche nel while

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77
    strano la mia sequenza è 1 2 3 4 5 6 7 5 2 10 3 1 2 4 5 e se cerca 1 2 4 mi da come risposta 1 ed è corretto. Però hai ragione con il tuo vettore se ricerco 1 2 3 mi da come risposta zero ma non capisco perchè? eppure ho provato un casino di scenari e mi da sempre risposte corrette

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2015
    Messaggi
    77
    okkey ho capito il problema,giustamente mandando avanti pure la i,nella sequenza che cercavi tu boots trovava 1 poi ne trovata un altro quindi usciva dal while e ricominciava il ciclo da 2 questa volta e quindi non la trovava mai la sequenza allora ho risolto così e ora mi da la risposta giusta. Ho aggiunto solo all'uscita dal while un risettaggio di i al suo valore prima di entrare nel while e incrementare in questa maniere non salta posizioni

    codice:
    int ricerca_sequenza (int *vet,int *ricerca,int dim,int n){
        int trovato = 0;
    	for (int i=0;i<dim;i++)
        {
            int j = 0;
            while (j<n && vet[i]==ricerca[j])
            {
                j++;
                i++;
                if (j==n)
                trovato++;
            }
            i = i-j;
    
    
    
    
        }
    
    
        return trovato;
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.