Vous êtes sur la page 1sur 27

17/10/2018 Estácio

Disciplina: Linguagem de Programação I

Aula 5: Os códigos vão ficar menores - chegaram as estruturas


de repetição

Introdução
Em muitas situações de nossas vidas, repetimos, com frequência, certas rotinas. Às
vezes, elas são tão importantes que algumas pessoas as descrevem para que possam
ser executadas, igualmente, por outros. Algumas rotinas têm um número de
repetições conhecido, mas outras não.

Por exemplo, imagine que dois amigos tomaram a decisão de viajar no final do ano
para Florianópolis (SC). Cada um escolheu uma forma de guardar dinheiro: o
primeiro depositou, todo mês, R$ 500,00 na caderneta de poupança, e o segundo, o
valor que sobrou no final do mês. Assim, cumprindo com sua palavra, o primeiro fez
12 depósitos e guardou R$ 6.000,00 ao final de um ano. Mas não podemos afirmar
quantos depósitos o segundo realizou nem o total que guardou. O fato é que, se ele
também cumpriu com sua palavra, poupou dinheiro continuamente. Essas são duas
formas diferentes de repetição.

Nesta aula, estudaremos as rotinas de repetição e aprenderemos a escolher a mais


adequada para cada situação. Vamos lá?

Objetivos
Reconhecer as três estruturas de repetição usadas para construir programas;
Construir programas usando as estruturas de repetição;

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 1/27
17/10/2018 Estácio

Aninhar estruturas de repetição.

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 2/27
17/10/2018 Estácio

Abordagens Iniciais
Falar sobre as estruturas de repetição é algo apaixonante, principalmente,
para quem começou a programar usando o lendário goto que combinado,
principalmente, com o if simulava todas as estruturas de repetição que iremos
estudar nesta aula.

A paixão por uma estrutura de repetição se assemelha com a de um time de


futebol. Tem programadores que são fiéis a uma estrutura e como não
desejamos criar polêmica, não iremos aqui defender nem uma das 3, mas
mostraremos as vantagens/desvantagens de cada uma e você, temos certeza,
saberá fazer a escolha certa no momento certo.

As 3 estruturas de repetição
Como já mencionamos, existem 3 tipos. São eles:

For

Estrutura ideal para quando o número de repetições for conhecido


durante a elaboração do programa ou quando o usuário puder fornecê-lo
durante a execução.

Na linguagem C, essa estrutura recebe o nome de for e, diferentemente


de outras linguagens, simula com facilidade as estruturas while e do...
while como veremos mais adiante.

Sua lógica é: repete enquanto a variável contadora não tiver


ultrapassado seu valor final estipulado na estrutura. Como ela testa antes
de executar o bloco, pode ser que nem execute o bloco se a condição, de
início, for falsa.

While

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 3/27
17/10/2018 Estácio

Estrutura que testa no início e é usada quando o número de repetições


for desconhecido.

Simula, com facilidade a estrutura do... while e a estrutura do for (desde


que criemos uma variável que terá seu
valor incrementado/decrementado dentro da estrutura de repetição).

Sua lógica é: repete enquanto a condição for verdadeira. Como ela testa
antes de executar o bloco, pode ser que nem execute o bloco se a
condição, de início, for falsa.

Do... while

Estrutura usada quando o número de repetições for desconhecido.

Sua diferença em relação à estrutura while é que ela testa ao final,


significando que executa o bloco de comandos pelo menos uma vez. Essa
estrutura também precisa de um teste para interromper a repetição. É
muito usada em programas que funcionam através de um menu.

Sua lógica é: repete enquanto a condição for verdadeira, mas, como ela
testa ao final, executa pelo menos uma vez o bloco, diferenciando-a da
estrutura while. A lógica de construção de um trecho, usando nessa
estrutura, é mais parecida com a estrutura do for, não precisando de
leitura/atribuição antecedendo o do para entrar na estrutura, pois como
já dissemos, testa ao final.

Sintaxes
For

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 4/27
17/10/2018 Estácio

1 2
for ( valor inicial ; expressão de teste ;
incremento 3 )
{
Bloco de comandos
}

Você poderá usar sem nenhum parâmetro, mas os ; são obrigatórios.

As chaves só serão obrigatórias se o bloco tiver mais de um comando.

While

while (condição)
{
Bloco de comandos
}

Na prática, a sintaxe é um pouco mais complexa e veremos isso mais adiante.

Esse é o "lema" que você deve já começar a decorar:

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 5/27
17/10/2018 Estácio

