Você está na página 1de 61

Introduo ao Fortran 90

CENAPAD-SP

NDICE
INTRODUO 1-HISTRIA 2-FORTRAN 77 3-FORTRAN 90 ELEMENTOS DO FORTRAN 90 4-EXEMPLO DE PROGRAMA 5-RECOMENDAES DE CODIFICAO 6-CARACTERSTICAS DE CODIFICAO 7-REGRAS DE CODIFICAO 8-COMPILAO NO AMBIENTE CENAPAD-SP 9-EXERCCIO 1- Compilao e Execuo 10-EXERCCIO 2- Reestruturao de programa 11-ESTRUTURA DE PROGRAMAS 12-TIPOS DE DADOS 13-CONSTANTES 14-TIPO IMPLCITO 15-DECLARAO NUMRICA E LGICA 16 - DECLARAO CARACTERE 17-DECLARAO DE CONSTANTES 18-INICIALIZAO DE VARIVEIS 19-EXERCCIO 3 - Declarao de Variveis 20-EXPRESSES 21-Operador de ATRIBUIO 22-Operadores NUMRICOS 23-Operadores RELACIONAIS 24-Operadores LGICOS 25-Operador CARACTERE 26-Precedncia de Operadores 27-EXERCCIO 4 Expresses CONSTRUES DE CONTROLE DE EXECUO 28-COMANDOS DE CONTROLE DE FLUXO 29-Comando IF 30-Comando IF...THEN...END IF 31-Comando IF...THEN...ELSE...END IF 32-Comando IF...THEN...ELSEIF...END IF 33-Comando IF...THEN...ELSEIF...END IF Identificado 34-EXERCCIO 5 - Comando IF 35-Comando DOEXIT-END DO LOOP Condicional 36-Comando DOCYCLE-EXIT-END DO LOOP Cclico Condicional 37-LOOPs Identificados 38-Comando DO-WHILE 39-Comando DO iterativo 40-Comando SELECT-CASE 41-DIVISO POR INTEIROS 42-EXERCCIO 6 SELECT CASE 43-PROCEDIMENTOS INTRNSICOS 44-Funes de CONVERSO 45-Funes MATEMTICAS

3
46-Funes NUMRICAS 47-Funes CARACTERES 48-EXERCCIO 7 Funes Matemticas 49-Comando PRINT 50-Comando READ MATRIZES 51-DEFINIO DE MATRIZES 52-DECLARAO DE MATRIZES 53-SNTAXE DE MATRIZES 54-SECES DE MATRIZES 55-IMPRESSO E LEITURA DE MATRIZES 56-FUNES DE MATRIZES 57-ALOCAO DE MATRIZES 58-EXERCCIO 8 DEFINIO DE MATRIZES 59-EXERCCIO 9 FUNES DE MATRIZES 60-EXERCCIO 10 USO DE MATRIZES SECES PRINCIPAIS DE PROGRAMAS 61-SECES DE UM PROGRAMA FORTRAN 62-PROGRAMA PRINCIPAL 63-PROCEDIMENTOS 64-Procedimentos: SUBROUTINE 65-Procedimentos: FUNCTION 66-EXERCCIO 11 SUBROTINA 67-EXERCCIO 12 FUNO 68-EXERCCIO 13 PROCEDIMENTOS 66-EXERCCIO 11 SUBROTINA 67-EXERCCIO 12 FUNO 68-EXERCCIO 13 PROCEDIMENTOS 69-SECO DE PROGRAMA: MODULE 70-EXERCCIO 14 DEFINIO DE UM MDULO 71-EXERCCIO 15 USO DE UM MDULO ENTRADA E SADA 72-ENTRADA / SADA 73-Comando OPEN 74-Comando READ 75-Comando WRITE 76-Comando FORMAT/FMT= 77-Descritores de Formatos 78-Outros comandos de I/O 79-Comando DATA 80-EXERCICIOS 15 I/O 81-EXERCICIOS 16 FORMATAO 82-REFERNCIAS

4 1-HISTRIA

IBM Mathematical FORmula TRANslation System;

Elaborado especficamente para aplicaes cientficas;

Primeiro compilador considerado High-Level Idealizado por John Backus 1957;

Primeiro Padro Comercivel em 1972: Fortran 66; Houve diversas verses de compiladores, similares ao Fortran, durante a decada de 60 o que forou a necessidade de se padronizar o software.

Atualizado em 1980 Fortran 77; Verso amplamente divulgada e utilizada no mundo inteiro pelas reas cientficas.

Atualizado em 1991 ~ 12 anos Fortran 90; O palnejamento para a atualizao do Fortran iniciou-se no incio da dcada de 80, mas seu desenvolvimento levou muito tempo devido ao compromisso de manter o Fortran como uma das linguagens cientficas mais eficientes, superior ao PASCAL, ADA e ALGOL. Os recursos existentes no Fortran 90 se equiparam aos existentes no C (Alocao dinmica de memria, apontadores e orientao ao objeto).

High Performance Fortran HPF Fortran 90 para ambientes com memria distribuida;

Atualmente Fortran 95;

Padronizado por ANSI X3 e ISO/IEC JTC1/SC22/WG5

2-FORTRAN 77

O Fortran77 est muito obsoleto em relao s linguagens atuais e aos recursos existentes

Formato fixo: Linhas da posio 7 a 72; Somente letras maisculas; Nomes at 6 caracteres.

Impossibilidade de representar operaes paralelas intrnsicas; uma situao crtica, pois o Fortran considerado com uma linguagem de alta performance, no entanto, at o padro 77 no existia nenhuma instruo que permitisse o paralelismo, como compatilhamento de endereos dememria.

No possvel a alocao de memria dinmica; No Fortran77, o programador obrigado a declarar vetores com o maior tamanho possvel para reservar memria durante a compilao.

No possui representao numrica portvel; A preciso de campos numricos variava de uma mquina para outra, tornando o cdigo no portvel.

No possui definio de tipo de dado pelo programador; No possvel criar novos formatos a prtir dos existentes.

No possui recurso explcita; No possvel chamar uma funo dentro de outra funo.

6 3-FORTRAN 90

Formato livre: 132 caracteres por linha; Maisculas e minsculas; Nomes at 31 caracteres.

Definio de ARRAYS paralelos; Novos recursos na definio de um ARRAY, permitem particionar vetores por entre vrios processos que compartilham um ambiente de memria compartilhada.

Alocao de memria dinmica e apontadores;

Definio de tipo de dados (Comando KIND);

Recursividade

Alm dos recursos descritos acima, vrios outros, melhoraram o Fortran tornando-o mais atual aos recursos existente em outras linguagems:

Controles de estruturas: o o o DO...ENDDO DO...WHILE SELECT CASE

Subistituio de comandos: o o COMMON blocks MODULE EQUIVALENCE TRANSFER

Novos comandos: o IMPLICIT NONE

7 4-EXEMPLO DE PROGRAMA

MODULE Triangle_Operations IMPLICIT NONE CONTAINS FUNCTION Area(x,y,z) REAL :: Area ! function type REAL, INTENT( IN ) :: x, y, z REAL :: theta, height theta = ACOS((x**2+y**2-z**2)/(2.0*x*y)) height = x*SIN(theta); Area = 0.5*y*height END FUNCTION Area END MODULE Triangle_Operations

PROGRAM Triangle USE Triangle_Operations IMPLICIT NONE REAL :: a, b, c, Area PRINT *, 'Welcome, please enter the& &lengths of the 3 sides.' READ *, a, b, c PRINT *, 'Triangle''s area: ', Area(a,b,c) END PROGRAM Triangle

8 5-RECOMENDAES DE CODIFICAO

Sempre utilize o comando IMPLICT NONE;

Comandos, funes intrnsicas e as definidas pelo programador, devem se colocadas em maisculas; OBS: No obrigatrio! Apenas uma recomendao.

Variveis e constantes em minsculas; OBS: No obrigatrio! Apenas uma recomendao.

Cada comando deve ser posto numa linha

Codifique com recuos;

Acrescente comentrios s linhas.

9 6-CARACTERSTICAS DE CODIFICAO

132 caracteres por linha;

Alfanumrico: a-z, A-Z, 0-9, _

! Caracter de incio de comentrio;

& Caracter de continuao de linha;

; Caracter de separao de comandos;

Smbolos aritimticos: + Adio - Subtrao * Multiplicao / Diviso ** Exponenciao

10 7-REGRAS DE CODIFICAO

Brancos no so permitidos:

Palavras-chave

INTEGER :: nome1 INT EGER :: nome1

Certo Errado

Nomes

REAL :: valor_total REAL :: valor total

Certo Errado

Brancos so permitidos:

Entre palavras-chave

Entre nomes e palavras-chave

INTEGER FUNCTION val(x) INTEGERFUNCTION val(x) INTEGER FUNCTIONval(x)

Certo Errado Errado

Nomes de variveis e rotinas:


Podem ter at 31 caracteres Devem comear com letra

REAL :: a1 REAL :: 1a

Certo Errrado

Podem continuar com letras, digitos ou _

CHARACTER :: atoz CHARACTER :: a-z CHARACTER :: a_z

Certo Errado Certo

11 8-COMPILAO NO AMBIENTE CENAPAD-SP

Ambiente IBM/AIX
Fortran77: xlf, f77, fort77, g77 Fortran90: xlf90, f90 Fortran95: xlf95

extenso: .f , .F extenso: .f , .f90 extenso: .f , .f95

Na verdade o compilador um s (xlf) , mas com vrios scripts de execuo que possuem as opes de como o compilador deve ser executado, como: qlanglvl= qsuffix= qfree=yes/no Padro de Fortran Sufixo dos programas Tipode formatao

Ambiente INTEL/Linux
Fortran77 e 90: ifort

extenso: .f , .F , .f90

Opes bsicas de compilao: -o -O, -O1, -O2, -O3 -c -g -L<path> -l<biblioteca> -q32 -q64 Nome do executvel (Default: a.out); Otimizao do cdigo; No gera executvel; Gera informaes para depurao; Localizao da biblioteca para linkedio; Nome da biblioteca; Cdigo para 32bits (somente para AIX); Cdigo para 64bits (somente para AIX);

Exemplos de compilaes: xlf prog1.f -o prog xlf90 cofigo.f -o teste -O3 xlf90 cena.f -c -L/usr/lib/scalapack ifort salto.f -o salto -O3 -L/home/kusel -lbib1.a ifort parceiro.f -o par -g -O

12 9-EXERCCIO 1- Compilao e Execuo


1 Caminhe para o diretrio ~/curso/fortran/ex1.Utilizando um editor de texto, edite o programa abaixo e salve-o com o nome quadsol.f % cd ~/curso/fortran/ex1 % vi quadsol.f OBS: Pode ser o editor pico ou emacs PROGRAM QES IMPLICIT NONE INTEGER :: a, b, c, D REAL :: Part_Real, Part_imag PRINT*, ''Entre com os valores de a, b, c'' READ*, a, b, c IF (a /= 0) THEN D = b*b - 4*a*c IF (D == 0) THEN PRINT*, ''Raiz '', -b/(2.0*a) ELSE IF (D > 0) THEN PRINT*, ''Raizes so '',(-b+SQRT(REAL(D)))/(2.0*a),& ''e '', (-b-SQRT(REAL(D)))/(2.0*a) ELSE Part_Real = -b/(2.0*a) Part_Imag = (SQRT(REAL(-D))/(2.0*a)) PRINT*, ''1a. Raiz'', Prat_Real, ''+'', Part_Imag, ''i'' PRINT*, ''2a. Raiz'', Part_Real, ''-'', Part_Imag, ''i'' END IF ELSE PRINT*, ''No uma equao quadrtica'' END IF END PROGRAM QES

! Calculo do discriminante ! one raiz ! raizes reais

! raizes complexas

! a == 0

2. Compile e execute o programa. Verifique se ele executa corretamente para os valores abaixo: % xlf90 quadsol.f o quadsol O3 % ./quadsol (a) a = 1 b = -3 c = 2 (b) a = 1 b = -2 c = 1 (c) a = 1 b = 1 c = 1 (d) a = 0 b = 2 c = 3 3. Copie quadSol.f para novoquadsol.f. % cp quadsol.f novoquadsol.f 4. Edite esse novo arquivo e declare uma nova varivel real de nome parte2a. 5. Na seo executvel do cdigo, defina a nova varivel igual ao valor de 1/(2.0*a). parte2a=1/(2.0*a) 6. Aonde aparecer a expresso 1/(2.0*a), substitua pela nova varivel. Voce acha que isso uma boa idia? 7. Defina uma nova varivel real raizd, que assuma o valor de SQRT(REAL(D)) e substitua aonde for apropriado. Compile e execute o novo programa.

13 10-EXERCCIO 2- Reestruturao de programa


1 Caminhe para o diretrio ~/curso/fortran/ex2. Reescreva o programa basic_reform.f de uma maneira que fique mais compreensvel.

14

11-ESTRUTURA DE PROGRAMAS
O Fortran possui algumas regras bem definidas para ordem dos comandos:

1. Cabealho de definio: PROGRAM, FUNCTION, SUBROUTINE, MODULE ou BLOCK DATA; S pode haver um nico comando PROGRAM. Pode haver mais de um FUNCTION, SUBROUTINE e MODULE. S pode haver um nico BLOCK DATA

2.

Comandos de Declarao: REAL, INTEGER, IMPLICIT, PARAMETER, DATA;

3.

Comandos de Execuo: IF-ENDIF, DO-ENDDO, comando de atribuio;

4. Finalizao do programa com o comando END;

12-TIPOS DE DADOS
Todo tipo de dado possui um nome, um conjunto vlido de valores, um significado dos valores e um conjunto de operadores.

Dado Caracter CHARACTER :: sex CHARACTER(LEN=12) :: nome

Dado Boolean LOGICAL :: w

Dado Numrico REAL :: alt DOUBLE PRECISION :: pi INTEGER :: id

