existem situações em quem uma operação ou uma série de 6 ... · a semelhança estásomente no...

30
1 Unesp – Campus de Guaratinguetá Curso de Programação Computadores Profa. Cassilda Ribeiro 6 - A Lógica da Programação Enlaçamento Enlaçamento 2 Existem situações em quem uma operação ou uma série de operações deve ser repetida varia vezes. Nestes casos utiliza- se uma estrutura de controle chamada laço ou enlaçamento. O laço é uma construção fundamental em programação e existem várias formas de laço, a saber: 6 Enlaçamento 1. Laços Condicionais 1.2. Laços Controlados por Entrada Entrada controlada por contador Entrada controlada por sentinela 1.3 Laços com teste no final 2. Laços Contados A seguir será visto em detalhe cada um desses laços. 3 6.1 . Laços Condicionais O laço condicional testa uma condição e repete uma seqüência de ações enquanto a condição testado for verdadeira. Ou seja ele fica repetindo uma seqüência de ações, enquanto a condição for verdadeira Em linguagem algorítmica ele pode ser expresso da seguinte forma: 6 Enlaçamento Enquanto “condição” faça comando Enquanto (condição) faça Início comando1 comando2... comandoN Fim Ou 4 Vejamos agora o exemplo do cálculo do resto inteiro de uma divisão. Um maneira de se calcular o resto de uma divisão é através de sucessivas subtrações. Suponha, por exemplo, que desejamos calcular o resto da divisão de 7 por 3. Isto pode ser feito da seguinte maneira: 1) Inicialmente fazemos b=7 e a=3 2) Perguntamos se (b > a) (7>3). Se a resposta for sim fazemos (b=b-a) (b=7-3 = 4) e perguntamos novamente se (b=b-a) (b=7-3 = 4). Se a resposta for sim, fazemos novamente (b=b-a) (b=4 -3 = 1) e mais uma vez perguntamos se (b>a) (1>3). Como agora b não é maior que a, paramos de perguntar e fazemos resto=1 6.1 Enlaçamento: Laços Condicionais

Upload: phamdiep

Post on 10-Nov-2018

213 views

Category:

Documents


0 download

TRANSCRIPT

11

Unesp – Campus de Guaratinguetá

Curso de Programação Computadores

Profa. Cassilda Ribeiro

6 - A Lógica da Programação

EnlaçamentoEnlaçamento

2

� Existem situações em quem uma operação ou uma série de operações deve ser repetida varia vezes. Nestes casos utiliza-se uma estrutura de controle chamada laço ou enlaçamento.

� O laço é uma construção fundamental em programação e existem várias formas de laço, a saber:

6 Enlaçamento

1. Laços Condicionais1.2. Laços Controlados por Entrada

� Entrada controlada por contador� Entrada controlada por sentinela

1.3 Laços com teste no final2. Laços Contados

A seguir será visto em detalhe cada um desses laços.

3

6.1 . Laços CondicionaisO laço condicional testa uma condição e repete uma seqüência de

ações enquanto a condição testado for verdadeira. Ou seja ele fica repetindo uma seqüência de ações, enquanto a condição for verdadeira

Em linguagem algorítmica ele pode ser expresso da seguinte forma:

6 Enlaçamento

Enquanto “condição” façacomando

Enquanto (condição) façaInício

comando1comando2...comandoN

Fim

Ou

4

Vejamos agora o exemplo do cálculo do resto inteiro de uma divisão.

Um maneira de se calcular o resto de uma divisão é através de sucessivas subtrações. Suponha, por exemplo, que desejamos calcular o resto da divisão de 7 por 3.

Isto pode ser feito da seguinte maneira:1) Inicialmente fazemos b=7 e a=32) Perguntamos se (b > a) (7>3).

Se a resposta for sim fazemos (b=b-a) (b=7-3 = 4) e perguntamos novamente se (b=b-a) (b=7-3 = 4). Se a resposta for sim, fazemos novamente (b=b-a) (b=4 -3 = 1) e mais uma vez perguntamos se (b>a) (1>3). Como agora b não é maior que a, paramos de perguntar e fazemos resto=1

6.1 Enlaçamento: Laços Condicionais

5

Graficamente:

1

3

37

Solução/Algoritmo:

4 7←←←← - 3

4 > 3 V

1 4←←←← - 3

1 > 3 F

1

7 >= 3 V

r ←←←←

� Observe que ficamos repetindo a ação de subtrair (b=b-a) enquanto a condição (b>=a) foi verdadeira. No momento em que b<a, paramos o laço.

6.1 Enlaçamento: Laços Condicionais

6

Algoritmo resto

Escreva(“Digite a e b”)Leia(a,b);

Enquanto (b >= a) faça b ← b – a;

fim enquantor ← b;Escreva(“resto=”, r);

Solução/Algoritmo:

b b←←←← - a

b >= a V

b b←←←← - a

b >= a F

b >= a V

br ←←←←

Resto da divisão: b ar c

Instruções Possíveis:

- >= F V→→→→

6.1 Enlaçamento: Laços Condicionais

7

Como saber se um número é par ou ímpar ?

Resto da divisão: b ar c

Um número é par se é divisível por 2 !

Ou seja, se b é par, então, para a = 2, r = 0 !

Solução/Algoritmo

a←2; Leia (b); Enquanto (b >= a) faça

b ← b – a; r ← b;Se (r = 0) Então

Escreva(“b eh par”);Senão

Escreva(“b eh ímpar”);

Caso particular do Algoritmo Anterior

+Verificação

6.1 Enlaçamento: Laços Condicionais

8

Em linguagem C o laço condicional Enquanto é feito através do comando while, isto é:

while (condição)

{

comandos;

}

OBS: O processo é repetido enquanto a condição for verdadeira.

F

condição comandosV

While (condição)

ComandoComando whilewhile

6.1 Enlaçamento: Laços Condicionais

9

1º. Avalia a condição

2º.Se a condição for Falsa (0-zero), o laço termina e o programa continua na instrução imediatamente após o while.

3º. Se a condição é verdadeira (diferente de zero) , executa os comandos do bloco.

4º. Volta ao passo 1.

O while funciona do seguinte modo:

� Observação Importante: Cada verificação da condição lógica com a conseqüente execução de ações é denominada de iteração (passos 1, 2 e 3).

6.1 Enlaçamento: Laços Condicionais

10

O comando while aparentemente é igual ao comando if, mas isto não é verdade. A semelhança está somente no fato que ambos avaliam uma condição antes de executar a ação.

A diferença fundamental entre o while e o if é a seguinte:

� O comando while avalia a condição. Se ela for verdadeira ele executa um comando ou um bloco de comandos, e volta para avaliar novamente a condição. Ele fica repetindo esses passos enquanto a condição for verdadeira.

� O comando if avalia a condição. Se ela for verdadeira ele executa o comando ou bloco de comandos somente uma vez. O comando if não fica repetindo a mesma ação.

6.1 Enlaçamento: Laços Condicionais

11

OBS: 1- Do mesmo modo que no comando if, a condição do comandowhile, deve sempre ser colocada entre parênteses.

2- O comandos de um laço também são chamados de corpo do laço.

DiferenDiferençça entre o comando if e o a entre o comando if e o whilewhile --Fluxograma Fluxograma

F

condição comandosV

while (condição)

F

condição comando1V

if (condição)

6.1 Enlaçamento: Laços Condicionais

12

Algoritmo Resto

Leia(a,b);

Enquanto (b >= a) faça b ← b – a;

fim enquanto

Escreva(“resto= “, b);

Comando while para calcular o resto da divisão inteira

F

b - a b←←←←b-a;V

Início

b

Início

6.1 Enlaçamento: Laços Condicionais

13

Algoritmo Resto

Leia(a,b);

Enquanto (b >= a) faça b ← b – a;

fim enquanto

Escreva(“resto= “, b);

Comando while para calcular o resto da divisão inteira

Programa Resto#include <stdio.h>#include <stdlib.h>main(){ int a, b;

printf(“Insira a e b:”);scanf(“%d %d”,&a,&b);while (b >= a)

b = b – a;printf(“Resto = %d ”,b);

}

6.1 Enlaçamento: Laços Condicionais

14

Comando while para evitar repetição de comandos

Problema Cansativo

Deseja-se mostrar a seguinte figura na tela:*****Construir um programaque realize isto.

Programa Cansativo

#include <stdio.h>main(){

printf(“*\n”);printf(“*\n”);printf(“*\n”);printf(“*\n”);printf(“*\n”);

}

6.1 Enlaçamento: Laços Condicionais

15

Comando while para evitar repetição de comandos

Programa Não Cansativo #include <stdio.h>main(){

int i = 1;while (i <= 5){

printf(“*\n”);i = i + 1;

}}

F

i <= 5

i←←←←i+1;

V

Início

“*\n”

Início

Fluxograma Não Cansativo

22

6.1 Enlaçamento: Laços Condicionais

16

Comando while para evitar repetição de comandos

Programa Não Cansativo

#include <stdio.h>main(){

int i = 1;while (i <= 5){

printf(“*\n”);i = i + 1;

}}

P2

P3

P1

Execução Programa

Iteração P1 P2 P3

1 i<=5 (v) “*\n” i=2

2 i<=5 (v) “*\n” i=3

3 i<=5 (v) “*\n” i=4

4 i<=5 (v) “*\n” i=5

5 i<=5 (v) “*\n” i=66 i<=5 (f) - -

6.1 Enlaçamento: Laços Condicionais

17

6.1.2. Laços Controlados por Entrada6.1.2. Laços Controlados por Entrada

� Foi visto que através de um laço apropriado, é possível repetir o algoritmo um certo numero de vezes.

� No laço controlado por entrada a condição para ver se o laço vai ser executado ou não é testada antes do laço.

� Se a condição for verdadeira o laço será executado, e retornará ao começo para se testar novamente a condição de parada.

6.1 Enlaçamento: Laços Condicionais

18

� Se a condição não for verdadeira o laço não será executado e o controle de execução passa para a primeira linha após o laço.

� O processo de retorno para ler dados adicionais não é problema, pois já se conhece a estrutura do laço. A dificuldade está em saber quando parar.

� Apresentaremos a seguir duas formas de se fazer isso, a saber:

a)Entrada controlada por contador

b)Entrada controlada por sentinela

6.1.2 Laços Controlados por Entrada

19

a) a) Entrada controlada por contadorEntrada controlada por contador

� Introduz-se um dado adicional no início do conjunto de dados. Este dado adicional fornece o número de

vezes que o laço deve ser repetido.

�Introduz-se uma variável contadora para controlar o

número de vezes que o laço deve ser repetido

6.1.2 Laços Controlados por Entrada: Contador

20

Algoritmo imprime_inteiros

Variáveis: i inteiro.

Inicio algoritmo

i←1.

Enquanto ( i 20) faça

inicio

escreva ( i ).

i ← i + 1.

fim

Fim algoritmo

Exemplo1 - Fazer um algoritmo e um programa em C que escreva na tela os 20 primeiros números inteiros.

//prog imprime_inteiros#include <stdio.h>#include <stdlib.h>main()

{ // inicio programaint i=1;While (i <= 20)

{ //inicio do whileprintf(“%d \n”, i);i=i+1;

} //fim do whilesystem(“pause”);

}//fim programa

6.1.2 Laços Controlados por Entrada: Contador

21

No exemplo anterior, observe que:

1º. A variável i é quem controla o número de vezes que o laço é executado, então:

a) é necessário atribuir um valor inicial para a variável i antes do while, para que ele possa analisar a condição.

b) dentro do corpo do while, após ter impresso o valor do i, é necessário incrementá-lo de uma unidade (i=i+1), para que o while pare de ser executado após 20 voltas.

2º. É necessário colocar as chaves { } marcando o inicio e o fim do while porque dentro dele estão sendo executados dois comandos.

3º. Se não fossem colocadas as chaves { }, iria ocorrer um laço infinito, que imprimiria somente o número 1, pois a variável de controle do laço nunca seria alterada e a condição do laço seriaeternamente verdadeira.

6.1.2 Laços Controlados por Entrada: Contador

22

Exemplo 2- Escreva um algoritmo e um programa em C que dado um Número qualquer, seja calculado e impresso a tabuada desse número.

Algoritmo tabuadaVariáveis: i,n, resp: inteiro.Inicio algoritmoescreva (“Qual tabuada deseja

imprimir”)Leia (n)i←1.Enquanto ( i 10) faça

inicioresp ← n * i escreva ( resp ).i ← i + 1.

fimFim algoritmo

6.1.2 Laços Controlados por Entrada: Contador

23

//Exemplo 2 - prog tabuada#include <stdio.h>#include <stdlib.h>main()

{ // inicio programaint i, n, resp;i=1;printf(“Qual tabuada vc deseja?”);scanf(“%d”,&n);While (i <= 10){ //inicio do whileresp=n * i;printf(“%2d*2d=%2d\n”,n,i,resp);i=i+1;} //fim do while

system(“pause”);

}//fim programa

Em linguagem C o algoritmo anterior torna-se

6.1.2 Laços Controlados por Entrada: Contador

24

Exemplo 3: Dado um valor m, calcular a soma de 1 até m.

Idéia:i 1 2 ••• m

soma

Observação: A variável i serve para percorrer as variáveis de 1 até m. Cada vez que um valor é apresentado, ele será armazenado na variável soma. Portanto, pode-se dizer que i é uma variável contadora ao passo que soma é uma variável acumuladora.

++

+

Iteração i soma0 0 01 1 12 2 33 3 6

••• ••• •••

6.1.2 Laços Controlados por Entrada: Contador

25

Algoritmo CalculaSoma

Variáveis: i inteiro;

Inicio algoritmo

i←0;

soma←0;

Leia(m);

Enquanto ( i m) faça

soma ← soma + i;

i ← i + 1;

fim enquanto

Escreva (“Soma=“,soma);

Fim algoritmo

#include <stdio.h>main(){ // inicio programa

int m, i=1, soma=0;printf(“Valor de m:”);scanf(“%d”,&m);while (i <= m){ //inicio do while

soma = soma + i;i=i+1;

} //fim do whileprintf(“Soma=%d”,soma);

}//fim programa

Programa em C

6.1.2 Laços Controlados por Entrada: Contador

Exemplo 3: Dado um valor m, calcular a soma de 1 até m.

26

Exemplo 4: Fazer um algoritmo e um programa em C que calcule e imprima a soma dos quadrados dos 100 primeiros números inteiros.

Algoritmo Soma_quadrados Variáveis: soma, contador, N : inteiroInício1. [Inicializar variáveis]

soma ←1contador ← 1

Escreva (´”Quantos números vocêquer somar?”)

Leia (N)2. [Somar os números]

Enquanto (contador<=N) façaInício enquanto

soma � soma + (contador ↑ 2)contador � contador + 1

Fim enquanto

