Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Resumo: Prof. Marcelo Luiz Silva 2013-2 Capítulo 2 - Scilab Básico Neste capítulo, vamos apresentar alguns elementos básicos da linguagem Scilab. No final, você deve ser capaz de escrever programas Scilab simples, porém funcionais. 2.1 - Variáveis e Matrizes A unidade fundamental de dados, em qualquer programa Scilab, é a matriz. Matriz é uma coleção de valores de dados organizados em linhas e colunas, conhecidos por um nome único (ver Fig 2.1). Valores individuais de dados em uma matriz são acessados por meio do nome da matriz, seguindo de índices entre parênteses que identificam a linha e a coluna do valor particular. Mesmo os escalares são tratados como matrizes no Scilab - eles são simplesmente matrizes com somente uma linha e uma coluna. Matrizes podem ser classificadas como vetores ou matrizes propriamente ditas. O termo "vetor" geralmente descreve uma matriz com somente uma dimensão, enquanto o termo "matriz" costuma ser utilizado para descrever matrizes com duas ou mais dimensões. Neste texto, vamos usar os termos "vetor" na discussão de matrizes unidimensionais, e "matriz" na discussão de matrizes com duas ou mias dimensões. Se uma discussão em particular se aplicar aos dois tipos de matrizes, usaremos também o termo genérico "matriz" (do inglês array). O tamanho de uma matriz é especificado pelo número de linhas e de colunas, sendo o número de linhas apresentado antes. O número total de elementos da matriz será o produto do número de linhas e o número de colunas. coluna 1 linha 1 a11 coluna 2 a12 coluna 3 a13 coluna 4 a14 linha 2 a21 a22 a23 a24 linha 3 a31 a32 a33 a34 linha 4 a41 a42 a43 a44 Figura 2.1 - Uma matriz A é uma coleção de valores de dados organizados em linhas e colunas 1 Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Resumo: Prof. Marcelo Luiz Silva 2013-2 Por exemplo, os tamanhos das matrizes a seguir são: Matriz Tamanho Esta é uma matriz 3x2 que contém 6 elementos. Esta é uma matriz 1x4, conhecida como vetor-linha; contém 4 elementos. Esta é uma matriz 4x1, conhecida como vetor-coluna; contém 4 elementos. Elementos individuais na matriz são identificados pelo nome da matriz seguido da linha e da coluna do elemento em particular. Se a matriz é um vetor-linha ou um vetorcoluna, somente um índice é requerido. Por exemplo, nas matrizes acima, a(2,1) = 3 e vetor(2) = 8.75. Uma variável Scilab é uma região de memória que contém uma matriz, conhecida por um nome especificado pelo usuário. O conteúdo de uma matriz pode ser utilizado ou modificado a qualquer momento pela inclusão de seu nome em um comando Scilab apropriado. Os nomes de variáveis Scilab precisam iniciar com uma letra seguida de combinações de letras, números e símbolos, da seguinte forma: os nomes de variáveis não podem ter caracteres acentuados. o primeiro caractere de um nome de variável deve ser uma letra, ou um dos caracteres: # $ % _ ? os demais caracteres podem ser alfanuméricos, dígitos, ou os caracteres: # $ _ ? ! os nomes de variáveis são sensíveis aos caracteres maiúsculos e minúsculos. Por exemplo, variável Alpha é diferente das variáveis ALPHA, alpha e AlPhA. a escolha de nomes significativos para as variáveis ajuda ao programador entender o que o programa faz e a prevenir erros. por exemplo, nomes válidos: a A Jose #funcionarios total_de_alunos %valor ?#_ por exemplo, nomes inválidos: 1Aluno (o primeiro caractere é um algarismo) total de alunos (tem espaços) José (é acentuado) 2 Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Resumo: Prof. Marcelo Luiz Silva 2013-2 Ao escrever um programa, é importante escolher nomes com significado para as variáveis. Nomes com significado tornam um programa muito mais fácil de ler e manter. Nomes como dia, mes e ano são claros até mesmo para alguém que vê o programa pela primeira vez. Como os espaços não podem ser utilizados em nomes de variáveis Scilab, o caractere sublinhado pode ser utilizado para criar nomes compostos com significado, por exemplo, taxa_de_cambio. Boa Prática de Programação Sempre use nomes descritivos e fáceis de lembrar para suas variáveis. Por exemplo, uma taxa de câmbio poderia ser chamada de taxa_de_cambio; seria confuso chamá-la de capital. Esta prática tornará seus programas mais claros e fáceis de entender. É também importante incluir um dicionário de dados no cabeçalho de qualquer programa que você escrever. Este dicionário lista a definição de cada variável usada em um programa. A definição deve incluir uma descrição do conteúdo e as unidades de medida usadas. Um dicionário de dados pode parecer desnecessário enquanto o programa está sendo escrito, mas é de grande valor quando você ou outra pessoa precisa voltar para o programa e modificá-lo posteriormente. Boa Prática de Programação Crie um dicionário de dados para cada programa, a fim de tornar mais fácil a manutenção. A linguagem Scilab é sensível à capitalização, o que significa que letras maiúsculas e minúsculas não são a mesma coisa. Assim, as variáveis name, NAME e Name são diferentes. Você precisa ser cuidadoso quanto à utilização de capitalização ao empregar uma variável. Embora não seja requerido, é usual utilizar caixa baixa para nomes de variáveis ordinárias. Boa Prática de Programação Verifique se você capitaliza uma variável exatamente da mesma forma cada vez que ela é utilizada. Uma boa prática é utilizar sempre caixa baixa em nomes de variáveis. Os valores numéricos alocados a variáveis Scilab podem ser inteiros, reais ou complexos, por exemplo: 3 Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Resumo: Prof. Marcelo Luiz Silva 2013-2 Comando massa = 58 Media = 6.8 Explicação Cria a variável massa com o valor inteiro 58. Cria a variável Media com o valor real 6.8. Cria a variável C1 com o complexo cuja parte real é 10 e a C1 = 10 – 4*%i parte imaginária é -4i. A letra i é o símbolo que representa Podemos armazenar nas variáveis um caractere ou uma sequência de caracteres, denominada string, para representar informações textuais, por exemplo: Comando Explicação Cria a variável letra com a cadeia de de um letra = 'a' caractere a. Cria a variável nome1 com a cadeia de nome1 = 'Bart' caracteres Bart. nome_2 = "Lisa Simpson" Cria a variável nome_2 com a cadeia de caracteres Lisa Simpson. Uma string pode ser delimitada por aspas simples ou duplas. 2.2 - Criando e Iniciando Variáveis no Scilab Variáveis Scilab são criadas automaticamente quando iniciadas. Existem três formas comuns de iniciar uma variável em Scilab. 1. associar dados à variável em uma atribuição; 2. fornecer dados à variável pelo teclado; e 3. ler dados de um arquivo. As duas primeiras serão discutidas a seguir; a terceira na seção 2.x. 2.1.1 - Iniciando Variáveis em Expressões de Atribuição A forma mais simples de criar e iniciar uma variável é associar um ou mais valores uma declaração de atribuição. Uma declaração de atribuição tem a forma geral: var = expressão; onde var é o nome de uma variável e expressão é uma constante escalar, uma matriz ou a combinação de constantes, outras variáveis e operações matemáticas (+, -, *, /, etc). O valor da expressão é calculado por meio das regras normais da matemática, e o resultado é armazenado na variável nomeada. O ponto e vírgula no final da declaração é opcional. Se ele não estiver presente, o valor associado a var será ecoado na Janela do Console. Se estiver presente, nada será mostrado nela, apesar de a atribuição ter ocorrido. A seguir, exemplos simples de variáveis iniciadas com declarações de atribuição. 4 Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Resumo: Prof. Marcelo Luiz Silva 2013-2 Declaração de Atribuição var = 40i; var2 = var / 5; Array = [10 2 5 88]; x = 1; y = 2; Explicação Cria e armazena na variável var o número imaginário 40i Cria a variável var2 e armazena o resultado da expressão var/5 nela Cria a variável array e armazena nela um vetor linha de 4 elementos Aqui, temos uma ilustração de múltiplas declarações múltiplas de atribuição em uma mesma linha. observe que cada declaração é separada por ponto e vírgula. Quando uma variável já existe, antes da execução de uma declaração de atribuição que a use, o conteúdo inicial dessa variável será perdido, por exemplo: x = 10; y = 20; x = 1; inicialmente, 10 é armazenado em x e 20 é armazenado em y. Após a execução da declaração de atribuição x = 1, o valor 10 é destruído e o novo valor 1 é armazenado em x. Conforme mostra o terceiro exemplo, variáveis podem também ser iniciadas com matrizes de dados. Essas matrizes são construídas com o uso de colchetes, [ e ], da vírgula, e do ponto e vírgula. Todos os elementos de uma matriz são listados por linha. Em outras palavras, os valores de cada linha são listados da esquerda para a direita, com a linha de cima primeiro e a linha de baixo por último. Valores individuais em uma linha são separados por brancos ou por vírgulas, e as linhas são separadas por ponto e vírgula, ou por novas linhas. As expressões a seguir são todas matrizes sintaticamente corretas que podem ser usadas para iniciar uma variável: Matriz [ 3.4 ] [1.0 2.0 3.0] Explicação Esta expressão cria uma matriz 1x1 (um escalar) que contém o valor 3,4. Os colchetes são necessários neste caso. Esta expressão cria uma matriz 1x3 que contém o vetor linha [1 2 3]. Esta expressão cria uma matriz 3x1 com o vetor [1.0; 2.0; 3.0] coluna . 5 Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Resumo: Prof. Marcelo Luiz Silva 2013-2 [1, 2, 3; 4, 5, 6] [11, 22, 33 44 55 66] [ ] Esta expressão cria uma matriz 2x3 que contém a matriz . Esta expressão cria uma matriz 2x3 que contém a matriz . O final da primeira linha encerra a primeira linha da matriz. Esta expressão cria uma matriz vazia, que não contém linhas nem colunas. Observe que isto não é a mesma coisa que uma matriz com zeros. Observe que o número de elementos em cada linha de uma matriz precisa ser o mesmo. o número de elementos em cada coluna também. Uma expressão como [1, 2, 3; 4, 5] é ilegal, pois a linha 1 tem três elementos e a linha 2 tem somente dois. Erros de Programação O número de elementos em todas as linhas de uma matriz deve ser o mesmo, e o número de elementos em todas as colunas também. Tentar definir uma matriz com números diferentes de elementos nas linhas ou nas colunas produzirá um erro quando a declaração for executada. As expressões utilizadas para iniciar matrizes podem incluir operações algébricas e a totalidade ou partes de matrizes previamente definidas. Por exemplo, as declarações de atribuição a = [ 0 1+7 ] b = [ a(2) 7 a ] definirão uma matriz a = [ 0 8 ] e uma matriz b = [ 8 7 0 8 ]. Nem todos os elementos de uma matriz precisam estar definidos quando ela é criada. Se um elemento específico da matriz estiver definido e um ou mais elementos antes dele não, os elementos anteriores serão automaticamente criados e iniciados com o valor zero. Por exemplo, se c não foi previamente definido, a declaração c(2, 3) = 5; produzirá a matriz . De maneira similar, uma matriz pode ser estendida pela especificação de um valor para um elemento adiante do tamanho definido. Por exemplo, suponha a matriz d = [ 1 2 ]. Então a declaração d(4) = 4; produzirá a matriz d = [ 1 2 0 4 ]. 6 Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Resumo: Prof. Marcelo Luiz Silva 2013-2 O ponto e vírgula no final de cada declaração de atribuição anterior temuma função especial: ele suprime o eco automático de valores que ocorre normalmente quando uma expressão é avaliada em uma declaração de atribuição. Se uma declaração de atribuição é digitada sem o ponto e vírgula, os resultados da declaração são automaticamente exibidos na Janela do Console. Por exemplo: --> e = [1, 2, 3; 4, 5, 6] e = 1 2 3 4 5 6 Se um ponto e vírgula é colocado no final da declaração, o eco desaparece. O eco é uma forma excelente para verificar rapidamente seu trabalho, mas ele atrasa seriamente a execução de programas Scilab. Por esta razão, normalmente suprimimos o eco o tempo todo. Ecoar os resultados de cálculos, entretanto, é uma ótima técnica prática de depuração. Se você não está seguro a respeito dos resultados de uma declaração de atribuição específica, simplesmente não coloque o ponto e vírgula; os resultados serão exibidos na Janela do Console assim que a declaração for executada. Boa Prática de Programação Use um ponto e vírgula no final de todas as declarações de atribuição Scilab para suprimir o eco de valores atribuídos na Janela do Console. Isto acelera muito a execução dos programas. Boa Prática de Programação Se for preciso examinar os resultados de uma declaração durante a depuração de um programa, você pode remover o ponto e vírgula daquela declaração para que seus resultados sejam ecoados na Janela do Console. 2.2.2 – Iniciando com Expressões de Atalho É simples criar pequenas matrizes listando explicitamente cada termo da matriz, mas o que ocorre se a matriz contiver centenas ou mesmo milhares de elementos? Não é prático escrever separadamente cada elemento da matriz! O Scilab tem uma notação especial de atalho para essas circunstâncias, utilizando o operador dois-pontos. Este operador determina uma série de valores pela especificação do primeiro valor na série, o passo de incremento e o último valor na série. A forma geral de um operador de dois-pontos é: primeiro:incremento:último 7 Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Resumo: Prof. Marcelo Luiz Silva 2013-2 onde primeiro é o primeiro valor da série, incremento é o passo de incremento e último é o último valor da série. Se o incremento for um, ele pode ser omitido. Essa expressão irá gerar uma matriz contendo os valores primeiro, primeiro + incremento, primeiro + 2*incremento, primeiro + 3*incremento, etc. Por exemplo, a expressão 1:2:10 é um atalho para um vetorlinha 1x5 com os valores 1, 3, 5, 7 e 9. O próximo valor da série seria 11, mas este é maior que 10, portanto, a série termina em 9. -->x = 1:2:10 x = 1. 3. 5. 7. 9. Com a notação de dois-pontos, uma matriz pode ser iniciada com os cem valores da seguinte maneira --> angulos = (0.01:0.01:1.00) * %pi Expressões de atalho podem ser combinadas com o operador de transposição, ', para iniciar vetores coluna e matrizes mais complexas. O operador de transposição troca linhas e colunas de qualquer matriz à qual ele seja aplicado. Assim, a expressão f = [ 1:4 ]’; gera uma vetor-linha de quatro elementos [ 1 2 3 4 ], e depois transpõe esse vetor no vetor-coluna de quatro elementos . De maneira similar, as expressões g = 1:4; h = [ g’ g’ ] produzem a matriz . 2.2.3 – Iniciando com Funções Predefinidas Matrizes também podem ser iniciadas por meio de funções predefinidas no Scilab. Por exemplo, a função zeros pode ser utilizada para criar uma matriz de zeros do tamanho desejado. Existem muitas formas de função zeros. Se a função tiver um único argumento escalar, ela produzirá uma matriz quadrada utilizando o argumento único como o número de linhas e de colunas da matriz. Se a função tiver dois argumentos 8 Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Resumo: Prof. Marcelo Luiz Silva 2013-2 escalares, o primeiro será o número de linhas e o segundo, o número de colunas. Como a função size retorna dois valores com o número de linhas e de colunas na matriz, ela pode ser combinada com a função zeros para gerar uma matriz de zeros com o mesmo tamanho de outra matriz. Alguns exemplos para utilização da função zeros são apresentados a seguir: a b c d = = = = zeros(2); zeros(2, 3); [ 1 2; 3 4 ]; zeros( size(c) ); Essas expressões geram as seguintes matrizes: De maneira similar, a função ones pode ser utilizada para gerar matrizes que contêm uns, e a função eye para gerar matrizes identidade, nas quais os elementos da diagonal principal são uns e os outros elementos, zeros. A Tabela 2.1 apresenta uma lista de funções Scilab comuns e úteis para iniciar variáveis. Tabela 2.1 – Funções Scilab Úteis para Iniciar Variáveis Função Propósito zeros(n) Gera uma matriz n x n de zeros. zeros(m, n) Gera uma matriz m x n de zeros. zeros(size(arr)) Gera uma matriz de zeros do mesmo tamanho que arr. ones(n) Gera uma matriz n x n de uns. ones(m, n) Gera uma matriz m x n de uns. ones(size(arr)) Gera uma matriz de uns do mesmo tamanho que arr. eye(n) Gera uma matriz identidade n x n. eye(m, n) Gera uma matriz identidade m x n. Retorna o comprimento de um vetor ou a dimensão maior de length(arr) uma matriz bidimensional. Retorna dois valores, especificando o número de linhas e o size(arr) número de colunas em arr. 2.2.4 – Iniciando Variáveis com Entradas pelo Teclado Também é possível iniciar uma variável com dados digitados diretamente no teclado. Essa opção permite que um arquivo se script solicite ao usuário a entrada de 9 Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Resumo: Prof. Marcelo Luiz Silva 2013-2 valores durante a execução. A função input exibe um marcador da Janela do Console e espera o usuário digitar uma resposta. Por exemplo, considere a seguinte expressão: meuValor = input(“Entre com um valor: ”); Quando a expressão é executada, o Scilab escreve a cadeia “Entre com um valor: ” e espera a resposta do usuário. Se o usuário fornece um único número, ele pode ser simplesmente digitado. Mas se fornecer uma matriz, ela precisa ser cercada por colchetes. De qualquer maneira, o que for digitado será armazenado na variável meuValor quando a tecla <ENTER> for pressionada. Se apenas a tecla <ENTER> for pressionada, uma matriz vazia será criada e armazenada na variável. Se a função input tiver o caractere ‘s’ como segundo argumento, os dados de entrada serão devolvidos para o usuário como uma cadeia de caracteres. Assim, a expressão --> entrada1 = input("Entre com o dado: "); Entre com o dado: 1.23 armazena o valor 1.23 em entrada1, e a expressão --> entrada2 = input("Entre com o dado: ", ‘s’); Entre com o dado: 1.23 armazena a cadeia de caracteres “1.23” em entrada2. Teste 2.1 Este teste apresenta uma verificação rápida do seu entendimento dos conceitos apresentados nas Seções 2.1 e 2.2. Se você tiver problemas com o teste, releia as seções, pergunte ao seu professor ou discuta o material com um colega. 1) Qual a diferença entre uma matriz e um vetor? 2) Responda as questões seguintes considerando a matriz abaixo. a) Qual o tamanho de c ? b) Qual o valor de c(2, 3) ? c) Apresente os índices de todos os elementos cujo valor seja 0.6 . 3) Determine o tamanho das seguintes matrizes. Verifique suas respostas criando as matrizes no Scilab. Observe que as últimas matrizes podem depender das definições de matrizes definidas anteriormente neste exercício. a) u = [ 10 20*%i 10+20 ] b) v = [ -1; 20; 3 ] c) w = [ 1 0 -9; 2 -2 0; 1 2 3 ] d) x = [ u’ v ] e) y(3, 3) = -7; 10 Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Resumo: Prof. Marcelo Luiz Silva 2013-2 f) z = [ zeros(4, 1) ones(4, 1) zeros(1, 4)’ ]; g) v(4) = x(2, 1); 4) Qual o valor de w(2, 1) após a execução das declarações da questão 3? 5) Qual o valor de x(2, 1) após a execução das declarações da questão 3? 6) Qual o valor de y(2, 1) após a execução das declarações da questão 3? 7) Qual o valor de v(3)após a execução da declaração g) ? 2.5 - Valores Especiais O Scilab tem diversos valores especiais predefinidos, que podem ser utilizados a qualquer momento, sem terem sido iniciados antes. Uma lista dos valores predefinidos mais comuns é dada na Tabela 2.2. Esses valores predefinidos são armazenados em variáveis permanentes, as quais não podem ser modificadas pelo programador. Tabela 2.1 – Funções Scilab Úteis para Iniciar Variáveis Função Propósito Retorna o número de ponto-flutuante mais próximo do valor %pi de π. É a unidade imaginária usada nos números complexos; é o %i símbolo para . Retorna uma representação para o infinito positivo; -%inf %inf representa o infinito negativo. Retorna uma representação para um resultado não numérico %nan (not a number). Esta variável especial contém a data e a hora correntes na clock forma de um vetor-linha de 6 elementos, contento ano, mês, dia, hora, minuto e segundo. Contém a data corrente em formato de cadeia de caracteres, date como 14-Out-2013. %eps Este nome de variável abrevia epsílon. Ele representa a menor diferença entre dois números que pode ser representada no computador, ou seja, 2.220D-16. ans É uma variável especial, significa "resposta". A variável ans é criada automaticamente quando expressões não são atribuídas; ela contém a última expressão não-atribuída. 2.6 - Exibindo Dados de Saída 11 Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Resumo: Prof. Marcelo Luiz Silva 2013-2 Existem muitas maneira de exibir dados de saída no Scilab. A mais simples é uma já vista - simplesmente não escreva o ponto e vírgula no final da declaração e eles serão ecoados na Janela do Console. Iremos agora explorar algumas outras maneiras de exibir dados. 2.6.2 - A Função disp Outra maneira de exibir dados é a função disp. Ela aceita uma matriz como argumento e exibe o valor da matriz na Janela do Console. Se a matriz for uma cadeia de caracteres, então, a cadeia de caracteres contida na matriz é exibida, por exemplo: --> nome = [ "Rajesh Koothrappali" ]; -->disp(nome) Rajesh Koothrappali Esta função é frequentemente combinada com a função string (que converte um número em cadeia de caracteres) para criar mensagens exibidas na Janela do Console. Por exemplo, as declarações Scilab a seguir exibem "O valor de pi = 3.1416" na Janela do Console. A primeira declaração cria uma cadeia de caracteres que contém a mensagem, e a segunda declaração exibe a mensagem. -->mensagem = "o valor de pi = " mensagem = o valor de pi = 3.1415927 + string(%pi) Observação: quando se utiliza o operador + com cadeias de caracteres, tem-se como resultado a concatenação das cadeias. 2.6.3 - Saída Estruturada Usando a Função printf Uma forma ainda mais flexível de exibir dados é a função printf. Esta função exibe um ou mais valores juntamente com o texto relacionado e permite ao programador controlar a maneira como os valores são exibidos. Sua forma geral, quando utilizada para exibir dados na Janela de Comandos, é: printf(formato, dado) onde formato é uma cadeia de caracteres descrevendo a maneira como os dados devem ser exibidos, e dado é composto por um ou mais escalares ou matrizes para exibição. A cadeia de caracteres formato contém o texto a ser apresentado, mais caracteres especiais descrevendo o formato dos dados. Por exemplo, a função printf("valor de pi = %f \n", %pi) apresenta valor de pi = 3.141593, seguido de uma mudança de linha. Os caracteres %f são denomindos caracteres de conversão; indicam que um valor na lista de dados deveria ser apresentado em formato de ponto flutuante naquele local da cadeia 12 Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Resumo: Prof. Marcelo Luiz Silva 2013-2 de formatação. Caracteres como o \n são denominados caracteres de escape. O caracteres \n indica que uma mudança de linha deve ser incluída, para que o texto seguinte inicie em uma nova linha. Alguns tipos de caracteres de conversão e de escape são apresentados na Tabela 2.4. Tabela 2.4 – Caracteres Especiais Comuns em Cadeias de Caracteres de Formatação para o printf Caracteres de Formatação %d %e %f %g \n Resultados Exibe o valor com inteiro. Por exemplo: --> printf("%d", 3.1415) 3 Exibe o valor em formato exponencial. Por exemplo: --> printf("%e", 3.1415) 3.141500e+00 Exibe o formato em ponto flutuante. Por exemplo: --> printf("%f", 3.1415) 3.141500 Exibe o valor em formato de ponto flutuante ou exponencial o que for mais curto. --> printf("%g", 3.1415) 3.1415 Muda de linha. É também possível especificar a largura do campo de exibição de um número e o número de casas decimais a serem exibidas. Isto é feito especificando-se a largura e a precisão depois do sinal % e anes do f. Por exemplo, a função printf("O valor de pi = %6.2f", %pi) exibe O valor de pi = 3.14. Os caracteres de conversão %6.2f indicam que o primeiro item de dados na função deveria ser apresentado em formato de ponto flutuante em um campo com seis caracteres de largura, incluindo dois dígitos depois do ponto decimal. Se o item de dados fosse negativo, o sinal também estaria incluído nos seis caracteres. Observe o trecho de programa: --> x = 2 + 6*%i x = 2. + 6.i -->printf("Complexo = %f", x) Complexo = 2.000000 -->disp(x) 13 Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Resumo: Prof. Marcelo Luiz Silva 2013-2 2. + 6.i A função printf tem uma limitação bastante significativa: ela somente exibe a porção real de um valor complexo. Essa limitação pode levar a resultados enganosos quando os cálculos produzem respostas complexas. Nesses casos, é melhor utilizar a função disp para exibir as respostas. No exemplo a seguir, as seguintes declarações calculam um valor complexo C1 e exibem esse valor utilizando printf e disp: --> C1 = 2 * (1 - 2*%i)^3; -->texto = "disp: C1 = " + string(C1); --->disp(texto) disp: C1 = -22+%i*4 -->printf("printf: C1 = %8.4f", C1) printf: C1 = -22.0000 Observação: a função printf ignorou a parte imaginária de C1. Erros de Programação A função printf exibe somente a parte real de um número complexo, que pode produzir resultados enganosos quando se trabalha com valores complexos. 2.12 - Exemplos 2.3 - Conversão de Temperatura Construa um programa Scilab que leia uma temperatura de entrada em graus Fahrenheit, converta essa temperatura para um valor absoluto em Kelvin e escreva o resultado. Solução A relação entre temperatura em graus Fahrenheit (ºF) e temperatura em Kelvin (K) pode ser obtida de livros de Física. Ela é (2.5) Os livros de Física também nos dão valores de exemplo, nas duas escalas de temperatura, que podemos usar para verificar a operação de nosso programa. Dois desses valores são: Ponto de ebulição da água: 212 ºF = 373,15 K Ponto de sublimação do gelo seco: -110 ºF = 194,26 K 14 Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Resumo: Prof. Marcelo Luiz Silva 2013-2 1. 2. 3. 4. Nosso programa precisa efetuar os seguintes passos: pedir para o usuário digitar a temperatura de entrada em ºF; ler a temperatura de entrada; calcular a temperatura em Kelvin usando a equação (2.5); Escrever o resultado e terminar. Usaremos a função input para obter a temperatura em graus Fahrenheit e a função printf para escrever o resultado. Uma solução de programa é apresentada a seguir. // Variáveis do Programa - Dicionário de Dados // temp_f : temperatura em graus Fahrenheit // temp_k : temperatura em graus Kelvin // Solicite ao usuário a entrada da temperatura temp_f = input("Digite a temperatura em graus Fahrenheit: "); // conversão para Kelvin temp_k = (5/9) * (temp_f - 32) + 273.15; // escrevendo o resultado printf("%6.2f graus Fahrenheit = %6.2f Kelvin.\n", ... temp_f, temp_k); A seguir, temos dois exemplos de execuções deste programa. Exemplo 1 Digite a temperatura em graus Fahrenheit: 212 212.00 graus Fahrenheit = 373.15 Kelvin. Exemplo 2 Digite a temperatura em graus Fahrenheit: -110 -110.00 graus Fahrenheit = 194.26 Kelvin. Neste programa, ecoamos os valores de entrada e escrevemos os valores de saída juntamente com as unidades. Os resultados desse programa só fazem sentidos se as unidades (graus Fahrenheit e Kelvin) forem incluídas com seus valores. Como regral geral, as unidades associadas a um dados de entrada devem ser sempre apresentadas junto com a solicitação de valor, e as unidade associadas a qualquer dado de saída devem ser apresentadas junto com o valor. 15 Universidade Federal de Ouro Preto – UFOP Instituto de Ciências Exatas e Biológicas – ICEB Departamento de Computação – DECOM Resumo: Prof. Marcelo Luiz Silva 2013-2 Boa Prática de Programação Sempre inclua as unidades apropriadas junto com os valores que você ler ou escrever em um programa. O programa do exemplo anterior exibe boas práticas de programação. Ele tem um dicionário de dados que define o significado de todas as variáveis no programa, utiliza nomes descritivos de variáveis, e unidades apropriadas são associadas a todos os valores apresentados. 16