Advertisement
Guest User

Voto.sh

a guest
May 25th, 2015
281
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 11.04 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. Principal() {
  4. clear
  5.  
  6. #Declarar variáveis
  7. num="2"
  8. vt="0"
  9. maxchar="0"
  10. c[0]="Nulo"
  11. v[0]="0"
  12. m[0]="${#c[0]}"
  13.  
  14. #Verificar o tamanho do terminal
  15. hor=$(tput cols)
  16. ver=$(tput lines)
  17.  
  18. #Vetor definindo as cores utilizadas no gráfico
  19. cl[0]="\033[0m"
  20. cl[1]="\033[31m"
  21. cl[2]="\033[32m"
  22. cl[3]="\033[33m"
  23. cl[4]="\033[34m"
  24. cl[5]="\033[35m"
  25. cl[6]="\033[36m"
  26. cl[7]="\033[44m"
  27. cl[8]="\033[42m"
  28.  
  29. #Vetor contendo os coeficientes de comparação utilizados no gráfico
  30. vi[0]="0"
  31. vi[1]="1000"
  32. vi[2]="2000"
  33. vi[3]="3000"
  34. vi[4]="4000"
  35. vi[5]="5000"
  36. vi[6]="6000"
  37. vi[7]="7000"
  38. vi[8]="8000"
  39. vi[9]="9000"
  40. vi[10]="10000"
  41.  
  42. StartVot
  43. }
  44.  
  45. StartVot () {
  46. clear
  47. #Mostrar o menu inicial
  48. echo -e  "${cl[7]}┌───────────────────────┐"
  49. echo "│  Programa de Votação  │"
  50. echo -e "└───────────────────────┘${cl[0]}"
  51. echo -e "\nOpções :\n"
  52. echo "     1 - Iniciar votação"
  53. echo "     2 - Regras da votação"
  54. echo "     3 - Voltar ao menu principal"
  55. echo -e "     E - Sair do programa\n\n"
  56. read -sn 1 opt
  57. case $opt in
  58.   1)
  59.     Definir
  60.     ;;
  61.   2)
  62.     Regras
  63.     ;;
  64.   3)
  65.     source ./menu.sh
  66.     ;;
  67.   E|e)
  68.     exit
  69.     ;;
  70.   *)
  71.     StartVot
  72.     ;;
  73. esac
  74.  
  75. }
  76.  
  77. Regras () {
  78. clear
  79. #Mostrar as regras
  80. echo -e "${cl[7]}┌────────────────────┐"
  81. echo "│  Regras da Votação │"
  82. echo -e "└────────────────────┘${cl[0]}"
  83. echo
  84. echo -e "Este programa permite uma simulação de votação contendo um número variável de candidatos.\n"
  85. echo -e "♢  Inicialmente, o programa pedirá que o usuário defina quantos candidatos participarão da votação, permitindo qualquer entrada entre 2 e 6. Cada candidato terá um índice, representado por um número entre 1 e o número máximo de candidatos. Após isso, o programa requisitará o nome de cada candidato, podendo conter até 20 caracteres. Se o nome inserido contiver mais de 20 caracteres, apenas os 20 primeiros caracteres serão utilizados. Caso nenhuma entrada seja inserida, o candidato ficará com um nome genérico de Candidato (1-6), de acordo com seu índice.\n"
  86. echo "♢  Na tela de votação, os nomes do candidatos serão mostrados junto aos seus respectivos índices. O índice de cada candidato é o código que deverá ser utilizado para votar no mesmo. Caso nenhum voto seja inserido quando terminar a votação, o usuário será solicitado a reiniciar a votação com os mesmos candidatos, ou a terminar o programa."
  87. #Ir até o fim da tela
  88. tput cup $(($ver-2)) 0
  89. echo -ne "\n${cl[7]}Pag (1/2)   D = Próxima página    S = Voltar ao menu    E = Sair do Programa${cl[0]}"
  90. #Ler a opção desejada
  91. read -sn 1 opt
  92. case $opt in
  93.   D|d)
  94.     Regras_2
  95.     ;;
  96.   S|s)
  97.     StartVot
  98.     ;;
  99.   E|e)
  100.     exit
  101.     ;;
  102.   *)
  103.     Regras
  104.     ;;
  105. esac
  106. }
  107.  
  108. Regras_2 () {
  109. clear
  110. #Mostrar as regras
  111. echo -e "${cl[7]}┌────────────────────┐"
  112. echo "│  Regras da Votação │"
  113. echo -e "└────────────────────┘${cl[0]}"
  114. echo
  115. echo -e "♢  Na tela de resultados, o programa contabiliza os votos e desenha um gráfico vertical de barras representando a porcentagem de votos recebida por cada candidato. Cada candidato é associado com uma cor pré-determinada de acordo com seu índice, sendo ${cl[1]}1 = Vermelho${cl[0]}, ${cl[2]}2 = Verde${cl[0]}, ${cl[3]}3 = Amarelo${cl[0]}, ${cl[4]}4 = Azul-Escuro${cl[0]}, ${cl[5]}5 = Roxo${cl[0]}, ${cl[6]}6 = Azul-Claro${cl[0]}. Do lado direito do gráfico, será mostrado o percentual de votos recebidos por cada candidato, e abaixo do gráfico, será mostrada a quantidade de votos recebida por cada um.\n"
  116. echo "♢  O vencedor da votação é o candidato que recebeu o maior número de votos. Caso mais de um candidato tenha sido o vencedor, a votação terá como resultado um empate entre todos os candidatos que receberam o maior número de votos. Se mais de 50% dos votos totais tenham sido anulados, a eleição será anulada, e nenhum vencedor será anunciado."
  117. tput cup $(($ver-2)) 0
  118. echo -ne "\n${cl[7]}Pag (2/2)   A = Página anterior    S = Voltar ao menu    E = Sair do Programa${cl[0]}"
  119. #Ler a opção desejada
  120. read -sn 1 opt
  121. case $opt in
  122.   A|a)
  123.     Regras
  124.     ;;
  125.   S|s)
  126.     StartVot
  127.     ;;
  128.   E|e)
  129.     exit
  130.     ;;
  131.   *)
  132.     Regras_2
  133.     ;;
  134. esac
  135. }
  136.  
  137. Definir () {
  138.  
  139. #Escolher o número de candidatos na votação
  140. clear
  141. echo -e  "${cl[7]}┌──────────────────────┐"
  142. echo "│  Definir Candidatos  │"
  143. echo -e "└──────────────────────┘${cl[0]}"
  144. if [ "$bool" = "1" ]; then
  145.   echo "Opção inválida. Insira um número entre 1 e 6"
  146.   bool="0"
  147. else
  148.   echo "Escolha o número de candidatos que irão competir (Entre 2 e 6)"
  149. fi
  150.  
  151. read num
  152.  
  153. #Verificar o número digitado
  154.  
  155. case $num in
  156.   [2-6])
  157.     echo
  158.     ;;  
  159.   e|E)
  160.     exit
  161.     ;;
  162.   *)
  163.     bool="1"
  164.     Definir
  165.     ;;
  166. esac
  167.  
  168. #Ler o nome de cada um dos candidatos
  169. for ((i=1;i<=$num;i++));
  170. do
  171.   echo -n "Digite o nome do candidato $i, contendo até 20 caracteres:"
  172.   read c[$i]
  173.   #Se nenhum nome for inserido, definir um nome genérico pro candidato
  174.   if [ -z "${c[$i]}" ]; then
  175.     c[i]="Candidato $i"
  176.   fi
  177.  
  178.   #Filtrar os primeiros 20 caracteres do nome lido
  179.   c[$i]=${c[$i]:0:20}
  180.  
  181.   #Calcular o número de caracteres do nome de cada candidato
  182.   m[$i]=${#c[$i]}
  183.  
  184.   #Calcular o número máximo de caracteres utilizado por um dos nomes
  185.   if [ "${m[$i]}" -ge "$maxchar" ]; then
  186.     maxchar="${m[$i]}"
  187.   fi
  188.  
  189. #Inicializar vetor definindo os votos do candidato
  190.   v[$i]="0"
  191. done
  192.  
  193. Votacao
  194. }
  195.  
  196. Votacao () {
  197. clear
  198. echo -e  "${cl[7]}┌───────────┐"
  199. echo "│  Votação  │"
  200. echo -e "└───────────┘${cl[0]}"
  201.  
  202. echo -e "\n \nDigite o número do candidato desejado e pressione ENTER. \n \n \n"
  203.  
  204. #Mostrar o nome dos candidatos
  205. echo "0 = Anular o voto"
  206. for ((i=1;i<=$num;i++));
  207. do
  208.   echo "$i = ${c[$i]}"
  209. done
  210. echo -e "\nF=Fechar votação    S=Reiniciar Votação    E=Sair\n\n"
  211.  
  212. Escolha
  213. }
  214.  
  215. Escolha () {
  216.  
  217. if [ "$b" = "1" ]; then
  218.   echo "Candidato não existente"
  219.   b="0"
  220. fi
  221.  
  222. #Ler a opçao de voto
  223. read voto
  224.  
  225. #Incrementar o contador de votos do candidato escolhido, e do número total de votos
  226.  
  227. case $voto in
  228.   [0-"$num"])
  229.     v[$voto]=$(( ${v[$voto]} + 1 ))
  230.     vt=$(($vt+1))
  231.     clear
  232.     Votacao
  233.     ;;
  234.   F|f)
  235.     vzero
  236.     ;;
  237.   S|s)
  238.     StartVot
  239.     ;;
  240.   E|e)
  241.     exit
  242.     ;;
  243.   *)
  244.     b="1"
  245.     Votacao  
  246.     ;;
  247.    
  248. esac
  249.  
  250. }
  251.  
  252. vzero () {
  253.     #Verificar se o número de votos foi maior que zero
  254.     if [ "$vt" -eq "0" ] ; then
  255.       clear
  256.       echo -e  "${cl[7]}┌──────────────────┐"
  257.       echo "│  Fechar Votação  │"
  258.       echo -e "└──────────────────┘${cl[0]}\n\n\n"
  259.       echo "Nenhum voto foi registrado, reiniciar votação com os mesmos candidatos? (S/N)"
  260.       read -sn 1 v0
  261.       case $v0 in
  262.         S|s)
  263.           Votacao
  264.           ;;
  265.         N|n)
  266.           exit
  267.           ;;
  268.         *)
  269.           vzero
  270.           ;;
  271.       esac
  272.     #Mostrar os resultados
  273.     else
  274.       Result
  275.     fi
  276. }
  277.  
  278. Result() {
  279. clear
  280. #Declarar o contador de vencedores
  281. numvenc="0"
  282. votvenc="0"
  283. #Calcular a porcentagem de votos de cada candidato em inteiro e decimal
  284. for ((i=0;i<=$num;i++));
  285. do
  286.   p[$i]=`expr ${v[$i]} \* 10000 / $vt`
  287.   pd[$i]=$(echo "scale=2; ${v[$i]} * 100 / $vt" | bc)
  288. done
  289.  
  290. echo -e "\nResultados:\n "
  291.  
  292. #Iniciar sequência vertical do gráfico
  293. for ((i=10;i>=1;i--));
  294. do
  295.  
  296. #Iniciar sequência horizontal do gráfico
  297.   for ((j=0;j<=$num;j++));
  298.   do
  299.     #Escrever os números de porcentagem
  300.     if [ "$j" -eq "0" ]; then
  301.       if [ "$i" -gt "1" ]; then
  302.         echo -n "$(tput smul)$(($i-1))0%$(tput rmul)"
  303.       else
  304.         echo -n " $(($i-1))%"
  305.       fi
  306.     echo -n "│"
  307.     fi
  308.     #Desenhar cada coluna do gráfico
  309.     if [ "${p[$j]}" -le "$(($i-1))125" ]; then
  310.       echo -n " "
  311.     elif [ "${p[$j]}" -ge "${vi[$i]}" ]; then
  312.       echo -ne "${cl[$j]}${cl[0]}"  
  313.     elif [ "${p[$j]}" -ge "$(($i-1))875" ]; then
  314.       echo -ne "${cl[$j]}${cl[0]}"
  315.     elif [ "${p[$j]}" -ge "$(($i-1))750" ]; then
  316.       echo -ne "${cl[$j]}${cl[0]}"
  317.     elif [ "${p[$j]}" -ge "$(($i-1))625" ]; then
  318.       echo -ne "${cl[$j]}${cl[0]}"
  319.     elif [ "${p[$j]}" -ge "$(($i-1))500" ]; then
  320.       echo -ne "${cl[$j]}${cl[0]}"
  321.     elif [ "${p[$j]}" -ge "$(($i-1))375" ]; then
  322.       echo -ne "${cl[$j]}${cl[0]}"
  323.     elif [ "${p[$j]}" -ge "$(($i-1))250" ]; then
  324.       echo -ne "${cl[$j]}${cl[0]}"
  325.     elif [ "${p[$j]}" -ge "$(($i-1))125" ]; then
  326.       echo -ne "${cl[$j]}${cl[0]}"
  327.     fi
  328.  
  329.     #Mostrar o nome de cada candidato e sua porcentagem de votos recebidos
  330.     if [ "$j" -eq "$num" ]; then
  331.       cnumb=$((10-$i))
  332.       if [ "$cnumb" -le "$num" ]; then
  333.         echo -ne "│${cl[$cnumb]}${c[$cnumb]}${cl[0]}"
  334.         #Adicionar espaços para alinhar a coluna dos candidatos
  335.         for ((k=0;k<=$(( $maxchar - ${m[$cnumb]} ));k++))
  336.         do
  337.           echo -n " "
  338.         done
  339.         echo ": ${pd[$cnumb]}%"
  340.       else
  341.         echo "│"
  342.       fi
  343.     else
  344.       echo -n "│"
  345.     fi
  346.    
  347.   done  
  348. done
  349.  
  350. #Desenhar a base do gráfico
  351. echo -n "   └"
  352. for ((i=1;i<=$num;i++))
  353. do
  354.   echo -n "─┴"
  355. done
  356. echo "─┘"
  357.  
  358. #Avaliar o resultado
  359. for ((i=1;i<=$num;i++));
  360. do
  361.   if [ "${v[$i]}" -gt "$votvenc" ]; then
  362.     numvenc="1"
  363.     venc[$numvenc]="$i"
  364.     votvenc="${v[$i]}"
  365.   elif [ "${v[$i]}" -eq "$votvenc" ]; then
  366.     numvenc=$(($numvenc + 1))
  367.     venc[$numvenc]="$i"
  368.   fi
  369. done
  370.  
  371. #Verificar se a eleição foi anulada
  372. if [ "${p[0]}" -gt "5000" ]; then
  373.   echo "A eleição foi anulada!"
  374.  
  375. #Anunciar o resultado
  376. elif [ "$numvenc" -eq "1" ]; then
  377.   echo -e "O vencedor é ${cl[${venc[1]}]}${c[${venc[1]}]}${cl[0]}!"
  378. else
  379.   echo -n "Houve empate! Os vencedores são "
  380.   for ((i=1;i<=$numvenc;i++))
  381.   do
  382.     if [ "$i" -eq "$numvenc" ]; then
  383.       echo -e "${cl[${venc[$i]}]}${c[${venc[$i]}]}${cl[0]}!"
  384.     elif [ "$i" -eq $(($numvenc - 1)) ]; then
  385.       echo -ne "${cl[${venc[$i]}]}${c[${venc[$i]}]}${cl[0]} e "
  386.     else
  387.       echo -ne "${cl[${venc[$i]}]}${c[${venc[$i]}]}${cl[0]}, "
  388.     fi
  389.   done
  390. fi
  391.  
  392. #Mostrar o nome e quantidade de votos de cada candidato
  393. for ((i=0;i<=$num;i++));
  394. do
  395.   echo -n "      ${c[$i]}"
  396.   for ((j=0;j<=$(( $maxchar - ${m[$i]} ));j++))
  397.   do
  398.     echo -n " "
  399.   done
  400.   if [ "$i" = "0" ]; then
  401.       echo ": ${v[$i]}      Total de votos : $vt"
  402.   else
  403.     echo ": ${v[$i]}"
  404.   fi
  405. done
  406.  
  407. #Ir até o fim da tela
  408. tput cup $(($ver-2)) 0
  409. echo -ne "\n${cl[7]}M = Voltar ao menu principal    S = Voltar ao menu de votação    E = Sair${cl[0]}"
  410. MenuResult
  411. }
  412.  
  413. MenuResult () {
  414. #Ler a opção desejada pelo usuário
  415. read -sn 1 opt
  416. case $opt in
  417.   M|m)
  418.     source ./menu.sh
  419.     ;;
  420.   S|s)
  421.     Principal
  422.     ;;
  423.   E|e)
  424.     clear
  425.     exit
  426.     ;;
  427.   *)
  428.     MenuResult
  429.     ;;
  430. esac
  431. }
  432.  
  433. Principal
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement