Você está na página 1de 30

Introdução ao Fortran 90

Aula 3
Usando vetores e matrizes
Definição

Uma matriz ou vetor consiste de um conjunto retangular de


elementos, todos do mesmo tipo e espécie do tipo.

Uma matriz ou vetor é um grupo de posições na memória do


computador as quais são acessadas por intermédio de um único
nome, fazendo-se uso dos subscritos da matriz.
Usando vetores e matrizes
Alocação de vetores e matrizes: FORTRAN 77

Vetor com 100 elementos reais:


INTEGER POINTS(100) POINTS(1), … , POINTS(100)

REAL B(0:50) Vetor com 51 elementos reais:


A(0), …, A(50)

REAL A Matriz com 56 elementos,


formada por 8 linhas e 7
DIMENSION A(8,7) colunas: A(1,1), A(1,2), ...

REAL A(8,7)
Vetor com 5 elementos: C(1),
…, C(5), cada um deles do tipo
caractere de comprimento 25
CHARACTER C(5)*25
Usando vetores e matrizes
Alocação de vetores e matrizes: FORTRAN 90

Vetor com 100 elementos reais:


INTEGER, DIMENSION :: POINTS(100) POINTS(1), … , POINTS(100)

REAL, DIMENSION(0:50) :: B Vetor com 51 elementos reais:


A(0), …, A(50)

REAL, DIMENSION(8,7) :: A Matriz com 56 elementos,


formada por 8 linhas e 7
colunas: A(1,1), A(1,2), ...

CHARACTER(LEN= 25), DIMENSION(5) :: C


Vetor com 5 elementos: C(1),
…, C(5), cada um deles do tipo
caractere de comprimento 25
Usando vetores e matrizes
Alocação de vetores e matrizes: FORTRAN 90

REAL, DIMENSION(4) :: X = (/1.0,3.0,-1.5,4.5/)

X(1) = 1.0

X(2) = 3.0
Cria o vetor X, do tipo REAL,
com 4 elementos X(3) = -1.5

X(4) = 4.5
Usando vetores e matrizes
Alocação de vetores e matrizes: FORTRAN 90

REAL, DIMENSION(20) :: A = 0.0, B = 0.0

A(1) = 0.0
.
.
.
Cria os vetores A e B, do tipo A(20) = 0.0
REAL, com 20 elementos,
todos nulos B(1) = 0.0
.
.
.
B(20) = 0.0
Usando vetores e matrizes
Alocação DINÂMICA de vetores e matrizes: FORTRAN 90

Definição

Usada quando não sabemos, ou não queremos definir, o tamanho da


matriz ou vetor durante a etapa de compilação.

Permite que o tamanho da matriz ou vetor seja alocado durante a


execução do programa.

Permite que o espaço alocado à matriz ou vetor seja liberado durante a


execução do programa.
Usando vetores e matrizes
Alocação DINÂMICA de vetores e matrizes: FORTRAN 90

Exige dois comandos

● No campo de declaração das variáveis e constantes do programa

Vetor A, dimensão 1, com


elementos REAIS, é
REAL, DIMENSION(:), ALLOCATABLE :: A declarado como alocável
dinamicamente, sem
definição do tamanho do
vetor.
● No campo de execução do programa, ANTES de usarmos a matriz ou vetor

O vetor A tem tamanho 100, ou seja, é


ALLOCATE A(100) reservado espaço na memória do
computador para cada um dos 100
elementos: A(1), …, A(100)
Usando vetores e matrizes
Alocação DINÂMICA de vetores e matrizes: FORTRAN 90

Exige dois comandos

● No campo de declaração das variáveis e constantes do programa

Matriz B, dimensão 2, com


elementos REAIS, é
REAL, DIMENSION(:,:), ALLOCATABLE :: B declarada como alocável
dinamicamente, sem
definição do tamanho da
matriz.
● No campo de execução do programa, ANTES de usarmos a matriz ou vetor

A matriz B tem tamanho 56, com 8


ALLOCATE B(8,7) linhas e 7 colunas, ou seja, é reservado
espaço na memória do computador
para cada um dos 56 elementos:
B(1,1), B(2,1), …, B(8,7)
Usando vetores e matrizes
Algumas operações com vetores e matrizes: FORTRAN 90

3 4 8 5 2 1 8 6 9
A= B= C=
5 6 6 3 3 1 8 9 7

FORTRAN 90

INTEGER, DIMENSION(2,3) :: A = (/3, 5, 4, 6, 8, 6/)

SOMA DE MATRIZES INTEGER, DIMENSION(2,3) :: B = (/5, 3, 2, 3, 1, 1/)

INTEGER, DIMENSION(2,3) :: C

C=A+ B
Usando vetores e matrizes
Algumas operações com vetores e matrizes: FORTRAN 90

3 4 8 5 2 1 5 5 5 8 9 13
A= B= 5 C=
5 6 6 3 3 1 5 5 5 10 11 11

FORTRAN 90

INTEGER, DIMENSION(2,3) :: A = (/3, 5, 4, 6, 8, 6/)


SOMA DE MATRIZ
A POR UM INTEGER, DIMENSION(2,3) :: B = (/5, 3, 2, 3, 1, 1/)
ESCALAR IGUAL
A5 INTEGER, DIMENSION(2,3) :: C

C=A+ 5
Usando vetores e matrizes
Algumas operações com vetores e matrizes: FORTRAN 90

3 4 8 5 2 1 5 5 5 15 20 40
A= B= 5 C=
5 6 6 3 3 1 5 5 5 25 30 30

FORTRAN 90

INTEGER, DIMENSION(2,3) :: A = (/3, 5, 4, 6, 8, 6/)


MULTIPLICAÇÃO
DE MATRIZ A POR INTEGER, DIMENSION(2,3) :: B = (/5, 3, 2, 3, 1, 1/)
UM ESCALAR
IGUAL A 5 INTEGER, DIMENSION(2,3) :: C

C=A*5
Usando arquivos
Abertura de arquivos: comando OPEN

open ( [ Unit = ] <int-exp> [ , <op-list> ] )

Número inteiro que identifica a


unidade lógica externa, no caso Lista de especificadores opcionais que
o arquivo a ser aberto. Deve ser caracterizam o arquivo a ser aberto:
● Nome do arquivo
usado um número entre 1 e 100, ● Status do arquivo
evitando os números (unidades ● etc
pré-conectadas):
● 5, por se tratar da unidade de

entrada padrão (teclado);


● 6, por se tratar da unidade de

saída padrão (impressora).


Usando arquivos
Abertura de arquivos: comando OPEN

open ( 10, FILE = 'dados.dat', STATUS = 'OLD' )

Ação:

● Abre o arquivo existente de nome dados.dat;


● Este arquivo é associado com a unidade lógica de número 10;
● O status OLD indica que o arquivo deve existir previamente no diretório
onde o executável associado ao programa em Fortran 90 é executado.
Caso não exista, será produzido um erro na execução do código.
● O status OLD deve ser usado na abertura de um arquivo para a leitura de
dados.
Usando arquivos
Abertura de arquivos: comando OPEN

Mesmo open ( UNIT = 10, FILE = 'dados.dat', STATUS = 'OLD' )


comando

Ação:

● Abre o arquivo existente de nome dados.dat;


● Este arquivo é associado com a unidade lógica de número 10;
● O status OLD indica que o arquivo deve existir previamente no diretório
onde o executável associado ao programa em Fortran 90 é executado.
Caso não exista, será produzido um erro na execução do código.
● O status OLD deve ser usado na abertura de um arquivo para a leitura de
dados.
Usando arquivos
Abertura de arquivos: comando OPEN

Mesmo Open ( 10, FILE = 'dados.dat', STATUS = 'OLD', ACTION = 'READ' )


