PROGRAMMA C : ricerca sequenziale
salve a tutti, ho ancora bisogno di voi.
Devo scrivere un programma C che effettui una ricerca di un elemento in un array e ne restituisca tutte le posizioni in cui compare!
Ovviamente nn mi funziona
potreste darmi una mano?
mica devo fare un altro ciclo for per j?
spero possiate aiutarmi
ila
Devo scrivere un programma C che effettui una ricerca di un elemento in un array e ne restituisca tutte le posizioni in cui compare!
Ovviamente nn mi funziona
potreste darmi una mano?
#include <stdio.h> #include <conio.h> #define MAX 50 typedef int vettore[MAX]; . . . . . . void cerca(const vettore v, const float elem,vettore posizione, bool &trovato){ printf("\nInserisci l'elemento da ricercare all'interno del vettore : "); scanf("%d", &elem); trovato=false; int j=0; posizione[j]=0; for(register int i=1;i<=v[0];i++){ if(elem==v[i]){ trovato=true; j++; posizione[j] = i; printf("\n l'ememento e' presente e si trova nelle posizioni [%d] ",posizione[j]); } } }
mica devo fare un altro ciclo for per j?
spero possiate aiutarmi
ila
Risposte
sicuramente servirà un solo ciclo; partiamo dalla scanf, hai dichiarato elem come float, ma poi usi %d; ragiona sulla condizione del ciclo for. Per ora comincia a lavorare su questo
La scanf è buggata per natura. Inserici while( getchar() != '\n' ); dopo ogni scanf per pulire il buffer, altrimenti
ti saltano degli input. In ogni caso al posto del scanf dovresti usare una delle get* (tranne la gets()) e poi convertire
con atoi() et family.
ti saltano degli input. In ogni caso al posto del scanf dovresti usare una delle get* (tranne la gets()) e poi convertire
con atoi() et family.
Grazie ad entrambi,
@luca
non mi ero proprio accorta di aver dichiarato elem come float, che scema!!
per quanto riguarda la condizione del for , precedentemente avevo posto v[0] uguale ad n(dimensione del vettore), dunque la variabile contatore va da 1 a n.
domanda stupida:
come faccio a far comparire "l'elemento e' presente e si trova nelle posizioni....." una sola volta?
ovviamente se lo scrivo fuori dal for non ha senso...
@emitrax grazie per il consiglio
@luca
non mi ero proprio accorta di aver dichiarato elem come float, che scema!!
per quanto riguarda la condizione del for , precedentemente avevo posto v[0] uguale ad n(dimensione del vettore), dunque la variabile contatore va da 1 a n.
domanda stupida:
come faccio a far comparire "l'elemento e' presente e si trova nelle posizioni....." una sola volta?
ovviamente se lo scrivo fuori dal for non ha senso...
@emitrax grazie per il consiglio

Sposti il printf prima del ciclo, non capisco perche' dici che non ha senso. E' molto piu' efficiente.

prima del for fai una printf("l'elemento è presente nelle posizioni");
e poi nel for stampi ad una ad una le posizioni
e poi nel for stampi ad una ad una le posizioni
si , ma se dico chel'elemento è presente all'interno del vettore prima di cercarlo, quando inserirò un elemento che non è presente verrà comunque stampato a video che quest'ultimo è presente.
va bene, allora memorizza le posizioni dentro un array e poi dopo il for le visualizzi una ad una

come hai fatto te ad esempio va bene, togli il printf, però ti devi ricordare di incrementare anche posizione[0]; dopo farai un altro ciclo for per visualizzare gli elementi di posizione
](/datas/uploads/forum/emoji/eusa_wall.gif)
niente

"ilyily87":
domanda stupida:
come faccio a far comparire "l'elemento e' presente e si trova nelle posizioni....." una sola volta?
ovviamente se lo scrivo fuori dal for non ha senso...
puoi usare una variabile booleana che tiene traccia del fatto che sia stato trovato il numero (almeno 1 volta)

potreste dirmi se è corretto fare in questo modo?
void cerca(const vettore v, int elem,vettore posizione, bool &trovato){ printf("\nInserisci l'elemento da ricercare all'interno del vettore : "); scanf("%d", &elem); trovato=false; int j=0; posizione[j]=0; for(register int i=1;i<=v[0];i++){ if(elem==v[i]) trovato=true; } if (trovato==true){ printf("Elemento %d presente nel vettore nelle posizioni ( ", elem); for(register int i=1;i<=v[0];i++){ j++; posizione[j] = i; printf(" %d, ",posizione[j]); } printf(")"); } else printf("Elemento non presente nel vettore\n"); }
Io farei un for per trovare tutte le posizioni, incluso trovato == (elem==v), poi un altro che va da 0 a j (l'indice dell'ultima posizione trovata) per elencarli, nel caso ci siano.

Crook potresti scrivermi il codice per piacere?


ciao...quanto sto per scrivere riguarda il linguaggio c++ ma il ragionamento che sta dietro è lo stesso...quindi è solo per farti capire come funziona la ricerca lineare (o sequenziale)....
Sicuramente non è il più efficiente ma sicuramente è funzionante..ciao ciao
#include <iostream> using namespace std; int const nmax=100; bool ricerca(int v[],int x,int dim_a){ int i; bool trovato=false; for(i=0;i<dim_a;i++){ if(x==v[i]) trovato=true; } return trovato; } int main(){ int a,i,dim; int v[nmax]; cout<<"Inserisci la grandezza dell'array: "<<endl; cin>>dim; for(i=0;i<dim;i++){ cout<<"Inserisci l'elemento di posizione " << i+1<<endl; cin>>v[i]; } cout<<endl; cout<<"Inserisci l'elemento da ricercare"<<endl; cin>>a; bool ris=ricerca(v,a,dim); cout<<endl; cout<< ris <<endl; cin>>ws; }
Sicuramente non è il più efficiente ma sicuramente è funzionante..ciao ciao
Splair, a me non funziona!
restituisce sempre e solo il valore 1, forse perchè corrisponde a true!
a me interessava sapere in quale posizione si trova l'elemento e magari specificare quante volte si presenta all'interno dell'array...
restituisce sempre e solo il valore 1, forse perchè corrisponde a true!
a me interessava sapere in quale posizione si trova l'elemento e magari specificare quante volte si presenta all'interno dell'array...
"ilyily87":
\:D/ OK! credo di esserci riuscita.... o almeno il programma funziona...
potreste dirmi se è corretto fare in questo modo?
void cerca(const vettore v, int elem,vettore posizione, bool &trovato){ printf("\nInserisci l'elemento da ricercare all'interno del vettore : "); scanf("%d", &elem); trovato=false; int j=0; posizione[j]=0; for(register int i=1;i<=v[0];i++){ if(elem==v[i]) trovato=true; } if (trovato==true){ printf("Elemento %d presente nel vettore nelle posizioni ( ", elem); for(register int i=1;i<=v[0];i++){ j++; posizione[j] = i; printf(" %d, ",posizione[j]); } printf(")"); } else printf("Elemento non presente nel vettore\n"); }
non capisco il ciclo for con quale valore dell'indice termina.
inoltre
la butto li' senza pretese.....
cito dal tuo codice:
posizione[j] = i;
printf(" %d, ",posizione[j]);
forse ti sei dimenticata un 'if' ????????????
ciao
alex
questa volta penso proprio di esserci riuscita
vi prego, ditemi che non ho sbagliato
void cerca(const vettore v, int &elem,vettore posizione, bool &trovato){ printf("\nInserisci l'elemento da ricercare all'interno del vettore : "); scanf("%d", &elem); trovato=false; int j=0; posizione[j]=0; for(register int i=1;i<=v[0];i++){ if(elem==v[i]) trovato=true; } if (trovato==true) printf("\n L'ememento e' presente e si trova nelle posizioni ("); else printf("\nl'elemento non e' presente all'interno del vettore"); for(register int i=1;i<=v[0];i++){ if(elem==v[i]){ trovato=true; j++; posizione[j] = i; printf(" %d, ",posizione[j]); } } }
vi prego, ditemi che non ho sbagliato
la struttura sembra corretta ma alcune istruzioni sono in piu'.
non capisco perche' il ciclo for termina in v[0] ????????????????????????!!!!!!!!!!!!!cosa c'e' memorizzato in v[0]?!?!?!?
non capisco perche' il ciclo for termina in v[0] ????????????????????????!!!!!!!!!!!!!cosa c'e' memorizzato in v[0]?!?!?!?