MATLAB 设计一个学生管理系统(类与对象)

设计一个简单的学生成绩管理程序,包含如下功能:
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();


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值