Shell Script – Arrays e tabelas

cygwin-logo

Desta vez o aplicativo de notas e médias de alunos foi escrito no Notepad++ para ser interpretado com o Cygwin, uma espécie de emulador de terminal Linux.  A escolha do editor de código fonte foi feita levando-se em consideração que o Cygwin não tem suporte direto para Unicode ou qualquer conjunto de caracteres a não ser os códigos de páginas do Windows – ver Wikipedia.  Mesmo assim, não esqueça de configurar o Notepad++ através do menu “Editar > Conversão final de linha > Converter para formato Unix”.

  • Design-time:
echo -n "Informe o numero de alunos: "
read a
echo -n "Informe o numero de notas: "
read n
declare -A nota
for ((i=0;i<a;i++))
do
    sn=0
	echo -n "Aluno: "
	read nome[i]
	for ((j=0;j<n;j++))
    do
        echo -n "Nota: "
		read nota[$i,$j]
		sn=$((sn+nota[$i,$j]))
    done
	media[$i]=$((sn/n))
	sm=$((sm+media[$i]))
done
echo -n -e "Aluno\t"
for ((j=1;j<=a;j++))
do
    echo -n -e "Aluno"$j$"\t"
done
echo "Media"
for ((i=0;i<a;i++))
do
    echo -n -e ${nome[i]}$"\t"
	for ((j=0;j<n;j++))
    do
        echo -n -e ${nota[$i,$j]}$"\t"
    done
	echo ${media[$i]}
done
  • Runtime:

alunos_sh

    • Observações:
    1. O array bidimensional nota foi declarado como um array associativo – ver a quinta linha na listagem acima (declare -A nota).
    2. Expressões (operações com operandos e operadores) são envoltas em parênteses duplos: (()) e seus valores (resultados) são obtidos precedendo-as com o caractere cifrão: $(()).
    3. Valores de variáveis são obtidos envolvendo-as com cifrão (e adicionalmente chaves): ${nome_da_variável}.
    4. O comando echo tem as opções -n (para evitar newline) e -e (para uso dos caracteres de escape, como \n e \t por exemplo).

Go – Slices e tabelas

go

Para escrever o aplicativo de notas e médias dos alunos em Go temos que utilizar slices (fatias) em vez de arrays, já que estes não são dinâmicos em Go, isto é, seus tamanhos não podem ser alterados após suas definições.  Observe as linhas 16, 17 e 18 na listagem abaixo, em que os slices nome, nota e media são criados e inicializados por meio da função make.

  • Design-time:

alunos_go_0

Observe também que foram criadas as variáveis innome e innota (nas linhas 20 e 21) que recebem valores através da função Scanf (nas linhas 27 e 31) .  Esses valores são acrescentados aos slices nome e nota através da função append (nas linhas 28 e 32).

  • Runtime:

alunos_go

Dúvidas? Muitas, não? A única certeza é que, como disse Jeremie Zimmerman, “O Google sabe se você é um usuário padrão do Google, o Google sabe com quem você se comunica, quem você conhece, do que você pesquisa, potencialmente sua orientação sexual, sua religião e pensamento filosófico, mais que sua mãe e talvez mais que você mesmo.

Tcl – Simulando tabelas com listas

tcl

Tcl, a linguagem de comandos de ferramentas, é uma linguagem de script baseada em strings e também procedimental, fácil e poderosa.  Vejamos neste exemplo como ficaria o exercício sobre notas e médias de alunos.

Design-time:

puts -nonewline "\nQuantos alunos? "
flush stdout
set a [gets stdin]
puts -nonewline "Quantas notas para cada aluno? "
flush stdout
set n [gets stdin]
puts ""
set linha() {}
set sm 0.0
set mc 0.0
for {set i 1} {$i <= $a} {incr i} {
	set sn 0.0
	set soma 0.0
	puts -nonewline "Aluno $i: "
	flush stdout
	lappend linha($i) [gets stdin]
	for {set j 1} {$j <= $n} {incr j} {
		puts -nonewline "Nota $j: "
		flush stdout
		lappend linha($i) [gets stdin]
		set sn [expr {$sn + [lindex $linha($i) $j]}]
		}
	set media [expr {$sn / $n}]
	set sm [expr {$sm + $media}]
	lappend linha($i) $media
	}
