[C++, contare quante volte un array in un altro array]

Messaggioda Sponny » 24/09/2014, 00:30

Ciao a tutti , non riesco a scrivere tale algoritmo , Immagino che qualche anima pia possa risolvere il mio problema.

la traccia dell esercizio è
Testo nascosto, fai click qui per vederlo
Sia assegnato da file contenente una sequenza di numeri interi molto lunga.
Scrivere un programma che rischiesto il nome del file da tastiera e l'immissione di una sequenza di numeri di cui viene preventivamente fornita la lunghezza(maggiore di 1), verifichi non solo la presenza della sequenza all'interno del file ma anche quante volte essa ricorre nel caso fosse presente.

Ad esempio con il file miofile.txt contenente:
23 45 21 33 12 33 22 44 66 45 21 33 12 11 876 11 45 21 33 12 13

E la sequenza di 4 numeri
45 21 33 12

Il programma deve fornire in uscita un messaggio del tipo:
La sequenza è presente 3 volte.

Il programma deve essere scritto in C, modulare e documentato.



mi sono bloccato qui. Qualcuno gentilmente saprebbe aiutarmi? :smt023
#include<iostream>
#include<cstdlib>
#include<fstream>

using namespace std;

#define MAX 50

fstream file;
char nome[MAX];


void apri_file (int &m , int vet[MAX]);
void sequenza(int vet1[MAX]);

int main (){

int m,n;
int vet[MAX];
int vet1[MAX];

apri_file (m , vet);
sequenza(vet1);

return 0;

}

void apri_file (int &m , int vet[MAX])
{
cout<<"Inserire il nome del file: ";
cin.getline(nome, MAX, '\n');
file.open(nome,ios::in);
if(!file){
cout<<"\nIl file non esiste.";
exit(1);
}
file>>m;
for (int i=0; i<m; i++)
{
file>>vet[i];
}
file.close();
}

void sequenza(int vet1[MAX]) {
int n;
cout<<"Quanti elementi vuoi inserire: ";
cin>>n;
for (int i=0;i<n;i++){
cout<<"inserisci l'elemento di posizione "<<i<<" nel vettore: ";
cin>>vet1[i];
}
}


Sponny
Starting Member
Starting Member
 
Messaggio: 1 di 6
Iscritto il: 23/09/2014, 15:34

Re: [C++, contare quante volte un array in un altro array]

Messaggioda vict85 » 24/09/2014, 01:56

Riguardo al testo ho un dubbio: due ripetizioni possono intersecarsi? Per capirci, supponi ti venga dato 1 2 1 come sequenza e tu abbia
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1,
che risultato devo mettere? Se non si devono intersecare ne ho:
4 : 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
oppure
4 : 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
Ma se consideri in modo generico allora ne ho 8...

Insomma probabilmente il professore si è soffermato un po' troppo sulle caratteristiche che voleva avesse il codice e un po' troppo poco sul problema in sé.

Mi metto a cercare errori nel tuo codice comunque. Che errori/problemi ha? Insomma per sapere che devo cercare.

P.S.: Io sinceramente avrei messo il testo dell'esercizio con
Codice:
[quote][/quote]
e il codice con
Codice:
[code][/code]
. Per il futuro ti suggerisco di farlo :wink: in particolare per il codice.
vict85
Moderatore
Moderatore
 
Messaggio: 6827 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C++, contare quante volte un array in un altro array]

Messaggioda Sponny » 24/09/2014, 11:32

io fino ad ora ho fatto un void che apre il file e memorizza l'array, e un altro void che memorizza un array da tastiera di lunghezza n definita dall'utente.
ora non riesco ad andare avanti : dovrei fare un void che con un contatore vede le ripetizioni , ma non ne sono capace.
Sponny
Starting Member
Starting Member
 
Messaggio: 2 di 6
Iscritto il: 23/09/2014, 15:34

Re: [C++, contare quante volte un array in un altro array]

Messaggioda vict85 » 24/09/2014, 20:59

Io penso che tu debba usare della memoria dinamica oppure i vector.
vict85
Moderatore
Moderatore
 
Messaggio: 6833 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C++, contare quante volte un array in un altro array]

Messaggioda Sponny » 26/09/2014, 02:23

nessuno mi riesce a dire come risolvere , sono quasi disperato.
Sponny
Starting Member
Starting Member
 
Messaggio: 3 di 6
Iscritto il: 23/09/2014, 15:34

Re: [C++, contare quante volte un array in un altro array]

Messaggioda vict85 » 26/09/2014, 16:13

Stai pensando troppo alla forma. Ti mostro un esempio di come dovresti, a mio avviso procedere.

vettore
1 2 3 6 1 1 2 3 5 2 1 1 1 1 6
con la sequenza 1 2 3
vettore utile w = |?|?|?|
variabile cont = 0
PASSO 1 w = |1|?|?|, cont = 0; controllo 1 = 1 allora proseguo con una lettura
PASSO 2 w = |1|2|?|, cont = 0; controllo 2 = 2 allora proseguo con una lettura
PASSO 3 w = |1|2|3|, cont = 0; controllo 3 = 3, w è pieno allora aggiungo una ripetizione, cancello primo elemento
PASSO 4 w = |2|3|?|, cont = 1; controllo 2 != 1, allora cancello primo elemento
PASSO 5 w = |3|?|?|, cont = 1; controllo 3 != 1, allora cancello primo elemento
PASSO 6 w = |?|?|?|, cont = 1; w è vuoto, devo leggere un elemento
PASSO 7 w = |6|?|?|, cont = 1; controllo 6 != 1, allora cancello primo elemento
PASSO 8 w = |?|?|?|, cont = 1; w è vuoto, devo leggere un elemento
PASSO 9 w = |1|?|?|, cont = 1; controllo 1 = 1, allora proseguo con una lettura
PASSO 10 w = |1|1|?|, cont = 1; controllo 1 != 2, allora cancello primo elemento
PASSO 11 w = |1|?|?|, cont = 1; controllo 1 = 1, allora proseguo con una lettura
PASSO 12 w = |1|2|?|, cont = 1; controllo 2 = 2 allora proseguo con una lettura
PASSO 13 w = |1|2|3|, cont = 1; controllo 3 = 3, w è pieno allora aggiungo una ripetizione, cancello primo elemento
PASSO 14 w = |2|3|?|, cont = 2; controllo 2 != 1, allora cancello primo elemento
PASSO 15 w = |3|?|?|, cont = 2; controllo 3 != 1, allora cancello primo elemento
PASSO 16 w = |?|?|?|, cont = 2; w è vuoto, devo leggere un elemento
e così via finché la lettura restituisce un elemento.

w lo implementerei come un array ma senza spostare gli elementi ma lavorando come se fosse un anello. Insomma dovresti memorizzare il punto di inizio, e gli elementi occupati, tenendo conto che gli elementi occupati hanno un massimo. Inoltre dovresti leggere i dati usando il resto.
vict85
Moderatore
Moderatore
 
Messaggio: 6840 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite