Fortran – Números Primos

fortran

A estrutura de controle de fluxo no Fortran é obtida com o laço do, como demonstrado no exemplo seguinte, cujo código pode ser escrito, compilado e executado com a IDE Plato.  Alternativamente, pode ser escrito com o Bloco de Notas e,  no prompt de comando, compilado com o comando gfortran primos.f95 – o primos.  Para rodá-lo, basta digitar o nome do programa (primos) e acionar a tecla Enter.

program primos
    integer :: start, ending
    print *, "Numeros Primos"
    print *, "Informe valor inicial: "
    read *, start
    if (start < 2) then
      start = 2
    end if
    print *, "Informe valor final: "
    read *, ending
    if (ending < 3) then
      ending = 3
    end if
    
	do i = start, ending
    	do j = start, i/j
        	if (mod(i,j) == 0) then
            	exit
            end if
        end do
        if (j > (i/j)) then
          write (*,*) i
        end if
	end do         
end program primos

E a seguir, uma saída de tela:

for_f95_1

Dúvidas? Espero que em outubro você decida entre a civilização e a barbárie!

 

Gráficos do Logo com Scratch

scratch0

No Scratch há 3 estruturas de controle de fluxo: forever, repeat e repeat until.  O exemplo abaixo, utilizando o último dos laços citados, imita o Logo.

repeat_scratch

Veja abaixo o script que desenha quadrados de diversos tamanhos utilizando o bloco de controle (Control, de cor amarela) repeat until no segundo procedimento.  Ao clicar na bandeirinha verde e depois na barra de espaços, a animação é feita com os blocos de comando de movimento (Motion, de cor azul) e da caneta (Pen, de cor verde).  Lembre-se: esses e os outros blocos de comando possuem um reentrância na parte de cima e uma saliência na parte de baixo para encaixes.

repeat_scratch2

Tente alterar os valores das variáveis sides (número de lados do polígono) e count (contador) para ver o que acontece.

Se não quiser baixar e instalar o Scratch, você pode rodar o Editor online.  Neste caso, uma boa alternativa é o Snap!

Tcl – Números Primos

tcl

Tcl, Tool Command Language, é uma linguagem de programação dinâmica, interpretada, de alto nível e propósito geral, muito simples e compacta, mas poderosa.  Neste exemplo, demonstra-se o uso dos laços for e while aninhados.

O script abaixo pode ser escrito no Bloco de Notas do Windows.

#!/usr/bin/tclsh

puts {Numeros Primos}
puts -nonewline "Informe um limite inferior >= 2: "
flush stdout
set first [gets stdin]

if {$first < 2} {
	set first 2
}

puts -nonewline "Informe um limite superior >= 2: "
flush stdout
set last [gets stdin]

if {$last < 3} {
	set last 3
}

for {set i $first} {$i < $last} {incr i} {
	set j $first
	while {$j <= [expr $i / $j]} {
		
		if {[expr $i % $j] == 0} {
			break
		}
		incr j
	}
	if {$j > [expr $i / $j]} {
		puts -nonewline "$i "
	}
}

Exemplo de uma saída de tela no prompt de comando do Windows:

for_tcl1

Em Tcl há 2 estruturas de controle de fluxo, repetição ou iteração:

– Laço for

for {set variavel_de_controle valor_inicial} {$variavel_de_controle operador_relacional valor_final} {incr variavel_de_controle} {
instruções
}

– Laço while

set variavel_de_controle valor_inicial
while {$variavel_de_controle operador_relacional valor_final} {
instruções
incr variavel_de_controle
}

A inicialização da variável de controle é feita com o comando set. Uma condição é testada usando-se uma expressão com os operadores relacionais  ==, !=, >, >=, <<=.  Observe que em uma expressão a variável é precedida pelo cifrão ($) porque seu valor é um operando. O incremento da variável de controle é feito com o comando incr.

