bupt2024大一上计导自定义结构类型练习

发布于:2024-12-23 ⋅ 阅读:(11) ⋅ 点赞:(0)

6-34 实验11_4_综合成绩排名-Swap

分数 100

全屏浏览

切换布局

作者 scs

单位 北京邮电大学

众所周知,计算机院要对申请转入计算机大类的学生进行考核,考核方式包括机试和面试。学生综合成绩采取百分制,其中50%由机试成绩核算,另50%由学生已获得的加权成绩核算。综合成绩优秀者可进入面试环节。现请你写一个根据学生成绩来确定综合成绩排名的程序。

输入:
第一行为一个整数n(0<n<100),代表学生人数。
后边n行为学生信息,格式为,一个字符串代表学生学号(长度不超过15),后边为两个整数,前边的代表机试成绩,后一个代表学生已获得的加权成绩。(两类成绩均在0到100之间)。

输出:
共n行,按综合成绩(机试成绩加加权成绩)从高到低每行输出每个学生的信息,如果综合成绩相同,则机试成绩高的学生在前。每行的格式为:一个字符串(学生学号)加三个整数(4个数据之间均用一个空格分隔),这三个整数依次为综合成绩,机试成绩和加权成绩,测试用例保证输入合法且不存在成绩完全相同的学生。

程序中用的结构体定义及各成员含义如下:

typedef struct
{
    char    id[16]  ;    //学生账号 
    int    total ;    //综合成绩 
    int    ce ;    //机试成绩 
    int    ws ;    //加权成绩 
}STUDENT;

程序中用到3个函数,分别为:

void Swap(STUDENT * s1,STUDENT * s2) ;

其中参数s1,s2为指向两个结构体的指针,其功能是将这两个指针指向的结构体内的值互相交换。

int Comp(STUDENT * s1,STUDENT * s2) ;

其中参数s1,s2为指向两个结构体的指针,其功能是比较两个结构体, 如果s1>s2则返回1,否则返回0。这里s1>s2指的是s1的总分高,或者总分相同时指的是s1的机试成绩高。测试用例保证输入合法且不存在成绩完全相同的学生。

void Sort(STUDENT a[],int size) ;

其中参数a为待排序的结构体数组,size为数组中学生的数量。其功能是将a按题目指定规则排序。

函数接口定义:

本题中大家只需实现下边这一个函数,另外两个函数不需实现,函数接口如下:
void Swap(STUDENT * s1,STUDENT * s2) ;

裁判测试程序样例:

#include <stdio.h>

typedef struct
{
    char    id[16]  ;//学生账号 
    int        total ;    //综合成绩 
    int        ce ;    //机试成绩 
    int        ws ;    //加权成绩 
}STUDENT;

void Sort(STUDENT a[],int size) ; 
void Swap(STUDENT * s1,STUDENT * s2) ;
int  Comp(STUDENT * s1,STUDENT * s2) ;

int main()
{
    STUDENT    stu[100] ;
    int        i , n ;
    
    
    scanf("%d",&n) ;
    for(i=0;i<n;i++)
    {
        scanf("%s%d%d",stu[i].id,&stu[i].ce,&stu[i].ws) ;
        stu[i].total = stu[i].ce+stu[i].ws ;
    }
            
    Sort(stu,n) ;
    for(i=0;i<n;i++)
        printf("%s %d %d %d\n",stu[i].id,stu[i].total,stu[i].ce,stu[i].ws) ;
    
    return 0;    
}

/* 请在这里填写答案 */

输入样例:

3
bupt_2018210001 78 74
bupt_2018210002 95 71
bupt_2018210003 84 75

输出样例:

bupt_2018210002 166 95 71
bupt_2018210003 159 84 75
bupt_2018210001 152 78 74

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

void Swap(STUDENT * s1,STUDENT * s2)
{
    STUDENT s3;
    s3 = *s1;
    *s1 = *s2;
    *s2 = s3;
}

6-35 实验11_5_综合成绩排名-Comp

分数 100

全屏浏览

切换布局

作者 scs

单位 北京邮电大学

