PROGRAMMA C : ricerca sequenziale

ilyily87
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?





#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
_luca.barletta
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

emitrax
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.

ilyily87
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 :wink:

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

ilyily87
:smt017 perchè altrimenti l'elemento risulterebbe presente a priori...il ciclo for è per ricercarlo!

_luca.barletta
prima del for fai una printf("l'elemento è presente nelle posizioni");
e poi nel for stampi ad una ad una le posizioni

ilyily87
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.

_luca.barletta
va bene, allora memorizza le posizioni dentro un array e poi dopo il for le visualizzi una ad una

ilyily87
:oops: potresti farmi veedere come si fa?

_luca.barletta
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

ilyily87
](*,)
niente :smt022

codino75
"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)

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");

}

TomSawyer1
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.

ilyily87
:smt009 no, era un abbaglio, non funziona.
Crook potresti scrivermi il codice per piacere? :oops: [-o<

Splair
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)....

#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

ilyily87
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...

codino75
"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

ilyily87
questa volta penso proprio di esserci riuscita


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

codino75
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]?!?!?!?

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.