简单的shell 成绩管理系统

   最近在看张昊写的《linux shell 编程从入门到精通》,喜欢这本书的风格,简单易懂,还带一点幽默,读起来有味。

   刚好看完第8章的awk,老师要求完成个程序,因为是初学,在不断的翻书,找资料,然后尝试后,简易地实现了。

                                         作业:学生成绩管理程序

Ø     程序功能:要求实现4个功能,每个功能作为一个函数

Ø     1.向文件中插入记录

Ø     2.显示文件中的每条记录的每个字段值

Ø     3.从文件中修改指定学号的记录

Ø     4.对学生成绩进行统计(包括每个学生总成绩;每个学科前十名和总成绩前二十名统计)

tip:

   构造三个类似数据库的文本文件:

   第一个为学院信息文件,包含字段:

   学院编号(唯一),学院名称

   第二个为学生信息文件,包含字段:

   学号(唯一),学生姓名,所在学院编号,说明(休学suspended,退学dropout)

   第三个为学生成绩文件,包含字段:

   学号(唯一),学生姓名,科目名称,成绩;说明(期考final,补考makeup)

   说明:每个记录占一行;分隔符可以自己选定,建议用”,”; 编码规则自己定;文件名自己定

 

工程目录//

///以下是StuInfoSysMan.sh脚本//

#! /bin/bash


####### use: insert a record #######
####### param1: file path #######
####### param2: add record #######
function insert()
{
  sed -i "$ a\\$2" $1
  cat $1
}


####### param1: filepath #######
function print_file()
{
   if [ "$1" = "CollegeInfo" ]
   then
        echo "----------- this is CollegeInfo-----------"
        echo "CollegeId,CollegeName"
        cat $1
   elif [ "$1" = "StuInfo" ]
   then
        echo "------------this is StuInfo---------------"
        echo "StuId,StuName,CollgeId"
        cat $1 
   elif [ "$1" = "ScoreInfo" ]
   then
        echo "------------this is ScoreInfo-------------"
        echo 'StuId,StuName,Subjects,Scores,note'
        cat $1
   else  
        echo "$1: no file found" 
        return 
   fi
}


######## param1: filepath #######
######## param2: a key ##########
######## param3: newRecord ###### 
function modify_record()
{
    #sed -i "$2\/\s\/\.\*\/$3\/" $1               #  syntax error
    #sed -i '/1001/s/.*/1001,xiaobinge,1/' $1     #  syntax error
    #sed -i '/$2/s/.*/$3/' $1                     #  syntax error
    sed -i '/'$2'/s/.*/'$3'/' $1                  #  syntax right
    cat $1
    return 
}


function count_file()
{
  echo "----------the top10 of C subject-------------------"
 #awk -f reportTotalScore.awk ScoreInfo
  awk -f reportTotalScore.awk ScoreInfo|sort -t, -k3 -nr | head -n10
  echo "----------the top10 of C++ subject-----------------"
  awk -f reportTotalScore.awk ScoreInfo |sort -t, -k4 -nr | head -n10
  echo "----------the top10 of JAVA subject----------------"
  awk -f reportTotalScore.awk ScoreInfo |sort -t, -k5 -nr | head -n10
  echo "----------the top20 of totalScore subject----------"
  awk -f reportTotalScore.awk ScoreInfo |sort -t, -k6 -nr | head -n20
}




# main
while [ 1 ]
do
 echo "///menu tip///"
 echo "item-0: exit"
 echo "item-1: call print_fie func"
 echo "item-2: call insert func"
 echo "item-3: call modify_record func"
 echo "item-4: call count_file func"
 echo "please input your item 0~4"
 echo "//"
 read item
 if [ "$item" = "0" ]
 then
     break
 elif [ "$item" = "1" ]
 then
#------------test print func--------------
   print_file CollegeInfo
   print_file StuInfo
   print_file ScoreInfo
 elif [ "$item" = "2" ]
 then
#------------test insert func-------------
   echo "输入要为学生文件插入的新的一条记录,格式:学号,姓名,学院代号,备注"
 #  insert StuInfo "1009,knuth,1,"
    read newRecord
    insert StuInfo $newRecord
    
 elif [ "$item" = "3" ]
 then
#------------test modify field func-------
#   modify_record StuInfo 1001 "1001,xiaobingeeeeee,1"
    echo "请输入要为学生文件修改的新的记录key:"
    read key
    echo "请输入要为学生文件修改的新的记录,格式:学号,姓名,学院代号"
    read newRecord
    modify_record StuInfo $key $newRecord
 elif [ "$item" = "4" ]
 then
#-------------test count func-------------
   count_file
 else
   echo "please input 0~4 for item"
 fi
done



 

//以下是reportTotalScore.awk脚本

BEGIN {
  FS=","
  print "stuID\tstuName\tC\tC++\tjava\ttotalScore\tnote"
};
{$6=$3+$4+$5}
{
printf "%s,%s,%s,%s,%s,%s,%s\n",$1,$2,$3,$4,$5,$6,$7
}


以下是运行结果///

1.1 执行菜单item1call print_fie func

 

2 从文件中修改指定学号的记录


 

3.向文件中插入记录


 

4 对学生成绩进行统计(包括每个学生总成绩;每个学科前十名和总成绩前二十名统计)

执行结果 ,可以看到不同的课程的排序结果和总排序结果(由于为了截图等方便,数据没有超过10个,但是不影响代码降序排列的功能)



可以看到不同科目C,C++,JAVA和总成绩都已经呈降序排列

       


       因为这本书让我更加喜欢了shell ,不再那么恐惧,不得不承认那奇怪的语法确实刚开始不太适应,但是慢慢却觉得这样设计也是有其合理性的,那就是短小精悍,简简单单的命令描述,替代高级语言的所需要一大堆的代码,这样能减小项目的大小。一条条命令就像留有好多不同接口,参数让用户调用的的“算法类”似的,而不用亲自去写些“算法类”了。发现适合自己的书,是令人开心的事情。

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值