C++ array esercizio spezzata

di il
5 risposte

C++ array esercizio spezzata

Ciao a tutti!
sperando di non infrangere alcuna regola provo a chiedervi una mano su questo esercizio sugli array che mi è stato proposto...
credo di sbagliare qualcosa nel primo sottoprogramma void leggiSpezzata(int spezzata[N][2], int &numPunti)

ad ogni modo posto il testo e la mia soluzione, se qualcuno sarà così gentile da farmi capire i miei errori gliene sarò più che grato altrimenti ringrazio comunque tutti coloro che hanno perso tempo a leggere il mio post

TESTO

scrivere un programma C++ che legga da tastiera/file i dati relativi ad una spezzata nel piano cartesiano, ne calcola la lunghezza, verifica se la spezzata si estende su tutti e quattro i quadranti del piano cartesiano.
si rappresenti la spezzata tramite:
un array bidimensionale N*2 (con N arbitrariamente grande) dove ogni riga rappresenta le coordinate x e y di un punto
un intero che indica il numero di punti che compongono la spezzata (ovviamente questo intero non può essere maggiore di N)
per una buona organizzazione del codice devono essere definiti e usati i seguenti sottoprogrammi:
void leggiSpezzata(int spezzata[N][2], int &numPunti)
legge la spezzata e la memorizza nelle variabili passate come parametro. la lettura si interrompe quando vengono immessi due punti consecutivi con le stesse coordinate
void stampaSpezzata(int spezzata[N][2], int numPunti)
stampa a video la spezzata passata come parametro
float calcolaLunghezza(int spezzata[N][2], int numPunti)
calcola la lunghezza della spezzata passata come parametro
int numeroQuadranti(int spezzata[N][2], int numPunti)
calcola in quanti quadranti si estende la spezzata passata come parametro

#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;

const int N = 5;

void leggiSpezzata(int spezzata[N][2], int &numPunti);
void stampaSpezzata(int spezzata[N][2], int numPunti);
float calcolaLunghezza(int spezzata[N][2], int numPunti);
int numeroQuadranti(int spezzata[N][2], int numPunti);

int main() {
    int s[N][2];
    int n;
    
    leggiSpezzata(s, n);
    stampaSpezzata(s, n);
    
    cout << calcolaLunghezza(s, n) << endl;
    
    if (numeroQuadranti(s, n) == 4) {
        cout << "condizione soddisfatta" << endl;
    } else {
        cout << "condizione non soddisfatta" << endl;
    }
    system("pause");
}

void leggiSpezzata(int spezzata[N][2], int &numPunti) {
    bool continua;
    continua = true;
    numPunti=0;
    while (continua == true) {
        cin >> spezzata[N][2];
        numPunti++;
        if ((spezzata[N][0]==spezzata[N+1][0]) && (spezzata[N][1]==spezzata[N+1][1]))
        continua = false;
    }
    return;
}

void stampaSpezzata(int spezzata[N][2], int &numPunti) {
    int i;
    for (i=0; i<numPunti; i++) {
        cout << spezzata[i][2] << "\t";
    }
    cout << endl;
    return;
}

float calcolaLunghezza(int spezzata[N][2], int &numPunti) {
    int i;
    float lunghezza;
    lunghezza = 0;
    for (i=0; i<numPunti; i++) {
        lunghezza+=sqrt(((spezzata[i+1][0]-spezzata[i][0])*(spezzata[i+1][0]-spezzata[i][0]))+((spezzata[i+1][1]-spezzata[i][1])*(spezzata[i+1][1]-spezzata[i][1])));
    }
    return lunghezza;
}

