• Nenhum resultado encontrado

Exemplos no uso de la¸ cos de repeti¸ c˜ ao

1. FAC ¸A

4.4 Exemplos no uso de la¸ cos de repeti¸ c˜ ao

while ( exp controle )

{ Corpo do la¸co } Em que:

exp controle define o crit´erio de parada para as repeti¸c˜oes do corpo do la¸co, atrav´es de uma express˜ao l´ogica;

Corpo do la¸co representa o comando ou conjunto de comandos que ser˜ao executados a cada itera¸c˜ao do la¸co, sendo que quando forem dois comandos ou mais ´e preciso agrupa- los atrav´es de um par de chaves ({ ... }).

4.3.3 Repeti¸ c˜ ao n˜ ao-enumer´ avel - O comando do-while

O comando do-while ´e usado para a constru¸c˜ao de la¸cos em que se tenha que executar o corpo antes de se verificar se essa execu¸c˜ao deve continuar ou n˜ao. Sua sintaxe ´e apresenta a seguir.

do

{ Corpo do la¸co } while ( exp controle ) Em que:

exp controle define o crit´erio de parada para as repeti¸c˜oes do corpo do la¸co, atrav´es de uma express˜ao l´ogica;

Corpo do la¸co representa o comando ou conjunto de comandos que ser˜ao executados a cada itera¸c˜ao do la¸co, sendo que quando forem dois comandos ou mais ´e preciso agrupa- los atrav´es de um par de chaves ({ ... }).

OBSERVAC¸ ˜AO

Como j´a dito na se¸c˜ao anterior, os comandos de repeti¸c˜ao n˜ao-enumer´aveis diferem apenas na forma em que a express˜ao de controle (exp controle) ´e considerada. No comandowhilea execu¸c˜ao do la¸co ocorre apenas se o valor dessa express˜ao for verdadeiro (ou seja, diferente de zero ou nulo). J´a no comando do-while o corpo do la¸co ´e executado pelo menos uma vez, sendo repetido enquanto o valor da express˜ao for verdadeiro.

4.4 Exemplos no uso de la¸ cos de repeti¸ c˜ ao

A figura 4.2 apresenta exemplos bastante simples do uso desses tipos de estruturas de re- peti¸c˜ao dispon´ıveis em C. Nos trˆes la¸cos o objetivo ´e fazer a soma dos primeirosnuminteiros.

Como esse ´e um problema enumer´avel, sua solu¸c˜ao ´e mais simples usando o la¸co for, em que basta usar a vari´avel de controle do la¸co (i) como elemento da soma. Nos la¸cos whilee

4.4. Exemplos no uso de la¸cos de repeti¸c˜ao 47

do-while´e preciso incrementar explicitamente essa vari´avel a cada itera¸c˜ao executada.

#include "stdio.h"

main()

{ int num, i, soma;

scanf("%d",&num);

soma = 0;

for (i=0; i <= num; i++)

soma = soma + i; // Como se trata de apenas um comando nao // e preciso o uso de chaves

printf (" A soma pelo for resulta em %d\n", soma);

soma = 0;

i = 1;

while (i <= num) { soma = soma + i;

i++; // AVANCO DO CONTROLE }

printf (" A soma pelo while resulta em %d\n", soma);

soma = 0;

i = 1;

do

{ soma = soma + i;

i++; // AVANCO DO CONTROLE } while (i <= num);

printf (" A soma pelo do-while resulta em %d\n", soma);

}

Figura 4.2: Exemplo gen´erico de uso de la¸cos de repeti¸c˜ao

A diferen¸ca principal entre os comandos for e os while e do-while est´a na forma de avan¸co do valor da vari´avel de controle. No caso doforesse avan¸co ´e indicado diretamente no comando, como seu terceiro parˆametro. J´a os comandos while e do-while n˜ao apresentam esse avan¸co expl´ıcito. Assim, o programador deve introduzir no corpo do la¸co alguma forma de avan¸co sobre a vari´avel de controle. No programa da figura 4.2 isso ´e feito pelos comandos i++ marcados pelos coment´arios “AVANCO DO CONTROLE”.

O uso de cada uma das estruturas de repeti¸c˜ao deve ser criterioso, isto ´e, devemos sempre tomar o cuidado de escolher a estrutura mais adequada para nossos objetivos para o corpo do la¸co. O mesmo pode ser dito com rela¸c˜ao `as estruturas de decis˜ao j´a estudadas (if e switch). No caso do do-while deve ficar claro que o usaremos sempre que for necess´aria a execu¸c˜ao de uma determinada a¸c˜ao pelo menos uma vez antes que se saia do la¸co.

Um caso em que isso ocorre ´e a leitura de um arquivo de dados sequencial, em que os dados s˜ao lidos um ap´os o outro at´e o final do arquivo. Existe em C uma fun¸c˜ao que verifica se foi lido o final de arquivo, que ´e a feof (leitor arq). Entretanto, ´e necess´ario primeiro que se tente ler algo no arquivo para saber se o mesmo est´a ou n˜ao no seu final. Assim, um

4.4. Exemplos no uso de la¸cos de repeti¸c˜ao 48 trecho de programa para leitura de arquivo ficaria assim:

do

{ fscanf (arq, "...", ...);

// fscanf equivale ao scanf, so que para ler arquivos ...

} while ( ! feof (arq) )

Examinemos agora outras situa¸c˜oes em que seja necess´ario repetir a¸c˜oes.

Caso 1 - considere que o seu problema ´e fazer a soma dos elementos de dois vetores de tamanho n, guardando o resultado em um terceiro vetor. Como a opera¸c˜ao a ser realizada deve ser repetida um n´umero fixo de vezes, ent˜ao ´e evidente que a melhor solu¸c˜ao ´e usar o comando for. O trecho de c´odigo a seguir ilustra essa aplica¸c˜ao.

for (i=0; i<n; i++) // faz n somas...

vet3[i] = vet1[i] + vet2[i];

Caso 2 - considere que o seu problema ´e encontrar um n´umero ´ımpar em um vetor de tamanho n, parando quando ele for encontrado. Como a opera¸c˜ao a ser realizada pode ser repetida uma ou mais vezes, com o m´aximo de nvezes, ent˜ao ´e evidente que a melhor solu¸c˜ao

´e usar os comandoswhile ou do-while. O trecho de c´odigo a seguir ilustra essa aplica¸c˜ao com o uso dowhile.

i = 0;

while ((i < n) && (vet[i]%2 == 0)) // o teste i<n serve como

i++; // limite superior do la¸co

if (i < n) printf("%d ´e ´ımpar\n",vet[i]);

// esse ´ultimo teste ´e verdade apenas se o comando while terminou // porque foi encontrado um n´umero ´ımpar !!

Caso 3 - considere que o seu problema ´e encontrar o maior valor armazenado em um vetor e apresent´a-lo para o usu´ario. Mais uma vez aqui temos que repetir a opera¸c˜ao de examinar o conte´udo de uma posi¸c˜ao do vetor um n´umero fixo de vezes. Para cada uma delas temos que ver se o atual maior n´umero encontrado ainda ´e maior que o valor examinado. Se sim, continuamos a busca, se n˜ao fazemos uma atualiza¸c˜ao no valor do maior n´umero. Ent˜ao, como o n´umero de repeti¸c˜oes ´e fixo devemos usar o comando for. O trecho de c´odigo a seguir ilustra essa aplica¸c˜ao.

maior = -NUMGRANDE; // algum valor negativo muito grande for (i=0; i<n; i++) // faz n somas...

{ if (vet[i] > maior) maior = vet[i];

}