shell脚本实战之课程管理系统

大学生linux期末作业系列之通过shell脚本开发课程管理系统

偶然间看到蛮有意思的需求,具体内容如下

学生选课管理系统的功能分析可以反映该系统能够提供的各种功能,它能够 清晰地把系统要完成的功能展示给要使用的人员。系统分为学生模块、教师模块。
主要功能为学生通过系统查看可选课程,同时选择可选课程,选定后无法修改:
教师可添加新课程,查看课程所选人数,删除课程信息等操作。该学生选课管理系统的具体功能如下: (1)系统允许学生或教师登录
(2)系统允许学生选课 (3)系统允许学生查看个人信息及选课信息 (4)系统允许教师添加新课程
(5)系统允许教师删除已有课程 (6)系统允许教师查看某个课程的相关信息

设计学生选课系统。具体要求如下
A、进入系统后需先登录系统,主界面如下
--------欢迎使用学生选课系统-----------
1、学生身份登录系统
2、教师身份登录系统
3、退出学生选课系统
------------------------------------- 、
B、如以学生身份登录系统,系统显示的主界面 如下:
------------欢迎使用学生选课系统(学生)-----
1、学生选择课程
2、学生查看信息
3、学生退出系统
------------------------------------ 、
学生信息中需显示学生的学号、姓名、所选课程 等
C、如以教师身份登录系统,系统显示的主界面 如下: 欢迎使用学生选课系统(教 师)
1、教师添加课程
2、教师删除课程
3、教师查看课程
4、教师退出系统 教师查看课程时,需显示课程的选课人数和课程名称,其他不强制要求

代码功能概述
本次开发的 Bash 脚本实现了一个简单的学生选课管理系统,分为学生模块和教师模块。系统主要包括以下功能:

学生模块:

  • 学生登录
  • 选择课程
  • 查看个人信息及选课信息
  • 退选课程

教师模块:

  • 教师登录
  • 添加课程
  • 删除课程
  • 查看课程信息

各个函数的作用和使用的语法如下:

主登录函数 login
功能:显示主菜单并处理用户选择学生或教师登录。
语法:case语句用于选择用户操作,read命令获取用户输入。

学生登录函数 student_login
功能:学生登录验证。
语法:read命令获取学生输入的信息,grep命令验证信息是否存在。

学生菜单函数 student_menu
功能:显示学生操作菜单并处理用户选择。
语法:case语句处理用户选择的操作。

选择课程函数 select_course
功能:学生选择课程。
语法:while IFS= read -r line读取课程列表,grep验证课程是否存在,sed更新课程选课人数,echo记录选课信息。

查看学生信息及选课信息函数 view_student_info
功能:显示学生的基本信息和已选课程。
语法:grep获取学生信息,cut提取选课信息。

教师登录函数 teacher_login
功能:教师登录验证。
语法:read命令获取教师输入的信息,grep验证信息是否存在。

教师菜单函数 teacher_menu
功能:显示教师操作菜单并处理用户选择。
语法:case语句处理用户选择的操作。

添加课程函数 add_course
功能:教师添加新课程。
语法:read获取课程名称,echo记录课程信息。

删除课程函数 delete_course
功能:教师删除课程。
语法:while IFS= read -r line读取课程列表,sed删除课程信息及相关选课信息。

查看课程信息函数 view_courses
功能:查看课程信息及选课人数。
语法:while IFS= read -r course_info读取课程信息,cut提取课程名称,grep统计选课人数。

学生退选课程函数 delete_student_course
功能:学生退选课程。
语法:grep获取已选课程,sed删除选课记录。

开发过程中使用的语法如下:
case语句:用于处理用户输入并选择相应操作。
read命令:用于读取用户输入。
grep命令:用于查找和验证信息。
sed命令:用于修改文件内容。
while IFS= read -r line:用于逐行读取文件内容。

文件存储:
使用文本文件存储学生信息、教师信息、课程信息和学生选课信息。

代码如下:

#!/bin/bash

# 学生信息存储文件
student_info_file="student_info.txt"
# 教师信息存储文件
teacher_info_file="teacher_info.txt"
# 课程信息存储文件
course_file="courses.txt"
# 学生选课信息存储文件
student_course_file="student_course.txt"

# 登录函数
login() {
    clear
    echo "--------欢迎使用学生选课系统-----------"
    echo "*1、学生身份登录系统*"
    echo "*2、教师身份登录系统*"
    echo "*3、退出学生选课系统*"
    echo "-------------------------------------"
    read -p "请选择身份登录系统或退出: " choice

    case $choice in
        1) student_login ;;
        2) teacher_login ;;
        3) exit ;;
        *) echo "无效的选项,请重新选择!" ; login ;;
    esac
}

