排序数组充满了字符串

时间:2014-01-24 12:36:17

标签: c sorting

我有这样的文字数据:

1,jack,3,7.3

2,mike,4,8.6

3,gol,2,9

有没有人可以帮助我如何按照使用c语言降序表示成绩的最后一列对数据进行排序?

之前发布了这个问题,但没有代码,所以我再次发布以获得更多帮助。

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

typedef struct
{
 int cid;
 char name[40];
 char term[2];
 double gpa;
 }student;

typedef struct
{
char line[300];
}data;

typedef struct
{
int cid;
}finds;

typedef struct
{
double score;
    }gpa;

    void menu();
    int  calculateMax(void);
    void addStudent();
    void find();
    void display();
    void sort();

    int main()
    {
    menu();
    system("PAUSE");
    return 0;
    }


void menu()
{
    int selection;
    printf("%s", "Program menu :\n");
    printf("%s", "1. Add a new student\n");
    printf("%s", "2. Find/retrieve information for a particular Student\n");
    printf("%s", "3. Display STUDENTS list\n");
    printf("%s", "4. Find a student that has the lowest and the highest deposit\n");
    printf("%s", "5. Quit\n");
    printf("%s", "Selection : ");
    scanf("%d", &selection);
    if(selection == 1)
    {
    addStudent();
    }
    else if(selection == 2)
    {
    find();
    }
    else if(selection == 3)
    {
    display();
    }
    else if(selection == 4)
    {
     sort();
    }
    else if(selection == 5)
    {
     exit(0);
    }
    else {
    printf("%s", "\n\aError, please key in correct input!\n\n");
    menu();
    }
    }


void addStudent()
    {
    int max, i;
    FILE *f, *id, *name, *term, *gpa , *sort;
    printf("%s", "\n\nADD student\n");
    printf("%s", "How many students you would like to add : ");
    scanf("%d", &max);
    student *student_info;
    student_info = (student *) malloc(max * sizeof(student)); /*Allocate Memory For Client's Info*/
    if(student_info == NULL)
    {
    printf("Unable to allocate space for client\n\n");
    exit (EXIT_FAILURE);
    }
    if ((id = fopen("id.txt", "a+")) == NULL) /*Open file id.txt*/
    {
    printf("Error, the file cannot be opened\n");
    }
    if ((name = fopen("name.txt", "a+")) == NULL) /*Open file name.txt*/
    {
    printf("Error, the file cannot be opened\n");
    }
    if ((term = fopen("term.txt", "a+")) == NULL) /*Open file TERM.txt*/
    {
    printf("Error, the file cannot be opened\n");
    }
    if ((gpa = fopen("gpa.txt", "a+")) == NULL) /*Open file GPA.txt*/
    {
    printf("Error, the file cannot be opened\n");
    }
    if ((f = fopen("student.txt", "a+")) == NULL) /*Open file STUDENTS.txt*/
    {
    printf("Error, the file cannot be opened\n");
    }
    if ((sort = fopen("sort.txt", "a+")) == NULL) /*Open file SORT.txt*/
    {
    printf("Error, the file cannot be opened\n");
    }
    else {
    for (i = 0; i < max ; i++) { /*Get the input data*/
    printf("student %d\n", i + 1);
    printf("%s", "student's Id : ");
    scanf("%5d", &student_info[i].cid);
    printf("%s", "student's Name : ");
    fflush(stdin);
    gets(student_info[i].name);
    printf("%s", "student's term : ");
    fflush(stdin);
    gets(student_info[i].term);
    printf("%s", "student's GPA : ");
    scanf("%7lf", &student_info[i].gpa);
    printf("\n");   
    }
    }
    for(i = 0; i < max; i++) { /*Store input data into files*/
    fprintf(id, "%d\n", student_info[i].cid);
    fputs(student_info[i].name, name);
    fprintf(name, "\n");
    fputs(student_info[i].term, term);
    fprintf(term, "\n");
    fprintf(gpa, "%lf\n", student_info[i].gpa);
    fprintf(sort,"%d,%s,%s,%lf\n",student_info[i].cid,student_info[i].name,student_info[i].term,student_info[i].gpa);
    }
    for(i = 0; i < max; i++) {
    fprintf(f, "%d", student_info[i].cid, "");
    fprintf(f, "%3s", "");
    fputs(student_info[i].name, f);
    fprintf(f, "%5s", "");
    fputs(student_info[i].term, f);
    fprintf(f, "%7s", "");
    fprintf(f, "%lf\n", student_info[i].gpa);
    }

    fclose(f);
    fclose(id);
    fclose(name);
    fclose(term);
    fclose(gpa);
    fclose(sort);
    free(student_info);
    student_info = NULL;
    printf("\n");
    menu();
    }


void find()
    {
    int find_id = 0, i = 0, student_cid, n = 0, max, selection;
    FILE *id, *f;
    max = calculateMax();
    finds *result;
    result = (finds *) malloc(max * sizeof(finds));
    if(result == NULL)
    {
    printf("Unable to allocate space for student\n\n");
    exit (EXIT_FAILURE);
    }
    if ((id = fopen("id.txt", "r")) == NULL)
    {
    printf("Error, the file cannot be opened\n");
    }
    else {
    while (!feof(id)) { /*Get all clients' id number and store to array*/
    fscanf(id, "%d", &result[i].cid);
    i++;
    }
    }
    fclose(id);
    printf("%s", "\n\nFIND STUDENT\n");
    printf("%s", "Key in Student's id : "); /*Get the client's id that user want to query*/
    scanf("%d", &student_cid);
    data *student_info;
    student_info = (data *) malloc(max * sizeof(data));
    if(student_info == NULL)
    {
    printf("Unable to allocate space for student\n\n");
    exit (EXIT_FAILURE);
    }
    if ((f = fopen("student.txt", "r")) == NULL)
    {
    printf("Error, the file cannot be opened\n");
    }
    i = 0;
    while (!feof(f)) { /*Get all the students' data from clients.txt and stored to array*/
    fflush(stdin);
    fgets(student_info[i].line, 300, f);
    i++;
    }
    fclose (f);
    for(i = 0; i < max + 1; i++)
    {
    if(student_cid == result[i].cid)
    {
    printf("\n\n%s%6s%20s%17s\n", "ID", "NAME", "TERM", "GPA");
    puts(student_info[i].line);
    free(student_info);
    student_info = NULL;
    free(result);
    result = NULL;
    printf("Would you like to find another student?\nKey in 1 for yes or 2 to go to menu : ");
    scanf("%d",&selection);
    if(selection == 1) {
    find();
    }
    else if(selection == 2) {
    menu();
    }
    break;
    }
    else if(i == max)
    {
    printf("\nSory, there's no student with that exist in database.\n");
    free(student_info);
    student_info = NULL;
    free(result);
    result = NULL;
    printf("Would you like to find another student?\nKey in 1 for yes or 2 to go to menu : ");
    scanf("%d",&selection);
    if(selection == 1) {
    find();
    }
    else if(selection == 2) {
    printf("\n\n");
    menu();
    }
    }
    }
    }

void display()
    {
    int max = 0, i;
    FILE *f;
    printf("\n\nDISPLAY STUDENT");
    max = calculateMax();
    data *student_info;
    student_info = (data *) malloc(max * sizeof(data));
    if(student_info == NULL)
    {
    printf("Unable to allocate space for student\n\n");
    exit (EXIT_FAILURE);
    }
    if ((f = fopen("student.txt", "r")) == NULL)
    {
    printf("Error, the file cannot be opened\n");
    }
    i = 0;
    while (!feof(f)) {
    fflush(stdin);
    fgets(student_info[i].line, 200, f);
    i++;
    }
    fclose (f);
    printf("\n\n%s%6s%20s%17s\n", "ID", "NAME", "TERM", "GPA");
    for(i = 0; i < max; i++)
    {
    puts(student_info[i].line);
    }
    free(student_info);
    student_info = NULL;
    }

int calculateMax(void)
    {
    char str[150];
    int maximum = 0;
    FILE *f;
    if ((f = fopen("student.txt", "r")) == NULL)
    {
    printf("Error, the file cannot be opened\n");
    }
    else {
    while (!feof(f)) {
    maximum++;
    fgets (str , 200 , f);
    }
    }
    fclose (f);
    maximum = maximum - 1;
    return maximum;
}
////////////////////////////////////////////////////////////////////

static int student_info_compare(const void *a, const void *b)
{
  const student_info *sia = a, *sib = b;

  return strcmp(sia->name, sib->name);
}


void Sortdisplay()
    {
    int max = 0, i;
    FILE *f;
    printf("\n\nDISPLAY SORTED STUDENT");
    max = calculateMax();
    data *student_info;
    student_info = (data *) malloc(max * sizeof(data));
    if(student_info == NULL)
    {
    printf("Unable to allocate space for student\n\n");
    exit (EXIT_FAILURE);
    }
    if ((f = fopen("sort.txt", "r")) == NULL)
    {
    printf("Error, the file cannot be opened\n");
    }
    i = 0;
    while (!feof(f)) {
    fflush(stdin);
    fgets(student_info[i].line, 200, f);
    i++;
    }
    fclose (f);
    printf("\n\n%s%6s%20s%17s\n", "ID", "NAME", "TERM", "GPA");
    student_info_compare();
    for(i = 0; i < max; i++)
    {
    // iwant to sort here
    qsort(student_info, max, sizeof student_info[0], student_info_compare);
    puts(student_info[i].line);
    }
    free(student_info);
    student_info = NULL;
    }

1 个答案:

答案 0 :(得分:1)

试试这个:

static int student_info_compare(const void *a, const void *b)
{
  const student_info *sia = a, *sib = b;

  return strcmp(sia->name, sib->name);
}

然后在打印循环之前添加它:

qsort(student_info, max, sizeof student_info[0], student_info_compare);

这使用标准qsort()函数对数组进行排序。 student_info_compare()函数用作比较回调,因为qsort()不知道数据的外观。

比较回调的参数具有类型const void *,这基本上意味着“这里是指向其确切类型未知的东西的指针,并且您应该将其视为只读指针”。这就是qsort()将指针传递给数组元素的方式,因为(再次)它不知道它们是const student_info *类型。