Buscar

Apostila Fortran

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

Continue navegando