PROBLEMA Array in C.

Nicodemos

Nuovo Utente
43
2
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.
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
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
 

Nicodemos

Nuovo Utente
43
2
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]?
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
  • Mi piace
Reazioni: Nicodemos

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit

Nicodemos

Nuovo Utente
43
2
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.
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
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
 
  • Mi piace
Reazioni: Nicodemos

Nicodemos

Nuovo Utente
43
2
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.
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
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
 
  • Mi piace
Reazioni: Nicodemos

Nicodemos

Nuovo Utente
43
2
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.
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Pseudo codice relativo alla parte booleana:

While{
while{
se b = u {
boolean = 1;
}
}
Se boolean = 0 {
u = b;
}
boolean = 0;
}
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili