This repository has been archived on 2021-10-31. You can view files and clone it, but cannot push or open issues or pull requests.
sys_prog/cars/sort_cars.c

93 lines
2.2 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct car {
char maker[21];
char model[21];
unsigned int power;
unsigned int price;
};
enum sort {
MODEL,
MAKER,
PRICE,
POWER
};
enum sort sorting = MAKER;
int asc = 0;
int asc_desc(int o) {
if (asc) {
return o;
} else {
return o * -1;
}
}
int compare_cars(const void* car1, const void* car2) {
const struct car* c1 = car1;
const struct car* c2 = car2;
// printf("%s %s %u %u\n", c1->maker, c1->model, c1->power, c1->price);
// printf("%s %s %u %u\n", c2->maker, c2->model, c2->power, c2->price);
switch (sorting) {
case MODEL:
return asc_desc(strcmp(c1->model, c2->model));
case MAKER:
return asc_desc(strcmp(c1->maker, c2->maker));
case PRICE:
return asc_desc(c1->price - c2->price);
case POWER:
return asc_desc(c1->power - c2->power);
}
}
int main(int argc, const char** argv) {
if (argc == 2) {
if (!strcmp(argv[1], "+model")) { sorting = MODEL; asc = 1; }
else if (!strcmp(argv[1], "-model")) { sorting = MODEL; asc = 0; }
else if (!strcmp(argv[1], "+maker")) { sorting = MAKER; asc = 1; }
else if (!strcmp(argv[1], "-maker")) { sorting = MAKER; asc = 0; }
else if (!strcmp(argv[1], "+price")) { sorting = PRICE; asc = 1; }
else if (!strcmp(argv[1], "-price")) { sorting = PRICE; asc = 0; }
else if (!strcmp(argv[1], "+power")) { sorting = POWER; asc = 1; }
else if (!strcmp(argv[1], "-power")) { sorting = POWER; asc = 0; }
else { fprintf(stderr, "wrong argument\n"); return 3; }
} else if (argc > 2) {
fprintf(stderr, "wrong arguments\n");
return 3;
}
size_t length = 1024, i = 0;
struct car* A = malloc(sizeof(struct car) * length);
if (!A) {
perror("Cannot allocate cars");
return 1;
}
while(!feof(stdin)) {
scanf("%s %s %u %u\n", A[i].maker, A[i].model, &A[i].power, &A[i].price);
i++;
if (i == length) {
length *= 2;
struct car* B = realloc(A, sizeof(struct car) * length);
if (!B) {
perror("Cannot expand cars");
free(A);
return 2;
}
A = B;
}
}
qsort(A, i, sizeof(struct car), compare_cars);
for (size_t j = 0; j < i; j++) {
printf("%s %s %u %u\n", A[j].maker, A[j].model, A[j].power, A[j].price);
}
free(A);
}