Sei sulla pagina 1di 62

Introduo ao Fortran 90

CENAPAD-SP

2
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-Precedncia de Operadores 24-Operadores RELACIONAIS 25-Operadores LGICOS 26-Operador CARACTERE 27-EXERCCIO 4 B 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 DOB EXIT-END DO ALOOP@ Condicional 36-Comando DOB CYCLE-EXIT-END DO ALOOP@ Cclico Condicional 37-ALOOPs@ Identificados 38-Comando DO-WHILE 39-Comando DO iterativo 40-Comando SELECT-CASE 41-DIVISO POR INTEIROS 42-EXERCCIO 6 B SELECT CAS E 43-PROCEDIMENTOS INTRNSICOS _______24 _______25 _______26 _______27 _______28 _______29 30 _______31 _______31 _______32 _______32 _______32 _______33 _______33 _______34 _______35 07 08 09 10 11 ______________________12 13 ___ _______14 _______14 _______15 _______15 _______16 _______16 _______17 _______17 _______18 _______19 _______19 _______20 _______20 _______21 _______21 _______22 _______23 _______ 04 05 06

_____

3
NDICE 44-Funes de CONVERSO 45-Funes MATEMTICAS 46-Funes NUMRICAS 47-Funes CARACTERES 48-EXERCCIO 7 B 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 B DEFINIO DE MATRIZES 59-EXERCCIO 9 B FUNES DE MATRIZES 60-EXERCCIO 10 B 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 B SUBROTINA 67-EXERCCIO 12 B FUNO 68-EXERCCIO 13 B PROCEDIMENTOS 69-SECO DE PROGRAMA: MODULE 70-EXERCCIO 14 B DEFINIO DE UM MDULO 71-EXERCCIO 15 B 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 B I/O 81-EXERCICIOS 16 B FORMATAO 82-REFERNCIAS 55 56 57 58 59 59 59 60 61 61 62 47 48 49 49 50 51 51 52 53 54 54 39 40 41 41 42 43 44 45 46 46 35 36 36 36 37 38 38

1-HISTRIA

IBM Mathematical FORmula TRANslation System;

Elaborado especificamente 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 dcada de 60, o que forou a necessidade de se padronizar o software.

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

Atualizado em 1991 ~ 12 anos Fortran 90; O planejamento 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 distribuda;

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 intrnsecas; uma situao crtica, pois o Fortran considerado como uma linguagem de alta performance, no entanto, at o padro 77 no existia nenhuma instruo que permitisse o paralelismo, como compartilhamento de endereos de memria.

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 partir dos existentes.

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

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 a distribuio de 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 linguagens de programao :

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

Substituio de comandos: o COMMON blocks MODULE o EQUIVALENCE TRANSFER

Novos comandos: o IMPLICIT NONE

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

5-RECOMENDAES DE CODIFICAO

Sempre utilize o comando IMPLICT NONE;

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

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

Cada comando deve ser colocado por linha;

Codifique com recuos;

Acrescente comentrios s linhas.

6-CARACTERSTICAS DE CODIFICAO

132 caracteres por linha;

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

Caractere de incio de comentrio;

&

Caractere de continuao de linha;

Caractere de separao de comandos;

Smbolos aritmticos: + Adio - Subtrao * Multiplicao / Diviso ** Expoente

10

7-REGRAS DE CODIFICAO

Brancos no so permitidos:

Palavras-chave INTEGER :: nome1 Certo INT EGER :: nome1 Errado

Nomes REAL :: valor_total Certo REAL :: valor total 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 Certo REAL :: 1a Errado

Podem continuar com letras, dgitos ou _ CHARACTER :: atoz Certo CHARACTER :: a-z Errado CHARACTER :: a_zCerto

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 Tipo de 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 - lscalapack ifort salto.f -o salto -O3 -L/home/kusel - lbib1 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 <editor> quadsol.f

OBS: Pode ser o editor pico, emacs ou vi

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 ! Uma raiz ! raizes reais

! raizes complexas

! a == 0

2. Compile e execute o programa. Verifique a sua execuo 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.

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