3. [Imprimir resultado]Escreva (´O valor da soma é:`, soma)

Fim algoritmo

6.1.2 Laços Controlados por Entrada: Contador

27

Exemplo 4: Fazer um algoritmo e um programa em C que calcule e imprima a soma dos quadrados dos 100 primeiros números inteiros.

6.1.2 Laços Controlados por Entrada: Contador

//Programa exemplo 4

#include <stdlib.h>

#include <stdio.h>

#include <math.h>

main()

{

int soma, contador, N;

//[Ler dados]

printf("Digite quantos numeros

vc quer somar?\n");

scanf("%d",&N);

//[Inicializar variáveis]

soma = 0;

contador = 1;

//[Estabelecer o laço]

while (contador <= N)

{//inicio while

//[Calcular a soma parcial]

soma=soma + pow(contador,2);

//[Reajustar o contador]

contador = contador + 1;

}//fim while

//[Imprimir resultado]

printf("soma = %d\n",soma);

system("pause");

}// Fim programa

28

Idéia:

1! = 1

2! = 2 *1!

1

2*1

1

2

••• ••••••

(n-1)! = (n-1)*(n-2)! (n-1)*•••*1n-1

i prodFatorial

n! = n*(n-1)! n*(n-1)*•••*1n

6.1 Enlaçamento: Laços Condicionais

Exemplo 5: Faça um algoritmo que calcule o fatorial de um valor lido. As variáveis N, Produto e Multiplicador são do tipo inteiro

29

Exemplo 5: Faça um algoritmo que calcule o fatorial de um valor lido. As variáveis N, Produto e Multiplicador são do tipo inteiro

Algorítmo Fat_NVariáveis: N, Produto, Multiplicador : Inteiro.Início1. [Ler dados]

Escreva (“ Digite o numero para se calcular o fatorial”) Leia (N)

2. [Inicializar variáveis]Produto � 1Multiplicador � N � Continua

3. [Estabelecer o laço]

6.1 Enlaçamento: Laços Condicionais

30

3. [Estabelecer o laço]Enquanto (multiplicador ≥ 1) façaInicio3.1. [Calcular o produto parcial]

Produto � Produto * Multiplicador3.2 [Reajustar o multiplicador]

Multiplicador � Multiplicador – 1Fim enquanto

4. [Imprimir resultado]Escreva (´Fatorial de`, N, ´=`, Produto)

5. [Terminar]Fim

continuação do exemplo 1

6.1 Enlaçamento: Laços Condicionais

31

6.1 Enlaçamento: Laços Condicionais

//Programa exemplo 5: Fat_N#include <stdlib.h>#include <stdio.h>main(){int N, Produto, Multiplicador;

//[Ler dados]printf("Digite o numero para se

calcular o fatorial\n"); scanf("%d",&N);

//[Inicializar variáveis]Produto=1;Multiplicador=N;

32

6.1 Enlaçamento: Laços Condicionais

//[Estabelecer o laço]while (Multiplicador >= 1){ //inicio while

//[Calcular o produto parcial]Produto = Produto * Multiplicador;

//[Reajustar o multiplicador]Multiplicador= Multiplicador-1;

} //fim while//[Imprimir resultado]printf("Fatorial de %d = %d\n",N,Produto);system("pause");

} // Fim programa

33

Exemplo 6: Fazer um algoritmo e um programa em C que calcule e imprima os n primeiros termos da série: 1+1/2+1/3+1/4+...+1/n

Algoritmo serie01

Variáveis: i,n: inteiro; soma, elem : real;

Inicio algoritmo

escreva (“Quantos nos. vc deseja imprimir”)

Leia (n)

i←1.

s ←0.0

elem ←1

Escreva(“serie:”)

Enquanto ( i n) faça

inicio

elem ←(1/i)

s ← s + elem

escreva ( elem ).

i ← i + 1.

fim

Escreva(“Valor da soma:”,s)

Fim algoritmo

Continuação . . .

6.1.2 Laços Controlados por Entrada: Contador

34

//Programa Exemplo 6

#include <stdlib.h>

#include <stdio.h>

main()

{

int i,n;

float s, elem;

//leitura de dados

printf ("Quantos nos. vc

deseja imprimir\n");

scanf ("%d",&n);

i = 1;

s = 0.0;

elem = 1.0;

printf("serie:");

while ( i <= n)

{ //inicio

elem = (1.0/i);

s = s + elem;

printf("%5.4f

",elem );

i = i + 1;

} //fim

printf("\n\nValor da

soma:%5.4f\n\n",s);

system("PAUSE");

}

6.1.2 Laços Controlados por Entrada: Contador

35

Algoritmo serie_h;variaveis n: integer;

h: real;inicioescreva(“Entre com o valor de n”)leia(n); h:=0;Enquanto (n > 0)faça

h := h + 1/n;n := n-1;

fim enquanto

escreva(‘o valor de h eh:‘,h);fim algoritmo

6.1 Enlaçamento: 6.1 Enlaçamento: Laços Controlados por Entrada : Mais ExercíciosMais Exercícios

Exemplo 6: VERSÃO 2: Soma de trás para frente

36

//Programa serie versão2

#include <stdlib.h>

#include <stdio.h>

main()

{

int n;

float h;

printf ("Entre com o valor de n\n");

scanf("%d",&n);

printf("Para n = %d,",n);

h = 0;

while (n > 0)

{

h = h + 1/float(n);

n = n-1;

}

printf(" o valor de h eh:%f\n",h);

system("PAUSE");

}

Ao executar o programa teremos:

6.1 Enlaçamento: 6.1 Enlaçamento: Laços Controlados por Entrada : Mais ExercíciosMais Exercícios

37

Exemplo 7: Faça um algoritmo e um programa em C que, dadas as notas individuais em três aspectos do ano escolar num curso (Lab, Exame_inter, Exame_final) para um estudante com no. de matricula Nmatric, calcule a média final com pesos 20%, 30% e 50%, respectivamente. O relatório de saída é uma linha impressa para cada estudante, fornecendo o número do aluno, suas notas individuais e a média final. A entrada é controlada por contador. A variável n_estudantes indica o número de estudantes a ser processado; a variável contadordá o número de registros já processados. Ambas são variáveis inteiras. 37

6.1.2 Laços Controlados por Entrada: Contador

38

Algoritmo Relatório

Variáveis Lab, Exame_inter, Exame_final : real

Média : real

Nmatric, n_estudantes, contador : inteiro

Início

1. [Entrar contador de dados, neste caso, número de estudantes]

Leia (n_estudantes)

2. [Inicializar contador de registros processados]

contador � O continua...

6.1.2 Laços Controlados por Entrada: Contador

39

3. [Iniciar repetição controlada por contador] ...continuação pg. anterior

Enquanto (contador < n_estudante) faça

inicio enquanto

3.1 [Ler os registros dos alunos]

Leia (Nmatric, Lab, Exame_inter,Exame_final)

3.2 [Calcular média]

Media � 0.2*Lab + 0.3*Exame_inter + 0.5*Exame_final

3.3 [Imprimir resultados]

Escreva (“Numero do estudante:”, Nmatric)

Escreva (“Nota Laboratório”,Lab)

Escreva (“Exame Intermediario:”,Exame_inter)

Escreva (“Exame Final:”, Exame_final)

Escreva (“Media Final:”, Media) continua....

6.1.2 Laços Controlados por Entrada: Contador

40

Se Média ≥ 5.0

Então Escreva (´Aluno Aprovado`)

