Universidade Federal de Ouro Preto - UFOP Departamento de Computação - DECOM Programação de Computadores I – BCC701 www.decom.ufop.br/moodle Andréa Iabrudi [email protected] 1 Alguns tipos de dados básicos: ◦ numéricos: integer, float (simple, double), complex ◦ lógico ◦ string (sequência de caracteres) Expressões ◦ numéricas x^(2*y) – sqrt(3.7*%pi) ◦ lógicas x < 3 & (y > 10 | y < -1) 2 Variáveis ◦ área de memória que armazena algum dado e é referenciada por meio de um nome Comando de Atribuição x = x+3^(2*y) Comandos de Desvio if x < 2 then z = 2*x elseif x == 2 | x == 3 then z = x +10 elseif x>10 & x<30 then z=x*5 else z = 46 end 3 Matrizes e vetores M = [3, 4; 1 2] ◦ Indexação de matrizes M(2,1) = M(1,2) + 10 M(2,:) = M(1,:) + M(:,2) ◦ Operações e funções sobre matrizes x = sum((M .* [1, 2; 2, 1]) ^ 2) 4 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]. 5 6 Se o usuário errar ao digitar o valor do PH, ele não terá chance de corrigir seu erro, fornecendo um novo valor Queremos modificar o programa de modo que, se o valor fornecido não for válido, o usuário possa digitar novamente um valor, até que digite um valor válido. 7 Vamos precisar de um comando de repetição A digitação de um novo valor deve ser solicitada, enquanto o valor digitado anteriormente não for válido. 8 ph = input(“Informe o PH da solução: ”) while ph<0 | ph>14 printf(“pH inválido: deve ser de 0 a 14”) ph = input(“Informe o PH da solução: ”) end 9 while <condição> <bloco while> end Execução do comando while: 1. primeiro, a condição é avaliada 2. se a condição for verdadeira, então o bloco de comandos dentro do while é executado, e volta-se ao passo 1. 3. se a condição for falsa, o comando while termina, e a execução prossegue a partir do comando imediatamente subsequente ao comando while. UFMG DCC001 2013-1 11 12 Que valores são impressos pelo seguinte trecho de programa? x = 1 while x < 5 printf('x = %g',x) x = x + 1 end x x x x = = = = 1 2 3 4 Quando este loop irá parar? x = 1 while x < 10 printf('x = %g',x) x = x - 1 end Sem intervenção, nunca. Cuidado com o uso de while! MDC(a,b) onde a e b são inteiros ◦ MDC(a,b) é o maior inteiro g que divide a e b ◦ Isto é, a = g.m e b=g.n, onde m,n são inteiros, e, para todo inteiro c que divide a e b, temos que c divide g ◦ Exemplo: MDC(21,12) = 3 ◦ Se MDC(n,m) = 1, m e n são ditos primos entre si. Ex: MDC(9,5) = 1 Algoritmo de Euclides: ◦ criado em 300 A.C., e em uso até 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 maior pela diferença entre o maior e o menor e repetir o processo, até que os dois valores sejam iguais (isto é, até que a=b) 252 252-105=147 147-105=42 42 42 21 105 105 105 63 63-42=21 42-21=21 m n 56 12 a 56 44 b 12 Valores iniciais colocados na preparação do loop 32 12 20 12 8 12 4 - - 12 8 4 Em cada passo, o maior entre a e b é substituído pela diferença entre a e b 4 O loop termina quando a = b m n 56 12 a 56 44 b 12 Valores iniciais colocados na preparação do loop 32 12 20 12 8 12 4 - - 12 8 4 Em cada passo, o maior entre a e b é substituído pela diferença entre a e b 4 O loop termina quando a = b Método: ◦ se a = b, o mdc(a,b) é igual a a (ou a b) ◦ senão, substituir o maior pela diferença entre o maior e o menor e repetir o processo, até que os dois valores sejam iguais (isto é, até que a=b) a e b devem ser inicializados antes do loop while <condição> <bloco while> end Qual deve ser a condição? Como deve ser o corpo do loop? UFMG DCC001 2013-1 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 44 44-12=32 32-12=20 20-12=8 8 8-4=4 4 12 12 12 12 12-8=4 4 4 Subtrações sucessivas podem ser feitas por divisão m = input("m = "); n = input("n = "); a = m; b = n; while b <> 0 Porque não é necessário aux = b determinar qual, a ou b, b = modulo(a,b); é maior? a = aux; end printf("mdc(%g,%g) = %g",m,n,a) UFMG DCC001 2013-1 44 12 8 4 12 44 mod 12 = 8 12 mod 8 = 4 8 mod 4 = 0 Em Scilab, o mdc de dois números a e b pode ser calculado usando-se a função pré-definida gcd, do seguinte modo: gcd(uint8([a b])) Suponha que temos uma tabela com notas finais de alunos, no seguinte formato: matrícula 1313012 nota 9.5 1312410 7.5 1226784 … 8.0 Queremos construir um programa que leia a matrícula de um aluno e informe sua nota 25 A tabela é representada no programa como uma matriz Nx2, onde a 1a coluna contém os números de matrículas e a 2a coluna contém as notas correspondentes: Notas = [1313012, 9.0 1312410, 7.5 1226784, 8.0 … ] 26 A idéia é percorrer cada linha da tabela, a partir 1a, até encontrar posição em que ocorre o número de matrícula Vamos precisar procurado. de uma variável para manter a informação de qual é a linha corrente. partir 1a linha 1. começamos a 2. se o valor na 1a coluna e linha corrente é o no. de matrícula procurado, então fim 3. senão, passamos para a próxima linha e repetimos, voltando ao passo 2 O que acontece se o número de matrícula procurado não ocorre na tabela? 27 Notas = … m = input(”Informe a matrícula: ”); [N,C] = size(Notas); lin = 1; while Notas(lin,1) <> m & lin <= N lin = lin + 1 end if lin > N then printf(“Matrícula não encontrada”) else printf(”Nota = %g”,Notas(lin,2)) end Considere novamente a tabela com as notas finais de alunos. Queremos agora obter os números de matrícula e notas de todos os alunos que foram aprovados. 29 A idéia é percorrer toda a tabela, a partir da primeira linha, e selecionar as entradas na tabela tais que o valor na segunda coluna é ≥ 6.0 1. começamos com uma matriz de aprovados vazia e iniciamos a pesquisa da 1a linha 2. se o valor na linha corrente, 2a col, for ≥ 6.0, adicionamos o aluno à matriz de aprovados. 3. senão, passamos para a próxima coluna e repetimos, voltando ao passo 2 De que variáveis vamos precisar? Qual deve ser a condição do loop? 30 Notas = … Matriz vazia Aprov = [] Estende [N,C] = size(Notas); lin = 1; a matriz while lin <= N Aprov if Notas(lin,2) >= 6.0 then Aprov = [Aprov; Notas(lin,:)] end lin = lin + 1 end disp(Aprov) -->M = [1,7,3; 2,8,9] M = 1. 2. 7. 8. 3. 9. -->[i,j] = find(M==3) j = 3. i = 1. -->[i,j] = find(M<= 3) j = 1. i = 1. 3. 1. 2. 1. -->[l,c] = find(M > 10) c = [] l = [] 32 -->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 = [] -->v3 = M(M<= 7) v3 = 1. 2. 7. 3. -->v4 = M(M > 10) v4 = [] 33