Estruturas de repetição em Pascal Prof. Luis Otavio Alvares INE/UFSC 1 Lógica de programação • ESTRUTURAS DE REPETIÇÃO •para ...até... faça .. •enquanto ... faça .. •repita ... até ... 2 Exemplo Para • Ler 50 números fornecidos pelo usuário e calcular e exibir a média. Pseudocódigo: 1. Início 2. Soma = 0 <<< o acumulador precisa ter um valor inicial 3. Para cont =1 até 50 faça 3.1 ler num 3.2 soma = soma + num 4. Media = soma / cont 5. Mostrar media 6. Fim 3 E se eu quisesse calcular a média de N números? Lógica de programação – Para esse problema construímos um algoritmo que será genérico, ou seja, que poderá ser usado para calcular a média de quantos números se quiser! – Pseudocódigo: 1- Início 2- Mostrar “De quantos valores você quer calcular a média?” 3- Ler QUANT (aqui se descobre quantas repetições) 4- SOMA = 0 5- Para CONT = 1 até QUANT faça 5.1Ler N (aqui é lido cada número, um em cada ciclo) 5.2SOMA = SOMA + N (aqui os valores lidos são acumulados) 6- MEDIA = SOMA / QUANT (isto está fora do loop) 7- Mostrar MEDIA 8- Fim 4 Estruturas de repetição em Pascal 5 Estrutura de repetição: comando for • Comando for for <variável de controle> := <valor inicial> to do <comando>; <valor limite> for <variável de controle> := <valor inicial> downto <valor limite> do <comando>; Um só comando to downto incrementa decrementa +1 -1 6 7 Comando for for <variável de controle> := <valor inicial> to/downto <valor limite> do <comando>; for <variável de controle> := <valor inicial> to/downto <valor limite> do begin <comando 1>; ....... <comando n>; end; O(s) comando(s) será(o) executado(s) até o valor limite (inclusive) O incremento ou decremento é executado automaticamente após a execução do(s) comando(s) 8 Exemplo Program testeFor; var I,K:integer; begin K:= 5; for I := K+1 to K+3 do writeln ('I= ',I); readln; end. Saída I= 6 I= 7 I= 8 9 for <variável de controle> := <valor inicial> to <valor limite> do <comando> valor inicial valor limite expressões • avaliadas somente uma vez, na entrada do comando • resultado deve ser do mesmo tipo da variável de controle variável de controle • integer ou char • pode ser utilizada no comando • pode ser alterada no comando (mas não é recomendável) 10 Exemplo Program testeFor; var I,K:integer; begin k:=8; for I := 5 to K do begin k:=7; writeln('I= ',I ,' end; readln; end. Saída: K= ',k ); I= 5 I= 6 I= 7 I= 8 K= 7 K= 7 K= 7 K= 7 11 Exemplo Program Letras; var Letra: char; begin for Letra := 'a' to 'z' do write (Letra,' '); writeln ('Fim'); readln; end. Saída: a b c d e f g h i j k l m n o p q r s t u v w x y z Fim 12 Exercício Escrever um programa que lê 5 valores, e conta quantos destes valores são negativos, escrevendo esta informação. program conta_negativos; var numero, cont, neg:integer; Begin Neg:=0; for cont:=1 to 5 do begin write('Digite um numero inteiro: '); readln (numero); if numero<0 then neg:=neg+1; end; writeln ('O numero de valores negativos eh ', neg); readln; end. 13 Cuidado!!! • Se o valor da variável de controle do comando for for alterado explicitamente dentro do bloco de repetição … • Exemplo: saída: program teste_for; var I:integer; begin for I:=1 to 10 do begin writeln('I= ',I); if I=5 then I:=8; end; readln; end. I= I= I= I= I= I= I= 1 2 3 4 5 9 10 14 Lembre-se!!! Qual o valor da variável de controle do for após a execução do comando for? Exemplo: saída: program teste2_for; var I:integer; begin for I:=1 to 10 do writeln('I= ',I); writeln('Valor de I apos o for: ',I); readln; end. I= 1 I= 2 I= 3 I= 4 I= 5 I= 6 I= 7 I= 8 I= 9 I= 10 Valor de I apos o for: 10 15 Só use quando estritamente necessário: E para forçar o término da repetição? Use um break. Exemplo : program teste3_for; var I:integer; begin for I:=1 to 10 do begin writeln('I= ',I); if i=5 then break; end; writeln('Valor de I apos o for: ',I); readln; end. saída: I= 1 I= 2 I= 3 I= 4 I= 5 Valor de I apos o for: 5 Atenção para o valor de saída da variável de controle 16 Cuidado!! • Faça sempre um teste de mesa com os valores inicial e final do loop do comando for, pois a maioria dos erros são na primeira ou na última execução do laço. • Erros comuns: – Executar o laço (repetição) uma vez a mais ou a menos que o desejado – Atribuir o valor inicial de alguma variável dentro do laço, quando deveria ser fora – Não atribuir o valor inicial de uma variável (principalmente em for s aninhados) 17 Comando de repetição para número fixo de repetições • número conhecido For I := -10 to 10 do Writeln(I); • número desconhecido Readln ( N ); For I := 1 to N Do begin readln ( Nome ); Writeln ( Nome ); end; 18 Exercício • Faça um programa para calcular e escrever o valor de S: S 1 3 5 7 99 ... 1 2 3 4 50 var I:integer; S:real; Begin S:=0; for I:=1 to 50 do S:=S+(I*2-1)/I; writeln(S:1:6); readln; end. 19 exercício • Escreva um programa Pascal para informar o fatorial de um número lido. 20 Exemplo de solução: fatorial Program Fatorial; var num, Fat, I : integer; begin write('informe um numero positivo: '); readln(num); if num <=0 then writeln('o numero deve ser positivo') else begin Fat := 1; for I:= 2 to num do Fat := Fat * I; writeln ( 'Fatorial de ',num,' = ' , Fat); end; readln; end. 21 • Faça um programa para calcular os números primos menores que 100 22 program primos; var n,I:integer; ehprimo:boolean; begin for n:=2 to 99 do begin ehprimo:=true; for I:=2 to n-1 do if (n MOD I)=0 then ehprimo:=false; if ehprimo then writeln(n,' eh primo'); end; readln; end. 23 Exercício Faça um programa para ler 500 valores e informar o maior e sua posição 24 Program MaiorEPosicao ; var N: real; { lido } Maior: real; { guarda o maior lido } Posicao: integer; { posicao do maior dos lidos } K: integer; { variavel de controle do for } begin readln(N); maior:=N; { por enquanto o primeiro é o maior } Posicao := 1; for K := 2 to 500 do begin O que acontece se readln(N); entre os números lidos if N >= Maior existem valores iguais? then begin Maior := N; Posicao := K; end; end; { do comando for } writeln('Maior lido: ', Maior:5:1, ' na posicao ', Posicao); readln; end. 25 Comandos for aninhados saída ... for K := 1 to 3 do begin readln (N); for L := 1 to N do writeln(L); end; ... ... for K := 1 to 5 do for L := 1 to 3 do writeln(‘K=‘,K, ‘L=‘,L); ... K=1 L=1 K=1 L=2 K=1 L=3 K=2 L=1 K=2 L=2 K=2 L=3 K=3 L=1 K=3 L=2 K=3 L=3 K=4 L=1 K=4 L=2 K=4 L=3 K=5 L=1 K=5 L=2 K=5 L=3 26 Comando while Pseudo-linguagem Pascal enquanto <condição> while <condição> faça <comando > do <comando > Um só comando 27 Exemplo 1: var a:integer; begin a := 1; while (a < 5) do a := a + 1; writeln('Valor de a = ', a); readln; end. Saída: Valor de a = 5 Obs. 1) a variável de controle de término a, neste caso, também PRECISOU ser inicializada! Obs. 2) neste caso, o corpo do while tem apenas 1 comando, a:= a +1 ! Exemplo 2: ... k := 1; while k < 4 do begin writeln(‘Iteracao: ‘, k); k:= k +1; end; ... Comando Composto Obs.1: a variável de controle de término k, neste caso, foi inicializada com k:=1! Obs.2: como o corpo do WHILE tem 2 comandos, precisa-se usar o comando composto Begin....End. Exemplos ... A := 1; while A < 5 do A:= A + 1; writeln(A); ... ... A := 10; B := 4; while A – 2 > B + 1 do begin writeln(A, ' ', B); A := A - 1; end; ... ... A:= 1; while A <= 5 do begin writeln(A); A := A + 1; end; ... ... A := 0; while A < 5 do begin A := A + 1; writeln(A); end; ... O comando while ... • Conclusão – A variável ou variáveis que fazem parte da condição de término deverão ter seu valor atribuído através de um comando de leitura ou de atribuição • Antes da estrutura de repetição while e • Dentro da estrutura Utilização de variável boolean Exemplos ... Segue := true; while Segue do begin readln(A); if A <> 0 then writeln(A) else Segue := false end; ... S := 0; readln(A); while A <> 0 do begin writeln(A); S := S + 1; readln(A) end; writeln(S); ... ... Parar := false; while not Parar do begin readln(A); if A <> 0 then writeln(A) else Parar := true end; ... ... • 1a vez que testa A já deve ter um valor • S informa quantos valores foram lidos Ex: Escreva um programa que leia o nome e as 3 notas dos alunos de uma classe e mostre o nome do aluno seguido da sua media. O programa deverá deverá ser encerrado quando o nome for igual a ‘ZZZ’. VAR nome:string; cont:integer; media, nota, soma:real; BEGIN write('Digite o nome do aluno. (ZZZ para encerrar): '); readln(nome); while nome<>'ZZZ' do begin soma:=0; for cont:=1 to 3 do begin write ('Digite nota: '); readln (nota); soma:=soma+nota; end; media:=soma/3; writeln('A media do aluno ',nome,' eh ', media:1:2); writeln('Digite o nome do aluno. (ZZZ para encerrar): '); readln(nome); end; readln; END. Estruturas de repetição •para ... faça .. •enquanto ... faça .. •repita ... até ... Comando repeat Pseudo-linguagem repita <comandos > até <condição> Pascal repeat <comandos > until <condição> vários comandos Exemplos ... ... Achou := false; repeat readln(Nome); writeln(Nome); if Nome = ‘Ana Terra’ then Achou := true until Achou; A := 0; repeat A := A + 1; writeln(A) until A = 10; ... ... ... repeat readln(Nome); writeln(Nome); writeln(‘Outro ? (s/n) ’); readln(Resposta) until (Resposta=‘n’); ... Exercício Faça um programa Pascal que leia 10 valores positivos e informe o maior deles. Valores não positivos devem ser ignorados. var I:integer; maior,N:real; begin maior:=0; for I:=1 to 10 do begin repeat write('forneca o ', I, '. numero positivo: '); readln(N); if not(N>0) then writeln('numero invalido!!'); until N>0; if N>maior then maior:=N; end; writeln('o maior numero fornecido foi: ',maior:1:3); readln; end. 37 Diagramas de sintaxe Comando while WHILE Expressão lógica DO comando Comando repeat REPEAT Comandos Separados por ; Comandos Separados por ; UNTIL Expressão lógica Comando ;