int numeroQuadranti(int spezzata[N][2], int &numPunti) {
    int i;
    int numeroQ;
    int q1, q2, q3, q4;
    numeroQ = 0;
    q1=0;
    q2=0;
    q3=0;
    q4=0;
    for (i=0; i<numPunti; i++) {
        if((spezzata[i][0]>0)&&(spezzata[i][1]>0)) {
            q1++;
        }
        if((spezzata[i][0]<0)&&(spezzata[i][1]>0)) {
            q2++;
        }
        if((spezzata[i][0]<0)&&(spezzata[i][1]<0)) {
            q3++;
        }
        if((spezzata[i][0]>0)&&(spezzata[i][1]<0)) {
            q4++;
        }
    }
    if ((q1==0) && (q2==0) && (q3==0) && (q4==0)) {
        numeroQ = 0;
    }
    if ((q1!=0) && (q2!=0) && (q3!=0) && (q4!=0)) {
        numeroQ = 4;
    }
    if ((q1!=0) && (q2==0) && (q3==0) && (q4==0)) {
        numeroQ = 1;
    }
    if ((q1==0) && (q2!=0) && (q3==0) && (q4==0)) {
        numeroQ = 1;
    }
    if ((q1==0) && (q2==0) && (q3!=0) && (q4==0)) {
        numeroQ = 1;
    }
    if ((q1==0) && (q2==0) && (q3==0) && (q4!=0)) {
        numeroQ = 1;
    }
    if ((q1!=0) && (q2!=0) && (q3==0) && (q4==0)) {
        numeroQ = 2;
    }
    if ((q1!=0) && (q2==0) && (q3!=0) && (q4==0)) {
        numeroQ = 2;
    }
    if ((q1!=0) && (q2==0) && (q3==0) && (q4!=0)) {
        numeroQ = 2;
    }
    if ((q1==0) && (q2!=0) && (q3!=0) && (q4==0)) {
        numeroQ = 2;
    }
    if ((q1==0) && (q2!=0) && (q3==0) && (q4!=0)) {
        numeroQ = 2;
    }
    if ((q1==0) && (q2==0) && (q3!=0) && (q4!=0)) {
        numeroQ = 2;
    }
    if ((q1!=0) && (q2!=0) && (q3!=0) && (q4==0)) {
        numeroQ = 3;
    }
    if ((q1!=0) && (q2!=0) && (q3==0) && (q4!=0)) {
        numeroQ = 3;
    }
    if ((q1!=0) && (q2==0) && (q3!=0) && (q4!=0)) {
        numeroQ = 3;
    }
    if ((q1==0) && (q2!=0) && (q3!=0) && (q4!=0)) {
        numeroQ = 3;
    }
    return numeroQ;
}

che sbaglio?

