Mudanças entre as edições de "AULA 7 - Programação 1 - Graduação"
(51 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 1: | Linha 1: | ||
==Objetivos== | ==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. | ||
+ | ==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 siginifica 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<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> | <syntaxhighlight lang=c> | ||
#include <stdio.h> | #include <stdio.h> | ||
− | main() | + | main() |
{ | { | ||
− | int | + | 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(" | + | 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: #ffdead;" | Fluxograma | ||
+ | ! style="background: #ffdead;" | C | ||
+ | ! style="background: #ffdead;" | 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> | </syntaxhighlight> | ||
+ | |||
+ | {| border="1" cellpadding="5" cellspacing="0" | ||
+ | ! style="background: #ffdead;" | Fluxograma | ||
+ | ! style="background: #ffdead;" | C | ||
+ | ! style="background: #ffdead;" | 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: #ffdead;" | Fluxograma | ||
+ | ! style="background: #ffdead;" | C | ||
+ | ! style="background: #ffdead;" | 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> | <syntaxhighlight lang=c> | ||
#include <stdio.h> | #include <stdio.h> | ||
Linha 34: | Linha 191: | ||
{ | { | ||
int i,j; | int i,j; | ||
− | + | ||
for (i=0;i<3;i++) { | for (i=0;i<3;i++) { | ||
for (j=0;j<4;j++) { | for (j=0;j<4;j++) { | ||
− | |||
− | |||
− | |||
printf("valor de j = %d\n", j); | printf("valor de j = %d\n", j); | ||
} | } | ||
− | |||
− | |||
printf("valor de i = %d\n", i); | 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> | </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> | <syntaxhighlight lang=c> | ||
Linha 58: | Linha 281: | ||
{ | { | ||
int i,j; | int i,j; | ||
+ | printf("\n"); /* deixa uma linha em branco */ | ||
− | for (i=0;i< | + | for (i=0;i<13;i++) { |
− | + | for (j=0;j<=i;j++) { | |
− | + | printf("*"); | |
− | + | } | |
− | + | printf("\n"); /* deixa uma linha em branco */ | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
Linha 75: | Linha 293: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | <!-- | |
− | -- | ||
− | |||
− | + | <syntaxhighlight lang=c> | |
− | |||
− | <syntaxhighlight lang=c> | ||
#include <stdio.h> | #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(" "); |
+ | 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> | </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> | #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> | </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 */ | /* rand example: guess the number */ | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
#include <time.h> | #include <time.h> | ||
− | + | ||
int main () | int main () | ||
{ | { | ||
int iSecret, iGuess; | int iSecret, iGuess; | ||
− | + | ||
/* initialize random seed: */ | /* initialize random seed: */ | ||
− | + | srand ( time(NULL) ); | |
− | + | ||
/* generate secret number: */ | /* generate secret number: */ | ||
− | + | iSecret = rand() % 10 + 1; | |
do { | do { | ||
Linha 201: | Linha 445: | ||
printf ("The secret number is higher\n"); | printf ("The secret number is higher\n"); | ||
} | } | ||
− | + | } while (iSecret!=iGuess); | |
− | + | ||
− | |||
− | |||
printf ("Congratulations!\n"); | printf ("Congratulations!\n"); | ||
return 0; | return 0; | ||
} | } | ||
− | </syntaxhighlight> | + | </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.--> | ||
+ | |||
+ | |||
+ | |||
+ | {| border="1" cellpadding="5" cellspacing="0" | ||
+ | ! style="background: #cdc5bf;" | [[AULA 6 - Programação 1 - Graduação | << ]] | ||
+ | ! style="background: #cdc5bf;" | AULA 7 | ||
+ | ! style="background: #cdc5bf;" | [[AULA 8 - Programação 1 - Graduação | >> ]] | ||
+ | |} |
Edição atual tal como às 09h41min de 11 de março de 2015
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.
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 siginifica 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;
- }
- while (condição){
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);
- do {
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;
- }
- for(inicialização;condição;incremento){
#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 */
}
}
<< | AULA 7 | >> |
---|