PDA

View Full Version : [C] array+array=...?


fabri_napoli
12-12-2008, 21:04
Buonasera a tutti :D
Proseguivo con gli esercizi che il professore di programmazione ci ha assegnato, e (grazie a voi) sembrava andare tutto per il meglio, ormai le funzioni le ho imparate.. quando arrivo a questo esercizio:
Realizzare una function di tipo main e function merge che esegua la fusione (merge) di due array ordinati...
Non so se perchè ho il cervello fuso o meno, ma mi sembra più difficile del normale :(
Vi posto quello che ho fatto fin'ora:

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

int merge (int *a, int *b, int n, int t);

main ()
{
int *a, *b, *c, n, t, s, i, j, k;

printf ("Inserisci il numero di elementi contenuti nel primo array\n");
scanf ("%d", &n);
a=(int*)malloc(n*sizeof(int));
printf ("Inserisci il numero di elementi contenuti nel secondo array\n");
scanf ("%d", &t);
b=(int*)malloc(t*sizeof(int));

for (i=0; i<n; i++) {
printf ("Inserisci l'elemento n.%d dell'array A\n", i+1);
scanf ("%d", &a[i]); }
for (j=0; j<t; j++) {
printf ("inserisci l'elemento n.%d dell'array B\n", j+1);
scanf ("%d", &b[j]); }

merge (a, b, n, t);

printf ("La fusione dei due array ha generato un terzo array contenente i seguenti elementi\n");

for (k=0; k<s; k++) {
printf ("%d) %d", k+1, c[k]); }

system ("pause");
free (a);
free (b);
}

int merge (int *a, int *b, int n, int t) {
int s= n+t;
int i, j;
int k=-1;
int *c;

for (i=0; i<n; i++) {
for (j=0; j<t; j++) {
if (a[i]<b[j]) {
a[i]=c[k++]; }
else { b[j]=c[k++]; }
}
}
}




Potreste aiutarmi a capire cos'è che ho sbagliatoo?? mi crasha!! forse ho messo più variabili di quante ne servano? forse sbaglio a scrivere la function??
Vi ringrazio in ogni caso ^^
buona serata!

DanieleC88
12-12-2008, 21:50
Potreste aiutarmi a capire cos'è che ho sbagliatoo?? mi crasha!! forse ho messo più variabili di quante ne servano?
Sbagliato, ne hai messo di meno: hai dichiarato int *c nel main() e anche nella merge(), ma non l'hai inizializzata mai da nessuna parte. In più, i cambiamenti che effettui sulla variabile nella funzione non si ripercuoteranno mai nella funzione principale (devi passare anche il puntatore al vettore in cui salvare i risultati, o allocarlo nella funzione e restituirlo come valore di ritorno).
forse sbaglio a scrivere la function??
Questo di sicuro: si chiama funzione, se esiste un nome italiano ci sarà un perché. :Prrr:

ciao ;)