众所周知,计算机院要对申请转入计算机大类的学生进行考核,考核方式包括机试和面试。学生综合成绩采取百分制,其中50%由机试成绩核算,另50%由学生已获得的加权成绩核算。综合成绩优秀者可进入面试环节。现请你写一个根据学生成绩来确定综合成绩排名的程序。

输入:
第一行为一个整数n(0<n<100),代表学生人数。
后边n行为学生信息,格式为,一个字符串代表学生学号(长度不超过15),后边为两个整数,前边的代表机试成绩,后一个代表学生已获得的加权成绩。(两类成绩均在0到100之间)。

输出:
共n行,按综合成绩(机试成绩加加权成绩)从高到低每行输出每个学生的信息,如果综合成绩相同,则机试成绩高的学生在前。每行的格式为:一个字符串(学生学号)加三个整数(4个数据之间均用一个空格分隔),这三个整数依次为综合成绩,机试成绩和加权成绩,测试用例保证输入合法且不存在成绩完全相同的学生。

程序中用的结构体定义及各成员含义如下:

typedef struct
{
    char    id[16]  ;//学生账号 
    int    total ;    //综合成绩 
    int    ce ;    //机试成绩 
    int    ws ;    //加权成绩 
}STUDENT;

程序中用到3个函数,分别为:

void Swap(STUDENT * s1,STUDENT * s2) ;

其中参数s1,s2为指向两个结构体的指针,其功能是将这两个指针指向的结构体内的值互相交换。

int Comp(STUDENT * s1,STUDENT * s2) ;

其中参数s1,s2为指向两个结构体的指针,其功能是比较两个结构体, 如果s1>s2则返回1,否则返回0。这里s1>s2指的是s1的总分高,或者总分相同时指的是s1的机试成绩高。测试用例保证输入合法且不存在成绩完全相同的学生。

void Sort(STUDENT a[],int size) ;

其中参数a为待排序的结构体数组,size为数组中学生的数量。其功能是将a按题目指定规则排序。。

函数接口定义:

本题中大家只需实现下边这一个函数,另外两个函数不需实现,函数接口如下:
int  Comp(STUDENT * s1,STUDENT * s2)  ;

裁判测试程序样例:

#include<stdio.h>

typedef struct
{
    char    id[16]  ;//学生账号 
    int    total ;    //综合成绩 
    int    ce ;    //机试成绩 
    int    ws ;    //加权成绩 
}STUDENT;

void Sort(STUDENT a[],int size) ; 
void Swap(STUDENT * s1,STUDENT * s2) ;
int  Comp(STUDENT * s1,STUDENT * s2) ;

int main()
{
    STUDENT    stu[100] ;
    int        i , n ;
    
    
    scanf("%d",&n) ;
    for(i=0;i<n;i++)
    {
        scanf("%s%d%d",stu[i].id,&stu[i].ce,&stu[i].ws) ;
        stu[i].total = stu[i].ce+stu[i].ws ;
    }
            
    Sort(stu,n) ;
    for(i=0;i<n;i++)
        printf("%s %d %d %d\n",stu[i].id,stu[i].total,stu[i].ce,stu[i].ws) ;
    
    return 0;    
}

/* 请在这里填写答案 */

输入样例:

3
bupt_2018210001 78 74
bupt_2018210002 95 71
bupt_2018210003 84 75

输出样例:

bupt_2018210002 166 95 71
bupt_2018210003 159 84 75
bupt_2018210001 152 78 74

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

int  Comp(STUDENT * s1,STUDENT * s2)
{
    if((*s1).total == (*s2).total)
    {
        if((*s1).ce > (*s2).ce)
        {
            return 1;
        }
        else
        {
            return 0;
        }
    }
    else if((*s1).total > (*s2).total)
        return 1;
    else
        return 0;
}

6-36 实验11_6_综合成绩排名-Sort

分数 100

全屏浏览

切换布局

作者 scs

单位 北京邮电大学

众所周知,计算机院要对申请转入计算机大类的学生进行考核,考核方式包括机试和面试。学生综合成绩采取百分制,其中50%由机试成绩核算,另50%由学生已获得的加权成绩核算。综合成绩优秀者可进入面试环节。现请你写一个根据学生成绩来确定综合成绩排名的程序。