Senão Escreva (´Aluno Reprovado`)

3.4. [atualizar o contador de registros realmente processados]

contador � contador + 1

Fim enquanto

4. [Terminar]

Saída

Fim Algoritmo

...continuação pg. anterior

6.1.2 Laços Controlados por Entrada: Contador

41

//Prog01_Lacos – Exemplo 7

//usando laços com contador

#include <stdlib.h>

#include <stdio.h>

main()

{

float Lab, Exame_inter,Exame_final;

float Media;

int n_estudante,contador,Nmatric;

//1.Entrar contador de dados, neste caso, número de estudantes]

printf("digite o numero de alunos ");

scanf("%d",&n_estudante);

printf("\n\n" ); continua na próxima pag.

Código em C

6.1.2 Laços Controlados por Entrada: Contador

42

//2.Inicializar contador ...continuação

contador = 0;

//3.Iniciar Laço controlado por contador

while (contador < n_estudante)

{ // inicio enquanto

// 3.1 Ler dados dos alunos

printf("digite o numero do aluno: ");

scanf("%d/n",&Nmatric);

printf("digite as notas de Lab, Exame_inicial e ExameF do %d\n",Nmatric);

scanf("%f%f%f",&Lab,&Exame_inter,&Exame_final);

//3.2 [Calcular média]

Media = 0.2*Lab+0.3*Exame_inter+0.5*Exame_final;

6.1.2 Laços Controlados por Entrada: Contador

43

//3.3 Imprimir resultados . . . continuação

printf("\tNumero do estudante:%d\n",Nmatric);

printf("\tNota Laboratorio:%5.2f\n",Lab);

printf("\tExame Intermediario:%5.2f\n",Exame_inter);

printf("\tExame Final:%5.2f\n",Exame_final);

printf("\tMedia Final:%5.2f ",Media);

if (Media <= 5.0)

printf(“\tAluno Reprovado\n”);

else printf(“\tAluno Aprovado\n”);

//3.4. Atualizar o contador de registros realmente processados

contador= contador +1 ;

} // Fim enquanto

system("pause");

}

6.1.2 Laços Controlados por Entrada: Contador

44

Laços infinitos Laços infinitos –– Cuidado !Cuidado !

Os laços infinitos ocorremquando a condição lógica

do while não se tornafalsa por 2 motivos:

(i) Erro de atualização da variável associada a

condição lógica(ii) A condição lógica é

inadequada.

6.1.2 Laços Controlados por Entrada: Contador

45

Laços infinitos Laços infinitos –– Cuidado !Cuidado !

Programa Infinito

#include <stdio.h>main(){

int i;i = 1;while (i <= 5)

printf(“*\n”);}

F

i <= 5V

Início

“\n”

Início

Fluxograma Infinito

6.1.2 Laços Controlados por Entrada: Contador

46

Laços infinitos Laços infinitos –– Cuidado !Cuidado !

Programa Infinito

#include <stdio.h>main(){

int i;i = 1;while (i <= 5)

printf(“*\n”);

}

P2

P1

Execução Infinito

Iteração P1 P2 P3

1 i<=5 (v) “*\n” i=1

2 i<=5 (v) “*\n” i=1

3 i<=5 (v) “*\n” i=1

4 i<=5 (v) “*\n” i=1

5 i<=5 (v) “*\n” i=16 ••• ••• •••

P3

6.1.2 Laços Controlados por Entrada: Contador

47

Laços infinitos Laços infinitos –– Os programas são equivalentes !Os programas são equivalentes !

Programa Infinito

#include <stdio.h>main(){

int i;i = 1;while (i <= 5)

printf(“*\n”);}

Programa Infinito

#include <stdio.h>main(){

int i;i = 1;while (i <= 5)

printf(“*\n”);i = i + 1;

}

6.1.2 Laços Controlados por Entrada: Contador

48

Ex1: Em cada um dos segmentos de algorítmo, indicar se o laço termina ou não. Se não, porquê? Assumir que todas as variáveis são inteiras.

Este laço não termina, pois o valor de contador se mantém sempre = 0.

a) contador � Ø;total � Ø;Enquanto (contador ≥ 0) faça

total � total + 2;

6.1.2 Laços Controlados por Entrada: Contador

49

c) total ← 0;index ← 15;Enquanto (index 15) faça

total ← total + 1;index ← index – 1;

Não fecha, pois a

variável index será

sempre < 15. O laço

fecharia se fizéssemos

index ← index + 1;

b) contador � 0;total � 0;Enquanto (contador <= 10) faça

total � total + 1;contador � contador + 1;

Termina quando

contador = 11

6.1.2 Laços Controlados por Entrada: Contador

50

Ex2: Fazer um algoritmo/programa que imprima os números ímpares entre 1 e m.

Algoritmo imprime_int_ímpares

Variáveis: i, m inteiro;

Inicio algoritmo

Leia(m); i←1;

Enquanto ( i m) faça

inicio

Se (i % 2 = 1) então

escreva ( i );

fim se

i ← i + 1;

fim

Fim algoritmo

// Programa Números Ímpares.main(){ int m, i=1;

printf(“Entre com m:”);scanf(“%d”,&m);while (i <= m)

{ //Início whileif (i % 2 == 1) //Ímpar?

printf(“%d \n”, i);i=i+1;

} //fim do whilesystem(“pause”);

}//fim programa

6.1.2 Laços Controlados por Entrada: Contador

51

// Programa Números Ímpares.main(){ int m, i=1;

printf(“Entre com m:”);scanf(“%d”,&m);while (i <= m)

{ //Início whileif (i % 2 == 1) //Ímpar?

printf(“%d \n”, i);i=i+1;

} //fim do whilesystem(“pause”);

}//fim programa

Execução para m=2 e i=1

Iter. P1 P2 P3

1 i<=2 (v) (v) “1”

2 i<=2 (v) (f) -

3 i<=2 (f) - -

P2

P1

P3P4

P4

i=2

i=3

-

Programa em C

1

Resultado na Tela

6.1.2 Laços Controlados por Entrada: Contador

52

Ex3: Fazer um algoritmo/programa que imprima de 1 até m apenas os números ímpares (outra versão !).

Algoritmo imprime_int_ímpares

Variáveis: i, m inteiro;

Inicio algoritmo

Leia(m); i←1;

Enquanto ( i m) faça

inicio

escreva ( i );

i ← i + 2;fim

Fim algoritmo

// Programa Números Ímpares.main(){ int m, i=1;

printf(“Entre com m:”);scanf(“%d”,&m);while (i <= m)

{ //Início whileprintf(“%d \n”, i);i=i+2; // Incremento !

} //fim do whilesystem(“pause”);

}//fim programa

Só percorre ímpares!

6.1.2 Laços Controlados por Entrada: Contador

53

// Programa Números Ímpares.main(){ int m, i=1;

printf(“Entre com m:”);scanf(“%d”,&m);while (i <= m)

{ //Início whileprintf(“%d \n”, i);i=i+2; // Incremento !!!!

} //fim do whilesystem(“pause”);

}//fim programa

P2

P1

P3

Programa em C Execução para m=5 e i=1

Iter. P1 P2

1 i<=7 (v) “1”

2 i<=7 (v) “3”

3 i<=7 (v) “5”

P3

i=3

i=5

i=7

1 3 5

Resultado na Tela

4 i<=7 (f) - -

6.1.2 Laços Controlados por Entrada: Contador

54

Ex4: Fazer um algoritmo/programa que imprima apenasos m primeiros números pares.

Algoritmo imprime_int_pares

Variáveis: i,k,m inteiro.

Inicio algoritmo

Leia(m); i←1; k=1;

Enquanto ( k m) faça

Se (i % 2 = 0) então

escreva ( i );k ← k + 1;

fim se

i ← i + 1;

fim enquanto

Fim algoritmo

// Programa Números Pares.main(){ int m, k, i; i = 1; k = 1;

printf(“Entre com m:”);scanf(“%d”,&m);while (k <= m)

{ //Início whileif (i % 2 == 0) //Par?{ printf(“%d \n”, i);

k = k + 1; }i=i+1;

} //fim do whilesystem(“pause");

}//fim programa

6.1.2 Laços Controlados por Entrada: Contador

55

Execução: m=2, i=1 e k=0

Iter. P1 P2 P3

1 k<2 (v) (f) -

2 k<2 (v) (v) “2”

3 k<2 (v) (f) -

P2

P1

P3

P4

P4

-

k=1

-

Programa em C

2 4

Resultado na Tela

// Programa Números Pares.main(){ int m, k, i; i = 1; k = 1;

printf(“Entre com m:”);scanf(“%d”,&m);while (k < =m)

{ //Início whileif (i % 2 == 0) //Par?{ printf(“%d \n”, i);

k = k + 1; }i=i+1;

} //fim do while}//fim programa

P5

P5

i=2

i=3

i=4

4 k<2 (v) (v) “4” k=2 i=5

5 k<2 (f) - - - -

6.1.2 Laços Controlados por Entrada: Contador

56

Ex 5: Dado um valor m, calcular o produto de 1 até m.

Idéia:i 1 2 ••• m

prod

Observação: A variável i serve para percorrer as variáveis de 1 até m. Cada vez que um valor é

apresentado, ele será multiplicado pelo conteúdo de prod. Portanto, pode-se dizer que i é variável

contadora ao passo que prod é variável acumuladora.

••

Iteração i prod0 1 11 1 12 2 23 3 6

••• ••• •••

6.1.2 Laços Controlados por Entrada: Contador

57

Ex 5: Dado um valor m, calcular produto de 1 até m.

Algoritmo CalculaProd

Variáveis: i, prod: inteiro;

Inicio algoritmo

i←1;

prod←1;

Escreva (“digite o valor de m”);

Leia(m);

Enquanto ( i < m) faça

i ← i + 1;

prod ← prod * i;

fim enquanto

Escreva(“produto=“, prod);

Fim algoritmo

#include <stdio.h>main(){ // inicio programaint i=1, prod=1;printf(“Valor de m:”);scanf(“%d”,&m);while (i < m){ //inicio do while

i=i+1;prod = prod*i;

} //fim do whileprintf(“Produto=%d”,prod); system(“pause”);

}//fim programa

Programa em C

6.1.2 Laços Controlados por Entrada: Contador

58

Observe que o tanto o Ex 5, como o exemplo 5 estão calculando o fatorial de m. Só que um está calculando de trás para frente e ooutro de frente para traz.

#include <stdio.h>main(){ // inicio programaint i=1, prod=1;printf(“Valor de m:”);scanf(“%d”,&m);while (i < m){ //inicio while

i=i+1;prod = prod*i;

} //fim whileprintf(“Produto=%d”,prod); system(“pause”);

}//fim programa

Programa Ex 5

#include<stdlib.h>#include<stdio.h>main(){int N, Produto, Multiplicador;printf("Digite o numero para se calcular o fatorial\n"); scanf("%d",&N);//Inicializar variáveis

Produto= 1;Multiplicador=N;

while (Multiplicador >= 1) { // inicio while

Produto=Produto * Multiplicador;Multiplicador = Multiplicador-1;

} //fim whileprintf("Fatorial de %d = %d\n",N,Produto);system("pause");}//fim programa

Programa Exemplo 5

6.1.2 Laços Controlados por Entrada: Contador

59

b) b) Entrada controlada por sentinelaEntrada controlada por sentinela

� Este método é muito utilizado quando não se sabe a priori quantas vezes o laço vai ser executado.

�Utiliza-se então, um dado extra no fim do conjunto de dados, de modo que, quando este dado é lido, sabe-se que todos os outros já foram lidos.

Exemplo 8: Refazer o exemplo 7 - página 37, considerando que no final dos dados a respeito dos alunos foi inserido um dado extra com o número do aluno igual 0. Quando for lido o número 0 para um aluno, o programa deve parar de calcular as médias.

6.1.2 Laços Controlados por Entrada: Sentinela

60

Algoritmo Relatório2

Variáveis Lab, Exame_inter, Exame_final, Media : real

Nmatric, n_estudantes : inteiro

1. [Ler os dados do primeiro aluno]

Leia (Nmatric, Lab, Exame_inter,Exame_final)

2. [Iniciar repetição controlada por sentinela]

Enquanto (Nmatric ≠ 0) faça

Inicio

2.1 [Calcular a média]

Média � 0.2*Lab +0.3*Exame_inter + 0.5*Exame_final

Observe aqui, que o primeiro dado deve ser lido antes do laço, para que o testecondicional possa ser executado.

6.1.2 Laços Controlados por Entrada: Sentinela

61

2.2 [Imprimir resultados]

Escreva (´Numero estudante:`, Nmatric)

Escreva (´Nota Laboratório:`, Lab)

Escreva (´Exame Intermediário:`, Exame_inter)

Escreva (´Exame Final:`, Exame_final)

Escreva (´Média Final:`, Média)

Se Média ≥ 5.0

Então Escreva (´Aluno Aprovado`)

Senão Escreva (´Aluno Reprovado`)

2.3 [Ler dados do próximo aluno]

Leia (Nmatric, Lab, Exame_inter, Exame_final)

Fim enquanto

3. [Terminar]

Fim algoritmo

Observe aqui, que o próximo dado deve ser lido antes de terminar o laço, para que o testecondicional possa ser executado com o novo dado.

6.1.2 Laços Controlados por Entrada: Sentinela

62

//Usando Laços com sentinela

#include <stdlib.h>

#include <stdio.h>

main()

{

float Lab, Exame_inter,Exame_final;

float Media;

int Nmatric;

// 1.Entrar com dados do primeiro aluno

printf("digite o numero do 1o. aluno: ");

scanf("%d",&Nmatric);

Código em C

6.1.2 Laços Controlados por Entrada: Sentinela

63

// 3 - Iniciar repetição controlada por sentinela

while (Nmatric != 0)

{ // inicio enquanto

// 3.1 - Inserir notas do aluno

printf(“Digite as notas de Lab, Exame_inicial e ExameF do %d\n",Nmatric);

scanf("%f%f%f",&Lab,&Exame_inter,&Exame_final);

// 3.2 - Calcular média

Media = 0.2 *Lab + 0.3 *Exame_inter + 0.5*Exame_final;

// 3.3 - Imprimir resultados

printf("\tNumero do estudante: %d\n",Nmatric);

printf( "\tNota Laboratorio:%5.2f\n",Lab);

6.1.2 Laços Controlados por Entrada: Sentinela

64

printf("\tExame Intermediario:%5.2f\n",Exame_inter);

printf("\tExame Final:%5.2f\n",Exame_final);

printf("\tMedia Final:%5.2f\n”,Media);

if (Media >= 5.0)

printf(“\tAluno Aprovado\n”);

else printf(“\tAluno Reprovado\n”);

// 3.4 [Ler numero de matricula do proximo aluno

printf("digite o numero do aluno, ou zero (0) para parar ");

scanf("%d",&Nmatric);

} // Fim enquanto

printf("Fim do Programa.\n\n");

system("pause");

}

6.1.2 Laços Controlados por Entrada: Sentinela

65

Linguagem Algorítmica

Faça

comandos

enquanto <condição>

6.1.3 6.1.3 Laços com teste no final

6.1.3 Laços com teste no final

� Existe um outro tipo de laço condicional onde a condição é avaliada no final do corpo do laço.

Funcionamento deste laço

1. Os comandos, são executados.

2. A condição é avaliada

3. Se o resultado for verdadeiro, volta-se ao ponto 1.

4. Se o resultado for falso, termina-se o laço e o programa continua na instrução seguinte ao laço. 66

Sintaxe em linguagem C

do

{

comandos;

}

while (condição)F

Vcondição

comandos

Fluxograma

Obs: O corpo do laço do_while é executado pelo menos uma vez, enquanto que o laço com teste no inicio, pode nunca ser executado.

6.1.3 6.1.3 Laços com teste no final

67

Exemplo 9: Fazer um programa em C para calcularh(n)=1+1/2+1/3+...+1/n, usando o comando do_while

#include <stdlib.h>

#include <stdio.h>

main()

{

int n;

float h;

printf ("Entre com o valor de n\n");

scanf("%d",&n);

printf("Para n = %d,",n);

h = 0;

do

{

h = h + 1/float(n);

n = n-1;

}

while (n > 0);

printf(" o valor de h eh:%f\n\n",h);

system("PAUSE");

}

6.1.3 6.1.3 Laços com teste no final

68

� Para algumas aplicações, o controle condicional de laços, imposto pela construção “enquanto - faça” é desnecessariamente complicada, pois pode-se desejar um laço um número fixo de vezes, e este número é conhecido.

� Para este tipo de aplicação existe uma construção repetitiva que tem a seguinte forma:

Exemplo 10: Para ID ← 1, 2, .., 10 façavalor ← valor + 2

6.2 6.2 Laços Contados

6.26.2 LaLaçços Contadosos Contados

69

Exemplo 11: Para J ← 1, 2, .., 30 façaval ← val * 3

� Neste exemplo a variável de controle do laço é ID.� A variável ID começa valendo 1.� No corpo do laço a variável valor é incrementada de 2.� Em seguida, ID é automaticamente incrementada de 1, e a

instrução do corpo do laço é executada novamente.� Isto se repete 10 vezes, isto é até o valor de ID=10

6.2 6.2 Laços Contados

� Neste exemplo a variável de controle do laço é J. E ela começa valendo 1.

� No corpo do laço a variável val é multiplicada por 3.� Em seguida, J é automaticamente incrementada de 1, e a instrução

do corpo do laço é executada novamente.� Isto se repete 30 vezes, isto é até o valor de J=30 70

Exemplo 12: Para val ← 1, 2, .., N faça

Exemplo 13: Para Index ← 10, 9,..,1 faça

� Neste exemplo a variável de controle do laço é val.� A variável val começa valendo 1 e é automaticamente

incrementada de 1 a cada vez, até o valor de N. Então este laço se repete N vezes

� Neste exemplo a variável de controle do laço é Index.� A variável Index começa valendo 10 e é decrementada de 1 a

cada volta do laço, até que o valor de Index seja 1. Este laço se repete 10 vezes.

6.2 6.2 Laços Contados

71

Em cada um dos seguintes segmentos, dê o valor que será impresso para a variável Var. assumir que todas as variáveis são inteiras.

Var = 10

a) Var � 0Para Index = 1, 2, .., 10

Var � Var + 1;Escreva ( Var )

b) Var � 0Para Index = 4, 8, .., 36

Var � Var + 1;Escreva ( Var )

Var = 9

6.2 6.2 Laços Contados

72

c) Var � 0Para Index = 10, 9,.., 1

Var � Var + 1Index � Index + 1

Escreva ( Var )

Var = infinito, pois o laço não fecha porque o valor da variável Index está sendo alterado dentro do laço

d) Var � 0Para Index = 1, 2,..,15

Para Index2 = 1, 2,.., 8Var � Var + 1

Escreva ( Var )

Var = 120

6.2 6.2 Laços Contados

73

Linguagem Algorítmica

Para <i; cond; i++> Faça

comandos;

� Na linguagem C o laço contado é feito pelo comando for. Em C o comando for é um tipo de laço condicional onde a inicialização do valor da variável contadora, a avaliação da condição e a atualização do valor da variável contadora estão em um mesmo campo.

Funcionamento deste laço

1. Variável contadora é inicializada.

2. A condição é avaliada:

3. Se o resultado for verdadeiro, realiza-se os comandos.

4. Se o resultado for falso, termina-se o laço e continua-se na instrução seguinte ao laço.

5. Atualiza-se variável contadora e retorna-se para o passo 2.

6.2.1 6.2.1 Laços Contados: O comando for

74

Sintaxe em linguagem C

for(i=1;i<=n;i++)

{

comandos;

}F

V

i ≤ n

comandos

Fluxograma

Obs: O funcionamento do laço for é semelhante ao do laço while.

Note que existem 3 campos separados por “ ; ”. No 1º é realizada a

inicialização das variáveis, no 2º é realizada a verificação da

condição lógica e no 3º a atualização dos valores das variáveis.

i=1;

i ←←←← i+1;

6.2.1 6.2.1 Laços Contados: O comando for

75

Programa para imprimir os 5 primeiros números

Programa com while#include <stdio.h>main(){

int i = 1;while (i <= 5){

printf(“%d \n”,i);i = i + 1;

}}

P2

P3

P1

Programa com for

#include <stdio.h>main(){

int i;for (i=1;i<=5;i=i+1){

printf(“ %d \n”,i);}

}

P2

P3

P1

P4

P4

6.2.1 6.2.1 Laços Contados: O comando for

76

Execução Programa

Iteração P2 P3 P4

1 i<=5 (v) “1” i=2

2 i<=5 (v) “2” i=3

3 i<=5 (v) “3” i=4

4 i<=5 (v) “4” i=5

5 i<=5 (v) “5” i=66 i<=5 (f) - -

Programa para imprimir os 5 primeiros números

Programa com for

#include <stdio.h>main(){

int i;for (i=1;i<=5;i=i+1){

printf(“ %d \n”,i);}

}

P2

P3

P1 P4

6.2.1 6.2.1 Laços Contados: O comando for

77

Digite um numero: 41 42 33 24 1

Ex - 6: Escreva um programa que lê um número e escreve a seqüência crescente e decrescente entre 1 e esse número conforme o seguinte exemplo:

6.2.1 6.2.1 Laços Contados: O comando for

78

Programa Ex-6

#include <stdio.h>#include <stlib.h>main(){

int i, j;printf(“Entre com n:”); scanf(“%d”,&n);for ( i=1, j=n ; i<=n; i++, j-- ){

printf(“ %d %d \n”, i, j);}system(“pause”)

}

Inicialização em conjunto de i e j.

Uso de “,” !

Atualização conjunta de i e j.

Uso de “,” !

6.2.1 6.2.1 Laços Contados: O comando for

Programa que imprime números crescente e decrescente

79

Iter. P2 P3 P4

1 i<=5 (v) “1 5” i=2

2 i<=5 (v) “2 4” i=3

3 i<=5 (v) “3 3” i=4

4 i<=5 (v) “4 2” i=5

5 i<=5 (v) “5 1” i=66 i<=5 (f) - -

Programa que imprime números crescente e decrescente

P2

P3

P4

Execução ProgramaP1 n = 5, i = 1, j = n

P1

6.2.1 6.2.1 Laços Contados: O comando for

Programa Ex-6

#include <stdio.h>#include <stlib.h>main(){

int i, j;printf(“Entre com n:”); scanf(“%d”,&n);for ( i=1, j=n ; i<=n; i++, j-- ){

printf(“ %d %d \n”, i, j);}system(“pause”)

} 80Não Válido

6.3 Laços EncaixadosLaços Encaixados

Assim como temos uma construção “Se_Então_Senão” dentro da outra, podemos ter um laço dentro do outro.

O laço mais interno deve estar completamente embutido dentro do laço externo. Não pode haver sobreposição

Exemplos de laços embutidos válidos e não válidos.

Válidos Válidos

6.3 Enla6.3 Enlaççamento amento –– LaLaçços Encaixadosos Encaixados

81

Como exemplo de laços encaixados , vamos modificar o Ex2, pág 22 e 23 que calcula a tabuada de um número lido n, para um programa que dado um numero m qualquer, calcule e imprima todas as tabuadas de 1 até esse número m.

Para tanto será embutido o laço que calcula a tabuada, num segundo laço que irá determinar qual a tabuada será calculada. A idéia é a seguinte:

6.3 Enla6.3 Enlaççamento amento –– LaLaçços Encaixadosos Encaixados

j = 1, 2, ..., m

i = 1, 2, ..., 10

tab = i*j

Laço que determina, qual tabuada j será calculada, para as m tabuadas à serem calculadas.

Laço que calcula cada uma das tabuadas j 82

j=1

i=1 i=2 i=3 ... i=10

1*1 1*2 1*3 ... 1*10

j=2

i=1 i=2 i=3 ... i=10

2*1 2*2 2*3 ... 2*10

j=m

i=1 i=2 i=3 ... i=10

m*1 m*2 m*3 ... m*10

•••

Deste modo, quando j=1, no laço externo, o laço interno irá calcular a tabuada do 1.

Quando j=2, no laço externo, o laço interno irá calcular a tabuada do 2.

Quando j=m, no laço externo, o laço interno irá calcular a tabuada do 1.

6.3 Enla6.3 Enlaççamento amento –– LaLaçços Encaixadosos Encaixados

83

Algoritmo tabuada2Variáveis: i,n, resp: inteiro.Inicio algoritmoLeia (n);j←1;

Enquanto (j <= n)inícioi←1;Enquanto ( i <= 10) faça

inícioresp ← j * i; escreva ( resp );i ← i + 1;

fimj ← j + 1;

fimFim algoritmo

Para cada valor de j, são executados 10 vezes o laço com a variável i.

j=1

i=1 i=2 i=3 ... i=10

1*1 1*2 1*3 ... 1*10

•••

j=m

6.3 Enla6.3 Enlaççamento amento –– LaLaçços Encaixadosos Encaixados

j=2

i=1 i=2 i=3 ... i=10

2*1 2*2 2*3 ... 2*10

84

main() // incluir <stdio.h> e stdlib.h !{ int i, j, n, resp; i = 1; j = 1;

printf("Ateh qual tabuada deseja?")scanf("%d",&n);while (j <= n){ // início do 1o. while

printf("\t\ntabuada do %d\n", j); i = 1;while ( i <= 10){ // início 2o. while

resp = j * i; printf("%d*%d=%d\n",j,i,resp);i = i + 1;

} // fim 2o. whilej = j + 1;

} //fim 1o. while} // fim programa

main() // incluir <stdio.h> e stdlib.h !{ int i, j, n, resp;

printf("Ate qual tabuada deseja?")scanf("%d",&n);for (j=1;j <= n;j++){ // início do 1o. for

printf("\t\ntabuada do %d\n", j); for (i=1; i <= 10; i++){ // início 2o. for

resp = j * i; printf("%d*%d=%d\n",j,i,resp);

} // fim 2o. for} //fim 1o. for

} // fim programa

Programa Tabuada2 - forPrograma Tabuada2 - while

6.3 Enla6.3 Enlaççamento amento –– LaLaçços Encaixadosos Encaixados

85

Numero: 3Caractere: *

*********

Ex 7: Escreva um programa que solicite ao usuário um número n e um caractere c. Em seguida, serão preenchidasn linhas, cada uma com n caracteres c tal como no exemplo:

6.3 Enla6.3 Enlaççamento amento –– LaLaçços Encaixadosos Encaixados

86

**** ... *

for (j=1; j <= n; j++){

printf("%c", c);}printf(“\n”);Muda Linha

Resultado na Tela

n vezes

6.3 Enla6.3 Enlaççamento amento –– LaLaçços Encaixadosos Encaixados

IDÉIA: Este programa deve imprimir na mesma linha, n vezes o caractere lido. A seguir ele deve pular uma linha e imprimir novamente n vez o caractere lido. Isto deve ser feito n vezes.

Ao se executar uma vez o comando for com a variável j variando de 1até n, será impresso na tela uma linha com, por exemplo, n caracteres ’*’. Para imprimir n linhas contendo n caracteres ’ * ’ é necessário repetir n vezes o esse comando for, isto é:

87

for (j=1; j <= n; j++){

printf("%c", c);}printf(“\n”);••••••••••••

for (j=1; j <= n; j++){

printf("%c", c);}printf(“\n”);

n ve

zes

**** ⋅ ⋅ ⋅ *

**** ⋅ ⋅ ⋅ *•

**** ⋅ ⋅ ⋅ *

Resultado na Tela

n ve

zes

6.3 Enla6.3 Enlaççamento amento –– LaLaçços Encaixadosos Encaixados

Ao invés de se escrever n vezes o comando for, com a variável j, pode-se colocar um laço externo com uma variável i de modo que para cada valor de i o laço interno, do j, se repita n vezes. 88

for (j=1; j <= n; j++){

printf("%c", c);}printf(“\n”);•••

for (j=1; j <= n; j++){

printf("%c", c);}printf(“\n”);

n ve

zes

for (i=1; i <= n; i++){

for (j=1; j <= n; j++){

printf("%c", c);}printf(“\n”);

}

Código em C

6.3 Enla6.3 Enlaççamento amento –– LaLaçços Encaixadosos Encaixados

89

Numero: 5112123123412345

6.3 Enla6.3 Enlaççamento amento –– LaLaçços Encaixadosos Encaixados

Ex-8: Escreva um programa que solicite ao usuário um número n e produza o resultado na Tela tal comodado abaixo:

90

j=1 j=2 j=3 j=4 j=5

i = 1

i = 2

i = 3

i = 4

i = 5

1

1 2

1 2 3

1 2 3 4 5

1 2 3 4

2 3 4 5

3 4 5

4 5

5

6.3 Enla6.3 Enlaççamento amento –– LaLaçços Encaixadosos Encaixados

IDÉIA: Para se fazer esse programa pense primeiro em escrever uma matriz, como mostrado na figura abaixo. Para tanto serão necessários dois laços. O laço externo, com variável i, para fixar a linha que será impressa e o laço interno, com variável j, será responsável por imprimir os números em estão em cada linha, ou seja, as colunas da matriz.

Coluna j

Linha i

91

j=1 j=2 j=3 j=4 j=5

i = 1

i = 2

i = 3

i = 4

i = 5

1

1 2

1 2 3

1 2 3 4 5

1 2 3 4

6.3 Enla6.3 Enlaççamento amento –– LaLaçços Encaixadosos Encaixados

Para se imprimir a matriz do slide anterior bastaria fazermos:

for (i=1; i <= n; i++){

for (j=1; j <= n; j++){

printf("%d", j);}printf(“\n”);

}

Mas a matriz que queremos imprimir é a da figura ao lado. Observe nessa matriz que na linha 1 só temos um número, na linha 2 temos dois números, na linha 3 temos três números e assim por diante. Então temos que fazer o for do j, responsável por imprimir os elementos das colunas, variar até um valor igual ao número da linha i.

92

6.3 Enla6.3 Enlaççamento amento –– LaLaçços Encaixadosos Encaixados

Então, os laços ficam como abaixo:

for (i=1; i <= n; i++){

for (j=1; j <= i; j++){

printf("%d", j);}printf(“\n”);

}

Observe no for exterior, que quando i = 1, o for do j vai variar de 1 à 1. Quando i = 2, o for do j vai variar de 1 à 2, quando i = 3, o for do j vai variar de 1 à 3, e assim por diante.

A seguir mostramos o programa completo que gera essa matriz. Observe que a única variável lida é o numero de linhas que se deseja gerar.

93

1 1 2•

1 2 3 ... n

Resultado na Tela

n ve

zes

#include <stdio.h>#include <stdlib.h>main(){ int i,j,n;printf(“Digite o no. de linhas n\n”);scanf(“%d”,&n);for (i=1; i <= n; i++){

for (j=1; j <= i ; j++){

printf("%d", j);}printf(“\n”);

}system (“pause”);}

6.3 Enla6.3 Enlaççamento amento –– LaLaçços Encaixadosos Encaixados

94

6.4 Enlaçamento: Comando BREAK

� O comando break quando aplicado dentro de um laço interrompe a execução do mesmo, para qualquer um dos comandos que representam o laço: while, do-while e for. Os programas abaixo são equivalentes.

#include <stdio.h>#include <stdlib.h>main(){ int i;

for (i=1; ;i=i+1){

printf(“ %d \n”,i);if (i == 5)

break;}

system (“pause”);}

#include <stdio.h>#include <stdlib.h>main(){ int i;

for (i=1; i<=5 ;i=i+1){

printf(“ %d \n”,i);}

system (“pause”);}

95

� O Ex-8 também pode ser feito utilizando o comando break, de modo que os códigos abaixo são equivalentes.

for (i=1; i <= n; i++){

for (j=1; j <= n; j++){

printf("%d", j);if (i == j)

break;}printf(“\n”);

}

for (i=1; i <= n; i++){

for (j=1; j <= i ; j++){

printf("%d", j);}printf(“\n”);

}

6.4 Enlaçamento: Comando BREAK

96

6.5 Enlaçamento: Comando CONTINUE

� O comando continue quando aplicado dentro de um for interrompe a execução das instruções do laço que vem logo após ele e segue diretamente para o campo destinado a atualização de variáveis.

#include <stdio.h>main(){ int i;

for (i=1; i <=5 ;i=i+1){

if (i % 2 == 1)continue;

else printf(“ %d \n”,i);}

}

#include <stdio.h>main(){ int i;

for (i=1; i <=5 ;i=i+1){

if (i % 2 == 0)printf(“ %d \n”,i);

}}

97

Ex 10: Dado que um programador cometeu um erro em seu primeiro programa, dois erros em seu segundo programa e quatro erros em seu terceiro programa e assim sucessivamente. Fazer um programa em C que leia o numero de programas que o programador fez e calcule o numero de erros que ele cometeu em seu último programa.

Para fazer este programa é preciso começar definindo o que vai ser lido, e o que vai ser calculado, pois desta maneira podemos definir quais as variáveis serão necessárias para o programa.Valores a serem lidos: número de programas: int Num_progrValores a serem calculados: quantidade de erros: int ErrosComo calcular o Erros? 1o. Programa ---1 Erro

2o. Programa ---2*1=2 Erros3o. Programa ---2*2 = 4 Erros4o. Programa ---2*4=8 Erros

N ésimo programa ---2 (N-1) =Erros.

6.6 Enla6.6 Enlaççamento amento –– Mais ExercMais Exercíícioscios

98

//Programa exercício 10#include <stdlib.h>#include <stdio.h>main(){ int Erro, Cont, Prog ;// Ler o número de programas a ser executado

printf("Digite o numero de programas feitos\n");

scanf("%d",&Prog);

// [Inicializar variáveis]

Erro =1;

Cont = 1;

//[Iniciar laço]

while (Cont<Prog){//4. [Calcular o número de erros]

Erro = Erro * 2;

// [Atualizar contador]

Cont= Cont + 1;

}// fim do laço

printf("Numero de erros cometidos no programa %d=%d\n",Prog,Erro);

system("pause");

}// Fim programa

6.6 Enla6.6 Enlaççamento amento –– Mais ExercMais Exercíícioscios

99

Aplicação 1: Calcular a seqüência de Fibonacci: 1 1 2 3 58 13 ... Para tanto, pode-se utilizar a seguinte fórmula:

F(n)=F(n-1)+F(n-2)

onde: n=0,1,2, 3,...

e F(0) = F(1) = 1Espiral de Fibonacci

6.7 Enla6.7 Enlaççamento amento –– AplicaAplicaçõçõeses

100

Aplicação 2: Dado um valor n escrever o triângulo de pascal correspondente até a n-ésima linha.

Definição 1: Um triângulo de pascal é composto pelos coeficientes cn,k=( )= n!/k!(n-k)! ; onde n é o númeroda linha e k é o número da coluna. Por exemplo, o elemento da linha 3, coluna 2 é dado por:( ) = 3!/(1!*2!) = 3

nk

32

6.7 Enla6.7 Enlaççamento amento –– AplicaAplicaçõçõeses

101

0 1 2 3 4 5 6

5

Os valores do triângulo de Pascal na verdade representamos coeficientes do binômio de Newton.

50( ) 5

1( ) 52( ) 5

5( )53( ) 5

4( )

4 40( ) 4

1( ) 42( ) 4

3( ) 44( )

3 30( ) 3

1( ) 32( ) 3

3( )

2 20( ) 2

1( ) 22( )

1 10( ) 1

1( )

0 00( )

6 60( ) 6

1( ) 62( ) 6

5( )63( ) 6

4( ) 66( )

(x+a)0 = 1

(x+a)1 = 1x + 1a

(x+a)2 = 1x2 + 2xa + 1a2

(x+a)3 = 1x3 + 3x2a + 3xa2 + 1a3

(x+a)4 = 1x4 + 4x3a + 6x2a2 + 4xa3 + 1a4

(x+a)5 = 1x5 + 5x4a + 10x3a2 + 10x2a3 + 5xa4 + 1a5

(x+a)6 = 1 6 15 20 15 6 1

6.7 Enla6.7 Enlaççamento amento –– AplicaAplicaçõçõeses

102

0 1 2 3 4 5 6

0

1

2

3

4

5

6

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1 6 15 20 15 6 1

0 1 2 3 4 5 6

5 50( ) 5

1( ) 52( ) 5

5( )53( ) 5

4( )

4 40( ) 4

1( ) 42( ) 4

3( ) 44( )

3 30( ) 3

1( ) 32( ) 3

3( )

2 20( ) 2

1( ) 22( )

1 10( ) 1

1( )

0 00( )

6 60( ) 6

1( ) 62( ) 6

5( )63( ) 6

4( ) 66( )

Os valores do triângulo de Pascal na verdade representam

os coeficientes do binômio de Newton.

6.7 Enla6.7 Enlaççamento amento –– AplicaAplicaçõçõeses

