Am postat mai jos o variantă, sper să fie corectă; cel puțin la mine pare că merge. Folosesc linux, așa ca nu sunt 100% sigur că îti va merge din prima, dar sunt lucruri minore de modificat [ totuși e același limbaj, standardizat ANSI ]
Recomand să citești codul de jos în sus, adică începând cu funcția main.
[ nu mă refer neapărat la programul ăsta, ci era mai mult un sfat general ]
Și încearcă în general să folosești cât mai multe funcții, nu să scrii totul într-un bloc mare de cod...
La școală îmi aduc aminte că se făcea totul în main, cu variabile globale cât cuprinde, și denumite i, k, m, p ,t, q, r, fără tab-uri acolo unde trebuie să fie [ fără indentare corespunzătoare adică] ... Asta dăunează foarte mult lizibilitații, nu numai pentru ceilalți care citesc dar chiar și pentru programatorul care dezvoltă [ nu ziceam de codul postat de tine acum, ziceam ca sfat general, ce ai pus tu aici e destul de clar scris și bine enunțat]
Oricum zic, intre "int ț" și "int nNumClick" de exemplu ar trebui să fie clar care e mai bună.
La fel, între a pune totul într-o funcție și a face funcții ajutătoare unde se poate.
Mă lungesc, scuze.
Numai bine.
Cod:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
const int n = 15; // numărul maxim de elemente
struct adresa{
short int x, y, diam;
}punct[n];
// funcție ajutătoare care interschimbă
// 2 elemente ale structurii
void interschimba(int i, int j)
{
int temp;
// schimbă x
temp = punct[i].x;
punct[i].x = punct[j].x;
punct[j].x = temp;
// schimbă y
temp = punct[i].y;
punct[i].y = punct[j].y;
punct[j].y = temp;
// schimbă diam
temp = punct[i].diam;
punct[i].diam = punct[j].diam;
punct[j].diam = temp;
}
void sort()
{
int gata = 0;
while(gata==0)
{
gata = 1;
for(int i=0; i<n-1; i++)
for(int j=i+1; j<n;j++)
{
// dacă diametrul lui i e mai mare, interschimbă și marchează
// faptul că am făcut ceva la iterația curentă
// [ ca să nu se oprească procesul de sortare ]
if(punct[i].diam > punct[j].diam)
{
interschimba(i, j);
gata = 0;
}
// dacă au același diam, dar x-ul celui de indice mai mic(i) este mai mare decât
// al celui de indice j, atunci interschimbă
else if( (punct[i].diam == punct[j].diam) && (punct[i].x > punct[j].x) )
{
interschimba(i, j);
gata = 0;
}
// dacă au același diam și același x, dar punct[i].y > punct[j].y, trebuie interschimbate
else if( (punct[i].diam == punct[j].diam) && (punct[i].x == punct[j].x) && (punct[i].y > punct[j].y) )
{
interschimba(i, j);
gata = 0;
}
}
}
}
void afiseazaStructura()
{
for(int i=0; i<n; i++)
{
printf("Elementul %d: ", i);
printf("x = %02d, y= %02d, diam= %02d\n", punct[i].x, punct[i].y, punct[i].diam);
}
printf("\n");
}
void initializari()
{
srand(time(0));
// generează niște date aleatoare pentru structură
for(int i=0; i<n; i++)
{
if(rand()%3==0 && i>0)
punct[i].x = punct[i-1].x; // pune din când în când și niște coordonate x egale [ mai precis 1 din 333 ]
else
punct[i].x = rand() % 100;
if(rand()%3==0 && i>0)
punct[i].y = punct[i-1].y; // analog
else
punct[i].y = rand() % 100;
if(rand()%3==0 && i>0)
punct[i].diam = punct[i-1].diam; // analog
else
punct[i].diam = rand() % 100;
}
}
int main()
{
initializari();
afiseazaStructura();
sort();
afiseazaStructura();
return 0;
}