[C++]esercizio array confronta aree e perimetri rettangoli

di il
3 risposte

[C++]esercizio array confronta aree e perimetri rettangoli

Ciao a tutti, nonostante abbia postato poco, seguo spesso questo forum e quindi mi sento in dovere di ringraziarvi per i numerosi aiuti che, anche inconsapevolmente mi avete dato

detto ciò... domani devo andare a sostenere l'esame di informatica e avrei un esercizio che non riesco a completare, da sottoporvi...
mi rendo conto che forse è un pò tardi, ma speravo di riuscire a non scocciarvi

di seguito copio il testo dell'esercizio e i sottoprogrammi che ho scritto:


Scrivere un programma C++ che legge dal file "dati.txt" (da console per chi non fosse in grado di gestire I/O su file) 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:
1. calcolare e stampare a video la somma dei perimetri dei rettangoli dell'insieme
2. 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])



e i sottoprogrammi:

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 calcolaArea(int v1x, int v1y, int v2x, int v2y) {
    int area;
    
    area = abs((v2x - v1x) * (v2y - v1y));
    return area;
}

int calcolaPerimetro(int rettangoli[N][4], int i) {
    int perimetro;
    
    perimetro = abs(((rettangoli[i][2]) - rettangoli[i][0]* 2) + ((rettangoli[i][3] - rettangoli[i][1]) * 2));
    return perimetro;
}

int calcolaPerimetroTotale(int rettangoli[N][4]) {
    int perimetroTotale;
    
    for (i<0; i=N; i++) {
        perimetroTotale += abs(((rettangoli[i][2]) - rettangoli[i][0]* 2) + ((rettangoli[i][3] - rettangoli[i][1]) * 2));
    }
    return perimetroTotale;
}

bool stessaArea(int rettangoli[N][4], int i, int j) {
    bool stessaArea;
    int x1i, y1i, x2i y2i, x1j, y1j, x2j y2j;
    
    x1i = rettangoli[i][0];
    y1i = rettangoli[i][1];
    x2i = rettangoli[i][2];
    y2i = rettangoli[i][3];
    x1j = rettangoli[j][0];
    y1j = rettangoli[j][1];
    x2j = rettangoli[j][2];
    y2j = rettangoli[j][3];
    
    if (calcolaArea(x1i, y1i, x2i, y2i) == calcolaArea(x1j, y1j, x2j, y2j)) {
        stessaArea=true;                     
    }
    return stessaArea;
}

