matlab Excel中成绩管理系统,通过一个学习工作中遇到的一个问题来讲一下matlab怎么读取excel中的数据...

昨天出分了,分数凑合,50+60+131+127=368。不是很高的分,但马马虎虎应该能进复试

d6f0f32199f9131affa08586bbd287ea.png。我是从去年6月20号以后份开始复习的,天天也是边玩边学,没有怎么努力去学习,复习的时候经常玩吃鸡

b14ce9464d2c7742bdb65121e4202564.png(我是一个已经毕业半年的三本学渣

b14ce9464d2c7742bdb65121e4202564.png)。

等复试好后我开始更新基础内容

d6f0f32199f9131affa08586bbd287ea.png,我数学老师给的建议。

b14ce9464d2c7742bdb65121e4202564.png我开始是没打算更特别基础的,是想着记录学习中遇见的问题

d6f0f32199f9131affa08586bbd287ea.png。不过这样做素材也不够写,所以以后也更新更新基础内容吧,权当自己再复习一遍

d6f0f32199f9131affa08586bbd287ea.png

e59a2ea1f823be7794c101d82e59372e.png

今天开始往后应该是一周左右的时间更新一篇,我还剩点现成的gui素材,能凑到复试

d6f0f32199f9131affa08586bbd287ea.png

不扯了!

问题背景:有两份系内人员名单的表格,其中一个是系内所有人员的名单(参加实训的名单中有三个人在总名单里没有录

d6f0f32199f9131affa08586bbd287ea.png),一个是参加某项实训的人的名单,并非系内所有人都参加了这次实训

d6f0f32199f9131affa08586bbd287ea.png(我就是其中没参加的一个

b14ce9464d2c7742bdb65121e4202564.png)。那么现在要通过这两张表格筛选出没有参加的人的名单。

方法一:用眼睛找

d6f0f32199f9131affa08586bbd287ea.png累死你,(虽然只有一百多人但是也够折腾的)

方法二:我不知道用excel内置的函数怎么实现,可能比较麻烦把

d6f0f32199f9131affa08586bbd287ea.png

方法三:用编程语言来实现,(我只会matlab

b14ce9464d2c7742bdb65121e4202564.png)

思路1:导入两个Excel中人名的数据分别存在两个cell中,用两层循环遍历它两,对每个元素进行比较,如果相同就把总名单的的那个元素置空

d6f0f32199f9131affa08586bbd287ea.png。(外层是总名单,内层是参加实训的人的名单)

思路2:导入两个Excel中人名的数据合并到一块,然后用我之前讲过的数组去重的一个好方法来去重(类似于,不能照搬,稍微改动),那剩下的不就是没参加的人的名单么

2c6c3bc2a57553cd2dfa86b07b01c81c.png

有一个BUG:两个人名一模一样

b14ce9464d2c7742bdb65121e4202564.png,那就去比较学号把

d6f0f32199f9131affa08586bbd287ea.png

进行编程前,我需要先讲一下matlab如何读excel中的数据。

xlsread函数可以帮助我们读取excel。

这里简单讲一个用法把

[num , txt , raw] = xlsread(filename)

Note:

num是指定excel中的数值部分

txt是指定excel中的文本部分,txt是一个元胞

raw数值文本在一块,raw是一个元胞

不想要的用~来代替,不用~也行,反正你又不用,放那又不碍事

filename是指定excel的文件名(带拓展名)

其余的用法读者自行help一下,

d6f0f32199f9131affa08586bbd287ea.png,输入参数还可以带上excel中的范围,

第几个sheet,等

思路1的Code:

clear

clc

[num_list,name_list]=xlsread('name_list.xlsx');% 导入总名单

[num_practice,name_practice]=xlsread('practice_list.xlsx');% 导入参加实训人的名单

for i=1:length(name_list)%对总名单遍历

name1=name_list{i};

for j=1:length(name_practice)%对实训名单遍历

name2=name_practice{j};

if strcmpi(name1,name2)==1%看一下实训名单中的人名是否出现在总名单中

name_list{i}=[];%如果出现就把总名单中的这个元素置空

%这里你不能用小括号啊,用小括号每一次外层循环结束后都可能会把name_list给减少一个维度

%然后中途就可能会出现索引抽出矩阵的维度的情况

%用小括号,就直接把大cell中的一个小cell给删去了

%用大括号,是把大cell中的小cell中的元素设为空,小cell还是存在的

break

end

end

end

%还记得cellfun么?不记得的话翻以前的文章去(直接点这句话就行

d6f0f32199f9131affa08586bbd287ea.png)

disp(name_list(~cellfun('isempty', name_list)))

Result:运行代码的一秒钟后

6e4c96875f9eeca423360a31224df083.png

思路2的Code:

clear

clc

[num_list,name_list]=xlsread('name_list.xlsx');% 导入总名单

[num_practice,name_practice]=xlsread('practice_list.xlsx');% 导入参加实训人的名单

WholeName = [name_list;name_practice];%合并两个名单

%下面对WholeName中的人名去重

names = {};

cnt = 0;

%思路就是两个名单叠一块一定有重名;

%有重名那么我下面的ind中一定有两个或两个以上的元素,把他们置空;

%如果是非重元素,则单独保存后再置空;

%由于实训名单中最后添加了三个总名单中没有的人名。

%所以用本方法会比上一种方法多出三个人来,

%不过这不影响,就是数据录入的问题

while ~isempty(WholeName)

ind = find(strcmp(WholeName{1},WholeName) == 1);

if length(ind) >= 2

WholeName(ind) = [];

else

cnt = cnt + 1;

names{cnt} = WholeName{1};

WholeName(1) = [];

end

end

disp(names')

Result:(多出三个人名,为什么请看Code的注释)运行代码的一秒钟后

353f37ecf92edd51da805bec027f0163.png

这个方法二是写着写着想起来的,

d6f0f32199f9131affa08586bbd287ea.png,配合着回顾之前学的东西。

-- END --

47822cc1e70720fdfaf4998ee0e4818f.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值