Escolar Documentos
Profissional Documentos
Cultura Documentos
Fortran 95:
curso bsico
Gilberto Orengo
Professor adjunto do Curso de Fsica Mdica
Centro Universitrio FranciscanoUNIFRA
http://www.orengonline.com/
orengo@orengonline.com
1Edio
Editora XXX
[2007]
Espao reservado Editora
Todos os direitos desta edio reservados ..
CDD-ZZZ.ZZ
SUMRIO
Apresentao
vii
Prefcio
1
ix
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
4
7
9
10
12
12
13
13
14
14
15
16
16
18
22
22
22
23
23
24
24
25
26
26
27
30
30
iv
SUMRIO
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
32
32
33
34
34
35
38
45
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
49
49
50
50
51
53
54
56
60
60
62
AS ESTRUTURAS DE CONTROLE
3.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.1 Expresses Aritmticas . . . . . . . . . . . . . . . . . . . . . . . .
3.1.2 Expresses Lgicas . . . . . . . . . . . . . . . . . . . . . . . . . . .
Operadores Relacionais . . . . . . . . . . . . . . . . . . . . . . . .
Operadores Lgicos . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.3 Hierarquia dos Operadores . . . . . . . . . . . . . . . . . . . . . .
3.2 Estruturas com Deciso (ou Seleo) . . . . . . . . . . . . . . . . . . . . .
3.2.1 Estrutura Condicional Simples (IF...THEN) . . . . . . . . . . .
3.2.2 Estrutura Condicional Composta (IF...THEN...ELSE IF) .
3.2.3 A instruo IF Lgico . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.4 A estrutura de seleo direta (SELECT CASE...CASE) . . . . . .
3.3 Estruturas de Repetio (Loops) . . . . . . . . . . . . . . . . . . . . . . . .
3.3.1 A Estrutura de repetio DO...END DO . . . . . . . . . . . . . . .
3.3.2 A Estrutura de repetio DO...IF...END DO ou DO infinito . .
O uso do WHILE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
63
63
64
65
65
65
67
67
67
69
71
71
73
73
74
76
77
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
79
79
80
80
82
83
84
85
85
86
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
5
AS SUB-ROTINAS E FUNES
6.1 Introduo . . . . . . . . . . . . . . . . .
Procedimentos Externos . . . . . .
Procedimentos Internos . . . . . . .
6.2 As Sub-rotinas SUBROUTINE . . . . .
6.3 As Funes FUNCTION . . . . . . . . .
6.4 As Bibliotecas de Sub-rotinas e Funes
6.4.1 A biblioteca LAPACK . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
97
97
97
98
99
101
103
103
OS PROCEDIMENTOS MODULE
8.1 A Declarao COMMON . . . . . . . . . . . . . . . . . . . .
8.2 A Declarao MODULE . . . . . . . . . . . . . . . . . . . .
8.2.1 Compartilhando Dados usando o MODULE . . . .
8.3 Os Procedimentos MODULE . . . . . . . . . . . . . . . . . .
8.3.1 Usando Mdulos para Criar Interfaces Explcitas
8.3.2 A Acessibilidade PUBLIC e PRIVATE . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
111
111
113
113
114
115
116
Apndices:
118
119
121
C Glossrio
123
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
125
125
125
126
126
126
126
127
127
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
129
129
130
131
131
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
vi
SUMRIO
E.5
E.6
E.7
E.8
Referncias Bibliogrficas
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
132
133
134
134
135
vii
Apresentao
Nesta parte ser transcrito os textos de apresentao de dois pesquisadores da rea de Fsica
e de Matemtica, usurios ativos e seniors do Fortran.
Prefcio
(Texto provisrio) Este livro o resultado de um longo perodo de contato com a linguagem
Fortran. Tudo comeou na graduao do Curso de Fsica, na Universidade Federal de Santa
Maria-RS (UFSM), entre 1984 e 1989, passou pelo Mestrado em Fsica Aplicada/UFSM, com
o auxlio fundamental dos professores Cludio de Oliveira Graa/UFSM e Manoel Siqueira,
da Universidade Federal de Minas Gerais (UFMG). No doutorado em Engenharia Nuclear,
pela Universidade Federal do Rio Grande do Sul (UFRGS) o passo final, em que parte da tese
foi a construo de uma verso inicial de um cdigo computacional, sob tutela do professor
Marco Tulio M. B. de Vilhena/UFRGS. Tambm contriburam o curso ministrado na UFRGS,
para alunos da Engenharia Mecnica ao lado da professora Cynthia Segatto e, a construo
de um material didtico para um Minicurso de Fortran 90/95, para a Semana Acadmica do
Curso de Fsica Mdica do Centro Universitrio Franciscano (UNIFRA), em junho de 2001.
Uma forte contribuio tambm venho das aulas da disciplina Linguagem de Programao
Cientfica para o Curso de Fsica Mdica/UNIFRA, desde 2002.
A minha formao em Fortran foi baseada principalmente no aprendizado autodidata.
Todos os livros citados nas referncias tiveram influncia sobre a minha viso a respeito da
linguagem Fortran e na forma de programar. Portanto, algumas caractersticas deles foram
incorporadas, subconscientemente, e podem fazer parte do meu texto. Um destes livros que
considero uma referncia o Professional Programmers Guide to Fortran77, de Clive G. Page da
University of Leicester, UK, 1995.
A diferena entre o Fortran 90 e o 95 sutil. No Fortran 95 foram realizadas pequenas correes do Fortran 90 e introduzidas algumas facilidades de programao paralela,
como por exemplo, o procedimento FORALL. A escolha do ttulo do livro foi pelo Fortran 95,
embora no trataremos neste texto a respeito dos avanos do Fortran 95, que far parte da
sequncia do livro, numa edio mais avanada. Este livro tem um perfil introdutrio e
veremos os conceitos mnimos necessrios para uma iniciao na linguagem Fortran, introduzindo alguns conceitos mais modernos do Fortran 90/95.
Este livro foi pensado para ser usado por estudantes que no conhecem a linguagem
Fortran, bem como por aqueles que j dominam a linguagem. Os programadores que tiveram
contato com o antigo e bom FORTRAN 77 tero neste livro uma atualizao especialmente
nos ltimos quatro captulos. aconselhvel para os iniciantes que leiam os captulos na
sequncia em que so apresentados. J os conhecedores da linguagem podem saltear entre
SUMRIO
os captulos, conforme a necessidade, mas sugerido que leiam o primeiro captulo, para
entenderem algumas peculiaridades da escrita do livro.
Na pgina oficial do livro estaro disponveis atualizaes, correes, novidades, exerccios e problemas. Costumo evidenciar que em programao h uma diferena entre exerccios e problemas, ou entre a soluo de problemas e prtica com exerccios. O primeiro subentende
que o segundo foi realizado exaustivamente e, assim, estaremos, em princpio, habilitados
para resolver ou solucionar problemas. O endereo da pgina :
http://www.orengonline.com/fortran95/
Tambm esto disponveis as respostas e comentrios a respeito dos exerccios do livro, no
item exerccios. E, para verificar se est pronto para resolver problemas, um conjunto deles
est disponvel no item problemas.
METODOLOGIA ...
Nos exemplos de programas as instrues da linguagem Fortran sero destacadas em
negrito, e os elementos que no fazem parte da parte da sintaxe da linguagem sero escritos
sem negrito. Mas, no texto, para chamar ateno sero tambm destacados em negrito.
Gilberto Orengo
Santa Maria, 2007
CAPITULO
CONSIDERAES INICIAIS:
Apresentando o Fortran
Neste captulo voc encontrar:
1.1 Introduo . . . . . . . . . . . . . . . . . .
O Livro . . . . . . . . . . . . . . . . .
Um Breve Histrico sobre o Fortran . . .
1.2 Os bits e bytes . . . . . . . . . . . . . . .
1.3 Como Trabalha a Memria do Computador? .
Compilador . . . . . . . . . . . . . . . . .
Interpretador . . . . . . . . . . . . . . . .
Depurador . . . . . . . . . . . . . . . . . .
1.4 As Unidades de Programa . . . . . . . . . .
O Programa Principal (Main Program) . . . .
O Formato livre . . . . . . . . . . . . .
O Conjunto de Caracteres . . . . . . .
Os Nomes Simblicos em Fortran . . .
Os Rtulos em Fortran . . . . . . . . .
O Primeiro Programa . . . . . . . . . . . .
O Segundo Programa . . . . . . . . . . . .
1.5 A Despensa de Dados no Fortran 95 . . .
1.5.1 Dados Inteiros - INTEGER (Preciso
Simples) . . . . . . . . . . . . . . .
1
2
3
6
9
10
11
11
12
12
13
13
14
14
15
17
20
21
21
21
22
22
23
23
24
25
25
29
29
31
31
32
32
33
34
37
44
1.1
INTRODUO
Seja bem-vindo ao universo Fortran.
Neste incio de conversa importante salientar que este texto foi integralmente escrito com o
LATEX [1][5]. O LATEX um sistema de processamento de textos utilizado especialmente para
produzir documentos cientficos de alta qualidade tipogrfica. tambm til para outros
tipos de documentos, desde simples cartas at livros completos. O LATEX utiliza o TEX como
base para seu processamento e a sua distribuio gratuita, disponvel para a maioria dos
sistemas operacionais como o UNIX, Linux, Windows, OSMac, Sun e VMS. Nas Universidades encontrado, previamente instalado, nas redes UNIX/Linux de computadores (exceto
redes Windows). aconselhvel, se voc ainda no teve contato com LATEX que o faa.
uma ferramenta computacional muito poderosa para uso no meio acadmico e cientfico. No
Apndice E so apresentadas algumas linhas de programao LATEX, que foram utilizadas na
elaborao deste livro.
O LIVRO
muito importante para compreenso na leitura do livro observar as seguintes convenes
adotadas.
NOTAO DO LIVRO
As seguintes notaes ou convenes so usadas ao longo do livro:
fortran
95
na linha que aparece este smbolo, como nota de margem, ser destacado na
mesma cor a instruo referente ao Fortran 95, que no havia no FORTRAN 77.
fundo cinza claro conter um exemplo de programa Fortran 95. A numerao dos
programas seguir sequencialmente na ordem arbica, antecedida do nmero do
captulo.
fundo cinza mdio conter a sintaxe de instrues ou procedimentos do Fortran 95.
fortran
95
fortran
95
AaBb
AaBb
[Nx]
O contedo sobre Fortran [6][10] extenso para ser tratado num livro que pretende
ser introdutrio. Sendo assim, veremos os conceitos mnimos necessrios para uma iniciao na linguagem Fortran e, na sequncia introduziremos alguns conceitos mais modernos
do Fortran 90/95, o qual chamaremos somente de Fortran 95. Entre as evolues sofridas pelo Fortran (relativas ao FORTRAN 77) daremos nfase a trs: as funes intrnsecas
SELECTED_REAL_KIND e SELECTED_INT_KIND (Cap. 7, na pg. 107), que permitem maior
portabilidade entre computadores e compiladores Fortran; a declarao de variveis ALLOCATABLE (Cap. 5, na pg. 91), que habilita a alocao dinmica de memria e; as Declaraes
e Procedimentos do tipo MODULE (no Cap. 8, na pg. 111) que, entre outras funes, substitui
com primazia os confusos e perigosos COMMON, que so utilizados como uma declarao para
compartilhar uma mesma rea de memria entre duas ou mais unidades de programa, e para
especificar os nomes das variveis que devem ocupar esta rea comum. A rea de memria
suportada pelo COMMON pode ser entendida como uma seqncia de posies na memria
principal. Este assunto ser apresentado no Captulo 8.
Sutilmente ao longo do texto sero apresentados outros pequenos avanos da linguagem, sempre destacados pela conveno acima descrita.
As atualizaes do Fortran 95 como o uso de ponteiros (POINTER) ou, os tipos de dados definidos pelo usurio (TYPE), entre outras, sero tratadas em outra oportunidade. Elas
faro parte da sequncia deste livro, que tratar de questes mais avanadas relativas ao
Fortran 95. Abordagens mais completas a respeito do Fortran podem ser encontradas nos
livros citados nas referncias bibliogrficas. Mas importante ter em mente que ao usarem
um compilador[N1] Fortran, uma valiosa fonte de informao encontra-se no Guia (ou Manual) do Usurio (Users Guide) e no Manual de Referncia da Linguagem (Language Reference
Manual) do referido compilador.
Ser utilizado, como referncia, o compilador Fortran G95 desenvolvido, sob a licena
GNU[N2] , pela comunidade de Software Livre e pode ser obtido gratuitamente no site
http://www.g95.org, para diferentes plataformas e sistemas operacionais. No Apndice ??
apresentado, detalhamente, como obter, instalar e utilizar o compilador Fortran G95, tanto
para o sistema operacional Windows como para o Linux e, uma lista de compiladores Fortran
descrita no Apndice ??.
As aplicaes da linguagem ficaro restridas as reas da Fsica, da Matemtica e das Engenharias, embora o Fortran possa ser aplicado a outras reas como por exemplo Economia,
Administrao, Informtica e Biologia.
Este livro poder ser usado por estudantes que no conhecem a linguagem Fortran, bem
como por aqueles que j dominam a linguagem, especialmente se forem oriundos do antigo
e bom FORTRAN 77. Para os iniciantes aconselhvel que leiam (estudem) os captulos na
sequncia em que se encontram. Os conhecedores da linguagem podem saltear entre os captulos, conforme a necessidade, mas interessante que leiam este captulo, para entenderem
algumas peculiaridades da escrita do livro.
Um glossrio, disponvel no Apndice C (pg. 123), conter explicaes e definies
rpidas sobre conceitos ou elementos do Fortran 95. Assim, contribuir para uma viso mais
global a respeito da linguagem.
No Apndice ??, na pgina ??, traz um resumo dos captulos, cujo objetivo o de um
Guia de Referncia, de rpido e fcil acesso. A disposio do resumo dos captulos em um
nico local, por acreditar que esta metodologia contribua mais para o aprendizado e seja
mais didtica do que o resumo no final de cada captulo.
[N1] O termo compilador se refere, no jargo da informtica, a um software que faz a traduo de um programa fonte
codificado em um cdigo legvel para a mquina. Estudaremos o compilador na pgina 10.
[N2] Informaes a respeito da licena GNU podem ser obtidas em http://www.fsf.org/.
fortran
95
acrscimos de tipos de dados definidos pelo usurio: tipos de dados parametrizados, aperfeioamento no controle de acessibilidade e de estrutura. Por exemplo, definir o KIND
somente na utilizao efetiva do tipo definido e no antes;
avanos nas Entradas/Sadas: operaes de transferncia definidas pelo usurio para dados definidos pelo usurio; controle nas converses de formatos; constantes nominativas para unidade lgicas pr-conectadas, acesso as mensagens de erro; instruo
FLUSH, que permitar, entre outras coias, ler via teclado caracter por caracter, e tambm tornar disponvel o dado para outro processo. Entrada/Sada assincrna, que
permitir qie outras instrues podem ser executadas enquanto uma instruo de Entrada/Sada (leitura/escrita) est em execuo.
procedimento ponteiros;
suporte ao conjunto de caracteres internacionais: acesso aos caracteres ISO 10646 (2000) 4byte, que suficiente para cobrir todas as linguagens escritas do mundo. E, a escolha
construda em blocos e executa instrues em passos em que cada bloco trata de uma parte da instruo e dessa
forma acelera a execuo do programa; 2. (a) escalar a chegada das entradas no microprocessador quando nada mais
est acontecendo e desta forma aumentando a velocidade aparente de processamento; (b) iniciar o processamento
de uma segunda instruo enquanto a atual ainda est processando de forma a aumentar a velocidade de execuo
de um programa. Fonte: DIC Michaelis UOL, distribuio gratuita em CDROM.
pelo usurio por ponto ou vrgula para dados numricos formatados de Entradas/Sadas. Uma nova funo intrnseca, para caracteres, a qual retorna o tipo de conjunto de
caracteres: SELECTED_CHAR_KIND(NAME);
O compilador G95, que ser utilizado nos exemplos deste livro, j contm as caractersticas implantadas no Fortran 2003. Para um conhecimento mais abrangente a respeito desta
atualizao do Fortran aconselha-se a referncia [11], da qual foram extradas as informaes
descritas acima.
No Fortran 2008 ser revisado o Fortran 2003. Como ocorreu com o Fortran 95 em relao ao Fortran 90, ser uma pequena evoluo, somente incluindo correes e esclarecimentos do Fortran 2003. Mas ser nesta verso a implementao mais efetiva na manipulao de
processamento paralelo e os tipos de dados BIT.
A linguagem Fortran definida de acordo com o Padro Internacional ISO/IEC 1539.
Atualmente, os padres que conduzem as implementaes do Fortran so:
ANSI X3.198-1992 (R1997). Ttulo: Programming Language Fortran Extended. informalmente conhecida como Fortran 90. O padro publicado pela ANSI.
ISO/IEC 1539-1:1997. Ttulo: Information technology - Programming languages - Fortran Part 1: Base language. informalmente conhecido como Fortran 95. Existem mais duas
partes deste padro. A Parte 1 foi formalmente adotada pelo ANSI.
Estas informaes, bem como notcias a respeito das atualizaes, podem ser visualizadas no endereo: http://www.nag.co.uk/sc22wg5/IS1539_family.html.
Est disponvel no endereo http://www.orengonline.com/fortran95/ uma transcrio de
uma reportagem do New York Times, de 13 de junho de 2001, a respeito dos criadores do
Fortran. O ttulo Pioneers of the Fortran Programming Language.
A seguir estudaremos termos cujos significados sero importantes em todo o livro. Veremos tambm os conceitos relacionados a estrutura de um programa Fortran, tais como os
tipos e a declarao de dados. E, criaremos passo-a-passo um programa Fortran, decrevendo
e explanando cada etapa.
1.2
OS BITS E BYTES
Para uma aprendizagem mais significativa necessrio e importante conhecermos alguns
termos utilizados nesta rea da computao. Um ponto forte no uso de computadores a
memria. As memrias dos computadores so compostas de milhes de interruptores eletrnicos individuais, cada um assumindo ON ou OFF (ligado ou desligado), nunca num
estado intermedirio. Cada um dos interruptores representa um dgito binrio (tambm
conhecido como bit de binary digit), em que o estado ON interpretado como o binrio
1 e o estado OFF como o binrio 0. Diversos bits agrupados representam o sistema binrio de nmeros ou simplesmente sistema de base dois, representado pelo conjunto {0,1}. Para
comparao, a base do sistema decimal 10 (0 a 9).
O nmero de arranjos possveis para nmeros binrios fornecido por 2n , em que n
o nmero de opes possveis. O menor agrupamento de bits chamado de Byte. Um Byte
consiste de um grupo de 8 bits e a unidade fundamental usada para medir a capacidade da
memria de um computador. A partir desta unidade fundamental temos:
1024 Bytes = 1 KByte (1 KiloByte ou 1 KB), devido a base dois temos: 210 = 1024.
1024 KBytes = 1 MByte (1 MegaByte ou 1 MB = 220 = 1048576 Bytes).
1024 MBytes = 1 GByte (1 GigaByte ou 1 GB = 230 Bytes).
1024 Gbytes = 1 TByte (1 TeraByte ou 1 TB = 240 Bytes).
Para compreendermos um pouco mais o sistema binrio busquemos algo familiar, o
nosso sistema decimal, ou sistema de base 10, representado pelo conjunto {0, 1, 2, 3, 4, 5, 6, 7,
8, 9}. Representamos um nmero nesta base (por exemplo, o 152) da seguinte forma:
152 15210 = (1 102 ) + (5 101 ) + (2 100 ) ,
O sub-ndice 10 usado para indicar a base numrica. E como representamos um nmero na
base numrica do computador ou base 2[N4] ? Bem, fazemos da mesma forma que na base 10.
Vejamos o exemplo do nmero 101:
PRONNCIA DOS BINRIOS
A pronncia dos nmeros na base 2 no igual ao da base 10, isto , o nmero 101
pronunciado UM ZERO UM, enquanto que na base 10 pronunciado CENTO E UM
destes valores so reservados para representar nmeros negativos e a outra metade para os
positivos. No caso 1 Byte (8 bits) utilizado usualmente para representar nmeros entre
128 e +127, inclusive.
Um sistema para representar os caracteres (de linguagens No-Orientais) deve incluir
os seguintes smbolos:
PERMITIDOS NO FORTRAN:
As 26 letras maisculas:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
As 26 letras minsculas:
abcdefghijklmnopqrstuvwxyz
Os dez dgitos:
0123456789
e lgicos: <
&
+ /
NO PERMITIDOS NO FORTRAN:
O nmero total de caracteres e smbolos requeridos menor do que 256, mas mesmo
assim utilizado 1 Byte de memria para armazenar cada caracter. Embora incompleto,
este o sistema de cdigo ASCII (American Standard Code for Information Interchange), usado
na maioria dos computadores. Atualmente, est no processo de implementao um outro
sistema de cdigo mais geral, chamado Unicode, que contemplar tambm as linguagens
orientais. Na verso Fortran 2003, este sistema de cdigos j est disponvel.
Todas as mquinas tem um tamanho de palavra"(wordsize) uma unidade fundamental de armazenamento, por exemplo, 8 bits, 16 bits, etc. Esta unidade difere entre as
mquinas, em um processador Pentium , por exemplo, poder ser de 32 bits (4 Bytes). Isto
ser importante mais adiante, na pg. 22.
Outro conceito interessante o Flop, que uma operao de ponto flutuante por segundo. Uma operao de ponto flutuante ocorre quando dois nmeros reais so adicionados.
Hoje, se fala de MegaFlops ou at mesmo em GigaFlops.
Para finalizar, um comentrio a respeito de processamento paralelo (ou vetorizao).
O processamento paralelo ocorre quando duas ou mais CPUs[N5] trabalham simultaneamente na soluo de um mesmo problema. Assim, obtm-se maior velocidade e volume
de processamento computacional. Para fazermos uso deste procedimento necessrio que
o compilador Fortran 95 nos habilite tal procedimento e que o programa seja projetado com
este objetivo, i.e., implementando as declaraes intrnsecas para o processamento paralelo.
[N5] CPU:
Como exemplo de compiladores comerciais que habilitam a vetorizao temos, entre outros,
o Lahey-Fujitsu Fortran 95 for GNU/Linux da Lahey Computer Systems, Inc. [7] e o PGHPF da
Portland Group [8], este por sinal um excelente compilador. O compilador G95 tambm
permite o processamento paralelo.
1.3
COMO TRABALHA A MEMRIA DO COMPUTADOR?
Para entendermos como funciona a memria do computador, usaremos um exemplo
hipottico, cujo tamanho de palavra de 8-bits:
3F29
3F2B
3F2A
3F2C
A memria dos computadores enderevel, i.e., para cada alocao de memria dado
um nmero especfico, o qual freqentemente representado em hexadecimal (base 16), por
exemplo, 3F2C. Mas, porque usar base 16? Vejamos sucintamente o motivo no quadro abaixo.
SISTEMA HEXADECIMAL
Os computadores trabalham no sistema dos nmeros binrios, mas ns simples mortais
pensamos no mundo do sistema de nmeros decimais. Felizmente, podemos programar os
computadores para aceitarem os nossos nmeros decimais, convertendo-os internamente
para os binrios da mquina. Mas, quando os cientistas, tcnicos e engenheiros trabalham
diretamente com o sistema binrio percebem que o mesmo difcil de manipul-los. Vejamos, por exemplo, o nmero 110010 no sistema decimal, que escrito 0100010011002
no sistema binrio. Para evitar difcil manipulao no sistema binrio, uma alternativa
quebrar o nmero binrio em grupos de 3 e 4 bits e com isso obter novas bases, respectivamente, base 8 (series octal) e base 16 (series hexadecimal). Vejamos ltima representao,
a base 16 ou hexadecimal. Um grupo de 4 bits pode representar qualquer nmero entre
0(= 00002 ) e 15(= 11112 ) (lembram do 2n ?). Ento, um nmero hexadecimal tem 16 dgitos: 0, 1, . . . , 8, 9 mais de A, B, . . . , E, F. Assim, 916 = 910 ; A16 = 1010 ; B16 = 1110 ; e assim
por diante. Podemos quebrar um nmero binrio em grupos de 4 e substituir os dgitos hexadecimais apropriados para cada grupo. Vejamos o nosso nmero 110010 = 0100010011002 .
Quebrando-o em grupos de 4, temos: 0100|0100|11002 . Substituindo cada grupo pelo apropriado hexadecimal, obtemos 44C16 , que representa o mesmo padro de bits do nmero
binrio, mas de maneira simplificada
A CPU est habilitada a ler e escrever numa especfica localizao (rea) de memria.
Grupos de reas de memria so tratados como informaes inteiras (no nmeros inteiros) possibilitando assim armazenar mais informaes. Usar a identificao criptogrfica hexadecimal para localizao de memria incomum (porque mais complicado!!), assim o
Fortran 95 possibilita substitu-las por nomes (em ingls).
10
Compilador
Compilador um programa que, a partir de um cdigo-fonte escrito em uma linguagem de
programao (de alto nvel), cria um programa semanticamente equivalente porm escrito
em outra linguagem, conhecido por cdigo-objeto ou linguagem de mquina (ou ainda, instrues de cdigo assembler), o qual chamaremos simplesmente de executvel.
As principais numa compilao, a partir de um cdigo-fonte, so:
1. Anlise lxica: processo que analisa a entrada de linhas de caracteres de um cdigofonte, caractere a caractere, e produz uma seqncia de smbolos chamado smbolos lxicos, ou simplesmente smbolos (tokens), que podem ser manipulados mais facilmente,
na segunda etapa, por um parser, conhecido como leitor de sada.
11
2. Anlise sinttica (parsing): processo que analisa uma sequncia de entrada para determinar sua estrutura gramatical segundo uma determinada gramtica formal. Nesta
etapa identificada, por exemplo, que o WRTE est incorreto. O correto WRITE, que
uma instruo de escrita.
3. Anlise semntica: a fase da compilao em que verifica se as estruturas do programa
faro sentido durante a sua execuo, ou seja detecta os erros semnticos. Por exemplo, verifica a multiplicao entre tipos de dados diferentes, tal como nmero inteiro
multiplicado por um nmero real. Nesta etapa preparada, por meio de coleta as informaes, a prxima fase da compilao que a fase de sntese, por pelo menos mais
trs etapas.
4. Gerador de cdigo intermedirio: como o prprio nome traduz, um passo intermedirio, que em alguns casos poder ser o cdigo-objeto final.
5. Otimizador de cdigo: nesta etapa o cdigo intermedirio otimizado em termos de
velocidade de execuo e espao de memria.
6. Gerador do Cdigo-objeto: nesta fase gerado o cdigo-objeto, otimizado ou no,
dependendo das opes de compilao. Os objetivos desta etapa so, por exemplo,
reserva de memria para as variveis e de dispositivos de entrada e sada de dados.
Ento, gerado o executvel, em linguagem de mquina, para uma determinada arquitetura de computador, isto , dependente de mquina.
Para auxiliar na compreenso de algumas funes de um compilador, usaremos uma
analogia com a linguagem portuguesa. Seja a seguinte afirmao:
Ela comprar duas febre, e tambm comprar um cordeiro, ambos amaa.
Inicialmente, numa anlise lxica, verifica-se que o caracter no pertence ao conjunto de
smbolos da lngua portuguesa. Para corrigir, os dois caracteres a sero substitudos por
nh. Na anlise sinttica verificado se a estrutura est em acordo com as regras gramaticais.
Neste caso, ser detectado dois erros, que sero corrigidos por:
comprar
comprar,
febre
febres.
12
No Fortran: o compilador evocado, assim como para outros tipos de compiladores, por
uma palavra chave, que depende de compilador para compilador. No nosso caso o g95,
do Fortran G95. Ao compilar anexado ao cdigo, entre outras, instrues matemticas,
instrues de dispositivos de entrada e sada de dados, por exemplo, via teclado e via monitor, respectivamente. Os arquivos executveis gerados so especficos para cada processador
e/ou sistema operacional, isto , cdigo compilado num computador com processador Intel
Pentium ou AMD no ser executado numa Estao Sun SPARC e vice-versa. Da mesma
forma, um cdigo compilado num computador com sistema operacional Windows no ser
executado num computador com sistema operacional Linux, UNIX ou MacOS e vice-versa.
Assim, quando trocarmos de plataforma (processador e/ou sistema operacional), devemos
compilar novamente o cdigo. Observe que um termo novo, cdigo ou cdigo computacional, foi introduzido e se refere a um programa de computador gerado com uma linguagem
de programao.
No Apndice ??, na pg. ??, apresentado o compilador G95, utilizado como referncia
neste livro. indicado como baix-lo na internet e instal-lo, tanto para a plataforma Windows como para Linux. Exemplos de uso do compilador esto descritos a partir da pgina 16.
Existe outra forma de executar um programa de computador gerado por uma linguagem de programao. So os interpretadores. E para corrigir erros em programas podemos
recorrer aos depuradores, os quais veremos resumidamente a seguir.
Interpretador
Os interpretadores so programas que lem um cdigo-fonte de uma linguagem de programao e o executam. Seu funcionamento pode variar de acordo com a implementao e,
em muitos casos o interpretador l linha-a-linha e converte em cdigo-objeto medida que
vai executando o programa. Linguagens interpretadas so mais dinmicas e apresentam a
seguinte sequncia:
escrever cdigo = testar = corrigir = escrever = testar = distribuir.
J os compiladores tem uma sequncia dada por:
escrever cdigo = compilar = testar = corrigir = compilar = testar = distribuir.
Mas existem tambm linguagens que funcionam como interpretadores e compiladores, como
por exemplo: Python (somente quando requerido), BASIC, entre outras. Outros exemplos de
linguagens interpretadas so: Bash, C#, Perl, PHP, Python, Euphoria, Forth, JavaScript, Logo,
entre outras.
Depurador
Depurador, tambm conhecido por debugger, um programa usado para testar outros programas e fazer sua depurao, ou seja, indica seus problemas ou bugs[N6] .
Em geral, os depuradores oferecem as seguintes funcionalidades:
[N6] Bug significa em ingls qualquer tipo de inseto. Os primeiros computadores de tamanhos de grandes salas
paravam os processamentos devido a insetos que se localizavam em seus dispositivos. Para retornar ao trabalho era
preciso retirar os insetos, ou seja, fazer um debugging. Assim, este termo foi mantido no meio acadmico e at hoje
utilizado para erro e procura de erros.
13
1.4
AS UNIDADES DE PROGRAMA
Unidades de programa so os menores elementos de um programa Fortran que podem
ser compilados separadamente. Existem cinco tipos de unidades de programas:
fortran
95
14
[PROGRAM nome_do_programa]
[USE nome_do_use]
[IMPLICIT NONE]
[declarao global dos dados]
instrues executveis e no-executveis
[CONTAINS]
[subprogramas internos]
END [PROGRAM nome_do_programa]
em que, os colchetes indicam que o elemento Fortran opcional[N7] e, a ordem obrigatria
est indicada na seqencia exposta. uma boa prtica de programao iniciar o cdigo
com a instruo PROGRAM seguida do referido nome, tornando claro o incio do programa
principal. Cada um dos itens da estrutura sero tratados no decorrer do livro.
Um cdigo computacional tem um e somente um programa principal. a estrutura de
referncia, isto , o compilador reconhece somente um END que obrigatrio, ou quando
existir, inicialmente, somente um PROGRAM que opcional. Para as demais unidades de
programa no h nmero mnimo ou mximo de aparies.
Antes de criarmos os dois primeiros programas, importante e necessrio vermos alguns elementos do Fortran 95.
O FORMATO LIVRE
No Fortran 95 podemos escrever em qualquer coluna (posio) na linha e temos 132 posies
para ocupar. Este chamado de formato livre. No FORTRAN 77, verso anterior ao Fortran
90/95, se inicia o cdigo a partir da coluna 7 at 72. As colunas 1 at 6 so utilizadas para
instrues de controle de fluxo do cdigo e para localizao de rtulos, como os utilizados na
instruo FORMAT. A coluna 6, especificamemte, indica, pela escrita de um caracter qualquer,
a continuao da linha anterior. Da coluna 73 at 80 o campo de identificao do carto.
Esta estrutura, chamada de formato fixo, era devido ao carto de digitao, em que cada
linha tinha 80 colunas (posies) para ser perfurado, para posterior manipulao de leitura e
processamento pelo computador. O Fortran 95 tambm suporta o formato fixo.
O CONJUNTO DE CARACTERES
O conjunto de caracteres do Fortran consiste, como visto na pgina 8, de:
As 26 letras maisculas:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
As 26 letras minsculas:
abcdefghijklmnopqrstuvwxyz
Os dez dgitos:
0123456789
[N7] Lembrando a conveno: neste livro, os colchetes sempre indicaro que o elemento (por exemplo, uma declarao, uma instruo ou um atributo) opcional.
15
&
t2006
primeiro_programa
Metodo_LTSN
AaBb
Calculo_integral_definida
soma
SOMA
Soma
primeiro programa
calculo_do_
ilegal_@_caracter
ao_distncia
nome_muito_longo_nao_pode_ser_usado
16
OS RTULOS EM FORTRAN
Os procedimentos ou instrues em Fortran podem ter suas posies identificadas no programa. Essa identificao conhecida como rtulo e descrito por um (1) at cinco (5) algarismos, sendo o primeiro algarismo no nulo. localizado sempre a esquerda na linha, antes
da instruo ou procedimento. Os rtulos so importantes, por exemplo, na instruo no
executvel FORMAT, que ser estudada na seo 2.6 do Captulo 2, na pgina 56.
Exemplos de rtulos vlidos em Fortran:
200
1234
20000
10
00010
O PRIMEIRO PROGRAMA
Veremos um exemplo simples de programa escrito na linguagem Fortran 95: O primeiro programa. Como de praxe em qualquer livro de linguagem de programao, o primeiro programa apresentado sempre ensina como escrever uma mensagem na tela do monitor. Isto
tem um significado importante: todos os procedimentos realizados por um programa (ou cdigo
computacional), como por exemplo clculos de expresses matemticas, precisam ser apresentados
para o usurio e isso s possvel por intermdio de uma sada de informao. Caso contrrio, todas as informaes manipuladas ficaro aprisionadas na memria do computador sem que saibamos
seus valores, e se perdero ao desligar o computador.
Como mencionando anteriormente, no Apndice ?? apresentado com detalhes, como
obter, instalar e utilizar o compilador Fortran G95, tanto para o sistema operacional Windows
como para o Linux. No Apndice ?? apresentada uma lista de outros compiladores Fortran.
Para criar um programa necessrio seguir os trs seguintes passos[N9] :
[N9] Existem compiladores Fortran que apresentam uma rea de trabalho totalmente integrada, isto , possvel num
mesmo ambiente digitar o cdigo fonte, compil-lo para gerar o executvel e execut-lo. o caso, por exemplo, dos
compiladores Lahey, PowerStation e Portland.
17
O EDITOR DE TEXTO
Para elaborao do programa Fortran possvel utilizar qualquer editor, com exceo daqueles que ao salvar o arquivo anexem instrues de controle do prprio editor. Assim, ao
compilar o programa contido neste arquivo poder ocorrer um erro de compilao devido a
estas instrues (muitas vezes caracteres) de controle. Assim, evite o WORD e o WORDPAD, no caso do Windows. Utilize o NOTEPAD (o mesmo que BLOCO DE NOTAS) para
digitar os programas, e salve-o com a extenso .f90 ou .f95. Importante: habilite no
Salvar como a opo Todos. Assim ser evitado o indesejvel acrscimo da extenso
.txt aps a extenso .f90 ou .f95. No Linux, em princpio, pode-se utilizar qualquer
um dos editores de texto disponveis.
exemplificar o uso de outro compilador, por exemplo, o da Lahey/Fujitsu for GNU/Linux, compila-se com o
comando lf95.
[N11] Conselho: se voc no trabalha com o sistema operacional GNU/Linux, experimente !!! gratuito e no por
isso ineficiente, pelo contrrio, altamente estvel e confivel.
[N12] Infelizmente, na falta de uma palavra apropriada em Portugus, para a ao de quem faz um link (ligao, vnculo,
elo), que reforce a idia em computao, estou usando linkador.
18
O nome de sada, no caso do Linux, pode ser acrescido de uma extenso ou no. Para o
Windows interessante acrescentar a extenso EXE (mas no necessrio), para evitar
algum problema referente a estrutura de arquivo.
Para outras opes do compilador, consulte o manual do Usurio. Somente para o
Linux, digite man g95 para ler o manual.
No 3 item acima, o compilador anexa ao cdigo, entre outras coisas, clculos matemticos, entrada de dados, e sada de resultados. Por exemplo, as entradas podem
ser via teclado, arquivo (pg. 50) ou outro dispositivo. As sadas podem ser via monitor, impressora, arquivo ou por outro dispositivo. importante relembrar que os
arquivos executveis so especficos para cada processador e/ou sistema operacional.
Ou seja, um cdigo compilado num computador, com G95 por exemplo, num processador Intel Pentium no ser executado numa Estao Sun SPARC, e vice-versa. Da
mesma forma, um cdigo compilado num computador com sistema operacional Windows no ser executado num computador com sistema operacional Linux e vice-versa.
Assim, quando trocarmos de plataforma (processador e/ou sistema operacional), devemos compilar novamente o cdigo.
3. Execute o cdigo (programa) usando o comando:
No Linux:
./nome_programa ou ./a.out
No Windows:
nome_programa.exe ou a.exe
ou simplesmente:
nome_programa ou a
O SEGUNDO PROGRAMA
Neste exemplo, o programa 1.2, j so apresentadas boas prticas de programao que sero
descritas na sequncia. O cdigo transforma o valor do ngulo em graus para radianos, e
19
PROGRAM graus_para_rad
IMPLICIT NONE
!
! Este programa converte angulos em graus para radianos
!
REAL :: theta, ang_rad
REAL, PARAMETER :: pi=3.14159265
WRITE(*,*)"Indique um angulo em graus: "
READ(*,*)theta
ang_rad = theta*pi/180.0 ! Aqui ocorre a conversao
WRITE(*,*) O angulo ,theta,, em graus, vale,&
ang_rad, radianos
WRITE(*,*) cos(theta) = ,COS(ang_rad)
END PROGRAM graus_para_rad
Procurou-se neste exemplo deixar clara a estrutura de um programa Fortran 95 e observe que as instrues da linguagem esto em negrito. Embora seja opcional, um programa
Fortran 95 inicia com a instruo PROGRAM seguida do nome do programa. Na sequncia
constam as declaraes de variveis, entre as linhas 2 e 7. O corpo do programa, que contm
as instrues excutveis (e tambm no executveis), est entre as linhas 8 e 13. E, finaliza
com a instruo END seguida do nome do programa.
A seguir veremos uma descrio de cada linha, indicando o que executa ou instrui o
computador a realizar. Aproveitaremos para indicar as boas prticas de programao e algumas exigncias da linguagem Fortran.
Linha 1: Nesta linha ocorre o incio do cdigo ou programa em Fortran. A palavra-chave
PROGRAM seguido do nome do programa. Como visto anteriormente, na pgina 15,
devemos ter cuidado ao nomear um programa. O nome de um programa Fortran 95
ter at 31 caracteres e iniciar sempre com uma letra do alfabeto, poder conter letras,
algarismos e o caracter trao baixo ou underscore ( _ ).
Reiterando, embora seja opcional, uma boa prtica de programao colocar a instruo
PROGRAM (sempre na primeira linha) seguida de um nome.
Linha 2: O IMPLICIT NONE, que j estava disponvel nas ltimas verses do FORTRAN 77,
obriga-nos a declarar todas a variveis do problema, auxiliando a depurar eventuais
erros de escrita ou de dupla declarao. Embora seja opcional, tambm uma boa prtica
de programao colocar a instruo IMPLICIT NONE.
Linha 3: O caracter ! (sinal de exclamao) instrui o compilador que a sua direita o con-
fortran
95
fortran
95
20
tedo seja ignorado, ou seja, a linha apenas um comentrio no programa. uma boa
prtica de programao escrever comentrios a respeito de certas atitudes e linhas do
programa. Assim, comente o mximo possvel o seu programa. Neste caso foi utilizado
simplesmente para deixar uma linha em branco, embora no Fortran possvel deixar em
branco quantas linhas desejar, sem a necessidade do sinal de exclamao.
Linha 4: Nesta linha o comentrio para descrever a utilizao do programa. O uso de
comentrios evita o esquecimento, por exemplo, do significado de cada varivel ou do
que trata o programa, fato que comum com o passar do tempo. Ou ainda, possibilita
que outros programadores entendam melhor o que foi programado. Escreva o objetivo
do programa e das sub-rotinas. Insira tambm formas de contato com o programador,
como por exemplo, o e-mail. No esquea, aps o sinal ! o contedo ser ignorado.
Linha 5: Mais uma linha em branco comentada.
Linha 6: Aparece a primeira declarao global de varivel, que do tipo real. Observe
atentamente a sintaxe. Primeiro se escreve o tipo de dado (varivel) seguido de dois
dois-pontos e, na sequncia, separados por vrgulas as variveis. Os nomes da variveis
seguem os mesmos critrios que vimos para o nome do programa. aconselhvel nomear as variveis com nomes mais prximo possvel da sua funo no programa. Por
exemplo, theta, no jargo matemtico est relacionado com ngulo, assim como o nome
ang_rad, ngulo em radianos. As declaraes de variveis sero estudadas com mais
detalhes na pgina 25.
Linha 7: Aparece a segunda declarao de varivel, que tambm do tipo real. Note que
foi acrescentado um parmetro na declarao: o PARAMETER, que instrui o compilador
a fixar o valor da varivel pi ao longo de todo o programa, no permitindo que seja
alterado. Uma tentativa de alterar o valor de pi acarretar num erro de execuo. A
diferena para a declarao anterior que as duas variveis, theta e ang_rad, podem
ser alteradas a qualquer momento no programa, enquanto pi permancer constante durante toda a execuo.
Linha 8: Nesta linha aparece a primeira instruo executvel: o WRITE, que uma instruo de sada de resultado (ou de escrita ou impresso). Neste caso, devido ao primeiro
asterisco (*), a sada ser na tela do monitor. Note que a mensagem est entre duplas
aspas.
Linha 9: Agora uma instruo executvel de leitura apresentada: o READ, que receber um
valor para a varivel theta digitada via teclado, tambm, devido ao primeiro asterisco.
Mais informaes a respeito de instrues de leitura e escrita esto no Captulo 2, na
pg. 49.
fortran
95
Linha 10: Nesta linha ocorre a converso de graus para radianos, por intermdio de uma
expresso matemtica. Observe que o sinal de igual no indica uma igualdade propriamente dita, mas sim uma atribuio (que ser estudado na pgina 27). Isto , primeiro
so realizadas todas as operaes no lado direito da igualdade para posterior atribuio
do resultado final varivel, neste caso a varivel ang_rad. Note tambm que foi adicionado um comentrio aps uma instruo. Esta mais uma caracterstica do Fortran 95,
isto , permite que se faa comentrio em qualquer parte do programa, sempre iniciando
com um !.
21
Linha 11: Nesta linha impresso, pelo WRITE, o resultado das operaes executveis anteriores, e novamente na tela do monitor. Agora uma mltipla sada, todas separadas
por vrgula, que envolve valores armazenados nas variveis (que ser estudado na pgina 27), e de frases literais (entre aspas). Observe tambm o caracter &, que posicionado
no final da linha indica que a linha continuar na seguinte. Se um nome, palavra-chave
ou constante quebrado por um &, o primeiro caracter da prxima linha deve ser outro
&, seguido do restante do nome, palavra-chave ou constante. Veja o exemplo:
11
12
Linha 12: Aqui continua a linha anterior, indicado pelo & no final da linha 11. opcional o
uso de outro & no incio da linha, a no ser nos casos citados acima.
Linha 13: impresso o outro resultado, tambm na tela do monitor.
Linha 14: a linha que encerra o programa. Caso no tivssemos escrito a linha 1, poderamos encerrar o programa somente com a instruo END. Como escrevemos a instruo
PROGRAM graus_para_rad, devemos encerrar obrigatoriamente com a instruo END
seguido de PROGRAM graus_para_rad.
Encerramos a breve anlise do nosso segundo programa Fortran. Foi somente um exemplo, e assim deve ser encarado, porque existem outras tantas instrues, funes, declaraes
Fortran, que somente lendo este livro at o final ters uma boa noo antes de comear efetivamente a programar em Fortran. A medida que formos avanando outros programas sero
propostos.
Em resumo, a estrutura geral de um programa Fortran :
1.
BLOCO DA DECLARAO DAS VARIVEIS, que um conjunto de instrues noexecutveis que definem as variveis que sero utilizadas ao longo do programa. Os
sub-programas tem acesso as variveis declaradas nesta etapa via troca por parmetros.
2.
3.
A seguir, para avanarmos no aprendizado da linguagem Fortran, veremos como funciona a despensa de dados para o Fortran, especialmente como armazenar e manipular
nmeros inteiros e reais, na sequncia os complexos.
fortran
95
22
1.5
A DESPENSA DE DADOS NO FORTRAN 95
O Fortran disponibiliza uma variedade de maneiras para armazenar e lidar com os dados. Os tipos de dados suportados pelo Fortran so:
REAIS: nmeros que so representados com uma parte fracionria ou que possuem ponto
decimal. So conhecidos tambm como nmeros representados em ponto flutuante. Aqui
os nmeros reais so tratados com ponto decimal e no com a vrgula, como estamos
habituados no dia-a-dia.
COMPLEXOS: nmeros do plano complexo, que possuem uma parte imaginria (que
representada por um nmero real) e uma parte real (Na pgina 24).
LGICOS: so dados que assumiro somente um valor: verdadeiro ou falso (Na pg. 24).
Veremos com mais detalhes os inteiros e reais. Deixaremos para o estudante se aprofundar nos demais tipos de dados representativos no Fortran.
1.5.1
1.5.2
23
nmero ser mais manusevel se escrito em notao cientfica: 2,998 108 m/s. As duas
partes de um nmero expresso em notao cientfica so chamadas de mantissa e expoente
da potncia de dez. A mantissa 2, 998 e o expoente 8 (no sistema de base 10).
Na linguagem do computador os nmeros reais so escritos de forma similar, a diferena se encontra no sistema usado porque o computador trabalha na base 2. Assim, se
N -bits so dedicados para representar (e armazenar) um nmero real, parte reservada para
a mantissa e parte para o expoente. A mantissa caracteriza a preciso e o expoente caracteriza
o tamanho que pode ser assumido pelo nmero. nesta repartio, e tambm na quantidade,
de bits que comea a diferenciao entre os computadores e compiladores Fortran.
A grande parte dos computadores usam como preciso simples 4 Bytes (32 bits o (wordsize) do computador) para repartir entre a mantissa e o expoente. Normalmente esta diviso
contempla 24 bits para a mantissa e 8 bits para o expoente. Assim, temos:
i) Mantissa (preciso) n = 24 bits (3 Bytes)
2n1 = 223 = 8.388.608 que equivale a 7 algarismos significativos,
ii) Expoente n0 = 8 bits (1 Byte)
0
2n = 28 bits = 225510 , sendo metade para a parte positiva e metade para a negativa
Assim, o intervalo dado por 2128 2127 , que resulta em 1038 1038 .
Isto quer dizer que um nmero escrito em preciso simples ter at 7 ou 8 algarismos significativos (dgitos decimais) e o seu expoente (da potncia de 10) deve estar contido no intervalo
entre 38 e 38. Excedendo a este intervalo acarretar no erro de overflow.
O Fortran 95 inclui uma possibilidade de representar nmeros reais de forma mais ampla,
do que a preciso simples - default nos computadores. Esta possibilidade conhecida como
Dupla Preciso (ou Double Precision). Usualmente a dupla preciso de 8 Bytes (ou 64 bits),
sendo 53 bits para a mantissa e 11 bits para o expoente. Assim, temos:
i) Mantissa (preciso) n = 53 bits
2n1 = 252 que equivale entre 15 e 16 algarismos significativos,
ii) Expoente n0 = 11 bits
0
2n = 211 bits = 2204810 , sendo metade para a parte positiva e outra para a negativa
Assim, o intervalo dado por 21024 21024 , que resulta em 10308 10308 .
Desta forma, um nmero escrito em preciso dupla ter at 15 ou 16 algarismos significativos
(dgitos decimais) e o seu expoente (da potncia de 10) deve estar contido no intervalo entre
308 e 308. Excedendo a este intervalo acarretar no erro de overflow.
24
1.5.3
O estudo feito para os nmeros reais extensivo para os nmeros complexos. A forma geral
de um nmero complexo c = a + bi, em que c o nmero complexo, a (parte real) e
fortran
95
(1.,0.)
1 + 0i (real puro)
(0.7071,0.7071)
0.7071 + 0.7071i
(1.01E6,0.5E2)
1010000 + 50i
(0,-1)
i (imaginrio puro)
Em que o E representa a base 10 e o nmero aps o expoente. Desta forma, o que vimos
para os reais, vlido para os complexos. A diferena est no procedimento Fortran, que
feito pela declarao COMPLEX, que veremos adiante. A funo CMPLX, que ser estudada na
pgina 32tabela 1.2, converte um nmero inteiro ou real em complexo.
Programando em Fortran 95 deveremos ter cuidado ao declarar as precises de nossas
variveis, j que tanto a definio de preciso simples como a de preciso dupla podem mudar de computador para computador[N13] . O Fortran 95 possibilita modificarmos a mantissa e
o expoente, para escrevermos programas que possam ser facilmente portveis entre processadores diferentes, com tamanho de palavra (wordsize) diferentes. Isto obtido por uma funo
intrnseca que seleciona automaticamente a mnima preciso especificada, mesmo quando se
troca de computador. Para os reais, esta funo a SELECTED_REAL_KIND, que veremos no
Captulo 7, na pgina 107. Para os inteiros temos a funo SELECTED_INT_KIND.
1.5.4
Alm dos dados inteiros, reais e complexos, existem outros dois dados (ou tipos de variveis
para armazenar dados): os lgicos e os caracteres.
Os Lgicos (LOGICAL)
So dados que assumiro somente valor verdadeiro ou falso e, so especialmente teis em tomadas de deciso, que sero estudadas no Captulo 3, na pgina 63. Os valores so: .TRUE.
(Verdadeiro) e .FALSE. (Falso).
25
1.6
A DECLARAO DAS VARIVEIS
Em Fortran, todas as variveis que armazenaro os dados devem ser declaradas. Uma
varivel sempre ter um nome, um tipo, um tamanho e um valor. So cinco os tipos de dados intrnsecos, trs numricos: INTEGER, REAL, COMPLEX, e dois no-numricos: LOGICAL
e CHARACTER. O tipo de declarao DOUBLE PRECISION, disponvel no FORTRAN 77,
ainda suportado pelo Fortran 95, mas considerado um subconjunto (ou um tipo kind) do
REAL.
Os tipos de dados foram tratados anteriormente e assumiremos que uma varivel armazenar algum tipo de dado. Ento estas duas palavras, dados e variveis, sero sinnimos,
no sentido que ambas esto relacionadas a valores que sero armazenados e manipulados
por intermdio de variveis.
A sintaxe geral de uma declarao de varivel :
<tipo> [([KIND=]<par_repres.>)][<atributos>][::] <variaveis>
em que:
<tipo> : um dos tipos de dados estudados anteriormente e podem ser: INTEGER, REAL,
COMPLEX, LOGICAL e CHARACTER, respectivamente representando, inteiros, reais, complexos, lgicos e caracteres.
([KIND=]<par_repres.>) : em Fortran 95, cada um dos cinco tipos intrnsecos anteriores possui um valor inteiro no negativo denominado parmetro de representao do tipo
de dado. Este parmetro o valor correspondente em bytes disponibilizados para sua
representao, como vimos em detalhes para os inteiros e reais, a partir da pgina 23.
Na normatizao da linguagem Fortran 90/95 ficou estabelecido um padro: qualquer
processador deve suportar pelo menos dois parmetros de representao (o KIND) para
os tipos de dados REAL e COMPLEX e pelo menos um parmetro para os tipos de dados
INTEGER, CHARACTER e LOGICAL.
A tabela B.1, no Apndice B, contm todos os tipos de dados, seus parmetros de representao e intervalos de armazenamento, baseado no compilador G95.
<atributos> :
outros:
bilidades de alter-lo,
ALLOCATABLE : usado juntamente com o DIMENSION e indica que o tamanho da array
26
Obs.:
Podem ser declarados mais de um atributo para a mesma varivel, os quais sero separados por vrgula.
Ao longo do livro sero apresentados outros atributos para a declarao de variveis.
:: :
os uso dos dois dois pontos opcional, mas ser obrigatrio caso deseja-se inicializar
a varivel no momento da sua declarao.
<variveis> : so os nomes das variveis que armazenaro os dados, separados por vrgulas. O nome de uma varivel poder ter at 31 caracteres e iniciar sempre com uma
letra do alfabeto, jamais com um algarismo, que poder ser utilizado a partir da segunda
posio, assim como o underscore (_). No conter caracter especial ( , ( ){ }[ ]! . : @ # $
% & *) em qualquer posio do nome, bem como letras acentuadas ou cedilhadas.
A ATRIBUIO DE VALOR VARIVEL
Uma varivel um registrador de posio de memria que pode conter qualquer dado, numrico e no-numrico, sendo possvel alterar ou no durante a execuo do programa.
No Fortran, uma varivel recebe um valor por intermdio do sinal de igualdade. Esta
operao recebe o nome de atribuio de um valor a uma varivel, conforme o exemplo:
a = 15
Aqui a varivel a recebeu o valor igual a 15, isto , foi atribudo a ela (na memria) o valor
inteiro 15. Esta interpretao importante porque poderemos ter o seguinte caso:
b = 6
b = 5 + b
! eh um acumulador
27
MODULE var
IMPLICIT NONE
INTEGER :: a=1, b=2, c
END MODULE var
! VARIAVEIS GLOBAIS
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
PROGRAM teste_dec_global
USE var
!
IMPLICIT NONE
INTEGER :: res
!
CALL soma(res)
WRITE(*,*)"O resultado eh: ", res
CALL mult(res)
WRITE(*,*)"O resultado eh: ", res
CONTAINS
SUBROUTINE soma(z)
IMPLICIT NONE
INTEGER :: z, d=4
!
WRITE(*,*)"Informe o valor da
READ(*,*)c
z = a + b + c + d
END SUBROUTINE soma
END PROGRAM teste_dec_global
VARIAVEIS LOCAIS
variavel c (inteira): "
23
24
25
26
27
28
29
SUBROUTINE mult(z)
USE var
IMPLICIT NONE
INTEGER :: z, d=4
z = a * b * c * d
END SUBROUTINE mult
28
Ao executar o cdigo, informando que a varivel c receber o valor igual a 10, teremos
como sada:
O resultado eh: 17
O resultado eh: 80
importante compreender o que exatamente o cdigo executa, ento vejamos atentamente o que est ocorrendo.
a) O procedimento MODULE var contm a declarao das variveis, inteiras (INTEGER),
a, b e c, em que as duas primeiras foram inicializadas.
b) no programa principal (PROGRAM teste_dec_global) as variveis a, b e c so ativadas pela instruo USE var, e estaro disponveis para todos os procedimentos do
programa. A instruo USE sempre localizada logo abaixo o incio do programa ou
do subprograma, e o objetivo instruir o compilador a carregar os procedimentos do
mdulo.
c) na linha 10, o programa principal invoca (chama) um subprograma chamado de
SUBROUTINE soma, cujo nico parmetro de passagem nesta conexo a varivel
res, que receber o resultado de uma soma realizada no referido subprograma. Note
que na SUBROUTINE soma as variveis a, b e c no foram declaradas e nem foi necessrio a instruo USE var. A ausncia deste ltimo porque o subprograma est
contido no interior do programa principal, ao possibilitada pela instruo CONTAINS.
importante ressaltar que a instruo CONTAINS permite que subprogramas pertenam ao programa principal e, a sua localizao tal que os procedimentos abaixo sejam
somente SUBROUTINEs e FUNCTIONs.
d) na linha 24, outro subprograma (neste caso a SUBROUTINE mult) utilizado para realizar uma multiplicao de variveis. Observe que pelo fato de estar localizado externamente necessria a instruo USE var, para tornar as variveis a, b e c globais.
e) para encerrar, atente para a varivel c. Ela foi preenchida por uma entrada de dados
por meio de um READ, na linha 20, e automaticamente o valor atribudo disponibilizado globalmente, como pode ser verificado pela operao matemtica na linha 28.
Para melhor entendimento dos subprogramas recorra ao Captulo 6, na pgina 97, mas
abordaremos rapidamente os que utilizamos neste exemplo. Os subprogramas, so unidades
de programas e so os menores elementos de um programa Fortran que podem ser compilados separadamente. Os do tipo SUBROUTINE so ativados pelas instrues CALL, que trocam
parmetros entre o programa principal e os subprogramas. Os parmetros so dados trocados entre o programa principal e a SUBROUTINE, e esto localizados entre os parnteses, logo
aps as instrues CALL e SUBROUTINE. A ordem dos parmetros definida pelo usurio,
e deve ser mantida rigorosamente nas chamadas. As variveis no necessariamente tem o
mesmo nome no programa principal e nos subprogramas. Observe que no programa principal a varivel que receber a sada do subprograma res e no interior dos subprogramas z.
Para finalizar, toda vez que um subprograma ativado, o programa principal altera o
seu fluxo de execuo para o subprograma. Aps a realizao da tarefa do subprograma, o
29
fluxo retorna para a prxima linha aps a chamada (CALL). Observe tambm que a varivel
res retm o ltimo valor a ela atribudo e, que a varivel d do tipo local.
A seguir so apresentados exemplos de declaraes de variveis num programa Fortran:
Programa 1.4 Exemplo com declaraes de variveis num programa Fortran.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
INTEGER a, b, c
INTEGER :: ai_doi, junho_2001
INTEGER :: dia = 1
INTEGER, PARAMETER :: mes = 5
REAL(KIND=8) :: oi
REAL, PARAMETER :: ola = 4.0
REAL, PARAMETER :: pi = 3.141593
REAL, DIMENSION(4) :: a1
REAL, DIMENSION(3,3) :: b1
DOUBLE PRECISION :: dupla
CHARACTER(LEN=10) :: primeiro, ultimo
CHARACTER(10) :: primeiro = Meu nome
CHARACTER :: meio_escuro
LOGICAL :: claro
LOGICAL :: escuro = .FALSE.
COMPLEX :: nao
COMPLEX, DIMENSION(256) :: aqui
. . .
END
Inicialmente, como mencionado, os dois pontos (::) so facultativos quando no inicializamos a variveis, caso da linha 1. Assim, seriam necessrios somente nas linhas 3, 4, 6,
7, 12 e 15, mas uma boa prtica de programao coloc-los. Como vimos anteriormente,
sempre bom inicializarmos as variveis, para evitar que venham carregadas de algum lixo da
memria.
As variveis a1 e b1 so variveis compostas ou simplesmente arrays, i.e., vetores ou
matrizes, como demonstra o atributo DIMENSION. Estes tipos de variveis sero estudadas
no Captulo 4, na pgina 79. No primeiro caso, um vetor de tamanho 4 e, no segundo, uma
matriz 3 3. Nestes dois exemplos, informado ao processador que ele deve reservar na
sua memria um espao para armazenar as arrays a1 e b1. Esta uma alocao esttica de
memria, ou seja, do incio at o fim da execuo do programa este espao de memria est
reservado para este procedimento, mesmo que somente sejam usadas no incio do programa.
Mais adiante, veremos como alocar memria dinamicamente pelo comando ALLOCATABLE,
que ser estudada no Captulo 5, na pgina 91.
Outra considerao com relao ao atributo KIND, na linha 5, que especifica o tipo
de preciso desejada. Na ausncia assumido como preciso simples, que seria (KIND=4),
em que o algarismo 4 indica a preciso simples. Assim, para obtermos preciso dupla
necessrio acrescentar o atributo (KIND=8), em que o algarismo 8 indica a dupla preciso.
Na declarao permitido omitir a palavra-chave KIND=, podendo assim a declarao ser
fortran
95
fortran
95
30
1.7
OS PROCEDIMENTOS INTRNSECOS
H tarefas que so executadas com frequncia quando trabalhamos no computador,
por exemplo, quando efetuamos clculos podemos utilizar seguidamente o cosseno de um
ngulo ou at mesmo o logaritmo ou a raiz quadrada de um nmero real. O Fortran oferece com muita eficincia um conjunto de procedimentos intrnsecos, que fazem parte do
ncleo do compilador. O Fortran 95 tem mais de 130 procedimentos intrnsecos, divididos
em diferentes classes:
Transformao: procedimento que transforma de um estado para outro, como por exemplo, a converso de um nmero real em inteiro ou vice-versa.
Mistos: que incluem rotinas relativas ao processador e ao tempo, como por exemplo,
DATE_AND_TIME.
1.7.1
Como ocorre numa simples calculadora de mo, o Fortran 95 oferece quase uma centena de
funes pr-definidas ou conhecidas por funes intrnsecas, ou procedimentos intrnsecos, tais
como cosseno e seno de um ngulo. Algumas funes esto apresentadas na tabela 1.1, nas
quais so indicados os possveis argumentos de cada uma das funes.
31
Funo
Argumento
ACOS(x)
ASIN(x)
ATAN(x)
ATAN2(y,x)
COS(x)
SIN(x)
TAN(x)
EXP(x)
LOG(x)
LOG10(x)
ABS(x)
MOD(x,y)
R
R
R
R
RC
RC
R
R
RC
R
IRC
IR
arccos(x)
arcseno(x)
arctag(x) ou arctg(x)
arctag(y/x) ou arctg(y/x)
cos(x)
seno(x)
tag(x) ou tg(x)
ex
ln(x)
log(x)
|x| (mdulo de x)
x/y (resto da diviso). o resultado de x INT(x/y)*y. Ex.:
MOD(3,2) 1 e MOD(2,-3) 2. Para reais: MOD(4.5,1.5) 0.0 e,
MOD(5.0,1.5) 0.5, ou seja, deu exato 3.0 e para completar o 5.0
necessrio 0.5.
SQRT(x)
DIM(x,y)
RC
IR
MAX(x1,x2,...)
IR
MIN(x1,x2,...)
IR
PROGRAM uso_funcoes
IMPLICIT NONE
! Exemplo do uso de funcoes intrinsecas
! Autor: Gilberto Orengo (e-mail: orengo@orengonline.com)
REAL :: pi,alfa,theta,f,fx,modulo
pi = 3.14159265
WRITE(*,*) "Digite o valor do angulo (em graus):"
READ(*,*)alfa
theta = (alfa*pi)/180.0 ! Converte p/radianos
WRITE(*,*)"Digite o valor da Forca (em Newtons):"
READ(*,*)f
32
12
13
14
15
fx = f*COS(theta)
modulo = ABS(fx)
WRITE(*,*)"A Forca no eixo x, em modulo, eh: ", modulo
END PROGRAM uso_funcoes
H casos que ser necessrio utilizar as funes intrnsecas para obter outras. Por exemplo, no caso de logaritmos em outras bases usa-se a mudana de base pela relao:
loga (x) =
log(x)
log(a)
no Fortran
LOG10(x)/LOG10(a)
H funes intrnsecas que determinam relaes entre Inteiros, Reais e Complexos, descritas na tabela 1.2 , que tambm sero importantes no decorrer do livro.
Tabela 1.2 Algumas funes intrnsecas para manipulao de inteiros e reais.
Instruo
Argumento
REAL(x)
I RD C
Funo
DBLE(x)
I RS C
INT(x)
RC
NINT(x)
RC
Converte um nmero real em um nmero inteiro por meio de arredondamento; em que x um real. Ex.: NINT(5.9) resulta em 6, e
INT(2.4) resulta em 2.
CMPLX(x,y)
IR
CEILING(x)
FLOOR(x)
Conveno para o Argumento: I: Inteiro, R: Real de simples ou dupla preciso, RS: Real de preciso simples,
RD: Real de dupla preciso, C: Complexo.
1.7.2
AS EXPRESSES ARITMTICAS
As expresses aritmticas so aquelas que apresentam como resultado um valor numrico
33
que pode ser um nmero inteiro ou real, dependendo dos operandos e operadores. Os operadores aritmticos esto descritos na tabela 1.3.
Tabela 1.3 Os operadores aritmticos disponveis no Fortran 95.
Operadores Aritmticos
Operador binrio
*
/
+
Funo
multiplicao
diviso
soma ou adio
subtrao
potenciao
Exemplos
5*2; A*B
2/7; 8.5/3.1;
3 + 5; A + J
5 1; x y
3**5 = 35
Operador unrio
+
Funo
indica nmero positivo
indica nmero negativo
Exemplos
+3
1
M/N
c) A radiciao pode ser transformada numa potenciao, por exemplo, 6 (6)1/2 , que
na linguagem Fortran fica 6**(1./2.). Deve-se tomar muito cuidado nesta operao
e este assunto tratado com mais detalhes na pgina 35.
A ordem de prioridades nas operaes aritmticas, na linguagem Fortran :
1 Operaes que esto no interior de parnteses, iniciando sempre dos parnteses mais
internos para os mais externos. Os parnteses determinaram a ordem da operao.
Ento, use sem restries os parnteses para evindeciar a ordem das operaes.
2 Todas as potenciaes (**), da direita para a esquerda, e depois as radiciaes (SQRT).
3 Todas as multiplicaes (*) e divises (/), partindo da esquerda para a direita.
4 Todas as adies (+) e subtraes (), realizando as operaes da esquerda para a direita.
34
1
=0
2
2
=1
2
3
=1
2
4
=2
2
5
=2
2
6
=3
2
7
=3
2
8
=4
2
9
=4
2
5
=1
4
7
=1
4
1
=0
3
Baseado nos resultados devemos ter cautela quando formos utilizar estas operaes de
diviso entre inteiros, porque, por exemplo na primeira diviso,
1
= 0 6= 0.5 ,
2
sendo este ltimo o resultado da diviso entre reais. Lembre-se que os nmeros reais so
tratados com ponto decimal e no com a vrgula, como estamos habituados.
Sugere-se que utilize os nmeros inteiros nos procedimentos estritamente necessrios,
por exemplo, em contadores de repeties ou ainda em ndices de variveis compostas, como
matrizes e vetores.
A ARITMTICA DOS REAIS
As mesmas operaes realizadas anteriormente com inteiros, entre reais resultar em:
1.0
= 0.5
2.0
2.
= 1.
2.
3.
= 1.5
2.
4.
= 2.
2.
5.
= 2.5
2.
7.
= 3.5
2.
8.
= 4.
2.
9.
= 4.5
2.
5.
= 1.25
4.
7
= 1.75
4
1.
= 0.3333333
3.
(Preciso simples)
1.
= 0.333333333333333
3.
6.
= 3.
2.
(Preciso dupla)
Observe que as duas ltimas divises se diferenciam pela a preciso. Um cuidado necessrio com as operaes matemticas que estamos acostumados a realizar no dia-a-dia,
tais como
3.0*(1.0/3.0) 6= 1.0
e,
2.0*(1.0/2.0) = 1.0
Esta diferena est na forma como o computador manipula os dados, que dependem da
preciso estabelecida. Assim, quando formos realizar testes de igualdades devemos ter muito
cuidado.
A ARITMTICA MISTA: ENTRE INTEIROS E REAIS
Quando misturamos operaes de reais com inteiros devemos ter cuidado extremo. Vejamos
o porqu? Observe as seguintes operaes.
35
1)
2)
3)
4)
5)
2 +
2.
2 +
2 +
2.
1/2
+ 1/2
1./2
1/2.
+ 1./2.
resulta em:
resulta em:
resulta em:
resulta em:
resulta em:
2
2.
2.5
2.5
2.5
2 + 1./2.
= 2. + .5
2 + .5
2.5
Cada termo resolvido separadamente. Primeiro, pela hierarquia, resolve-se a diviso. Como
tem uma operao envolvendo um inteiro e um real, inicialmente o Fortran converte o inteiro
para real. A seguir a operao de diviso realizada. No prximo passo novamente h o envolvimento entre inteiro e real. Novamente, primeiro o Fortran converte o inteiro para real,
para finalmente fornecer o resultado em real.
Outro cuidado quanto ao envolvimento de operaes mistas com exponenciao. Por
exemplo, seja 61/2 , que na linguagem Fortran fica 6**(1./2.). Deve-se tomar muito cuidado nesta operao, porque numa potenciao o expoente sempre inteiro. Assim, neste
caso o expoente no pode ser nulo, j que 1/2 = 0, na aritmtica de inteiros. Ento preciso
fazer uma diviso por reais. Quando o expoente fracionrio a operao substituida por:
ab = eb ln a , em que b real
sendo que a base inteira foi convertida para real e passou como argumento do logaritmo
natural. Ento, o cuidado est na base que no poder ser negativa, porque o logaritmo de
nmero negativo no definido.
Finalmente, um ltimo cuidado embora no tem nada a ver com operaes mistas
importante salientar. A potenciao sempre ser realizada da direita para a esquerda, assim
2
(34 ) = 38 = 6561 ,
diferente de
34 = 316 = 43046721 .
Os resultados anteriores no contm pontos decimais porque so valores inteiros.
1.7.3
A Manipulao de Caracteres
Um conjunto de caracteres agrupados (string) representa uma palavra. A posio que cada
caracter (carter) ocupa neste agrupamento determinar o significado da palavra. No so
aceitos caracteres acentuados (, , , , ...) e caracteres especiais (, , , ...).
Os computadores somente entendem nmeros, assim um cdigo ASCII a representao numrica dos caracteres tais como a ou @. A tabela ASCII possui 256 posies e contm tambm caracteres acentuados, para contemplar a lngua latina (Portugus, Espanhol,
Italiano, etc).
36
PROGRAM uso_len
IMPLICIT NONE
CHARACTER(LEN=6) :: nome
INTEGER :: a
nome = fisica
a = LEN(nome)
WRITE(*,*)"Tamanho da palavra = ", a
END PROGRAM uso_len
A sada na tela do monitor, ser: Tamanho da palavra = 6
PROGRAM uso_achar
CHARACTER :: letras
INTEGER :: posicao
WRITE(*,*)"Digite um inteiro para obter o&
& caracter ASCII:"
WRITE(*,*)"(Nao esqueca que eh entre 0 e 256)"
READ(*,*) posicao
letras = ACHAR(posicao)
WRITE(*,*)"O caracter eh: ", letras
END PROGRAM uso_achar
Se for digitado 110, a sada na tela do monitor ser: O caracter eh: n, ou se
for digitado 56, a sada na tela do monitor ser: O caracter eh: 8. Observe
que neste ltimo retornado pela funo ACHAR(56) o caracter 8 e no o algarismo
8. Desta forma no podemos oper-lo aritmeticamente.
37
PROGRAM uso_iachar
CHARACTER :: letra
INTEGER :: posicao
WRITE(*,*)"Digite um caracter da tabela ASCII:"
READ(*,(A))letra
posicao = IACHAR(letra)
WRITE(*,*) "A posicao na tabela ASCII eh: ",&
posicao
END PROGRAM uso_iachar
Se for digitado o caracter s, a sada na tela do monitor ser: A posicao na tabela
ASCII eh: 115. Este resultado poder ser manipulado aritmeticamente.
CONSIDERAES IMPORTANTES:
possvel retirar ou retornar parte de uma palavra (string). Por exemplo, seja a string
pessoa. Podemos retirar somente o conjunto sso. Isto possvel somente com
a utilizao de variveis que armazenem caracteres. Vejamos como isto funciona por
intermdio do seguinte programa.
Programa 1.9 Retorna parte de uma string.
1
2
3
4
5
6
7
8
9
PROGRAM parte_de_char
CHARACTER(LEN=20) :: total
CHARACTER(LEN=3) :: parte
WRITE(*,*)"Digite uma palavra, com ate &
& 20 posicoes:"
READ(*,*)total
parte = total(3:5)
WRITE(*,*) "A parte da palavra digitada eh: ", parte
END PROGRAM parte_de_char
Assim, se for digitado a palavra pessoa, a resposta ser:
A parte da palavra digitada eh:
sso
Podemos comparar caracteres da tabela ASCII. A comparao ser utilizando as operaes lgicas de maior (>) e menor (<), por exemplo:
A > a = Falso (ou .FALSE.)
38
1
2
3
4
5
6
7
8
9
10
11
12
PROGRAM ex_conc
CHARACTER(LEN=15) :: total1
CHARACTER(LEN=7) :: total2
CHARACTER(LEN=9) :: parte1
CHARACTER(LEN=6) :: parte2
parte1 = Gilberto
parte2 = Orengo
total1 = parte1//parte2
total2 = parte1(1)//parte2
WRITE(*,*) "A primeira concatenacao eh: ", total1
WRITE(*,*) "A segunda concatenacao eh: ", total2
END PROGRAM ex_conc
Os resultados sero, respectivamente, Gilberto Orengo e GOrengo.
1.8
CORRIGINDO ERROS DEBUGGING
Ao criarmos um cdigo estamos sujeitos a erros, os quais podem ser de trs tipos: de
sintaxe, de tempo-de-execuo e de lgica. Infelizmente errar tambm um atributo inerente
a programao. O pargrafo abaixo, retirado do livro do Chapman [6], na pgina 70, ilustra
com primazia esta situao.
39
... existem duas coisas certas na vida, a morte e os impostos. Mas se trabalhamos com programao acrescente mais uma certeza nesta lista: se escrever um programa com nmero
de linhas significativos, ele apresenter erro na primeira execuo ...
INTEGR :: b
b = 2
WRITE(*;*) b
END
=
=
Na primeira linha o erro est na escrita (sintaxe) da declarao de varivel do tipo inteiro, que escrita INTEGER e no INTEGR. Na terceira linha, o erro est na separao dos
argumentos da instruo WRITE que so separados por vrgula e no por ponto e vrgula. O
correto :
Programa 1.12 Correes dos erros de sintaxes.
1
2
3
4
INTEGER :: b
b = 2
WRITE(*,*) b
END
ERRO DE TEMPO-DE-EXECUO
o tipo de erro que ocorre na execuo do programa quando uma operao ilegal tentada.
Na maioria das vezes uma operao matemtica, por exemplo, uma diviso por zero. Ou
ainda, a atribuio de um caracter no lugar de um inteiro ou real, sendo este tambm um erro
de lgica. Quando este tipo de erro detectado a execuo abortada.
[N14] Bug
significa em ingls qualquer tipo de inseto. Os primeiros computadores de tamanhos de grandes salas
paravam os processamentos devido a insetos que se localizavam em seus dispositivos. Para retornar ao trabalho era
preciso retirar os insetos, ou seja, fazer um debugging. Assim, este termo foi mantido no meio acadmico e at hoje
utilizado para erro e procura de erros.
40
ERRO DE LGICA
O erro de lgica mais difcil de identificar, porque o programa compilado e executado
sem problemas, mas o resultado est errado. Neste caso o compilador no tem condies
de reconhecer e est ligado diretamente forma de programar. O compilador pode somente
identificar um erro de lgica que est ligada a declarao de variveis. Neste caso tambm
um erro de tempo-de-execuo. Por exemplo:
Programa 1.13 Exemplo de erro de lgica.
1
2
3
4
INTEGER :: b
READ(*,*) b
WRITE(*,*) b*2
END
Neste caso, a varivel b declarada como inteira e se for inserida, na linha 2, uma
informao diferente de um valor inteiro, por exemplo real, acusar um erro e abortar a
execuo do programa.
Outros erros de lgica so difceis de detectar, como por exemplo, a diviso por um
nmero prximo de zero que pode levar o programa a gerar resultados errados. Ou ainda, se
muitos arredondamentos so executados muitas vezes podem, tambm, levar a um erro de
resultado. Para estes e outros tipos de erros de lgica o que podemos fazer tomar algumas
precaues, as quais so:
Utilizar sempre a instruo IMPLICIT NONE, que obriga a declarao de todas as variveis do cdigo computacional;
Nas expresses aritmticas e/ou lgicas usar parentses para tornar claro a ordem de
execuo na expresso.
Inicializar todas as variveis. Assim se evita que alguma sujeira de memria contamine os clculos ou as manipulaes de dados.
Escrever todas as entradas de dados. Desta forma possvel visualizar que dados foram informados ao programa e, assim possibilita sua confirmao e se for o caso, sua
correo.
Uma prtica utilizada para encontrar possveis erros permear o cdigo com instrues
tipo WRITE(*,*)estou aqui 1, WRITE(*,*)estou aqui 2, ..., ou com
WRITE(*,*)<resultado1>, WRITE(*,*)<resultado2> e assim sucessivamente, para
termos certeza do fluxo de execuo do cdigo. Vejamos um exemplo. Imagine que parte de
um cdigo de 320 linhas precisa calcular a tangente de um ngulo, para cada n, que a soma
de n vezes a expresso
1
+ en ,
en
ou seja,
!
j
X
1
n
n vezes a tg
+e
,
en
n=1
em que j = 200 no nosso exemplo.
41
O programa abaixo reproduz parte do referido cdigo. Por este motivo no deveria
apresentar uma sada de valor, um WRITE, j que o mesmo utilizado no decorrer do cdigo
original e assim, no precisaria ser impresso neste ponto do cdigo. Mas foi acrescentado
uma sada antes da finalizao do programa, somente com fins didticos, para visualizarmos
que existem limitaes computacionais que devem ser observadas.
Programa 1.14 Exemplo de erros em cdigos computacionais.
1
2
3
4
5
132
133
134
135
136
137
138
320
PROGRAM teste_erro
IMPLICIT NONE
INTEGER :: i, j, m
REAL :: x, y, z
REAL, PARAMETER : pi=3.14159265
DO i = 1,200
! Inicia um loop com 200 repeticoes
x = 1./EXP(i) + EXP(i)
y = y + x
z = TAN(y)
theta = (y*180.0)/pi ! Converte angulo p/graus
END DO
! Finaliza o loop com 200 repeticoes
WRITE(*,*) theta,z ! Soh para fins didaticos
END PROGRAM teste_erro
Ao compilarmos o programa alguns erros sero detectados pelo compilador. O primeiro
erro ser o de sintaxe, porque foi esquecido os dois pontos (:) na declarao da varivel pi,
indicado pelo compilador, conforme mostra a figura 1.1. Relembrando, sempre que inicializarmos uma varivel na sua declarao obrigatrio o uso de dois dois pontos (::).
Com erro deste porte abortada a compilao. Portanto, os erros de lgica no aparecem. Mas cuidado, nem todos os erros de sintaxe so detectados nesta etapa. Por exemplo,
se por engano escrever TA no lugar de TAN, para a funo tangente, no aparecer nesta
primeira compilao. Quando for detectado, ser como erro de definio de funo.
Realizada esta correo, a colocao dos dois pontos (:), compila-se novamente. E a a
surpresa!!! Acompanhe a deteco dos erros de lgica na figura 1.2.
Perceba que o compilador procura auxiliar indicando o provvel tipo e posio do(s)
erro(s). Isto fica claro com a notao:
In file ex_erro.f90:7
x = 1./EXP(i) + EXP(i)
1
Error: Type of argument x in call exp at (1)
should be REAL(4), not INTEGER(4)
que indica o arquivo (ex_erro.f90) e a linha 7. Perceba ainda que o 1, abaixo do EXP(i),
indica a provvel posio do erro na linha. O provvel tipo de erro (Error:) est no tipo de
argumento da exponencial, que deve ser real de preciso simples, e no inteiro.
Neste caso foram dois tipos de erro, embora apaream trs na indicao do compilador.
O primeiro a respeito do argumento da exponencial, que espera um valor real e foi passado
42
um inteiro. A correo feita utilizando a funo REAL(i), que converte o inteiro para
real. Observe que no possvel trocar a declarao da varivel i porque ela um contador
do loop DO, que ser estudado no Captulo 3, na pgina 63. E contador sempre inteiro.
O segundo erro, o indicado pelo compilador, decorrente do primeiro, porque esperado
ento que EXP(i) seja uma funo definida pelo usurio j que estaria recebendo um valor
inteiro. Mas, corrigido o primeiro erro, este deixa de existir. Comprove se verdadeira a
afirmaao !!! Para isto, corrija somente o primeiro erro e re-compile.
43
O segundo erro de lgica (ou terceiro indicado pelo compilador) a ausncia de declarao da varivel theta. Esta deteco foi possvel pela presena do IMPLICIT NONE na
segunda linha.
Corrigido, compilado e executado o resultado surpreendente:
+Inf NaN
No ocorreu o esperado, que eram resultados numricos. O +Inf significa overflow (+ infinito), ou seja, nmero muito grande, que ultrapassou o limite do expoente da potncia de
dez. O NaN significa Not-a-Number, isto , no um nmero.
Para identificar onde est o problema, foi acrescentado uma sada de informao, localizada no interior da estrutura de repetio DO. A sada utilizada foi:
WRITE(*,*)"O resultado da tangente de ",theta, "eh: ",z, &
"(No loop: ", i, ")"
O objetivo imprimir em cada passo (loop), o resultado parcial. Observe parte das 200 sadas:
O
O
O
O
O
O
O
resultado
resultado
resultado
resultado
resultado
resultado
resultado
da
da
da
da
da
da
da
tangente
tangente
tangente
tangente
tangente
tangente
tangente
de
de
de
de
de
de
de
132
133
134
135
136
137
138
PROGRAM teste_erro
IMPLICIT NONE
INTEGER :: i, j, m
REAL :: x, y, z, theta
REAL, PARAMETER :: pi=3.14159265
=
=
DO i = 1,200
! Inicia um loop com 200 repeticoes
x = 1./EXP(REAL(i)) + EXP(REAL(i))
=
y = y + x
z = TAN(y)
theta = (y*180.0)/pi ! Converte angulo p/graus
WRITE(*,*)"O resultado da tangente de ",theta,&
"eh: ", z, "(No loop: ", i, ")"
44
140
END DO
WRITE(*,*) theta,z
320
139
AS SUJEIRAS DA MEMRIA
Em vrios momentos neste captulo foi mencionado sobre as sujeiras da memria. E ainda,
que as variveis sejam inicializadas para evitar erros, justamente por conterem valores indevidos anteriormente armazenados no endereamento de memria utilizado. Para verificar
na prtica, digite o programa abaixo, compile-o e execute-o.
Programa 1.16 Exemplo de erro devido a sujeiras da memria.
1
2
3
4
5
PROGRAM testa_sujeira_memoria
IMPLICIT NONE
INTEGER :: a, b, c
WRITE(*,*) a + b + c
END PROGRAM testa_sujeira_memoria
Provavelmente ters uma surpresa, porque nenhum valor foi atribudo as variveis a,
b e c e, assim, espera-se um valor nulo ou at mesmo um erro de execuo. Mas no o que
ocorre. No momento do fechamento desta edio, o valor obtido pela execuo do programa
no Windows foi 16384 e no Linux -1073664380. Se executarmos em outra ocasio, muito
provvel que o valor seja diferente, porque depender dos valores contidos na memria.
Ento, cuidado!!! Sugesto? sempre inicialize as variveis.
Mais informaes a respeito de procura e correo de erros de programao em Fortran
podem ser obtidas nos manuais dos compiladores Fortran, especialmente do compilador que
ser usado para testar os programas aqui apresentados e para os que sero solicitados nos
exerccios a seguir.
Em cada captulo, quando necessrio, um captulo sobre debugging ser escrito. Isto
demonstra a importncia de reconhecer erros e corrgi-los para que o cdigo de fato funcione
como esperamos.
45
Para reflexo !!
S existem duas coisas infinitas: o universo e a estupidez
humana. E no estou muito seguro da primeira.
Albert Einstein
1879 1955
EXERCCIOS
1.1) Sejam as variveis a, b, c, d, e, f, g, que so inicializadas como segue:
a = 3. b = 2. c = 5. d = 4. e = 10. f = 2. g = 3.
Avalie os seguintes procedimentos:
a)
y = a*b+c*d+e/f**g
b) y = a*(b+c)*d+(e/f)**g
c)
y = a*(b+c)*(d+e)/f**g
y = a*b+c*d+e/f**g
y = 3.*2.+5.*4.+10./2.**3.
- Calculando 2.**3.:
y = 3.*2.+5.*4.+10./8.
y = 6.
+5.*4.+10./8.
y = 6.
+20.
+10./8.
y = 6.
+20.
+1.25
y = 27.25
1.2) No Fortran, a operao entre inteiros e reais no uma boa prtica, pois o computador
converte o nmero inteiro em real e a seguir procede a operao. Desta forma, podemos
perder informaes nestas operaes. Informe, do ponto de vista do Fortran, qual ser
o resultado em cada uma das operaes abaixo.
a) 3/2
b) 3./2.
c) 3./2
d) 1 + 1/4
e) 1. + 1/4
f) 1 + 1./4
g) 2 + 6./4
1.3) O programa abaixo ser compilado? Justifique sua resposta.
46
1
2
3
4
5
6
7
8
9
PROGRAM exemplo1
IMPLICIT NONE
INTEGER :: i,j
INTEGER, PARAMETER :: k=4
i = k**2
j = i/k
k = i+j
WRITE(*,*)i,j,k
END PROGRAM exemplo1
1.4) Que valores sairo do programa abaixo? Tente antes de executar o programa no computador, calcular as sadas. (O assunto com respeito a INT e NINT. O INT retorna a
parte inteira de um real por truncamento e o NINT por arredondamento)
1
2
3
4
5
6
7
8
9
10
PROGRAM exemplo2
IMPLICIT NONE
INTEGER :: i1, i2, i3
REAL :: r1 = 2.4, r2
i1 = r1
i2 = INT(r1*i1)
i3 = NINT(r1*i1)
r2 = r1**i1
WRITE(*,*)i1, i2, i3, r1, r2
END PROGRAM exemplo2
1.5) O programa abaixo tem o objetivo de calcular os comprimentos dos lados de um tringulo retngulo (A=adjacente e B=oposto), dados os valores da hipotenusa(C) e do
ngulo(). O programa ser executado? Se no, explique. Se sim, ele produzir resultados corretos? Explique. Caso necessite de alterao, o que voc modificaria ou
acrescentaria?
1
2
3
4
5
6
7
8
9
10
11
PROGRAM exemplo3
REAL :: a, b, c, theta
WRITE(*,*) Entre com o comprimento da hipotenusa C:
READ(*,*)c
WRITE(*,*) Entre com o valor do angulo THETA em graus:
READ(*,*)theta
a = c*COS(theta)
b = c*SIN(theta)
WRITE(*,*)O comprimento do lado adjacente eh:,a
WRITE(*,*)O comprimento do oposto eh:
,b
END PROGRAM exemplo3
1
2
3
4
5
6
7
8
9
10
47
PROGRAM exemplo4
INTEGER :: i
LOGICAL :: l
REAL :: a
a = 0.05
i = NINT(2.*3.141593/a)
l = i>100
a = a*(5/3)
WRITE(*,*)i, a, l
END PROGRAM exemplo4
48
1.12) Escreva um programa que calcule a posio, velocidade e acelerao de um corpo sujeito ao movimento harmnico simples, baseado nas equaes abaixo. Para iniciar, use
= 0, n = 3.14159265, b = 2.5. Teste para um conjunto de valores de t.
posicao = x = b sin (nt + )
velocidade = v = nb cos (nt + )
aceleracao = a = n2 b sin (nt + )
CAPITULO
TRABALHANDO COM
ARQUIVOS ENTRADAS/SADAS
(I/O) DE DADOS
Para reflexo !!
41
42
42
43
45
46
48
52
2.1
INTRODUO
As entradas e sadas de dados em Fortran so realizadas pelas unidades lgicas. Uma
unidade lgica :
- um nmero inteiro no negativo associado a um dispositivo fsico tal como uma unidade de disco (HD, disquete, CD,...), teclado, monitor ou uma impressora. A unidade
lgica conectada a um arquivo ou dispositivo pela instruo OPEN (ver Seo 2.4, na
pg. 53), exceto nos casos dos arquivos pr-conectados.
- um asterisco, *, indica o arquivo ou dispositivo padro (default), pr-conectado, de
entrada e de sada, usualmente o teclado e a tela do monitor, respectivamente. Leia a
nota da pgina 54.
- uma varivel tipo CHARACTER corresponde ao nome de um arquivo interno.
50
ARQUIVO
O Fortran trata todos os dispositivos fsicos tais como unidades de discos, teclado, impressora, monitor ou arquivos internos como arquivo (file) ou arquivo externo. A estrutura do
arquivo determinada pelos dados (formatados ou no), o tipo de acesso ao arquivo e espao
(comprimento) para a informao.
O Fortran fornece instrues e procedimentos para manipular dados por leitura e escrita, conhecidas por entradas e sadas de dados, inclusive com o uso de arquivos internos.
Do ingls vem a denominao Input/Output, ou simplesmente I/O, para Entrada/Sada de
dados. Entre as instrues disponveis veremos somente algumas, a saber: WRITE e READ,
que so responsveis pela transferncia de dados, OPEN, que conecta as unidades lgicas aos
arquivos e FORMAT, que fornece informaes explcitas de formato dos dados. O objetivo
deste livro dar uma formao bsica, portanto no sero tratados assuntos relativos a tratamento de posicionamento interno num arquivo, tipos de arquivos, entre outros. Para um
avano no estudo da linguagem Fortran, consulte as referncias bibliogrficas, na pg. 135.
2.2
A INSTRUO WRITE
A instruo WRITE utilizada para transferir dados para o arquivo de sada (Output),
ou seja, escreve os resultados ou informaes de sada do programa.
A sintaxe :
WRITE([UNIT=]<unidade>,[FMT=]<formato>,[ADVANCE=<modo>])
em que:
[UNIT=]<unidade> : um argumento obrigatrio e indica a unidade lgica (dispositivo[N1] ) para a qual ser transferido o valor (ou informao) contido na memria. Como
unidade padro (default) utilizada a tela do monitor, e indicado por um asterisco (*).
Uma unidade lgica diferente da padro determinada pela instruo OPEN (ver Seo 2.4, na pg. 53). A palavra-chave UNIT opcional[N2] e na maioria dos programas
no utilizada.
[FMT=]<formato> : um argumento obrigatrio e especifica o(s) formato(s) para a escrita dos dados. Para instruir o compilador a escrever numa formatao livre (ou listadirigida) utilizado o asterisco (*), isto , o resultado ou a informao ser escrita da
forma como foi gerado, em acordo com a declarao da varivel que contm a informao. Uma sada com formatao livre no tem boa apresentao visual. Uma formatao
diferente da padro obtida pela instruo FORMAT, que ser descrita mais adiante (Seo 2.6, na pg. 56). A palavra-chave FMT opcional e no utilizada na maioria dos
programas.
[N1] Dispositivo significa algum meio fsico como por exemplo, tela do monitor, a impressora, um arquivo numa
unidade de disco seja magntica ou CD/DVD, o teclado, ou outro.
[N2] Neste livro, toda instruo ou argumento escrito entre colchetes ([ ... ]) considerado opcional.
51
PROGRAM saida
IMPLICIT NONE
INTEGER :: a=10, b=20, c=135
WRITE(*,*) a
OPEN(UNIT=10, FILE="saida1.txt")
WRITE(10,*) b
WRITE(10,200) c
200 FORMAT(I3)
CLOSE(10)
END PROGRAM saida
No primeiro WRITE, o contedo da varivel a ser escrito na tela do monitor e em
formato livre. No segundo, o resultado armazenado na varivel b ser escrito no arquivo
de nome saida1.txt, identificado pela unidade lgica 10, procedimento permitido pela instruo OPEN. J a outra sada de resultado, pela varivel c, tambm no arquivo anterior, mas
formatada pela instruo FORMAT, localizada no programa pelo rtulo nmero 200, que neste
caso instrui o compilador a imprimir um nmero (do tipo inteiro) com 3 algarismos. Como
exemplo, o nmero 135 poder ser impresso ajustadamente no espao designado. Quando
o nmero no couber nos espaos determinados pela formatao uma sequncia de asteriscos ser impressa no lugar do nmero ou da informao. A instruo CLOSE, que encerra a
atividade da unidade 10, estudada na pg. 54.
2.3
A INSTRUO READ
A instruo READ transfere dados de uma unidade de entrada (Input) para uma varivel,
isto , l dados que alimentaro com valores e/ou informaes o programa em Fortran.
A sintaxe :
READ([UNIT=]<unidade>,[FMT=]<formato>)
em que:
[UNIT=]<unidade> : a unidade lgica (dispositivo) da qual ser obtido o valor (ou informao). Como unidade padro utilizado o teclado e indicado por um asterisco (*).
Entenda-se por teclado, os dados digitados por este dispositivo. Uma unidade lgica diferente da padro determinada pela instruo OPEN. A palavra-chave UNIT opcional,
e no utilizada na maioria dos programas.
52
[FMT=]<formato> : especifica com que formato(s) a leitura dos dados realizada. Para
instruir o compilador a ler numa formatao livre (ou lista-direta) utilizado o asterisco
(*). Neste caso, a memria receber uma informao sem nenhum tipo de preocupao
com a editorao da informao. Uma formatao diferente da livre obtida pela instruo FORMAT, que ser descrita na Seo 2.6 (na pg. 56). A palavra-chave FMT opcional
e no utilizada na maioria dos programas.
O argumento ADVANCE apresentado na instruo WRITE tambm pode ser utilizado
aqui, com o mesmo significado.
Vejamos um exemplo:
Programa 2.2 Exemplo de entrada de dados.
1
2
3
4
5
6
7
8
9
10
11
12
PROGRAM leitura
IMPLICIT NONE
REAL :: a, b, c
WRITE(*,60,ADVANCE="NO")"Digite um numero real: "
READ(*,*) a
OPEN(UNIT=20, FILE="dados1.txt")
READ(20,*) b
READ(20,50) c
50 FORMAT(F5.2)
60 FORMAT(A)
CLOSE(20)
END PROGRAM leitura
No primeiro READ, o contedo da varivel a ser preenchido via teclado e em formato
livre. Utilizar o teclado significa digitar uma informao, compatvel com o tipo da declarao da varivel, e na sequncia teclar <ENTER>[N3] . Observe que no WRITE aplicado o
argumento ADVANCE, e a prxima instruo de leitura (ou de escrita) no avanar para a
prxima linha. Assim, na sequncia, o cursor ficar posicionado ao lado da sada anterior
aguardando a leitura da varivel a.
FALAR SOBRE O 60 format
No segundo READ, a varivel b receber um valor que est armazenado num arquivo
de nome dados1.txt, identificado pela unidade lgica 20, anteriormente habilitada pela instruo OPEN. J a outra entrada de informao, pela varivel c, tambm oriunda do arquivo
anterior, mas formatada pela instruo FORMAT, localizada no programa pelo rtulo nmero
50, que neste caso instrui o compilador a ler um nmero, do tipo real, com 5 espaos, sendo
dois para as casas decimais aps a vrgula. Neste caso, o nmero 56.50 caber ajustadamente,
pois tem 5 espaos (caracteres) e com duas casas decimais. Perceba que o ponto decimal faz
parte da contagem dos espaos disponveis. Quando o nmero no couber nos espaos determinados pela formatao, o compilador arredondar o nmero, fazendo-o se ajustar na
formatao determinada ou imprimir asteriscos.
[N3] Usaremos
53
2.4
A INSTRUO OPEN
Esta instruo conecta ou reconecta um arquivo externo a uma unidade lgica de entrada ou de sada. Vimos que os dispositivos padres de entrada e sada, na maioria dos
compiladores Fortran 95, so respectivamente, o teclado e a tela do monitor. A instruo
OPEN permite alterar o dispositivo de entrada e de sada, que realizada na seguinte sequncia: associa-se o nome de um arquivo externo a uma unidade lgica, que ser usada nas
instrues de entrada e sada de dados, e atribui-se um estado (status) ao arquivo.
A sintaxe :
OPEN([UNIT=]<nmero>, FILE="<nome_arq.>", [STATUS="<estado>"])
e deve estar localizada antes da unidade lgica ser utilizada. Os argumentos da instruo
so:
[UNIT=]<nmero> : o argumento que se refere a unidade lgica e ao seu respectivo arquivo de entrada/sada; UNIT uma palavra-chave e o <nmero> um nmero inteiro no negativo, sendo que o nico cuidado para no coincidir com o nmero adotado pelo compilador para os dispositivos padres, de entrada e sada. Neste sentido,
aconselha-se adotar numerao acima de 8. A palavra-chave UNIT= opcional.
54
2.5
A INSTRUO CLOSE
Quando uma unidade lgica est conectada ao seu arquivo externo, ele permanece neste
estado at o sua desconexo, ou at que cesse a execuo do programa. Em outras palavras,
55
nesta situao um arquivo permanece aberto. Assim, aps o uso do arquivo importante
fech-lo para evitar erros indesejveis. A instruo CLOSE desconecta uma unidade lgica
do seu arquivo externo. Ou seja, fecha o acesso ao arquivo e libera o nmero da unidade
lgica de I/O associada a ela.
A sintaxe :
CLOSE([UNIT=]<nmero>)
em que:
<nmero> : o nmero da unidade lgica definida no argumento UNIT da instruo OPEN.
Podemos fechar vrios arquivos simultaneamente, bastando para isso informar as unidades separadas por vrgulas.
Exemplos:
CLOSE(10,12,20)
CLOSE(UNIT=11)
CLOSE(50)
Observe que no primeiro exemplo a instruo CLOSE encerra simultaneamente 3 unidades lgicas. Outro ponto importante que a palavra-chave UNIT opcional e s foi utilizada
no segundo exemplo.
Para a instruo OPEN h outros argumentos, que no sero tratados aqui, e aconselhvel verific-los nos livros indicados nas referncias bibliogrficas, na pg. 135.
Exemplos resolvidos:
1) Escreva um programa em Fortran 95 que leia um
valor inteiro via dispositivo padro, multiplique-o
por dez e escreva o resultado em um arquivo com
nome saida1.txt.
Soluo: Adotaremos como unidade de sada a 50, e as
variveis a e b, respectivamente, para entrada e sada
de dados. Assim, o cdigo abaixo resolve o nosso problema.
Digite-o, compile-o e execute-o.
PROGRAM open1
IMPLICIT NONE
INTEGER :: a,b
OPEN(UNIT=50,FILE="saida1.txt")
WRITE(*,*)"Digite um no. inteiro"
READ(*,*) a
b = a*10
WRITE(50,*)b
CLOSE(50)
END PROGRAM open1
56
Podemos atribuir unidade lgica uma varivel, conforme o exemplo abaixo, no qual a
varivel ue, cujo valor inteiro informado pelo usurio, substitui o inteiro no argumento
UNIT dos exemplos acima.
Programa 2.3 Exemplo do uso de unidades lgicas.
1
2
3
4
5
6
7
8
9
10
11
12
13
PROGRAM unidade1
IMPLICIT NONE
INTEGER :: a,b,ue
WRITE(*,*)"Digite um numero inteiro:"
READ(*,*) a
b = a*10
WRITE(*,*)"Informe o numero (>8) da unidade logica &
&de saida:"
READ(*,*) ue
OPEN(UNIT=ue,FILE="saida1.txt")
WRITE(ue,*)b
CLOSE(ue)
END PROGRAM unidade1
2.6
FORMATANDO AS SADAS E/OU ENTRADAS (FORMAT)
Nos exemplos anteriores utilizamos entradas e sadas de dados sem formatao, isto
, da maneira como foram gerados os dados (ou resultados) elas foram impressas, seja na
tela do monitor ou num arquivo. possvel converter a representao interna, como est na
memria, conforme a declarao da varivel, para uma representao externa, utilizando a
instruo no executvel FORMAT. Este comando simplesmente instrui o compilador que a
sada (ou entrada) de dado obedecer uma formatao estabelecida.
A sintaxe da instruo FORMAT :
<rtulo> FORMAT(<cdigo-chave>)
em que:
<rtulo> : um nmero inteiro associado a instruo FORMAT, o qual ser o nmero de
chamada por uma instruo READ e/ou WRITE. A instruo FORMAT pode ser posicionada em qualquer linha no programa, aps as declaraes de variveis.
<cdigo-chave> : especifica o(s) formato(s) adotado para entrada e/ou sada de dados,
baseado na tabela 2.1. Podem ser utilizados mais de um cdigo separados por vrgula.
At agora todas as sadas e entradas de dados foram realizadas sem preocupao com
o formato. A partir deste momento deveremos ter cuidado ao utilizar a instruo FORMAT.
Veremos alguns pontos importantes.
57
OS CDIGOS-CHAVE
Existe mais de uma dzia de espcies de formatao (cdigos-chave) em Fortran 95, mas
usaremos somente alguns, descrito na tabela 2.1. Para auxiliar na compreenso da tabela
temos que:
w:
d:
corresponde aos dgitos aps o ponto decimal espao (casas decimais da mantissa);
e:
os dgitos do expoente E;
n:
significa o nmero de vezes que a formatao ser utilizada, ou seja, indica uma repetio. Por exemplo, no caso de 3A8, significa que sero impressos ou lidos 3 variveis do
tipo CHARACTER de tamanho igual a 8 cada.
Tabela 2.1 Descrio de algumas formataes utilizadas na instruo FORMAT.
Cdigo-chave
Significado
nAw
nIw
nFw.d
nEw.d[Ee]
nESw.d[Ee]
nDw.d[Ee]
nX
Tc
Mais informaes sobre os tipos de formatao (cdigos-chave) podem ser obtidas nas
referncias indicadas no final do livro.
Sempre que o tamanho da informao for menor que o espao reservado, a informao
ser escrita justificada direita e sero acrescentados espaos em branco antes, para com-
58
pletar o espao reservado. Quando a sada sem formatao o que determinar o espao
reservado ser a definio de preciso adotada. Por exemplo, um nmero inteiro de preciso
simples ter 11 espaos reservados para a sada ou leitura, j includo o sinal. O sinal positivo
(+) omitido.
O TAMANHO DO PAPEL DE IMPRESSO
Antes do computador enviar a informao para o dispositivo de sada, construdo uma
imagem de cada linha. A memria do computador que contm esta imagem chamada de
rea de armazenamento de dados temporrio (output buffer). A largura de cada linha igual
a 133 caracteres, sendo o primeiro espao destinado ao caracter de controle, que veremos a
seguir. Os demais 132 espaos so para armazenar a sada de dados. Assim, cada impresso
ou sada de informaes dividida em pginas, de tamanho aproximadamente igual a 37,8
cm para a largura e 27,9 cm para a altura. Estas dimenses esto relacionadas com os formulrios contnuos muito utilizados at o final do sculo passado. Cada pgina dividida
em linhas, e cada linha em 132 colunas, com um caracter por coluna. Para estas medidas, e
dependendo do nmero de linhas por polegada que a impressora imprime, correspondem
entre 60 e 72 linhas. As margens superior e inferior equivalem aproxidamente a 1,27 cm.
O CARACTER DE CONTROLE
Este item muito importante na sada de dados pelo WRITE. O primeiro caracter da imagem,
contida na rea de armazenamento de dados temporrio, conhecido como caracter de controle e especifica o espaamento vertical da sada. A tabela 2.2 apresenta as possibilidades e
as aes deste caracter de controle.
Tabela 2.2 Caracteres de controle da sada formatada.
Caracter de controle
Ao
1
<espao>
0
+
Se qualquer outro caracter for utilizado como caracter de controle resultar em espaamento simples entre linhas, como se fosse usado o espao em branco (<espao>).
Para evitar erros na sada, no esquea do caracter de controle. Por exemplo, a seguinte
instruo de sada
WRITE(*,100) a
100 FORMAT(I2)
imprimir um valor numrico inteiro de duas posies. Esta a inteno. Vejamos dois
possveis valores. Se for passado para a varivel a o valor 7, a sada ser exatamente 7,
justificada a direita. Mas se for passado o valor 71 o resultado ser 1, porque o primeiro
59
caracter destinado ao de controle, neste caso o 7 e foi assumido como espao em branco,
portanto o espaamento entre linhas ser simples. No caso anterior no ocorreu erro porque
o primeiro caracter foi um espao em branco, j que o nmero tinha somente um algarismo.
Ento muita ateno.
Alguns exemplos de formatao so apresentados a seguir.
Programa 2.4 Exemplo do uso de formatos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PROGRAM format1
IMPLICIT NONE
REAL :: a = 123.45, b =
WRITE(*,100) a
!
WRITE(*,200) a
!
WRITE(*,300) a
!
WRITE(*,400) a
!
WRITE(*,500) a
!
WRITE(*,600) a
!
WRITE(*,700) a,b,c !
100 FORMAT(0,E11.5)
200 FORMAT(0,F6.2)
300 FORMAT(1,E12.6)
400 FORMAT( ,E10.2)
500 FORMAT( ,E15.5E6)
600 FORMAT( ,ES10.2)
700 FORMAT(+,3ES10.2)
END PROGRAM format1
6789.10,
a saida:
a saida:
a saida:
a saida:
a saida:
a saida:
a saida:
c = 0.000778
0.12345E+03
123.45
0.123450E+03
0.12E+03
0.12345E+000003
1.23E+02
1.23E+02 6.79E+03
7.78E-04
60
PROGRAM format2
IMPLICIT NONE
INTEGER :: a1 = 12345, a2 = 678
WRITE(*,100) a1
! a saida: ****
WRITE(*,100) a2
! a saida: 678
100 FORMAT( ,I4)
END PROGRAM format2
Na primeira sada os asteriscos substituiram o nmero 12345, porque o espao reservado para sua impresso menor que o tamanho (em espaos) do nmero. Na segunda
sada uma coluna em branco foi acrescentada antes do nmero 678 para completar o nmero
de casas da declarao formatada, j que ele menor que o espao reservado. Ou seja, sempre
que o nmero for menor que o espao reservado, o nmero ser escrito justificado direita.
As formataes podem ser utilizadas diretamente nas instrues READ e WRITE. Por
exemplo, as seguintes instrues
WRITE(*,100) a1, a2
READ(*,200) a3, a4
100 FORMAT( ,I3,2X,E10.2)
200 FORMAT(2I5)
podem ser substitudas por
WRITE(*,( ,I3,2X,E10.2)) a1, a2
READ(*,(2I5)) a3, a4
2.7
CORRIGINDO ERROS DEBUGGING
Quando utilizamos entradas e sadas formatadas via arquivo necessrio muita ateno. Veremos dois casos de posicionamento dos dados de entrada.
ENTRADA DE DADOS EM UMA NICA LINHA DE UM ARQUIVO
O programa abaixo recebe dados reais de um arquivo em uma nica entrada, pela instruo
READ, conforme uma formatao especfica.
Programa 2.6 Exemplo de erro devido a formatao inadequada.
1
2
3
4
5
6
7
PROGRAM format_real
IMPLICIT NONE
REAL :: a, b, c
OPEN(UNIT=10, FILE="dados.txt", STATUS="OLD")
WRITE(*,*) "Digite dois numeros reais para soma-los: "
READ(10,100) a, b ! Unica entrada
c = a + b
61
8
9
10
WRITE(*,100) c
100 FORMAT(F5.2)
END PROGRAM format_real
O arquivo dados.txt contm os seguintes valores, em que o smbolo
branco:
30.40
indica espao em
21.50
A sada ser:
50.60
A verificao de aprendizado pela prtica com exerccios e com a soluo de problemas. altamente recomendvel que faa os exerccios a seguir, bem como os disponveis no
site http://www.orengonline.com/fortran95/. Aps este treinamento estar apto a resolver problemas.
As respostas e comentrios a respeito dos exerccios encontram-se no referido endereo
eletrnico, em exerccios. E, para verificar se est pronto para resolver problemas, um conjunto
deles est disponvel em problemas, tambm no site acima indicado.
importante lembrar que este livro introdutrio e, portanto, no contm todas as capacidades mais avanadas das instrues Fortran. Para uma abordagem neste nvel aconselhase os livros listados nas referncias biblioigrficas.
62
EXERCCIOS
2.1) O que ser impresso nas seguintes instrues Fortran? Use a = 345 e b = 1.0020E6 e
c = 1.0001E6
a)
INTEGER :: a
WRITE(*,100) a
100 FORMAT(1,a = , I4.1)
b) WRITE(*,( , ES12.6)) b
c)
2.2) Qual a largura (w) mnima necessria para imprimir um valor real num formato de
notao com potncia de dez (E) e numa notao cientfica de potncia de dez (ES) com
5 bits significativos de preciso? Obs.: consulte a respeito de preciso numrica na pgina 22,
no Captulo 1.
2.3) Escreva um programa que leia dois valores reais de preciso simples de um arquivo
de nome entrada.txt e escreva a soma deles em um novo arquivo, j existente, de nome
saida.txt. Use a instruo FORMAT para os valores.
2.4)
CAPITULO
AS ESTRUTURAS DE CONTROLE
Neste captulo voc encontrar:
3.1 Introduo . . . . . . . . . . . . . . . . . .
3.1.1 Expresses Aritmticas . . . . . . .
3.1.2 Expresses Lgicas . . . . . . . . .
Operadores Relacionais . . . . . . .
Operadores Lgicos . . . . . . . . .
3.1.3 Hierarquia dos Operadores . . . . .
3.2 Estruturas com Deciso (ou Seleo) . . . .
3.2.1 Estrutura Condicional Simples
(IF...THEN) . . . . . . . . . . . .
3.2.2 Estrutura Condicional Composta
(IF...THEN...ELSE IF) . . . . .
3.2.3 O comando IF Lgico . . . . . . . .
3.2.4 A estrutura de seleo direta
(SELECT CASE...CASE) . . . . . .
3.3 Estruturas de Repetio (Loops) . . . . . .
49
50
50
50
51
52
53
58
58
60
60
3.1
INTRODUO
Todos os programas vistos at o momento executam uma srie de procedimentos um
aps o outro numa ordem fixa. Estes so conhecidos como programas ou cdigos seqenciais
e so as formas mais simples de execuo de uma tarefa. Neles so lidos e processados
dados de entrada que, ao final imprimem o resultado, sem que em algum momento seja
preciso decidir sobre uma ou outra sequncia de execuo, ou ainda sem repetio de um
certo processo. Cdigos mais elaborados necessitaro de procedimentos que permitam o
controle na ordem ou no fluxo de execuo de procedimentos, como por exemplo, pulando
para outra parte do programa ou at mesmo para outra tarefa (subtarefa - SUBROUTINE e
FUNCTION, que sero estudadas adiante, na pg. 97).
Este tipo de controle, na estrutura do fluxo de execuo do programa, uma das caractersticas de uma linguagem estruturada, como o Fortran.
64
PROCESSOS DE REPETIO (loops), instruem que uma parte do cdigo seja executada repetidamente, sob uma determinada condio. Veremos as seguintes instrues
de repetio:
DO...END DO, na pgina 73,
DO...IF...END DO (loop infinito), na pgina 74.
Para usarmos estas estruturas necessrio vermos inicialmente as expresses aritmticas e lgicas, nas quais so utilizados os operadores aritmticos, relacionais e lgicos, que
serviro de base para os testes de lgica no controle do fluxo de execuo do programa.
3.1.1
Expresses Aritmticas
Embora tenhamos visto as expresses aritmticas no Captulo 1, repetiremos aqui. As expresses aritmticas so aquelas que apresentam como resultado um valor numrico que pode
ser um nmero inteiro ou real, dependendo dos operandos e operadores. Os operadores
aritmticos esto descritos na Tabela 3.1.
Tabela 3.1 Os operadores aritmticos disponveis no Fortran 95.
Operador
*
/
+
Operadores Aritmticos
Funo
Exemplos
multiplicao
5*2; A*C
diviso
2/7; 8.5/3.1; H/B
soma ou adio
3 + 5; A + J
subtrao
5 1; A1 B
potenciao
3**5 = 35
65
3.1.2
Expresses Lgicas
Uma expresso lgica aquela que possui operadores lgicos e/ou relacionais.
OPERADORES RELACIONAIS
So utilizados para comparar dois valores de um mesmo tipo. Tais valores so representados por variveis (e constantes) ou expresses aritmticas (que contm operadores aritmticos). Os operadores relacionais so utilizados para a construo de equaes. O resultado
de uma operao relacional ser sempre um valor lgico, isto , um Verdadeiro/Verdade (V
ou .TRUE.) ou Falso/Falsidade (F ou .FALSE.). Os operadores relacionais adotados pelo
Fortran 95 esto descritos na Tabela 3.2. Observe a segunda coluna, que traz a forma obsoleta
do FORTRAN 77, mas que ainda vlida.
Tabela 3.2 Os operadores relacionais disponveis no Fortran 95.
Fortran 95
==
>
<
>=
<=
/=
Operadores Relacionais
FORTRAN 77
Funo
.EQ.
igual a
.GT.
maior que
.LT.
menor que
.GE.
maior ou igual a
.LE.
menor ou igual a
.NE.
diferente de
Como mencionado anteriormemte, o resultado um valor lgico. Por exemplo, na relao A + B = C, o resultado ser verdadeiro (V) ou falso (F) medida que o resultado da
expresso aritmtica A + B seja, respectivamente, igual ou diferente do contedo da varivel C.
OPERADORES LGICOS
So cinco (5) os operadores lgicos para a formao de outras proposies lgicas simples. Os
operadores esto descritos na Tabela 3.3, e as possibilidades de agrupamento esto descritos
na Tabela-verdade (Tabela 3.4) abaixo.
Tabela 3.3 Os operadores lgicos disponveis no Fortran 95.
Operadores Lgicos
Operador
Funo
.NOT.
negao
.AND.
conjuno
.OR.
disjuno
.EQV.
equivalncia
.NEQV.
no equivalncia
66
F
F
V
F
F
V
V
F
F
V
V
F
V
F
Operador
.NOT.
.NOT.
.AND.
.AND.
.AND.
.OR.
.OR.
.OR.
.EQV.
.EQV.
.EQV.
.EQV.
.NEQV.
.NEQV.
.NEQV.
.NEQV.
2 valor
V
F
F
V
V
F
V
V
V
F
V
F
F
V
V
F
Resultado
F
V
F
F
V
F
V
V
V
V
F
F
V
V
F
F
Na operao com .AND. o resultado ser verdadeiro somente se ambos os valores relacionados forem verdadeiros (V). No caso do operador .OR. o que interessa que um dos
valores relacionados seja verdadeiro (V), para o resultado ser verdadeiro.
Em Fortran 95 os resultados de variveis lgicas para verdadeiro (V) e falso (F) so,
respectivamente, T e F, de .TRUE. e .FALSE.. importante salientar que a atribuio a
uma varivel lgica realizada pelos valores .TRUE. para verdadeiro e .FALSE. para falso.
Por exemplo:
LOGICAL :: a = .TRUE.
LOGICAL :: b = .FALSE.
Digite o programa, compile-o e execute-o para verificar o resultado.
Programa 3.1 Exemplo com operadores lgicos.
1
2
3
4
5
6
7
8
9
10
11
PROGRAM logica
IMPLICIT NONE
LOGICAL :: a, b, c=.TRUE.
a = 5>7; b = 5<7
IF(c) THEN
WRITE(*,*)".TRUE. ou verdadeiro"
ELSE
WRITE(*,*)".FALSE. ou falso"
END IF
WRITE(*,*)"Resultados de 5>7 e 5<7: ",a,b
END PROGRAM logica
67
3.1.3
Obs.: a radiciao pode ser transformada numa potenciao, por exemplo, 6 (6)1/2 , que
na linguagem Fortran fica 6**(1./2.). Deve-se tomar muito cuidado nesta operao,
porque numa potenciao o expoente sempre inteiro. Assim, neste caso o expoente
para no ser nulo, j que 1/2 = 0, na aritmtica de inteiros, preciso fazer uma diviso
por reais. Quando isto for realizado a operao trocada por:
ab = eb ln a
e o cuidado est na base, que no poder ser negativa, porque o logaritmo de nmero
negativo no definido. A potenciao sempre ser realizada da direita para a es2
2
querda, (34 ) = 38 = 6561, mas cuidado com 34 = 316 = 43046721, que diferente
da anterior. Os resultados anteriores no contm pontos decimais porque so valores
inteiros.
3 Todas as multiplicaes (*) e divises (/), partindo da esquerda para a direita.
4 Todas as adies (+) e subtraes (), realizando as operaes da esquerda para a direita.
5 Todas as operaes relacionais (==, /=, >, <, >=, <=), iniciando sempre da esquerda
para a direita.
6 Todos os operadores .NOT., iniciando da esquerda para a direita.
7 Todos os operadores .AND., iniciando da esquerda para a direita.
8 Todos os operadores .OR. , iniciando da esquerda para a direita.
3.2
ESTRUTURAS COM DECISO (OU SELEO)
Estruturas com Deciso (ou Seleo) so procedimentos que permitem-nos selecionar e
executar sees especficas do cdigo (que sero chamadas blocos) ou at mesmo desviar para
outra parte do cdigo. Elas so as variaes da instruo IF, mais a estrutura SELECT CASE.
3.2.1
A forma mais comum da instruo de deciso IF a estrutura condicional simples. Esta estrutura permite que um bloco de procedimentos seja executado se e somente se uma dada
expresso lgica for verdadeira.
68
<rtulo> :
(<condio lgica>) : determina um teste lgico, que se for verdadeira ento (THEN)
executa os <procedimentos executveis>. Se for falsa, ento (THEN) o fluxo de
execuo desviado incondicionalmente para a linha seguinte ao END IF. A sequncia
de instrues IF...THEN obrigatoriamente escrita na mesma linha.
END IF : especifica o final do bloco de deciso <rtulo>. Como o rtulo opcional, no
comum utiliz-lo para um nico bloco.
INDENTAO
Observe a indentao utilizada na definio acima e no exemplo a seguir. Estes afastamentos facilitam a visualizao dos blocos ou estruturas no programa. Este estilo adotado ao
longo do livro e uma boa prtica de programao
No exemplo a seguir uma estrutura de deciso simples testa um nmero para identificar se
mpar ou no. Para a soluo necessrio utilizar a funo intrnseca MOD, que fornece o
resto da diviso entre nmeros inteiros. As funes intrnsecas ou procedimentos intrnsecos
esto descritos na pgina 31, no Captulo 1.
Programa 3.2 Exemplo de estrutura por deciso simples.
1
2
3
4
5
6
7
8
PROGRAM no_impar
INTEGER :: a
WRITE(*,*)"Digite um numero inteiro: "
READ(*,*) a
IF (MOD(a,2) == 1) THEN
WRITE(*,*)O numero digitado eh impar
END IF
END PROGRAM no_impar
Neste caso, se a expresso lgica (MOD(a,2) == 1) for verdadeira, uma instruo de
sada imprimir uma frase na tela do monitor indicando que o nmero digitado mpar. Se
for falsa, a execuo continua na linha seguinte ao END IF.
3.2.2
69
Na estrutura simples definida acima, o bloco de procedimentos abaixo do IF s ser executado se a condio lgica for verdadeira. Se a condio de controle for falsa, todos os
procedimentos do bloco sero ignorados e a execuo do programa seguir logo aps o END
IF.
Algumas vezes necessrio executar um conjunto de procedimentos se uma dada condio lgica for verdadeira e outro conjunto de procedimentos para outra condio lgica
verdadeira ou, at mesmo no caso da expresso lgica ser falsa. A estrutura condicional
composta fornece esta possibilidade e a sua forma geral, que utilizaremos nos nossos algoritmos, :
[<rtulo>:] IF (<condio lgica 1>) THEN
<procedimentos bloco 1>
ELSE IF (<condio lgica 2>) THEN
<procedimentos bloco 2>
. . .
[ELSE IF (<condio lgica i>) THEN]
<procedimentos bloco i>
[ELSE]
<procedimento padro>
END IF [<rtulo>]
em que:
IF :
<rtulo> :
70
PROGRAM raizes
REAL :: a, b, c
WRITE(*,*)"Digite os coeficientes da eq.: "
READ(*,*) a, b, c
IF ((b**2 - 4.0*a*c) < 0.0) THEN
WRITE(*,*)Raizes complexas
STOP
ELSE IF((b**2 - 4.0*a*c) == 0.0) THEN
WRITE(*,*) "A solucao tera 2 raizes e iguais"
ELSE
WRITE(*,*) "A solucao tera 2 raizes desiguais"
END IF
END PROGRAM raizes
Neste caso, se a expresso lgica (b**2 - 4*a*c < 0.0) for verdadeira, a execuo
do programa ser cancelada, devido ao STOP. Neste caso, no h interesse em calcular as
razes complexas. Se for falsa, a execuo continua na linha seguinte ao STOP e se (b**2 4*a*c == 0.0) uma frase ser impressa na tela do monitor e, a execuo desviada para
a primeira linha aps o END IF. Se for falsa, a condio default (do ELSE) ser executada e a
execuo continua na linha seguinte aps END IF.
A instruo STOP til quando necessitamos abortar a execuo em alguma parte do
programa que no seja o final. Neste caso, a execuo desviar para o END PROGRAM, encerrando o programa.
As estruturas de deciso podem ser aninhadas, ou seja, podem conter uma dentro da
outra, quantas forem necessrias, como por exemplo:
ext: IF (...) THEN
...
int1: IF (...) THEN
...
int2: IF (...) THEN
...
END IF int2
...
END IF int1
...
END IF ext
A estrutura ou bloco mais interno identificado pelo rtulo int2 e o mais externo por
ext. E, o bloco intermedirio identificado por int1. Nos casos de aninhamentos de
estruturas de deciso uma boa prtica de programao o uso dos rtulos, para tornar claro
que procedimentos so executados em cada bloco.
3.2.3
71
A instruo IF Lgico
PROGRAM if_logico
IMPLICIT NONE
INTEGER :: a
WRITE(*,*)"Digite um numero inteiro: "
READ(*,*) a
IF(a >= 10) a = a + 25
WRITE(*,*)"O Resultado final eh: ",a
END PROGRAM if_logico
Neste caso, se for digitado um nmero maior ou igual a 10, o resultado final ser o valor
digitado somado de 25. Caso contrrio a sada ser igual a entrada.
3.2.4
A estrutura SELECT CASE outra forma de ramificao numa tomada de deciso. Ela permite o programador selecionar um bloco especfico baseado no valor de uma nica varivel,
que poder ser inteira, caracter ou lgica. A forma geral que adotaremos para representar
esta estrutura :
SELECT CASE (<expresso>)
CASE(<seletor 1>)
<procedimentos bloco 1>
CASE(<seletor 2>)
<procedimentos bloco 2>
. . .
CASE(<seletor i>)
<procedimentos bloco i>
CASE DEFAULT
<procedimento padro>
END SELECT
72
em que:
SELECT CASE :
<expresso> : a expresso que servir de chave de seleao. Dever ser do tipo inteiro
ou caracter ou lgico;
CASE :
<seletor i> :
CASE DEFAULT : uma instruo optativa. O objetivo ativ-la quando nenhum dos testes
anteriores realizados pela instruo CASE, for satisfeito.
O FUNCIONAMENTO:
Se o valor da expresso est dentro dos valores includos no seletor 1 ento os procedimentos do bloco 1 sero executados e, a seguir o fluxo de execuo desviado para o
END SELECT. De forma semelhante, se o valor de expresso estiver entre os valores do
seletor 2, os procedimentos do bloco 2 sero executados. A mesma idia se aplica aos demais outros casos desta estrutura. O CASE DEFAULT opcional, mas se estiver presente, s
ser executado se todos os seletor i anteriores forem falsos. Ainda, se o algoritmo no contiver o CASE DEFAULT e mesmo assim todos os seletor i anteriores forem falsos, nenhum
bloco da estrutura SELECT CASE ser executado.
O programa a seguir imprime mensagens conforme o valor da temperatura.
Programa 3.5 Exemplo de estrutura por seleo direta.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PROGRAM clima_temp
INTEGER :: temp_c
WRITE(*,*) "Informe a temperatura ambiente, em Celsius"
READ(*,*) temp_c
SELECT CASE (temp_c)
CASE (:-1)
WRITE(*,*) "Hoje esta muito frio"
CASE (0)
WRITE(*,*) "Temperatura de gelo da agua"
CASE (1:20)
WRITE(*,*) "Hoje esta frio, mas suportavel"
CASE (21:25)
WRITE(*,*) "Hoje o clima esta agradavel"
CASE (26:35)
WRITE(*,*) "Hoje est quente"
CASE DEFAULT
WRITE(*,*) "Hoje o dia esta muito quente"
END SELECT
END PROGRAM clima_temp
O valor de temp_c controlar o fluxo do algoritmo. Se a temperatura for menor ou
igual a -1 (ou menor que 0), ento o primeiro bloco ser executado, isto , sair na tela do
monitor a informao Hoje esta muito frio, e o fluxo incondicionalmente desviado
73
para END SELECT. O bloco abandonado. Se no for o caso, isto , a temperatura for igual
a zero, ento o segundo bloco ser executado e no o primeiro, e novamente aps ser executado o procedimento do bloco, o fluxo desviado para o final do bloco. E, assim sucessivamente. Observe que os selecionadores (valores atribudos para comparao com temp_c)
no se superpemum valor de temperatura s pode aparecer uma e somente uma vez no
selecionador.
importante salientar que os <seletor i> podem assumir:
<valor_nico>
:<valor_mximo>
<valor_mnimo>:
3.3
ESTRUTURAS DE REPETIO (LOOPS)
Veremos dois tipos de estruturas de repetio: o DO...END DO e o DO...IF...
END DO, conhecido tambm por DO infinito. Em ambos a caractertisca principal repetir
procedimentos, conforme uma lgica estabelecida.
3.3.1
<rtulo> :
<contador> = <valor_i>, <valor_f>, [<incremento>] : o controle das repeties pela varivel de controle contador, sempre do tipo inteiro. Mais:
<valor_i> : um valor inteiro que determina o incio do contador.
<valor_f> : um valor inteiro que determina o final do contador, e assim o fim do bloco
de repetio.
74
3.3.2
fortran
95
fortran
95
75
em que:
DO :
<rtulo> :
IF (<condio lgica>) : determina um teste lgico, pela (condio lgica), que caso
seja verdadeira executa a <instruo de controle>. Se for falsa, o fluxo do bloco
continua na prxima linha, executando os <procedimentos 2>. No h restrio
ao nmero de testes lgicos, mas que exista pelo menos um, neste caso de sada da
estrutura de repetio. E, podem estar localizados em qualquer ponto no interior do
DO...IF...END DO.
<instruo de controle> :
pode ser:
der ser de outra estrutura de repetio, sempre, externa a atual. Esta rotulagem
opcional, portanto, no comum utiliz-la para um nico bloco.
Quando esta instruo de controle for executada o fluxo de execuo do bloco (e do
programa) transferido para a primeira linha aps o END DO. Observe que neste
caso os <procedimentos 2> no sero executados.
CYCLE : determina o retorno ao incio da estrutra de repetio <rtulo>, em que, no-
A estrutura, como consta no quadro acima, funciona da seguinte maneira, por exemplo,
com a instruo de controle EXIT:
1. ao entrar no DO os <procedimentos 1> sero executados, caso existam,
2. a seguir a instruo IF ser executada, e caso seja falsa os <procedimentos 2> sero
executados e,
3. na sequncia retorna a executar os <procedimentos 1> e a instruo IF. Este ciclo ser executado sucessivamente, at que saia do bloco DO, quando a <condio
lgica> for verdadeira, e neste caso, o ltimo loop os <procedimentos 2> no sero executados.
Os <procedimentos 1> e <procedimentos 2> so opcionais e o uso de um ou de outro,
ou ainda de ambos, depender das tarefas a serem executadas no programa.
Este tipo de estrutura tambm recebe o nome de loop infinito (repeties infinitas), porque se no existir uma condio de sada ou se a condio lgica para um EXIT nunca
for verdadeira ele permanecer indefinidamente neste processo repetitivo. Portanto, deve-se
ter muito cuidado no uso dessa estrutura de repetio.
76
O USO DO WHILE
Esta estrutura de repetio pode ser substituda por outra que contenha a instruo WHILE,
como segue:
[<rtulo>:] DO WHILE (<condio lgica>)
[<procedimentos>]
END DO [<rtulo>]
Neste caso o DO estar ativo at que a <condio lgica> do WHILE seja falsa.
Vejamos um exemplo do uso de estruturas de repetio. O programa identifica e imprime os primeiros 100 pares no intervalo entre 1 e 1000.
Programa 3.6 Exemplo de estrutura de repetio.
1
2
3
4
5
6
7
8
9
10
11
12
13
PROGRAM numeros_pares
IMPLICIT NONE
INTEGER :: i,j
j=0
DO i=1,1000
WRITE(*,*)"Contador: ", i
IF (MOD(i,2)==0) THEN
WRITE (*,*) "Eh um numero par: ", i
j=j+1
IF (j==100) EXIT
END IF
END DO
END PROGRAM numeros_pares
As estruturas de repetio, assim como as de deciso (IF), tambm podem ser aninhadas, ou seja, podem conter uma dentro da outra. Por exemplo:
ext: DO i=1,20
...
int1: DO
IF (a > b) EXIT int1
...
int2: DO j=200,1,-1
...
END DO int2
...
END DO int1
...
END DO ext
77
EXERCCIOS
3.1) Criar um programa que entre com um nmero inteiro e informe se ele ou no divisvel
por 5. Dica: aqui ser necessrio testar se o resto de uma diviso por 5 zero ou no. Em Fortran
95 isto feito pela funo MOD(a,b), conforme tabela 1.1, na pgina 31.
3.2) Criar um programa, que entre com um nmero inteiro e informe se ele divisvel por
3 e por 7. Obs.: aqui ser necessrio o uso dos operadores lgicos.
3.3) Criar um programa em Fortran 95, que entre com um nmero inteiro e informe se ele
par ou mpar.
3.4) Segundo uma tabela mdica, o peso ideal est relacionado com a altura e o sexo. Fazer
um programa em Fortran 95 que receba a altura (h) e o sexo de uma pessoa. A seguir
calcule e imprima o seu peso ideal, utilizando as seguintes frmulas: (a) para homens:
(71.7 * h) - 58; (b) para mulheres: (62.1 * h) - 44.7 Dica: no esquea, a altura um nmero real e necessrio saber se homem ou mulher. Ou seja, podemos solicitar a informao
por intermdio da indicao de f ou F, ou m ou M. Revise leitura de caracteres no
Captulo 2.
3.5) Crie trs programas em Fortran 95. O primeiro escrever todos nmeros de 100 at 1.
O segundo escrever os 100 primeiros pares e o ltimo imprimir os mltiplos de 5, no
intervalo de 1 at 500.
3.6) Elabore um programa em Fortran 95, que escreva a soma dos nmeros entre 25 e 200.
Dica: neste caso, a soma realizada da seguinte forma: soma1 = soma1 + 1. No esquea
de informar antes de comear o loop da soma (DO...END DO) o valor inicial de soma1.
3.7) Crie um programa em Fortran 95, que escreva a soma dos nmeros pares entre 25 e 200.
Dica: se baseie no exerccio 3.6.
3.8) Criar um programa em Fortran 95, que escreva o fatorial de um dado nmero. Importante: existe limite (de mquina) para o tamanho do nmero? Dica: no esquea que no
definido fatorial de nmero negativo e que 0!=1.
3.9) Criar um programa que encontre o n-simo termo da srie de Fibonacci. A srie de
Fibonacci dada por: fib(n) = fib(n 1) + fib(n 2) para n > 1. Para n = 0 e n = 1, o
valor por definio fib(0) = 0 e fib(1) = 1.
3.10) Criar dois programas. O primeiro ler 15 nmeros e escrever quantos nmeros maiores que 30 foram digitados. O segundo receber 20 nmeros e escrever a soma dos
positivos e o total de nmeros negativos.
3.11) Criar um programa que entre com um nome e escreva-o tantas vezes quantos forem
seus caracteres.
3.12) Criar um programa que entre com uma palavra e escreva conforme o exemplo a seguir:
Palavra: AMOR. A sada ser AMOR, AMO, AM, A
78
3.13) Criar um programa que entre com dois nmeros e escreva todos os nmeros no intervalo fechado, do menor para o maior.
3.14) Criar um programa para ler o nmero de termos da srie (N ) e escrever o valor de H,
sendo: H = 1 12 + 13 14 + ... + N1 .
3.15) Um restaurante faz uma promoo semanal de descontos para clientes de acordo com
as iniciais do nome da pessoa. Projete um programa, em Fortran 95, que leia o primeiro
nome do cliente, o valor de sua conta e se o nome iniciair com as letras A, D, M ou S,
dar um desconto de 30 %. Para o cliente cujo nome no se inicia por nenhuma dessas
letras, exibir a mensagem Que pena. Nesta semana o desconto no para seu nome,
mas continue nos prestigiando que sua vez chegar.
3.16) Faa um programa que leia um nmero inteiro de 3 algarismos e imprima uma informao se o algarismo da casa das centenas par ou mpar.
3.17) Crie um programa para ler um nmero inteiro de 4 algarismos e imprimir se ou no
mltiplo de quatro o nmero formado pelos algarismos que esto nas casas da unidade
e da centena.
3.18) Desenvolva um programa que leia o ano de nascimento de uma pessoa e o ano atual.
A seguir imprima a idade da pessoa. No se esquea de verificar se o ano de nascimento
um ano vlido.
3.19) Construir um programa em Fortran 95 que calcule a mdia aritmtica de vrios valores
inteiros positivos, lidos externamente. O final da leitura acontecer quando for lido um
valor negativo. Mostrar o resultado ao final.
3.20) Escreva um programa em Fortran 95 que calcule a mdia dos nmeros digitados pelo
usurio, se eles forem pares. Termine a leitura se o usurio digitar 0 (zero). Mostrar o
resultado ao final.
3.21) Desenvolva um programa em Fortran 95 que some os nmeros fornecidos pelo usurio
at que o nmero lido seja igual a zero e mostre a soma.
3.22) Chico tem 1,5 metros e cresce 2 centmetros por ano, enquanto Z tem 1,1 metros e
cresce 3 centmetros por ano. Faa um programa que calcule e mostre quantos anos
sero necessrios para que Z seja maior que Chico.
3.23) Faa um programa em Fortran 95 que leia um nmero n que indicar quantos valores
devem ser lidos a seguir e, para cada nmero lido, mostre uma tabela contendo o valor
lido e o cubo do nmero somado a ele mesmo.
3.24) Elabore um programa em Fortran 90/95 que encontre um nmero real que mais se
aproxima da raiz quadrada de um nmero fornecido pelo usurio. Indique tambm ao
final quantos loops foram necessrios. (Obs.: no basta s calcular a raiz quadrada direta
pela funo SQRT, mas sim fazer um loop com a multiplicao de dois nmeros iguais e que
satisfaa ao teste de preciso entre o valor calculdado e o valor (exato) da raiz.)
CAPITULO
AS VARIVEIS COMPOSTAS:
Vetores e Matrizes (Arranjos)
Neste captulo voc encontrar:
4.1 Introduo . . . . . . . . . . . . . . . . . .
4.2 Os Vetores . . . . . . . . . . . . . . . . .
4.2.1 Preenchendo com valores os elementos de um vetor . . . . . . . . . . .
4.2.2 A manipulao dos elementos de um
vetor . . . . . . . . . . . . . . . . .
4.3 As Matrizes . . . . . . . . . . . . . . . . .
4.3.1 A declarao de uma matriz . . . . .
4.3.2 Preenchendo com valores os elementos de uma matriz . . . . . . . . . .
4.3.3 A manipulao dos elementos de
uma matriz . . . . . . . . . . . . . .
Exerccios . . . . . . . . . . . . . . . . . . . .
75
76
77
78
79
80
Gilberto Orengo
1961
80
81
83
4.1
INTRODUO
At o momento escrevemos programas cujas variveis armazenam um nico valor, chamadas de variveis simples. Por exemplo,
INTEGER :: a
REAL :: total
...
a = 34
total = 3.78
Existem casos que precisamos armazenar diferentes valores para uma mesma varivel.
Estas variveis so conhecidas como arrays, em ingls, ou simplesmente de variveis compostas. As variveis compostas mais conhecidas so os vetores e matrizes. Um vetor pode ser
considerado uma matriz sob certas condies, e neste caso chamado de matriz coluna ou
matriz linha. A seguir veremos cada um em detalhes, iniciando pelos vetores.
4.2
80
OS VETORES
Os vetores so variveis compostas unidimensionais. Por exemplo, seja o vetor R =
que tem seus componentes dados por:
5i 1j + 7k,
R = {5, 1, 7}
em que rx = 5; ry = 1 e rz = 7. De uma forma geral, um vetor A ter componentes
descritos da seguinte maneira:
A = {a1 , a2 , a3 , , an }
O termo varivel composta unidimensional reconhecido pelo o nico ndice necessrio para
descrever a varivel, ou seja, no exemplo acima a varivel A tem um ndice (n) para indicar a posio no conjunto de valores atribudos a ela. Os valores assumido pelo ndice n
determinar a quantidade de elementos do vetor.
Na memria, a varivel R armazenar seus componentes representada esquematicamente como segue, na Figura 4.1.
1
-1
nome
R
5
Joo Maria
4.2.1
A declarao de um vetor
81
PARAMETER : indica que o dado ser constante ao longo de todo o programa, sem possi-
bilidades de alter-lo,
ALLOCATABLE : usado juntamente com o DIMENSION e indica que o tamanho da array
os uso dos dois dois pontos opcional, mas ser obrigatrio caso deseja-se inicializar
a varivel no momento da sua declarao.
<var> : so os nomes das variveis que armazenaro os dados, separados por vrgulas. O
nome de uma varivel poder ter at 31 caracteres e iniciar sempre com uma letra do
alfabeto, jamais com um algarismo, que poder ser utilizado a partir da segunda posio,
assim como o underscore (_). No conter caracter especial ( , ( ){ }[ ]! . : @ # $ % & *)
em qualquer posio do nome, bem como letras acentuadas ou cedilhadas.
So exemplos de declarao de vetores
INTEGER :: A(5), R(3)
REAL :: h(10)
CHARACTER(LEN=5) :: nome(2)
ou por:
INTEGER, DIMENSION(5) :: A
INTEGER, DIMENSION(3) :: R
REAL, DIMENSION(10) :: h
CHARACTER(LEN=5), DIMENSION(2) :: nome
82
4.2.2
O procedimento para preencher uma varivel composta diferente da simples, pois temos
que informar todos os elementos de uma varivel com o mesmo nome. Existem diferentes
formas de fazer esta tarefa, veremos algumas.
Preenchendo todos os elementos de uma nica vez
Para preencher uma varivel composta, por exemplo A, de uma nica vez o procedimento :
A =10
ou ainda, na prpria declarao da varivel:
INTEGER, DIMENSION(5) :: A = 10
Assim, todos os elementos da varivel A, do tipo real, sero preenchidos pelo valor igual a
10.
83
4.2.3
84
INTEGER, DIMENSION(5) :: A = 10
INTEGER, DIMENSION(5) :: B = 2
INTEGER, DIMENSION(5) :: C
...
C = A + B
O resultado um vetor com os elementos todos iguais a 12, j que todos os vetores tem
dimenso igual a 5.
A multiplicao de vetores:
A multiplicao de vetores possvel desde que os vetores sejam conformes, isto ,
tenham a mesma dimenso. Este procedimento um produto interno (ou produto escalar) e
em Fortran 95 realizado com a instruo DOT_PRODUCT(vetor1,vetor2), como segue:
INTEGER, DIMENSION(5) :: A=10, B=2
INTEGER :: C
C = DOT_PRODUCT(A,B)
que equivalente a:
C = A(1)*B(1) + A(2)*B(2) + ... + A(5)*B(5)
ou a:
C = SUM(A*B)
em que, neste ltimo, foi utilizado a instruo SUM para somar os elementos do produto de
dois vetores. O resultado final simplesmente um nmero, e neste exemplo o resultado
100.
4.3
AS MATRIZES
As matrizes so variveis compostas bidimensionais. Por exemplo, seja a matriz:
2 3
A=
10 6
em que a11 = 2; a12 = 3; a21 = 10 e a22 = 6, so seus componentes. De uma forma geral, a
matriz A22 , ter componentes descritos da seguinte maneira:
A = {a11 , a12 , a21 , a22 }
e neste caso disposta linhas por colunas.
Na memria, a varivel A armazenar seus componentes representada esquematicamente como segue, na Figura 4.2, dispondo linhas por colunas.
A matriz A, armazena valores inteiros, ordenados por linha. Assim, na primeira linha
temos os elementos 2 e 3. Perceba que desta forma, os elementos de uma matriz so armazenados na memria em uma sequncia de linhas. Podemos efetuar o ordenamento por
85
A
A(1, 1) A(1, 2) A(2, 1) A(2, 2)
-2
10
4.3.1
INTEGER :: A(2,2)
REAL :: h(4,3)
CHARACTER :: nomes(2,5)
ou por:
1
2
3
INTEGER, DIMENSION(2,2) :: A
REAL, DIMENSION(4,3) :: h
CHARACTER, DIMENSION(2,5) :: nomes
A varivel A ter 2 linhas por 2 colunas, isto , a primeira informao entre parnteses se
refere ao nmero de linhas, enquanto que a segunda se refere ao nmero de colunas. Assim,
a matriz A armazenar 4 valores inteiros. Este resultado vem da multiplicao do nmero de
linhas pelo nmero de colunas, ou seja, 2 2 = 4. A varivel h armazenar 12 valores, em 4
linhas e 3 colunas; e a varivel nomes ter 10 entradas, em 2 linhas e 5 colunas.
4.3.2
DO i = 1, 2
DO j = 1, 2
READ(*,*)A(i,j)
END DO
END DO
Neste caso, usamos a estrutura de repetio DO ... END DO, associado com a instruo de leitura READ para preencher os valores da varivel composta A.
86
importante ressaltar que o preenchimento da matriz se fez pelas linhas. Isto , para
cada valor de de i o valor da varivel de controle j, que representa as colunas, varia de 1
at 2 para cada repetio externa. Se quisermos preencher por colunas, basta trocar a linha 1
pela 2. Assim, estaremos fixando o j e variando o i, para cada repetio externa.
O uso de uma estrutura de repetio, em conjunto com uma expresso
Da mesma forma utilizada para os vetores, temos:
1
2
3
4
5
6
7
x = 0
DO i = 1,2
DO j = 1,2
A(i,j) = x + j
x = x + 3
END DO
END DO
4.3.3
Elemento a elemento:
Podemos manipular os elementos como segue, atribuindo-as a varivies simples. Nos
exemplos abaixo os valores dos elementos foram retirados da matriz anterior A22 :
y = A(2,1)
b = A(1,1) + A(2,2)
INTEGER, DIMENSION(5,3) :: A = 10
INTEGER, DIMENSION(5,3) :: B = 12
INTEGER, DIMENSION(5,3) :: C
.
.
.
C = A + B
O resultado uma matriz com os elementos todos iguais a 22. A soma realizada elemento
a elemento, conforme apresentado abaixo.
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
53
12
12
+
12
12
12
12
12
12
12
12
12
12
12
12
12
53
10 + 12
10 + 12
=
10 + 12
10 + 12
10 + 12
10 + 12
10 + 12
10 + 12
10 + 12
10 + 12
10 + 12
10 + 12
10 + 12
10 + 12
10 + 12
53
22
22
=
22
22
22
22
22
22
22
22
22
22
22
22
22
53
87
Este procedimento pode ser usado para multiplicarmos ou dividirmos elemento a elemento de matrizes conformes.
A multiplicao de matrizes:
A multiplicao de matrizes possvel desde que os matrizes sejam conformes, isto ,
que o nmero de colunas da primeira matriz seja igual ao nmero de linhas da segunda
matriz. Suponha duas matrizes A(x,y) e B(m,n). Assim:
A(x,y) B(m,n) s possvel se e somente se y = m. A matriz resultante ser do tipo x,n.
B(m,n) A(x,y) s possvel se e somente se n = x. A matriz resultante ser do tipo m,y.
Isto , com as matrizes A43 e B35 , a matriz resultante ser C45 . Por exemplo:
1
2
3
INTEGER, DIMENSION(4,3) :: A = 10
INTEGER, DIMENSION(3,5) :: B = 2
INTEGER, DIMENSION(4,5) :: C
Matematicamente produzir:
10
10
10
10
10
10
10
10
10
10
10
10 43
2
2
2
2
2
2
2
2
2
2
2
2
2
=
2
2 35
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60
60 45
A multiplicao em Fortran pode ser realizada por pelo menos maneiras. Especialmente
em Fortran 90/95, podemos utilizar a instruo MATMUL(matriz1,matriz2), como segue:
C = MATMUL(A,B)
que equivalente a:
C(1,1) = A(1,1)*B(1,1) + A(1,2)*B(2,1) + A(1,3)*B(3,1)
.
.
.
.
.
.
C(4,5) = A(4,1)*B(1,5) + A(4,2)*B(2,5) + A(4,3)*B(3,5)
ou a:
DO i = 1,4
DO k = 1,5
C(i,k)=0
DO j = 1,3
C(i,k) = C(i,k) + A(i,j)*B(j,k)
END DO
END DO
END DO
em que, neste ltimo, foi utilizado uma estrutura de repetio DO ... END DO para multiplicar duas matrizes. O ltimo procedimento necessrio nos programas escritos em no
FORTRAN 77. No Fortran 90/95 este procedimento foi incorporado de forma intrnsica. Isto
, quando a instruo MATMUL utilizada a sequncia de loops anteriores executada. Observe, atentamente, que os ndices da matriz resultante do produto so para linhas e colunas,
respectivamente, iguais a i e k e, o ndice j igual ao nmero de colunas da primeira matriz
ou igual ao nmero de linhas da segunda matriz.
88
N
X
j=1
com i = 1, , M ; k = 1, , L e j = 1, , N .
IMPORTANTE ............
Digite o cdigo abaixo e execute-o.
PROGRAM testabug
IMPLICIT NONE
REAL, DIMENSION(2,2) :: a=RESHAPE((/2., 3., 4., 5./) ,(/2,2/))
INTEGER :: i,j
DO i=1,2
WRITE(*,*)(a(i,j),j=1,2)
END DO
a(1,3)=6.0; a(2,3)=7.0; a(3,3)=10.0; a(3,1)=8.0; a(3,2)=9.0
WRITE(*,*)""
DO i=1,2
WRITE(*,*)(a(i,j),j=1,2)
END DO
WRITE(*,*)""
DO i=1,3
WRITE(*,*)(a(i,j),j=1,3)
END DO
END PROGRAM testabug
Executou? O resultado inesperado, no!? Pois bem, uma vez definida a dimenso da
array, o compilador Fortran mapeia a memria (para arrays) atravs da seguinte expresso:
P OSIO DO E LEMENTO DA A RRAY NA M EMRIA = (j 1) + (i 1)
(4.1)
A verificao de aprendizado pela prtica com exerccios e com a soluo de problemas. altamente recomendvel que faa os exerccios a seguir, bem como os disponveis no
[N1] NOTA: este tipo de erro pode ser chamado de estouro de ndice para arranjos ou estouro de rea de armazenamento. Este
problema tambm ocorre no compilador C, e a Eq.(4.1) continua sendo vlida trocando-se i por j e, o agora representa o nmero
de colunas declarado. Este um dos problemas dos programas feitos para o rWindows. Eles no possuem um bom controle de erro
por isso aquela tela Erro de Proteo Geral Argh!!!. Este tipo de erro no ocorre, por exemplo, na linguagem Java.
89
90
EXERCCIOS
4.1) Escreva um programa em Fortran 95 que leia 1 vetor de 15 elementos inteiros cada. A
seguir mostre o terceiro elemento do vetor e imprima o resultado da multiplicao do
quinto elemento pelo dcimo elemento.
4.2) Escreva um programa em Fortran 95 que leia 2 vetores de 10 elementos inteiros cada.
Criar um terceiro vetor que seja a unio dos dois primeiros. Mostrar o vetor resultante.
4.3) Escreva um programa em Fortran 95 que leia 2 vetores de 8 elementos inteiros cada e,
a seguir, efetue a multiplicao dos vetores e mostre o resultado.
4.4) Criar um programa em Fortran 90 que leia um conjunto de 30 valores e os coloque em
2 vetores conforme forem pares ou mpares. O tamanho de cada vetor de 5 posies.
Se algum vetor estiver cheio, escrev-lo. Terminada a leitura, escrever o contedo dos
dois vetores. Cada vetor pode ser preenchido tantas vezes quantas forem necessrias.
Obs.: o zero no classificado nem como nmero par e nem como mpar.
4.5) Fazer um programa em Fortran 90 que leia um conjunto de 10 valores inteiros, armazeneos em um vetor e escreva-os ao contrrio da ordem de leitura. A sada dos dados deve
ser num arquivo com o nome saida.txt.
4.6) Criar um programa em Fortran 90 que entre com 4 nomes e imprima uma listagem
contendo todos os nomes. Considere que cada nome poder ter at 10 caracteres. A
sada dos dados deve ser num arquivo com o nome nomes.txt.
4.7) Criar um programa em Fortran 90 que leia 6 nmeros reais e os ordene em ordem
decrescente (isto , do maior para o menor valor). Este dar trabalho difcil. Dica:
monte um conjunto de 5 elementos e pense numa estratgia na ponta do lpis antes de se
aventurar no programa. !!!!
4.8) Repita o exerccio 4.7, mas lendo os 6 valores de entrada de um arquivo de nome dados1.txt. Dica: importante, no esquea de criar o arquivo e digitar nele os 6 valores reais.
4.9) Uma empresa deseja aumentar seus preos em 20%. Fazer um programa em Fortran
90/95 que leia o cdigo e o preo de custo de cada produto e calcule o novo preo;
calcule tambm a mdia dos preos com e sem aumento; e mostre o cdigo e o preo
novo de cada produto e, no final, as mdias. A entrada de dados deve terminar quando
for lido um cdigo de produto nulo.
4.10) Elaborar um programa em Fortran 90/95 que leia um conjunto de 8 valores e os escreva
em um vetor. A seguir, separe os valores que so pares e ao final indique quantos so
pares e mpares.
4.11) Escreva um programa em Fortran 90/95 que leia um conjunto de 9 valores reais e os
escreva em uma matriz 3 3. A seguir, divida cada elemento da diagonal da matriz por
2.0 e escreva o resultado.
CAPITULO
92
5.1
O ATRIBUTO ALLOCATABLE E AS DECLARAES ALLOCATE E
DEALLOCATE
No Fortran 90/95, uma array alocada dinamicamente declarada com o atributo ALLOCATABLE e alocada no programa atravs da declarao ALLOCATE. Quando no precisamos
mais da array, a desalocamos da memria atravs da declarao DEALLOCATE.
A estrutura de uma declarao tpica de array alocada dinamicamente :
REAL, ALLOCATABLE, DIMENSION(:) :: nomes
REAL, ALLOCATABLE, DIMENSION(:,:) :: ontem
Observe que os dois pontos (:) so usados no lugar das declaraes estticas, pois ainda no
sabemos o tamanho da array. O rank da array declarado, mas no o seu tamanho.
Quando o programa executado, o tamanho da array ser especificado pela declarao
ALLOCATE. A forma desta declarao
ALLOCATE(lista das variveis a serem alocadas, STAT=nome do status)
[N2] Open Source: uma boa prtica abrirmos o cdigo fonte de nossos programas, atravs da licena GPLGeneral
Public License[13]. Eles se tornaro mais eficientes, pois outros programadores podero fazer alteraes e nos avisar
das mesmas.
93
Um exemplo:
ALLOCATE(ontem(100,0:10), STATUS=info)
Este procedimento aloca uma array de 100 11, quando for necessrio. O STATUS=info
opcional. Se estiver presente, ele retornar um inteiro. Ser 0 para sucesso na alocao ou
nmero positivo (valor que depender do compilador) para falha na alocao. uma boa
prtica de programao usar o STATUS, pois caso esteja ausente e a alocao falhar, p.ex., por
falta de memria ou por outro erro qualquer (como nome errado de varivel), a execuo do
programa ser abortada. O seu uso feito atravs de um controle de fluxo, tipo IF. Para o
caso acima, temos:
1
2
3
4
5
6
IF (info == 0) THEN
amanha = ontem*10
ELSE
WRITE(*,*) Erro na Alocacao de Memoria. Verifique !!
STOP
END IF
Uma array alocvel no poder ser utilizada num dado ponto do programa at que
sua memria seja alocada para tal. Qualquer tentativa de usar uma array que no esteja
alocada produzir um erro e com isso sua execuo ser abortada. O Fortran 90/95 inclui a
funo lgica intrnseca ALLOCATED(), para habilitar o programa testar o estado da alocao
de uma dada array, antes de tentar us-la. Por exemplo, as seguintes linhas de um cdigo
computacional testam o estado de alocao da array input_data, antes de tentar realmente
utiliz-la:
1
2
3
4
5
6
7
8
Esta funo pode ser til em grandes programas, envolvendo muitos procedimentos de
alocao dinmica de memria.
No final do programa ou mesmo quando no precisamos mais da array, devemos desalocla da memria, com a declarao DEALLOCATE, liberando memria para ser reutilizada. A
sua estrutura
DEALLOCATE(lista das variveis a serem desalocadas, STAT=nome do status)
Um exemplo:
DEALLOCATE(ontem(100,0:10), STATUS=info)
onde o STATUS tem o mesmo significado e uso que tem na declarao ALLOCATE. Aps desalocar a array, os dados que a ela pertenciam no existem mais na memria. Ento, tenha
94
muito cuidado. Devemos sempre desalocar qualquer array, uma vez que tenha terminado o
seu uso. Esta prtica especialmente importante em SUBROUTINE e FUNCTION.
5.2
QUANDO DEVEMOS USAR UMA ARRAY?
Em programao, principalmente em Fortran, se fala muito em arrays, mas talvez nunca
nos perguntamos: quando devemos us-las? Em geral, se muitos ou todos os dados devem
estar na memria ao mesmo tempo para resolver um problema eficientemente, ento o uso
de arrays para armazenar estes dados ser apropriado, para este problema. Por outro lado,
arrays no sero necessrias. O exemplo abaixo (parte de um programa) mostra como nem
sempre preciso usar uma array.
1
2
3
4
5
6
7
8
9
10
11
12
....
DO i = 1,n ! Le valores
WRITE(*,*) Entre com o numero:
READ(*,*) x
WRITE(*,*) O numero eh: ,x
sum_x=sum_x + x ! Acumulando a soma
sum_x2=sum_x2 + x**2
END DO
! Agora calcula a media (x_bar) e o desvio padrao (std_dev)
x_bar = sum_x/real(n)
std_dev = SQRT((real(n)*sum_x2 - sum_x**2)/(real(n)*real(n-1)))
....
5.3
1.
2.
Arrays desnecessrias restringem a eficincia do programa. Para entender este ponto, vamos
considerar o programa-exemplo acima, que calcula a mdia e o desvio-padro de um
conjunto de dados. Se o programa projetado com 1000 elementos estticos como entrada da array, ento ele somente trabalhar para um conjunto de dados de at 1000
elementos. Se ns encontramos um conjunto de dados maior do que 1000 elementos,
o programa ter que ser recompilado e relinked com um tamanho maior para a array.
Por outro lado, um programa que calcula a mdia e o desvio-padro de um conjunto de
dados, que so lidos de um arquivo, no ter limite para o tamanho do conjunto de
dados.
95
PROGRAM operacao_array
IMPLICIT NONE
INTEGER :: i
REAL, DIMENSION(4) :: a = (/1., 2., 3., 4./)
REAL, DIMENSION(4) :: b = (/5., 6., 7., 8./)
REAL, DIMENSION(4) :: c, d
DO i = 1,4
c(i) = a(i) + b(i)
END DO
d = a + b
WRITE(*,100)c, c
WRITE(*,100)d, d
100 FORMAT ( , A, = , 5(F6.1,1X))
END PROGRAM operacao_array
Neste exemplo, a array c resulta da soma dos elementos conformes da array a com os
da array b. J a array d obtida usando a nova instruo do Fortran 90/95, que faz implicitamente a descrio anterior.
F Lista de Exerccios 2, s assim, exercitando, saberemos de nossas limitaes!!!!
96
CAPITULO
As Sub-rotinas e Funes
Neste captulo voc encontrar:
6.1 Introduo . . . . . . . . . . . . . . . .
Procedimentos Externos . . . . . .
Procedimentos Internos . . . . . . .
6.2 As Sub-rotinas SUBROUTINE . . . . .
6.3 As Funes FUNCTION . . . . . . . .
6.4 As Bibliotecas de Sub-rotinas e Funes
6.4.1 A biblioteca LAPACK . . . . . . .
Para reflexo !!
.
.
.
.
.
.
.
.
.
.
.
.
.
.
93
93
94
95
97
99
99
6.1
INTRODUO
possvel escrever um programa completo em Fortran em um nico programa principal. Mas, se o cdigo complexo ou muito extenso, pode ser que um determinado conjunto
de instrues seja realizado repetidas vezes, em pontos distintos do programa. Neste caso,
melhor quebrar o programa em unidades distintas, chamadas de subprogramas. Os subprogramas so unidades de programa que realizam tarefas especficas. Podem ser chamados
pelo nome a partir do programa principal ou de outros subprogramas e, at mesmo por ele
prprio, conhecida como chamada recursiva.
Cada uma dessas unidades de programa corresponde a um conjunto completo e consistente de tarefas que podem ser escritas, compiladas e testadas individualmente. Posteriormente so includas no programa principal para gerar um arquivo executvel.
Outra importante funo dos subprogramas a possibilidade de depurar erros. Assim,
os programadores podem criar o subprograma como uma unidade de programa, tambm
chamada de procedimento em Fortran. Depois de aprovada, isto , aps compilar, testar e
depurar os erros, o subprograma pode ser agregado ao programa principal. Em Fortran h
dois tipos de subprogramas ou procedimentos que se encaixam nesta categoria: sub-rotinas
e funes. A agregao pode ser realizada por procedimento interno ou externo.
PROCEDIMENTOS EXTERNOS
Os procedimentos externos se localizam externamente ao programa principal, isto , aps o
END PROGRAM ou ainda em um arquivo separado, e neste caso podem ser de outra linguagem. Nestes ltimos, o procedimento externo (sub-rotina ou funo), deve ser compilado
separadamente e aps anexado ao executvel principal, por intermdio de opes de compi-
98
lao do programa principal, que veremos nesta seo. Os procedimentos externos de outra
linguagem muito utilizados so os da linguagem C.
A estrutura geral e localizao , para o caso do procedimento externo pertencer ao
mesmo arquivo do programa principal:
[PROGRAM nome_do_programa]
[USE nome_do_use]
[IMPLICIT NONE]
[declarao global dos dados]
declaraes executveis
END [PROGRAM nome_do_programa]
[procedimentos ou subprogramas externos]
que compila mltiplos arquivos de cdigo fonte e os anexa para produzir um arquivo executvel chamado calculo1 no linux ou unix, ou calculo1.exe no sistema MS Windows.
PROCEDIMENTOS INTERNOS
fortran
95
=
=
99
ocorre por exemplo, com o clculo da funo seno ou cosseno, nas funes intrnsecas. Ambos os procedimentos sero descritos a seguir.
Os benefcios dos subprogramas so principalmente:
1. Testes Independentes. Cada subprograma pode ser codificado e compilado como uma
unidade independente, antes de ser incorporado ao programa principal. Este passo
conhecido como uma unidade de teste.
2. Procedimentos Re-utilizveis. Em muitos casos, diferentes partes de um programa podem usar o mesmo subprograma. Com isto reduz o esforo de programao e tambm
simplifica a depurao dos erros.
3. Isolamento do restante do Programa. As nicas variveis no programa principal que
podem se comunicar (e tambm serem trocadas) pelo procedimento so as que esto declaradas nos argumentos.
3. Cooperativismo. Os subprogramas podem ser desenvolvidos por diferentes programadores e em diferentes partes do mundo, e aps disponibilizados para uso. Um exemplo
o repositrio de subprogramas da biblioteca matemica LAPACK, que ser estudada na
pg. 103.
O uso de subprogramas uma boa prtica de programao em cdigos muito extensos.
6.2
AS SUB-ROTINAS SUBROUTINE
Uma sub-rotina um procedimento Fortran que chamado pela declarao CALL, que
recebe valores de entrada e retorna valores de sada atravs de uma lista de argumentos. A
forma geral de uma sub-rotina :
SUBROUTINE <nome_da_sub-rotina>(<lista_de_argumentos>)
IMPLICIT NONE
<declaraes de variveis locais>
...
<procedimentos executveis>
...
[RETURN]
END SUBROUTINE <nome_da_sub-rotina>
A declarao SUBROUTINE marca o incio de uma sub-rotina. O nome da sub-rotina
deve seguir os padres do Fortran: deve ter at 31 caracteres e pode ter tanto letras do alfabeto como nmeros, mas o primeiro caracter deve ser - obrigatoriamente - uma letra. A
lista de argumentos contm uma lista de variveis, arrays ou ambas que so passadas para
a sub-rotina quando a mesma ativada. Estas variveis so chamadas argumentos mudos
(dummy arguments), porque a sub-rotina no aloca memria para elas. A alocao ser efetivada quando os argumentos forem passados na chamada da sub-rotina.
Qualquer unidade de programa pode chamar uma sub-rotina, at mesmo outra sub-
100
rotina[N1] . Para usar ou chamar uma sub-rotina usado a declarao CALL, da seguinte
maneira:
CALL <nome_da_sub-rotina>(<lista_de_argumentos>)
em que, a ordem e tipo dos argumentos na lista_de_argumentos devem corresponder a
ordem e tipo dos argumentos mudos declarados na sub-rotina. A sub-rotina finaliza sua execuo quando encontra um RETURN ou um END SUBROUTINE e, retorna ao programa que
a requisitou na linha seguinte ao CALL. Quando a execuo encontra um RETURN, imediatamente o fluxo de execuo desviado para a linha que contm o END SUBROUTINE. Um
exemplo simples ilustra melhor o que uma sub-rotina.
Programa 6.1 Um exemplo de sub-rotina.
1
2
3
4
5
6
7
8
9
10
11
12
13
fortran
95
101
do programa. Esta sub-rotina usada num programa ou em outra sub-rotina, por intermdio da declarao CALL exemplo_sub(lado1, lado2, hipotenusa), como no exemplo abaixo:
Programa 6.2 Um programa para testar a sub-rotina do Programa 6.1.
1
2
3
4
5
6
7
8
9
10
PROGRAM testa_sub
IMPLICIT NONE
REAL :: s1, s2, hip
WRITE(*,*)Indique um dos lados de um triangulo retangulo:
READ(*,*)s1
WRITE(*,*)Indique o outro lado do triangulo retangulo:
READ(*,*)s2
CALL exemplo_sub(s1, s2, hip)
WRITE(*,*) O valor da hipotenusa do triangulo eh: ,hip
END PROGRAM testa_sub
Outras caractersticas importantes, tal como alocao de memria automtica para arrays, esto descritos detalhadamente nas referncias indicadas anteriormente.
6.3
AS FUNES FUNCTION
Uma funo Fortran um procedimento que ativado em uma expresso que pertence
a um comando de programa. A funo retorna um nico valor numrico, ou lgico, ou
caracter ou uma array. O Fortran tem dois tipos de funes: funes intrnsecas e funes
definidas pelo usurio (funes definida-usurio).
Funes intrnsecas, estudadas no Captulo 1, na pgina 30, so prprias (latentes) da
linguagem Fortran, tais como SIN(X), COS(X), SQRT(X), entre outras. Para saber quais so
as funes intrnsecas consulte o Manual do Usurio.
As funes definida-usurio so funes que o programador cria para executar uma
tarefa especfica. A forma geral de uma funo definida-usurio :
[Tipo] FUNCTION <nome_da_funo>(<lista_de_argumentos>)
<declaraes de variveis locais>
...
<procedimentos executveis>
...
<nome_da_funo = expresso>
[RETURN]
END FUNCTION <nome_da_funo>
A funo definida-usurio (ou simplesmente funo) deve ser iniciada com a instruo
FUNCTION e finalizada com uma instruo END FUNCTION. O nome da funo deve seguir,
como nas sub-rotinas, os padres do Fortran, isto , deve ter at 31 caracteres e pode ter tanto
letras do alfabeto como nmeros, mas o primeiro caracter deve ser obrigatoriamente uma
letra. A funo ativada pelo seu nome, em uma expresso e, sua execuo comea no topo
da funo e termina quando encontra um RETURN ou END FUNCTION. A instruo RETURN
opcional e raramente utilizada, pois a execuo sempre termina num END FUNCTION. A
102
declarao Tipo opcional se a declarao IMPLICIT NONE estiver presente. Caso contrrio, necessrio declarar o tipo de funo. Estes tipos podem ser REAL, INTEGER, COMPLEX,
CHARACTER ou LOGICAL. Aps ser executada, a funo retorna um valor que ser usado
para continuar a execuo da expresso na qual a funo foi chamada. Um exemplo de funo definida-usurio mostrado abaixo, a qual calcula o valor da funo
f (x) = ax2 + bx + c ,
num ponto x.
Programa 6.3 Um exemplo de funo.
1
2
3
4
5
6
7
8
Esta funo produz um resultado real. Observe que o atributo INTENT no usado com
a declarao do nome da funo func, porque ela sempre ser usada somente como sada.
Note tambm que, se no fosse declarada como real, a varivel func deveria ser declarada
no corpo da FUNCTION, como de hbito. Um programa que usa esta funo pode ser:
Programa 6.4 Um programa para testar funo definida-usurio do Programa 6.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PROGRAM testa_func
IMPLICIT NONE
! Testa a funcao que calcula f(x) = ax**2 + b*x + c
REAL :: func
REAL :: a, b, c, x
WRITE(*,*) Entre com os coef. quadraticos a, b e c:
WRITE(*,*) Digite o coef. a:
READ(*,*) a
WRITE(*,*) Digite o coef. b:
READ(*,*) b
WRITE(*,*) Digite o coef. c:
READ(*,*) c
WRITE(*,*) Entre com a localizacao na qual quer fazer o calculo:
READ(*,*) x
WRITE(*,100) Calculo em (,x,) = , func(x,a,b,c)
100 FORMAT(A,F10.4,A,F12.4)
END PROGRAM testa_func
Note que a funo func declarada como tipo real tanto na prpria funo, como no
programa principal da qual ativada. Para mais informaes, procure pela literatura indicada nas Referncias Bibliogrficas.
103
6.4
AS BIBLIOTECAS DE SUB-ROTINAS E FUNES
A Netlib um conjunto de cdigos matemticos, artigos e base de dados. O endereo
eletrnico http://www.netlib.org/. O uso das subrotinas e fune prontas, como LAPACK e
BLAS, so timos exemplos.
6.4.1
A biblioteca LAPACK
A biblioteca LAPACK escrita em FORTRAN 77 e fornece rotinas para resolver equaes lineares simultneas, solues de sistemas de equaes lineares por mnimos-quadrados, problemas de autovalores, e problemas de valores singulares. Tambm esto disponibilizadas
solues para fatorizao de matrizes associadas (LU, Cholesky, QR, SVD, Schur, Schur generalizada). Solues com matrizes densas e esparsas tambm esto disponveis, bem como
funcionalidades para tratar com matrizes reais e complexas, tanto em preciso simples como
dupla.
Esta parte do livro est em fase de elaborao e finalizao. Desculpe!!!!!
Programa 6.5 A sub-rotina DGESV da LAPACK.
SUBROUTINE DGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO )
1
2
3
4
5
6
7
*
*
*
*
*
*
-- LAPACK driver routine (version 3.1) -Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
November 2006
.. Scalar Arguments ..
INTEGER
INFO, LDA, LDB, N, NRHS
..
.. Array Arguments ..
INTEGER
IPIV( * )
DOUBLE PRECISION
A( LDA, * ), B( LDB, * )
..
8
9
10
*
*
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
Purpose
=======
DGESV computes the solution to a real system of linear equations
A * X = B,
where A is an N-by-N matrix and X and B are N-by-NRHS matrices.
The LU decomposition with partial pivoting and row interchanges is
used to factor A as
A = P * L * U,
where P is a permutation matrix, L is unit lower triangular, and U is
upper triangular. The factored form of A is then used to solve the
system of equations A * X = B.
Arguments
=========
N
(input) INTEGER
The number of linear equations, i.e., the order of the
matrix A. N >= 0.
NRHS
(input) INTEGER
The number of right hand sides, i.e., the number of columns
of the matrix B. NRHS >= 0.
104
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
69
70
71
*
*
72
73
74
75
76
77
*
*
*
*
*
79
80
81
82
83
84
85
86
87
88
89
90
91
93
94
*
*
*
96
98
99
*
*
*
101
102
103
105
LDA
(input) INTEGER
The leading dimension of the array A.
IPIV
LDB
(input) INTEGER
The leading dimension of the array B.
INFO
(output) INTEGER
= 0: successful exit
< 0: if INFO = -i, the i-th argument had an illegal value
> 0: if INFO = i, U(i,i) is exactly zero. The factorization
has been completed, but the factor U is exactly
singular, so the solution could not be computed.
=====================================================================
.. External Subroutines ..
EXTERNAL
DGETRF, DGETRS, XERBLA
..
.. Intrinsic Functions ..
INTRINSIC
MAX
..
.. Executable Statements ..
Test the input parameters.
100
104
95
97
INFO = 0
IF( N.LT.0 ) THEN
INFO = -1
ELSE IF( NRHS.LT.0 ) THEN
INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4
ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
INFO = -7
END IF
IF( INFO.NE.0 ) THEN
CALL XERBLA( DGESV , -INFO )
RETURN
END IF
78
92
*
*
End of DGESV
105
106
*
END
107
1
2
3
4
5
6
7
*
*
*
*
*
*
-- LAPACK driver routine (version 3.1) -Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
November 2006
.. Scalar Arguments ..
INTEGER
INFO, LDA, LDB, N, NRHS
..
.. Array Arguments ..
INTEGER
IPIV( * )
DOUBLE PRECISION
A( LDA, * ), B( LDB, * )
..
8
9
10
*
*
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
Purpose
=======
DGESV computes the solution to a real system of linear equations
A * X = B,
where A is an N-by-N matrix and X and B are N-by-NRHS matrices.
The LU decomposition with partial pivoting and row interchanges is
used to factor A as
A = P * L * U,
where P is a permutation matrix, L is unit lower triangular, and U is
upper triangular. The factored form of A is then used to solve the
system of equations A * X = B.
Arguments
=========
N
(input) INTEGER
The number of linear equations, i.e., the order of the
matrix A. N >= 0.
NRHS
(input) INTEGER
The number of right hand sides, i.e., the number of columns
of the matrix B. NRHS >= 0.
LDA
(input) INTEGER
The leading dimension of the array A.
IPIV
LDB
(input) INTEGER
The leading dimension of the array B.
INFO
(output) INTEGER
= 0: successful exit
< 0: if INFO = -i, the i-th argument had an illegal value
106
*
*
*
*
*
*
*
69
70
71
*
*
72
73
74
75
76
77
*
*
*
*
*
79
80
81
82
83
84
85
86
87
88
89
90
91
93
94
97
98
101
102
.. External Subroutines ..
EXTERNAL
DGETRF, DGETRS, XERBLA
..
.. Intrinsic Functions ..
INTRINSIC
MAX
..
.. Executable Statements ..
Test the input parameters.
96
99
=====================================================================
*
*
*
95
100
INFO = 0
IF( N.LT.0 ) THEN
INFO = -1
ELSE IF( NRHS.LT.0 ) THEN
INFO = -2
ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
INFO = -4
ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
INFO = -7
END IF
IF( INFO.NE.0 ) THEN
CALL XERBLA( DGESV , -INFO )
RETURN
END IF
78
92
> 0:
*
*
*
End of DGESV
END
CAPITULO
As Funes Intrnsecas
SELECTED_REAL_KIND e
SELECTED_INT_KIND
Neste captulo voc encontrar:
6.1 Selecionando Preciso de Maneira Independente do Processador . . . . . . . . . . . .
Exerccios . . . . . . . . . . . . . . . . . . . .
Para reflexo !!
50
24
Vimos que na maioria dos computadores, a varivel real default preciso simples, a
qual usualmente tem 4 Bytes, divididos em duas partes: mantissa e expoente. Para a preciso
dupla, usualmente, dedicado 8 Bytes. Usando estas declaraes ficaremos dependentes da
combinao compilador/processador. Podemos comear a alterar esta dependncia, usando
o parmetro KIND na declarao de variveis. Assim, preciso simples e dupla tem valores
especficos neste parmetro. Vejamos os exemplos:
REAL(KIND=1) :: valor_1
REAL(KIND=4) :: valor_2
REAL(KIND=8), DIMENSION(20) :: matriz_a
REAL(4) :: temp
O tipo de valor real especificado nos parnteses aps o REAL, com ou sem KIND=. Uma varivel declarada com este tipo de parmetro chamado de varivel parametrizada. Se nenhum
tipo especificado, ento o tipo real default usado. Mas afinal, que significa o tipo de parmetro (em KIND)? Infelizmente, no temos como saber. Cada compilador livre para atribuir
um nmero para cada tamanho de varivel. Por exemplo, em alguns compiladores, o valor
real com 32 bits igual a KIND=1 e o valor com 64 bits KIND=2, que o caso da combinao
PC/NAGWare FTN90. Em outros compiladores, como PC/Lahey-Fujitsu Fortran 90/95 e
PC/Microsoft PowerStation 4.0, temos KIND=4 e KIND=8, para respectivamente, 32 bits e 64
bits.
Portanto, para tornar nossos programas portveis, entre compiladores e mquinas diferentes, devemos sempre fornecer o valor correto para o tipo de parmetro. Para isso, pode-
default
=
na
omisso de
declarao.
108
mos usar a funo intrnseca KIND, que retorna o nmero que especfica o tipo de parmetro
usado para simples e dupla preciso. Uma vez descoberto estes valores, podemos us-los nas
declaraes das variveis reais. Vejamos como funciona a funo intrnseca KIND, atravs de
um programa:
1
2
3
4
5
6
7
8
PROGRAM kinds
! Proposito: determinar os tipos de parametros de simples e
!
dupla precisao num dado computador e compilador
IMPLICIT NONE
! Escreve na tela os tipos de parmetros
WRITE(*,(" O KIND para Precisao Simples eh ",I2))KIND(0.0)
WRITE(*,(" O KIND para Precisao Dupla
eh ",I2))KIND(0.0D0)
END PROGRAM kinds
Na tabela 7.1 apresentado os resultados da execuo deste programa, em quatro diferentes combinaes de Processador/Compilador.
Tabela 7.1 Valores de KIND para valores reais em alguns compiladores
32 bits
KIND
64 bits
128 bits
4
1
N/D
4
8
2
8
8
16
N/D
16
N/D
A partir destes resultados podemos migrar entre estas mquinas e compiladores, simplesmente trocando os parmetros do KIND. Vejamos um exemplo de programa que use este
procedimento, com os dados do PC-Pentium/Lahey-Fujitsu Fortran 90/95:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
PROGRAM uso_do_kind
!
! Proposito: usar o KIND como parametro
!
IMPLICIT NONE
INTEGER, PARAMETER :: single = 4
INTEGER, PARAMETER :: double = 8
REAL(KIND=single) :: valor_1
REAL(KIND=double), DIMENSION(20) :: matriz_1
REAL(single) :: temp
.....
executaveis
.....
END PROGRAM uso_do_kind
109
7.1
SELECIONANDO PRECISO DE MANEIRA INDEPENDENTE DO
PROCESSADOR
Como j sabemos, o maior problema encontrado quando portamos um programa Fortran de um computador para outro o fato que os termos preciso simples e preciso dupla no
so precisamente definidos. Os valores com preciso dupla tem, aproximadamente, duas vezes o valor dos valores com preciso simples, mas o nmero de bits associado com cada tipo
de nmero real depender de cada compilador. Tambm j sabemos que em muitos computadores, 32 bits est associado com a preciso simples e 64 bits com a dupla preciso. Num
computador Cray diferente, conforme tabela anterior.
Ento, como podemos escrever programas que possam ser facilmente portveis entre processadores diferentes, com definies de preciso simples e dupla diferentes e assim
mesmo funcionar corretamente? A resposta est num dos avanos da linguagem Fortran.
Agora, possvel especificarmos valores para a mantissa e o expoente, conforme a convenincia e, com isso tambm obtermos maior portabilidade do programa. Isto feito atravs de
uma funo intrnseca que seleciona automaticamente o tipo de valor real para usar quando
se troca de computador. Esta funo chamada SELECTED_REAL_KIND. A forma geral desta
funo
SELECTED_REAL_KIND(p=preciso,r=expoente(ou range))
onde preciso o nmero de dgitos decimais requerido e range o tamanho do expoente requerido da potncia de 10. Os dois argumentos preciso e range so argumentos opcionais;
um deles ou ambos podem ser informados. Vejamos os exemplos abaixo:
kind_number
kind_number
kind_number
kind_number
kind_number
kind_number
=
=
=
=
=
=
SELECTED_REAL_KIND(p=6,r=37)
SELECTED_REAL_KIND(p=12)
SELECTED_REAL_KIND(r=100)
SELECTED_REAL_KIND(13,200)
SELECTED_REAL_KIND(13)
SELECTED_REAL_KIND(p=17)
110
Descrio
SELECTED_REAL_KIND(p,r)
Retorna o menor tipo de parmetro real com um valor mnimo de p dgitos decimais de preciso e mximo intervalo 10r .
Retorna o menor tipo de parmetro inteiro com mximo intervalo 10r .
Retorna o nmero que especifica o tipo de parmetro de X, onde X uma varivel ou constante de algum tipo intrnseco.
Retorna a preciso decimal de X, onde X um valor
real ou complexo.
Retorna o expoente da potncia de 10 para X, onde
X um valor inteiro, real ou complexo.
SELECTED_INT_KIND(r)
KIND(X)
PRECISION(X)
RANGE(X)
Observe, pela tabela 7.2, que o procedimento de escolha de preciso tambm vlido
para os nmeros inteiros. A funo para isto SELECTED_INT_KIND(r), e o exemplo
abaixo ilustra seu uso:
kind_number = SELECTED_INT_KIND(3)
kind_number = SELECTED_INT_KIND(9)
kind_number = SELECTED_INT_KIND(12)
Usando um processador PC-Pentium e o compilador da Lahey/Fujitsu, a primeira funo
retornar um 2 (para 2 Bytes inteiros), representando um intervalo de representao entre
-32.768 e 32.767. Igualmente, a segunda funo retornar um 4 (4 Bytes), que fornecer um
intervalo entre -2.147.483.648 e 2.147.483.647. A ltima funo retornar um 8 (8 Bytes), com
intervalo entre -9.223.372.036.854.775.808 e 9.223.372.036.854.775.807. Em outros compiladores, este ltimo pode retornar -1, pois poder fugir de sua representatividade.
CAPITULO
Os Procedimentos MODULE
A linguagem Fortran surgiu na dcada de 50, sendo a primeira linguagem de alto nvel a
ser criada. Embora seja a precursora das linguagens, ela foi projetada com os conceitos da
programao estruturada. No que diz respeito modularizao de programas, a linguagem
Fortran oferece facilidades atravs de sub-rotinas (SUBROUTINE) e funes (FUNCTION), o
que torna possvel a implementao de programas modulares e estruturados. No Fortran
90/95, esta modularizao teve um avano significativo atravs das declaraes e procedimentos MODULE, tanto que esta declarao tem status de programa. Como veremos, esta
caracterstica muito importante.
Um dos usos da declarao MODULE substituir as declaraes COMMON, no compartilhamento de dados. Antes de estudarmos esta utilidade, veremos qual a funo do COMMON
nos programas Fortran.
8.1
A DECLARAO COMMON
Programas e subprograma em Fortran podem utilizar variveis que so declaradas de
forma a compartilhar uma mesma rea de memria. Este compartilhamento tem a finalidade
de economizar memria, pois variveis de mdulos (ou subprograma) diferentes ocuparo
uma mesma posio de memria. Isto anos atrs era uma caracterstica muito utilizada, pois
era visvel o problema de memria. Hoje, este problema pode at ser amenizado, mas sempre
que pudermos economizar memria, melhor!! Assim, continuamos sempre otimizando o uso
de memria e os COMMON ainda so usados.
O uso do COMMON, e o seu compartilhamento, torna possvel a transferncia de informaes entre subprogramas, sem (ou de forma complementar) a utilizao da passagem por
parmetros. A rea de memria compartilhada pode ser dividida em blocos, onde cada um
recebe um nome ou rtulo. A forma geral de se declarar variveis com rea compartilhada,
conhecida como COMMON, :
COMMON /r1 /lista de identificadores1 /rN /lista de identificadoresN
onde ri so nomes dos rtulos comuns de variveis, lista de identificadoresi so nomes de
variveis simples ou compostas que no podem ser diferentes. Um exemplo, parcialmente
112
reproduzido de um programa:
PROGRAM uso_common
IMPLICIT NONE
INTEGER :: i,m,n1,n2,ue,us
COMMON /area1/n1,n2,m
.....
CALL mdc
.....
END PROGRAM uso_common
!
! Aqui comecam as sub-rotinas
!
SUBROUTINE mdc
INTEGER :: a,aux1,b,m
COMMON /area1/a,b,m
m = b
aux1 = MOD(a,b)
.....
END SUBROUTINE mdc
.....
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PROGRAM erro_common
IMPLICIT NONE
REAL :: a, b
REAL, DIMENSION(5) :: c
INTEGER :: i
COMMON / common1 / a, b, c, i
.....
CALL cuidado
.....
END PROGRAM erro_common
!
! Aqui comecam a sub-rotina
!
SUBROUTINE cuidado
REAL :: x
REAL, DIMENSION(5) :: y
INTEGER :: i, j
COMMON / common1 / x, y, i, j
.....
END SUBROUTINE cuidado
Programa
Sub-rotina
(erro_common)
(cuidado)
0000
0001
y(1)
0002
c(1)
y(2)
0003
c(2)
y(3)
0004
c(3)
y(4)
0005
c(4)
y(5)
0006
c(5)
0007
Endereo na
Memria
113
1o tipo de erro: observe que os 5 elementos da array c no programa principal e o seus correspondentes na sub-rotina esto desalinhados. Portanto, c(1), no programa principal, ser
a mesma varivel y(2), na sub-rotina. Se as arrays c e y so supostamente as mesmas, este
desalinhamento causar srios problemas.
2o tipo de erro: o elemento real da array c(5) no programa principal idntico a varivel
inteira i, na sub-rotina. extremamente improvvel (e indesejvel) que a varivel real armazenada em c(5) seja usada como um inteiro na sub-rotina cuidado.
Estes tipos de erros podem ser evitados se usarmos a declarao MODULE, no lugar do
COMMON.
8.2
A DECLARAO MODULE
A declarao MODULE (ou mdulo, simplesmente) pode conter dados, procedimentos,
ou ambos, que podemos compartilhar entre unidades de programas (programa principal,
subprograma e em outros MODULE). Os dados e procedimentos estaro disponveis para uso
na unidade de programa atravs da declarao USE, seguida do nome do mdulo. Ficar
mais claro com um exemplo simples.
8.2.1
O mdulo abaixo ser compartilhado com outras duas unidades de programas. Vejamos:
MODULE teste
!
! Declara dados para compartilhar entre duas rotinas
!
IMPLICIT NONE
SAVE
INTEGER, PARAMETER :: num_vals = 5
REAL, DIMENSION(num_vals) :: valores
END MODULE teste
A declarao SAVE garante que todos os dados declarados no mdulo sero preservados quando forem acessados por outros procedimentos. Ele deve sempre includo em qualquer mdulo que declara dados compartilhados. Agora, vejamos como usar o mdulo acima,
atravs do seguinte programa:
PROGRAM testa_module
!
! Ilustra o compartilhamento via MODULE
!
USE teste
IMPLICIT NONE
REAL, PARAMETER :: pi = 3.141592
valores = pi*( /1., 2., 3., 4., 5. /)
CALL sub1
SAVE:
um
dos
avanos do
Fortran
90.
114
CONTAINS
SUBROUTINE sub1
!
! Ilustra o compartilhamento via MODULE
!
USE teste
IMPLICIT NONE
WRITE(*,*) valores
END SUBROUTINE sub1
END PROGRAM testa_module
Os contedos do mdulo teste esto sendo compartilhados entre o programa principal e a sub-rotina sub1. Qualquer outra sub-rotina ou funo dentro do programa tambm
poder ter acesso aos dados, simplesmente incluindo a declarao USE.
Mdulos so especialmente teis para compartilhar grandes volumes de dados entre
unidades de programas.
Exerccio: use o MODULE para evitar o erro descrito no exemplo da pgina 112 (programa
erro_common).
Importante:
A declarao USE sempre a primeira declarao no comentada posicionada logo
abaixo a declarao PROGRAM, SUBROUTINE, ou FUNCTION. Evidentemente, antes da
declarao IMPLICIT NONE.
O mdulo deve ser sempre compilado antes de todas as outras unidades de programa
que a usam. Ela pode estar no mesmo arquivo ou arquivo separado. Se estiver no
mesmo arquivo, deve aparecer antes do programa principal. Muitos compiladores suportam a compilao separada e geram um arquivo .mod (ou similar), que contm
informaes sobre o mdulo, para uso mais tarde com a declarao USE.
8.3
OS PROCEDIMENTOS MODULE
Alm de dados, os mdulos tambm podem conter sub-rotinas e funes, que so os
Procedimentos MODULE ou Mdulos. Estes procedimentos so compilados como uma parte
do mdulo e estaro disponveis para as unidades de programa atravs da declarao USE.
Os procedimentos que so includos dentro dos mdulos devem vir aps a declarao dos
dados do mdulo e precedidos por uma declarao CONTAINS. Esta declarao, tem a funo
de instruir o compilador que as declaraes que a seguem so procedimentos includos no
programa e, portanto, devem ser agregados na compilao.
No exemplo abaixo, a sub-rotina sub1, est contida no interior do mdulo mod_proc1.
MODULE mod_proc1
IMPLICIT NONE
!
! Aqui sao declarados os dados
CONTAINS:
outro
avano
do
Fortran
90
e,
especifica
que um
mdulo
ou um
programa
contenham
procedimentos
internos.
115
!
CONTAINS
SUBROUTINE sub1(a, b, c, x, error)
IMPLICIT NONE
REAL, DIMENSION(3), INTENT(IN) :: a
REAL, INTENT(IN) :: b, c
REAL, INTENT(OUT) :: x
LOGICAL, INTENT(OUT) :: error
......
END SUBROUTINE sub1
END MODULE mod_proc1
A sub-rotina sub1 estar disponvel para uso numa unidade de programa atravs do
USE mod_proc1, posicionado como vimos anteriormente. A sub-rotina ativada com a
declarao padro CALL, por exemplo:
PROGRAM testa_mod_proc1
USE mod_proc1
IMPLICIT NONE
......
CALL sub1(a, b, c, x, error)
......
END PROGRAM testa_mod_proc1
8.3.1
Mas porque nos darmos o trabalho de incluir procedimentos (sub-rotinas e funes) num
mdulo? J sabemos que possvel compilar separadamente uma sub-rotina e cham-la
numa outra unidade programa, ento porque passar por etapas extras, i.e., incluir uma subrotina num mdulo, compilar o mdulo, declarar o mdulo atravs da declarao USE, e s
a chamar a sub-rotina?
A resposta que quando um procedimento compilado dentro de um mdulo e o mdulo usado numa chamada de programa, todos os detalhes da interface de procedimentos
esto disponveis para o compilador. Assim, quando o programa que usa a sub-rotina compilado, o compilador pode automaticamente verificar o nmero de argumentos na chamada
do procedimento, o tipo de cada argumento, se cada argumento est ou no numa array, e o
INTENT[N1] de cada argumento. Em resumo, o compilador pode capturar muito dos erros
comuns que um programador pode cometer quando usa os procedimentos.
Um procedimento compilado dentro de um mdulo e acessado pelo USE dito ter uma
Interface Explcita. O compilador Fortran conhece todos os detalhes a respeito de cada argumento no procedimento sempre que o mesmo utilizado, e o compilador verifica a interface
para assegurar que est sendo usado adequadamente.
Ao contrrio, procedimentos que no esto em mdulos so chamados ter uma Interface Implcita. Desta forma, o compilador Fortran no tem informaes a respeito destes
[N1] O
INTENT(xx), que especifica o tipo de uso do argumento mudo, onde o xx pode ser IN, OUT e INOUT. O
atributo INTENT(IN) especifica que o argumento mudo entrada na unidade de programa e no pode ser redefinido no seu interior; j o atributo INTENT(OUT) especifica que o argumento mudo sada da unidade de programa
e o atributo INTENT(INOUT) especifica que o argumento mudo tanto de entrada como de sada na unidade de
programa.
INTENT:
outro
avano
do
Fortran
90. Esta
declarao
especifica
a
inteno
de uso
de um
argumento
mudo
116
procedimentos, quando ele compilado numa unidade programa, que o solicite. Assim, ele
assume que o programador realmente verificou corretamente o nmero, o tipo, a inteno de
uso, etc. dos argumentos. Se esta preocupao no foi tomada, numa seqencia de chamada
errada, o programa ser executado com falha e ser difcil de encontr-la.
Nada melhor que um exemplo para dirimir dvidas. O caso a seguir ilustra os efeitos
da falta de concatenao quando a sub-rotina chamada est includa num mdulo. O mdulo
dado por,
1
2
3
4
5
6
7
8
MODULE erro_interf
CONTAINS
SUBROUTINE bad_argumento (i)
IMPLICIT NONE
INTEGER, INTENT(IN) :: i
WRITE(*,*) I = , i
END SUBROUTINE bad_argumento
END MODULE erro_interf
PROGRAM bad_call
USE erro_interf
IMPLICIT NONE
REAL :: x = 1.
CALL bad_argumento (x)
END PROGRAM bad_call
Exerccio: no exemplo acima, transforme a interface explcita em implcita, isto , simplesmente elimine o mdulo. Compile e execute! O que ocorrer? Dica: elimine o mdulo, o
CONTAINS e coloque a sub-rotina aps o END PROGRAM e s a compile.
Existem outras maneiras de instruir o compilador Fortran para explicitar a verificao nos
procedimentos por interface, o bloco INTERFACE[6][10], que no ser visto aqui.
8.3.2
Se no for especificado, todas as variveis dos mdulos estaro disponveis para todas as
unidades de programas, que contenham a declarao USE do referido mdulo. Isto pode nem
sempre ser desejado: o caso se os procedimentos do mdulo tambm contenham variveis
que pertenam s as suas prprias funes. Elas estaro mais a salvo se os usurios do pacote
no interfiram com seus trabalhos internos. Por default todos os nomes num mdulo so
PUBLIC, mas isto pode ser trocado usando a declarao PRIVATE. Vejamos o exemplo:
1
2
3
4
5
6
7
8
117
MODULE change_ac
IMPLICIT NONE
PRIVATE
PUBLIC :: casa_1, hotel_rs
REAL :: casa_1, fazenda_rs
INTEGER :: apto_1, hotel_rs
.....
END MODULE change_ac
Neste caso uma unidade de programa, que use este mdulo, no ter acesso as variveis
fazenda_rs e apto_1. Mas, ter acesso as variveis casa_1 e hotel_rs. Sobre mdulos
existem ainda outras caractersticas interessantes, mas isto que vimos j o suficiente para
mostrar a sua potencialidade.
Assim, chegamos ao final deste minicurso de Introduo ao Fortran 90/95. evidente
que o que foi apresentado pode ser aprofundado, principalmente sobre o ltimo assunto:
mdulos e interfaces. Muitas outras novas instrues escaparam ao minicurso (por motivo
bvio!), tais como as instrues FORALL (especfica para processamento paralelo), WHERE,
TYPE, CASE, POINTER e TARGET, que entre outras, tornaram a linguagem Fortran mais poderosa ainda. A proposta inicial era de apresentar alguns avanos que a linguagem Fortran
sofreu nestes ltimos anos e acredito ter alcanado o objetivo. Agora, quando fores usar a
linguagem Fortran, j sabes que a mesma no morreu, como muitos apregoam. Pelo contrrio, ela constantemente atualizada e est, mais do que nunca, forte no seu principal uso:
como ferramenta do meio cientfico.
Agora, j mais embasado, interessante visitar o site (em ingls)
http://www.ibiblio.org/pub/languages/fortran/ch1-2.html,
que traz um texto, de Craig Burley, comparando as linguagens C[16] e Fortran 90/95. Vale a
pena !!!!
118
APENDICE
Decimal
Caracter ASCII
Binrio
Decimal
Caracter ASCII
0010 0000
0010 0001
0010 0010
0010 0011
0010 0100
0010 0101
0011 0000
0011 0001
0011 0010
0011 0011
0011 0100
0011 0101
0011 0110
0011 0111
0011 1000
0011 1001
32
33
34
35
36
37
48
49
50
51
52
53
54
55
56
57
(espao)
!
"
#
$
%
0
1
2
3
4
5
6
7
8
9
0100 0001
0100 0010
0100 0011
0101 1000
0101 1001
0101 1010
0110 0001
0110 0010
0110 0011
0110 0100
0111 1000
0111 1001
0111 1010
0111 1101
0111 1110
65
66
67
88
89
90
97
98
99
100
120
121
122
125
126
A
B
C
X
Y
Z
a
b
c
d
x
y
z
}
'
120
APENDICE
Parmetro de
Representao
(em Bytes KIND)
INTEGER
INTEGER
INTEGER
INTEGER
1
2
4
8
Observaes
REAL
REAL
REAL
10
COMPLEX
COMPLEX
COMPLEX
10
LOGICAL
LOGICAL
LOGICAL
LOGICAL
CHARACTER
1
2
4
8
1
Obs:
122
APENDICE
Glossrio
ATRIBUIO (assignment) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
uma instruo na forma varivel = valor numrico ou expresso. designado ou identificado pelo smbolo
de igualdade (=). Por exemplo, z = 4, indica que o valor inteiro 4 atribudo a varivel z. Outro
exemplo: x = y**2 + 2.0*y, cujo valor s ser atribudo a varivel x aps a soluo numrica da
expresso a direita.
DISPOSITIVO (device) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
um meio material (ou equipamento), tal como uma unidade de disco (HD, disquete, CD,...), teclado,
monitor, impressora, ou at mesmo a memria do computador.
INSTRUO (statement) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
uma seqncia de tokens, ou seja, uma seqncia de cdigos internos que substituem uma palavra reservada ou declarao de programa em uma linguagem de alto nvel. P. ex., o WRITE, substitui uma
instruo de mquina para imprimir, por intermdio de um dispositivo, o contedo contido em um
referido endereo de memria.
INSTRUO DE ATRIBUIO (assignment statement) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
o mesmo que atribuio.
PROCEDIMENTO (procedure) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
um clculo que pode ser invocado durante a execuo de um programa. E pode ser uma sub-rotina
ou uma funo. Pode ser um procedimento intrnsico (p. ex., COS ou EXP), um procedimento externo,
um procedimento mdulo, um procedimento interno (subprograma que vem aps um CONTAINS), um
procedimento mudo, ou uma funo.
124
APNDICE C. GLOSSRIO
APENDICE
D.1
ANALISE O PROBLEMA (E PROJETE SEU PROGRAMA) ANTES
DE PROGRAM-LO
Nunca inicie a programar a partir do nada. aconselhvel esquematizar alguns pseudocdigos (algoritmos) explicando o que o programa vai fazer (em um nvel mais elevado) antes
de escrever o programa. A exceo quando se trata de um cdigo que voc j escreveu
diversas vezes, por exemplo, encontrar um elemento em um vetor ou determinar se um
nmero par ou mpar.
Ao escrever um programa importante que se tenha pensado muito nele antes, com o
objetivo de visualiz-lo como um todo. Criando um rascunho prvio do programa, podem
aparecer vrias abordagens do problema e as dificuldades ficam mais fceis de serem superadas. Assim, esquematizar o programa ajuda a fixar exatamente o que se deseja e economizase tempo em frente ao monitor na tentativa de escrever um programa que execute o desejado.
D.2
ESCREVA UM CDIGO LEGVEL
Escrever um cdigo legvel muito importante para facilitar o entendimento de um
programa. At para o prprio criador do cdigo. Em programa claro e auto-explicativo fica
mais difcil se perder e torna muito mais fcil a depurao.
126
D.2.1
Comentrios so ferramentas muito teis para tornar o cdigo mais legvel. interessante
comentar tudo que no seja muito claro. No comente algo que seja bvio, como por exemplo
i = 0
D.2.2
A cada novo loop, expresses condicionais, definio de funes e blocos de comandos, seu
cdigo deve ser indentado um nvel mais direita (pressione [TAB] ou a barra de espao
algumas vezes). Esteja certo de voltar ao nvel de indentao anterior quando terminar o
bloco.
Linhas em branco tambm so muito teis para aumentar a legibilidade do seu cdigo.
Umas duas linhas entre as definies de funes e procedimentos e uma linha entre a definio de variveis e o cdigo iro separar claramente cada parte, o que torna a identificao
delas mais rpida. Isso torna o cdigo bem mais claro.
D.2.3
O cdigo fica incrivelmente mais difcil de ser depurado quando variveis importantes se
chamam p, t, ma1, qq, e assim por diante. Deve-se sempre utilizar nomes sugestivos para as
variveis, funes e procedimentos. O nome deve dar idia do que a varivel representa ou
o que a funo ou procedimento fazem. Por exemplo, se voc quer armazenar o nmero de
alunos em uma varivel, pode-se usar num_alunos. Se for uma funo que calcula o salrio
mdio, pode-se nome-la calc_SalarioMedio().
D.2.4
127
pode-se verificar se ela est correta. Alm disso a localizao de um problema no programa
tambm fica facilitada, pois ele se restringir a um bloco menor de cdigo.
Concluso:
Lembre-se que a maior parte do tempo que se gasta programando corrigindo e modificando cdigo existente. Relativamente pouco tempo realmente utilizado para adicionar
coisas novas. Isso significa que voc gastar muito tempo lendo o seu cdigo, ento faz sentido gastar algum tempo aprendendo a escrever um cdigo legvel. Cdigo legvel fcil de
escrever, fcil de depurar e fcil de manter. Voc realmente sai ganhando!
D.3
SE ESTIVER CONFUSO NA HORA DA DEPURAO
Se voc estiver confuso ao tentar procurar algum problema no seu programa, tente
explic-lo para voc mesmo. Dessa forma possvel notar inconsistncias ou fugas ao algoritmo planejado.
Caso isso no resolva, pode-se tentar executar o programa no papel. Isso se aplica tanto
a cdigos que voc escreveu e no est mais entendendo como a cdigos pegos de outros.
Funciona da seguinte maneira: Pegue uma folha em branco e liste todas as variveis usadas
no programa. Siga linha por linha do cdigo, escrevendo o valor das variveis enquanto
elas mudam, como se voc fosse o computador. Pode-se usar uma calculadora para ajudar
nas contas. Anote todas as sadas em uma folha parte. Aps algumas poucas iteraes a
estrutura bsica do algoritmo e sua inteno devem ficar claras. Tome cuidado, pois nem
sempre o cdigo funciona do jeito que ns pensamos que funciona.
D.4
GUIA PRTICO PARA RESOLUO DE PROBLEMAS DE PROGRAMAO
1) Entender o problema
Esteja certo de que tenha entendido o problema;
O que a entrada?
O que a sada?
2) Resolver o problema mo
Resolva pequenas instncias do problema mo;
O que acontece?
Pense em casos variados;
Pense em como (qual algoritmo) voc utilizou para resolver o problema.
3) Definir o algoritmo
Defina precisamente o algoritmo a ser utilizado
Rascunhe as etapas do programa
128
4) Programar
Como escrever o algoritmo na linguagem utilizada?
Que estrutura de dado utilizar?1
Divida o programa em partes menores (modularizar);
Escreva um programa de fcil leitura;
Pense nos casos patolgicos.2
4) Depurar
Explique o programa para si mesmo;
Por que funciona?
A leitura de dados est sendo feita corretamente?
Variveis inicializadas?
Verificar casos patolgicos;
Localizar o erro restringindo os blocos de cdigos (cercando o erro)
Comandos e loops aninhados corretamente?
Observaes:
1) Que estrutura utilizar?
Qual a melhor forma de representar as variveis do problema. Variveis simples? Vetores? Matrizes? Registros? Alguns vetores? Vetores de registro? Registros de vetores? So
muitas as estruturas utilizveis. Deve-se escolher uma que seja conveniente e que no venha
trazer complicaes mais adiante.
2) Pense nos casos patolgicos
Os casos patolgicos ocorrem quando a propriedade que seu programa utiliza no vale
para alguns valores. Normalmente so o zero, um, valores iniciais ou finais. Por exemplo,
em uma funo que calcula a potncia de um nmero n pelo expoente e. Para isso pode-se
multiplicar o nmero n e vezes. Nesse caso pode-se ter problemas quando o valor de e for
zero, caso que deve ser tratado especialmente (considerando a resposta padro como 1, por
exemplo). Para ilustrar melhor, imagine o caso em que deseja-se verificar se um vetor est
ordenado em ordem no-decrescente. Para isso basta verificar se v[n]<=v[n+1] para todos
os elementos, exceto o ltimo, pois para ele essa propriedade no tem sentido. Os casos
patolgicos so causa de grande parte dos problemas, especialmente quando se trabalha com
ponteiros.
Referncias www.gamedev.net Skiena, Steven S. "The Algorithm Design Manual", Telos,
1997
APENDICE
E.1
SOBRE O TEXTO
A fonte adotada no texto foi a palatino, tamanho 10pt, habilitada pelo pacote palatino.sty.
Para aproveitamento do papel disponvel na grfica, o tamanho do papel escolhido foi de 21
25 cm, e deixando uma margem segura para corte foi adotado 20, 7 24, 7 cm, configurado
no LATEX pelo pacote geometry.sty.
Para possibilitar a digitao direta dos caracteres acentuados e cedilhados foram utilizados os pacotes e opes (entre colchetes) [latin1]inputenc.sty e [T1]fontenc.sty, sendo que
este ltimo possibilita usar no comando \hyphenation palavras acentuadas e cedilhadas,
permitindo assim melhor controle sobre a separao silbica.
130
OS CAPTULOS
Os ttulos dos captulos foram formatados com o pacote fncychap.sty, com a opo Lenny,
desenvolvido por Ulf A. Lindgren. Para obter a formatao desejada as seguintes linhas, no
pacote,
\ChNameVar{\fontsize{14}{16}\usefont{OT1}{phv}{m}{n}\selectfont}
\ChNumVar{\fontsize{60}{62}\usefont{OT1}{ptm}{m}{n}\selectfont}
\CNV\FmN{\@chapapp}\space\CNoV\thechapter%
foram substitudas pelas linhas
\ChNameVar{\color{branco}\fontsize{12}{14}\usefont{OT1}{phv}{m}{n}
\bfseries\selectfont}
\ChNumVar{\color{preto}\fontsize{60}{62}\sffamily\bfseries\selectfont}
\hspace{-.05cm}\CNV\FmN{\@chapapp}\space\CNoV\thechapter%
E foi introduzida no pacote, antes do \parbox[b]{\textwidth}{, a linha:
{\color{cinza4}\rule{1.5\textwidth}{.69cm}}\vspace{-1.53cm}
para gerar o trao horizontal cinza claro, que transpe a margen direita.
Tambm foram alterados os comandos, estes localizados no prembulo do documento
fonte principal:
\ChTitleVar{\Huge\bfseries\sffamily}
\ChRuleWidth{0pt}
\ChNameUpperCase
\ChTitleUpperCase
AS SEES
Os ttulos das sees dos captulos foram formatados com o pacote titlesec.sty, com as seguintes opes:
\titleformat{\section}[block]{\sffamily\Large\bfseries}
{{\bfseries\color{cinza4}\thesection}}{.5em}
{\\[.1mm]\sffamily\Large\bfseries\MakeUppercase}
% Avana o ttulo para a prxima linha
\titlespacing{\section}{-.8cm}{.50cm}{1pc}
E.2
A DEFINIO DOS TONS DE CINZA
Com o pacote color.sty foi possvel definir os seguintes tons de cinza:
\definecolor{cinza1}{cmyk}{0,0,0,0.1} % fraco +++
\definecolor{cinza15}{cmyk}{0,0,0,0.15} %
\definecolor{cinza2}{cmyk}{0,0,0,0.2} %
131
\definecolor{cinza3}{cmyk}{0,0,0,0.3} %
\definecolor{cinza4}{cmyk}{0,0,0,0.4} %
\definecolor{cinza5}{cmyk}{0,0,0,0.5} % medio
\definecolor{cinza6}{cmyk}{0,0,0,0.6} %
\definecolor{cinza7}{cmyk}{0,0,0,0.7} %
\definecolor{cinza8}{cmyk}{0,0,0,0.8} %
\definecolor{cinza9}{cmyk}{0,0,0,0.9} % forte +++
\definecolor{preto}{cmyk}{0,0,0,1}
\definecolor{branco}{cmyk}{0,0,0,0}
Tambm foram definidos o branco e o preto na base CMYK, no lugar da base RGB. Isto
importante no momento da impresso do livro na grfica. Se definirmos tons de cinza com
RGB, estaremos adotando pigmentos coloridos e a impresso sair mais cara. O uso das
definies de tons de cinza no texto pelo comando \ color{cinza4} ou \ textcolor{cinza4},
como aparecero nas outras definies de comandos a seguir. Um exemplo do uso :
O texto ficar {\color{cinza4} cinza} assim.
E.3
A NOTA DE MARGEM
A nota de margem para chamar ateno aos elementos novos do Fortran 90, foi gerada com
o seguinte comando:
\newcommand{\FORTRANN}[1]{%
\textcolor{cinza4}{\bfseries #1}\marginpar{%
\sffamily \textcolor{cinza4}{\tiny fortran}\\[-.25cm]%
\bfseries\Large\xspace\textcolor{cinza4}{90}%
}%
}
E.4
AS NOTAS DE OBSERVAES NO TEXTO
As notas utilizadas ao longo do texto, como por exemplo o da pgina 2, foram geradas com
o seguinte comando:
\newcommand{\NOTA}[2]{
\begin{flushright}
\vspace*{-.4cm}%
\begin{minipage}[t]{0.8\textwidth}
{\small\bfseries\sffamily\color{cinza4} #1}\\[-.2cm]
{\color{cinza4}\rule{\textwidth}{.1mm}}
\\[-.05cm]\color{cinza4}\scriptsize\sffamily #2
fortran
95
132
{\color{cinza4}\hrulefill}
\end{minipage}
\end{flushright}\vspace{.1cm}
}
E.5
OS QUADROS DAS INSTRUES FORTRAN 95
Os quadros que contm as formas das sintaxes das instrues Fortran 95, como o exemplo
abaixo,
WRITE([UNIT=]<unidade>,[FMT=]<formato>,[ADVANCE=<modo>])
foram introduzidas pelos ambientes
\begin{sintaxebox}
\begin{Verbatim}[fontfamily=tt,fontseries=b,commandchars=\\\{
\},numbers=none,xleftmargin=5mm,codes={\catcode$=3\catcode^=1}]
WRITE([UNIT=]<unidade>,[FMT=]<formato>,[ADVANCE=<modo>])
\end{Verbatim}
\end{sintaxebox}
sendo que o ambiente sintaxebox, gerado pelas seguintes linhas:
\newlength\Linewidth
\def\findlength{\setlength\Linewidth\linewidth
\addtolength\Linewidth{-4\fboxrule}
\addtolength\Linewidth{-3\fboxsep}
}
\newenvironment{sintaxebox}{\par\centering\begingroup%
\setlength{\fboxsep}{5pt}\findlength%
\setbox0=\vbox\bgroup\noindent%
\hsize=1.0\Linewidth%
\begin{minipage}{1.0\Linewidth}\small}%
{\end{minipage}\egroup%
\vspace{6pt}%
\noindent\textcolor{cinza4}{\fboxsep2.5pt%
{\fboxsep5pt\colorbox{cinza4}{\normalcolor\box0}}}%
\endgroup\par\addvspace{6pt minus 3pt}\noindent%
\normalcolor\ignorespacesafterend}
\let\Sintaxebox\sintaxebox
\let\endSintaxebox\endsintaxebox
O pacote fancyvrb.sty que habilita o ambiente Verbatim.
133
E.6
OS EXEMPLOS DE PROGRAMAS FORTRAN 95
Os exemplos de programas Fortran 95, como o do primeiro programa,
Programa 12: O primeiro programa
134
E.7
OS MINI-SUMRIOS DOS CAPTULOS
A idia deste item no incio de cada captulo tem dois objetivos. Primeiro, informar ao leitor
o que encontrar no decorrer do mesmo e, segundo, transcrever uma frase de um cientista
conhecido, para possibilitar uma reflexo. O LATEX proporciona o pacote minitoc.sty para
gerar mini-sumrios, mas a opo em cri-los manualmente foi para ter controle sobre todo
o contedo deste item, como por exemplo, filtrar os itens que constaro no mini-sumrio.
O comando \INIZIO{#1}{#2} gera o mini-sumrio.
\newcommand{\INIZIO}[2]{\vspace{-.8cm}
{\color{cinza6}%
\rule{\textwidth}{.3mm}\\[.2cm]\noindent\begin{minipage}[t]{0.5\textwidth}%
\tiny
#1
\vspace{.1cm}\mbox{}
\end{minipage}
\hspace{0.05\textwidth}
\begin{minipage}[t]{0.4\textwidth}
\scriptsize\noindent\sffamily
#2
\vspace{.1cm}\mbox{}
\end{minipage}\\
\rule{\textwidth}{.3mm}
}
}
em que o primeiro argumento (#1) a parte da lista de contedos do referido captulo, copiada e editada do arquivo nome_livro.toc, gerado pelo LATEX. O segundo argumento (#2),
contm a frase para reflexo.
E.8
AS REFERNCIAS BIBLIOGRFICAS
REFERNCIAS BIBLIOGRFICAS
136
REFERNCIAS BIBLIOGRFICAS
[14] Cray Research, Inc., Eagan USA. Optimizing application code on cray pvp systems: Trvopt
2.0(a), volume i, 1996.
[15] Cray Research, Inc., 2360 Pilot Knob Road Mendota Heights, MN 55120, USA. Cf90T M
commands and directives reference manual, 1994. SR-3901 1.1.
[16] KERNIGHAN, B. W., RITCHIE, D. M. C, a linguagem de programao: Padro ansi. Rio de
Janeiro: Campus, 1989.