| 
 | 
 
1.编辑与调试  2.顺序结构  3.选择结构一  4.选择结构二  5.循环一  6.循环二  7.函数 
8.递归与嵌套函数  9.一维数组和二维数组  10.字符数组  11.指针一  12.指针二  13.结构体  
14.文件 
结构体 
 
第1关:结构体变量的初始化和引用 
 
任务描述 
本关任务:从键盘输入两个学生的学号,姓名和成绩(整数),分别存入结构体中,输出成绩较高的学生的学号,姓名和成绩。 
相关知识 
结构体类型用于描述由多个不同数据类型的数据构成的复合数据,是一种用户自定义数据类型。 
编程要求 
在右侧编辑器Begin-End处补充代码,将测试输入信息存入结构体中,完成输出成绩较高的学生的学号,姓名和成绩。 
测试说明 
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试: 
测试输入: 
14308100238 xiaowang 99 
15408122584 xiaoli 78 
预期输出: 
14308100238 xiaowang 99 
测试输入数据说明: 
输入包含两行,每行包含学生的学号(11位的整数),姓名(字符串,长度不超过20)和成绩(整数)。 
解题程序 
#include<stdio.h> 
/*********Begin*********/ 
struct Student { 
    char no[11 + 1]; 
    char name[20 + 1]; 
    int score; 
}; 
 
