你是不是在学结构体的时候,总觉得这东西没啥用?看课本上的例子干巴巴的,不知道在实际编程里能派上啥用场?其实啊,结构体在数据管理方面特别好用,比如做个学生成绩管理系统,用结构体就能把学生的各种信息整整齐齐地存起来。今天兔子哥就带你一步步做一个,新手也能看懂,一起往下看吧!
为啥要用结构体呢?你想啊,一个学生有学号、姓名、语文成绩、数学成绩这些信息,要是用单独的变量存,比如 num [20]、name [20]、chinese [50],不仅乱,而且查找修改的时候很容易搞错对应关系。用结构体就不一样了,能把这些信息打包成一个整体,每个学生就是一个结构体变量,管理起来方便多了。
有个网友分享说,他刚开始做成绩管理系统,没用结构体,用了一堆数组,结果写查找功能的时候,把学号和成绩对混了,改了半天才弄好。后来换成结构体,代码清爽多了,出错也少了。这就是结构体的好处,把相关的数据放一起,逻辑更清晰。
第一步:定义结构体,把学生信息打包
首先得定义一个结构体,包含学生的基本信息。比如:
struct Student {
char num [10]; // 学号
char name [20]; // 姓名
float chinese; // 语文成绩
float math; // 数学成绩
float english; // 英语成绩
float avg; // 平均分
};
这里面,学号和姓名用字符数组,成绩用 float 类型,还加了个平均分,后面可以自动计算。定义的时候要想清楚,学生需要哪些信息,别漏了,也别加太多没用的,不然浪费空间。
有人可能会问,学号用 int 不行吗?要是学号是纯数字,短一点的话可以,但很多学校的学号带字母,或者特别长,用字符数组更保险。
第二步:用结构体数组存多个学生
一个学生用结构体变量,多个学生就用结构体数组。比如定义 struct Student stu [50]; 这样就能存 50 个学生的信息,一般班级人数够了。再用一个变量 int count = 0; 记录实际的学生数量,方便后面添加的时候判断是不是满了。
第三步:实现基本功能,一个一个来
一个成绩管理系统,至少得能录入、显示、查找、修改、计算平均分吧。咱们一个一个说。
录入功能:就是从键盘输入学生信息,存到结构体数组里。代码大概这样:
void addStudent (struct Student stu [], int *count) {
if (*count >= 50) {
printf ("学生满了,不能再加了!\n");
return;
}
printf ("请输入学号:");
scanf ("% s", stu [*count].num);
printf ("请输入姓名:");
scanf ("% s", stu [*count].name);
printf ("请输入语文成绩:");
scanf ("% f", &stu [*count].chinese);
// 数学、英语成绩类似
// 计算平均分
stu [*count].avg = (stu [*count].chinese + stu [*count].math + stu [*count].english)/3;
(*count)++;
printf ("录入成功!\n");
}
这里要注意,scanf 输入 float 类型时,变量前要加 &,数组名本身就是地址,不用加。很多新手这里容易忘,导致输入失败。
显示功能:把所有学生的信息打印出来,用个循环遍历数组就行。可以加个表头,看起来更清楚。
查找功能:比如按学号查找,输入学号后,循环比较每个学生的 num,找到就打印信息。要是找不到,就提示 “没找到”。
修改功能:找到学生后,让用户重新输入要修改的成绩,其他信息也能改,看需求。改完记得重新算平均分,不然平均分还是原来的。
排序功能:可以按平均分从高到低排,用冒泡排序就行。比较的时候比较 stu [i].avg 和 stu [j].avg,交换整个结构体变量。
| 功能 | 核心操作 | 易错点 |
|---|---|---|
| 录入 | 给结构体成员赋值 | 输入 float 加 &,数组名不加 & |
| 查找 | 循环比较关键字 | 漏写 break,找到后继续循环 |
| 修改 | 重新赋值并更新相关数据 | 忘了更新平均分 |
| 排序 | 交换结构体变量 | 只交换部分成员,导致数据不对应 |
第四步:搭个菜单,让系统能用起来
把这些功能串起来,用一个主函数循环显示菜单,让用户选择要做啥。比如:
int main () {
struct Student stu [50];
int count = 0;
int choice;
while (1) {
printf ("1. 录入 2. 显示 3. 查找 4. 修改 5. 排序 0. 退出 \n");
printf ("请选择:");
scanf ("% d", &choice);
if (choice == 0) break;
switch (choice) {
case 1: addStudent (stu, &count); break;
case 2: showStudent (stu, count); break;
// 其他功能类似
default: printf ("输入错了,请重新选!\n");
}
}
return 0;
}
这样用户就能一直操作,直到选 0 退出。是不是有点像平时用的小软件了?
兔子哥第一次做这个系统的时候,排序功能总出错,后来发现是只交换了平均分,其他信息没交换,导致学号和成绩对不上了。所以啊,交换的时候一定要交换整个结构体,或者把所有成员都交换,不能偷懒。
其实这个系统还能加很多功能,比如删除学生、按科目排序、计算总分什么的。但对新手来说,先把基础功能做好就行。做的时候多调试,比如录完一个学生,马上显示看看对不对;修改完成绩,检查平均分有没有变。
我觉得用结构体做这种数据管理系统,最能体现结构体的优势。把零散的数据打包后,代码逻辑清楚多了,也不容易出错。你要是能自己把这个系统做出来,结构体就算真正理解了,以后做类似的项目,比如员工信息管理,也能举一反三。
希望这篇文章能帮到你,赶紧动手试试吧,看着自己做的系统能管理学生成绩,还是挺有成就感的。
标签: addStudent 学生用
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~