Programação C - Estruturas de Repetisão



Comandos de Controle – Estruturas de Repetição

        Em programação, os comandos de controle são utilizados para desviar o fluxo do algoritmo para outras atividades, repetindo por ‘n’ vezes uma determinada atividade. No caso de Estruturas de Repetição, uma mesma rotina poderá ser executada 0, 1 ou ‘n’ vezes, dependendo das condições aplicadas.

Figura 5-1 - fluxograma de estrutura de repetição

 

        A linguagem de programação C possui 3 tipos de estruturas de repetição, “while”, “do-while” e “for”. Cada uma com suas características específicas. Além de comandos que auxiliam a continuação, término e desvio dos fluxos.

 

 

While

        A estrutura while tem por objetivo, permitir a execução de comandos em C, por uma determinada quantidade de vezes. Está quantidade de vezes pode ser conhecida ou não. A lógica que verifica a continuidade do loop while, está no início da estrutura, deste modo, o loop pode ou não ocorrer, { 0 .. n vezes }.

 

while (condição_lógica_verdadeira)
{
Linha de comando em c;
Linha de comando em c;
Linha de comando em c;
}

 

  1. O fluxo do algoritmo chega na estrutura while;
  2. É verificado se a condição lógica é verdadeira. Caso afirmativo entra no bloco {  };
  3. As linhas de comando em c, que estão dentro do bloco while, são executadas em sequência;
  4. Ao chegar no final do bloco “}”, o fluxo é desfiado para a linha do while;
  5. A condição lógica é verificada novamente para ver se continua o loop (se condição lógica verdadeira), caso afirmativo, repete os passos 3, 4 e 5.

 

Figura 5-2 - estrutura de repetição while

 

        Vejamos como exemplo o algoritmo da Figura 5-2 . Neste algoritmo, estamos utilizando a calculadora desenvolvida no capítulo de estrutura de decisão switch. Lá podíamos realizar apenas um cálculo por execução do programa, agora com o while, podemos realizar quantas operações desejarmos, antes de finalizar o programa.

        Toda a calculadora foi colocada dentro do “bloco” do while “ {  } “. A fluxo de execução do algoritmo somente vai entrar neste bloco se a condição lógica for verdadeira, ou seja, “ operador == ‘s’ ”, se for falsa nem entra. Para ser executada pelo menos uma vez, é preciso garantir que a variável “operador” possua o valor ‘s’. Para tanto, já na declaração da variável, é atribuído a ela o valor de ‘s’. Deste modo, assim que a rotina chegar no while vai entrar direto.

        Ao entrar na estrutura, será realizada a operação do cálculo. Após realizar o cálculo, é colocada uma rotina para perguntar ao usuário se deseja realizar outro cálculo. A opção do usuário será carregada na variável “operador”. Quando a rotina chegar ao final do bloco “ } ”, o fluxo é automaticamente desviado para a condição lógica do while (início do bloco) para verificar se a condição lógica continua sendo verdadeira ou não, se for,  entra novamente no bloco do while.

        Deste modo utilizando o while, o usuário vai poder fazer quantos cálculos desejar. Observem que utilizamos a mesma variável para o controle de entrada e opção de cálculo. Sim, é possível, pois cada uma está sendo alterada e utilizada em seu tempo.

        Outro fator importante com relação a laços de repetição (loops), é que temos que ter um meio dentro do bloco de alteração da “condição lógica”, caso contrário, se a condição lógica nunca for alterada, ocorre o que chamamos de “loop eterno”.

 

 

Do-while

        Se utilizarmos o mesmo algoritmo da calculadora que foi utilizado no while, só que agora no do-while, o que muda?

        Veja que a condição lógica de loop while é no início, deste modo temos que garantir a entrada no loop. While pode ocorre { 0 .. n vezes }. Já a condição lógica de loop do-while, é no final o que acarreta na execução das rotinas do bloco pelo menos uma vez { 1 .. n vezes }. O que muda é o fato de não precisar mais inicializar a variável de controle para forçar a entrada no loop, pois no do-while a rotina vai entrar sempre pelo menos uma vez.

 

do
{
Linha de comando em c;
Linha de comando em c;
Linha de comando em c;
} while (condição_lógica_verdadeira);

 

  1. O fluxo do algoritmo chega na estrutura “do”;
  2. As linhas de comando em c, que estão dentro do bloco do-while, são executadas em sequência;
  3. Ao chegar no final do bloco “ } while( ); ”, é verificado se a condição lógica é verdadeira. Caso afirmativo, o fluxo é desfiado para o início do bloco “ do { ” (retornar ao passo 1). Caso negativo, encerra o do-while.

 

Figura 5-3 - estrutura de repetição do-while

 

 

For

        A estrutura de repetição for, tem por objetivo, repetir a execução de linhas de comandos por um número “determinado” de vezes. Para tanto, na sintaxe do for, já temos que colocar a inicialização da variável de controle, a condição lógica de finalização, e o incremento ou decremento da variável de controle.

 

for (inicializar_variável_controle; condição_lógica_finalização; altração_variavel_controle)
{
Linha de comando em c;
Linha de comando em c;
Linha de comando em c;
}

 

  1. O fluxo do algoritmo chega na estrutura for;
  2. É inicializada a variável de controle;
  3. É verificada se a condição lógica é verdadeira. Caso afirmativo entra no bloco {  };
  4. As linhas de comando em c, que estão dentro do bloco são executadas em sequência;
  5. Ao chegar no final do bloco “ } ”, o fluxo é desfiado para a linha do for, no comando de alteração da variável de controle;
  6. Na sequência a condição lógica é verificada novamente para ver se continua o loop (se condição lógica verdadeira), caso afirmativo, repete os passos 4, 5 e 6.

 

Como exemplo, vamos analisar o algoritmo da Figura 5-4 , que imprime a tabuada de um número fornecido pelo usuário.

Figura 5-4 - estrutura de repetição for

 

 

        Neste algoritmo, são necessárias duas variáveis, uma para conter o número que o usuário irá fornecer, e outro para ser utilizado na estrutura for como variável de controle. Primeiramente é solicitado ao usuário para fornecer um número de 1 a 10. Este número é armazenado na variável “num”.

        Antes de imprimir a tabuada, a estrutura if verifica se o número está entre 1 e 10. Caso afirmativo, executa o comando for. A estrutura for, possui apenas uma linha, deste modo não é necessário as chaves {  }. Observar que na sintaxe do for, sempre há três comandos: Atribuição, Condição de Loop, Incremento/Decremento. Estes são separados por ponto e vírgula “;”.

 

  1. O fluxo do algoritmo, ao chegar na estrutura for, a primeira coisa realizada é a atribuição da variável de controle “x=1;”. Esta atribuição é realizada apenas no início e não será repetida durante a execução do loop, como os demais comandos.
  2. Na sequência é verificada a lógica de controle de repetição do for, “x<11;”. Esta condição é verificada a cada loop para ver se continua ou encerra o loop.
  3. A condição de controle sendo verdadeira, executa o bloco do for (no caso apenas uma linha);
  4. Encerrando a execução dos comandos (no caso o printf), o fluxo é direcionada para o comando de Incremente do for (x++). Este comando adiciona uma unidade à variável “x’, alterando seu valor atual. Deste modo, a cada loop a variável “x” é incrementada de uma unidade;
  5. O fluxo (a rotina), é desviado para a verificação da condição lógica “x<11”. Retornar ao passo 2.

 

 

 

 

Comandos de desvio de continue, break e goto

        A linguagem de programação C, possui comando que auxiliam no desvio do fluxo de execução ou interrompem uma determinada rotina.

 

Continue

        O comando “continue” é utilizado dentro de uma estrutura de repetição. Este força o desvio da execução da rotina para a linha de controle da estrutura de repetição em que se encontra. No caso do while e do-while, o fluxo da rotina é desviado para a “condição lógica” do loop, deste modo, força a verificação se continua com o loop ou não. No caso da estrutura for, o fluxo da rotina é desviado para o comando de incremento/decremento da variável de controle do for, para em seguida verificar a condição lógica, se continua ou não com o loop.

        Normalmente este comando está dentro de uma estrutura de decisão, com o objetivo de desviar o fluxo, não executando os demais comandos do loop. Com isso ganhamos em velocidade de processamento, inibindo a execução de comandos desnecessário.

 

