0

I want to create a linux script that will allow user to enter how many subject he/she has. The script should computer average per subject. All of the subjects has 3 terms. Prelim. Midterm and final.Script should also get the average of prelim. midterm and finals and the overall average(Prelim+Midterm+final/3)

#!/bin/bash

counter=0
number=0
declare -a my_array
read -p "Enter the number of subects:" subj
declare -a array_term=(Prelim Midterm Final)
tres=3

for(( i = 1;i <= $subj; i++ ))
do
    k=0
    sum=0
    number=0
    declare -a my_array
    read -p "Enter the number of subects:" subj
    declare -a array_term=(Prelim Midterm Final)
    tres=3

    for(( f = 1; f <= 3; f++ ))
    do
        read -p  "Enter  ${array_term[$k]} Grade for  ${my_array[$k]}:" grade
        grade_array+=( $grade )
        prelim=$(echo "${grade_array[0]}")
        midterm=$(echo "${grade_array[1]}")
        final=$(echo "${grade_array[2]}")
        k=$(echo $k + 1)
    done

    sum=$(echo $prelim + $midterm + $final | bc)
    printf '%.4f\n' $(echo $sum / $tres | bc -l)
    echo "Prelim Grade is:" $prelim
    echo "Midterm Grade is:" $midterm
    echo "Final grade is:"  $final
    echo "Subject Average is":
    printf '%.4f\n' $(echo $sum / $tres | bc -l)
done

Result should be like this

Enter number of subject: 3
Enter subject Name: Math
Enter Prelim Grade For Math: 89
Enter Midterm Grade For Math:89 
Enter Final Grade For Math:89
Math Average is: 89
Enter subject Name: English
Enter Prelim Grade For English: 90
Enter Midterm Grade For English:90 
Enter Final Grade For English:90
English Average is: 90
Enter subject Name: Science
Enter Prelim Grade For Science: 91
Enter Midterm Grade For Science:91 
Enter Final Grade For Science:91
Science Average is: 91
Prelim Average is: 90
Midterm Average is:90
Final Average is:90
Overall Average is:90
tshiono
  • 21,248
  • 2
  • 14
  • 22

1 Answers1

0

Yes, Here you go:

#!/bin/bash
declare -A matrix
#terms
num_rows=3
#subjects
read -p "Enter the number of subects:" num_columns

declare -A subj_array
for ((i=1;i<=num_columns;i++)) do
        read -p "Enter the name of subject ${i}:" subj_name
        subj_array[$i+1]=${subj_name}
    for ((j=1;j<=num_rows;j++)) do
        if [[ $j == "1" ]] ; then
        read -p "Enter prelim marks for subject ${subj_name}: " jj
        elif [[ $j == "2" ]]; then 
        read -p "Enter midterm marks for subject ${subj_name}: " jj
        else
        read -p "Enter final marks for subject ${subj_name}: " jj
        fi
        matrix[$j,$i]=$jj
    done
done

f1="%$((${#num_rows}+1))s"
f2=" %9s"

printf "$f1" ''
for ((i=1;i<=num_rows;i++)) do
    printf "$f2" $i
done
echo

for ((j=1;j<=num_columns;j++)) do
    printf "$f1" $j
    for ((i=1;i<=num_rows;i++)) do
        printf "$f2" ${matrix[$i,$j]}
    done
    echo
done


for ((i = 1; i <= $num_columns; i++)); do
    sum_per_subj=0
    for ((j = 1; j <= $num_rows; j++)); do
    sum_per_subj=$(echo $sum_per_subj+${matrix[$j,$i]} | bc)
    done

    echo "Subject ${subj_array[$i+1]} Average is":
    printf '%.4f\n' $(echo $sum_per_subj / $num_columns | bc -l)
done

    overall_sum=0;
for ((i = 1; i <= $num_rows; i++)); do
    sum_per_term=0
    for ((j = 1; j <= $num_columns; j++)); do
    sum_per_term=$(echo $sum_per_term+${matrix[$i,$j]} | bc)
    done
    overall_sum=$(echo $overall_sum+${sum_per_term} | bc)


            if [[ $i == "1" ]] ; then
    echo "Term prelim Average is":
        elif [[ $i == 2 ]]; then 
    echo "Term mideterm Average is":
        else
    echo "Term final Average is":
        fi
    printf '%.4f\n' $(echo $sum_per_term / $num_rows | bc -l)
done
 echo "overall Average is":
    printf '%.4f\n' $(echo $overall_sum / $num_rows | bc -l)

I used a 2d Matrix (from https://stackoverflow.com/a/16487733/7486005) with subjects stored across rows and terms stored across columns. You're Welcome.

Adil Saju
  • 1,101
  • 3
  • 12
  • 26