# 学生登录函数
student_login() {
    clear
    echo "------------欢迎使用学生选课系统(学生)-----"
    read -p "请输入学号: " student_id
    read -p "请输入姓名: " student_name
    read -s -p "请输入密码: " passwd
    # 检查学生信息是否存在
    if grep -q "^$student_id:$student_name:$passwd" "$student_info_file"; then
        student_menu
    else
        echo "学号或姓名或密码错误,请重试!"
        student_login
    fi
}

# 学生菜单
student_menu() {
    clear
    echo "------------欢迎使用学生选课系统(学生)-----"
    echo "*1、学生选择课程*"
    echo "*2、学生查看信息*"
    echo "*3、学生退选课程*"
    echo "*4、学生退出系统*"
    echo "-------------------------------------------"
    read -p "请选择操作或退出系统: " choice

    case $choice in
        1) select_course ;;
        2) view_student_info ;;
        3) delete_student_course ;;
        4) login ;;
        *) echo "无效的选项,请重新选择!" ; student_menu ;;
    esac
}

#选择课程函数
select_course() {
    clear
    echo "可选课程列表:"
    while IFS= read -r line; do
        echo "$line"
    done < "$course_file"
    read -p "请输入要选择的课程名称: " course_name
    # 检查课程是否存在
    if grep -q "^$course_name$" "$course_file"; then
        # 检查学生是否已选择该课程
        if grep -q "^$student_id:$course_name$" "$student_course_file"; then
            echo "您已选择该课程,请勿重复选择!"
            select_course
        else
            # 选课成功,更新选课人数
            sed -i "/^$course_name:/ s/$/1/" "$course_file"
            echo "$student_id:$course_name" >> "$student_course_file"
            echo "选课成功!"
            student_menu
        fi
    else
        echo "无效的课程名称,请重新选择!"
        select_course
    fi
}


# 查看学生信息及选课信息
view_student_info() {
    clear
    echo "学生信息:"
    grep "^$student_id:$student_name:" "$student_info_file"
    echo "已选课程:"
    grep "^$student_id:" "$student_course_file" | cut -d: -f2
    read -p "按任意键返回主菜单..." -n 1 -s
    student_menu
}

# 教师登录函数
teacher_login() {
    clear
    echo "------------欢迎使用学生选课系统(教师)-----"
    read -p "请输入用户名: " username
    read -s -p "请输入密码: " password
    echo ""
    # 检查教师用户名和密码是否匹配
    if grep -q "^$username:$password$" "$teacher_info_file"; then
        teacher_menu
    else
        echo "用户名或密码错误,请重试!"
        teacher_login
    fi
}

# 教师菜单
teacher_menu() {
    clear
    echo "------------欢迎使用学生选课系统(教师)-----"
    echo "*1、教师添加课程*"
    echo "*2、教师删除课程*"
    echo "*3、教师查看课程*"
    echo "*4、教师退出系统*"
    echo "-------------------------------------------"
    read -p "请选择操作或退出系统: " choice

    case $choice in
        1) add_course ;;
        2) delete_course ;;
        3) view_courses ;;
        4) login ;;
        *) echo "无效的选项,请重新选择!" ; teacher_menu ;;
    esac
}

# 添加课程函数
add_course() {
    clear
    read -p "请输入新课程名称: " course_name
    echo "$course_name" >> "$course_file"
    echo "课程添加成功!"
    read -p "按任意键返回教师菜单..." -n 1 -s
    teacher_menu
}

# 删除课程函数
delete_course() {
    clear
    echo "可删除课程列表:"
    while IFS= read -r line; do
        echo "$line"
    done < "$course_file"
    read -p "请输入要删除的课程名称: " course_name
    # 删除课程信息
    sed -i "/^$course_name:/d" "$course_file"
    # 删除选课信息中的该课程记录
    sed -i "/:$course_name$/d" "$student_course_file"
    echo "课程删除成功!"
    read -p "按任意键返回教师菜单..." -n 1 -s
    teacher_menu
}

# 查看课程信息函数
view_courses() {
    clear
    echo "课程信息:"
    while IFS= read -r course_info; do
        course_name=$(echo "$course_info" | cut -d: -f2)  # 获取课程名称
        # 统计整个文件中包含该课程名称的行数
        student_count=$(grep -c "$course_name" "$course_file")
        echo "课程名称: $course_name,选课人数: $student_count"
    done < "$course_file"
    read -p "按任意键返回教师菜单..." -n 1 -s
    teacher_menu
}

