PDA

View Full Version : PICCOLO ALGORITMO RICERCA IN UN ARRAY


xber-gigi
15-02-2004, 15:46
LINGUAGGIO C

Salve ragazzi mi aiutate ???
Devo fare un piccolo algoritmo che attraverso la funzione strcmp mi faccia una ricerca all'interno di un array di tipo array[5][30].
Deve essere un array di struct i cui campi siano puntatori a char.

L'array deve contenere una lista di 30
nome cognome via cittā tel

per favoreeee!!!

Help!!!

Fenomeno85
15-02-2004, 18:32
scusa ma perchč dai una matrice se vuoi un array???

comunque basta che fai un array di struct

tipo:

const n = 30;

struct persona
{
char nome [20];
char cognome [20];
char via[20];
char citta [20];
char telefono [12];
};

persona arr[n];

č questo quello che vuoi??

int k =1;

char ric[20];
fflush (stdin);
gets (ric);

for (int i=0; i<n && k;i++)
{
if ((strcmp (arr[i].cognome, rice)==0)
{
k = 0;
}
}

printf "Numero cella %d", i);

~§~ Sempre E Solo Lei~§~

xber-gigi
15-02-2004, 19:08
Nel programma devo usare array di struct, i cui campi siano puntatori a char.
Devo poi inserire 10 sequenze di dati NOME COGNOME ECC...
e poi fare una ricerca in tutti i campi.

Fenomeno85
15-02-2004, 19:22
non capisco cosa significa puntatori a char :boh: ma quello che ti ho fatto non va bene??

~§~ Sempre E Solo Lei~§~

xber-gigi
15-02-2004, 19:24
no :(
cmq grazie lo stesso ;)

goldorak
15-02-2004, 19:55
Basta cambiare la definizione della struct in questo modo


struct persona {
char * nome;
char * cognome;
char * via;
char * citta;
char * telefono ;
};


Ed ogni volta che inserisci un dato nei campi nome,cognome,via,citta,telefono devi usare un funzione di allocazione tipo la malloc.

Es:

nome = (char *)malloc(20*sizeof(char)) per allocare 20 bytes per la stringa; poi da input fare gets(nome). Idem per gli altri campi. Sta a te scegliere la dimensione massima della stringa (nel mio esempio e' 20 ma e' un valore arbitrario)

Fenomeno85
15-02-2004, 21:44
scusa ma malloc si usa ancora???

~§~ Sempre E Solo Lei ~§~

goldorak
15-02-2004, 21:54
Originariamente inviato da Fenomeno85
scusa ma malloc si usa ancora???

~§~ Sempre E Solo Lei ~§~


In Ansi C sicuramente.
Poi xber-gigi ha chiesto come risolvere il problema con char *, quindi l'uso di malloc e' necessaria.

xber-gigi
16-02-2004, 13:25
Originariamente inviato da goldorak
Basta cambiare la definizione della struct in questo modo


struct persona {
char * nome;
char * cognome;
char * via;
char * citta;
char * telefono ;
};


Ed ogni volta che inserisci un dato nei campi nome,cognome,via,citta,telefono devi usare un funzione di allocazione tipo la malloc.

Es:

nome = (char *)malloc(20*sizeof(char)) per allocare 20 bytes per la stringa; poi da input fare gets(nome). Idem per gli altri campi. Sta a te scegliere la dimensione massima della stringa (nel mio esempio e' 20 ma e' un valore arbitrario)

Grazie Goldrak credo che ci abbia azzeccato!
Potresti farmi per favore un esempio pių chiaro???
Bhe dico proprio pratico? Comč la scringa quindi per ricevere l'imput???
Mi potresti far vedere in pratica??? Grazie mille!

fpucci
16-02-2004, 13:38
Originariamente inviato da xber-gigi
Grazie Goldrak credo che ci abbia azzeccato!
Potresti farmi per favore un esempio pių chiaro???
Bhe dico proprio pratico? Comč la scringa quindi per ricevere l'imput da scanf ora?

Invece delle scanf() e di malloc() potresti usare delle gets() e delle strdup():
In tal modo avresti la sequenza:

