|
|
Linha 1: |
Linha 1: |
| =Objetivos=
| |
|
| |
| *O aluno será capaz de implementar estruturas de repetição em linguagem C.
| |
| *Implementar ''loops'' infinitos.
| |
| *Uso do break associado ao comando ''for''.
| |
|
| |
| =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>
| |
|
| |
|
| |
|
| |
| ==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="color:white;background: #1E90FF;" | Fluxograma
| |
| ! style="color:white;background: #1E90FF;" | C
| |
| ! style="color:white;background: #1E90FF;" | 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>
| |
|
| |
| =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>
| |
|
| |
| ;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.
| |
|
| |
|
| |
| -->
| |
|
| |
|
| |
|
| |
|
| ----- | | ----- |