首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MATLAB大作业选登-绩点计算程序

[编者注:]又是读取excel文件,对数据进行处理,今天只讲数据。数据矩阵有行、有列,必须要编程,特别是矩阵(张量)是独立变量的集合体,代表了某一物理过程的特性,有的矩阵的每个元素(独立变量)具有同一性质,有的矩阵的行、列分别代表一种性质(列代表字段,行代表记录),但它是一个集合体,每个数据都有用,对矩阵进行数据运算,多数情况下需要用循环语句来完成,对每一行和每一列都需要循环。

一、设计界面(compute_GPA_GUI.fig)

二、程序运行情况

1、程序启动后的界面,需要点击导入成绩按钮,赋值是第一步

2、点击导入成绩后,出现选择文件对话框

3、导入成绩后,显示总人数和课程总数(矩阵大小,本例65*8)

4、点计算,完成后出现对话框提示用户,友好设计

5、导出排序后的数据,写入excel表格

6、作业提供了用于计算的数据文件,65人,8门课

三、程序代码(compute_GPA_GUI.m)

function varargout = compute_GPA_GUI(varargin)

% Last Modified by GUIDE v2.5 30-Nov-2021 15:09:41

% Begin initialization code - DO NOT EDIT

gui_Singleton = 1;

gui_State = struct('gui_Name',       mfilename, ...

                  'gui_Singleton',  gui_Singleton, ...

                  'gui_OpeningFcn', @compute_GPA_GUI_OpeningFcn, ...

                  'gui_OutputFcn',  @compute_GPA_GUI_OutputFcn, ...

                  'gui_LayoutFcn',  [] , ...

                  'gui_Callback',   []);

if nargin && ischar(varargin{1})

   gui_State.gui_Callback = str2func(varargin{1});

end

if nargout

   [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

else

   gui_mainfcn(gui_State, varargin{:});

end

% End initialization code - DO NOT EDIT

function compute_GPA_GUI_OpeningFcn(hObject, eventdata, handles, varargin)

handles.output = hObject;

guidata(hObject, handles);

function varargout = compute_GPA_GUI_OutputFcn(hObject, eventdata, handles)

varargout{1} = handles.output;

function Load_score_Callback(hObject, eventdata, handles)

global NUM TXT RAW

% 打开成绩表

[filename, pathname] = uigetfile({'*.xls'; '*.xlsx'});

full_name = strcat(pathname,filename);

% 导入成绩表信息

[NUM,TXT,RAW] = xlsread(full_name);

% 显示表格信息(路径、班级人数、课程数)

set(handles.Load_state,'string',full_name);

set(handles.Stu_num,'string',num2str(size(RAW,1)-1));

set(handles.Course_num,'string',num2str(size(RAW,2)-2));

function Load_state_Callback(hObject, eventdata, handles)

function Load_state_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))

   set(hObject,'BackgroundColor','white');

end

function Quit_Callback(hObject, eventdata, handles)

close(gcf);

function Stu_num_Callback(hObject, eventdata, handles)

function Stu_num_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))

   set(hObject,'BackgroundColor','white');

end

function Course_num_Callback(hObject, eventdata, handles)

function Course_num_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))

   set(hObject,'BackgroundColor','white');

end

function Compute_GPA_Callback(hObject, eventdata, handles)

global NUM RAW;

global GPA;

% 获取课程名和课程学分

[~, credit] = get_course_credit(RAW);

% 计算绩点

[GPA,~] = compute_GPA(NUM,credit);

msgbox('计算完成!请导出结果查看。');

function Write_to_xls_Callback(hObject, eventdata, handles)

global RAW;

global GPA;

sorted_result = Sort_result(RAW, GPA);

xlswrite('sorted_GPA_result.xls',sorted_result);

msgbox('已导出至当前路径:sorted_GPA_result.xls');

function [course, credit] = get_course_credit(RAW)

% 读取表格数据中学生信息(包括学号和姓名)

% RAW: 课程成绩表,第一行为表头,前两列分别为学号和姓名,成绩从第三列开始;

%    学号|姓名|课程1/必修课/学分1|课程2/必修课/学分2|

%     ** | ** |         **     |         **     |

%     ** | ** |         **     |         **     |

%     ** | ** |         **     |         **     |

% course: (1,n),cell类型,存放所有的课程名(n门课程)

% credit: (1,n),double类型数组,存放所有课程对应的学分

num_course = size(RAW,2)-2; % 不包含前两列(学号、姓名)

course = null(num_course);

credit = null(num_course);

for i = 1:num_course

  course_name_credit = RAW{1,i+2}; %课程/必修课/学分

  course_credit = regexp(course_name_credit,'/','split'); %切分

  course{i} = course_credit{1}; % 课程名

  credit(i) = str2double(course_credit(end)); % 学分

end

function [id, name] = get_id_name(RAW)

% 读取表格数据中的学生信息(包括学号和姓名)

% RAW: 课程成绩表,第一行为表头,前两列分别为学号和姓名,成绩从第三列开始;

%    学号|姓名|课程1/必修课/学分|课程2/必修课/学分|

%     ** | ** |         **     |         **     |

%     ** | ** |         **     |         **     |

%     ** | ** |         **     |         **     |

% id: (1,m),cell类型,存放所有的学号(m个学生)

% name: cell类型,存放所有的姓名

num_stu = size(RAW,1)-1; % 不包含表头

id = null(num_stu);

name = null(num_stu);

for i = 1:num_stu

  id{i} = RAW{i+1,1}; % 学号

  name{i} = RAW{i+1,2}; % 姓名

end

id = id'; name = name';

function [GPA,GPA_per_course] = compute_GPA(NUM,credit)

% 计算所有学生的平均绩点(加权平均)

% NUM: (m,n),double型,存放所有m个学生的所有n门课程成绩,每一行对应一个学生的成绩

%     score_11 | score_12 | score13 | --- | score_1n |

%     score_21 | score_22 | score23 | --- | score_2n |

%     ******** | ******** | ******* | --- | ******** |

%     score_m1 | score_m2 | scorem3 | --- | score_mn |

% credit: (1,n),double型,存放所有课程的学分

% GPA: (m,1),double类型,存放所有学生的平均绩点

% GPA_per_course: (m,n),double类型,存放所有学生所有课程的的绩点

scores = NUM;

GPA_per_course = (scores-50)/10;

GPA_per_course(GPA_per_course

GPA = GPA_per_course*credit'/sum(credit);

function sorted_result = Sort_result(RAW, GPA)

% 对绩点按降序排序并保存

% RAW: 课程成绩表,第一行为表头,前两列分别为学号和姓名,成绩从第三列开始;

%     ** | ** |         **     |         **     |

%     ** | ** |         **     |         **     |

%     ** | ** |         **     |         **     |

% GPA: (m,1),double类型,绩点

% write_to_xls:0或1,表示是否导出xls文件

% sorted_result: cell类型,排序结果,[排名,学号,姓名,绩点]

[id, name] = get_id_name(RAW);

num_stu = length(name);

rank = 1:num_stu; rank = rank';

name_sorted = null(num_stu,1);

id_sorted = null(num_stu,1);

[GPA_sorted,Index] = sort(GPA,'descend');

for i  = 1:num_stu

   id_sorted{i,1} = id{Index(i)};

   name_sorted{i,1} = name{Index(i)};

title = {'排名', '学号','姓名', '绩点'};

sorted_result = [title;

num2cell(rank),id_sorted,name_sorted,num2cell(GPA_sorted)];

function text5_CreateFcn(hObject, eventdata, handles)

四、文件目录列表

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OCaqJGWl7fkrQk0artxswTUQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券