Professional Documents
Culture Documents
Programador:
1 - Apresentao
FORmula TRANslation: primeira linguagem de alto nvel.
Para acessar o estdio Compaq Visual Fortran (CVF) voc deve clicar em
Iniciar e ento escolher Programas. Depois, voc deve selecionar Compaq
Visual Fortran e, em seguida, clicar em Developer Studio, conforme mostra
a figura a seguir:
WRITE(2 , 15) B
READ(* , *) J
e
3 - Forma Fixa e Forma Livre para o Cdigo Fonte de um Programa WRITE(* , *) B
Forma fixa: extenso FOR, muitas restries: As declaraes anteriores significam:
a) o cdigo escrito da coluna 7 at a 72. Para continuar um comando em 1) leia o valor de "J" informado via teclado, no formato default,
outra linha, a linha de continuao deve ter um caractere na coluna 6,
indicando que se trata de uma continuao de linha. 2) escreva o valor de "B" na tela no formato padro.
b) variveis com at 6 caracteres maisculos (em alguns compiladores). O
primeiro no pode ser numrico.
Forma livre: extenso F90, poucas restries: Iniciadas por I, J, K, L, M e N, ou por qualquer letra se declaradas, no
incio do programa, assim:
a) o primeiro caractere de uma varivel no pode ser numrico.
INTEGER A, BC
b) continuao de linha: usa-se o smbolo & (e comercial), que deve ser
colocado no fim da linha a ser continuada. Lembre-se que a declarao deve ser feita no incio do programa.
10 FORMAT(I3)
Leitura:
No caso desse exemplo, o inteiro pode ter at 3 algarismos como, por exemplo,
READ(1 , 10) J
325
A declarao anterior significa: leia o valor de "J" na unidade 1 no formato
definido no endereo (label) 10.
Variveis reais:
Fechamento de um arquivo aps o fluxo de informaes: Iniciadas por qualquer letra exceto I, J, K, L, M e N ou, se iniciadas por
essas letras, forem definidas assim: REAL I, JAB.
CLOSE(UNIT = 1)
Formato exponencial para variveis reais: OPEN(UNIT = 4, FILE = 'DADOS.TXT', STATUS = 'OLD', IOSTAT = IERR)
15 FORMAT(Em.n) O comando anterior manda abrir a unidade 4, que o arquivo dados.txt, e sua
situao old, significando que ele j existe. Caso o arquivo exista mesmo,
A declarao anterior significa que o formato definido no endereo 15 o de o inteiro IERR ser igual a zero. Se no, IERR ser diferente de zero, mas a
um real que tem n algarismos significativos (m e n tm que serem definidos execuo do programa no interrompida.
na declarao). Ateno: m-n = 6 o nmero de dgitos necessrios somente
para simbolizar o formato exponencial.
Leitura de variveis
Exemplo:
Ao dar o comando
15 FORMAT(E16.10)
READ(* , * , IOSTAT = IERR) A
No exemplo anterior de FORMAT o real ter 10 algarismos significativos, mas
para escrev-lo sero necessrios 16 dgitos como no exemplo: espera-se que o programa leia um valor real para A (a menos que "A" tenha
sido declarado de outra forma). Devido ao uso do IOSTAT, se for teclada uma
0.5214558972E+05 letra, e no um real, a execuo do programa prossegue, mas IERR diferente
de zero, e o programador pode ter previsto uma ao a ser tomada pelo
Ateno: para evitar a declarao FORMAT voc pode, no programa, ler ou programa nesse caso.
escrever uma varivel assim:
READ(3 , "(e16.10)") a
IMPLICIT NONE
STATUS = 'OLD'
3) No menu File clique em New e depois, com a aba da caixa de dilogo New
em 'Files' selecione 'Fortran Free Format Source Files' para escrever o
programa fonte. Na edit Box File name d o nome Teste1 (a extenso ser,
automaticamente, .f90) ao arquivo do programa fonte e clique em OK para
ativar a janela de edio do programa fonte.
C:\Program Files\DevStudio\MyProjects\Equation (teste1 s o nome dado, pode ser qualquer nome). Para o computador parar,
aps os comandos serem executados pelo programa (ou em um determinado ponto
J se voc estiver trabalhando no Compaq Visual Fortran (CVF) o subdiretrio qualquer), d o comando
foi aberto em
STOP
C:\Program Files\Microsoft Visual Studio\MyProjects\Equation
No final do programa fonte, d o comando
Ateno: existem pequenas diferenas no processo de abertura, de uma verso
para outra, e apresentamos aqui os passos referentes verso CVF. No END
resumo da lio (primeiro item do menu 'Tutorial') so apresentados os
informando ao compilador o final fsico do arquivo com os comandos.
5) No menu File, salve o programa fonte clicando em Save. O nome do fonte 10 - Linking
j foi dado anteriormente:
9) Com a compilao, foi gerado um programa objeto chamado teste1.obj. Para
TESTE1.F90 criar um programa executvel (se no houver erros de compilao), clique no
menu Build e selecione o item Build Equation.exe. Depois, para executar o
(.f90, forma livre). Se no incio do processo voc tivesse optado pela forma programa, clique no menu Build e selecione o item Execute Equation.exe.
fixa, ao invs da livre, o nome do arquivo seria TESTE1.FOR, e voc deveria Genericamente, ao clicar no item Build Equation.exe, voc ligar (link)
ter seguido regras mais rgidas para criar o seu programa fonte.
todas as peas de seu programa, gerando um nico programa executvel (que
ter o nome do projeto). Conforme ser visto em lies futuras, seu software
6) O programa fonte j est no diretrio criado e, no caso do CVF, j faz
constitudo das seguintes peas: um programa principal (desenvolvido por
parte do projeto. (Se voc tivesse trabalhando no PS ainda deveria incluir o
voc) e de subrotinas e funes que sero desenvolvidas por voc, ou que j
arquivo no projeto. Para tal, no menu Insert voc clicaria em 'Files into
estaro disponveis no estdio, e que voc vai apenas usar. A ligao dessas
project...', selecionando o programa fonte e clicando no boto Add).
unidades de programa j compiladas (programas objeto) em um nico executvel
conhecida como operao de linking (link).
9 - Compilao
7) Para observar que o seu programa realmente j faz parte do projeto,
11 - Idia Global no Desenvolvimento de um Programa
clique na caixinha 'Equation files' na janela esquerda, que contm os
elementos do projeto. Clicando, depois, em Source Files (a primeira dentre Para desenvolver um programa, por mais simples que ele seja, as seguintes
as trs caixinhas amarelas) dever aparecer o arquivo teste1.f90, que j etapas so sempre seguidas:
pode ser compilado. A compilao uma operao que visa detectar erros de
programao (de sintaxe e de estrutura dos comandos) e, na ausncia de
erros, h a criao do programa objeto correspondente ao programa fonte.
12 - Comentrios
Veja, a seguir, o programa fonte do problema proposto. Nele, tem coisas do
tipo:
Acompanhe a compilao na janela retangular inferior mostrada anteriormente. 1 - O mouse j faz parte do programa,
2 - Ainda no temos um cursor,
Para obter mais informaes, voc pode investigar os outros itens da lista,
apontando o mouse e dando um duplo clique no item apontado.
write(*,*)' '
Read(4,*,iostat = ierr)A
Write(*,*)ierr
Aps escolher a opo todos os arquivos (*.*) (na figura, destacada em
Execute o programa e veja os valores de ierr para cada comando. azul) selecione o arquivo resultados.dat clicando, finalmente, no boto
Abrir. Voc ver, ento, o valor da soma S escrito no arquivo.
S = A + B + C
open(unit = 1, file = 'resultados.dat')
write(1,*)S
close(unit = 1)
P = 'PEDRO'
INTRODUO AO VISUAL FORTRAN CVF
qual seria o significado das expresses: p(1:1), p(:) e p(2:3). Uma forma de
Wilton, Cleide e Cleiton Diniz P. S. e Silva responder a isso at mesmo sem consultar o HELP seria fazendo um pequeno
programa definindo P = 'PEDRO' e dando os comandos a seguir:
write(*,*)p(1:1)
Programador: write(*,*)p(:)
write(*,*)p(2:3)
1 - Tipos de Dados
a) Inteiros - Declarados assim:
ficar bvio o significado das expresses desejadas.
INTEGER A, JCA
c) Caractere (literal) - Declarado assim: Assim, em um programa, podemos ter algo escrito do
seguinte modo:
CHARACTER (5) P
VB1 = .true.
P pode ter at 5 caracteres. Exemplo:
IA = .false.
P = 'PEDRO'
Caso a varivel lgica seja lida (na tela ou em um
- Leitura de strings - Formato A, leitura definida assim: arquivo) o seu valor deve ser informado assim:
teramos, como valor para S o seguinte resultado: A prioridade das operaes a mesma da aritmtica comum e, para mudar esta
prioridade, deve-se usar parntesis. Como exemplo, devemos observar que na
S = (8.400000,5.200000) expresso:
OBS: caso a varivel complexa seja definida (a parte real e a imaginria) a Z = 5.0*4.0**2+ 1.0
partir de clculos efetuados no programa, que determina, por exemplo, a
varivel real pr para parte real e a varivel real pi para a parte imaginria o valor de z calculado elevando inicialmente 4.0 ao quadrado (16.0) e
, ento, tal varivel complexa definida assim: multiplicando a resposta por 5.0 (80.0) e, a esse resultado parcial, deve-se
somar 1.0, o que d 81.0.
VC = cmplx(pr,pi)
J se tivssemos
Muito embora demos exemplos com preciso simples, a varivel complexa tambm
pode ter dupla preciso. Utilize o HELP de seu estdio para estudar esse Z = 5.0*4.0**(2+ 1.0)
assunto.
a primeira operao a ser efetuada seria (2+1.0) e o resultado final para z
seria z = 320.
Ateno: todas as declaraes de tipos de variveis devem ser feitas no
incio do programa, logo abaixo da declarao: No caso de vrios parntesis (ninho), a prioridade a dos parntesis mais
internos.
PROGRAM NOME
c) Concatenao (juno) de strings: //
e) relacionais: == ou .EQ. (igual), O significado desse comando bvio: v para o endereo (label) 10. O
/= ou .NE. (diferente), computador no executaria a instruo da linha subseqente linha do GOTO,
< ou .LT. (menor que), e sim, a declarao do endereo 10, e continuaria a executar as instrues a
<= ou .LE. (menor que, ou igual a), partir desta linha. No label 10 pode haver uma instruo qualquer, mas, em
> ou .GT. (maior que), geral, usa-se a seguinte:
>= ou .GE. (maior que ou igual a).
10 CONTINUE
case default
Comandos
Loop: DO
Depois, a estrutura encerrada com o comando
Como a estrutura de repetio apresentada anteriormente muito freqente em
programas, ela foi pr-definida em Fortran do seguinte modo: End Select
DO I = N1, N2, N3 Um programa exemplo pode ser visto logo a seguir, e voc pode copi-lo
(selecione-o, clique com o boto direito do mouse sobre a rea de seleo e
Seqncia de comandos depois clique em copiar). Depois, cole o programa em um arquivo dentro de
um workspace criado para esse fim. Execute-o e analise as possibilidades de
END DO uso do Select Case.
Exemplo 1
Na primeira linha do LOOP temos: faa a seqncia de comandos com o contador
I variando do valor N1 at o valor N2, com passo igual a N3 (I varia de N3 Um exemplo simples da utilizao dessa estrutura pode ser visto a seguir,
em N3). Quando o passo for 1 (variao de 1 em 1) pode-se iniciar o LOOP para uma varivel lgica vj que, obviamente, s pode assumir os valores
assim: .true. e .false.:
logical vj
Uma generalizao dessa estrutura foi feita da seguinte forma:
write(*,*)'informe vj ( f ou t )'
DO WHILE (condio) read(*,*) vj
Seqncia de comandos Select Case(vj)
END DO case(.true.)
write(*,*)'vj verdadeiro'
O DO WHILE pode ser melhor estudado no Help do seu estdio.
case(.false.)
write(*,*)'vj falso'
6 - A estrutura Select Case
case default
Uma estrutura que facilita a codificao de um programa, quando se procura
selecionar o valor de uma varivel (inteira, lgica ou character) dentre write(*,*) 'aqui no ser executado'
muitas possibilidades a estrutura chamada Select Case. O comando inicial
dessa estrutura End Select
case(v) testa se a varivel igual a v O primeiro case testa se a varivel maior ou igual a 1000 enquanto que o
case(:v) testa se a varivel menor ou igual a v segundo testa se a mesma varivel maior ou igual a 2000. Obviamente a
case(v:) testa se a varivel maior ou igual a v interseo no um conjunto vazio: para a varivel igual a 2100, por
case(v1:v2) testa se a varivel est entre v1 e v2 (inclusive) exemplo, os dois case seriam satisfeitos, e teramos um erro de lgica.
case(v1,v2,...,vn) testa se a varivel igual a v1, v2, ..., vn
Deve-se tomar muito cuidado para que duas condies no sejam 2) O comando DIMENSION, no programa principal, faz uma alocao esttica
simultaneamente satisfeitas na estrutura do select case pois, neste caso, h de memria: uma vez alocada a memria para um vetor ou matriz, no
um erro erro de lgica na construo de tal estrutura. Veja o fragmento de cabealho de declaraes, com uma declarao do tipo
programa a seguir:
Dimension x(20)
no h como desalocar o espao alocado. necessrios no programa, deve-se dar o comando
deve ser feita a declarao de quais so as variveis que sero alocadas DEALLOCATE(A, B)
dinamicamente, ao longo da execuo do programa, o que feito assim:
!para perceber a "desalocao", tire o comentrio
allocatable A(:),B(:,:) !do comando abaixo, compile e execute o programa.
!write(*,*)a(2),a(6),b(2,4)
A declarao anterior significa que sero alocados dinamicamente espaos de
memria para o vetor A e para a matriz B, de dimenso 2. O smbolo (:) write(*,*)w*z
significa que, a priori, A pode ser dimensionado com qualquer inteiro
maior que zero. O smbolo (:,:) tem o mesmo significado para B que tem do while (.true.)
duas dimenses. O programa , ento, desenvolvido normalmente, a partir da,
e vamos destacar um fragmento de cdigo mostrado a seguir: end do
11 - Abertura do Projeto
Para abrir o projeto clique no menu File e em seguida selecione o item 'Open
Workspace'.
Estrutura de codificao
Program Teste
Esquematicamente, temos:
Program Teste
Stop
End Program
a) Testar se A(1) = 0.0 (nesse caso temos uma equao do primeiro grau).
write(*,*)' A*X**2+B*X+C=0. Escreva os valores de A, B e C'
end if
write(*,*)' '
write(*,*)' '
write(*,*)' '
write(*,*)'Os dados no so coerentes.'
end if
stop
end program
13 - Locao do executvel
Assim que o aplicativo criado, j est disponvel para ser usado fora do
ambiente em que foi criado, isto , fora do estdio. O executvel deste
programa que acabamos de criar, por exemplo, pode ser encontrado, via
explorer, na pasta chamada DEBUG na locao escolhida para o projeto e que
indicada pela figura dada a seguir:
Comando DO
execuo do aplicativo, e a prpria aparncia desse aplicativo, no programa
principal. Os dois programas j estudados nas lies anteriores so
exemplos de programa principal.
Y = 4*F(argumentos)**2
Aula n 3 - Programas complexos - Programa principal e Subprogramas:
Function (funes numricas, grficas e definidas pelo programador), Nessa expresso "F" o nome atribudo funo e "argumentos" so os
Subroutine (grficas e definidas pelo programador) parmetros de entrada (dados) da funo. No caso do exemplo, o valor de Y
ser o qudruplo do quadrado do valor que "F" assumir para os argumentos
dados.
1 - Introduo
Quando um programa fica fisicamente muito grande, torna-se til 3 - Estrutura de um Programa Principal Simples
subdividi-lo em subprogramas mais simples e compreensveis, o que facilita
a sua criao, compilao (em partes) e manuteno. Em Fortran, um
programa completo (projeto) pode ser composto de 1 programa principal e de PROGRAM NOME
subprogramas
declaraes de tipo e outros
Programa principal <- S pode haver um nico programa principal em um comandos
projeto.
STOP
Subprogramas <- Em Fortran existem dois tipos de subprogramas que so:
funo e subrotina. END
Clculo de XBARRA Mais uma vez, bom enfatizar que o propsito de cada uma dessas
subrotinas pode ser facilmente conhecido utilizando-se o HELP do seu
Clculo de DESV_PAD estdio.
RETURN
Subrotinas que encerram uma caixa de dilogo
END
dlguninit(dlg) e dlgexit(dlg)
Neste exemplo esquemtico de subrotina podem entrar como dados o parmetro Para usar essas subrotinas deve-se declarar, no incio do programa:
N, por exemplo, (argumento) e os valores de X (em common). Uma vez
calculados os parmetros XBARRA E DESVIO_PADRAO (que so argumentos da TYPE (DIALOG) DLG
subrotina), os seus valores retornam ao programa ou subprograma que chamou
a subrotina. Tais valores passam a ficar disponveis na unidade de Essas subrotinas encerram uma caixa de dilogo (iniciada pela funo
programa que evocou a subrotina, a partir do ponto em que houve a evocao. lgica de dilogo "dlginit") e esse assunto ser detalhado na quinta lio.
moveto(x,y,pos)
que move o cursor para a posio (x,y). Para usar a subrotina "moveto" 8 RECURSIVIDADE: Subrotina Recursiva
necessita-se declarar, no incio do programa ou subprograma, o seguinte:
Uma subrotina chamada de recursiva quando ela pode evocar a si mesmo, o read(1,*)(x(i), i = 1, n) !l, a partir da segunda linha, o vetor x
que s vezes muito til. Para tal, basta, ao declarar a subrotina,
atribuir a ela a propriedade da recursividade, o que feito com a palavra close(unit = 1) !fecha o arquivo aberto
recursive antes da declarao subroutine nome. Veja o programa exemplo
a seguir: call calcula(n,xbarra,desv_pad) !Chamada da subrotina calcula.
!O programa Teste3 informa
!o valor de n (via argumento)
PROGRAM TST !e os valores de x (em common).
!A subrotina determina xbarra e
i = 0 !valor inicial !desv_pad e retorna os valores
n = 20 !valor final !ao programa principal atravs
CALL Inc (i,n) !dos dois ltimos argumentos.
END PROGRAM write(*,*)xbarra, desv_pad !escreve, na tela, xbarra e desv_pad
stop
RECURSIVE SUBROUTINE Inc (i,n) end
i = i + 1
WRITE (*,*) I
IF (i < n) CALL Inc (i,n)
Subroutine calcula(n,xbarra,desv_pad)
END SUBROUTINE Inc
common x(10)
Para compreender melhor, crie um workspace e execute este exemplo. xbarra = soma1(n)/float(n) !evoca a funo soma1 (e
!float) para calcular
!o valor mdio chamado
!de xbarra.
9 - Programa
desv_pad = sqrt((soma2(n) - soma1(n)**2/n)/(n-1)) !evoca soma1
Crie um novo Workspace chamado Desv_pad. Faa um programa que leia um !e soma2 para
conjunto de dados em um arquivo chamado dados.dat, calcule o valor mdio !calcular
e o desvio padro dos dados e informe os resultados na tela. O programa !desv_pad.
deve ter a seguinte estrutura:
return !retorna ao programa principal
!com xbarra e desv_pad calculados.
1) Programa principal chamado PROGRAM TESTE3 que l os dados, chama a
subrotina CALCULA (onde o valor mdio e o desvio padro sero calculados) End Subroutine calcula
e informa os resultados na tela.
4) Funo chamada FUNCTION SOMA2 que faz o somatrio do quadrado dos soma1 = 0.0
dados.
do i = 1,n
soma1 = soma1 + x(i)
end do
10 - Esboo do Programa
return
program teste3 end function soma1
common x(10) !armazena x numa rea comum aos subprogramas
soma2 = 0.0
11 - O Arquivo de Dados
do i = 1,n
soma2 = soma2 + x(i)**2 Veja o fragmento do nosso programa:
end do
...
return ...
open(unit = 1, file = 'dados.dat') !abre o arquivo dados.dat
end function soma2
read(1,*)n !l, na primeira linha do arquivo, o valor de n
...
...
write(*,*)xbarra, desv_pad !escreve, na tela, xbarra e desv_pad
...
...
15 - Problema Complementar:
Criao de um Mdulo para a Subrotina e as Duas Funes Desenvolvidas
Para criar tal mdulo, devemos criar um arquivo para colocar a subrotina e
as funes. Proceda da maneira usual: no menu File clique em New.
Ento, selecione Fortran Free Format Source File e d um nome ao
arquivo, por exemplo modulo_teste. Ao clicar OK, inicie a construo do
seu mdulo, que deve ter a seguinte estrutura:
module modulo_teste
contains
Subrotinas e funes
Testes
module modulo_teste
1) Coloque um teste para sabe se N menor ou igual a 1, informando ao
usurio a incompatibilidade destes valores com o propsito destes contains
clculos.
Subroutine calcula(n,xbarra,desv_pad)
2) Como no utilizamos alocao dinmica de memria, faa um teste common x(10)
para saber se o valor de N maior que a dimenso declarada para X, xbarra = soma1(n)/float(n)
e informe ao usurio o valor mximo para N. desv_pad = sqrt((soma2(n) - soma1(n)**2/n)/(n-1))
return
Nos dois testes anteriores, caso haja alguma violao, encerre o programa End Subroutine calcula
aps as mensagens com a informao de tal violao.
function soma1(n)
common x(10)
soma1 = 0.0
do i = 1,n
14 - Avance Mais Ainda: Criao de um Mdulo soma1 = soma1 + x(i)
end do
Um mdulo um componente de um projeto que contm subrotinas e funes return
que o usurio pode usar em seus programas. Conforme j vimos, para end function soma1
utilizar um mdulo j existente, no incio do programa principal ou do
subprograma em que tal mdulo ser usado basta declarar o seguinte: function soma2(n)
common x(10)
USE nome soma2 = 0.0
do i = 1,n
onde nome o nome do mdulo. O estdio que usamos (CVF) j contm soma2 = soma2 + x(i)**2
vrios mdulos para fins especficos tais como interface grfica (dflib), end do
construo de caixas de dilogo (Dflogm), informaes sobre a performance return
da mquina (dfport), etc. Assim, o usurio no precisa desenvolver end function soma2
end module modulo_teste
Program teste3
devemos ter, no programa principal, a declarao Nota-se alguns arquivos intermedirios e o arquivo executvel, que pode
ser copiado em disquete e executado em qualquer micro, fora do ambiente do
Use modulo_teste CVF. Naturalmente, na mesma pasta do executvel, devemos ter o arquivo de
dados.
A janela (com os componentes do projeto) fica, ento, com o seguinte
aspecto:
16 Locao do Executvel
Na pasta DEBUG (que est dentro da pasta do projeto), aps a operao de
linking, temos os seguintes arquivos:
3 - Definio do Menu Inicial
Em QuickWin Application um menu criado por uma funo lgica chamada
INTRODUO AO VISUAL FORTRAN CVF INITIALSETTINGS()
Wilton, Cleide e Cleiton Diniz P. S. e Silva Clicando num item de menu de um aplicativo desenvolvido QuickWin
ns podemos executar dois tipos de subrotinas, chamadas genericamente de
subroutine callback:
Programador:
1) Podemos executar as subrotinas internas, pr-definidas em MSFLIB (ou
DFLIB), o que requer declarar
end do
4 - Funo Initialsettings - Definio do Menu Inicial: Um
end program !fim do programa principal Exemplo
RESULT = MODIFYMENUFLAGSQQ(1,2,$MENUGRAYED)
Em quickWin Application um menu pode ser criado com a funo lgica
initialsettings(). Num programa, essa funo executada em paralelo com o Aqui, $MENUGRAYED um atributo que suspende, no caso, o item 2 do menu 1
programa principal, em loop infinito, e nem sequer precisa ser evocada. (ele fica "cinza", indisponvel). Para reabilitar o item 2 do menu 1
Veja, seguir, um exemplo simples de uso da funo: deve-se dar o comando:
RESULT = MODIFYMENUFLAGSQQ(1,2,$MENUENABLED)
LOGICAL(4) FUNCTION INITIALSETTINGS()
!Declarao da funo lgica que define o menu inicial No caso, a palavra que define o item 2 do menu 1 (C string) volta a ficar
"preta", indicando que menu foi reabilitado. Veja, no final dessa aula, um
USE MSFLIB !DFLIB mais atual, mas MSFLIB tambm funciona. programa exemplo (estrutura) com todos esses detalhes.
LOGICAL(4)result Observe, a seguir, a figura do menu de um programa em que vrios itens
esto habilitados e um deles est desabilitado:
EXTERNAL subr1, subr2 !declara as subrotinas callback externas
!que sero chamadas do menu.
INITIALSETTINGS = .TRUE.
2) apagar a linha PROGRAM TESTE1, use msflib !biblioteca com muitas funes grficas e outras.
3) mudar a posio do "dimension" para o incio da callback subr1, etc. TYPE (windowconfig) wc !define uma varivel para as informaes sobre a
configurao do micro.
Compile e link novamente pro_QW.f90. Depois, veja se o programa que TYPE (qwinfo) winfo !define uma varivel para informaes sobre o
determina as razes de uma equao do segundo grau est funcionado dimensionamento do frame e child window.
corretamente, agora como a callback subroutine subr1. TYPE (XYCOORD) XY !define uma varivel para estabelecer uma posio no
vdeo atravs de coordenadas em pixels.
LOGICAL status
!para abrir uma nova child window d os comandos abaixo (basta tirar !suspende todo o menu 1 durante a execuo desta subrotina
!o smbolo de comentrio "!") result = MODIFYMENUFLAGSQQ (1, 0, $MENUGRAYED)
!open(unit = 1, file = 'user', title = 'programa1') !ateno: se voc
!abrir, lembre-se de fechar antes do return. CALL CLEARSCREEN($GCLEARSCREEN)
!i = setbkcolor(12) ! colore a child window de vermelho
!call clearscreen($gclearscreen) !limpa a tela !PARA FAZER SEUS CLCULOS, CHAME UMA SUBROTINA OU...
!i= displaycursor($gcursoron) !ativa cursor !INSIRA O SEU CDIGO AQUI, E APAGUE A LINHA A SEGUIR
message = messageboxqq('Este item est indisponvel no
momento!'c,'Ateno',MB$OK.OR.MB$ICONEXCLAMATION.or.MB$DEFBUTTON1)
!suspende os itens do menu 1 durante a execuo desta subrotina
result = MODIFYMENUFLAGSQQ (1, 1, $MENUGRAYED) !reativa todo o menu aps a execuo desta subrotina
result = MODIFYMENUFLAGSQQ (1, 2, $MENUGRAYED) result = MODIFYMENUFLAGSQQ (1, 0, $MENUENABLED)
result = MODIFYMENUFLAGSQQ (1, 3, $MENUGRAYED)
result = MODIFYMENUFLAGSQQ (1, 4, $MENUGRAYED)
result = MODIFYMENUFLAGSQQ (1, 5, $MENUGRAYED) return
result = MODIFYMENUFLAGSQQ (1, 6, $MENUGRAYED)
result = MODIFYMENUFLAGSQQ (1, 7, $MENUGRAYED) end subroutine
result = MODIFYMENUFLAGSQQ (1, 8, $MENUGRAYED)
result = MODIFYMENUFLAGSQQ (1, 9, $MENUGRAYED)
!Obs: para suspender o menu 1 inteiro (e no item por item) bastaria !//////////////////////////////////////////////////////////////////////////
!dar o comando:
!result = MODIFYMENUFLAGSQQ (1, 0, $MENUGRAYED) subroutine subr3(ia)
USE MSFLIB
!PARA FAZER SEUS CLCULOS, CHAME UMA SUBROTINA OU... logical ia
!INSIRA O SEU CDIGO AQUI, E APAGUE A LINHA A SEGUIR
message = messageboxqq('Este item est indisponvel no ia = .true.
momento!'c,'Ateno',MB$OK.OR.MB$ICONEXCLAMATION.or.MB$DEFBUTTON1)
!suspende todo o menu 1 durante a execuo desta subrotina
result = MODIFYMENUFLAGSQQ (1, 0, $MENUGRAYED)
!reativa os itens do menu aps a execuo desta subrotina
result = MODIFYMENUFLAGSQQ (1, 1, $MENUENABLED) CALL CLEARSCREEN($GCLEARSCREEN)
result = MODIFYMENUFLAGSQQ (1, 2, $MENUENABLED)
result = MODIFYMENUFLAGSQQ (1, 3, $MENUENABLED) !PARA FAZER SEUS CLCULOS, CHAME UMA SUBROTINA OU...
result = MODIFYMENUFLAGSQQ (1, 4, $MENUENABLED) !INSIRA O SEU CDIGO AQUI, E APAGUE A LINHA A SEGUIR
result = MODIFYMENUFLAGSQQ (1, 5, $MENUENABLED) message = messageboxqq('Este item est indisponvel no
result = MODIFYMENUFLAGSQQ (1, 6, $MENUENABLED) momento!'c,'Ateno',MB$OK.OR.MB$ICONEXCLAMATION.or.MB$DEFBUTTON1)
result = MODIFYMENUFLAGSQQ (1, 7, $MENUENABLED)
result = MODIFYMENUFLAGSQQ (1, 8, $MENUENABLED) !reativa todo o menu aps a execuo desta subrotina
result = MODIFYMENUFLAGSQQ (1, 9, $MENUENABLED) result = MODIFYMENUFLAGSQQ (1, 0, $MENUENABLED)
!Obs: para ativar um menu inteiro desativado com o comando result =
MODIFYMENUFLAGSQQ (1, 0, $MENUGRAYED) basta dar o comando: return
!result = MODIFYMENUFLAGSQQ (1, 0, $MENUENABLED)
end subroutine
return
end subroutine
!//////////////////////////////////////////////////////////////////////////
subroutine subr5(ia)
USE MSFLIB
logical ia
ia = .true.
CALL CLEARSCREEN($GCLEARSCREEN)
return
end subroutine
Voc percebeu alguma incoerncia nas teclas de atalho dos itens do menu
!////////////////////////////////////////////////////////////////////////// Arquivo?
subroutine leiame(ia)
Importante:
USE MSFLIB
logical ia 1) Conforme j comentamos, essa estrutura que estudamos
inicial, apropriada somente para a execuo de tarefas rpidas, e isso
ia = .true. ser resolvido na lio n 8. Alm disso, a estrutura contm uma funo
chamada runqq, para a execuo de programas externos, e essa funo trava
!Quando j existir um arquivo leiame, apague os dois o seu aplicativo durante a execuo de tal programa. Entretanto, isso pode
!prximos comandos de sua aplicao ser resolvido com o uso da funo WinExec (estude-a no HELP) em
message = messageboxqq('Este item est indisponvel no
substituio a runqq. Duas formas de uso da funo WinExec (DFWIN) foram
momento!'c,'Ateno',MB$OK.OR.MB$ICONEXCLAMATION.or.MB$DEFBUTTON1)
dadas na lista de funes da lio n 3.
return
4) Para que tal cone aparea na Frame Window d um duplo clique na parte
branca do editor de cones e o identifique com a ID "Frameicon" (entre
aspas, primeira letra maiscula) conforme mostra a figura a seguir:
Programador:
1 - Tipos de Dilogo
Dentre os tipos de dilogo utilizados em uma caixa, podemos destacar os
13 Avance Mais Ainda: Correo das Teclas de atalho seguintes:
Note que existe uma incoerncia nas teclas de atalho dos itens do menu 1) Static Text: retngulo (invisvel) para escrever mensagens estticas
Arquivo (os 5 primeiros itens seriam evocados com a seqncia alt + P diretamente na caixa de dilogo. Static Text aquele que em todas as
). Corrija essa falha na funo initialsettings, conforme as informaes execues do programa o texto o mesmo e o usurio no pode mudar.
contidas nesta lio. Entretanto, o prprio aplicativo pode mudar tal texto.
2) Edit Box: usada pelo usurio para informar dados a serem lidos pelo
programa.
4) Button: botes que permitem ao usurio tomar uma deciso dentre vrias
possibidades, encerrando o dilogo.
4) Por enquanto, a caixa de dilogo tem dois botes: Cancel e OK. D um Na caixa Insert Files into Project que vai aparecer, voc ver vrios
duplo clique no boto OK e observe que a caixa 'Push Button Properties' arquivos do projeto, inclusive o arquivo script1.rc.
aparece, e voc pode modificar ou atribuir propriedades ao boto. Veja que
ele tambm j tem uma constante identificadora (ID): IDOK. Vamos manter
esse nome e, em 'Caption', podemos alterar o texto que vai parecer no
boto. Vamos apenas sublinhar a letra O. Para tal, coloque o smbolo & (e
comercial) antes do O.
6) Para adicionar script1.rc ao projeto, faa o seguinte: clique no menu ' 7) Agora, sua janela com os componentes do projeto deve ter ficado assim:
Project' e depois no item 'Add To Project' e, finalmente, em 'Files...':
alteraes deveriam ser feitas na seo de declarao, o que seria um
grande inconveniente.
LOGICAL RETLOG
USE DIALOGM J a varivel "dlg" a chamada varivel derivada de tipo dilogo pois,
conforme j enfatizamos, as variveis bsicas da linguagem so: inteira,
O mdulo dialogm contm funes e subrotinas que usaremos para real, lgica, literal e complexa.
estabelecer o dilogo.
Em subr2, o comando
Para utilizar as informaes contidas em resource.fd, d o comando:
RETLOG = DLGINIT(IDD_DIALOG1,DLG)
INCLUDE 'RESOURCE.FD'
deve ser colocado imediatamente depois dos clculos do valor mdio e do
logo aps a declarao "use dialogm". A declarao include inclui, no desvio padro (antes do comando write).
local em que ela aparece, todas as declaraes contidas em um arquivo
feito em separado pelo prprio compilador durante a construo da caixa. Aps o comando dlginit deveramos anotar os comandos que escrevem os
Conforme mencionamos, o prprio compilador Fortran cria um arquivo com um resultados calculados pelo programa na caixa de dilogo, mas tais comandos
conjunto de declaraes de valores de parmetros, correspondentes aos sero vistos mais frente. Por hora, vamos dar o comando:
recursos de dilogo que foram usados. Muito embora no seja recomendvel,
voc poderia copiar todas as declaraes de valores de constantes do IRET = DLGMODAL(DLG)
arquivo resource.fd e colar na seo de declaraes, em substituio
declarao INCLUDE 'RESOURCE.FD'. S que, quando o arquivo resource.fd for "dlgmodal" uma funo inteira que estabelece, de fato, o dilogo. Em
alterado, pela adio de novos dilogos (ou alterao dos existentes) as QuickWin Application uma caixa de dilogo sempre modal (enquanto a caixa
estiver ativa, todo o resto fica suspenso, espera da ao do usurio na
caixa). Um outro tipo de caixa de dilogo a modeless, que possibilita ao
8 - Inserindo Static Text na Caixa de Dilogo em Construo
usurio desenvolver outras aes no aplicativo, mesmo com a caixa de
dilogo ativa. QuickWin Application no possibilita a construo de caixas Para enviar dados caixa de dilogo, ns devemos especificar reas da
de dilogo do tipo modeless. caixa (endereos) para esse fim. Para acessar novamente a caixa de dilogo
d um duplo clique no arquivo script1.rc, disponvel na janela que mostra
Na seqncia, deveramos dar os comandos que lem dados na caixa de dilogo os arquivos do projeto (essa janela do lado esquerdo). Depois, d um duplo
, para serem usados no programa. Tais comandos sero vistos mais frente. clique sobre pasta "dialog" (na janela com os componentes do projeto) e,
Por enquanto, para encerrar o dilogo, devemos escrever: finalmente, um duplo clique em IDD_DIALOG1. A caixa de dilogo e o editor
de recursos (controls) vo aparecer. Para escrever textos e resultados na
CALL DLGUNINIT(DLG) caixa de dilogo, vamos utilizar a caixa 'Static Text' (boto identificado
no editor de recursos pelo smbolo Aa). Proceda assim:
"dlguninit" uma subrotina que finaliza o dilogo.
1) Clique no boto Aa do editor de recursos (controls) e depois clique na
Obs: IRET um inteiro (retorno de dlgmodal) igual ao valor estabelecido posio desejada da caixa de dilogo onde o Static Text deve aparecer.
pelo CVF em 'resource.fd' para o boto clicado, e o seu valor deve ser Ento, vai aparecer uma caixa de 'Static Text'.
usado pelo programador para que o programa identifique qual foi o boto
clicado na caixa de dilogo.
7 Problema
Inserir a caixa de dilogo identificada por IDD_DIALOG1 em subr2 para
apresentar os resultados obtidos pela callback que calcula o valor o mdio
e o desvio padro de uma srie de dados.
call dlguninit(dlg)
CALL DLGUNINIT(DLG)
d um comando (provisrio, s para teste) para imprimir o valor de IRET na Feche essa caixa.
tela. Execute o programa vrias vezes, clicando em OK e em Cancel, e
observe, em cada situao, o valor de IRET. Veja que ao clicar no boto OK 3) Clique em outra caixa 'Static Text' no editor de recursos e coloque-a
, temos IRET = 1. Ao clicar em Cancel, temos IRET = 2 (esses so dois na frente da primeira. D um duplo clique sobre a segunda 'Static Text'
valores default. Qualquer outro boto adicionado caixa ter o seu valor para ativar a caixa 'Text Properties'. Utilize a caixa de propriedades
definido em resource.fd, pelo prprio compilador). Podemos usar estes para identificar (ID) a segunda static text com o nome IDC_STATIC1.
valores constantes num programa para que ele reconhea e tome as decises nela que o programa vai escrever o valor de XBARRA, que j deve ter sido
impostas pelo usurio atravs do boto clicado. calculado em subr2. Feche a caixa 'Text Properties' e aumente um pouco o
comprimento de IDC_STATIC1. O aspecto da caixa agora o seguinte:
9 - Insero de um Bitmap na Caixa de Dilogo
Suponha que tenhamos o seguinte bitmap em um diretrio, e que queiramos
inseri-lo na caixa de dilogo em construo:
Agora que o bitmap est adicionado ao projeto, ele pode ser inserido na
caixa de dilogo IDD_DIALOG1. Para tal, na janela com os componentes do
Para tal, devemos importar o bitmap para o projeto, o que requer, no menu projeto (veja na figura anterior), d um duplo clique em IDD_DIALOG1 que a
Insert, clicar no item Resource.... Como anteriormente, vai aparecer a caixa em construo vai aparecer. Ento, clique em Picture no editor de
caixa Insert Resource. Voc deve selecionar Bitmap e depois clicar no recursos (controls) e depois d outro clique na posio da caixa onde o
boto Import. Vai aparecer uma caixa chamada Import Resource e, via bitmap deve aparecer. A caixa em construo ter o seguinte aspecto:
browse, localize o arquivo com o bitmap:
RETLOG = DLGINIT(IDD_DIALOG1,DLG)
IRET = DLGMODAL(DLG)
IRET = DLGMODAL(DLG)
CALL DLGEXIT(DLG)
Ao fechar a caixa de propriedades Picture Properties, salve o projeto.
10 continue
retlog = dlginit(idd_dialog2,dlg)
!inicia o dilogo idd_dialog2
Para completar, a sua caixa de dilogo para a sada de resultados poderia
iret = dlgmodal(dlg) ter o seguinte aspecto:
!estabele o dilogo (iret tem o valor do boto cliclado)
Esperamos que tal projeto lhe seja til, mas ressaltamos que ele s
interessante para a execuo de tarefas rpidas, pois ainda contm alguns
defeitos, apontados na lio n 4. Nessa lio mencionamos tambm que um
projeto muito mais abrangente ser apresentado na lio n 8, e desejamos
que voc tenha disposio para chegar at l.
i = runqq('write.exe', 'dados.dat')
sendo que a funo runnqq definida no mdulo MSFLIB (ou DFLIB). Voc
poderia utilizar, ainda, uma funo do Windows Application, definida em
(MSFWIN ou DFWIN):
i = WinExec('notepad.exe dados.dat',sw_show)
Programador:
1 - Introduo
Voc pode mudar a origem do sistema de eixos para outro local atravs da
O princpio de uma animao muito simples e se baseia na superposio subrotina SETVIEWORG e a forma de fazer isto pode ser vista no HELP do seu
imagens em determinados intervalos de tempo. As imagens a serem estdio.
superpostas por um programa em Fortran podem ter duas origens:
1) podem ter sido feitas por outro software, como bitmaps, e o programa
Fortran somente apresentar essas imagens na seqncia adequada, 2 - Criao de uma Animao Simples
2) podem ser geradas por linhas de cdigo no prprio programa Fortran. Para criar a nossa animao simples, vamos dividir o cdigo em um programa
principal chamado
Alm dessas duas possibilidades, um programa Fortran ainda pode exibir
vdeos, mas concentraremos nossa ateno na opo de nmero 2. Para tal, PROGRAM ANIMA
necessrio conhecermos os tipos de sistemas de coordenadas para a tela. Em
QuickWin Application temos dois sistemas bsicos de coordenadas: o com as definies para as janelas (tamanho, cor da tela, etc) e em uma
primeiro baseado em linhas (Rows) e colunas (Columns) e o segundo, em subrotina que cria o movimento em si, que denominaremos
pixels (h um terceiro tipo, semelhante ao segundo, mas no falaremos
nele). Para utilizar este segundo sistema de coordenadas necessrio SUBROUTINE MOVIMENTO(IY)
definir, no cabealho do programa, uma varivel do tipo derivada para este
fim, declarando: O argumento IY define a coordenada Y onde a estrada ser desenhada.
a varivel "pos" aquela que, em um comando, identifica o sistema de 3 - O programa Principal Definies Gerais
coordenadas que deve ser utilizado (naquele comando). A origem do sistema
de eixos da Child Windows no canto superior esquerdo da tela, sendo que Naturalmente, vamos criar um programa principal que contenha elementos
x cresce para a direita e y para baixo: grficos, o que requer as seguintes declaraes iniciais:
USE MSFLIB
winfo.TYPE = QWIN$MAX
I = CLICKMENUQQ(QWIN$TILE)
Para colorir a tela (Child Window) de branco utilize a funo
Para disponibilizar as fontes do micro deve-se dar o comando
i = SETBKCOLOR(15)
i = INITIALIZEFONTS( )
cujas cores vo do nmero 0 (preto) at 15 (branco), ou ento d o comando
J para utilizar uma das fontes disponibilizadas, com o objetivo de se
i = SETBKCOLORRGB(#ffffff) escrever mensagens na tela, deve-se dar um comando do tipo
que estabelece a cor branca para a tela, em hexadecimal (veja no HELP as i = SETFONT ('t''Arial''h30')
funes setbkcolorrgb e setcolorrgb).
Nesse comando fica claro que vamos escrever mensagens com a fonte Arial e
Na seqncia do comando que colore a tela, chame a subrotina que limpa a a altura das letras 30 pixels. A largura tambm poderia ser
cor anterior da tela inteira: especificada, bem como outros detalhes (negrito, sublinhado, etc), o que
pode ser visto no HELP de seu estdio.
CALL CLEARSCREEN($GCLEARSCREEN)
Cada uma das funes apresentadas retorna um valor que pode ser
interpretado como a resposta do sistema ao comando, e essa reposta informa
Pode-se eliminar a barra de status (parte inferior da Frame Window), se o comando foi ou no executado. Como exemplo, ao dar o comando i =
mostrada no exemplo a seguir, setfont('t''Arial''h30'), se tivermos i = 1, porque o micro no dispe
daquela fonte (Arial com altura de 30 pixels) e outra deve ser escolhida.
Estude, no HELP de seu estdio, as possveis respostas de cada uma das
funes que ns apresentamos.
call moveto(150,5,pos)
!leva cursor para as coordenadas indicadas
call moveto(10,250+iy,pos)
!leva cursor para as coordenadas indicadas
i = lineto(590,250+iy)
ou no estilo tile, conforme a figura !traa um linha at a posio indicada
!caminho: ix a varivel para mudar a posio do caminho Uma vez teclado ENTER, o caminho deve partir. Assim, aps o comando
read(*,*), que espera pelo sinal de partida, deve-se chamar a subrotina
i = setcolor(14) que vai produzir o movimento:
!cor da carroceria do caminho ba (amarela)
CALL MOVIMENTO(IY)
i = rectangle($gfillinterior,20+ix,215+iy,60+ix,242+iy)
!"$gfillinterior" significa pintar todo o interior do retngulo Depois disso, o programa principal deve ser encerrado, com os comandos
i = rectangle($gfillinterior,61+ix,225+iy,75+ix,242+iy) e
i = setcolor(5) END
!cor do contorno da cabine e da carroceria (magenta)
i = rectangle($gborder,20+ix,215+iy,60+ix,242+iy)
!"$gborder" significa desenhar s o contorno. 5 - A Subrotina que Produz o Movimento
i = rectangle($gborder,61+ix,225+iy,75+ix,242+iy) A subrotina que produz o movimento desenvolvida a partir da seguinte
lgica: um desenho exposto ao observador por um dado intervalo de tempo,
i = setcolor(0) !cor dos pneus digamos 80 ms. Depois, o desenho apagado e imediatamente refeito mais
frente, com ou sem alteraes, ficando exposto por mais um certo
i = ellipse($gfillinterior,25+ix,243+iy,31+ix,249+iy) intervalo de tempo, o que d a sensao de movimento. A varivel que
!pneus traseiros possibilitar deslocar o desenho ix, e pode-se usar um LOOP para fazer a
variao contnua de ix. Assim, a estrutura da subrotina ser a seguinte:
i = ellipse($gfillinterior,64+ix,243+iy,70+ix,249+iy)
!pneus dianteiros
end do
return
end subroutine
Para estabelecer um novo tamanho e posio para a child window deve-se dar
o comando
i = SetWSizeQQ(0, winfo)
aps ter sido definido os novos valores para winfo.y, winfo.x, winfo.w e
winfo.h.
call movimento(iy)
...
...
i = getwsizeqq(0,QWIN$SIZEMAX,winfo)
winfo.y = 0
i = ellipse($gfillinterior,25+ix,243+iy,31+ix,249+iy)
!pneu traseiro logo depois do Use MSFLIB. Imediatamente depois do
i = ellipse($gfillinterior,64+ix,243+iy,70+ix,249+iy)
!pneu dianteiro implicit none
call sleepqq(80)
!mostra a imagem desenhada por 80 ms. voc deve escrever ainda:
return Conforme pode ser visto na caixa, as duas check box so s para
exemplificar sua utilizao. O boto Finalizar o idcancel e o V
end subroutine para... o idok. O primeiro radio button, chamado de idc_radio1, deve
desviar o programa para o incio da animao (imediatamente antes da
primeira chamada call movimento(iy)), onde voc deve dar o comando
Para compreender o uso de Check Box e Radio Button, construa a caixa de O segundo radio button, chamado de idc_radio2, deve desviar o programa
dilogo idd_dialog1 neste projeto, com os elementos mostrados: para a segunda parte da animao, que comea com a abertura da Nova Janela
. Assim, deve-se dar o comando
20 continue
antes da abertura dessa Nova Janela, que voc j deve ter implementado.
STOP
...
...
Na caixa temos: idc_check1, idc_check2, idok (cujo texto apresentado V retlog = dlginit(idd_dialog1, dlg) !inicia o dilogo
para...), idcancel (cujo texto definido em Caption Finalizar) e, na
!desabilita radio3 Retlog = dlginit(idd_dialog1,dlg)
retlog = dlgset(dlg, idc_radio3, .false., dlg_enable)
Retlog = dlgset(dlg, idok, "&Contagem")
!check box1 inicia com falso Retlog = dlgset(dlg, idc_check1, .false.)
retlog = dlgset(dlg, idc_check1, .false.) Retlog = DlgSetSub(dlg, idok, Icallback)
if(iret == 2) then !o boto Finalizar foi clicado Nesse exemplo, temos algo j visto sobre o estabelecimento da forma de
call dlguninit(dlg) apario de um dilogo em uma caixa que, no caso, uma check box:
stop
end if Retlog = dlgset(dlg, idc_check1, .false.)
!obtm o valor falso ou verdadeiro para idc_check1 Este comando estabelece que a check box idc_check1 vai ser apresentada na
retlog = dlgget(dlg,idc_check1,pushed_state3) caixa de dilogo, inicialmente com o estado igual a .false.. Temos,
if(pushed_state3) then tambm nesse exemplo, algo de novo, como a forma de se modificar, via
message = MESSAGEBOXQQ('A Check Box1 retornou ".True."! 'C,& cdigo, o texto que aparecer no boto idok:
'Sobre a Check Box'C, MB$ICONEXCLAMATION .or.MB$OK)
else Retlog = dlgset(dlg, idok, "&Contagem")
message = MESSAGEBOXQQ('A Check Box1 retornou ".False."! 'C,&
'Sobre a Check Box'C, MB$ICONEXCLAMATION .or.MB$OK) Com esse comando, o boto idok passar a exibir o texto Contagem. H que
end if se relembrar que a forma inicial de se fazer esta mudana seria atravs da
caixa de propriedades do boto idok, mudando-se o texto em Caption.
!obtm o valor falso ou verdadeiro para idc_check2
retlog = dlgget(dlg,idc_check2,pushed_state4)
if(pushed_state4) then
message = MESSAGEBOXQQ('A Check Box2 retornou ".True."! 'C,& DlgSetSub
'Sobre a Check Box'C, MB$ICONEXCLAMATION .or.MB$OK)
else Uma novidade muito maior, em relao aos recursos de programao que j
message = MESSAGEBOXQQ('A Check Box2 retornou ".False."! 'C,& estudamos, o terceiro comando entre dlginit e dlgmodal:
'Sobre a Check Box'C, MB$ICONEXCLAMATION .or.MB$OK)
end if Retlog = DlgSetSub(dlg, idok, Icallback)
!obtm o valor falso ou verdadeiro para idc_radio1 Em geral, ao clicar num boto, a funo dlgmodal retorna um valor (atravs
retlog = dlgget(dlg,idc_radio1,pushed_state1) de Iret) indicando qual foi o boto clicado. Alguns valores so lidos, se
if(pushed_state1) then !se idc_radio1 for T, v para o incio for o caso, e o dilogo sempre encerrado. Entretanto, com o uso de
goto 10 DlgSetSub as coisas funcionam de maneira diferente. O comando anterior,
end if por exemplo, estabelece que se o boto idok for clicado, a funo
dlgmodal no ser evocada, e sim uma subrotina callback chamada Icallback
!obtm o valor falso ou verdadeiro para idc_radio2 , sendo que a caixa de dilogo continua ativa. Essa subrotina callback,
retlog = dlgget(dlg,idc_radio2,pushed_state2) criada pelo usurio, pode modificar alguns dos elementos de dilogo, ou
if(pushed_state2) then !se idc_radio2 for T, v para o meio mesmo inicializar outra caixa de dilogo. Para exemplificar isso,
goto 20 apresentaremos o cdigo a seguir, que pode ser compilado, ligado e
end if executado em um projeto criado especificamente para esse fim. Com a
execuo, voc perceber que tal projeto auto-explicativo. Alm do
call dlguninit(dlg) cdigo, voc deve criar duas caixas (idd_dialog1 e idd_dialog2) que
... devero ter as seguintes aparncias:
...
Em idd_dialog1 a primeira static text mostrada idc_static2 enquanto !clicando em idc_button1 a callback resultados
que a de baixo, utilizada em Contagem, idc_static1. Os trs radio !chamada e uma nova caixa de dilogo evocada.
buttons so, pela ordem, idc_radio1, idc_radio2 e idc_radio3, enquanto que retlog = dlgsetsub(dlg, idc_button1, resultados)
button1 tem a ID IDC_BUTTON1. Em idd_dialog2 o boto OK , na verdade,
iret = dlgmodal(dlg) !o nico boto que evoca dlgmodal
idcancel, o que possibilita manter o X do canto superior direito e
! Finalizar (idcancel) que no
button1 idc_button1. Para a caixa Resultados (idd_dialog2), veja a caixa !est associado a nenhuma dlgsetsub.
Dialog Properties:
!obtm o ltimo texto (valor) escrito em idc_static1
retlog = dlgget(dlg,idc_static1,text)
read(text,*,iostat = ierr) i
if(ierr /= 0) text = '0'
!escreve o ltimo valor contado em updatestatictext na tela
write(*,"(' O boto Contagem foi clicado ',(a),' vezes.')") &
trim(text)
call dlguninit(dlg)
!evoca a si mesmo: recursividade. Para apresentar !grfico da funo definida em "function f(x)": inicializao.
!resultados, acabe com a evocao a si mesmo, isto nsegmentos = 499 !nmero de segmentos (mximo igual a 500, mnimo = 2)
!, acabe com a recursividade. x(1) = -25.0 !valor inicial de x, poderia ser lido
retlog = dlgsetsub(dlg1, idc_button1, resultados) x(nsegmentos+1) = 25.0 !valor final de x, poderia ser lido
deltax = (x(nsegmentos+1)-x(1))/float(nsegmentos)
iret = dlgmodal(dlg1)
!valores de y: funo definida em "function f(x)" <<<<==== FUNO
call dlgexit(dlg1) !ateno: os pontos a serem ligados sero gerados a partir da funo
!"f(x)" definida em "funtion f(x)" mas os pontos poderiam ser lidos
return !em um arquivo de dados.
end subroutine y(1) = f(x(1))
do i = 2,nsegmentos + 1
if(i /= nsegmentos + 1) x(i) = x(i-1) + deltax
10 Grfico 2D: Noes bsicas y(i) = f(x(i))
end do
No atual estgio de nosso estudo, j devemos ter condies de icor_linha = 12 !cor da linha do grfico
desenvolver programas para traar grficos 2D e 3D, j que os comandos iavx = 80 ! avano nas coordenadas x (deslocamento de todo o desenho)
bsicos envolvem apenas a subrotina moveto e a funo lineto, ambas iavy = 50 ! avano nas coordenadas y (deslocamento de todo o desenho)
grficas. S que, s vezes, no percebemos isso. Portanto, vamos !origem do sistema de eixos: (100+iavx,280+iavy) <= posio em pixels
apresentar um esboo que d noes para que um programa criterioso possa xux = 'X(Ux)' !grandeza "X" e sua unidade
ser elaborado posteriormente. Aqui, no nos preocupamos com aspectos yuy = 'Y(Uy)' !grandeza "Y" e sua unidade
importantes como a incluso ou descarte da origem do sistema de eixos, tit = ' Noes Sobre Grficos' !ttulo do grfico
quais os quadrantes a serem ocupados pelo grfico e os degraus apropriados
para a construo de escalas. call graf_2D(nsegmentos,x,y,icor_linha,iavx,iavy,xux,yuy,tit)
Um outro aspecto que no consideraremos refere-se forma de do while (.true.)
informao da funo cujo grfico iremos traar. No exemplo a seguir, a end do
informao ser feita no programa fonte, em function f(x). Entretanto, o end program
mais adequado captar um string com a informao da funo, e transformar
tal string numa expresso aritmtica, posteriormente calculada. Em geral
esta operao feita por mdulos especficos para este fim, chamados de subroutine graf_2D(nsegmentos,x,y,icor_linha,iavx,iavy,xux,yuy,tit)
!nsegmentos: nmero de segmentos (de 2 a 500) a serem ligados !y
!x: valores da varivel independente (de 3 a 501) call moveto(99+iavx,280+iavy,pos)
!y: valores da varivel dependente (de 3 a 501) i = lineto(95+iavx,280+iavy)
!icor_linha: cor da linha do grfico write(text,'(e10.4)')ymin !escreve o valor de ymin no caractere text
!iavx: avano de todo o grafico em x (em pixels) call moveto(17+iavx,272+iavy,pos)
!iavy: avano de todo o grfico em y (em pixels) call outgtext(trim(text))
!xux: string com informaes sobre a grandeza marcada em x => X(Ux) call moveto(99+iavx,80+iavy,pos)
!yuy: string com informaes sobre a grandeza marcada em y => Y(Uy) i = lineto(95+iavx,80+iavy)
!tit: string com o ttulo do grfico write(text,'(e10.4)')ymax !escreve o valor de ymax no caractere text
use msflib call moveto(17+iavx,72+iavy,pos)
implicit none call outgtext(trim(text))
type (xycoord) pos call moveto(99+iavx,180+iavy,pos) !define o meio do comprimento til
integer nsegmentos,i,icor_linha,i2 i = lineto(95+iavx,180+iavy)
integer ixcoord(nsegmentos+1),iycoord(nsegmentos+1),iavx,iavy
real x(nsegmentos+1),y(nsegmentos+1),ymin,ymax !nomes dos eixos
character (30) xux,yuy,text call moveto(180+iavx,315+iavy,pos) !posiciona para escrever um nome
character (50) tit call outgtext(trim(xux)) !nome e unidade da grandeza no eixo x
CALL SETGTEXTROTATION (900) !giro de 90 no texto a ser escrito em y
!fontes call moveto(60+iavx,220+iavy,pos) !posiciona para escrever um nome
i = initializefonts() call outgtext(trim(yuy)) !nome e unidade da grandeza no eixo y
i = SETFONT ('t''Arial''h16e') CALL SETGTEXTROTATION (0) !retorna para o ngulo zero normal
if(i.eq.-1) i = SETFONT ('t''times new roman''h17e') call moveto(110+iavx,30+iavy,pos) !posiciona para escrever um nome
if(i.eq.-1) i = setfont ('t''courier new''h16e') call outgtext(tit) !ttulo do grfico
if(i.eq.-1) i = SETFONT ('t''Tahoma''h16e')
if(i.eq.-1) i = SETFONT ('t''CAC FUTURA CASUAL''h16e') !linha do grfico <<== GRFICO PROPRIAMENTE DITO
!***********************************************************************
!valores mximo e mnimo de y i = setcolor(icor_linha) !cor da linha do grfico
ymin = y(1)
ymax = y(1) !equao da escala x
do i = 1,nsegmentos+1 ixcoord(1) = 100 + ifix(200*(x(1)-x(1))/(x(nsegmentos+1)-x(1))) + iavx
if(y(i) < ymin) ymin = y(i) !equao da escala y
if(y(i) > ymax) ymax = y(i) iycoord(1) = 280 - ifix(200*(y(1)-ymin)/(ymax-ymin)) +iavy
end do !PS: lembre-se que o "y = 0" para a tela em cima. Por isso,
!testa se a funo constante ! a equao da escala y tem o "280 -".
if( ymax <= ymin) then
ymin = ymax - 1.0 !isso apenas para desenhar um mximo e um call moveto(ixcoord(1),iycoord(1),pos) !posiciona o cursor
!um mnimo. O valor do mnimo no relevante.
end if do i = 1,nsegmentos + 1 !loop para traar a linha
!equao da escala x
!comprimento de cada eixo: 260 (y) e 280 (x) pixels. til 200 pixels. ixcoord(i) = 100 + ifix(200*(x(i)-x(1))/(x(nsegmentos+1)-x(1))) + iavx
!origem do sistema de eixos: (100+iavx,280+iavy) <= posio em pixels !equao da escala y
!desenho dos eixos. iycoord(i) = 280 - ifix(200*(y(i)-ymin)/(ymax-ymin)) + iavy
i = setcolor(0) !eixos de cor preta i2 = lineto(ixcoord(i),iycoord(i))
call moveto(100+iavx,20+iavy,pos) call sleepqq(20) !d a sensao de "animao". Se no quiser, tire!
i = lineto(100+iavx,280+iavy) !linha vertical end do
i = lineto(380+iavx,280+iavy) !linha horizontal !***********************************************************************
call moveto(99+iavx,20+iavy,pos)
i = lineto(99+iavx,281+iavy) !reforo na linha vertical (trao duplo) return
i = lineto(380+iavx,281+iavy) !reforo na linha horizontal (trao duplo) end subroutine
retlog = GETWINDOWCONFIG (wc) tit = ' Noes Sobre Grficos 3D' !ttulo do grfico
ymin = ymax - 1.0 !isso apenas para desenhar um mximo e um !clculos que possibilitam traar uma malha com at 501 x 501 linhas:
!um mnimo. O valor do mnimo no relevante.
!*********************************************************************** i2 = lineto(ixcoord(i,j),iycoord(i,j))
do j = 1,nsegmentos+1
end do
do i = 1,nsegmentos + 1
end do
!equao da escala x !***********************************************************************
ixcoord(i,j) = 100 - ifix(120.*cos(45./180.)*(j-1)/(nsegmentos &
if(icor_linha /= 0) then !cores por cota (4 cotas. Mude, se quiser) if(y(j,i) > 2*(ymax-ymin)/4+ymin .and. y(j,i) <= 3*(ymax&
else else
else end if
else end do
!***********************************************************************
i_cor = setcolor(13)
return
end if
end subroutine
end if
!fontes
i = initializefonts()
12 Avance um pouco mais - Grfico 3D: MALHA SLIDA
i = SETFONT ('t''Arial''h16e')
Ao invs de traar uma superfcie com malha vazada (todas a linhas
transversais e depois todas as longitudinais), voc pode traar uma if(i.eq.-1) i = SETFONT ('t''times new roman''h17e')
superfcie de malha slida, intercalando trechos de linhas transversais
com trechos de linhas longitudinais. Para isso estude, no help do estdio, if(i.eq.-1) i = setfont ('t''courier new''h16e')
detalhes sobre a varivel de tipo derivado denominada poly. Depois, estude
o cdigo fonte da nova subrotina graf_3D dada a seguir. Finalmente, if(i.eq.-1) i = SETFONT ('t''Tahoma''h16e')
substitua a subrotina de mesmo nome dada anteriormente, pela apresentada
aqui, compile e execute o novo programa. O resultado para a superfcie if(i.eq.-1) i = SETFONT ('t''CAC FUTURA CASUAL''h16e')
uma figura bem mais ntida que a anterior. Voc pode, tambm, deixar as
duas opes (malha vazada e slida) para a escolha do usurio de seu !valores mximo e mnimo de y
software.
ymin = y(1,1)
x1ux1,x2ux2,yuy,tit) do i = 1,nsegmentos+1
!x1: valores da varivel independente x1 (501 valores) if(y(i,j) < ymin) ymin = y(i,j)
!y: valores da varivel dependente x2 (501 valores) if(y(i,j) > ymax) ymax = y(i,j)
!x1ux1: string com informaes sobre a grandeza if( ymax <= ymin) then
!marcada em x1 => X1(Ux1) ymin = ymax - 1.0 !isso apenas para desenhar um mximo e um
!um mnimo. O valor do mnimo no relevante.
!x2ux2: string com informaes sobre a grandeza
end if
!marcada em x2 => X2(Ux2)
!comprimento de cada eixo: 260 (y) e 280 (x) pixels. til 200 pixels.
!yuy: string com informaes sobre a grandeza marcada em y => Y(Uy)
!origem do sistema de eixos: (100+iavx,280+iavy) <= posio em pixels
!tit: string com o ttulo do grfico
!desenho dos eixos.
use msflib
i = setcolor(0) !eixos de cor preta
implicit none
call moveto(100+iavx,40+iavy,pos)
type (xycoord) pos
i = lineto(100+iavx,280+iavy) !eixo vertical
type (xycoord) poly(4)
i = lineto(380+iavx,280+iavy) !eixo de x1
integer nsegmentos,i,j,icor_linha,i2,i_cor
call moveto(100+iavx,280+iavy,pos) !eixo x2
integer ixcoord(501,501),iycoord(501,501),iavx,iavy,passo
i = lineto(100-ifix(160.*cos(45./180.))+iavx,280+ &
ifix(160.*cos(45./180.))+iavy) !eixo de x2 end do
i = lineto(380+iavx,281+iavy) !reforo de x1 (trao duplo) passo = nsegmentos/50 !define o avano de cada linha no eixo.
!nomes dos eixos if(icor_linha /= 0) then !cores por cota (4 cotas. Mude, se quiser)
!clculos que possibilitam traar uma malha com at 501 x 501 linhas: end if
!*********************************************************************** else
do i = 1,nsegmentos + 1 end if
!equao da escala x
if( j <= nsegmentos .and. i <= nsegmentos) then
ixcoord(i,j) = 100 - ifix(120.*cos(45./180.)*(j-1)/(nsegmentos & poly(1)%xcoord = ixcoord(i,j+passo)
poly(1)%ycoord = iycoord(i,j+passo)
)) + ifix(200*(x1(i)-x1(1))/(x1(nsegmentos+1)-x1(1))) + iavx poly(2)%xcoord = ixcoord(i,j)
poly(2)%ycoord = iycoord(i,j)
!equao da escala y poly(3)%xcoord = ixcoord(i+passo,j)
poly(3)%ycoord = iycoord(i+passo,j)
iycoord(i,j) = 280 + ifix(120.*cos(45./180.)*(j-1)/(nsegmentos & poly(4)%xcoord = ixcoord(i+passo,j+passo)
poly(4)%ycoord = iycoord(i+passo,j+passo)
)) - ifix(200*(y(i,j)-ymin)/(ymax-ymin)) + iavy i2 = POLYGON($GFILLINTERIOR, poly, INT2(4))
end if
i2 = setcolor(0)
if(j <= nsegmentos) then
call moveto(ixcoord(i,j),iycoord(i,j), pos)
i2 = lineto(ixcoord(i,j+passo),iycoord(i,j+passo))
end if
if(i <= nsegmentos) then
call moveto(ixcoord(i,j),iycoord(i,j), pos) INTRODUO AO VISUAL FORTRAN CVF
i2 = lineto(ixcoord(i+passo,j),iycoord(i+passo,j))
end if
Wilton, Cleide e Cleiton Diniz P. S. e Silva
end do
end do
!*********************************************************************** Programador:
return
Exerccios
1 - Introduo
1) Estude, no HELP, a funo POLYGON (varivel poly) e, ento, no
Simplificadamente, uma DLL (Dynamic Link Library) um programa
programa principal, crie uma paisagem para a animao desenvolvida
independente, em um arquivo separado, que executado quando for evocado
nesta lio.
por qualquer outro programa. Na verdade, em FORTRAN, uma DLL uma
subrotina "de vida prpria", que recebe dados do aplicativo que a evoca,
2) Integre a animao dessa lio ao projeto que j desenvolvemos ao
longo das 5 lies anteriores, utilizando a estrutura previamente faz clculos com esses dados, e depois envia (exporta) os resultados para
desenvolvida (use a callback subr3 ou subr4). Lembre-se que todas as o executvel que a evocou.
definies do programa principal daqui j existem na estrutura
bsica do nosso projeto. Em QuickWin Application existem algumas limitaes de uso, e uma DLL s
funcional para o clculo numrico. Em QuickWin Application uma DLL no
3) Crie um boneco (cabea, tronco e membros) e faa-o subir uma ladeira pode ter nenhum comando grfico, e nem tampouco interaes diretas com o
caminhando. operador. Por exemplo: uma DLL no l dados via teclado (mas em um
arquivo, sim) e nem escreve na tela (mas em um arquivo, sim). Para criar
um programa funcional (um executvel interligado com uma DLL), deve-se
4) Melhore o programa grfico 2D apresentado, de forma que cada trecho criar dois projetos. Um para a DLL e outro para o executvel que a
da linha seja desenhado no quadrante apropriado. utilizar.
3) Para criar o cdigo fonte da DLL, faa como de costume. V ao menu "
File" e clique em "New".
SUBROUTINE MEU_TESTE(a,b,s)
a) a prpria DLL em si, que nesse caso foi chamada Teste_DLL.dll"(na hora
da execuo ela dever estar no mesmo diretrio do executvel que a
evocar)
Note que isto feito da mesma forma que se criaria um programa executvel Os arquivos de interesse podem ser encontrados, via explorer, na locao
comum, s que a extenso do arquivo a ser criado no ".exe" e sim, mostrada na figura a seguir:
".dll". O aspecto geral das janelas do estdio pode ser visto na figura a
seguir:
5) Crie um programa simples, que leia os valores de "a" e "b" via
teclado, e que evoque a subrotina contida em "Teste_DLL.dll" para somar
esses valores, informando depois, na tela, o resultado. Note que uma
declarao que d a diretiva de compilao com o atributo de importao da
DLL deve seguir-se declarao inicial de um programa principal. Vejamos
as duas declaraes iniciais:
PROGRAM PRINCIPAL
4 - Cdigos fontes
SUBROUTINE MEU_TESTE (a , b , s)
s=a+b
RETURN
END SUBROUTINE
Ento, ao clicar OK na caixa acima, a janela com os arquivos do projeto
conter dois arquivos: "principal.f90" e "Teste_DLL.lib". Veja o aspecto
da janela com os componentes do projeto: Cdigo fonte do EXECUTVEL
PROGRAM PRINCIPAL
read (* , *)a , b
call MEU_TESTE (a , b , s)
write(*,*)'soma: s =',s
STOP
END
Estes exerccios so recomendveis a partir da segunda aula, Uma observao: existem algumas convenes mostrando como escrever
e destinados a quem ainda no sabe programar em Fortran 77. Caso cada comando, o que deve ser maisculo, o que deve ser minsculo, e outros.
voc no tenha o Power Station em casa, use o ambiente do software Aqui, no seguimos essas convenes.
AJUSTE (DOS) (http://www.extensao.hpg.com.br).
SOLUO
2) Determinado ao classificado de acordo com o resultado de trs program detecta
testes, que devem verificar se o mesmo satisfaz s seguintes
especificaes: use msflib
Teste 1 - contedo de carbono abaixo de 7%; CHARACTER (1) RESPOSTA
teste 2 - dureza Rokwell maior que 50; TYPE (qwinfo) winfo
teste 3 - resistncia trao maior que 80000 psi.
Ao ao atribuido o grau 10 se passa pelos trs testes; 9 se ! Maximiza a tela principal(FRAME)
passa apenas nos testes 1 e 2; 8 se passa no teste 1 e 7 se no passou winfo.TYPE = QWIN$MAX
nos trs testes. Supondo que sejam lidos de uma unidade de entrada o ires = SETWSIZEQQ(QWIN$FRAMEWINDOW, winfo)
nmero de amostras, o contedo de carbono (em %), a dureza Rokwell e
a resistncia trao (em psi), fazer um programa que d a !colore a "janela filhote"(CHILD WINDOW)
classificao de 112 amostras de ao que foram testadas, escrevendo I=SETBKCOLORRGB(#997654)
o nmero da amostra e o grau obtido. call clearscreen($gclearscreen)
!maximiza a "janela filhote"
Iresult=SETWSIZEQQ(0, winfo)
WRITE(*,*)' '
7) Foram feitas uma srie de N leituras de uma grandeza de X e obtidos os WRITE(*,*)' '
resultados x1, x2, ..., xN. Fazer um programa que calcule o valor mdio WRITE(*,*)' '
e o desvio padro das leituras. Obs.: se a preciso do instrumento de write(*,*)"A sua resposta foi NO"
leituras for grande, os valores das medidas sero prximos, e trabalhar WRITE(*,*)' '
com preciso simples pode resultar em erros bastante considerveis. Usar WRITE(*,*)' '
dupla preciso. WRITE(*,*)' '
ELSE
call clearscreen($gclearscreen)
8) Fazer um programa que determine uma das raizes de uma funo dada. O
intervalo (Xmin,Xmax) que contm a raiz deve ser informado. Usar o mtodo WRITE(*,*)' '
da bisseo. WRITE(*,*)' '
WRITE(*,*)' '
WRITE(*,*)'A SUA RESPOSTA FOI SIM'
WRITE(*,*)' '
WRITE(*,*)' '
WRITE(*,*)' '
Page 1 Page 1
listaR listaR
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ //////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
SOLUO SOLUO
stop 10 continue
end program soma WRITE(*,*)'SOMATRIO: S FATORIAL: F'
READ(*,*)RESPOSTA
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
////////////////////////////////////////////////////////////////////////// IF(RESPOSTA == 's' .or. RESPOSTA == 'S' .OR. RESPOSTA == 'f' .OR. RESPOSTA =='F')goto 20
call clearscreen($gclearscreen) !limpa toda a tela
WRITE(*,*)'Responda S, s, F ou f.'
3) Faa um programa que l um inteiro e que calcule o fatorial deste WRITE(*,*)' '
nmero. WRITE(*,*)' '
WRITE(*,*)' '
SOLUO call BEEPqq(300,500)!emite sinal sonoro: freq = 300Hz e durao 500ms.
GOTO 10
program fatorial
USE MSFLIB 20 continue
DOUBLE PRECISION FAT
IF(RESPOSTA == 'F' .OR. RESPOSTA == 'f')THEN
I = SETBKCOLOR(2)
CALL CLEARSCREEN($GCLEARSCREEN) I = SETBKCOLOR(2)
CALL CLEARSCREEN($GCLEARSCREEN)
I = DISPLAYCURSOR($GCURSORON)!ABILITA CURSOR
write(*,*)'ESCREVA O INTEIRO:' I = DISPLAYCURSOR($GCURSORON)!ABILITA CURSOR
READ(*,*) N write(*,*)'ESCREVA O INTEIRO:'
READ(*,*) N
FAT = 1.0
FAT = 1.0
DO I = 1, N
FAT = FAT*FLOAT(I) DO I = 1, N
END DO FAT = FAT*FLOAT(I)
END DO
Page 2 Page 3
listaR modelo
WRITE(*,'(" FATORIAL = ",E13.7)')FAT Ateno: a estrutura dada a seguir pode ser usada para que voc
desenvolva seus programas nela, como subroutine callback, no ambiente
ELSE PowerStation ou Visual Studio, em QickWin Application. Colocamos 5
subroutine callback, com os nomes de subroutine subr1, ...,
I = SETBKCOLOR(4) subroutine subr5. Na estrutura tem comentrios de como inserir seus programas.
CALL CLEARSCREEN($GCLEARSCREEN) Naturalmente que, quem tiver experincia, deve personalisar suas
prprias estruturas. Para usar esta, s copiar toda a estrutura e
open(unit = 1, file = 'dados.dat')! abre o arquivo dados.dat inserir no Workspace que j deve ter sido criado.
Uma observao: existem algumas convenes mostrando como escrever
read(1,*)N cada comando, o que deve ser maisculo, o que deve ser minsculo, e outros.
read(1,*)(x(i), i = 1, N) Aqui, no seguimos essas convenes.
close(unit = 1) ! fecha o arquivo aberto. Wilton, Cleide (UFPB) e Cleiton (ITA) (wiltonps@uol.com.br)
somat = 0.0
!programa principal, chamado Prog_QW. Mude o nome, se for o caso
do i = 1, n program Prog_QW
somat = somat + x(i) use msflib !biblioteca com muitas funes grficas e outras.
end do TYPE (windowconfig) wc !define uma varivel para as informaes sobra a configurao do
micro.
WRITE(*,*)' ' TYPE (qwinfo) winfo !define uma varivel para informaes sobre o dimensionamento do frame e
WRITE(*,*)' ' child window.
WRITE(*,*)' ' TYPE (XYCOORD) XY !define uma varivel para estabelecer uma posio no vdeo atravs de
write(*,"(' Somatrio =',1x, e13.7)") somat coordenadas em pixels.
WRITE(*,*)' ' LOGICAL status
WRITE(*,*)' '
WRITE(*,*)' ' ! Maximiza a tela principal
winfo.TYPE = QWIN$MAX
END IF ires = SETWSIZEQQ(QWIN$FRAMEWINDOW, winfo)
stop ! obtm dados do sistema: nmero de pixels, etc.
wc.numxpixels = -1
end program diversos wc.numypixels = -1
wc.numtextcols = -1
wc.numtextrows = -1
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ wc.numcolors = -1
////////////////////////////////////////////////////////////////////////// ! a "janela filhote" se chamar "PROGRAMAS" mas o nome pode ser
!mudado para o desejado.
wc.title= "PROGRAMAS"C ! ttulo da "janela filhote" (child window)
wc.fontsize = -1
! se ifontnum for -1, a fonte requerida no existe. Ento, deve-se escolher outra fonte.
if(ifontnum.eq.-1) ifontnum = SETFONT ('t''times new roman''h30')
if(ifontnum.eq.-1) ifontnum = SETFONT ('t''courier new''h30')
if(ifontnum.eq.-1) ifontnum = SETFONT ('t''tahoma''h30')
if(ifontnum.eq.-1) ifontnum = SETFONT ('t''cac futura casual''h30')
USE MSFLIB
!/////////////////////////////////////////////////////////////////////////// logical ia
!///////////////////////////////////////////////////////////////////////////
ia = .true. !argumento da subrotina callback subr1
!Funo onde se define os itens do menu. CALL CLEARSCREEN($GCLEARSCREEN) !apaga o que estiver escrito na tela
LOGICAL(4) FUNCTION INITIALSETTINGS()
USE MSFLIB !para abrir uma nova child window d os comamandos abaixo (basta tirar o smbolo de
LOGICAL(4)result comentrio "!")
external subr1, subr2, subr3, subr4, subr5, leiame !open(unit = 1, file = 'user', title = 'programa1') !ateno: se voc abrir, lembre-se de
fechar antes do return.
! Cria um menu 1 chamado Arquivo !i = setbkcolor(12) ! colore a child window de vermelho
result = APPENDMENUQQ(1, $MENUENABLED, '&Arquivo'C, NUL ) !call clearscreen($gclearscreen) !limpa a tela
!i= displaycursor($gcursoron) !ativa cursor
! os nomes programa1, programa2, ..., programa5
!(C strings) definidos a seguir devem ser alterados
!de acordo com as suas aplicaes. !suspende os itens do menu 1 durante a execuo desta subrotina
result = MODIFYMENUFLAGSQQ (1, 1, $MENUGRAYED)
! chama a callback subr1 (externa, feita pelo programador result = MODIFYMENUFLAGSQQ (1, 2, $MENUGRAYED)
!e, por isso, foi declarada no incio da funo result = MODIFYMENUFLAGSQQ (1, 3, $MENUGRAYED)
!initialsettings) result = MODIFYMENUFLAGSQQ (1, 4, $MENUGRAYED)
result = APPENDMENUQQ(1, $MENUENABLED, 'Programa1'C, subr1) result = MODIFYMENUFLAGSQQ (1, 5, $MENUGRAYED)
!coloca um trao separando o primeiro do segundo item do menu result = MODIFYMENUFLAGSQQ (1, 6, $MENUGRAYED)
result = APPENDMENUQQ(1, $MENUSEPARATOR, ''C,NUL ) result = MODIFYMENUFLAGSQQ (1, 7, $MENUGRAYED)
result = MODIFYMENUFLAGSQQ (1, 8, $MENUGRAYED)
result = APPENDMENUQQ(1, $MENUENABLED, 'Programa2'C, subr2) result = MODIFYMENUFLAGSQQ (1, 9, $MENUGRAYED)
result = APPENDMENUQQ(1, $MENUSEPARATOR, ''C, NUL ) !Obs: para suspender o menu 1 inteiro (e no item por item) bastaria dar o comando:
result = APPENDMENUQQ(1, $MENUENABLED, 'Programa3'C, subr3) !result = MODIFYMENUFLAGSQQ (1, 0, $MENUGRAYED)
result = APPENDMENUQQ(1, $MENUSEPARATOR, ''C, NUL )
result = APPENDMENUQQ(1, $MENUENABLED, 'Programa4'C, subr4) !INSIRA UM PROGRAMA AQUI, E APAGUE A LINHA A SEGUIR
result = APPENDMENUQQ(1, $MENUSEPARATOR, ''C, NUL ) message = messageboxqq('Este item est indisponvel no
result = APPENDMENUQQ(1, $MENUENABLED, 'Programa5'C, subr5) momento!'c,'Ateno',MB$OK.OR.MB$ICONEXCLAMATION.or.MB$DEFBUTTON1)
result = APPENDMENUQQ(1, $MENUSEPARATOR, ''C, NUL )
!chama a subrotina WINEXIT (interna, definida em MSFLIB) !reativa os itens do menu aps a execuo desta subrotina
!que termina a execuo do programa em loop infinito result = MODIFYMENUFLAGSQQ (1, 1, $MENUENABLED)
result = APPENDMENUQQ(1, $MENUENABLED, 'Sair'C, WINEXIT) result = MODIFYMENUFLAGSQQ (1, 2, $MENUENABLED)
result = MODIFYMENUFLAGSQQ (1, 3, $MENUENABLED)
result = MODIFYMENUFLAGSQQ (1, 4, $MENUENABLED)
result = MODIFYMENUFLAGSQQ (1, 5, $MENUENABLED)
result = MODIFYMENUFLAGSQQ (1, 6, $MENUENABLED)
! Cria um menu 2 chamado Informaes. result = MODIFYMENUFLAGSQQ (1, 7, $MENUENABLED)
result = APPENDMENUQQ(2, $MENUENABLED, '&Informaes'C, NUL ) result = MODIFYMENUFLAGSQQ (1, 8, $MENUENABLED)
result = MODIFYMENUFLAGSQQ (1, 9, $MENUENABLED)
! chama a callback subrotina de msflib com ajuda sobre o !Obs: para ativar um menu inteiro desativado com o comando result =
!QuickWin Application MODIFYMENUFLAGSQQ (1, 0, $MENUGRAYED) basta dar o comando:
result = APPENDMENUQQ(2, $MENUENABLED, 'Ajuda QuickWin'C, WININDEX) !result = MODIFYMENUFLAGSQQ (1, 0, $MENUENABLED)
result = APPENDMENUQQ(2, $MENUSEPARATOR, ''C, NUL )
! chama a callback WINUSING (interna, definida em msflib) com !message = messageboxqq('Este programa
!ajuda sobre o windows terminou'c,'Ateno',MB$OK.OR.MB$ICONEXCLAMATION.or.MB$DEFBUTTON1)
result = APPENDMENUQQ(2, $MENUENABLED, 'Usando a Ajuda'C, WINUSING) !i= displaycursor($gcursoroff) !desativa cursor
result = APPENDMENUQQ(2, $MENUSEPARATOR, ''C, NUL ) !close(unit = 1)
!chama a subrotina WINABOUT (interna, definida em msflib) com return
!informaes sobre o Developer Studio.
result = APPENDMENUQQ(2, $MENUENABLED, 'Sobre o Developer Studio'C, WINABOUT) end subroutine
result = APPENDMENUQQ(2, $MENUSEPARATOR, ''C, NUL )
!reativa todo o menu aps a execuo desta subrotina !suspende todo o menu 1 durante a execuo desta subrotina
result = MODIFYMENUFLAGSQQ (1, 0, $MENUENABLED) result = MODIFYMENUFLAGSQQ (1, 0, $MENUGRAYED)
CALL CLEARSCREEN($GCLEARSCREEN)
return
!INSIRA UM PROGRAMA AQUI, E APAGUE A LINHA A SEGUIR
end subroutine message = messageboxqq('Este item est indisponvel no
momento!'c,'Ateno',MB$OK.OR.MB$ICONEXCLAMATION.or.MB$DEFBUTTON1)
return
subroutine subr3(ia)
end subroutine
USE MSFLIB
logical ia
!///////////////////////////////////////////////////////////////////////////
ia = .true. !///////////////////////////////////////////////////////////////////////////
return
!///////////////////////////////////////////////////////////////////////////
!/////////////////////////////////////////////////////////////////////////// end subroutine
ia = .true.
CALL CLEARSCREEN($GCLEARSCREEN)
return
end subroutine
!///////////////////////////////////////////////////////////////////////////
!///////////////////////////////////////////////////////////////////////////
subroutine subr5(ia)
Page 4 Page 5
Guia bsico de
programao em NDICE
linguagem
Fortran 77 e 90 CAPTULO 1: CONCEITOS DA LINGUAGEM 1
1. INTRODUO ............................................................................................................................ 1
2. FORMATAO .......................................................................................................................... 1
3. CONCEITOS BSICOS ................................................................................................................ 2
4. DECLARAO DE VARIVEIS .................................................................................................... 3
Tipos de Variveis 4
Inteiras (INTEGER) 4
Reais (REAL) 5
Complexas (COMPLEX) 5
Alfanumricas (CHARACTER) 5
Lgicas (LOGICAL) 6
5. OPERADORES ........................................................................................................................... 6
Atribuio 6
Operadores Literais 6
Operadores Aritmticos 7
Operadores Relacionais 7
Operadores Lgicos 7
Prioridade 8
6. FUNES INTRNSECAS ............................................................................................................. 8
Funes Trigonomtricas 8
Funes Diversas 9
ANEXO C: TABELA DE VALORES ASCII 41 tpicos precedidos de F90 so vlidos apenas para os compiladores que aceitam
comandos FORTRAN 90.
Deve ficar claro que compiladores para FORTRAN 90 aceitam tambm os outros dois
tipos, e os baseados em FORTRAN N77 aceitam todos os comandos dos compiladores mais
antigos (FORTRAN 77), e que a recproca no verdadeira.
Os programas podem ser escritos em qualquer editor de texto, desde que sejam salvos
com as extenses .for ou .f90. Esta segunda forma somente para F90. Os compiladores em
N77 e F90 possuem um editor prprio; que deve ser usado, pois possui muitos recursos
adicionais, como por exemplo o destaque das palavras chaves e identificaes mais claras dos
erros de compilao, o que facilita muita a deteco de falhas na criao dos programas.
2. Formatao
Os seguintes critrios devem ser seguidos para se escrever um programa em Variveis e Nomes de Blocos: devem ter no mximo seis letras, no permitido o uso de
FORTRAN no modo de formulrio fixo: caracteres especiais e no podem comear com um nmero.
colunas 1 a 5: so usadas para escrever os rtulos label ou nmeros de comando. Estes N77 podem ter 31 caracteres, inclusive o caractere underscore _
nmeros devem ser inteiros e estar totalmente contido nestas colunas. No podem se
repetir e no precisam estar em ordem crescente. Sero usados para que outros comandos Constantes
possam identificar aquela linha;
Numricas: podem conter quaisquer valores reais, inteiros ou complexos. A parte decimal
coluna 6: qualquer caractere diferente de 0 zero nesta coluna indica que o que vem a separada da inteira por um ponto .. Os zeros antes e depois do ponto decimal podem ser
seguir continuao da linha anterior ou da ultima linha que no seja um comentrio omitidos, se no forem significantes. O expoente decimal indicado pela letra e ou E,
(prximo item, conceitos bsicos). Um mesmo comando pode estar dividido em at 19 deve vir entre o nmero e seu expoente sem o uso de espaos entre eles. Nmeros
linhas de cdigo. Entre as linhas do comando pode haver linhas em branco ou comentrios; negativos assim como a parte exponencial quando for negativa deve vir precedida do sinal
menos -. O sinal + opcional em ambas as partes. Os nmeros imaginrios devem vir
colunas 7 a 72: comandos ou comentrios;
entre parnteses e a parte real deve ser separada por uma vrgula da parte imaginria.
colunas 73 a 80: campos de identificao, so usados pelo compilador, portanto no se
Alfanumricas: (so as strings, seqncias de letras e/ou nmeros) podem conter
deve escrever nestas colunas.
qualquer seqncia de caracteres no especiais. Devem vir entre aspas ou apstrofos .
F90 O programa pode ser escrito em qualquer posio, desde que o modo formulrio livre
As aspas tm preferncia sobre os apstrofos, portanto um valor literal pode conter
esteja ativado. Alguns pontos devem ser observados para este formato:
apstrofos, desde que seu valor venha entre aspas. No permitido o uso de caracteres
as linhas de continuao so indicadas pelo smbolo & no fim da sentena, e a prxima especiais e letras acentuadas. Uma forma de se indicar ao compilador que usar um valor
linha abaixo que no seja um comentrio ser tomada como continuao. Deixe sempre um alfanumrico o uso de wHvalorliteral, onde w o nmero de caracteres do valor
espao entre os comandos e o smbolo de continuao. permitida a insero de alfanumrico. Apresar de vlido este formato praticamente no usado nos programas
comentrios aps o &; atuais.
os rtulos devem ser os primeiros caracteres da linha, e podem estar em qualquer coluna. Maisculas e Minsculas: FORTRAN no case sensitive, isto no faz qualquer
distino entre letras maisculas e minsculas. permitido inclusive o uso do nome da
varivel escrita de formas diferentes num mesmo programa. EX.: VAR = var = Var.
3. Conceitos Bsicos
Nomes de programa: os programas podem conter no incio o seu nome (program
Nesta seo sero apresentados outros conceitos importantes para a construo de
nome_do _programa), e devem terminar com a palavra end indicando que o que vem a
programas em FORTRAN.
seguir no precisa ser executado.
Comentrios: no so interpretados pelo computador, um bom programa deve conter
muitos para que fique o mais claro possvel principalmente para quem vai analis-lo. Em
4. Declarao de Variveis
FORTRAN a letra c ou o caractere * na primeira coluna indica que toda a linha um
comentrio. Alguns compiladores aceitam o uso de qualquer caractere diferente de As variveis podem ser inteiras, reais ou literais. A declarao de uma varivel deve vir
nmeros para iniciar a linha de comentrio. Na linha de comentrio permitido o uso de antes que ela seja usada, se isto no ocorrer o compilador assumir que as variveis que
qualquer caractere, especial ou no. comeam com as letras I at N como inteiras (INTEGER*4) e todas as outras como reais
N77 o ponto de exclamao ! indica que o que vem aps ele comentrio, ele pode vir em (REAL*4).
Esta forma de declarao implcita pode ser modificada usando o comando implicit Reais (REAL)
tipo (a1-a2,b1-b2,...) sendo a1, a2, b1, b2 quaisquer letras do alfabeto. A vrgula
Preciso simples, 6 casas decimais (padro):
separa os intervalos de letras e o sinal determina o intervalo. As letras que no estiverem em
REAL*4 ou REAL 3.402823E+38
nenhum dos intervalos ter o seu tipo dado pela declarao implcita. O comando seguinte
indica que as variveis que comeam com as letras a, b, c e de r at z so do tipo TIPO1.
Incremento mnimo de 1.175494E-38
implicit TIPO1 (a, b, c, r-z)
Preciso dupla, 15 casas decimais (padro):
os espaos so usados para dar clareza e so ignorados pelo compilador. Quando no se
REAL*8 ou DOBLE PRECISION 1.797693134862316D+308
deseja que nenhuma varivel seja declarada implicitamente usa-se o comando implicit
none. Se este comando for usado e uma varivel citada no programa no estiver em Incremento mnimo de 2.225073858507201D-308
nenhuma outra declarao o complilador acusar um erro.
A parte exponencial deve ser separada por um d ou D no lugar do e ou E para real do tipo
Para se declarar variveis que sejam matrizes e vetores deve-se indicar suas
*8.
dimenses logo aps o nome da varivel; entre parnteses, e separadas umas das outras por
N77 podem ser usados o e ou E para separar a parte exponencial. No s isso mas
vrgula. Ex.: a(4,3) indica uma matriz a de 4 linhas por 3 colunas.
tambm todas as outras funes (item 6 Funes intrnsecas) podem ser iguais a de um real,
As variveis podem receber valores iniciais usando /valor/, logo aps sua
no sendo necessrio o uso de funes especiais para este tipo de valor.
declarao. No caso de vetores e matrizes devem ser dados os valores para todos os
implict real(a-z) ! todas as variveis so reais
elementos de cada linha em seqncia. integer d ! a varivel d inteira mesmo com a
! declarao acima
Tipos de Variveis
Complexas (COMPLEX)
Inteiras (INTEGER) Preciso simples, 6 casas decimais:
INTEGER*4 2,147,483,648 a 2,147,483,647 Os valores que um complexo pode assumir so os mesmos que os reais.
INTEGER*4 pode ser representado somente por: INTEGER complex c/(4.,.3)/ ! c vale 4,0 reais e 0,3 imaginrios
Os nmeros aps o * indicam quantos bytes a varivel ocupa na memria do computador. Esta Ou CHARACTER *wvar1,var2
observao vlida para todos os tipos de variveis.
(var1 e var2 possuem o mesmo tamanho w)
Programao em Linguagem FORTRAN .6. Programao em Linguagem FORTRAN .7.
(var1 tem tamanho w e var2 tamanho w2) Executam operaes aritmticas comuns.
LOGICAL NOME
Quando uma varivel inteira recebe o resultado de uma diviso com resto, este resto
Podem assumir os valores .TRUE. (VERDADEIRO) ou .FALSE. (FALSO) desprezado ou seja o valor truncado.
F90 estas declaraes poderiam estar na mesma linha desde que fossem separadas por preciso inverter seu resultado.
10.GT.5 .NEQV. 25.GT.20 ! .FALSE. ou 0 Outras funes trigonomtricas podem ser encontradas no Anexo A.
10 < 5 .EQV. 20 <= 25 ! .TRUE. ou 1
10.LT.5 .EQV. 25.GT.20 ! .FALSE. ou 0 Funes Diversas
Existem vrias funes predefinidas em FORTRAN, que podem ser usadas em clculos ou execues podem vir separadas do restante dos comandos.
qualquer parte do programa. O que d grande versatilidade s funes e subrotinas, so os argumentos passados a
elas, que quando variam produzem resultados diferentes. As funes e subrotinas podem vir
Funes Trigonomtricas
em qualquer parte do programa, mas o mais comum que apaream no fim (aps o end de
Nome Definio Tipo de Argumento Tipo da Funo
termino do programa), por motivo de clareza. As variveis e rtulos usados em funes e
SIN (x) seno (radianos). Se x for complexo, a parte real Real ou complexo. REAL*4
assumida como valor em radianos. subrotinas so locais e por isso devem ser declarados novamente, podendo ser usados os
ASIN (x) Arcoseno (radianos). Retorna valores na faixa [- Real, |x| .le. 1 REAL*4
/2, /2 ] mesmos nomes de variveis e rtulos de outras funes e subrotinas ou mesmo do programa
COS (x) Coseno (radianos) Se x for complexo, a parte real Real ou complexo REAL*4 principal. Os parmetros necessrios devem ser passados junto com a chamada da funo ou
assumida como valor em radianos.
ACOS (x) Arcocoseno (radianos) ) Retorna valores na faixa Real, |x| .le. 1 REAL*4 subrotina, devem vir entre parnteses e separados por virgula. Os nomes das variveis no
[ 0, ] precisam ser os mesmos na chamada e definio de uma funo ou subrotina, devendo
TAN (x) Tangente (radianos) Real REAL*4
ATAN (x) Arcotangente (radianos). Retorna valores na faixa Real REAL*4 apenas estar na mesma ordem.
[-/2, /2 ]
SINH (x) Seno Hiperblico (radianos) Real REAL*4 Funes
COSH (x) Coseno Hiperblico (radianos) Real REAL*4
TANH (x) Tangente Hiperblica (radianos) Real REAL*4 Retornam sempre um valor, e a ela podem ser passados qualquer nmero de
parmetros. As funes funcionam de forma semelhante s funes intrnsecas, com a
Programao em Linguagem FORTRAN .10. Programao em Linguagem FORTRAN .11.
diferena de que agora o programador que define o que a funo deve gerar como resultado. Chamada:
O tipo da funo deve ser declarado no programa principal, como se fosse uma varivel call nome_da_subrotina (lista_de_parmetros)
comum. Uma funo pode utilizar outras funes.
Definio:
Chamada:
subroutine nome_da_subrotina (lista_de_parmetros)
nome_da_funo(lista_de_parmetros) definio e declarao das variveis e constantes locais
seqncia de comandos
Definio: return
end
function nome_da_funo(lista_de_parmetros) A palavra chave return opcional.
definio e declarao das variveis e constantes locais
seqncia de comandos Exemplo:
return
end call converte_unidades ! chama a subrotina para converter as
A palavra chave return opcional, pode aparecer em qualquer ponto e mais de uma ! unidades
subroutine converte_unidades
vez. Ela indica que o comando deve retornar ao programa principal ou funo ou subrotina implicit none
que a chamou. real temp,press,n_mols,gas_ideal
T = temp + 273.15
A funo retornar o valor do ultimo comando do tipo: P = press*101325
function gas_ideal(temp,press,n_mols) Na maior parte dos programas preciso haver uma interao entre o programa e o
implicit none
usurio. Essa interao pode ser feita em FORTRAN pelos comandos de leitura e escrita de
real temp,press,n_mols,gas_ideal
gas_ideal = n_mols*8.314*temp/press dados. Esses comandos na sua forma mais simplificada possuem a seguinte estrutura:
return
end leitura :
format (que contenha a lista de formatos) ou o smbolo * que indica impresso ou leitura de O FORTRAN no considera a primeira coluna da unidade de leitura e impresso
forma livre. quando a sada ou entrada formatada, por isso deve-se incluir uma casa de impresso em
branco a mais para dados. Para formato livre no necessrio pois o FORTRAN os posiciona
As unidades 6 e * se no forem definidas dentro do programa, sero consideradas
automaticamente.
como a tela do computador (write ou print). Da mesma forma as unidades 5 ou * so
definidas como o teclado (read). O comando print imprime sempre os resultados na Quando mais de um dado usar a mesma especificao, ela pode ser feita da seguinte
unidade definida por * ou na tela caso no haja nenhuma definio para de uma unidade forma: nespecificao1, n2especificao2 ou n(especificao1,
especificada pelo *. especificao2, ...), onde n e n2 representam o nmero de vezes que a especificao
ou seqncia de especificaes deve se repetir.
Na leitura os dados devem vir separados por espaos ou vir na linha seguinte. Caso se
tenham mais dados em uma linha do que os que sero lidos por um comando read eles Caso o nmero de especificaes seja menor que o de variveis a serem lidas ou
sero desprezados, inclusive pelo prximo comando read. Na escrita os dados viro um aps impressas, a ultima especificao ou a ultima seqncia, caso seja usado o recurso
os outros separados por espaos (no caso de strings viro sem espaos de separao), ou n(especificao1, especificao2, ...), ser repetida at que se complete o
na linha seguinte quando no houver mais espao. O prximo comando write ou print nmero necessrio. Isto no valido para constantes inclusas nos comandos de leitura e
F90 para que se leia ou escreva dados na mesma linha mesmo aps mudar o comando Quando o nmero de especificaes maior que os de dados a serem impressos as
pode-se usar a opo advance=opcao no comando anterior. Onde opcao pode ser yes ultimas sero desprezadas.
ou no e indica se o comando deve ou no avanar automaticamente para a prxima linha. A forma de se declarar os formatos a seguinte:
So usados somente nos comandos read e write onde a opo formato no seja livre. r format (especificao1, especificao2, ...)
write (*,2,advance=no) Engenharia
onde r um numero inteiro, e representa o rtulo do format. Um mesmo format pode ser
write (*,2) Quimica
2 format(a) usado por vrios comandos de escrita e leitura.
belo horizonte
read (*, (a10)) nome => belo horiz
Formato Uso write (*, (a15)) nome => belo horiz
Iw[.m] Valores Inteiros
Fw.d Valores Reais F90 os valores dos campos podem ser variveis desde que venham entre <var1>. No
Ew.d[Ee] Valores Reais com expoente
Gw.d[Ee] Mesmo que Iw[.m], Ew.d[Ee], Lw e A[w] valido para print.
Dw.d Valores Reais de Dupla Preciso
Lw Valores Lgicos a = 5
A[w] Seqncia de Caracteres b = FORTRAN
N77 Zw_hexedit Valores Hexadecimais write (*,(a<a>)) b => FORTR
F90 Bw[.m] Valores Binrios
F90 Ow[.m] Valores Octadecimais Para valores numricos que precisam de mais casas de impresso que as indicadas no
F90 ENw.d[Ee] Valores Reais em Notao de Engenharia
F90 ESw.d[Ee] Valores Reais em Notao Cientifica format, sero impressos somente * naquele campo.
w representa o tamanho do campo a ser impresso ou lido, m representa o nmero de zeros
pi = 3.1416
que vir antes do nmero, d o nmero de casas decimais e e o nmero de casas para o print (1x,E7.3e2), pi => *******
expoente. print (1x,E8.3e2), pi => .314E+01
O ponto decimal, o e do expoente e o sinal - devem ser contados ao se dar o tamanho Outros Recursos Para Formatos
do campo (w). Ao ler um dado que no possui ponto decimal e no seu formato esperado um,
Alguns recursos adicionais so permitidos para read ou write.
o compilador ler este dado como se l houvesse um ponto.
Formato Uso
12345 string Transmite uma string para a sada
read (*,(f5.3)) a => a = 12.345 F90 Q A varivel recebe o nmero de espaos que o valor ocupa
nH Transmite os prximos n caracteres para a sada
Quando o ponto existe mas no est na posio especificada, a sua posio original Tc Move o ponto de leitura ou escrita para a posio c
TLc Move o ponto de leitura ou escrita c posies esquerda
mantida.
TRc Move o ponto de leitura ou escrita c posies direita
nX Deixa n posies em branco
12.345
read (*,(f5.4)) a => a = 12.345 SP Escreve o sinal + onde ele opcional
SS Omite o sinal + onde ele opcional
S Retorna ou padro ss
A notao com zeros m s vlida quando m maior que o nmero de casas que o
/ Muda de linha
nmero ocuparia no formato livre. N77 \ Comea a escrever no ponto onde a ultima escrita parou
N77 $ Comea a escrever no ponto onde a ultima escrita parou
a = 555 : Termina a impresso se no houver mais itens na lista
print (i5.4),a => 0555 kP O nmero multiplicado por 10 elevado -k (se o nmero j possuir expoente no h
efeito)
Nas notaes com expoente (ENw.d[Ee], ESw.d[Ee], ...) no se pode omitir o E ou e. BN Ignora os espaos em branco
BZ Transforma os espaos em branco em zeros
Sempre que houver este termo, a parte exponencial vai existir independente do seu valor.
a = 12.345
b = 12345.789e6 Antes ou depois de , , /, \, nH, $ ou : a vrgula opcional.
write (*,1) a,b
real a, b
1 format ( a=,e10.4e3, e b=,e10.4e3)
character dia*20
=> a=.1235E+002 e b=.1235E+011
a = 23.99
b = 55.8e-3
Caso as strings sejam maiores que o espao reservado a elas, sero tomados apenas dia = 'Segunda-feira'
os w primeiros caracteres. Se forem menores, elas sero alinhadas a direita e os outros write (*,'(5x,sp,e10.3e2,2x,en12.3e3)') a, b
write (*,'(/2x,''hoje e '',a8)') dia
espaos deixados em branco.
Programao em Linguagem FORTRAN .16. Programao em Linguagem FORTRAN .17.
produz o seguinte resultado: ou sero criados no mesmo diretrio em que estiver o programa a menos que se d como
+.240E+02 +55.800E-003 nome o caminho para um outro diretrio. Os caminhos seguem o mesmo padro do DOS.
hoje e Segunda- Um arquivo pode tambm ser fechado, isto far com que o FORTRAN coloque uma
marca de fim de arquivo naquele ponto, esta marca pode ser identificada por outro comando ou
funo (Anexos A e B).
10. Arquivos
close (unidade,status=estado)
Quando se deseja trabalhar com grandes quantidades de dados, o melhor armazen-
ou
los numa unidade de memria secundria, ou seja em arquivos. Um programa pode gerar
endfile unidade
tantos dados que todos eles no caberiam na tela de uma s vez, e ainda seriam perdidos ao
finalizar o programa. Os dados salvos em arquivos podem ser usados pelo prprio programa ou onde status=estado opcional. Estado pode ser keep que mantm o arquivo na
exportados para serem processados de outra forma. Arquivos de leitura economizam um tempo memria (este padro esta opo omitida), ou delete que apaga o arquivo da memria.
precioso para o usurio do programa pois ele no vai precisar enviar dados via teclado, e com
Arquivos fechados podem ser reabertos em qualquer parte do programa.
arquivos milhares de dados podem ser lidos em fraes de segundos.
Outros Recursos
O primeiro passo para se usar arquivos em FORTRAN indicar ao programa qual o
nome do arquivo e o nmero da unidade referente a ele. rewind unidade (volta o controle ao primeiro espao do arquivo)
onde unidade deve ser um inteiro maior ou igual a zero, e uma referncia a este arquivo. O Programa Arquivo arqui.dat
character *15a,b,c ' Qumica' ' Fsica'
nmero da unidade deve vir no comando read ou write indicando que os dados sero open(20,file='arqui.out') ' Engenharia'
retirados ou armazenados nesta unidade. A disposio dos dados em arquivos a mesma open(30,file='arqui.dat') Arquivo arqui.out
read (30,*) a este um
utilizada nas unidades de entrada e sada padro (Item 8, Leitura e Impresso), com uma nica write(20,*) ' este um ' arquivo de
diferena, as strings devem vir entre apstrofos . A abertura do arquivo pode ser feita em write(20,*) ' arquivo de ' sada
write(20,*) ' sada ' Qumica
qualquer parte do programa (inclusive dentro de funes e subrotinas), desde que venha antes read (30,*) b Engenharia Qumica
de um comando que o utilize. rewind 30
read (30,*) c
F90 o rtulo unidade pode ser uma string. write(20,*) a
write(20,*) b,c
Outras opes para abertura e fechamento de arquivos podem ser encontradas no end
Anexo B.
2. Comando GO TO ou GOTO
Captulo 2: Estruturas de Programao
O quando se deseja que o comando do programa avance ou recue em sua estrutura de
forma no seqencial, usa-se o comando goto ou go to.
1. Estrutura Seqencial
goto r
Os programas em FORTRAN devem conter os comandos escritos na ordem em que
sero executados, com exceo das funes, subrotinas e laos de repetio. Portanto um onde r um rtulo de uma linha que possui ou no um comando. Como uma linha rotulada no
programa em FORTRAN deve seguir o seguinte padro: pode estar em branco pode-se usar a palavra chave continue, que no ir interferir em nada
no programa.
declarao 1
declarao 2 Programa Resultado
... goto 20 linha 20
declarao n 10 write (*,*) ' linha 10' linha 30
comando 1 20 write (*,*) ' linha 20'
comando 2 30 write (*,*) ' linha 30'
... end
comando n goto 1 linha 20
end 10 write (*,*) ' linha 10' linha 30
1 continue
20 write (*,*) ' linha 20'
onde as declaraes so opcionais (item 4 Captulo 1). 2 continue
30 write (*,*) ' linha 30'
O comando end indica o fim do programa. Se o programador preferir pode finalizar o end
programa prematuramente usando os comandos stop ou call exit.
3. Estrutura Condicional
Programa Resultado
integer*1 a,b 10
a=10 20 Estrutura Condicional Simples
b=20 30.000000
c=30 if (expresso de teste) comando
write (*,*) a
write (*,*) b ou
write (*,*) c
end
if (expresso de teste) then
integer*1 a,b 10
a=10 20 seqncia de comandos
b=20 end if
c=30
write (*,*) a Quando a expresso de teste for verdadeira os comandos sero executados, quando
write (*,*) b
stop for falsa o programa segue para o prximo comando logo abaixo da estrutura condicional. A
write (*,*) c primeira opo s valida quando for executado um nico comando. Este comando pode ser
end
integer*1 a,b 10 de qualquer tipo, atribuio, escrita, leitura, goto ou interrupo do programa.
a=10
b=20 Estrutura Condicional Composta
c=30
write (*,*) a if (expresso de teste) then
call exit
seqncia de comandos 1
write (*,*) b
write (*,*) c else
end seqncia de comandos 2
end if
Programao em Linguagem FORTRAN .20. Programao em Linguagem FORTRAN .21.
Quando a expresso de teste for falsa a seqncia de comandos 2 ser executada. As listas de seleo podem ser da seguinte forma:
Mesmo quando s h um comando na seqncia de comandos 1, no se pode omitir a palavra Estrutura Condio para ser verdadeira
chave then. case (valor) Exp. teste igual valor
case (:valor) Exp. teste menor que valor
case (valor:) Exp. teste maior que valor
permitido o uso de estruturas condicionais umas dento das outras.
case (valor1:valor2) Exp. teste entre valor1 e valor2
case (valor1,valor2,...,valorn) Exp. teste igual valor1 ou igual valor2 ou ... valorn.
Programa Resultado
implicit integer (a-z) a<b
a=10 c= 30 30 20
b=20 No permitida a superposio de valores.
c=30
if (a.lt.b) then Os valores literais devem vir entre apstrofos e seus valores sero avaliados de acordo
write (*,*) ' a<b'
a=b+10 com o padro ASCII. Uma tabela com os valores ASCII pode ser encontrada no Anexo C.
else
write (*,*) ' a>b' Programa Resultado
b=a-5 i=20 a=20
end if select case (i)
if (c.ge.20) write(*,*)' c=',c, a, b case (10)
end write (*,*) 'a=10'
case (20)
write (*,*) 'a=20'
case (11,19)
Estrutura Condicional Composta Simplificada write (*,*) 'a>11 a<19'
end select
Uma outra forma de se usar uma estrutura condicional composta (somente N77 e F90) end
character i*1 i esta entre d e m
usando o comando case. i='h'
valor_i: select case (i)
N77 F90 case ('a','b','c')
SELECT CASE (exp. case) nome_case: SELECT CASE (exp. case) write (*,*) 'i=a ou b ou c'
CASE (lista de seleo 1) CASE (lista de seleo 1) case ('d':'m')
comandos 1 comandos 1 write (*,*) 'i esta entre d e m'
CASE (lista de seleo 2) CASE (lista de seleo 2) case ('D':'M')
comandos 2 comandos 2 write (*,*) 'i esta entre D e M'
... ... end select valor_i
CASE (lista de seleo n) CASE (lista de seleo n) end
comandos n comandos n
CASE DEFAULT CASE DEFAULT importante observar que as letras maisculas e minsculas possuem valores ASCII
comandos d comandos d
END SELECT END SELECT nome_case diferentes.
onde exp. case' uma expresso ou constante inteira, lgica ou literal (somente um 4. Estruturas de Repetio
caractere character*1). Caso o valor de exp. case estiver na lista de seleo 1, os
Quando o mesmo comando precisa ser executado vrias vezes at que se atinja uma
comandos 1 sero executados. Se o valor no estiver na lista de seleo 1 o
certa condio ou um nmero certo de repeties, o melhor usar as estruturas de repetio.
computador ir avaliar a lista de seleo 2, se for verdadeira sero executados os
Estas estruturas so bem simples e podem economizar vrias linhas de comando.
comandos 2 e assim at terminar os comandos case (lista de seleo n). O
comando case default opcional, e faz com que os comandos d sejam executados caso Estruturas de Repetio Simples
nenhuma das outras avaliaes sejam verdadeiras. nome_case opcional e deve seguir as r1 if (condio_de_teste) goto r2
comandos
mesmas regras usadas para dar nomes as variveis. A sua utilidade apenas de dar maior goto r1
clareza ao programa. r2 continue
Programao em Linguagem FORTRAN .22. Programao em Linguagem FORTRAN .23.
Esta uma estrutura de repetio muito simples, mas no recomendada para Programa Resultado
integer i/1/, j/1/ 2 1
programao. Estruturas mais aceitas, pois possuem equivalentes em outras linguagens, so do while (i) 3 1
da seguinte forma: j=j+1 4 1
if(j.eq.5) i=0 5 0
print *,j,i
do r1 var=n1,n2,n3 end do
seqncia de comandos end
r1 continue real*8 a(4) +2.97646E+000
i = 1; a(1) = 2.97645984 ---------------
ou a(2) = 576.74e5 +57.67400E+006
a(3) =.45; a(4) = sin(.5) ---------------
N77 - do var=n1,n2,n3 do while(i.le.4) +449.99999E-003
seqncia de comandos print'(2x,sp,en16.5e3)', a(i) ---------------
end do write (*,*)' ---------------' +479.42554E-003
i = i + 1 ---------------
end do
'var uma varivel inteira ou real que recebe inicialmente o valor n1, a seqncia de end
comandos se repete, e o valor de var aumenta de n3 a cada vez que o comando volta para do i=9,12 09
print '(2x,I2.2)',i 10
a linha do do. A repetio s para quando o valor de var ultrapassa n2. enddo 11
end 12
Caso o programa exija uma contagem regressiva o valor de n3 deve ser negativo e n1
maior que n2.
DO Implcito (WIN)
A palavra chave end do pode ser escrita como enddo. n1, n2 e n3 podem ser
Nos comandos read e write possvel usar uma estrutura de repetio semelhante
constantes ou variveis inteiras ou reais, positivas ou negativas. Quando n3 for igual a um ele
ao DO, mas de forma implcita e mais simplificada.
pode ser omitido.
read(unidade,formato)(lista_de_parmetros, var=n1,n2,n3)
DO WHILE (F90)
Onde var=n1,n2,n3 tem o mesmo significado que na estrutura DO. Podem ser
Uma forma de se usar uma expresso de teste no comando do, o uso do do
usadas vrias estruturas deste tipo em um mesmo read ou write desde que venham separadas
while. por parnteses. Quando impressos desta forma, os dados ficam na mesma linha. Para leitura
do while(exp. teste) eles podem vir na seqncia correta na mesma linha ou em linhas diferentes. Os parmetros
seqncia de comandos
em formato sero usados at que se atinja o seu final, quando isto acontecer o comando muda
end do
de linha e os formatos so usados novamente desde o comeo.
Enquanto exp. teste for verdadeira a seqncia de comandos ser executada.
Programa Resultado
real*8 a,b 1.000000000000000 Programa Resultado
a=0 9.921976672293290E-001 integer a(5,3), b(3) 11 - 21 - 31
b=0 9.689124217106447E-001 do i=1,5 41 - 51 - 101
1 if(a.lt.0) goto 2 9.305076219123143E-001 do j=1,3 12 - 22 - 32
a=cos(b) 8.775825618903728E-001 a(i,j)=10*i+j 42 - 52 - 108
b= b+.125 8.109631195052179E-001 b(j)=100+j**3 13 - 23 - 33
write (*,*) a 7.316888688738209E-001 enddo 43 - 53 - 127
goto 1 6.409968581633251E-001 enddo
2 continue 5.403023058681398E-001 write (*,1) ((a(i,j), i=1,5) &
end 4.311765167986662E-001 & ,b(j), j=1,3)
3.153223623952687E-001 1 format ( 2x,i4,' - ',i5,' - ',i4)
1.945477079889872E-001 end
7.073720166770291E-002
-5.417713502693632E-002
Programao em Linguagem FORTRAN .24. Programao em Linguagem FORTRAN .25.
Programa Resultado
Captulo 3: Recursos de Programao i=1
10 if(i-2) 1,2,3
i<2
i=2
1 write (*,*) ' i<2' i>2
i=2
1. Deslocamento goto 10
2 write (*,*) ' i=2'
i=3
GOTO Implcito goto 10
3 write (*,*) ' i>2'
Outra forma de usar o goto a seguinte: end
Uma outra maneira de se deslocar num programa, usando agora um comando if a vrgulas.
PARAMETER nome_type o nome do bloco, e deve seguir as mesmas regras para nomes de variveis.
declaraes so declaraes de variveis (tipo varivel). Este bloco pode ser usado
Uma constante pode ser representada por um smbolo no lugar do seu valor, ou seja o
vrias vezes, associando cada novo grupo um nome. O bloco com esse novo nome ter as
valor de , por exemplo, pode ser sempre que preciso referenciado como pi, no lugar de se
mesmas variveis feitas na declarao.
escrever sempre 3.14159. Bastando para isso o uso do comando parameter. A diferena
Associao:
entre um valor com parameter e uma varivel comum que com parameter o valor no
pode ser modificado em nenhuma parte do programa ou ser lido atravs de um comando type (nome_type) :: nome
read. O tipo da constante deve ser especificado antes ou sero usadas s atribuies Atribuio:
implcitas (item 4 Captulo 1).
nome = nome_type (valor das variveis)
tipo constante1, constante2,...
parameter ( constante1 = valor, constante2 = valor,...) ou
Os parnteses so opcionais. tipo pode ser integer, real ou qualquer outro tipo nome%nome_varivel = valor
type nome_type Os valores de vetores e matrizes devem ser declarados todos de uma vez, com a
declaraes
end type nome_type separao entre eles feita por vrgula.
Programao em Linguagem FORTRAN .28. Programao em Linguagem FORTRAN .29.
O nome do bloco opcional, e se for repetido, as variveis sero agrupadas em um As variveis declaradas em um common com nome podem receber valores iniciais de
mesmo bloco. A ausncia do nome e o nome / / tm o mesmo significado. As variveis de um uma forma mais estruturada. No block data podem ser usados os seguintes recursos:
common sem nome no podem ser declaradas pelo comando data. Uma mesma varivel common(com nome), parameter, data, dimension e variveis derivadas de um type.
no pode ocupar mais de um comando common. block data nome_bloco
declaraes e atribuies
A ordem em que as variveis aparecem no common devem ser iguais em qualquer parte end
do programa, apesar de seus nomes poderem variar de uma subrotina ou funo para outras.
O nome_bloco opcional e deve seguir as mesmas regras para nomes de variveis.
Na declarao de um common recomendvel que se siga uma ordem crescente do
tamanho das variveis. O tamanho de uma varivel dado pelo nmero de bites que ela
4. Modularizao
ocupa. A seqncia para essa declarao : logical, character, integer, real, vetores e matrizes.
As matrizes e vetores devem seguir esta mesma seqncia de tamanhos (vetores logical, INCLUDE
vetores character, ...). As strings so consideradas vetores de caracteres.
Declaraes, atribuies, common e outros comados que estejam em um arquivo de
Alguns compiladores apenas mostraro mensagens de advertncia quando est texto com o mesmo formato usado no programa podem ser adicionados ao programa principal
seqncia estiver incorreta, outros no avaliam esta ordem e consideram como corretas atravs do comando include. Esses arquivos podem ser adicionados a outros arquivos
quaisquer ordem em que as variveis aparecerem. include ao programa principal e a funes e subrotinas. O mesmo arquivo pode ser usado
vrias vezes. Os arquivos sero interpretados como parte do programa, e por isso devem
seguir as mesmas regras do programa normal escrito em FORTRAN.
Programao em Linguagem FORTRAN .30. Programao em Linguagem FORTRAN .31.
include nome.ext
Anexo A: Funes Intrnsecas
ou
Nome e extenso podem ser qualquer um, mas a extenso .inc a mais comum para Nome Definio Parmetro Resultado
SIN (X) seno (radianos). se x for real ou complexo. real*4
este tipo de arquivo. permitido o uso de caminhos completos no lugar do nome. complexo, a parte real
assumida como valor em
radianos.
SIND (X) seno (graus se x for real ou complexo real*4
complexo, a parte real
assumida como valor em
graus.
CSIN (X) seno (radianos) complex*4 complex*4
CDSIN (X) seno (radianos) complex*8 complex*8
DSIN (X) seno (radianos) real*8 real*8
DSIND (X) seno (graus) real*8 real*8
ASIN (X) Arcoseno (radianos). retorna real, |x| .le. 1 real*4
valores na faixa [-/2, /2 ]
ASIND (X) Arcoseno (graus) retorna real |x| .le. 1 real*4
valores na faixa [-90, 90 ]
DASIN (X) Arcoseno (radianos). retorna real*8 real*8
valores na faixa [-/2, /2 ]
DASIND (X) Arcoseno (graus) retorna real*8 real*8
valores na faixa [-90, 90 ]
COS (X) coseno (radianos) se x for real ou complexo real*4
complexo, a parte real
assumida como valor em
radianos.
COSD (X) coseno (graus) se x for real ou complexo real*4
complexo, a parte real
assumida como valor em
graus.
CCOS (X) coseno (radianos) complex*4 complex*4
CDCOS (X) coseno (radianos) complex*8 complex*8
DCOS (X) coseno (radianos) real*8 real*8
DCOSD (X) coseno (graus) real*8 real*8
AOS (X) Arcocoseno (radianos) ) real, |x| .le. 1 real*4
retorna valores na faixa [ 0,
]
ACOSD (X) Arcocoseno (graus) retorna real, |x| .le. 1 real*4
valores na faixa [ 0, 180 ]
DACOS (X) Arcocoseno (radianos) ) real*8, |x| .le. 1 real*8
retorna valores na faixa [ 0,
]
DACOSD (X) Arcocoseno (graus) ) retorna real*8, |x| .le. 1 real*8
valores na faixa [ 0, 180 ]
TAN (X) tangente (radianos) real real*4
TAND (X) tangente (graus) real real*4
DTAN (X) tangente (radianos) real*8 real*8
DTAND (X) tangente (graus) real*8 real*8
COTAN (X) cotangente (radianos) real. x no pode ser 0. real*4
DCOTAN (X) cotangente (radianos) real*8. x no pode ser 0. real*8
Programao em Linguagem FORTRAN .32. Programao em Linguagem FORTRAN .33.
7. Restos
Os valores absolutos dos dados complexos so calculados pela seguinte As opes entre colchetes so opcionais. Elas podem vir em qualquer ordem, exceto
formula: (real ) 2
+ (imag )
2 quando explicitado.
errlabel Expresso inteira. Indica o rtulo de uma linha no mesmo arquivo para onde o
comando vai se houver erro. Quando omitido o efeito determinado pela presena ou no de
iocheck.
file Expresso alfanumrica. Indica o nome do arquivo. Quando omitido o programa pede ao
usurio um nome.
iocheck Varivel inteira. Retorna zero quando no ocorre erros, retorna um nmero negativo
se encontrar a marca de fim de arquivo (EOF), retorna o nmero do erro quando um ocorre.
recl Expresso inteira. Representa o tamanho de cada dado em bytes. obrigatrio para errlabel Expresso inteira. Indica o rtulo de uma linha no mesmo arquivo para onde o
access=DIRECT. comando vai se houver erro. Quando omitido o efeito determinado pela presena ou no de
iocheck.
share Expresso alfanumrica. DENYRW ignora mode=READWRITE, DENYWR ignora
mode=WRITE, DENYRD ignora mode=READ, DENYNONE ignora qualquer mode, iocheck Varivel inteira. Retorna zero quando no ocorre erros, retorna o nmero do erro
quando um ocorre.
status Expresso alfanumrica. OLD indica que o arquiva j existe, NEW indica que o
arquivo deve ser criado, UNKOWN (padro) verifica a existencia do arquivo, se ele no existir rec Expresso inteira. Indica a posio do arquivo onde o dado ser impresso. Somente para
ser criado um, SCRATHC arquivos com access=DIRECT.
3. Escrita (WRITE) errlabel Expresso inteira. Indica o rtulo de uma linha no mesmo arquivo para onde o
comando vai se houver erro. Quando omitido o efeito determinado pela presena ou no de
WRITE ([UNIT=] unit [ , [{[ FMT=] format] | [ NML=] nml }]
iocheck.
[ , ERR=errlabel] [ , IOSTAT=iocheck] [ , REC=rec] ) iolist
iocheck Varivel inteira. Retorna zero quando no ocorre erros, retorna 1 se encontrar EOF,
UNIT= - Quando omitido, o primeiro valor ser o nmero da unidade (unit). Se FMT= ou NML=
retorna o nmero do erro quando um ocorre.
forem omitidos, format ou nml devem ser o segundo parmetro.
rec Expresso inteira. Indica a posio do arquivo de onde o dado ser lido.
unit Expresso inteira. Indica o nmero da unidade.
iolist Lista de variveis serem lidas.
format Expresso inteira. Indica o rtulo de um comando format. Expresso alfanumrica.
Expresso que contenha os formatos de impresso.
nml Lista de variveis serem impressas, se estiver presente iolist deve ser omitida. 5. Recuo Total (REWIND)
iocheck Varivel inteira. Retorna zero quando no ocorre erros, retorna o nmero do erro
quando um ocorre.
errlabel Expresso inteira. Indica o rtulo de uma linha no mesmo arquivo para onde o
comando vai se houver erro. Quando omitido o efeito determinado pela presena ou no de
iocheck.
iocheck Varivel inteira. Retorna zero quando no ocorre erros, retorna o nmero do erro
quando um ocorre.