(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)

目录
第1关:结构体变量的初始化和引用:
题目:
代码思路:
代码表示:
第2关:结构体排序
题目:
代码思路:
这题和上一题的 http://t.csdn.cn/wRK6M代码表示:
第3关:结构体存储数据:
题目:
代码思路:
代码表示:
第4关:结构体存储学生信息:
题目:
代码思路:
代码表示:
本关任务:从键盘输入两个学生的学号,姓名和成绩(整数),分别存入结构体中,输出成绩较高的学生的学号,姓名和成绩。
测试输入:
14308100238 xiaowang 99
15408122584 xiaoli 78预期输出:
14308100238 xiaowang 99
结构体的定义
定义格式为:
struct <结构体类型名> { <成员表> }; //分号结束定义例如,以下是一个描述学生信息的结构体类型定义:
struct student {long number;char name[20];char sex;float score; };在这个结构体定义中,结构体类型名为
student,该结构体由4个成员组成。第一个成员为number,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为score,实型变量。应该注意在花括号后的分号是不可少的声明结构体变量
声明结构体变量有四种方式,他们在本质上没什么区别,可根据自己习惯和要求选择你喜欢的方式:
1.先定义结构体,再声明结构体变量
struct student{long number;char name[20];char sex;float score; }; //先定义结构体 struct student s1,s2;//声明结构体变量2. 在定义结构体类型的同时声明结题变量
struct student{long number;char name[20];char sex;float score; }s1,s2; //在定义结构体的同时定义结构体变量3.直接声明结构体变量
struct { //省去结构体名long number;char name[20];char sex;float score; }s1,s2; //直接给出结构体变量4.
typedef引用别名来定义typedef struct student STUDENT; //给结构体student定义别名 struct student {long number;char name[20];char sex;float score; }; STUDENT s1,s2; //使用别名STUDENT定义结构体结构体变量初始化
在定义结构体变量的同时可以对其进行初始化,格式与数组变量初始化类似,用花括号吧每个成员的初始值括起来,每个初始值与相应的成员对应。
例如,对
student结构体类型的变量s1进行初始化:struct student s1={2010001,"lili",'F',97};在定义结构体类型是不能对其成员进行初始化,因为类型不是程序运行时的实体,不会给他们分配内存空间,因此,对其初始化没有意义。
在了解完结构体的相关知识点后,本题就迎刃而解了,这里我采用的是结构体数组,在创建完结构体后在main函数中将数据输入其中即可
#include
struct Student
{long int num;char name[20];int score;
} student[2];
int main()
{for (int i = 0; i < 2; i++){scanf("%ld %s %d", &student[i].num, student[i].name, &student[i].score);}if (student[0].score > student[1].score){printf("%ld %s %d", student[0].num, student[0].name, student[0].score);}else if (student[0].score < student[1].score){printf("%ld %s %d", student[1].num, student[1].name, student[1].score);}return 0;}
本关任务:有
n个学生的信息(包括学号,姓名,成绩),要求按照成绩的高低顺序输出学生的信息。测试输入:
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
这题和上一题的相比,数组内元素的比较更难一点,我们这里采用冒泡排序(http://t.csdn.cn/0XtSa)的方法,将结构体中的成绩进行排序,最后将其打印
#include
struct student
{int num;char name[20];int score;};
void input(int n, struct student s[])
{int i;for (i = 0; i < n; i++){scanf("%d %s %d", &s[i].num, s[i].name, &s[i].score);}
}void swap(int n, struct student s[])
{int i, j, t;struct student temp;for (j = 0; j < n - 1; j++){for (i = 0; i < n - 1 - j; i++)if (s[i].score < s[i + 1].score){temp = s[i];s[i] = s[i + 1];s[i + 1] = temp;}}for (i = 0; i < n; i++){printf("%d %s %d", s[i].num, s[i].name, s[i].score);printf("\n");}
}int main()
{int n;scanf("%d", &n);struct student s[100];void input(int n, struct student s[]);void swap(int n, struct student s[]);input(n, s);swap(n, s);return 0;
}
本关任务:有三个候选人,每个选民只能投一票,写一程序,用结构体存储数据,求出得票结果。
三个候选人为"
Li", "Zhang","Sun"。测试输入:
10
Li
Li
Sun
Zhang
Zhang
Sun
Li
Sun
Zhang
Li预期输出:
Li:4
Zhang:2
Sun:3
这题的难点在于如何判断并打印出得票数,我们可以直接在结构体中创建一个得票数,将其初始化为0,再用for循环统计每个人的投票,然后用strcmp()函数判断投票的对象,并将其的number++,最后打印即可
#include
#include
struct voter
{char name[20];int number;
};
int main(void)
{struct voter v[3] = { {"Li",0},{"Zhang",0},{"Sun",0} };int i, j;char lover[20];int n;scanf("%d", &n);for (i = 0; i < n; i++){scanf("%s", lover);for (j = 0; j < 3; j++){if (strcmp(lover, v[j].name) == 0)v[j].number++;}}for (i = 0; i < 3; i++)printf("%s:%d\n", v[i].name, v[i].number);return 0;
}
本关任务:使用结构体储存学生信息(包括学号,姓名,
3门课程成绩,总分),要求实现对学生信息修改和删除操作,最多50名学生。测试输入:
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预期输出:
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
我们先来分析一下题意吧,题目要求我们首先输入n和q,n表示学生的总数,q表示额外操作的数量,如上例题,n=10,表示要输入10个学生的信息,q=3,即有3个额外操作。
而额外操作又分为三种:
当输入1时,表示通过姓名查找学生信息
当输入2时,表示通过学号修改学生信息
当输入3时,表示通过学号删除学生信息
这题的主函数代码题目已经给出,我们只需要补全结构体代码即可
查找学生信息:只需要在遍历时用strcmp判断学生姓名与结构体中的name是否相同,然后打印出相同情况(我们这里暂时不考虑找不到name的情况)
删除学生信息:只需要通过for循环用strcmp找到对应的学号,然后break跳出循环,并将该学号后面的学号依次前移,覆盖前面一个学号,达到删除的目的(也暂时不考虑找不到的情况)
修改学生信息:和上面一样,通过遍历和strcmp找到对应的学号,将其内容修改即可。
如果大家向更加深入探讨有关储存信息类的问题(考虑找不到信息的情况),可以看我之前的博客通讯录(http://t.csdn.cn/I0kVV)
#include
#include
int Count;struct student
{char sno[20], name[20];int math, english, chinese, sum;
};void print(struct student stu)
{printf("%s %s %d %d %d %d\n", stu.sno, stu.name, stu.math, stu.english, stu.chinese, stu.sum);
}void query_stu(struct student s[], char* name)
{for (int i = 0; i < Count; i++){if (strcmp(s[i].name, name) == 0)print(s[i]);}
}void delete_stu(struct student s[], char* sno)
{int i = 0;for (; i < Count; i++){if (strcmp(s[i].sno, sno) == 0)break;}for (; i < Count - 1; i++){s[i] = s[i + 1];}}void update_stu(struct student s[], char* sno, int math, int english, int chinese)
{for (int i = 0; i < Count; i++){if (strcmp(s[i].sno, sno) == 0){s[i].math = math;s[i].english = english;s[i].chinese = chinese;s[i].sum = s[i].math + s[i].english + s[i].chinese;}}
}int main(void)
{int n, q;struct student students[50];scanf("%d%d", &n, &q);Count = n;for (int i = 0; i < n; i++) {scanf("%s%s%d%d%d", students[i].sno, students[i].name, &students[i].math, &students[i].english, &students[i].chinese);students[i].sum = students[i].math + students[i].english + students[i].chinese;//求总成绩}while (q--) {int op;scanf("%d", &op);char sno[20], name[20];if (op == 1) {scanf("%s", name);query_stu(students, name);}else if (op == 2) {int a, b, c;scanf("%s%d%d%d", sno, &a, &b, &c);update_stu(students, sno, a, b, c);for (int i = 0; i < Count; i++)print(students[i]);}else {scanf("%s", sno);delete_stu(students, sno);for (int i = 0; i < Count - 1; i++)print(students[i]);}}return 0;
}