简单的shell 成绩管理系统
2013-11-16 22:40
302 查看
最近在看张昊写的《linux shell 编程从入门到精通》,喜欢这本书的风格,简单易懂,还带一点幽默,读起来有味。
刚好看完第8章的awk,老师要求完成个程序,因为是初学,在不断的翻书,找资料,然后尝试后,简易地实现了。
作业:学生成绩管理程序
Ø 程序功能:要求实现4个功能,每个功能作为一个函数
Ø 1.向文件中插入记录
Ø 2.显示文件中的每条记录的每个字段值
Ø 3.从文件中修改指定学号的记录
Ø 4.对学生成绩进行统计(包括每个学生总成绩;每个学科前十名和总成绩前二十名统计)
tip:
构造三个类似数据库的文本文件:
第一个为学院信息文件,包含字段:
学院编号(唯一),学院名称
第二个为学生信息文件,包含字段:
学号(唯一),学生姓名,所在学院编号,说明(休学suspended,退学dropout)
第三个为学生成绩文件,包含字段:
学号(唯一),学生姓名,科目名称,成绩;说明(期考final,补考makeup)
说明:每个记录占一行;分隔符可以自己选定,建议用”,”; 编码规则自己定;文件名自己定
////////////////////////////工程目录//////////////////////////////////////////
///////////////////以下是StuInfoSysMan.sh脚本//////////////////////////////
//////////////////////以下是reportTotalScore.awk脚本////////////////////////////
////////////////////////以下是运行结果///////////////////////////
1.1 执行菜单item1call print_fie func
2 从文件中修改指定学号的记录
3.向文件中插入记录
4 对学生成绩进行统计(包括每个学生总成绩;每个学科前十名和总成绩前二十名统计)
执行结果 ,可以看到不同的课程的排序结果和总排序结果(由于为了截图等方便,数据没有超过10个,但是不影响代码降序排列的功能)
可以看到不同科目C,C++,JAVA和总成绩都已经呈降序排列
因为这本书让我更加喜欢了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 ,不再那么恐惧,不得不承认那奇怪的语法确实刚开始不太适应,但是慢慢却觉得这样设计也是有其合理性的,那就是短小精悍,简简单单的命令描述,替代高级语言的所需要一大堆的代码,这样能减小项目的大小。一条条命令就像留有好多不同接口,参数让用户调用的的“算法类”似的,而不用亲自去写些“算法类”了。发现适合自己的书,是令人开心的事情。
相关文章推荐
- 用C++写的学生成绩管理系统(比较简单的没有使用链表,只是用到了类和对象)
- C程序简单学生成绩管理系统
- 用C写的简单学生成绩管理系统
- 简单的学生成绩管理系统
- C语言实现简单学生成绩管理系统
- MySQL 创建一个简单的成绩管理系统
- shell 编程实验--实现学生成绩管理系统
- Linux--用shell写一个学生成绩管理系统
- 简单学生成绩管理系统
- 一个简单的学生成绩管理系统
- 使用Java模拟一个简单的Dos学生成绩管理系统:
- shell实现学生成绩管理系统
- JAVA语言 实现简单的学生成绩管理系统(总分+平均分+排名)
- 简单的学生成绩管理系统
- C_综合使用数组实现简单的学生成绩管理系统
- 简单的学生成绩管理系统 (用链表 多个文件)
- 自己用c++写的简单成绩管理系统框架
- 【十二】一个简单的学生成绩管理系统
- C语言小项目(简单的学生成绩管理系统)
- 简单学生成绩管理系统(Java实现)