set mc [expr {$sm / $a}] 
puts ""
puts -nonewline "Aluno"
for {set j 1} {$j <= $n} {incr j} {
	puts -nonewline "\tNota "
	puts -nonewline $j
	}
puts "\tMedia"
for {set i 1} {$i <= $a} {incr i} {
	puts [join $linha($i) "\t"]
	}
puts -nonewline "Media da classe =\t"
puts $mc

Runtime:

medias_tcl

Examine o código e compare com outras linguagens.

A impressão de mais de uma string em uma mesma linha não é tão simples como na maioria das linguagens. Observe o argumento  -nownewline do comando puts.

Outra curiosidade é que a chave de abertura de um bloco, “{“, não deve iniciar uma linha, mas estar sempre na última posição no comando da linha anterior.  Observe isto nos comandos for.

Dúvidas? Muitas, não? Mas não abaixe a cabeça, uma forma de superação é resistir, perseverar mesmo que seja a passos de bebê.

Ruby – Matrizes

200px-Ruby_logo.svg

A rigor, não é possível criar arrays multidimensionais em Ruby, mas é possível colocar um array dentro de outro array, simulando então um array multi-dimensional.  Uma característica interessante dos arrays em Ruby é o fato de suportarem diferentes tipos de dados, como números e strings, por exemplo.  Veja a seguir o exercício dos alunos, notas e médias em Ruby.

Design-time:

puts "\t" + 'ALUNOS, NOTAS, MEDIAS'
media = Array.new
sm = 0.0
mc = 0.0
puts
puts 'Informe o numero de alunos: '
a = gets.chomp.to_i
puts 'Informe o numero de notas: '
n = gets.chomp.to_i
nota = Array.new(a){Array.new(n)}
puts
for i in 0..a-1 do
	sn = 0.0
	print 'Aluno ' + (i+1).to_s + ":\t"
	nota[i][0] = gets.chomp.to_s
	for j in 1..n
		print 'Nota ' + (j).to_s + ":\t"
		nota[i][j] = gets.chomp.to_f
		sn = sn + nota[i][j]
	end
	media[i] = sn / n
	sm = sm + media[i]
end
mc = sm / a
puts
print 'Aluno' + "\t"
for j in 1..n do
	print 'Nota' + + (j).to_s + "\t"
end
print 'Media' + "\n"
for i in 0..a-1 do
	print nota[i][0] + "\t"
	for j in 1..n
		print nota[i][j].to_s + "\t"
	end
	print media[i].to_s + "\n"
end
puts 'Media da classe' + ":\t" + mc.to_s

Runtime:

tabela_ruby1

Dúvidas?  Talvez muitas, não? A única certeza é que estamos em plena era da estupidez depois da eleição desse animal (Bozo).

 

Python – Simulando tabelas

python

Em Python, as listas, que são coleções ou sequências ordenadas e mutáveis, substituem os arrays com a vantagem de poder armazenar itens de diferentes tipos como, por exemplo, números e strings, ao mesmo tempo.

Vejamos a seguir o algoritmo do exercício da tabela com alunos e notas escrito para prompt de comando e para interface gráfica.

    • prompt de comando
      • designtime
alunos = int(input('Informe o numero de alunos: '))
notas = int(input('Informe o numero de notas: '))
tabela = []
somaMedia = 0

for i in range(alunos):
    linha = []
    somaNota = 0
    linha.append(input("Aluno " + str(i+1) + ": "))
    for j in range(notas):
        linha.append(int(input("Nota " + str(j+1) + ": ")))
        somaNota = somaNota + int(linha[j+1])
    media = somaNota / notas
    somaMedia = somaMedia + media
    linha.append(media)
    tabela.append(linha)

print("\nAluno" + "\t", end="")
for j in range(notas):
    print("Nota " + str(j) + "\t", end="")
print("Media")    
for i in range(alunos):
    if i > 0:
        print()
    for j in range(notas+2):
        print(str(tabela[i][j]) + "\t", end="")
print("\nMedia da classe: " + str(somaMedia / alunos))
      • runtime

tabelas_python1

      • designtime

tabelas_python

      • runtime

tabela_python6

Observe o uso de uma lista (tabela) de listas (linha) simulando uma matriz (array bidimensional) no primeiro caso.  No segundo, foi usada apenas uma lista (nota).

Dúvidas? Dizem que os eleitores desinformados do Bozo já se arrependeram; só ainda não o fizeram os de mau caráter.