PDA

Visualizza la versione completa : [C] Confronto tra vettori


playbasfa
24-12-2007, 17:28
Provo a realizzare una funzione, i cui argomenti sono (vet1[] e vet2[]). Tale funzione dovrebbe essere in grado di restituire la prima posizione in cui un elemento di vett2 compare in vett1.
Ho provato a buttare giu' due idee ma incontro diverse difficolt; la mia idea sbagliata :

while (vett1[i]!='\0')

{

for(j=0; vett1[i]!=vett2[j] || vett[j]!='\0')

;

if (vett1[i]==vett2[j])

return i;

else if (vett2[j]=='\0')

i++;

}


Gli errori che mi saltano subito all'occhio sono: ammesso che funzionasse, dal momento che il tutto racchiuso dentro un while, la i di ritorno indicherebbe la posizione del'ultima celle contenente quel determinato carattere e non la prima.
Ho pensato allora di togliere ill while e far dipendere tutto dal for pero' non so come poter rientrare nel for, dal momento che venuto a mancare il while.

So che ci sono parecchi errori, ma vorrei pian piano capirli e risolverli..

MacApp
24-12-2007, 20:54
Come minimo devi fare un doppio ciclo annidato: uno suş primo vettore, l'altro sul secondo.
Se puoi usare la strchr allora puoi evitare il secondo ciclo perche' in realta' glielo fai fare alla strchr.

playbasfa
25-12-2007, 01:46
Originariamente inviato da MacApp
Come minimo devi fare un doppio ciclo annidato: uno suş primo vettore, l'altro sul secondo.
Se puoi usare la strchr allora puoi evitare il secondo ciclo perche' in realta' glielo fai fare alla strchr.
Purtroppo non ho fatto la strchr.
Per il resto potresti farmi vedere un esempio.. o qualcosa che mi dia un idea perch non ho capito bene..
E' da pochissimo che tento di programmare..

Grazie

andbin
25-12-2007, 11:08
Originariamente inviato da playbasfa
Per il resto potresti farmi vedere un esempio.. o qualcosa che mi dia un idea perch non ho capito bene..Innanzitutto alla funzione devono essere anche passate le due lunghezze degli array! (altrimenti come sai dove finisce l'array?) Poi, come gi stato detto, devi fare un doppio ciclo for annidato. Dovrai usare 2 variabili che fanno da indice, una per il ciclo for che scansiona vet1 e l'altra per il ciclo for (innestato) che scansiona vet2.
Si fa tutto in poche righe di codice.

playbasfa
25-12-2007, 12:15
Originariamente inviato da andbin
Innanzitutto alla funzione devono essere anche passate le due lunghezze degli array! (altrimenti come sai dove finisce l'array?) Poi, come gi stato detto, devi fare un doppio ciclo for annidato. Dovrai usare 2 variabili che fanno da indice, una per il ciclo for che scansiona vet1 e l'altra per il ciclo for (innestato) che scansiona vet2.
Si fa tutto in poche righe di codice.
Per le lunghezze non c' problmea.. c'ho gi pensato..
P.s. il tutto non deve essere controllato da un while?

andbin
25-12-2007, 15:36
Originariamente inviato da playbasfa
P.s. il tutto non deve essere controllato da un while? I cicli for sono pi indicati e appropriati quando, come in questo caso, ci sono degli indici.

playbasfa
28-12-2007, 11:02
Ho provato a creare un programma in grado di segnalare, tramite la funzione any, l'indice del vettore in cui si incontra il primo carattere uguale a quello presente nel secondo vettore;
in questo caso i vettori sono principale (quello in cui cercare i caratteri uguali) e cerca (quello contenente i caratteri da cercare)
Il programma non funzione in quanto mi stampa sempre 4199333 sia che io inserisca un carattere contenuto, sia che io inserisca un carattere che non lo sia.



#include <stdio.h>

int getline(char[]);

int any(char[],char[]);



main()

{

char cerca[]="politeama";

char vettore[1000];



while ((getline(vettore))>0){

if(any(vettore,cerca)>-1)

printf ("%d", any);

else if(any(vettore,cerca)==-1)

printf("\nnon c'e'\n");

}



}







int getline (char vetto[]){

int c,i;

for(i=0; (c=getchar())!= EOF && c!= '\n';i++)

vetto[i]=c;

if (c== '\n')

vetto[i++]=c;

vetto[i]='\0';

return i;

}











int any(char principale[] , char pattern[]){

int i,j;

for( i=j=0; principale[i]!= '\0' || principale [i]!= pattern[j]; j++)

{

if(pattern[j]== '\0')

{i++; j=0;}



else if (principale[i]!= pattern[j])

;

}

if (principale[i]== pattern[j])

return i;

else if (principale[i]== '\0')

return -1;

}

andbin
28-12-2007, 11:35
Originariamente inviato da playbasfa
Il programma non funzione in quanto mi viene sempre restituito -1, qualunque cosa io inserisca..Non ho ancora letto tutto il codice per bene. Diverse cose ho notato subito: any una funzione, non una variabile. Quindi fare printf ("%d", any); non ne vedo il senso.
Poi non vedo nella funzione any() il doppio ciclo for innestato, necessario come gi ampiamente spiegato sopra (da me).
Infine, non so se un errore di copia/incolla, hai messo '�'. Ch ?? Se vuoi indicare il carattere nullo si mette '\0'.

playbasfa
28-12-2007, 11:44
Originariamente inviato da andbin
Non ho ancora letto tutto il codice per bene. Diverse cose ho notato subito: any una funzione, non una variabile. Quindi fare printf ("%d", any); non ne vedo il senso.
Poi non vedo nella funzione any() il doppio ciclo for innestato, necessario come gi ampiamente spiegato sopra (da me).
Infine, non so se un errore di copia/incolla, hai messo '�'. Ch ?? Se vuoi indicare il carattere nullo si mette '\0'.

Per quanto riguarda printf("%d",any) intendo stampare il valore restituito dalla funzione any.. spesso lo uso e non mi ha mai creato problemi;
Per quanto riguarda '?' nel sorgente giusto '\0', ma nell'incollare il sorgente qui, non so perch viene trasformato.
Per quanto riguarda il doppio ciclo for... questo quanto di meglio sono riuscito a fare, so che non quello che mi hai suggerito tu ma l'unica cosa cui sono saputo arrivare..Che prima di compilare, a mio parere avrebbe potuto funzionare..

Samuele_70
28-12-2007, 12:23
Originariamente inviato da playbasfa
Per quanto riguarda printf("%d",any) intendo stampare il valore restituito dalla funzione any.. spesso lo uso e non mi ha mai creato problemi;

Sicuro ? :incupito:
Innanzitutto dovresti assegnare ad una variabile il valore restituito dalla finzione any,
evitando cos di richiamarla pi volte, per svolgere sempre la stessa operazione...
Comunque in quel modo la printf visualizza solamente l'indirizzo in memoria della funzione...

Originariamente inviato da playbasfa
Per quanto riguarda '?' nel sorgente giusto '\0', ma nell'incollare il sorgente qui, non so perch viene trasformato.
Per quanto riguarda il doppio ciclo for... questo quanto di meglio sono riuscito a fare, so che non quello che mi hai suggerito tu ma l'unica cosa cui sono saputo arrivare..Che prima di compilare, a mio parere avrebbe potuto funzionare..
Come ti ha gi detto andbin, usare due cicli annidati una buona soluzione.
Nel tuo codice di errori banali ce ne sono parecchi, forse stai facendo il 'passo pi lungo della gamba'
a giudicare dall'indentazione del codice che, quando corretta, da sola ti risparmia molti errori.
Dovresti colmare, al pi presto, le tue lacune sulle nozioni di base del linguaggio.
Altrimenti troverai parecchi problemi e ti ritroverai bloccato anche nella stesura di programmi
semplici come questo.
Ciao.

Loading