Problema con una condizione

di il
8 risposte

Problema con una condizione

Scrivere un programma C++ i dati relativi ad un insieme di 100 rettangoli con i lati paralleli agli assi cartesiani. Ogni rettangolo e' rappresentato da due coppie di interi, che rappresentano le coordinate cartesiane dei vertici in basso a sinistra e in alto a destra. I dati relativi all'insieme dei rettangoli devono essere memorizzati in un opportuno array bidimensionale 100x4.
Il programma deve:
calcolare e stampare a video la somma dei perimetri dei rettangoli dell'insieme
verificare che l'area del primo rettangonolo sia uguale all'area dell'ultimo rettangolo, l'area del secondo rettangolo sia uguale all'area del penultimo rettangolo, e cosi' via. Se la condizione e' verificata per tutti i rettangoli, il programma deve stampare a video il messaggio "Condizione verificata per tutti i rettangoli"; altrimenti, il programma deve stampare il numero di rettangoli per i quali la condizione non e' verificata (se ad esempio la condizione non e' verificata perche' solo il primo e l'ultimo rettangolo hanno area diversa, il programma deve stampare "2 rettangoli non soddisfano la condizione").
Per una buona organizzazione del codice devono essere definiti e utilizzati i seguenti sottoprogrammi (dove N e' una opportuna costante simbolica):
int calcolaArea(int v1x, int v1y, int v2x, int v2y) ritorna il valore dell'area del rettangolo le cui coordinate dei vertici sono passate come parametro
int calcolaPerimetro(int rettangoli[N][4], int i) ritorna il valore del perimetro dell'i-esimo rettangolo tra quelli memorizzati nell'array bidimensionale passato come parametro
int calcolaPerimetroTotale(int rettangoli[N][4]) ritorna il valore della somma di tutti i perimetri dei rettangolo memorizzati nell'array bidimensionale passato come parametro
bool stessaArea(int rettangoli[N][4], int i, int j) ritorna true se l'area del rettangolo i e' uguale a quella del rettangolo j nell'array bidimensionale passato come parametro
void leggiRettangoli(int rettangoli[N][4])
void stampaRettangoli(int rettangoli[N][4])

questo è il testo dell esercizio.. il mio problema è che non riesco a capire come far funzionare il sottoprogramma stessaArea ; metto a confronto le aree ma non funziona ne il contatore e ne la condizione
#include <iostream>

using namespace std;

const int N=4;

void leggiRettangoli(int rettangoli[N][4]) {
     int i;
     for(i=0;i<N;i++) {
     cout << "------------------------------------------";
     cout << "rettangolo" << i << endl;
     cout << "inserire le coordinate x e y del primo vertice: ";
     cin>> rettangoli [i][0];
     cin>> rettangoli [i][1];
     cout << "inserire le coordinate x e y del secondo vertice: ";
     cin>> rettangoli [i][2];
     cin>> rettangoli [i][3];
}
return;
}


void stampaRettangoli( int rettangoli[N][4]) {
     int i;
     for(i=0;i<N;i++) {
     cout << "-------------------------------------------";
     cout << " rettangolo " << i << " vertici: " << endl;
     cout << "\t(" << rettangoli[i][0] << ",\t" << rettangoli[i][1] << ")";
     cout << "\t(" << rettangoli[i][2] << ",\t" << rettangoli[i][3] << ")";
     cout << endl;
     }
     return;
     }
     
int calcolaPerimetro (int rettangoli[N][4] , int i) {
    int perimetro=0;
    int base[N], altezza[N];
    int j;
for(j=0;j<N;j++) {
  base[j] = rettangoli[i][2] - rettangoli[i][0];
 altezza[j] = rettangoli[i][3] - rettangoli[i][1];                
perimetro =(base[j]+ altezza[j]+base[j]+altezza[j]);

}
return perimetro;
}
void stampavettorePerimetri( int vperimetri[N]) {
 int i;
 
 for(i=0;i<N;i++) {
                  
 cout << vperimetri[i] << "\t" ;
}
return;
}    

int calcolaPerimetroTotale ( int rettangoli [N][4]) {
    int perimetroTot=0;
    int i;
    int base [N] , altezza[N];
for(i=0;i<N;i++){
 base[i] = rettangoli[i][2] - rettangoli[i][0];
 altezza[i] = rettangoli[i][3] - rettangoli[i][1];          
perimetroTot+=(base[i]+altezza[i]+base[i]+altezza[i]);

}
return perimetroTot;
}
int calcolaArea (int v1x, int v1y, int v2x, int v2y) {
    int base, altezza;
    int area;
    base= v2x-v1x;
    altezza=v2y-v1y;
    area= base*altezza;
    
return area;
}
void stampaArea (int varea[N]) {
 int i;    
cout << " valori area " << endl;
 for(i=0;i<N;i++) {
                 
cout << varea[i] << "\t";
}
return;
}   

bool stessaArea( int rettangoli[N][4], int i, int j) {
     j=N-1-i;
     bool uguale= true;
     int varea[N];
     int conta=0;
for(i=0;i<N;i++) {
                
if(varea[i]!=varea[j]) {

   uguale=false;
   conta++;
}
}
return uguale;
}

int main () {
    int rettangoli[N][4];
    int i, j;
    int vperimetri[N];
    int v1x, v2x, v1y, v2y;
    int varea[N];
    int conta =0;
leggiRettangoli(rettangoli);
stampaRettangoli(rettangoli);

for(i=0;i<N;i++) {
                 
vperimetri[i] = calcolaPerimetro(rettangoli , i);
}
cout<< endl;

cout << " valori perimetri" << endl;
stampavettorePerimetri(vperimetri);

cout << endl;

cout<< " il perimetro totale : " << calcolaPerimetroTotale(rettangoli) << endl;


for(i=0;i<N;i++) {

v1x= rettangoli[i][0];
v2x= rettangoli[i][2];
v1y= rettangoli[i][1];
v2y= rettangoli[i][3];

varea[i]=calcolaArea(v1x, v1y, v2x, v2y);
}

stampaArea(varea);

if(stessaArea(rettangoli[N][4], i, j)== true) {

cout << " condizione soddisfatta " << endl;

}else {
      
cout << conta << " rettangoli non soddisfano la condizione " << endl;

}

system("pause");
}

8 Risposte

  • Re: Problema con una condizione

    Prendiamo solo il codice di quella funzione
    
    bool stessaArea( int rettangoli[N][4], int i, int j) {
         j=N-1-i;
         bool uguale= true;
         int varea[N];
         int conta=0;
    
    for(i=0;i<N;i++) {
                    
    if(varea[i]!=varea[j]) {
    
       uguale=false;
       conta++;
    }
    }
    return uguale;
    }
    
    Spiega cosa contiene il vettore

    int varea[N];

    dato che non viene mai riempito.
  • Re: Problema con una condizione

    oregon ha scritto:


    Prendiamo solo il codice di quella funzione
    
    bool stessaArea( int rettangoli[N][4], int i, int j) {
         j=N-1-i;
         bool uguale= true;
         int varea[N];
         int conta=0;
    
    for(i=0;i<N;i++) {
                    
    if(varea[i]!=varea[j]) {
    
       uguale=false;
       conta++;
    }
    }
    return uguale;
    }
    
    Spiega cosa contiene il vettore

    int varea[N];

    dato che non viene mai riempito.
    dovrebbe contenere i valori delle aree, ma da quanto ho capito non li contiene, quindi come posso fare per riempirlo? devo richiamare il sottoprogramma dove sono contenuti tutti i valori delle aree?
  • Re: Problema con una condizione

    Gli argomenti della funzione sono

    int rettangoli[N][4], int i, int j

    Devi partire da questi utilizzandoli all'interno della funzione stessaArea
  • Re: Problema con una condizione

    oregon ha scritto:


    Gli argomenti della funzione sono

    int rettangoli[N][4], int i, int j

    Devi partire da questi utilizzandoli all'interno della funzione stessaArea
    i e j dovrei averli usati in modo corretto.
    rimane il problema di rettangoli[N][4] come lo utilizzo? potresti darmi una dritta?
  • Re: Problema con una condizione

    Ti sto dando delle dritte, solo che devi ragionare.

    Cosa è rettangoli[N][4] ? Cosa contiene ?

    Dato che nel main hai già calcolato le aree dei rettangoli (nel vettore varea) perché non passi questo vettore alla funzione (come hai fatto per la stampaarea)?

    Ma l'hai scritto tu il codice?
  • Re: Problema con una condizione

    oregon ha scritto:


    Ti sto dando delle dritte, solo che devi ragionare.

    Cosa è rettangoli[N][4] ? Cosa contiene ?

    Dato che nel main hai già calcolato le aree dei rettangoli (nel vettore varea) perché non passi questo vettore alla funzione (come hai fatto per la stampaarea)?

    Ma l'hai scritto tu il codice?
    si il codice l ho scritto io infatti è un po' un casino xD
    bool stessaArea( int rettangoli[N][4], int i, int j) {
         j=N-1-i;
         bool uguale= true;
         int varea[N];
         int conta=0;
        
    for(i=0;i<N;i++) {
           v1x= rettangoli[i][0];
           v2x= rettangoli[i][2];
           v1y= rettangoli[i][1];
           v2y= rettangoli[i][3];   
           varea[i]= calcolaArea ( v1x, v1y, v2x, v2y);    
    if(varea[i]!=varea[j]) {
    
       uguale=false;
       conta++;
    }
    }
    return uguale;
    }
    ho riscritto in questo modo, cosi dovrei assegnare dei valori al vettore varea anche in questa funzione
  • Re: Problema con una condizione

    I valori di varea li hai già calcolati prima nel main ... passa il vettore che avevi già utilizzato (come per stampaarea)
  • Re: Problema con una condizione

    oregon ha scritto:


    I valori di varea li hai già calcolati prima nel main ... passa il vettore che avevi già utilizzato (come per stampaarea)
    sarà che è da un po che sono su questo esercizio e il mio cervello sta fondendo
    ma non capisco non va bene come ho scritto sopra?
Devi accedere o registrarti per scrivere nel forum
8 risposte