1. Comandos de Declarao: REAL, INTEGER, IMPLICIT, PARAMETER, DATA; 2. 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 Caractere 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; Nmeros 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 s 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

CHARACTER(LEN=*), PARAMETER :: n1=Paulo, n2=FranciscoFortran90 Valores caracteres podem assumir o seu prprio tamanho utilizando-se (LEN=*); Recomenda-se que se utilize 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 alter- la no decorrer da execuo. Exemplos: REAL INTEGER :: x, y=1.005 :: i=5, j=100

CHARACTER(LEN=5) :: luz=Amber LOGICAL REAL, PARAMETER REAL REAL :: 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 iniciam uma varivel, mas existe as excees.

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 (at 20 letras) Caractere Lgica Real

Valor Inicial Campinas Falso 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, necessariamente, deve ser escalar.

23-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 primeiro, com 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)

21

24-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

25-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 T .OR. F T .EQV. F .FALSE. .TRUE. .FALSE. F .AND. F F .OR. F T .NEQV. F .FALSE. .FALSE. .TRUE.

22

26-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

23

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: area = B r

4-Volume da esfera: 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

24

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.

25

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

26

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

27

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

28

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

29

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 n ome. 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

30 34-EXERCCIO 5 - Comando IF

1 Caminhe para o diretrio ~/cursos/fortran/ex5. Edite o programa triangulo.f

2 O programa solicita que se digite trs valores inteiros que podero formar os trs lados de um tringulo eqiltero, issceles, escaleno, ou no formar um tringulo.

3 Detalhe muito importante para a lgica de execuo 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 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)

31

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 sada do loop. DO ... IF (<expresso lgica>) EXIT ... END DO Exemplos: i=0 DO i=i+1 IF (i .GT. 100) 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>) CYCLE IF (<expresso lgica>) EXIT ... END DO Exemplos: i=0 DO i=i+1 IF (i >= 50 .AND. I <= 59) CYCLE IF (i .GT. 100) EXIT PRINT*, I , i END DO PRINT*, Fim do loop. I = , i

32

37-LOOPs Identificados

loops recursivos identificados. Exemplo:


1 outa: DO 2 inna: DO 3 ... 4 IF (a .GT. b) EXIT outa 5 IF (a .EQ. b) CYCLE outa 6 IF (c .GT. d) EXIT inna 7 IF (c .EQ. a) CYCLE 8 END DO inna 9 END DO outa 10 ...

! Pula para linha 10 ! Pula para linha 1 ! Pula para linha 9 ! Pula para linha 2

38-Comando DO-WHILE

loops que condiciona a sua execuo antes de executar o bloco de comandos. Faa enquanto. A condio testada 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 ser: 1,3,5,7... ... ! 50 iteraes END DO

33

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

A seleo pode ser uma lista de valores:

(6, 10, 100) (10:65,67:98) (100:) Exemplo:

Valores iguais a 6, 10 ou 100 Valores entre 10 e 65, inclusive ou entre 67 e 98 inclusive Valores maior ou igual a 100

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

34 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

PREO R$ 50,00 R$ 25,00 R$ 20,00 R$ 15,00

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.

35

43-PROCEDIMENTOS INTRNSECOS

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 intrnsecas e executadas como funes:

Matemticas: Trigonom tricas, Logaritmo (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

36

45-Funes MATEMTICAS

Algumas:

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

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

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

37

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 calcula as coordenadas x,y de um ponto no crculo, tendo como valores de entrada o raio, r e o ngulo teta, em graus. Lembre-se: (radianos) = ( (graus) /180 ) * = arctan(1) * 4 seno = y / r coseno = x / r

38

49-Comando PRINT

Comando que direciona um dado no formatado para sada padro. PRINT <formato> ,<imp1>,<imp2>,<imp3>, ... * Substit ui 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>, ... * Exemplo: READ*, nome READ*, x, y, z READ*,var1 Substitui um formato

39

MATRIZES 51-DEFINIO DE MATRIZES

Matrizes ou Arrays so 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

40

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 caractere :. 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.

41

53-SNTAXE DE MATRIZES

Iniciar os elementos de uma Matriz ( / ... / )

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

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,0:1) = 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