Uma das funções de entrada de dados (ou um


comando de atribuição) antes do... while para
entrar na repetição e uma das funções de
entrada de dados (ou um comando de atribuição
antes de }, para repetir ou sair da repetição.

O teste (condição) é uma expressão relacional/lógica semelhante as que nós


usamos no comando if(){...}else{...}.

As chaves só serão obrigatórias se o bloco tiver mais de um comando.

Do... While

do
{
Bloco de comandos
}
while (condição);

Talvez seja a estrutura mais simples de se construir. O teste (condição) é uma


expressão relacional/lógica semelhante as que nós usamos na estrutura if()
{...}else{...}.


Dica

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 6/27
17/10/2018 Estácio

Essas estruturas já foram ensinadas em outra disciplina com a linguagem


C++ e, por essa linguagem ter compatibilidade com a linguagem C, você
não terá nenhuma dificuldade em usá-las, pois elas são idênticas.

Aprofundando o estudo sobre a


estrutura de repetição for
Começamos pela estrutura do for por achar que ela seja a de mais fácil
compreensão e por ter muito mais recursos na linguagem C do que em suas
antecessoras.

Agora, vamos analisar o exemplo:

#include <stdio.h>

int main ()

long long int matric;

float media;

printf(“\nMatricula: ”); scanf(“%Ld”, &matric);

printf(“\Media: ”); scanf(“%f”, &media);

printf(“\n%Ld\t%.1f ”, matric, media);

printf(“\nMatricula: ”); scanf(“%Ld”, &matric);

printf(“\Media: ”); scanf(“%f”, &media);

printf(“\n%Ld\t%.1f ”, matric, media);

printf(“\nMatricula: ”); scanf(“%Ld”, &matric);

printf(“\Media: ”); scanf(“%f”, &media);

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 7/27
17/10/2018 Estácio

printf(“\n%Ld\t%.1f“, matric, media);

printf(“\n”);

Observando o código, podemos pensar sobre a necessidade de utilizar uma


estrutura de repetição. Claro que poderíamos copiar o grupo de 5 comandos e
colá-lo mais 3 vezes, forçando uma repetição. Mas se tivéssemos que repetir
1000 vezes, você teria paciência para colar 999 vezes, mesmo agrupando?

O código cresceria em tamanho, mas estaria


fazendo pouca coisa, concorda?
Observe na próxima tela, o uso da estrutura de repetição for envolvendo o
bloco que se repete com um par de chaves e colocando a linha do for antes.

Se precisarmos aumentar o número de repetições, teremos apenas que


alterar o valor final do for. Simples assim:

#include <stdio.h>

int main ()

long long int matric;

float media;

int c;

for( c = 1; c <= 4; c++)

printf(“\n\nMatricula: ”);

scanf(“%Ld”, &matric);

printf(“\Media: ”);

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 8/27
17/10/2018 Estácio

scanf(“%f”, &media);

printf(“\n\n%Ld\t%.1f”, matric, media);

printf(“\n”);

Veja a saída:

Essa saída você a obteria sem ou com a estrutura for. Experimente, digitando
os códigos. Não se esqueça de pausar com system(“pause>NULL” );

No Ensino Médio, você aprendeu a construir Progressões Aritméticas de


Progressões Geométricas. Pense nessa estrutura como uma PA ou uma PG.


Atenção

Observe que não existe ; depois dos parênteses da estrutura de


repetição for. Fique atento porque isso acontece muitas vezes. Não há
mensagem de erro, porque a repetição é finalizada ao encontrar o
primeiro ; ou uma }.

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 9/27
17/10/2018 Estácio

Observe algumas linhas com essa estrutura:

Linguagem C Equivalência
for (c=1; c <=100; c++) PA com a1 = 1, an = 100 e r = 1
for (c=10; c >=1; c--) PA com a1 = 10, an = 1 e r = -1

for (c=10; c >=2; c=c-2)


PA com a1 = 10, an = 2 e r = -2
for (c=10; c >=2; c-=2)

for (c=2; c <=1024; c=c*2)


PG com a1 = 2, an = 1024 e r = 2
for (c=5; c <=500; c*=2)

Veja outro exemplo:

#include <stdio.h>

int main ()

int num, c;

for ( c = -2140547000; c <= 2140547000; c++);

printf(“\n%d”, c);

printf(“\n”);

O que houve?

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 10/27
17/10/2018 Estácio

A variável do for(c) assumiu valores desde –2140547000 até 2140547000;

Por ter um ponto e vírgula logo depois do ), as únicas operações foram a de


incrementar a variável c e testá-la para verificar se o valor dela continuava
menor, ou igual, ao valor final;

