Escolar Documentos
Profissional Documentos
Cultura Documentos
Livrof90 v6 (Cap1) PDF
Livrof90 v6 (Cap1) PDF
Fortran 95:
curso bsico
Gilberto Orengo
Professor adjunto do Curso de Fsica Mdica
Centro Universitrio FranciscanoUNIFRA
http://www.orengonline.com/
orengo@orengonline.com
1a Edio
Editora XXX
c
Copyright
2007
de Gilberto Orengo
c 2007 de Gilberto Orengo
Copyright dos Apndices
Capa
Lucas Rodrigues dos Santos
Preparao e digitao no LATEX
Gilberto Orengo
Ilustraes no texto
Gilberto Orengo e Lucas Rodrigues dos Santos
Reviso
CCCC DDDD HHHH
Impresso
Grfica ZZZZZZZZ
(55) xxxx.xxxx
Santa MariaRS
Site do Livro
http://www.orengonline.com/fortran95/
[2007]
Espao reservado Editora
Todos os direitos desta edio reservados ..
CDD-ZZZ.ZZ
SUMRIO
Apresentao
vii
Prefcio
1 CONSIDERAES INICIAIS: Apresentando o Fortran
1.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . .
Um Breve Histrico sobre o Fortran . . . . . . .
O Livro . . . . . . . . . . . . . . . . . . . . . . .
1.2 Os bits e bytes . . . . . . . . . . . . . . . . . . . . . .
1.3 Como Trabalha a Memria do Computador? . . . .
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.5.2 Dados Reais ou de Pontos Flutuantes - REAL
Preciso Simples (Single Precision) . . . . .
Preciso Dupla (Double Precision) . . . . .
1.5.3 Os Nmeros Complexos - COMPLEX . . . . .
1.5.4 Os outros dados: LOGICAL e CHARACTER . .
1.6 A Declarao das Variveis . . . . . . . . . . . . . .
1.7 Os Procedimentos Intrnsecos . . . . . . . . . . . . .
1.7.1 As Funes Matemticas Intrnsecas . . . . .
1.7.2 A Aritmtica com inteiros e reais . . . . . . .
A Atribuio de valor varivel . . . . . . . . . .
As Expresses Aritmticas . . . . . . . . . . . . .
A Aritmtica dos inteiros . . . . . . . . . . . . . .
A Aritmtica dos reais . . . . . . . . . . . . . . . .
A Aritmtica mista: entre inteiros e reais . . . . .
ix
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
3
4
7
9
9
10
10
11
11
11
14
17
17
17
18
18
19
19
20
23
23
25
25
26
27
27
28
iv
SUMRIO
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
41
41
42
42
43
45
46
48
53
3 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
55
55
56
57
57
57
59
59
59
61
63
63
65
65
66
68
69
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
71
72
73
74
75
76
76
77
79
5 AS SUB-ROTINAS E FUNES
5.1 Introduo . . . . . . . . . . . .
Procedimentos Externos .
Procedimentos Internos . .
5.2 As Sub-rotinas SUBROUTINE
5.3 As Funes FUNCTION . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
81
81
81
82
83
84
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Apndices:
A O LATEX e este Livro
A.1 Sobre o texto . . . . . . . . . . . . . . .
A.2 A definio dos tons de cinza . . . . .
A.3 A nota de margem . . . . . . . . . . .
A.4 As notas de observaes no texto . . .
A.5 Os quadros das Instrues Fortran 95
A.6 Os exemplos de programas Fortran 95
A.7 Os mini-sumrios dos Captulos . . .
A.8 As Referncias Bibliogrficas . . . . .
99
99
101
101
103
103
105
106
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
107
107
108
109
109
110
111
112
112
113
115
117
E Glossrio
119
122
ndice Remissivo
125
vi
SUMRIO
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 . . . . . . . . . . . . . . . . . .
Um Breve Histrico sobre o Fortran . . .
O Livro . . . . . . . . . . . . . . . . .
1.2 Os bits e bytes . . . . . . . . . . . . . . .
1.3 Como Trabalha a Memria do Computador? .
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
4
7
9
9
10
10
11
11
11
14
17
17
17
18
18
19
19
20
23
23
25
25
26
27
27
28
28
32
38
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 A so apresentadas algumas linhas de programao LATEX, que foram utilizadas na
elaborao deste livro.
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.
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.
AaBb
AaBb
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
95
fortran
95
fortran
95
Fortran (relativas ao FORTRAN 77), mencionadas antes, daremos nfase a trs: as funes
intrnsecas SELECTED_REAL_KIND e SELECTED_INT_KIND (Cap. 6, na pg. 89), que permitem maior portabilidade entre computadores e compiladores Fortran; a declarao de variveis ALLOCATABLE (Cap. 7, na pg. 93), que habilita a alocao dinmica de memria e;
as Declaraes e Procedimentos do tipo MODULE (no Cap. 8, na pg. 99) que, entre outras
funes, substitui com primazia os confusos e perigosos COMMON. 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. Eles 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, tambm, sempre que
estiverem usando um compilador[2] 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[3] , pela comunidade de Software Livre e pode ser obtido gratuitamente no site
http://www.g95.org, para diferentes plataformas e sistemas operacionais. Uma lista de compiladores Fortran encontrada no Apndice B.
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.
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
[2] 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 8.
[3] Informaes a respeito da licena GNU podem ser obtidas em http://www.fsf.org/.
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[4] ? 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
As 26 letras maisculas:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
As 26 letras maisculas:
abcdefghijklmnopqrstuvwxyz
Os dez dgitos:
0123456789
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.
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
c , por exemplo, poder ser de 32 bits (4 Bytes). Isto
ser importante mais adiante.
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[5] 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. Como exemplo de compiladores comerciais que habilitam a vetorizao temos, entre outros, o LaheyFujitsu 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.
[5] CPU:
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).
Quando os computadores so ligados, cada localizao de memria conter algum tipo
de valor, e neste caso os valores sero aleatrios (randmicos). Em geral, os valores sero
os que permanecem na memria do uso anterior. Por esta razo, muito importante inicializar as localizaes de memria antes de comear qualquer manipulao da mesma como
clculos, declarao de variveis, etc.
Todas as CPU tem um conjunto de instrues (ou linguagem prpria da mquina) para
sua manipulao. De maneira geral, todos os programas Fortran 95 so convertidos (ou compilados) para o conjunto de instrues (ou linguagem de mquina). Grosseiramente falando,
todos os processadores tm o mesmos tipos de instrues. Assim, a CPU pode dizer coisas
como, busque o contedo da rea de memria 3F2C ou escreva este valor na localizao
(rea) de memria 3F2A. Esta basicamente a maneira de como os programas trabalham.
Considere a seguinte seqencia de instrues em cdigo assembler:
LDA 3F2C carregue (ou busque) os contedos de 3F2C
ADD 3F29 adicione estes contedos em 3F29
STO 3F2A armazene o valor resultante na localizao 3F2A
Esta seqencia de instrues, que tem significado somente ilustrativo para os nossos
propsitos, efetivamente adiciona dois nmeros e armazena o resultado numa rea de memria diferente. At 1954, quando o primeiro dialeto da linguagem Fortran foi desenvolvido, todos os programas de computador eram escritos usando o cdigo assembler. Foi John Backus
e sua equipe, ento trabalhando na IBM, que props e desenvolveu um mtodo econmico
e eficiente de programar. A idia foi de projetar uma linguagem que possibilitasse expressar
frmulas matemticas de uma maneira mais natural do que na poca era feito somente com a
linguagem assembler. Do resultado de suas primeiras tentativas surgiu o FORTRAN (forma
abreviada para IBM Mathematical FORmula TRANslation System).
Esta nova linguagem possibilitou que as instrues acima fossem escritas de maneira
menos criptografada, como por exemplo:
K =I +J.
Um compilador tem a tarefa de converter um procedimento,
como o da expresso acima, em instrues de cdigo assembler. Um
esquema apresentado ao lado. Um compilador Fortran evocado
por uma palavra chave, que depende de compilador para compilador.
Ao compilar anexado ao cdigo, entre outras coisas, instrues matemticas, entrada de dados via teclado e sada de resultados (dados)
via monitor, por exemplo. Os arquivos executveis so especficos
para cada processador e/ou sistema operacional, i.e., cdigo compilado num computador com 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.
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. Exemplo de uso est descrito adiante, na pgina 12. Veremos a seguir como criar e executar o primeiro
programa em Fortran.
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
10
As 26 letras maisculas:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
As 26 letras maisculas:
abcdefghijklmnopqrstuvwxyz
Os dez dgitos:
0123456789
Em Fortram as letras maisculas so equivalentes as correspondentes minsculas, exceto quando estiverem relacionadas com as declaraes do tipo CHARACTER, que ser estudado na seo 1.5.4, na pgina 19. Isto , para o Fortran os nomes TESTE, teste, Teste e
TeStE so equivalentes no h distino entre maisculas e minsculas.
O caracter ponto-e-vrgula (;) pode ser usado para separar duas ou mais instrues
numa mesma linha, como por exemplo:
READ(*,*) x; WRITE(*,*) A saida eh:
que significa, respectivamente, leitura via teclado de um valor para armazenar na varivel x e, escrita da frase A saida eh: , que est entre as aspas. Ambas instrues sero
estudadas no Captulo 2. Outros exemplos:
a = 23 ; b = 150 ; c = 23.76
que significa, atribuio de valores s variveis a, b e c. A atribuio de valores s
variveis ser estudada na pgina 25.
11
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
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 48.
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 que o seguinte: todos os procedimentos realizados por um programa (ou cdigo computacional), como por exemplo clculos de expresses matemticas, precisam ser
mostrados 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.
12
13
Para alterar o nome do arquivo executvel possvel utilizar uma opo do compilador,
a -o seguida do nome que se deseja para o executvel. Assim, temos para o exemplo
acima:
g95 -o nome_de_saida nome_programa.f90
O nome de sada, no caso do Linux, pode ser acrescido de uma extenso ou no. Para
o Windows necessrio acrescentar a extenso EXE, 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 via teclado e sada de resultados (dados) via monitor, por
exemplo. Os arquivos executveis so especficos para cada processador e/ou sistema
operacional, i.e., cdigo compilado num computador com 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. 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.
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
14
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
imprime o valor do cosseno do ngulo. Todo o procedimento foi executado em preciso
simples, que veremos na pgina 18. A numerao a esquerda no faz parte do cdigo e
a sua utilizao para melhor explicar cada linha do cdigo (ou programa). Esta ser uma
prtica daqui para frente. Lembre-se que ainda ters contato com todos os elementos Fortran,
portanto, se no compreender alguma descrio ela ser tratada ao longo do livro.
Programa 1.2 Exemplo de programa que converte ngulos em graus para radianos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
PROGRAM graus_to_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/90.0 ! Aqui ocorre a conversao
WRITE(*,*) O angulo ,theta,, em graus, vale,&
ang_rad, radianos
WRITE(*,*) cos(theta) = ,COS(ang_rad)
END PROGRAM graus_to_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 11,
devemos ter cuidado ao nomear um programa. O nome de um programa Fortran 95
poder ter at 31 caracteres e iniciar sempre com uma letra do alfabeto, poder conter
letras, algarismos e o caracter trao baixo ou underscore ( _ ), que poder ser utilizado
aps a primeira letra.
Reiterando, embora seja opcional, uma boa prtica de programao colocar a instruo
PROGRAM (sempre na primeira linha) seguido de um nome.
15
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 contedo 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.
fortran
95
fortran
95
fortran
95
16
fortran
95
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 25), 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_to_rad, devemos encerrar obrigatoriamente com a instruo END seguido de PROGRAM graus_to_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 GLOBAL DAS VARIVEIS, que um conjunto de instrues no-executveis que definem as variveis que sero utilizadas ao longo do programa. Os sub-programas tem acesso as variveis declaradas nesta etapa.
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.
17
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.
COMPLEXOS: nmeros do plano complexo, que possuem uma parte imaginria (que
representada por um nmero real) e uma parte real (Na pgina 19).
LGICOS: so dados que assumiro somente um valor: verdadeiro ou falso (Na pg. 19).
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
18
A grande parte dos computadores usam como preciso simples 4 Bytes (32 bits) 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.
19
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
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 25tabela 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[11] . 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 6, na pgina 89. 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 55. Os valores so: .TRUE.
(Verdadeiro) e .FALSE. (Falso).
fortran
95
20
1.6
A DECLARAO DAS VARIVEIS
Em Fortran, todas as variveis que armazenaro os dados devem ser declaradas. So
cinco os tipos de dados intrnsecos, trs numricos: INTEGER, REAL, COMPLEX, e dois nonumricos: 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.
Todos 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 dados 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 18.
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 D.1, no Apndice D, 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
21
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 seguir so apresentados exemplos de declaraes num programa Fortran:
Programa 1.3 Exemplo de programa que converte ngulos em graus para radianos.
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 71. 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
fortran
95
22
fortran
95
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 7, na pgina 93.
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
escrita como segue
REAL(8) :: dupla
A declarao da linha 10 ser considerada obsoleta em breve. importante, ento,
substitu-la por
REAL(KIND=8) :: dupla
que tem o mesmo significado.
Na declarao da linha 11 o atributo LEN=10 indica o tamanho que o caracter pode
assumir. Aqui tambm pode ser omitido a palavra-chave LEN= sem perda de significado,
exemplificado na linha seguinte. Por curiosidade, a palavra-chave LEN vem da palavra em
ingls length que significa comprimento.
Ser tratado mais adiante, mas j introduziremos aqui o conceito de atribuio. Para
atribuir um valor a uma varivel se faz por intermdio do sinal de igual (=), apresentada em
algumas das declaraes acima. Mas importante ressaltar que o significado do smbolo de
igualdade nada tem a ver com o do usado na Matemtica. Vejamos o porqu. Seja a seguinte
parte de um cdigo computacional,
INTEGER :: a
a = 34
Aqui a varivel a recebeu o valor igual a 34, isto , foi atribudo a ela (para armazenar
na memria) o valor 34. Esta interpretao importante porque poderemos ter o seguinte
caso:
INTEGER :: b
b = 2
b = 1 + b
em que, inicialmente a varivel b recebe o valor 2, e numa instruo posterior receber
um valor que depender do seu valor anterior. Ou seja, o novo valor ser o anterior somado
de 1. E esta uma prtica muito utilizada em programao. Pelo ponto de vista matemtico
teramos um erro, pois o resultado final seria 0 = 1, que um absurdo. Mas do ponto
de vista computacional temos que o primeiro passo resolver a expresso do lado direito
da igualdade e aps atribuir o resultado para a varivel do lado esquerdo da igualdade,
que a reter na memria do computador at que, posteriomente, seja alterada se assim for
necessrio e possvel.
23
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, qua 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 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.
H funes intrnsecas que determinam relaes entre Inteiros, Reais e Complexos, descritas na tabela 1.2 (pg. 25), que tambm sero importantes no decorrer do livro.
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)
Na sequncia, um cdigo apresentado, o qual exemplifica do uso de funes intrnsecas do Fortran. Foram utilizadas duas funes, o COS, que fornece o cosseno do ngulo
(dado em radianos) e, a funo ABS, que retm o sinal de um nmero inteiro ou real, isto ,
fornece o valor numrico sem o sinal, conhecido como absoluto do nmero.
24
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
fx = f*COS(theta)
modulo = ABS(fx)
WRITE(*,*)"A Forca no eixo x, em modulo, eh: ", modulo
END PROGRAM uso_funcoes
25
Argumento
Funo
REAL(x)
I RD C
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
26
teramos um erro, pois o resultado final seria 0 = 5, que um absurdo. Mas do ponto de
vista computacional temos que o primeiro passo resolver a expresso do lado direito da
igualdade, que igual a 11, e aps atribuir o resultado para a varivel do lado esquerdo da
igualdade, que o reter na memria do computador.
AS EXPRESSES ARITMTICAS
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 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
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 na pgina 28.
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 (**) 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.
27
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. Aqui os nmeros reais so tratados com
ponto decimal e no com a vrgula, como estamos habituados no dia-a-dia.
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)
28
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. De novo, 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 isto 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.
Finalmente, um ltimo cuidado e no tem nada a ver com operaes mistas. 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 (, , , ...).
29
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).
Algumas funes para manipular caracteres so descritas a seguir.
LEN(x) = retorna o nmero (inteiro) de caracteres que compem um conjunto de caracteres (palavra ou string), em que x uma palavra escrita entre aspas (simples ou
dupla).
Exemplo: LEN(mae) resultado = 3.
Exemplo de uso em um programa:
Programa 1.5 O uso da funo LEN.
1
2
3
4
5
6
7
8
PROGRAM uso_len
IMPLICIT NONE
CHARACTER :: 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
30
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.8 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
31
Podemos comparar caracteres da tabela ASCII. A comparao ser utilizando as operaes lgicas de maior (>) e menor (<), por exemplo:
A > a = Falso (ou .FALSE.)
a > A = Verdadeiro (ou .TRUE.)
AAa > AAb = Falso (ou .FALSE.)
i > 9 = Verdadeiro (ou .TRUE.)
* > ) = Verdadeiro (ou .TRUE.)
Isto possvel porque na tabela ASCII os caracteres so conhecidos pelas suas posies
numricas (inteiros). Assim, por exemplo, todas as letras maisculas vem antes das
minsuculas, portanto as maisculas possuem um nmero de referncia menor do que
as minsculas.
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
32
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.
... 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.11 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
[12] 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.
33
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.
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.12 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
34
ou seja,
j
X
1
n
n vezes a tg
+e
en
n=1
!
,
132
133
134
135
136
137
138
320
PROGRAM teste_erro
IMPLICIT NONE
INTEGER :: i, j, m
REAL :: x, y, z, final
REAL, PARAMETER : pi=3.14159265
DO i = 1,200
x = 1./EXP(i) + EXP(i)
y = y + x
z = TAN(y)
theta = (y*180.0)/pi ! Converte p/graus
END DO
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)
35
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
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
36
do loop DO, que ser estudado no Captulo 3, na pgina 55. 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.
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 do 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
O
O
O
O
resultado
resultado
resultado
resultado
resultado
resultado
resultado
resultado
resultado
resultado
resultado
da
da
da
da
da
da
da
da
da
da
da
tangente
tangente
tangente
tangente
tangente
tangente
tangente
tangente
tangente
tangente
tangente
de
de
de
de
de
de
de
de
de
de
de
37
132
133
134
135
136
137
138
139
140
320
PROGRAM teste_erro
IMPLICIT NONE
INTEGER :: i, j, m
REAL :: x, y, z, theta
REAL, PARAMETER :: pi=3.14159265
=
=
DO i = 1,200
x = 1./EXP(REAL(i)) + EXP(REAL(i))
=
y = y + x
z = TAN(y)
theta = (y*180.0)/pi ! Converte p/graus
WRITE(*,*)"O resultado da tangente de ",theta,&
"eh: ", z, "(No loop: ", i, ")"
END DO
WRITE(*,*) theta,z ! Soh para fins didaticos
END PROGRAM teste_erro
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 pedidos no
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.
Para reflexo !!
S existem duas coisas infinitas: o universo e a estupidez
humana. E no estou muito seguro da primeira.
Albert Einstein
1879 1955
38
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.
y = 6.
+5.*4.+10./8.
+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.
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
39
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
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
40
1.7) Escreva um programa em Fortran 95 que calcule o pagamento semanal de empregados horistas. O programa dever perguntar ao usurio o valor paga por hora (por
funcionrio) e o nmero de horas trabalhada na semana. O clculo deve se basear na
seguinte expresso
Total Pago = Valor da Hora Horas Trabalhadas
(1.1)
Finalmente, voc dever mostrar o valor pago total. Teste seu programa calculando o
valor pago semanalmente para uma pessoa que ganha R$ 7, 50 por hora e trabalha 39
horas.
1.8) A distncia entre dois pontos (x1 , y1 ) e (x2 , y2 ) no plano Cartesiano dado pela equao
p
d = (x1 x2 )2 + (y1 y2 )2
(1.2)
Escreva um programa em Fortran 90/95 para calcular a distncia entre quaisquer dois
pontos (x1 , y1 ) e (x2 , y2 ) especificados pelo usurio. Use boas prticas de programao
no seu programa. Calcule a distncia entre os pontos (2,3) e (8,-5).
1.9) Desenvolva um programa que fornecido, pelo usurio, um nmero entre 1000 e 9999,
separe e escreva os valores referentes ao milhar, a centena, a dezena e a unidade. Exemplo: no caso do nmero 7452, milhar: 7000; centena: 400; dezena: 50 e a unidade: 2.
1.10) O aumento dos funcionrios de uma fbrica calculado com base em 80% do IGP-M
acumulado no ano (ndice Geral de Preos do Mercado, da Fundao Getlio Vargas
FGV). Faa um programa que leia o nmero do funcionrio, o valor do IGP-M e o
salrio atual do funcionrio. A seguir calcule o aumento e o novo salrio. Escreva o
nmero do funcionrio, o aumento e o novo salrio. (Obs.: use os seguintes nomes s
variveis: nmero do funcionrio = nf; IGP-M = igpm; aumento do salrio = as; salrio atual =
satual; novo salrio = ns.)
1.11) O custo final ao consumidor de um carro novo a soma do custo de fbrica com a percentagem do distribuidor e dos impostos (aplicados ao custo de fbrica). Supondo que
a percentagem do distribuidor seja de 28% e os impostos de 45%, escreva um programa
que leia o custo de fbrica de um carro e escreva o custo final ao consumidor. (Obs.:
1) Use os seguintes nomes s variveis: custo de fbrica = cf; custo final ao consumidor = cfc;
percentagem do distribuidor = pd; impostos = pi. 2) Construa o programa com o mximo de
informaes ao usurio)
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 + )
REFERNCIAS BIBLIOGRFICAS
42
REFERNCIAS BIBLIOGRFICAS
NDICE REMISSIVO
A
Inteiros, Reais, 25
ADVANCE, 43
WRITE, 43
ALLOCATABLE, 93, 94
ALLOCATED, 95
Alocao de Memria, 7
Alocao de Memria Automtica, 84
Alocao Dinmica de Memria, 93, 94
ALLOCATABLE, 93, 94
Alocao Esttica de Memria, 94
Aritmtica, 25
Arquivos
CLOSE, 43
OPEN, 43
READ, 43
WRITE, 43
formatao livre, 42
lista-direta, 42
Leitura do tipo CHARACTER, 45
Array, 96
Quando us-la?, 96
ASCII, 6
Assembler, Cdigo, 8
CLOSE, 47
COMMON, 99
Compartilhamento de Memria, 99
Compartilhamento de Memria, 99
Compilador, 6, 8
g95, 4
Lahey, 6
PGHPF, 6
Complexos, Nmeros, 19
CONTAINS, 102
CPU, 6
Cray, Supercomputador, 19
D
Dados Lgicos, 19
LOGICAL, 19
Declarao de Dados, 20
Dgito binrio, 5
E
Entrada/Sada de dados, I/O, 41
Executvel, Arquivo, 12
Expoente, 18
Bit, 5
Byte, 5
GByte, 5
KByte, 5
MByte, 5
TByte, 5
FORMAT, 48
Notao cientfica, 49
Potncia de dez, 49
Formatao livre, 42
Fortran 90/95, 6
Lahey, 6
PGHPF, 6
FORTRAN, Significado, 8
Funes, 84
Definida-Usurio, 84
FUNCTION, 84
C
CALL, 84
Caracteres, 19
CHARACTER, 19
44
NDICE REMISSIVO
g95compilador, 4, 6
Ponto Flutuante, 17
Reais, 17
Preciso Dupla, 18
Preciso Simples, 18
PRIVATE, 105
Procedimentos, 81
Externos, 81
Funes (FUNCTION), 84
Internos, 82
Sub-rotinas (SUBROUTINE), 83
Processamento Paralelo, 6
g95, 6
Vetorizao, 6
Programa Principal, 9
PUBLIC, 105
H
Hexadecimal, 7
I
IMPLICIT NONE, 15
Input/Output, 41
I/O, 41
INTEGER, 17
Inteiros, 17
INTENT
INOUT, 104
IN, 104
OUT, 104
Interfaces, 103
Explcitas, 103
Implcitas, 104
J
John Backus, 8
R
READ, 43
Leitura do tipo CHARACTER, 45
Reais, 17
Pontos Flutuantes , 17
REAL, 17
RETURN, 83
K
KIND, 89
L
LATEX, 1
Linux/GNU, 12
Lista-direta, 42
M
Mantissa, 18
MegaFlops, 6
MODULE, 99, 101
Declarao, 99
Procedimentos, 103
Mdulos, 99
O
Objeto, Cdigo, 12
OPEN
CLOSE, 47
OPEN, 45
S
SAVE, 102
SELECTED_INT_KIND, 92
SELECTED_REAL_KIND, 19
SELECTED_REAL_KIND, 91
Subprograma, 81
SUBROUTINE, 83
U
Unicode, 6
Unidade lgica, 41
USE, 102
V
Vetorizao, 6
Processamento Paralelo, 6
W
WRITE, 42
ADVANCE, 43