42

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

43

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) Resultado uma matriz com (/-10,1,14/) LBOUND(A,1) Resultado um escalar 10

UBOUND(SOURCE[,DIM])

Identifica o limite superior das dimenses de uma matriz

SHAPE(SOURCE), RESHAPE(SOURCE,SHAPE)

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

SIZE(SOURCE[,DIM])

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

44

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)) DEALLOCATE(idade, STAT=err)

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

45

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

46

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 soluo.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 calcula o custo total que a companhia ter com o incremento de 5%, 4% e 2% para as categorias 1, 2 e 3 respectivamente.

47

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 coma ndo. PRINT*, Resultado da Funo : , f(x)

48

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: Sub-rotinas 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

49

63-PROCEDIMENTOS

Internos: 113 do Fortran90

Bibliotecas:

NAG Numerical Library, 300+ BLAS Basic Linear Algebra Subroutine 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 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

50

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 exceo 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

51

66-EXERCCIO 11 B SUBROTINA
1 B 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 11 nmero varivel com 21 nmero

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

67-EXERCCIO 12 B FUNO
1 B 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 11 nmero varivel com 21 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

52

68-EXERCCIO 13 B PROCEDIMENTOS

1 B 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 corrigi- los.

53

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 uma subrotina 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

54

70-EXERCCIO 14 B DEFINIO DE UM MDULO


1 B 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 B Substitua as linhas com reticncias com o comando adequado a definio de um mdulo.

3 Efetue somente a compilao do programa, para apenas gerar o objeto e o mdulo: %xlf90 Bc DefModulo.f

71-EXERCCIO 15 B USO DE UM MDULO


1 B Caminhe para o diretrio ~/curso/Fortran/ex15. Edite o programa UsoModulo.f 2 B Substitua as linhas com reticncias com o comando adequado ao uso de um mdulo.

3 - Compile o programa apenas gerando o objeto: %xlf90 Bc UsoModulo.f 4 B Copie o objeto e o mdulo gerado no exerccio anterior para este diretrio. Crie o executvel Alinkando@ os dois objetos: %xlf90 Bo Teste_modulo UsoModulo.o DefModulo.o 5 B Execute o programa com os seguintes valores de entrada: 3.0 17.0 B7.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

55

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 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, Direto

56

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. 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: O arquivo j existe; O arquivo no existe; O arquivo ser sobreposto; O arquivo temporrio e ser apagado quando fechado (CLOSE); Desconhecido;

UNIT= FILE= ERR=

STATUS=

>OLD= >NEW= >REPLACE= >SCRATCH= >UNKNOW= ACCESS=

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

>DIRECT= >SEQUENTIAL= ACTION=

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

>READ= >WRITE= >READWRITE= RECl= Exemplo:

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

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=)

57

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=

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;

FMT= ERR= IOSTAT= END=

EOR=

REC=

ADVANCE= Especifica >YES= ou >NO=, se deve ou no iniciar a leitura em um novo registro; SIZE= Retorna, para 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

58

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=

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;

FMT= ERR= IOSTAT= REC=

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=

59

76 - Comando FORMAT/FMT=

Comando que especifica o formato na qual os dados sero lidos ou gravados.

Exemplo: WRITE(17,FMT=>(2X,I4,1X,I4,1X,==Nome:==,A7)=) i, j, str 11 -195 Nome: Felipe

WRITE(*, FMT=10) a, b 10 FORMAT(>vals=,2(F15.6,2X))

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

60

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./

61

80-EXERCICIOS 16 B 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 B 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 B FORMATAO
1 B 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 Name Age (metres) Tel. No. -----------------Bloggs J. G. 45 1.80 3456 Clinton P. J. 47 1.75 6783

62

82-REFERNCIAS
1 B IBM XL Fortran 8.1 User=s Guide 2 B IBM XL Fortran 8.1 Language Reference 3 B INTEL Fortran 9 Language Reference 4 B The University of Liverpool B Fortran 90 Programming Dr. A.C. Marshall

Potrebbero piacerti anche