Trovate l'errore vi prego...C++

Splair
Ragazzi alcuni amici mi hanno chiesto di fare un esercizio sugli array...
allora io tutto bello gasato sono partito in quinta e .....ho fatto una figuraccia!!!
L'esercizio richiede di fare l'unione di 2 array senza copiare i duplicati...cioè se inserisco nel primo array 1 2 3 4 5 e nel secondo array 1 2 3 4 6 il terzo array dovrebbe contenere 1 2 3 4 5 6.
Ho provato con questo codice che logicamente sembra corretto ma praticamente no perchè non so per quale motivo non copia gli elementi in c...Il codice è questo:
#include <iostream>
using namespace std;
      int main(){
          int const N=50;
          int n;
          int a[N], b[N], c[2*N];
          
          cout<<"Quanti elementi vuoi inserire? "<<endl;
          cin>>n;
          int i,j,k=0;
          for(i=0;i<2*n;i++){
                           c[i]=0; //inizializzo tutti gli elementi a zero per non avere gli indirizzi di memoria.
                           }
          //creo l'array A:
          for(i=0;i<n;i++){
                           cout<<"Inserisci l'elemento di posizione "<<i+1<<" dell'array A:"<<endl;
                           cin>>a[i]; 
                           }
          //creo l'array B:
          for(i=0;i<n;i++){
                           cout<<"Inserisci l'elemento di posizione "<<i+1<<" dell'array B:"<<endl;
                           cin>>b[i];
                           }
          //nei primi n elementi di c copia a.
          for(i=0;i<n;i++){
                           c[i]=a[i];
                           }
          //l'indice k mi servirà per l'inserimento nelle caselle successive in c e quindi lo inizializzo a n
          k=n;
          bool trovato=false;  
          int x;
          for(i=0;i<n;i++){
                           x=b[i]; //do a x il valore di b[i] per effettuare il controllo.
                           for(j=0;j<n;j++){
                                            if(c[j]==x){ //se l'elemento di c[j] è uguale ad un elemento di b...
                                                        trovato=true; //il valore trovato prende true.
                                                        }
                                                        if(!trovato) //altrimenti se il valore di trovato=false;
                                                        c[k]=x;    //Inserisci nella posizione k il valore di x.
                                                        k++; // Aumenta k in modo che il prossimo inserimento sia nella cella successiva.
                                                        }
                                             }
          cout<<"L'array A e': "<<endl;
          for(i=0;i<n;i++){
                           cout<<a[i]<<" ";
                           }
           cout<<endl;      
          cout<<"L'array B: e': "<<endl;
          for(i=0;i<n;i++){
                           cout<<b[i]<<" ";
                           }
          cout<<endl;
          cout<<"L'array in comune e': "<<endl; 
          for(i=0;i<k;i++){
                 cout<<c[i]<<" ";
                 }
          cin>>ws;
          }
                         


Grazie a tutti...
ciao

Risposte
elgiovo
Io ricontrollerei quel bool trovato. Così, appena diventa true vi rimane per tutto il resto del tempo. Prova a mettere
bool trovato=false;

all'inizio del ciclo for che lo segue, in questo modo se trovato era true ridiventa false ad ogni iterazione.

elgiovo
Farò di meglio....
Questo programma funziona.

#include <iostream>
using namespace std;
      int main(){
          int const N=50;
          int n;
          int a[N], b[N], c[2*N];
         
          cout<<"Quanti elementi vuoi inserire? "<<endl;
          cin>>n;
          int i,j,k=0;
          for(i=0;i<2*N;i++){
                           c[i]=0; //inizializzo tutti gli elementi a zero per non avere gli indirizzi di memoria.
                           }
          //creo l'array A:
          for(i=0;i<n;i++){
                           cout<<"Inserisci l'elemento di posizione "<<i+1<<" dell'array A:"<<endl;
                           cin>>a[i];
                           }
          //creo l'array B:
          for(i=0;i<n;i++){
                           cout<<"Inserisci l'elemento di posizione "<<i+1<<" dell'array B:"<<endl;
                           cin>>b[i];
                           }
          //nei primi n elementi di c copia a.
          for(i=0;i<n;i++){
                           c[i]=a[i];
                           }
          //l'indice k mi servirà per l'inserimento nelle caselle successive in c e quindi lo inizializzo a n

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



          cout<<"L'array A e': "<<endl;
          for(i=0;i<n;i++){
                           cout<<a[i]<<" ";
                           }
           cout<<endl;     
          cout<<"L'array B: e': "<<endl;
          for(i=0;i<n;i++){
                           cout<<b[i]<<" ";
                           }
          cout<<endl;
          cout<<"L'array in comune e': "<<endl;
          for(i=0;i<k;i++){
                 cout<<c[i]<<" ";
                 }
          cin>>ws;
          }
               

Splair
ti ringrazio per l'aiuto ma così facendo mi inserisce in c tutti gli elementi di b diversi da x...
scusami ma non avevo visto il post..
ora controllo e ti faccio sapere..
grazie..

Splair
grandissimo!!!!!
Grazie mille...

elgiovo
x non la uso più, facci caso. Il programma che ho inviato conta, per ogni elemento b, quanti elementi di a sono da questo diversi. Se tale numero è n, allora b non compare in a e viene messo in c.

Splair
si si l'ho capito..
è molto semplice ma mi ha messo in difficoltà..quasi me ne vergogno per la sua semplicità!!!! :-D
grazi ancora..

elgiovo
Niente... :wink:

Splair
Ciao ragazzi, mi sto esercitando per l'esame e mi sono bloccato su un esercizio a cui non riesco a trovare soluzione...
La traccia e':

