0

エラー sort_structs_time。struct と qsort を使用してユーザー入力を受け入れて保存するプログラム。名、姓、国、時間。出力は qsort を使用して時間通りにソートする必要があります。

入力

BEKELE タリク ETH 27:31.43

RUPP Galen アメリカ 27:30.90

FARAH モ GB 27:30.42

出力

FARAH モ GB 27:30.42

RUPP Galen アメリカ 27:30.90

BEKELE タリク ETH 27:31.43

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct olympics { 
    //char athlete[25];
    char fname[15];
    char lname[15];
    char country[5];
    float time;
};

/* qsort struct comparision function (time float field) */ 
int struct_cmp_by_time(const void *a, const void *b) 
{ 
    struct olympics *ia = (struct olympics *)a;
    struct olympics *ib = (struct olympics *)b;
    return (int)(60.f*ia->time - 60.f*ib->time); 
}

/* struct array printing function */ 
void print_struct_array(struct olympics *array, size_t len) 
{ 
    size_t i;

    for(i=0; i<len; i++) 
        printf("%s %s %s \t %.2f\n", array[i].fname, array[i].lname, array[i].country, array[i].time);

    puts("****");
} 

/* sorting structs using qsort() */ 
void sort_structs_time(void) 
{ 
    struct olympics structs[] = {
        scanf("%s %s %s %.2f\n", fname, lname, country, &time)
    };

    size_t structs_len = sizeof(structs) / sizeof(struct olympics);

    puts("**** Athletes finishing time...");

    /* print original struct array */ 
    print_struct_array(structs, structs_len);

    /* sort array using qsort functions */ 
    qsort(structs, structs_len, sizeof(struct olympics), struct_cmp_by_time);

    /* print sorted struct array */ 
    print_struct_array(structs, structs_len);
} 


/* call to the function) */ 
int main() 
{ 
    /* run the function */
    sort_structs_time();
    return 0;
}
4

1 に答える 1

1

sort_structs_timeおよび関数にいくつかの変更を加える必要がありstruct_cmp_by_timeます。C の構造体と行列を理解していないことは明らかなので、このトピックについて復習してください。

int struct_cmp_by_time(const void *a, const void *b) 
{ 
    struct olympics *ia = (struct olympics *)a;
    struct olympics *ib = (struct olympics *)b;

    if (ia->time < ib->time) return -1;
    else if (ia->time == ib->time) return 0;
    else return 1;
}

このqsortのドキュメントを参照し、そこに示されている比較関数を見てください。

void sort_structs_time() 
{ 
int i, ath_num;

struct olympics *ath_recs;

printf("For how many athletes do you want to insert their records? \n");
scanf("%d", &ath_num);

ath_recs = (struct olympics *) malloc(ath_num*sizeof(struct olympics));

printf("Please insert athletes records. \n");
printf("type a random string and press ENTER when you done. \n");
for(i = 0; i < ath_num; i++){
    scanf("%s %s %s %f\n", ath_recs[i].fname, ath_recs[i].lname, ath_recs[i].country, &ath_recs[i].time); 
//Don't put %.2f on scanf!!! 
//Also, note that the fname, lname, country and time are struct fields, 
//so you have to access them this way.
}


puts("**** Athletes finishing time...");

/* print original struct array */ 
print_struct_array(ath_recs, ath_num);

/* sort array using qsort function */ 
qsort(ath_recs, (size_t) ath_num, sizeof(struct olympics), struct_cmp_by_time);

/* print sorted struct array */ 
print_struct_array(ath_recs, ath_num);
} 

コードを修正する他の方法もあります。これは理解しやすいと思います。

時間をより適切に表現すると、次のようになります。

struct time{
    int mins;
    int secs;
    int fsecs;
}

したがって、この方法で時間を印刷できます。

printf("%d:%d,%d\n", mins, secs, fsecs);

(この表現、つまり比較関数を使用する場合は、プログラムの時間に関連する部分を変更する必要があります。)

于 2012-08-24T14:34:48.377 に答える