comando

Ação:

● Abre o arquivo existente de nome dados.dat;


● Este arquivo é associado com a unidade lógica de número 10;
● O status OLD indica que o arquivo deve existir previamente no diretório
onde o executável associado ao programa em Fortran 90 é executado.
Caso não exista, será produzido um erro na execução do código.
● O status OLD deve ser usado na abertura de um arquivo para a entrada de
dados.
● A opção ACTION na forma READ garante que o arquivo só pode ser usado
na entrada de dados.
Usando arquivos
Abertura de arquivos: comando OPEN

open ( 20, FILE = 'dados.dat', STATUS = 'NEW' )

Ação:

● Cria o arquivo de nome dados.dat;


● Este arquivo é associado com a unidade lógica de número 20;
● O status NEW indica que o arquivo será criado no diretório onde o
executável associado ao programa em Fortran 90 é executado. Se existir,
será produzido um erro na execução do código.
● O status NEW deve ser usado na abertura de um arquivo para a saída de
dados.
Usando arquivos
Abertura de arquivos: comando OPEN

Mesmo open ( 20, FILE = 'dados.dat', STATUS = 'NEW', ACTION = 'WRITE' )


comando

Ação:

● Cria o arquivo de nome dados.dat;


● Este arquivo é associado com a unidade lógica de número 20;
● O status NEW indica que o arquivo será criado no diretório onde o
executável associado ao programa em Fortran 90 é executado. Se existir,
será produzido um erro na execução do código.
● O status NEW deve ser usado na abertura de um arquivo para a saída de
dados.
● A opção ACTION na forma WRITE garante que o arquivo só pode ser usado
na saída de dados.
Operadores aritméticos
Soma +

Subtração - Ordem de prioridade

Multiplicação * A colocação de operações


entre parênteses fixa a
Divisão / prioridade como 1
Potência **

Resto da divisão
entre a e b modulo(a,b)

A = 3 / 2.0 * ( x**2 + 1 / 2.0) B = 3 / ( x + a)

ou É diferente de

A = 3 * ( x**2 + 1 / 2.0) / 2.0 B=3/x+a


Operadores relacionais

Igual a ==
● Não podem ser usados em expressões
Diferente de /= aritméticas

Maior que >


● Usados em estruturas condicionais
Maior ou igual a >=

Menor que <


● Usados em estruturas de repetição
Menor ou igual a <=
Operadores lógicos
● Não podem ser usados em expressões aritméticas

● Podem se usados em expressões lógicas

E .AND. REAL :: A, B Se a condição A > B for


LOGICAL :: C verdadeira, a variável
OU .OR. lógica A assume o valor
C=A>B TRUE; caso contrário
NÃO .NOT. assume FALSE

● Usados em estruturas condicionais

● Usados em estruturas de repetição


Estruturas condicionais

IF ( < condição > ) < comando >

Condição : < expressão relacional e/ou expressão lógica >

● Usado quando apenas um comando for executado, caso a condição


seja verdadeira.

REAL:: X LOGICAL :: flag

X = 0.0 flag = .TRUE.

IF ( X == 0.0 ) WRITE(*,*)” X vale zero” IF ( flag ) x = 0.0


Estruturas condicionais

IF ( < condição > ) < comando >

Condição : < expressão relacional e/ou expressão lógica >

● Usado quando apenas um comando for executado, caso a condição


seja verdadeira.

LOGICAL :: overlap

overlap = .FALSE.

IF ( .NOT. overlap ) write(*,*)” não existe overlap”


Estruturas condicionais
Condição : < expressão relacional e/ou lógica >
IF ( < condição > ) THEN

<comando 1> ● Usado quando mais de um comando forem


executados, caso a condição seja verdadeira
<comando 2>

END IF LOGICAL :: overlap


REAL :: X, Y, ran, L

