330 likes | 474 Views
Universidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM Programação de Computadores I – BCC701 www.decom.ufop.br/moodle. Aula 05 Comandos de Repetição while. Andréa Iabrudi andrea.iabrudi@iceb.ufop.br. O que vimos até agora. Alguns tipos de dados básicos:
E N D
Universidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM Programação de Computadores I – BCC701 www.decom.ufop.br/moodle Aula 05Comandos de Repetiçãowhile Andréa Iabrudi andrea.iabrudi@iceb.ufop.br
O que vimos até agora • Alguns tipos de dados básicos: • numéricos: integer, float(simple, double), complex • lógico • string (sequência de caracteres) • Expressões • numéricas • lógicas x^(2*y) – sqrt(3.7*%pi) x < 3 & (y > 10 | y < -1)
O que vimos até agora • Variáveis • área de memória que armazena algum dado e é referenciada por meio de um nome • Comando de Atribuição • Comandos de Desvio x = x+3^(2*y) ifx < 2 then z = 2*x elseifx == 2 | x == 3 then z = x +10 elseif x>10 & x<30 then z = x * 5 else z = 46 end
O que vimos até agora • Matrizes e vetores • Indexação de matrizes • Operações e funções sobre matrizes M = [3, 4; 1 2] M(2,1) = M(1,2) + 10 M(2,:) = M(1,:) + M(:,2) x = sum((M .* [1, 2; 2, 1]) ^ 2)
Exemplo1 • O pH de uma solução aquosa é medido por sua acidez. A escala do pH varia entre 0 e 14, inclusive. Uma solução como pH igual a 7 é dita neutra; uma solução com o pH maior que 7 é dita básica; e uma solução com o pH menor que 7 é dita ácida. Escreva um programa que leia o pH de uma solução e imprima se a solução é neutra, básica ou ácida. O programa deve testar se o valor fornecido como entrada é um valor válido, isto é, se está no intervalo fechado [0,14].
Exemplo 1 - solução Se o usuárioerraraodigitar o valor do PH, elenãoterá chance de corrigirseuerro, fornecendo um novo valor Queremosmodificar o programa de modoque, se o valor fornecidonão for válido, o usuáriopossadigitarnovamente um valor, atéquedigiteum valor válido.
Comandos de repetição • Vamosprecisar de um comando de repetição • A digitação de um novo valor devesersolicitada, enquanto o valor digitadoanteriormentenão for válido.
Validando o valor de entrada ph = input(“Informe o PH da solução: ”) whileph<0 | ph>14 printf(“pH inválido: deveser de 0 a 14”) ph = input(“Informe o PH da solução: ”) end
O Comando while • while <condição> • <bloco while> • end • Execução do comando while: • primeiro, a condiçãoéavaliada • se a condição for verdadeira, então o bloco de comandosdentro do while éexecutado, e volta-se aopasso 1. • se a condição for falsa, o comando while termina, e a execuçãoprossegue a partir do comandoimediatamentesubsequenteaocomando while. UFMG DCC001 2013-1
Comandowhile: Quevaloressãoimpressospeloseguintetrecho de programa? x = 1 while x < 5 printf('x = %g',x) x = x + 1 end x = 1 x = 2 x = 3 x = 4
Comandowhile: Loops infinitos Quandoeste loop iráparar? Semintervenção, nunca. Cuidado com o uso de while! x = 1 while x < 10 printf('x = %g',x) x = x - 1 end
Exemplo 2 – Máximo Divisor Comum • MDC(a,b) ondea e bsãointeiros • MDC(a,b)é o maiorinteirogque divide a e b • Istoé, a = g.m e b=g.n, ondem,nsãointeiros, e, paratodointeirocque divide a e b, temosquec divide g • Exemplo: MDC(21,12) = 3 • Se MDC(n,m) = 1, m e n sãoditosprimos entre si. Ex: MDC(9,5) = 1
MDC – Como calcular? • Algoritmode Euclides: • criadoem 300 A.C., e emusoatéhoje! • Idéia: • mdc(a,a) = a • se a > b, mdc(a,b) = mdc(a-b,b) • se b > a, mdc(a,b) = mdc(a, b-a) • Método: • se a = b, o mdc(a,b) é igual a a (ou a b) • senão, substituir o maiorpeladiferença entre o maior e o menor e repetir o processo, atéqueosdoisvaloressejamiguais (istoé, atéque a=b)
Laço para Cálculo do Máximo Divisor Comum - - - - - - Em cada passo, o maior entre a e b é substituído pela diferença entre a e b Valores iniciais colocados na preparação do loop O loop termina quando a = b
Laço para Cálculo do Máximo Divisor Comum - - - - - - Em cada passo, o maior entre a e b é substituído pela diferença entre a e b Valores iniciais colocados na preparação do loop O loop termina quando a = b
MDC – Implementação • Método: • se a = b, o mdc(a,b)éigual a a (ou a b) • senão, substituir o maiorpeladiferença entre o maior e o menor e repetir o processo, atéqueosdoisvaloressejamiguais (istoé, atéque a=b) a e b devem ser inicializados antes do loop Qual deve ser a condição? • while <condição> • <bloco while> • end Como deve ser o corpo do loop? UFMG DCC001 2013-1
O ProgramaEuclides.sce m = input("m = "); n = input("n = "); a = m; b = n; while a <> b if a > b then a = a-b; else b = b-a; end end printf("mdc(%g,%g) = %g",m,n,a) UFMG DCC001 2013-1
Algoritmo de EuclidesMais um exemplo Subtrações sucessivas podem ser feitas por divisão
Euclides.scemaiseficiente m = input("m = "); n = input("n = "); a = m; b = n; while b <> 0 aux = b b = modulo(a,b); a = aux; end printf("mdc(%g,%g) = %g",m,n,a) Porque não é necessário determinar qual, a ou b, é maior? UFMG DCC001 2013-1
Algoritmo de EuclidesDe novo Em Scilab, omdcde dois números a e b pode ser calculado usando-se a função pré-definida gcd, do seguinte modo: gcd(uint8([ab]))
Exemplo 3 – Pesquisaemtabela I • Suponhaquetemosumatabela com notasfinais de alunos, no seguinteformato: • Queremosconstruir um programaqueleia a matrícula de um aluno e informesua nota matrícula nota …
Representação da tabela de notas • A tabelaérepresentada no programacomoumamatrizNx2, onde a 1acolunacontémosnúmeros de matrículas e a 2acolunacontém as notascorrespondentes: Notas = [1313012, 9.0 1312410, 7.5 1226784, 8.0 … ]
Como fazer a pesquisanatabela? • A idéiaépercorrercadalinha da tabela, a partir 1a, atéencontrarposiçãoemqueocorre o número de matrículaprocurado. • começamos a partir1alinha • se o valor na 1a coluna e linhacorrenteé o no. de matrículaprocurado, entãofim • senão, passamospara a próximalinha e repetimos, voltandoaopasso2 Vamos precisar de uma variável para manter a informação de qual é a linha corrente. O que acontece se o número de matrícula procurado não ocorre na tabela?
Pesquisaemtabela Notas = … m = input(”Informe a matrícula: ”); [N,C] = size(Notas); lin = 1; whileNotas(lin,1) <> m & lin <= N lin = lin + 1 end if lin > N then printf(“Matrículanãoencontrada”) else printf(”Nota = %g”,Notas(lin,2)) end
Filtrandovaloresquesatisfazemumapropriedade • Considerenovamente a tabela com as notasfinais de alunos. • Queremos agora obterosnúmeros de matrícula e notas de todososalunosqueforamaprovados.
Como filtraros dados desejados? • A idéiaépercorrertoda a tabela, a partir da primeiralinha, e selecionar as entradasnatabelataisque o valor nasegundacolunaé ≥ 6.0 • começamos com umamatriz de aprovadosvazia e iniciamos a pesquisa da 1alinha • se o valor nalinhacorrente, 2a col, for ≥ 6.0, adicionamos o alunoàmatriz de aprovados. • senão, passamospara a próximacolunae repetimos, voltandoaopasso2 De que variáveis vamos precisar? Qual deve ser a condição do loop?
Exemplo 4 - Pesquisaemtabela II Notas = … Aprov = [] [N,C] = size(Notas); lin= 1; whilelin <= N if Notas(lin,2) >= 6.0 then Aprov = [Aprov; Notas(lin,:)] end lin = lin + 1 end disp(Aprov) Matriz vazia Estende a matriz Aprov
Pesquisaemtabela - find -->[i,j] = find(M<= 3) j = 1. 1. 3. i = 1. 2. 1. -->[l,c] = find(M > 10) c = [] l = [] -->M = [1,7,3; 2,8,9] M = 1. 7. 3. 2. 8. 9. -->[i,j] = find(M==3) j = 3. i = 1.
Pesquisaemtabela - extração -->v3 = M(M<= 7) v3 = 1. 2. 7. 3. -->v4 = M(M > 10) v4 = [] -->M = [1,7,3; 2,8,9] M = 1. 7. 3. 2. 8. 9. -->v1 = M(M==3) v1 = 3. -->v2 = M(M==10) v2 = []