5 Risposte

  • Re: C++ array esercizio spezzata

    Ma cosa sbagli dovresti dircelo per primo tu.

    Se vuoi avere qualche risposta, non lasciare tutto il lavoro a chi ti risponde.

    Cosa ottieni?

    Cosa dovresti ottenere?
  • Re: C++ array esercizio spezzata

    Eh, pare facile capire dove sia l'errore!

    ho un pò modificato il codice, prendiamo uno ad uno i singoli sottoprogrammi:

    void leggiSpezzata(int spezzata[N][2], int &numPunti)
    void leggiSpezzata(int spezzata[N][2], int &numPunti) {
        int i;
        bool continua;
        continua = true;
        numPunti=0;
        while (continua == true) {
            for (i=0; i<N; i++) {
                cin >> spezzata[i][0];
                cin >> spezzata[i][1];
                numPunti++;
                if ((spezzata[i][0]==spezzata[i+1][0]) && (spezzata[i][1]==spezzata[i+1][1])) {
                    continua = false;
                }
            }
            if (numPunti>=N) {
                continua = false;
            }
        }
        return;
    }
    assegnato un numero intero costante N, nel mio caso N=5, dovrebbe leggere al massimo le coordinate di 5 punti, fermandosi prima se vengono inseriti due punti consecutivi con coordinate uguali (la X del precedente è uguale alla X del successivo e la Y del precedente è uguale alla Y del successivo) e contare quanti punti sono stati inseriti.
    in ogni caso il numero di punti inseriti non potrà essere maggiore di N=5.

    visto che non so di preciso quanti cicli dovrà fare (so che al massimo saranno N ma potrebbero anche essere meno) ho pensato di usare un while con una variabile bandiera inizializzata a true che sarà false (e quindi farà uscire dal ciclo) quando numPunti >= N e quando (spezzata[0]==spezzata[i+1][0]) && (spezzata[1]==spezzata[i+1][1])
    in realtà non sono convintissimo sull'utilità del ciclo for dentro il while, scritto come l'ho scritto io, ora come ora se non interpreto male una volta iniziato il while si entra dentro il ciclo for che si ripete 5 volte, ad ogni incremento di i, che corrisponde quindi all'inserimento delle coordinate di un punto, si incrementa anche il contatore numPunti di un'unità, se poi trova verificata la condizione dei punti consecutivi uguali fra loro dovrebbe uscire dal ciclo while essendoci un bel continua = false, stessa cosa quando il contatore numPunti è >= N.
    sono indeciso se inizializzare i valori X e Y dei primi due punti della spezzata a 0 perchè ora come ora il programma, al primo ciclo non saprebbe con che confrontarli (se io ancora non ho inserito i valori delle coordinate del primo punto come faccio a confrontarle con quelle del secondo che a maggior ragione ancora non ho inserito?). spero di essere stato chiaro su questo punto.

    secondo sottoprogramma:

    void stampaSpezzata(int spezzata[N][2], int &numPunti)

    void stampaSpezzata(int spezzata[N][2], int &numPunti) {
        int i;
        for (i=0; i<numPunti; i++) {
            cout << spezzata[i][0] << "\t";
            cout << spezzata[i][1] << endl;
        }
        cout << endl;
        return;
    }
    sinceramente non credo ci siano molti errori qua, legge gli N punti di una spezzata in cui N = numPunti trovato nel sottoprogramma precedente.


    terzo sottoprogramma:

    float calcolaLunghezza(int spezzata[N][2], int &numPunti)

    float calcolaLunghezza(int spezzata[N][2], int &numPunti) {
    int i;
    float lunghezza;
    lunghezza = 0;
    for (i=0; i<numPunti; i++) {
    lunghezza+=sqrt(((spezzata[i+1][0]-spezzata[0])*(spezzata[i+1][0]-spezzata[0]))+((spezzata[i+1][1]-spezzata[1])*(spezzata[i+1][1]-spezzata[1])));
    }
    return lunghezza;
    }

    qua a meno che non abbia sbagliato gli indici degli array non credo ci siano grossi errori (almeno spero eh)
    calcola la lunghezza della spezzata usando la formula della distanza fra due punti e ritorna il risultato "lughezza"


    quarto e ultimo sottoprogramma:

    int numeroQuadranti(int spezzata[N][2], int &numPunti)

    int numeroQuadranti(int spezzata[N][2], int &numPunti) {
        int i;
        int numeroQ;
        int q1, q2, q3, q4;
        numeroQ = 0;
        q1=0;
        q2=0;
        q3=0;
        q4=0;
        for (i=0; i<numPunti; i++) {
            if((spezzata[i][0]>0)&&(spezzata[i][1]>0)) {
                q1++;
            }
            if((spezzata[i][0]<0)&&(spezzata[i][1]>0)) {
                q2++;
            }
            if((spezzata[i][0]<0)&&(spezzata[i][1]<0)) {
                q3++;
            }
            if((spezzata[i][0]>0)&&(spezzata[i][1]<0)) {
                q4++;
            }
        }
        if ((q1==0) && (q2==0) && (q3==0) && (q4==0)) {
            numeroQ = 0;
        }
        if ((q1!=0) && (q2!=0) && (q3!=0) && (q4!=0)) {
            numeroQ = 4;
        }
        if ((q1!=0) && (q2==0) && (q3==0) && (q4==0)) {
            numeroQ = 1;
        }
        if ((q1==0) && (q2!=0) && (q3==0) && (q4==0)) {
            numeroQ = 1;
        }
        if ((q1==0) && (q2==0) && (q3!=0) && (q4==0)) {
            numeroQ = 1;
        }
        if ((q1==0) && (q2==0) && (q3==0) && (q4!=0)) {
            numeroQ = 1;
        }
        if ((q1!=0) && (q2!=0) && (q3==0) && (q4==0)) {
            numeroQ = 2;
        }
        if ((q1!=0) && (q2==0) && (q3!=0) && (q4==0)) {
            numeroQ = 2;
        }
        if ((q1!=0) && (q2==0) && (q3==0) && (q4!=0)) {
            numeroQ = 2;
        }
        if ((q1==0) && (q2!=0) && (q3!=0) && (q4==0)) {
            numeroQ = 2;
        }
        if ((q1==0) && (q2!=0) && (q3==0) && (q4!=0)) {
            numeroQ = 2;
        }
        if ((q1==0) && (q2==0) && (q3!=0) && (q4!=0)) {
            numeroQ = 2;
        }
        if ((q1!=0) && (q2!=0) && (q3!=0) && (q4==0)) {
            numeroQ = 3;
        }
        if ((q1!=0) && (q2!=0) && (q3==0) && (q4!=0)) {
            numeroQ = 3;
        }
        if ((q1!=0) && (q2==0) && (q3!=0) && (q4!=0)) {
            numeroQ = 3;
        }
        if ((q1==0) && (q2!=0) && (q3!=0) && (q4!=0)) {
            numeroQ = 3;
        }
        return numeroQ;
    }
    ho cercato in tutti i modi un modo per rendere questo sottoprogramma più compatto ma non ci sono riuscito, alla fine ho esaminato caso per caso quand'è che la spezzata passa per un quadrante.
    ho preso 5 contatori: q1, q2, q3 e q4 e numeroQ, tutti inizializzati a 0
    ho fatto contare al programma quanti punti stessero nel primo quadrante, quanti nel secondo, quanti nel terzo e quanti nel quarto.
    a questo punto se i contatori q1, q2, q3 e q4 sono tutti diversi da zero significa che il numero di quadranti toccati dalla spezzata è 4, se questi contatori fossero stati tutti uguali a 0 il numero di quadranti toccati sarebbe stato 0.
    ho preso poi in considerazione tutti gli altri casi:
    solo uno dei 4 contatori diverso da zero --> numeroQ = 1
    solo due dei 4 contatori diversi da zero --> numeroQ = 2
    solo uno dei 4 contatori uguale a zero --> numeroQ = 3
    il sottoprogramma ritorna numeroQ che è il numero intero che indica il numero di quadranti toccati.


    riscrivendo il programma completo quindi viene fuori una cosa del genere:
    #include <iostream>
    #include <fstream>
    #include <math.h>
    using namespace std;
    
    const int N = 5;
    
    void leggiSpezzata(int spezzata[N][2], int &numPunti);
    void stampaSpezzata(int spezzata[N][2], int numPunti);
    float calcolaLunghezza(int spezzata[N][2], int numPunti);
    int numeroQuadranti(int spezzata[N][2], int numPunti);
    
    int main() {
        int s[N][2];
        int n;
       
        leggiSpezzata(s, n);
        stampaSpezzata(s, n);
       
        cout << calcolaLunghezza(s, n) << endl;
       
        if (numeroQuadranti(s, n) == 4) {
            cout << "condizione soddisfatta" << endl;
        } else {
            cout << "condizione non soddisfatta" << endl;
        }
        system("pause");
    }
    
    void leggiSpezzata(int spezzata[N][2], int &numPunti) {
        int i;
        bool continua;
        continua = true;
        numPunti=0;
        while (continua == true) {
            for (i=0; i<N; i++) {
                cin >> spezzata[i][0];
                cin >> spezzata[i][1];
                numPunti++;
                if ((spezzata[i][0]==spezzata[i+1][0]) && (spezzata[i][1]==spezzata[i+1][1])) {
                    continua = false;
                }
            }
            if (numPunti>N) {
                continua = false;
            }
        }
        return;
    }
    
    void stampaSpezzata(int spezzata[N][2], int &numPunti) {
        int i;
        for (i=0; i<numPunti; i++) {
            cout << spezzata[i][0] << "\t";
            cout << spezzata[i][1] << endl;
        }
        cout << endl;
        return;
    }
    
    float calcolaLunghezza(int spezzata[N][2], int &numPunti) {
        int i;
        float lunghezza;
        lunghezza = 0;
        for (i=0; i<numPunti; i++) {
            lunghezza+=sqrt(((spezzata[i+1][0]-spezzata[i][0])*(spezzata[i+1][0]-spezzata[i][0]))+((spezzata[i+1][1]-spezzata[i][1])*(spezzata[i+1][1]-spezzata[i][1])));
        }
        return lunghezza;
    }
    
    int numeroQuadranti(int spezzata[N][2], int &numPunti) {
        int i;
        int numeroQ;
        int q1, q2, q3, q4;
        numeroQ = 0;
        q1=0;
        q2=0;
        q3=0;
        q4=0;
        for (i=0; i<numPunti; i++) {
            if((spezzata[i][0]>0)&&(spezzata[i][1]>0)) {
                q1++;
            }
            if((spezzata[i][0]<0)&&(spezzata[i][1]>0)) {
                q2++;
            }
            if((spezzata[i][0]<0)&&(spezzata[i][1]<0)) {
                q3++;
            }
            if((spezzata[i][0]>0)&&(spezzata[i][1]<0)) {
                q4++;
            }
        }
        if ((q1==0) && (q2==0) && (q3==0) && (q4==0)) {
            numeroQ = 0;
        }
        if ((q1!=0) && (q2!=0) && (q3!=0) && (q4!=0)) {
            numeroQ = 4;
        }
        if ((q1!=0) && (q2==0) && (q3==0) && (q4==0)) {
            numeroQ = 1;
        }
        if ((q1==0) && (q2!=0) && (q3==0) && (q4==0)) {
            numeroQ = 1;
        }
        if ((q1==0) && (q2==0) && (q3!=0) && (q4==0)) {
            numeroQ = 1;
        }
        if ((q1==0) && (q2==0) && (q3==0) && (q4!=0)) {
            numeroQ = 1;
        }
        if ((q1!=0) && (q2!=0) && (q3==0) && (q4==0)) {
            numeroQ = 2;
        }
        if ((q1!=0) && (q2==0) && (q3!=0) && (q4==0)) {
            numeroQ = 2;
        }
        if ((q1!=0) && (q2==0) && (q3==0) && (q4!=0)) {
            numeroQ = 2;
        }
        if ((q1==0) && (q2!=0) && (q3!=0) && (q4==0)) {
            numeroQ = 2;
        }
        if ((q1==0) && (q2!=0) && (q3==0) && (q4!=0)) {
            numeroQ = 2;
        }
        if ((q1==0) && (q2==0) && (q3!=0) && (q4!=0)) {
            numeroQ = 2;
        }
        if ((q1!=0) && (q2!=0) && (q3!=0) && (q4==0)) {
            numeroQ = 3;
        }
        if ((q1!=0) && (q2!=0) && (q3==0) && (q4!=0)) {
            numeroQ = 3;
        }
        if ((q1!=0) && (q2==0) && (q3!=0) && (q4!=0)) {
            numeroQ = 3;
        }
        if ((q1==0) && (q2!=0) && (q3!=0) && (q4!=0)) {
            numeroQ = 3;
        }
        return numeroQ;
    }
    

    quando vado a compilarlo mi da i seguenti errori che mi fanno immaginare ci sia un problema con la costante N (ma non ne sono poi così sicuro)

    [Linker error] undefined reference to `stampaSpezzata(int (*) [2], int)'
    [Linker error] undefined reference to `calcolaLunghezza(int (*) [2], int)'
    [Linker error] undefined reference to `numeroQuadranti(int (*) [2], int)'
    ld returned 1 exit status

    spero di essere stato chiaro, di aver spiegato i miei ragionamenti e di essere aiutato ad arrivare a capire il problema
    grazie ancora
  • Re: C++ array esercizio spezzata

    Cominciamo dagli ultimi errori.

    Fossi in te confronterei il prototipo di quelle 3 funzioni e la firma delle funzioni stesse nel file .cpp
  • Re: C++ array esercizio spezzata

    oregon ha scritto:


    Cominciamo dagli ultimi errori.

    Fossi in te confronterei il prototipo di quelle 3 funzioni e la firma delle funzioni stesse nel file .cpp
    e quello l'ho corretto, per fare più rapidamente ho copiato male...
    ora però iniziano i problemi seri....
  • Re: C++ array esercizio spezzata

    Ho modificato due sottoprogrammi, ora il calcolo dei quadranti toccati dovrebbe venire correttamente, l'altro sottoprogramma che ho modificato è il primo:

    void leggiSpezzata(int spezzata[N][2], int &numPunti)
    void leggiSpezzata(int spezzata[N][2], int &numPunti) {
        bool continua;
        continua = true;
        numPunti=0;
        while (continua == true) {
            
            cin >> spezzata[numPunti][0];
            cin >> spezzata[numPunti][1];
            numPunti++;
            if (numPunti >= 1) {
                if ((spezzata[numPunti][0]==spezzata[numPunti+1][0]) && (spezzata[numPunti][1]==spezzata[numPunti+1][1])) {
                    continua = false;
                }
            }
            if (numPunti >= N) {
                continua = false;
            }
        }
        return;
    }
    ora si ferma correttamente quando il numero di punti immessi è uguale o maggiore a N, l'unico problema è che ancora non si ferma quando vengono inseriti due punti consecutivi uguali. sono quasi certo che l'errore sia qui:
     if ((spezzata[numPunti][0]==spezzata[numPunti+1][0]) && (spezzata[numPunti][1]==spezzata[numPunti+1][1])) {
                    continua = false;
                }
    grazie dell'attenzione e scusate se ho ripostato
Devi accedere o registrarti per scrivere nel forum
5 risposte