matlab 专业分流系统(1)

记录做课程报告时遇到的问题。

1 GUI模板

命令行输入“guide”

 

2 生成随机数据

同一个表中字段格式不一,用struct格式保存数据,再转换成cell格式,才可以将数据插入表格中,struct、table格式会报错。

3  添加学生信息

代码:

function addStudent_Callback(hObject, eventdata, handles)
% hObject    handle to addStudent (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
prompt = {'学号','姓名','高考成绩','Java','Web','JVM','MySQL','并发编程'};
title = "请输入数据";
lines = [1,1,1,1,1,1,1,1];
tab = inputdlg(prompt,title,lines);
newrow_1 = str2double(tab{1});
newrow_2 = tab{2};
newrow_3 = str2double(tab{3});
newrow_4 = str2double(tab{4});
newrow_5 = str2double(tab{5});
newrow_6 = str2double(tab{6});
newrow_7 = str2double(tab{7});
newrow_8 = str2double(tab{8});
newrow_9 = newrow_4+newrow_5+newrow_6+newrow_7+newrow_8;
newArray = {newrow_1,newrow_2,newrow_3,newrow_4,newrow_5,newrow_6,newrow_7,newrow_8,newrow_9,0};
oldData = get(handles.stu_info,'Data');
newData = [oldData;newArray];
[~, ~, forwardRank] = unique([newData{:,9}]);
b = max(forwardRank) - forwardRank  + 1;
for i = 1:size(newData,1)
    newData{i,10} = b(i);
end
set(handles.stu_info,"Data",newData);
save("newData.mat",'newData');

效果:

4 删除学生信息

操作:

代码:

function stu_info_CellSelectionCallback(hObject, eventdata, handles)
% hObject    handle to stu_info (see GCBO)
% eventdata  structure with the following fields (see MATLAB.UI.CONTROL.TABLE)
%	Indices: row and column indices of the cell(s) currently selecteds
% handles    structure with handles and user data (see GUIDATA)
newData = get(hObject,'Data');
row = eventdata.Indices;
rowIndex = row(1);
handles.rowIndex = rowIndex;
guidata(hObject,handles);

% --- Executes on button press in delete.
function delete_Callback(hObject, eventdata, handles)
% hObject    handle to delete (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
row_index = handles.rowIndex;
newData = get(handles.stu_info,'Data');
newData(row_index,:) = [];
[~, ~, forwardRank] = unique([newData{:,9}]);
b = max(forwardRank) - forwardRank  + 1;
for i = 1:size(newData,1)
    newData{i,10} = b(i);
end
set(handles.stu_info,'Data',newData);
save("info.mat","newData");

Q1:能正常删除,却一直报索引超出范围的错误;因为出错,排名也没有更新。

索引超出数组元素的数目(0)。

出错 stu_info>stu_info_CellSelectionCallback (第 119 行)
rowIndex = row(1);

出错 gui_mainfcn (第 95 行)
        feval(varargin{:});

出错 stu_info (第 42 行)
    gui_mainfcn(gui_State, varargin{:});

出错
matlab.graphics.internal.figfile.FigFile/read>@(hObject,eventdata)stu_info('stu_info_CellSelectionCallback',hObject,eventdata,guidata(hObject)) 
计算 Table CellSelectionCallback 时出错。

A1:报错的问题

报错原因:eventdata.Indices只有在选定单元格时才为非空。改变uitable大小时也会触发CellSelectionCallback,但此时没有选中单元格,所以Indices为空。

改变uitable大小的例子:set(uitable_handles,'data',...),存入数据时单元格会跟随数据改变大小。

解决方法:在取Indices时加一个判断,isempty

row = eventdata.Indices;
if isempty(row)~= 1
    rowIndex = row(1);
    handles.rowIndex = rowIndex;
end

此时排名依然没有自动更新。后来发现是更新了的,没做好测试。

Q2:删除的速度很慢

5 修改学生信息

代码:

function update_Callback(hObject, eventdata, handles)
% hObject    handle to update (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
ri = handles.rowIndex;
newData = get(handles.stu_info,"Data");
prompt = {'学号','姓名','高考成绩','Java','Web','JVM','MySQL','并发编程'};
title = "数据更新页面";
lines = [1,1,1,1,1,1,1,1];
definput = {};
for i = 1:8
    definput{i} = num2str(newData{ri,i});
end
tab = inputdlg(prompt,title,lines,definput);
if size(tab,1)~=0   %加个判断 避免点击取消不做更改时报错
    newrow_1 = str2double(tab{1});
    newrow_2 = tab{2};
    newrow_3 = str2double(tab{3});
    newrow_4 = str2double(tab{4});
    newrow_5 = str2double(tab{5});
    newrow_6 = str2double(tab{6});
    newrow_7 = str2double(tab{7});
    newrow_8 = str2double(tab{8});
    newrow_9 = newrow_4+newrow_5+newrow_6+newrow_7+newrow_8;
    newArray = {newrow_1,newrow_2,newrow_3,newrow_4,newrow_5,newrow_6,newrow_7,newrow_8,newrow_9,0};
    newData(ri,:) = newArray;
    [~, ~, forwardRank] = unique([newData{:,9}]);
    b = max(forwardRank) - forwardRank  + 1;
    for i = 1:size(newData,1)
        newData{i,10} = b(i);
    end
end
set(handles.stu_info,"Data",newData);
save("info.mat",'newData');

主要问题:inputdlg(prompt,title,lines,definput);

默认答复必须为字符向量元胞数组。

definput:必须为字符向量元胞数组或字符串数组。报错是因为放入元胞数组的数据是double型的,通过num2str更改数据格式,问题解决。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值