62
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

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

Embed Size (px)

Citation preview

Page 1: 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

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

Page 2: 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

O Comando while

UFMG DCC001 2011-2 2

Page 3: 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

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)

Page 4: 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

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

Page 5: 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

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)

Page 6: 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

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

Page 7: 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

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

Page 8: 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

Algoritmo de EuclidesExemplo

UFMG DCC001 2011-2 8

252 105147 10542 10542 6342 2121 21

Page 9: 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

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

Page 10: 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

O Comando for

UFMG DCC001 2011-2 10

Page 11: 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

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

Page 12: 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

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

Page 13: 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

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

Page 14: 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

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

Page 15: 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

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

Page 16: 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

Imprimindo Tabelas

UFMG DCC001 2011-2 16

Page 17: 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

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

Page 18: 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

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

Page 19: 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

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

Page 20: 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

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

Page 21: 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

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

Page 22: 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

Valores Lógicos e Strings

UFMG DCC001 2011-2 22

Page 23: 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

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

Page 24: 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

Operações Lógicas

UFMG DCC001 2011-2 24

Operador Notação Scilab

NOT ~

AND &

OR |

Page 25: 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

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

Page 26: 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

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

Page 27: 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

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

Page 28: 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

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

Page 29: 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

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

Page 30: 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

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

Page 31: 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

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.")

Page 32: 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

Comandos Aninhados

UFMG DCC001 2011-2 32

Page 33: 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

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

Page 34: 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

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

Page 35: 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

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)

Page 36: 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

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

Page 37: 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

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

Page 38: 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

// 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

Page 39: 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

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

Page 40: 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

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!

Page 41: 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

Arquivos

UFMG DCC001 2011-2 41

Page 42: 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

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

Page 43: 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

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

Page 44: 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

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

Page 45: 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

O Comando uigetfile – 1

NomeArq = uigetfile("*.*",pwd(),"Escolha um arquivo")

Janela obtida no Windows

Vista

45UFMG DCC001 2011-2

Page 46: 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

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

Page 47: 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

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

Page 48: 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

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

Page 49: 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

mclose

mclose(da)

Descritor do arquivo em fechamento

49UFMG DCC001 2011-2

Page 50: 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

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

Page 51: 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

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

Page 52: 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

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

Page 53: 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

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

Page 54: 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

Múltiplas Equações de 2° Grau - 2

Primeiras linhas do Arquivo de Entrada

UFMG DCC001 2011-2 54

Page 55: 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

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

Page 56: 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

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

Page 57: 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

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

Page 58: 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

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

Page 59: 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

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

Page 60: 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

Abertura dos arquivos

UFMG DCC001 2011-2 60

// Abertura dos arquivosdaE = mopen(ArqE,"r");daS = mopen(ArqS,"w");

Page 61: 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

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

Page 62: 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

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