C言語の構造体のソートについての質問です。
下記のtxtデータを構造体に入れてランキングを出すコードが上手く出力されません。
txtデータの詳細は、1列目が参加者ID,2-5列目がそれぞれ,勝ち,負け,引き分けの数と前回の順位になっていて、それぞれ空白区切りになっています。
txt
1A 28 42 30 6 2B 40 60 0 7 3C 45 45 10 1 4D 36 54 10 4 5E 63 27 10 3 6F 36 54 10 5 7G 56 24 20 2
ソートの仕方は以下の基準に基づいてソートをします。
基準 1:勝率が高い順.勝率は,勝ち数/(勝ち数 + 負け数) で算出し,小数点以下第 4 位を四捨五入するもの
基準 2:基準 1 で勝率が同じ場合,勝ち数が多い順.
基準 3:基準 1 で勝率が同じで,基準 2 で勝数も同じ場合,前回の順位が良い順.
下記のソースコードの出力だとこうなります。
bash
1E G C B F D A
正しい出力は以下のとおりです。
bash
1E G C B D F A
わかるかた、よろしくおねがいします。
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#define N 256 5typedef struct { 6 char* name; 7 int val[4]; 8 float winrate; 9} item; 10 11void print(item items[50], int id){ 12 for(int i = 0; i < id; i++) { 13 printf("%s ", items[i].name); 14 } 15 printf("\n"); 16} 17 18void Swap(item* item1, item* item2) { 19 item tmp; 20 tmp = *item1; 21 *item1 = *item2; 22 *item2 = tmp; 23} 24 25void sort(item items[50], int id) { 26 for(int i = 0; i < id; i++) { 27 for(int j = i + 1; j < id; j++) { 28 if(items[i].winrate < items[j].winrate) { 29 Swap(&items[i], &items[j]);//基準1 30 //printf("kijyun1\n"); 31 }else if(items[i].winrate == items[j].winrate){ 32 if(items[i].val[0] < items[j].val[0]){ 33 Swap(&items[i], &items[j]);//基準2 34 //printf("kijyun2\n"); 35 }else if(items[i].val[0] == items[j].val[0]){ 36 if(items[i].val[3] < items[j].val[3]){ 37 Swap(&items[i], &items[j]);//基準3 38 //printf("kijyun3\n"); 39 } 40 } 41 } 42 } 43 } 44} 45 46 47int main(int argc,char *argv[]){ 48 FILE *fp; 49 item items[50]; 50 char fname=argv; 51 char line[N]; 52 int i,id = 0; 53 54 fp = fopen(argv[1], "r"); // ファイルを開く。失敗するとNULLを返す。 55 if(fp == NULL) { 56 printf("file not open!\n"); 57 return -1; 58 } 59 while(fgets(line, N, fp) != NULL) { 60 items[id].name = (char*)malloc(sizeof(char) * 10); 61 sscanf(line, "%s %d %d %d %d", items[id].name, &items[id].val[0], &items[id].val[1], &items[id].val[2], &items[id].val[3]); 62 items[id].winrate = 0; 63 items[id].winrate = (float) items[id].val[0]/(items[id].val[0]+items[id].val[1]); 64 //printf("%s:",items[id].name); 65 //printf("%f\n",items[id].winrate); 66 id++; 67 } 68 fclose(fp); // ファイルを閉じる 69 sort(items, id); 70 print(items, id); 71 return 0; 72}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/27 06:55