編寫shell指令碼實現統計一個小組的成績情況,統計資訊包括:總分,平均分,最高分...

weixin_34292287發表於2016-10-28

編寫shell指令碼實現統計一個小組的成績情況,統計資訊包括:總分,平均分,最高分_百度知道
https://zhidao.baidu.com/question/1821577782301852148.html

!/bin/bash

2013/07/01 sun

功能說明:實現統計錄入學生成績的總人數,得出最高分,最低分,平均分,方差,標準方差,還有各個分數段的所佔百分比

echo "請輸入所有學生的成績,以空格隔開:"

read -a score_arr

定義一個陣列來存放使用者輸入的成績

sorted_arr=($(printf '%s\n' "${score_arr[@]}"|sort -n -r))

錄入學生成績,並且是成績之間使用空格隔開

declare -i i b=0 c=0 d=0 e=0 f=0

定義變數i來迴圈陣列,依次讀出陣列裡面的資料,定義五個初值為0的變數來存放每個分數段的人數

for (( i=0; $i<${#sorted_arr[@]}; i=$i+1 ))

進行for迴圈,依次取出陣列裡面的資料

do

對每個取出來的資料進行判斷

case ${sorted_arr[i]} in

?|?.|[1-5]?|[1-5]?.)

如果取出陣列裡面的資料在60分以下

b=$(($b+1));;

變數b自加1,進行統計資料

6?|6?.*)

如果取出陣列裡面的資料在60分--69分之間

c=$(($c+1));;

變數c自加1,進行統計資料

7?|7?.*)

如果取出陣列裡面的資料在70分--79分之間

d=$(($d+1));;

變數d自加1,進行統計資料

8?|8?.*)

如果取出陣列裡面的資料在80分--89分之間

  e=$(($e+1));;

變數e自加1,進行統計資料

100|100.0|9?|9?.*)

如果取出陣列裡面的資料在90分--100分之間

f=$(($f+1));;

變數f自加1,進行統計資料

*)

score_rank[i]="Not a Score";;

esac

done

判斷結束

count=$(($b+$c+$d+$e+$f))

算出總人數

declare -i j max min ave countall=0 u ua=0 ual=0 uall=0 fang

定義變數j,最大值max,最小值min,平均數ave,所有人的分數之和countall

max=${sorted_arr[0]}

獲取排序後的陣列的第一個數,也就是最大數

j=$((${#sorted_arr[@]}-1))

得到排序後的陣列的最後的一個分數的下標

min=${sorted_arr[j]}

獲取排序後的陣列的最後一個數,也就是最小數

for (( j=0; $j<${#sorted_arr[@]}; j=$j+1 ))

進行for迴圈,讓學生成績相加,算出學生成績的總分

do

countall=$countall+${sorted_arr[j]}

done

ave=$countall/$count

算出平均成績

for (( j=0; $j<${#sorted_arr[@]}; j=$j+1 ))

進行for迴圈,讓學生成績相加,算出學生成績的總分

do

ua=$(awk -v va=${sorted_arr[j]} -v vb=$ave 'BEGIN{printf "%2d" ,va-vb}')

讓每一個數都減去平均數然後賦值於ua

ual=$(awk -v va=$ua -v vb=$ua 'BEGIN{printf "%2d" ,va*vb}')

算得ua的平方

uall=$(awk -v va=$uall -v vb=$ual 'BEGIN{printf "%2d" ,va+vb}')

算出它們的總合,也就是方差

done

u=$(awk -v va=$uall -v vb=$count 'BEGIN{printf "%2d" ,va/vb}')

算出學生成績的平均分,並賦值於ave

下面是計算每個分數段的百分數

countb=$(awk -v va=$b -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')

echo $countb

countc=$(awk -v va=$c -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')

echo $countc

countd=$(awk -v va=$d -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')

echo $countd

counte=$(awk -v va=$e -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')

echo $counte

countf=$(awk -v va=$f -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')

echo $countf

輸出結果

echo "總人數 最高分 最低分 平均分 方差 "

echo "$count $max $min $ave $u "

echo "標準方差="

echo "scale=5;sqrt($u)" | bc

算出標準方差

echo " 60分以下 60--69 70--79 80--89 90--100"

echo "人數" " $b $c $d $e $f"

echo "比例" "$countb $countc $countd $counte $countf"

相關文章