103

Pode-se obter a Seqüência de Fibonacci a partir do Triângulo de Pascal

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1 6 15 20 15 6 1

1 1

2 3

5 8

13 •••

Para isto, basta somar os elementos da Diagonal

6.7 Enla6.7 Enlaççamento amento –– AplicaAplicaçõçõeses

104

Conceito

Aplicação 3: Escreva um programa que solicite ao usuário o número de alunos uma sala. Depois, de acordo com o

valor da nota de cada aluno, deverá ser atribuído um Conceito de acordo com a seguinte tabela:

Faixa de Valores

9 ≤ Nota ≤ 10

7 ≤ Nota < 9

A

B

5 ≤ Nota < 7 C3 ≤ Nota < 5 D0 ≤ Nota < 3 E

Por fim, deveráser fornecidoo percentualde notas da turma para

cada conceito.

6.7 Enla6.7 Enlaççamento amento –– AplicaAplicaçõçõeses

105

Aplicação 4: Mostrar os resultados da Aplicação 3utilizando um histograma, tal como dado por:

AB

C

DE

Conceito

Núm

ero

A: ****B: ********C: ************D: ****E: **

Saída Programa C

6.7 Enla6.7 Enlaççamento amento –– AplicaAplicaçõçõeses

106

Aplicação 5: A Regra dos Trapézios consiste em aproximar a área debaixo de curva formada por uma função f(x) por um trapézio, como descrito na Figura dada a seguir:

a=x0 b=x1

f(x)p1(x)f(a)

f(b)

Escreva um programa que forneça o valor aproximado de Integrais utilizando a Regra dos Trapézios. Verifique seus resultados para:

))()((2

)( 10 xfxfh

dxxf

b

a

+≅∫

Matematicamente:

∫2

1

2dxxItem(a) Item(b) ∫2

1

3dxx Item(c) ∫

4

1

dxx

onde: h = x1 – x0

6.7 Enla6.7 Enlaççamento amento –– AplicaAplicaçõçõeses

107

Definição: Seja y = f(x) uma função não-negativa definida numintervalo fechado a ≤ x ≤ b. A Área debaixo de f(x) é obtida com:

∑=

→∆∆≅

n

k

kkx

xxfAk 1

0 max)(lim

onde: ∆∆∆∆xk = (b - a)/n

Matematicamente: Geometricamente:

a=x0 b=xn

f(x)

f(a)

f(b)

n = 16

∆∆∆∆xk

∑∫=

→∆∆=

n

k

kkx

b

a

xxfdxxfk 1

0 max)(lim)(

Ou seja:)( kxf

6.7 Enla6.7 Enlaççamento amento –– AplicaAplicaçõçõeses

108

A partir da Regra dos Trapézios descrita anteriormente é possível obter a Regra dos Trapézios Repetida cuja fórmula é dada por:

[ ][ ]∫ ++++≅ −

b

a

mm xfxfxfxfh

dxxf )()(...)(2)(2

)( 110

a=x0 b=x3

f(x)

f(a)

f(b)

x1=h+x0 x2=2h+x0

A1 A2 A3

ATR = A1 A2 A3+ +

ATR =

h = (b - a)/3 = xi – xi-1

h/2*(f(x0)+f(x1))

h/2*(f(x1)+f(x2))

h/2*(f(x2)+f(x3))

+

+

= h/2*(f(x0)+2(f(x1)+f(x2))+f(x3))

6.7 Enla6.7 Enlaççamento amento –– AplicaAplicaçõçõeses

109

Problema: Imagine que uma tarefa deve ser processada elevará 8 anos e que não pode ser movida da máquina uma veziniciada. De acordo com a Lei de Moore deve-se esperar amelhoria dos processadores ou deve-se começar hoje ?

?

6.7 Enla6.7 Enlaççamento amento –– AplicaAplicaçõçõeses

O paradoxo da inovação ���� Lei de Moore: O fundador da Intel,Gordon Moore, constatou que a capacidade de processamento dos computadores dobra a cada 1 ano, enquanto os custos permanecem fixos.

Solução: O senso comum diz que é melhor começar agora, mas antes de por a mão na massa é bom olhar a Tabela dadaa seguir:

!110

6.7 Enla6.7 Enlaççamento amento –– AplicaAplicaçõçõeses

Aplicação 6: Escreva um programa que forneça para o problema do paradoxo da inovação o maior número de anos que se pode esperar

para que o processamento de um tarefa termine o quanto antes.

Tempo Total

(anos)

Tempo deDesenvolvimento

(anos)

Tempo deProcessamento

(anos)

0 8 8

1 4 5

Início

0º. ano

1º. ano

2 2 42º. ano

Final

8º. ano

5º. ano

4º. ano

3 1 43º. ano 4º. ano

4 0,5 4,54º. ano 4º. ano

1111 t [anos]

y(t)

[pro

c.]

4321

5

678

2 3 4 5 6 7 8

t [anos]

y(t) [tempo total]

0

8

1 2 3 4 5 6 7 8

5 4 4 4,5 5,3 6,1 7,1 8,0

9

6.7 Enla6.7 Enlaççamento amento –– AplicaAplicaçõçõeses

112

Forma Geral: O paradoxo da inovação pode ser formulado de acordo com três parâmetros: tempo de desenvolvimento t,taxa de aperfeiçoamento a e tempo inicial de proc. p0.

tty

2

8+= t

a

pty

)/1(

0+=Para t = 1, uma alternativa é ver

se p/(1/a) > 1

Tempo de processamento: p(t)Tempo de

desenvolvimento: t

Na verdade, o critério acimapode ser generalizado para

a seguinte regra: ∆y(t)/∆t ≤ 0

Ou seja, verificar paracada t a variação de y

por diferenças ∆.

6.7 Enla6.7 Enlaççamento amento –– AplicaAplicaçõçõeses

113

0 1 2 3 4 5 6 7 83

4

5

6

7

8

9

t [anos]

y(t)

[an

os]

Gráfico de y(t) = t + p0/(1/a)t

0 1 2 3 4 5 6 7 83

4

5

6

7

8

9

Gráfico de y(t) = t + p0/(1/a)t

t [anos]

y(t)

[an

os]

Função Ideal

0 2 4 6 83

4

5

6

7

8

9

Gráfico de y(t) = t + p0/(1/a)t

t [tempo]

y(t)

[te

mp

o]

Função Real / Valores

Aproximar a funçãopor funções lineares.Supor que a variação

média = variaçãoinstantânea.

6.7 Enla6.7 Enlaççamento amento –– AplicaAplicaçõçõeses

114

y [anos]t [anos] p(t) [anos]

0 8 8

1 4 5

Início

0º. ano

1º. ano

2 2 42º. ano

Final

8º. ano

5º. ano

4º. ano

3 1 43º. ano 4º. ano

4 0,5 4,54º. ano 4º. ano

∆∆∆∆y(t)/∆∆∆∆t∆∆∆∆t=

ti+1-ti

∆∆∆∆y(t)=

pi+1-pi

1

- -

1

- 3 - 3

1

- 1 - 1

0 0

0,5 0,5

1

-

•••••••••••• •••••••••••• •••••••••••••••••••••••• •••••••••••••••••••••••• •••••••••••• ••••••••••••

Ou seja, a partir do 4º ano o valor da diferença ∆é maior que zero e portanto, o 3º ano é a resposta.

6.7 Enla6.7 Enlaççamento amento –– AplicaAplicaçõçõeses

115

Alfabeto original

Aplicação 7: Construir um programa que cifra mensagens digitadas pelo usuário através da cifra de Júlio César (General Romano), tal como dado no exemplo abaixo:

a b c d ... v w x y z

Alfabeto cifrado D E F G ... Y Z A B C

Texto cifrado

Texto original v e n i v i d i v i c i

Y H Q L Y L G L Y L F L

6.6 Enla6.6 Enlaççamento amento –– AplicaAplicaçõçõeses

116

Aplicação 8: Construir um programa que decifra mensagens que foram da cifradas pelo algoritmo daAplicação 7. Para tanto, usar uma Tabela de freqüências:

Y

Z

•••

BC

Letra

Fre

quên

cia

A

a

b

•••

yz

Letra

Fre

quên

cia

x

Alfabeto originalAlfabeto cifrado

6.6 Enla6.6 Enlaççamento amento –– AplicaAplicaçõçõeses

117

Mas, Continua...

Fim do Enlaçamento

Este material foi desenvolvido pelos Profs. Drs.

Aníbal Tavares de Azevedo -UNICAMP e

Cassilda Maria Ribeiro - UNESP