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') |
|||
(5 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
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="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> | ||
+ | |||
+ | =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. | ||
+ | |||
+ | |||
+ | --> | ||
Edição atual tal como às 15h07min de 24 de outubro de 2017
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
Nota 1: Observe que repetir o código significa voltar a executá-lo, normalmente sobre o controle de uma expressão lógica.
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);
}
}
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 */
}
}
- 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);
}
|