Trovate l'errore vi prego...C++
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:
Grazie a tutti...
ciao
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
Io ricontrollerei quel bool trovato. Così, appena diventa true vi rimane per tutto il resto del tempo. Prova a mettere
all'inizio del ciclo for che lo segue, in questo modo se trovato era true ridiventa false ad ogni iterazione.
bool trovato=false;
all'inizio del ciclo for che lo segue, in questo modo se trovato era true ridiventa false ad ogni iterazione.
Farò di meglio....
Questo programma funziona.
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; }
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..
scusami ma non avevo visto il post..
ora controllo e ti faccio sapere..
grazie..
grandissimo!!!!!
Grazie mille...
Grazie mille...
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.
si si l'ho capito..
è molto semplice ma mi ha messo in difficoltà..quasi me ne vergogno per la sua semplicità!!!!
grazi ancora..
è molto semplice ma mi ha messo in difficoltà..quasi me ne vergogno per la sua semplicità!!!!

grazi ancora..
Niente...

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:
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
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
Curiosità: che esame è precisamente ?
Programmazione I....
perchè?
perchè?
Così...
Non vedevo l'uso delle classi... e me lo son chiesto...
Non vedevo l'uso delle classi... e me lo son chiesto...
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.
Perché la routine Elimina è di tipo lista? Poi non ho ben capito cosa vuoi fare con l'if dentro Elimina.
Perché la routine Elimina è di tipo lista?
bho!!


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..
E poi dicono che gli ingegneri informatici non sanno programmare....

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....
non capisco cosa centra con il topic...
facciamo così...
non considero proprio quello che hai detto che è meglio....



"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

nemmeno voglio stare a discutere con te...non ho tempo da perdere!
il topic non l'ho aperto per questo...
buona giornata ciao..
il topic non l'ho aperto per questo...
buona giornata ciao..
"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!
"Splair":Perché la routine Elimina è di tipo lista?
bho!!![]()
è 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.