15 13-CONSTANTES

Constante um objeto com valor fixo 12345 -6.6E-06 .FALSE. Curso Fortran Nmero Inteiro Nmero Real Valor Lgico Caractere

Observaes:

Nmeros Reais possuem ponto decimal ou o smbolo de expoente; Nmero Inteiros no possuem ponto decimal e so representados por uma seqncia de dgitos com o sinal + ou -; S existem dois valores Lgicos: .FALSE. e .TRUE.; Valores caracteres so delimitados por ou

14-TIPO IMPLCITO
Variveis no declaradas possuem um tipo implcito de dado:

Se a primeira letra da varivel comear por I, J, K, L, M ou N, ser definida como Inteiro; Qualquer outra letra, ser do tipo Real;

Tipo de dado implcito potencialmente perigoso e deve ser evitado com a declarao: IMPLICIT NONE

Exemplo de problema ocorrido no Fortran77: DO 30 I = 1.1000 ... 30 CONTINUE

16 15-DECLARAO NUMRICA E LGICA

Com o comando IMPLICIT NONE, todas as variveis devem ser declaradas, da forma:

<tipo> [, <lista de atributos>] :: <lista de variveis> [=<valor>]

Em Fortran90 pode se definir atributos quando se declara uma varivel.

Lista de atributos

PARAMETER, DIMENSION; No obrigatrio, a menos que se especifique um atributo;

::
Exemplos:

REAL INTEGER LOGICAL REAL, DIMENSION(10,10) INTEGER

:: x :: i, j :: ptr :: y, z :: k=4

16 - DECLARAO CARACTERE
As declaraes de caracteres so similares as declaraes numricas. Pode se declarar um caractere ou um conjunto de caracteres:

<tipo>[(LEN=<tamanho>)] [, <lista de atributos>] :: <lista de variveis> [=<valor>]

Exemplos:

CHARACTER(LEN=10) :: nome CAHARCTER :: sexo CHARACTER(LEN=32) :: str CHARACTER(LEN=10), DIMENSION(10,10)

:: vetor

17 17-DECLARAO DE CONSTANTES
Um valor constante, conhecido como parmetro, pode ser definido pelos comandos de declarao utilizando o atributo PARAMETER ou pelo prprio comando PARAMETER;

Exemplos:

INTEGER pre PARAMETER (pre=252) REAL, PARAMETER :: pi=3.14159

Fortran77 Fortran77 Fortran90 Fortran90

CHARACTER(LEN=*), PARAMETER :: n1=Paulo, n2=Francisco

Valores caracteres podem assumir o seu prprio tamanho utilizando-se (LEN=*); recomendado que se use a forma padro do Fortran90, com atributos; O atributo PARAMETER deve ser usado, quando se tiver certeza que a varivel s poder assumir um nico valor.

18-INICIALIZAO DE VARIVEIS
Pode-se atribuir um valor inicial a uma varivel e altera-la no decorrer da execuo do programa.

Exemplos: REAL INTEGER CHARACTER(LEN=5) LOGICAL REAL, PARAMETER REAL REAL :: x, y=1.005 :: i=5, j=100 :: luz=Amber :: a=.TRUE., b=.FALSE. :: pi=3.14159 :: radius=3.5 :: circo=2*pi*radius (expresso)

OBS: Em geral, funes no podem ser utilizadas em expresses que inicializam uma varivel.

18 19-EXERCCIO 3 - Declarao de Variveis

1 Caminhe para o diretrio ~/curso/fortran/ex3, crie um programa em fortran90 (variavel.f) que apenas declare as seguintes variveis:

Nome
Pe Milhas Cidade Local Aonde_nasceu Seno_meio

Status Varivel Varivel Varivel Constante Constante Constante

Tipo Inteiro Real Caractere (<= 20 letras) Caractere Lgica Real

Valor Inicial Campinas a sua cidade Natal? Sin(0.5)=0.47942554

19

20-EXPRESSES

Expresses so construdas com pelo menos um operador (Alguns: +, -, *, /, //, **) e com pelo menos um operando.

Exemplos:
X+1 campo//campo A .GT. B Expresso numrica (Adio) Expresso caractere (Concatenao) Expresso lgica

O tipo de uma expresso deriva do tipo dos operandos; Operandos podem ser: expresses, nmeros, caracteres, funes;

21-Operador de ATRIBUIO
Normalmente uma expresso utilizada em conjunto com um operador de atribuio =, que ir definir ou atribuir um valor a um novo objeto.

Exemplos: a=b c = SIN(0.7)*12.7 nome = iniciais//sobrenome logi = (a.EQ.b.OR.c.NE.d)

OBS: Os operandos a esquerda e a direita do sinal de igualdade no necessitam ser do mesmo tipo.

20 22-Operadores NUMRICOS
Exponencial (**)
10**2 a**b

(Avaliado da direita para esquerda)

Multiplicao (*) e Diviso (/)


10*7/4 a*b/c

(Avaliado da esquerda para direita)

Adio (+) e Subtrao (-)


7+8-3 a+b-c

(Avaliado da esquerda para direita)

OBS: Os operandos podem ser variveis, constantes, escalares ou vetores, com exceo do expoente que necessriamente deve ser escalar.

23-Operadores RELACIONAIS
So utilizados em expresses lgicas, entre dois operandos, retornando um valor lgico (.TRUE. ou .FALSE.) :

.GT. .GE. .LE. .LT. .NE. .EQ.

> >= <= < /= ==

Maior que Maior igual Menor igual Menor que No igual a Igual a

Exemplos: a = i .GT. J IF (i .EQ. J) c=d

21 24-Operadores LGICOS
So utilizados em expresses lgicas, com um ou dois operandos, retornando um valor lgico (.TRUE. ou .FALSE.) : .AND. .OR. .NOT. .EQV. .NEQV. .TRUE. Se ambos os operandos forem .TRUE. .TRUE. Se pelo menos um operando for .TRUE. .TRUE. Se o operando for .FALSE. .TRUE. Se os operandos possurem o mesmo valor .TRUE. Se os operandos possurem valores diferentes

Exemplos: Se T=.TRUE. e F=.FALSE. ento T .AND. F .FALSE. T .OR. F .TRUE. T .EQV. F .FALSE. F .AND. F .TRUE. F .OR. F .FALSE. T .NEQV. F .TRUE.

25-Operador CARACTERE
Utilizado para efetuar a concatenao //, somente de variveis caracteres.
Exemplo: CHARACTER(LEN=*), PARAMETER :: string=abcdefgh

string(1:1) a string(2:4) bcd a=string//string(3:5) abcdefghcde b=string(1:1)//string(2:4) abcd

26-Precedncia de Operadores

()

**

*,/

*,-

//

O que vier entre parntesis ser avaliado primeiro; Em expresses aritmticas, com o mesmo nvel de avaliao, o que vier da esquerda para direita, ser avaliado primeirocom exceo do expoente.

Exemplos: (a + b)/c (a*b)/c a/b*c x = a+b/5.0-c**d+1*e diferente de igual a diferente de equivale a a+b/c a*b/c a/(b*c) x=((a+(b/5.0))-(c**d))+(1*e)

22 27-EXERCCIO 4 Expresses
1-Caminhe para o diretrio ~/curso/fortran/ex4. Edite o programa area_circulo.f 2-O programa est incompleto. Acrescente na linha das reticncias o que solicitado. ...Declarao de variveis... ...Expresso para clculo da rea e volume... 3-rea do Crculo: 4-Volume da esfera: area = B r volume = 4 B r 3

5-Compile e execute o programa. Verifique se ele executa corretamente para os valores de 2, 5, 10 e 1

23 28-COMANDOS DE CONTROLE DE FLUXO

Toda linguagem de programao estruturada necessita de artifcios que possibilitem a execuo condicional de comandos. Esses comandos normalmente alteram o fluxo de execuo de um programa.

Comandos de execuo condicional: IF... , IF...THEN...ELSE...END IF

O comando IF analisa uma expresso que, se o resultado for verdadeiro, executa os comando que vierem aps o THEN, se for falso , executa os comandos que vierem aps o ELSE.

Comandos de iterao repetitiva: DO...END DO, DO WHILE...END DO

O comando DO permite a execuo repetitiva de um bloco de comandos.

Comandos de mltipla escolha: SELECT CASE

O comando SELECT permite a execuo de comandos baseado no valor que uma expresso pode ter.

24 29-Comando IF
Determina a execuo de um nico comando se uma condio lgica for verdadeira:

IF (<expresso lgica>) <comando>

Exemplos: IF (I > 17) PRINT*, I > 17

25 30-Comando IF...THEN...END IF
Determina a execuo de um bloco de comandos se uma condio lgica for verdadeira:

IF (<expresso lgica>) THEN <bloco de comandos> ... END IF


Exemplos:

IF (I >17) THEN PRINT *, I >17 END IF

26 31-Comando IF...THEN...ELSE...END IF

Determina a execuo de um bloco de comandos se uma condio lgica for verdadeira ou falsa:

IF (<expresso lgica>) THEN <bloco de comandos> ... [ELSE <bloco de comandos> ...] END IF

Exemplos:

IF (I > 17) THEN PRINT *, I > 17 ELSE PRINT *, I <= 17 END IF

27 32-Comando IF...THEN...ELSEIF...END IF

Determina a execuo recursiva de comandos se uma condio lgica for verdadeira ou falsa em vrios blocos de IFs

IF (<expresso lgica>) THEN <bloco de comando> ... [ELSEIF (<expresso lgica>) THEN <bloco de comandos> ...] [ELSE <bloco de comandos> ...] END IF
Exemplos: IF (I > 17) THEN PRINT *, I > 17 ELSEIF (I == 17) THEN PRINT *, I == 17 ELSE PRINT*, I < 17 END IF

28 33-Comando IF...THEN...ELSEIF...END IF Identificado

Determina a execuo recursiva de comandos se uma condio lgica for verdadeira ou falsa em vrios blocos de IFs identificados por um nome. A identificao dos IFs simplesmente perfumaria com a inteno de apresentar um cdigo mais limpo e claro.

<nome>:

IF (<expresso lgica>) THEN <bloco de comando> [ELSEIF (<expresso lgica>) THEN <nome> <bloco de comandos>] [ELSE <nome> <bloco de comandos>] END IF <nome>

Exemplos: outa: IF (a .NE. 0) THEN PRINT*, a no igual a 0 IF (c .NE. 0) THEN PRINT*,a no igual a 0 e c no igual a 0 ELSE PRINT*,a no igual a 0 mas c igual a 0 END IF ELSEIF (a .GT. 0) THEN outa PRINT*,a maior que 0 ELSE outa PRINT*,a deve ser menor que 0 ENDIF outa

29 34-EXERCCIO 5 - Comando IF
1 Caminhe para o diretrio ~/cursos/Fortran/ex5. Edite o programa triangulo.f

2 Esse programa solicita que se digite trs valores inteiros que podero formar os trs lados de um tringulo Eqiltero, Issceles ou Escaleno, ou no formar um tringulo.

3 Detalhe muito importante para a lgica do programa:

Se trs valores formam um tringulo, ento 2 vezes o maior valor tem que ser menor que a soma de todos os trs valores, ou seja, a seguinte expresso tem que ser verdadeira para que um tringulo exista.

(2*MAX(lado1,lado2,lado3) < lado1+lado2+lado3)

4 Substitua as linhas com reticncias pela lgica de programao que ir determinar que tipo de tringulo ser formado. Analise com ateno o resto do programa para perceber como montar os comandos. Em um determinado instante, a expresso acima ser utilizada.

5 Compile e execute o programa vrias vezes Entre com os seguintes valores: a. b. c. d. e. f. (1,1,1) (2,2,1) (1,1,0) (3,4,5) (3,2,1) (1,2,4)

30 35-Comando DOEXIT-END DO LOOP Condicional

Loop consiste de um bloco de comandos que so executados ciclicamente, infinitamente. necessrio um mecanismo condicional para sair do loop. O bloco de comandos que executado ciclicamente delimitado pelo comando DO...END DO e o comando EXIT determina a saida do loop.

DO ... IF (<expresso lgica>) THEN EXIT ... END DO


Exemplos: i=0 DO i=i+1 IF (i .GT. 100) THEN EXIT PRINT*, I , i END DO PRINT*, Fim do loop. I = , i

36-Comando DOCYCLE-EXIT-END DO LOOP Cclico Condicional

Loop cclico que possui um mecanismo condicional para sair e iniciar o loop, novamente. O comando CYCLE determina, novamente, o incio imediato do loop.

DO ... IF (<expresso lgica>) THEN CYCLE IF (<expresso lgica>) THEN EXIT ... END DO

Exemplos: i=0 DO i=i+1 IF (i >= 50 .AND. I <= 59) THEN CYCLE IF (i .GT. 100) THEN EXIT PRINT*, I , i END DO PRINT*, Fim do loop. I = , i

31

37-LOOPs Identificados

loops recursivos identificados. Exemplo: 1 outa: DO 2 inna: DO 3 ... 4 IF (a .GT. b) THEN EXIT outa ! Pula para linha 10 5 IF (a .EQ. b) THEN CYCLE outa ! Pula para linha 1 6 IF (c .GT. d) THEN EXIT inna ! Pula para linha 9 7 IF (c .EQ. a) THEN CYCLE ! Pula para linha 2 8 END DO inna 9 END DO outa 10 ...

38-Comando DO-WHILE
loops que condiciona a sua execuo antes de executar o bloco de comandos. Faa enquanto. A condio testado no topo do loop. DO WHILE (<expresso lgica>) ... END DO Exemplo: DO WHILE ( salario .LE. 5000 ) salario=salario*1.05 END DO

39-Comando DO iterativo

loops que possuem um nmero fixo de ciclos. DO <varivel>=<expresso1>, <expresso2> [,<expresso3>] ... END DO expresso1 Valor inicial expresso2 Valor final expresso3 Valor de incremento Exemplo:

DO i1=1, 100, 2 ... ! i1 sera: 1,3,5,7... ... ! 50 iteraes END DO

32 40-Comando SELECT-CASE

Construo similar ao IF, mas muito til quando o valor analisado na expresso lgica possuir diversos valores. SELECT CASE (<expresso>) CASE (<seleo>) <comando> CASE (<seleo>) <comando> ... CASE DEFAULT <comando> END SELECT

OBS: A seleo pode ser representar uma lista de valores: (6, 10, 100) Valores iguais a 6, 10 ou 100 (10:65,67:98) Valores entre 10 e 65, inclusive ou entre 67 e 98 inclusive (100:) Valores maior ou igual a 100 Exemplo: SELECT CASE (I) CASE (1) PRINT*, I==1 CASE (2:9) PRINT*, I>=2 and I<=9 CASE (10) PRINT*, I>=10 CASE DEFAULT PRINT*, I<=0 END SELECT

41-DIVISO POR INTEIROS


Ocorrem confuses em relao aos resultados quando da diviso de nmeros inteiros. Normalmente o resultado um valor inteiro.
REAL :: a, b, c, d, e a = 1999/1000 b = -1999/1000 c = (1999+1)/1000 d = 1999.0/1000 e = 1999/1000.0

a=1 b = -1 c=2 d = 1.999 e = 1.999

33 42-EXERCCIO 6 SELECT CASE


1 Caminhe para o diretrio ~curso/fortran/ex6. Edite o programa ingresso.f . Esse programa determina o preo de um ingresso a partir do nmero da cadeira escolhida:

CADEIRAS 50 100 140 e 200 240 300 340 400 440 R$ 50,00 R$ 25,00 R$ 20,00 R$ 15,00

PREO

2 Substitua nas reticncias a estrutura de um SELECT CASE que determinar o preo do ingresso. 3 Compile e execute o programa diversas vezes para verificar se est certo. 4 Altere o programa, de maneira que, fique em loop solicitando o nmero da cadeira, at ser digitado 0 que determina o fim do programa.

34 43-PROCEDIMENTOS INTRNSICOS
Em linguagens de programao, normalmente, algumas tarefas so executadas com muita freqncia. O Fortran90 possui internamente, em torno de, 113 procedimentos, que so chamadas de funes intrnsicas e executadas como funes:

Matemticas: Trigonomtricas, Logartimas (SIN e LOG)

Numricas (SUM, MAX)

Caracteres (INDEX, TRIM)

Transformao (REAL)

44-Funes de CONVERSO
Transformao de tipos de dados
REAL(i) INT(x) DBLE(a) IACHAR(c) ACHAR(i) Converte i para um aproximao de real; Converte x para um equivalente inteiro; Converte a para preciso dupla; Retorna o valor de c da tabela ASCII Identifica o valor i da tabela ASCII

REAL(1) INT(1.7) INT(-0.9999) IACHAR(C) ACHAR(67)

1.000000 1 0 67 C

45-Funes MATEMTICAS

Algumas:

ACOS(x) COS(x) COSH(x) EXP(x) LOG(x) LOG10(x) SQRT(x)

Arcocoseno Coseno Coseno Hiperblico ex Logaritmo natural ou neperiano ln Logaritmo base 10 Raiz Quadrada

35 46-Funes NUMRICAS

Algumas:

ABS(a) INT(a) MAX(a1,a2,...) MIN(a1,a2,...) MOD(a,p) REAL(a) DBLE(x)

Valor absoluto Valor inteiro Valor mximo Valor mnimo Resto da diviso a/p Converte a para REAL Converte x para DOUBLE PRECISION

47-Funes CARACTERES
Algumas:

ADJUSTL(str) ADJUSTR(str) LEN(str) REPEAT(str,i) TRIM(str)

Alinha pela esquerda Alinha pela direita Tamanho do string Repete o string i vezes Remove brancos a direita

36 48-EXERCCIO 7 Funes Matemticas


1 Caminhe para o diretrio ~/curso/fortran/ex7. Edite o programa PontoNoCirculo.f e altere o que for necessrio para executar o programa corretamente. Esse programa clcula as coordenadas x,y de um ponto no crculo, tendo como valores de entrada o raio, r e o ngulo teta, q em graus. Lembre-se: q(radianos) = ( q(graus) /180 ) * P P = arctan(1) * 4 senoq = y / r q cosenoq = x / r q

37 49-Comando PRINT

Comando que direciona um dado no formatado para sada padro.

PRINT <formato> ,<imp1>,<imp2>,<imp3>, ...


* Substitui um formato

O comando PRINT sempre inicia uma nova linha.

Exemplo:

PROGRAM uno IMPLICIT NONE CHARACTER(LEN=*), PARAMETER :: & nome_completo = Mauricio...Silva REAL :: x, y, z LOGICAL :: varlog x = 1; y = 2; z = 3 varlog = (y .EQ. X) PRINT*, nome_completo PRINT*,X= ,x, Y = ,y, Z = ,z PRINT*,Varivel lgica: ,varlog END PROGRAM uno Mauricio...Silva X = 1.000 Y = 2.000 Z = 3.000 Varivel lgica: F

50-Comando READ
Comando que l um dado no formatado da entrada padro, o teclado.

READ <formato> ,<imp1>,<imp2>,<imp3>, ...


* Substitui um formato

Exemplo:

READ*, nome READ*, x, y, z READ*,var1

38

MATRIZES
51-DEFINIO DE MATRIZES

Matrizes ou Arrays uma coleo de dados armazenados na memria e acessados individualmente de acordo com a sua posio espacial, definida pelas dimenses da matriz.

Matriz de 1 Dimenso com 15 elementos:

10

11

12

13

14

15

Matriz de 2 dimenses 15 elementos - 5 x 3:

1,1 2,1 3,1 4,1 5,1

1,2 2,2 3,2 4,2 5,2

1,3 2,3 3,3 4,3 5,3

39 52-DECLARAO DE MATRIZES
REAL, DIMENSION(15) REAL, DIMENSION(1:5,1:3) REAL :: X :: Y,Z :: T(5,3)

Dimenses: at 7 dimenses;

Limites: O limite inferior e superior ficam separados pelo carctere

:. Caso no exista esse caractere, o limite inferior ser sempre 1 e o limite superior, o informado na definio da matriz. Se no for informado, ento a alocao de memria ser dinmica, ou seja, durante a execuo do programa;

Tamanho: O nmero de elementos de uma matriz igual multiplicao dos elementos em cada

dimenso;

Organizao: O Fortran90 no especifica como as matrizes so dispostas em memria, mas para

leitura e impresso, a ordem por coluna, ser utilizada.

40 53-SNTAXE DE MATRIZES

Iniciar os elementos de uma Matriz (

/ ... / )

INTEGER, DIMENSION(4) :: mat = (/2,3,4,5/) REAL, DIMENSION(3,3) :: unida = (/1,0,0,0,1,0,0,0,1/)

A ao se efetua em toda a Matriz:

A = 0.0 B=C+D

A ao se efetua em alguns elementos de uma Matriz:

A(1) = 0.0 B(0,0) = A(3) + C(5,1)

A ao se efetua para algumas seces de elementos de uma Matriz:

A(2:4) = 0.0 B(-1:0,1:0) = C(1:2, 2:3) + 1.0

54-SECES DE MATRIZES

[<limite1>:<limite2>][<incremento>]

A(:) A(3:9) A(8:3:-1) A(m:) A(::2)

Toda matriz A(3) at A(9) de 1 em 1 A(8) at A(3) de 1 em 1 A(m) at limite superior Toda matriz de 2 em 2

41 55-IMPRESSO E LEITURA DE MATRIZES


Considere A como uma matriz de duas dimenses

Impresso: PRINT*, A A(1,1), A(2,1), A(3,1),..., A(1,2), A(2,2), A(3,2),...

Leitura: READ*, A Dever informar os dados na ordem acima (ordem por colunas) Exemplos:

PRINT*, Elemento da Matriz PRINT*, Seco da Matriz PRINT*, Sub-Matriz PRINT*, Toda Matriz PRINT*, Matriz Transposta Elemento da Matriz Seco da Matriz Sub-Matriz Toda Matriz Matriz Transposta

=, a( 3 , 2 ) =, a( : , 1 ) =, a( :2 , :2 ) =, a =,TRANSPOSE(a) =6 =123 =1245 =123456789 =147248369

42 56-FUNES DE MATRIZES

REAL, DIMENSION(-10:10,23,14:28) :: A

Algumas funes permitem questionar alguns atributos de matrizes.

LBOUND(SOURCE[,DIM])

Identifica o limite inferior das dimenses de uma matriz LBOUND(A) LBOUND(A,1) Resultado uma matriz com (/-10,1,14/) Resultado um escalar 10

UBOUND(SOURCE[,DIM])

Identifica o limite superior das dimenses de uma matriz

SHAPE(SOURCE)

Identifica qual a aparncia de uma matriz SHAPE(A) SHAPE((/4/)) Resultado uma matriz (/21,23,15/) Resultado uma matriz (/1/)

SIZE(SOURCE[,DIM])

Identifica o numero de elementos de uma dimenso da matriz SIZE(A,1) SIZE(A) 21 7245

43 57-ALOCAO DE MATRIZES

O Fortran90 permite a alocao dinmica de memria. Para isso ser necessrio utilizar os comandos ALLOCATABLE, ALLOCATE, ALLOCATED e DEALLOCATE.

Na declarao das matrizes - ALLOCATABLE :

INTEGER, DIMENSION( : ), ALLOCATABLE :: idade REAL, DIMENSION( : , : ), ALLOCATABLE :: velo

! 1D ! 2D

Alocao de memria - ALLOCATE :

READ*, isize ALLOCATE(idade(isize), STAT=err) IF (err /= 0) PRINT*, idade : Falhou a alocao de memria ALLOCATE(velo(0:isize-1,10), STAT=err) IF (err /= 0) PRINT*, velo : Falhou a alocao de memria

Liberao de memria ALLOCATED e DEALLOCATE

IF (ALLOCATED(idade)) DEALLCATE(idade, STAT=err)

OBS: O espao de memria de uma matriz permance alocado at ser efetuado um DEALLOCATED ou at o fim do programa

44 58-EXERCCIO 8 DEFINIO DE MATRIZES


1 Analise as declaraes abaixo e identifique para cada uma o que solicitado:

REAL, DIMENSION(1:10) :: ONE Quantas dimenses? Limite(s) inferior(es)? Limite(s) Superior(es)? Tamanho da matriz? ________ ________ ________ ________

REAL, DIMENSION(2,0:2) :: TWO Quantas dimenses? Limite(s) inferior(es)? Limite(s) Superior(es)? Tamanho da matriz? ________ ________ ________ ________

INTEGER, DIMENSION(-1:1,3,2) :: THREE Quantas dimenses? Limite(s) inferior(es)? Limite(s) Superior(es)? Tamanho da matriz? ________ ________ ________ ________

REAL, DIMENSION(0:1,3) :: FOUR Quantas dimenses? Limite(s) inferior(es)? Limite(s) Superior(es)? Tamanho da matriz? ________ ________ ________ ________

OBS: A soluo est no diretrio ~/curso/fortran/ex8

45 59-EXERCCIO 9 FUNES DE MATRIZES


1 Dado a seguinte declarao de matriz: INTEGER, DIMENSION(-1:1,3,2) :: A

2 Escreva um pequeno programa no diretrio ~/curso/fortran/ex9 , que possua algumas funes de matrizes que identificam: a. b. c. d. O nmero total de elementos em A; A aparncia de A (Funo SHAPE); O limite inferior da dimenso 2; O limite superior da dimenso 3.

OBS: A soluo est no arquivo solucao.f. Tente fazer sem olhar!!!

60-EXERCCIO 10 USO DE MATRIZES


1 O salrio recebido por alguns funcionrios de uma empresa foi: 10500, 16140, 22300, 15960, 14150, 12180, 13230, 15760, 31000 e a posio hierrquica de cada funcionrio , respectivamente: 1, 2, 3, 2, 1, 1, 1, 2, 3

2 Caminhe para o diretrio ~/curso/fortran/ex10. Edite o programa MatrizSalario.f . Codifique o que solicitado nas reticncias. Esse programa clcula o custo total que a companhia ter com o incremento de 5%, 4% e 2% para as categorias 1, 2 e 3 respectivamente.

46

SECES PRINCIPAIS DE PROGRAMAS


61-SECES DE UM PROGRAMA FORTRAN

O Fortran90 possui duas seces principais de programa:

PROGRAM

Seco principal do programa aonde a execuo inicia e finaliza. Pode conter vrios procedimentos.

MODULE

Seco do programa que pode conter novas declaraes e procedimentos, e que pode ser anexado ao programa principal.

O Fortran90 possui dois tipos de procedimentos:

SUBROUTINE

Um programa com parmetros de entrada e sada que pode ser chamada de dentro do programa principal com o comando CALL CALL relatorio(titulo)

FUNCTION

Similar a uma SUBROUTINE, no entanto, retorna um nico valor e pode ser executado de dentro de um comando. PRINT*, Resultado da Funo : , f(x)

47 62-PROGRAMA PRINCIPAL

PROGRAM principal ! Comandos de declarao ! Comandos executveis CONTAINS SUBROUTINE sub1(...) !Comandos executveis END SUBROUTINE sub1 ! ... FUNCTION func(...) !Comandos executveis END FUNCTION func END PROGRAM principal

O comando PROGRAM opcional, assim como o nome do programa, mas uma boa prtica sempre us-los.

O programa principal pode conter declaraes, comandos executveis e procedimentos internos: Subrotinas e funes definidas pelo usurio. Esses procedimentos so separados do resto do programa pelo comando CONTAINS.

Exemplo:

PROGRAM main IMPLICIT NONE REAL :: x READ*, x PRINT*, SQRT(x) ! Funo interna PRINT*, Negative(x) ! Funo do usurio CONTAINS REAL FUNCTION Negative(a) REAL, INTENT(IN) :: a Negative = -a END FUNCTION Negative END PROGRAM Main

48 63-PROCEDIMENTOS
Internos: 113 do Fortran90

Bibliotecas:

NAG Numerical Library, 300+ BLAS Basic Linear Algebra Subrroutine IMSL LAPACK SCALAPACK Uniras

64-Procedimentos: SUBROUTINE
SUBROUTINE <nome> [(<argumentos>)] Declarao dos argumentos dummy Declarao dos objetos Comandos executveis END [SUBROUTINE [<nome>]]

Para se definir uma Sub-rotina usa-se a estrutura SUBROUTINE END SUBROUTIE; Para se usar uma Sub-rotina usa-se o comando CALL; Uma Sub-rotina pode enxergar todas as variveis declaradas no programa principal; Uma Sub-rotina pode incluir a chamadas a outras sub-rotinas

Exemplo:

PROGRAM algo IMPLICIT NONE ... CALL ImprimeNum(numeros) ... CONTAINS SUBROUTINE ImprimeNum(num) REAL, DIMENSION(:), INTENT(IN) :: num PRINT*,Esses so os nmeros, num END SUBROUTINE ImprimeNum END PROGRAM algo

49 65-Procedimentos: FUNCTION

[<Tipo da Funo>] FUNCTION <nome> [(<argumentos>)] Declarao dos argumentos dummy Declarao dos objetos Comandos executveis Comando de atribuio do resultado END [FUNCTION [<nome>]]

Funo funciona sobre o mesmo princpio de Sub-rotina, com a exeo que a funo retorna um valor; Uma funo definida usando-se a estrutura FUNCTION END FUNCTION; Pra usar uma funo, basta cham-la pelo nome; Funo pode ser definida na rea de declarao de variveis quando se identifica o tipo da funo. Exemplo:

PROGRAM algo IMPLICIT NONE ... PRINT*, F(a,b) ... CONTAINS REAL FUNCTION F(x,y) REAL, INTENT(IN) :: x,y F=SQRT(x*x + y*y) END FUNTION F END PROGRAM algo

50 66-EXERCCIO 11 SUBROTINA

1 Caminhe para o diretrio ~/curso/Fortran/ex11. Edite o arquivo Subrotina.f e adicione a sub-rotina de acordo com a descrio do problema.

Esse programa possui uma rotina interna que retorna, como primeiro argumento, a soma de dois nmeros reais. Sub-rotina summy(arg1, arg2, arg3) arg1 arg2 arg3 varivel com resultado varivel com 1 nmero varivel com 2 nmero

arg1=arg2+arg3 O programa principal dever chamar a rotina tres vezes e imprimir o resultado: 1 2 3 Nmeros: 2.6 e 3.1 Nmeros: 6.1 e 9.2 Nmeros: 0.1 e 0.555

67-EXERCCIO 12 FUNO
1 Caminhe para o diretrio ~/curso/Fortran/ex12. Edite o arquivo funcao.f e adicione a funo de acordo com a descrio do problema.

Esse programa possui uma funo interna que retorna a soma de dois nmeros reais, fornecido pelos argumentos. Funo real summy(arg1,arg2) Arg1 Arg2 varivel com 1 nmero varivel com 2 nmero

summy=arg1+arg2 O programa principal dever chamar a rotina quatro vezes e imprimir o resultado: 1 2 3 4 Nmeros: 1.0 e 2.0 Nmeros: 1.0 e -1.0 Nmeros: 0.0 e 0.0 Nmeros: 1.0E54 e 9192652.0

51 68-EXERCCIO 13 PROCEDIMENTOS

1 Caminhe para o diretrio ~/curso/Fortran/ex13. Edite o arquivo NumeroRandomico.f e substitua pelo comando adequado nas reticncias.

Esse programa chama uma funo que por sua vez chama a duas vezes a sub-rotina do Fortran90, RANDOM_NUMBER(r), para obter um nmero randmico e simular um arremesso de dados. 2-Mesmo aps substituir as reticncias pelos comandos adequados, haver erros na compilao. Leia com ateno os provveis erros e tente corrig-los.

52 69-SECO DE PROGRAMA: MODULE


MODULE uma seco de programa Fortran90, independente do programa principal, podendo ser compilado e utilizado por diversos programas como se fosse um sub-rotina externa;

Normalmente, um MODULE criado quando se percebe que o cdigo pode ser utilizado em diversas situaes diferentes;

Define classes em orientao a objetos.

Sintaxe: MODULE <nome> <Comandos de declarao> [ CONTAINS <Definio de procedimentos>] END [ MODULE [ <nome> ]]

Exemplo: Declara as variveis X, Y e Z como variveis reais globais.

MODULE global REAL, SAVE :: X, Y, Z END MODULE global

Para se utilizar um MODULE usa-se o comando USE

PROGRAM teste USE <nome> IMLPICIT NONE ... END PROGRAM teste

53 70-EXERCCIO 14 DEFINIO DE UM MDULO

1 Caminhe para o diretrio ~/curso/Fortran/ex14. Edite o programa DefModulo.f

Esse programa cria um mdulo que possui duas definies de funes que calculam a mdia e o desvio padro de um vetor real de tamanho indefinido. O mdulo tambm registra quantas vezes as funes foram utilizadas.

2 Substitua as linhas com reticncias com o comando adequado a definio de um mdulo.

3 - Somente compile o programa, apenas para gerar o objeto e o mdulo:

%xlf90 c DefModulo.f

71-EXERCCIO 15 USO DE UM MDULO

1 Caminhe para o diretrio ~/curso/Fortran/ex15. Edite o programa UsoModulo.f

2 Substitua as linhas com reticncias com o comando adequado ao uso de um mdulo.

3 - Compile o programa apenas gerando o objeto: %xlf90 c UsoModulo.f

4 Copie o objeto e o mdulo gerado no exerccio anterior para este diretrio. Crie o executvel linkando os dois objetos: %xlf90 o Teste_modulo UsoModulo.o DefModulo.o

5 Execute o programa com os seguintes valores de entrada:

5.0 3.0 17.0 7.56 78.1 99.99 0.8 11.7 33.8 29.6 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 11.0 12.0 13.0 14.0

54

ENTRADA E SADA

72-ENTRADA / SADA

O Fortran90 possui uma grande variedade de opes de I/O, que permitem diferentes tipos de arquivos se conectarem ao programa principal para leitura e gravao.

Em Fortran90, um arquivo conectado a uma unidade lgica definida por um nmero.

Cada unidade pode possuir diversas propriedades:

Arquivo Ao Status Mtodo de acesso

Nome do arquivo conectado; Leitura, Gravao, Leitura e Gravao; old, new, replace; Seqencial ou Direto;

55 73-Comando OPEN

OPEN([UNIT=]<inteiro>, & FILE=<arquivo>, ERR=<rtulo>, & STATUS=<status>, ACCESS=<mtodo>, & ACTION=<modo>, RECL=<expresso>)
Utilizado para conectar um arquivo a uma unidade lgica e definir algumas caractersticas de conexo. UNIT= FILE= ERR= STATUS= Especifica um nmero de referncia ao nome do arquivo; Especifica (entre aspas) o nome do arquivo que ser conectado; Especifica uma posio lgica de controle caso haja algum erro na abertura do arquivo; Especifica (entre aspas) o status do arquivo: OLD NEW REPLACE SCRATCH UNKNOW ACCESS= O arquivo j existe; O arquivo no existe; O arquivo ser sobreposto; O arquivo temporrio e ser apagado quando fechado (CLOSE); Desconhecido;

Especifica (entre aspas) o mtodo de acesso: DIRECT Acesso direto a registros individuais. obrigado a usar a opo RECL; SEQUENTIAL Acesso seqencial, linha por linha;

ACTION=

Especifica (entre aspas) o modo de acesso ao arquivo: READ Somente leitura; WRITE Somente gravao; READWRITE Leitura e gravao;

RECl=

Especifica o tamanho mximo de um registro aberto para acesso direto.

Exemplo:

OPEN(17,FILE=saida.dat,ERR=10,STATUS=REPLACE,& ACCESS=SEQUENTIAL,ACTION=WRITE)

OPEN(14,FILE=entra.dat,ERR=10,STATUS=OLD,& RECL=exp, ACCESS=DIRECT,ACTION=READ)

56 74-Comando READ

READ([UNIT=]<inteiro>, [FMT]=<formato>,& IOSTAT=<int-var>, ERR=<rtulo>, & END=<rtulo>, EOR=<label>, & ADVANCE=<modo>, REC=<expresso>,& SIZE=<num-caracteres>) <lista de variveis>
No caso do comando de leitura, algumas caractersticas de conexo no podem ser utilizadas juntas.

UNIT= FMT= ERR= IOSTAT= END= EOR= REC=

Especifica um nmero de referncia a unidade de leitura ( * representa a unidade default); Especifica (entre aspas) o formato da leitura dos dados; Especifica uma posio lgica de controle caso haja algum erro de leitura; Cdigo de retorno. Zero significa sem erros; Especifica uma posio lgica de controle caso ocorra erro de fim de arquivo; Especifica uma posio lgica de controle caso ocorra erro de fim de registro; Especifica o nmero do registro que deve ser lido no modo de acesso direto;

ADVANCE= Especifica YES ou NO, se deve ou no iniciar a leitura em um novo registro; SIZE= Retorna par uma varivel o nmero de caracteres lidos

Exemplo:

READ(14,FMT=(3(F10.7,1x)),REC=exp) a,b,c READ(*, (A), ADVANCE=NO,EOR=12,SIZE=nch) str

57 75-Comando WRITE

WRITE([UNIT=]<inteiro>, [FMT]=<formato>,& IOSTAT=<int-var>, ERR=<rtulo>, & ADVANCE=<modo>, & REC=<expresso>) <lista de variveis>
No caso do comando de gravao, algumas caractersticas de conexo no podem ser utilizadas juntas.

UNIT= FMT= ERR= IOSTAT= REC=

Especifica um nmero de referncia a unidade de gravao ( * unidade default); Especifica (entre aspas) o formato de gravao dos dados; Especifica uma posio lgica de controle caso haja algum erro de gravao; Cdigo de retorno. Zero significa sem erros; Especifica o nmero do registro que deve ser lido no modo de acesso direto;

ADVANCE= Especifica YES ou NO, se deve ou no iniciar a leitura em um novo registro;

Exemplo: WRITE(17,FMT=(I4),IOSTAT=stat, ERR=10) val WRITE(*, (A), ADVANCE=NO) Amarelo

58 76 - Comando FORMAT/FMT=
Comando que especifica o formato na qual os dados sero lidos ou gravados.

Exemplo:

WRITE(17,FMT=(2X,2I4,1X,nome,A7)) i, j, str

READ(14,*) x,y

10

WRITE(*, FMT=10) a, b FORMAT(vals,2(F15.6,2X)) 11-195 nome Felipe Vals -1.051330 333356.000033

77-Descritores de Formatos
Iw Fw.d Ew.d Lw A[w] nX w nmero de dgitos inteiros w nmero de dgitos reais e d nmero de decimais w dgitos reais e d decimais em notao cientfica w nmero de caracteres lgicos w numero de caracteres pula n espaos

78-Outros comandos de I/O

CLOSE REWIND BACKSPACE ENDFILE

Fecha um arquivo Re-posiciona a leitura no primeiro registro Volta a leitura em um registro Fora a gravao de uma marca de fim de arquivo

59 79-Comando DATA
Comando que permite iniciar uma lista de variveis.

DATA <lista1> /<dados1>/, <lista2> /<dados2>/,...<listan> /<dadosn>/

Exemplo: INTEGER :: count, I, J REAL :: inc, max, min CHARACTER(LEN=5) :: luz LOGICAL :: vermelho, azul, verde DATA count/0/, I/5/, J/100/ DATA inc, max, min/1.0E-05, 10.0E+05, -10.0E+05/ DATA luz/Clara/ DATA vermelho/.TRUE./, azul, verde/.FALSE.,.FALSE./

60 80-EXERCICIOS 16 I/O
1 - Caminhe para o diretrio ~/curso/Fortran/ex16. Edite o programa Write_io.f. Substitua as reticncias pelo comando adequado. Esse programa solicita dados para serem digitados e os grava em um arquivo.

2 Compile e execute o programa, testando com os seguintes valores: Blair 94. 97. 97. 94. Major 2. 6. 6. 5. Ashdown 49. 28. 77. 66. END 0. 0. 0. 0.

3 - Edite o programa Read_io.f. Substitua as reticncias pelo comando adequado.

4 - Compile e execute o programa.

81-EXERCICIOS 17 FORMATAO
1 Dado o comando abaixo: READ(*,'(F10.3,A2,L10)') A,C,L

Como ser representado o valor de A (REAL), o valor de C (CHARACTER de tamanho 2) e o valor de L LOGICAL logical) para os seguintes valores de dados? (OBS: b significa espao em branco.)

bbb5.34bbbNOb.TRUE. 5.34bbbbbbYbbFbbbbb b6bbbbbb3211bbbbbbT bbbbbbbbbbbbbbbbbbF 2 - Caminhe para o diretrio ~/curso/Fortran/ex17. Edite o programa IOFormatado.f. Substitua as reticncias pelo comando adequado. Esse programa gera um arquivo com linhas de cabealho e linhas de dados, sendo: NAME (at 15 caracteres), AGE (at 3 dgitos), HEIGHT (em metros 4 posies e 2 decimais) e o FONE ( 4 dgitos inteiros). Height (metres) -----1.80 1.75

Name ---Bloggs J. G. Clinton P. J.

Age --45 47

Tel. No. -------3456 6783

61 82-REFERNCIAS

1 IBM XL Fortran 8.1 Users Guide 2 IBM XL Fortran 8.1 Language Reference 3 INTEL Fortran 9 Language Reference 4 The University of Liverpool Fortran 90 Programming Dr. A.C. Marshall

Você também pode gostar