L = 10.0
Ran = 2.0
overlap = .FALSE.
IF (.NOT. overlap) THEN
X = L * ran
Y = L * ran
END IF
Estruturas condicionais
Condição : < expressão relacional e/ou lógica >
IF ( < condição > ) THEN

<comando 1> ● Usado quando algum comando deve ser


… executado, caso a condição não seja
verdadeira
ELSE

<comando 2> LOGICAL :: overlap


… REAL :: X, Y, ran, L

L = 10.0
END IF ran = 2.0
overlap = .FALSE.
IF (.NOT. overlap) THEN
X = L * ran
Y = L * ran
ELSE
WRITE(*,*)”overlap é falso”
END IF
Estruturas condicionais
Condição : < expressão relacional e/ou lógica >
IF ( < condição 1 > ) THEN

<comando 1> ● Usado para o teste de múltiplas condições

ELSE IF ( < condição 2 > ) THEN REAL :: X


<comando 2> X = -10.0
IF ( X < 0.0 ) THEN
ELSE IF ( < condição 3 > ) THEN WRITE (*,*)” X é menor que zero”
ELSE IF ( X > 0.0 ) THEN
<comando 3> WRITE(*,*)” X é maior que zero”
ELSE
ELSE WRITE(*,*)” X é igual a zero”
END IF
<comando 4

END IF
Estruturas de repetição
DO < variável > = <expressão 1>, <expressão 2>[, <expressão 3>]

< comando 1>


END DO

● Usado para estruturas de repetição (ou loops) com com começo e fim conhecidos

< variável > : variável inteira que indexa o loop

< expressão 1 > : valor inicial da variável do loop

< expressão 2 > : valor final da variável do loop

< expressão 3 > : incremento (ou decremento) da variável do loop. Para


incremento igual a 1 pode ser omitida.
Estruturas de repetição
DO < variável > = <expressão 1>, <expressão 2>[, <expressão 3>]

< comando 1>


END DO

● Usado para estruturas de repetição (ou loops) com com começo e fim conhecidos

INTEGER :: I INTEGER :: I INTEGER :: I


REAL :: SOMA
DO I = 1000, 1, -1 DO I = 1, 1000, 2
SOMA = 0.0 WRITE(*,*)I WRITE(*,*)I
DO I = 1, 100 END DO END DO
SOMA = SOMA + 3 * I / 2.0
END DO
WRITE(*,*)” A soma vale ”,SOMA
Estruturas de repetição
DO ● Usado para estruturas de repetição (ou loops)
ilimitados. Para interromper o loop, uma estrutura
< comando 1> de saída deverá ser usada, com as funções EXIT
… ou STOP
END DO

INTEGER :: I, J INTEGER :: I, J
INTEGER :: I
J = 1000 J = 1000
I=0 I=0 I=0
DO DO DO
I=I+1 I=I+1 I=I+1
WRITE(*,*)” I = “,I WRITE(*,*)” I = “,I WRITE(*,*)” I = “,I
END DO IF ( I == J) EXIT IF ( I == J) STOP
END DO END DO
WRITE(*,*)” Sai do loop”

STOP : interrompe o programa


Loop ilimitado
EXIT : continua após o END DO
Estruturas de repetição
● Usado para estruturas de repetição
DO WHILE ( < condição > ) (ou loops) quando não sabemos (ou
não queremos definir) o número de
< comando 1> repetições.

END DO ● O loop é iniciado quando a < condição >


for verdadeira

Condição : < expressão relacional e/ou expressão lógica >


LOGICAL :: overlap
INTEGER :: I, J
INTEGER :: I, J
J = 1000
J = 1000 overlap = .FALSE.
I=1 I=1
DO WHILE ( I <= J ) DO WHILE ( .NOT. overlap .AND. I <= J )
I=I+1 WRITE(*,*)I
WRITE(*,*)” I = “,I I=I+1
END DO IF ( I > J ) overlap = .TRUE.
END DO