gets(nome); struttura.nome = strdup (nome);
gets(cognome); struttura.cognome = strdup (cognome);
gets(indirizzo); struttura.indirizzo = strdup (indirizzo);
etc.. etc...

Ovviamente usare sempre la free() per deallocare i puntatori quando non servono pių.

xber-gigi
16-02-2004, 13:52
per favore potreste farmi esempi pratici pių chiari???

la struttura č questa:

struct tipo {char *nome; char *cognome; char *indirizzo; char *citta;};
struct tipo *dati[5][30];

devo fare un ciclo for per inserire 10 input.

ma come lo prendo l'input?!?!?!?!
per favore!!! aiuto!!! fatemi vedere praticamente!!! sto uscendo pazzo!

fpucci
16-02-2004, 14:02
Originariamente inviato da xber-gigi
per favore potreste farmi esempi pratici pių chiari???

la struttura č questa:

struct tipo {char *nome; char *cognome; char *indirizzo; char *citta;};
struct tipo *dati[5][30];

devo fare un ciclo for per inserire 10 input.

ma come lo prendo l'input?!?!?!?!
per favore!!! aiuto!!! fatemi vedere praticamente!!! sto uscendo pazzo!

Credevo di essere stato chiaro:
1) l'input lo prendi con la gets() [vedi mio post precedente]
2) quello che hai ottenuto con la gets() lo passi alla variabile all'interno della struttura tramite la strdup() la quale alloca il puntatore e vi copia il valore. [vedi esempio nel mio post precedente]

Il tutto allinterno di un ciclo da ripetersi per N volte (N=10)

Inoltre
struct tipo *dati[5][30];
č errata. Io farei:
struct tipo dati[10];
char VarInput [256];

e farei (in un loop)
printf ("Inserisci nome: "); gets (VarInput);
dati [i].nome = strdup (VarInput);
printf ("Inserisci cognome: "); gets (VarInput);
dati [i].cognome = strdup (VarInput);
printf ("Inserisci indirizzo: "); gets (VarInput);
dati [i].indirizzo = strdup (VarInput);
........
........

Spero di esser stato chiaro stavolta

goldorak
16-02-2004, 14:09
Ti butto giu' il programma a grandi linee a meno di qualche errore di sintassi :




# define maxline 30 ;

struct persona
{
char * nome;
char * cognome;
char * via;
char * citta;
char * telefono;
};

struct persona elenco[10];

for (int i=0; i< 10 ;i++) {
elenco[i].nome =(char*) malloc(maxline*sizeof(char));
puts("Inserire il nome \n");
gets(elenco[i].nome);

elenco[i].cognome=(char*)malloc(maxline*sizeof(char));
puts("Inserire il cognome\n");
gets(elenco[i].cognome);

elenco[i].via=(char *)malloc(maxline*sizeof(char));
puts("Inserire la via\n");
gets(elenco[i].via);

elenco[i].citta=(char*)malloc(maxline*sizeof(char));
puts("Inserire la citta\n");
gets(elenco[i].citta);

elenco[i].telefono=(char *)malloc(maxline*sizeof(char));
puts("Inserire il numero di telefono\n");
gets(elenco[i].telefono);
}

//qua va messa la funzione di ricerca

xber-gigi
16-02-2004, 14:12
e farei (in un loop)
printf ("Inserisci nome: "); gets (VarInput);
dati [i].nome = strdup (VarInput);
printf ("Inserisci cognome: "); gets (VarInput);
dati [i].cognome = strdup (VarInput);
printf ("Inserisci indirizzo: "); gets (VarInput);
dati [i].indirizzo = strdup (VarInput);
........
........

Spero di esser stato chiaro stavolta

mi da errore del tipo

error C2224: left of '.nome' must have struct/union type
error C2224: left of '.cognome' must have struct/union type

fpucci
16-02-2004, 14:19
Originariamente inviato da xber-gigi
mi da errore del tipo

error C2224: left of '.nome' must have struct/union type
error C2224: left of '.cognome' must have struct/union type

pardon

Nella fretta avevo dimenticato di sostituire il "." con "->"
ossia:

printf ("Inserisci nome: "); gets (VarInput);
dati [i]->nome = strdup (VarInput);
printf ("Inserisci cognome: "); gets (VarInput);
dati [i]->cognome = strdup (VarInput);
printf ("Inserisci indirizzo: "); gets (VarInput);
dati [i]->indirizzo = strdup (VarInput);

etc

xber-gigi
16-02-2004, 14:19
non va!!! :cry: :cry: :cry:

goldorak
16-02-2004, 14:23
Originariamente inviato da xber-gigi
non va!!! :cry: :cry: :cry:


Hai provato la soluzione che ti ho postato tramite l'uso delle puts e gets ?

fpucci
16-02-2004, 14:25
Come hai definito la struttura?

Immagino cosė:

struct persona
{
char * nome;
char * cognome;
char * via;
char * citta;
char * telefono;
};

struct persona dati [10];

xber-gigi
16-02-2004, 14:26
Originariamente inviato da goldorak
Hai provato la soluzione che ti ho postato tramite l'uso delle puts e gets ?
si!!!
mi da errore di malloc!!!
per favore aiutatemi!!! devo finirlo prima possibile!

xber-gigi
16-02-2004, 14:27
Originariamente inviato da fpucci
Come hai definito la struttura?

Immagino cosė:

struct persona
{
char * nome;
char * cognome;
char * via;
char * citta;
char * telefono;
};

struct persona dati [10];


sisi esatto cosė!

fpucci
16-02-2004, 14:28
ti sto per mandare il codice appena lo provo

goldorak
16-02-2004, 14:33
Originariamente inviato da xber-gigi
si!!!
mi da errore di malloc!!!
per favore aiutatemi!!! devo finirlo prima possibile!


Mi puoi dire che errore ti da sulla malloc ?
Inoltre hai pensato ad aggiungere gli header file necessari
<stdlib.h> e <stdio.h> ?
Magari togli dal listato che ho postato la (char *) che compare prima di ogni malloc.

xber-gigi
16-02-2004, 14:39
Originariamente inviato da goldorak
Mi puoi dire che errore ti da sulla malloc ?
Inoltre hai pensato ad aggiungere gli header file necessari
<stdlib.h> e <stdio.h> ?
Magari togli dal listato che ho postato la (char *) che compare prima di ogni malloc.

sisi era un problema di maxline

fpucci
16-02-2004, 14:40
Eccolo, a me funzia.


#include <stdio.h>
#include <string.h>

struct persona {
char * nome;
char * cognome;
char * via;
char * citta;
char * telefono;
};

main ()
{
struct persona dati[10];
char Input [256];
int i;

for (i=0; i< 10; i++) {
printf ("Nome: "); gets (Input);
dati [i].nome = strdup (Input);
printf ("Cognome: "); gets (Input);
dati [i].cognome = strdup (Input);
printf ("Via: "); gets (Input);
dati [i].via = strdup (Input);
printf ("Citta': "); gets (Input);
dati [i].citta = strdup (Input);
printf ("Telefono': "); gets (Input);
}

for (i=0; i< 10; i++) {
printf ("Nome: %s\n", dati [i].nome);
printf ("Cognome: %s\n", dati [i].cognome);
printf ("Via: %s\n", dati [i].via);
printf ("Citta': %s\n", dati [i].citta);
printf ("Telefono: %s\n", dati [i].telefono);
}

return (0);

}

xber-gigi
16-02-2004, 15:02
PERFETTO FPUCCI!!! TI RIGRAZIO TANTISSIMO FUNZIONA PERFETTAMENTE!!! :ave: :ave: :ave:

Mi spiegheresti il perchč di alcune cosette???

char Input [256]; ????

printf ("Nome: "); gets (Input); ???
dati [i].nome = strdup (Input); ???

perchč usi gets(input) ???
cosč la funzione strdup???

fpucci
16-02-2004, 15:22
Originariamente inviato da xber-gigi
PERFETTO FPUCCI!!! TI RIGRAZIO TANTISSIMO FUNZIONA PERFETTAMENTE!!! :ave: :ave: :ave:

Mi spiegheresti il perchč di alcune cosette???

