#include<stdio.h>
#include<stdlib.h>
#include<math.h>
struct Tri {
int a;
int b;
int c;
double area;
};
int randRange(int min, int max);
int tri_comp(const void *c1, const void *c2);
int randRange(int min, int max) {
int range = max - min + 1;
int lim = RAND_MAX - ((RAND_MAX + 1) % range);
int n;
do {
n = rand();
} while (lim < n);
return (n % range) + min;
}
int tri_comp(const void *c1, const void *c2) {
struct Tri *x = *(struct Tri**)c1;
struct Tri *y = *(struct Tri**)c2;
if (x->area < y->area) {
return 1;
} else if (y->area < x->area) {
return -1;
} else {
return 0;
}
}
int main(int argc, char *argv[]) {
int i;
int a;
int b;
int c;
double area;
int min;
int max;
double s;
struct Tri **tris;
struct Tri *tri;
int n;
if (argc < 2) {
return EXIT_FAILURE;
}
n = atoi(argv[1]);
tris = calloc(n, sizeof(struct Tri*));
for (i = 0; i < n; i++) {
a = randRange(3, 30);
b = randRange(3, 30);
if (a < b) {
min = b - a + 1;
} else {
min = a - b + 1;
}
max = a + b - 1;
c = randRange(min, max);
s = (a + b + c) / 2.0;
area = sqrt(s * (s - a) * (s - b) * (s - c));
tri = malloc(sizeof(struct Tri));
tri->a = a;
tri->b = b;
tri->c = c;
tri->area = area;
tris[i] = tri;
}
qsort(tris, n, sizeof(struct Tri*), tri_comp);
for (i = 0; i < n; i++) {
tri = tris[i];
printf("%d 番目に大きい三角形は3 辺が( %d, %d, %d ) で面積は%f\n", i, tri->a, tri->b, tri->c, tri->area);
}
return EXIT_SUCCESS;
}