int main(void) 
{ 
    struct Student a, b; 
    scanf(&#34;%s%s%d&#34;, a.no, a.name, &a.score); 
    scanf(&#34;%s%s%d&#34;, b.no, b.name, &b.score); 
    if (a.score >= b.score) 
        printf(&#34;%s %s %d\n&#34;, a.no, a.name, a.score); 
    else 
        printf(&#34;%s %s %d\n&#34;, b.no, b.name, b.score); 
} 
/*********End*********/ 
 
第2关:结构体排序 
 
任务描述 
本关任务:有n个学生的信息(包括学号,姓名,成绩),要求按照成绩的高低顺序输出学生的信息。 
编程要求 
在右侧编辑器Begin-End处补充代码,要求按照成绩的高低顺序输出学生的信息。 
测试说明 
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试: 
测试输入: 
5 
10101 Zhang 78 
10103 Wang 98 
10106 Li 86 
10108 Ling 73 
10110 Sun 100 
预期输出: 
10110 Sun 100 
10103 Wang 98 
10106 Li 86 
10101 Zhang 78 
10108 Ling 73 
测试输入数据说明: 
第一行为整数n表示有n个学生, 1<=n<=200。接下来包含n行数据,每行数据代表一个学生的信息,按学号(11位的整数),姓名(字符串,长度不超过20)和成绩(整数)。 
解题说明 
冒泡排序按从大到小排序; 
采用改进的冒泡排序算法,如果已经没有交换则结束。 
解题程序 
#include<stdio.h> 
#include <string.h> 
/*********Begin*********/ 
#define N 200 
struct Student { 
    char no[11 + 1]; 
    char name[20 + 1]; 
    int score; 
} r[N]; 
 
/* 冒泡排序 */ 
void swap(int i, int j) 
{ 
    struct Student t; 
    memcpy(&t, &r, sizeof t); 
    memcpy(&r, &r[j], sizeof t); 
    memcpy(&r[j], &t, sizeof t); 
} 
void bubblesort(struct Student a[], int n) 
{ 
    int i, j, cnt = 1; 
 
    for (i = 0; cnt > 0 && i < n - 1; i++) { 
        cnt = 0; 
        for (j = 0; j < n - 1 - i; j++) 
            if (r[j].score < r[j + 1].score) { 
                swap(j, j + 1); /* 交换两个相邻的数 */ 
                cnt++; 
            } 
    } 
} 
/*********End**********/ 
int main(void) 
{ 
        /*********Begin*********/ 
    int n; 
    scanf(&#34;%d&#34;, &n); 
    for (int i = 0; i < n; i++) 
        scanf(&#34;%s%s%d&#34;, r.no, r.name, &r.score); 
 
    bubblesort(r, n); 
 
    for (int i = 0; i < n; i++) 
        printf(&#34;%s %s %d\n&#34;, r.no, r.name, r.score); 
        /*********End**********/ 
    return 0; 
} 
 
第3关:结构体存储数据 
 
任务描述 
本关任务:有三个候选人,每个选民只能投一票,写一程序,用结构体存储数据,求出得票结果。 
三个候选人为&#34;Li&#34;, “Zhang”,“Sun”。 
编程要求 
在右侧编辑器Begin-End处补充代码,用结构体存储数据,求出得票结果。 
测试说明 
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试: 
测试输入: 
10 
Li 
Li 
Sun 
Zhang 
Zhang 
Sun 
Li 
Sun 
Zhang 
Li 
预期输出: 
Li:4 
Zhang:2 
Sun:3 
测试输入数据说明: 
输入数据第一行包含一个整数n,表示有n个人投票。接下来的每一行包含某个候选人的名字。 
解题程序 
#include<stdio.h> 
#include<string.h> 
/*********Begin*********/ 
struct Count { 
    int lcnt, zcnt, scnt; 
}; 
/*********End**********/ 
int main(void) 
{ 
        /*********Begin*********/ 
    struct Count cnt; 
    cnt.lcnt = cnt.zcnt = cnt.scnt = 0; 
 
    char s[8]; 
    int n; 
    scanf(&#34;%d&#34;, &n); 
    for (int i = 1; i <= n; i++) { 
        scanf(&#34;%s&#34;, s); 
        if (strcmp(s, &#34;Li&#34;) == 0) cnt.lcnt++; 
        else if (strcmp(s, &#34;Zhang&#34;) == 0) cnt.zcnt++; 
        else if (strcmp(s, &#34;Sun&#34;) == 0) cnt.scnt++; 
    } 
 
    printf(&#34;Li:%d\nZhang:%d\nSun:%d\n&#34;, cnt.lcnt, cnt.zcnt, cnt.scnt); 
        /*********End**********/ 
    return 0; 
} 
 
第4关:结构体存储学生信息 
 
任务描述 
本关任务:使用结构体储存学生信息(包括学号,姓名,3门课程成绩,总分),要求实现对学生信息修改和删除操作,最多50名学生。 
编程要求 
在右侧编辑器Begin-End处补充代码,使用结构体储存学生信息,实现对学生信息修改和删除操作。 
测试说明 
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试: 
测试输入: 
10 3 
1 Siyu 90 90 90 
2 Amy 60 70 94 
3 Jack 60 60 98 
4 Jack 77 90 60 
5 Banana 60 60 40 
6 White 60 60 60 
7 Pinkman 60 60 60 
8 Fring 60 60 70 
9 Ehrmantraut 80 63 61 
10 Schrader 99 66 100 
1 Jack 
2 1 100 100 100 
3 10 
测试输入数据说明: 
输入一个n,q,标书下面n行则是n个学生的信息,再下q行则是对应的操作。 
1 name //为根据名字查询操作 
2 sno num1 num2 num2 //为修改分数操作,修改学号为sno的3门成绩 
3 sno //为删除操作 
预期输出: 
3 Jack 60 60 98 218 
4 Jack 77 90 60 227 
1 Siyu 100 100 100 300 
2 Amy 60 70 94 224 
3 Jack 60 60 98 218 
4 Jack 77 90 60 227 
5 Banana 60 60 40 160 
6 White 60 60 60 180 
7 Pinkman 60 60 60 180 
8 Fring 60 60 70 190 
9 Ehrmantraut 80 63 61 204 
10 Schrader 99 66 100 265 
1 Siyu 100 100 100 300 
2 Amy 60 70 94 224 
3 Jack 60 60 98 218 
4 Jack 77 90 60 227 
5 Banana 60 60 40 160 
6 White 60 60 60 180 
7 Pinkman 60 60 60 180 
8 Fring 60 60 70 190 
9 Ehrmantraut 80 63 61 204 
预期输出数据说明: 
每次修改操作则输出全部的学生信息,查询操作则输出查询的学生的信息。 
解题说明 
测试数据有BUG。删除时数据的数量应该是减少一个,可是… 
解题程序 
#include<stdio.h> 
#include<string.h> 
int Count; 
struct student{ 
    char sno[20],name[20]; 
    int math,english,chinese,sum; 
}; 
void print(struct student stu){ 
    printf(&#34;%s %s %d %d %d %d\n&#34;,stu.sno,stu.name,stu.math,stu.english,stu.chinese,stu.sum); 
} 
void query_stu(struct student s[],char *name){ 
    /*********Begin*********/ 
    for (int i = 0; i < Count; i++)  
        if (strcmp(name, s.name) == 0) 
            print(s); 
    /*********End**********/ 
} 
void delete_stu(struct student s[],char *sno){ 
    /*********Begin*********/ 
    for (int i = 0; i < Count; i++) 
        if (strcmp(sno, s.sno) == 0) { 
            for (int j = i + 1; j < Count; j++) 
                s[i++] = s[j]; 
            /* Count--; */ 
            break; 
        } 
    /*********End**********/ 
} 
void update_stu(struct student s[],char *sno,int math,int english,int chinese){ 
    /*********Begin*********/ 
    for (int i = 0; i < Count; i++) 
        if (strcmp(sno, s.sno) == 0) { 
            s.math = math; 
            s.english = english; 
            s.chinese = chinese; 
            s.sum = math + english + chinese; 
        } 
    /*********End**********/ 
} 
int main(void) 
{ 
    int n,q; 
    struct student students[50]; 
    scanf(&#34;%d%d&#34;,&n,&q); 
    Count=n; 
    for(int i=0;i<n;i++){ 
        /*********Begin*********/ 
        scanf(&#34;%s%s%d%d%d&#34;, students.sno, students.name, &students.math,  
            &students.english, &students.chinese); 
        students.sum = students.math + students.english + students.chinese; 
        /*********End**********/ 
    } 
    while(q--){ 
        int op; 
        scanf(&#34;%d&#34;,&op); 
        char sno[20],name[20]; 
        if(op==1){ 
            scanf(&#34;%s&#34;,name); 
            query_stu(students,name); 
        } 
        else if(op==2){ 
            int a,b,c; 
            scanf(&#34;%s%d%d%d&#34;,sno,&a,&b,&c); 
            update_stu(students,sno,a,b,c); 
            for(int i=0;i<Count;i++) 
                print(students); 
        } 
        else{ 
            scanf(&#34;%s&#34;,sno); 
            delete_stu(students,sno); 
            for(int i=0;i<Count-1;i++) 
                print(students); 
        } 
    } 
    return 0; 
} 
 
1.编辑与调试  2.顺序结构  3.选择结构一  4.选择结构二  5.循环一  6.循环二  7.函数 
8.递归与嵌套函数  9.一维数组和二维数组  10.字符数组  11.指针一  12.指针二  13.结构体  
14.文件 |   
 
 
 
 |