char Input [256]; ????

'Inpiut' č una variabile che uso per l'input da tastiera. Le ho assegnato al massimo 256 byete, uno spazio pių che sufficiente per cntenere il pių grande dei tuoi input.
Se il pių grande dei tuoi input (ad esemio 'indirizzo' fosse di 50 caratteri, allora puoi fare:
char Input [51];
(ricordati sempre di lasciare un carattere in pių per il terminatore di stringa)


printf ("Nome: "); gets (Input); ???
dati [i].nome = strdup (Input); ???
perchč usi gets(input) ???
cosč la funzione strdup???
[/QUOTE]
gets() č una funzione che ti permette di acqusire un testo da tastiera fino a che non premi il tasto "ENTER". Pių correttamente, la funzione accetta l'imput da tastiera fino a chge non rileva il carattere CR (Carriage Return) = codice 10 della tabella ASCII.

la strdup() č equivalente a usare la malloc()+strcpy() (o la memcpy()) con sensibile risparmio di codice. L'unica limitazione č che ōla puoi usare solo su stringhe. Infatti la strdup() alloca X byte (tramite malloc()) in base alla lunghezza della stringa che le viene passata (X=strlen(stringa_passata)).
[QUOTE]

Spero di essere stato chiaro, altrimenti chiedimi pure altreinfo.
Bye

xber-gigi
16-02-2004, 16:05
ORA DEVO OCCUPARMI DELLA RICERCA ALL'INTERNO DELLA MATRICE

printf ("Inserire i dati da cercare all'interno del programma\n");
gets (Input);

for (i=0;i<n;i++)
{
if (strcmp (dati [i].nome && dati [i].cognome && dati [i].indirizzo && dati [i].citta , Input) > 0)
{
printf ("Nome: %s\n", dati [i].nome);
printf ("Cognome: %s\n", dati [i].cognome);
printf ("Indirizzo: %s\n", dati [i].indirizzo);
printf ("Citta: %s\n", dati [i].citta);
}
else
{
printf ("Nessun dato trovato\n");
}
}

Ovviamente non mi funziona !!! :(

:D

fpucci
16-02-2004, 16:18
Originariamente inviato da xber-gigi
ORA DEVO OCCUPARMI DELLA RICERCA ALL'INTERNO DELLA MATRICE

[...]
{
if (strcmp (dati [i].nome && dati [i].cognome && dati [i].indirizzo && dati [i].citta , Input) > 0)
{
[...]

:D

Non puoi usare quel confronto.
L'ordinamento su quale chiave lo devi fare?

Se la chiave č il campo 'nome', questo non puō essere un valore
nullo e quindi farai:

if ( dati [i].nome [0] == 0) {
printf ("Valore errato\n")
...
}


mentre per fare i confronti tra stringhe devi fare:

for (i=0; i<10; i++) {
if (strcmp (dati [i].nome, ValoreDiConfronto) <= 0) {
/* l'elemento dati [i].nome č minore o uguale */
[...]
} else {
/* l'elemento dati [i].nome č maggiore */
[...]
}
}



Eppoi devi scegiere quale algoritmo di sorting vuoi utilizzare, ed implementare quello.

xber-gigi
16-02-2004, 16:23
la ricerca deve essere fatta su tutti i campi
nome cognome indirizzo citta
mi conviene usare uno switch?!?!?

fpucci
16-02-2004, 16:33
Originariamente inviato da xber-gigi
la ricerca deve essere fatta su tutti i campi
nome cognome indirizzo citta
mi conviene usare uno switch?!?!?

Lo switch() non lo puoi usare sulle stringhe.
Devi usare un mega-if:

if (strcmp (dati [i].nome, NomeDiConfronto) == 0 &&
strcmp (dati [i].conome, CogomeDiConfronto) == 0 &&
strcmp (dati [i].via, ViaDiConfronto) == 0 &&
strcmp (dati [i].citta, CittaiConfronto) == 0 &&
strcmp (dati [i].telefono, TelefonoDiConfronto) == 0) {
/* Ok, lo hai trovato */
} else {
/* Ok, NON lo hai trovato */

}