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

Preview:

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

Recommended