PROBLEMA C++: unione di due vettori in un terzo.

alessiobianchii

Nuovo Utente
5
0
Ciao, ho bisogno di un piccolo aiuto per un esercizio in C++.
L'esercizio consiste nello scrivere un programma che ricevere in input due vettori e unisce i loro contenuti in un terzo vettore.

L'input e la visualizzazione del terzo vettore (quindi l'output) sono fatti, ma non so come realizzare la funzione "unisciVettori" (vedi foto sotto).
Vi sarei grato se mi suggeriste almeno come iniziare la funzione...

Allego consegna dell'esercizio per essere più comprensibile.

Grazie mille in anticipo.


Alessio.

Screenshot_9.jpg
 
Ultima modifica da un moderatore:

Spanci03

Utente Attivo
418
87
Periferiche
usb, mouse,tastiera
Net
duckduckgo
OS
windows 7 , debian
Ciao, hai due vettori.
int[] vet1 = new int[5]
int[] vet2 = new int [5]

int[] vetnew = new int[10]


fai un ciclo dove carichi i primi 2 , in questo caso io li faccio paralleli , poi ne fai un altro , dove li carichi nel nuovo vettore.
Non conoscendo la libreria array ( faccio c# ) e sono agli inizi , potresti fare un ordinamento ( selection / bubble ... )
poi con un ciclo stampi vetnew ed hai finito
 

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Ciao, hai due vettori.
int[] vet1 = new int[5]
int[] vet2 = new int [5]

int[] vetnew = new int[10]


fai un ciclo dove carichi i primi 2 , in questo caso io li faccio paralleli , poi ne fai un altro , dove li carichi nel nuovo vettore.
Non conoscendo la libreria array ( faccio c# ) e sono agli inizi , potresti fare un ordinamento ( selection / bubble ... )
poi con un ciclo stampi vetnew ed hai finito
Forse è il caso che intervieni a dare suggerimenti se sai effettivamente le cose, perché dare suggerimenti sbagliati e dichiarare pure che non sai e che sei alle prime armi.. beh, perlomeno crea confusione!

Inviato dal mio Nexus 6P utilizzando Tapatalk
 

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Se i vettori iniziali sono già ordinati prendi un valore per volta di uno e dell'altro e aggiungi il valore più piccolo ad un nuovo, terzo vettore, che andrai via via creando.
In pratica un ciclo per percorrere tutti i vettori iniziali.
Non servirà riordinare nulla.

Inviato dal mio Nexus 6P utilizzando Tapatalk
 

Spanci03

Utente Attivo
418
87
Periferiche
usb, mouse,tastiera
Net
duckduckgo
OS
windows 7 , debian
Forse è il caso che intervieni a dare suggerimenti se sai effettivamente le cose, perché dare suggerimenti sbagliati e dichiarare pure che non sai e che sei alle prime armi.. beh, perlomeno crea confusione!

Inviato dal mio Nexus 6P utilizzando Tapatalk

dice sequenza ordinata, creare un terzo vettore con dimensione pari alla somma dei primi 2 ...
non vedo cosa ho detto di sbagliato.
Illuminami
 

Spanci03

Utente Attivo
418
87
Periferiche
usb, mouse,tastiera
Net
duckduckgo
OS
windows 7 , debian
Se i vettori iniziali sono già ordinati prendi un valore per volta di uno e dell'altro e aggiungi il valore più piccolo ad un nuovo, terzo vettore, che andrai via via creando.
In pratica un ciclo per percorrere tutti i vettori iniziali.
Non servirà riordinare nulla.

Inviato dal mio Nexus 6P utilizzando Tapatalk

io li volevo ordinare alla fine nel nuovo vettore
Post unito automaticamente:

Attenzione però, somma dei primi due nel senso v1={1,2,3} v2={4,5,6} come risultato v3={1,2,3,4,5,6}

eh , alla fine ne avrai uno nuovo con dimensione pari alla somma dei due , il primo è 3 il secondo è 6 la somma è 9 ...
poi metti tutto in un terzo vettore e lo ordini.. non capisco cosa ho detto di sbagliato
 

Federinik

Nuovo Utente
86
14
Ciao,
il tuo problema richiede di costruire una funzione che riceve come parametri due array e ne restituisce un terzo.
La soluzione dipende da te... da quello che sai già fare, insomma. Penso proprio che sia indispensabile utilizzare l'allocazione dinamica della memoria per costruire il terzo array.
Una possibile è la seguente
1)Costruire l'array
Nella funzione dichiari una variabile che indica la dimensione dell'array data dalla somma delle dimensioni dei primi 2.
Per allocare memoria devi utilizzare come è già stato consigliato la funzione new (oppure malloc a te la scelta).
2) popolare l'array
A questo punto si potrebbe usare un doppio ciclo per popolare l'array:
Un primo ciclo che riempe le posizioni da 0 alla dimensione del primo array con gli elementi del primo array (chiamiamola n).
Un secondo ciclo che parte da n ed arriva ad n+m (m è la dimensione del secondo array) che riempe le ultime posizioni con gli elementi del secondo array.
3)Ordinarlo
A questo punto bisogna ordinarlo, di algortmi di sorting ne esistono molti, implementane uno che conosci o che riesci a costruirti, per rendere il programma economico in termini di calcolo si potrebbe sfruttare il fatto che i primi due array sono già ordinati... Ma credo che a questi livelli non sia indispensabile...

