1、matlabGUI学生成绩管理系统西安邮电大学MATLAB及其 EDA仿真课内实验报告院(系)名称 : 电子工程学院学生姓名 : 李豪专 业 名 称 : 集成电路设计与集成系统班 级 : 1202 班时 间 : 2013年12 月 20日一、 实验内容建立基于图形用户界面 GUI 的学生成绩管理系统, 该系统能够实现学生成绩信息的增加、删除、查询(查询某门课所有学生的成绩并显示排名,查询某个学生的各科成绩并显示排名) 、课程成绩统计最高分、最低分、平均分、方差、并显示相应的排名;绘制柱状图、条形图、饼状图、正太分布曲线等功能。二、 实验目的通过本实验使学生掌握图形用户界面 GUI 的操作和设计
2、流程,并通过编写回调函数巩固前期的知识。三、 报告正文(一) 设计思路学生成绩管理系统界面菜单模块 显示模块 绘图模块菜单模块单统功绘科计能图成成菜菜绩绩单单显示模块姓名学 成 排号 绩 名(二) 设计步骤与设计内容1.启动 GUI,命令窗口中输入 guide2.放置控件。先放置一个 Edit Text , tag 名称设为 edit14 ,颜色设置为灰色, String 设置为学生成绩管理系统 ,该控件的功能是显示该 GUI的功能;再放置五个 Edit Text ,tag 名称分别设为 edit1 、edit2 、edit3 、 edit4 、 edit13 ,颜色均设置为淡蓝色, Stri
3、ng 分别设置为 姓名、学号、成绩 其他、排名、成绩类型,这些控件的功能作为下面 listbox 的标题;再放置四个 listbox, tag 名称分别设为 xingming 、xuehao 、 grade 、paiming ,颜色均设置淡蓝色, String 设置为 ,这些该控件的功能是分别显示对应学生的姓名、 学号、成绩、排名;再放置五个 Edit Text ,tag名称分别设为 edit7 、edit8 、edit9 、edit10 、edit11 ,颜色均设置为淡蓝色, String 分别设置为专业, 数学,英语,体育物理,该控件的功能是显示个人对应的科目; 再放置一个 Axes,ta
4、g 名称设为 axes1,颜色设置为灰色,该控件的功能是显示绘制的图;3.4.保存 .fig 文件5.编写 .m 文件,这部分要详细叙述每个子函数的编写思路,每条语句后面要给出注释说明该语句的功能;只需要附上自己编写的回调函数部分,其他系统自动生成的不需要放入报告中。读取数据思路:从表格中读取数据的对应行赋给对应的句柄grade,form = xlsread(student.xlsx);% 从 EXCEL 表格读取数据handles.fenshu = grade;%所有成绩handles.major = grade(:,1);% 专业课成绩handles.english = grade(:,2
5、);% 英语成绩handles.math = grade(:,3);% 数学成绩ihandles.physical = grade(:,4);handles.physics= grade(:,5);% 体育成绩%物理成绩handles.name = form(2:end,1);%姓名handles.num = form(2:end,2); %学号%Choose default command line output for GUI handles.output = hObject;%Update handles structureguidata(hObject, handles);显示单科成绩
6、及对应学生的姓名学号和排名思路:利用下拉菜单,获取 value 值,用 case 语句判断,当选中下拉菜单的某项时,把该项对应的成绩,姓名,学号,排名的值送给对应listbox显示。val = get(hObject, value ); %获取下拉菜单控件的 value 值switch val;case 2 %选中下拉菜单的第二项set(handles.grade, String ,handles.major) %将选中的成绩给listbox.gradeset(handles.xingming, String ,handles.name) %将选中的学生姓名给listbox.xingmings
7、et(handles.xuehao, String ,handles.num) %将选中的学生学号给listbox.xuehaohandles.select = handles.major; %将选中的成绩赋给一个变量guidata(hObject, handles); %更新句柄major = handles.major;n = length(major); % 获取专业课成绩数据长度d = zeros(n,1); % 创建一个 n 行一列的全零矩阵for i = 1:na,b = max(major); % 获取 major 的最大值和位置major(b,1) = 0; % 把 major
8、 的最大值置换为 0d(b,1) = i; % 矩阵 d 存储成绩的排名endhandles.d = d; % 把排名给一个新的变量set(handles.paiming, String ,d); % 使排名显示case 3set(handles.grade, String ,handles.english) %将选中的成绩给listbox.gradeset(handles.xingming,String,handles.name)%将选中的学生姓名给listbox.xingmingset(handles.xuehao,String,handles.num)%将选中的学生学号给listbox.
9、xuehaohandles.select = handles.english;%将选中的成绩赋给一个变量english = handles.english;n = length(english);%获取英语课成绩数据长度d = zeros(n,1);%创建一个n 行一列的全零矩阵for i = 1:na,b = max(english);%获取 english的最大值和位置english(b,1) = 0;% 把 english的最大值置换为0d(b,1) = i;% 矩阵 d存储成绩的排名endhandles.d = d;set(handles.paiming,String% 把排名给一个新
10、的变量,d);case 4set(handles.grade,String,handles.math)% 将选中的成绩给listbox.gradeset(handles.xingming,String,handles.name)% 将选中的学生姓名给listbox.xingmingset(handles.xuehao,String,handles.num)% 将选中的学生学号给listbox.xuehaohandles.select = handles.math;%将选中的成绩赋给一个变量math = handles.math;n = length(math);d = zeros(n,1);%
11、获取数学成绩数据长度%创建一个 n 行一列的全零矩阵for i = 1:na,b = max(math);%获取 English的最大值和位置math(b,1) = 0;% 把 math的最大值置换为0d(b,1) = i;% 矩阵 d存储成绩的排名endhandles.d = d;set(handles.paiming,String,d);% 显示 math成绩排名case 5set(handles.grade,String,handles.physical)% 将选中的成绩给listbox.gradeset(handles.xingming,String,handles.name)% 将选
12、中的学生姓名给listbox.xuehaoset(handles.xuehao,String,handles.num)% 将选中的学生学号给listbox.xuehaohandles.select = handles.physical;%将选中的成绩赋给一个变量physical = handles.physical;n = length(physical);%获取物理成绩数据长度d = zeros(n,1);%创建一个n 行一列的全零矩阵for i = 1:na,b = max(physical);%获取 physical的最大值和位置physical(b,1) = 0;% 把 math的最大
13、值置换为0d(b,1) = i;% 矩阵 d 存储成绩的排名endhandles.d = d;set(handles.paiming,String,d);% 显示 physical成绩排名case 6set(handles.grade,String,handles.physics)% 将选中的成绩给listbox.gradeset(handles.xingming,String,handles.name)% 将选中的学生姓名给listbox.xingmingset(handles.xuehao,String,handles.num)% 将选中的学生学号给listbox.xuehaohandle
14、s.select = handles.physics; %将选中的成绩赋给一个变量physics = handles.physics;n = length(physics); %获取 physics 成绩数据长度d = zeros(n,1); %创建一个 n 行一列的全零矩阵for i = 1:na,b = max(physics); %获取 physics 的最大值和位置physics(b,1) = 0; % 把 physics 的最大值置换为 0d(b,1) = i; % 矩阵 d存储成绩的排名endhandles.d = d; % ? ? ?set(handles.paiming, St
15、ring ,d); % 显示 physics 成绩排名case 7%A=handles.major;handles.english;handles.math;handles.physical;handles.physics; 在 A中储存各科成绩grade = sum(A); %对各科成绩求和sum_grade = grade; %转置set(handles.grade, String ,sum_grade) % 显示总成绩set(handles.xingming, String ,handles.name) % 显示姓名set(handles.xuehao, String ,handles.
16、num) % 显示学号handles.select = sum_grade; %把总成绩给一个变量handles.all_grade = sum_grade;%- 给总成绩排名 -n = length(sum_grade); %获取总成绩数据长度 %d = zeros(n,1); %创建一个 n行一列的全零矩阵for i = 1:na,b = max(sum_grade); %获取总成绩 的最大值和位置%sum_grade(b,1) = 0;% 把总成绩的最大值置换为0d(b,1) = i;% 矩阵 d存储总成绩的排名endhandles.d = d;set(handles.paiming,S
17、tring,d);% 显示总成绩排名endguidata(hObject, handles);统计分数菜单模块思路:利用下拉菜单,获取 value 值,判断 value 值,调用对应的函数(求平均值、最大值、最小值、方差函数)。val = get(hObject,Value);switch valcase2x,y = max(handles.select);%获取当前选中成绩的最大值set(handles.grade,String,x); % 显示最高成绩set(handles.xingming,String,handles.name(y);% 显示对应的姓名set(handles.xueha
18、o,String,handles.num(y);% 显示对应的学号set(handles.paiming,String,);%不显示排名case3x,y= min(handles.select);%获取当前选中成绩的最大值set(handles.grade,String,x);%显示最低成绩set(handles.xingming,String,handles.name(y);% 显示对应的姓名set(handles.xuehao,String,handles.num(y);% 显示对应的学号set(handles.paiming,String,);%不显示排名case4middle = me
19、an(handles.select);% 获取当前选中成绩的平均值set(handles.grade,String,middle);% 显示平均成绩set(handles.xingming,String,);% 不显示姓名set(handles.xuehao,String,);% 不显示学号set(handles.paiming,String,);% 不显示排名case5Var = var(handles.select);% 获取当前选中成绩的方差set(handles.grade,String,Var);%显示 方差set(handles.xingming,String,);% 不显示姓名s
20、et(handles.xuehao,String,);% 不显示学号set(handles.paiming,String,);% 不显示排名end功能菜单模块(添加、删除、查询)添加思路: 判断数据的长度, 将此长度记为 n, 然后在地 n + 1 行写入新的数据;删除思路:用 strcmp 比较输入学生的姓名和已有的姓名,用find 函数记录该比较的值,给需要删除的学生信息赋为空值,即可实现删除功能;查询思路:用 strcmp 比较输入学生的姓名和已有的姓名,用find 函数记录该比较的值, 将查询的学生信息显示在 listbox 。绘图菜单模块思路:获取下拉菜单的 value, 判断 va
21、lue 值,调用对应的绘图函数( case 2hist(handles.select); % 绘制柱状图case 3bar(handles.select); % 绘制条形图case 4histfit(handles.select,6); % 绘制正太分布曲线case 5pie(handles.select); % 绘制饼状图)6.运行结果,包括 GUI 的初始化界面、查询界面、删除功能、统计功能等,可以用图片形式展现;初始界面查询界面删除功能统计功能(三) 问题与心得体会1总结实验中遇到的问题及解决方法;问题一:如何实现增加学生信息功能。解决方法:询问老师(用 length 函数判断 数据的长
22、度,在 n+1 行写入新的信息)。问题二:成绩排名函数不能实现排名功能。解决方法:询问老师(应该把循环变量 i 赋给排名变量,而不是成绩最大值的位置)。问题三:怎样实现查询信息功能解决方法:询问老师(用 strcmp 函数比较输入的信息和已有信息,将结果给一个变量 i ,用 find 函数寻找 i=1 的位置,将该位置学生的信息显示出来即可实现查询功能) 。问题四:清空 excel 表格数据后写入信息不能实现。解决方法:用 help 命令查询 xlswrite 函数使用语法,可能因为 matlab软件版本的原因导致实验指导书上的 xlswrite 命令不能实现,使用 help查询的 xlswr
23、ite 命令书写个时候实现想 excel 表格写入信息。问题五:调用绘图函数不能实现绘图。解决方法:把坐标设置为当前坐标。2学生成绩管理系统的哪些功能没有实现;实现了所有的功能3撰写进行该次实验后的心得体会,学到了什么。通过完成基于 matlabGUI 的学生成绩管理, 再次复习熟悉了 matlab 的编程方法,第一次 GUI 设计的对话框的具体应用, 加深了对 matlab 知识的运用,以前学习 matlab 仿真就感受到了 Matlab 强大的数学计算能力,这次设计 GUI 的设计感受到了其与 VB可视化编程的异曲同工之妙,而 Matlab 优于 VB以及其他编程工具的地方是其强大的数学计算能力以及完善的工具箱, 使其设计数学计算方面程序的编写及其简洁,如果以后有机会一定再好好研究下 Matlab 。感谢老师在这段时间的悉心指导。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1