1 1
Unesp – Campus de Guaratinguetá
Curso de Programação Computadores
Prof. Aníbal Tavares Profa. Cassilda Ribeiro
6 - A Lógica da Programação 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
2. Laços Controlados por Entrada Entrada controlada por contador Entrada controlada por sentinela 3. Laços Contados
A seguir será visto em detalhe cada um desses laços.
3
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 é 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
5
Graficamente:
1
3 3 7
Solução/Algoritmo:
4 ←←←← 7 - 3
4 > 3 V
1 ←←←← 4 - 3
1 > 3 F
1
7 > 3 V
r ←←←← 6.1 Enlaçamento: Laços Condicionais
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
Algoritmo resto
Escreva(“Digite a e b”) Leia(a,b);
Enquanto (b > a) faça b ← b – a;
fim enquanto r ← b;
Escreva(“resto=”, r);
Solução/Algoritmo:
b ←←←← b - a
b > a V
b ←←←← b - a
b > a F
b > a V
b r ←←←←
Resto da divisão: b a
r 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 a
r 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
6.1 Enlaçamento: Laços Condicionais
Exemplo 1: Faça um algoritmo que calcule o fatorial de um valor lido. As variáveis N, Produto e Multiplicador são do tipo inteiro
Idéia:
1! = 1 2! = 2 *1!
1 2*1 1
2
••• ••• •••
(n-1)! = (n-1)*(n-2)! n-1 (n-1)*•••*1
i prod
Fatorial
n! = n*(n-1)! n n*(n-1)*•••*1
9
Exemplo 1: 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_N
Variáveis: N, Produto, Multiplicador : Inteiro.
Início
1. [Ler dados]
Escreva (“ Digite o numero para se calcular o fatorial”) Leia (N)
2. [Inicializar variáveis]
Produto 1
Multiplicador N Continua
3. [Estabelecer o laço]
6.1 Enlaçamento: Laços Condicionais
10
3. [Estabelecer o laço]
Enquanto (multiplicador ≥ 1) faça Inicio
3.1. [Calcular o produto parcial]
Produto Produto * Multiplicador 3.2 [Reajustar o multiplicador]
Multiplicador Multiplicador – 1 Fim enquanto
4. [Imprimir resultado]
Escreva (´Fatorial de`, N, ´=`, Produto) 5. [Terminar]
Fim
6.1 Enlaçamento: Laços Condicionais continuação do exemplo 1
11
6.1 Enlaçamento: Laços Condicionais
Exemplo 2: Fazer um algoritmo que calcule e imprima a soma dos quadrados dos 100 primeiros números inteiros.
Algoritmo Soma_quadrados Variáveis: soma, número, N : inteiro Início
1. [Inicializar variáveis]
soma ←0 número ← 1
Escreva (´”Quantos números você quer somar?”)
Leia (N) Continua
12
2. [Somar os números]
Enquanto (número<=N) faça Início enquanto
soma soma + (número ↑ 2) número número + 1
Fim enquanto
3. [Imprimir resultado]
Escreva (´O valor da soma é:`, soma) Fim algoritmo
continuação do exemplo 2
6.1 Enlaçamento: Laços Condicionais
13
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 V comandos
While (condição) 6.1.1 Laços Condicionais - Comando Comando whilewhile
14
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:
6.1.1 Laços Condicionais -
-
Comando whileComando
whileObservaçã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).
15
O comando whileaparentemente é 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 whilee o if é a seguinte:
O comandowhileavalia 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 ifavalia a condição. Se ela for verdadeira ele executa o comando ou bloco de comandos somente uma vez. O comando ifnão fica repetindo a mesma ação.
6.1.1 Laços Condicionais -
-
Comando whileComando
while16
OBS: 1- Do mesmo modo que no comando if,a condição do comando while, deve sempre ser colocada entre parênteses.
2- O comandos de um laço também são chamados de corpo do laço.
Diferen
Diferençça entre o comando if e o a entre o comando if e o whilewhile -Fluxograma -Fluxograma
F
condição V comandos
while (condição)
F
condição V comando1
if (condição) 6.1.1 Laços Condicionais -
-
Comando whileComando
while17
Algoritmo Resto
Leia(a,b);
Enquanto (b > a) faça b ← b – a;
fim enquanto
Escreva(“resto= “, b);
6.1.1 Laços Condicionais -
-
ComandoComando
whilewhileComando while para calcular o resto da divisão inteira
F
b - a V b←←←←b-a;
Início
b Início
18
Algoritmo Resto
Leia(a,b);
Enquanto (b > a) faça b ← b – a;
fim enquanto
Escreva(“resto= “, b);
6.1.1 Laços Condicionais - Comando
Comando
whilewhileComando 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);
}
19
6.1.1 Laços Condicionais - Comando
Comando
whilewhileComando while para evitar repetição de comandos Problema Cansativo
Deseja-se mostrar a seguinte figura na tela:
*
*
*
*
*
Construir um programa que realize isto.
Programa Cansativo
#include <stdio.h>
main() {
printf(“*\n”);
printf(“*\n”);
printf(“*\n”);
printf(“*\n”);
printf(“*\n”);
}
20
6.1.1 Laços Condicionais -
-
ComandoComando
whilewhileComando while para evitar repetição de comandos Programa 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 Cansativo
21
6.1.1 Laços Condicionais - Comando
Comando
whilewhileComando while para evitar repetição de comandos Programa 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=6 6 i<=5 (f) - -
22
Algoritmoimprime_inteiros Variáveis: i inteiro.
Inicio algoritmo i←1.
Enquanto( i 20) faça inicio
escreva ( i ).
i ← i + 1.
fim
Fim algoritmo
≤
Ex1- 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 programa inti=1;
While (i <= 20)
{ //inicio do while printf(“%d \n”, i);
i=i+1;
} //fim do while system(“pause”);
}//fim programa
6.1.1 Laços Condicionais - ComandoComandowhile -while -ExerciciosExercicios
23
No exercício 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 seria eternamente verdadeira.
6.1.1 Laços Condicionais: ComandoComandowhilewhile -- Exercícios
24
Ex2- Escreva um
algoritmo e um programa em C que dado um
Número qualquer, seja calculado e impresso a tabuada desse número.
Algoritmo tabuada
Variáveis: i,n, resp: inteiro.
Inicio algoritmo
escreva (“Qual tabuada deseja imprimir”)
Leia (n) i←1.
Enquanto( i 10) faça inicio
resp← n * i escreva ( resp ).
i ← i + 1.
fim
Fim algoritmo
≤
6.1.1 Laços Condicionais: ComandoComandowhilewhile -- Exercícios
25
//exercicio 2 - prog tabuada
#include <stdio.h>
#include <stdlib.h>
main()
{ // inicio programa inti, n, resp;
i=1;
printf(“Qual tabuada vc deseja?”);
scanf(“%d”,&n);
While (i <= 10)
{ //inicio do while resp=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.1 Laços Condicionais: ComandoComandowhilewhile -- Exercícios
26
Ex3: 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
6.1.1 Laços Condicionais: ComandoComandowhilewhile -- Exercícios
Algoritmoserie01
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 . . .
27
6.1.1 Laços Condicionais: ComandoComandowhilewhile -- Exercícios
//Programa Exercicio3
#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");
}
28
6.1.1 Laços Condicionais - ComandoComandowhile: while: LaçLaços infinitosos infinitos
Laços infinitos – Cuidado ! Os laços infinitos ocorrem
quando a condição lógica do while não se torna
falsa por 2 motivos:
(i) Erro de atualização da variável associada a
condição lógica (ii) A condição lógica é
inadequada.
29
6.1.1 Laços Condicionais - ComandoComandowhile: while: LaçLaços infinitosos infinitos
Laços infinitos – Cuidado !
Programa Infinito
#include <stdio.h>
main() {
int i;
i = 1;
while (i <= 5) printf(“*\n”);
F }
i <= 5 V
Início
“\n”
Início
Fluxograma Infinito
30
6.1.1 Laços Condicionais - ComandoComandowhile: while: LaçLaços infinitosos infinitos
Laços infinitos – 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=1
6 ••• ••• •••
P3
31
6.1.1 Laços Condicionais - ComandoComandowhile: while: LaçLaços infinitosos infinitos
Laços infinitos – 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;
}
32
Ex4: 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 contadorse mantém sempre = 0.
a) contador Ø;
total Ø;
Enquanto (contador ≥0) faça total total + 2;
6.1.2 Enlaçamento: Laços Condicionais – Mais Exercícios
33
c) total ←0;
index←15;
Enquanto (index ≤15) faça total ←total + 1;
index←index – 1;
Não fecha, pois a variávelindexserá sempre < 15. O laço fecharia se fizéssemos
index←index + 1;
6.1.2 Enlaçamento: Laços Condicionais – Mais Exercícios
b) contador 0;
total 0;
Enquanto (contador <= 10) faça total total + 1;
contador contador + 1;
Termina quando contador = 11
34
6.1.2 Enlaçamento: Laços Condicionais – Mais Exercícios
Ex5: Fazer um algoritmo/programa que imprima os números ímpares entre 1 e m.
Algoritmoimprime_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()
{ intm, i=1;
printf(“Entre com m:”);
scanf(“%d”,&m);
while(i <= m) { //Início while
if (i % 2 == 1) //Ímpar?
printf(“%d \n”, i);
i=i+1;
} //fim do while system(“pause”);
}//fim programa
35
6.1.2 Enlaçamento: Laços Condicionais – Mais Exercícios
// Programa Números Ímpares.
main()
{ intm, i=1;
printf(“Entre com m:”);
scanf(“%d”,&m);
while(i <= m) { //Início while
if (i % 2 == 1) //Ímpar?
printf(“%d \n”, i);
i=i+1;
} //fim do while system(“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
P3 P4
P4 i=2 i=3 - Programa em C
1
Resultado na Tela
36
6.1.2 Enlaçamento: Laços Condicionais – Mais Exercícios
Ex5: Fazer um algoritmo/programa que imprima de 1 até m apenas os números ímpares (outra versão !).
Algoritmoimprime_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()
{ intm, i=1;
printf(“Entre com m:”);
scanf(“%d”,&m);
while(i <= m) { //Início while
printf(“%d \n”, i);
i=i+2; // Incremento ! } //fim do while
system(“pause”);
}//fim programa
Só percorre ímpares!
37
6.1.2 Enlaçamento: Laços Condicionais – Mais Exercícios
// Programa Números Ímpares.
main()
{ intm, i=1;
printf(“Entre com m:”);
scanf(“%d”,&m);
while(i <= m)
{ //Início while printf(“%d \n”, i);
i=i+2; // Incremento !!!!
} //fim do while system(“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) - -
38
6.1.2 Enlaçamento: Laços Condicionais – Mais Exercícios
Ex6: Fazer um algoritmo/programa que imprima apenas os m primeiros números pares.
Algoritmoimprime_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()
{ intm, k, i; i = 1; k = 1;
printf(“Entre com m:”);
scanf(“%d”,&m);
while(k <= m) { //Início while
if (i % 2 == 0) //Par?
{printf(“%d \n”, i);
k = k + 1;
} i=i+1;
} //fim do while system(“pause");
}//fim programa
39
6.1.2 Enlaçamento: Laços Condicionais – Mais Exercícios
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()
{ intm, k, i; i = 1; k = 1;
printf(“Entre com m:”);
scanf(“%d”,&m);
while(k < =m) { //Início while
if (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) - - - -
40
6.1.2 Enlaçamento: Laços Condicionais – Mais Exercícios
Ex7: 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 soma
0 0 0
1 1 1
2 2 3
3 3 6
••• ••• •••
41
6.1.2 Enlaçamento: Laços Condicionais – Mais Exercícios
Ex8: Dado um valor m, calcular a soma de 1 até m.
AlgoritmoCalculaSoma 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 intm, 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 while
printf(“Soma=%d”,soma);
}//fim programa
Programa em C
42
6.1.2 Enlaçamento: Laços Condicionais – Mais Exercícios Ex9: Fazer um algoritmo que calcule e imprima a soma dos
quadrados dos 100 primeiros números inteiros.
Algoritmo Soma_quadrados Variáveis: soma, número, N :
inteiro;
Início
1. [Inicializar variáveis]
soma ←0.0;
número ←1;
Escreva (´”Quantos números você quer somar?”);
Leia (N);
2. [Somar os números]
Enquanto (número<=N) faça Início enquanto
soma soma + (número ↑ 2);
numero numero + 1;
Fim enquanto 3. [Imprimir resultado]
Escreva (´O valor da soma é:`, soma);
Fim algoritmo
43
// Programa Soma Números Inteiros
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
main() {
intN, soma,contador;
//1. [Ler quantidade de inteiros a ser somado]
printf("Digite quantos inteiros vc deseja somar ");
scanf("%d", &N);
//2. [ Inicializar variáveis]
contador =1;
soma = 0;
while(contador <= N) { //Inicio while
soma = soma + pow(contador,2); // soma dos quadrados dos inteiros]
contador= contador + 1; //Reajustar contador
} //Fim while continua ...
Código em
C
6.1.2 Enlaçamento: Laços Condicionais – Mais Exercícios
44
//4. [ Imprimir resultados]
printf (" A soma dos quadrados dos %d primeiros numeros eh: %d\n",N, soma);
system("PAUSE");
}
. . . continuação
6.1.2 Enlaçamento: Laços Condicionais – Mais Exercícios
45
Exemplo 10: Dado um valor m, calcular 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 prod
0 1 1
1 1 1
2 2 2
3 3 6
••• ••• •••
6.1.2 Enlaçamento: Laços Condicionais – Mais Exercícios
46
Exemplo 10: Dado um valor m, calcular produto de 1 até m.
AlgoritmoCalculaProd 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 programa inti=1, prod=1;
printf(“Valor de m:”);
scanf(“%d”,&m);
while(i < m) { //inicio do while
i=i+1;
prod = prod*i;
} //fim do while
printf(“Produto=%d”,prod);
system(“pause”);
}//fim programa
Programa em C 6.1.2 Enlaçamento: Laços Condicionais – Mais Exercícios
47
2. Laços Controlados por Entrada
Através de um laço apropriado, é possível ler
conjuntos de dados adicionais e repetir o algoritmo.
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:6.2 Enlaçamento: Laços Controlados por Entrada
48
a) Entrada controlada por contador
Introduz-se um dado adicional no início do conjunto de dados. Este dado adicional fornece o número de conjuntos de valores que deve ser fornecido aseguir, informando assim, o número de vezes que o laço é repetido. Uma variável contadoracontrola o número de vezes que o laço deve ser repetido
6.2.1 Enlaçamento: Entrada controlada por contador
49
Exemplo 11:Faça um algoritmo 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_estudantesindica 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.
6.2.1 Enlaçamento: Entrada controlada por contador
50
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.2.1 Enlaçamento: Entrada controlada por contador
51
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.2.1 Enlaçamento: Entrada controlada por contador
52
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.2.1 Enlaçamento: Entrada controlada por contador
53
//Prog01_Lacos - Exemplo 11 //usando laços com contador
#include <stdlib.h>
#include <stdio.h>
main() {
floatLab, Exame_inter,Exame_final;
floatMedia;
intn_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.2.1 Enlaçamento: Entrada controlada por contador
54
//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.2.1 Enlaçamento: Entrada controlada por contador
55
//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 Aprovado\n”);
else printf(“\tAluno Reprovado\n”);
//3.4. Atualizar o contador de registros realmente processados contador= contador +1;
} // Fim enquanto system("pause");
}
6.2.1 Enlaçamento: Entrada controlada por contador
56
b) Entrada 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 12:Refazer o exemplo anterior, considerando que no final dos dados a respeito dos alunos foi inserido um dado extra com o numero do aluno igual 0. Quando for lido o número 0 para um aluno, o programa deve parar de calcular as médias.
6.2.2 Enlaçamento: Entrada controlada por sentinela
57
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 teste condicional possa ser executado.
6.2.2 Enlaçamento: Entrada controlada por sentinela
58
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 teste condicional possa ser executado com o novo dado.
6.2.2 Enlaçamento: Entrada controlada por sentinela
59
//Usando Laços com sentinela
#include <stdlib.h>
#include <stdio.h>
main() {
floatLab, Exame_inter,Exame_final;
floatMedia;
intn_estudante,Nmatric;
// 1.Entrar com dados do primeiro aluno printf("digite o numero do 1o. aluno: ");
scanf("%d",&Nmatric);
Código em C
6.2.2 Enlaçamento: Entrada controlada por sentinela
60
// 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.2.2 Enlaçamento: Entrada controlada por sentinela
61
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.2.2 Enlaçamento: Entrada controlada por sentinela
62
Fazer um algoritmo e um programa em C para calcular h(n)=1+1/2+1/3+...+1/n, onde n é um valor a ser lido.
Algoritmo serie_h;
variaveisn: integer;
h: real;
inicio
escreva(‘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.2.3 Enlaçamento:
6.2.3 Enlaçamento: Laços Controlados por Entrada :Mais ExercíciosMais Exercícios
63
//Programa serie versão1
#include <stdlib.h>
#include <stdio.h>
main() {
intn;
floath;
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.2.3 Enlaçamento:
6.2.3 Enlaçamento: Laços Controlados por Entrada :Mais ExercíciosMais Exercícios
64
//Programa serie versão 2
#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.2.3 Enlaçamento:
6.2.3 Enlaçamento: Laços Controlados por Entrada :Mais ExercíciosMais Exercícios
65
Linguagem Algorítmica Faça
comandos enquanto<condição>
6.2.4 Enla
6.2.4 Enlaççamento: Laamento: Laçços Condicionaisos Condicionais - Teste no FinalTeste 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 condição V
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.2.4 Enla
6.2.4 Enlaççamento: Laamento: Laçços Condicionaisos Condicionais - Teste no FinalTeste no Final
67
Exemplo 22:Fazer um programa em C para calcular h(n)=1+1/2+1/3+...+1/n, usando o comando do_while
#include <stdlib.h>
#include <stdio.h>
main() {
intn;
floath;
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.2.4 Enla
6.2.4 Enlaççamento: Laamento: Laçços Condicionaisos Condicionais - Teste no FinalTeste 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:
Exemplo23: Para ID ←1, 2, .., 10 faça valor ←valor + 2
Neste exemplo a variável de controle do laço é ID.
A variável IDcomeç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.3 Enla
6.3 Enlaççamento: amento: Laços Contados Parei aqui a correção
69
Exemplo 24: Para val←1, 2, .., N faça
Exemplo 25: Para Index←10, 9,..,1 faça
Neste exemplo a variável de controle do laço é val.
A variável valcomeça valendo 1 e é automaticamente
incrementada de 1 a cada vez, até o valor de N. Então este laço se repete Nvezes
Neste exemplo a variável de controle do laço é Index.
A variável Indexcomeça valendo 10 e é decrementada de 1 a cada volta do laço, até que o valor de Indexseja 1. Este laço se repete 10 vezes.
6.3 Enla
6.3 Enlaççamento: amento: Laços Contados
70
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 0
Para Index = 1, 2, .., 10 Var Var + 1;
Escreva ( Var )
b) Var 0
Para Index = 4, 8, .., 36 Var Var + 1;
Escreva ( Var )
Var = 9
6.3.1 Enla
6.3.1 Enlaççamento: amento: Laços Contados: Exercícios
71
c) Var 0
Para Index = 10, 9,.., 1 Var Var + 1 IndexIndex + 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 0
Para Index = 1, 2,..,15 Para Index2 = 1, 2,.., 8
Var Var + 1 Escreva ( Var )
Var = 120
6.3.1 Enla
6.3.1 Enlaççamento: amento: Laços Contados: Exercícios
72
Algoritmo Potência Variáveis Potência : inteira Início
1. [Calcular e imprimir]
ParaPotência 1, 2, .., 20 faça Escreva ( 2 ↑Potência );
2. [Terminar]
Fim
Exemplo 26: Fazer um algorítmo que calcule e imprima as primeiras 20 potências de 2.
Atenção este algorítmo pode ser generalizado
Início
1. [Ler número de dados]
Leia ( N )
2. [Calcular e imprimir os N valores]
ParaPotência 1, 2, .., N faça Escreva ( 2 ↑ Potência);
3. [Terminar]
Fim 6.3.1 Enla
6.3.1 Enlaççamento: amento: Laços Contados: Exercícios
Não Válido 73
Laços Encaixados
Assim como temos uma construção “Se_Então_Senão”
dentro da outra, podemos ter um laço dentro do outro.
Exemplos de laços embutidos válidos e não válidos.
Válidos Válidos
6.4 Enla
6.4 Enlaççamento amento ––LaçLaços Encaixadosos Encaixados
74
Escreva um algoritmo e um programa em C que para um dado número mqualquer, seja calculado e impresso todas as tabuadas até esse número.
Problema Tabuada 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
•••
j = 1, 2, ..., m i = 1, 2, ..., 10
resp = i*j 6.4 Enla
6.4 Enlaççamento amento ––LaçLaços Encaixados os Encaixados --ExercExercíciosícios
75
Escreva um algoritmo e um programa em C que dado um número m qualquer, seja calculado e impresso todas as
tabuadas até esse número.
Problema Tabuada Algoritmotabuada2
Variáveis: i,n, resp: inteiro.
Inicio algoritmo Leia (n);
j←1;
Enquanto(j <= n) início
i←1;
Enquanto( i <= 10) faça início
resp← j * i;
escreva ( resp );
i ← i + 1;
fim j ← j + 1;
fim
Fim algoritmo Para cada valor de j executa 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.4 Enla
6.4 Enlaççamento amento ––LaLaçços Encaixados os Encaixados ––ExercíExercícios cios ––Comando whileComando while
76
//prog tabuada2
#include <stdio.h>
#include <stdlib.h>
main()
{ // inicio programa inti, n,j, resp;
i=1;
printf("Ate qual tabuada vc deseja?");
scanf("%d",&n);
j=1;
while (j <= n) { // início 1o. while
printf("\t\ntabuada do numero %d\n", j);
i=1;
while( i <= 10)
{ // início 2o. while resp = j * i;
Programa em Linguagem C
6.4 Enla
6.4 Enlaççamento amento ––LaçLaços Encaixados os Encaixados --ExercExercíciosícios
77
printf("\t%2d*%2d=%2d\n", j,i,resp);
i = i + 1;
} // fim 2o. while j = j + 1;
} //fim 1o. while system("pause");
} // fim programa
Continuação prog tabuada2 …
6.4 Enla
6.4 Enlaççamento amento ––LaçLaços Encaixados os Encaixados --ExercExercíciosícios
78
Linguagem Algorítmica Enquanto <i; cond; i++>
Faça
comandos;
Existe um outro 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.3.1 Enla
6.3.1 Enlaççamento: amento: Laços Contados: Comando FOR