Errori che non capisco

Sk_Anonymous
Buona sera a tutti, ho un problema con questo programma alla riga 10 e non capisco cosa sia:

#include
using namespace std;

int main() {

int nx=4;
int ns=0;
int n=nx;

for(int i=0;i
for(int j=0;j cout<<" ";
for(int k=0;k cout<<"x";
cout< ns++;
}

for(int i=0;int i for(int j=0;j cout<<" ";
for(int k=0;k cout<<"x";
cout< ns--;
}

return 0;
}
Nel seguente programma l'errore è identico:
#include
using namespace std;

int main() {

int nx=4;
int ns=0;
int n=nx;

for(int i=0;i
for(int j=0;j cout<<" ";
for(int k=0;k cout<<"x";
cout< ns++;
}

for(int i=0;int i for(int j=0;j cout<<" ";
for(int k=0;k cout<<"x";
cout< ns--;
}

return 0;
}



Invece in questo altro programma devo stampare due figure, una di seguito all'altra; il problema è che me ne stampa solo una:
#include
using namespace std;


int main() {

int np,ns,n;
int i=0,j=0,k=0;
cout<<"dammi n";
cin>>n;



np=n;

while(i++ j=0;
while(j++
cout<<"+";
cout< np--;
}

np=n;
ns=0;
while(i++

j=0;
k=0;
while(j++ cout<<" ";
while(k++ cout<<"+";
cout< np--;
ns++;

}
}
Vi ringrazio per l'attenzione

Risposte
apatriarca
1. Inserisci il codice usando il tag code in modo da mantenere la formattazione e renderne più agevole la lettura.
2. Quando vuoi conoscere il significato di un qualche errore, assicurati di aver inserito l'errore e il compilatore/sistema sul quale tale programma è stato compilato.

vict85
Nei primi due hai messo un int nella condizione del for. Toglilo e compilerà.

Nel terzo, ti sei dimenticato di riazzerare i dopo il primo ciclo.

Sk_Anonymous
Grazie per i suggerimenti, vedo se riesco a risolvere.
Ciao

Sk_Anonymous
L'ultimo continua a stampare un solo triangolo. Ho provato a riazzerare i, ma non c'è nulla da fare.

Il programma è questo:
#include <iostream>
using namespace std;
int main() {

    int np,ns,n;
    int i=0,j=0,k=0;
    cout<<"dammi n";
    cin>>n;

    np=n;

    while(i++<n){
        j=0;
        while(j++<np)

        cout<<"+";
        cout<<endl;
        np--;
        }



        ns=0,i=0;
        while(i++<n){



            j=0;
            k=0;
            while(j++<ns)
            cout<<" ";
            while(k++<np)
            cout<<"+";
            cout<<endl;
            np--;
            ns++;

            }
            }

Non mi da nessun errore ma dovrebbe stmpare due triangoli. n+ è il numeri di asterischi, ns è in numero di spazi.
Poi avrei un' altra domanda: devo scrivere un programma che riceve da tastiera un set di coppie di punti e di cui voglio che mi calcoli la distanza relativa tra un punto e quello successivo. Io ho scritto:
#include <iostream>

using namespace std;
int f(int p[][2],int n){
    int i;
    for(i=0;i<n;i++)

    cout<<((p[i][0]-p[i][1])*(p[i][0]-p[i][1])+(p[i+1][0]-p[i+1][1]));
    }

int main()
{
    cout<<"dammi il numero di coppie di punti";
    int n,i;
    cin>>n;
    int p[n][2];

    for(i=0;i<n;i++){
        cout<<"coordinate della coppia"<<i+1<<": ";
        cin>>p[i][0]>>p[i][1];
        }
        cout<<endl;

    for(i=0;i<n;i++){
        cout<<"La distanza tra i punti della coppia "<<i+1<<"vale: "<<f(p,n);
        }


}

La funzione mi prende una matrice di n punti e 2 colonne. Il problema è che mi si pianta e devo terminare il processo. Avrei bisogno di qualche dritta perchè sono in alto mare.
Grazie mille!

giuscri
Puoi essere più chiara nella traccia del primo programma? Quello dei triangoli, intendo. Devi stampare due triangoli uguali uno dopo l'altro?

EDIT: per il primo programma.

  int max_lenght;
  int i;
  int j;

Mi sembra tu non abbia bisogno di più di queste variabili, no?

  cout << "Type the maximum lenght of your triangle:\n";
  cin  >> max_lenght;
  cout << endl;

Forse volevi usare una variabile solo per memorizzare il dato in lettura. Puoi farlo!, però non mi sembra un'idea malsana usare max_lenght come sopra.

  for(i = max_lenght; i > 0; i--)
   {
    for(j = 0; j < i; j++)
     {
      cout << '*';
     }
    cout << endl;
   }

Il grosso quì sopra lo fa il for più interno. E' lui che stampa stelline sulla stessa riga i-volte. i però decresce costantemente. L'ultima volta che viene eseguito questo ciclo è quando i vale zero: questa condizione termina il ciclo e la stampa del primo triangolo.


  for(i = 0; i < max_lenght; i++)
   {
    for(j = 0; j <= i; j++)
     {
      cout << '*';
     }
    cout << endl;
   }

Idem quì, solo che funziona al contrario. Stampi i-volte la stellina sulla stessa riga, ma i cresce costantemente.

Per il secondo programma, qualcosina: il numero di righe della tua matrice è nota solo a run-time. Questo in C++ è un errore. Se devi usare per forza le matrici in questo modo non avere paura di allocare anche uno spazio "spropositato".

Fatto proprio male, intendo più o meno così:
const int N = 10;
int my_slim_matrix[N][2];

cout << "Please, type how many points you want to play with:\n";
cin  >> number_of_points;

if(number_of_points > N)
 {
  cout << "I'm sorry, but I don't have enought space!\n";
  return 1;
 }

for(int i = 0; i < number_of_points; i++)
 {
  for(int j = 0; j < 2; j++)
   int coordinate;
   cout << "Insert the coordinate:\n";
   cin  >> coordinate;
   my_slim_matrix[i][j] = coordinate;
  }
 }


Sta' attenta poi che stai sbagliando l'algoritmo per calcolare la distanza fra due punti! :wink:

Credo che il programma faccia errori per quel
p[i+1][0] - p[i+1][1]

che quando i == (n-1) da risultati inaspettati.

Non credo comunque che il tuo segmentation fault sia dovuto a questo, però attendi pareri più autorevoli!

Buon lavoro!

Sk_Anonymous
"giuscri":
Puoi essere più chiara nella traccia del primo programma? Quello dei triangoli, intendo. Devi stampare due triangoli uguali uno dopo l'altro?

EDIT: per il primo programma.

  int max_lenght;
  int i;
  int j;

Mi sembra tu non abbia bisogno di più di queste variabili, no?

  cout << "Type the maximum lenght of your triangle:\n";
  cin  >> max_lenght;
  cout << endl;

Forse volevi usare una variabile solo per memorizzare il dato in lettura. Puoi farlo!, però non mi sembra un'idea malsana usare max_lenght come sopra.

  for(i = max_lenght; i > 0; i--)
   {
    for(j = 0; j < i; j++)
     {
      cout << '*';
     }
    cout << endl;
   }

Il grosso quì sopra lo fa il for più interno. E' lui che stampa stelline sulla stessa riga i-volte. i però decresce costantemente. L'ultima volta che viene eseguito questo ciclo è quando i vale zero: questa condizione termina il ciclo e la stampa del primo triangolo.


  for(i = 0; i < max_lenght; i++)
   {
    for(j = 0; j <= i; j++)
     {
      cout << '*';
     }
    cout << endl;
   }

Idem quì, solo che funziona al contrario. Stampi i-volte la stellina sulla stessa riga, ma i cresce costantemente.

Per il secondo programma, qualcosina: il numero di righe della tua matrice è nota solo a run-time. Questo in C++ è un errore. Se devi usare per forza le matrici in questo modo non avere paura di allocare anche uno spazio "spropositato".

Fatto proprio male, intendo più o meno così:
const int N = 10;
int my_slim_matrix[N][2];

cout << "Please, type how many points you want to play with:\n";
cin  >> number_of_points;

for(int i = 0; i < number_of_points; i++)
 {
  for(int j = 0; j < 2; j++)
   int coordinate;
   cout << "Insert the coordinate:\n";
   cin  >> coordinate;
   my_slim_matrix[i][j] = coordinate;
  }
 }


Sta' attenta poi che stai sbagliando l'algoritmo per calcolare la distanza fra due punti.

Credo che il programma faccia errori per quel
p[i+1][0] - p[i+1][1]

che quando i == (n-1) da risultati inaspettati.

Non credo comunque che il tuo segmentation fault sia dovuto a questo, però attendi pareri più autorevoli!


Buonasera ragazzi, grazie per i contributi. I primi due esercizi li ho sistemati, anche grazie ai vostri suggerimenti.
Mi rimane però l'ultimo, ossia quello sulla distanza dei punti. Provo a riesaminarlo. Vi tengo aggiornati.
Buona notte!

giuscri
Mi viene in mente che una soluzione per il tuo problema potrebbe essere incrementare l'indice di 2 ogni volta. Del tipo:

for(i = 0; i < n; i += 2)
  {
    // Qui p[i][index_of_colums] e p[i+1][index_of_colums] hanno sempre i valore con cui
    // tu li hai inizializzati!
  }


Che dici?

Sk_Anonymous
Vi scrivo cosa mi dice la consegna di preciso:
Scrivere una funzione che:
-prenda come argomenti: un numero intero,n (int n), e le coppie delle coordinate di n punti (double p[][2]);
-stampi a video quali sono i due punti più distanti;
-e restituisca la distanza tra i due punti più distanti.
Per esempio se n=4 e le coordinate dei punti sono (1.1,1.2),(2.5,0.2),(0.1,3.2) e (0.5,1.5), allora la funzione deve stampare a video 
i due punti più distanti sono il 2. e il 3.
e deve restituire 3.84187  .
Scrivere una main che testi la funzione con dati forniti dal utente per il caso n=4.

giuscri

EDIT: io lo farei così come segue:
inizializzi una matrice lunga 10, larga 2 (i punti sono in R2). Chiedi all'utente il numero di punti con cui vuole lavorare e carichi coordinata per coordinata i valori per ciascun punto (per esempio, 1 per la coordinata x del primo punto, 2 per la coordinata y del secondo; poi 0.5 per la coordinata x del primo punto, 5.65 per la coordinata y del secondo, etc...). Per questo io scriverei:

 const int N = 10;
 float my_matrix[N][2];

 int number_of_points;
 std::cout << "Type the number of points you want to work with:\n";
 std::cin  >> number_of_points;
 std::cout << "You're playing with " << number_of_points << " points, now\n";
 if(!number_of_points)
  {
   std::cout << "...but you can't run this program with no points.\n";
   return 1;
  }

 float coordinate;
 int i;
 for(i = 0; i < number_of_points; i++)
  {
   std::cout << "Type the first coordinate of the number-" << (i+1) << " "
             << "point:\n";
   std::cin  >> coordinate;
   my_matrix[i][0] = coordinate;
  
   std::cout << "Type the second coordinate of the number-" << (i+1) << " "
             << "point:\n";
   std::cin  >> coordinate;
   my_matrix[i][1] = coordinate;
  }


A questo punto pensi a come dovrebbe essere fatta la tua funzione. Deve calcolare un reale a partire da altri due reali, facendo uso del teorema di pitagora. I due reali sono contenuti in una matrice.
Quindi o estrai i due valori dalla matrice nel main e li passi per copia alla tua funzione, oppure passi direttamente la matrice ed estrarrai i due valori nella tua funzione. Io ho scelto per la seconda.

f: (R2 x R2) -> (R)                             // Queste righe sono solo esplicative: non e' codice
f: (a, b) -> (c)                                // compilabile.
c = f(a, b) = sqrt( (a1 - b1)^2  + (a2 - b2)^2 )

// Allora il suo prototipo sara':
float evaluate_distance(float matrix[10][2], int pos_a, int pos_b);
// dove pos_a e pos_b sono l'altezza dei due punti, nella matrice.


Nota: per usare la funzione evaluate_distance uso la libreria cmath che contiene la funzione sqrt(), e pow() rispettivamente per l'estrazione della radice e per l'elevamento a potenza.

Dove uso la funzione evaluate_distance()? Come ti dicevo, non saprei usare metodi molto più efficienti di andare a fissare un punto e far girare gli altri salvandomi ogni volta la distanza e trovando la distanza massima.
Servendomi di due variabili (la prima per l'altezza, nella matrice, del primo punto; la seconda per l'altezza del secondo punto) fisso uno degli n punti e calcolo la distanza per tutti gli (n-1) punti da quello. Chiaramente, è inutile far calcolare la distanza di un punto da se stesso; una miglioria potrebbe essere usare l'istruzione continue che fa saltare "una ciclata"*. Quindi farei:

 int position_of_the_first_point, position_of_the_second_point;
 float max;

 int j;
 for(i = 0, max = 0; i < number_of_points; i++)
  {
   for (j = 0; j < number_of_points; j++)
    {
     if(j == i)
      {
       continue;
      }
     else
      {
       float result = evaluate_distance(my_matrix, i, j);
       if(result > max)
        {
         position_of_the_first_point = i;
         position_of_the_second_point = j;
         max = result;
        }
      }
    }
  }


* : su questo continue nutri quanti più dubbi possibili. L'ho scoperto qualche giorno fa, mi sembra un rimasuglio del C e l'uso che ne ho fatto qui sopra potrebbe funzionare solo per un caso fortuito. Chiedi al professore o spera nella risposta di qualche ottimo utente.

Come funziona evaluate_distance? Per esempio così*:

float
evaluate_distance(float matrix[10][2], int pos_a, int pos_b)
{
 float distance;
 distance = sqrt(pow((double) (matrix[pos_a][0] - matrix[pos_b][0]), 2)
                 + pow((double) (matrix[pos_a][1] - matrix[pos_b][1]), 2));
 return distance;
}


* Oss: la funzione per l'elevamento a potenza contenuta in vuole che la base sia un double. Quindi, anche se la tua matrice fosse fatta solo di interi devi "convertire" ogni valore da intero a double. Questa 'pratica' si chiama typecasting.

Spero questo post ti sia utile per chiartirti le idee su come potresti scrivere tu il programma.

Buona giornata! :)

vict85
Alcune considerazioni penso che debbano essere fatte.

Per prima cosa sulla distanza: non ha senso calcolare la radice quadrata. Anche perché calcolarla porta inevitabilmente ad una aggiunta di errori di arrotondamento. Bisogna comunque dire che un double è generalmente grande 64bit con una cinquantina di bit di mantissa. Per quanto sia abbastanza preciso in realtà porta ad una certa perdita di dati rispetto a tenere la distanza in un intero a 64bit. Se i punti sono distribuiti su un reticolo intero che usa interi a 32 bit con il segno allora un intero a 64 bit con segno conterrà senza dubbio la funzione distanza al quadrato (nel piano e, se non ho fatto i calcoli male, anche nello spazio a 3 dimensioni). La cosa andrebbe fatta con interi a dimensione fissata, ma non penso che tu sappia come si fa e quindi evito di usarli.

Immagino ci sia un algoritmo che funzioni in \(\displaystyle O(n\log n) \) (probabilmente basato sugli algoritmi per fare il Convex Hull) ma per gli scopi del compito penso che basti uno che funzioni in \(\displaystyle O(n^2) \). Il numero esatto delle coppie è comunque \(\displaystyle \frac{n(n-1)}{2} = \binom{n}{2}\), in quanto la distanza è una funzione simmetrica.

In ogni caso, per come è scritto il tutto penso che la cosa più appropriata sia usare il seguente ciclo:

unsigned long long max_dist = 0;
unsigned int max_ind[2] = {0, 0};
for(unsigned int i = 0; i != number_of_point; ++i)
{
  for(unsigned int j = i+1; j != number_of_point; ++j)
  {
     unsigned long long const temp = (my_matrix[i][0] - my_matrix[j][0]) >= 0 ? static_cast<unsigned long long>(my_matrix[i][0] - my_matrix[j][0]) : static_cast<unsigned long long>(my_matrix[j][0] - my_matrix[i][0]);
     unsigned long long const temp2 = (my_matrix[i][1] - my_matrix[j][1]) >= 0 ? static_cast<unsigned long long>(my_matrix[i][1] - my_matrix[j][1]) : static_cast<unsigned long long>(my_matrix[j][1] - my_matrix[i][1]);
     unsigned long long const distance = temp*temp + temp2*temp2;
     if(distance > max)
     {
        max_dist = distance;
        max_ind[0] = i;
        max_ind[1] = j;
     }
  } 
} 


Senza dubbio si può costruire una funzione che calcola la distanza tra due punti. D'altra parte la farei così:

unsigned long long calculate_distance(long const a[], long const b[])
{
  unsigned long long const temp = (a[0] - b[0]) >= 0 ? static_cast<unsigned long long>(a[0] - b[0]) : static_cast<unsigned long long>(b[0] - a[0]);
     unsigned long long const temp2 = (a[1] - b[1]) >= 0 ? static_cast<unsigned long long>(a[1] - b[1]) : static_cast<unsigned long long>(b[1] - a[1]);
     return temp*temp + temp2*temp2;
} 


che trasformerebbe il ciclo di prima come:
unsigned long long max_dist = 0;
unsigned int max_ind[2] = {0, 0};
for(unsigned int i = 0; i != number_of_point; ++i)
{
  for(unsigned int j = i+1; j != number_of_point; ++j)
  {
     unsigned long long const distance = calculate_distance(my_matrix + 2*i, my_matrix + 2*j);
     if(distance > max_dist)
     {
        max_dist = distance;
        max_ind[0] = i;
        max_ind[1] = j;
     }
  } 
} 


In ogni caso il C++ possiede vari modi per fare il cast. E' in genere meglio usare i cast del C++ che le parentesi del C.

Detto questo io avrei usato cstdint in modo da usare i tipi int32_t e uint64_t invece di long e unsigned long long.
In definitiva la funzione sarebbe diventata:
uint64_t calculate_distance(int32_t const a[], int32_t const b[])
{
    uint64_t const temp = (a[0] - b[0]) >= 0 ? static_cast<uint64_t>(a[0] - b[0]) : static_cast<uint64_t>(b[0] - a[0]);
    uint64_t const temp2 = (a[1] - b[1]) >= 0 ? static_cast<uint64_t>(a[1] - b[1]) : static_cast<uint64_t>(b[1] - a[1]);
    return temp*temp + temp2*temp2;
} 


e il ciclo:
uint64_t max_dist = 0;
uint32_t max_ind[2] = {0, 0};
for(uint32_t i = 0; i != number_of_point; ++i)
{
  for(uint32_t j = i+1; j != number_of_point; ++j)
  {
     uint64_t const distance = calculate_distance(my_matrix + 2*i, my_matrix + 2*j);
     if(distance > max_dist)
     {
        max_dist = distance;
        max_ind[0] = i;
        max_ind[1] = j;
     }
  } 
} 


Ma ovviamente dovevi cambiare tutti i tipi anche nel resto del codice.

Io personalmente comunque non avrei usato un matrice di quel tipo per rappresentare un insieme di punti.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.