Ao atingir o valor 2140547001, a repetição é interrompida e o fluxo é


desviado para o primeiro comando depois do ponto e vírgula. Nesse caso, a
função printf() que a princípio seria o bloco que deveria ser repetido;

A estrutura do for funcionou como um temporizador que variará de acordo


com a frequência da sua máquina.

Atividade
1 - Construa um programa que exiba 10 vezes a frase:

Se praticar, aprende a programar.

2 - Construa um programa que gere a seguinte PA: 4 : 8 : 12 : ... : 32:


36: 40

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 11/27
17/10/2018 Estácio

3 - Construa um programa que deixe o usuário entrar com um número 3


vezes e, para cada entrada, exibir a raiz quadrada do número.

Nesse exercício, precisaremos usar uma função que seja capaz de extrair
a raiz quadrada. Essa função faz parte da biblioteca math.h. Lembre-se
de que, no conjunto dos reais, não se pode extrair raiz de número
negativo.

Aprofundando o estudo sobre a


estrutura de repetição while
As estruturas de repetição while e do...while são parecidas em sua concepção
e ousamos dizer que poderíamos programar sem a estrutura do...while, mas
quando entramos em contato com ela, perceberemos que as soluções seriam
maiores se usássemos a estrutura while para simulá-la.

Consideramos a estrutura while a mais difícil de ser compreendida em um


primeiro momento e, por essa razão, procuramos seguir sempre 3 passos
para que você consiga ter tempo para assimilar sua sintaxe na prática.


Saiba mais

Essa estrutura é muito usada para construção de trechos de proteção da


entrada de dados. Tanto a estrutura while quanto a estrutura do...while
repetem o bloco de comandos enquanto o teste retornar um resultado
verdadeiro.

Teste

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 12/27
17/10/2018 Estácio

O teste (condição) é uma expressão


relacional/lógica semelhante as que nós usamos
na estrutura do if(...) ... else ...

Costumamos dizer que o demonstrado a seguir é muito comum acontecer na


primeira vez que se constrói um código usando a estrutura while. Isso se
justifica pela sintaxe apresentada no início desta aula.

Por essa razão, em qualquer disciplina de Linguagem, é importante seguir o


mesmo procedimento que possibilita uma melhor compreensão do
funcionamento da estrutura while.


Atenção

Nunca force a entrada dessa estrutura atribuindo um valor inicial à


variável que fará parte do teste, visto que se retira o maior trunfo da
estrutura: não executar o bloco se não for verdadeiro o teste.

Agora, vamos analisar a construção de um programa que deixe entrar


números inteiros enquanto forem maiores do que zero e, para cada número,
exibir seu dobro.

Solução 1

Em um primeiro momento, já que vimos a sintaxe dessa estrutura,


somos induzidos a construir o código da forma a seguir:

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 13/27
17/10/2018 Estácio

#include <stdio.h>

int main ()

int num;

while (num > 0)

printf(“\nNúmero: ”);

scanf(“%d”&num);

printf(“\n%d”, num*2);

printf(“\n”);

Mas o fato de não repetir o bloco, não deveria ser estranho, visto que a
variável num, como não foi inicializada, terá um “lixo” que, no caso, foi
um número negativo.

O mesmo programa foi compilado no Visual Studio-2005 e foi exibida


uma mensagem de erro: “The variable 'num' is being used without being
initialized”.

No Dev-C++, o “lixo” foi um número positivo. Logo, executou, mas


quando se digitava um número menor, ou igual a zero, primeiro, exibia o
dobro e depois parava.

Conclusão: embora tenha sido usada a sintaxe correta, o programa não


funcionou corretamente, visto que deveria sair da estrutura quando a
condição não fosse satisfeita.

Solução 2

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 14/27
17/10/2018 Estácio

Se estava sinalizando que não precisava ser inicializada então, deveria se


colocada a função de leitura antes da estrutura de repetição while. Nesse
raciocínio que surgiu a segunda solução.

#include <stdio.h>

int main ()

int num;

printf(“\nNúmero: ”);

scanf("%d", &num);

while (num > 0)

