Módulo 6
Aula Expositiva 7
3.2.4 O Comando while
3.2.5 O Comando for
3.2.6 Valores Lógicos e Strings
3.2.7 Comandos Aninhados
3.3 Arquivos
DCC 001
Programação de Computadores
2° Semestre de 2011
Prof. Osvaldo Carvalho
O Comando while
UFMG DCC001 2011-2
2
Cálculo do Fatorial
 O fatorial de um número n é dado pela
fórmula:
 Queremos um programa que leia n, e calcule n!
 (O Scilab oferece a função factorial)
UFMG DCC001 2011-2
3
Cálculo do Fatorial
 Temos que realizar repetidas multiplicações
 Precisamos de um loop
 Vamos usar o comando while:
while <condição>
<bloco while>
end
 Comandos dentro do <bloco while> são
repetidos até que a <condição> falhe
UFMG DCC001 2011-2
4
Cálculo do Fatorial com while
n = input("n = ");
k = 1;
fat = 1;
while k <= n
fat = fat * k;
k = k + 1;
end
printf("O fatorial de %d é %d",n,fat)
UFMG DCC001 2011-2
5
Comando while: Loops infinitos
Quando este loop vai parar?
x = 1
while x < 10
printf('x = %g',x)
x = x - 1
end
Sem intervenção, nunca.
Cuidado com o uso de while!
UFMG DCC001 2011-2
6
O Algoritmo de Euclides
 Encontra o Máximo Divisor Comum
 Base:
 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
menor e o maior, até que sejam iguais
UFMG DCC001 2011-2
7
Algoritmo de Euclides
Exemplo
252
147
42
42
42
21
UFMG DCC001 2011-2
105
105
105
63
21
21
8
O Programa Euclides.sce
m = input(“m = "); n = input(“n = ");
a = m; b = n;
while a <> b
O “;” permite colocar
if a > b then
dois comandos em
a = a-b;
uma mesma linha
else
b = b-a;
end
end
printf("mdc(%d,%d) = %d",m,n,a)
UFMG DCC001 2011-2
9
O Comando for
UFMG DCC001 2011-2
10
Fatorial com while e com for
k = 1;
fat = 1;
while k <= n
fat = fat * k;
k = k + 1;
end
UFMG DCC001 2011-2
fat = 1;
for k = 1:n
fat = fat * k;
end
11
Forma Geral do Comando for
for <variável> = <inicial>:<passo>:<limite>
<bloco de comandos>;
end
é equivalente a
<variável> = <inicial>;
while <variável> <= <limite>
<bloco de comandos>;
<variável> = <variável> + <passo>
end
UFMG DCC001 2011-2
12
Comando for com passo diferente de 1
for i = 1:2:10
printf('\ni = %g',i);
end
i
i
i
i
i
UFMG DCC001 2011-2
=
=
=
=
=
1
3
5
7
9
i varia de 2 em 2
Saída
Repare que i não assumiu o
limite superior do loop
13
Comando for com passo negativo
for i = 20:-2:16
printf('\ni = %g',i);
end
i = 20
i = 18
i = 16
UFMG DCC001 2011-2
Saída
14
Comando for com controle fracionário
A variável de controle
pode assumir valores
não inteiros
for x = 0:0.3:0.7
printf('\nx = %g',x);
end
x = 0
Saída
x = 0.3
x = 0.6
UFMG DCC001 2011-2
15
Imprimindo Tabelas
UFMG DCC001 2011-2
16
Tabela de Senos
 Produzir uma tabela como esta, com x
variando de 0 a 2π, com intervalos de 0.2
x
0.0
0.2
0.4
0.6
0.8
UFMG DCC001 2011-2
seno(x)
0.0000
0.1987
0.3894
0.5646
0.8415
17
Tabela de Senos
1ª tentativa
// Tabela da função Seno
for x = 0:0.2:2*%pi
printf("%g %g",x, sin(x))
end
-->
0 00.2 0.1986690.4 0.3894180.6 0.5646420.8 0.7173561 0.841471
UFMG DCC001 2011-2
18
Tabela de Senos
2ª Tentativa
// Tabela da função Seno
for x = 0:0.2:2*%pi
printf("\n %g %g",x, sin(x))
end
UFMG DCC001 2011-2
19
Tabela de Senos
2ª Tentativa
0 0
0.2 0.198669
0.4 0.389418
0.6 0.564642
0.8 0.717356
1 0.841471
1.2 0.932039
UFMG DCC001 2011-2
20
Tabela de Senos
// Tabela da função Seno
// Impressão do cabeçalho
printf("\n x
seno(x)")
// Impressão das linhas da tabela
for x = 0:0.2:2*%pi
printf("\n%3.1f %7.4f",x, sin(x))
end
UFMG DCC001 2011-2
21
Valores Lógicos e Strings
UFMG DCC001 2011-2
22
Valores Lógicos
 Variáveis podem conter %T (true) ou %F (false)
 Expressões relacionais como a == b resultam
em valores lógicos
-->x = 5; y = 13;
A função modulo
-->L = x > y
L =
calcula o resto da
F
divisão de inteiros
-->L = x < y
L =
T
-->DivisivelPor4 = modulo(1968,4) == 0
DivisivelPor4 =
T
UFMG DCC001 2011-2
23
Operações Lógicas
UFMG DCC001 2011-2
Operador
Notação Scilab
NOT
~
AND
&
OR
|
24
Exemplos de operações lógicas
-->a = %t; b = %f;
-->~a
ans =
F
%t e %f são
-->a & b
literais lógicos
ans =
F
-->a | b
ans =
T
UFMG DCC001 2011-2
25
Strings
 Variáveis podem conter também
(sequências de caracteres)
strings
-->a = "Programação"
a =
Aspas simples (') e duplas
Programação
(") são equivalentes
-->b = " de '
b =
de
-->c = "Computadores"
c =
Computadores
UFMG DCC001 2011-2
26
Concatenação de Strings
 Strings podem ser concatenados
(justapostos)
-->a = 'Programação';
-->b = ' de ';
-->c = 'Computadores';
Para strings, +
significa
concatenação
-->Disciplina = a + b + c
Disciplina =
Programação de Computadores
UFMG DCC001 2011-2
27
Programa Passou-Não passou
 Faça um programa que:
 Leia o nome do usuário
 Leia o total de pontos feitos pelo usuário
 Imprima, conforme o caso, a frase
 <usuário>, com <pontos> você passou!
 Ou
 <usuário>, com <pontos> você não passou!
 Ex.: José, com 75 pontos você passou!
UFMG DCC001 2011-2
28
Programa PassouNaoPassou.sce
// Leitura do nome do usuário
Nome = input("Digite seu nome, por favor")
// Leitura da pontuação
Pontos = input(Nome + ", qual foi sua pontuação? ")
// Impressão do resultado
if Pontos >= 60 then
printf("%s, com %g pontos você passou!",Nome,Pontos)
else
printf("%s, com %g pontos você não passou :(",...
Nome,Pontos)
end
Comando continua
na próxima linha
UFMG DCC001 2011-2
29
Padrão de Programa Repetitivo
continua = %T;
while continua
// Processamento de um item
Elimina a necessidade de
aspas para entrar com string
// Decisão
decisao = ...
input('Continua? (s/n)','string');
continua = decisao == 's'
end
printf('\nQue pena!')
UFMG DCC001 2011-2
30
Tratando diversas equações de 2º grau
// Cálculo das raízes
// de 2o grau
continua = %t;
while continua
// Processamento de
a = input("Digite o
b = input("Digite o
c = input("Digite o
de diversas equações
uma equação
valor de a:");
valor de b:");
valor de c:");
delta = b^2 - 4*a*c
if delta >= 0 then
r1 = (-b+sqrt(delta))/(2*a)
r2 = (-b-sqrt(delta))/(2*a)
printf("As raízes são %g e %g",r1,r2)
else
printf("As raízes são complexas")
end
// Decisão de continuação pelo usuário
decisao = input("Outra equação? (s/n)","string");
continua = decisao == "s";
end
printf("Obrigado, e volte sempre.")
UFMG DCC001 2011-2
31
Comandos Aninhados
UFMG DCC001 2011-2
32
Comandos Aninhados
 Blocos internos a comandos como if, for e
while podem conter qualquer tipo de
comando, incluindo

Comandos de atribuição
Comandos de entrada/saída

Outros comandos if, for e while!

 Esta generalidade proporciona uma imensa
flexibilidade à programação
UFMG DCC001 2011-2
33
Conceitos e Notas
 Faça um programa que:
 Leia o nome e o total de pontos de um aluno
 Imprima a nota e o conceito correspondente,
segundo a tabela
UFMG DCC001 2011-2
Resultado
Conceito
90 <= Nota <= 100
A
80 <= Nota < 90
B
70 <= Nota < 80
C
60 <= Nota < 70
D
40 <= Nota < 60
E
0 <= Nota < 40
F
34
Programa NotaConceito.sce
if Nota >= 90 then
Conceito = 'A';
else
if Nota >= 80 then
Conceito = 'B';
else
if Nota >= 70 then
Conceito = 'C';
else
if Nota >= 60 then
Conceito = 'D';
else
if Nota >= 40 then
Conceito = ‘E';
else
Conceito = ‘F’;
end
end
end
end
end
printf('\n%s, seu conceito com %g pontos foi %s!\n\n', ...
NomeAluno, Nota, Conceito)
UFMG DCC001 2011-2
35
Programa NotaConceito.sce:
A Importância da Indentação
if Nota >= 90 then
Conceito = 'A';
else
if Nota >= 80 then
Conceito = 'B';
else
if Nota >= 70 then
Conceito = 'C';
else
if Nota >= 60 then
Conceito = 'D';
else
if Nota >= 40 then
Conceito = ‘E';
else
Conceito = ‘F’;
end
end
end
end
end
UFMG DCC001 2011-2
if Nota >=
Conceito =
else
if Nota >=
Conceito =
else
if Nota >=
Conceito =
else
if Nota >=
Conceito =
else
if Nota >=
Conceito =
else
Conceito =
end
end
end
end
end
90 then
'A';
80 then
'B';
70 then
'C';
60 then
'D';
40 then
‘E';
‘F’;
36
Tabuada
 Queremos obter a tabela:
1
2
3
4
5
6
7
8
9
UFMG DCC001 2011-2
2
4
6
8
10
12
14
16
18
3
6
9
12
15
18
21
24
27
4
8
12
16
20
24
28
32
36
5
10
15
20
25
30
35
40
45
6
12
18
24
30
36
42
48
54
7
14
21
28
35
42
49
56
63
8
16
24
32
40
48
56
64
72
9
18
27
36
45
54
63
72
81
37
For Aninhados
Tabela de Multiplicação
// Tabuada de multiplicação
for linha = 1:9
for coluna = 1:9
printf("%g",linha*coluna);
end
end
Corpo do loop externo:
imprime uma linha
UFMG DCC001 2011-2
Corpo do loop interno: imprime
uma coluna de uma linha
38
Tabela de Multiplicação
 Ao executar este programa verificamos
entretanto que sua saída está ininteligível:
12345678924681012141618369121518212...
 Esquecemos de:
 Mudar de linha, com o \n, e

UFMG DCC001 2011-2
Dentro de cada linha, imprimir cada produto em
um número fixo de colunas
39
Tabela de Multiplicação
// Tabuada de multiplicação
for linha = 1:9
for coluna = 1:9
printf("%3g",linha*coluna);
end
printf("\n");
Fora do loop
interno!
end
UFMG DCC001 2011-2
40
Arquivos
UFMG DCC001 2011-2
41
Arquivos - 1
 Arquivos são uma unidade de
armazenamento não volátil, tipicamente
gravados em disco magnético
 Sistemas operacionais como Linux ou
Windows permitem que sejam criados e
recuperados


UFMG DCC001 2011-2
por um nome e
pela posição em uma hierarquia de diretórios
42
Arquivos - 2
 Existem muitos tipos de arquivos que podem
ser lidos, criados ou modificados pelo Scilab
 Vamos aprender a trabalhar somente com
arquivos texto, isto é, arquivos legíveis por
humanos, que podem ser editados por
exemplo usando o Bloco de Notas
UFMG DCC001 2011-2
43
Comandos Básicos para Uso de Arquivos
 uigetfile
 Permite ao usuário selecionar um arquivo navegando nos
diretórios do Windows (ou outro sistema operacional como o
Linux);
 mopen e mclose
 São necessários para iniciar e para terminar a manipulação
de arquivos
 mfscanf e mfprintf
 São usados para ler e para gravar valores de variáveis em
arquivos abertos
 meof
 Permite testar se o fim de um arquivo já foi atingido
UFMG DCC001 2011-2
44
O Comando uigetfile – 1
NomeArq = uigetfile("*.*",pwd(),"Escolha um arquivo")
Janela obtida
no Windows
Vista
UFMG DCC001 2011-2
45
O Comando uigetfile – 2
 Após a escolha de um arquivo a variável arq
recebe como valor um string com o nome
completo do arquivo:
arq
=
C:\Users\Osvaldo\Documents\dcc\Ensino\Programação de Computadores\Scilab\MeuArquivo.txt
 A variável arq pode depois ser usada para
abrir o arquivo correspondente
 O nome de arquivo escolhido pode ser novo
ou já existir
UFMG DCC001 2011-2
46
Abertura e Fechamento de Arquivos:
mopen e mclose
 Um arquivo fora de uso está totalmente
armazenado em disco (tipicamente)
 Um arquivo em uso tem parte de sua
informação em disco, parte na memória
principal
 A abertura de um arquivo traz para a memória
informações necessárias para o seu uso
 O fechamento de um arquivo grava em disco
todas as informações presentes na memória
UFMG DCC001 2011-2
47
mopen
da passa a conter um “descritor de
arquivo”, a ser usado posteriormente
para ler, escrever ou fechar o arquivo
da = mopen(NomeCompletoDoArquivo, “r”)
Variável contendo
string, muitas
vezes obtido por
uigetfile
UFMG DCC001 2011-2
Modo de uso do
arquivo:
•“r” – leitura
•“w” – escrita
48
mclose
mclose(da)
Descritor do
arquivo em
fechamento
UFMG DCC001 2011-2
49
mfscanf
Variável que recebe o
número de variáveis
efetivamente lidas em
uma linha do arquivo
String com códigos
similares aos usados
em printf
[n,<lista de variáveis>] = mfscanf(da,formato)
Descritor do
arquivo obtido
por mopen
UFMG DCC001 2011-2
50
mfscanf - Exemplo
f = uigetfile("*.txt",pwd(),“mfscanf_teste");
df = mopen(f,"r");
[n,a,b,c] = mfscanf(df,"%g %g %g");
[m,d,e,f,g] = mfscanf(df,"%g %g %g %g");
mclose(df);
Resultado:
 n==3, m==3
 a==1, b==2,…,f==6
 g==[]
matriz vazia
UFMG DCC001 2011-2
51
mfprintf
String com códigos
similares aos usados
em printf
mfprintf(da,<frase>,<lista de variáveis>)
Descritor do
arquivo obtido
por mopen
UFMG DCC001 2011-2
52
Múltiplas Equações de 2º Grau - 1
 Modifique o programa que resolve equações
de 2º grau fazendo com que ele possa
calcular as raízes de um número não
determinado de equações de segundo grau,
cujos coeficientes estão em um arquivo de
entrada
 Este arquivo tem, para cada linha, os
coeficientes a, b e c separados por um ou
mais espaços.
UFMG DCC001 2011-2
53
Múltiplas Equações de 2° Grau - 2
 Primeiras linhas do Arquivo de Entrada
UFMG DCC001 2011-2
54
Múltiplas Equações de 2º Grau – 3
 Seu programa deve produzir um arquivo de
saída onde em cada linha devem estar
gravados os coeficientes e as raízes reais da
equação.
 Quando as raízes forem complexas o
programa deve ignorar a linha de entrada.
UFMG DCC001 2011-2
55
Programa Eq2g3.sce
// Calculo das raizes reais de eq. 2o grau
// Leitura dos coeficientes
a = input("Entre com o valor de a:");
b = input("Entre com o valor de b:");
c = input("Entre com o valor de c:");
// Calculo e impressao das raizes
delta = b^2 - 4*a*c;
if delta >= 0 then
r1 = (-b+sqrt(delta))/(2*a);
r2 = (-b-sqrt(delta))/(2*a);
printf("r1 = %g, r2 = %g",r1,r2)
else
printf("Raizes complexas")
end
UFMG DCC001 2011-2
56
Multiplas Equações de 2º Grau – 1ª Versão
// Calculo de raízes de múltiplas
// equações do 2o grau
// Localização dos arquivos de
// entrada e de saída
// Abertura dos arquivos de
// entrada e de saída
// Processamento do arquivo de entrada
// e produção do arquivo de saída
// Fechamento dos arquivos de
// entrada e de saída
UFMG DCC001 2011-2
57
Uso de meof
 É possível saber quantas linhas o arquivo de entrada
possui, mas não é boa prática construir um programa que
deve ser modificado quando o tamanho do arquivo muda
 O melhor é usar a função meof em um loop while que
termina quando o fim do arquivo é detetado:
while ~meof(da)
// leitura de dados em uma linha do arquivo
// processamento dos dados da linha lida
end
UFMG DCC001 2011-2
58
Localização dos arquivos de e/s
ArqE = uigetfile("*.txt",pwd(),“Entrada:");
ArqS = uigetfile("*.txt",pwd(),“Saída");
Filtro para seleção de
arquivos a serem
exibidos
UFMG DCC001 2011-2
pwd() indica que a
janela deve exibir o
diretório corrente do
Scilab
59
Abertura dos arquivos
// Abertura dos arquivos
daE = mopen(ArqE,"r");
daS = mopen(ArqS,"w");
UFMG DCC001 2011-2
60
Processamento das Equações
while ~meof(daE)
[n,a,b,c] = mfscanf(daE,"%g %g %g");
delta = b^2 - 4*a*c;
if delta >= 0 then
r1 = (-b + sqrt(delta))/(2*a);
r2 = (-b - sqrt(delta))/(2*a);
mfprintf(daS,"\n%8g %8g %8g %8g %8g",...
a,b,c,r1,r2);
end
end
UFMG DCC001 2011-2
61
Resumo
 O comando while é outra forma de escrita
de loops
 Variáveis Scilab podem também conter
valores lógicos e strings
 Programas repetitivos têm melhor usabilidade
 Arquivos permitem o processamento de
grandes volumes de dados
UFMG DCC001 2011-2
62
Download

Módulo_06_2011_2