所以我要做的是找出如何按最低编号对文件进行排序。数字在结构内。该计划是一种记分牌。您可以添加名称并包括分数(在这种情况下,它包括跑步者和所花费的时间)。
添加名称后,程序会按照最佳时间将得分和跑步者排序到文件中。
我无法弄清楚如何:
代码:
#include <stdio.h>
#include <string.h>
struct kilpailijat //The structure im using
{
char nimi[43+1];
float aika;
};
int main() {
int i, maara;
struct kilpailijat henkilo[50];
FILE *tulos;
size_t ln;
while (1 != 0) {
printf("Montako kilpailijaa haluat lisätä? (max 50): "); //How many runners
scanf_s("%d", &maara); // User input of how many runners
while (getchar() != '\n');
if (maara > 50) { //Checks that the ammount of runners is no more then 50
printf("Yritit lisätä liian monta kilpailijaa.\n");
} else if (maara < 0) { //And no less then 0
printf("Mielenkiintoista. Jos yrittäisit uudelleen.\n");
} else if (maara == 0) { // Zero Quits the program
return 0;
} else {
break;
}
}
for (i = 0; i < maara; i++){ // Start loop to add runners and their score.
printf("\nAnna kilpailijan nimi: ");
fgets(&henkilo[i].nimi[0], 43, stdin); //Add name of runner
ln = strlen(henkilo[i].nimi) - 1; //Remove newline off of fgets()
if (henkilo[i].nimi[ln] == '\n'){
henkilo[i].nimi[ln] = '\0';
}
printf("Kilpailijan aika: "); //Add score
scanf_s("%f", &henkilo[i].aika);
while (getchar() != '\n');
}
if ((tulos = fopen("tulos.txt", "w")) == NULL){ // Check if file opens
printf("Tiedoston avauksessa tapahtui virhe.\n");
}
for (i = 0; i < maara; i++){ //Writes Name and Score to file.
fprintf(tulos, "%s\t%.1f\n", henkilo[i].nimi, henkilo[i].aika);
}
fclose(tulos);
}
答案 0 :(得分:2)
使用qsort并实施自定义比较方法。
int compare (const void * a, const void * b)
{
float f1 = ((struct kilpailijat *)a)->aika;
float f2 = ((struct kilpailijat *)b)->aika;
int result = 0;
if (f1 < f2)
{
result = -1;
}
else if (f1 > f2)
{
result = 1;
}
return result;
}
然后:
qsort (henkilo, maara, sizeof(kilpailijat), compare);
<强>更新强>:
女士们,先生们,我很自豪地提出working example。
它使用了三种我不太熟悉的语言......芬兰语,英语和C语言!
答案 1 :(得分:1)
以Anthony Accioly的答案为基础,但使用我最喜欢的运营商。
int compare (const void * a, const void * b)
{
float f1 = ((struct kilpailijat *)a)->aika;
float f2 = ((struct kilpailijat *)b)->aika;
return f1 < f2
? -1
: f1 > f2
? 1
: 0;
}