Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade de São Paulo - USP Instituto de Ciências Matemáticas de São Carlos - ICMSC Departamento de Ciências da Computação e Estatística - SCE Manual de Utilização e Principais Comandos da Linguagem Fortran (versão 5.1) Claudia Regina Milaré Profa. Dra. Roseli Francelin São Carlos, junho de 1996 1. Introdução Este trabalho destina-se aos alunos de graduação interessados em obter conhecimentos básicos em programação de computador utilizando a Linguagem Fortran (versão 5.1). O trabalho pretende apenas descrever os camandos principais da Linguagem Fortran (versão 5.1), dando ênfase nas mudanças que ocorreram nesta nova versão. Nas primeiras seções, é descrito alguns conceitos básicos sobre a estrutura de um computador e seu funcionamento. Em seguida, o que é um sistema de computação, um breve comentário à respeito do sistema operacional MS-DOS e a descrição de algoritmos e de uma linguagem utilizada para elaborá-los. Logo após, é apresentado os principais comandos da Linguagem Fortran (versão 5.1) e finalmente a conclusão. 2. Estrutura Básica de um Computador Os computadores evoluiram muito desde a sua invenção, estão cada vez menores e mais poderosos, mas independente de seu tamanho e complexidade, eles possuem os seguintes componentes básicos: a Unidade Central de Processamento (UCP ou CPU) que engloba a Unidade Lógica Aritmética (ULA) e a Unidade de Controle, a Memória e as Uunidades de Entrada e Saída. A memória do computador é dividida em dois tipos: memória principal e memória secundária ou externa. A memória principal ou memória RAM como é mais conhecida, é onde as informações recebidas e processadas pelo computador são armazenadas durante a sessão de trabalho. RAM é a abreviação de "Random Access Memory", ou Memória de Acesso Aleatório. As informações gravadas nela ficam disponíveis enquanto o computador está ligado. A memória secundária é composta de dispositivos eletromagnéticos, mais conhecidos como discos. Existem dois tipos de disco: discos rígidos com grande capacidade de armazenamento de informações e de acesso extremamente rápido e os discos flexíveis ou disquetes que são dispositivos com menor capacidade. A memória do computador, tanto a principal quanto a secundária, é dividida em unidades pequenas e de mesmo tamanho, chamadas palavras, tendo cada uma seu próprio endereço. Cada palavra é capaz de armazenar uma informação, como por exemplo, o resultado de uma operação aritmética. As unidades de saída de dados são normalmente os monitores, onde são mostrados os comandos que são passados para o computador e os resultados das informações depois de processadas e interpretadas; e as impressoras onde normalmente são impressos os dados em forma de relatórios, arquivos fontes de programas, cartas, etc. As unidades de entrada de dados fornecem um meio pelo qual as informações são transmitidas ao computador para serem interpretadas e processadas. Os mais populares são o teclado e o disco. Na Unidade Lógica Aritmética (ULA) são processadas todas as operações lógicas e aritméticas do computador. A Unidade de Controle controla a ação de todos os dispositivos do computador. Operando sob o controle das instruções do programador que está na memória principal, a Unidade de Controle faz com que o dispositivo de entrada leia os dados, transfere valores adequados da memória para a ULA, armazena e recupera dados e resultados intermediários guardados na memória principal, e, transfere os resultados para o dispositivo de saída. 3. Funcionamento de um Computador Um programa é uma seqüência de instruções que descrevem as ações que se deseja que o computador realize, ou seja, um programa consiste na tradução de um algoritmo em uma forma inteligível para a máquina, o que é feito com o uso de uma linguagem de programação. Um programa especificado (escrito) em uma linguagem de alto nível é denominado programa fonte. Para que um programa possa ser executado, ele deve passar pelo processo de Compilação, onde se traduzirá o programa fonte para o programa objeto, que são arquivos de código objeto com a extensão “.OBJ”. Estes arquivos contêm um código binário que não pode ser entendido na exibição e nem na impressão. Em seguida, o processo de Composição é chamado, o editor de ligação (linker) toma um ou mais arquivos “.OBJ” e processa-os juntos para produzir um único arquivo executável com a extensão “.EXE”. O editor de ligação pode também processar o código proveniente de bibliotecas de rotinas pré-compiladas fornecidas pelo Fortran. E, finalmente, o programa poderá ser executado. A Figura 1 mostra as etapas de um processamento. Etapa 1: COMPILAÇÃO Etapa 2: COMPOSIÇÃO Etapa 3: EXECUÇÃO Programa Fonte Programa Objeto Tradutor (Compilador) Editor de Ligação Subprogramas Compilados Independentemente Dados Programa Executável Resultados Figura 1 - Etapas de um processamento. Um programa fonte pode ser escrito em várias linguagens, mas geralmente, as que são utilizadas são chamadas de Linguagens de Alto Nível. Estas linguagens expressam as soluções usando uma notação mais dirigida para os problemas, mais próxima da linguagem natural. A Linguagem FORTRAN nasceu em 1956 e foi a primeira linguagem de programação de alto nível a ser proposta. Foi sugerida visando a resolução de problemas da área científica através do uso de computadores. Seu nome é uma composição de FORmula TRANslation. 4. Sistemas de Computação Um Sistema de Computação consiste de hardware (dispositivos físicos), programas do sistema e programas aplicativos, como mostra a Figura 2. Um computador seria apenas um amontoado de fios e dispositivos eletromecânicos sem nenhuma utilidade prática se não existisse o software, que é o conjunto de programas e dados que juntamente com o hardware proporcionam ao usuário o controle e utilização dos recursos oferecidos pelo computador. Com o software o computador pode armazenar, processar, recuperar informações, além de editar cartas e programas e proporcionar diversos outros recursos. O software pode ser dividido em dois tipos: programas do sistema, que fazem o gerenciamento e o controle das operações básicas do computador e programas aplicativos, que são programas desenvolvidos para atender as necessidades dos mais diversos tipos de usuários. O mais importante dos programas do sistema é o sistema operacional, que controla todos os recursos do computador e fornece a base para a utilização dos mais diversos tipos de aplicativos. Máquina Linguagem de Máquina Sistema Operacional Compiladores Sistema Bancário Reservas Aéreas Jogos Editores Interpretador Hardware Programas do Sistema Aplicativos Figura 2 - Esquema de um Sistema de Computação. 5. Sistema Operacional DOS O Sistema Operacional DOS ("Disk Operating System") da Microsoft é um dos mais utilizados no mundo. Ele é chamado de sistema de gerenciamento de disco porque trata do gerenciamento de discos, arquivos em disco e do fluxo de informações entre as várias partes de um sistema de computação. O MS-DOS trabalha com comandos que informam ao sistema as tarefas a serem realizadas. Esses comandos permitem a realização das seguintes tarefas: • gerenciar arquivos e diretórios; • manutenção de discos (rígidos e flexíveis); • configurar o hardware; • otimizar o uso da memória; • melhorar o desempenho dos programas; • personalizar o MS-DOS. O MS-DOS tem várias versões desde o seu lançamento em 1981. A primeira versãofoi denominada e numerada como 1.00. A partir de então foram feitas várias revisões e adicionados novos recursos para adaptar o MS-DOS à sofisticação cada vez maior dos computadores e corrigir os erros apresentados. Por isso vários comandos e conceitos básicos do MS-DOS podem ser aplicados para qualquer versão. A versão do MS-DOS é mostrada toda vez que o computador é ligado e o mesmo é trazido ("carregado") para a memória do computador. 6. Algoritmos Um conceito básico de programação é o de algoritmo. Programar é basicamente construir algoritmos. Algoritmo é uma seqüência ordenada e sem ambigüidade de instruções que levam à solução de um determinado problema. Um algoritmo deve ser detalhado suficientemente até o ponto onde o executor (agente) possa compreender. Alguns exemplos de algoritmos são: ∗ receita de bolo ∗ indicação de um endereço residencial ∗ planta residencial Exemplo de um algoritmo para a utilização de um telefone: INÍCIO Retire o fone do gancho Disque o número desejado Converse Recoloque o fone no gancho FIM Suponha que se quer instruir um robô doméstico para dar recados. Na forma acima, este algoritmo não está adequado, uma vez que não pressupõe alguns problemas. Há detalhes essenciais que não foram especificados: ∗ linha ocupada ∗ linha errada ∗ ligação não se completar É preciso detalhar mais o algoritmo acima para que o robô saiba agir quando algo acontecer. INÍCIO Retire o fone do gancho Se o telefone funciona então Início Disque o número desejado Se a linha não está ocupada então Início Espere um tempo Se atenderem então Início Converse Fim Fim Fim Recoloque o fone no gancho FIM O algoritmo está completo? E no caso de ligação errada? INÍCIO Retire o fone do gancho Se o telefone funciona então Início Disque o número desejado Se a linha não está ocupada então Início Espere um tempo Se atenderem então Início Se o número digitado está correto então Início Converse Fim Fim Fim Fim Recoloque o fone no gancho FIM Exemplo de um algoritmo que lê vários números e seleciona o menor deles. INÍCIO Leia um número Repita o processo Leia outro número Se este número for menor que o anterior então Guarde este número Jogue fora o anterior Senão Guarde o anterior Jogue este fora Fim Até ler todos os números Exiba o número guardado FIM Exercícios: 1. Elabore um algoritmo para mudar um pneu furado. Admita que estão disponíveis um macaco e outro pneu em boas condições. 2. Elabore um algoritmo para fazer pipoca, usando manteiga, sal e milho de pipoca. 7. Linguagem Pseudo-Código Existem várias formas de se construir um algoritmo: através de pseudo-código, fluxogramas e cartas NS. A seguir é descrita a linguagem pseudo-código para a elaboração de algoritmos. 7.1 Dados, Tipos de Dados e Operações Primitivas O objetivo principal de um computador é manipular dados ou informações. A maioria dos computadores é capaz de lidar com vários tipos diferentes de dados. Os tipos de dados são: ∗ Numéricos: inteiros e reais. ∗ Não numéricos: caracteres e lógicos. Exemplos: Inteiros: 13 -6 1000 20 -233 Reais: 23.8 -1378.2 -8.8 -42.321 As frações devem ser armazenadas na forma decimal: 5.32 x 10-2 1.29 x 103 0.528 x 10-10 1234567810 → 123456 x 104 ou 0.123456 x 1010 Caracteres: ' A ' ' B ' ' 2 ' ' $ ' ' + ' ' = ' Cadeia de Caracteres é um conjunto de caracteres ou strings: ' MARIA ' ' ICC ' ' 325 ' Na prática, uma cadeia de caracteres pode ter até 255 caracteres. Internamente, o computador registra os caracteres da cadeia (excluindo os apóstrofos) e o número de caracteres desta cadeia. Os dados lógicos têm apenas dois valores possíveis: VERDADEIRO e FALSO. Os dados podem ser manipulados utilizando os seguintes operadores: Adição: + Subtração: - Multiplicação: * Divisão: / Exponenciação: ↑ No cálculo de uma expressão numérica, a prioridade das operações é a seguinte: 1. ↑ exponenciação (da direita para esquerda) 2. - , + sinal dos operandos 3. * , / multiplicação e divisão (da esquerda para direita) 4. + , - adição e subtração (da esquerda para direita) Os parênteses podem mudar a prioridade das operações. Parênteses mais internos devem ser resolvidos primeiro. Exemplos: 1. 13 * 6 + 3 = 78 + 3 = 81 2. 8 + 7 * 3 + 4 * 5 = 8 + 21 + 20 = 49 3. 3 ↑ 2 - 2 * 3 = 9 - 2 * 3 = 9 - 6 = 3 4. 2 ↑ 3 ↑ 2 = 2 ↑ 9 = 512 5. (2 ↑ 3) ↑ 2 = 8 ↑ 2 = 64 6. -3 * 7 + 2 ↑ 3 / 4 - 6 = -3 * 7 + 8 / 4 - 6 = -21 + 2 - 6 = -25 7. (3 * (6 + 2)) * 8 = (3 * 8) * 8 = 24 * 8 = 192 Observação: se os termos da operação são todos inteiros, o resultado será inteiro; caso contrário, será real. Exemplos: 3 + 2 = 5 3 + 2.0 = 5.0 3 * 2.2 = 6.6 8 / 2 = 4 8 / 5 = 1 (resultado truncado) 8.0 / 5 = 1.6 2 ↑ 3 = 8 (a base e o expoente podem ser inteiros ou reais) 7.2 Variáveis e Expressões Uma variável em um programa pode ser definida como uma entidade que possui um valor e é conhecida no programa por um nome (identificador). Por exemplo: x b b ac a 1 4 2 2 = − + − x b b ac a 2 4 2 2 = − − − Esta relação, utilizando variáveis, define uma fórmula geral que pode ser aplicada a cálculos específicos. a, b, c, x1 e x2 são as variáveis que fazem parte desta fórmula. Estas variáveis podem tomar valores diferentes em tempos diferentes, já a constante 2 nunca muda. Se num dado instante: a = 1, b = 6 e c = 9, os valores de x1 e x2 seriam respectivamente -3 e -3. Observações: 1. Uma variável pode receber muitos valores, mas somente um único valor em um determinado instante. 2. Em programas de computadores, os nomes das variáveis devem lembrar o seu uso. Por exemplo: RAIZ1 para x1 e RAIZ2 para x2. 3. Existem algumas regras, que dependem da linguagem utilizada, para se dar nomes às variáveis. Na linguagem FORTRAN, o nome deve sempre começar com uma letra seguida de outros caracteres quaisquer, exceto o branco ( ' ' ). Exemplos válidos: TOTAL MAIOR A123 LADO2 RAIZ1 Exemplos não válidos: 3ARQ DOIS P 7.3 Comando de Atribuição Uma forma de dar valores às variáveis é através do comando de atribuição. Forma Geral: VARIÁVEL ← EXPRESSÃO onde EXPRESSÃO é uma combinação de variáveis, constantes e operadores. Exemplos: A ← 3 B ← -265 C ← A + B - 2 TERMO ← 3 + 20 - 7 * C D ← 'casa' A ← 10 E ← 'A' 7.4 Tipos de Variáveis Toda variável tem um tipo que determina o tipo de dado que ela poderá assumir. Geralmente estes tipos são: Inteiro, Real, Caracter e Lógico. Uma variável do tipo inteiro, por exemplo, só pode armazenar constantes do tipo inteiro. Se A é uma variável do tipo real, só pode armazenar valores reais. Um erro ocorrerá ao se atribuir a uma variável do tipo caracter um valor numérico. Neste caso, não há compatibilidade entre os tipos. No entanto, não ocorrerá erro ao se atribuir um valor inteiro a uma variável real, ou um valor real a uma variável inteira. Suponha a variável A do tipo inteira e a variável B do tipo real: A ← 20.834 B ← -27 Automaticamente, o valor -27é convertido para real, -27.0. O valor de 20.834 é convertido para inteiro, 20. Observe que no caso de 20.834, o valor é truncado, não correspondendo ao valor real. Deve-se portanto evitar as conversões. 7.5 Aplicações de Algoritmos Para escrever os primeiros algoritmos, será utilizada a linguagem pseudo-código que facilita a tradução para uma linguagem adequada de programação; e ainda permite ao desenvolvedor pensar no problema e não na máquina que vai executar o algoritmo. Exemplos: 1. Dados dois números, imprimir o dobro da soma destes números. INÍCIO INTEIRO: A, B, C, D LEIA(A,B) C ← A + B D ← 2 * C ESCREVA(D) FIM INÍCIO INTEIRO: A, B, C LEIA(A,B) C ← 2 * (A + B) ESCREVA(D) FIM 2. Ler quatro notas, calcular a média aritmética e imprimir as notas e a média com mensagens significativas. INÍCIO REAL: N1, N2, N3, N4, MEDIA LEIA(N1, N2, N3, N4) MEDIA ← (N1 + N2 + N3 + N4) / 4.0 ESCREVA( ' Nota 1 = ', N1) ESCREVA( ' Nota 2 = ', N2) ESCREVA( ' Nota 3 = ', N3) ESCREVA( ' Nota 4 = ', N4) ESCREVA( ' Media = ', MEDIA) FIM Para verificar se o algoritmo acima está certo, será feito um rastreamento deste algoritmo. Suponha que as notas são: 4.0, 2.0, 5.0, 8.0. N1 ← 4.0 N2 ← 2.0 N3 ← 5.0 N4 ← 8.0 MEDIA ← (4.0 + 2.0 + 5.0 + 8.0) / 4.0 = 4.75 A impressão será: Nota 1 = 4.0 Nota 2 = 2.0 Nota 3 = 5.0 Nota 4 = 8.0 Media = 4.75 3. Escrever um algoritmo para ler uma temperatura dada na escala Celsius e imprimir a equivalente em Farenheit ( °F = 9 °C + 32 ). 5 INÍCIO LEIA(C) F ← 9/5 * C + 32 ESCREVA( 'Temperatura em graus Celcius: ' , C) ESCREVA( 'Temperatura equivalente em graus Farenheit: ', F) FIM 8. Principais Comandos da Linguagem Fortran A seguir os principais comandos da Linguagem Fortran (Versão 5.1) serão apresentados, destacando-se as diferenças existentes entre a nova versão e a anterior. 8.1 Declaração de Variáveis Todas as variáveis utilizadas devem estar declaradas no início do programa. Exemplos: INTEGER A REAL B LOGICAL C CHARACTER*5 D (pode-se armazenar uma palavra de no máximo 5 caracteres na variável D) 8.2. Comando READ O comando READ especifica o dispositivo de leitura dos dados, associa um formato à leitura dos dados, especifica a lista de variáveis que irão receber os dados lidos e ainda aciona a ação leitura. Forma Geral: READ(i,n) <lista de variáveis> onde: i - é um número inteiro e especifica o dispositivo de entrada dos dados (i será * para o teclado). n - número do comando FORMAT, que especifica o formato dos dados de entrada (n será * quando não se tem nenhum comando FORMAT associado ao comando READ). <lista de variáveis> - nomes de variáveis, separadas por vírgula. Exemplo: READ(*,*) A, B Serão lidos valores de dados digitados no teclado e atribuídos às variáveis A e B. Os dados digitados devem ser compatíveis com os tipos das variáveis que irão recebê-los. 8.2 Comando WRITE O comando WRITE especifica o dispositivo de impressão/exibição dos dados, associa um formato de exibição/impressão dos dados, especifica a lista de variáveis ou constantes a serem exibidas ou impressas e aciona a ação exibição/impressão. Forma Geral: WRITE(i,n) <lista> onde: i - é um número inteiro e especifica o dispositivo que será utilizado para exibição (i será * para o vídeo) ou impressão (i será o número da impressora definida pelo comando OPEN). n - número do comando FORMAT, que especifica o formato dos dados de impressão (n será * quando não se tem nenhum comando FORMAT associado ao comando WRITE). <lista> - nomes de variáveis ou expressões aritméticas, separadas por vírgula. Exemplo: WRITE(*,10) A, B Os valores das variáveis A e B serão exibidos na tela conforme o formato especificado pelo comando FORMAT de número 10. 8.3 Comando FORMAT O comando FORMAT permite especificar a forma em que os dados serão lidos ou impressos pelos comandos de E/S associados. Forma Geral: n FORMAT('x', esp1, ..., espn) onde: n - é o número do comando FORMAT. x - é um caracter de controle e só deve ser utilizado quando o FORMAT estiver associado a um comando de saída (assumir x = 1X). espi - são especificações de formato. A seguir serão apresentadas algumas especificações de formato: 1. Especificação numérica para inteiro: especifica quantos caracteres serão reservados para o dado numérico inteiro. Forma Geral: I n onde: I - representa o formato inteiro. n - indica o comprimento do dado em caracteres. Exemplo: Para imprimir os valores abaixo, o formato mínimo a ser utilizado é: 23 → I2 +245 → I4 - 4567 → I5 2. Especificação numérica para real: especifica quantos caracteres serão reservados para o dado numérico real. Forma Geral: F n.d onde: F - representa o formato ponto flutuante. n - indica o comprimento do dado em caracteres. d - indica o número de casas decimais. Exemplo: X = 32.125 WRITE(*, 10) X 10 FORMAT(1X, F7.3) Será impresso: b 3 2 . 1 2 5 3. Especificação numérica para real com exponente: define o comprimento do campo e o número de casas decimais associados aos valores reais com expoente, lidos ou escritos. Forma Geral: E n.d onde: E - representa o formato ponto flutuante com expoente. n - indica o comprimento do dado em caracteres. d - indica o número de casas decimais. Exemplo: Para imprimir totalmente os valores reais abaixo, o formato mínimo a ser utilizado é: 1.23E+03 → E8.2 -5.1E-02 → E8.1 4. Especificação para caracteres: especifica quantos caracteres serão aceitos para o dado alfanumérico. Forma Geral: An onde: A - representa o formato alfanumérico. n - indica o número de caracteres. Exemplo: B = 'LINGUAGEM' WRITE(*, 5) B 5 FORMAT(1X, A6) Será impresso: LINGUA 5. Formatos de edição. nX - define n posições em branco na linha. '...' - exibe os caracteres que estiverem entre apóstrofo. nH - exibe os próximos n caracteres depois de H. / - salta para a linha seguinte. \ - não avança o cursor para a próxima linha e o conserva na posição corrente. TLn - retrocede o cursor n posições para a esquerda. TRn - retrocede o cursor n posições para a direita. Tn - posiciona o cursor na n-ésima posição da linha. n( ) - repete n vezes os atributos entre parênteses. Observações Gerais: 1. Cada comando READ ou WRITE provoca, respectivamente, a leitura e a escrita de um registro (uma linha de dados, no caso da tela do terminal). 2. Na leitura se existirem mais dados do que variáveis, serão lidos somente um número igual ao de variáveis especificadas no comando READ. 3. 2I4 = I4, I4 2(F10.2, F5.2) = F10.2, F5.2, F10.2, F5.2 4. Na leitura, se o formato não for compatível, isto é, variável de um tipo, formato de outro, ocorrerá erro de execução. Exemplos: a) INTERGER V1, V2, V3 V1 = 39 READ(*,10) V2, V3 10 FORMAT(I5, I4) WRITE(*,20) V1, V2, V3 20 FORMAT(1X, I4, I12, I8) ... Com os seguintes dados de entrada: 7 2 6 5 4 - 2 5 6 A impressão será (onde b= ' '): bb39bbbbbbb72654bbbb-256 Se V1 = 76543, teremos: ****bbbbbbb72654bbbb-256 b) A = 6.5 B = -256.496 C = 1.03239 D = 63425.67 WRITE(*,10) A, B, C, D 10 FORMAT(1X, F10.5, F7.3, F12.4, F5.2) ... Será impresso: bbb6.50000*******bbbbbb1.0324***** c) X = 725.6975 Y = -0.0005239 Z = 76.599 A = -16.5E7 WRITE(*,40) X, Y, Z, A 40 FORMAT(1X, E14.7, E13.5, E14.3, E7.5) ... Será impresso: b0.7256975Eb03b-0.52390E-03bbbbb0.766Eb02 d) READ(*,30) A, B, C, D 30 FORMAT(2(F10.2, F5.2)) Ao ler estes dados: bbbbb28.38b1.002002002.32-4.81 Eles serão armazenados assim: A = 28.38 B = 1.0 C = 2002002.32 D = -4.81 e) READ(*,30) A, B, C 30 FORMAT(F10.2, 2( F5.2)) A será impresso na 1° linha, B e C serão impressos na 2° linha. 8.4 Comando OPEN Este comando juntamente com os comandos WRITE e FORMAT pode ser utilizado para exibir textos na impressora ou em arquivos. A sintaxe do comando OPEN para exibição de textos na impressora é descrito abaixo. Forma Geral: OPEN(m, FILE = 'PRN') m, número que identifica a impressora. WRITE(m, n) m, número que foi associado à impressora. n, número do comando FORMAT associado. n FORMAT(formato) n, número que identifica o comando FORMAT. Em formato podem aparecer além dos atributos utilizados para o vídeo, os seguintes atributos que devem aparecer necessariamente na primeira posição de impressão: 'b' - avança uma linha. '0' - avança duas linhas. '1' - causa o salto para uma nova página. '+' - impressão superposta da linha. Exemplo: PROGRAM TESTE OPEN(1, FILE = 'PRN') WRITE(*,1) 1 FORMAT(24(/), 27X,'Teste de impressão de textos', //, 17X, 'Ligue a *impressora e posicione no inicio da pagina!') WRITE(1,2) 2 FORMAT(23X, 'Instituto de Ciencias Matematicas',/, 27X, 25H Univ *ersidade de Sao Paulo) WRITE(1,3) 3 FORMAT('0', T30, 'Linguagem Fortran',\) WRITE(1,4) 4 FORMAT(1X, TR2, 11H Fundamentos, TL13, '-') WRITE(1,5) 5 FORMAT('+', T30, 17('-'', 3X, 11('-')) WRITE(1,6) 6 FORMAT(33X, 'Modulo Basico' / '1') STOP END 8.5 Estrutura de Iteração 8.5.1 Estrutura PARA O comando FORTRAN que implementa diretamente a estrutura: para I de M até N passo P faça comandos; fim para; é o DO, cujas formas principais serão apresentadas a seguir. Forma Geral: DO n, i = m1, m2, m3 Bloco A n CONTINUE onde: n - número do comando que delimita o tamanho do laço (a vírgula após o n é opcional). i - variável do DO. m1 - valor inicial de i. m2 - valor máximo de i para teste. m3 - incremento. mi - i = 1, 2, 3, pode ser expressões inteiras ou reais. Bloco A - composto por combinações de comandos da linguagem. Exemplo: o trecho do algoritmo abaixo, soma os números pares de 100 a 200, e é traduzido logo em seguida para a linguagem FORTRAN utilizando o comando DO. ... SOMA ← 0 PARA PAR ← 100 ATÉ 200 PASSO 2 FAÇA SOMA ← SOMA + PAR FIM PARA ESCREVA(SOMA) ... SOMA= 0 DO 20, PAR = 100, 200,2 SOMA = SOMA + PAR 20 CONTINUE WRITE(*,30) SOMA 30 FORMAT(1X, 'SOMA = ', F5.2) Forma Geral: DO i = m1, m2, m3 Bloco A END DO onde: i - variável do DO. m1 - valor inicial de i. m2 - valor máximo de i para teste. m3 - incremento. mi - i = 1, 2, 3, pode ser expressões inteiras ou reais. Bloco A - composto por combinações de comandos da linguagem. Observações: 1. O incremento m3 pode ser omitido e neste caso, é assumido valor 1. 2. O último comando do Bloco A, pode ser qualquer comando da linguagem, exceto: GOTOs, END, RETURN ou DO. 3. A variável i não pode ser alterada por nenhum comando dentro do laço. 4. Se os laços terminam no mesmo comando, pode ser o mesmo CONTINUE para todos eles. 5. A variável i pode ser um número inteiro ou real. 8.5.2 Estrutura ENQUANTO O comando FORTRAN que implementa a estrutura: enquanto <condição> faça comandos; fim enquanto; é o WHILE, que é descrito a seguir. Forma Geral: DO WHILE (condição) Bloco A END DO onde: condição - condição de parada. Bloco A - composto por combinações de comandos da linguagem. Exemplo: O programa abaixo exibe os valores dos senos de ângulos em radianos de 0.0, 0.1, 0.2, ... até 6.3. A função SIN( ) do Fortran é utilizada no programa para fornecer o valor dos ângulos. PROGRAN SENO REAL A A = 0.0 DO WHILE (A.LE.6.3) WRITE(*,*) A, SIN(A) A = A + 0.1 END DO STOP END 8.6 Conjuntos e Variáveis Indexadas Os tipos básicos (inteiro, real, caracter e lógico) não são suficientes para expressar estruturas de dados (forma sistemática de representar as informações) em algoritmos. Torna-se necessário a criação de novos tipos. As variáveis de um programa podem ser classificadas em simples ou compostas. As variáveis simples armazenam num dado instante, um único valor. As variáveis compostas podem armazenar um conjunto de valores de mesmo tipo, num dado instante, que podem ser acessados individualmente. Vetores e Matrizes são variáveis compostas que ajudam na representação de dados e serão apresentados abaixo. 8.6.1 Vetores Um vetor é um conjunto unidimensional de variáveis. Cada elemento de um vetor é tratado como se fosse uma variável simples. Para referência a um elemento do vetor utiliza-se o nome do vetor e a identificação do elemento (índice) entre parênteses. Por exemplo, se desejarmos atribuir o valor 234 ao elemento identificado pelo índice 3 de um vetor de inteiros, teremos: VETOR 234 1 2 3 4 5 Observações: 1. As variáveis indexadas em FORTRAN podem ter até 7 índices. 2. O índice de uma variável I(V(I)), pode assumir qualquer valor inteiro. 3. Todos os elementos de um vetor têm o mesmo tipo. O tipo de um vetor é definido assim como variáveis simples. 4. Um elemento de um vetor pode ser usado numa expressão como uma variável qualquer. Exemplo: X(I + 1) = X(I) * X(I - 1) 5. O número de elementos de um vetor e limites superior e inferior para o índice devem ser declarados no início do programa. Declarações de tipos para vetores: Forma Geral: <tipo> A(n, m) onde: <tipo> - pode se INTEGER ou REAL ou CHARACTER, etc. A - é o nome do vetor. n - limite inferior do índice (se for omitido é assumido 1). m - limite superior do índice. Observação: Os limites (superior e inferior) podem ser números inteiros positivos e negativos. Na versão anterior, deveriam ser maiores ou iguais a 1. Exemplos: 1. REAL VETOR1(100), A(20) 2. INTEGER A(0:10), B(-3,1) 3. PROGRAM EXEMPLO REAL X(100), MAIOR INTEGER N, I, POS WRITE(*,*) 'Entre com o número de elementos que serão lidos.' READ(* ,*) N IF (N.LE.100) THEN WRITE(*,*) ' Digite os valores reais. ' READ(*,10) ( X(I), I=1, N) 10 FORMAT (10(F8.3)) MAIOR = X(1) POS = 1 IF (N.NE.1) THEN DO I=2, N IF (X(I).GT.MAIOR) THEN MAIOR = X(I) POS = IEND IF END DO END IF WRITE(*,20) POS, MAIOR 20 FORMAT(1X, I3, F8.3) ELSE WRITE(*,*) ' Número de elementos do vetor muito grande.' ENDIF STOP END O programa acima lê números reais e os armazena em um vetor real, encontra o maior valor e sua posição no vetor e então os exibe. 8.6.2 Matrizes Podemos encontrar diversos problemas que envolvam em sua solução arranjos homgêneos multidimensionais. Para resolver este tipo de problema pode-se utilizar matrizes, que são representadas com o uso de variáveis indexadas com mais de um índice. Cada índice referencia uma dimensão. Exemplo: 2 31 A = 23 25 7 39 A(1,2) = 31 A - nome da matriz 1 - 1° índice (número que indica a linha) 2 - 2° índice (número que indica a coluna) Declaração de tipos para matrizes: INTEGER MATRIZ(3,4) REAL A(2,2), B(10,10) 8.7 DO IMPLÍCITO para entrada e saída de dados Forma Geral: (<lista de variáveis>, i = m1, , m2, m3) onde: i, m1, m2, m3 têm os mesmos significados do comando DO. O DO IMPLÍCITO deve vir sempre associado a um comando de entrada ou saída e tem funcionamento análogo ao do comando DO. Exemplos: a) READ(*,10) (X(I), I = 1, 10) 10 FORMAT(10(F5.2, 1X)) Com os comandos acima, pode-se ler um vetor de dez posições com os valores reais lidos todos na mesma linha. b) WRITE(*,10) (A(J), J = 1, 10) 10 FORMAT(1X, F5.2) Os comandos acima imprimem os valores do vetor A, cada um em uma linha. O controle é feito pelo comando FORMAT. É equivalente a: DO J=1, 5 WRITE(*,10) A(J) 10 FORMAT(1X, F5.2) END DO c) READ(*,10) (A(I), B(I), I = 1, 4) 10 FORMAT(8F5.2) Neste caso, A(1), B(1), ..., A(4), B(4) serão lidos todos em uma mesma linha. d) READ(*,10) N, (A(I), I = 1, N) 10 FORMAT(I2, /, (F5.2)) Aqui, os valores serão lidos um em cada linha. e) READ(*,10) N, (A(I), I = 1, N) 10 FORMAT(I2, /, N(F5.2)) A linguagem FORTRAN não suporta as especificações do FORMAT como acima, pode-se usar o artifício abaixo. READ(*,10) (A(I), I = 1, N) 10 FORMAT(10F8.2) f) DO I=1, 4 WRITE(*,10) (A(I,J), J = 1, 3) 10 FORMAT(1X, 3F5.2) END DO Imprimi uma matriz A de ordem 4x3, com cada linha da matriz em uma linha. g) WRITE(*,10) ((A(I,J), J=1, 3), I=1, 4) 10 FORMAT(1X, 3F5.2) Faz o mesmo do exemplo anterior. h) WRITE(*,10) ((A(I,J), J=1, 5), I=1, 5) 10 FORMAT(1X, 25F5.2) Imprime uma matriz de ordem 5x5, sendo um elemento seguido de outro em uma mesma linha. i) DO I=1, 5 WRITE(*,10) (A(I,J), J = 1, 5) 10 FORMAT(1X, F5.2) END DO ou WRITE(*,10) ((A(I,J), J=1, 5), I=1, 5) 10 FORMAT(1X, F5.2) Imprimi uma matriz de ordem 5x5, um elemento seguido do outro, um em cada linha. j) O programa abaixo efetua o produto entre duas matrizes. PROGRAM PRODUTO REAL A(20,20), B(20,20), C(20,20) INTEGER I, J, K, T, N, M C Leitura de dados READ(*,*) N, K, M IF (N.LE.20.AND.K.LE.20.AND.M.LE.20) THEN C Leitura da matriz A. READ(*,5) ((A(I,J), J=1, N), I=1, K) 5 FORMAT(16F5.2) C Leitura da matriz B. READ(*,5) ((B(I,J), J=1, K), I=1, M) C Cálculo da matriz C = A*B DO I=1, N DO J=1, M C(I,J) = 0 DO T=1, K C(I,J) = C(I, J) + A(I,T) * B(T,J) END DO END DO END DO C Impressão da matriz C DO I=1, N WRITE(*,10) (C(I,J), J=1, M) 10 FORMAT(1X, 10(F5.2, 3X)) END DO ELSE WRITE(*,*) 'Estes valores são inválidos!') END IF STOP END 8.8 Subprogramas: FUNCTION e SUBROUTINE Subprograma é uma unidade de programa independente, simples, que geralmente realiza uma única função e que tem associado um identificador (nome); sua execução é subordinada ao programa principal ou a uma outra unidade de programa. Uma unidade de programa é uma seqüência de comandos FORTRAN terminada pelo comando END. 8.8.1 Funções O subprograma FUNCTION é definido pelo programador e pode compreender mais de um comando da linguagem FORTRAN. Forma Geral: < tipo > FUNCTION < nome> (a1, a2, ..., an) Declarações Comandos Executáveis RETURN END onde: < tipo > pode ser real e inteiro. a1, a2, ..., an são parâmetros e podem ser variáveis simples ou compostas. O subprograma deve ser finalizado com o comando RETURN que indica o fim lógico do subprograma, isto é, o controle agora deve retornar ao ponto onde a função foi referenciada no programa principal. Dentro do corpo do subprograma FUNCTION, em pelo menos um ponto deve aparecer o nome deste subprograma como uma variável, isto é, assumindo algum valor compatível com o seu tipo. Exemplo: C Programa Principal PROGRAM EXEMPLO2 REAL X(100), Y INTEGER N READ(*,*) N READ(*,*) ( X(I), I = 1, N ) ... Y = SOMA(N,X) WRITE(*,*) Y STOP END REAL FUNCTION SOMA(N,X) INTEGER I, N REAL X(N) SOMA = 0 DO I=1, N SOMA = SOMA + X(I) END DO RETURN END Este subprograma recebe um vetor X real e sua dimensão N como entrada e retorna um só valor para o programa principal. 8.8.2 Sub-Rotinas As SUB-ROTINAS também são subprogramas com duas diferenças básicas dos subprogramas FUNÇÕES: 1. A sub-rotina retorna nenhum, um ou vários valores através de seus argumentos. 2. A sub-rotina é chamada através de um comando específico, o comando CALL. Forma Geral: SUBROUTINE < nome> (a1, a2, ..., an) Declarações Comandos Executáveis RETURN END onde: a1, a2, ..., an são parâmetros formais que podem ser variáveis simples ou compostas. A lista de parâmetros pode ser inteiramente omitida. Exemplo: Vamos considerar um programa que encontra o maior valor entre N valores lidos e armazenados num vetor real, além de encontrar também a posição do vetor que este maior valor está. O programa funcionará para qualquer número de dados até 100. PROGRAM PRINCIPAL REAL X(100), MAIOR INTEGER N, I, POS WRITE(*,*) 'Entre com o número de elementos que serão lidos.' READ(* ,*) N WRITE(*,*) ' Digite os valores reais. ' READ(*,10) ( X(I), I=1, N) 10 FORMAT (10(F8.3)) AIOR = X(1) POS = 1 IF (N.NE.1) THEN DO I=2, N IF (X(I).GT.MAIOR) THEN MAIOR = X(I) POS = I END IF END DO END IF WRITE(*,20) J, MAIOR 20 FORMAT(1X, I3, F8.3) STOP END Em síntese o programa lê N e um vetor X como dados de entrada, encontra o maior elemento do vetor e sua posição armazenando-os nas variáveis MAIOR e POS respectivamente e imprime estes valores. Vamos ver como o programa acima pode ser escrito utilizando um subprograma sub-rotina. C PROGRAMA PRINCIPAL PROGRAM PRINCIPAL REALX(100), MAIOR INTEGER N, I, POS WRITE(*,*) 'Entre com o número de elementos que serão lidos.' READ(* ,*) N WRITE(*,*) ' Digite os valores reais. ' READ(*,10) ( X(I), I=1, N) 10 FORMAT (10(F8.3)) C CHAMADA DA SUBROTINA MAX CALL MAX(N, X, POS, MAIOR) C IMPRESSÃO DOS RESULTADOS WRITE(*,20) J, MAIOR 20 FORMAT(1X, I3, F8.3) STOP END SUBROUTINE MAX (N, X, POS, MAIOR) INTEGER N, I, POS REAL X(N), MAIOR MAIOR = X(1) POS = 1 IF (N.NE.1) THEN DO I=2, N IF (X(I).GT.MAIOR) THEN MAIOR = X(I) POS = I END IF END DO END IF RETURN END Observações: 1. Os parâmetros no comando sub-rotina são meramente formais, pois eles são substituídos por seus nomes verdadeiros quando o comando CALL é executado. No entando, os parâmetros da lista SUBROUTINE devem corresponder em número e em tipo com os parâmetros do comando CALL. 2. Números de comandos e variáveis são locais para subprogramas. Eles podem ser idênticos com outros subprogramas ou com o programa principal. 3. Os subprogramas podem vir antes ou depois do programa principal. 4. Os argumentos podem ser expressões (ex: contantes, variáveis, expressões aritméticas, etc). 5. Recursividade não é permitida na linguagem FORTRAN. 6. Deve-se fazer um algoritmo ou diagrama estruturado para cada unidade de programa. Exemplo: O programa abaixo calcula a seguinte matriz: D = x * A + y * B onde: A e B são matrizes quadradas de ordem N lidas. x corresponde ao menor elemento da diagonal principal da matriz A. y corresponde ao menor elemento da diagonal principal da matriz B. Na implementação que segue foram utilizados subprogramas para determinar o menor elemento de um vetor, para calcular o produto de um número por uma matriz e para somar duas matrizes de ordem NxM. C Sub-rotina que efetua a soma de duas matrizes SUBROUTINE SOMA(P,Q,N,M,S) INTEGER N, M, I, J REAL P(10,10),Q(10,10),S(10,10) DO I=1, N WRITE(*,*) (P(I,J), J=1, M) END DO WRITE(*,*) 'Matriz Q' DO I=1, N WRITE(*,*) (Q(I,J), J=1,M) END DO DO I=1,N DO J=1,M S(I,J) = P(I,J) + Q(I,J) END DO END DO RETURN END C Sub-rotina que calcula o produto de um número por uma matriz SUBROUTINE PROD(T,N,M,K,TP) INTEGER N, M, I, J REAL T(10,10), TP(10,10), K DO I=1,N DO J=1,M TP(I,J) = K * T(I,J) END DO END DO RETURN END C Função que encontra o menor elemento de um vetor REAL FUNCTION VETOR_ME(V,N) REAL V(N) INTEGER N, I VETOR_ME = V(1) DO I=2, N IF (V(I).LT.VETOR_ME) THEN VETOR_ME = V(I) END IF END DO RETURN END PROGRAM PRINCIPAL REAL A(10,10), B(10,10), D(10,10), X, Y, VA(10), VB(10) INTEGER I, J C LEITURA DAS MATRIZES WRITE(*,*) 'Entre com a dimensao da matriz!' READ(*,*) N WRITE(*,*) 'Entre com os valores da matriz A.' DO I=1, N READ(*,*) (A(I,J), J=1, N) WRITE(*,*) (A(I,J), J=1, N) END DO WRITE(*,*) 'Entre com os valores da matriz B.' DO I=1, N READ(*,*) (B(I,J), J=1, N) WRITE(*,*) (B(I,J), J=1, N) END DO C CRIAR UM VETOR APARTIR DA DIAGONAL PRINCIPAL DE A DO I=1, N VA(I) = A(I,I) VB(I) = B(I,I) END DO C CHAMADA AO SUBPROGRAMA FUNCTION VETOR_ME X = VETOR_ME(VA,N) WRITE(*,*) 'Menor elemento de A = ', X Y = VETOR_ME(VB,N) WRITE(*,*) 'Menor elemento de B = ', Y C CHAMADA AO SUBPROGRAMA PROD CALL PROD(A,N,N,X,A) DO I=1, N WRITE(*,*) (A(I,J), J=1, N) END DO CALL PROD(B,N,N,Y,B) DO I=1, N WRITE(*,*) (B(I,J), J=1, N) END DO C CHAMADA AO SUBPROGRAMA SOMA CALL SOMA(A,B,N,N,D) C IMPRESSAO DA MATRIZ D NA FORMA MATRICIAL DO I=1, N WRITE(*,*) (D(I,J), J=1, N) END DO END 8.9 Arquivos Registros são as menores entidades que podem ser lidas por um comando de E/S. Um exemplo de registro é uma linha do terminal. O sistema operacional insere uma marca (caracter de controle) indicando o fim de um registro. Em síntese, um registro é uma seqüência de caracteres. Na tela do vídeo, um registro consiste de 80 caracteres. Para discos e fitas, pode-se criar registros de qualquer tamanho (registro de 1 caracter, registro de 100 caracteres, ...). Arquivo é uma seqüência de registros. Para indicar o final de arquivo, existe um registro especial denominado registro de fim-de-arquivo. Cada arquivo é caracterizado por um conjunto de atributos: a) Nome: o nome de um arquivo especificado através de um programa é o mesmo pelo qual o arquivo é reconhecido pelo sistema operacional. b) Método de Acesso: pode ser seqüêncial ou direto. Seqüêncial: os registros são lidos seqüencialmente, na mesma ordem em que foram escritos. Direto: permite a leitura e escrita em qualquer ordem, conforme definido pelo programador. Neste caso, cada registro pode ser acessado diretamente, sem ter que acessar o restante do arquivo. Todos os registros têm que ter o mesmo tamanho. Neste tipo de acesso cada registro é identificado por seu número, onde este número é um inteiro positivo único. Nos discos podemos implementar ambos os métodos de acesso. De forma geral, os demais dispositivos de armazenamento só permitem acesso seqüêncial. c) Estrutura: formatado ou não formatado. 8.9.1 Comando OPEN Especifica os atributos de um arquivo. Forma Geral: OPEN (<unidade> [, FILE = <nome>] [, STATUS = ' <status> '] [, ACCESS = ' <acesso> '] [, FORM = ' <formato> '] [, IOSTAT = <var1>] [, RECL = <comprimento do arquivo>]) onde: <unidade> - número inteiro que designa um arquivo ou dispositivo de E/S. <status> - OLD, NEW (default: OLD) <acesso> - SEQUENTIAL, DIRECT (default: SEQUENTIAL) <formato> - FORMATTED, UNFORMATTED (default: se SEQUENTIAL → FORMATTED se DIRECT → UNFORMATTED) <comprimento do arquivo> - somente se o acesso é DIRETO (número de bytes no PC). 8.9.2 Comando CLOSE Fecha um arquivo. Forma Geral: CLOSE (<unidade> [, STATUS = ' <status> '] [, IOSTAT = <var1>] ) onde: <status> - KEEP, DELETE (default: KEEP). 8.9.3 Comando READ Lê registros de um arquivo. Forma Geral: READ (<unidade> [, <especificador de formato>] [, END = <num1>] [, ERR = <num2>] [, IOSTAT = <var1>] [, REC = <número registro>]) lista de variáveis onde: [ ] - item opcional. <unidade> - número da unidade associado ao arquivo. <especificação do formato> - número do comando FORMAT ou *. <num1> - número de um comando executável FORTRAN para o qual o controle é transferido quando é encontrado o fim-de-arquivo. <num2> - número de um comando executável quando ocorre erro. <var1> - variável do tipo inteiro que armazenará um valor do status de E/S. se var1 = 0, não houve erro. se var1 < 0, fim-de-arquivo. se var1 > 0, erros. <número registro> - somente usado para arquivo de acesso direto, especifica o número do registro que será acessado. 8.9.4 Comando WRITE Escreve registros em um arquivo. Forma Geral:WRITE (<unidade> [, <especificador de formato>] [, END = <num1>] [, ERR = <num2>] [, IOSTAT = <var1>] [, REC = <número registro>]) lista de variáveis e/ou expressões onde: [ ] - item opcional. <unidade> - número da unidade associado ao arquivo. <especificação do formato> - número do comando FORMAT ou *. <num1> - número de um comando executável FORTRAN para o qual o controle é transferido quando é encontrado o fim-de-arquivo. <num2> - número de um comando executável quando ocorre erro. <var1> - variável do tipo inteiro que armazenará um valor do status de E/S. se var1 = 0, não houve erro. se var1 < 0, fim-de-arquivo. se var1 > 0, erros. <número registro> - somente usado para arquivo de acesso direto, especifica o número do registro que será acessado. 8.9.5 Comandos BACKSPACE, REWIND, ENDFILE, EN Backspace: posiciona o arquivo no início do registro anterior ao registro corrente. Rewind: posiciona o arquivo no ínicio, ou seja, no primeiro registro. Endfile: escreve um registro de fim-de-arquivo em um arquivo. Exemplos: O programa ESCREVE, cria um arquivo chamado TESTE.DAT e grava neste arquivo nomes e telefones fornecidos pelo teclado. PROGRAM ESCREVE CHARACTER NOME*10, FONE*10 OPEN(3,FILE='TESTE.DAT', STATUS = 'NEW') C ----Leitura de dados WRITE(*,*) 'Entre com nome e telefone!' READ(*,5) NOME, FONE 5 FORMAT(2A7) DO WHILE (NOME.NE.'zzzzzzz'.AND.NOME.NE.'ZZZZZZZ') WRITE(3,5) NOME, FONE WRITE(*,*) 'Entre com nome e telefone!' READ(*,5) NOME, FONE END DO ENDFILE(3) CLOSE(3,STATUS = 'KEEP') STOP END O programa LE1, lê nomes e telefones do arquivo TESTE.DAT e mostra estes dados no vídeo. A variável ESTADO irá identificar o final do arquivo, ela será igual a 0 enquanto houver registros para ler. PROGRAM LE1 CHARACTER NOME*10, FONE*10 INTEGER ESTADO OPEN(3,FILE='TESTE.DAT', STATUS = 'OLD') REWIND(3) C ----Leitura de dados do arquivo READ(3,5,IOSTAT=ESTADO) NOME, FONE DO WHILE(ESTADO.EQ.0) WRITE(*,*) 'Nome = ', nome, 'Fone = ', fone READ(3,5,IOSTAT=ESTADO) NOME, FONE 5 FORMAT(2A7) END DO ENDFILE(3) CLOSE(3,STATUS = 'KEEP') STOP END O programa LE2, também lê nomes e telefones do arquivo TESTE.DAT e mostra estes dados no vídeo, mas usa para isto a variável EOF irá identificar o final do arquivo. PROGRAM LE2 CHARACTER NOME*10, FONE*10 OPEN(3,FILE='TESTE.DAT', STATUS = 'OLD') REWIND(3) C---- ----Leitura de dados DO WHILE(.NOT. EOF(3)) READ(3,5) NOME, FONE WRITE(*,*) 'Nome = ', nome, 'Fone = ', fone 5 FORMAT(2a3) END DO ENDFILE(3) CLOSE(3,STATUS='KEEP') STOP END 9. Conclusão Este trabalho descreveu os principais comandos da Linguagem Fortran (versão 5.1), além de apresentar alguns conceitos básicos sobre computação e programas de computadores. 10. Bibliografia [Cereda 87] Cereda, R. L. D.; Maldonado, J. C. Introdução ao FORTRAN 77 para Microcomputadores. McGraw-Hill, 1987. [Pressman 83] Pressman, R. S. Software Engineering: a Practitioner's Approach. Tokyo, McGraw-Hill, 1983.
Compartilhar