Guia do Calouro para programação competitiva - Introdução a programação (Laços de repetição)

calouros Dez 16, 2020

Olha só, estou aqui de novo escrevendo essa introdução, e diziam que em dezembro tudo voltava ao normal.

Como vocês estão? Espero que estejam bem na universidade (passar nas matérias é importante)... Tá, também espero que estejam bem no geral. Vamos continuar falando sobre o básico de programação. Pra começar a acostumar vocês ao nosso linguajar em programação competitiva, vou fazer uma revisão básica do que a gente viu, colocando os termos em português e em inglês.

Já vimos sobre entrada (input), saída (output), comparações usando se (if ), senão (else) e senão se (else if ). Também vimos sobre variáveis, operações aritméticas e lógicas, mas esses termos não utilizamos em inglês. Para essa aula, vamos ver sobre laços de repetição (loops), onde abordaremos dois comandos muito importantes em programação competitiva (competitive programming ou cp).

Laços de Repetição

Bom, já falei ali atrás que laços de repetição são muito importantes em cp, mas não dei um motivo para tal informação. Loops servem para, bem, fazer uma repetição de um conjunto de comandos. Em teoria (e na prática também), um loop é como se você colocasse em um ponto do código uma marcação, enquanto mais para frente você fala para executar de novo a partir dessa marcação, fazendo isso até satisfazer uma condição e pular essa instrução que retorna para a execução do código na marcação, ou seja, até satisfazer um if colocado no código. Cá entre nós, dá pra fazer isso em C com um determinado comando, mas as pessoas não gostam muito desse comando, então podem fingir que nunca leram isso aqui, apesar de que talvez alguém fale desse comando durante sua vida na faculdade, lá em Arquitetura de Computadores.

Mas por hoje, vamos falar de duas formas que podemos fazer loops em programação mais simplesmente, já que existem comandos que facilitam nossa vida, evitando a necessidade de fazer o que eu falei ali em cima.

Enquanto (while)

O primeiro comando que abordaremos aqui é o comando enquanto. Como de costume, vou explicar primeiro em pseudocódigo, e então partir para o python. O comando enquanto em pseudocódigo é escrito da seguinte forma:

ENQUANTO (CONDIÇÃO) FAÇA
	bloco de código
FIMENQUANTO

Olhando assim, se parece bastante com o if certo? Pois é, o comando enquanto é semelhante a um if mesmo, porém ao invés de ser executado apenas uma vez, ele é executado até que a CONDIÇÃO seja verdadeira. Com isso, tem que se tomar cuidado para que um enquanto não fique executando infinitamente. Vou por aqui dois exemplos em pseudocódigo, um mostrando um código que irá executar o loop 10 vezes, e outro que está condenado a ficar executando infinitamente (ou até que alguém interrompa a execução).

i := 1
ENQUANTO (i <= 10) FAÇA
	ESCREVA (i)
	i := i+1
FIMENQUANTO

Espero que não seja confusa a forma como escrevi esse código. Acho que não né? A única coisa diferente aí é que o símbolo de atribuição que decidi usar nessa linguagem aí, que eu estou utilizando para essas postagens, é o símbolo ":=", que é muito utilizado em pseudocódigos e algoritmos matemáticos. Bom, um dia eu talvez especifique essa linguagem, lá por 30 de fevereiro... Mas enfim, nesse código aí eu crio a variável i e inicio ela com o valor 1, escrevendo o valor dela e aumentando o valor dela a cada iteração do laço enquanto.

ENQUANTO (0 < 1) FAÇA
	ESCREVA ("Alguém me pare ;-;")
FIMENQUANTO

Não preciso nem dizer que 0 nunca será maior que 1 não é mesmo? Tá, talvez de forma subjetiva, se conseguir encontrar uma bela porção de propriedades matemáticas estranhas, a Terra parar de girar e o sol parar de produzir energia, 0 possa ser maior que 1. Mas a máquina que está executando nunca pensará que 0 é maior que 1, então ela ficará eternamente rodando esse código. (O código acima nunca foi executado e nenhuma máquina foi ferida durante o período em que escrevo essa postagem).

Agora, explicando com a sintaxe do python. Para começo de conversa, o comando em python se chama while, onde while significa enquanto em inglês. Sobre a sintaxe do while, tal como no pseudocódigo escrito na linguagem sem nome que eu estou usando (acho que vou chamar ela de pseudocódigo BRUTE, parece um bom nome), é bem parecida com a sintaxe do if. Bora fazer um código então que lê valores do usuário até que ele digite 0. Para isso, a condição do while é que o valor da variável que será lida no input seja diferente de 0.