输入:
第一行为一个整数n(0<n<100),代表学生人数。
后边n行为学生信息,格式为,一个字符串代表学生学号(长度不超过15),后边为两个整数,前边的代表机试成绩,后一个代表学生已获得的加权成绩。(两类成绩均在0到100之间)。

输出:
共n行,按综合成绩(机试成绩加加权成绩)从高到低每行输出每个学生的信息,如果综合成绩相同,则机试成绩高的学生在前。每行的格式为:一个字符串(学生学号)加三个整数(4个数据之间均用一个空格分隔),这三个整数依次为综合成绩,机试成绩和加权成绩,测试用例保证输入合法且不存在成绩完全相同的学生。

程序中用的结构体定义及各成员含义如下:

typedef struct
{
    char    id[16]  ;    //学生账号 
    int    total ;    //综合成绩 
    int    ce ;    //机试成绩 
    int    ws ;    //加权成绩 
}STUDENT;

程序中用到3个函数,分别为:

void Swap(STUDENT * s1,STUDENT * s2)

其中参数s1,s2为指向两个结构体的指针,其功能是将这两个指针指向的结构体内的值互相交换。

int Comp(STUDENT * s1,STUDENT * s2) ;

其中参数s1,s2为指向两个结构体的指针,其功能是比较两个结构体, 如果s1>s2则返回1,否则返回0。这里s1>s2指的是s1的总分高,或者总分相同时指的是s1的机试成绩高。测试用例保证输入合法且不存在成绩完全相同的学生。

void Sort(STUDENT a[],int size) ;

其中参数a为待排序的结构体数组,size为数组中学生的数量。其功能是将a按题目指定规则排序。

函数接口定义:

本题中大家只需实现第三个函数(实现此函数时可以直接调用题中另外两个函数),函数接口如下:
void Sort(STUDENT a[],int size) ;

裁判测试程序样例:

#include <stdio.h>

typedef struct
{
    char    id[16]  ;//学生账号 
    int    total ;    //综合成绩 
    int    ce ;    //机试成绩 
    int    ws ;    //加权成绩 
}STUDENT;


void Sort(STUDENT a[],int size) ; 
void Swap(STUDENT * s1,STUDENT * s2) ;
int  Comp(STUDENT * s1,STUDENT * s2) ;

int main()
{
    STUDENT    stu[100] ;
    int        i , n ;
    
    
    scanf("%d",&n) ;
    for(i=0;i<n;i++)
    {
        scanf("%s%d%d",stu[i].id,&stu[i].ce,&stu[i].ws) ;
        stu[i].total = stu[i].ce+stu[i].ws ;
    }
            
    Sort(stu,n) ;
    for(i=0;i<n;i++)
        printf("%s %d %d %d\n",stu[i].id,stu[i].total,stu[i].ce,stu[i].ws) ;
    
    return 0;    
}

/* 请在这里填写答案 */

输入样例:

3
bupt_2018210001 78 74
bupt_2018210002 95 71
bupt_2018210003 84 75

输出样例:

bupt_2018210002 166 95 71
bupt_2018210003 159 84 75
bupt_2018210001 152 78 74

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

void Sort(STUDENT a[],int size)
{
    for(int i = 1; i <= size - 1; i++)
    {
        for(int j = 0; j <= size - 1 - i; j++)
        {
            if(!Comp(&a[j], &a[j + 1]))
            {
                Swap(&a[j], &a[j + 1]);
            }
        }
    }
}

7-58 实验11_1_初识结构

分数 100

全屏浏览

切换布局

作者 scs

单位 北京邮电大学

学生的属性包括姓名、学号、5门课程的成绩、平均成绩与总成绩。已知一个学生的姓名、学号与5门课程的成绩,你的任务是计算该学生的平均成绩与总成绩,并将该学生的5门课程成绩按照从高到底进行排序,最后将这个同学的完整信息输出。学生的姓名中只能包含大小写字母与空格字符,不会超过20个字符;学生的学号是个长度不会超过20的字符串,只包含数字字符;课程成绩均为0—100的整数。

要求:

