• Nenhum resultado encontrado

10 Comandos de repetição

N/A
N/A
Protected

Academic year: 2021

Share "10 Comandos de repetição"

Copied!
10
0
0

Texto

(1)

10 Comandos de repetição

10.1 Definição

Um comando de repetição é um tipo instrução que permite para executar outra instrução (ou um conjunto de instruções) mais de uma vez.

O número de execuções (repetições) pode ser fixado no início da instrução (como ocorre com o comando for) ou a instrução designada pode ser repetida enquanto uma condição for verdadeira (comandos while e do-while).

10.2 Comando FOR

O comando for executa repetitivamente um comando enquanto é atribuída uma série de valores a uma variável de controle. Vejamos a sintaxe de tal comando em Portugol e em C:

Sintaxe em Portugol

PARA <variável>



<início> ATÉ <fim> FAÇA <comando>

Sintaxe em C

for (<inicialização>; <condição>; <incremento>) <comando>;

Onde podemos considerar:

Inicialização: parte do comando for encarregada de inicializar a variável

de controle com um determinado valor;

Condição: parte do comando for que designa uma expressão a ser

testada. O comando associado ao for somente será executado enquanto essa expressão for verdadeira;

Incremento: trata-se de uma expressão responsável por incrementar ou

decrementar a variável de controle.

Obs: Em C, a variável de controle pode ser de qualquer tipo numérico (incluindo float e char, já que a representação interna deste último também é numérica!), entretanto em outras linguagens essa variável somente pode assumir tipos escalares ordinais, excluindo assim os tipos baseados em ponto flutuante.

(2)

Código-fonte: #include <stdio.h> #include <stdlib.h> int main() { int i; for ( i = 0 ; i < 3 ; i++) printf(“%d\n”, i); system("pause"); return 0; } Saída: 0 1 2

Vamos agora analisar detalhadamente o funcionamento do código do corpo do programa. Inicialmente declaramos a variável inteira i. Ela será a variável de controle de nosso for. É interessante perceber que estamos declarando a mesma antes de iniciar o for. É possível fazer a sua declaração na própria inicialização do for, mas para tal precisaremos usar a opção “-std=c99” ou “-std=gnu99” na compilação do projeto no Code Blocks, a fim de ativar o modo C99. Em nosso curso, manteremos a declaração externa, como no exemplo.

A próxima instrução será o comando for. Ao encontrar o comando for, nosso programa executará os seguintes passos:

1. Executa a seção de inicialização, armazenando o valor 0 na variável i; 2. Testa a condição (i < 3). Enquanto esta condição for verdadeira (e

inicialmente é, já que i = 0), executará os passos seguintes, quando não for mais, encerrará o comando for e continuará a execução do programa com a próxima instrução;

3. Após o teste da condição, o comando associado ao for é executado, neste caso, um comando que ordena a impressão do valor de i na tela (imprimirá então o valor 0);

4. Após a execução do comando associado ao for, é a vez de executar a expressão de incremento do for, neste caso a expressão i++, incrementando, assim, o valor de i em 1. A variável i agora possui valor 1;

(3)

5. Novo teste da condição (i < 3). Como i = 1, então ela ainda é verdadeira, vamos executar novamente o comando associado e após isso o incremento. A variável i passará agora para o valor 2;

6. Novo teste da condição (i < 3). Como i = 2, é verdadeira, o comando é executado e em seguida o incremento. O valor de i agora é 3;

7. Novo teste da condição (i < 3). Agora, i não é menor que 3, logo a condição tornou-se falsa e a execução do for é encerrada.

Após o comando for, o programa encontra um comando de pause, pedindo assim para interromper a execução do programa até que o usuário pressione uma tecla. Após a tecla ser pressionada, o programa seguirá e encontrará a sua finalização no “return 0;”.

Perceba que a inicialização do for é sempre executada e, em seguida, a condição é avaliada. Isto é, caso a condição seja falsa desde o início, o comando associado ao for não será executado nenhuma vez. Um comando for também pode ser interrompido por meio de comandos de interrupção, mas veremos isso mais adiante.

Da mesma forma que com o comando if, podemos utilizar um bloco de código no lugar do comando associado ao for caso desejemos repetir mais que um comando ao mesmo tempo.

10.2.1

O loop infinito

Ao utilizar-se de um comando for, deve-se tomar o cuidado para não gerar, acidentalmente, um “loop infinito”, isto é, um comando de repetição que não terá fim.

Um exemplo de loop infinito é o seguinte:

for ( ; ; ) {

//Qualquer comando aqui dentro será executado infinitamente! }

No exemplo acima, as três seções do for (inicialização, condição e incremento) encontram-se vazias, mas basta qualquer uma das seguintes situações para produzir-se um loop infinito:

• A condição do for encontrar-se vazia (como no exemplo anterior);

• Inicialmente a condição ser verdadeira e a seção de incremento encontrar-se vazia;

• Inicialmente a condição ser verdadeira e o valor de incremento ou decremento nunca levar a variável de controle a tornar a condição falsa. Vamos agora ilustrar outro exemplo de loop infinito, agora seguindo a terceira situação apresentada:

for ( i = 1 ; i > 0 ; i++ ) {

//Qualquer comando aqui dentro será executado infinitamente! }

(4)

Neste exemplo, o valor de i é inicialmente 1 e portanto maior que zero, logo a condição é inicialmente verdadeira. Entretanto, cada vez que o valor de i é incrementado, percebemos que a condição ainda se manterá verdadeira. Na verdade, quando a variável atingir o maior valor positivo permitido pelo tipo, o próximo valor será “truncado”, armazenando o menor valor negativo positivo, quando então a repetição seria cessada, mas isso poderá demorar muito tempo, dependendo do tipo de variável utilizado!

10.3 Comando WHILE

O comando while executa repetitivamente um comando enquanto uma expressão de controle for verdadeira (no caso de C, enquanto seu valor de retorno for diferente de zero).

Percebamos que, diferentemente do comando for, onde há seções de inicialização e incremento bem definidas, isso não ocorre no comando for.

Vejamos a sintaxe de tal comando em Portugol e em C:

Sintaxe em Portugol

ENQUANTO <condição> FAÇA <comando>

Sintaxe em C

while (<condição>) <comando>;

Abaixo, um exemplo de como podemos reescrever o código-fonte da seção anterior utilizando agora um while no lugar do for:

Código-fonte:

#include <stdio.h> #include <stdlib.h> int main() {

int i = 0; //Agora, preciso inicializar um valor em i! while ( i < 3) {

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

i++; //E o incremento precisará ser feito dentro do laço }

system("pause"); return 0;

(5)

Saída:

0 1 2

No comando while a condição é testada logo no início, de tal forma que se no início ela já for falsa, então o comando associado ao while não será executado nenhuma vez.

10.3.1

O loop infinito

De forma análoga ao comando for, também é possível criar um laço infinito usando o comando while. Para tal, basta que a condição passada seja sempre verdadeira. Um exemplo bem simples de conseguir tal efeito é da seguinte forma:

while ( 1 ) {

//Os comandos aqui especificados serão executados infinitamente }

Perceba que a condição passada é o valor 1 que retornará sempre o seu próprio valor, ou seja, um valor diferente de zero, sendo assim considerada verdadeira. Esta é uma forma proposital de criar um loop infinito. Há aplicações que requerem a criação de laços infinitos. A preocupação que devemos ter é para não criarmos um loop infinito acidentalmente, como no seguinte trecho de código:

int c = 0;

while ( c < 100 ) { printf(“%d\n”, c); }

Neste caso, é visível que esquecemos de incluir no comando while uma instrução para incrementar o valor de c e, com isso, ela nunca deixará de ter um valor menor que 100!

10.4 Comando DO-WHILE

O comando do-while (ou somente comando do, como alguns autores chamam) é nossa terceira opção de comando de repetição, utilizado de forma similar ao comando while, sendo sua principal diferença o fato de que primeiro o comando associado é executado e somente após este se verifica se a condição é verdadeira a fim de continuar repetindo.

(6)

Em outras palavras, o comando do-while será executado pelo menos uma vez, já que só após a primeira execução de seu comando associado é que a condição é validada. Abaixo, um exemplo de código-fonte de um programa utilizando-se de tal comando: Código-fonte: #include <stdio.h> #include <stdlib.h> int main() { int i = 0; do { printf(“%d\n”, i); i++; } while ( i < 3 ); system("pause"); return 0; } Saída: 0 1 2

Apesar de, neste caso específico, a saída ser igual à de sua versão usando while, caso o valor inicial de i fosse 4, ele executaria ao menos uma vez o comando associado, imprimindo na tela o valor 4. Já na versão com while, se o valor inicial fosse 4, nenhuma impressão seria feita, já que a condição é testada antes da execução do comando associado!

10.4.1

O loop infinito

De forma análoga ao comando while, o comando do-while também permite a construção de um loop infinito. Abaixo, um exemplo:

do {

//Comandos aqui colocados serão executados infinitamente } while ( 1 );

(7)

10.5 Comandos de interrupção

Apesar de termos condições para a parada de cada comando de repetição, em certos casos podemos desejar interromper a execução do mesmo de forma parcial ou completa. Para tais casos, podemos usar algum comando de interrupção.

Dois são os comandos de interrupção presentes em C (e em outras linguagens, como Pascal, por exemplo): continue e break. Estudemos agora cada um deles.

10.6 Comando CONTINUE

O comando continue causa um desvio para o final do laço mais interno de um comando de repetição, em outras palavras, salta os comandos subseqüentes indo para o fim do comando associado ao laço, mas não interrompe completamente a execução do laço.

A fim de melhor entender o que acontece, que tal analisarmos o código de um programa e sua saída?

Código-fonte: #include <stdio.h> #include <stdlib.h> int main() { int c; for ( c = 1 ; c <= 10; c++) { printf("%d - ", c); if (c >= 5) continue; printf("menor que 5\n"); }; system("pause"); return 0; } Saída: 1 – menor que 5

(8)

2 – menor que 5 3 – menor que 5 4 – menor que 5

5 – 6 – 7 – 8 – 9 – 10 –

Bem, agora talvez fique um pouco mais claro o funcionamento do comando

continue. Perceba que inicialmente c receberá o valor 1, testará a condição de parada

que é quando c tiver um valor maior que 10 e após cada execução do comando associado o valor de c será incrementado em 1.

Para i com o valor 1, o primeiro printf será executado normalmente, o teste do if falhará (não executando, assim, o continue) e o segundo printf também será executado. O mesmo ocorrerá para i com valores 2, 3 e 4.

Entretanto, para i com valor 6, 7, 8, 9 e 10, o primeiro printf será executado normalmente, mas agora a condição do if será verdadeira, executando-se assim o continue, que ignorará todos os demais comandos restantes no bloco, executará o incremento da variável de controle e fará o próximo teste da condição de parada do laço, continuando a partir daí.

10.7 Comando BREAK

O próximo comando de interrupção, o comando break, possui um papel ainda mais radical: interrompe completamente a execução do laço, terminando o mesmo e passando para a próxima instrução do programa.

Vejamos o mesmo programa do exemplo anterior, porém empregando um break em vez de um continue: Código-fonte: #include <stdio.h> #include <stdlib.h> int main() { int c; for ( c = 1 ; c <= 10; c++) { printf("%d - ", c); if (c >= 5) break; printf("menor que 5\n");

(9)

}; system("pause"); return 0; } Saída: 1 – menor que 5 2 – menor que 5 3 – menor que 5 4 – menor que 5

Como se pode perceber, a execução deste programa é bastante similar à do programa anterior, com a exceção de que, assim que a condição do if tornou-se verdadeira, o break foi executado, interrompendo completamente a execução do laço e passando para a próxima instrução do programa.

Por meio de break, podemos criar outras condições de parada dentro de bloco de código associado ao laço.

(10)

10.8 Exercícios

1. Escreva um programa que lê uma string e, utilizando-se de um comando for, imprime a mesma na tela invertida. Por exemplo, se a string passada for “Linguagem”, deveria imprimir na tela “megaugniL”;

2. A biblioteca stdio.h possui uma função toupper(c) que, dado um char c, retornará a letra maiúscula daquele char ou o próprio char, caso ele não possua representação em maiúsculo (como no caso de ser um número). Crie um programa que leia uma string e, utilizando-se de um comando while e da função toupper, imprima em tela a string com todas as suas letras em maiúsculo;

Referências

Documentos relacionados

O espaço está organizado de forma a que cada responsável exerça a sua função com distanciamento entre as mesas de pelo menos dois metros e dispõem todas de um frasco de

Assim o espalhamento Raman ate então usado em Fisiéa do Estado Sõlido como um importante meio de de - terminação de frequências e simetrias de fonons Õticos,

Neste sentido, o objetivo deste trabalho é fazer uma avaliação do gerenciamento de resíduos sólidos no município de Santo Antônio da Barra – GO, envolvendo

Determinar o valor de mercado para venda dos imóveis rurais denominados Fazenda Ribloba I, Fazenda Ribloba II, Fazenda Ribloba III, Fazenda Saticum, Fazenda Saticum III,

Our results show that, 21.3% of the children with 0 to 12 years old attended at the Clinical Analysis Laboratory - University of western São Paulo (UNOESTE), Presidente Prudente,

Ao final da operação da máquina, o programa imprime o total de tubos cortados e o número de tubos rejeitados, tal como mostrado no exemplo de execução do programa, a seguir?. Exemplo

· 4.3 Indicações sobre cuidados médicos urgentes e tratamentos especiais necessários Não existe mais nenhuma informação relevante disponível.. SECÇÃO 5: Medidas de combate

Como diferencial em relação a outros encontros espíritas de Mocidade realiza- dos em Juiz de Fora, o BPE tem promo- vido discussões sobre temas geralmente considerados polêmicos,