existem situações em quem uma operação ou uma série de 6 ... · a semelhança estásomente no...
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