Advertisement
Francoo

Calculador de Somatório

Dec 16th, 2012
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 6.60 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. # Pequeno script para calcular a nota de vários somatórios utilizando parciais. A equação utilizada será a da UFSC:
  4.  
  5. #           NPC - NTPC - NPI
  6. # P =  1 + ------------------
  7. #                 NP
  8.  
  9. # Onde:
  10.  
  11. # P - Pontuação Final.
  12. # NP - Número de Preposições Total.
  13. # NTPC - Número de Preposições Corretas na Questão.
  14. # NPC - Número de Preposições Corretas Marcadas (Acertos).
  15. # NPI - Número de Preposições Incorretas Marcadas (Erros).
  16.  
  17. # To do: Corrigir as POGs/Optimizar.
  18. #        Adicionar "breakpoints" para separar as diferentes partes (matérias).
  19. #        Comentar o código p/ futuras modificações.
  20.  
  21. # Deve-se completar as três sequências a seguir com os dados:
  22.  
  23. arrmarcadas=( 09 11 18 44 05 33 04 11 01 19 28 22 11 21 06 50 25 60 06 05 55 20 24 63 10 02 04 01 08 60 28 18 49 85 73 23 26 12 24 28 ) # GABARITO MARCADO, SEPARADO POR ESPAÇOS E EM ORDEM CRESCENTE DE QUESTÃO
  24. arrgabarito=( 43 11 15 40 12 55 15 43 17 23 28 21 11 12 22 51 57 18 06 07 39 20 24 63 10 18 05 01 08 60 28 03 48 85 77 38 24 44 24 29 ) # GABARITO CORRETO, SEPARADO POR ESPAÇOS E EM ORDEM CRESCENTE DE QUESTÃO
  25. arrpreposic=( 7 6 5 6 6 6 5 6 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 6 ABERTA 5 5 ABERTA 5 ABERTA 7 7 7 7 7 6 6 6 5 6 ) # QUANTIDADE DE PREPOSIÇÕES POR QUESTÃO, SEPARADO POR ESPAÇOS E EM ORDEM CRESCENTE DE QUESTÃO
  26.  
  27.  
  28. echo "Numero da Questao - Gabarito Marcado / Gabarito Correto / Numero de Preposicoes ou Tipo"
  29. for ((i=0; i<${#arrgabarito[@]}; i++)); do printf %02d $(echo -n "$(( $i + 1 ))"); echo "- ${arrmarcadas[${i}]} / ${arrgabarito[${i}]} / ${arrpreposic[${i}]}"; done
  30. echo
  31.  
  32. function bintodec {
  33. binary=$(echo $1 | rev)
  34. finnumb=()
  35. for ((i=0; i<${#binary}; i++)); do
  36. if [ $(eval echo ${binary:${i}:1}) -eq 1 ]; then
  37. prepnumb=$(echo "2^$i" | bc)
  38. finnumb=$(echo $finnumb $prepnumb)
  39. fi
  40. done
  41. echo $finnumb; }
  42.  
  43. function getstats {
  44.  
  45. if [ $# != 3 ]; then exit 1; fi
  46. if ! [ "$1" -eq "$1" ] 2>/dev/null; then exit 4; fi
  47. if ! [ "$2" -eq "$2" ] 2>/dev/null; then exit 5; fi
  48.  
  49. numNPC=0; numNPI=0; numNTPC=0; preptype=${3}; numP=0; pontfinal=0; pifinal=0; pcfinal=0; tcfinal=0; ifinal=0; ntcfinal=0
  50.  
  51. if [ $preptype == ABERTA ]; then #POG maldita
  52. valA=$(echo "obase=2; ${1}" | bc)
  53. valB=$(echo "obase=2; ${2}" | bc)
  54. if [ ${#valA} -gt ${#valB} ]; then
  55. numNP=$(echo ${#valA})
  56. else
  57. numNP=$(echo ${#valB})
  58. fi
  59. else
  60. numNP=$3
  61. fi
  62.  
  63. eval 'binA=$(printf %0'${numNP}'d '$(echo "obase=2;$1" | bc)')'
  64. eval 'binB=$(printf %0'${numNP}'d '$(echo "obase=2;$2" | bc)')'
  65.  
  66. if [ ${#binA} != ${#binB} ]; then exit 2; fi
  67. if [ ${#binA} != ${numNP} ]; then exit 3; fi
  68.  
  69. for ((i=0; i<$(( ${#binB} )); i++)); do
  70. prepA=$(eval echo ${binA:${i}:1})
  71. prepB=$(eval echo ${binB:${i}:1})
  72. if [ $prepB = 1 ]; then
  73. numNTPC=$(( $numNTPC + 1 ))
  74. if [ $prepA = 1 ]; then
  75. numNPC=$(( $numNPC + 1 ))
  76. fi; fi
  77. if [ $prepB = 0 ] && [ $prepA = 1 ]; then
  78. numNPI=$(( $numNPI + 1 ))
  79. fi
  80. done
  81.  
  82. if [ $preptype != ABERTA ]; then
  83. if [ $numNPC -gt $numNPI ]; then
  84. numP=$(echo -n "$(( ${numNP} + ${numNPC} - ${numNTPC} - ${numNPI} ))/${numNP}")
  85. else
  86. numP=0
  87. fi
  88. else
  89. if [ $numNPC = $numNTPC ]; then
  90. numP=1
  91. else
  92. numP=0
  93. fi; fi
  94.  
  95. echo $numP $numNTPC $numNPC $numNPI $binA $binB ;}
  96.  
  97. arrpont=(); pontfinal=0; pcfinal=0; pifinal=0; qntyprep=0; pnmfinal=0; gabval=0; marcval=0
  98.  
  99. if [ ${#arrgabarito[@]} -ne ${#arrmarcadas[@]} ] || [ ${#arrgabarito[@]} -ne ${#arrpreposic[@]} ]; then echo "ERRO 1: TAMANHO DE ARRAYS DIFERENTES. CHECAR CONCOMITANCIA ENTRE ARRAYS."; exit 1; fi
  100.  
  101. for ((i=0; i<=$(( ${#arrgabarito[@]} - 1 )); i++)); do
  102.  
  103. echo "QUESTAO $(( $i + 1 )): "
  104.  
  105. statsarr=( $(getstats ${arrmarcadas[${i}]} ${arrgabarito[${i}]} ${arrpreposic[${i}]}) )
  106.  
  107. case $? in
  108. 1) echo "ERRO 2: QUANTIDADE DE ARGUMENTOS INCORRETA. CHECAR CONCOMITANCIA ENTRE ARRAYS."; exit 1 ;;
  109. 2) echo "ERRO 3: TAMANHO DO BINARIO INCORRETO. QUANTIDADE DE PREPOSICOES INVALIDAS. CHECAR ARRAY ARRPREPOSIC."; exit 1 ;;
  110. 3) echo "ERRO 4: TAMANHO DO BINARIO INCORRETO. QUANTIDADE DE PREPOSICOES INVALIDAS. CHECAR ARRAY ARRPREPOSIC."; exit 1 ;;
  111. 4) echo "ERRO 5: ARGUMENTO NAO NUMERICO. GABARITO INVALIDO. CHECAR ARRAY ARRMARCADAS."; exit 1 ;;
  112. 5) echo "ERRO 6: ARGUMENTO NAO NUMERICO. GABARITO INVALIDO. CHECAR ARRAY ARRGABARITO."; exit 1 ;;
  113. esac
  114.  
  115. pontp=${statsarr[0]}
  116. prepcortot=${statsarr[1]}
  117. prepcor=${statsarr[2]}
  118. prepinc=${statsarr[3]}
  119. binmarc=${statsarr[4]}
  120. bingab=${statsarr[5]}
  121.  
  122. if [ $(echo "$pontp" | bc) == 1 ]; then pontp=1; tcfinal=$(( $tcfinal + 1 )); fi
  123. if [ "$pontp" == 0 ]; then tifinal=$(( $tifinal + 1 )); fi
  124. if [ "$pontp" != 0 ] && [ $(echo "$pontp" | bc) != 1 ]; then ntcfinal=$(( $ntcfinal + 1 )); fi
  125.  
  126. pontfinal=$(echo "scale=5;${pontp}+${pontfinal}" | bc)
  127.  
  128. if [ ${arrpreposic[${i}]} != ABERTA ]; then
  129. pcfinal=$(echo "scale=5;${prepcor}+${pcfinal}" | bc)
  130. pifinal=$(echo "scale=5;${prepinc}+${pifinal}" | bc)
  131. pnmfinal=$(( ( $prepcortot - $prepcor ) + $pnmfinal ))
  132. fi
  133.  
  134. pontoquest=$(echo "scale=4;$pontp" | bc)
  135.  
  136. if [ ${arrpreposic[${i}]} == ABERTA ]; then
  137. gabval=${arrgabarito[${i}]}
  138. else
  139. gabval=$(bintodec ${bingab})
  140. fi
  141.  
  142. if [ ${arrpreposic[${i}]} == ABERTA ]; then
  143. marcval=${arrmarcadas[${i}]}
  144. else
  145. marcval=$(bintodec ${binmarc})
  146. fi
  147.  
  148. echo "Quantidade de Preposicoes Totais / Tipo: ${arrpreposic[${i}]}"
  149. echo "Quantidade de Preposicoes Corretas Totais: $( if [ ${arrpreposic[${i}]} == ABERTA ]; then echo "--"; else echo "$prepcortot"; fi; )"
  150. echo "Preposicoes/Valor Marcado (s): $marcval"
  151. echo "Gabarito: ${gabval}"
  152. echo "Marcadas e Corretas: $( if [ ${arrpreposic[${i}]} == ABERTA ]; then echo "--"; else echo "$prepcor"; fi; )"
  153. echo "Marcadas mas Incorretas: $( if [ ${arrpreposic[${i}]} == ABERTA ]; then echo "--"; else echo "$prepinc"; fi; )"
  154. echo "Nao Marcadas mas Corretas: $( if [ ${arrpreposic[${i}]} == ABERTA ]; then echo "--"; else echo "$(( $prepcortot - $prepcor ))"; fi; )"
  155. echo "PONTUACAO: $pontoquest"
  156. echo
  157. done
  158.  
  159. for ((i=0; i<${#arrpreposic[@]}; i++)); do
  160. qntyprep=$(( ${qntyprep} + ${arrpreposic[$i]} ))
  161. done
  162.  
  163. if [[ ${tifinal} == "" ]]; then tifinal=0; fi
  164. if [[ ${ntcfinal} == "" ]]; then ntcfinal=0; fi
  165. if [[ ${tcfinal} == "" ]]; then tcfinal=0; fi
  166.  
  167. prefix="@h@----- "
  168.  
  169. echo "${prefix}PONTUACAO FINAL: $pontfinal / ${#arrgabarito[@]}"
  170. echo "${prefix}QUANTIDADE DE ACERTOS COMPLETOS: $tcfinal"
  171. echo "${prefix}QUANTIDADE DE ACERTOS PARCIAIS: $ntcfinal"
  172. echo "${prefix}QUANTIDADE DE TOTALMENTE INCORRETAS: $tifinal"
  173. echo "${prefix}QUANTIDADE DE PREPOSICOES CORRETAS E MARCADAS (CERTAS): $pcfinal"
  174. echo "${prefix}QUANTIDADE DE PREPOSICOES INCORRETAS E MARCADAS (ERRADAS): $pifinal"
  175. echo "${prefix}QUANTIDADE DE PREPOSICOES CORRETAS NAO MARCADAS: $pnmfinal"
  176. echo "${prefix}QUANTIDADE DE PREPOSICOES TOTAL: $qntyprep"
  177.  
  178. exit 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement