[编者注:]又是读取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)
四、文件目录列表
领取专属 10元无门槛券
私享最新 技术干货