鱼C论坛

 找回密码
 立即注册
查看: 2125|回复: 2

[已解决]单科成绩排序(结构体专题)

[复制链接]
发表于 2020-12-22 11:52:44 | 显示全部楼层 |阅读模式
50鱼币
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[12];  
10.    int scores[3];  
11.};  
12.int main()  
13.{  
14.    int n,i,j,f,m;  
15.    scanf("%d",&n);  
16.    struct student student[n];  
17.    for(i=0;i<n;i++)  
18.    {scanf("%d %s ",&student[i].num,&student[i].name);  
19.        for(j=0;j<3;j++)  
20.        {  
21.            scanf("%d",student[i].scores[j]);  
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[j].scores[f]>student[j+1].scores[f])  
30.            {  
31.                m=student[j].scores[f];  
32.                student[j].scores[f]=student[j+1].scores[f];  
33.                student[j+1].scores[f]=m;  
34.            }  
35.        }  
36.    }  
37. for(j=0;j<3;j++)  
38. {  
39.     printf("%d %s ",student[j].num,student[j].name);  
40.     for(i=0;i<3;i++)  
41.        printf("%d ",student[j].scores[i]);  
42.     printf("\n");  
43. }  
44.  
45.}  

最佳答案
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[16];  
        //姓名不超过20个字符,12个字符肯定不够
    char name[24];  
    int scores[3];  
}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[i].num,
                        student[i].name,
                        &(student[i].scores[0]),
                        &(student[i].scores[1]),
                        &(student[i].scores[2]));  
        }  

        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[i].scores[f] < student[j].scores[f])
                        {
                                swap(student+i,student+j);
                        }
                        //成绩相等的按学号升序来排
                        else if(student[i].scores[f]==student[j].scores[f] && cmp(student[i].num,student[j].num))
                        {
                                swap(student+i,student+j);
                        }
                }  
        }  

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

        return 0;
}  

最佳答案

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[16];  
        //姓名不超过20个字符,12个字符肯定不够
    char name[24];  
    int scores[3];  
}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[i].num,
                        student[i].name,
                        &(student[i].scores[0]),
                        &(student[i].scores[1]),
                        &(student[i].scores[2]));  
        }  

        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[i].scores[f] < student[j].scores[f])
                        {
                                swap(student+i,student+j);
                        }
                        //成绩相等的按学号升序来排
                        else if(student[i].scores[f]==student[j].scores[f] && cmp(student[i].num,student[j].num))
                        {
                                swap(student+i,student+j);
                        }
                }  
        }  

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

        return 0;
}  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-12-22 18:54:17 | 显示全部楼层
额,你没有竞争对手,应当第一....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 10:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表