printf(“\n%d", num*2);

printf(“\n”);

Bem, a situação tinha melhorado, uma vez que foi permitido entrar com
um valor, mas como a função scanf não estava dentro da estrutura, o
programa entrou em loop e foi preciso pressionar as teclas CTRL e C
para interromper.

Solução 3

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 15/27
17/10/2018 Estácio

Após uma análise dos resultados das duas soluções, chegou-se a


conclusão de que era preciso juntá-las e surgiu, o que chamamos de
“sintaxe na prática”.

Scanf ( ) / getchar ( ) / atribuição

While (condição)

Bloco de comandos

Scanf ( ) / getchar ( ) / atribuição

Observe a solução final:

#include <stdio.h>

int main ()

int num;

printf(“\nNúmero: ”);

scanf("%d", &num);

while (num > 0)

printf(“\n, num*2);

printf(“\nNúmero: ”);

scanf("%d", &num);

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 16/27
17/10/2018 Estácio

printf(“\n”);


Atenção

Percebemos que essa estrutura de repetição testa uma condição no início


e só executa o bloco se o teste for verdadeiro. Sendo assim, se
construirmos um programa que execute um comando quando o resultado
do teste for falso, tenha certeza de que algo está errado no seu
programa como aconteceu na primeira solução.

Duas funções de leitura, ou


comando de atribuição?
Vamos lhe responder em tópicos para simplificar:

Dentro da repetição, só há uma função de leitura ou comando de atribuição;

A função de leitura ou comando de atribuição, que aparece antes da estrutura


while, possibilita a entrada do primeiro valor que, se não passar pelo teste,
não executará o bloco, mas se o valor passar então, a execução do programa
ficará nesse bloco até que se digite um valor que não satisfaça mais à
condição;

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 17/27
17/10/2018 Estácio

Se dentro desse bloco não estiver presente uma função de leitura ou comando
de atribuição, como os valores, a partir do segundo até o último, poderão ser
lidos? Isso implicaria que o primeiro valor lido, se maior do que zero, ficaria
armazenado para sempre na variável num e o programa entraria em loop
como ficou a segunda solução.

Atividade
4 - Construa um programa que deixe o usuário entrar com um número e
exiba o número invertido.

5 - Construa um programa que deixe o usuário entrar vários números e


para cada entrada, exibir o quadrado e a raiz quadrada do número.

6 - Construa um programa que deixe o usuário entrar 2 números inteiros


e exiba o MDC (Máximo Divisor Comum).

Aprofundando o estudo sobre a


estrutura de repetição do...while
Chegamos à terceira estrutura de repetição: do... while e já vimos que a única
diferença para a estrutura while é que essa repete o bloco pelo menos uma
vez.

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 18/27
17/10/2018 Estácio

A lógica da estrutura é simples, visto que executa o bloco de comandos,


testando a condição ao final e, enquanto for verdadeira, repete a execução do
bloco.

É, sem dúvida a estrutura mais indicada para a


construção de um programa que funciona
através de um menu.

Assemelha-se à estrutura repeat... until de outras linguagens.

Simulando outras estruturas


É muito comum encontrarmos nos livros de programação esse tópico, mas se
existem 3 estruturas é porque cada uma tem sua finalidade como já vimos
anteriormente.

Apresentaremos algumas simulações e teceremos comentários sobre elas.

for simular while


Essa simulação é muito simples, uma vez que usamos a linha do for sem
nenhum parâmetro, mas com os pontos e vírgulas combinado com um if.

Observe o código a seguir. Para o principiante é de mais fácil construção, mas


reforçamos que são duas estruturas para simular uma.

#include <stdio.h>

int main ()

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 19/27
17/10/2018 Estácio

int num;

for (;;)

printf(“\nNúmero: ”);

scanf(“%d”, &num);

if(num <= 0) break;

printf(“\n%d, num*2);

printf(“\n”);

for simular do... while


Essa simulação é muito parecida com a anterior, exceto pela na posição do if.
Observe:

#include <stdio.h>

int main ()

int num;

for (;;)

printf(“\nNúmero: ”);

scanf(“%d”, &num);

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 20/27
17/10/2018 Estácio

if(num <= 0) break;

printf(“\n%d, num*2);

printf(“\n”);

while simular for


Embora a estrutura do for seja a mais indicada quando o número de
repetições for conhecido, nada impede que usemos a estrutura while
combinada com um contador para simular a estrutura do para.

#include <stdio.h>

int main ()

int num, cont;

cont = 1;

while(cont <=3)

printf(“\nNúmero: ”);

scanf(“%d”, &num);

printf(“\n%d”num*2);

cont++;

printf(“\n”);

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 21/27
17/10/2018 Estácio


Atenção

A simulação de while para do... while não será apresentada, uma vez que
se faz necessário “forçar” a entrada na estrutura while, atribuindo um
valor à variável que vai ser testada e não desejamos que você crie esse
hábito.

do... while simular for


Veja o código:

#include <stdio.h>

int main ()

int num, cont;

cont = 1;

do

printf(“\nNúmero: ”);

scanf(“%d”, &num);

printf(“\n%d”num*2);

cont++;

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 22/27
17/10/2018 Estácio

while(cont <=3);

printf(“\n”);


Atenção

Também não apresentaremos a simulação de do... while para while não


será apresentada, visto que será preciso dobrar o número de testes e
não desejamos que você crie esse hábito.

Aninhando as estruturas
Uma estrutura dentro de outra estrutura de repetição é algo muito comum.
Seja para proteger a entrada de dados ou para muitas outras finalidades como
poderemos constatar nos exemplos que serão mostrados a seguir.

for dentro do for


Veremos, agora, o exemplo de código para letreiro.

Nesse código, trabalharemos com um for mais externo que assumirá os


valores das colunas e um for mais interno, como um temporizador, visto que o
objetivo é montar um letreiro. Algo que fazíamos muito, antigamente.

O objetivo é fixar que o ; ao final da linha do for, só gerará uma PA ou PG


internamente, mas não repete o bloco.É necessário ter a biblioteca
conio2.h(Borland). Esse programa deve ser executado no Dev-C++.

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 23/27
17/10/2018 Estácio

#include <stdio.h>

#include <conio2.h>

int main ()

int cont, p;

for (cont = 1; cont <=70; cont++)

gotoxy(cont, 5); /* cont (coluna, 5 (linha) */

printf(“ LPI - EAD");

for (p =1 ; p<= 100000000; p++);

/*pode aumentar até 2147000000*/

printf("\n\n");

system(“pause”);

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 24/27
17/10/2018 Estácio

Atividade
7 - Escreva um código que exiba as posições de todos os elementos de
uma matriz bidimensional com dimensão 10 (matriz quadrada).


Saiba mais

Veja outros dois exemplos de estrutura aninhada do for dentro for


<galeria/aula5/anexo/a05_doc1.pdf> .

Notas
1
Valor inicial

nomeVariavel = valor inicial ;

Na maioria das vezes, o tipo de variável é enumerável (inteira ou caracter de um


caracter).

É um comando de atribuição. O valor atribuído pode ser: constante, variável ou


expressão.

Exemplos

X = 0;

X = strlen(pal);

X = a + 1;

Expressão de teste 2

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 25/27
17/10/2018 Estácio

nomeVariavel operadorRelacional expressão

nomeVariavel < ou> ou < ou>= ou <=o u !=v alor;

Na verdade, é uma expressão relacional como as usadas na estrutura do if.

Exemplos

X > 0;

X < strlen(pal);

X <=a + 1;

3
Incremento

nomeVariavel = nomeVariavel operador valor

nomeVariavel operador=valor

nomeVariavel ++ ou nomeVariavel --

Na verdade, é uma expressão relacional como as usadas na estrutura do if.

Exemplos

X = x + 1;

X = x *2 / x*=2;

X ++

X--

Referências

DA MATTA, Roberto. Uma introdução à antropologia social. Rio de Janeiro: Rocco,


1993.

DURHAM, Eunice. “Apresentação”. In: MALINOWSKI, Bronislaw. Argonautas do


pacífico ocidental: um relato do empreendimento e da aventura dos nativos nos
arquipélagos de Nova Guiné Melanésia. São Paulo: Abril Cultura, 1978.

LAPLANTINE, François. Aprender antropologia. São Paulo: Brasiliense, 2006.

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 26/27
17/10/2018 Estácio

MALINOWSKI, Bronislaw. Argonautas do pacífico ocidental: um relato do


empreendimento e da aventura dos nativos nos arquipélagos de Nova Guiné
Melanésia. São Paulo: Abril Cultura, 1978.

KUPER, Adam. Antropólogos e Antropologia. Rio de Janeiro: Francisco Alves,


1978.

VELHO, Gilberto. “Observando o familiar”. In: NUNES, Edson de Oliveira. A aventura


sociológica. Rio de Janeiro: Zahar, 1978.

Próximos Passos

Armazenamento em matrizes unidimensionais (vetores);


Construção de trechos de saída, busca, entre outros;
Programas usando matrizes unidimensionais (vetores) de char.

Explore mais

Exercite o conteúdo estudado com as listas de exercícios que separamos para você:

Exercícios para o for; <galeria/aula5/anexo/a05_doc2.pdf>


Gabarito; <galeria/aula5/anexo/a05_doc3.pdf>
Exercícios para o while; <galeria/aula5/anexo/a05_doc4.pdf>
Gabarito; <galeria/aula5/anexo/a05_doc5.pdf>

file:///W:/2018.2/linguagem_de_programacao_i__conv010/aula5.html 27/27

Vous aimerez peut-être aussi