1.在本题中,你要设计一个结构来存储学生的信息。在此结构中,需要有一个字符数组来存储姓名;一个字符数组来存储学号;一个长度为5的整型数组来存储5门课程的成绩;一个双精度浮点型变量存储平均成绩,一个整型变量存储总成绩。

2.在对结构变量的成员进行赋值与排序的时候,你要使用“结构变量名+‘.’+结构成员名”这种方式访问变量,如“student.score”;而在输出学生信息时,你要用一个结构指针指向该结构,然后用结构指针访问结构中的变量,即“结构指针名+‘->’+结构成员名”,如“ptr->score”。

输入格式:

学生信息的输入按照姓名、学号、5门课程成绩的顺序输入,共占三行,具体格式见样例。

输出格式:

姓名占一行;学号占一行;5门成绩中间用空格分开,最后一个成绩后是换行符,从高到底进行排序,占一行;平均成绩与总成绩用空格分隔,占一行,平均成绩保留两位小数。

输入样例:

Liu Mengmeng
0821131666666
88 90 93 91 85

输出样例:

Name:Liu Mengmeng
ID:0821131666666
Score:93 91 90 88 85
average:89.40 total:447

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB

#include <stdio.h>

typedef struct{
    char name[21];
    char id[21];
    int score[5];
}STUDENT;

int main()
{
    STUDENT a;
    gets(a.name);
    gets(a.id);

    int n  = 5;
    int sum = 0;
    for(int i = 0; i < n; i++)
    {
        scanf("%d", &a.score[i]);
        sum += a.score[i];
    }

    for(int i = 1; i <= n - 1; i++)
    {
        for(int j = 0; j <= n - 1 - i; j++)
        {
            if(a.score[j] < a.score[j + 1])
            {
                int temp = a.score[j];
                a.score[j] = a.score[j + 1];
                a.score[j + 1] = temp;
            }
        }
    }

    STUDENT * ptr = NULL;
    ptr = &a;
    printf("Name:");
    puts(ptr->name);
    printf("ID:");
    puts(ptr->id);
    printf("Score:");
    for(int i = 0; i < n; i++)
    {
        if(i == n - 1)
            printf("%d\n", ptr->score[i]);
        else
            printf("%d ", ptr->score[i]);
    }
    printf("average:%.2f total:%d\n", (float)sum/n, sum);

    return 0;
}

7-59 实验11_2_初识结构数组

分数 100

全屏浏览

切换布局

作者 scs

单位 北京邮电大学

有n名学生,每个学生的信息包括姓名、学号、5门课程的成绩,平均成绩与总成绩。已知学生的姓名、学号与5门课程的成绩,你的任务是计算每个学生的平均成绩与总成绩,并将它们输出。学生的姓名中只能包含大小写字母与空格字符,不会超过20个字符;学生的学号是个长度不会超过20的字符串,只包含数字字符;课程成绩均为0—100的整数。

要求:在本题中,你要设计一个结构来存储一个学生的信息。在此结构中,需要有一个字符数组来存储姓名;一个字符数组来存储学号;一个长度为5的整型数组来存储5门课程的成绩;一个双精度浮点型变量存储平均成绩,一个整型变量存储总成绩。然后,你要设计一个结构数组来存储n名学生的信息。

输入格式:

输入首先是一个正整数n,代表学生的数量,1<=n<=100;每名学生的信息按照姓名、学号、5门课程成绩的顺序输入,共占三行。输入具体格式见样例。

输出格式:

姓名占一行;学号占一行;5门课程成绩中间用空格分开,最后一个成绩后是换行符,占一行;平均与总成绩用空格分隔,占一行,平均成绩保留两位小数;每名同学的信息后都再输出一个空行。
注意:每名同学的信息后都再输出一个空行。

输入样例:

4
xiaowang
0821131699999
87 98 79 90 68
Liu Mengmeng
0821131666666
88 90 93 91 85
Albert Einstein
0821131477777
75 87 100 66 64
Bill Gates
0821131588888
65 58 77 60 61

输出样例:

Name:xiaowang
ID:0821131699999
Score:87 98 79 90 68
average:84.40 total:422

Name:Liu Mengmeng
ID:0821131666666
Score:88 90 93 91 85
average:89.40 total:447

