Domanda Problema con confronto tra due array e eliminazione valori ripetuti

  • Autore discussione Utente cancellato 277851
  • Data d'inizio
U

Utente cancellato 277851

Ultima modifica da un moderatore:
Salve a tutti! Il problema da risolvere è il seguente: Dati due vettori di interi, stampa a schermo i valori presenti nel primo vettore, e non nel secondo. Usa un array di appoggio dichiarato come oggetto della classe vector, e manipolalo usando i metodi della classe... (es. vettA={2, 10, 6, 8, 4} e vettB={1, 2, 3, 4, 5, 6}, vettAPPOGGIO={10, 8}.
Ho provato con decine e decine di sequenze, ma non ho mai ottenuto il risultato giusto. Quella di seguito è quella che ritenevo più giusta...

C++:
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
int dimA=10, dimB=8, i, j;
int vettA[dimA]={2, 10, 6, 8, 4};
int vettB[dimB]={1, 2, 3, 4, 5, 6};
vector <int> appoggio;
bool presente;
for(i=0; i<dimA; i++)          
    {                          
        for(j=0; j<dimB; j++)
             {                      
                 if (vettA[j]==vettB[j][I]      
                 {
             presente=1;
                 if (presente==0)   
                 appoggio.push_back(i);                        
         }                                   
        }                                       
    }                                            
    if (appoggio.size()>0)
    {
    cout<<"Sono presenti solo nel secondo array, i seguenti numeri: ";
    for(i=0; i<appoggio.size(); i++)
    cout<<appoggio[i]<<" ";    
    }
    else
    cout<<"Nessuna coincidenza";            
}
 

fisica-all

Utente Gold
13 Aprile 2014
1,287
228
311
Intanto ciao e benvenuto su IF!

Un primo consiglio al volo: quando scrivi codice, inseriscilo sempre nel tag corretto, cosi' il codice sara' piu' leggibile per chi vuole aiutarti!

Ora passiamo all'esercizio:
Logica:
confronto ogni elemento arrayA con ogni elemento arrayB. Se un elemento in comune -> aggiungo ad array appoggio, altrimenti passo avanti.

Quello che tu fai, invece, e':
confronto ogni elemento arrayA con ogni elemento arrayB. Se un elemento in comune -> presente =1, altrimenti aggiungo.. E' un po' il contrario di quello che vorresti fare! Inoltre, non interrompendo il controllo, tu aggiungi un sacco di elementi in piu'. E gli elementi che tu aggiungi sono il valore della i che usi per scorrere il vettore, neanche gli elementi del vettore!

Soluzione proposta:


C++:
#include <iostream>
#include <vector>
using namespace std;
int main(void){
    int dimA=10, dimB=8, i, j;
    int vettA[dimA]={2, 10, 6, 8, 4};
    int vettB[dimB]={1, 2, 3, 4, 5, 6};
    vector <int> appoggio;
    //bool presente; // non serve
    for(i=0; i<dimA; i++){ //scorro A
        for(j=0; j<dimB; j++){ //scorro B
            if (vettA[i]==vettB[j]){ //se un elemento e' in comune
                appoggio.push_back(vettA[i]); // aggiungo vettA[i] nell'array appoggio
                break; //interrompo ciclo: ho trovato un valore in comune, passo al prossimo elemento di A
            }
        }
    }
    if (appoggio.size()>0){
        cout<<"Sono presenti solo nel secondo array, i seguenti numeri: ";
        for(i=0; i<appoggio.size(); i++)
            cout<<appoggio<<" ";
    }
    else
        cout<<"Nessuna coincidenza";
}

NOTA: fra questo codice ed il tuo, ci sono anche differenze sulle variabili utilizzate (vettA al posto di i, come detto prima, oppure vettA al posto di vettA[j] come avevi scritto.
NOTA 2: questo codice non fa caso alle ripetizioni! (esiste una funzione della classe che fa al caso tuo, oppure puoi implementare altro codice di controllo, pensa a qualcosa e proponi qui!

Fammi sapere se qualcosa non ti e' chiara!
 
U

Utente cancellato 277851

Ultima modifica da un moderatore:
Grazie!
Messaggio unito automaticamente:

Nel modo che mi hai illustrato, il programma mi restituisce però, solo i numeri presenti in entrambi i vettori. Io credo di aver trovato una soluzione in ogni caso. Ho risolto con il sistema per confrontare le ripetizioni in un array. Pper quanto riguarda i tag, perdonami, ma con il copia-incolla, non sono capace di fare come hai fatto tu...
C++:
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
int dim1=5, dim2=6, i, j;
bool presente;
int vett1[dim1]={2, 10, 6, 8, 4};
int vett2[dim2]={1, 2, 3, 4, 5, 6};
vector <int> appoggio;                   
for (i=1; i<dim1; i++)                         
    {                                           
    presente=0;
    for (j=0; j<dim2; j++)                          
        {
        if (vett1[I]==vett2[j])   
        presente=1;
        }
    if (presente==0)                               
        {
        appoggio.push_back(vett1[I]); 
        }
    }
    if (appoggio.size()>0)
    {
    cout<<"Sono presenti solo nel secondo array, i seguenti numeri: ";
    cout<<endl;    
    for (i=0; i<appoggio.size(); i++)
        {
        cout<<appoggio[I]<<" ";
        }
    }
}
 
DOWNLOAD
Banner pubblicitario per Bright Data su Inforge.net azienda di vendita Proxy, Data Collector e Content Unlocker

fisica-all

Utente Gold
13 Aprile 2014
1,287
228
311
Oddio scusa, avevo letto male la traccia:


C++:
#include <iostream>
#include <vector>
using namespace std;
int main(void){
    int dimA=10, dimB=8, i, j;
    int vettA[dimA]={2, 10, 6, 8, 4};
    int vettB[dimB]={1, 2, 3, 4, 5, 6};
    vector <int> appoggio;
    
    for(i=0; i<dimA; i++){ //scorro A
        bool presente = False;
        for(j=0; j<dimB; j++){ //scorro B
            if (vettA[i]==vettB[j]){ //se un elemento e' in comune
                presente = True;
                break; //interrompo ciclo: ho trovato un valore in comune, passo al prossimo elemento di A
            }
        }
        if(!presente)
            appoggio.push_back(vettA[i]); // aggiungo vettA[i] nell'array appoggio
    }
    if (appoggio.size()>0){
        cout<<"Sono presenti solo nel secondo array, i seguenti numeri: ";
        for(i=0; i<appoggio.size(); i++)
            cout<<appoggio<<" ";
    }
    else
        cout<<"Nessuna coincidenza";
}
 

DispatchCode

Moderatore
24 Maggio 2016
400
262
193
@AdriPisa ti ho editato io il codice inserendo il tag CODE. E' un normale tag BBCode, puoi avere più info qui https://www.inforge.net/forum/help/bb-codes/ e vedere come si utilizza.

Un'altra soluzione è questa, senza utilizzare il break e la variabile booleana:
C++:
#include <iostream>
#include <vector>

using namespace std;

int main(void){
    int dimA=10, dimB = 8;
    int vettA[dimA]={2, 10, 6, 8, 4};
    int vettB[dimB]={1, 2, 3, 4, 5, 6};
    vector <int> appoggio;
    
    for(int i=0; i<dimA; i++){ //scorro A
        int n = vettA[i];
        
        int j = 0;
        while(j < dimB && n != vettB[j++]); // ciclo su B: se trova un elemento si interrompe il ciclo
        
        // se j >= dimB allora l'elemento non e' stato trovato, quindi viene aggiunto al terzo vettore
        if(j >= dimB)
            appoggio.push_back(n);
    }
    
    if(appoggio.size()) {
        cout << "Elementi in vettA non presenti in vettB: ";
        for(int i=0; i<(int)appoggio.size(); i++)
            cout << appoggio[i] << " ";
    }
    else
        cout << "Nessun elemento trovato";
        
    return 0;
}

Per provarlo online http://cpp.sh/525wr
 

kernelspace

Utente Bronze
17 Giugno 2021
88
57
45
la mia:

C++:
/*
 * linux: g++ main.cc -o appoggio
 */

#include <iostream>
#include <vector>

using namespace std;

int main(void)
{
    int vett1[] = {2, 10, 6, 8, 4};
    int vett2[] = {1, 2, 3, 4, 5, 6};
    int *p1 = vett1;
    int i;
    bool skip;
    vector <int> appoggio;

    while (*p1++) {
        for (i = 0, skip = false; i < sizeof(vett2); ++i) {
            if (*p1 == vett2[i])
                skip = true;
        }
        if (!skip)
            appoggio.push_back(*p1);
    }

    for (i = 0; i < appoggio.size(); ++i)
        cout << appoggio[i] << "\n";
}
 
DOWNLOAD
Banner pubblicitario per Bright Data su Inforge.net azienda di vendita Proxy, Data Collector e Content Unlocker