This commit is contained in:
Oleksandr Hryshchenko 2021-11-04 19:12:10 +01:00
parent 729b35fd60
commit cb9270349c

View File

@ -1 +1,110 @@
#include <stdio.h> #include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
struct dish{
char name[100];
float price;
};
int comparator (const void * p1, const void * p2){
return (*(int*)p1 - *(int*)p2);
}
void getOrder(struct dish dishesList[100], int dishesNumber, int* result){
float allPrises[dishesNumber];
float ascendingPrises[dishesNumber];
int* order = calloc(dishesNumber, sizeof(int));
int counter = 0;
float temp;
for(int i = 0; i < dishesNumber; i++){
allPrises[i] = dishesList[i].price;
ascendingPrises[i] = allPrises[i];
}
qsort(ascendingPrises, dishesNumber, sizeof(int), comparator);
for(int i = 0; i < dishesNumber; i++){
for(int j = 0; j < dishesNumber; j++){
STEP:
if(ascendingPrises[i] == allPrises[j]){
for(int y = 0; y < counter; y++){
if(order[y] == j){
j++;
goto STEP;
}
}
order[counter] = j;
counter++;
break;
}
}
}
memcpy(result, order, dishesNumber * sizeof(int));
}
void getAlphabetOrder(int* order, struct dish dishesList[100], int dishesNumber){
int* result = calloc(dishesNumber, sizeof(int));
int counter = 0;
int temp;
for(int i = 0; i < dishesNumber; i++){
for(int j = i; j < dishesNumber; j++){
if(dishesList[order[i]].price == dishesList[order[j]].price){
if(dishesList[order[i]].name[0] < dishesList[order[j]].name[0]){
break;
}
else if(dishesList[order[i]].name[0] == dishesList[order[j]].name[0]){
if(dishesList[order[i]].name[1] < dishesList[order[j]].name[1]){
break;
}
else{
temp = order[i];
order[i] = order[j];
order[j] = temp;
}
}
else{
temp = order[i];
order[i] = order[j];
order[j] = temp;
}
}
}
result[counter] = order[i];
counter++;
}
memcpy(order, result, dishesNumber * sizeof(int));
}
int main(){
struct dish dishesList[100];
int i = 0;
int finalCounter = 0;
for(i = 0; fgets(dishesList[i].name, 100, stdin); i++){
finalCounter++;
if(dishesList[i].name[0] == '\n' || dishesList[i].name[0] == '\0') finalCounter--;
scanf("%f", &dishesList[i].price);
if(dishesList[i].price == 0.0){
finalCounter--;
break;
}
getchar();
}
int* printOrder = calloc(finalCounter, sizeof(int));
getOrder(dishesList, finalCounter, printOrder);
getAlphabetOrder(printOrder, dishesList, finalCounter);
for(int j = 0; j < finalCounter; j++){
printf("%s", dishesList[printOrder[j]].name);
printf("%f\n", dishesList[printOrder[j]].price);
}
return 0;
}