设计一个简单的学生成绩管理程序,包含如下功能:
1、可创建不少于100名学生成员;
2、每名成员的记录包括:学号、姓名、专业和5门课程的成绩;
3、能够实现添加、删除、修改学生成员;
4、能够实现添加、删除、修改学生成员的课程成绩;
5、分别计算每一门课程的平均成绩 ;
6、每一门课程单独排序,输出由高到低的课程、姓名、成绩信息。
文件代码
将文件夹放入工作目录,运行main.m文件
版本2020a
%%main.m
clear all;
global stu;
stu = students();
welcome();
while true
choices();
op = input('\n请输入你要进行的操作(输入括号内代表的操作数):');
switch op
case 0
goodbye();
clear all;
break
case 1
stu.print();
case 2
add_student();
case 3
remove_student();
case 4
update_student();
case 5
add_grade();
case 6
update_grade();
case 7
remove_grade();
case 8
avg_grade();
case 9
sort_grade();
otherwise
warning('请输入正确的操作数');
end
end
function welcome()
fprintf('------------------------------------------------------------\n');
fprintf('| |\n');
fprintf('| |\n');
fprintf('| 欢迎使用学生管理系统 |\n');
fprintf('| 本系统所有数据保存在内存中,关闭即丢失,请注意 |\n');
fprintf('| |\n');
fprintf('| |\n');
fprintf('------------------------------------------------------------\n');
end
function goodbye()
fprintf('------------------------------------------------------------\n');
fprintf('| |\n');
fprintf('| |\n');
fprintf('| 系统已结束,所有信息均已删除 |\n');
fprintf('| 欢迎再次使用:) |\n');
fprintf('| |\n');
fprintf('| |\n');
fprintf('------------------------------------------------------------\n');
end
% 选项页面
function choices()
fprintf('查看所有学生信息\t\t(1)\n');
fprintf('添加学生\t\t\t\t(2)\n');
fprintf('删除学生\t\t\t\t(3)\n');
fprintf('修改学生信息\t\t\t(4)\n');
fprintf('添加学生成绩\t\t\t(5)\n');
fprintf('修改学生成绩\t\t\t(6)\n');
fprintf('删除学生成绩\t\t\t(7)\n');
fprintf('单科平均成绩\t\t\t(8)\n');
fprintf('单科成绩排名\t\t\t(8)\n');
fprintf('结束程序\t\t\t\t(0)\n');
end
function add_student()
global stu;
id = input('\n请输入学号:');
if ~isreal(id)
warning('请输入正确的数字');
return
end
if stu.find_by_id(id) ~= -1
warning('已经有同样学号的学生了,请更改学号');
return
end
name = input('请输入姓名:', 's');
zy = input('请输入专业:', 's');
op = input('是否输入成绩?(y/n):', 's');
if op == 'n'
isok = stu.append(student(id, name, zy));
if isok == 1
fprintf('\n添加成功\n\n');
else
fprintf('\n添加失败\n');
end
return
end
ke1 = input('课程1成绩:');
ke2 = input('课程2成绩:');
ke3 = input('课程3成绩:');
ke4 = input('课程4成绩:');
ke5 = input('课程5成绩:');
isok = stu.append(student(id, name, zy, ke1, ke2, ke3, ke4, ke5));
if isok == 1
fprintf('\n添加成功\n\n');
else
fprintf('\n添加失败\n\n');
end
end
function remove_student()
global stu;
id = input('\n请输入要删除学生的学号:');
if ~isreal(id)
warning('请输入正确的数字');
return
end
isok = stu.delete_student_by_id(id);
if isok == 1
fprintf('\n删除成功\n\n');
else
fprintf('\n删除失败\n\n');
end
end
function update_student()
global stu;
id = input('\n请输入要修改信息的学生的学号:');
if ~isreal(id)
warning('请输入正确的数字');
return
end
idx = stu.find_by_id(id);
if idx == -1
warning('未找到该学生');
return
end
fprintf('修改学号\t\t(1)\n');
fprintf('修改姓名\t\t(2)\n');
fprintf('修改专业\t\t(3)\n');
op = input('请输入要进行的操作:');
values = input('请输入修改后的信息:');
isok = stu.update_student_by_id(id, op, values);
if isok == 1
fprintf('\n修改成功\n\n');
else
fprintf('\n修改失败\n\n');
end
end
function add_grade()
global stu;
id = input('\n请输入学号:');
if ~isreal(id)
warning('请输入正确的数字');
return
end
idx = stu.find_by_id(id);
if idx == -1
warning('未找到该学生');
return
end
op = input('请输入要添加几号课程的成绩:');
values = input('请输入成绩');
isok = stu.update_grade_by_id(id, op, values);
if isok == 1
fprintf('\n添加成功\n\n');
else
fprintf('\n添加失败\n');
end
end
function update_grade()
global stu;
id = input('\n请输入学号:');
if ~isreal(id)
warning('请输入正确的数字');
return
end
idx = stu.find_by_id(id);
if idx == -1
warning('未找到该学生');
return
end
op = input('请输入要修改几号课程的成绩:');
values = input('请输入成绩');
isok = stu.update_grade_by_id(id, op, values);
if isok == 1
fprintf('\n修改成功\n\n');
else
fprintf('\n修改失败\n');
end
end
function remove_grade()
global stu;
id = input('\n请输入学号:');
if ~isreal(id)
warning('请输入正确的数字');
return
end
idx = stu.find_by_id(id);
if idx == -1
warning('未找到该学生');
return
end
op = input('请输入要删除几号课程的成绩:');
isok = stu.delete_grade_by_id(id, op);
if isok == 1
fprintf('\n修改成功\n\n');
else
fprintf('\n修改失败\n');
end
end
function avg_grade()
global stu;
op = input('请输入要计算第几门课程的成绩?(1~5):');
fprintf('平均成绩为:%d\n\n', stu.average(op));
end
function sort_grade()
global stu;
op = input('请输入要按照第几门的课程成绩排名?(1~5):');
switch op
case 1
f = @stu.cmp1;
case 2
f = @stu.cmp2;
case 3
f = @stu.cmp3;
case 4
f = @stu.cmp4;
case 5
f = @stu.cmp5;
otherwise
warning('请输入正确的操作数');
return
end
stu.sort(f);
end
%%student.m
%单个学生定义类
classdef student < handle
properties
id %学号 num
name %姓名 str
zhuanye %专业 str
ke1 %课1 num
ke2 %课2 num
ke3 %课3 num
ke4 %课4 num
ke5 %课5 num
end
methods
function obj = student(varargin)
if (nargin > 0)
obj.id = varargin{1};
end
if (nargin < 1)
obj.id = [];
end
if (nargin > 1)
obj.name = varargin{2};
end
if (nargin < 2)
obj.name = -1;
end
if (nargin > 2)
obj.zhuanye = varargin{3};
end
if (nargin < 3)
obj.zhuanye = -1;
end
if (nargin > 3)
obj.ke1 = varargin{4};
end
if (nargin < 4)
obj.ke1 = -1;
end
if (nargin > 4)
obj.ke2 = varargin{5};
end
if (nargin < 5)
obj.ke2 = -1;
end
if (nargin > 5)
obj.ke3 = varargin{6};
end
if (nargin < 6)
obj.ke3 = -1;
end
if (nargin > 6)
obj.ke4 = varargin{7};
end
if (nargin < 7)
obj.ke4 = -1;
end
if (nargin > 7)
obj.ke5 = varargin{8};
end
if (nargin < 8)
obj.ke5 = -1;
end
end
function obj = print(obj)
fprintf('学号:%d\t姓名:%s\t专业:%s\n', obj.id, obj.name, obj.zhuanye);
fprintf('\n');
end
function obj = print_line(obj)
fprintf('%d\t\t%s', obj.id, obj.name);
% 单行输出,姓名长度自适应
if length(obj.name) > 2
fprintf('\t');
else
fprintf('\t\t');
end
fprintf('%s\t\t%d\t\t%d\t\t%d\t\t%d\t\t%d\t\t\n', obj.zhuanye, obj.ke1, obj.ke2, obj.ke3, obj.ke4, obj.ke5);
end
end
end
%%students.m
% 学生列表类
% 建议点击每个function前面的加号,折叠代码,便于阅读
classdef students < handle
properties
stus = []
end
methods
% 课程平均成绩,没有成绩的会被算0分
function res = average(obj, op)
res = 0;
len = length(obj.stus);
switch op
case 1
for i = obj.stus
if i.ke1 ~= -1
res = res + i.ke1;
end
end
case 2
for i = obj.stus
if i.ke2 ~= -1
res = res + i.ke2;
end
end
case 3
for i = obj.stus
if i.ke3 ~= -1
res = res + i.ke3;
end
end
case 4
for i = obj.stus
if i.ke4 ~= -1
res = res + i.ke4;
end
end
case 5
for i = obj.stus
if i.ke5 ~= -1
res = res + i.ke5;
end
end
end
if len > 0
res = res / len;
end
end
function swap(obj, a, b)
c = obj.stus(a);
obj.stus(a) = obj.stus(b);
obj.stus(b) = c;
end
% 比较函数
function res = cmp1(obj, a, b)
if obj.stus(a).ke1 == obj.stus(b).ke1
if obj.stus(a).id > obj.stus(b).id
res = -1;
else
res = 1;
end
elseif obj.stus(a).ke1 < obj.stus(b).ke1
res = -1;
else
res = 1;
end
end
function res = cmp2(obj, a, b)
if obj.stus(a).ke2 == obj.stus(b).ke2
if obj.stus(a).id > obj.stus(b).id
res = -1;
else
res = 1;
end
elseif obj.stus(a).ke2 < obj.stus(b).ke2
res = -1;
else
res = 1;
end
end
function res = cmp3(obj, a, b)
if obj.stus(a).ke3 == obj.stus(b).ke3
if obj.stus(a).id > obj.stus(b).id
res = -1;
else
res = 1;
end
elseif obj.stus(a).ke3 < obj.stus(b).ke3
res = -1;
else
res = 1;
end
end
function res = cmp4(obj, a, b)
if obj.stus(a).ke4 == obj.stus(b).ke4
if obj.stus(a).id > obj.stus(b).id
res = -1;
else
res = 1;
end
elseif obj.stus(a).ke4 < obj.stus(b).ke4
res = -1;
else
res = 1;
end
end
function res = cmp5(obj, a, b)
if obj.stus(a).ke5 == obj.stus(b).ke5
if obj.stus(a).id > obj.stus(b).id
res = -1;
else
res = 1;
end
elseif obj.stus(a).ke5 < obj.stus(b).ke5
res = -1;
else
res = 1;
end
end
% 排序,传入比较函数
% f = obj.cmp1
% obj.sort(f)
function sort(obj, f)
n = length(obj.stus);
for i = 1:n
for j = i:n
if f(i, j) == -1
obj.swap(i, j);
end
end
end
end
% 可以一次性加入多个学生
function obj = students(varargin)
if nargin > 0
for i = 1:length(varargin)
obj.append(varargin{i});
end
end
end
% 添加学生,一次添加一个
function isok = append(obj, stu)
isok = 0;
if ~isempty(stu)
if obj.find_by_id(stu.id) ~= -1
warning('已经有同样学号的学生了,请更改学号');
else
obj.stus = [obj.stus stu];
isok = 1;
end
end
end
% 添加学生,一次可以添加多个
function appends(obj, varargin)
if nargin > 0
for i = 1:length(varargin)
obj.append(varargin{i});
end
end
end
function lyyQAQ(obj)
obj.stus = [];
end
% 输出学生
function print(obj, varargin)
if isempty(varargin)
fprintf('学号\t\t姓名\t\t专业\t\t\t课程1\t课程2\t课程3\t课程4\t课程5\n');
for i = obj.stus
i.print_line();
end
fprintf('\n');
else
for i = 1:length(varargin)
if varargin{i} ~= -1 && varargin{i} <= length(obj.stus)
obj.stus(varargin{i}).print();
else
warning('没有该学生');
end
end
end
end
% 根据学号查找学生,返回数组索引,没找到返回-1
function index_num = find_by_id(obj, id)
index_num = -1;
if ~isreal(id)
warning('请输入正确的学号');
else
for i = 1:length(obj.stus)
if obj.stus(i).id == id
index_num = i;
break
end
end
end
end
% 根据姓名查找学生,返回数组索引,没找到返回-1
function index_num = find_by_name(obj, name)
index_num = -1;
if ~ischar(name)
warning('请输入正确的姓名');
else
for i = 1:length(obj.stus)
if (length(obj.stus(i).name) == length(name))
if obj.stus(i).name == name
index_num = i;
break
end
end
end
end
end
% 根据学号删除学生,返回状态,删除成功返回1,没成功返回0
function isok = delete_student_by_id(obj, id)
isok = 0;
if ~isreal(id)
warning('请输入正确的学号');
else
idx = obj.find_by_id(id);
if idx == -1
warning('未找到该学生');
else
obj.stus(idx) = [];
isok = 1;
end
end
end
% 根据姓名删除学生,返回状态,删除成功返回1,没成功返回0
function isok = delete_student_by_name(obj, name)
isok = 0;
if ~ischar(name)
warning('请输入正确的姓名');
else
idx = obj.find_by_name(name);
if idx == -1
warning('未找到该学生');
else
obj.stus(idx) = [];
isok = 1;
end
end
end
% 根据学号修改学生信息
% 参数说明
% id -> 学生的学号
% op -> 要进行的操作,操作总共有下面三类
% 1 -> 修改学号 values应为num
% 2 -> 修改姓名 values应为str
% 3 -> 修改专业 values应为str
% values -> 要修改的
% isok 返回状态,修改成功返回1,没成功返回0
function isok = update_student_by_id(obj, id, op, values)
isok = 0;
if ~isreal(id)
warning('请输入正确的学号');
else
idx = obj.find_by_id(id);
if idx == -1
warning('未找到该学生');
else
switch op
case 1
if ~isreal(values)
warning('请输入数字')
else
idt = obj.find_by_id(values);
if idt == -1
obj.stus(idx).id = values;
isok = 1;
else
warning('已经存在这个学号!');
end
end
case 2
if ~ischar(values)
warning('请输入正确的姓名');
else
obj.stus(idx).name = values;
isok = 1;
end
case 3
if ~ischar(values)
warning('请输入正确的专业名');
else
obj.stus(idx).zhuanye = values;
isok = 1;
end
otherwise
warning('请输入正确的操作数(1~3)');
end
end
end
end
% 根据姓名修改学生信息
% 参数与上一个基本一致,区别是name为学生姓名
function isok = update_student_by_name(obj, name, op, values)
idx = obj.find_by_name(name);
isok = 0;
if idx == -1
warning('没有该学生');
else
isok = obj.update_student_by_id(obj.stus(idx).id, op, values);
end
end
% 根据学号修改学生成绩
% 参数说明
% id -> 学生的学号
% op -> 表示第几门课
% values -> 要修改为什么成绩
% isok 返回状态,修改成功返回1,没成功返回0
function isok = update_grade_by_id(obj, id, op, values)
isok = 0;
if ~isreal(id)
warning('请输入正确的学号');
else
idx = obj.find_by_id(id);
if idx == -1
warning('未找到该学生');
elseif ~isreal(values)
warning('请输入数字')
else
switch op
case 1
obj.stus(idx).ke1 = values;
isok = 1;
case 2
obj.stus(idx).ke2 = values;
isok = 1;
case 3
obj.stus(idx).ke3 = values;
isok = 1;
case 4
obj.stus(idx).ke4 = values;
isok = 1;
case 5
obj.stus(idx).ke5 = values;
isok = 1;
otherwise
warning('请输入正确的操作数(1~5)');
end
end
end
end
% 根据学号删除学生单科成绩
% op -> 第几门课
function isok = delete_grade_by_id(obj, id, op)
isok = obj.update_grade_by_id(id, op, -1);
end
end
end
%%test.m
clear all;
zhangsan = student(1, '张三', '通宵工程', 59, 41, 56, 98, 11);
stu = students();
stu.appends(student(2, '张四六', '通宵工程', 60, 54, 54, 64, 74),student(3, 'lyyQAQ', '通宵工程', 61, 12, 33, 66, 78));
stu.append(student(2, '张四六', '通宵工程', 60));
stu.append(student(3, 'lyyQAQ', '通宵工程', 61));
stu.append(student(4, '张六', '通宵工程'));
stu.append(student(5, '张七', '通宵工程', 61));
% stu.print();
% stu.find_by_id(6);
% stu.delete_student_by_id(5);
% stu.print();
% stu.delete_student_by_name('张六');
% stu.print();
% stu.update_student_by_id(1, 1, 3);
% stu.print();
% stu.update_student_by_id(1, 1, 4);
% stu.print();
% stu.update_student_by_id(2, 2, '李四');
% stu.update_student_by_id(3, 3, '牵网线');
% stu.print();
% stu.update_student_by_name('张三', 3, '牵网线');
% stu.print();
stu.update_grade_by_id(4, 2, 66);
% stu.print();
% stu.delete_grade_by_id(4, 1);
% stu.print();
% stu.swap(1, 2);
stu.print();
stu.print();
% stu.average(1)
% stu.average(2)
% stu.average(3)
% stu.average(4)
% stu.average(5)
stu.print();
stu.update_student_by_id(3, 1, 6);
stu.print();
f = @stu.cmp1;
stu.sort(f);
stu.print();
f = @stu.cmp2;
stu.sort(f);
stu.print();
f = @stu.cmp3;
stu.sort(f);
stu.print();
f = @stu.cmp4;
stu.sort(f);
stu.print();
f = @stu.cmp5;
stu.sort(f);
stu.print();