Mudanças entre as edições de "MCO18703 2017 2 AULA04"
(Criou página com ' ----- link=MCO18703_2017_2_AULA03 link=MCO18703_2017_2#Aulas link=MCO18703_2017_2_AULA05') |
|||
Linha 1: | Linha 1: | ||
+ | =Objetivos= | ||
+ | |||
+ | *O aluno será capaz de implementar estruturas de repetição em linguagem C. | ||
+ | *Criar fluxogramas ou pseudo-código na forma de estruturas em linguagem C. | ||
+ | *Implementar ''loops'' infinitos. | ||
+ | *Uso do break associado ao comando ''for'', ''do'', ''while''. | ||
+ | |||
+ | =Estruturas de Repetição= | ||
+ | |||
+ | Existem 4 estruturas/comandos que permitem implementar ''loops'' ou repetições de blocos de código: | ||
+ | *''while()'' | ||
+ | *''do while()'' | ||
+ | *''for()'' | ||
+ | *''goto label'' | ||
+ | |||
+ | <blockquote style="background: #FFEEFF; border: 1px solid red; margin-left: 0px; margin-right: 0px; padding: 1em;"> | ||
+ | Nota 1: Observe que repetir o código significa voltar a executá-lo, normalmente sobre o controle de uma expressão lógica. | ||
+ | </blockquote> | ||
+ | |||
+ | |||
+ | |||
+ | ==O comando ''while()'': teste da repetição no começo == | ||
+ | |||
+ | |||
+ | ;O comando '''while''' tem a seguinte forma geral | ||
+ | |||
+ | while (condição) declaração; | ||
+ | |||
+ | ou | ||
+ | |||
+ | while (condição) | ||
+ | { | ||
+ | declaração1; | ||
+ | declaração2; | ||
+ | } | ||
+ | |||
+ | |||
+ | Podemos ver que a estrutura ''while'' testa uma condição. Se esta for verdadeira<br> | ||
+ | a declaração é executada e faz-se o teste novamente, e assim por diante.<br> | ||
+ | |||
+ | O comando ''while'' permite implementar ''loops'' com controle no início: | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | main() | ||
+ | { | ||
+ | int contador; | ||
+ | |||
+ | contador=0; | ||
+ | while (contador<5) { | ||
+ | printf("valor do contador = %d\n", contador); | ||
+ | contador=contador+1; | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | Variação do exemplo anterior: | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | main() | ||
+ | { | ||
+ | int contador; | ||
+ | |||
+ | contador=0; | ||
+ | while (contador<5) { | ||
+ | printf("valor da expressão = contador < 5 é %d\n", contador<5); | ||
+ | printf("valor do contador = %d\n", contador); | ||
+ | contador=contador+1; | ||
+ | } | ||
+ | printf("NO FINAL a expressão contador < 5 é %d\n", contador<5); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | Vamos ver a correspondência do comando ''while'' com um fluxograma: | ||
+ | |||
+ | {| border="1" cellpadding="5" cellspacing="0" | ||
+ | ! style="background: #FFD700;" | Fluxograma | ||
+ | ! style="background: #FFD700;" | C | ||
+ | ! style="background: #FFD700;" | Comentário | ||
+ | |- | ||
+ | | |[[imagem:fluxo5.jpg|200px]] | ||
+ | ||<syntaxhighlight lang=c>while(contador<5) { | ||
+ | printf("Entre com x\n"); | ||
+ | scanf("%f",&x); | ||
+ | soma=soma+x; | ||
+ | contador = contador + 1; | ||
+ | }</syntaxhighlight>|| O comando ''while()'' aplicado sobre um bloco de instruções.<br>Note que se for uma instrução simples,<br>as chaves podem ser omitidas. | ||
+ | |} | ||
+ | |||
+ | '''NOTE''' que no exemplo anterior o contador inicialmente DEVE conter um valor válido. | ||
+ | |||
+ | ==Comando ''do while'': controle do ''loop'' no final== | ||
+ | |||
+ | ;O comando ''do while'' tem a seguinte forma geral | ||
+ | |||
+ | do { | ||
+ | declaração1; | ||
+ | declaração2; | ||
+ | } while (condição); | ||
+ | |||
+ | Nesta variação o comando ''do while()'' permite a repetição de uma ou mais instruções, com controle do ''loop'' no final.<br> | ||
+ | Isto permite que o bloco seja executado pelo menos uma vez. | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | main() | ||
+ | { | ||
+ | int contador; | ||
+ | |||
+ | contador=0; | ||
+ | do { | ||
+ | printf("valor do contador = %d\n", contador); | ||
+ | contador=contador+1; | ||
+ | } while (contador<5); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | {| border="1" cellpadding="5" cellspacing="0" | ||
+ | ! style="background: #FFD700;" | Fluxograma | ||
+ | ! style="background: #FFD700;" | C | ||
+ | ! style="background: #FFD700;" | Comentário | ||
+ | |- | ||
+ | | |[[imagem:fluxoDoWhile-Eraldo.jpg|200px]] | ||
+ | ||<syntaxhighlight lang=c> | ||
+ | contador = 0; | ||
+ | do { | ||
+ | scanf("%d",&x); | ||
+ | soma=soma+x; | ||
+ | if (soma>150) | ||
+ | y=z+x; | ||
+ | contador++; | ||
+ | } while(contador<5); | ||
+ | </syntaxhighlight>|| Note que instruções ''while'' e ''if'' são tratadas como instruções normais<br> | ||
+ | que podem ser aninhadas normalmente em outros comandos. | ||
+ | |} | ||
+ | |||
+ | ==Comando ''for()'' == | ||
+ | |||
+ | O comando ''for()'' permite uma forma mais elaborada de ''loop'', com controle no início do bloco de repetição. | ||
+ | |||
+ | ;Sua forma geral é | ||
+ | |||
+ | for(inicialização;condição;incremento) declaração; | ||
+ | |||
+ | ;ou | ||
+ | |||
+ | for(inicialização;condição;incremento){ | ||
+ | declaração1; | ||
+ | declaração2; | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | [[arquivo:ComandoFor.gif|thumb|right| Estrutura de Repetição]] | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | main() | ||
+ | { | ||
+ | int i; | ||
+ | |||
+ | for (i=0;i<10;i=i+1) | ||
+ | printf("i =%d\n",i); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | {| border="1" cellpadding="5" cellspacing="0" | ||
+ | ! style="background: #FFD700;" | Fluxograma | ||
+ | ! style="background: #FFD700;" | C | ||
+ | ! style="background: #FFD700;" | Comentário | ||
+ | |- | ||
+ | | |[[imagem:FluxogramaComandoFor-Eraldo.jpg|300px]] | ||
+ | ||<syntaxhighlight lang=c> | ||
+ | for(i=0; i<10; i++) { | ||
+ | printf("Laço de número %d\n", i); | ||
+ | if (i==5) | ||
+ | printf("Este é o laço 5\n"); | ||
+ | } | ||
+ | </syntaxhighlight>|| Observe que a expressão ''i=0'' é executada SEMPRE e uma única VEZ, <br>no início do comando. | ||
+ | A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. <br>Ela é executada após a expressão | ||
+ | de inicialização e, na sequência, <br>no início de cada ''loop''. <br>A expressão i++ é executada no final de cada ''loop''. | ||
+ | |} | ||
+ | |||
+ | ==Aninhamento de loops== | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | main() | ||
+ | { | ||
+ | int i,j; | ||
+ | |||
+ | for (i=0;i<3;i++) { | ||
+ | for (j=0;j<4;j++) { | ||
+ | printf("valor de j = %d\n", j); | ||
+ | } | ||
+ | printf("valor de i = %d\n", i); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==Comando ''goto'' == | ||
+ | |||
+ | O comando ''goto'' é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL. | ||
+ | |||
+ | Exemplo: | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | main() | ||
+ | { | ||
+ | int i; | ||
+ | |||
+ | i=0; | ||
+ | |||
+ | PONTO1: | ||
+ | printf("Laço de número %d\n", i); | ||
+ | i++; | ||
+ | if (i<10) | ||
+ | goto PONTO1; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | :Devido a ser uma instrução "desestruturante", em geral NÃO se recomenda o uso deste comando. | ||
+ | |||
+ | Em alguns casos de tratamento de erro pode ser interessante o uso do [http://julipedia.meroh.net/2005/08/using-gotos-in-c.html goto]. | ||
+ | |||
+ | Leia um pouco mais sobre o goto [http://en.wikipedia.org/wiki/Goto aqui]. | ||
+ | |||
+ | =Loop Infinito= | ||
+ | |||
+ | É possível implementar loops infinitos com qualquer uma das instruções acima. | ||
+ | |||
+ | Exemplo com comando ''for'': | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | main() | ||
+ | { | ||
+ | for(;;) { | ||
+ | /* Este bloco se executará infinitamente */ | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ou com o comando ''while'': | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | main() | ||
+ | { | ||
+ | while(1) { | ||
+ | /* Este bloco se executará infinitamente */ | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | ;Exemplo | ||
+ | |||
+ | Usando o comando '''for''' aninhado, construa um programa que implemente a figura abaixo. <br> | ||
+ | |||
+ | :x | ||
+ | :xx | ||
+ | :xxx | ||
+ | :xxxx | ||
+ | :xxxxx | ||
+ | :xxxxxx | ||
+ | :xxxxxxx | ||
+ | :xxxxxxxx | ||
+ | :xxxxxxxxx | ||
+ | :xxxxxxxxxx | ||
+ | :xxxxxxxxxxx | ||
+ | :xxxxxxxxxxxx | ||
+ | :xxxxxxxxxxxxx | ||
+ | |||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | main() | ||
+ | { | ||
+ | int i,j; | ||
+ | printf("\n"); /* deixa uma linha em branco */ | ||
+ | |||
+ | for (i=0;i<13;i++) { | ||
+ | for (j=0;j<=i;j++) { | ||
+ | printf("*"); | ||
+ | } | ||
+ | printf("\n"); /* deixa uma linha em branco */ | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | ==Uso de ''BREAK'' para sair de ''loops''== | ||
+ | |||
+ | Em exercícios anteriores, a finalização de um ''loop'' normalmente se dá pela expressão de controle de ''loop'' associado a instrução usada.<br> | ||
+ | É possível sair de um ''loop'' na "força bruta" usando a instrução ''break'': | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | main() | ||
+ | { | ||
+ | int i,j; | ||
+ | |||
+ | for (i=0;i<10;i++) { | ||
+ | if (i==5) | ||
+ | break; | ||
+ | } | ||
+ | printf("valor de i=%d\n", i); | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | Note que o ''break'' sempre sai do ''loop'' mais próximo a ele. Muitas vezes rodamos um looping, através de um laço (como FOR ou WHILE), para encontrar alguma informação. O break serve para terminar o laço a qualquer momento sem esperar que o ''loop'' termine. | ||
+ | |||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | main() | ||
+ | { | ||
+ | int i,j; | ||
+ | |||
+ | for (i=0;i<3;i++) { | ||
+ | for (j=0;j<4;j++) { | ||
+ | if (j==1) { | ||
+ | break; | ||
+ | } | ||
+ | printf("valor de j = %d\n", j); | ||
+ | } | ||
+ | if (i==2) | ||
+ | break; | ||
+ | printf("valor de i = %d\n", i); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | ;Desafio 1 | ||
+ | |||
+ | Encontre o primeiro número, entre 1 e 1 milhão que é divisível por 11, 13 e 17. Isso significa dizer que temos que encontrar o menor número que, dividido por 11, 13 e 17, dê resto da divisão nulo (igual a zero). | ||
+ | |||
+ | |||
+ | {{collapse top|Solução}} | ||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | int count, | ||
+ | numero=0; | ||
+ | |||
+ | for(count=1 ; count<=1000000 ; count++) | ||
+ | { | ||
+ | if(numero == 0) | ||
+ | if((count%11==0) && (count%13==0) && (count%17==0)) | ||
+ | { | ||
+ | numero=count; | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | printf("O numero e: %d\n", numero); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | {{collapse bottom}} | ||
+ | |||
+ | ==Uso do ''CONTINUE'' para prosseguir no início do ''loop''== | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | main() | ||
+ | { | ||
+ | int i,j; | ||
+ | |||
+ | for (i=0;i<3;i++) { | ||
+ | if (i==1) { | ||
+ | continue; | ||
+ | } | ||
+ | printf("valor de j = %d\n", j); | ||
+ | for (j=0;j<4;j++) { | ||
+ | if (j==1) { | ||
+ | continue; | ||
+ | } | ||
+ | printf("valor de j = %d\n", j); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | O comando CONTINUE, quando inserido dentro de algum laço, faz com que a iteração atual seja cancelada, e o laço prossegue na próxima iteração. Ou seja, o BREAK faz todo o laço parar enquanto o CONTINUE, faz somente com que a iteração pule pra próxima. | ||
+ | |||
+ | ;Desafio 2 | ||
+ | |||
+ | Faça um programa em C que some todos os números, de 1 até 100, exceto os múltiplos de 3. Faça o laço for percorrer de 1 até 100 e teste se cada número deixa resto 0 quando dividido por 3. Caso deixe, é porque é múltiplo de 3 e não devemos somar. Para que isso ocorra, simplesmente pulamos essa iteração. Porém, se não for múltiplo de 3, é porque a iteração não foi pulada, ela continua, e vamos somar esse número na soma total. | ||
+ | |||
+ | |||
+ | {{collapse top|Solução}} | ||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | int count, | ||
+ | soma; | ||
+ | |||
+ | for(count=1, soma=0 ; count<=100 ; count++) | ||
+ | { | ||
+ | if( count%3 ==0) | ||
+ | continue; | ||
+ | |||
+ | soma = soma + count; | ||
+ | } | ||
+ | |||
+ | |||
+ | printf("Soma %d", soma); | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | {{collapse bottom}} | ||
+ | |||
+ | <!-- | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | void imp_linha_cheia(int margem, int num_caracteres, char car1) | ||
+ | { | ||
+ | int i; | ||
+ | |||
+ | for(i=0;i<margem;i++) | ||
+ | printf(" "); | ||
+ | for(i=0;i<num_caracteres;i++) | ||
+ | printf("%c", car1); | ||
+ | printf("\n"); | ||
+ | } | ||
+ | |||
+ | void imp_linha_vazada(int margem, int num_vazados, char car1) | ||
+ | { | ||
+ | int i; | ||
+ | |||
+ | for(i=0;i<margem;i++) | ||
+ | printf(" "); | ||
+ | printf("%c", car1); | ||
+ | for(i=0;i<num_vazados;i++) | ||
+ | printf(" "); | ||
+ | printf("%c\n", car1); | ||
+ | } | ||
+ | |||
+ | void plot_ret(int margem, int num_vazados, int num_linhas_vazado, char car1) | ||
+ | { | ||
+ | int i; | ||
+ | |||
+ | imp_linha_cheia(margem, num_vazados+2, car1); | ||
+ | for(i=0;i<num_linhas_vazado;i++) | ||
+ | imp_linha_vazada(margem, num_vazados, car1); | ||
+ | imp_linha_cheia(margem, num_vazados+2, car1); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | |||
+ | {{collapse bottom}} | ||
+ | |||
+ | |||
+ | |||
+ | {{collapse top|AULA 6 DIA 28/02/2014}} | ||
+ | |||
+ | Exercícios | ||
+ | |||
+ | 1.Usando o comando for aninhado, construa um programa que implemente a figura abaixo. A margem esquerda (margem de espaços), o caracter do desenho, o número de linhas vazadas e o tamanho horizontal da figura deve ser lido pelo teclado. | ||
+ | aaaaaaaaaa | ||
+ | a a | ||
+ | aaaaaaaaaa | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | main() | ||
+ | { | ||
+ | int i, j,num_linhas, num_colunas, margem; | ||
+ | |||
+ | |||
+ | printf("Entre com linhas\n"); | ||
+ | scanf ("%d",&num_linhas); | ||
+ | |||
+ | printf("Entre com colunas\n"); | ||
+ | scanf ("%d",&num_colunas); | ||
+ | |||
+ | printf("Entre com margem\n"); | ||
+ | scanf ("%d",&margem); | ||
+ | |||
+ | |||
+ | /* subproblema 1 */ | ||
+ | |||
+ | for (i=0;i<margem;i=i+1) | ||
+ | printf(" "); | ||
+ | for (i=0;i<num_colunas;i=i+1) | ||
+ | printf("A"); | ||
+ | printf("\n"); | ||
+ | |||
+ | /*subproblema 3 */ | ||
+ | for(j=0;j<num_linhas-2;j++) { | ||
+ | |||
+ | /*subproblema 2 */ | ||
+ | |||
+ | for (i=0;i<margem;i=i+1) | ||
+ | printf(" "); | ||
+ | |||
+ | printf("A"); | ||
+ | |||
+ | for(i=0;i<num_colunas-2;i=i+1) | ||
+ | printf(" "); | ||
+ | |||
+ | printf("A"); | ||
+ | printf("\n"); | ||
+ | } | ||
+ | |||
+ | /* subproblema 1 */ | ||
+ | |||
+ | for (i=0;i<margem;i=i+1) | ||
+ | printf(" "); | ||
+ | for (i=0;i<num_colunas;i=i+1) | ||
+ | printf("A"); | ||
+ | printf("\n"); | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 2.Construa um programa para desenhar a seguinte figura de forma parametrizável: | ||
+ | |||
+ | AAAAAAAAAAAAAAAA | ||
+ | AAAAAAAAAAAAAA | ||
+ | AAAAAAAAAAAA | ||
+ | AAAAAAAAAA | ||
+ | AAAAAAAA | ||
+ | AAAAAA | ||
+ | AAAA | ||
+ | AA | ||
+ | BB | ||
+ | BBBBB | ||
+ | BBBBBBBB | ||
+ | BBBBBBBBBBB | ||
+ | BBBBBBBBBBBBBB | ||
+ | BBBBBBBBBBBBBBBBB | ||
+ | BBBBBBBBBBBBBBBBBBBB | ||
+ | BBBBBBBBBBBBBBBBBBBBBBB | ||
+ | |||
+ | 3.#Estude o programa ([http://stackoverflow.com/questions/5743678/how-to-generate-random-number-between-0-and-10-in-c referência]) abaixo: | ||
+ | <syntaxhighlight lang=c> | ||
+ | /* rand example: guess the number */ | ||
+ | #include <stdio.h> | ||
+ | #include <stdlib.h> | ||
+ | #include <time.h> | ||
+ | |||
+ | int main () | ||
+ | { | ||
+ | int iSecret, iGuess; | ||
+ | |||
+ | /* initialize random seed: */ | ||
+ | srand ( time(NULL) ); | ||
+ | |||
+ | /* generate secret number: */ | ||
+ | iSecret = rand() % 10 + 1; | ||
+ | |||
+ | do { | ||
+ | printf ("Guess the number (1 to 10): "); | ||
+ | scanf ("%d",&iGuess); | ||
+ | if (iSecret<iGuess) | ||
+ | printf ("The secret number is lower\n"); | ||
+ | else { | ||
+ | if (iSecret>iGuess) | ||
+ | printf ("The secret number is higher\n"); | ||
+ | } | ||
+ | } while (iSecret!=iGuess); | ||
+ | |||
+ | printf ("Congratulations!\n"); | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> Estude também o significado das instruções: | ||
+ | srand ( time(NULL) ); | ||
+ | iSecret = rand() % 10 + 1; | ||
+ | |||
+ | 4.Sobre o exercício 3, implemente uma versão usando o comando while(). | ||
+ | |||
+ | 5.Elabore um programa que lê um número inteiro e imprime todos os números pares entre 1 e este número. | ||
+ | |||
+ | |||
+ | --> | ||
Edição das 15h04min de 24 de outubro de 2017
Objetivos
- O aluno será capaz de implementar estruturas de repetição em linguagem C.
- Criar fluxogramas ou pseudo-código na forma de estruturas em linguagem C.
- Implementar loops infinitos.
- Uso do break associado ao comando for, do, while.
Estruturas de Repetição
Existem 4 estruturas/comandos que permitem implementar loops ou repetições de blocos de código:
- while()
- do while()
- for()
- goto label
Nota 1: Observe que repetir o código significa voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.
O comando while(): teste da repetição no começo
- O comando while tem a seguinte forma geral
while (condição) declaração;
ou
while (condição) { declaração1; declaração2; }
Podemos ver que a estrutura while testa uma condição. Se esta for verdadeira
a declaração é executada e faz-se o teste novamente, e assim por diante.
O comando while permite implementar loops com controle no início:
#include <stdio.h>
main()
{
int contador;
contador=0;
while (contador<5) {
printf("valor do contador = %d\n", contador);
contador=contador+1;
}
}
Variação do exemplo anterior:
#include <stdio.h>
main()
{
int contador;
contador=0;
while (contador<5) {
printf("valor da expressão = contador < 5 é %d\n", contador<5);
printf("valor do contador = %d\n", contador);
contador=contador+1;
}
printf("NO FINAL a expressão contador < 5 é %d\n", contador<5);
}
Vamos ver a correspondência do comando while com um fluxograma:
NOTE que no exemplo anterior o contador inicialmente DEVE conter um valor válido.
Comando do while: controle do loop no final
- O comando do while tem a seguinte forma geral
do { declaração1; declaração2; } while (condição);
Nesta variação o comando do while() permite a repetição de uma ou mais instruções, com controle do loop no final.
Isto permite que o bloco seja executado pelo menos uma vez.
#include <stdio.h>
main()
{
int contador;
contador=0;
do {
printf("valor do contador = %d\n", contador);
contador=contador+1;
} while (contador<5);
}
Comando for()
O comando for() permite uma forma mais elaborada de loop, com controle no início do bloco de repetição.
- Sua forma geral é
for(inicialização;condição;incremento) declaração;
- ou
for(inicialização;condição;incremento){ declaração1; declaração2; }
#include <stdio.h>
main()
{
int i;
for (i=0;i<10;i=i+1)
printf("i =%d\n",i);
}
Aninhamento de loops
#include <stdio.h>
main()
{
int i,j;
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
printf("valor de j = %d\n", j);
}
printf("valor de i = %d\n", i);
}
}
Comando goto
O comando goto é um dos mais antigos da programação. A ideia é comandar um salto para um determinado ponto específico do programa marcado por um rótulo (LABEL). Para utilizá-lo deve-se, portanto, marcar o ponto para onde será feito o salto usando um LABEL.
Exemplo:
#include <stdio.h>
main()
{
int i;
i=0;
PONTO1:
printf("Laço de número %d\n", i);
i++;
if (i<10)
goto PONTO1;
}
- Devido a ser uma instrução "desestruturante", em geral NÃO se recomenda o uso deste comando.
Em alguns casos de tratamento de erro pode ser interessante o uso do goto.
Leia um pouco mais sobre o goto aqui.
Loop Infinito
É possível implementar loops infinitos com qualquer uma das instruções acima.
Exemplo com comando for:
main()
{
for(;;) {
/* Este bloco se executará infinitamente */
}
}
ou com o comando while:
main()
{
while(1) {
/* Este bloco se executará infinitamente */
}
}
- Exemplo
Usando o comando for aninhado, construa um programa que implemente a figura abaixo.
- x
- xx
- xxx
- xxxx
- xxxxx
- xxxxxx
- xxxxxxx
- xxxxxxxx
- xxxxxxxxx
- xxxxxxxxxx
- xxxxxxxxxxx
- xxxxxxxxxxxx
- xxxxxxxxxxxxx
#include <stdio.h>
main()
{
int i,j;
printf("\n"); /* deixa uma linha em branco */
for (i=0;i<13;i++) {
for (j=0;j<=i;j++) {
printf("*");
}
printf("\n"); /* deixa uma linha em branco */
}
}
Uso de BREAK para sair de loops
Em exercícios anteriores, a finalização de um loop normalmente se dá pela expressão de controle de loop associado a instrução usada.
É possível sair de um loop na "força bruta" usando a instrução break:
#include <stdio.h>
main()
{
int i,j;
for (i=0;i<10;i++) {
if (i==5)
break;
}
printf("valor de i=%d\n", i);
}
Note que o break sempre sai do loop mais próximo a ele. Muitas vezes rodamos um looping, através de um laço (como FOR ou WHILE), para encontrar alguma informação. O break serve para terminar o laço a qualquer momento sem esperar que o loop termine.
#include <stdio.h>
main()
{
int i,j;
for (i=0;i<3;i++) {
for (j=0;j<4;j++) {
if (j==1) {
break;
}
printf("valor de j = %d\n", j);
}
if (i==2)
break;
printf("valor de i = %d\n", i);
}
}
- Desafio 1
Encontre o primeiro número, entre 1 e 1 milhão que é divisível por 11, 13 e 17. Isso significa dizer que temos que encontrar o menor número que, dividido por 11, 13 e 17, dê resto da divisão nulo (igual a zero).
Solução |
---|
#include <stdio.h>
int main()
{
int count,
numero=0;
for(count=1 ; count<=1000000 ; count++)
{
if(numero == 0)
if((count%11==0) && (count%13==0) && (count%17==0))
{
numero=count;
break;
}
}
printf("O numero e: %d\n", numero);
}
|
Uso do CONTINUE para prosseguir no início do loop
#include <stdio.h>
main()
{
int i,j;
for (i=0;i<3;i++) {
if (i==1) {
continue;
}
printf("valor de j = %d\n", j);
for (j=0;j<4;j++) {
if (j==1) {
continue;
}
printf("valor de j = %d\n", j);
}
}
}
O comando CONTINUE, quando inserido dentro de algum laço, faz com que a iteração atual seja cancelada, e o laço prossegue na próxima iteração. Ou seja, o BREAK faz todo o laço parar enquanto o CONTINUE, faz somente com que a iteração pule pra próxima.
- Desafio 2
Faça um programa em C que some todos os números, de 1 até 100, exceto os múltiplos de 3. Faça o laço for percorrer de 1 até 100 e teste se cada número deixa resto 0 quando dividido por 3. Caso deixe, é porque é múltiplo de 3 e não devemos somar. Para que isso ocorra, simplesmente pulamos essa iteração. Porém, se não for múltiplo de 3, é porque a iteração não foi pulada, ela continua, e vamos somar esse número na soma total.
Solução |
---|
#include <stdio.h>
int main()
{
int count,
soma;
for(count=1, soma=0 ; count<=100 ; count++)
{
if( count%3 ==0)
continue;
soma = soma + count;
}
printf("Soma %d", soma);
}
|