782353676 发表于 2020-12-22 11:52:44

单科成绩排序(结构体专题)

Description


有一学生成绩表,包括学号、姓名、3门课程成绩。请按要求排序输出:若输入1,则按第1门课成绩降序输出成绩表,若输入为i(1<=i<=3),则按第i门课成绩降序输出成绩表。

Input


首先输入一个整数n(1<=n<=100),表示学生人数;
然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。
最后一行输入一个整数i,表示要求按第i门课成绩降序排序输出,若该门课成绩相同,则按学号升序。

Output


输出按第i门课降序排序的结果,格式见样例。

Sample Input
3
541207010188 Zhangling 89 78 95
541207010189 Wangli 85 87 99
541207010190 Fangfang 85 68 76
1


Sample Output
541207010188 Zhangling 89 78 95
541207010189 Wangli 85 87 99
541207010190 Fangfang 85 68 76


我的代码在运行第一个学生信息后就闪退

代码如下

01.#1477
02.#include <stdio.h>
03.#include <stdlib.h>
04.#include <string.h>
05.
06.struct student
07.{
08.    int num;
09.    char name;
10.    int scores;
11.};
12.int main()
13.{
14.    int n,i,j,f,m;
15.    scanf("%d",&n);
16.    struct student student;
17.    for(i=0;i<n;i++)
18.    {scanf("%d %s ",&student.num,&student.name);
19.      for(j=0;j<3;j++)
20.      {
21.            scanf("%d",student.scores);
22.      }
23.    }
24.    scanf("%d",&f);
25.    for(i=1;i<3;i++)
26.    {
27.      for(j=0;j<3-i;j++)
28.      {
29.            if(student.scores>student.scores)
30.            {
31.                m=student.scores;
32.                student.scores=student.scores;
33.                student.scores=m;
34.            }
35.      }
36.    }
37. for(j=0;j<3;j++)
38. {
39.   printf("%d %s ",student.num,student.name);
40.   for(i=0;i<3;i++)
41.      printf("%d ",student.scores);
42.   printf("\n");
43. }
44.
45.}

xieglt 发表于 2020-12-22 11:52:45

本帖最后由 xieglt 于 2020-12-22 14:39 编辑

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

typedef struct tagstudent
{
        //12位的学号已经超过int类型的最大值,因此用char 数组存储
    char num;
        //姓名不超过20个字符,12个字符肯定不够
    char name;
    int scores;
}STUDENT,*LPSTUDENT;


void swap(LPSTUDENT a,LPSTUDENT b)
{
        STUDENT _a;
        memcpy(&_a,a,sizeof(STUDENT));
        memcpy(a,b,sizeof(STUDENT));
        memcpy(b,&_a,sizeof(STUDENT));
}

int cmp(char * a,char * b)
{
        return strcmp(a,b) >= 0 ? 1 : 0;
}

int main()
{
        int n,i,j;
        unsigned int f;
        LPSTUDENT student;
        printf("Input number of students:\n");
        scanf("%d",&n);
        //我的编译器不支持动态数组,只能动态分配内存
        //不要把结构体和变量同名 struct student student
        student = (LPSTUDENT)malloc(n * sizeof(STUDENT));

        printf("Please input number,name,scores of student:\n");

        for(i=0;i<n;i++)
        {
                scanf("%s %s %d %d %d",
                        student.num,
                        student.name,
                        &(student.scores),
                        &(student.scores),
                        &(student.scores));
        }

        printf("Please input the sort index:\n");
        scanf("%u",&f);
        f = (f+2) % 3;
       
        //排序是按某科成绩给所有学生排序
        for(i=0;i<n;i++)
        {
                for(j=i+1;j<n;j++)
                {
                        //成绩按降序排列,大数放前面
                        if(student.scores < student.scores)
                        {
                                swap(student+i,student+j);
                        }
                        //成绩相等的按学号升序来排
                        else if(student.scores==student.scores && cmp(student.num,student.num))
                        {
                                swap(student+i,student+j);
                        }
                }
        }

        for(j=0;j<n;j++)
        {
                printf("%s %s ",student.num,student.name);
                for(i=0;i<3;i++)
                printf("%d ",student.scores);
                printf("\n");
        }
       
        free(student);

        return 0;
}

782353676 发表于 2020-12-22 18:54:17

额,你没有竞争对手,应当第一....
页: [1]
查看完整版本: 单科成绩排序(结构体专题)