Scrivere una funzione che riceve come parametro di ingresso/uscita la testa di una lista L1 di numeri interi e che modifica la lista eliminando gli elementi negativi. Ad esempio se L1=(-2,4,-5,6,-7,8) allora L1 dopo l'esecuzione sarà la lista (4,6,8).


Il mio listato e' questo:
#include <iostream>
using namespace std;
      struct nodo{
             int key;
             nodo *next;
             };
             
      typedef nodo *lista;
      
      
      void crea_lista(lista &testa);
      void ins_testa(lista &testa, int x);
      void ins_coda(lista &testa, int x);
      void stampa(lista testa);
      lista elimina(lista &testa);
      bool verifica(lista testa);
      
      int main(){
          lista l1=0;
          cout<<"CREAZIONE DI UNA LISTA: "<<endl;
          cout<<endl;
          crea_lista(l1);
          cout<<"La lista da te inserita e': "<<endl;
          stampa(l1);
          cout<<endl;
          if(verifica(l1)){
                 elimina(l1);
                 cout<<"La lista senza gli elementi negativi e' la seguente: "<<endl;
                 cout<<endl;
                 stampa(l1);
                 cout<<endl;
                 }
          else
              cout<<"La lista non contiene elementi negativi!"<<endl;
          cin>>ws;
              }
                 
      void crea_lista(lista &testa){
           int const FINE=-1;
           int x;
           cout<<"Inserisci -1 per terminare l'inserimento: "<<endl;
           do{
               cout<<"Inserisci elemento: "<<endl;
               cin>>x;
               if(x!=FINE)
                          ins_coda(testa, x);
               }while(x!=FINE);
           }
           
      void ins_coda(lista &testa, int x){
           nodo *p;
           if(testa==0)
                          ins_testa(testa, x);
           else{
                nodo *nuovo=new nodo;
                for(p=testa;p->next!=0;p=p->next);
                     nuovo->key=x;
                     nuovo->next=0;
                     p->next=nuovo;
                }
           }
           
      void ins_testa(lista &testa, int x){
           nodo *nuovo=new nodo;
           nuovo->key=x;
           nuovo->next=testa;
           testa=nuovo;
           }
           
      void stampa(lista testa){
           nodo *p;
           for(p=testa;p!=0;p=p->next){
                                       if(p->next!=0){
                                       cout<<p->key<<" --> " ;
                                       }
                                       else
                                       cout<<p->key<<" --> 0";
                                       
                                       }
                                       
           }
           
      bool verifica(lista testa){
           nodo*p;
           bool trovato=false;
           for(p=testa; p!=0&&!trovato;p=p->next){
                        if(p->key<0){
                                     trovato=true;
                                     }
                        }
                        return trovato;
           }
           
      lista elimina(lista &testa){
           nodo *p, *q;
           if(testa->key<0){
                      p=testa->next;
                      delete testa;
                      testa=p;
                      }
           else
               for(p=testa;p!=0;p=p->next){
                                           if(p->next->key<0){ //se due elementi negativi sono consecutivi il programma va in crash!!!!
                                                        q=p->next;  
                                                        p=q->next;
                                                        delete q;
                                                        
                                                        }
                                           }
               }


solo che questo listato non funziona completamente, cioè se l'elemento negativo è in testa lo elimina mentre se non è in testa non lo elimina, inoltre c'è il problema dell'elemento consegutivo...ringrazio chi mi aiuta! ciao
grazie mille..ciao

spassky
Curiosità: che esame è precisamente ?

Splair
Programmazione I....
perchè?

spassky
Così...
Non vedevo l'uso delle classi... e me lo son chiesto...

TomSawyer1
Mi aspettavo fosse Programmazione 2, tipo.

Perché la routine Elimina è di tipo lista? Poi non ho ben capito cosa vuoi fare con l'if dentro Elimina.

Splair
Perché la routine Elimina è di tipo lista?


bho!! :-D :-D è una cavolata che ho scritto..

l'if serve per vedere se il negativo è in testa (allora viene eliminata la testa e la nuova testa è l'elemento successivo) altrimenti devo collegare l'elemento precedente a quello da eliminare con quello successivo..ed è questo che non riesco a fare..

tecnos1
E poi dicono che gli ingegneri informatici non sanno programmare.... :wink:

Splair
bhe questa grandissima cavolata la potevi anche evitare!!!!!!
non capisco cosa centra con il topic...
facciamo così...
non considero proprio quello che hai detto che è meglio....

tecnos1
:-D :-D :-D

tecnos1
"Splair":
bhe questa grandissima cavolata la potevi anche evitare!!!!!!
non capisco cosa centra con il topic...
facciamo così...
non considero proprio quello che hai detto che è meglio....


E tu ne potevi evitare molte di più ( e sono con due Z le tue..), credimi!!!!!!!!!!!!!!
Fai come vuoi, comunque non era rivolta a te :lol:

Splair
nemmeno voglio stare a discutere con te...non ho tempo da perdere!
il topic non l'ho aperto per questo...
buona giornata ciao..

tecnos1
"Splair":
nemmeno voglio stare a discutere con te...non ho tempo da perdere!
il topic non l'ho aperto per questo...
buona giornata ciao..


Quoto tutto!

TomSawyer1
"Splair":
Perché la routine Elimina è di tipo lista?


bho!! :-D :-D è una cavolata che ho scritto..

l'if serve per vedere se il negativo è in testa (allora viene eliminata la testa e la nuova testa è l'elemento successivo) altrimenti devo collegare l'elemento precedente a quello da eliminare con quello successivo..ed è questo che non riesco a fare..


Mi sa che deve essere void. Ma se tu afai l'if in quel modo, allora lui non entra nell'else ed esce la routine. Per questo ti elimina l'elemento negativo solo se è in testa.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.