Upload
internet
View
103
Download
0
Embed Size (px)
Citation preview
Módulo 6Aula Expositiva 7
3.2.4 O Comando while3.2.5 O Comando for3.2.6 Valores Lógicos e Strings3.2.7 Comandos Aninhados3.3 Arquivos
DCC 001Programação de Computadores
2° Semestre de 2011Prof. Osvaldo Carvalho
O Comando while
UFMG DCC001 2011-2 2
Cálculo do Fatorial
UFMG DCC001 2011-2 3
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)
Cálculo do Fatorial
Temos que realizar repetidas multiplicações
Precisamos de um loop Vamos usar o comando while:
Comandos dentro do <bloco while> são repetidos até que a <condição> falhe
UFMG DCC001 2011-2 4
while <condição> <bloco while>end
Cálculo do Fatorial com while
UFMG DCC001 2011-2 5
n = input("n = ");k = 1;fat = 1;while k <= n fat = fat * k; k = k + 1;endprintf("O fatorial de %d é %d",n,fat)
Quando este loop vai parar?
Sem intervenção, nunca.Cuidado com o uso de while!
Comando while: Loops infinitos
x = 1while x < 10 printf('x = %g',x) x = x - 1end
6UFMG DCC001 2011-2
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 EuclidesExemplo
UFMG DCC001 2011-2 8
252 105147 10542 10542 6342 2121 21
O Programa Euclides.sce
UFMG DCC001 2011-2 9
m = input(“m = "); n = input(“n = ");a = m; b = n;while a <> b if a > b then a = a-b; else b = b-a; endendprintf("mdc(%d,%d) = %d",m,n,a)
O “;” permite colocar dois comandos em uma mesma linha
O Comando for
UFMG DCC001 2011-2 10
Fatorial com while e com for
UFMG DCC001 2011-2 11
k = 1;fat = 1;while k <= n fat = fat * k; k = k + 1;end
fat = 1;for k = 1:n fat = fat * k;end
Forma Geral do Comando for
UFMG DCC001 2011-2 12
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
Comando for com passo diferente de 1
UFMG DCC001 2011-2 13
for i = 1:2:10printf('\ni = %g',i);
end
i = 1i = 3i = 5i = 7i = 9
i varia de 2 em 2
Saída
Repare que i não assumiu o limite superior do loop
Comando for com passo negativo
UFMG DCC001 2011-2 14
for i = 20:-2:16printf('\ni = %g',i);
end
i = 20i = 18i = 16
Saída
Comando for com controle fracionário
UFMG DCC001 2011-2 15
for x = 0:0.3:0.7printf('\nx = %g',x);
end
x = 0x = 0.3x = 0.6
A variável de controle pode assumir valores não inteiros
Saída
Imprimindo Tabelas
UFMG DCC001 2011-2 16
Tabela de Senos
UFMG DCC001 2011-2 17
x seno(x)
0.0 0.0000
0.2 0.1987
0.4 0.3894
0.6 0.5646
0.8 0.8415
Produzir uma tabela como esta, com x variando de 0 a 2π, com intervalos de 0.2
Tabela de Senos1ª tentativa
UFMG DCC001 2011-2 18
// Tabela da função Senofor 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
Tabela de Senos2ª Tentativa
UFMG DCC001 2011-2 19
// Tabela da função Senofor x = 0:0.2:2*%pi printf("\n %g %g",x, sin(x))end
Tabela de Senos2ª Tentativa
UFMG DCC001 2011-2 20
0 00.2 0.1986690.4 0.3894180.6 0.5646420.8 0.7173561 0.8414711.2 0.932039
Tabela de Senos
UFMG DCC001 2011-2 21
// Tabela da função Seno// Impressão do cabeçalhoprintf("\n x seno(x)")// Impressão das linhas da tabelafor x = 0:0.2:2*%pi printf("\n%3.1f %7.4f",x, sin(x))end
Valores Lógicos e Strings
UFMG DCC001 2011-2 22
Valores Lógicos
-->x = 5; y = 13;-->L = x > y L = F-->L = x < y L = T-->DivisivelPor4 = modulo(1968,4) == 0 DivisivelPor4 = T
Variáveis podem conter %T (true) ou %F (false)
Expressões relacionais como a == b resultam em valores lógicos
23UFMG DCC001 2011-2
A função modulo calcula o resto da divisão de inteiros
Operações Lógicas
UFMG DCC001 2011-2 24
Operador Notação Scilab
NOT ~
AND &
OR |
Exemplos de operações lógicas
UFMG DCC001 2011-2 25
-->a = %t; b = %f;-->~a ans = F -->a & b ans = F -->a | b ans = T
%t e %f são literais lógicos
UFMG DCC001 2011-2 26
Strings
Variáveis podem conter também strings (sequências de caracteres)
-->a = "Programação" a = Programação -->b = " de ' b = de -->c = "Computadores" c = Computadores
Aspas simples (') e duplas (") são equivalentes
UFMG DCC001 2011-2 27
Concatenação de Strings
Strings podem ser concatenados (justapostos)
-->a = 'Programação';-->b = ' de ';-->c = 'Computadores';
-->Disciplina = a + b + c Disciplina = Programação de Computadores
Para strings, + significa
concatenação
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
UFMG DCC001 2011-2 29
Programa PassouNaoPassou.sce
// Leitura do nome do usuárioNome = input("Digite seu nome, por favor")
// Leitura da pontuaçãoPontos = input(Nome + ", qual foi sua pontuação? ")
// Impressão do resultadoif 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
Padrão de Programa Repetitivo
continua = %T;while continua // Processamento de um item
// Decisão decisao = ... input('Continua? (s/n)','string'); continua = decisao == 's'endprintf('\nQue pena!')
Elimina a necessidade de aspas para entrar com string
30UFMG DCC001 2011-2
Tratando diversas equações de 2º grau
UFMG DCC001 2011-2 31
// Cálculo das raízes de diversas equações// de 2o graucontinua = %t;while continua // Processamento de uma equação a = input("Digite o valor de a:"); b = input("Digite o valor de b:"); c = input("Digite o 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";endprintf("Obrigado, e volte sempre.")
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 34
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
UFMG DCC001 2011-2 35
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 endendprintf('\n%s, seu conceito com %g pontos foi %s!\n\n', ...NomeAluno, Nota, Conceito)
UFMG DCC001 2011-2 36
Programa NotaConceito.sce:A Importância da Indentação
if Nota >= 90 thenConceito = 'A';elseif Nota >= 80 thenConceito = 'B';elseif Nota >= 70 thenConceito = 'C';elseif Nota >= 60 thenConceito = 'D';elseif Nota >= 40 thenConceito = ‘E';elseConceito = ‘F’;endendendendend
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 endend
Mais legível
Menos legível
Tabuada
Queremos obter a tabela: 1 2 3 4 5 6 7 8 9 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
UFMG DCC001 2011-2 37
// Tabuada de multiplicaçãofor linha = 1:9 for coluna = 1:9 printf("%g",linha*coluna); endend
For AninhadosTabela de Multiplicação
Corpo do loop externo: imprime uma linha
Corpo do loop interno: imprime uma coluna de uma linha
38UFMG DCC001 2011-2
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 Dentro de cada linha, imprimir cada produto
em um número fixo de colunas
UFMG DCC001 2011-2 39
Tabela de Multiplicação
UFMG DCC001 2011-2 40
// Tabuada de multiplicaçãofor linha = 1:9 for coluna = 1:9 printf("%3g",linha*coluna); end printf("\n");end
Fora do loop interno!
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 por um nome e pela posição em uma hierarquia de
diretórios
42UFMG DCC001 2011-2
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
44UFMG DCC001 2011-2
O Comando uigetfile – 1
NomeArq = uigetfile("*.*",pwd(),"Escolha um arquivo")
Janela obtida no Windows
Vista
45UFMG DCC001 2011-2
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:
A variável arq pode depois ser usada para abrir o arquivo correspondente
O nome de arquivo escolhido pode ser novo ou já existir
arq =
C:\Users\Osvaldo\Documents\dcc\Ensino\Programação de Computadores\Scilab\MeuArquivo.txt
46UFMG DCC001 2011-2
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
47UFMG DCC001 2011-2
mopen
da = mopen(NomeCompletoDoArquivo, “r”)
Variável contendo string, muitas
vezes obtido por uigetfile
Modo de uso do arquivo:
• “r” – leitura• “w” – escrita
da passa a conter um “descritor de arquivo”, a ser usado posteriormente para ler, escrever ou fechar o arquivo
48UFMG DCC001 2011-2
mclose
mclose(da)
Descritor do arquivo em fechamento
49UFMG DCC001 2011-2
mfscanf
[n,<lista de variáveis>] = mfscanf(da,formato)
Descritor do arquivo obtido
por mopen
String com códigos similares aos usados
em printf
Variável que recebe o número de variáveis
efetivamente lidas em uma linha do arquivo
50UFMG DCC001 2011-2
mfscanf - Exemplo
UFMG DCC001 2011-2 51
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
mfprintf
mfprintf(da,<frase>,<lista de variáveis>)
Descritor do arquivo obtido
por mopen
String com códigos similares aos usados
em printf
52UFMG DCC001 2011-2
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.
53UFMG DCC001 2011-2
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.
55UFMG DCC001 2011-2
Programa Eq2g3.sce
UFMG DCC001 2011-2 56
// Calculo das raizes reais de eq. 2o grau// Leitura dos coeficientesa = 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 raizesdelta = 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
Multiplas Equações de 2º Grau – 1ª Versão
UFMG DCC001 2011-2 57
// 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
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:
58UFMG DCC001 2011-2
while ~meof(da) // leitura de dados em uma linha do arquivo // processamento dos dados da linha lidaend
Localização dos arquivos de e/s
UFMG DCC001 2011-2 59
ArqE = uigetfile("*.txt",pwd(),“Entrada:");ArqS = uigetfile("*.txt",pwd(),“Saída");
Filtro para seleção de arquivos a serem
exibidos
pwd() indica que a janela deve exibir o
diretório corrente do Scilab
Abertura dos arquivos
UFMG DCC001 2011-2 60
// Abertura dos arquivosdaE = mopen(ArqE,"r");daS = mopen(ArqS,"w");
Processamento das Equações
UFMG DCC001 2011-2 61
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); endend
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