PDA

Visualizza la versione completa : [C] Esercizio di merge tra due array ordinati


Zanzy
11-12-2009, 13:00
Essendo alle "prime armi"con la programmazione ho "qualche" difficoltà.
L'algoritmo dovrebbe unire 2 array ordinati(fino all'inserimento dei 2 array va tutto bene)mentre per la function di merge ho vari problemi potreste aiutarmi?
p.s
devo per forza farlo con la function!



#include<stdio.h>
void merge(float k[],int b);
main()
{
int i,v,n,m;
float x[100],j[100];
printf("Inserisci la dimensione del primo array : ");
scanf("%d",&n);
printf("inserisci la dimensione del secondo array : ");
scanf("%d",&m);
for(i=0;i<n;i++)
{
printf("Inserisci il %d elemento del primo array: ",i+1);
scanf("%f",&x[i]);
}
for(v=0;v<m;v++)
{
printf("Inserisci il %d elemento del secondo array: ",v+1);
scanf("%f",&j[m]);
}
}

void merge(float k[],int b)
{
int i,v,n,m,x;
i=0;
v=0;
while ((i<n)&&(v<m))
{
if (x[n]<j[m])
{
k[b]=x[n];
i++;
}
else
{
k[b]=j[m];
v++;

}
}
if i>n
{
for (b=n;b<(n+m);b++)
{
k[b]=j[v];
v++;
}
else
for(b=m;b<(n+m);b++)
{
k[b]=x[n]
n++;
}
}
}

YuYevon
11-12-2009, 13:11
Se devi "fondere" due array, la funzione dovrebbe innanzitutto avere in input questi due array con relative lunghezze, non ti pare?

Comunque la prossima volta posta il codice con i tag giusti, come previsto dal regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887) al punto 6. Specifica anche il linguaggio nel titolo del thread, punto 2 del regolamento.

LeleFT
11-12-2009, 13:48
Consiglio anche una lettura del regolamento per conoscere le norme di posting del codice e relativi tag. Punto 6.


Ciao. :ciauz:

Zanzy
11-12-2009, 13:51
Scusate (ho modificato il titolo) per il codice bhè grazie al mod.XD
quindi la stringa da modificare sarebbe questa?potreste spiegarmi come?




void merge(float k[],int b)

YuYevon
11-12-2009, 14:03
Originariamente inviato da Zanzy
quindi la stringa da modificare sarebbe questa?potreste spiegarmi come?


Di certo non solo quella, ma è per dire: se una funzione deve fare il merging di due array, sembra ovvio che essa debba avere in input i due array, le loro lunghezze e (non necessariamente, potrebbe anche essere un valore di ritorno) un terzo array per l'output. Direi qualcosa del genere:



void merge(float array1[], int size1, float array2[], int size2, float array_output[], int size3)


dove chiaramente size3 è dato dalla somma di size1 e size2.

Per quanto riguarda l'implementazione, ti conviene studiare prima l'algoritmo per bene. Codice non ne scrivo perché tanto sul web se ne trova in abbondanza, e anzi qui sul forum proprio qualche giorno fa un utente ha postato lo stesso problema, quindi basterebbe una semplice ricerca per avere il codice, ma provaci da solo prima.

Zanzy
11-12-2009, 15:52
ecco ora mi crasha .....



#include<stdio.h>
void merge(float x[],float j[],float k[],int n,int m);
int main()
{
int i,v,n,m,b;
float x[100],j[100],k[200];
printf("Inserisci la dimensione del primo array : ");
scanf("%d",&n);
printf("inserisci la dimensione del secondo array : ");
scanf("%d",&m);
for(i=0;i<n;i++)
{
printf("Inserisci il %d elemento del primo array: ",i+1);
scanf("%f",&x[i]);
}
for(v=0;v<m;v++)
{
printf("Inserisci il %d elemento del secondo array: ",v+1);
scanf("%f",&j[m]);
}
b=n+m;
merge(x,j,k,n,m);
}

