PDA

View Full Version : iecchime qua!!: serch(char *p[], char *name)


MetalMassacre
29-11-2002, 16:44
ohh quà! sto giro forse è piu facile che mai ma....anch'io ho i miei limiti....

:D


Sto giro mi vien data una funzione serch(char *p[], char *name)..in base alla quale devo determinare se un nome compare tra quelli elencati....in caso il nome ci sia deve restituire l'indice dell'array nel quale ha trovato il nome altrimenti -1


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



int search(char *p[], char *name)
{



}

char*names[]={
"Alberto",
"Luigi",
"Daniele",
"Giovanni",
NULL}; /* la costante puntatore NULL conclude l'elenco */

int main(void) {
if (search(names, "Daniele") != -1) /* names[2] */
printf("Daniele e' contenuto nell'elenco.\n");
if (search(names, "Dario") == -1)
printf("Dario e' assente dall'elenco");
return 0;
}


system("PAUSE");
return 0;
}



Idee di tutti i tipi venghino a me....e a tutti coloro che ci capiscono qualcosa :D

bsummer
29-11-2002, 16:56
Utilizzare strcmp della libreria string.h?

Bye

MetalMassacre
29-11-2002, 17:09
puff... pant...arf arf.....ci sto provando....ho partorito sta schifezza... non credo sia per niente giusta...ma come ragionamento potrebbe andare?!?




...
for (ind=&p[0]; ind<=&p[DIM-1]; ind ++)
for (i=j=0; i<DIM-1;i++)
int strcmp ((*p[0])[i], (*name)[j]);





e se sono uguali fino alla fine ritorno l'indice

scusate ma sono un po intrippato....
le parentesi sullo strcmp sono cannate quasi sicuramente...
aiuuuuto:eek:

bsummer
29-11-2002, 17:21
La strcmp e' una funzione che restituisce un intero uguale, maggiore o minore di zero.

Il caso che interessa a te e' quando questo valore di ritorno e' zero in quanto significa che le stringhe che hai passato come parametro sono uguali.

Quindi dentro il for devi mettere una cosa del tipo

if (strcmp(s1,s2)==0) ...bla bla bla

s1 e s2 sono stringhe e non caratteri come mi sembra tu abbia erroneamente interpretato.

Ci sono anche soluzioni piu' eleganti, ma preferisco dirti questa che e' la piu' semplice.

Prova a pensarci un po' su, e se non risolvi ti scrivero' una possibile soluzione.

Bye

MetalMassacre
29-11-2002, 17:35
Originariamente inviato da bsummer
[B]La strcmp e' una funzione che restituisce un intero uguale, maggiore o minore di zero.

Il caso che interessa a te e' quando questo valore di ritorno e' zero in quanto significa che le stringhe che hai passato come parametro sono uguali.

Quindi dentro il for devi mettere una cosa del tipo

if (strcmp(s1,s2)==0) ...bla bla bla

s1 e s2 sono stringhe e non caratteri come mi sembra tu abbia erroneamente interpretato.

Ci sono anche soluzioni piu' eleganti, ma preferisco dirti questa che e' la piu' semplice.

Prova a pensarci un po' su, e se non risolvi ti scrivero' una possibile soluzione.

Bye


Ho trovato un asoluzione un po piu fissa della cazzatissima che ho postato prima .....



char str1 [10];
for (i=0; i<=DIM; i++) /*voglio scorrere tutti i nomi dell'array p[]*/
{strcpy (str1, *p[i])
strcpy (str2, *name)
if strcmp (str1, str2)==0
return i
else return -1}




mah mi sembra un po piu leggibile....ah entro mezzanotte devo farlo altrimenti mi trasformo in zucca....piu di quello che mi ritrovo!!! :D

bah non è malvagio ora?!? almeno si capisce cosa vorrei fare!?!

MetalMassacre
29-11-2002, 18:16
aggiornamento:




#include <stdlib.h>
#include<stdio.h>
#include<string.h>
#define DIM 4


