Microsoft Agent Framework技术解析与现代应用指南
2026/10/26 16:28:36
这一章的核心是结构体数组 + 结构体指针 + 函数化设计。
为了不让“结构体”只停留在书本例子里,我们把教材中的学生成绩结构体,改造成一个“班级成绩统计与优秀学生筛选小工具”。
这个小程序模拟的是:
老师或班长在期末录入学生成绩,程序自动算出每个学生的平均分,并找出平均成绩最高的学生,把他的完整信息输出出来。
通过这个例子,可以非常直观地理解:
假设你是班长,老师让你帮忙做一件事:
“把 3 个学生的学号、姓名、三门课成绩录入电脑,
自动算平均分,
然后把成绩最好的那个学生信息单独打印出来。”
如果不用结构体,你可能要用一堆数组:
这种写法不仅乱,而且非常容易出错。
而结构体的作用,就是把“一个学生”当成一个整体来处理。
再配合结构体数组,就可以一次性管理多个学生。
整个程序严格按照教材要求拆成 3 个函数,每个函数只干一件事:
input 函数
max 函数
print 函数
主函数只负责:
#include<stdio.h>#defineN3// 学生人数structStudent{intnum;// 学号charname[20];// 姓名floatscore[3];// 三门课程成绩floataver;// 平均成绩};struct Student描述的是一个学生score[3]表示三门课成绩aver是后面计算出来的结果这样一来,一个结构体变量,就完整地表示了一个学生。
intmain(){voidinput(structStudentstu[]);structStudentmax(structStudentstu[]);voidprint(structStudentstud);structStudentstu[N];structStudent*p=stu;// 结构体指针指向数组首地址input(p);// 输入数据并计算平均分print(max(p));// 找最高分学生并输出return0;}stu是结构体数组,存 3 个学生p是指向结构体的指针为什么要用指针?
因为:
voidinput(structStudentstu[]){inti,j;floatsum;printf("请输入各学生的信息:学号 姓名 三门课成绩\n");for(i=0;i<N;i++){printf("第%d个学生:\n",i+1);scanf("%d %s",&stu[i].num,stu[i].name);sum=0;for(j=0;j<3;j++){scanf("%f",&stu[i].score[j]);sum+=stu[i].score[j];}stu[i].aver=sum/3;}}你可以把它理解成:
“把 Excel 表里的学生数据,一行一行输进程序里。”
这是非常典型的“一次计算,多次使用”的思想。
structStudentmax(structStudentstu[]){inti;intmaxIndex=0;for(i=1;i<N;i++){if(stu[i].aver>stu[maxIndex].aver){maxIndex=i;}}returnstu[maxIndex];}因为我们需要的不是:
而是:
所以最干净的方式,就是直接返回整个结构体。
这也是很多同学第一次真正理解:
原来函数是可以返回结构体的。
voidprint(structStudentstud){inti;printf("\n平均成绩最高的学生信息:\n");printf("学号:%d\n",stud.num);printf("姓名:%s\n",stud.name);printf("成绩:");for(i=0;i<3;i++){printf("%.2f ",stud.score[i]);}printf("\n平均成绩:%.2f\n",stud.aver);}以后你想把输出改成:
只需要改这个函数。
请输入各学生的信息:学号 姓名 三门课成绩 第1个学生: 1001 张三 85 90 88 第2个学生: 1002 李四 78 80 82 第3个学生: 1003 王五 92 95 93平均成绩最高的学生信息: 学号:1003 姓名:王五 成绩:92.00 95.00 93.00 平均成绩:93.33这正是我们一开始设定的使用目标。
整体时间复杂度是:
O(N)对于学生数量增加,性能是线性增长,非常合理。
stu[N]空间复杂度为:
O(N)这个例子虽然是教材题,但它已经非常接近真实开发中的数据处理逻辑:
如果你把这个例子真正吃透了:
都会非常顺。