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
Download

5. Comandos de Repetição: while - DECOM-UFOP