int search(char *p[], char *name)
{
int i;
char str1 [10]; /*numero massimo di caratteri in str1*/
char str2 [10]; /*numero massimo di caratteri in str2*/
for (i=0; i<=DIM; i++) /*scorro tutti i 4 nomi di *p[]*/
{
strcpy (str1, *p[i]);
strcpy (str2, *name);
if (strcmp (str1, str2)==0)
return i;
else return -1;
}
}

char*names[]={
"Alberto",
"Luigi",
"Daniele",
"Giovanni",
NULL}; /* la costante puntatore NULL conclude l'elenco */

int main(void)
{
if (search(names, "Daniele") != -1) /* names[2] */
printf("Daniele e' contenuto nell'elenco.\n");
if (search(names, "Dario") == -1)
printf("Dario e' assente dall'elenco");
system("PAUSE");
return 0;
}



mi da problemi a livello delle 2 strcpy....perche non posso fare così?

cionci
29-11-2002, 19:27
Prova così :

#include <stdlib.h>
#include<stdio.h>
#include<string.h>
//#define DIM 4


int search(char *p[], char *name)
{
int i = 0;
while(p[i] != NULL) /*scorro tutti i nomi di fino al NULL*/
{
if (strcmp (p[i++], name)==0)
return i;
/*else return -1; questo non ci vuole...altrimenti fa un solo controllo */
}
return -1;
}

char*names[]={
"Alberto",
"Luigi",
"Daniele",
"Giovanni",
NULL}; /* la costante puntatore NULL conclude l'elenco */

int main(void)
{
if (search(names, "Daniele") != -1) /* names[2] */
printf("Daniele e' contenuto nell'elenco.\n");
if (search(names, "Dario") == -1)
printf("Dario e' assente dall'elenco\n");
system("PAUSE");
return 0;
}

Se metti il NULL in fondo allora sfruttalo per terminare il ciclo di confronto ;)
Le due stringhe temporanee non servivano a niente...
C'era un * in più davanti p[i]...
Nota il post incremento nella strcmp... E' quello che fa avanzare i...
La sai la differenza fra preincremento e postincremento ?

int a = 0, b;

b = a++; /*b va a zero perchè l'incremento avviene solo
dopo la fine della riga*/
b = ++a; /*a ora è 1 e la preincremento e b vale 2*/

b = ++a; equivale a b = (a = a + 1);
b = a++; equivale a b = a; ++a;

MetalMassacre
30-11-2002, 00:03
Originariamente inviato da cionci
[B]Prova così :

#include <stdlib.h>
#include<stdio.h>
#include<string.h>
//#define DIM 4


int search(char *p[], char *name)
{
int i = 0;
while(p[i] != NULL) /*scorro tutti i nomi di fino al NULL*/
{
if (strcmp (p[i++], name)==0)
return i;
/*else return -1; questo non ci vuole...altrimenti fa un solo controllo */
}
return -1;
}

char*names[]={
"Alberto",
"Luigi",
"Daniele",
"Giovanni",
NULL}; /* la costante puntatore NULL conclude l'elenco */

int main(void)
{
if (search(names, "Daniele") != -1) /* names[2] */
printf("Daniele e' contenuto nell'elenco.\n");
if (search(names, "Dario") == -1)
printf("Dario e' assente dall'elenco\n");
system("PAUSE");
return 0;
}

Se metti il NULL in fondo allora sfruttalo per terminare il ciclo di confronto ;)
Le due stringhe temporanee non servivano a niente...
C'era un * in più davanti p[i]...
Nota il post incremento nella strcmp... E' quello che fa avanzare i...
La sai la differenza fra preincremento e postincremento ?

int a = 0, b;

b = a++; /*b va a zero perchè l'incremento avviene solo
dopo la fine della riga*/
b = ++a; /*a ora è 1 e la preincremento e b vale 2*/

b = ++a; equivale a b = (a = a + 1);
b = a++; equivale a b = a; ++a;


aspetta...c'e qualcosa che non mi torna....

1° se inizializzo i=0
e poi confronto p[i++] con name vuol dire che confronto p[0] con name e poi incremento i che diventa 1....ma così allora ritorno 1 non 0....

2° perche confronto con name? cosa sta ad indicare name? ...è un puntatore a carattere che deve ricevere come valore un indirizzo di memoria....ma...ma...non mi capisco più....e poi il parametro attuale nel mai gli passa "Daniele" perchè? "Daniele" è una stringa non un indirizzo di memoria....


azzz....sto facendo casino!! sbrogliami sto dubbio!!:confused:

MetalMassacre
30-11-2002, 00:07
Hai altre idee? modi diversi di vedere sto ambaradan? faceva proprio schifo il mio aggiornamento..?:)

cionci
30-11-2002, 00:29
Originariamente inviato da MetalMassacre
[B]aspetta...c'e qualcosa che non mi torna....

1° se inizializzo i=0
e poi confronto p[i++] con name vuol dire che confronto p[0] con name e poi incremento i che diventa 1....ma così allora ritorno 1 non 0....
Hai ragione... A questo punto o torni i-1 o fai l'incremento dopo...
Originariamente inviato da MetalMassacre
[B]2° perche confronto con name? cosa sta ad indicare name? ...è un puntatore a carattere che deve ricevere come valore un indirizzo di memoria....ma...ma...non mi capisco più....e poi il parametro attuale nel mai gli passa "Daniele" perchè? "Daniele" è una stringa non un indirizzo di memoria....
Una stringa è un indirizzo di memoria...

Per la precisione le stringhe specificate tra apici sono di tipo char []...

Allora perchè strcpy(str, "ciao"); funziona secondo te ?
Proprio perchè "ciao" è un char []...

Senza contare l'allocazione di una stringa...

char str[] = "ciao";

Secondo te perchè funziona una cosa del genere ? Proprio perchè "ciao" è di tipo char []...

Assegni ad un puntatore di tipo char [] un altro char []...

name punta ad una stringa e p[i] punta ad una stringa perchè non dovrei confrontarli ? ;)

cionci
30-11-2002, 00:43
Qualche ulteriore miglioramento può essere fatto nella search...
Ma è solo una questione di stile :

int search(char *p[], char *name)
{
int i = 0;
while(p[i]) /*scorro tutti i nomi di fino al NULL*/
{
if(!strcmp(p[i], name))
return i;
++i;
}
return -1;
}

if(!a) equivale a if(a == 0)
if(a) equivale a if(a != 0)
NULL in quasi tutti i linguaggi equivale a 0...

Ti voglio porre un quesito...
Come fai a far ritornare più di un valore ad una funzione ?

Ad esempio...devi cercare le prime 3 occorrenze di una lettera all'interno di una stringa... Fammi la funzione che svolge fa cosa...

MetalMassacre
30-11-2002, 10:17
Originariamente inviato da cionci
[B]Qualche ulteriore miglioramento può essere fatto nella search...
Ma è solo una questione di stile :

int search(char *p[], char *name)
{
int i = 0;
while(p[i]) /*scorro tutti i nomi di fino al NULL*/
{
if(!strcmp(p[i], name))
return i;
++i;
}
return -1;
}

if(!a) equivale a if(a == 0)
if(a) equivale a if(a != 0)
NULL in quasi tutti i linguaggi equivale a 0...

Ti voglio porre un quesito...
Come fai a far ritornare più di un valore ad una funzione ?

Ad esempio...devi cercare le prime 3 occorrenze di una lettera all'interno di una stringa... Fammi la funzione che svolge fa cosa...


bhe...una funzione restituisce un unico valore, ma tramite i puntatori posso farne ritornare una buona caterba...:D
è questo che mi domandavi?
....non ho capito il tuo quesito...ho una stringa e devo fare una funzione per...?....data una stringa vedere quali caratteri si ripetono per 3 volte all'interno della stessa?

cionci
30-11-2002, 10:19
Vabbè...allora se sapevi che si poteva fare con i puntatori non c'è gusto ;)

MetalMassacre
30-11-2002, 11:28
Aspetta dammi un aggiornamento...

dire name è come dire name[0]....non &name[0]
&name[0] restituisce l'indirizzo di memoria di name[0] (e perciò di tutto l'array)


se voglio assegnare una serie di valori ad un array devo farlo con un ciclo for ad esempio...non c'e modo di passare l'inidirzzo della prima cella dell'array e lassegnamento avviene consecutivamente per tutti i valori ?!?

non ricordo che cosa indicava
su un vecchio esercizio ....scanf ("%[^\n]", riga) ?!?
dato char riga[80]

cionci
30-11-2002, 11:35
name è come dire &name[0]...

Perchè name è già il puntatore al primo elemento del vettore...

scanf ("%[^\n]", riga) significa che leggi tutti i caratteri fino a quando non incontri uno \n...

MetalMassacre
30-11-2002, 12:46
Originariamente inviato da cionci
[B]name è come dire &name[0]...

Perchè name è già il puntatore al primo elemento del vettore...

scanf ("%[^\n]", riga) significa che leggi tutti i caratteri fino a quando non incontri uno \n...


int search(char *p[], char *name)
{......
.......
if(!strcmp(p[i], name))

spetta che adesso sono veramente in aceto...

char*p[] indica un array di nomi (che sono array di caratteri,ma qusto a me importa relativamente)

char *name essendo un puntatore ad una stringa (es "davide")...punta al primo elemento della stringa cioè a'd'




nel momento in cui confronto p[i] con name, sto confrontando la stringa contenuta in p[i] (es "alberto") con name che è l'indirizzo di memoria del primo elemento dell'array di caratteri a cui punta(cioè &name[0]come mi hai fatto notare) (cioè 'd' di "davide")....

ma a ragion di logica farei un confronto tra una stringa ed un carattere...mmm


a meno che name (e/o name[0]) puntando a "davide" non restituisca per intero il "davide" (come credo)...ma non dovrebbe essere allora *name?cioè il contenuto di cio a cui punta name...

MetalMassacre
30-11-2002, 12:54
[i]

scanf ("%[^\n]", riga) significa che leggi tutti i caratteri fino a quando non incontri uno \n

[/i]


quindi posso mettere altri caratteri di tabulazione al posto di \n....anche \0?

MetalMassacre
30-11-2002, 14:14
Provo a spiegarmi meglio....



main()
{...
search(names,"daniele");
...}


int search (char *p[], char *name)
{...
strcmp (p[i], name);
...}



Allora, io ero abituato a vedere al posto di search(names,"daniele"); una cosa del tipo search(names, str); dove char str={"daniele")

di conseguenza capivo meglio che str passava a name l'indirizzo str (e/o &str[0])...

ma anche se fosse così mi sorge un dubbio...quando faccio il confronto....lo faccio tra la stringa in p[i] e name che è str(e/o &str[0]) ma quest'ultimo str (e/o &str[0]) è un indirizzo non il contenuto dell'array...


spero di aver spiegato meglio qual'e il mio dubbio...

e poi passando come parametro attuale "daniele" che indirizzo viene passato a name?!?(credo &...[0]l'indirizzo in cui vi è 'd') cioe viene creato da se stesso l'array che contiene i caratteri 'd' 'a' 'n' 'i' 'e' 'l' 'e'? e che nome ha? dato che ho messo...


devo seguire anche un corso di italiano all'unive...
e si che alle superiori ero na macchina nei temi...:(

cionci
30-11-2002, 18:43
Cerco di farti capire meglio...

...anche p[i] è un char *...e punta la primo elemento dell'i-esimo nome...

Nota che la dichiarazione di strcmp è questa :

int strcmp(char *, char *);

Un vettore è sempre identificato dal suo puntatore... Altrimenti come potresti identificarlo ?

Se io dichiaro:

int v[10];

In ciò che si chiama v non sono contenuti tutti gli elementi del vettore, ma v è il puntatore al primo elemento del vettore...
Prova ad accedere ad *v e vedrai che è il primo elemento del vettore...