Name:Albert Einstein
ID:0821131477777
Score:75 87 100 66 64
average:78.40 total:392

Name:Bill Gates
ID:0821131588888
Score:65 58 77 60 61
average:64.20 total:321


代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB

#include <stdio.h>

typedef struct{
    char name[21];
    char id[21];
    int score[5];
}STUDENT;

int main()
{
    int n;
    scanf("%d", &n);
    getchar();
    
    STUDENT student[n];

    int size = 5;
    for(int i = 0; i < n; i++)
    {
        int sum = 0;
        gets(student[i].name);
        gets(student[i].id);

        for(int m = 0; m < size; m++)
        {
            scanf("%d", &(student[i]).score[m]);
            sum += (student[i]).score[m];
        }
        getchar();

        STUDENT * ptr = &student[i];
        printf("Name:%s\n", ptr->name);
        printf("ID:");
        puts(ptr->id);
        printf("Score:");
        for(int j = 0; j < size; j++)
        {
            if(j == size - 1)
                printf("%d\n", ptr->score[j]);
            else
                printf("%d ", ptr->score[j]);
        }
        printf("average:%.2f total:%d\n\n", (float)sum / size, sum);
    }

    return 0;
}

7-60 实验11_3_结构排序

分数 100

全屏浏览

切换布局

作者 scs

单位 北京邮电大学

有n名学生,每个学生的属性包括姓名与总成绩。已知学生的姓名与总成绩,你的任务是将学生的信息按照以下方式排序:首先比较总成绩,总成绩高的在前面,总成绩低的在后面,当总成绩相同时,你要比较学生的姓名,姓名字典序小的同学在前面,姓名字典序大的同学在后面(ASCII码顺序)。n的范围是1—100;学生的姓名中只能包含大小写字母,不会超过20个字符;总成绩为整数。

要求:在本题中,你要设计一个结构来存储学生的信息。在此结构中,需要有一个字符数组来存储姓名,一个整型变量存储总成绩。

输入格式:

首先输入一个正整数n,代表学生的数量,1<=n<=100;每名学生的信息按照姓名、总成绩的顺序输入(空格分开),每名学生信息占一行。具体格式见样例。

输出格式:

n名学生的信息,姓名占一行,总成绩占一行,输出顺序要按照题目的要求,每名同学的信息后都再输出一个空行。
注意:每名同学的信息后都再输出一个空行。

输入样例:

4
AlbertEinstein 1328
GeorgeWalkerBush 860
LiuMengmeng 1475
BillGates 1328

输出样例:

Name:LiuMengmeng
total:1475

Name:AlbertEinstein
total:1328

Name:BillGates
total:1328

Name:GeorgeWalkerBush
total:860


代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB

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

typedef struct{
    char name[21];
    int total;
}STUDENT;

void Swap(STUDENT * s1, STUDENT * s2)
{
    STUDENT s3 = *s1;
    *s1 = *s2;
    *s2 = s3;
}

int Cmp(STUDENT * s1, STUDENT * s2)
{
    if(s1->total > s2->total)
        return 1;
    else if(s1->total == s2->total)
    {
        if(strcmp(s1->name , s2->name) < 0)
            return 1;
        else
            return 0;
    }
    else
        return 0;
}

int main()
{
    int n;
    scanf("%d", &n);
    getchar();
    
    STUDENT student[n];
    for(int i = 0; i < n; i++)
    {
        scanf("%s", student[i].name);
        scanf("%d", &student[i].total);
        getchar();
    }

    for(int i = 1; i <= n - 1; i++)
    {
        for(int j = 0; j <= n - 1 - i; j++)
        {
            if(!Cmp(&student[j], &student[j + 1]))
                Swap(&student[j], &student[j + 1]);
        }
    }

    for(int i = 0; i < n; i++)
    {
        STUDENT * ptr = &student[i];
        printf("Name:%s\n", ptr->name);
        printf("total:%d\n\n", ptr->total);
    }

    return 0;
}

7-61 实验11_7_学生信息管理系统

分数 100

全屏浏览

切换布局

作者 scs

单位 北京邮电大学

创建学生信息管理系统,具体要求如下:

学生信息包括:学号 姓名 数学成绩 英语成绩 计算机成绩

