Baixe o app para aproveitar ainda mais
Prévia do material em texto
Universidade Federal de Uberlaˆndia Faculdade de Cieˆncias Integradas do Pontal Apostila de FORTRAN Autores: Caroline Ariosi Gustavo Ferreira Silva Mauricio Gonc¸alves Cervi Vin´ıcius Andreoli Marques Vin´ıcius Gonc¸alves de Souza Supervisora: Profa. Patricia Cristina Venturini Ituiutaba - MG 1 de dezembro de 2016 Suma´rio 1 INTRODUC¸A˜O 4 1.1 COMPILADOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1.1 COMO COMPILAR UM ARQUIVO NO LINUX? . . . . . . . . . . . . 4 1.2 MAIS SOBRE O FORTRAN 77 . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.2.1 REGRAS DE POSIC¸A˜O DE COLUNAS . . . . . . . . . . . . . . . . . . 5 2 ESTRUTURA DO PROGRAMA 6 3 DECLARAC¸A˜O DE VARIA´VEIS 8 3.1 TIPOS DE VARIA´VEIS - DECLARAC¸A˜O . . . . . . . . . . . . . . . . . . . . 9 3.2 VARIA´VEIS INDEXADAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.3 COMANDO DATA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4 COMANDOS PARA ENTRADA E SAI´DA DE DADOS 13 4.1 COMANDOS WRITE E PRINT . . . . . . . . . . . . . . . . . . . . . . . . . . 13 4.2 COMANDO READ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 4.3 COMANDO DE ABERTURA DE ARQUIVO . . . . . . . . . . . . . . . . . . . 15 4.3.1 COMANDO OPEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 4.4 COMANDO FORMAT PARA FORMATAC¸A˜O DE DADOS . . . . . . . . . . . 17 4.4.1 Formato de impressa˜o (usado no comando “write”) . . . . . . . . . . . . 18 4.4.2 Formato de leitura (usado no comando “read”) . . . . . . . . . . . . . . 20 5 ESTRUTURA SEQUENCIAL E OPERAC¸O˜ES ARITME´TICAS 22 5.1 COMANDOS ARITME´TICOS . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 6 ESTRUTURA DE CONDIC¸A˜O 24 6.1 COMANDO IF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 6.2 COMANDO SELECT CASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 7 ESTRUTURA DE REPETIC¸A˜O 31 7.1 COMANDO DO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 7.2 COMANDO DO WHILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 8 DESVIOS NA ESTRUTURA DE PROGRAMAC¸A˜O 35 8.1 COMANDO GO TO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 9 VETORES E MATRIZES 37 9.1 VETORES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 9.1.1 COMANDO IMPLI´CITO DE REPETIC¸A˜O PARA LEITURA E ES- CRITA DE VETOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 9.2 MATRIZES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 2 SUMA´RIO 3 9.2.1 COMANDO IMPLI´CITO DE REPETIC¸A˜O PARA LEITURA E ES- CRITA DE MATRIZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 10 FUNC¸O˜ES INTRI´NSECAS 44 11 FUNC¸O˜ES EXTERNAS E SUB-ROTINAS 46 11.1 FUNC¸A˜O EXTERNA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 11.2 SUB-ROTINA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Cap´ıtulo 1 INTRODUC¸A˜O FORTRAN e´ a primeira linguagem de programac¸a˜o considerada de alto n´ıvel, desenvolvida por John Backus, em 1954 na IBM, e comercializada em 1957. Apesar de ser uma linguagem desenvolvida na de´cada de 50, atualmente, a famı´lia de linguagens de programac¸a˜o FORTRAN e´ bastante utilizada e difundida pelo mundo. A palavra FORTRAN e´ derivada de “FORmula TRANslation” (em portugueˆs: “traduc¸a˜o de fo´rmulas”). Considerada uma linguagem simples, o FORTRAN consiste em uma sequeˆncia de comandos, com palavras-chave, cada um e´ escrito em uma linha. Desde sua origem, a linguagem FORTRAN recebe atualizac¸o˜es e modificac¸o˜es, e, convencionalmente, a versa˜o fica conhecida pelos dois u´ltimos algarismos do ano em que foi modificada. Algumas das verso˜es sa˜o: FORTRAN 66, FORTRAN 77, FORTRAN 90, FOR- TRAN 95. As verso˜es mais recentes do FORTRAN aceitam os programas escritos nas verso˜es antigas tambe´m. Nesta apostila sera´ usada a versa˜o 77 da famı´lia de linguagens FORTRAN, ale´m de serem introduzidos alguns recursos do FORTRAN 90. 1.1 COMPILADOR Toda linguagem de programac¸a˜o esta´ relacionada com um compilador. O compilador e´ um programa instalado no sistema para que possa tornar executa´vel um arquivo texto que conte´m comandos em uma certa linguagem (programa fonte). Se o arquivo texto apresentar erros que na˜o condizem com a linguagem adotada, o compilador apontara´ os erros no momento da compilac¸a˜o. Caso contra´rio, se o programa fonte estiver de acordo com a linguagem, o compilador gerara´ um arquivo em uma linguagem de ma´quina de acordo com o que foi escrito, sendo este executa´vel pelo processador. O compilador livre gfortran e´ um dos compiladores que permitem a compilac¸a˜o com o FORTRAN 77. 1.1.1 COMO COMPILAR UM ARQUIVO NO LINUX? Tendo o programa fonte em arquivo de texto, e´ necessa´rio realizar os seguintes passos para compilar o mesmo no Linux, utilizando linhas de comando: (E´ necessa´rio que se encontre o local onde o arquivo esta´ salvo para torna´-lo executa´vel): 4 1.2. MAIS SOBRE O FORTRAN 77 5 • Abrir o terminal; • O comando “ls” (LiSt) torna vis´ıvel o que esta´ dentro de cada direto´rio; • O comando “cd” (Change Directory) seguido do nome do direto´rio que esteja dentro do atual, permite migrar para o direto´rio especificado; Exemplo: cd Documentos • Para retornar ao direto´rio anterior, utilize o comando “ cd ..”; • Econtrado o aquivo desejado, o seguinte comando tornara´ executa´vel o programa fonte: gfortran nome do programa –o nome do executavel • Finalmente, para executar o programa: ./nome do executavel O “nome do programa” e´ o nome do arquivo que conte´m o co´digo fonte (que deve ter a extensa˜o “. f”) e “nome do executavel” e´ o arquivo que podera´ ser executado a partir do co´digo fonte. Lembrando que o “nome do executavel” pode ser qualquer nome. 1.2 MAIS SOBRE O FORTRAN 77 1.2.1 REGRAS DE POSIC¸A˜O DE COLUNAS Todas as linhas do arquivo texto devem satisfazer uma estrutura que sera´ entendida pelo com- pilador. Assim, todo co´digo escrito na linguagem FORTRAN 77 deve obedecer as regras de posic¸a˜o de colunas, isto e´, cada coluna do arquivo deve conter apenas um caractere (letra, d´ıgito ou sinal especial). Vale lembrar que na˜o ha´ distinc¸a˜o entre letras maiu´sculas e minu´sculas den- tro da linguagem, exceto no caso de constantes ou varia´veis do tipo caractere. Deste modo, como exemplo, na˜o existe distinc¸a˜o entre os identificadores VAR, Var, VaR, var, vAR ou vaR. Coluna 1: pode ser utilizada para inserir comenta´rios com o aux´ılio da letra “c”, “ C” ou o caractere “*”. Assim, toda a linha e´ entendida como um comenta´rio. Outra forma de inserir comenta´rios em um programa e´ utilizando o ponto de exclamac¸a˜o “!”. Este caractere indica que o que esta´ escrito a` direita dele na linha e´ entendido como comenta´rio. Pode ser usado em qualquer lugar do co´digo fonte, inclusive apo´s os comandos. Coluna 1 a 5: podem receber nu´meros inteiros de 1 a 99999, sendo um d´ıgito por coluna, servindo como enderec¸o para alguns comandos identificarem aquela linha. Coluna 6: qualquer caractere, com excec¸a˜o do zero (0), inserido nessa coluna indica que o que vem a` direita e´ continuac¸a˜o da linha anterior. Coluna 7 – 72: usadas para declarar os comandos. Caso o comando passe da coluna 72, o recurso da coluna 6 deve ser utilizado. Coluna 73 - ... : utilizadas pelo compilador como identificac¸a˜o, portanto, na˜o devemos utilizar essas colunas. Cap´ıtulo 2 ESTRUTURA DO PROGRAMA A organizac¸a˜o do texto e´ uma sequeˆncia de comandos que precisam seguir regras. O programa tem que obedecer a uma ordem para ser considerado executa´vel. Geralmente, o programa consiste em um programaprincipal e, se necessa´rio, subprogramas. De um modo geral, um programa na linguagem FORTRAN obedece a seguinte estrutura: program nome do programa (cabec¸alho) (... comandos, um em cada linha ...) pause (... comandos, um em cada linha ...) stop (... comandos, um em cada linha ...) end subroutine nome da subroutine (cabec¸alho) (... comandos, um em cada linha ...) end function nome da function (cabec¸alho) (... comandos, um em cada linha ...) end O comando “program” define o in´ıcio do programa principal. O “nome do programa” fica a crite´rio do programador. O comando “program nome do programa” e´ descarta´vel, se na˜o colocado, o programa compila da mesma maneira. O comando “pause” pode ser eventualmente utilizado ao longo do programa para pausar a execuc¸a˜o, caso necessa´rio. O comando “stop” e´ opcional, servindo pra encerrar a execuc¸a˜o do programa naquele ponto. O comando “end” e´ usado para indicar o fim do programa principal e de subprobramas. 6 7 Vale ressaltar que so´ pode haver um programa principal e um ou mais subprogramas. No exemplo anterior, os subprogramas sa˜o representados por “subroutine” e “function”, ambos finalizados pelo comando “end”. Um subprograma e´ composto por uma se´rie de comandos fora do programa principal, cuja finalidade e´ de evitar repetitividade no programa principal ou ainda de dividir o programa em blocos, ficando mais fa´cil ser entendido por outra pessoa ou pelo pro´prio programador. Cap´ıtulo 3 DECLARAC¸A˜O DE VARIA´VEIS Uma varia´vel nada mais e´ do que um espac¸o na memo´ria que reservamos e colocamos um nome. Por exemplo, em um co´digo, podemos criar a varia´vel “nome” para armazenar o nome de uma pessoa, e a varia´vel “materiasconcluidas”, para indicar o nu´mero de mate´rias ja´ realizadas por um aluno. Chamamos esse espac¸o de memo´ria de “varia´vel”, pois o valor armazenado pode ser varia´vel ao longo do tempo, ao contra´rio de uma “constante”, que e´ um valor fixo. No exemplo acima, quando criamos uma varia´vel, precisamos especificar os tipos de dados que ela pode receber. Em FORTRAN, iremos estudar basicamente treˆs tipos de varia´veis: in- teira, real, caractere, complexa e lo´gica (integer, real, character, complex e logical). Nesta apostila, trabalharemos apenas com os tipos integer, real e character, por serem os mais uti- lizados. Assim, a varia´vel “nome” so´ pode receber valores do tipo texto (character), enquanto que a varia´vel “materiasconcluidas”, valores do tipo nume´rico, isto e´, inteiro (integer) ou real (real). Uma varia´vel esta´ associada a` um tipo e a` um nome (identificador). O nome de uma varia´vel e´, obrigatoriamente, iniciado por uma letra. Este nome pode conter letras, d´ıgitos e o caractere especial “ ”. O nome de uma varia´vel na˜o pode conter espac¸os em branco, acento ou cedilha. E´ bom lembrar que a declarac¸a˜o de uma varia´vel deve vir antes que ela seja usada, por isso mesmo, esta declarac¸a˜o, quando realizada, deve ser feita no cabec¸alho do programa. A linguagem FORTRAN reserva as letras ‘i, j, k, l, m, e n’ no in´ıcio dos nomes, para iden- tificar varia´veis nume´ricas inteiras, e as demais letras como reais. Este tipo de identificac¸a˜o so´ acontecera´ se o programador na˜o declarar nenhuma varia´vel. Esta e´ a declarac¸a˜o impl´ıcita padra˜o da linguagem. Pode ser usada tambe´m a forma de declarac¸a˜o impl´ıcita, utilizando o comando “implicit”. implicit real (a-h, o-z) implicit integer (i-n) No caso acima, declaramos todos os nomes iniciados com as letras de “i” ate´ “n” como sendo inteiras, e todos os nomes iniciados com as letras de “a” ate´ “h” e de “o” ate´ “z” como sendo reais. Assim, qualquer letra desse intervalo usada no in´ıcio de um nome ja´ declara o respectivo tipo de varia´vel. 8 3.1. TIPOS DE VARIA´VEIS - DECLARAC¸A˜O 9 Ha´ tambe´m a possibilidade de nenhuma varia´vel ser declarada implicitamente. Assim, o co- mando “implicit none” no in´ıcio do programa, deixara´ a obrigatoriedade ao programador de definir, no cabec¸alho, o tipo de cada varia´vel. Exemplo: implicit none integer a,b,c real i, j, k (... comandos, um em cada linha ...) end No exemplo acima, as varia´veis “a”, “b” e “c” foram declaradas do tipo inteiro enquanto “i”, “j”, e “k” foram declaradas do tipo real. 3.1 TIPOS DE VARIA´VEIS - DECLARAC¸A˜O Para a declarac¸a˜o, todas as varia´veis utilizadas precisam ser separadas por v´ırgulas. Cada varia´vel e´ declarada uma u´nica vez, mesmo que usada em va´rios momentos do programa. integer variaveis utilizadas real variaveis utilizadas character variaveis utilizadas Exemplo: integer area, o real i, j character nome, endereco Na declarac¸a˜o de varia´veis, pode-se aumentar a precisa˜o das varia´veis. Como indicado a seguir, o nu´mero apo´s o “*” e´ utilizado para aumentar a precisa˜o que a varia´vel ocupa na memo´ria do computador. INTEGER integer*1: –128 a 127 integer*2: –32 768 a 32 767 integer*4 ou somente integer : –2 147 483 648 a 2 147 483 647 REAL 10 CAPI´TULO 3. DECLARAC¸A˜O DE VARIA´VEIS real*4 ou somente real : ±2, 9× 10− 39 a ±1, 7× 10 + 38 real*8 : ±5, 6× 10− 309 a ±9, 0× 10 + 307 A declarac¸a˜o de tipo “double precision” e´ equivalente a “real*8”. E´ usada quando se precisa de alta precisa˜o dos nu´meros (precisa˜o dupla). CHARACTER character nome*n Sendo “n” a representac¸a˜o do nu´mero de caracteres que a varia´vel “nome” deve ter no programa. Exemplo: character casa*15 character*9 cidade, endereco No exemplo acima, a varia´vel “casa” deve conter no ma´ximo 15 caracteres, e as varia´veis “cidade” e “endereco” devem conter no ma´ximo 9 caracteres cada uma. 3.2 VARIA´VEIS INDEXADAS Ate´ agora, trabalhamos apenas com varia´veis simples, isto e´, varia´veis capazes de armazenar apenas um elemento na memo´ria. Veremos agora as varia´veis compostas homogeˆneas, tambe´m conhecidas como indexadas. Este tipo de varia´vel corresponde a um u´nico nome (identificador), capaz de armazenar va´rios elementos do mesmo tipo, ocupando va´rias posic¸o˜es de memo´ria, sendo que cada elemento e´ representado por um ı´ndice diferente. Os ı´ndices podem ser cons- tantes inteiras, varia´veis inteiras ou expresso˜es inteiras. As varia´veis indexadas precisam ser declaradas no cabec¸alho do programa. Ale´m disso, a varia´vel indexada e´ representada por um nome, seguido, entre pareˆnteses, de uma ou mais ı´ndices, dependendo, respectivamente, se ela e´ unidimensional (vetor) ou multidimensional (matriz). Veja, a seguir, algumas formas de se declarar varia´veis indexadas. integer a(3), i(-4:8) real b(5,4), c(0:3,4) character*10 nome(4) No exemplo anterior, foram criadas algumas varia´veis indexadas. As varia´veis indexadas “a” e “i” sa˜o do tipo “integer” e unidimensionais, entretando, a varia´vel “a” possui ı´ndices que variam de 1 a 3, enquanto na varia´vel “i”, os ı´ndices variam de -4 a 8. As varia´veis “b” e “c” sa˜o do tipo “real” e bidimensionais, sendo que, no caso da varia´vel “b”, os ı´ndices representando 3.3. COMANDO DATA 11 a linha variam de 1 a 5, enquanto os da coluna variam de 1 a 4. No caso da varia´vel “c”, os ı´ndices da linha variam de 0 a 3, enquanto os da coluna variam de 1 a 4. A varia´vel “nome” e´ do tipo “character” unidimensional e seus ı´ndices variam de 1 a 4, sendo que cada elemento armazenado neste vetor conte´m 10 caracteres. Outra forma de se declarar uma varia´vel indexada e´ utilizando o comando “dimension”, como no exemplo a seguir: integer b dimension b(5,4) Veremos mais detalhes sobre varia´veis indexadas no Cap´ıtulo 9. 3.3 COMANDO DATA E´ poss´ıvel atribuirmos valores (elementos) iniciais a`s varia´veis atrave´s do comando “data”. Estaatribuic¸a˜o e´ feita no cabec¸alho do programa, mas, tais valores, podem ser alterados ao longo do programa. Veja, a seguir, algumas formas de se utilizar o comando “data” no cabec¸alho do programa: integer a real b, c character*5 d data a / 2 /, b / 3.43 /, c / 3.43 /, d / “PAULO” / ou integer a real b, c character*5 d data a, b, c / 2, 3.43, 3.43 /, d / “PAULO” / ou integer a real b, c character*5 d data a, b, c / 2, 2 * 3.43 /, d / “PAULO” / Os treˆs exemplos anteriores sa˜o equivalentes e atribuem a` varia´vel inteira “a” o valor 2, a`s varia´veis reais “b” e “c” o valor 3.43 e a` varia´vel caractere “d” o texto “PAULO”. Em se tratando de varia´vel indexada, tambe´m podemos atribuir valores iniciais a` varia´vel atrave´s do comando “data”, como no exemplo: integer a(3,4) data a / 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12/ 12 CAPI´TULO 3. DECLARAC¸A˜O DE VARIA´VEIS Esta atribuic¸a˜o e´ equivalente a uma matriz “a” dada por: a = 1 4 7 10 2 5 8 11 3 6 9 12 Cap´ıtulo 4 COMANDOS PARA ENTRADA E SAI´DA DE DADOS Para que haja interac¸a˜o entre usua´rio e ma´quina, existem os comandos de entrada e sa´ıda de dados, que sa˜o u´teis para tornar acess´ıveis os resultados gerados pelo programa, sendo mostrados na tela ou enta˜o impressos em um arquivo de texto. 4.1 COMANDOS WRITE E PRINT O comando para sa´ıda de dados e´ chamado “write”. Com ele e´ poss´ıvel mostrar ao usua´rio as informac¸o˜es contidas no programa ou simplesmente pedir informac¸o˜es ao usua´rio. A sintaxe geral desse comando e´: write(unidade, formato) lista de saida Podendo escrever na tela do terminal atribuindo “*” ou o nu´mero “6” para a “unidade”, ou dentro de um arquivo externo utilizando a “unidade” espec´ıfica do arquivo aberto. Os dados podem estar formatados ou livres. Caso seja livre, o padra˜o e´ “*” no campo “formato”, mas se for formatado, este campo deve conter o valor inteiro positivo (ro´tulo) que indica o enderec¸o da linha que conte´m o formato adotado para aquela escrita, como veremos quando abordarmos o comando “format”. Em “lista de saida”, podem ser inseridos constantes, varia´veis e textos (estes u´ltimos entre aspas simples ou duplas), todos separados por v´ırgulas. Vejamos alguns exemplos: write(*,*) “Ola´”,nome,“, seja bem vindo!” write(*,*) “Fornec¸a o valor de x:” write(*,*) “O aluno foi aprovado com nota: ”, valor Outra forma de se escrever dados na tela e´ utilizando o comando “print”. A sintaxe do uso deste comando e´: print formato lista de saida 13 14 CAPI´TULO 4. COMANDOS PARA ENTRADA E SAI´DA DE DADOS No caso de formatac¸a˜o livre, pode-se utilizar “*” no lugar de “formato”. Exemplo: print * “O aluno foi aprovado com nota: ”, valor 4.2 COMANDO READ O comando para entrada de dados e´ o “read”, que tem por func¸a˜o “ler” os dados que sera˜o usados na execuc¸a˜o do programa. Esses dados podem ser inseridos atrave´s do usua´rio da ma´quina no pro´prio terminal, via teclado, ou enta˜o atrave´s de um arquivo de entrada existente contendo as informac¸o˜es. A sintaxe ba´sica desse comando e´: read(unidade, formato) lista de entrada sendo que, “unidade” corresponde ao local de onde sa˜o recebidos os dados. A unidade cuja leitura e´ feita diretamente a partir do teclado e´ definida por “*” ou pelo nu´mero “5”. Os dados a serem lidos e que esta˜o contidos na “lista de entrada”, podem estar formatados ou livres. No caso de formatac¸a˜o livre, utiliza-se “*” no lugar de “formato”. Veja o exemplo de leitura de duas varia´veis, “valor” e “N”, feita a partir do teclado, com formatac¸a˜o livre: read(*,*) valor, N Outra forma de se indicar formatac¸a˜o leitura a partir do teclado e´: read formato lista de entrada No caso de formato livre, pode-se utilizar “*” no lugar de “formato”. Exemplo: read * valor, N E´ interessante que, antes do comando de leitura a partir do teclado, aparec¸a na tela uma mensagem com a instruc¸a˜o do que o usua´rio deve digitar. Por exemplo: write(*,*) “Digite dois valores:” read(*,*) m, n O comando acima exigira´ que o usua´rio digite dois valores no terminal separados por espac¸o ou v´ırgula ou pela tecla “enter”, para que o programa leia e atribua tais valores a`s varia´veis “m” e “n”, respectivamente. Opc¸o˜es de “controle” podem ser utilizadas no comando “read”, de forma que sua sintaxe fique: read(unidade, formato, controle ) lista de entrada Algumas poss´ıveis opc¸o˜es de controle sa˜o dadas pelos comandos: err = rotulo end = rotulo 4.3. COMANDO DE ABERTURA DE ARQUIVO 15 sendo que “rotulo” e´ um nu´mero inteiro entre 1 e 99999, vinculado a algum comando (alguma linha do programa) para o qual o programa sera´ desviado caso o programa encontre algum erro na leitura dos dados (em se tratando da func¸a˜o “err” na opc¸a˜o de controle) ou detecte o fim de um arquivo de entrada de dados (em se tratando da func¸a˜o “end” na opc¸a˜o de controle). A utilizac¸a˜o da opc¸a˜o de controle “end” sera´ melhor entendida quando abordarmos a de es- trutura de repetic¸a˜o. Veja, a seguir, um exemplo de utilizac¸a˜o da opc¸a˜o de controle “err”: integer idade 20 write(*,*)“Digite sua idade.” read(*,*,err=20) idade O programa pede para que o usua´rio digite sua idade, pore´m, se for digitado qualquer caractere ou nu´mero real no lugar de um valor inteiro, o erro de leitura e´ identificado e o programa e´ direcionado para a linha “20”, nomeada pelo programador, ou seja, o programa volta a pedir a idade do usua´rio. Neste caso, o nu´mero “20” e´ o ro´tulo do comando (da linha) e deve ser colocado na regia˜o entre a primeira e quinta coluna antecedendo o comando. 4.3 COMANDO DE ABERTURA DE ARQUIVO Como visto anteriormente, a forma geral dos comandos “write” e “read” e´: write(unidade, formato) lista de saida e read(unidade, formato) lista de entrada No caso do comando “write”, substituir o campo “unidade” por “*” ou o nu´mero “6” equivale a` escrita no terminal (ou tela). No caso do comando “read”, substituir o campo “unidade” por “*” ou o nu´mero “5” equivale a` leitura a` partir do terminal (ou teclado). Entretanto, pode ser do nosso interesse utilizar um arquivo externo para se efetuar leitura ou escrita de dados. Neste caso, devemos utilizar, no lugar de “unidade” algum valor inteiro positivo, representado por uma constante, uma varia´vel ou uma expressa˜o. Este arquivo externo de entrada ou sa´ıda de dados tera´ o seguinte nome: fort.unidade Podemos, ainda, optar por atribuir um nome para este arquivo externo de entrada ou sa´ıda de dados. Para tanto, e´ necessa´ria a utilizac¸a˜o do comando “open”. 16 CAPI´TULO 4. COMANDOS PARA ENTRADA E SAI´DA DE DADOS 4.3.1 COMANDO OPEN O comando “open” vincula um nome de arquivo externo a` uma “unidade” de entrada ou sa´ıda. A forma mais ba´sica de uso do comando “open” e´: open( unidade, file=“nome do arquivo” ) O paraˆmetro “unidade” e´ escrito como um valor inteiro positivo, correspondente a` uma cons- tante, varia´vel ou expressa˜o, que representa a unidade lo´gica correspondente ao arquivo que esta´ sendo aberto, e pode ser escrito tambe´m da seguinte forma: “unit = unidade”. O paraˆmetro “nome do arquivo” e´ o nome do arquivo externo de entrada ou sa´ıda de dados que deve ser escrito entre aspas, simples ou duplas. Este arquivo externo deve estar no mesmo direto´rio que o arquivo na linguagem FORTRAN. Exemplo: open(unit=10, file=“entrada.txt”) read(10,*) valor Acima, o comando “read” consegue ler a primeira linha do arquivo “entrada.txt” e salva na varia´vel “valor”. Podemos, ainda, utilizar o comando “close” para fechar os arquivos que foram abertos. Este comando na˜o e´ de uso obrigato´rio, tendo em vista que todos os arquivos abertossa˜o fechados automaticamente quando um comando “stop” ou “end” e´ encontrado. Entretanto, algumas vezes o uso do comando “close” pode se mostrar prudente, especialmente quando se trabalha com grandes quantidades de dados. A forma geral de uso do comando “close” e´: close(unidade) quando se deseja fechar apenas uma unidade, ou: close(unidade1, unidade2, unidade3, ...) quando se deseja fechar mais de uma unidade. Exemplo de Fixac¸a˜o 4.1 Suponha um arquivo de entrada, denominado “entrada.txt”, con- tendo os seguintes dados: Julia 30 Marcio 50 Jose 76 Veremos, a seguir, um programa capaz de ler o arquivo “entrada.txt”, contendo os dados de entrada e, em seguida, apresenta´-los na tela. 4.4. COMANDO FORMAT PARA FORMATAC¸A˜O DE DADOS 17 character nome1*5, nome2*6, nome3*4 integer nota1, nota2, nota3 open(10, file=“entrada.txt”) read(10,*) nome1, nota1 read(10,*) nome2, nota2 read(10,*) nome3, nota3 write(*,*) nome1, nota1 write(*,*) nome2, nota2 write(*,*) nome3, nota3 close(10) end 4.4 COMANDO FORMAT PARA FORMATAC¸A˜O DE DADOS O “format” e´ usado para organizar seus dados, de forma padronizada. E´ poss´ıvel receber seus valores atrave´s do “read” e mostra´-los atrave´s do “write”. Os formatos podem ser identificados por alguns co´digos de edic¸a˜o. Veja, a seguir, quais sa˜o os co´digos de edic¸a˜o mais comuns: i indica nu´mero inteiro f indica nu´mero real, com ponto decimal fixo a indica caracter x indica espac¸amento horizontal / indica espac¸amento vertical Assim, os poss´ıveis formatos devem ser expressos como: • Nu´mero inteiro: i num onde “num” representa o nu´mero de d´ıgitos do nu´mero inteiro a ser formatado. No caso do nu´mero formatado ser negativo, o sinal de “-” deve ser previsto, sendo contabilizado como mais um d´ıgito dentro de “num”. Veja: Valor Formato 10 i2 132 i3 -38 i3 • Nu´mero real, com ponto decimal fixo: f num1 . num2 18 CAPI´TULO 4. COMANDOS PARA ENTRADA E SAI´DA DE DADOS onde “num1” representa o nu´mero de d´ıgitos, isto e´, o tamanho do nu´mero real a ser formatado. Aqui, vale ressaltar que a v´ırgula, indicativa de que o nu´mero apresenta parte decimal, e´ representada por ponto na linguagem FORTRAN. No caso de nu´mero real, este ponto deve ser contabilizado com um d´ıgito dentro de “num1”. No caso do nu´mero formatado ser negativo, o sinal de “-” deve ser previsto tambe´m, sendo contabilizado como mais um d´ıgito dentro de “num1”. Temos, ainda, que “num2” representa o nu´mero de d´ıgitos da parte decimal. Veja: Valor Formato 100.32 f6.2 1032.532 f8.3 -32.5 f5.1 • Caracter: a num onde, neste caso, “num” indica o nu´mero de caracteres. Veja: Valor Formato JOAO a4 MARCELO a7 • Espac¸amento horizontal: num x aqui, “num” indica a quantidade de espac¸os horizontais. 4.4.1 Formato de impressa˜o (usado no comando “write”) Ja´ vimos que, a forma geral do comando “write” e´: write(unidade, formato) lista de saida e que o campo “formato” deve conter o valor inteiro positivo (ro´tulo) que indica o enderec¸o da linha que conte´m o formato adotado para aquela escrita. Devemos ressaltar, aqui, que o comando “format” pode ser inserido antes ou depois do comando “write”. A sintaxe do comando “format” e´: formato format (lista de formatac¸a˜o) sendo que o ro´tulo “formato” deve ser inserido na regia˜o entre a primeira e a quinta coluna da linha, antecedendo o comando “format”. A “lista de formatac¸a˜o” conte´m o conjunto de especificac¸o˜es para a edic¸a˜o dos dados formatados, de modo que, cada ı´tem desta lista esta´ separado do outro por uma v´ırgula. 4.4. COMANDO FORMAT PARA FORMATAC¸A˜O DE DADOS 19 Exemplo de Fixac¸a˜o 4.2 Suponha um programa contendo treˆs varia´veis, A=30, B=123.54 e C=Charles. Crie duas formatac¸o˜es diferentes para apresenta´-las na tela. character c*7 integer a real b 10 format(A7,5x,F6.2,5x,I2) 20 format(F5.1,5x,I2,5x,A5) a=30 b=123.54 c=’Charles’ write(*,10)C,B,A write(*,20)B,A,C end Neste caso, a sa´ıda de dados na tela e´: Charles 123.54 30 123.5 30 Charl Nota-se que, na primeira formatac¸a˜o (10), as varia´veis usadas no “write” teˆm uma ordem (C,B,A), logo, essa mesma ordem deve ser respeitada para formatar os dados. Veja que A7 corresponde a` varia´vel C, F6.2 a` varia´vel B e I2 a` varia´vel A, separados por espac¸os horizontais (5x). Na segunda formatac¸a˜o (20) a ordem foi alterada (B,A,C), portanto a formatac¸a˜o tambe´m. Ale´m disso, alterou-se a forma de imprimir a varia´vel B, isto e´, usou-se F5.1, sendo impresso um nu´mero com apenas uma casa decimal, enquanto na varia´vel C, foi usado A5, portanto foram impressas duas letras a menos. Exemplo de Fixac¸a˜o 4.3 Suponha um programa que gere um menu de opc¸o˜es e apresente-o na tela. 10 format(5x,“****(MENU)****”,/ ∗ 5x,“* (1)adicao *”,/ * 5x,“* (2)subtracao *”,/ * 5x,“* (3)multipli *”,/ * 5x,“* (4)divisao *”,/ * 5x,14(“*”))/ write(*,10) end Observe que o “*” no in´ıcio de cada linha se encontra na sexta coluna, indicando continuidade. Neste caso, a sa´ıda de dados seria: 20 CAPI´TULO 4. COMANDOS PARA ENTRADA E SAI´DA DE DADOS ****(MENU)**** * (1)adicao * * (2)subtracao * * (3)multipli * * (4)divisao * ************** Dessa maneira e´ poss´ıvel imprimir esse menu toda a vez que o comando write(*,10) for utilizado. Note tambe´m que e´ poss´ıvel determinar quantas vezes vai aparecer os mesmo valores, por exemplo, na linha: * 5x,14(“*”))/ quatorze e´ a quantidade de vezes que sera´ repetido o que esta´ inserido no pareˆnteses, no caso, “*”. Dessa forma, e´ poss´ıvel simplificar um formato se este tiver uma repetic¸a˜o, por exemplo: format(i3,5x,i3,5x,A1,5x,i3,5x,i3) Observando as repetic¸o˜es, uma maneira simplificada, seria: format(2(i3,5x),A1,2(5x,i3)) 4.4.2 Formato de leitura (usado no comando “read”) Analogamente ao comando “write”, temos que a forma geral do comando “read” e´: read(unidade, formato) lista de entrada e que o campo “formato” deve conter o valor inteiro positivo (ro´tulo) que indica o enderec¸o da linha que conte´m o formato adotado para aquela leitura. O comando “format” pode ser inserido antes ou depois do comando “read”. A sintaxe do comando “format” relacionado ao “read” e´ a mesma do comando “write”. Um cuidado especial que deve ser tomando na formatac¸a˜o de dados lidos a partir de um arquivo externo e´ que o formato deve estar de acordo com os dados localizados no arquivo de entrada. Exemplo de Fixac¸a˜o 4.4 Suponha um arquivo de entrada, denominado “entrada.txt”, con- tendo os seguintes dados: PAULA 30 2554.12 MARCOS 19 232.00 ANDRE 10 50.65 Analisando o arquivo de entrada, perceba que os dados sa˜o do tipo caracter, nu´meros inteiros e nu´meros reais. Note que o nome com maior quantidade de caracteres e´ “MARCOS”, com seis letras, assim identificamos o formato (A6), logo apo´s vem um espac¸o (1x), um nu´mero inteiro 4.4. COMANDO FORMAT PARA FORMATAC¸A˜O DE DADOS 21 de dois algarismos (i2), mais um espac¸o (1x) e por fim um nu´mero real, sendo usado o maior como referencia “2554.12” (F7.2). Veremos, a seguir, um programa capaz de ler, utilizando formatac¸a˜o, o arquivo “entrada.txt”, contendo os dados de entrada e, em seguida, apresenta´-los na tela tambe´m utilizando formatac¸a˜o de dados. character*6 nome1, nome2, nome3 integer conta1, conta2, conta3 real valor1, valor2, valor3 10 format(/,“Conta”,7x,“Nome”,7x,“Resultado”) 15 format(A6,1x,i2,1x,F7.2) 16 format(1x,i2,8x,A6,8x,F7.2) open(20, file=“entrada.txt”) read(20,15)nome1,conta1,valor1 read(20,15)nome2,conta2,valor3 read(20,15)nome3,conta3,valor3 write(*,10) write(*,16) conta1,nome1,valor1 write(*,16)conta2,nome2,valor2 write(*,16) conta3,nome3,valor3 close(20) end A sa´ıda de dados fica: Conta Nome Resultado 30 PAULA 2554.12 19 MARCOS 232.00 10 ANDRE 50.65 Esse programa faz a leitura de cada linha do arquivo de entrada, cria um cabec¸alho na tela com formato (10) e enta˜o imprime os respectivos valores. O formato impresso pode ser modificado. Nesse caso criou-se uma tabela invertendo o nome e a conta de posic¸o˜es. Sendo assim, o primeiro valor que aparece no formato (16) e´ o “i2” referente a` conta, depois de oito espac¸os vem o “A6” referente ao nome e apo´s oito espac¸os, o “F7.2” referente ao valor. Cap´ıtulo 5 ESTRUTURA SEQUENCIAL E OPERAC¸O˜ES ARITME´TICAS O programa, ao executar as linhas do co´digo, segue uma ordem, o que no´s chamamos de estrutura sequencial. No caso do FORTRAN, o programa e´ executado de cima para baixo, ou seja, da primeira linha ate´ a u´ltima linha sem pular nenhuma linha, salvo excec¸o˜es de condic¸o˜es, repetic¸o˜es (loop), comando go to, func¸o˜es e sub-rotinas. Portanto, um co´digo em FORTRAN deve seguir este padra˜o. 5.1 COMANDOS ARITME´TICOS No FORTRAN, usamos as 4 operac¸o˜es ba´sicas da matema´tica mais a potenciac¸a˜o. Operac¸a˜o Matema´tica FORTRAN Adic¸a˜o a+ b a+ b Subtrac¸a˜o a− b a− b Multiplicac¸a˜o a× b a ∗ b Divisa˜o a÷ b a/b Potenciac¸a˜o ab a ∗ ∗b Exemplo de Fixac¸a˜o 5.1 Suponha um programa que leia, a partir do teclado, duas varia´veis, A e B e enta˜o calcule e apresente na tela o valor da func¸a˜o: F = AB +B–A× B 2 Veja: write(*,*) “Entre com os valores de A e B, respectivamente” read(*,*) A, B F = A ∗ ∗B +B–A ∗B/2 write(*,*)“F = ”,F end 22 5.1. COMANDOS ARITME´TICOS 23 Neste exemplo, se A = 2 e B = 3, teremos F = 8, respeitando-se a ordem das operac¸o˜es da matema´tica e suas prioridades. Se quisermos isolar algum trecho da expressa˜o, podemos fazer uso dos pareˆntesis, mas nunca de colchetes ou chaves. Assim, se a expressa˜o fosse: F = AB + (B–A)× B 2 poder´ıamos ter o seguinte programa: write(*,*) “Entre com os valores de A e B, respectivamente” read(*,*) A, B F = A ∗ ∗B + (B–A) ∗B/2 write(*,*)“F = ”,F end de modo a obtermos F = 9.5 no caso de A = 2 e B = 3. Cap´ıtulo 6 ESTRUTURA DE CONDIC¸A˜O Utilizamos estrutura de condic¸a˜o dentro de um programa quando queremos efetuar algum tipo de selec¸a˜o, isto e´, algumas instruc¸o˜es dentro do programa sera˜o realizadas apenas quando uma certa condic¸a˜o for satisfeita. 6.1 COMANDO IF O comando “if” permite analisar uma condic¸a˜o e, caso esta seja verdadeira, o programa seguira´ para o pro´ximo passo escrito pelo programador. “if” e´ uma palavra inglesa cujo significado e´ “se”. Assim, se a condic¸a˜o for verdadeira, o programa seguira´ para o pro´ximo comando. A forma geral de utilizac¸a˜o do comando “if” e´: if (condic¸a˜o estabelecida) then (... comandos, um em cada linha ...) end if Note que a escrita do comando deve obedecer sempre esta sintaxe. O comando “if” e´ encerrado com o comando “end if” (“endif” tambe´m e´ valido). A “condic¸a˜o estabelecida” e´ escrita atrave´s de operadores relacionais e lo´gicos, que sa˜o: Operador Significado Traduc¸a˜o .EQ. EQual to igual a .NE. Not Equal to diferente de .LT. Less Than menor que .LE. Less than or Equal to menor que ou igual a .GT. Greater Than maior que .GE. Greater than or Equal to maior que ou igual a .OR. OR ou .AND. AND e Exemplo de Fixac¸a˜o 6.1 Suponha um programa que leia, a partir do teclado, a idade do usua´rio e informe se ele e´ maior de idade: 24 6.1. COMANDO IF 25 write(*,*) “Qual a sua idade?” read(*,*) n if (n.ge.18)then write(*,*) “Voceˆ e´ maior de idade” end if end Ao executar o programa, perceba que se o usua´rio digitr um nu´mero maior ou igual a 18, a condic¸a˜o do “if” se torna verdadeira e o programa executa o comando seguinte, que, neste caso, e´ informar que o usua´rio e´ maior de idade. Pore´m, caso o usua´rio digite um nu´mero menor que 18, a condic¸a˜o na˜o e´ satisfeita e o programa passara´ a executar o comando que vem logo apo´s o “end if”. No caso especial em que a sequeˆncia de comandos dentro do “if” for constitu´ıda por um u´nico comando, podemos utilizar a seguinte sintaxe: if (condic¸a˜o estabelecida) (comando) Assim, o no exemplo de fixac¸a˜o anterior, o programa tambe´m pode ser dado por: write(*,*) “Qual a sua idade?” read(*,*) n if (n.ge.18)write(*,*) “Voceˆ e´ maior de idade” end Vimos, ate´ agora, a estrutura de condic¸a˜o simples. Podemos tambe´m utilizar uma estrutura de condic¸a˜o composta. Neste caso, a forma geral de utilizac¸a˜o do comando “if” e´: if (condic¸a˜o estabelecida) then (... comandos, um em cada linha ...) else (... comandos, um em cada linha ...) end if Exemplo de Fixac¸a˜o 6.2 Suponha um programa que leia, a partir do teclado, a idade do usua´rio e informe se ele e´ maior ou menor de idade: write(*,*) “Qual a sua idade?” read(*,*) n if (n.ge.18)then write(*,*) “Voceˆ e´ maior de idade” else write(*,*) “Voceˆ e´ menor de idade” end if end 26 CAPI´TULO 6. ESTRUTURA DE CONDIC¸A˜O Podemos utilizar, ainda, operadores lo´gicos no “if” para vincular mais de uma “condic¸a˜o estabelecida”. Veja: Exemplo de Fixac¸a˜o 6.3 Suponha um programa que leia, a partir do teclado, uma nota entre 0 e 10, fornecida pelo usua´rio e informe se a mesma e´ va´lida ou na˜o: write(*,*) “Fornec¸a uma nota entre 0 e 10” read(*,*) n if (n.ge.0.and.n.le.10)then write(*,*) “Voceˆ digitou nota va´lida” else write(*,*) “Voceˆ digitou nota inva´lida” end if end Outra opc¸a˜o para este mesmo programa e´: write(*,*) “Fornec¸a uma nota entre 0 e 10” read(*,*) n if (n.lt.0.or.n.gt.10)then write(*,*) “Voceˆ digitou nota inva´lida” else write(*,*) “Voceˆ digitou nota va´lida” end if end Temos, ainda, outra forma de utilizar o comando “if”, cuja forma geral e´: if (condic¸a˜o estabelecida) then (... comandos, um em cada linha ...) else if(condic¸a˜o estabelecida) then (... comandos, um em cada linha ...) else if(condic¸a˜o estabelecida) then (... comandos, um em cada linha ...) end if Na realidade, este tipo de estrutura pode ter um ou mais blocos de “else if”, mas apenas um bloco de “else”. Assim, se alguma das condic¸o˜es de “if” ou “else if” seja satisfeita, o programa executara´ o bloco de comandos correspondente e, sem seguida, seguira´ para o comando que segue depois do “end if”. Caso nenhuma das condic¸o˜es de “if” ou “else if” seja satisfeita, o programa seguira´ para o comando logo apo´s o “if” ou “else”. Veja: Exemplo de Fixac¸a˜o 6.4 Suponha um programa que leia, a partir do teclado, a me´dia final, entre 0 e 100, de um aluno, fornecida pelo usua´rio. O programa deve informar se o aluno esta´: aprovado, caso a me´dia seja maior ou igual a 60 e menor ou igual a 100; reprovado, se a me´dia 6.2. COMANDO SELECT CASE 27 for maior ou igual a zero e menor do que 40; com permissa˜o de fazer prova substitutiva se a me´dia for menor do que 60 e maior que 40. Se a me´dia estiver fora do intervalo entre 0 e 100, o programa deve indicar que o valor fornecido e´ inva´lido. write(*,*) “Fornec¸a a me´dia entre 0 e 100” read(*,*) n if (n.ge.0.and.n.lt.10)then write(*,*) “Aluno REPROVADO” else if(n.ge.40.and.n.lt.60)then write(*,*) “Aluno com permissa˜o de fazer prova substitutiva” else if(n.ge.60.and.n.le.100)then write(*,*) “Aluno APROVADO” else write(*,*) “Digitou me´dia inva´lida” end if end O exemplo a seguir trata estrutura condicional vinculada na˜o a` varia´vel nume´rica, mas a varia´vel caractere. Exemplo de Fixac¸a˜o 6.5 Suponha um programa que apresente na tela algumasopc¸o˜es de modelos de carros para o usua´rio selecionar. O programa deve, enta˜o, apresentar na tela a marca do carro selecionado. character n*15 write(*,*) “Escolha um carro entre as opc¸o˜es a seguir:” write(*,*) “GOL” write(*,*) “ONIX” write(*,*) “UNO” read(*,*) n if (n.eq.“GOL”)then write(*,*) “Este carro e´ da Volkswagen” else if(n.eq.“ONIX”)then write(*,*) “Este carro e´ da Chevrolet” else if(n.eq.“UNO”)then write(*,*) “Este carro e´ da Fiat” else write(*,*) “Voceˆ na˜o escolheu um carro va´lido.” end if end 6.2 COMANDO SELECT CASE O comando “select case” e´ uma construc¸a˜o similar ao “if”, muito u´til quando o seletor, que pode ser uma varia´vel ou constante dos tipos inteiro ou caractere, puder assumir uma variedade 28 CAPI´TULO 6. ESTRUTURA DE CONDIC¸A˜O de valores. A sintaxe deste comando e´: select case (seletor) case(lista de selec¸a˜o 1) (... comandos, um em cada linha ...) case(lista de selec¸a˜o 2) (... comandos, um em cada linha ...) case(lista de selec¸a˜o 3) (... comandos, um em cada linha ...) . . . case default (... comandos, um em cada linha ...) end select O comando “case default ” e´ de uso opcional. Entretanto, quando este e´ utilizado no “select case”, garantimos que, mesmo se nenhuma “lista de selec¸a˜o ” for selecionada, pelo uma uma sequeˆncia de comandos do tipo “(... comandos, um em cada linha ...)” sera´ executada. A localizac¸a˜o do “case default ” dentro do comando “select case” pode ser qualquer, pore´m no final parece ser o mais natural. Exemplo de Fixac¸a˜o 6.6 Suponha um programa que permita ao usua´rio escolher uma deter- minada hora do dia e, em seguida, informe na tela se a hora escolhida corresponde ao per´ıodo da madrugada, manha˜, tarde ou noite. write(*,*) “que horas sa˜o? (0 - 23)” read(*,*) n select case(n) case(0:5) write(*,*) “E´ madrugada.” case(6:12) write(*,*) “E´ manha˜.” case(13:18) write(*,*) “E´ tarde.” case(19:23) write(*,*) “E´ noite.” end select end A seguir, vemos o mesmo programa com a opc¸a˜o “case default ”: 6.2. COMANDO SELECT CASE 29 write(*,*) “que horas sa˜o? (0 - 23)” read(*,*) n select case(n) case(0:5) write(*,*) “E´ madrugada.” case(6:12) write(*,*) “E´ manha˜.” case(13:18) write(*,*) “E´ tarde.” case(19:23) write(*,*) “E´ noite.” case default write(*,*) “Voceˆ escolheu opc¸a˜o inva´lida.” end select end Varia´veis do tipo caractere tambe´m podem ser utilizadas no “select case”. Veja: Exemplo de Fixac¸a˜o 6.7 Suponha um programa que permita ao usua´rio escolher um dentro treˆs cientistas de sua prefereˆncia. character*10 nome write(*,*) “Escolha um entre os treˆs cientistas.” write(*,*) “Newton” write(*,*) “Einstein” write(*,*) “Galileu” read(*,*)nome select case(nome) case(“Newton”) write(*,*) “Nasceu no Reino Unido.” case(“Einstein”) write(*,*) “Nasceu na Alemanha.” case(“Galileu”) write(*,*) “Nasceu na Ita´lia.” case default write(*,*) “Voceˆ na˜o digitou nome va´lido.” end select end Exemplo de Fixac¸a˜o 6.8 Suponha um programa que permita ao usua´rio escolher um nu´mero e o programa indique a qual intervalo pertence. 30 CAPI´TULO 6. ESTRUTURA DE CONDIC¸A˜O write(*,*) “Digite um nu´mero inteiro.” read(*,*) K select case(K) case(:-10,10:) write(*,*) “Intervalo 1” case(-9:-4) write(*,*) “Intervalo 2” case(4:9) write(*,*) “Intervalo 3” case default write(*,*) “Intervalo 4” end select end No exemplo anterior, se o nu´mero digitado for menor ou igual a -10 ou maior ou igual a 10, ele pertence ao primeiro intervalo. Se o nu´mero for maior ou igual a -9 e menor ou igual a -4, ele pertence ao segundo intervalo. Se o nu´mero for maior ou igual a 4 e menor ou igual a 9, pertence ao terceiro intervalo. Em qualquer outra situac¸a˜o, o nu´mero digitado pertence ao quarto intervalo, isto e´, se ele for igual a -3, -2, -1, 0, 1, 2 ou 3. Cap´ıtulo 7 ESTRUTURA DE REPETIC¸A˜O A estrutura de repetic¸a˜o permite que um conjunto de comandos seja executado repetidamente sem, no entanto, a necessidade de escrever este conjunto de comandos, explicitamente, va´rias vezes seguidas no programa. 7.1 COMANDO DO O comando “do” permite que um grupo de comandos seja repetido por uma quantidade pre´- estabelecida de vezes. “do” e´ uma palavra inglesa que significa fac¸a, enta˜o o comando faz um grupo de comandos repetidas vezes, essas repetic¸o˜es sa˜o comumente chamadas de “loop” ou “lac¸o”. Uma forma geral de sintaxe do comando “do” e´: do ro´tulo, variavel controle loop = valor inicial, valor final, incremento (... comandos, um em cada linha ...) ro´tulo continue O “ro´tulo” e´ um nu´mero inteiro positivo entre 1 e 99999 que serve como um enderec¸o para indicar, no programa, o final do bloco de estrutura de repetic¸a˜o. Este “ro´tulo” deve ser in- dicado logo em seguida ao comando “do” e, tambe´m, no in´ıcio da linha de comando “conti- nue”. Neste u´ltimo caso, entende-se por comec¸o da linha, as colunas de nu´mero de 1 a 5. A “variavel controle loop” e´ uma varia´vel do tipo inteira que sofrera´ incrementos a cada repetic¸a˜o “loop”. Esta varia´vel se inicia com um “valor inicial”, sofrendo incrementos a cada “loop”, podendo chegar, no ma´ximo, ate´ um “valor final”. Se “incremento” for omitido, o programa entendera´ que o incremento da “variavel controle loop” sera´ 1, por padra˜o. Os paraˆmetros “valor inicial”, “valor final” e “incremento” podem ser constantes, varia´veis ou expresso˜es do tipo inteiro. Exemplo de Fixac¸a˜o 7.1 Suponha um programa que gere e escreva na tela uma sequeˆncia de nu´meros ı´mpares entre 1 e 100. 31 32 CAPI´TULO 7. ESTRUTURA DE REPETIC¸A˜O do 20, i = 1, 100, 2 write(*,*) i 20 continue end Neste exemplo, a varia´vel “i” comec¸a valendo 1 e, vai sendo incrementada de 2 em 2 a cada vez que o comando “continue” e´ executado. O u´ltimo valor gerado impresso na tela e´ o 99, uma vez que o nu´mero 101 ja´ extrapola o “valor final” que, neste caso, e´ 100. A grande maioria dos compiladores de FORTRAN 77 aceita o comando “end do” ou “enddo” para finalizar o bloco de repetic¸a˜o do “do”. A vantagem do comando “end do” ou “enddo” e´ de na˜o precisar utilizar o “ro´tulo”. Veja como fica a sintaxe do comando “do” neste caso: do variavel controle loop = valor inicial, valor final, incremento (... comandos, um em cada linha ...) end do Nesses termos, o Exemplo de Fixac¸a˜o 7.1, pode ser reescrito como: do i = 1, 100, 2 write(*,*) i end do end Vejamos alguns outros exemplos: Exemplo de Fixac¸a˜o 7.2 Suponha um programa que gere e escreva na tela uma sequeˆncia de nu´meros inteiros entre -10 e 10. do i = -10, 10 write(*,*) i end do end Neste exemplo, o “incremento” poˆde ser omitido, uma vez que ele e´ igual a 1. Exemplo de Fixac¸a˜o 7.3 Suponha um programa que gere e escreva na tela uma sequeˆncia decrescente de nu´meros inteiros entre 100 e 1. do i = 100, 1, -1 write(*,*) i end do end Neste caso, como o “valor inicial” e´ maior que o “valor final”, o “incremento” e´ definido negativo. 7.1. COMANDO DO 33 Exemplo de Fixac¸a˜o 7.4 Suponha um programa que gere e escreva na tela uma sequeˆncia de nu´meros inteiros entre 10 e 20. j=10 do i = j, 2*j write(*,*) i end do end Note que, neste caso, o “valor inicial” e´ uma varia´vel e o “valor final” e´ uma expressa˜o ma- tema´tica. Exemplo de Fixac¸a˜o 7.5 Suponha um programa que calcule e escreva na tela o valor de F = x+ y, para x = 1, 3, 5, 7 e 9 enquanto y = 2, 4, 6, 8 e 10 do i = 1, 9, 2 x = i do j = 2, 10, 2 y = j f = x + y write(*,*) f end do end do end Neste exemplo, podemosobservar o existeˆncia de uma estrutura de repetic¸a˜o dentro de outra. Exemplo de Fixac¸a˜o 7.6 Suponha um programa que consiga registrar em uma varia´vel in- dexada ate´ 100 valores lidos a partir de um arquivo de entrada com nu´meros inteiros. integer dados(100) open(10,file=“entrada.txt”) do i = 1, 100 read(10,*,end=20) dados (i) k = i end do 20 write(*,*) “Existem”, k, “nu´meros” close(10) end Neste exemplo, o arquivo “entrada.txt” forneceu os dados de entrada acumulados na varia´vel “dados(i)”. Note que, dentro do comando “read”, foi utilizado o comando “end=20”, indi- cando que, ao se chegar ao final do arquivo de entrada, o programa e´ desviado para a linha com o ro´tulo igual a 20. O comando “close” foi utilizado para fechar o arquivo de entrada. 34 CAPI´TULO 7. ESTRUTURA DE REPETIC¸A˜O 7.2 COMANDO DO WHILE O comando “do while” permite que um grupo de comandos seja repetido enquanto uma determinada condic¸a˜o estiver sendo satisfeita. “do while” e´ uma expressa˜o inglesa que significa fac¸a enquanto. Veja como fica a sintaxe do comando “do while”: do while(condic¸a˜o estabelecida) (... comandos, um em cada linha ...) end do A “condic¸a˜o estabelecida” segue a mesma forma daquela utilizada no comando “if”. Exemplo de Fixac¸a˜o 7.7 Suponha um programa que gere e apresente na tela, a sequeˆncia de nu´meros inteiro de 1 a 100. i=0 do while (i.lt.100) i = i + 1 write(*,*) i end do end Cap´ıtulo 8 DESVIOS NA ESTRUTURA DE PROGRAMAC¸A˜O Ate´ agora, vimos que, em princ´ıpio, um programa pode conter estrutura sequencial, de condic¸a˜o e de repetic¸a˜o. Podemos, ainda, efetuar desvios dentro do programa. Para tanto, utilizaremos o comando “go to”. 8.1 COMANDO GO TO No portugueˆs, significa “va´ para” e e´ basicamente isso que o comando faz. E´ usado quando se deseja que o co´digo do programa avance ou volte atra´s em algumas linhas, de uma forma que a estrutura seja na˜o sequencial. A sintaxe do comando e´: go to ro´tulo onde o “ro´tulo” e´ um nu´mero inteiro entre 1 e 99999 e representa o enderec¸o da linha para onde o programa devera´ desviar sua execuc¸a˜o. Este ro´tulo precisa ser colocado tambe´m no comec¸o da linha (da primeira a` quinta coluna) que conte´m o comando para o qual o programa sera´ redirecionado. Exemplo de Fixac¸a˜o 8.1 Suponha um programa que leia, a partir do teclado, o valor do raio de um c´ırculo. O programa deve calcular e apresentar na tela o comprimento da circunfereˆncia. Se o valor do raio for menor ou igual a zero, o programa deve viabilizar nova leitura a partir do teclado. 35 36 CAPI´TULO 8. DESVIOS NA ESTRUTURA DE PROGRAMAC¸A˜O 40 write(*,*)“Fornec¸a o raio do c´ırculo.” read(*,*)raio if(raio .le. 0)then go to 40 end if pi=3.14159 c=2.0*pi*raio write(*,*)“Circunfereˆncia:”, c end Cap´ıtulo 9 VETORES E MATRIZES Vetores e matrizes sa˜o varia´veis indexadas. Esse tipo de varia´vel e´ capaz de armazenar va´rios elementos do mesmo tipo, sendo que cada um deles e´ representado por um ı´ndice. Como visto na Sec¸a˜o 3.2, essas varia´veis precisam ser declaradas no cabec¸alho do programa. 9.1 VETORES Um vetor e´ uma varia´vel unidimensional, capaz de armazenar mais de um valor do mesmo tipo, seja ele real, inteiro ou caractere. Existem algumas maneiras de declara´-lo: integer a(5), b(-10:20) real c(8), d(0:10) character e(3)*8 character*10 f(4) Neste exemplo, as varia´veis “a” e “b” sa˜o do tipo inteiro. Entretanto, os ı´ndices da varia´vel “a” podem ir de 1 a 5, enquanto os da varia´vel “b” podem ir de -10 a 20. Seguindo a mesma ideia, as varia´veis “c” e “d” sa˜o do tipo real, mas seus ı´ndices podem assumir valores de 1 a 8 e de 0 a 10, respectivamente. As varia´veis “e” e “f” sa˜o do tipo caractere, entretanto, esta˜o representadas aqui de forma diferente. A varia´vel “e” possui ı´ndices que podem variar de 1 a 3, sendo que seus elementos teˆm 8 caracteres. A varia´vel “f” tem ı´ndices que podem variar de 1 a 4, mas cada um de seus elementos conte´m 10 caracteres. Exemplo de Fixac¸a˜o 9.1 Suponha um programa que leia, a partir do teclado, os elementos de um vetor de nu´meros inteiros e depois, apresente-os na tela. 37 38 CAPI´TULO 9. VETORES E MATRIZES integer vet(6) do i = 1 ,6 write(*,*)“Digite o”, i, “numero inteiro” read(*,*) vet(i) end do do i = 1 ,6 write(*,*)“O”, i, “numero inteiro e´:”, vet(i) end do end Neste caso, foi declarado um vetor “vet” em que podem ser armazenados 6 valores inteiros. Usamos a combinac¸a˜o dos comandos “do” e “read” para que o usua´rio pudesse atribuir valo- res ao vetor, da mesma maneira utilizamos a combinac¸a˜o dos comandos “do” e “write” para escrever na tela os valores do vetor “vet”. Exemplo de Fixac¸a˜o 9.2 Suponha um programa que leia, a partir do teclado, dados de no- mes, idades e alturas de 3 pessoas. Em seguida, permite ao usua´rio escolher uma entre as 3 pessoas para apresentar na tela o nome, a idade e a altura correspondentes. integer idade(50) character nome(50)*15 real altura(50) do j = 1 ,3 write(*,*)“Usua´rio”, j write(*,*)“Digite seu nome” read(*,*)nome(j) write(*,*)“Digite sua idade” read(*,*)idade(j) write(*,*)“Digite sua altura” read(*,*)altura(j) end do write(*,*)“Voceˆ quer informac¸o˜es de qual usua´rio?” read(*,*)n write(*,*)“NOME: ”, nome(n) write(*,*)“ALTURA: ”, altura(n) write(*,*)“IDADE: ”, idade(n) end 9.1. VETORES 39 Neste exemplo declaramos treˆs vetores, um vetor “idade” com capacidade para armazenar 50 valores inteiros, um vetor “altura” com capacidade para armazenar 50 valores reais e um vetor “nome” com capacidade para armazenar 50 nomes que contenham ate´ 15 caracteres. Podemos, ainda, utilizar o comando “data” para atribuir valores a um vetor. Exemplo de Fixac¸a˜o 9.3 Suponha um programa que atribua 5 valores de nu´meros reais a um vetor, atrave´s do comando “data” e, em seguida, apresente-os na tela. real v(5) data v / 10.2, 20.8, 30.4, 40.0, 50.4/ write(*,*)“Os valores do vetor sao:” do i = 1, 5 write(*,*) v(i) end do end Note que os valores sa˜o atribu´ıdos entre barras, e separados por v´ırgulas. Este comando pode ser aplicado a vetores caracteres tambe´m. Exemplo de Fixac¸a˜o 9.4 Suponha um programa que atribua 4 nomes a um vetor, atrave´s do comando “data” e, em seguida, apresente-os na tela. character nomes(4)*10 data nomes /“Paul”, “George” ,“John”, “Ringo”/ write(*,*)“Os integrantes dos Beatles sao:” do i = 1, 4 write(*,*) nomes(i) end do end A u´nica diferenc¸a neste caso e´ que os valores devem estar entre aspas. Exemplo de Fixac¸a˜o 9.5 Suponha um programa que receba, a partir do teclado, 10 nu´meros inteiros e armazene-os em um vetor. Em seguida, o programa deve determinar e apresentar na tela o maior elemento deste vetor. 40 CAPI´TULO 9. VETORES E MATRIZES integer vet(10), maior do i = 1, 10 read(*,*) vet(i) end do maior = vet(1) do i = 1, 10 if(vet(i).gt.maior) maior = vet(i) end do write(*,*) “O maior numero do vetor e: ”, maior end Este e´ um exemplo simples para achar o maior nu´mero de um vetor, em que atribu´ımos a` varia´vel “maior” o primeiro valor do vetor e depois vamos comparando com os demais. A varia´vel “maior” recebera´ o maior valor dentre as comparac¸o˜es. 9.1.1 COMANDO IMPLI´CITO DE REPETIC¸A˜O PARA LEITURA E ESCRITA DE VETOR Para viabilizar a leitura ou a escrita de varia´veis indexadas, podemos utilizar a forma impl´ıcita do comando “do”, em que a variac¸a˜o do ı´ndice ocorre no pro´prio comando de leitura ou escrita. Veja: Exemplo de Fixac¸a˜o 9.6 Suponha um programa que leia, partir de um arquivo de entrada, denominado “entra1.txt”,e apresente na tela, a seguinte vetor em linha de nu´meros inteiros: 5 9 -1 2 Segue um poss´ıvel programa que realiza esta tarefa: integer vet(4) open(10, file = “entra1.txt”) read(10,*) (vet(i), i = 1, 4) write(*,*) (vet(i), i = 1, 4) close(10) end 9.2 MATRIZES Uma matriz e´ uma varia´vel multidimensional, capaz de armazenar mais de um valor do mesmo tipo, seja ele real, inteiro ou caractere. Trataremos, aqui, das matrizes bidimensionais. Existem algumas maneiras de declara´-la: 9.2. MATRIZES 41 integer a(5,10), b(-10:20,4) real c(8,0:3), d(0:10,0:10) character e(3,2)*8 character*10 f(4,3) Neste exemplo, todas as varia´veis sa˜o matrizes bidimensionais e sa˜o representadas com dois ı´ndices: um para a linha e o outro para a coluna. As varia´veis “a” e “b” sa˜o do tipo inteiro. Entretanto, os ı´ndices da linha da varia´vel “a” podem ir de 1 a 5 e os da coluna, de 1 a 10. Os da linha da varia´vel “b” podem ir de -10 a 20 e os da coluna, de 1 a 4. Seguindo a mesma ideia, as varia´veis “c” e “d” sa˜o do tipo real. Os ı´ndices da linha da varia´vel “c” podem ir de 1 a 8 e os da coluna, de 0 a 3. No caso da varia´vel “d”, os ı´ndices da linha e da coluna podem ir de 0 a 10. As varia´veis “e” e “f” sa˜o do tipo caractere, entretanto, esta˜o representadas aqui de forma diferente. A varia´vel “e” possui ı´ndices de linha que podem variar de 1 a 3 e de coluna de 1 a 2, sendo que seus elementos teˆm 8 caracteres. A varia´vel “f” tem ı´ndices de linha que podem variar de 1 a 4 e de coluna de 1 a 3, mas cada um de seus elementos conte´m 10 caracteres. 9.2.1 COMANDO IMPLI´CITO DE REPETIC¸A˜O PARA LEITURA E ESCRITA DE MATRIZ Assim como no caso dos vetores, para viabilizar a leitura ou a escrita de matrizes, podemos utilizar a forma impl´ıcita do comando “do”. Veja: Exemplo de Fixac¸a˜o 9.7 Suponha um programa que leia, partir de um arquivo de entrada, denominado “entra2.txt”, e apresente na tela, a seguinte matriz de nu´meros inteiros: 5 9 -1 2 8 22 3 40 0 -9 10 7 Segue um poss´ıvel programa que realiza esta tarefa: integer mat(3,4) open(20,file=“entra2.txt”) do i = 1, 3 read(20,*) (mat(i,j), j = 1, 4) write(*,*) (mat(i,j), j = 1, 4) end do close(20) end Outro poss´ıvel programa para realizar esta mesma tarefa e´: 42 CAPI´TULO 9. VETORES E MATRIZES integer mat(3,4) open(20,file=“entra2.txt”) read(20,*)((mat(i,j), j = 1, 4), i = 1, 3) do i = 1, 3 write(*,*) (mat(i,j), j = 1, 4) end do close(20) end Assim como nos vetores, podemos declara uma matriz atrave´s do comando “data” e ja´ atribuir valores a ela. Exemplo de Fixac¸a˜o 9.8 Suponha um programa que atribua 6 valores de nu´meros inteiros a uma matriz, atrave´s do comando “data” e, em seguida, apresente-os na tela. integer mat(3,2) data v / 1, 2, 3, 4, 5, 6/ write(*,*)“Os valores do vetor sao:” do i = 1, 3 write(*,*) (mat(i, j), j = 1, 2) end do end Neste caso, a sa´ıda de dados na tela seria: 1 4 2 5 3 6 pois quando utilizamos o comando “data” em matrizes, os nu´meros sa˜o preenchidos por coluna, isto e´, cada coluna e´ preenchida, em ordem, integralmente. A declarac¸a˜o de uma matriz do tipo caractere segue os mesmos paraˆmetros da declarac¸a˜o do vetor caractere. Veja: Exemplo de Fixac¸a˜o 9.9 Suponha um programa que lei, a partir do teclado, 9 palavras, como elementos de uma matriz com 3 linhas e 3 colunas e, em seguida, apresente-a na tela. character mat(3,3)*10 do i = 1, 3 read(*,*) (mat(i, j), j = 1 ,3) write(*,*) (mat(i, j), j = 1 ,3) end do end 9.2. MATRIZES 43 Neste caso nossa matriz poderia armazenar 9 palavras cada uma contendo no ma´ximo 10 ca- racteres. Da mesma maneira, podemos declarar uma matriz caractere atrave´s do comando “data”. Exemplo de Fixac¸a˜o 9.10 Suponha um programa que atribua 4 nomes a uma matriz com 2 linhas e 2 colunas, atrave´s do comando “data” e, em seguida, apresente-a na tela. character mat(2,2)*12 data mat /“Corinthians”, “Palmeiras” ,“Vasco”, “Flamengo”/ do i = 1, 2 write(*,*) (mat(i, j), j = 1, 2) end do end A sa´ıda de dados na tela fica: Corinthians Vasco Palmeiras Flamengo Cap´ıtulo 10 FUNC¸O˜ES INTRI´NSECAS No FORTRAN, va´rias func¸o˜es ja´ esta˜o pre´ definidas e sa˜o fornecidas pelo pro´pio compilador. Veja algumas delas: Tabela 10.1: Func¸o˜es Fornecidas pelo Compilador FORTRAN Func¸a˜o O que calcula? Tipo de argumento Tipo de resultado sin(x) seno de x real (em radianos) real cos(x) cosseno de x real (em radianos) real tan(x) tangente de x real (em radianos) real asin(x) arco-seno de x real real acos(x) arco-cosseno de x real real atan(x) arco-tangente de x real real exp(x) exponencial de x real real mod(x, y) resto da divisa˜o de x por y inteiros inteiro abs(x) valor absoluto de x real real iabs(x) valor absoluto de x inteiro inteiro sqrt(x) raiz quadrada de x real real Exemplo de Fixac¸a˜o 10.1 Suponha um programa que leia, a partir do teclado, o valor do raio de um c´ırculo. O programa deve calcular e apresentar na tela o comprimento da circunfereˆncia. Se o valor do raio for menor ou igual a zero, o programa deve viabilizar nova leitura a partir do teclado. 40 write(*,*)“Fornec¸a o raio do c´ırculo.” read(*,*)raio if(raio .le. 0)then go to 40 end if pi=3.14159 c=2.0*pi*raio write(*,*)“Circunfereˆncia:”, c end 44 45 Exemplo de Fixac¸a˜o 10.2 Suponha um programa que calcule e apresente na tela a raiz qua- drada de um nu´mero fornecido pelo usua´rio. implicit none real x, y 40 write(*,*)“Fornec¸a um nu´mero positivo para o ca´lculo da raiz quadrada.” read(*,*)x if(x .lt. 0) go to 40 y = sqrt(x) write(*,*)“A raiz quadrada vale:”, y end Exemplo de Fixac¸a˜o 10.3 Suponha um programa que calcule e apresente na tela o resto da divisa˜o entre dois nu´meros inteiros fornecidos pelo usua´rio. implicit none integer i, j, k 40 write(*,*)“Fornec¸a dois nu´meros inteiros.” read(*,*,err = 40) i, j k = mod( i ,j ) write(*,*)“O resto da divisa˜o entre os dois nu´meros e´:”, k end Cap´ıtulo 11 FUNC¸O˜ES EXTERNAS E SUB-ROTINAS Func¸o˜es externas e sub-rotinas sa˜o “pedac¸os” ou “mo´dulos” do programa. Sa˜o declaradas no programa principal e escritas fora dele, isto e´, sa˜o subprogramas subordinados ao programa principal. Sa˜o utilizados para economizar tempo e deixar o programa mais “leve”, pois podem ser executadas va´rias vezes no mesmo programa. 11.1 FUNC¸A˜O EXTERNA A principal caracter´ıstica de uma func¸a˜o externa e´ que ela tem a finalidade de retornar um valor (nume´rico ou de caracter). Se assemelha bastante com uma func¸a˜o suprida pelo compilador, o que difere e´ que o programador ira´ definir esta func¸a˜o. Dentro da func¸a˜o externa e´ poss´ıvel utilizar estrutura sequencial, de condic¸a˜o e de repetic¸a˜o, ou ainda efetuar desvios. De uma forma geral, a sintaxe de uma func¸a˜o externa e´: tipo de func¸a˜o function nome da func¸a˜o (argumentos) (declarac¸a˜o de varia´veis) (... comandos, um em cada linha ...) return end Em “tipo de func¸a˜o”, especificamos se a mesma e´ do tipo: integer, real ou character. No caso em que “tipo de func¸a˜o” na˜o e´ declarado, este e´ entendido pelo compilador como seguindo a mesma regra de declarac¸a˜o impl´ıcita de varia´veis. O comando “return” envia, para o programa principal, o valor da func¸a˜o externa. O uso deste comando e´ opcional e pode ser efetuado em qualquer ponto dentro da func¸a˜o externa, depois da declarac¸a˜o de varia´veis, de modo a interromper, antecipadamente, o ca´lcula da func¸a˜o, antes do derradeiro comando “end” de finalizac¸a˜o da func¸a˜o externa. Seu uso e´ similar ao “stop” permitido no programa principal e ja´ definido anteriormente.Os argumentos da func¸a˜o externa, no programa principal e fora dele,na˜o precisam ter o mesmo nome, devem apenas ser do mesmo tipo. Podemos ver melhor no exemplo a seguir: 46 11.2. SUB-ROTINA 47 Exemplo de Fixac¸a˜o 11.1 Suponha um programa que leia, a partir do teclado, as informac¸o˜es de altura e massa de uma pessoa, e ainda calcule e apresente na tela o ı´ndice de massa corpo´rea correspondente. implicit none !Comec¸o do programa principal real h, m, imc write(*,*)“Altura:” read(*,*) h write(*,*)“Peso:” read(*,*) m write(*,*)“IMC =”, imc(h,m) !Nesta linha que a func¸a˜o e´ chamada end real function imc(a,b) !Poder´ıamos ter mantido (h,m) ao inve´s de (a,b) real a,b imc = b/(a**2) end Neste exemplo, podemos observar: • A semelhanc¸a da func¸a˜o que criamos com uma func¸a˜o intr´ınseca do FORTRAN. A dife- renc¸a e´ que definimos a func¸a˜o imc(h, m). • Prestando atenc¸a˜o aos argumentos, vimos que eles carregam varia´veis com nomes dife- rentes, pore´m sa˜o do mesmo tipo. A varia´vel “a” recebe “h”, e “b” recebe “m”. Caso queiramos, poderemos utilizar as mesmas varia´veis “h” e “m” dentro da func¸a˜o externa. • Devemos ressaltar que a func¸a˜o imc(h,m) e´ real, e foi declarada real tambe´m dentro do programa principal. Isto significa que esta func¸a˜o retorna um valor real para o programa principal. 11.2 SUB-ROTINA As sub-rotinas, assim como as func¸o˜es externas, fazem parte do co´digo fonte, pore´m sa˜o escritas fora do programa principal. Tanto umas quanto as outras podem ser chamadas va´rias vezes pelo programa principal. Veja a sintaxe geral de uma sub-rotina e como chama´-la dentro do programa principal: 48 CAPI´TULO 11. FUNC¸O˜ES EXTERNAS E SUB-ROTINAS (declarac¸a˜o de varia´veis) (... comandos, um em cada linha ...) call nome da sub-rotina(argumentos) (... comandos, um em cada linha ...) end subroutine nome da sub-rotina (argumentos) (declarac¸a˜o de varia´veis) (... comandos, um em cada linha ...) return end O comando “call” e´ usado no programa principal para chamar a sub-rotina. Em “argumentos” esta˜o os paraˆmetros e varia´veis que precisam ser transmitidos do programa principal para a sub-rotina e vice-versa. Assim como na func¸a˜o externa, os “argumentos” no programa principal e na sub-rotina na˜o precisam ter o mesmo nome, mas precisam ser do mesmo tipo. Note tambe´m que uma sub-rotina na˜o esta´ associada a um tipo (real, inteiro ou cara´cter). O comando “return” dentro da sub-rotina tem o mesmo uso que aquele indicado na func¸a˜o externa. Exemplo de Fixac¸a˜o 11.2 Suponha um programa que utilize uma sub-rotina para determinar se um nu´mero, fornecido a partir do teclado, e´ par ou ı´mpar. integer a write(*,*) “Entre com um numero inteiro:” read(*,*) a call verificador(a) !Comando para chamar a sub-rotina end subroutine verificador(n) integer n if( mod( n, 2 ) .eq. 0 ) then write(*,*) n,“e´ par” else write(*,*) n,“e´ impar” end if end Exemplo de Fixac¸a˜o 11.3 Suponha um programa que utilize uma sub-rotina para determinar se um nu´mero, fornecido a partir do teclado, e´ par ou ı´mpar. 11.2. SUB-ROTINA 49 integer a write(*,*) “Entre com um numero inteiro:” read(*,*) a call verificador(a) !Comando para chamar a sub-rotina end subroutine verificador(n) integer n if( mod( n, 2 ) .eq. 0 ) then write(*,*) n,“e´ par” else write(*,*) n,“e´ impar” end if end Refereˆncias Bibliogra´ficas [1] CRISTO, Helder Pereira. Programac¸a˜o em Linguagem FORTRAN. 2003. Dispon´ıvel em: <https://www.inf.ufes.br/∼thomas/fortran/tutorials/helder/fortran.pdf>. Acesso em: 01 de dez. 2016. [2] SANTANA, Carlos. Apostila de Fortran. Dispon´ıvel em: <http://www.dma.ufv.br/tutorial/fortran.pdf>. Acesso em: 01 de dez. 2016. [3] Apostila de Treinamento: Introduc¸a˜o ao Fortran90. Dispon´ıvel em: <https://www.cenapad.unicamp.br/servicos/treinamentos/apostilas/apostila fortran90. pdf>. Acesso em: 01 de dez. 2016. [4] PORTILHO, Oyanarte. UM RESUMO DA LINGUAGEM DE PROGRAMA≪A˜O FOR- TRAN 77 . Dispon´ıvel em: <http://www.fis.unb.br/UM RESUMO DA LINGUAGEM DE PROGRAMACAO FORTRAN 77.pdf>. 2007. Acesso em: 01 de dez. 2016. [5] BIANCHI, Luiz. FORTRAN 77. Dispon´ıvel em: <http://bianchi.pro.br/apostilas/Fortran77%20apostila2.pdf>. Acesso em: 01 de dez. 2016. [6] CARREIRA, Ana; CARVALHO, Nuno; COSTA, Viviana. Breve Histo´ria da Lingua- gem FORTRAN. 2001. Dispon´ıvel em: <http://www.eq.uc.pt/∼batateu3/introd.html>. Acesso em: 01 de dez. 2016. [7] Programando em Fortran. Dispon´ıvel em: <http://www.pbx-brasil.com/Pesquisa/Ferramentas/ProgramandoFortran/aula103/aula3. html>. Acesso em: 01 de dez. 2016. 50
Compartilhar