实验八全解

7-1 实验11_1_初识结构

学生的属性包括姓名、学号、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

 答案:

#include <stdio.h>

struct student {
    char name[21];
    char id[21];
    int scores[5];
    double average;
    int total;
};

int main(){
    struct student s;
    gets(s.name);
    gets(s.id);
    
    for(int i=0;i<5;i++){
        scanf("%d",&s.scores[i]);
    }

    int temp=0,hasChanged=0,finish=0;
    while(!finish){
        hasChanged=0;
        for(int i=0;i<4;i++){
            if(s.scores[i]<s.scores[i+1]){
                temp=s.scores[i];
                s.scores[i]=s.scores[i+1];
                s.scores[i+1]=temp;
                hasChanged=1;
            }
        }
        if(!hasChanged){
            finish=1;
        }
    }

    int totals=0;
    printf("Name:%s\nID:%s\n",s.name,s.id);
    for(int i=0;i<5;i++){
        if(i==0){
            printf("Score:%d",s.scores[i]);
        }else{
            printf(" %d",s.scores[i]);
        }
        totals+=s.scores[i];
    }
    s.average=1.0*totals/5;
    s.total=totals;
    printf("\naverage:%.2lf total:%d\n",s.average,s.total);
    
}

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

有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

答案: 

#include <stdio.h>

struct student {
    char name[21];
    char id[21];
    int scores[5];
    double average;
    int total;
};

int main(){
    int n=0;
    scanf("%d\n",&n);
    while(n>0){
        struct student s;
        gets(s.name);
        gets(s.id);
        
        for(int i=0;i<5;i++){
            scanf("%d\n",&s.scores[i]);
        }
    
        
    
        int totals=0;
        printf("Name:%s\nID:%s\n",s.name,s.id);
        for(int i=0;i<5;i++){
            if(i==0){
                printf("Score:%d",s.scores[i]);
            }else{
                printf(" %d",s.scores[i]);
            }
            totals+=s.scores[i];
        }
        s.average=1.0*totals/5;
        s.total=totals;
        printf("\naverage:%.2lf total:%d\n\n",s.average,s.total);
        n-=1;
    }
}

7-3 实验11_3_结构排序

有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

答案:

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

struct student {
    char name[21];
    int scores;
};

void swape(struct student * s1, struct student * s2);

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

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

    int hasChanged = 0 , finish = 0;
    while(!finish){
        hasChanged=0;
        for(int i=0;i<n-1;i++){
            if(s[i].scores<s[i+1].scores){
                swape(&s[i],&s[i+1]);
                hasChanged=1;
            }
        }
        if(!hasChanged){
            finish=1;
        }
    }

    finish=0;

    while(!finish){
        hasChanged=0;
        for(int i=0;i<n-1;i++){
            if(s[i].scores==s[i+1].scores && strcmp(s[i].name,s[i+1].name)>0){
                swape(&s[i],&s[i+1]);
                hasChanged=1;
            }
        }
        if(!hasChanged){
            finish=1;
        }
    }

    for(int i=0;i<n;i++){
        printf("Name:%s\ntotal:%d\n\n",s[i].name,s[i].scores);
    }
}

void swape(struct student *s1, struct student *s2){
    struct student stemp = *s1;
    *s1 = *s2;
    *s2 = stemp;
}

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

 

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

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

功能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

答案:

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

struct student {
    char name[11];
    char id[11];
    int scores[3];
};

void swape(struct student * s1, struct student * s2);

int main(){
    struct student s[100];
    int totalNum=0;
    
    int n;
    scanf("%d",&n);

    int cmd=0;
    int ifexist=0;
    for(int i=0;i<n;i++){
        scanf("%d",&cmd);
        if(cmd==1){
            ifexist=-1;
            char tempID[11];
            char tempName[11];
            int tempScores[3];
            scanf("%s %s %d %d %d",tempID,tempName,&tempScores[0],&tempScores[1],&tempScores[2]);
            for(int j=0;j<totalNum;j++){
                if(!strcmp(s[j].id,tempID)){
                    ifexist = 1;
                    break;
                }
            }
            if(ifexist!=-1){
                printf("Students already exist\n");
            }else{
                printf("Add success\n");
                strcpy(s[totalNum].id,tempID);
                strcpy(s[totalNum].name,tempName);
                s[totalNum].scores[0]=tempScores[0];
                s[totalNum].scores[1]=tempScores[1];
                s[totalNum].scores[2]=tempScores[2];
                totalNum+=1;
            }
        }else if(cmd==2){
            ifexist=-1;
            char tempID[11];
            scanf("%s",tempID);
            for(int j=0;j<totalNum;j++){
                if(!strcmp(s[j].id,tempID)){
                    ifexist = j;
                    break;
                }
            }
            if(ifexist==-1){
                printf("Students do not exist\n");
            }else{
                printf("Delete success\n");
                s[ifexist].id[0]='\0';
            }
            
        }else if(cmd==3){
            ifexist=-1;
            char tempID[11];
            int tempScores[3];
            scanf("%s %d %d %d",tempID,&tempScores[0],&tempScores[1],&tempScores[2]);
            for(int j=0;j<totalNum;j++){
                if(!strcmp(s[j].id,tempID)){
                    ifexist = j;
                    break;
                }
            }
            if(ifexist==-1){
                printf("Students do not exist\n");
            }else{
                printf("Update success\n");
                s[ifexist].scores[0]=tempScores[0];
                s[ifexist].scores[1]=tempScores[1];
                s[ifexist].scores[2]=tempScores[2];
            }
            
        }else if(cmd==4){
            ifexist=-1;
            char tempID[11];
            scanf("%s",tempID);
            for(int j=0;j<totalNum;j++){
                if(!strcmp(s[j].id,tempID)){
                    ifexist = j;
                    break;
                }
            }
            if(ifexist==-1){
                printf("Students do not exist\n");
            }else{
                printf("Student ID:%s\nName:%s\nAverage Score:%.1f\n",s[ifexist].id,s[ifexist].name,1.0*(s[ifexist].scores[0]+s[ifexist].scores[1]+s[ifexist].scores[2])/3);
            }
            
        }
    }
}

void swape(struct student *s1, struct student *s2){
    struct student stemp = *s1;
    *s1 = *s2;
    *s2 = stemp;
}

 

  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值