Mudanças entre as edições de "AULA 7 - Programação 1 - Graduação"
Linha 1: | Linha 1: | ||
− | == | + | == AULA 6== |
− | + | ===Objetivos=== | |
− | |||
− | + | O aluno deverá ser capaz de colocar estruturas de repetição especificadas | |
+ | em fluxogramas ou pseudo-código na forma de estruturas em linguagem C. | ||
− | + | ===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 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> | ||
+ | |||
+ | A estrutura do comando, informalmente, é: | ||
+ | |||
+ | while (''expressão'') | ||
+ | ''instrução_simples;'' | ||
+ | |||
+ | ou | ||
+ | |||
+ | while (''expressão'') { | ||
+ | ''lista_de_instruções'' | ||
+ | } | ||
+ | |||
+ | Vamos ver a correspondência do comando ''while'' com um fluxograma: | ||
+ | |||
+ | {| border="1" cellpadding="2" | ||
+ | !Fluxograma | ||
+ | !C | ||
+ | !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>|| comando ''while()'' aplicado sobre um bloco de instruções. Note que se for uma instrução simples, 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()'' 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. | ||
+ | |||
+ | <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> | ||
+ | |||
+ | A estrutura do comando, informalmente, é: | ||
+ | |||
+ | do | ||
+ | ''instrução_simples;'' | ||
+ | while (''expressão''); | ||
+ | |||
+ | ou | ||
+ | |||
+ | do { | ||
+ | ''lista_de_instruções'' | ||
+ | } while (''expressão''); | ||
+ | |||
+ | {| border="1" cellpadding="2" | ||
+ | !Fluxograma | ||
+ | !C | ||
+ | !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 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. | ||
+ | |||
+ | |||
+ | |||
+ | [[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> | </syntaxhighlight> | ||
+ | A estrutura do comando é: | ||
− | + | for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') | |
+ | ''instrução_simples;'' | ||
+ | ou | ||
+ | for(''expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco'') { | ||
+ | ''lista_de_instruções'' | ||
+ | } | ||
+ | |||
+ | {| border="1" cellpadding="2" | ||
+ | !Fluxograma | ||
+ | !C | ||
+ | !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, no início do comando. | ||
+ | A expressão ''i<10'' é o controle do ''loop''. Se FALSA o ''loop'' é encerrado. Ela é executada após a expressão | ||
+ | de inicialização e, na sequência, no início de cada ''loop''. A expressão i++ é executada no final de cada ''loop''. | ||
+ | |} | ||
+ | |||
+ | ====Aninhamento de loops==== | ||
<syntaxhighlight lang=c> | <syntaxhighlight lang=c> | ||
Linha 33: | Linha 182: | ||
{ | { | ||
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> | <syntaxhighlight lang=c> | ||
#include <stdio.h> | #include <stdio.h> | ||
+ | |||
main() | main() | ||
{ | { | ||
− | + | int i; | |
− | + | i=0; | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | PONTO1: | ||
+ | printf("Laço de número %d\n", i); | ||
+ | i++; | ||
+ | if (i<10) | ||
+ | goto PONTO1; | ||
} | } | ||
</syntaxhighlight> | </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> | ||
− | + | #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> | + | <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 231: | Linha 401: | ||
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. |
Edição das 17h00min de 27 de fevereiro de 2015
AULA 6
Objetivos
O aluno deverá ser capaz de colocar estruturas de repetição especificadas em fluxogramas ou pseudo-código na forma de estruturas em linguagem C.
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 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);
}
A estrutura do comando, informalmente, é:
while (expressão) instrução_simples;
ou
while (expressão) { lista_de_instruções }
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() 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);
}
A estrutura do comando, informalmente, é:
do instrução_simples; while (expressão);
ou
do { lista_de_instruções } while (expressão);
Comando for()
O comando for() permite uma forma mais elaborada de loop, com controle no início do bloco de repetição.
#include <stdio.h>
main()
{
int i;
for (i=0;i<10;i=i+1)
printf("i =%d\n",i);
}
A estrutura do comando é:
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) instrução_simples;
ou
for(expressão_inicial;expressão_de_controle; expressão_de_final_de _bloco) { lista_de_instruções }
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 */
}
}
- 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
#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);
}
|}
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 #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");
}
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 (referência) abaixo: /* 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;
}
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. |