Se hai dubbi su ciò che ho scritto, chiedi senza problemi...
 

alessiobianchii

Nuovo Utente
5
0
Ciao,
il tuo problema richiede di costruire una funzione che riceve come parametri due array e ne restituisce un terzo.
La soluzione dipende da te... da quello che sai già fare, insomma. Penso proprio che sia indispensabile utilizzare l'allocazione dinamica della memoria per costruire il terzo array.
Una possibile è la seguente
1)Costruire l'array
Nella funzione dichiari una variabile che indica la dimensione dell'array data dalla somma delle dimensioni dei primi 2.
Per allocare memoria devi utilizzare come è già stato consigliato la funzione new (oppure malloc a te la scelta).
2) popolare l'array
A questo punto si potrebbe usare un doppio ciclo per popolare l'array:
Un primo ciclo che riempe le posizioni da 0 alla dimensione del primo array con gli elementi del primo array (chiamiamola n).
Un secondo ciclo che parte da n ed arriva ad n+m (m è la dimensione del secondo array) che riempe le ultime posizioni con gli elementi del secondo array.
3)Ordinarlo
A questo punto bisogna ordinarlo, di algortmi di sorting ne esistono molti, implementane uno che conosci o che riesci a costruirti, per rendere il programma economico in termini di calcolo si potrebbe sfruttare il fatto che i primi due array sono già ordinati... Ma credo che a questi livelli non sia indispensabile...

Se hai dubbi su ciò che ho scritto, chiedi senza problemi...

Spiegazione dettagliata, ma purtroppo le funzioni "new" e "malloc" non le conosco.
Per quanto riguarda il sorting, ho presente solo il selection sort (più o meno).
 

Federinik

Nuovo Utente
86
14
Spiegazione dettagliata, ma purtroppo le funzioni "new" e "malloc" non le conosco.
Per quanto riguarda il sorting, ho presente solo il selection sort (più o meno).

Ok, non credo che si possa inizializzare un array passandogli come dimensione una variabile (intendo int array[a], deve esserci per forza un numero, per esempio int array[10] è corretto), quindi bisogna utilizzare i puntatori. I puntatori sono variabili particolari che "puntano" ad una cella di memoria, se utilizzati correttamente, svolgono le stesse funzioni di un array. Nel tuo caso, serve un puntatore ad interi.
Per creare un array di interi con i puntatori si usa la funzione new.
Ecco un esempio:
int* p_array = new int[a];
viene dichiarato un puntatore ad interi (int* p_array, dove '*' serve per dichiarare che è un puntatore) al quale associo tante caselle di memoria, quante ne richiedono a interi dove "a" rappresenta la dimensione dell'array che si vuole creare. Per il suo uso, lo tratti come se fosse un vettore normale...
Il selction sort, per l'esercizio penso vada bene...
 

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Spiegazione dettagliata, ma purtroppo le funzioni "new" e "malloc" non le conosco.
Per quanto riguarda il sorting, ho presente solo il selection sort (più o meno).
Per procedere bisogna che sia tu a mettere giù una bozza di codice perché non si può fare altro che spiegarti il programma ma non scriverti anche il codice (per regolamento).
Tieni presente che ciò che ti viene richiesto è estremamente semplice, per cui non ti serviranno funzioni complicate e specifiche, basta mettere giù un algoritmo corretto.

Ti posso suggerire di iniziare a scrivere il codice per unire i due vettori in uno nuovo.

Inviato dal mio Nexus 6P utilizzando Tapatalk
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,882
11,541
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
eh , alla fine ne avrai uno nuovo con dimensione pari alla somma dei due , il primo è 3 il secondo è 6 la somma è 9 ...
poi metti tutto in un terzo vettore e lo ordini.. non capisco cosa ho detto di sbagliato
@Lupen03
è l'algoritmo ad essere sbagliato:
se fai la fusione "grezza" e ordini alla fine, avrai complessità O(n^2) se usi gli algoritmi facili da implementare (selectionsort per esempio) o n*log(n) con un complicato mergesort.
Il che è inutile perché questo è un esercizio da fare in tempo O(n).

Penso proprio che sia indispensabile utilizzare l'allocazione dinamica della memoria per costruire il terzo array.
@Federinik
perché?
La dimensione dei 2 array è nota a priori, la dimensione dell'array finale è la somma delle 2 dimensioni; anche nell'esempio è evidente l'inserimento multiplo dello stesso valore. Il riordino inoltre non è da fare, basta sfruttare il fatto che i 2 array in input te li danno già ordinati.

Allocato una volta per tutte un array di dimensione paria alla somma delle 2, basta mantenere un indice di scansione per ogni array (chiamiamoli i e j); confronti v1 con v2[j] e inserisci nel nuovo array il minore, poi incrementi (di 1) solo l'indice dell'elemento minore e continui fino ad esaurire i 2 array. L'unica cosa a cui porre attenzione è non uscire dal range degli indici e verificare ogni volta se si è giunti alla fine di uno degli array.
Rilevo tuttavia che non mi è chiara nell'esercizio la dicitura "usare le funzioni della libreria libreriaArray": in tal caso il metodo che dicevo è da modificare in base alle funzioni contenute in tale (sconosciuta, almeno per me) libreriaArray
 
Ultima modifica:
  • Mi piace
Reazioni: Andretti60

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Appunto. Lo spunto te lo dà il testo dell'esercizio stesso quando ti fa notare che i due vettori iniziali sono già ordinati: da questo capisci che non serve riordinare nulla, ma solo rispettare l'ordinamento dei sorgenti.
In pratica, come dicevo sopra, costruendo il nuovo Array prelevando sempre il valore più basso di uno dei due. Come ha detto @BAT00cent puoi usare due indici separati per raccogliere i dati dei vettori.

Infine, pensare ad un metodo di ordinamento (tipo bubble addirittura) per mettere in ordine una decina di valori, è cosa di inefficienza colossale! Paradossalmente sarebbe più conveniente richiamare un algoritmo per ordinare i singoli vettori sorgenti prima di unirli con il metodo di cui sopra o, ancora meglio, selezionare di volta in volta il valore più basso tra gli interi due arrays prima di aggiungerlo a quello nuovo.

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
Ultima modifica:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!