void merge(float x[],float j[],float k[],int n,int m)/*gli indici non si passano*/
{
int b,i,v;
b=0;
while ((i<n)&&(v<m))
{
if (x[n]<j[m])
{
k[b]=x[n];
i++;
}
else
{
k[b]=j[m];
v++;

}
}
if (i>n)
{
for (b=n;b<(n+m);b++)
{
k[b]=j[v];
v++;
}
}
else
{
for(b=m;b<(n+m);b++)
{
k[b]=x[n];
n++;
}
}
}

YuYevon
11-12-2009, 16:38
Hai fatto un po' di confusione.

1) nella procedura merge(), inizializza tutti gli indici a 0, non solo b;
2) attenzione a non fare confusione tra indici e size: sia in main() che in merge() hai usato più volte m e n come indici, e non i, v e b;
3) in main() hai calcolato correttamente b come n + m, ma non lo hai passato alla funzione.

Zanzy
11-12-2009, 16:55
Ok cambiato tutto
però non mi legge il secondo array






#include<stdio.h>
void merge(float x[],float j[],float k[],int n,int m);
int main()
{
int i,v,n,m,b;
float x[100],j[100],k[200];
printf("Inserisci la dimensione del primo array : ");
scanf("%d",&n);
printf("inserisci la dimensione del secondo array : ");
scanf("%d",&m);
for(i=0;i<n;i++)
{
printf("Inserisci il %d elemento del primo array: ",i+1);
scanf("%f",&x[i]);
}
for(v=0;v<m;v++)
{
printf("Inserisci il %d elemento del secondo array: ",v+1);
scanf("%f",&j[v]);
}
b=n+m;
merge(x,j,k,n,m);
printf("l'array unito è: ");
for(i=0;i<b;i++)
{
printf("%f \n",k[i]);
}
system("pause");
return 0;
}

void merge(float x[],float j[],float k[],int n,int m)/*gli indici non si passano*/
{
int b,i,v;
b=0;
i=0;
v=0;
while ((i<n)&&(v<m))
{
if (x[i]<j[v])
{
k[b]=x[i];
i++;
}
else
{
k[b]=j[v];
v++;
}
b++;
}
if (i>n)
{
for (b;b<(n+m);b++)
{
k[b]=j[v];
v++;
}
}
else
{
for(b;b<(n+m);b++)
{
k[b]=x[i];
i++;
}
}
}

YuYevon
11-12-2009, 17:21
Hai solo dimenticato di aggiustare la questione degli indici anche in main()



for (v = 0; v < m; v++) {
printf("Inserisci il %d elemento del secondo array: ",v+1);
scanf("%f", &j[v]);
}


avevi utilizzato ancora m (per inciso, quel &j[v] lo puoi scrivere semplicemente come j + v. Osservazione simile per l'altro array).

Poi c'è anche un altro errore in merge():



...
if (i >= n) {
...


una volta fuori dal while, devi controllare se i è uguale o no a n. In realtà ci andrebbe bene anche solo i == n, l'importante è che l'uguale ci sia. Scrivendo solo > non va, segui la logica degli indici e ti sarà chiaro.

Per il resto, funziona. Se vuoi usare system("PAUSE") includi l'header stdlib.h (ma comunque evita l'utilizzo di system(), per bloccare l'esecuzione del programma mettici una gethcar()), e poi nei due cicli for finali della funzione merge() quel b; non ha alcun effetto. Puoi semplicemente scrivere:



for ( ; b < (n+m); b++)


lasciando quindi vuoto il campo inizializzazione (o magari potresti sostituire il for con un while).

Zanzy
11-12-2009, 17:38
grazie ora il programma funziona!(l'indice in main l'avevo cambiato credendo che nessuno mi stava ancora rispondendo)
mentre l'errore nel merge non l'avevo proprio capito!
p.s.
sto lavorando col devc++ cambierà qualcosa quando lavorerò con il vi di linux?

mi spiegheresti gentilmente come "stoppare" l'esecuzione cambiando il system("pause") con il getchar?

Loading