valor = 1
while (valor != 0):
	print('Escreva o valor 0 para encerrar a execução')
	valor = int(input())

Deu para perceber como o while é simples? Quer dizer, isso se você conseguiu entender bem sobre o if, mas enfim, vamos agora à melhor forma de fazer loops. Brincadeira, a melhor forma depende do contexto do código, mas em geral o while não é muito utilizado, apesar de que nesse caso do código python ele seja mais indicado.

Para (for)

Agora vamos abordar sobre o comando mais utilizado para criar loops em programação. Sua sintaxe é um pouco diferente do while, mas não é difícil de compreender ela. O for é utilizado para trabalhar com intervalos. Por exemplo, se você deseja criar uma repetição que irá iterar um número de 1 a 10, é melhor utilizar o for ao invés do while.

Como antes, vamos tratar primeiro o comando Para em pseudocódigo BRUTE (vou chamar assim mesmo a partir de agora). A sintaxe do comando é:

PARA variável DE valor_inicial A valor_final FAÇA
	bloco de código 1
FIMPARA

Nesse comando, nós precisamos necessariamente utilizar uma variável, que será a variável que sofrerá a alteração durante o loop. Quando eu disse que a sintaxe do for era um pouco diferente, estava me referindo a forma como indicamos o formato da iteração. Para pseudocódigo BRUTE, só podemos trabalhar com valores inteiros, diferente do Python, onde abordaremos mais para frente sobre diferentes tipos de iterações. Agora, para escrever aquele código onde o enquanto era executado 10 vezes, podemos escrever o código da seguinte forma:

PARA i DE 1 A 10 FAÇA
	ESCREVA(i)
FIMPARA

Não sei vocês, mas para mim esse código é muito mais elegante que aquele código utilizando while. Acredito que não preciso explicar sobre o funcionamento do código, certo? Pois bem, vamos agora ver como esse código fica quando escrito em Python.

Para definir um intervalo em python, utilizamos a função range(). Nessa função, podemos inserir 3 valores, definindo qual o valor da variável no começo da iteração, o valor final da iteração, porém diferente do comando PARA em pseudocódigo BRUTE, a iteração não irá exatamente até esse valor, mas sim até um valor abaixo do definido. Dessa forma, se escrevemos range(1,10), o equivalente em pseudocódigo BRUTE é DE 1 A 9, ou ainda, escrevendo de forma matemática, range() cria um intervalo [a,b), enquanto que nosso PARA cria um intervalo [a,b]. O terceiro valor da função range, que é opcional, define o tamanho do salto, que é quanto será incrementado à variável a cada iteração. Por padrão, esse terceiro valor é 1, fazendo com que range(1,6) por exemplo, itere entre 1, 2, 3, 4 e 5. Enquanto se escrevermos range(1,6,2), a variável será iterada entre 1, 3 e 5 apenas.

Depois dessa longa explicação sobre range, vamos ao código. Para o código acima, o código equivalente em python é:

for i in range(1,11):
	print(i)

E com isso, encerramos o assunto sobre laços de repetição (loops). Espero que tenham compreendido sobre o assunto, afinal não é tão confuso assim não é mesmo? Pelo menos não precisei explicar de novo sobre operações lógicas.

Exercícios Propostos

E, assim como no último assunto, é preciso fixar esse assunto na cabeça, por isso, vai aí mais uma listinha de exercícios que vocês devem ser capazes de fazer com o conteúdo que eu acabei de passar nessa postagem. Minha única dica agora para esses exercícios é: se tiver dúvida, além de pesquisar, você pode tirar essa dúvida com nossa equipe do BRUTE, através do nosso email, telegram ou discord.

Talvez sejam poucos exercícios, mas lembre-se de que você pode navegar pelo uri em busca de mais exercícios. No próximo post sobre a série (se eu tiver vontade de fazer), abordarei sobre vetores. A partir desse assunto, vou poder passar muitos exercícios, então faça esses exercícios (de preferência usando loops) para já se acostumar.

E com isso, me despeço de vocês (por enquanto). Para quem está lendo isso antes das férias do fim de ano (ou durante as férias), aproveite as férias, mas não tire férias completas dos estudos, é sempre bom estar aprendendo alguma coisa, além de que quando voltar tudo no ano que vem você já estará preparado para continuar as aulas da universidade.

João Vitor Fröhlich

Membro | Participou de uma Summer School | Buscando ser roxo no codeforces | Prefere fazer exames finais a trabalhos durante o semestre