怎样编写shell脚本实现统计一个小组的成绩情况,统计信息包括:总分,平均分,最高分?

如题所述

第1个回答  2022-12-11
#!/bin/bash\x0d\x0a\x0d\x0a# 2013/07/01 sun\x0d\x0a\x0d\x0a#功能说明:实现统计录入学生成绩的总人数,得出最高分,最低分,平均分,方差,标准方差,还有各个分数段的所占百分比\x0d\x0a\x0d\x0aecho "请输入所有学生的成绩,以空格隔开:"\x0d\x0a\x0d\x0aread -a score_arr\x0d\x0a\x0d\x0a#定义一个数组来存放用户输入的成绩\x0d\x0a\x0d\x0asorted_arr=($(printf '%s\n"${score_arr[@]}"|sort -n -r))\x0d\x0a\x0d\x0a#录入学生成绩,并且是成绩之间使用空格隔开\x0d\x0a\x0d\x0adeclare -i i b=0 c=0 d=0 e=0 f=0\x0d\x0a\x0d\x0a#定义变量i来循环数组,依次读出数组里面的数据,定义五个初值为0的变量来存放每个分数段的人数\x0d\x0a\x0d\x0afor (( i=0; $i<${#sorted_arr[@]}; i=$i+1 ))\x0d\x0a\x0d\x0a #进行for循环,依次取出数组里面的数据\x0d\x0a\x0d\x0ado\x0d\x0a\x0d\x0a#对每个取出来的数据进行判断\x0d\x0a\x0d\x0a case ${sorted_arr[i]} in\x0d\x0a\x0d\x0a ?|?\.*|[1-5]?|[1-5]?\.*)\x0d\x0a\x0d\x0a#如果取出数组里面的数据在60分以下\x0d\x0a\x0d\x0a b=$(($b+1));;\x0d\x0a\x0d\x0a#变量b自加1,进行统计数据\x0d\x0a\x0d\x0a 6?|6?\.*)\x0d\x0a\x0d\x0a#如果取出数组里面的数据在60分--69分之间\x0d\x0a\x0d\x0a c=$(($c+1));;\x0d\x0a\x0d\x0a#变量c自加1,进行统计数据\x0d\x0a\x0d\x0a 7?|7?\.*)\x0d\x0a\x0d\x0a#如果取出数组里面的数据在70分--79分之间\x0d\x0a\x0d\x0a d=$(($d+1));;\x0d\x0a\x0d\x0a#变量d自加1,进行统计数据\x0d\x0a\x0d\x0a 8?|8?\.*)\x0d\x0a\x0d\x0a#如果取出数组里面的数据在80分--89分之间\x0d\x0a\x0d\x0a e=$(($e+1));;\x0d\x0a\x0d\x0a#变量e自加1,进行统计数据\x0d\x0a\x0d\x0a 100|100\.0|9?|9?\.*)\x0d\x0a\x0d\x0a#如果取出数组里面的数据在90分--100分之间\x0d\x0a\x0d\x0a f=$(($f+1));;\x0d\x0a\x0d\x0a#变量f自加1,进行统计数据\x0d\x0a\x0d\x0a *)\x0d\x0a\x0d\x0a score_rank[i]="Not a Score";;\x0d\x0a\x0d\x0aesac\x0d\x0a\x0d\x0adone\x0d\x0a\x0d\x0a#判断结束\x0d\x0a\x0d\x0acount=$(($b+$c+$d+$e+$f))\x0d\x0a\x0d\x0a#算出总人数\x0d\x0a\x0d\x0adeclare -i j max min ave countall=0 u ua=0 ual=0 uall=0 fang\x0d\x0a\x0d\x0a#定义变量j,最大值max,最小值min,平均数ave,所有人的分数之和countall\x0d\x0a\x0d\x0amax=${sorted_arr[0]}\x0d\x0a\x0d\x0a#获取排序后的数组的第一个数,也就是最大数\x0d\x0a\x0d\x0aj=$((${#sorted_arr[@]}-1))\x0d\x0a\x0d\x0a#得到排序后的数组的最后的一个分数的下标\x0d\x0a\x0d\x0amin=${sorted_arr[j]}\x0d\x0a\x0d\x0a#获取排序后的数组的最后一个数,也就是最小数\x0d\x0a\x0d\x0afor (( j=0; $j<${#sorted_arr[@]}; j=$j+1 ))\x0d\x0a\x0d\x0a#进行for循环,让学生成绩相加,算出学生成绩的总分\x0d\x0a\x0d\x0ado\x0d\x0a\x0d\x0a countall=$countall+${sorted_arr[j]}\x0d\x0a\x0d\x0adone\x0d\x0a\x0d\x0aave=$countall/$count\x0d\x0a\x0d\x0a#算出平均成绩\x0d\x0a\x0d\x0afor (( j=0; $j<${#sorted_arr[@]}; j=$j+1 ))\x0d\x0a\x0d\x0a#进行for循环,让学生成绩相加,算出学生成绩的总分\x0d\x0a\x0d\x0ado\x0d\x0a\x0d\x0a ua=$(awk -v va=${sorted_arr[j]} -v vb=$ave 'BEGIN{printf "%2d" ,va-vb}')\x0d\x0a\x0d\x0a #让每一个数都减去平均数然后赋值于ua\x0d\x0a\x0d\x0a ual=$(awk -v va=$ua -v vb=$ua 'BEGIN{printf "%2d" ,va*vb}')\x0d\x0a\x0d\x0a #算得ua的平方\x0d\x0a\x0d\x0a uall=$(awk -v va=$uall -v vb=$ual 'BEGIN{printf "%2d" ,va+vb}')\x0d\x0a\x0d\x0a #算出它们的总合,也就是方差\x0d\x0a\x0d\x0adone\x0d\x0a\x0d\x0au=$(awk -v va=$uall -v vb=$count 'BEGIN{printf "%2d" ,va/vb}')\x0d\x0a\x0d\x0a#算出学生成绩的平均分,并赋值于ave\x0d\x0a\x0d\x0a#下面是计算每个分数段的百分数\x0d\x0a\x0d\x0acountb=$(awk -v va=$b -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')\x0d\x0a\x0d\x0a#echo $countb\x0d\x0a\x0d\x0acountc=$(awk -v va=$c -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')\x0d\x0a\x0d\x0a#echo $countc\x0d\x0a\x0d\x0acountd=$(awk -v va=$d -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')\x0d\x0a\x0d\x0a#echo $countd\x0d\x0a\x0d\x0acounte=$(awk -v va=$e -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')\x0d\x0a\x0d\x0a#echo $counte\x0d\x0a\x0d\x0acountf=$(awk -v va=$f -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')\x0d\x0a\x0d\x0a#echo $countf\x0d\x0a\x0d\x0a#输出结果\x0d\x0a\x0d\x0aecho "总人数 最高分 最低分 平均分 方差 "\x0d\x0a\x0d\x0aecho "$count $max $min $ave $u " \x0d\x0a\x0d\x0aecho "标准方差=" \x0d\x0a\x0d\x0aecho "scale=5;sqrt($u)" | bc\x0d\x0a\x0d\x0a#算出标准方差\x0d\x0a\x0d\x0aecho " 60分以下 60--69 70--79 80--89 90--100"\x0d\x0a\x0d\x0aecho "人数" " $b $c $d $e $f"\x0d\x0a\x0d\x0aecho "比例" "$countb $countc $countd $counte $countf"

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网