Baixe gratuitamente o interpretador ActiveTcl no site da empresa canadense ActiveState e comece a estudar Tcl imediatamente.  Há diversos tutoriais online.  Em TkDocs você pode ir direto à criação de Graphical User Interfaces com a extensão Tk.  Observe também as semelhanças com Python, Ruby e Perl.

Python, Logo e Minecraft

python

O laço for tem a seguinte estrutura em Python:

for variável in range([primeiro,]último+passo[,passo]):
    instruções
[else:
    instruções]

As partes envolvidas por colchetes ([ ]) são opcionais.  O valor default para o passo (incremento) é 1 (um).  O valor inicial, se omitido, é 0 (zero).  Observe que o valor final é o valor imediatamente anterior ao informado dentro dos parênteses da função range.  Os dois pontos (:) após range() ou else indicam o início de um bloco de instruções (que ficam indentadas).  Veja os exemplos a seguir.

  • Python pode importar o módulo gráfico da tartaruguinha (do Logo):

for_python_1

Em Logo, o loop é realizado através do comando repeat. Observe como o código acima seria no Logo:

for_logo1

O que aconteceria se trocássemos a literal 90 por 91 em ambos códigos?  Poderíamos também adicionar uma cor ao traço.  Veja o resultado abaixo.

for_python_logo

  • Python também pode importar o módulo gráfico do game Minecraft:

for_python_minecraft

Observe que foram criados e empilhados 5 blocos coloridos identificados pelos índices  0, 1, 2, 3 e 4.  A coordenada y se refere à altura, e o bloco original é de lã branca (blocktype = 35).

Os exemplos acima são baseados nos livros Teach Your Kids To Code, do Bryson Payne, e Learn To Program With Minecraft, do Craig Richardson, ambos publicados pela No Starch Press. Tente comparar os códigos e, se ainda houver dúvidas, fique à vontade para perguntar.

Ruby – Números Primos

200px-Ruby_logo.svg

Vejamos um algoritmo simplificado para mostrar uma faixa de números primos com o código a seguir, escrito em Ruby.

puts 'Faixa de Valores - Numeros Primos'
first= 0
last = 0

puts
puts 'Informe o valor inicial da faixa: '
first = gets.chomp.to_i
puts 'Informe o valor final da faixa: '
last = gets.chomp.to_i

puts
puts 'Numeros Primos de ' + first.to_s + ' a ' + last.to_s + ':'
puts

for i in first..last do
	k = 0
	for j in 2..i
		if i % j == 0 then
			k = k + 1
		end
	end
	if k == 1 then
		puts i
	end
end

A seguir ilustramos uma possível saída de tela.

ruby_for1

Observe que as expressões in first..last e in 2..i nos laços for equivalem a = first to last e = 2 to i em outras linguagens (como o BASIC, por exemplo).  A cláusula do é opcional; observe que foi usada no primeiro laço (do contador i), mas não no segundo (do contador j).

A variável k serve para contar quantas divisões sem resto um número pode ter.  Assim, se o valor de k é igual a 1, então o número é divisível apenas por si mesmo (além de ser divisível por 1, claro) e, neste caso, considerado como número primo.

Dúvidas? De matemática ou de programação?

Object Pascal – Números Primos

lazarus

Em Object Pascal o laço for inclui as cláusulas to e do se o valor final do contador for maior que o inicial, isto é, se houver incremento (step = 1).  E downto e do se o valor final for menor que o inicial, isto é, se houver decremento (step = -1).  Veja o exemplo a seguir, escrito e compilado com a IDE Lazarus, onde o primeiro botão mostra uma caixa de mensagem com valores crescentes dos 10 primeiros números primos, e o segundo botão, valores decrescentes deles.

procedure TForm1.Button1Click(Sender: TObject);
var
  i,j:integer;
begin
  for i:=0 to 30 do
  begin
    for j:=2 to i do
        if(i mod j) = 0 then
             break;
    if(j=i) then
                showmessage(inttostr(i));
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
   i,j:integer;
