C:如何按最低编号(使用结构)对文件进行排序?

时间:2013-02-01 02:35:09

标签: c sorting structure

所以我要做的是找出如何按最低编号对文件进行排序。数字在结构内。该计划是一种记分牌。您可以添加名称并包括分数(在这种情况下,它包括跑步者和所花费的时间)。

添加名称后,程序会按照最佳时间将得分和跑步者排序到文件中。

我无法弄清楚如何:

  1. 按最低/最高排序。
  2. 排序后,保持跑步者名称的完整性及其得分。
  3. 代码:

    #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);
    }
    

2 个答案:

答案 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;
}