Figura 5-5 - comando de desvio continue

 

 

Break

        O comando “break”, provoca uma saída incondicional no laço em que se encontra. O propósito deste comando, é forçar a finalização de uma estrutura de repetição, não importando como esta a questão lógica de finalização do loop. Normalmente este comando é executado, que houve a ocorrência de um fato. Por exemplo, “se ocorreu tal fato, encerre o laço e continue a execução do programa.

 

Figura 5-6 - comando de desvio break

 

 

Goto

        O comando “goto” é utilizado para provocar o desvio do fluxo de uma rotina, para um determinado ponto do programa. O propósito aqui é evitar a execução desnecessária de algumas rotinas do programa, por conta da ocorrência de um determinado fato. Ele pode também, de certo modo, substituir uma estrutura de repetição. Para este caso ele não é muito utilizado. O desvio pode ocorrer para qualquer ponto do programa, no início, meio ou final, vai depender do que se pretende desenvolver.


Figura 5-6 - comando de desvio goto

 

 

 

 


Exercícios

 

1) Faça um programa que calcule o fatorial de um número fornecido pelo usuário.

 

2) Faça um programa que receba duas notas de seis alunos, calcule e mostre:
  • a) A média aritmética de duas notas de cada aluno;
  • b) A mensagem que está na tabela a seguir;

 

Média Mensagem
0,0 até 3,9 Reprovado
4,0 até 6,9 Exame Final
7,0 até 10,0 Aprovado

 

 

3) Tem-se um conjunto de dados contendo a altura e o sexo (M ou F) de 15 pessoas. Faça um programa que calcule e mostre:
  • a) A maior e a menor altura do grupo;
  • b) A média de altura das mulheres;
  • c) O número de homens;
  • d) O sexo da pessoa mais alta.

 

4) Faça um programa que leia dois valores inteiros e positivos, X e Y, calcule e mostre a potência Xy.

 

5) Faça um programa que receba dez números, calcule e mostre a quantidade de números entre 30 e 90.

 

6) Faça um programa que leia dois valores inteiros positivos e mostre os números pares entre estes dois valores (inclusive).

 

7) Faça um algoritmo para calcular a série Fibonacci até o enésimo termo escolhido pelo usuário. A série tem a seguinte forma:  1, 1, 2, 3, 5, 8, 13, 21, 34 ...

 

8) Faça um programa que receba vários números e que calcule e mostre:
  • a) A quantidade de números inferiores a 35;
  • b) A média dos números positivos;
  • c) A percentagem de números entre 50 e 100 entre todos os números digitados;
  • d) A percentagem de números entre 10 e 20 entre os números menores que 50.

 

9) Dado que cada pessoa tenha o seu nome, idade e peso em uma ficha, faça um algoritmo que:
  • a) Imprimir o nome da pessoa cujo a idade está na faixa de 20 a 30 anos inclusive os extremos;
  • b) Calcule a idade média das pessoas com peso maior que 80 Kg, considere que exista N pessoas.

 

10) Faça um programa que receba um conjunto de valores inteiros positivos e que calcule e mostre o maior e o menor valor do conjunto. Considere que:
  • a) Para encerrar a entrada de dados, deve ser digitado o valor zero;
  • b) Para valores negativos, deve ser enviada uma mensagem;
  • c) Os valores negativos ou iguais a zero não entrarão nos cálculos.

 

11) Faça um programa que leia o código dos itens pedidos e as quantidades desejadas. Calcule e mostre o valor a ser pago por item e o total do pedido. Considere que o cliente deva informar quando o pedido deve ser encerrado. O cardápio da lanchonete é o seguinte:

 

Especificação Código Preço
Cachorro quente 100 R$ 5,70
Bauru simples 101 R$ 9,30
Bauru com ovo 102 R$ 11,50
Hambúrguer 103 R$ 5,20
Cheesburguer 104 R$7,30
Refrigerante 105 R$ 4,50

 

12) Faça um programa que receba um número e que calcule e mostre a tabuada desse número.