# 学生退选课程函数
delete_student_course() {
    clear
    echo "已选课程列表:"
    grep "^$student_id:" "$student_course_file" | cut -d: -f2
    read -p "请输入要退选的课程名称: " course_name
    # 检查学生是否已选择该课程
    if grep -q "^$student_id:$course_name$" "$student_course_file"; then
        # 删除学生选修的该门课程
        sed -i "/^$student_id:$course_name$/d" "$student_course_file"
        echo "退选成功!"
    else
        echo "您尚未选择该课程!"
    fi
    read -p "按任意键返回主菜单..." -n 1 -s
    student_menu
}

# 主程序入口
login

此外,另有student_info.txt、student_course.txt、courses.txt用于持久化存储文本信息。

测试数据写入脚本如下:

# 学生信息存储文件 student_info.txt
student_info_file="student_info.txt"

echo "1001:student:123456:计算机科学" >> "$student_info_file"

# 教师信息存储文件 teacher_info.txt
teacher_info_file="teacher_info.txt"
echo "teacher:123456" >> "$teacher_info_file"

# 课程信息存储文件 courses.txt
echo "计算机科学" >> "$course_file"
echo "微观经济学" >> "$course_file"
echo "中国古代文学" >> "$course_file"

# 学生选课信息存储文件 student_course.txt(初始为空)
touch "$student_course_file"

student_course.txt(学号:课程名,下方是另外测试的数据)

1001:linux
1001:baidu
1001:huawei
1001:hongmeng

courses.txt(课程名)

计算机科学
微观经济学
中国古代科学

teacher_info.txt

teacher:123456

待优化的地方如下

  1. 数据验证和处理:
    增加更多的数据验证,避免重复的输入和错误的操作。
    检查输入的合法性,例如课程名称、学号格式等。
  2. 安全性:
    密码存储应该使用加密方式而不是明文存储。
    考虑实现更安全的身份验证机制。
  3. 代码简化:
    函数之间有些冗余代码可以抽取成独立的函数,提高代码复用性和可读性。
    使用函数参数传递,减少全局变量的依赖。

但是考虑到是大学生作业使用的,不会真的投入生产,就先这样吧。

小型超市数据库原理及应用 课程设计报告 目录 一 课程设计目的------------------------------------------------------------- -2 二 课程设计方案------------------------------------------------------------- -2 总体思路----------------------------------------------------------------- ------------------------------2 软件总体模块设计--------------------------------------------------------- --------------------------2 数据库设计--------------------------------------------------------------- -----------------------------2 三 课程设计内容------------------------------------------------------------- --3 课程设计的实验环境------------------------------------------------------- --------------------------3 课程设计的目的----------------------------------------------------------- ----------------------------3 业务流程----------------------------------------------------------------- -------------------------------3 软件功能及模块划分------------------------------------------------------- --------------------------3 四 课程设计步骤------------------------------------------------------------- --6 数据库的建立------------------------------------------------------------- -----------------------------7 软件设计阶段------------------------------------------------------------- -----------------------------8 软件测试以及维护阶段----------------------------------------------------- -------------------------11 结束语------------------------------------------------------------------- --------------------------------11 一 课程设计目的 (1)大大提高超市的运作效率; (2)通过全面的信息采集和处理,辅助提高超市的决策水平; (3)使用本系统,可以迅速提升超市的管理水平,为降低经营成本, 提高效益,增强超市扩张力, 提供有效的技术保障。 二 课程设计方案 1总体思路 开发工具的选择:建议选用.net +SQL Server,或者学生可以根据系统的需要选择所用的编程语言与数据库。 系统开发方案: (1)设计出合理可行的数据库,建立正确的数据库表及表间关系。 (2)系统按照实现的功能,进行合理的模块划分,确定合理的功能流程。 (3)设计出友好美观的系统操作界面。 (4)编写出功能实现代码。 2 软件总体模块设计 本系统划分为六个模块:商品录入 收银业务 进货管理 销售管理 库存管理 人员管理 系统总体结构 3 数据库设计 本系统包括 7个表 1) 用户登录表:login 2) 商品表:goods 3) 会员信息表:huiyuan 4) 进货管理表:jinhuo 5) 库存表:kucun 6) 销售表:shouhuo 7) 供应商信息表:kehu 三 课程设计内容 1 课程设计的实验环境 硬件要求能运行Windows XP操作系统;开发工具可采用Microsoft Visual Studio 2005或Microsoft Visual Studio 2003,数据库管理系统采用SQL server。 2 课程设计
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值