功能1:添加学生信息
执行1时,输入学号,姓名,三门科目成绩;如果添加学生成功则输出“Add success”,如果学生已存在则输出“Students already exist”

功能2:删除学生信息
执行2时,输入学号信息;如果学生不存在,输出“Students do not exist”,如果存在,则输出“Delete success”

功能3:更改学生成绩信息
执行3时,输入学号信息;如果学生不存在,输出“Students do not exist”,如果存在,输出“Update success”

功能4:显示学生平均分成绩
执行4时,输入学号信息;如果学生不存在,输出“Students do not exist”,如果存在,则输出学生信息,如下格式:

Student ID:2019989890

Name:Jerry

Average Score:89.3

其中平均分为三门科目相加除以3,保留一位小数,每行之间换行。

输入格式:

第一行为一个整数n(0<n<130),后边共n行,每一行表示执行一种功能。其中1,2,3,4分别对应执行上面4种功能,具体格式见输入样例。
测试用例保证:学号和名字均为长度不超过10的字符串,各门课成绩为0到100之间的整数。
特别提醒:当执行更改学生成绩操作时,无论学生是否存在,你的程序都要读入那三个成绩。否则会影响后续的输入。

输出格式:

输入样例:

8
1 201817123 Tom 89 80 76
1 2019989890 Jerry 78 99 67
4 201817123
2 201817123
4 201817123
4 2019989890
3 2019989890 79 90 99
4 2019989890

输出样例:

Add success
Add success
Student ID:201817123
Name:Tom
Average Score:81.7
Delete success
Students do not exist
Student ID:2019989890
Name:Jerry
Average Score:81.3
Update success
Student ID:2019989890
Name:Jerry
Average Score:89.3

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

栈限制

8192 KB

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

typedef struct{
    char id[11];
    char name[11];
    int score[3];
    int ex;
}STUDENT;

int Cmp(STUDENT s1[150], STUDENT * s, int size)
{
    for(int i = 0; i < size; i++)
    {
        if(strcmp(s1[i].id, s->id) == 0)
            if(s1[i].ex == 1)
                return i;
    }

    return -1;
}

int main()
{
    STUDENT student[150];

    int n;
    scanf("%d", &n);

    int count = 0;
    while(n--)
    {
        STUDENT arr;
        arr.ex = 1;
        int flag;
        scanf("%d", &flag);
        getchar();
        if(flag == 1)
        {
            scanf("%s %s", arr.id, arr.name);
            scanf("%d %d %d", &arr.score[0], &arr.score[1], &arr.score[2]);
            int tag = Cmp(student, &arr, count);
            if(tag >= 0)
            {
                printf("Students already exist\n");
            }
            else if(tag == -1)
            {
                student[count] = arr;
                count++;
                printf("Add success\n");
            }
        }
        else if(flag == 2)
        {
            scanf("%s", arr.id);
            int tag = Cmp(student, &arr, count);
            if(tag >= 0)
            {
                student[tag].ex = 0;
                printf("Delete success\n");
            }
            else if(tag == -1)
            {
                printf("Students do not exist\n");
            }
        }
        else if(flag == 3)
        {
            scanf("%s", arr.id);
            scanf("%d %d %d", &arr.score[0], &arr.score[1], &arr.score[2]);
            int tag = Cmp(student, &arr, count);
            if(tag >= 0)
            {
                for(int qwq = 0; qwq < 3; qwq++)
                {
                    student[tag].score[qwq] = arr.score[qwq];
                }
                printf("Update success\n");
            }
            else if(tag == -1)
            {
                printf("Students do not exist\n");
            }
        }
        else if(flag == 4)
        {
            scanf("%s", arr.id);
            int tag = Cmp(student, &arr, count);
            if(tag >= 0)
            {
                int sum = 0;
                for(int qwq = 0; qwq < 3; qwq++)
                {
                    sum += student[tag].score[qwq];
                }
                float average = (float)sum/3;
                printf("Student ID:%s\nName:%s\nAverage Score:%.1f\n", student[tag].id,student[tag].name,average);
            }
            else if(tag == -1)
            {
                printf("Students do not exist\n");
            }
        }
    }

    return 0;
}