Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6555283
  • 博文数量: 1159
  • 博客积分: 12444
  • 博客等级: 上将
  • 技术积分: 12570
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-13 21:34
文章分类

全部博文(1159)

文章存档

2016年(126)

2015年(350)

2014年(56)

2013年(91)

2012年(182)

2011年(193)

2010年(138)

2009年(23)

分类: LINUX

2013-07-03 09:22:29

功能说明:实现统计录入学生成绩的总人数,得出最高分,最低分,平均分,方差,标准方差,还有各个分数段的所占百分比



点击(此处)折叠或打开

  1. #!/bin/bash
  2. # 2013/07/01 sun
  3. #功能说明:实现统计录入学生成绩的总人数,得出最高分,最低分,平均分,方差,标准方差,还有各个分数段的所占百分比
  4. echo "请输入所有学生的成绩,以空格隔开:"
  5. read -a score_arr
  6. #定义一个数组来存放用户输入的成绩
  7. sorted_arr=($(printf '%s\n' "${score_arr[@]}"|sort -n -r))
  8. #录入学生成绩,并且是成绩之间使用空格隔开
  9. declare -i i b=0 c=0 d=0 e=0 f=0
  10. #定义变量i来循环数组,依次读出数组里面的数据,定义五个初值为0的变量来存放每个分数段的人数
  11. for (( i=0; $i<${#sorted_arr[@]}; i=$i+1 ))
  12.  #进行for循环,依次取出数组里面的数据
  13. do
  14. #对每个取出来的数据进行判断
  15.  case ${sorted_arr[i]} in
  16.    ?|?\.*|[1-5]?|[1-5]?\.*)
  17. #如果取出数组里面的数据在60分以下
  18.    b=$(($b+1));;
  19. #变量b自加1,进行统计数据
  20.    6?|6?\.*)
  21. #如果取出数组里面的数据在60分--69分之间
  22.     c=$(($c+1));;
  23. #变量c自加1,进行统计数据
  24.    7?|7?\.*)
  25. #如果取出数组里面的数据在70分--79分之间
  26.     d=$(($d+1));;
  27. #变量d自加1,进行统计数据
  28.    8?|8?\.*)
  29. #如果取出数组里面的数据在80分--89分之间
  30.       e=$(($e+1));;
  31. #变量e自加1,进行统计数据
  32.    100|100\.0|9?|9?\.*)
  33. #如果取出数组里面的数据在90分--100分之间
  34.     f=$(($f+1));;
  35. #变量f自加1,进行统计数据
  36.    *)
  37.    score_rank[i]="Not a Score";;
  38. esac
  39. done
  40. #判断结束
  41. count=$(($b+$c+$d+$e+$f))
  42. #算出总人数
  43. declare -i j max min ave countall=0 u ua=0 ual=0 uall=0 fang
  44. #定义变量j,最大值max,最小值min,平均数ave,所有人的分数之和countall
  45. max=${sorted_arr[0]}
  46. #获取排序后的数组的第一个数,也就是最大数
  47. j=$((${#sorted_arr[@]}-1))
  48. #得到排序后的数组的最后的一个分数的下标
  49. min=${sorted_arr[j]}
  50. #获取排序后的数组的最后一个数,也就是最小数
  51. for (( j=0; $j<${#sorted_arr[@]}; j=$j+1 ))
  52. #进行for循环,让学生成绩相加,算出学生成绩的总分
  53. do
  54.    countall=$countall+${sorted_arr[j]}
  55. done
  56. ave=$countall/$count
  57. #算出平均成绩
  58. for (( j=0; $j<${#sorted_arr[@]}; j=$j+1 ))
  59. #进行for循环,让学生成绩相加,算出学生成绩的总分
  60. do
  61.    ua=$(awk -v va=${sorted_arr[j]} -v vb=$ave 'BEGIN{printf "%2d" ,va-vb}')
  62.    #让每一个数都减去平均数然后赋值于ua
  63.    ual=$(awk -v va=$ua -v vb=$ua 'BEGIN{printf "%2d" ,va*vb}')
  64.    #算得ua的平方
  65.    uall=$(awk -v va=$uall -v vb=$ual 'BEGIN{printf "%2d" ,va+vb}')
  66.    #算出它们的总合,也就是方差
  67. done
  68. u=$(awk -v va=$uall -v vb=$count 'BEGIN{printf "%2d" ,va/vb}')
  69. #算出学生成绩的平均分,并赋值于ave
  70. #下面是计算每个分数段的百分数
  71. countb=$(awk -v va=$b -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')
  72. #echo $countb
  73. countc=$(awk -v va=$c -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')
  74. #echo $countc
  75. countd=$(awk -v va=$d -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')
  76. #echo $countd
  77. counte=$(awk -v va=$e -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')
  78. #echo $counte
  79. countf=$(awk -v va=$f -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')
  80. #echo $countf
  81. #输出结果
  82. echo "总人数    最高分    最低分    平均分    方差     "
  83. echo "$count    $max    $min    $ave     $u    "
  84. echo "标准方差="
  85. echo "scale=5;sqrt($u)" | bc
  86. #算出标准方差
  87. echo         " 60分以下    60--69    70--79    80--89    90--100"
  88. echo     "人数"    "    $b     $c     $d     $e     $f"
  89. echo    "比例"    "$countb    $countc    $countd    $counte    $countf"


阅读(2831) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~