PROBLEMA Array in C.

Pubblicità

Nicodemos

Nuovo Utente
Messaggi
43
Reazioni
2
Punteggio
23
Salve ragazzi!
Vorrei fare un esercizio che mi chiede, dati due array di interi, di crearne un terzo che li unisca evitando le ripetizioni.
Purtroppo però, non capisco perché, nel terzo array vengono copiati per intero i due array.

Codice:
Codice:
#include 

int main (){

int a[5] = {1, 6, 15, 25, 20};
int b[4] = {2, 20, 18, 6};
int u[20];

int i = 0, j = 0, k = 0;

while (a[i] != '\0'){
u[k] = a[i];
i++;
k++;
}

while (b[j] != '\0'){
if (b[j] != u[k]){
u[k] = b[j];
}
j++;
k++;
}

k = 0;

while (u[k] != '\0'){
printf("u[%d]\n", u[k]);
k++;
}

return 0;
}

Spero in una vostra illuminazione! Grazie mille in anticipo.

Nicodemo.
 
Confronti l'array b con le posizioni vuote di u. Ovvio che son tutte diverse.
Devi salvare prima l'array a, dopo per ogni elemento di b ciclare su tutti gli elementi di u. Se finisci il ciclo lo aggiungi ma se trova una corrispondenza fermi il ciclo e passi al valore dopo di b
 
Confronti l'array b con le posizioni vuote di u. Ovvio che son tutte diverse.
Devi salvare prima l'array a, dopo per ogni elemento di b ciclare su tutti gli elementi di u. Se finisci il ciclo lo aggiungi ma se trova una corrispondenza fermi il ciclo e passi al valore dopo di b

Ciao! Grazie per la risposta.
Quindi se ho ben capito sono due cicli while annidati? Uno che scorre u[k] e uno b[j]?
 
Ciao! Grazie per la risposta.
Quindi se ho ben capito sono due cicli while annidati? Uno che scorre u[k] e uno b[j]?
Esatto, b deve essere il ciclo esterno

Non mi dire niente rod, nemmeno così riesco

Codice:
while (b[j] != '\0'){
while(u[k] != '\0'){

if (b[j] != u[k]){
u[k] = b[j];
}
}
j++;
k++;
}

In output vedo che copia tutto l’array A, l’array B, al contrario, per niente. Ho messo anche dei printf dopo i cicli di (presunta) ‘copiatura’ per vedere i vari valori dei contatori e il contatore di B in effetti arriva fino alla fine (4) ma comunque il risultato è nullo.
 
Non mi dire niente rod, nemmeno così riesco

Codice:
while (b[j] != '\0'){
while(u[k] != '\0'){

if (b[j] != u[k]){
u[k] = b[j];
}
}
j++;
k++;
}

In output vedo che copia tutto l’array A, l’array B, al contrario, per niente. Ho messo anche dei printf dopo i cicli di (presunta) ‘copiatura’ per vedere i vari valori dei contatori e il contatore di B in effetti arriva fino alla fine (4) ma comunque il risultato è nullo.
Son due cicli diversi, tu incrementi entrambi i contatori contemporaneamente. Devi usare un contatore per u che parta da 0 e vada fino alla fine, tenendo sempre il contatore di b fermo. Finito il ciclo interno resetti il contatore di u (deve per forza essere diverso da quello che usi per salvare (k)) e incrementi j
 
Non mi dire niente rod, nemmeno così riesco

Codice:
while (b[j] != '\0'){
while(u[k] != '\0'){

if (b[j] != u[k]){
u[k] = b[j];
}
}
j++;
k++;
}

In output vedo che copia tutto l’array A, l’array B, al contrario, per niente. Ho messo anche dei printf dopo i cicli di (presunta) ‘copiatura’ per vedere i vari valori dei contatori e il contatore di B in effetti arriva fino alla fine (4) ma comunque il risultato è nullo.
Son due cicli diversi, tu incrementi entrambi i contatori contemporaneamente. Devi usare un contatore per u che parta da 0 e vada fino alla fine, tenendo sempre il contatore di b fermo. Finito il ciclo interno resetti il contatore di u (deve per forza essere diverso da quello che usi per salvare (k)) e incrementi j

Grazie per la pazienza rod, veramente.
Sto impazzendo.

Codice:
while (b[j] != '\0'){
while(u[t] != '\0'){
if (b[j] != u[t]){
u[k] = b[j];
}
t++;
}
t = 0;
j++;
}

Cosa c’è di sbagliato ora a parte tutto?
Finché non finisce b, finché non finisce u di t (inizializzato a 0) se quello che c’è in b è diverso dal contenuto di u, copia il contenuto in u di k. E niente, non lo fa.
 
Grazie per la pazienza rod, veramente.
Sto impazzendo.

Codice:
while (b[j] != '\0'){
while(u[t] != '\0'){
if (b[j] != u[t]){
u[k] = b[j];
}
t++;
}
t = 0;
j++;
}

Cosa c’è di sbagliato ora a parte tutto?
Finché non finisce b, finché non finisce u di t (inizializzato a 0) se quello che c’è in b è diverso dal contenuto di u, copia il contenuto in u di k. E niente, non lo fa.
Prima di aggiungere un valore di B devi confrontare tutti i valori che ci sono in u. Significa che ci deve essere un if nel ciclo intero che se il valore di b è uguale ad un valore di u, allora setti una variabile booleana come falsa. Finito il ciclo interno fai l'if per aggiungere l'elemento, ma solo se la variabile booleana è vera. Dopo resetti tutte le varie variabili e riparti.
Comunque ricordati di mettere come ultimo valore di u il '\0', sennò ti da errore di segmentazione
 
Prima di aggiungere un valore di B devi confrontare tutti i valori che ci sono in u. Significa che ci deve essere un if nel ciclo intero che se il valore di b è uguale ad un valore di u, allora setti una variabile booleana come falsa. Finito il ciclo interno fai l'if per aggiungere l'elemento, ma solo se la variabile booleana è vera. Dopo resetti tutte le varie variabili e riparti.
Comunque ricordati di mettere come ultimo valore di u il '\0', sennò ti da errore di segmentazione

È proprio indispensabile la variabile booleana?
In ogni caso, non avrei voluto chiedertelo ma mi sento ‘costretto’. Potresti scrivere il codice? Ho una confusione ora che non ha eguali.
 
Pseudo codice relativo alla parte booleana:

While{
while{
se b = u {
boolean = 1;
}
}
Se boolean = 0 {
u = b;
}
boolean = 0;
}
 
Pubblicità
Pubblicità
Indietro
Top