MCO018703 2018 1 AULA05: mudanças entre as edições
Criou página com ' ----- link=MCO018703_2018_1_AULA04 link=MCO018703_2018_1#Aulas link=MCO018703_2018_1_AULA06' |
Sem resumo de edição |
||
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 das 19h02min de 5 de março de 2018
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.
2 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.
2.1 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);
}
2.2 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);
}
}
3 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 */
}
}
3.1 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);
}
|
3.2 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);
}
|