begin
  for i:=30 downto 0 do
  begin
    for j:=2 to i do
        if(i mod j) = 0 then
             break;
    if(j=i) then
            showmessage(inttostr(i));
  end;
end;

A ilustração a seguir mostra o primeiro número primo assim que o segundo botão (cujo rótulo é “Ordem Decrescente”) do formulário é pressionado.

lazarus_for1

Ao se clicar no botão “Ok” (da caixa de mensagem), o próximo número primo será mostrado.

Java – O x da questão

Java_

Ainda usando o Bloco de Notas do Windows e a compilação em linha de comando, veja a seguir um exemplo do uso do laço for em Java.

//javac equis.java
class equis
{	
	public static void main(String args[])
	{
		System.out.println();
		for(int row=1;row<22;row++)
		{
			for(int col=1;col<22;col++)
				if(row==col)
					System.out.printf("%c", 171);
				else
					if(col==22-row)
						System.out.printf("%c", 187);
					else
						System.out.printf("%c",32);
			System.out.println();
		}
	}
}

Observe que foi usado o comando javac para compilar. E, para a execução, foi usado o comando java seguido pelo nome da classe (programa), obtendo-se a saída de tela ilustrada abaixo.

for_java1

O primeiro laço for altera o número da linha (valor da variável row), e o segundo, aninhado, altera o número da coluna (valor da variável col). Para cada linha, o programa verifica se o número da linha é igual ao número da coluna.  Em caso positivo, o caractere << é impresso.  Senão, verifica se o número da coluna é igual a 22 menos o número da linha.  Em caso positivo, o caractere >> é impresso; senão, um espaço vazio é impresso.

Comparando-se a sintaxe do Java com a do BASIC, teríamos

  • Java
    for(int linha = primeiroValor; linha < ultimoValor; linha++)
    {

    }
  • BASIC
    DIM linha AS INTEGER
    FOR linha = primeiroValor TO ultimoValor STEP 1

    NEXT linha

Fácil, não?

CCC e a Árvore

Os três cês no título acima não se referem àquela organização paramilitar fundada em São Paulo por policiais, estudantes e intelectuais de extrema direita.  Se você está imaginando que seja a Academia Brasileira de Filosofia, o Farol da Democracia Representativa, o Grupo Brasileiro de Articulação Sionista, a UnoAmerica, o Ternuma, o Instituto Millenium, a TFP (Sociedade Brasileira de Defesa da Tradição, Família e Propriedade), o Movimento Vem Pra Rua, o Movimento Brasil Livre ou qualquer grupo de apoio a Bolsonaro, você só errou por causa do ano: o Comando de Caça aos Comunistas foi fundado em 1963.  Mas, não, o título se refere às magníficas linguagens de programação de dispositivos C, C++ e C#.  E a árvore não tem nada a ver com a Árvore do Conhecimento (ou Ciência) do Bem e do Mal, cujo fruto proibido levou a humanidade ao ponto em que está hoje, imersa no pecado.  Só que não.  Trata-se de um exemplo do uso do laço for, que encontrei no livro Treinamento em Linguagem C++, módulo 1 2a edição, da Victorine Viviane Mizrahi.  Vamos a este exemplo, nos três C’s.

  • C

Observe no comentário na primeira linha, precedido por //, o uso do compilador GCC (GNU Compile Collection).

c_for0

  • C++

O mesmo compilador foi usado, trocando-se o comando gcc por g++ e a extensão .c por .cpp.

c_for1

  • C#

Desta vez foi usado em linha de comando o compilador Roslyn (.NET Compiler Platform) csc e o arquivo fonte tem a extensão .cs.

tree

A tela de saída (runtime) é aproximadamente a mesma nos três casos.

c_for3

Como já entramos em setembro, restam as eleições de outubro e logo o espírito de Natal deverá amenizar o ódio que a direita disseminou entre nós desde 2013.

Dúvidas? Sugiro, antes de tudo, comparar atenciosamente o códigos nas três linguagens.