ora...
ammesso che tutti i sottoprogrammi siano corretti, ho qualche dubbio su calcolaPerimetroTotale e stessaArea, spero che qualcuno di voi mi aiuti a capire il funzionamento del programma principale, principalmente la parte in cui devo uguagliare le aree (la prima con l'ultima, la seconda con la penultima, ecc), eventualmente anche con l'aiuto dei codici che scrivereste.
grazie ancora!

3 Risposte

  • Re: [C++]esercizio array confronta aree e perimetri rettangoli

    In tutte e due le funzioni manca l'inzializzazione delle variabili. quindi perimetroTotale è da inizializzare a 0 e stessaArea è da inizializzare a false. Dopo la modifica e le opportune prove possiamo passare a verificare il programma principale che sostanzialmente dice di fare le verifiche del i-esimo con (N-i-1)-esimo elemento.
    Il for che scandisce tutto andrà fino a N/2.
  • Re: [C++]esercizio array confronta aree e perimetri rettangoli

    Grazie per la dritta! ho fatto varie correzioni oltre a quelle che mi avevi consigliato (mi ero perso due virgole e una parentesi tonda) e ora il programma funziona... copio il codice perchè ci sono tuttavia due cose che non mi sono ben chiare:
    #include <iostream>
    #include <math.h>
    using namespace std;
    
    const int N = 4;
    
    int calcolaArea(int v1x, int v1y, int v2x, int v2y);
    int calcolaPerimetro(int rettangoli[N][4], int i);
    int calcolaPerimetroTotale(int rettangoli[N][4]);
    bool stessaArea(int rettangoli[N][4], int i, int j);
    void leggiRettangoli(int rettangoli[N][4]);
    void stampaRettangoli(int rettangoli[N][4]);
    
    
    int main() {
        int r[N][4]; 
        int i, j;
        int contatore;
        int perimetroTotale;
        contatore = 0;
        perimetroTotale = 0;
        
        leggiRettangoli(r);
        stampaRettangoli(r);
    
        for (i=0; i<N; i++) {
            perimetroTotale += calcolaPerimetro(r, i);
        }
        
        cout << "il perimetro totale misura: " << perimetroTotale << endl;
    
        for (i=0; i<(N/2); i++) {
            int k;
            k=N-i-1;
            if (stessaArea(r, i, k) == true) {
                contatore++;
            }
        }
        
        if (contatore == (N/2)) {
            cout << "condizione verificata per tutti i rettangoli" << endl;
        } else {
            cout << N - contatore << " rettangoli non soddisfano la condizione" << endl;
        }
        
        system ("pause");
    }
    
    
    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 calcolaArea(int v1x, int v1y, int v2x, int v2y) {
        int area;
        
        area = abs((v2x - v1x) * (v2y - v1y));
        return area;
    }
    
    int calcolaPerimetro(int rettangoli[N][4], int i) {
        int perimetro;
        
        perimetro = abs(((rettangoli[i][2] - rettangoli[i][0]) * 2) + ((rettangoli[i][3] - rettangoli[i][1]) * 2));
        return perimetro;
    }
    
    int calcolaPerimetroTotale(int rettangoli[N][4]) {
        int i;
        int perimetroTotale;
        perimetroTotale = 0;
        
        for (i<0; i=N; i++) {
            perimetroTotale += abs(((rettangoli[i][2]) - rettangoli[i][0]* 2) + ((rettangoli[i][3] - rettangoli[i][1]) * 2));
        }
        return perimetroTotale;
    }
    
    bool stessaArea(int rettangoli[N][4], int i, int j) {
        bool stessaArea;
        int x1i, y1i, x2i, y2i, x1j, y1j, x2j, y2j;
        stessaArea = false;
        
        x1i = rettangoli[i][0];
        y1i = rettangoli[i][1];
        x2i = rettangoli[i][2];
        y2i = rettangoli[i][3];
        x1j = rettangoli[j][0];
        y1j = rettangoli[j][1];
        x2j = rettangoli[j][2];
        y2j = rettangoli[j][3];
        
        if (calcolaArea(x1i, y1i, x2i, y2i) == calcolaArea(x1j, y1j, x2j, y2j)) {
            stessaArea=true;                     
        }
        return stessaArea;
    }
    


    la prima: non riesco ad usare il sottoprogramma calcolaPerimetroTotale... ho bypassato il problema, ma se ci fosse un modo per usare anche quel sottoprogramma forse sarebbe meglio...

    la seconda: come mi hai consigliato, il ciclo for nel programma principale deve andare da 0 a N/2... ho fatto così ed effettivamente è vero, ma mi potresti spiegare il perchè? credo che nei miei precedenti tentativi l'errore fosse proprio quello, ora l'ho corretto ma non ho ben capito il perchè! grazie ancora!
  • Re: [C++]esercizio array confronta aree e perimetri rettangoli

    
        for (i=0; i<(N/2); i++) {
            int k;
            k=N-i-1;
    
    Cerca di capirlo da solo , sostituisci i valori per ogni valori i-esimo ( fai un esempio con N = 7 ) e vedi cosa succede quando è N/2 e quando è solo N . ( il primo deve confrontarsi con l' ultimo ec... fino ad arrivare in mezzo , quindi i non deve proseguire fino ad N ma fino ad N/2 ) .

    la funzione calcolaPerimetroTotale non può chiamare la funzione calcolaPerimetro? identico a quello che hai fatto nel main solo che lo metti nella funzione calcolaPerimetroTotale
Devi accedere o registrarti per scrivere nel forum
3 risposte