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