fabri_napoli
13-12-2008, 20:41
ho letto e riletto il tuo messaggio ma non capisco :( :cry:
devo iniziare un altro ciclo for per scorrere C insieme ad A e B? :(

DanieleC88
14-12-2008, 02:17
#include <stdio.h>
#include <stdlib.h>

int merge (int *a, int *b, int n, int t);

main ()
{
int *a, *b, *c, n, t, s, i, j, k;

printf ("Inserisci il numero di elementi contenuti nel primo array\n");
scanf ("%d", &n);
a=(int*)malloc(n*sizeof(int));
printf ("Inserisci il numero di elementi contenuti nel secondo array\n");
scanf ("%d", &t);
b=(int*)malloc(t*sizeof(int));

for (i=0; i<n; i++) {
printf ("Inserisci l'elemento n.%d dell'array A\n", i+1);
scanf ("%d", &a[i]); }
for (j=0; j<t; j++) {
printf ("inserisci l'elemento n.%d dell'array B\n", j+1);
scanf ("%d", &b[j]); }

merge (a, b, n, t);

printf ("La fusione dei due array ha generato un terzo array contenente i seguenti elementi\n");

for (k=0; k<s; k++) {
printf ("%d) %d", k+1, c[k]); }

system ("pause");
free (a);
free (b);
}

int merge (int *a, int *b, int n, int t) {
int s= n+t;
int i, j;
int k=-1;
int *c;

for (i=0; i<n; i++) {
for (j=0; j<t; j++) {
if (a[i]<b[j]) {
a[i]=c[k++]; }
else { b[j]=c[k++]; }
}
}
}



Ti ho messo in grassetto le parti problematiche: quel puntatore int *c è dichiarato nel main() ma la memoria a cui dovrebbe puntare non è mai riservata ed il puntatore rimane non inizializzato (quindi andresti a scrivere un po' a caso nella memoria). Fai la stessa identica cosa nel merge(), con la sola differenza che qui vai anche a scriverci effettivamente della roba, e quasi certamente vai ad interferire con dati che non sono nello spazio riservato per la tua applicazione.

In più, se anche la merge() funzionasse, non ti sei assicurato che il puntatore faccia riferimento alla stessa memoria in cui vuoi scrivere: quindi se tu allocassi la memoria per l'array dentro merge() poi la main() non riceverebbe le modifiche. Devi quindi allocarla nella main(), passare il puntatore come parametro alla merge(), e da lì riempirla.

Alex_87_xelA
14-12-2008, 02:26
vorrei sdrammatizzare un pochino :D

a domanda rispondo
domanda : [C] array+array=...?
risposta : 2array :Prrr:

DanieleC88
14-12-2008, 02:29
:doh:

Mi rincuora se non altro che non sono l'unico scemo che alle 3 e mezza della notte scrive cazzate. :D

fabri_napoli
14-12-2008, 14:19
ho finalmente capito cosa intendevi :D
quindi ho scritto:

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

int merge (int *a, int *b, int *c, int n, int t);

main ()
{
int *a, *b, *c, n, t, s, i, j, k;

printf ("Inserisci il numero di elementi contenuti nel primo array\n");
scanf ("%d", &n);
a=(int*)malloc(n*sizeof(int));
printf ("Inserisci il numero di elementi contenuti nel secondo array\n");
scanf ("%d", &t);
b=(int*)malloc(t*sizeof(int));
c=(int*)malloc((t+n)*sizeof(int));

for (i=0; i<n; i++) {
printf ("Inserisci l'elemento n.%d dell'array A\n", i+1);
scanf ("%d", &a[i]); }
for (j=0; j<t; j++) {
printf ("inserisci l'elemento n.%d dell'array B\n", j+1);
scanf ("%d", &b[j]); }

merge (a, b, c, n, t);

printf ("La fusione dei due array ha generato un terzo array contenente i seguenti elementi\n");

for (k=0; k<(n+t); k++) {

printf ("%d\n", c[k]); }
system ("pause");
free (a);
free (b);
}

int merge (int *a, int *b, int *c, int n, int t) {
int s= n+t;
int i, j;
int k=-1;

for (i=0; i<n; i++) {
for (j=0; j<t; j++) {
if (a[i]<b[j]) {
c[k++]=a[i]; }
else { c[k++]=b[j]; }
}

ma a quanto pare è proprio la funzione merge che non funge :(
se inserisco ad esempio a= {1,2} e b= {3,4} nell'array risultante mi stampa valori come 1, 1, 2, 2, 2...
e se provassi ad avanzare contemporaneamente nei due array con un unico indice incrementandolo ogni volta di uno?

Netskate
14-12-2008, 14:41
vediamo se ho capito.

devi fondere due array ordinati in modo da avere un terzo array (sempre ordianto) che li contenga entrambi?

esempio

primo array: 1, 5, 6
secondo array: 2, 9, 10

(sto supponendo che per ordine intendi la grandezza del numero in ordine crescente)

array dopo il merge: 1, 2, 5, 6, 9, 10

se cosi fosse, quali vincoli hai?
ci sono parecchie strade da seguire, sembra che ti sei un po' complicato la vita ^^

fabri_napoli
14-12-2008, 15:13
vediamo se ho capito.

devi fondere due array ordinati in modo da avere un terzo array (sempre ordianto) che li contenga entrambi?

esempio

primo array: 1, 5, 6
secondo array: 2, 9, 10

(sto supponendo che per ordine intendi la grandezza del numero in ordine crescente)

array dopo il merge: 1, 2, 5, 6, 9, 10

se cosi fosse, quali vincoli hai?
ci sono parecchie strade da seguire, sembra che ti sei un po' complicato la vita ^^

esattamente, quello che devo fare è proprio questo!
ghghgh se ci sono tante strade da seguire secondo me allora mi sono completamente perso :D

Kenger
14-12-2008, 15:50
for (i=0; i<n; i++) {
for (j=0; j<t; j++) {
if (a[i]<b[j]) {
c[k++]=a[i]; }
else { c[k++]=b[j]; }
}
}
}


Il problema è che fai il controllo n*t volte al posto che n+t.
La soluzione che mi sembra migliore (che tra l'altro è il merge che si usa di solito in mergesort) è fare un unico ciclo che dura n+t e tenere due ulteriori indici, che indicano a che punto dei vettori a e b si è arrivati. :)

fabri_napoli
14-12-2008, 16:02
nel frattempo ho avuto un'idea, non so se coincide con quello che hai scritto tu :D
pensavo di fare un unico ciclo for che scorre l'array C vuoto... e SE a[i]<b[j] allora c[k]=a[i] ed incremento l'indice i di 1. Altrimenti c[k]=b[j] ed incremento j di 1...
ora provo a vi faccio sapere :P

così:

int merge (int *a, int *b, int *c, int n, int t) {
int s= n+t;
int i=0;
int j=0;
int k;

for (k=0; k<s; k++) {
if (a[i]<b[j]) {
c[k]=a[i];
i++; }
else { c[k]=b[j];
j++;}
}

}



OODDDDIO SEMBRA FUNZIONARE. vado a piedi a pompei se funziona in tutti i casi XD

fabri_napoli
14-12-2008, 16:15
ok, finalmente funziona :D
ringrazio tutti per il vostro prezioso aiuto! domani ho la prova......!!!!!
mi manca solo un ultimo esercizio e poi posso riposarmi! :D
grazie ancoraaaa!!!

Netskate
14-12-2008, 23:36
buona fortuna allora :D

ps: se posso darti un consiglio, cerca di usare dei nomi per le variabili con un po più di significato, aiutano a non confondersi. :stordita:

Alex_87_xelA
15-12-2008, 17:23
:doh:

Mi rincuora se non altro che non sono l'unico scemo che alle 3 e mezza della notte scrive cazzate. :D

:D ... ti volevo fare compagnia :D .. ci sono riuscito allora :ciapet: