PDA

View Full Version : Programma in c++


Informatico Specializzato
07-06-2011, 11:24
Buongiorno a tutti,avrei un problemino con il seguente programma.
//Siano dati due vettori di uguale riempimento n ed un intero k.
//Si costruisca un vettore ogni elemento del quale abbia valore pari
//al maggiore fra i valori che si trovano nella stessa posizione in V1
//e V2.Se tali valori sono uguali,si memorizzi nell'omologa posizione di V3
// il valore comune.Si eliminino da V3 i valori minori di k e si stampi
//il vettore V3 risultante ed il numero di valori eliminati.

#include <iostream>
#include <stdlib.h>

using namespace std;

const int MAX_ELEM=100;
const int MAX_LUN=100;
typedef char stringa[MAX_LUN+1];

void input_array(int V[],int n,stringa nome_array);
void input(int V1[],int V2[],int &n);
void input_k(int &k);
void copia(int V1[],int V2[],int V3[],int n,int &n3);
bool elimina(int V[],int &n,int k);
void output(int V3[],int n3,int &c,int k,bool eliminato1);
void restart(char &risp);

int main()
{
char risp;
do{
int V1[MAX_ELEM];
int V2[MAX_ELEM];
int V3[MAX_ELEM];
int n;
int n3;
int k;
int c;
bool eliminato1;

input(V1,V2,n);
input_k(k);
copia(V1,V2,V3,n,n3);
eliminato1=elimina(V3,n3,k);
output(V3,n3,c,k,eliminato1);
restart(risp);
}while((risp=='s') || (risp=='S'));

system("PAUSE");
return 0;
}

void input_array(int V[],int n,stringa nome_array){
int i;
do{
if(n<0){
cout<<"Non puo'essere inserito un riempimento negativo"<<endl;}
if(n>MAX_ELEM){
cout<<"Non puo'essere inserito un riempimento maggiore di"<<" "<<MAX_ELEM;}
}while((n<0) || (n>MAX_ELEM));

for(i=0; i<n; i++){
cout<<"Inserire"<<" "<<nome_array<<"["<<i<<"]=";
cin>>V[i];
}
cout<<endl;
}

void input(int V1[],int V2[],int &n){
cout<<"Inserire il riempimento dei vettori"<<":";
cin>>n;
cout<<endl;

input_array(V1,n,"V1");
input_array(V2,n,"V2");
}

void input_k(int &k){
cout<<"Inserire il valore di k"<<":";
cin>>k;
cout<<endl;
}

void copia(int V1[],int V2[],int V3[],int n,int &n3){
int i;
n3=0;
for(i=0; i<n; i++){
if(V1[i]>V2[i]){
V3[n3++]=V1[i];
}
else{
V3[n3++]=V2[i];}
if(V1[i]==V2[i]){
V3[n3++]=V1[i];
}
}
}

bool elimina(int V[],int &n,int k){
int i=0;
int c=0;
bool eliminato=false;
for(i=0; i<n; i++){
if(V[i]<k){
eliminato=true;
c++;}
else V[i-c]=V[i];
}
n-=c;
return eliminato;
}

void output(int V3[],int n3,int &c,int k,bool eliminato1){
int i;
if(eliminato1==true){
cout<<"Il nuovo vettore e'"<<":";
for(i=0; i<n3; i++){
cout<<V3[i]<<" ";
}
cout<<endl;
cout<<"Numero valori eliminati"<<":"<<c<<endl;
}
else
cout<<"Non e'stato eliminato alcun valore"<<endl;

}

void restart(char &risp){
do{
cout<<"Si vuole ripetere il programma? (s/n)"<<":";
cin>>risp;
}while((risp!='s') && (risp!='S') && (risp!='n') && (risp!='N'));
}




Praticamente il programma funziona,solo che non riesco a dare in output il numero di valori eliminati.Grazie mille

Informatico Specializzato
09-06-2011, 18:43
Qualcuno sa come posso risolvere?

BlackShark92
09-06-2011, 21:45
Qualcuno sa come posso risolvere?

puoi inserire una variabile intera che inizializzi a 0. Ogni volta che il ciclo esegue una eliminazione, incrementi la variabile contatore di 1...alla fine ritorni il contatore

Informatico Specializzato
09-06-2011, 23:57
puoi inserire una variabile intera che inizializzi a 0. Ogni volta che il ciclo esegue una eliminazione, incrementi la variabile contatore di 1...alla fine ritorni il contatore

Infatti l'ho fatto,con la variabile c,ma sembra comunque non funzionare :-/

GByTe87
10-06-2011, 00:04
Si ma c non esce dalla funzione elimina(). Perchè non le fai restituire un int corrispondente al numero di eliminazioni, invece di un bool?

Informatico Specializzato
10-06-2011, 00:08
Si ma c non esce dalla funzione elimina(). Perchè non le fai restituire un int corrispondente al numero di eliminazioni, invece di un bool?

Come dovrei modificare?

ingegnetor
10-06-2011, 00:21
posso provare ad aiutarti però mi dovrsti spiegare bene il problema

Informatico Specializzato
10-06-2011, 00:23
posso provare ad aiutarti però mi dovrsti spiegare bene il problema

Allora la traccia l'ho scritta su,comunque non riesco a dare in output il numero di valori elementi eliminati di un array.

BlackShark92
10-06-2011, 14:07
Allora ho capito...tu nella funzione in cui elimini, aumenti sì il contatore, ma non lo "return" come valore della funzione...ti conviene non ritornare eliminato, ma dare un return c. Oppure nel prototipo della funzione passi anche un puntatore, che dichiarerai nel main, e quando lo passi alla funzione usi la chiamata per indirizzo con l'&. Così modifica il valore della variabile e hai un contatore a tutti gli effetti

Informatico Specializzato
10-06-2011, 14:26
Allora ho capito...tu nella funzione in cui elimini, aumenti sì il contatore, ma non lo "return" come valore della funzione...ti conviene non ritornare eliminato, ma dare un return c. Oppure nel prototipo della funzione passi anche un puntatore, che dichiarerai nel main, e quando lo passi alla funzione usi la chiamata per indirizzo con l'&. Così modifica il valore della variabile e hai un contatore a tutti gli effetti

Ho sostituito il return eliminato con return c ma non funziona comunque,per quanto riguarda i puntatori non devo studiarli in quanto non sono in programma.Comunque grazie mille per l'attenzione che stai dedicando al mio post.

BlackShark92
10-06-2011, 14:48
Ho sostituito il return eliminato con return c ma non funziona comunque,per quanto riguarda i puntatori non devo studiarli in quanto non sono in programma.Comunque grazie mille per l'attenzione che stai dedicando al mio post.

:boh: Hai cambiato anche il tipo di return della funzione?Ovvero da bool a int?

Informatico Specializzato
10-06-2011, 15:05
:boh: Hai cambiato anche il tipo di return della funzione?Ovvero da bool a int?

Sisi,non funzione comunque :-/

Informatico Specializzato
12-06-2011, 13:04
Credo di avere risolto solo parzialmente il mio problema,mi spiego meglio:
il programma ora funziona,ma solo,ad esempio,in questo caso:
V1=3,2,1,4,2
V2=1,3,2,1,7
k=4
V3=4,7
Numero di valori eliminati=3

Se ad esempio,metto:
V1=1,1,1,5,6
V2=1,1,1,7,8
k=4
V3=7,8
Numero valori eliminati=6 (quando invece dovrebbe essere 3).

Allego il mio programma modificato
//Siano dati due vettori di uguale riempimento n ed un intero k.
//Si costruisca un vettore ogni elemento del quale abbia valore pari
//al maggiore fra i valori che si trovano nella stessa posizione in V1
//e V2.Se tali valori sono uguali,si memorizzi nell'omologa posizione di V3
// il valore comune.Si eliminino da V3 i valori minori di k e si stampi
//il vettore V3 risultante ed il numero di valori eliminati.

#include <iostream>
#include <stdlib.h>

using namespace std;

const int MAX_ELEM=100;
const int MAX_LUN=100;
typedef char stringa[MAX_LUN+1];

void input_array(int V[],int n,stringa nome_array);
void input(int V1[],int V2[],int &n);
void input_k(int &k);
void copia(int V1[],int V2[],int V3[],int n,int &n3);
bool elimina(int V[],int &n,int k,int &c);
void output(int V3[],int n3,int &c,int k,bool eliminato1);
void restart(char &risp);

int main()
{
char risp;
do{
int V1[MAX_ELEM];
int V2[MAX_ELEM];
int V3[MAX_ELEM];
int n;
int n3;
int k;
int c;
bool eliminato1;

input(V1,V2,n);
input_k(k);
copia(V1,V2,V3,n,n3);
eliminato1=elimina(V3,n3,k,c);
output(V3,n3,c,k,eliminato1);
restart(risp);
}while((risp=='s') || (risp=='S'));

system("PAUSE");
return 0;
}

void input_array(int V[],int n,stringa nome_array){
int i;
for(i=0; i<n; i++){
cout<<"Inserire"<<" "<<nome_array<<"["<<i<<"]=";
cin>>V[i];
}
cout<<endl;
}

void input(int V1[],int V2[],int &n){
do{
cout<<"Inserire il riempimento dei vettori"<<":";
cin>>n;
cout<<endl;
if(n<0){
cout<<"Non puo'essere inserito un riempimento negativo"<<endl;}
if(n>MAX_ELEM){
cout<<"Non puo'essere inserito un riempimento maggiore di"<<" "<<MAX_ELEM<<endl;}
}while((n<0) || (n>MAX_ELEM));

input_array(V1,n,"V1");
input_array(V2,n,"V2");
}

void input_k(int &k){
cout<<"Inserire il valore di k"<<":";
cin>>k;
cout<<endl;
}

void copia(int V1[],int V2[],int V3[],int n,int &n3){
int i;
n3=0;
for(i=0; i<n; i++){
if(V1[i]>V2[i]){
V3[n3++]=V1[i];
}
else{
V3[n3++]=V2[i];}
if(V1[i]==V2[i]){
V3[n3++]=V1[i];
}
}
}

bool elimina(int V[],int &n,int k,int &c){
int i=0;
c=0;
bool eliminato=false;
for(i=0; i<n; i++){
if(V[i]<k){
eliminato=true;
c++;}
else V[i-c]=V[i];
}
n-=c;
return eliminato;
}

void output(int V3[],int n3,int &c,int k,bool eliminato1){
int i;
if(eliminato1==true){
cout<<"Il nuovo vettore e'"<<":";
for(i=0; i<n3; i++){
cout<<V3[i]<<" ";
}
cout<<endl;
cout<<"Numero valori eliminati"<<":"<<c<<endl;
}
else
cout<<"Non e'stato eliminato alcun valore"<<endl;

}

void restart(char &risp){
do{
cout<<"Si vuole ripetere il programma? (s/n)"<<":";
cin>>risp;
}while((risp!='s') && (risp!='S') && (risp!='n') && (risp!='N'));
}

Informatico Specializzato
12-06-2011, 14:17
Credo di avere risolto solo parzialmente il mio problema,mi spiego meglio:
il programma ora funziona,ma solo,ad esempio,in questo caso:
V1=3,2,1,4,2
V2=1,3,2,1,7
k=4
V3=4,7
Numero di valori eliminati=3

Se ad esempio,metto:
V1=1,1,1,5,6
V2=1,1,1,7,8
k=4
V3=7,8
Numero valori eliminati=6 (quando invece dovrebbe essere 3).

Allego il mio programma modificato
//Siano dati due vettori di uguale riempimento n ed un intero k.
//Si costruisca un vettore ogni elemento del quale abbia valore pari
//al maggiore fra i valori che si trovano nella stessa posizione in V1
//e V2.Se tali valori sono uguali,si memorizzi nell'omologa posizione di V3
// il valore comune.Si eliminino da V3 i valori minori di k e si stampi
//il vettore V3 risultante ed il numero di valori eliminati.

#include <iostream>
#include <stdlib.h>

using namespace std;

const int MAX_ELEM=100;
const int MAX_LUN=100;
typedef char stringa[MAX_LUN+1];

void input_array(int V[],int n,stringa nome_array);
void input(int V1[],int V2[],int &n);
void input_k(int &k);
void copia(int V1[],int V2[],int V3[],int n,int &n3);
bool elimina(int V[],int &n,int k,int &c);
void output(int V3[],int n3,int &c,int k,bool eliminato1);
void restart(char &risp);

int main()
{
char risp;
do{
int V1[MAX_ELEM];
int V2[MAX_ELEM];
int V3[MAX_ELEM];
int n;
int n3;
int k;
int c;
bool eliminato1;

input(V1,V2,n);
input_k(k);
copia(V1,V2,V3,n,n3);
eliminato1=elimina(V3,n3,k,c);
output(V3,n3,c,k,eliminato1);
restart(risp);
}while((risp=='s') || (risp=='S'));

system("PAUSE");
return 0;
}

void input_array(int V[],int n,stringa nome_array){
int i;
for(i=0; i<n; i++){
cout<<"Inserire"<<" "<<nome_array<<"["<<i<<"]=";
cin>>V[i];
}
cout<<endl;
}

void input(int V1[],int V2[],int &n){
do{
cout<<"Inserire il riempimento dei vettori"<<":";
cin>>n;
cout<<endl;
if(n<0){
cout<<"Non puo'essere inserito un riempimento negativo"<<endl;}
if(n>MAX_ELEM){
cout<<"Non puo'essere inserito un riempimento maggiore di"<<" "<<MAX_ELEM<<endl;}
}while((n<0) || (n>MAX_ELEM));

input_array(V1,n,"V1");
input_array(V2,n,"V2");
}

void input_k(int &k){
cout<<"Inserire il valore di k"<<":";
cin>>k;
cout<<endl;
}

void copia(int V1[],int V2[],int V3[],int n,int &n3){
int i;
n3=0;
for(i=0; i<n; i++){
if(V1[i]>V2[i]){
V3[n3++]=V1[i];
}
else{
V3[n3++]=V2[i];}
if(V1[i]==V2[i]){
V3[n3++]=V1[i];
}
}
}

bool elimina(int V[],int &n,int k,int &c){
int i=0;
c=0;
bool eliminato=false;
for(i=0; i<n; i++){
if(V[i]<k){
eliminato=true;
c++;}
else V[i-c]=V[i];
}
n-=c;
return eliminato;
}

void output(int V3[],int n3,int &c,int k,bool eliminato1){
int i;
if(eliminato1==true){
cout<<"Il nuovo vettore e'"<<":";
for(i=0; i<n3; i++){
cout<<V3[i]<<" ";
}
cout<<endl;
cout<<"Numero valori eliminati"<<":"<<c<<endl;
}
else
cout<<"Non e'stato eliminato alcun valore"<<endl;

}

void restart(char &risp){
do{
cout<<"Si vuole ripetere il programma? (s/n)"<<":";
cin>>risp;
}while((risp!='s') && (risp!='S') && (risp!='n') && (risp!='N'));
}




Ho risolto,grazie mille a tutti !!!!