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