Vous êtes sur la page 1sur 266

Captulo 1.

INTRODUO

OBJETIVOS DO CAPTULO Conceitos de: linguagem de programao, FORTRAN, projeto, programa-fonte, programa-objeto, programa-executvel, compilao, comando Procedimentos bsicos para programar em linguagem FORTRAN Comandos do FORTRAN: WRITE e END

1.1 USO DESTE TEXTO EM DISCIPLINAS O objetivo deste texto ensinar a implementar programas com a linguagem FORTRAN 95 e, implicitamente, a desenvolver algoritmos para resolver problemas bsicos de matemtica e fsica. Os captulos 1 a 13 deste texto so recomendados para disciplinas introdutrias de programao em cursos de engenharia. J os captulos 14 a 20 podem ser usados em cursos avanados de programao em nvel de graduao. Cada captulo foi estruturado para ser lecionado em aulas com durao de duas horas. Uma disciplina de 30 horas vem sendo ministrada no primeiro perodo semestral do curso de graduao em engenharia mecnica da Universidade Federal do Paran. Esta disciplina envolve os captulos 1 a 13 mais duas provas. Outra disciplina, envolvendo os captulos 1 a 20, com 45 horas, est prevista para ser lecionada em nvel de ps-graduao. 1.2 BIBLIOGRAFIA No objetivo deste texto entrar em detalhes sobre hardware e software de computadores. Aos interessados nestes aspectos recomenda-se o livro de Ramalho (2000), que adotado neste texto como referncia para termos tcnicos de informtica em portugus. Dois textos recomendados sobre algoritmos so o livro de Forbellone e Eberspacher (2000) e a apostila de Moraes (2000). O material apresentado aqui baseado no livro de Adams et al. (1997), que se constitui num manual completo sobre a linguagem FORTRAN 95, padronizada pelas organizaes ISO (International Standadrs Organization) e ANSI (American National Standards Institute).

Captulo 1. Introduo

1.3 FORTRAN Existe uma infinidade de linguagens de programao, por exemplo, Assembly, Cobol, Visual Basic, Pascal, Java, C++ etc (Ramalho, 2000, p. 114 e 124-30). Elas so usadas para criar os programas, tambm denominados de softwares ou aplicativos, que so empregados nos computadores. A utilidade das linguagens de programao pode ser percebida ao se lembrar para que so usados, por exemplo: os sistemas operacionais Windows, Unix e Linux; os aplicativos Word, Excel, PowerPoint, FrontPage, CorelDraw, Origin e Acrobat; os navegadores da internet Netscape e Explorer; e os programas dos caixas automticos dos bancos. A linguagem FORTRAN, contrao de FORmula TRANslation (Traduo de Frmulas), ainda a principal linguagem de programao usada em engenharia e aplicaes cientficas (Adams, 2000, p. 1). Foi criada em 1954. Sua primeira verso comercial surgiu em 1957. As verses do FORTRAN padronizadas pela ANSI e ISO so: 1) Ano 1966 = FORTRAN 66 2) Ano 1978 = FORTRAN 77 3) Ano 1992 = FORTRAN 90 4) Ano 1997 = FORTRAN 95 1.4 CONVENES Para melhor entendimento deste texto, as seguintes convenes so adotadas: 1) So mostrados na cor azul links para endereos de sites da internet ou para arquivos que definem termos e procedimentos importantes para este texto. 2) Comandos de programas ou aplicativos que devem ser executados ao longo do texto so mostrados em negrito. A vrgula usada para separar uma seqncia de comandos.
3) So apresentados na cor vermelha: os programas, seus dados (entradas) e seus resultados (sadas).

4) Qualquer referncia ao sistema operacional Windows NT 4.0 abreviado para Windows. 5) Qualquer referncia ao aplicativo Fortran PowerStation 4.0, da Microsoft, abreviado para Fortran. 6) Qualquer referncia linguagem FORTRAN abreviado para FORTRAN, tudo em maisculo para distinguir do aplicativo Fortran PowerStation 4.0. 7) Devido grande quantidade de termos em ingls, no feito qualquer distino para palavras em portugus. 8) Comandos, isto , palavras-chave da linguagem FORTRAN so apresentados em letras maisculas.

Captulo 1. Introduo

1.5 INICIALIZAO DO APLICATIVO FORTRAN POWERSTATION 4.0 Para seguir este texto, no necessrio nenhum conhecimento anterior sobre linguagem de programao. necessrio apenas ter conhecimentos bsicos sobre o sistema operacional Windows NT 4.0 ou verses mais recentes. Todos os programas em FORTRAN apresentados neste texto foram editados e compilados com o aplicativo Fortran PowerStation 4.0, da Microsoft. Alm de seus manuais, este aplicativo contm o livro de Hahn (1994) sobre FORTRAN 90 e o item Reference onde so descritos todos os comandos do FORTRAN, incluindo exemplos. Conforme mostrado na Figura 1.1, para iniciar o uso deste aplicativo, deve-se executar no Windows: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio. Para facilitar a edio dos programas, recomenda-se maximizar a janela principal do Fortran, clicando sobre o cone central que fica no canto superior direito. Fazendo isso, o aspecto do Fortran dever ser semelhante quele mostrado na Figura 1.2.

Figura 1.1 Inicializao do aplicativo Fortran PowerStation 4.0. Na janela principal do Fortran, mostrada na Figura 1.2, pode-se perceber:

Captulo 1. Introduo

Figura 1.2 Janela principal do aplicativo Fortran PowerStation 4.0. 1) Na barra em azul, o cone do Fortran e o ttulo da janela principal: Microsoft Developer Studio. 2) Abaixo da barra em azul, o menu do Fortran, ou seja, as opes existentes para usar este aplicativo, que so: File, Edit, View, Insert, Build, Tools, Window e Help. 3) A janela principal do Fortran dividida em trs partes ou subjanelas. Se no estiver aparecendo a subjanela inferior, mostrada na Figura 1.2, deve-se executar: View, Output. 4) Na subjanela do lado esquerdo, tem-se o diretrio principal dos manuais do Fortran, destacando-se: Reference, que uma lista de comandos do FORTRAN 90, incluindo explicaes e exemplos de uso; e Fortran 90 for Scientists and Engineers, que um livro sobre a linguagem FORTRAN 90. Esta subjanela tambm usada para mostrar os nomes dos programas editados na linguagem FORTRAN. Quando um programa estiver sendo editado, para acessar os manuais, deve-se clicar sobre a opo ? InfoView, mostrada na Figura 1.2, que fica na parte inferior da subjanela do lado esquerdo. E para voltar ao programa que est sendo editado, basta clicar sobre a opo FileView. 5) Na subjanela inferior so apresentadas informaes sobre erros de programao e compilao. Detalhes sero vistos no captulo 2. 6) A subjanela do lado direito, a maior das trs, usada para: apresentar o contedo dos manuais e para a edio de programas em FORTRAN.

Captulo 1. Introduo

1.6 CRIAO DE UM PROJETO DO TIPO CONSOLE APPLICATION O Fortran organiza todos os arquivos de um programa numa entidade chamada projeto. Em termos prticos, a criao de um projeto resulta na criao de uma pasta ou diretrio dentro do Windows. Existem diversos tipos de projetos que podem ser criados com o Fortran. A escolha do tipo depende da finalidade do programa e dos recursos do Windows que se deseja empregar. No caso deste texto, em sua parte bsica, que compreende os captulos 1 a 13, so empregados apenas projetos do tipo Console Application. E na parte avanada, que corresponde aos captulos 14 a 20, so usados projetos do tipo QuickWin Application, que permite utilizar diversos recursos do Windows. Para criar um projeto do tipo Console Application, devem ser executados os seguintes passos: 1) No menu do Fortran, conforme mostrado na Figura 1.3: File, New.

Figura 1.3 Incio da criao de um projeto no Fortran. 2) Na janela New, mostrada na Figura 1.4, clicar sobre a opo Project Workspace. Depois, clicar sobre o boto OK. 3) Na janela New Project Workspace, mostrada na Figura 1.5, necessrio executar o que segue:

Captulo 1. Introduo

Figura 1.4 Segundo passo na criao de um projeto no Fortran.

Figura 1.5 Janela para definio do tipo, diretrio e nome do projeto. a) Entre os seis tipos de projetos apresentados na opo Type, clicar sobre Console Application no caso deste tipo de projeto no estar selecionado (realado em azul). b) Na opo Location estar indicado um diretrio (pasta) default, ou seja, um diretrio escolhido pelo prprio Fortran em funo de sua configurao atual. possvel que no seja o diretrio desejado. Neste caso, deve-se clicar sobre o boto Browse para indicar o diretrio onde se quer criar o projeto. Ao se fazer isso, surgir a janela Choose Directory mostrada na Figura 1.6, na qual deve-se executar: Na opo Drives, clicando sobre o tringulo invertido, escolher C: Na opo Directory name, digitar C:\MSDEV\Projects, conforme mostrado na Figura 1.7. Clicar sobre o boto OK. c) Estar de volta a janela New Project Workspace, mostrada na Figura 1.5. Clicar dentro do espao de edio da opo Name. Escrever o nome do projeto, por exemplo, programa01. Depois disso, a janela New Project Workspace dever ficar conforme a Figura 1.8. Deve-se perceber que o nome do projeto, digitado na opo Name, aparece automaticamente na opo Location. Em

Captulo 1. Introduo

seguida, deve-se clicar sobre o boto Create. Aps isso, o Fortran criar um diretrio com o nome do projeto indicado, dentro do diretrio j selecionado, conforme mostrado na Figura 1.9.

Figura 1.6 Definio do drive do projeto.

Figura 1.7 Definio do diretrio para criao do projeto.

Figura 1.8 Tipo, nome e diretrio do projeto j definidos.


Captulo 1. Introduo 7

Figura 1.9 Fortran com o nome do diretrio criado para o projeto especificado. 1.7 CRIAO E INSERO DO PROGRAMA-FONTE DENTRO DO PROJETO O processo de edio ou criao de um programa semelhante redao de uma carta com o aplicativo Word, que um editor de textos. So necessrios dois componentes: um editor de textos para escrever o programa computacional e um arquivo para guardar o texto no hard disk (HD) do computador. No caso dos programas computacionais, a carta chamada de programa-fonte e pode ser aberta, editada ou redigida dentro do Fortran ou em qualquer outro editor de textos. Ao longo deste texto, as palavras edio, digitao e implementao sero usadas como sinnimos. Para iniciar a edio ou escrita de um programa-fonte em linguagem FORTRAN necessrio criar e inserir um arquivo dentro do projeto. Isso feito atravs dos seguintes passos: 1) No menu do Fortran, conforme mostrado na Figura 1.10, executar: Insert, Files into Project 2) Na janela Insert Files into Project, mostrada na Figura 1.11, executar o seguinte: a) Na opo File Name, digitar o nome do programa-fonte a ser criado; por exemplo, como mostrado na Figura 1.12, programa01.f90 Sempre deve-se usar f90 como extenso dos nomes dos arquivos do tipo programa-fonte. Ele indica que o programa est ou ser escrito na linguagem FORTRAN 90 ou 95. b) Clicar sobre o boto OK
Captulo 1. Introduo 8

Figura 1.10 Incio da criao do programa-fonte.

Figura 1.11 Janela para definio do nome do programa-fonte a inserir no projeto. 3) Na janela Microsoft Developer Studio, mostrada na Figura 1.13, clicar sobre o boto Yes 4) Na subjanela do lado esquerdo do Fortran, clicar sobre o sinal + ao lado do nome do projeto; dever aparecer o nome do programa-fonte que foi inserido no projeto; no caso, programa01.f90
Captulo 1. Introduo 9

5) Clicar rapidamente duas vezes sobre o nome do programa-fonte que foi inserido 6) Na janela Microsoft Developer Studio, mostrada na Figura 1.14, clicar sobre o boto Yes 7) O programa-fonte inserido no projeto j est pronto para ser editado na subjanela do lado direito do Fortran, conforme mostrado na Figura 1.15.

Figura 1.12 Nome do programa-fonte j definido.

Figura 1.13.

Figura 1.14.

Captulo 1. Introduo

10

Figura 1.15 Fortran pronto para edio do programa-fonte. 1.8 EDIO DO PROGRAMA-FONTE Aps a criao e insero do programa-fonte dentro do projeto, o Fortran est pronto para ser usado na edio do programa-fonte, conforme mostrado na Figura 1.15. Um exemplo de edio de programa-fonte apresentado a seguir. 1) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto mostrado abaixo em vermelho (para aparecerem as aspas, deve-se clicar sobre a tecla delas e, em seguida, clicar sobre a tecla de espao em branco).
WRITE(*,*) "Meu primeiro programa em FORTRAN" WRITE(*,*) "Ano 2004" END

2) Para gravar ou salvar este texto, no menu do Fortran, executar: File, Save. Em seguida, na extremidade inferior da janela principal do Fortran, surgir uma mensagem informando o diretrio e o nome do programa-fonte que foi gravado ou salvo, como mostrado na Figura 1.16. 3) Comentrios sobre este programa:

Captulo 1. Introduo

11

a) Dentro do editor de textos do Fortran, os comandos da linguagem FORTRAN so mostrados na cor azul, conforme pode ser visto na Figura 1.16. E o que criado ou definido pelo programador mostrado na cor preta. Comandos so palavras-chave que tm uma funo especfica e devem ser usados exatamente de acordo com suas normas. b) Existem dezenas de comandos na linguagem FORTRAN. No caso do primeiro programa-fonte, mostrado na Figura 1.16, so usados apenas dois comandos: WRITE e END. c) Como ser visto aps a execuo deste programa, ele simplesmente ir mostrar numa janela duas linhas de texto: na primeira, Meu primeiro programa em Fortran; e, na segunda, Ano 2004. Isso conseguido com o comando WRITE. Qualquer texto colocado entre aspas aps o comando WRITE(*,*) escrito numa janela. d) O comando END necessrio para indicar o fim do programa.

Figura 1.16 Programa-fonte escrito na linguagem FORTRAN. 1.9 COMPILAO E GERAO DO PROGRAMA-OBJETO Aps concluir a edio de um programa-fonte, ele deve ser compilado. O processo de compilao traduz o programa-fonte (que um arquivo do tipo texto, isto , que as pessoas conseguem ler naturalmente, como o programa01.f90) no chamado programa-objeto, que um arquivo do tipo binrio
Captulo 1. Introduo 12

(escrito na linguagem dos computadores, usando apenas os algarismos zero-0 e um-1). Uma linguagem de programao de alto nvel (Ramalho, 2000) como o FORTRAN se constitui numa forma amigvel ou relativamente fcil de se escrever programas. O aplicativo Fortran PowerStation 4.0, alm do editor de programas, tambm tem junto um compilador de programas. Para compilar um programa-fonte que est aberto no editor de textos do Fortran, deve-se executar o seguinte no menu do Fortran: Build, Compile Aps a compilao, conforme mostrado na Figura 1.17, aparecero trs linhas com mensagens na subjanela da parte inferior do Fortran: 1) A primeira informa que o Fortran est compilando (Compiling) o programa-fonte. 2) A segunda informa o nome e o diretrio do programa-fonte que est sendo compilado. 3) Finalmente, a terceira informa o nome do programa-objeto (no caso, programa01.obj) que foi gerado e o nmero de erros (errors) e de avisos (warnings) relativos ao programa-fonte compilado. Se houver algum erro, o programa-objeto no gerado. Avisos no impedem a gerao do programa-objeto. O nome do programa-objeto igual ao nome do programa-fonte mas com extenso obj

Figura 1.17 Compilao do programa-fonte. A compilao cria automaticamente um subdiretrio chamado Debug dentro do diretrio do projeto. Dentro deste subdiretrio que se encontra o programa-objeto bem como outros arquivos auxiliares. Pode-se ver isso com o aplicativo Windows NT Explorer, que acessado executando o
Captulo 1. Introduo 13

seguinte no Windows: Start, Programs, Windows NT Explorer. Depois, deve-se acessar o diretrio do projeto, que deve estar dentro do diretrio C:\Msdev\Projects 1.10 GERAO DO PROGRAMA-EXECUTVEL Aps o processo de compilao, necessrio gerar o programa-executvel, que um arquivo possvel de ser executado ou rodado pelo computador, como qualquer outro programa ou aplicativo; por exemplo, os aplicativos Word, Excel, PowerPoint, FrontPage, CorelDraw, Acrobat, e o navegador Internet Explorer. O programa-executvel resulta da unio do programa-objeto, que foi gerado na compilao do programa-fonte, com outros programas-objeto da prpria linguagem FORTRAN, que contm a traduo dos comandos do FORTRAN, como o WRITE e END usados no primeiro programafonte (Figura 1.17). Para gerar o programa-executvel, deve-se fazer o seguinte no menu do Fortran: Build, Build. Em seguida, conforme mostrado na Figura 1.18, aparecero duas linhas com mensagens na subjanela da parte inferior do Fortran:

Figura 1.18 Gerao do programa-executvel.

Captulo 1. Introduo

14

1) A primeira informa que o Fortran est gerando o programa-executvel, processo chamado de lincagem (linking). 2) A segunda informa o nome do programa-executvel (no caso, programa01.exe) que foi gerado e o nmero de erros (errors) e de avisos (warnings) relacionados a ele. O nome do programa-executvel igual ao nome do projeto mas com extenso exe O programa-executvel gravado automaticamente dentro do subdiretrio Debug, que fica dentro do diretrio do projeto, alm de outros arquivos auxiliares. Isso pode ser visto com o aplicativo Windows NT Explorer, como mostrado na Figura 1.19. Note nesta figura que no Windows NT Explorer a extenso ou Type do programa-executvel aparece como Application.

Figura 1.19 Diretrio do projeto programa01 e seu subdiretrio Debug. 1.11 EXECUO DO PROGRAMA Aps gerar o programa-executvel, para execut-lo ou rod-lo, isto , para coloc-lo em funcionamento, basta fazer o seguinte no menu do Fortran: Build, Execute. Como resultado deste comando, deve ocorrer o seguinte: 1) Aparecer uma janela do tipo DOS, conforme a Figura 1.20. Isso ocorre porque na seo 1.6 foi criado um projeto do tipo Console Application.
Captulo 1. Introduo 15

2) No ttulo desta janela, com fundo em azul, aparece o nome do programa que est sendo executado e o diretrio no qual ele se encontra, no caso C:\MSDEV\Projects\programa01\Debug\programa01.exe 3) Dentro desta janela, com fundo em preto, aparece o resultado da execuo do programa. No caso, as frases Meu primeiro programa em Fortran e Ano 2004. A ordem das duas frases a mesma em que elas foram colocadas no programa-fonte. Isso ocorre, porque o programa executado do topo para baixo, linha por linha do programa-fonte. 4) Alm disso, tambm aparece a frase Press any key to continue. Como diz este aviso, basta clicar em qualquer tecla para continuar. Ao fazer isso, a execuo do programa encerrada.

Figura 1.20 Resultado da execuo do programa01. 1.12 FIM DA SESSO Para concluir o uso do Fortran e do Windows, deve-se executar o seguinte: 1) Para encerrar as atividades com um projeto, basta executar no menu do Fortran: File, Close Workspace 2) Na janela Microsoft Developer Studio, clicar sobre o boto Yes 3) Para fechar o aplicativo Fortran, basta fazer o seguinte em seu menu: File, Exit 4) Para fechar o Windows, executar: Start, Shut Down 5) Na janela Shut Down Windows, escolher a opo Close all programs and log on as a different user?. Clicar sobre o boto Yes

Captulo 1. Introduo

16

1.13 EXERCIOS Exerccio 1.1 1) Editar um programa-fonte em FORTRAN para escrever a data atual. 2) Compilar o programa-fonte 3) Gerar o programa-executvel 4) Executar o programa Exerccio 1.2 1) Repetir o exerccio 1.1 para escrever em linhas diferentes cada um dos seguintes itens: nome, e-mail, endereo e telefone de uma pessoa.

Captulo 1. Introduo

17

Captulo 2. VARIVEIS DO TIPO INTEIRO

OBJETIVOS DO CAPTULO Conceitos de: variveis do tipo inteiro, atribuio, avisos e erros de compilao, erros de execuo, comentrios dentro do programa-fonte Operadores matemticos bsicos Comandos do FORTRAN: INTEGER e READ

2.1 programa02.f90, verso A Para inicializar as atividades deste captulo, deve-se executar: 1) No Windows, seguindo o procedimento apresentado na seo 1.5 do captulo 1: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio 2) No Fortran, seguindo o procedimento apresentado na seo 1.6 do captulo 1, criar um projeto do tipo Console Application com o nome programa02 no diretrio Z:\\SERVER1\Alunos2004_1\login, onde login deve ser substitudo pelo user name do usurio, isto , a conta particular na rede Windows do DEMEC/UFPR. 3) No Fortran, seguindo o procedimento apresentado na seo 1.7 do captulo 1, criar e inserir no projeto o programa-fonte programa02.f90 4) Conforme mostrado na Figura 2.1, dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto mostrado abaixo em vermelho.
INTEGER A WRITE(*,*) "A" WRITE(*,*) A END

5) Comentrios sobre o programa: a) No captulo 1 foram usados os comandos WRITE e END da linguagem FORTRAN. No programa02.f90, h um novo comando: INTEGER. Ele usado para definir variveis do tipo inteiro, isto , variveis que podem guardar ou armazenar na memria do computador nmeros inteiros, positivos ou negativos, como 2, 5, 0, 54367 ou 3. b) A linha INTEGER A define a varivel A como sendo do tipo inteiro. Este comando reserva um espao na memria do computador, utilizando o nome ou rtulo A para armazenar um valor inteiro.
Captulo 2. Variveis do tipo inteiro 18

c) A linha WRITE(*,*) "A" escreve o comentrio que est entre aspas; no caso a letra A. d) A linha WRITE(*,*) A escreve o valor da varivel A que est armazenado na memria do computador. e) A linha END encerra o programa. 6) Ao se compilar o programa, executando Build, Compile, o resultado deve ser o mostrado na Figura 2.1. Deve-se notar na subjanela inferior um aviso (warning) mencionando que o valor da varivel A no foi definido. 7) Gerar o programa-executvel fazendo Build, Build.

Figura 2.1 Resultado da compilao do programa02.f90, verso A. 8) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 2.2, dentro da qual tem-se: a) Na primeira linha, a letra A, resultado do comando WRITE(*,*) "A" do programa. b) Na segunda linha, o valor zero, resultado do comando WRITE(*,*) A do programa. Isso ocorre porque no foi definido um valor para a varivel A, conforme o prprio Fortran informou durante a compilao do programa. Portanto, sempre necessrio definir o valor de cada varivel do programa, caso contrrio, por default, assume-se valor nulo. c) E na terceira linha, a frase Press any key to continue. Como diz este aviso, basta clicar em qualquer tecla para continuar. Ao se fazer isso, a execuo do programa encerrada. 9) Deve-se perceber a diferena que existe entre os comandos WRITE(*,*) "A" e WRITE(*,*) A do programa. No primeiro, A um comentrio. No segundo, A uma varivel utilizada para armazenar um valor inteiro na memria do computador.

Captulo 2. Variveis do tipo inteiro

19

Figura 2.2 Resultado da execuo do programa02.f90, verso A. 2.2 programa02.f90, verso B 1) Dentro do Fortran, editar exatamente o texto mostrado abaixo em vermelho.
INTEGER A A = 3 WRITE(*,*) "A" WRITE(*,*) A END

2) Comentrios sobre o programa: a nica diferena entre a verso anterior (A) e a atual (B) do programa02.f90 a incluso da segunda linha, ou seja, A = 3. O sinal de igualdade dentro de um programa escrito em linguagem FORTRAN utilizado para atribuir o valor que est do lado direito varivel do lado esquerdo. Portanto, neste caso, o valor 3 atribudo varivel A. Em outras palavras, o valor 3 armazenado num espao da memria do computador que identificado pelo nome ou rtulo A, o nome da varivel. Este valor utilizado (3) apenas um exemplo; ele pode ser qualquer nmero inteiro. 3) Nesta verso do programa, ao se executar Build, Compile, no haver aviso (warning) porque, neste caso, o valor da varivel A est definido. 4) Gerar o programa-executvel fazendo Build, Build. 5) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 2.3, dentro da qual tem-se: a) Na primeira linha, a letra A, resultado do comando WRITE(*,*) "A" do programa. b) Na segunda linha, o valor 3, resultado do comando WRITE(*,*) A do programa e do comando anterior, A = 3. c) E na terceira linha, a frase Press any key to continue. 6) Deve-se perceber que o programa executado, linha por linha, da primeira (INTEGER A) at a ltima (END). 7) Um exemplo de erro de compilao apresentado na Figura 2.4. Ele ocorre devido eliminao do segundo asterisco da terceira linha do programa. Erros de compilao ocorrem quando os comandos
Captulo 2. Variveis do tipo inteiro 20

do FORTRAN so utilizados de forma incorreta. Na subjanela inferior do Fortran, geralmente haver um comentrio indicando cada erro (error). Logo aps o nome do programa-fonte compilado, entre parnteses, indicado o nmero da linha do programa-fonte aonde deve estar o erro. No exemplo da Figura 2.4, o compilador do Fortran mostra o seguinte comentrio: C:\marchi\programa02\programa02b.f90(3): error FOR3852: syntax error detected between , and ). Portanto, este comentrio indica que na linha 3 h um erro de sintaxe (erro que resulta do uso incorreto de um comando, no caso o WRITE) entre a vrgula e o sinal de fechamento de parnteses. 8) As linhas do programa-fonte so numeradas do topo para baixo, e as colunas, da esquerda para a direita. Na extremidade inferior da janela principal do Fortran, do lado direito, sempre so indicados a linha (Ln) e a coluna (Col) aonde o cursor se encontra dentro do programa-fonte.

Figura 2.3 Resultado da execuo do programa02.f90, verso B.

Figura 2.4 Exemplo de erro de compilao. 2.3 programa02.f90, verso C 1) Dentro do Fortran, editar exatamente o texto mostrado abaixo em vermelho.
INTEGER A A = 3 WRITE(*,*) "Valor de A = ", A

Captulo 2. Variveis do tipo inteiro

21

END

2) Comentrios sobre o programa: a diferena bsica entre a verso anterior (B) e a atual (C) do programa02.f90 a juno dos dois comandos WRITE num s, na terceira linha do programa, isto ,
WRITE(*,*) "Valor de A = ", A. Esta forma do comando WRITE usada quando se quer

escrever na mesma linha diversos elementos. No caso, so apenas dois elementos, ou seja, o comentrio Valor de A = e a varivel A. Os elementos devem ser separados por vrgula. 3) Executar Build, Compile para compilar o programa. 4) Gerar o programa-executvel fazendo Build, Build. 5) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 2.5, dentro da qual tem-se: a) Na primeira linha, como resultado do comando WRITE(*,*) "Valor de A = ", A do programa, o comentrio Valor de A = e, na mesma linha, o valor da varivel A, cujo valor atribudo dentro do programa foi 3. b) E na segunda linha, a frase Press any key to continue.

Figura 2.5 Resultado da execuo do programa02.f90, verso C. 2.4 programa02.f90, verso D 1) Dentro do Fortran, editar exatamente o texto mostrado abaixo em vermelho.
INTEGER A A = 4 A = 3 WRITE(*,*) "Valor de A = ", A END

2) Comentrios sobre o programa: a nica diferena entre a verso anterior (C) e a atual (D) do programa02.f90 a incluso da linha A = 4, que atribui o valor 4 varivel A. 3) Executar Build, Compile para compilar o programa. 4) Gerar o programa-executvel fazendo Build, Build.

Captulo 2. Variveis do tipo inteiro

22

5) Ao se executar o programa, atravs de Build, Execute, o resultado o mesmo mostrado na Figura 2.5. Isso ocorre porque o programa executado, linha por linha, da primeira (INTEGER A) at a ltima (END). Assim, embora tenha sido atribudo o valor 4 varivel A na segunda linha do programa, na linha seguinte atribui-se o valor 3 mesma varivel, e, na quarta linha do programa, escreve-se o valor de A. O valor escrito 3 porque o ltimo valor que foi armazenado na memria do computador. A denominao varivel usada justamente porque seu valor pode ser alterado ao longo da execuo do programa. 2.5 programa02.f90, verso E 1) Dentro do Fortran, editar exatamente o texto mostrado abaixo em vermelho, incluindo a linha em branco.
! Programa02.f90 INTEGER A A = 3 ! atribui o valor 3 varivel A WRITE(*,*) "Valor de A = ", A END

2) Comentrios sobre o programa: em cada linha do programa-fonte, tudo que estiver direita do smbolo ! (exclamao) no executado pelo programa. So apenas comentrios usados para esclarecer o que faz cada parte do programa. Isso chamado de documentao interna. Dentro do editor do Fortran, todos os comentrios ficam na cor verde, como mostrado na Figura 2.6. Um comentrio pode envolver uma linha inteira do programa, como na primeira da verso E, ou apenas uma parte, como na quarta linha do programa. Linhas em branco dentro do programa-fonte tambm no so executadas. Elas equivalem a um comentrio em branco. Um exemplo a terceira linha do programa02.f90, verso E, na Figura 2.6. 3) Executar Build, Compile para compilar o programa. 4) Gerar o programa-executvel fazendo Build, Build. 5) Ao se executar o programa, atravs de Build, Execute, o resultado o mesmo mostrado na Figura 2.5. Isso ocorre porque as diferenas entre a verso C e a atual (E) do programa02.f90 so apenas os comentrios e uma linha em branco, que no so executados pelo programa. 6) Para maior clareza e facilidade de compreenso do programa-fonte, recomenda-se que dentro dele sejam usados comentrios e linhas em branco.

Captulo 2. Variveis do tipo inteiro

23

Figura 2.6 Programa02.f90, verso E. 2.6 programa03.f90, verso A Para inicializar as atividades com o prximo programa, deve-se executar: 1) No Fortran, para fechar o projeto atual: File, Close Workspace 2) Na janela Microsoft Developer Studio, clicar sobre o boto Yes 3) No Fortran, seguindo o procedimento apresentado na seo 1.6 do captulo 1, criar um projeto do tipo Console Application com o nome programa03 no diretrio Z:\\SERVER1\Alunos2004_1\login, onde login deve ser substitudo pelo user name do usurio, isto , a conta particular na rede Windows do DEMEC/UFPR. 4) No Fortran, seguindo o procedimento apresentado na seo 1.7 do captulo 1, criar e inserir no projeto o programa-fonte programa03.f90 5) Dentro do Fortran, editar exatamente o texto mostrado abaixo em vermelho, incluindo as linhas em branco.
INTEGER A, B, C, D, E, F, G A = -6 B = 2 C = A + B D = B - A Captulo 2. Variveis do tipo inteiro 24

E = A * B F = A / B G = A ** B WRITE(*,*) "A = ", A WRITE(*,*) "B = ", B WRITE(*,*) "A + B = ", C WRITE(*,*) "B - A = ", D WRITE(*,*) "A * B = ", E WRITE(*,*) "A / B = ", F WRITE(*,*) "A ** B = ", G END

6) Comentrios sobre o programa: a) A linha INTEGER A, B, C, D, E, F, G define as variveis A, B, C, D, E, F e G como sendo do tipo inteiro. Este comando reserva espao na memria do computador para diversas variveis com apenas um comando INTEGER. Entretanto, as variveis devem estar separadas por vrgula. b) As linhas A = -6 e B = 2 atribuem os valores inteiros 6 e 2 s variveis A e B. Estes valores so apenas exemplos; eles podem ser quaisquer nmeros inteiros. c) As variveis C, D, E, F e G so calculadas em funo dos valores das variveis A e B, usando os cinco operadores matemticos bsicos definidos na Tabela 2.1, conforme explicado a seguir. Tabela 2.1 Operadores matemticos bsicos em FORTRAN. Smbolo do operador matemtico em FORTRAN + * / ** Sinal mais Sinal menos Asterisco Barra Duplo asterisco Nome do smbolo Operao matemtica correspondente Adio Subtrao Multiplicao Diviso Potenciao

d) A linha C = A + B adiciona os valores das variveis A e B e atribui o resultado varivel C. e) A linha D = B - A subtrai o valor da varivel A do valor da varivel B e atribui o resultado varivel D. f) A linha E = A * B multiplica os valores das variveis A e B e atribui o resultado varivel E. g) A linha F = A / B divide o valor da varivel A pelo valor da varivel B e atribui o resultado varivel F.
Captulo 2. Variveis do tipo inteiro 25

h) A linha G = A ** B eleva o valor da varivel A ao valor da varivel B e atribui o resultado varivel G. 7) Executar Build, Compile para compilar o programa. 8) Gerar o programa-executvel fazendo Build, Build. 9) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 2.7, dentro da qual tem-se: os valores das variveis A e B; e os valores resultantes das cinco operaes matemticas bsicas da Tabela 2.1 efetuadas com as variveis A e B. Analisar cada resultado, comparando-o com o valor esperado obtido de um clculo mental. 10) Dentro do programa-fonte, fazer A = 1 e B = 2. Compilar e gerar o executvel do programa com esta alterao. Executar o programa cujo resultado deve ser aquele mostrado na Figura 2.8. Analisar cada resultado, comparando-o com o valor esperado obtido de um clculo mental. O resultado da diviso pode parecer incorreto mas no . Isso se deve ao seguinte: o valor que resulta de um clculo envolvendo dois nmeros inteiros tambm um nmero inteiro, que corresponde parte inteira do nmero real equivalente ao clculo realizado. Portanto, o resultado de 1 dividido por 2 resulta em 0,5, que um nmero real. Mas como o clculo envolve dois nmeros inteiros, a parte inteira do nmero real 0,5 0, que o resultado da diviso mostrado na Figura 2.8. Este tema ser explorado com mais detalhes no Captulo 3.

Figura 2.7 Resultado da execuo do programa03.f90, verso A, com A = 6 e B = 2.

Figura 2.8 Resultado da execuo do programa03.f90, verso A, com A = 1 e B = 2.

Captulo 2. Variveis do tipo inteiro

26

11) Atribuir valores s variveis dentro do prprio programa-fonte no recomendvel. Pois, para alterar os valores, necessrio ter o programa-fonte, alm de recompil-lo e gerar o programa-executvel a cada vez. O procedimento mais indicado utilizar o comando READ, apresentado na prxima seo. 2.7 programa03.f90, verso B 1) Dentro do Fortran, alterar o programa03.f90, verso A, para que fique exatamente igual ao texto mostrado abaixo em vermelho, incluindo as linhas em branco.
INTEGER A, B, C, D, E, F, G WRITE(*,*) "Entre com o valor de A" READ(*,*) A WRITE(*,*) "Entre com o valor de B" READ(*,*) B C = A + B D = B - A E = A * B F = A / B G = A ** B WRITE(*,*) "A = ", A WRITE(*,*) "B = ", B WRITE(*,*) "A + B = ", C WRITE(*,*) "B - A = ", D WRITE(*,*) "A * B = ", E WRITE(*,*) "A / B = ", F WRITE(*,*) "A ** B = ", G END

2) Comentrios sobre o programa: a) A nica diferena entre a verso anterior (A) e a atual (B) do programa03.f90 est no nicio do programa. a incluso de 4 linhas novas no lugar de se atribuir valores s variveis A e B. b) At aqui, os comandos da linguagem FORTRAN que foram usados so: WRITE, END e INTEGER. Na verso B do programa03.f90, h um novo comando: READ. Ele usado para atribuir (fornecer) valores s variveis durante a execuo de um programa. Isto , o comando READ empregado para LER os dados de um programa.
Captulo 2. Variveis do tipo inteiro 27

c) A linha WRITE(*,*) "Entre com o valor de A" escreve o comentrio que est entre aspas. d) A linha READ(*,*) A l um valor digitado dentro da janela DOS, aberta durante a execuo do programa, e o atribui varivel A. 3) Executar Build, Compile para compilar o programa. 4) Gerar o programa-executvel fazendo Build, Build. 5) Ao se executar o programa, atravs de Build, Execute, surge uma janela do tipo DOS dentro da qual tem-se: a) Na primeira linha, o comentrio Entre com o valor de A, resultado do comando WRITE(*,*)
"Entre com o valor de A" do programa.

b) Na segunda linha, o programa pra e fica aguardando que seja fornecido o valor da varivel A, resultado do comando READ(*,*) A do programa. Para que o programa continue sua execuo necessrio digitar o valor 6 para a varivel A e, em seguida, clicar na tecla enter. c) Na terceira linha, o comentrio Entre com o valor de B, resultado do comando WRITE(*,*)
"Entre com o valor de B" do programa.

d) Na quarta linha, o programa pra e fica aguardando que seja fornecido o valor da varivel B, resultado do comando READ(*,*) B do programa. Para que o programa continue sua execuo necessrio digitar o valor 2 para a varivel B e, em seguida, clicar na tecla enter. e) Em seguida, so apresentados os mesmos resultados da verso A do programa03.f90, conforme a Figura 2.9.

Figura 2.9 Resultado da execuo do programa03.f90, verso B, com A = 6 e B = 2. 6) Executar novamente o programa, entrando com outros valores para A e B. Em seguida, analisar cada resultado, comparando-o com o valor esperado obtido de um clculo mental. 7) Executar novamente o programa, com A = 6 e B = 0. Nenhum resultado apresentado porque o programa no consegue dividir 6 por 0. Isso gera um erro que interrompe a execuo normal do programa. Ao se implementar um programa, deve-se prepar-lo para que seja evitado qualquer

Captulo 2. Variveis do tipo inteiro

28

diviso por zero. Isso pode ser feito atravs de comentrios que informem ao usurio do programa, na janela da execuo do programa ou no manual do programa, por exemplo, quais as variveis que no podem ter valor nulo. Outra forma mais efetiva de evitar diviso por zero ser vista em captulo futuro. 2.8 FIM DA SESSO Para concluir o uso do Fortran e do Windows, deve-se executar o seguinte: 1) Para encerrar as atividades com um projeto, basta executar no menu do Fortran: File, Close Workspace 2) Na janela Microsoft Developer Studio, clicar sobre o boto Yes 3) Para fechar o aplicativo Fortran, basta fazer o seguinte em seu menu: File, Exit 4) Para fechar o Windows, executar: Start, Shut Down 5) Na janela Shut Down Windows, escolher a opo Close all programs and log on as a different user?. Clicar sobre o boto Yes 2.9 EXERCIOS Exerccio 2.1 Executar novamente o programa03.f90, verso B, com A = 2 e B = 1. Em seguida, analisar cada resultado, comparando-o com o valor esperado obtido de um clculo mental, especialmente o caso da potenciao. No Fortran, para abrir um projeto j existente, como o programa03, basta executar File, Open Workspace. Em seguida, indicar o diretrio do projeto e selecionar o arquivo que tem o nome do projeto e extenso mdp, no caso programa03.mdp Exerccio 2.2 Executar novamente o programa03.f90, verso B, usando nmeros reais, isto , A = 1.5 e B = 0.4. Nmeros reais so representados com o sinal de ponto para separar a parte inteira da decimal. Exerccio 2.3 1) Editar um programa-fonte em FORTRAN para executar o seguinte algoritmo (passos): a) ler trs nmeros inteiros b) calcular a mdia aritmtica deles c) escrever os valores lidos e o valor da mdia aritmtica juntamente com comentrios para identific-los 2) Compilar o programa-fonte
Captulo 2. Variveis do tipo inteiro 29

3) Gerar o programa-executvel 4) Executar o programa com os valores 1, 2 e 3. Em seguida, analisar o resultado da mdia fornecido pelo programa comparando-o com o valor esperado obtido por um clculo mental. 5) Repetir o item 4 para os valores 1, 1 e 2. Exerccio 2.4 1) Editar um programa-fonte em FORTRAN para executar o seguinte algoritmo (passos): a) ler o primeiro valor (inteiro) de uma progresso aritmtica (P.A.), denotado por A1 b) ler a diferena (nmero inteiro) entre dois termos subseqentes da P.A., denotada por D c) ler o nmero (inteiro) de termos da P.A., denotado por N d) calcular o ltimo termo da P.A., denotado por AN e) calcular a soma de todos os termos da P.A., denotado por SN f) escrever os trs valores lidos e os dois calculados juntamente com comentrios para identific-los 2) Compilar o programa-fonte 3) Gerar o programa-executvel 4) Executar o programa para A1 = 1, D = 3 e N = 5. Os resultados devem ser AN = 13 e SN = 35.

Captulo 2. Variveis do tipo inteiro

30

Captulo 3. VARIVEIS DO TIPO REAL

OBJETIVOS DO CAPTULO Conceitos de: variveis do tipo real, traduo de expresses algbricas em FORTRAN, mistura de variveis do tipo inteiro com real, prioridade nas operaes matemticas Operadores matemticos bsicos Comando do FORTRAN: REAL

3.1 programa03c.f90 Para inicializar as atividades deste captulo, deve-se executar: 1) No Windows: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio 2) Neste captulo ser usado um projeto j existente, no caso o projeto do fim do captulo 2. Para abri-lo, deve-se executar o seguinte no Fortran: a) File, Open Workspace b) Indicar o diretrio do projeto chamado programa03 c) Selecionar o arquivo que tem o nome do projeto e extenso mdp, no caso programa03.mdp d) Na subjanela do lado esquerdo do Fortran, clicar sobre o sinal + ao lado do nome do projeto; dever aparecer o nome do ltimo programa-fonte que foi inserido neste projeto e) Clicar sobre o nome do programa-fonte f) Edit, Cut para retirar o programa-fonte do projeto. Este comando no deletar o programa-fonte. Ele apenas o retirar do projeto. Quando se quiser, ele poder ser inserido no projeto novamente, bastando para isso selecionar o programa-fonte desejado dentro do seu diretrio e usar o comando Insert, Files into Project. 3) No Fortran, seguindo o procedimento apresentado na seo 1.7 do captulo 1, criar e inserir no projeto chamado programa03 o programa-fonte programa03c.f90 4) Conforme mostrado na Figura 3.1, dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 3.1. 5) Comentrios sobre o programa: a) Nos captulos 1 e 2 foram usados os comandos WRITE, END, INTEGER e READ da linguagem FORTRAN. No programa03c.f90 h um novo comando: REAL. Ele usado para definir variveis do tipo real, isto , variveis que podem guardar ou armazenar na memria do computador nmeros reais, positivos ou negativos, como 1.0, 1.0, 1.1, 3.1416 ou 0.003.

Captulo 3. Variveis do tipo real

31

b) No FORTRAN, nmeros reais so representados com o sinal de ponto para separar a parte inteira da decimal. Deve-se lembrar que em portugus se usa a vrgula com este fim. c) A linha REAL A define a varivel A como sendo do tipo real. Este comando reserva um espao na memria do computador, utilizando o nome ou rtulo A para armazenar um valor real. As demais linhas do programa j foram comentadas no captulo 2. Tabela 3.1 Programa03c.f90.
REAL A WRITE(*,*) "Entre com o valor de A =" READ(*,*) A WRITE(*,*) "Valor de A = ", A END

Figura 3.1 Programa03c.f90. 6) Executar Build, Compile para compilar o programa 7) Gerar o programa-executvel fazendo Build, Build. 8) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 3.2, dentro da qual tem-se: a) Na primeira linha, o comentrio Entre com o valor de A, resultado do comando WRITE(*,*)
"Entre com o valor de A" do programa.

Captulo 3. Variveis do tipo real

32

b) Na segunda linha, o programa pra e fica aguardando que seja fornecido o valor da varivel A, resultado do comando READ(*,*) A do programa. Para que o programa continue sua execuo necessrio digitar o valor 1 para a varivel A, por exemplo, e, em seguida, clicar na tecla enter. c) Na terceira linha, o comentrio Valor de A = e o valor da varivel A, resultado do comando
WRITE(*,*) "Valor de A = ", A do programa. Deve-se notar que foi fornecido um valor

inteiro para a varivel A, no caso 1. Mas o resultado do programa mostra o valor 1.000000 porque a varivel A do tipo real. d) Na quarta linha, a frase Press any key to continue. Como diz este aviso, basta clicar em qualquer tecla para continuar. Ao se fazer isso, a execuo do programa encerrada.

Figura 3.2 Resultado da execuo do programa03c.f90 com A = 1. 9) Executar novamente o programa, atravs de Build, Execute, com A = 0.0031. Junto a um nmero real, a letra E usada para representar nmeros muito grandes ou muito pequenos atravs da chamada notao cientfica ou exponencial. Desta forma, o valor 3.100000E-03 da varivel A, mostrado na Figura 3.3, significa 3.1x10-3, que igual a 0.0031.

Figura 3.3 Resultado da execuo do programa03c.f90 com A = 0.0031. 10) Executar novamente o programa, atravs de Build, Execute, com A = 1.0E+2. Pode-se fornecer dados ao programa usando a notao cientfica ou exponencial, como no exemplo mostrado na Figura 3.4, onde A = 1.0E+2 = 1.0x102 = 100 = 1.0E2 = 1E2.

Captulo 3. Variveis do tipo real

33

Figura 3.4 Resultado da execuo do programa03c.f90 com A = 1.0E+2. 3.2 programa03d.f90 1) Nesta seo ser usado um projeto j existente, no caso o projeto da seo anterior. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa-fonte b) Edit, Cut para retirar o programa-fonte do projeto. 2) No Fortran, seguindo o procedimento apresentado na seo 1.7 do captulo 1, criar e inserir no projeto chamado programa03 o programa-fonte programa03d.f90 3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 3.2. Tabela 3.2 Programa03d.f90.
INTEGER D REAL A, B, C WRITE(*,*) "Entre com o valor de A =" READ(*,*) A D = A B = 1 / D C = 1.0 / D WRITE(*,*) "Valor de D = ", D WRITE(*,*) "Valor de B = ", B WRITE(*,*) "Valor de C = ", C END

4) Executar Build, Compile para compilar o programa 5) Gerar o programa-executvel fazendo Build, Build.

Captulo 3. Variveis do tipo real

34

6) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 3.5, dentro da qual tem-se: a) Na primeira linha, o comentrio Entre com o valor de A, resultado do comando WRITE(*,*)
"Entre com o valor de A" do programa.

b) Na segunda linha, o programa pra e fica aguardando que seja fornecido o valor da varivel A, resultado do comando READ(*,*) A do programa. Para que o programa continue sua execuo necessrio digitar o valor 2.9 para a varivel A, por exemplo, e, em seguida, clicar na tecla enter. c) Nas linhas seguintes, os resultados das variveis D, B e C.

Figura 3.5 Resultado da execuo do programa03d.f90. 7) Comentrios sobre os resultados do programa03d.f90 mostrados na Figura 3.5: a) Na linha D = A do programa, o valor da varivel real A atribudo varivel inteira D. Portanto, apenas a parte inteira do nmero A passada varivel D, desprezando-se a parte decimal. b) Na linha B = 1 / D do programa, o resultado da diviso do nmero 1 (inteiro) pela varivel inteira D atribudo varivel real B. Conforme visto no captulo 2, o valor que resulta de um clculo envolvendo dois nmeros inteiros tambm um nmero inteiro, que corresponde parte inteira do nmero real equivalente ao clculo realizado. Portanto, o resultado de 1 dividido por 2 (varivel D) resulta em 0.5, que um nmero real. Mas como o clculo envolve dois nmeros inteiros, a parte inteira do nmero real 0.5 0, que o resultado da varivel B mostrado na Figura 3.5. Assim, apenas a parte inteira da diviso 1 / D passada varivel real B, desprezando-se a parte decimal. c) Na linha C = 1.0 / D do programa, o resultado da diviso do nmero 1.0 (real) pela varivel inteira D atribudo varivel real C. Neste caso, o clculo envolve a diviso de um nmero real (1.0) por um nmero inteiro (D). O resultado da varivel C mostrado na Figura 3.5 igual a 0.5, que um nmero real. Isso ocorre porque o valor que resulta de um clculo envolvendo um nmero inteiro e um nmero real um nmero real. 3.3 programa03e.f90
Captulo 3. Variveis do tipo real 35

1) Nesta seo ser usado um projeto j existente, no caso o projeto da seo anterior. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa-fonte b) Edit, Cut para retirar o programa-fonte do projeto. 2) No Fortran, seguindo o procedimento apresentado na seo 1.7 do captulo 1, criar e inserir no projeto chamado programa03 o programa-fonte programa03e.f90 3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 3.3. Tabela 3.3 Programa03e.f90.
REAL A, B, C, D, E, F, G WRITE(*,*) "Entre com o valor de A" READ(*,*) A WRITE(*,*) "Entre com o valor de B" READ(*,*) B C = A + B D = B - A E = A * B F = A / B G = A ** B WRITE(*,*) "A = ", A WRITE(*,*) "B = ", B WRITE(*,*) "A + B = ", C WRITE(*,*) "B - A = ", D WRITE(*,*) "A * B = ", E WRITE(*,*) "A / B = ", F WRITE(*,*) "A ** B = ", G END

4) Executar Build, Compile para compilar o programa 5) Gerar o programa-executvel fazendo Build, Build. 6) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 3.6, dentro da qual tem-se:

Captulo 3. Variveis do tipo real

36

a) Na primeira linha, o comentrio Entre com o valor de A, resultado do comando WRITE(*,*)


"Entre com o valor de A" do programa.

b) Na segunda linha, o programa pra e fica aguardando que seja fornecido o valor da varivel A, resultado do comando READ(*,*) A do programa. Para que o programa continue sua execuo necessrio digitar o valor 1.5 para a varivel A, por exemplo, e, em seguida, clicar na tecla enter. c) Na terceira linha, o comentrio Entre com o valor de B, resultado do comando WRITE(*,*)
"Entre com o valor de B" do programa.

d) Na quarta linha, o programa pra e fica aguardando que seja fornecido o valor da varivel B, resultado do comando READ(*,*) B do programa. Para que o programa continue sua execuo necessrio digitar o valor 0.4 para a varivel B, por exemplo, e, em seguida, clicar na tecla enter. e) Nas linhas seguintes, os resultados das variveis C, D, E, F e G.

Figura 3.6 Resultado da execuo do programa03e.f90. 7) Analisar cada resultado mostrado na Figura 3.6 comparando-o com o valor esperado obtido de um clculo mental ou com o uso de uma calculadora. 8) Executar novamente o programa com outros valores para A e B. Analisar cada novo resultado comparando-o com o valor esperado obtido de um clculo mental ou com o uso de uma calculadora. 3.4 ESCALA DE PRIORIDADES ENTRE OS OPERADORES MATEMTICOS Na linguagem FORTRAN, as operaes matemticas so executadas numa seqncia lgica de acordo com uma escala de prioridades entre elas, que apresentada na Tabela 3.4. Alm disso so consideradas as regras descritas na Tabela 3.5. importante conhecer estas prioridades e regras para se fazer corretamente a traduo de expresses algbricas em expresses na linguagem FORTRAN, dentro
Captulo 3. Variveis do tipo real 37

de um programa-fonte. Alguns exemplos de expresses algbricas so apresentados abaixo nas Equaes (3.1) a (3.8). Tabela 3.4 Escala de prioridades entre os operadores matemticos bsicos em FORTRAN. Prioridade 1a 2a 3a 4a Smbolo ( ) ** * / + Nome do smbolo Parnteses Duplo asterisco Asterisco Barra Sinal mais Sinal menos Operao Qualquer Potenciao Multiplicao Diviso Adio Subtrao

Tabela 3.5 Regras adotadas nas operaes matemticas em FORTRAN. Item 1 2 3 4 5 6 7 8 Regra No caso de operaes matemticas que tm a mesma prioridade (multiplicao e diviso ou adio e subtrao), executa-se primeiro o clculo mais esquerda Parnteses so usados para que os clculos sejam executados na ordem que se deseja. Com eles, a ordem de execuo do parnteses mais interno para o mais externo. Com duas ou mais potenciaes consecutivas, a ordem de execuo da direita para a esquerda. O valor que resulta de um clculo envolvendo dois nmeros inteiros tambm um nmero inteiro, que corresponde parte inteira do nmero real equivalente ao clculo realizado. Uma operao envolvendo um nmero real com um nmero inteiro resulta num nmero real. A atribuio de um nmero real a uma varivel do tipo inteiro resulta num nmero inteiro que trunca a parte decimal do nmero real. A atribuio de um nmero inteiro a uma varivel do tipo real resulta num nmero real. Quando se somam ou se subtraem dois nmeros com magnitudes muito diferentes, possvel que o valor menor seja desprezado. A isso se denomina de erro de arredondamento ou de truncamento. 9 Espaos em branco entre variveis, sinais de igualdade, parnteses, nmeros ou operadores matemticos no interferem no resultado dos clculos. Eles tm apenas funo esttica.
H1 = A + B C

(3.1)

H2

A +

B C

(3.2)

Captulo 3. Variveis do tipo real

38

H3

A + C

(3.3)

H4

A +

B D C
B CD

(3.4)

H5

A +

(3.5)

H6

A +

BC D

(3.6)

H9

= (C 3 ) 2

(3.7)

H 10

1 B3 3

(3.8)

3.5 programa03f.f90

1) Nesta seo ser usado um projeto j existente, no caso o projeto da seo 3.3 deste captulo. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa-fonte b) Edit, Cut para retirar o programa-fonte do projeto. 2) No Fortran, seguindo o procedimento apresentado na seo 1.7 do captulo 1, criar e inserir no projeto chamado programa03 o programa-fonte programa03f.f90 3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 3.6. 4) Comentrios sobre o programa: a) Nas duas primeiras linhas usado o comando REAL para definir as variveis do tipo real do programa. Num mesmo programa, pode-se usar um ou mais comandos REAL ou INTEGER. b) A linha READ(*,*) A, C, B, D do programa usada para ler os valores de quatro variveis. Um nico comando READ pode ser usado para a leitura de diversos valores que so atribudos a diversas variveis, que tm que estar separadas por vrgula. c) As expresses em FORTRAN para as variveis H1 a H6, H9 e H10 correspondem respectivamente s expresses algbricas dadas pelas Equaes (3.1) a (3.8).

Captulo 3. Variveis do tipo real

39

Tabela 3.6 Programa03f.f90.


REAL A, C, B, D REAL H1, H2, H3, H4, H5, H6, H7, H8, H9, H10, H11, H12 WRITE(*,*) "Entre com os valores de A, C, B e D" READ(*,*) A, C, B, D H1 = A + B - C H2 = A + B / C H3 = (A + B) / C H4 = A + B / C * D H5 = A + B / (C * D) H6 = A + B * C ** D H7 = A + (B * (C ** D)) H8 = 1.0 + 1.0E-10 H9 = C ** 3 ** 2 H10 = (1.0 / 3 H12 = (1 / 3 ) * ( (B**3) ** (1 ) * ( (B**3) ** (1 = ", H1 = ", H2 = ", H3 = ", H4 = ", H5 = ", H6 = ", H7 = ", H8 = ", H9 / 2.0) ) / 2 ) )

H11 = (1.0 / 3.0) * ( (B**3) ** (1.0 / 2.0) )

WRITE(*,*) "H1 WRITE(*,*) "H2 WRITE(*,*) "H3 WRITE(*,*) "H4 WRITE(*,*) "H5 WRITE(*,*) "H6 WRITE(*,*) "H7 WRITE(*,*) "H8 WRITE(*,*) "H9

WRITE(*,*) "H10 = ", H10 WRITE(*,*) "H11 = ", H11 WRITE(*,*) "H12 = ", H12 END

Captulo 3. Variveis do tipo real

40

d) A expresso em FORTRAN para a varivel H7 corresponde expresso algbrica dada pela Equao (3.6). e) As expresses em FORTRAN para as variveis H11 e H12 correspondem expresso algbrica dada pela Equao (3.8). Porm, na expresso de H12 so usados apenas nmeros inteiros nas divises. f) A expresso em FORTRAN para a varivel H8 corresponde a uma simples soma de dois nmeros reais, um muito pequeno em relao ao outro. 5) Executar Build, Compile para compilar o programa 6) Gerar o programa-executvel fazendo Build, Build. 7) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 3.7, dentro da qual tem-se:

Figura 3.7 Resultado da execuo do programa03f.f90. a) Na primeira linha, o comentrio Entre com os valores de A, C, B e D, resultado do comando
WRITE(*,*) "Entre com os valores de A, C, B e D" do programa.

b) Na segunda linha, o programa pra e fica aguardando que sejam fornecidos os valores da variveis A, C, B e D, resultado do comando READ(*,*) A, C, B, D do programa. Para que o programa continue sua execuo necessrio digitar quatro valores. Cada valor digitado ser atribudo respectivamente a uma das quatro variveis, na mesma seqncia. H vrias formas de se entrar com diversos valores para um nico comando READ: digitando tudo na mesma linha, com cada valor separado por vrgula ou espao em branco; digitando cada valor e, em seguida, clicando na tecla enter; ou misturas das trs formas anteriores. A primeira forma foi usada no exemplo da Figura 3.7 para se entrar com os valores 1, 2, 3 e 4, respectivamente, para as variveis A, C, B e D. c) Nas linhas seguintes, os resultados das variveis H1 a H12.
Captulo 3. Variveis do tipo real 41

8) Analisar cada resultado mostrado na Figura 3.7 comparando-o com o valor esperado obtido de um clculo mental ou com o uso de uma calculadora. Para tanto, devem ser consideradas a escala de prioridades da Tabela 3.4 e as regras descritas na Tabela 3.5. 9) Executar novamente o programa com outros valores para as variveis A, C, B e D. Analisar cada novo resultado comparando-o com o valor esperado obtido de um clculo mental ou com o uso de uma calculadora. 10) Para concluir o uso do Fortran e do Windows, deve-se executar os passos mostrados na seo 2.8 do captulo 2.
3.6 EXERCCIOS Exerccio 3.1

Escrever as expresses em linguagem FORTRAN que correspondem s seguintes expresses algbricas, onde A, B e L so nmeros reais e I e J so nmeros inteiros:

a)

A =

+ 5 100

b)

A =

1 10

c)

L =

1 3 I

I2 +

1 J3
1

d)

1 2 J 3 I + 3 L = 1 I 2 1+ I

Para verificar se a resposta de cada item est correta, basta implementar a expresso em FORTRAN num programa e comparar seu resultado com o valor obtido com uma calculadora para a expresso algbrica correspondente. Os dois resultados devem ser iguais. Isso tambm vale para o prximo exerccio.
Exerccio 3.2

Escrever as expresses algbricas que correspondem s seguintes expresses em linguagem FORTRAN: a) b) A = ( ( B**(1.0/2) ) + 5) / 100 A = (1.0/10) + ( B**(1/3.0) )
42

Captulo 3. Variveis do tipo real

c) d)
Exerccio 3.3

L = (1.0/(3.0I)) * ( ( (I**2) + (1.0/(J**3)) ) ** (1.0/2) ) L = ( 1.0 / ( 1.0 + (1.0/I) ) ) * ( ( (I**2) + ( J / ( (I**3) 2 ) ) ) ** (1.0/3) )

1) Editar um programa-fonte em FORTRAN para executar o seguinte algoritmo (passos): a) ler trs nmeros reais b) calcular a mdia aritmtica deles c) escrever os valores lidos e o valor da mdia aritmtica juntamente com comentrios para identific-los 2) Compilar o programa-fonte 3) Gerar o programa-executvel 4) Executar o programa com os valores 1.0, 2.5 e 3.7. Em seguida, analisar o resultado da mdia fornecido pelo programa comparando-o com o valor esperado obtido com uma calculadora. 5) Repetir o item 4 para os valores 10, 1E+3 e 2E-1.
Exerccio 3.4

1) Editar um programa-fonte em FORTRAN para executar o seguinte algoritmo (passos): a) ler o primeiro valor (real) de uma progresso aritmtica (P.A.), denotado por A1 b) ler a diferena (nmero real) entre dois termos subseqentes da P.A., denotada por D c) ler o nmero (inteiro) de termos da P.A., denotado por N d) calcular o valor (real) do ltimo termo da P.A., denotado por AN e) calcular a soma de todos os termos da P.A., denotado por SN f) escrever os trs valores lidos e os dois calculados juntamente com comentrios para identific-los 2) Compilar o programa-fonte 3) Gerar o programa-executvel 4) Executar o programa para A1 = 1.3, D = 3.9 e N = 5. Os resultados devem ser AN = 16.9 e SN = 45.5.

Captulo 3. Variveis do tipo real

43

Captulo 4. VARIVEIS DO TIPO CARACTER

OBJETIVOS DO CAPTULO Conceitos de: variveis do tipo caracter, strings, funes intrnsecas Funes intrnsecas do FORTRAN para variveis do tipo caracter: ADJUSTL, ADJUSTR, TRIM e LEN Comando do FORTRAN: CHARACTER

4.1 programa4a.f90 Para inicializar as atividades deste captulo, deve-se executar: 1) No Windows: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio 2) No Fortran, seguindo o procedimento apresentado na seo 1.6 do captulo 1, criar um projeto do tipo Console Application com o nome programa04 no diretrio Z:\\SERVER1\Alunos2004_1\login, onde login deve ser substitudo pelo user name do usurio, isto , a conta particular na rede Windows do DEMEC/UFPR. 3) No Fortran, seguindo o procedimento apresentado na seo 1.7 do captulo 1, criar e inserir no projeto o programa-fonte programa4a.f90 4) Conforme mostrado na Figura 4.1, dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 4.1. 5) Comentrios sobre o programa: a) Nos captulos 1 a 3 foram usados os comandos WRITE, END, INTEGER, READ e REAL da linguagem FORTRAN. No programa4a.f90 h um novo comando: CHARACTER. Ele usado para definir variveis do tipo caracter ou string, isto , variveis que podem guardar ou armazenar comentrios na memria do computador. Estes comentrios podem incluir palavras, nmeros, smbolos, espaos em branco ou frases. Alguns exemplos so (os contedos das variveis esto separados por vrgula): UFPR, 5 de abril de 2004, teste de hoje, TM-102, U-20/5%, L&L. As variveis do tipo caracter tambm so chamadas de alfanumricas porque envolvem letras e nmeros. b) No FORTRAN, o contedo ou string de uma varivel do tipo caracter definido entre aspas. c) A linha CHARACTER A declara a varivel A como sendo do tipo caracter. Este comando reserva um espao na memria do computador, utilizando o nome ou rtulo A, para armazenar um nico caracter alfanumrico.

Captulo 4. Variveis do tipo caracter

44

d) A linha A = "UFPR, Curitiba, PR" atribui o contedo entre aspas varivel A. Tabela 4.1 Programa4a.f90, verso 1.
CHARACTER A A = "UFPR, Curitiba, PR" WRITE(*,*) "Conteudo de A = ", A END

Figura 4.1 Programa4a.f90, verso 1. 6) Executar Build, Compile para compilar o programa 7) Gerar o programa-executvel fazendo Build, Build. 8) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 4.2, dentro da qual tem-se: a) Na primeira linha, o comentrio Conteudo de A =, e, em seguida, a letra U, resultado do comando
WRITE(*,*) "Conteudo de A = ", A do programa.

b) Na segunda linha, a frase Press any key to continue. Como diz este aviso, basta clicar em qualquer tecla para continuar. Ao se fazer isso, a execuo do programa encerrada.

Captulo 4. Variveis do tipo caracter

45

Figura 4.2 Resultado da execuo do programa4a.f90, verso 1. 9) No FORTRAN, cada varivel do tipo caracter deve ser declarada com a dimenso adequada quantidade mxima de letras, nmeros, espaos em branco e smbolos que ela poder conter. Quando no se declara o tamanho, assume-se que seja apenas um caracter. Devido a isso, somente a letra U foi apresentada como contedo da varivel A, na verso 1 do programa4a.f90, embora ela tenha sido definida com muito mais caracteres. 10) Para declarar a dimenso de uma varivel do tipo caracter, basta colocar o tamanho entre parnteses junto palavra character, como exemplificado na verso 2 do programa4a.f90, na Tabela 4.2. Tabela 4.2 Programa4a.f90, verso 2.
CHARACTER(50) A A = "UFPR, Curitiba, PR" WRITE(*,*) "Conteudo de A = ", A END

11) Alterar a primeira linha do programa4a.f90 para ficar igual Tabela 4.2. Compilar novamente o programa e gerar seu executvel. Executar o programa. Agora, conforme a Figura 4.3, apresentado o contedo completo da varivel A, j que ele ocupa apenas 18 caracteres e a varivel A foi dimensionada prevendo at 50 caracteres.

Figura 4.3 Resultado da execuo do programa4a.f90, verso 2.

Captulo 4. Variveis do tipo caracter

46

4.2 programa4b.f90 1) Nesta seo ser usado o mesmo projeto da seo anterior. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa-fonte b) Edit, Cut para retirar o programa-fonte do projeto. 2) No Fortran, seguindo o procedimento apresentado na seo 1.7 do captulo 1, criar e inserir no projeto chamado programa04 o programa-fonte programa4b.f90 3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 4.3. 4) Comentrios sobre o programa: a) A linha CHARACTER(50) A declara a varivel A como sendo do tipo caracter. Este comando reserva um espao na memria do computador, utilizando o nome ou rtulo A, para armazenar at 50 caracteres alfanumricos. b) O comando READ do FORTRAN tambm pode ser usado para atribuir valor ou contedo a uma varivel do tipo caracter, desde que o contedo esteja entre aspas. Um exemplo mostrado na linha READ(*,*) A. Tabela 4.3 Programa4b.f90.
CHARACTER(50) A WRITE(*,*) "Entre com o conteudo de A =" READ(*,*) A WRITE(*,*) "Conteudo de A = ", A END

5) Executar Build, Compile para compilar o programa 6) Gerar o programa-executvel fazendo Build, Build. 7) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 4.4, dentro da qual tem-se: a) Na primeira linha, o comentrio Entre com o conteudo de A =, resultado do comando WRITE(*,*)
"Entre com o conteudo de A =" do programa.

b) Na segunda linha, o programa pra e fica aguardando que seja fornecido o contedo da varivel A, resultado do comando READ(*,*) A do programa. Para que o programa continue sua execuo necessrio digitar, entre aspas, um contedo para a varivel A, por exemplo, Teste de hoje e, em seguida, clicar na tecla enter. c) Na terceira linha, o contedo da varivel A.
Captulo 4. Variveis do tipo caracter 47

Figura 4.4 Resultado da execuo do programa4b.f90. 8) Executar novamente o programa, atravs de Build, Execute, testando outros contedos para a varivel A e vendo o resultado. Testar, por exemplo, uma frase com pelo menos duas palavras mas sem usar aspas para definir o contedo de A. 4.3 programa4c.f90 1) Nesta seo ser usado o mesmo projeto da seo anterior. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa-fonte b) Edit, Cut para retirar o programa-fonte do projeto. 2) No Fortran, seguindo o procedimento apresentado na seo 1.7 do captulo 1, criar e inserir no projeto chamado programa04 o programa-fonte programa4c.f90 3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 4.4. 4) Comentrios sobre o programa: a) A linha CHARACTER(20) LOCAL, DIA declara duas variveis, LOCAL e DIA, como sendo do tipo caracter, cada uma podendo armazenar at 20 caracteres alfanumricos. b) A linha CHARACTER(10) HORA declara a varivel HORA como sendo do tipo caracter, podendo armazenar at 10 caracteres alfanumricos. c) A linha CHARACTER(90) FRASE declara a varivel FRASE como sendo do tipo caracter, podendo armazenar at 90 caracteres alfanumricos. d) A linha FRASE = "Frase: " // LOCAL // ", " // DIA // ", as " // HORA // " horas" define o contedo da varivel FRASE com base em alguns comentrios que esto entre aspas e no contedo das variveis LOCAL, DIA e HORA. Isso possvel devido ao uso do operador de concatenao cujo smbolo composto por duas barras (//). Este operador permite juntar duas ou mais variveis do tipo caracter.

Captulo 4. Variveis do tipo caracter

48

Tabela 4.4 Programa4c.f90.


CHARACTER(20) LOCAL, DIA CHARACTER(10) HORA CHARACTER(90) FRASE WRITE(*,*) "Entre com o local =" READ(*,*) LOCAL WRITE(*,*) "Entre com o dia =" READ(*,*) DIA WRITE(*,*) "Entre com a hora =" READ(*,*) HORA FRASE = "Frase: " // LOCAL // ", " // DIA // ", as " // HORA // " horas" WRITE(*,*) "Conteudo de FRASE = ", FRASE END

5) Executar Build, Compile para compilar o programa 6) Gerar o programa-executvel fazendo Build, Build. 7) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 4.5, dentro da qual tem-se: a) Na primeira linha, o comentrio Entre com o local =, resultado do comando WRITE(*,*) "Entre
com o local =" do programa.

b) Na segunda linha, o programa pra e fica aguardando que seja fornecido o contedo da varivel LOCAL, resultado do comando READ(*,*) LOCAL do programa. Para que o programa continue sua execuo necessrio digitar o contedo da varivel LOCAL, por exemplo, Curitiba e, em seguida, clicar na tecla enter. c) Na terceira linha, o comentrio Entre com o dia =, resultado do comando WRITE(*,*) "Entre
com o dia =" do programa.

d) Na quarta linha, o programa pra e fica aguardando que seja fornecido o contedo da varivel DIA, resultado do comando READ(*,*) DIA do programa. Para que o programa continue sua execuo necessrio digitar o contedo da varivel DIA, por exemplo, 5 de abril de 2004 e, em seguida, clicar na tecla enter. e) Na quinta linha, o comentrio Entre com a hora =, resultado do comando WRITE(*,*) "Entre
com a hora =" do programa.

f) Na sexta linha, o programa pra e fica aguardando que seja fornecido o contedo da varivel HORA, resultado do comando READ(*,*) HORA do programa. Para que o programa continue sua
Captulo 4. Variveis do tipo caracter 49

execuo necessrio digitar o contedo da varivel HORA, por exemplo, 10:58 e, em seguida, clicar na tecla enter. g) Na stima linha, o comentrio Contedo de FRASE = e, em seguida, o contedo da varivel FRASE, resultado do comando WRITE(*,*) "Conteudo de FRASE = ", FRASE do programa e da linha anterior aonde se definiu a varivel FRASE.

Figura 4.5 Resultado da execuo do programa4c.f90. 8) Deve-se notar na Figura 4.5 que a escrita do contedo da varivel FRASE ocupou mais de uma linha. Isso ocorre devido a sua extenso ser muito grande, isto , superior ao nmero disponvel de colunas numa janela do tipo DOS. 9) No FORTRAN, se o contedo de uma varivel definido com menos caracteres do que o mximo declarado, a diferena entre os caracteres ocupados e o mximo previsto preenchida com espaos em branco, como no contedo da varivel FRASE. Por exemplo, a varivel LOCAL foi declarada com tamanho mximo de 20 caracteres. Mas seu contedo foi definido com Curitiba, palavra que ocupa apenas 8 caracteres. Neste caso, os demais 12 caracteres so preenchidos com espaos em branco. O mesmo problema ocorre com as demais variveis. Formas de se resolver este problema so abordadas na prxima seo. 10) Executar novamente o programa com outros contedos para as variveis LOCAL, DIA e HORA. 4.4 programa4d.f90 1) Nesta seo ser usado o mesmo projeto da seo anterior deste captulo. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa-fonte b) Edit, Cut para retirar o programa-fonte do projeto. 2) No Fortran, seguindo o procedimento apresentado na seo 1.7 do captulo 1, criar e inserir no projeto chamado programa04 o programa-fonte programa4d.f90
Captulo 4. Variveis do tipo caracter 50

3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 4.5. Tabela 4.5 Programa4d.f90.
CHARACTER(9) A INTEGER L WRITE(*,*) "Entre com o conteudo de A =" WRITE(*,*) "0123456789" READ(*,*) A WRITE(*,*) " WRITE(*,*) "A WRITE(*,*) "Com ADJUSTL WRITE(*,*) "Com ADJUSTR WRITE(*,*) "Com TRIM 0123456789" =(", A, ")" =(", ADJUSTL(A), ")" =(", ADJUSTR(A), ")" =(", TRIM(A), ")"

WRITE(*,*) "Com ADJUSTL e TRIM =(", TRIM(ADJUSTL(A)), ")" L = LEN(A) WRITE(*,*) "L de A = ", L L = LEN(TRIM(ADJUSTL(A))) WRITE(*,*) "L de A com TRIM e ADJUSTL = ", L END

4) Comentrios sobre o programa: a) A linha CHARACTER(9) A declara a varivel A como sendo do tipo caracter, podendo armazenar at 9 caracteres alfanumricos. b) A linha INTEGER L declara a varivel L como sendo do tipo inteiro. c) Conforme pode-se ver na Figura 4.6, ADJUSTL, ADJUSTR, TRIM e LEN esto escritos em azul dentro do Fortran. Elas so chamadas de funes intrnsecas do FORTRAN, ou seja, so funes ou comandos que existem dentro da linguagem FORTRAN. Estas funes so usadas para manipular strings, isto , contedos de variveis do tipo caracter. d) A lista completa das funes para variveis do tipo caracter pode ser vista no manual do Fortran. Para acess-lo, dentro da subjanela do lado esquerdo, deve-se executar: clicar uma vez sobre o smbolo ?InfoView; e acessar as opes Reference, Procedures, Character Procedures. e) A linha WRITE(*,*) "A
=(", A, ")" escreve em seqncia o contedo de =(; 51

trs strings que esto separadas por vrgula. A primeira o comentrio A


Captulo 4. Variveis do tipo caracter

a segunda, o contedo da varivel A; e a terceira, ). As quatro linhas seguintes do programa fazem o mesmo, isto , cada uma escreve trs strings em seqncia. Mas, nestes casos, em vez de escrever o contedo da varivel A, escreve-se o resultado de alguma funo operando sobre A, conforme as explicaes a seguir.

Figura 4.6 Programa4d.f90. f) A funo ADJUSTL elimina os espaos em branco que esto esquerda de uma string e os passa direita dela. g) A funo ADJUSTR elimina os espaos em branco que esto direita de uma string e os passa esquerda dela. h) A funo TRIM elimina os espaos em branco que esto direita de uma string. i) O resultado das funes ADJUSTL, ADJUSTR e TRIM so strings. j) A funo LEN conta o nmero de caracteres de uma string ou varivel do tipo caracter. Seu resultado um nmero inteiro. k) Na instruo TRIM(ADJUSTL(A)) do programa, a funo TRIM opera sobre o resultado da funo ADJUSTL sobre a varivel A. l) Na linha L = LEN(A) do programa, a funo LEN opera sobre a varivel A e atribui o resultado varivel inteira L.
Captulo 4. Variveis do tipo caracter 52

m) Na linha L = LEN(TRIM(ADJUSTL(A))) do programa, a funo LEN opera sobre o resultado da funo TRIM, que opera sobre o resultado da funo ADJUSTL sobre a varivel A. Finalmente, o resultado da funo LEN atribudo varivel inteira L. 5) Executar Build, Compile para compilar o programa 6) Gerar o programa-executvel fazendo Build, Build. 7) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 4.7, dentro da qual tem-se: a) Na primeira linha, o comentrio Entre com o conteudo de A =, resultado do comando WRITE(*,*)
"Entre com o conteudo de A =" do programa.

Figura 4.7 Resultado da execuo do programa4d.f90. b) Na segunda linha, o comentrio 0123456789, resultado do comando WRITE(*,*) "0123456789" do programa. Este comentrio uma espcie de rgua para se perceber claramente o nmero de caracteres usados para definir a varivel A, e quantos espaos em branco existem antes da string de A e depois dela. O zero usado porque a definio da varivel A exige o sinal de aspas, que no conta em seu contedo. c) Na terceira linha, o programa pra e fica aguardando que seja fornecido o contedo da varivel A, resultado do comando READ(*,*) A do programa. Para que o programa continue sua execuo necessrio digitar o contedo da varivel A, por exemplo, Rio 45 e, em seguida, clicar na tecla enter . Deve-se perceber que h um espao em branco antes da palavra Rio. d) Na quarta linha, 20 espaos em branco seguidos pelo comentrio 0123456789, resultado do comando WRITE(*,*) "
0123456789" do programa. Este comentrio

uma espcie de rgua para se perceber claramente os resultados a seguir. e) Nas linhas seguintes, so apresentados os resultados do contedo da varivel A e das funes ADJUSTL, ADJUSTR, TRIM e LEN operando sobre a varivel A. Os sinais ( e ) marcam o nicio e o fim de cada string.
Captulo 4. Variveis do tipo caracter 53

8) Analisar cada resultado mostrado na Figura 4.7, considerando o contedo da varivel A e as definies apresentadas acima, nesta seo, para as funes ADJUSTL, ADJUSTR, TRIM e LEN. 9) Executar novamente o programa com outros contedos para a varivel A. Analisar os resultados de cada nova execuo do programa. 10) Para concluir o uso do Fortran e do Windows, deve-se executar os passos mostrados na seo 2.8 do captulo 2. 4.5 EXERCCIO Exerccio 4.1 1) Editar um programa-fonte em FORTRAN para executar o seguinte algoritmo (passos): a) declarar quatro variveis do tipo caracter com dimenso de 5, 10, 20 e 30 caracteres b) ler o contedo das quatro variveis c) escrever o contedo de cada uma das quatro variveis d) usando o operador de concatenao, escrever combinaes das quatro variveis lidas e) aplicar e escrever o resultado da funo ADJUSTL a cada uma das quatro variveis lidas f) aplicar e escrever o resultado da funo ADJUSTR a cada uma das quatro variveis lidas g) aplicar e escrever o resultado da funo TRIM a cada uma das quatro variveis lidas h) aplicar e escrever o resultado da funo TRIM(ADJUSTL) a cada uma das quatro variveis lidas i) aplicar e escrever o resultado da funo LEN a cada uma das quatro variveis lidas j) aplicar e escrever o resultado da funo LEN(TRIM(ADJUSTL)) a cada uma das quatro variveis lidas 2) Compilar o programa-fonte 3) Gerar o programa-executvel 4) Executar o programa. Em seguida, comparar os resultados escritos com o esperado para cada caso.

Captulo 4. Variveis do tipo caracter

54

Captulo 5. ARQUIVOS E FUNES MATEMTICAS INTRNSECAS

OBJETIVOS DO CAPTULO Conceitos de: arquivo de sada, biblioteca, funes matemticas intrnsecas Criar e usar arquivos para mostrar resultados da execuo de um programa em FORTRAN Usar o aplicativo Notepad do Windows para mostrar o contedo de um arquivo durante a execuo de um programa em FORTRAN Funes matemticas intrnsecas do FORTRAN Comandos do FORTRAN: WRITE(nmero,*), OPEN, CLOSE, USE, SYSTEM

5.1 programa5a.f90 Para inicializar as atividades deste captulo, deve-se executar: 1) No Windows: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio 2) No Fortran, seguindo o procedimento apresentado na seo 1.6 do captulo 1, criar um projeto do tipo Console Application com o nome programa05 no diretrio Z:\\SERVER1\Alunos2004_1\login, onde login deve ser substitudo pelo user name do usurio, isto , a conta particular na rede Windows do DEMEC/UFPR. 3) No Fortran, seguindo o procedimento apresentado na seo 1.7 do captulo 1, criar e inserir no projeto o programa-fonte programa5a.f90 4) Conforme mostrado na Figura 5.1, dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 5.1. 5) Comentrios sobre o programa: a) At aqui o comando WRITE foi utilizado com dois asteriscos dentro do parnteses, isto , foi usado na forma WRITE(*,*). O primeiro asterisco do comando WRITE representa o local ou dispositivo que usado para escrever algum comentrio ou resultado do programa. Este asterisco pode ser substitudo por um nmero. O nmero 6 representa uma janela do DOS, como aquela que vem sendo usada at aqui para apresentar os resultados dos programas; por exemplo, a janela mostrada na Figura 5.2. Portanto, o uso de asterisco no comando WRITE equivale a empregar o nmero 6. b) A nica diferena entre o programa5a.f90 e o programa3c.f90, da seo 3.1 do captulo 3, o uso do nmero 6 no lugar do primeiro asterisco dos comandos WRITE. 6) Executar Build, Compile para compilar o programa.

Captulo 5. Arquivos e funes matemticas intrnsecas

55

7) Gerar o programa-executvel fazendo Build, Build. 8) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 5.2, dentro da qual tem-se: a) Na primeira linha, o comentrio Entre com o valor de A =, resultado do comando WRITE(6,*)
"Entre com o valor de A =" do programa.

Tabela 5.1 Programa5a.f90.


REAL A WRITE(6,*) "Entre com o valor de A =" READ(*,*) A WRITE(6,*) "Valor de A = ", A END

Figura 5.1 Programa5a.f90. b) Na segunda linha, o programa pra e fica aguardando que seja fornecido o valor da varivel A, resultado do comando READ(*,*) A do programa. Para que o programa continue sua execuo necessrio digitar o valor 1 para a varivel A, por exemplo, e, em seguida, clicar na tecla enter. c) Na terceira linha, o comentrio Valor de A = e o valor da varivel A, resultado do comando
WRITE(6,*) "Valor de A = ", A do programa. Deve-se notar que foi fornecido um valor

inteiro para a varivel A, no caso 1. Mas o resultado do programa mostra o valor 1.000000 porque a varivel A do tipo real.

Captulo 5. Arquivos e funes matemticas intrnsecas

56

d) Na quarta linha, a frase Press any key to continue. Como diz este aviso, basta clicar em qualquer tecla para continuar. Ao se fazer isso, a execuo do programa encerrada. 9) O resultado da execuo do programa5a.f90 exatamente igual a do programa3c.f90, da seo 3.1 do captulo 3. Conforme explicado no item 5a, acima, isso ocorre devido equivalncia completa entre os comandos WRITE(*,*) e WRITE(6,*).

Figura 5.2 Resultado da execuo do programa5a.f90. 5.2 programa5b.f90 1) Nesta seo ser usado o mesmo projeto da seo anterior. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa-fonte b) Edit, Cut para retirar o programa-fonte do projeto. 2) No Fortran, seguindo o procedimento apresentado na seo 1.7 do captulo 1, criar e inserir no projeto chamado programa05 o programa-fonte programa5b.f90 3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 5.2. Tabela 5.2 Programa5b.f90.
REAL A WRITE(6,*) "Entre com o valor de A =" READ(*,*) A OPEN(7, file="saida5b.txt") WRITE(7,*) "Valor de A = ", A CLOSE(7) END

4) Comentrios sobre o programa:

Captulo 5. Arquivos e funes matemticas intrnsecas

57

a) No programa5b.f90 so usados dois novos comandos do FORTRAN: OPEN e CLOSE. Ambos devem ser usados em conjunto. b) A forma do comando OPEN que ser usada neste texto OPEN(nmero, file=nome). O comando OPEN usado para: definir um nmero que ser usado como referncia a um arquivo; e para abrir o arquivo chamado nome. O nmero pode ser de 1 a 99 e 105 a 299. A utilizao deste nmero num comando WRITE(nmero,*) resulta na escrita de comentrios ou variveis no arquivo que corresponde ao nmero definido no comando OPEN. O nome do arquivo pode ser qualquer um mas deve ficar entre aspas. Quando se declara um nome de arquivo num comando OPEN, se o arquivo no existir, ele criado dentro do diretrio do projeto. c) A forma do comando CLOSE que ser usada neste texto CLOSE(nmero). O comando CLOSE usado para fechar ou encerrar o uso de um arquivo aberto anteriormente com o comando OPEN. d) Todos arquivos abertos com o comando OPEN so fechados ao final da execuo do programa, existindo ou no o comando CLOSE. e) Dentro de um programa, para um mesmo nmero ou arquivo, a seqncia obrigatria dos comandos a seguinte: OPEN, WRITE, CLOSE. Para um mesmo arquivo, deve existir apenas um comando OPEN e um CLOSE dentro do programa, e podem existir diversos comandos WRITE. f) Podem ser usados vrios arquivos simultaneamente num programa. g) A principal vantagem de se usar um arquivo ter um registro permanente dos resultados do programa para posterior anlise. Isso fica mais evidente quanto maior for a quantidade de resultados de um programa. 5) Executar Build, Compile para compilar o programa. 6) Gerar o programa-executvel fazendo Build, Build. 7) Ao se executar o programa, atravs de Build, Execute, surge uma janela do DOS, mostrada na Figura 5.3, dentro da qual tem-se:

Figura 5.3 Resultado da execuo do programa5b.f90 na janela DOS com A = 1. a) Na primeira linha, o comentrio Entre com o valor de A =, resultado do comando WRITE(*,*)
"Entre com o valor de A =" do programa.

b) Na segunda linha, o programa pra e fica aguardando que seja fornecido o contedo da varivel A, resultado do comando READ(*,*) A do programa. Para que o programa continue sua execuo
Captulo 5. Arquivos e funes matemticas intrnsecas 58

necessrio digitar o valor 1 para a varivel A, por exemplo, e, em seguida, clicar na tecla enter. c) Em seguida ocorrer a criao do arquivo saida5b.txt, dentro do diretrio do projeto, como resultado do comando OPEN(7, file="saida5b.txt") do programa, uma vez que este arquivo ainda no existe quando o programa5b.f90 for executado pela primeira vez. Este comando tambm declara que ser usado o nmero 7 no programa como referncia ao arquivo saida5b.txt. d) Conforme mostrado na Figura 5.4, na primeira linha do arquivo saida5b.txt est escrito o comentrio Valor de A = e o valor da varivel real A como resultado do comando WRITE(7,*)
"Valor de A = ", A do programa.

e) O arquivo saida5b.txt fechado, isto , nada mais pode ser escrito nele aps o comando CLOSE(7) do programa.

Figura 5.4 Resultado da execuo do programa5b.f90 no arquivo saida5b.txt com A = 1. 8) A existncia do arquivo saida5b.txt pode ser comprovada ao se executar Start, Programs, Windows NT Explorer. Em seguida, indicar o diretrio do projeto, no caso, programa05. Finalmente, ao se clicar duas vezes sobre o nome do arquivo, ele ser aberto, podendo-se ver o seu contedo. 9) Executar novamente o programa, atravs de Build, Execute, com A = 123. Neste caso, como j existe o arquivo saida5b.txt ele ser usado para escrever o novo resultado do programa sobre o resultado anterior, conforme mostrado na Figura 5.5. Ou seja, o resultado anterior, mostrado na Figura 5.4 eliminado ou apagado. Para evitar isso, necessrio gravar os resultados em arquivos diferentes a cada execuo do programa. Outra possibilidade alterar o nome do arquivo de resultados antes do programa ser executado novamente. Executar o indicado no item anterior (8) para ver o novo contedo do arquivo saida5b.txt. 10) No comando OPEN tambm possvel especificar todo o caminho ou o diretrio aonde o arquivo deve ser criado ou aberto. Quando o diretrio no especificado, por default, usa-se o diretrio do projeto ou o diretrio no qual o programa executado. Por exemplo, trocar a linha OPEN(7,
file="saida5b.txt"), pelo seguinte: OPEN(7, file="C:\Temp\saida5b.txt"). Compilar

novamente o programa5b.f90, gerar o seu executvel, executar o programa. Usar o aplicativo

Captulo 5. Arquivos e funes matemticas intrnsecas

59

Windows NT Explorer para encontrar e abrir o arquivo saida5b.txt, que agora dever estar no diretrio C:\Temp.

Figura 5.5 Resultado da execuo do programa5b.f90 no arquivo saida5b.txt com A = 123. 11) Na prxima seo, apresentada uma forma de se automatizar a abertura do arquivo de sada. Isso permite maior rapidez na visualizao dos resultados de um programa. 5.3 programa5c.f90 1) Nesta seo ser usado o mesmo projeto da seo anterior. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa-fonte b) Edit, Cut para retirar o programa-fonte do projeto. 2) No Fortran, seguindo o procedimento apresentado na seo 1.7 do captulo 1, criar e inserir no projeto chamado programa05 o programa-fonte programa5c.f90 3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 5.3. 4) Comentrios sobre o programa: a) No programa5c.f90 so usados dois novos comandos do FORTRAN: USE e SYSTEM. b) O comando USE biblio usado para incluir dentro do programa uma biblioteca chamada biblio, onde biblio deve ser substitudo pelo nome da biblioteca desejada. Uma biblioteca, no presente contexto, uma coleo de comandos que no existem automaticamente dentro da linguagem FORTRAN. Todos os comandos usados at aqui, por exemplo WRITE, j existem automaticamente dentro da linguagem FORTRAN, mas o comando SYSTEM, no. Para ele ser usado necessrio incluir no programa a biblioteca aonde este comando est definido, no caso a biblioteca chamada PORTLIB. c) A linguagem FORTRAN permite a qualquer programador criar suas prprias bibliotecas, como ser visto nos captulos avanados deste texto.

Captulo 5. Arquivos e funes matemticas intrnsecas

60

Tabela 5.3 Programa5c.f90.


USE PORTLIB REAL A INTEGER VER WRITE(6,*) "Entre com o valor de A =" READ(*,*) A OPEN(7, file="saida5c.txt") WRITE(7,*) "Valor de A = ", A CLOSE(7) VER = SYSTEM ("Notepad saida5c.txt") END

d) No editor do aplicativo Fortran, o comando SYSTEM no fica na cor azul por no ser um dos comandos bsicos da linguagem FORTRAN. O comando SYSTEM utilizado para executar comandos que interagem com o sistema operacional Windows. Isso permite que, durante a execuo do programa escrito em FORTRAN, seja realizado o seguinte: executar outros programas ou aplicativos; criar ou deletar diretrios ou arquivos; e qualquer outro comando possvel de se executar numa janela do tipo DOS. Para utilizar o comando SYSTEM deve-se definir uma varivel do tipo inteiro. Depois, usar esta varivel na linha do programa aonde se deseja executar o comando SYSTEM. Dentro de parnteses e aspas, deve-se incluir a seqncia de comandos que se deseja executar no Windows. e) A linha USE PORTLIB declara que a biblioteca chamada PORTLIB ser acrescentada ao programa. f) A linha VER = SYSTEM ("Notepad saida5c.txt") executa o comando SYSTEM para que o aplicativo NOTEPAD do Windows abra o arquivo chamado saida5c.txt. A varivel VER, usada nesta linha, foi definida como uma varivel do tipo inteiro na linha INTEGER VER do programa. 5) Executar Build, Compile para compilar o programa. 6) Gerar o programa-executvel fazendo Build, Build. 7) Ao se executar o programa, atravs de Build, Execute, ocorrer exatamente o mesmo j explicado na seo anterior para o programa5b.f90. A nica diferena que quase no final da execuo do programa, o arquivo de resultados, que foi denominado de saida5c.txt, ser aberto automaticamente pelo aplicativo Notepad para mostrar o seu contedo. Ao se fechar o Notepad, a execuo do programa5c.f90 ser encerrada. 8) No caso do comando OPEN ser usado para especificar todo o caminho ou o diretrio aonde o arquivo deve ser criado ou aberto, o comando SYSTEM tambm deve ser adaptado. Por exemplo, se o arquivo

Captulo 5. Arquivos e funes matemticas intrnsecas

61

saida5c.txt

for

criado

no

diretrio

C:\Temp

com

comando

OPEN(7,

file="C:\Temp\saida5c.txt"), o comando correspondente para abrir automaticamente o arquivo

saida5c.txt VER = SYSTEM ("Notepad C:\Temp\saida5c.txt"). 5.4 programa5d.f90 1) Nesta seo ser usado o mesmo projeto da seo anterior deste captulo. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa-fonte b) Edit, Cut para retirar o programa-fonte do projeto. 2) No Fortran, seguindo o procedimento apresentado na seo 1.7 do captulo 1, criar e inserir no projeto chamado programa05 o programa-fonte programa5d.f90 3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 5.4. 4) Comentrios sobre o programa: a) Conforme pode-se ver na Figura 5.6, ABS, LOG10, ACOS, COS e COSH esto escritos em azul dentro do Fortran. Elas so chamadas de funes intrnsecas do FORTRAN, ou seja, so funes ou comandos que existem dentro da linguagem FORTRAN. Elas so funes matemticas usadas em clculos que envolvem variveis do tipo real. Outras funes so apresentadas nas Tabelas 5.5 e 5.6. b) A lista completa de funes matemticas intrnsecas do FORTRAN pode ser vista no manual do Fortran. Para acess-lo, dentro da subjanela do lado esquerdo, deve-se executar: clicar uma vez sobre o smbolo ?InfoView; e acessar as opes Reference, Procedures, Numeric Procedures e as opes Reference, Procedures, Trigonometric, Exponential, Root, and Logathmic Procedures. 5) Executar Build, Compile para compilar o programa. 6) Gerar o programa-executvel fazendo Build, Build. 7) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 5.7, dentro da qual tem-se: a) Na primeira linha, o comentrio Entre com o valor de A =, resultado do comando WRITE(*,*)
"Entre com o valor de A =" do programa.

b) Na segunda linha, o programa pra e fica aguardando que seja fornecido o valor da varivel A, resultado do comando READ(*,*) A do programa. Para que o programa continue sua execuo necessrio digitar o valor 10 para a varivel A, por exemplo, e, em seguida, clicar na tecla enter.
Captulo 5. Arquivos e funes matemticas intrnsecas 62

c) Em seguida ocorrer a criao do arquivo saida5d.txt, dentro do diretrio do projeto, como resultado do comando OPEN(8, file="saida5d.txt") do programa, uma vez que este arquivo ainda no existe quando o programa5d.f90 for executado pela primeira vez. Este comando tambm declara que ser usado o nmero 8 no programa como referncia ao arquivo saida5d.txt. d) Os resultados das funes aplicadas no programa5d.f90 so mostrados na Figura 5.8. Tabela 5.4 Programa5d.f90.
USE PORTLIB REAL A, B, C, Pi INTEGER VER WRITE(*,*) "Entre com o valor de A =" READ(*,*) A OPEN(8, file="saida5d.txt") WRITE(8,*) "Valor de A = ", A B = ABS(A) WRITE(8,*) "B = Mdulo de A =", B C = LOG10(B) WRITE(8,*) "C: Logaritmo decimal de B =", C Pi = ACOS(-1.0) WRITE(8,*) "Pi =", Pi D = COS(Pi) WRITE(8,*) "Cosseno de Pi =", D D = COSH(Pi) WRITE(8,*) "Cosseno hiperblico de Pi =", D CLOSE(8) VER = SYSTEM ("Notepad saida5d.txt") END

8) Comparar cada resultado mostrado na Figura 5.8 com o resultado obtido de uma calculadora.
Captulo 5. Arquivos e funes matemticas intrnsecas 63

9) Executar novamente o programa com outro valor para a varivel A. Comparar cada novo resultado com o obtido de uma calculadora. 10) Os programas-executveis tambm podem ser executados, rodados ou postos para funcionar fora do aplicativo Fortran. Para testar isso, primeiro, fechar o aplicativo Fortran. Em seguida, utilizando o aplicativo Windows NT Explorer, copiar o programa-executvel chamado programa05.exe ou programa05.application para o diretrio C:\Temp. Para executar o programa, basta clicar duas vezes sobre o arquivo copiado. Como resultado, surgir o arquivo saida5d.txt. O diretrio C:\Temp apenas um exemplo. O programa-executvel pode ser copiado para qualquer outro diretrio e ser executado l.

Figura 5.6 Programa5d.f90.


Captulo 5. Arquivos e funes matemticas intrnsecas 64

Tabela 5.5 Algumas funes matemticas do FORTRAN. Funo Mdulo ou valor absoluto Raiz quadrada Exponencial: Y Logaritmo natural Logaritmo decimal Sinal Mnimo Mximo = eX Comando Y = ABS(X) Y = SQRT(X) Y = EXP(X) Y = LOG(X) Y = LOG10(X) Y = SIGN(X,Z) Y = MIN(X,Z,W) Y = MAX(X,Z,W) Y = valor absoluto de X vezes o sinal de Z Y = valor mnimo entre X, Z e W; o argumento pode conter 2 ou mais variveis Y = valor mximo entre X, Z e W; o argumento pode conter 2 ou mais variveis Observao

Tabela 5.6 Algumas funes trigonomtricas do FORTRAN. Funo Seno Cosseno Tangente Arco-seno Arco-cosseno Arco-tangente Seno hiperblico Cosseno hiperblico Tangente hiperblica Comando Y = SIN(X) Y = COS(X) Y = TAN(X) Y = ASIN(X) Y = ACOS(X) Y = ATAN(X) Y = SINH(X) Y = COSH(X) Y = TANH(X) Observao X em radianos X em radianos X em radianos Y em radianos Y em radianos Y em radianos

Figura 5.7 Janela DOS do programa5d.f90.

Captulo 5. Arquivos e funes matemticas intrnsecas

65

Figura 5.8 Arquivo saida5d.txt do programa5d.f90. 5.5 EXERCCIOS Exerccio 5.1 1) Editar um programa-fonte em FORTRAN para executar o seguinte algoritmo (passos): a) ler o primeiro valor (real) de uma progresso aritmtica (P.A.), denotado por A1 b) ler a diferena (nmero real) entre dois termos subseqentes da P.A., denotada por D c) ler o nmero (inteiro) de termos da P.A., denotado por N d) calcular o valor (real) do ltimo termo da P.A., denotado por AN e) calcular a soma de todos os termos da P.A., denotado por SN f) escrever no arquivo chamado saida_5p1.txt os trs valores lidos e os dois calculados juntamente com comentrios para identific-los 2) Compilar o programa-fonte 3) Gerar o programa-executvel 4) Executar o programa para A1 = 1.3, D = 3.9 e N = 5. Os resultados devem ser AN = 16.9 e SN = 45.5. Exerccio 5.2 1) Editar um programa-fonte em FORTRAN para executar o seguinte algoritmo (passos): a) ler algumas variveis do tipo real b) aplicar as funes matemticas da Tabela 5.5 sobre as variveis lidas c) escrever no arquivo chamado saida_5p2.txt os valores lidos e os resultados calculados com as funes juntamente com comentrios para identific-los 2) Compilar o programa-fonte 3) Gerar o programa-executvel 4) Executar o programa. Em seguida, comparar os resultados escritos com aqueles obtidos de uma calculadora.

Captulo 5. Arquivos e funes matemticas intrnsecas

66

Exerccio 5.3 1) Editar um programa-fonte em FORTRAN para executar o seguinte algoritmo (passos): a) ler algumas variveis do tipo real b) aplicar as funes matemticas da Tabela 5.6 sobre as variveis lidas c) escrever no arquivo chamado saida_5p3.txt os valores lidos e os resultados calculados com as funes juntamente com comentrios para identific-los 2) Compilar o programa-fonte 3) Gerar o programa-executvel 4) Executar o programa. Em seguida, comparar os resultados escritos com aqueles obtidos de uma calculadora.

Captulo 5. Arquivos e funes matemticas intrnsecas

67

Captulo 6. FORMATOS DE EDIO

OBJETIVOS DO CAPTULO Conceitos e comandos de formatos de edio para variveis do tipo inteiro, caracter e real Regras de edio de programas-fonte em FORTRAN Seqncia obrigatria dos comandos dentro de programas-fonte em FORTRAN Comandos do FORTRAN: WRITE(nmero,nmero) e FORMAT

6.1 FORMATOS DE EDIO PARA VARIVEIS DO TIPO CARACTER: programa6a.f90 Para inicializar as atividades deste captulo, deve-se executar: 1) Para acessar o programa Fortran, no Windows: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa06 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa6a.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 6.1. Tabela 6.1 Programa6a.f90.
USE PORTLIB CHARACTER(10) A, B CHARACTER(20) C INTEGER VER WRITE(*,*) "Variaveis do tipo caracter" WRITE(*,*) "Entre com os conteudos de A e B" READ(*,*) A, B C = A // B OPEN(9, file="saida6a.txt") WRITE(9,*) A, "= A sem formato"

Captulo 6. Formatos de edio

68

WRITE(9,21) A 21 FORMAT ( A2, "= A no formato A2" ) WRITE(9,22) A 22 FORMAT ( A5, "= A no formato A5" ) WRITE(9,23) A 23 FORMAT ( A10, "= A no formato A10" ) WRITE(9,24) A 24 FORMAT("10X", 10X, "Contedo de A =", A10, 1/) WRITE(9,25) A 25 FORMAT("T10", T10, "Contedo de A =", A10, 1/) WRITE(9,10) A, B, C 10 FORMAT(5X, "A =", A10, 1/, 5X, "B =", A10, 1/, 5X, "C =", A20, 2/) WRITE(9,11) A, B, C 11 FORMAT( 5X, "A =", A10, 1/, 5X, "B =", A10, 1/, 5X, "C =", A20, 2/ WRITE(9,12) A, B 12 FORMAT ( 2(A10), "= variveis A e B no formato 2(A10)" ) CLOSE(9) VER = SYSTEM("Notepad saida6a.txt") END & & )

5) Comentrios sobre o programa: a) O objetivo do programa6a.f90 explicar alguns formatos de edio utilizados com variveis do tipo caracter. b) No captulo 5, alm de um asterisco, o comando WRITE foi utilizado com um nmero para identificar o local (janela ou arquivo) onde seria escrito algo, isto , ele foi usado na forma WRITE(nmero1,*). Um exemplo a linha WRITE(9,*) A, "= A sem formato" do programa. Agora, no programa6a.f90, o comando WRITE utilizado com dois nmeros, ou seja, na forma WRITE(nmero1,nmero2), por exemplo, a linha WRITE(9,21) A do programa. O nmero2 est associado a um novo comando do FORTRAN chamado de FORMAT.
Captulo 6. Formatos de edio 69

c) O comando FORMAT usado para especificar o formato com que comentrios e contedos (strings ou nmeros) de variveis so escritos numa janela ou num arquivo. Tambm usado na leitura de dados. d) A sintaxe, isto , a forma com que se deve usar o comando FORMAT : nmero2 FORMAT (formatos). O nmero2 deve ser o mesmo utilizado no comando WRITE. Dentro de parnteses, deve-se especificar os formatos de edio que sero usados, separados por vrgula. Um exemplo a linha 21 FORMAT ( A2, "= A no formato A2" ) do programa, que especifica o formato A2 para escrever a varivel A, do tipo caracter, chamada na linha WRITE(9,21) A do programa. e) Os comandos FORMAT podem ser includos em qualquer lugar dentro do programa-fonte, desde que seja abaixo de comandos USE e acima do comando END. Eles podem ser aglomerados num nico lugar ou cada um pode estar abaixo ou acima do seu respectivo comando WRITE. No necessrio seguir qualquer ordenamento para os nmeros usados nos comandos FORMAT, nem para suas posies relativas dentro do programa-fonte. E no existe qualquer relao entre os nmeros usados em comandos OPEN e os nmeros usados nos comandos FORMAT. Eles at podem ser iguais. f) Cada tipo de varivel (caracter, inteiro ou real) tem identificadores especiais para escrever seu contedo na forma desejada. Alm disso, existem identificadores que facilitam a escrita de comentrios e da forma ou disposio esttica com que se escreve algo. g) O identificador de variveis do tipo caracter a letra A seguida de um nmero que especifica a quantidade mxima de caracteres para escrever cada varivel. Dentro deste espao, o contedo de cada varivel do tipo caracter escrito da esquerda para a direita. Se o contedo da varivel ocupa mais espao do que o reservado para escrev-la, a parte excedente no escrita, desconsiderada. Um exemplo de uso deste identificador A2, citado no item d, acima. Neste caso, reservou-se duas colunas ou caracteres para escrever uma varivel do tipo caracter. h) Dentro de um comando FORMAT, isto , entre parnteses, pode-se escrever um ou mais comentrios, cada um devendo ficar entre aspas, como na linha 22 FORMAT ( A5, "= A no
formato A5" ) do programa.

i) O identificador X usado para deixar espaos em branco entre dois formatos de edio. Ele usado na forma NX, onde N um nmero que representa a quantidade de espaos em branco. Um exemplo a linha 24 FORMAT("10X", 10X, "Contedo de A =", A10, 1/) do programa, onde usou-se o formato 10X. j) Nesta mesma linha do programa h o formato de edio N/, onde N um nmero que representa a quantidade de linhas que o cursor descer quando encontrar este formato. Neste caso, uma linha, devido ao formato 1/.

Captulo 6. Formatos de edio

70

k) O identificador T, de tabulao, usado para se escrever algo a partir de uma coluna especfica, onde a coluna 1 fica na margem esquerda. Ele usado na forma TN, onde N o nmero da coluna a partir da qual se escrever algo que vem a seguir dentro de um comando FORMAT. Um exemplo a linha 25 FORMAT("T10", T10, "Contedo de A =", A10, 1/) do programa, onde usou-se o formato T10. l) Pode-se usar um nico comando WRITE, com seu respectivo comando FORMAT, para se escrever diversas variveis. Neste caso, cada varivel ser escrita com o formato que estiver na mesma seqncia dos comandos WRITE e FORMAT. Por exemplo, na linha WRITE(9,10) A, B,
C do programa, escreve-se as variveis A, B e C com o formato nmero 10, que corresponde

linha 10 FORMAT(5X, "A =", A10, 1/, 5X, "B =", A10, 1/, 5X, "C =", A20, 2/) do programa. Portanto, a primeira varivel (A) ser escrita com o formato A10, que o primeiro formato de edio de variveis que aparece no comando FORMAT. E as variveis B e C sero escritas com os formatos A10 e A20, respectivamente, que so o segundo e o terceiro formatos de variveis no comando FORMAT. m) O comando FORMAT identificado pelo nmero 10 no programa tem exatamente a mesma funo que o comando FORMAT identificado pelo nmero 11. A nica diferena na edio do programa-fonte. No 10 FORMAT, todos os formatos de edio usam apenas uma linha do programa-fonte. J no 11 FORMAT, so usadas trs linhas. Neste caso, quando um mesmo comando precisa ou se quer empregar mais de uma linha por motivos estticos, usa-se o smbolo &, ao final de cada linha do programa-fonte, para indicar que o comando continua na linha seguinte. Isso vale para qualquer comando do FORTRAN. n) O formato M(AN) equivalente a M vezes o formato AN, onde N o nmero de caracteres reservados para se escrever uma varivel do tipo caracter. Por exemplo, na linha 12 FORMAT (
2(A10), "= variveis A e B no formato 2(A10)" ) do programa usa-se duas vezes o

formato A10 para se escrever duas variveis do tipo caracter. 6) Executar Build, Compile para compilar o programa. 7) Gerar o programa-executvel fazendo Build, Build. 8) Ao se executar o programa, atravs de Build, Execute, surge uma janela do DOS, mostrada na Figura 6.1, dentro da qual tem-se: a) Na primeira linha, o comentrio Variaveis do tipo caracter, resultado do comando WRITE(*,*)
"Variaveis do tipo caracter" do programa.

b) Na segunda linha, o comentrio Entre com os conteudos de A e B, resultado do comando


WRITE(*,*) "Entre com os conteudos de A e B" do programa.

c) Na terceira linha, o programa pra e fica aguardando que sejam fornecidos os contedos das variveis A e B, resultado do comando READ(*,*) A, B do programa. Para que o programa
Captulo 6. Formatos de edio 71

continue sua execuo necessrio digitar Rio 45, Teste, por exemplo, e, em seguida, clicar na tecla enter. d) Em seguida ocorrer a criao do arquivo saida6a.txt, dentro do diretrio do projeto, como resultado do comando OPEN(9, file="saida6a.txt") do programa, uma vez que este arquivo ainda no existe quando o programa6a.f90 for executado pela primeira vez. Este comando tambm declara que ser usado o nmero 9 no programa como referncia ao arquivo saida6a.txt. e) Como resultado da linha VER = SYSTEM("Notepad saida6a.txt") do programa, o aplicativo Notepad abre automaticamente o arquivo saida6a.txt cujo contedo mostrado na Figura 6.2. Na segunda e terceira linha do arquivo saida6a.txt o contedo da varivel A (Rio 45) foi cortado parcialmente devido aos poucos caracteres usados para escrev-la, no caso 2 e 5, definidos por A2 e A5. Para evitar este tipo de problema, sempre se deve superdimensionar o espao para escrever o contedo de cada varivel.

Figura 6.1 Janela DOS do programa6a.f90.

Figura 6.2 Arquivo saida6a.txt do programa6a.f90.


Captulo 6. Formatos de edio 72

9) At entender, comparar o resultado de cada comando WRITE, e seu respectivo comando FORMAT no programa6a.f90, mostrado em cada linha da Figura 6.2 ou no arquivo saida6a.txt. 10) Executar novamente o programa com outros contedos para as variveis A e B. Analisar os novos resultados. 6.2 FORMATOS DE EDIO PARA VARIVEIS DO TIPO INTEIRO: programa6b.f90 1) Nesta seo ser usado o mesmo projeto da seo anterior. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa-fonte b) Edit, Cut para retirar o programa-fonte do projeto. 2) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa6b.f90 3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 6.2. Tabela 6.2 Programa6b.f90.
USE PORTLIB INTEGER A, B, C INTEGER VER WRITE(*,*) "Variaveis do tipo inteiro" WRITE(*,*) "Entre com os valores de A e B" READ(*,*) A, B C = A + B OPEN(9, file="saida6b.txt") WRITE(9,*) A, "= A sem formato" WRITE(9,21) A WRITE(9,22) A WRITE(9,23) A WRITE(9,24) A WRITE(9,25) A WRITE(9,10) A, B, C WRITE(9,11) A, B, C Captulo 6. Formatos de edio 73

WRITE(9,9) A, B, C CLOSE(9) VER = SYSTEM("Notepad saida6b.txt") 21 FORMAT ( I2, "= A no formato I2" ) 22 FORMAT ( I5, "= A no formato I5" ) 23 FORMAT ( I10, "= A no formato I10" ) 24 FORMAT("10X", 10X, "Valor de A =", I10, 1/) 25 FORMAT("T10", T10, "Valor de A =", I10, 1/) 10 FORMAT(5X, "A =", I10, 1/, 5X, "B =", I10, 1/, 5X, "C =", I10, 2/) 11 FORMAT( 5X, "A =", I10, 1/, 5X, "B =", I10, 1/, 5X, "C =", I10, 2/ & & )

9 FORMAT ( 3(I10), "= variveis A, B e C no formato 3(I10)" ) END

4) Comentrios sobre o programa: a) O objetivo do programa6b.f90 explicar alguns formatos de edio utilizados com variveis do tipo inteiro. b) No caso do programa6b.f90, os comandos FORMAT foram todos aglomerados no final do programa-fonte, na mesma ordem de seus respectivos comandos WRITE. c) O identificador de variveis do tipo inteiro a letra I seguida de um nmero que especifica a quantidade mxima de algarismos ou colunas para escrever cada varivel. Dentro deste espao, o contedo de cada varivel do tipo inteiro escrito da direita para a esquerda. Uma coluna usada para o sinal do nmero inteiro. Se o valor inteiro da varivel ocupar mais espao, colunas ou algarismos do que o reservado para escrev-la, no lugar do nmero sero apresentados apenas asteriscos. Isso significa que o formato utilizado incompatvel com o valor da varivel. Um exemplo de uso deste identificador I5 na linha 22 FORMAT ( I5, "= A no formato I5" ) do programa. d) Os identificadores X, para espaos em branco, T, para tabulao, e N/, para o cursor descer N linhas, explicados na seo 6.1 para variveis do tipo caracter, tambm se aplicam com variveis do tipo inteiro, conforme pode-se ver no programa6b.f90. e) O formato M(IN) equivalente a M vezes o formato IN, onde N o nmero de colunas ou algarismos reservados para se escrever uma varivel do tipo inteiro. Por exemplo, na linha 9

Captulo 6. Formatos de edio

74

FORMAT ( 3(I10), "= variveis A, B e C no formato 3(I10)" ) do programa usa-se trs

vezes o formato I10 para se escrever trs variveis do tipo inteiro. 5) Executar Build, Compile para compilar o programa. 6) Gerar o programa-executvel fazendo Build, Build. 7) Ao se executar o programa, atravs de Build, Execute, surge uma janela do DOS, mostrada na Figura 6.3, dentro da qual tem-se: a) Na primeira linha, o comentrio Variaveis do tipo inteiro, resultado do comando WRITE(*,*)
"Variaveis do tipo inteiro" do programa.

b) Na segunda linha, o comentrio Entre com os valores de A e B, resultado do comando


WRITE(*,*) "Entre com os valores de A e B" do programa.

c) Na terceira linha, o programa pra e fica aguardando que sejam fornecidos os valores das variveis A e B, resultado do comando READ(*,*) A, B do programa. Para que o programa continue sua execuo necessrio digitar 111 222, por exemplo, e, em seguida, clicar na tecla enter. d) Em seguida ocorrer a criao do arquivo saida6b.txt, dentro do diretrio do projeto, como resultado do comando OPEN(9, file="saida6b.txt") do programa, uma vez que este arquivo ainda no existe quando o programa6b.f90 for executado pela primeira vez. Este comando tambm declara que ser usado o nmero 9 no programa como referncia ao arquivo saida6b.txt. e) Como resultado da linha VER = SYSTEM("Notepad saida6b.txt") do programa, o aplicativo Notepad abre automaticamente o arquivo saida6b.txt cujo contedo mostrado na Figura 6.4. Na segunda linha do arquivo saida6b.txt o valor da varivel A (111) foi trocado por dois asteriscos. Isso ocorre porque o formato usado (I2) incompatvel para se escrever o valor da varivel A, que neste caso precisa de pelo menos trs colunas, ou seja, o formato mnimo seria I3. Para evitar este tipo de problema, sempre se deve superdimensionar o espao para escrever o valor de cada varivel.

Figura 6.3 Janela DOS do programa6b.f90. 8) At entender, comparar o resultado de cada comando WRITE, e seu respectivo comando FORMAT no programa6b.f90, mostrado em cada linha da Figura 6.4 ou no arquivo saida6b.txt.
Captulo 6. Formatos de edio 75

9) Executar novamente o programa com outros valores para as variveis A e B. Analisar os novos resultados.

Figura 6.4 Arquivo saida6b.txt do programa6b.f90. 6.3 FORMATOS DE EDIO PARA VARIVEIS DO TIPO REAL: programa6c.f90 1) Nesta seo ser usado o mesmo projeto da seo anterior. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa-fonte b) Edit, Cut para retirar o programa-fonte do projeto. 2) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa6c.f90 3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 6.3. 4) Comentrios sobre o programa: a) O objetivo do programa6c.f90 explicar alguns formatos de edio utilizados com variveis do tipo real. b) No caso do programa6c.f90, os comandos FORMAT foram todos aglomerados no incio do programa-fonte, antes mesmo de seus respectivos comandos WRITE. c) Os dois principais identificadores de variveis do tipo real so representados pelas letras F e E.
Captulo 6. Formatos de edio 76

d) O formato de ponto flutuante usado para nmeros reais. Ele denotado por FX.Y, onde Y um nmero que equivale quantidade de algarismos usados para representar a parte decimal do valor da varivel. X um nmero que equivale quantidade total de colunas usadas para representar o valor da varivel, incluindo seu sinal, o ponto decimal e a parte decimal. O nmero X sempre tem que ser maior do que Y. No programa, por exemplo, so usados os formatos F5.2 e F5.0. Tabela 6.3 Programa6c.f90.
USE PORTLIB REAL A, B, C INTEGER VER 11 FORMAT( 5X, "A =", 1PE15.3, 1/, 5X, "B =", 1PE15.3, 1/, 5X, "C =", 1PE15.3, 1/ 21 FORMAT ("A no formato F5.2 "A no formato F5.0 "A no formato E15.3 & & ) 1/, & 1/, & 1/, & )

12 FORMAT ( 3(1PE15.3), "= variveis A, B e C no formato 3(1PE15.3)" ) =", F5.2, =", F5.0, =", E15.3,

"A no formato 1PE15.3 =", 1PE15.3, 1/ WRITE(*,*) "Variaveis do tipo real" WRITE(*,*) "Entre com os valores de A e B" READ(*,*) A, B C = A + B OPEN(9, file="saida6c.txt") WRITE(9,*) A, "= A sem formato" WRITE(9,21) A, A, A, A WRITE(9,11) A, B, C WRITE(9,12) A, B, C CLOSE(9) VER = SYSTEM("Notepad saida6c.txt") END

Captulo 6. Formatos de edio

77

e) O formato exponencial tambm usado para nmeros reais. Ele denotado por EX.Y, onde Y um nmero que equivale quantidade de algarismos usados para representar a parte decimal do valor da varivel. X um nmero que equivale quantidade total de colunas usadas para representar o valor da varivel, incluindo seu sinal, o ponto decimal, a parte decimal, a letra E, o sinal do expoente e dois algarismos para o valor do expoente. O nmero X sempre tem que ser maior do que Y. No programa, por exemplo, usado o formato E15.3. f) No formato EX.Y, nenhum algarismo usado na parte inteira. Para que seja usado um algarismo na parte inteira do nmero real, pode-se usar o formato 1PEX.Y. No programa, por exemplo, usado o formato 1PE15.3. g) Dentro das X colunas dos formatos FX.Y, EX.Y e 1PEX.Y, o contedo de cada varivel do tipo real escrito da direita para a esquerda. Os valores de X e Y so definidos pelo programador. h) Os identificadores X, para espaos em branco, T, para tabulao, e N/, para o cursor descer N linhas, explicados na seo 6.1 para variveis do tipo caracter, tambm se aplicam com variveis do tipo real, conforme pode-se ver no programa6c.f90. i) O formato M(1PEX.Y) equivalente a M vezes o formato 1PEX.Y. Por exemplo, na linha 12
FORMAT ( 3(1PE15.3), "= variveis A, B e C no formato 3(1PE15.3)" ) do programa

usa-se trs vezes o formato 1PE15.3 para se escrever trs variveis do tipo real. 5) Executar Build, Compile para compilar o programa. 6) Gerar o programa-executvel fazendo Build, Build. 7) Ao se executar o programa, atravs de Build, Execute, surge uma janela do DOS, mostrada na Figura 6.5, dentro da qual tem-se: a) Na primeira linha, o comentrio Variaveis do tipo real, resultado do comando WRITE(*,*)
"Variaveis do tipo real" do programa.

b) Na segunda linha, o comentrio Entre com os valores de A e B, resultado do comando


WRITE(*,*) "Entre com os valores de A e B" do programa.

c) Na terceira linha, o programa pra e fica aguardando que sejam fornecidos os valores das variveis A e B, resultado do comando READ(*,*) A, B do programa. Para que o programa continue sua execuo necessrio digitar 1.234 2.22, por exemplo, e, em seguida, clicar na tecla enter. d) Em seguida ocorrer a criao do arquivo saida6c.txt, dentro do diretrio do projeto, como resultado do comando OPEN(9, file="saida6c.txt") do programa, uma vez que este arquivo ainda no existe quando o programa6c.f90 for executado pela primeira vez. Este comando tambm declara que ser usado o nmero 9 no programa como referncia ao arquivo saida6c.txt. e) Como resultado da linha VER = SYSTEM("Notepad saida6c.txt") do programa, o aplicativo Notepad abre automaticamente o arquivo saida6c.txt cujo contedo mostrado na Figura 6.6.
Captulo 6. Formatos de edio 78

Dependendo do formato empregado, alguns algarismos do nmero real so truncados, como se pode ver da segunda quarta linha do arquivo saida6c.txt.

Figura 6.5 Janela DOS do programa6c.f90.

Figura 6.6 Arquivo saida6c.txt do programa6c.f90. 8) At entender, comparar o resultado de cada comando WRITE, e seu respectivo comando FORMAT no programa6c.f90, mostrado em cada linha da Figura 6.6 ou no arquivo saida6c.txt. 9) Executar novamente o programa com outros valores para as variveis A e B. Analisar os novos resultados. 10) Num mesmo comando FORMAT, podem ser usados identificados de variveis do tipo inteiro, caracter e real, alm de comentrios, e dos formatos NX, N/ e TN. 6.4 RESUMO DE REGRAS GERAIS DE EDIO DE PROGRAMAS EM FORTRAN 1) Em cada linha do programa, tudo que estiver aps o smbolo de exclamao (!) no executado pelo programa. Serve apenas como comentrio usado para esclarecer o que faz cada parte do programa. Dentro do Fortran PowerStation 4.0, todos os comentrios ficam na cor verde. Linhas em branco so equivalentes a ter o smbolo (!) de comentrio na primeira coluna de cada linha em branco. 2) Tudo que criado ou definido pelo programador fica na cor preta dentro do Fortran PowerStation 4.0.

Captulo 6. Formatos de edio

79

3) Todos os comandos intrnsecos da linguagem FORTRAN ficam na cor azul dentro do Fortran PowerStation 4.0. 4) O smbolo & usado ao final de uma linha de programa para indicar que o comando iniciado numa linha contnua na linha seguinte. 5) Cada linha de programa pode usar at 132 colunas, incluindo os espaos em branco. 6) Em geral, espaos em branco tm apenas funo esttica no programa, no afetando os comandos ou as instrues do programador. Os espaos em branco so considerados quando usados dentro de comentrios nos comandos WRITE e FORMAT. 7) Nos comandos da linguagem FORTRAN e em nomes de variveis, no existe distino entre letras maisculas ou minsculas. Por exemplo, WRITE, write, Write e wRiTe so equivalentes. A distino entre letras minsculas e maisculas existe dentro de comentrios nos comandos WRITE e FORMAT. 8) Na linguagem FORTRAN, os nomes de variveis podem ter at 31 caracteres que incluem combinaes das 26 letras do alfabeto, dos algarismos 0, 1, 2, 3 a 9, e o trao de sublinhado. No permitido acentuao e todas as variveis devem comear por uma letra. Exemplos de nomes de variveis (separadas por vrgula): v, va, variavel, variavel_2, variavel_31, nome03, nome_03, nome_da_rua. 6.5 SEQNCIA OBRIGATRIA DE COMANDOS EM FORTRAN At este captulo foram vistos comandos da linguagem FORTRAN que podem ser divididos em cinco tipos: 1) Comando para incluso de biblioteca no programa-fonte: USE 2) Comandos para declarar tipos de variveis: INTEGER, REAL e CHARACTER 3) Outros comandos intrnsecos (WRITE, READ, OPEN, CLOSE) ou no do FORTRAN (SYSTEM), funes intrnsecas (LOG, TRIM etc) e qualquer outro comando criado pelo programador, por exemplo, clculos e operaes com strings 4) Comando de encerramento do programa-fonte: END 5) Comando de edio: FORMAT Se todos os cinco tipos de comandos forem usados simultaneamente num programa-fonte, a seqncia obrigatria entre eles exatamente a apresentada acima, exceto para o quinto tipo. O comando FORMAT pode ficar em qualquer lugar do programa-fonte entre os comandos USE e END. Para os comandos do tipo 2 (INTEGER, REAL e CHARACTER), a ordem entre eles pode ser qualquer. O mesmo se aplica para os comandos do tipo 3, exceto com arquivos nos quais para um arquivo especfico a seqncia obrigatria : OPEN, WRITE e outros comandos, CLOSE.

Captulo 6. Formatos de edio

80

Encerrar a sesso seguindo o procedimento-padro.

6.6 EXERCCIOS Exerccio 6.1 Editar um programa-fonte em FORTRAN para realizar um clculo de interpolao linear executando o seguinte algoritmo (passos): 1) Ler os valores de duas variveis do tipo real, chamadas X1 e X2, que correspondem a dois dados tabelados de uma varivel independente 2) Ler os valores de duas variveis do tipo real, chamadas Y1 e Y2, que correspondem a dois dados tabelados de uma varivel dependente de X 3) Ler o valor de uma varivel do tipo real, chamada X, para o qual se deseja realizar a interpolao 4) Calcular o valor da varivel Y, em funo do valor de X, usando interpolao linear 5) Utilizando comandos FORMAT, escrever no arquivo chamado saida_6p1.txt os cinco valores lidos e o resultado de Y, juntamente com comentrios para identific-los 6) Executar o programa para X1 = 10, X2 = 20, Y1 = 100, Y2 = 20 e X = 12. O resultado deve ser Y = 76. Exerccio 6.2 Editar um programa-fonte em FORTRAN para realizar clculos com uma progresso geomtrica (P.G.) executando o seguinte algoritmo (passos): 1) Ler o primeiro valor (real) da P.G., denotado por a1 2) Ler a razo (nmero real) entre dois termos subseqentes da P.G., denotada por q 3) Ler o nmero (inteiro) de termos da P.G., denotado por N 4) Calcular o valor (real) do ltimo termo da P.G., denotado por an 5) Calcular a soma de todos os termos da P.G., denotado por Sn 6) Utilizando comandos FORMAT, escrever no arquivo chamado saida_6p2.txt os trs valores lidos e os dois calculados, juntamente com comentrios para identific-los 7) Executar o programa para a1 = 1.5, q = 1.1 e N = 20. Os resultados devem ser aproximadamente an 9.174 e Sn 85.91.

Captulo 6. Formatos de edio

81

Captulo 7. DECISES E OPES

OBJETIVOS DO CAPTULO Conceitos de: deciso, condio, operadores relacionais e lgicos, e opo Comandos do FORTRAN: IF THEN ELSE END IF, SELECT CASE CASE END SELECT

7.1 programa7a.f90 Para inicializar as atividades deste captulo, deve-se executar: 1) Para acessar o programa Fortran, no Windows: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa7 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa7a.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 7.1. 5) Comentrios sobre o programa: a) Nesta e na prxima seo so vistas trs formas de uso do comando IF (SE). A primeira mostrada na Tabela 7.2 e usada em diversas linhas do programa7a.f90. O comando IF usado para tomar decises com base em condies. Se as condies so satisfeitas, executa-se o comando que est na mesma linha do IF, caso contrrio, no. b) Por exemplo, na linha IF ( A <
B ) WRITE(*,*) "A eh MENOR do que B" do programa, se o

valor de A for menor do que o valor de B, executado o comando que est aps o parnteses, no caso, escrever um comentrio. Aquilo que est dentro de parnteses chamado de condio, que pode ser simples ou composta. Para definir as condies, so usados os chamados operadores relacionais (Tabela 7.3) e lgicos (Tabela 7.4). c) Na linha IF ( (A < 0) .AND. (B < 0) ) WRITE(*,*) "A E B sao numeros NEGATIVOS" do programa, tem-se um exemplo de condio composta. Cada condio simples unida pelos operadores lgicos .AND. e .OR., que em portugus significam E e OU. d) Nas condies, alm de variveis, podem ser usados diretamente valores ou expresses envolvendo valores e variveis. e) Nas demais linhas do programa, so testados todos os operadores relacionais e lgicos. 6) Executar Build, Compile para compilar o programa.

Captulo 7. Decises e opes

82

7) Gerar o programa-executvel fazendo Build, Build. Tabela 7.1 Programa7a.f90.


REAL A, B WRITE(*,*) "Entre com os valores de A e B" READ(*,*) A, B IF ( A < B ) WRITE(*,*) "A eh MENOR do que B"

IF ( A <= B ) WRITE(*,*) "A eh MENOR OU IGUAL a B" IF ( A > B ) WRITE(*,*) "A eh MAIOR do que B"

IF ( A >= B ) WRITE(*,*) "A eh MAIOR OU IGUAL a B" IF ( A == B ) WRITE(*,*) "A eh IGUAL a B" IF ( A /= B ) WRITE(*,*) "A eh DIFERENTE de B" IF ( (A < 0) .AND. (B < 0) ) WRITE(*,*) "A E B sao numeros NEGATIVOS" IF ( (A > 0) .AND. (B > 0) ) WRITE(*,*) "A E B sao numeros POSITIVOS" IF ( (A > 0) .OR. END (B > 0) ) WRITE(*,*) "A OU B eh um numero POSITIVO"

Tabela 7.2 Sintaxe 1 do comando IF.


IF ( condies ) COMANDO onde condies representa uma ou vrias condies que devem ser satisfeitas para que COMANDO seja executado.

8) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 7.1, dentro da qual tem-se: a) Na primeira linha, o comentrio Entre com os valores de A e B, resultado do comando
WRITE(*,*) "Entre com os valores de A e B" do programa.

Captulo 7. Decises e opes

83

b) Na segunda linha, o programa pra e fica aguardando que sejam fornecidos os valores das variveis A e B, resultado do comando READ(*,*) A, B do programa. Para que o programa continue sua execuo necessrio digitar 1.0 2.0, por exemplo, e, em seguida, clicar na tecla enter. c) Em seguida so apresentados os comentrios correspondentes aos comandos IF cujas condies foram satisfeitas para os valores de A e B. Tabela 7.3 Operadores relacionais do FORTRAN. Operador < <= > >= == /= Significado menor menor ou igual maior maior ou igual igual diferente

Tabela 7.4 Operadores lgicos do FORTRAN. Operador .AND. .OR. Significado e ou

Figura 7.1 Resultado do programa7a.f90 para A = 1.0 e B = 2.0. 9) At entender, comparar os resultados da execuo do programa7a.f90, mostrados na Figura 7.1, com cada linha do programa-fonte onde exista um comando IF. 10) Executar novamente o programa com A = 1 e B = 1. At entender, comparar os novos resultados, mostrados na Figura 7.2, com cada linha do programa-fonte onde exista um comando IF.

Captulo 7. Decises e opes

84

Figura 7.2 Resultado do programa7a.f90 para A = 1 e B = 1. 11) Executar novamente o programa com A = 1 e B = 2. At entender, comparar os novos resultados, mostrados na Figura 7.3, com cada linha do programa-fonte onde exista um comando IF.

Figura 7.3 Resultado do programa7a.f90 para A = 1 e B = 2. 12) Executar novamente o programa com outros valores para A e B. At entender, comparar os novos resultados com cada linha do programa-fonte onde exista um comando IF. 7.2 programa7b.f90 1) Nesta seo ser usado o mesmo projeto da seo anterior. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa-fonte b) Edit, Cut para retirar o programa-fonte do projeto. 2) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa7b.f90 3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 7.5. 4) Comentrios sobre o programa: a) Este programa foi escrito para extrair as duas razes de uma equao do 2o grau.

Captulo 7. Decises e opes

85

b) Nesta seo mostrada e testada a segunda forma de uso do comando IF (SE), cuja sintaxe apresentada na Tabela 7.6 e usada no programa7b.f90. Esta estrutura do comando IF permite que, se as condies so satisfeitas, sejam executados diversos comandos do programa escritos em vrias linhas. Se as condies no so satisfeitas, so executados os comandos que esto entre o comando ELSE e o END IF. Tabela 7.5 Programa7b.f90.
REAL A, B, C REAL D, X1, X2 WRITE(*,*) "Entre com os valores de A, B e C, onde" WRITE(*,*) "A*(X**2) + B*X + C = 0" READ(*,*) A, B, C D = (B**2) - 4.0 * A * C IF ( D >= 0.0 ) THEN X1 = ( -B + SQRT(D) ) / ( 2.0 * A ) X2 = ( -B - SQRT(D) ) / ( 2.0 * A ) WRITE(*,*) "A primeira raiz real eh = ", X1 WRITE(*,*) "A segunda ELSE X1 = -B / ( 2.0 * A ) X2 = SQRT(ABS(D)) / ( 2.0 * A ) WRITE(*,*) "A primeira raiz complexa eh = ", X1, " + ", X2, " i" WRITE(*,*) "A segunda END IF END raiz complexa eh = ", X1, " - ", X2, " i" raiz real eh = ", X2

c) Se no existir necessidade de comandos entre o ELSE e o END IF, pode-se usar a estrutura do comando IF mostrada na Tabela 7.7. d) Recomenda-se identar, isto , deslocar para a direita os comandos entre o IF (SE) e o ELSE (SENO), e entre o ELSE e o END IF, para que sejam facilmente visualizados os comandos que so ou no executados. Um exemplo desta recomendao mostrado no programa7b.f90, na Tabela 7.5.
Captulo 7. Decises e opes 86

e) As trs formas de uso do comando IF, mostradas nas Tabelas 7.2, 7.6 e 7.7, podem ser combinadas entre si, cada uma podendo ser inserida dentro das estruturas das outras. Tabela 7.6 Sintaxe 2 do comando IF.
IF ( condies ) THEN BLOCO 1 (uma ou vrias linhas de programa com comandos) ELSE BLOCO 2 (uma ou vrias linhas de programa com comandos) END IF onde condies representa uma ou vrias condies que devem ser satisfeitas para que o bloco 1 seja executado; se as condies no forem satisfeitas, o bloco 2 executado.

Tabela 7.7 Sintaxe 3 do comando IF.


IF ( condies ) THEN BLOCO (uma ou vrias linhas de programa com comandos) END IF onde condies representa uma ou vrias condies que devem ser satisfeitas para que o bloco de linhas de programa seja executado.

5) Executar Build, Compile para compilar o programa. 6) Gerar o programa-executvel fazendo Build, Build. 7) Ao se executar o programa, atravs de Build, Execute, surge uma janela do DOS, mostrada na Figura 7.4, dentro da qual tem-se: a) Na primeira linha, o comentrio Entre com os valores de A, B e C, onde, resultado do comando
WRITE(*,*) "Entre com os valores de A, B e C, onde" do programa.

b) Na segunda linha, o comentrio A*(X**2) + B*X + C = 0, resultado do comando WRITE(*,*)


"A*(X**2) + B*X + C = 0" do programa.

c) Na terceira linha, o programa pra e fica aguardando que sejam fornecidos os valores das variveis A, B e C, resultado do comando READ(*,*) A, B, C do programa. Para que o programa continue sua execuo necessrio digitar 1 5 6, por exemplo, e, em seguida, clicar na tecla enter.
Captulo 7. Decises e opes 87

d) Em seguida so apresentados os resultados correspondentes ao bloco do programa selecionado em funo da condio testada no comando IF.

Figura 7.4 Resultado do programa7b.f90 para A = 1, B = 5 e C = 6. 8) At entender, comparar os resultados da execuo do programa7b.f90, mostrados na Figura 7.4, com cada linha do programa-fonte. 9) Executar novamente o programa com A = 1, B = 6 e C = 10. At entender, comparar os novos resultados, mostrados na Figura 7.5, com cada linha do programa-fonte.

Figura 7.5 Resultado do programa7b.f90 para A = 1, B = 6 e C = 10. 10) Executar novamente o programa com outros valores para A, B e C. At entender, comparar os novos resultados com cada linha do programa-fonte. 7.3 programa7c.f90 1) Nesta seo ser usado o mesmo projeto da seo anterior. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa-fonte b) Edit, Cut para retirar o programa-fonte do projeto. 2) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa7c.f90

Captulo 7. Decises e opes

88

3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 7.8. Tabela 7.8 Programa7c.f90.
INTEGER A WRITE(*,*) "Entre com o valor inteiro de A" READ(*,*) A SELECT CASE ( A ) CASE ( -1000:1 ) WRITE(*,*) "Valor de A estah entre -1000 e 1" CASE ( 2, 4 ) WRITE(*,*) "Valor de A eh 2 ou 4" CASE ( 3 ) WRITE(*,*) "Valor de A eh 3" CASE ( 5:2000 ) WRITE(*,*) "Valor de A estah entre 5 e 2000" CASE DEFAULT WRITE(*,*) "Valor de A eh menor do que -1000 ou maior do que 2000" END SELECT END

4) Comentrios sobre o programa: a) No programa7c.f90 usado um novo comando do FORTRAN: SELECT CASE. Este comando empregado para escolher apenas uma opo entre vrias e executar o bloco de linhas ou comandos do programa correspondente opo escolhida. A opo feita em funo de uma varivel do tipo inteiro ou caracter, chamada de varivel seletora. Cada bloco pode conter uma ou vrias linhas de programa. A sintaxe deste comando apresentada na Tabela 7.9. b) O nmero de opes existentes depende de cada caso ou programa em particular. c) A opo CASE DEFAULT executada se nenhuma das anteriores for satisfeita.

Captulo 7. Decises e opes

89

d) Recomenda-se identar, isto , deslocar para a direita cada opo (CASE) e cada bloco para que sejam facilmente visualizados os comandos ligados a cada opo. Um exemplo desta recomendao mostrado no programa7c.f90, na Tabela 7.8. e) Deve-se notar que em todos os comandos WRITE no usado o valor da varivel A. Tabela 7.9 Sintaxe do comando SELECT CASE.
SELECT CASE ( variavel ) CASE ( valor1 ) BLOCO 1 CASE ( valor2 ) BLOCO 2 CASE DEFAULT BLOCO DEFAULT END SELECT onde valor representa um valor inteiro, alguns valores separados por vrgula ou, ainda, um intervalo de valores separados por dois pontos; apenas o bloco de comandos correspondente ao valor da varivel executado. A varivel de seleo pode ser do tipo inteiro ou caracter. No caso de varivel caracter, os valores devem ser strings entre aspas.

5) Executar Build, Compile para compilar o programa. 6) Gerar o programa-executvel fazendo Build, Build. 7) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 7.6, dentro da qual tem-se: a) Na primeira linha, o comentrio Entre com o valor inteiro de A, resultado do comando
WRITE(*,*) "Entre com o valor inteiro de A" do programa.

b) Na segunda linha, o programa pra e fica aguardando que seja fornecido o valor da varivel A, resultado do comando READ(*,*) A do programa. Para que o programa continue sua execuo necessrio digitar o valor 10 para a varivel A, por exemplo, e, em seguida, clicar na tecla enter.

Captulo 7. Decises e opes

90

c) Na terceira linha, mostrado um comentrio correspondente opo selecionada em funo do valor da varivel A. 8) At entender, verificar se o resultado da execuo do programa7c.f90, mostrado na Figura 7.6, est correto em funo do valor da varivel A e o comentrio correspondente opo selecionada. 9) Executar novamente o programa com A = 2. At entender, verificar se o novo resultado da execuo do programa7c.f90 est correto em funo do valor da varivel A e o comentrio correspondente opo selecionada. 10) Repetir o item 9 com A = 50. 11) Repetir o item 9 com A = 2345. 12) Repetir o item 9 com outro valor qualquer. 13) Encerrar a sesso seguindo o procedimento-padro.

Figura 7.6 Resultado do programa7c.f90 para A = 10. 7.4 EXERCCIOS Exerccio 7.1 Editar um programa-fonte em FORTRAN para executar o seguinte algoritmo (passos): 1) Ler os valores inteiros de trs variveis, denotadas por A, B e C 2) Determinar qual das variveis tem o menor e o maior valor Exerccio 7.2 Alterar o programa7b.f90 para que no ocorra erro de execuo quando o usurio entrar com valor nulo para a varivel A, e que seja calculado e escrito o valor da nica raiz deste caso. Exerccio 7.3 Editar um programa-fonte em FORTRAN para calcular as razes de uma equao algbrica cbica. Exerccio 7.4 Editar um programa-fonte em FORTRAN para executar o seguinte algoritmo (passos):
Captulo 7. Decises e opes 91

1) Mostrar na tela uma lista com pelo menos 4 opes de clculo: 1 = mdulo de A; 2 = raiz quadrada de A; 3 = exponencial de A; 4 = logaritmo de A 2) Ler o valor da opo de clculo desejada 3) Ler o valor real da varivel A 4) Calcular o resultado de A para a opo escolhida pelo usurio 5) Mostrar o resultado de A

Captulo 7. Decises e opes

92

Captulo 8. CICLOS

OBJETIVOS DO CAPTULO Conceito de ciclo Comandos do FORTRAN: DO END DO, EXIT

8.1 programa8a.f90 Para inicializar as atividades deste captulo, deve-se executar: 1) Para acessar o programa Fortran, no Windows: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa8 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa8a.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 8.1. Tabela 8.1 Programa8a.f90.
INTEGER A A = 20 WRITE(*,*) "Valor de A antes do ciclo =", A DO A = 1, 10, 1 WRITE(*,*) "Valor de A dentro do ciclo =", A END DO WRITE(*,*) "Valor de A depois do ciclo =", A END

5) Neste programa so usados dois novos comandos do FORTRAN: DO e END DO, que definem um ciclo. Ele so usados para executar vrias vezes uma ou mais linhas do programa. Explicaes gerais sobre o seu funcionamento so apresentadas na prxima seo. 6) Executar Build, Compile para compilar o programa.

Captulo 8. Ciclos

93

7) Gerar o programa-executvel fazendo Build, Build. 8) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 8.1, dentro da qual tem-se: a) Na primeira linha, o valor corrente ou atual da varivel A na memria do computador, resultado do comando WRITE(*,*) "Valor de A antes do ciclo =", A do programa. O valor escrito, 20, resultado da linha anterior do programa, A = 20. b) Da segunda dcima-primeira linha, o programa executa 10 vezes a linha WRITE(*,*) "Valor
de A dentro do ciclo =", A porque ela est dentro de um ciclo definido pelos comandos DO

e END DO. Deve-se notar que o valor da varivel A muda a cada repetio do ciclo. c) Na dcima-segunda linha, o programa escreve o valor da varivel A como resultado da linha
WRITE(*,*) "Valor de A depois do ciclo =", A , que j est fora do ciclo.

Figura 8.1 Resultado do programa8a.f90. 9) Explicaes gerais sobre o funcionamento de um ciclo em FORTRAN so apresentadas a seguir. 8.2 programa8b.f90 1) Nesta seo ser usado o mesmo projeto da seo anterior. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa-fonte b) Edit, Cut para retirar o programa-fonte do projeto. 2) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa8b.f90 3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 8.2.

Captulo 8. Ciclos

94

Tabela 8.2 Programa8b.f90.


INTEGER A, INICIO, FIM, PASSO, B, C WRITE(*,*) "Entre com os valores inteiros de A, INICIO, FIM e PASSO" READ(*,*) A, INICIO, FIM, PASSO WRITE(*,*) "Valor de A antes do ciclo =", A B = (FIM - INICIO + PASSO) / PASSO C = MAX ( B, 0 ) WRITE(*,*) "O ciclo deve ser executado", C, " vezes" DO A = INICIO, FIM, PASSO WRITE(*,*) "Valor de A dentro do ciclo =", A END DO WRITE(*,*) "Valor de A depois do ciclo =", A END

4) Comentrios sobre o programa: a) Neste programa so usados dois novos comandos do FORTRAN: DO e END DO, que definem um ciclo. A sintaxe deles, isto , a forma de utiliz-los mostrada na Tabela 8.3. Todas as linhas do programa que esto entre os comandos DO e END DO so executadas diversas vezes. b) A definio de um ciclo envolve quatro variveis do tipo inteiro: A, INICIO, FIM e PASSO. Os nomes delas podem ser outros quaisquer. Quando a execuo do programa chega a um comando DO, a seqncia a seguinte: b.1) A varivel A assume o valor da varivel INICIO b.2) Verifica-se se deve-se entrar ou no no ciclo em funo dos valores das variveis INICIO, FIM e PASSO, conforme explicao do item c abaixo b.3) No caso de se entrar no ciclo: b.3.1) So executadas todas as linhas do programa at se chegar ao comando END DO b.3.2) Retorna-se linha do comando DO b.3.3) O valor da varivel A passa a ser A = A + PASSO b.3.4) Retorna-se ao item b.2 acima

Captulo 8. Ciclos

95

b.4) No caso de no se entrar no ciclo, a execuo do programa passa diretamente linha que estiver abaixo do comando END DO Tabela 8.3 Sintaxe do comando DO.
DO A = INICIO, FIM, PASSO BLOCO (uma ou vrias linhas de programa com comandos) END DO onde os valores das variveis INICIO, FIM e PASSO devem ter sido definidos antes da execuo do programa chegar ao comando DO.

c) O nmero de execues (varivel C) do ciclo depende das variveis do tipo inteiro INICIO, FIM e PASSO, calculado atravs de

FIM

INICIO + PASSO

PASSO

(8.1)

= MAX ( B, 0 )

(8.2)

onde o resultado da funo MAX(B,0) o maior valor entre a varivel B e o valor zero. O resultado de C pode ser 0, 1, 2, 3 etc. Portanto, o ciclo pode ser executado uma vez, diversas vezes ou nenhuma vez. d) O valor da varivel PASSO pode ser positivo ou negativo; nulo, no. Portanto, pode-se ter um ciclo cujo valor de A progressivo (PASSO > 0) ou regressivo (PASSO < 0). Se PASSO = 1, seu valor no precisa ser declarado no comando DO. e) O valor da varivel A no pode ser alterado nas linhas que esto entre os comando DO e END DO. Se isso for feito, resultar num erro de compilao. f) Recomenda-se identar, isto , deslocar para a direita todas as linhas do programa que esto entre os comandos DO e END DO para que facilmente se perceba os comandos que compem o ciclo. Exemplos desta recomendao so mostrados no programa8a.f90 (Tabela 8.1) e no programa8b.f90 (Tabela 8.2). 5) Executar Build, Compile para compilar o programa. 6) Gerar o programa-executvel fazendo Build, Build.

Captulo 8. Ciclos

96

7) Ao se executar o programa, atravs de Build, Execute, surge uma janela do DOS, mostrada na Figura 8.2, dentro da qual tem-se: a) Na primeira linha, o comentrio Entre com os valores inteiros de A, INICIO, FIM e PASSO, resultado do comando WRITE(*,*) "Entre com os valores inteiros de A, INICIO, FIM
e PASSO" do programa.

b) Na segunda linha, o programa pra e fica aguardando que sejam fornecidos os valores das variveis A, INICIO, FIM e PASSO, resultado do comando READ(*,*) A, INICIO, FIM,
PASSO do programa. Para que o programa continue sua execuo necessrio digitar 20 1 10 1,

por exemplo, e, em seguida, clicar na tecla enter. c) Em seguida so apresentados os resultados correspondentes execuo do programa.

Figura 8.2 Resultado do programa8b.f90 para A = 20, INICIO = 1, FIM = 10 e PASSO = 1. 8) At entender, analisar os resultados do programa8b.f90, mostrados na Figura 8.2, considerando cada linha do programa-fonte e as explicaes descritas no item 4 acima. Deve-se notar que o ciclo do programa8b.f90 idntico ao do programa8a.f90, Figura 8.1, devido aos valores usados para as variveis INICIO, FIM e PASSO. Neste caso tem-se um ciclo progressivo, pois PASSO > 0. 9) Executar novamente o programa com A = 20, INICIO = 5, FIM = 5 e PASSO = 1. Neste caso tem-se um ciclo progressivo, pois PASSO > 0. At entender, analisar os novos resultados, mostrados na Figura 8.3, considerando cada linha do programa-fonte e as explicaes descritas no item 4 acima. 10) Executar novamente o programa com A = 20, INICIO = 20, FIM = 11 e PASSO = 1. Neste caso tem-se um ciclo regressivo, pois PASSO < 0. At entender, analisar os novos resultados, mostrados na Figura 8.4, considerando cada linha do programa-fonte e as explicaes descritas no item 4 acima.

Captulo 8. Ciclos

97

Figura 8.3 Resultado do programa8b.f90 para A = 20, INICIO = 5, FIM = 5 e PASSO = 1.

Figura 8.4 Resultado do programa8b.f90 para A = 20, INICIO = 20, FIM = 11 e PASSO = 1. 11) Executar novamente o programa com A = 20, INICIO = 12, FIM = 15 e PASSO = 2. Neste caso tem-se um ciclo progressivo, pois PASSO > 0. At entender, analisar os novos resultados, mostrados na Figura 8.5, considerando cada linha do programa-fonte e as explicaes descritas no item 4 acima. 12) Executar novamente o programa com A = 20, INICIO = 11, FIM = 20 e PASSO = 1. Neste caso tem-se um ciclo regressivo, pois PASSO < 0. At entender, analisar os novos resultados, mostrados na Figura 8.6, considerando cada linha do programa-fonte e as explicaes descritas no item 4 acima.
8.3 programa8c.f90

1) Nesta seo ser usado o mesmo projeto da seo anterior. Portanto, deve-se executar o seguinte no Fortran:

Captulo 8. Ciclos

98

a) Clicar sobre o nome do programa-fonte b) Edit, Cut para retirar o programa-fonte do projeto.

Figura 8.5 Resultado do programa8b.f90 para A = 20, INICIO = 12, FIM = 15 e PASSO = 2.

Figura 8.6 Resultado do programa8b.f90 para A = 20, INICIO = 11, FIM = 20 e PASSO = 1. 2) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte
programa8c.f90

3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 8.4. 4) Comentrios sobre o programa: a) No programa8c.f90 usado um novo comando do FORTRAN: EXIT. Este comando empregado para que a execuo de um ciclo seja interrompida e a execuo do programa continue na linha seguinte ao comando END DO. b) No programa8c.f90 tambm exemplificado o uso da varivel A em operaes ou clculos dentro de um ciclo. Conforme j foi mencionado, o valor de A no pode ser alterado por comandos dentro do ciclo. Mas o valor que a varivel A assume a cada execuo do ciclo pode ser usado em outros clculos ou variveis. c) No caso, a varivel SOMA zerada antes do incio do ciclo. A cada execuo do ciclo, seu valor alterado com o valor atual da varivel A. O mesmo ocorre com a varivel CUBO.

Captulo 8. Ciclos

99

d) Quando a condio estipulada na linha IF ( SOMA > FIM ) EXIT do programa for satisfeita, o comando EXIT ser executado. Em seguida, a execuo do programa transferida para a linha
WRITE(*,*) "Valor de A depois do ciclo =", A do programa, que a linha seguinte ao

comando END DO. Tabela 8.4 Programa8c.f90.


INTEGER A, INICIO, FIM, PASSO, SOMA, CUBO WRITE(*,*) "Entre com os valores inteiros de INICIO, FIM e PASSO" READ(*,*) INICIO, FIM, PASSO SOMA = 0 CUBO = 0 DO A = INICIO, FIM, PASSO SOMA = SOMA + A CUBO = CUBO + A**3 WRITE(*,*) "A, SOMA, CUBO =", A, SOMA, CUBO IF ( SOMA > FIM ) EXIT END DO WRITE(*,*) "Valor de A depois do ciclo =", A END

5) Executar Build, Compile para compilar o programa. 6) Gerar o programa-executvel fazendo Build, Build. 7) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 8.7, dentro da qual tem-se: a) Na primeira linha, o comentrio Entre com os valores inteiros de INICIO, FIM e PASSO, resultado do comando WRITE(*,*) "Entre com os valores inteiros de INICIO, FIM e
PASSO" do programa.

b) Na segunda linha, o programa pra e fica aguardando que sejam fornecidos os valores das variveis INICIO, FIM e PASSO, resultado do comando READ(*,*) INICIO, FIM, PASSO do programa. Para que o programa continue sua execuo necessrio digitar 1 10 1, por exemplo, e, em seguida, clicar na tecla enter. c) Em seguida so apresentados os resultados correspondentes execuo do programa.

Captulo 8. Ciclos

100

8) At entender, analisar os resultados do programa8c.f90, mostrados na Figura 8.7, considerando cada linha do programa-fonte e as explicaes descritas no item 4 acima. 9) Executar novamente o programa com INICIO = 5, FIM = 5 e PASSO = 2. At entender, analisar os novos resultados, mostrados na Figura 8.8, considerando cada linha do programa-fonte e as explicaes descritas no item 4 acima. 10) Encerrar a sesso seguindo o procedimento-padro.

Figura 8.7 Resultado do programa8c.f90 para INICIO = 1, FIM = 10 e PASSO = 1.

Figura 8.8 Resultado do programa8c.f90 para INICIO = 5, FIM = 5 e PASSO = 2.


8.4 EXERCCIOS Exerccio 8.1

Editar um programa-fonte em FORTRAN para executar o seguinte algoritmo (passos): 1) Ler o valor inteiro de uma varivel, denotada por N 2) Determinar se N um nmero primo 3) Mostrar o resultado, isto , se N um nmero primo ou no.
Exerccio 8.2

Editar um programa-fonte em FORTRAN para executar o seguinte algoritmo (passos):


Captulo 8. Ciclos 101

1) Ler o valor inteiro de uma varivel, denotada por N 2) Calcular o fatorial de N apenas para N 0 3) Mostrar o resultado do fatorial de N
Exerccio 8.3

Editar um programa-fonte em FORTRAN para calcular e escrever num arquivo o valor de cada termo de uma progresso aritmtica, cujo problema est definido no exerccio 5.1
Exerccio 8.4

Editar um programa-fonte em FORTRAN para calcular e escrever num arquivo o valor de cada termo de uma progresso geomtrica, cujo problema est definido no exerccio 6.2

Captulo 8. Ciclos

102

Captulo 9. CONJUNTOS

OBJETIVOS DO CAPTULO Conceitos de: conjunto, elemento, alocao dinmica de memria Comandos do FORTRAN: DIMENSION, ALLOCATABLE, ALLOCATE, MINVAL, MAXVAL, SUM 9.1 programa9a.f90 Para inicializar as atividades deste captulo, deve-se executar: 1) Para acessar o programa Fortran, no Windows: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa9 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa9a.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 9.1. 5) Objetivos do programa: a) Utilizar trs novos comandos do FORTRAN: DIMENSION, ALLOCATABLE e ALLOCATE b) Determinar os valores mnimo e mximo e a mdia de um conjunto de variveis do tipo real 6) Comentrios sobre o programa: a) Todas as variveis do tipo inteiro, real e caracter que foram empregadas at o captulo 8 podem ser denominadas de variveis simples. Mas tambm existem as chamadas variveis compostas ou do tipo conjunto, que so o tema deste captulo 9. b) Neste programa so usados trs novos comandos do FORTRAN: DIMENSION, ALLOCATABLE e ALLOCATE, que so empregados com variveis do tipo conjunto. A sintaxe deles, isto , a forma de utiliz-los mostrada na Tabela 9.2. c) Em FORTRAN, conjunto uma coleo de variveis do mesmo tipo que so agrupadas numa nica varivel. Cada varivel que compe o conjunto denominada de elemento ou componente. Uma varivel do tipo conjunto tambm chamada de vetor ou varivel subscrita. As variveis do tipo conjunto podem ser compostas por variveis do tipo inteiro, real ou caracter. Por exemplo, as diversas notas de uma prova podem ser agrupadas num nico conjunto ou varivel (NOTAS) para represent-las, conforme mostrado na Tabela 9.1.

Captulo 9. Conjuntos

103

d) O comando DIMENSION(:) usado para definir uma varivel do tipo conjunto. Tabela 9.1 Programa9a.f90.
INTEGER NOTA, QUANTIDADE_NOTAS REAL, ALLOCATABLE, DIMENSION(:) :: NOTAS REAL MINIMO, MAXIMO, SOMA, MEDIA WRITE(*,*) "Entre com a quantidade de notas" READ(*,*) QUANTIDADE_NOTAS ALLOCATE ( NOTAS (QUANTIDADE_NOTAS) ) WRITE(*,*) "Entre com as notas" DO NOTA = 1, QUANTIDADE_NOTAS READ(*,*) NOTAS(NOTA) END DO MINIMO = NOTAS(1) MAXIMO = NOTAS(1) SOMA = NOTAS(1)

DO NOTA = 2, QUANTIDADE_NOTAS IF ( NOTAS(NOTA) < MINIMO ) MINIMO = NOTAS(NOTA) IF ( NOTAS(NOTA) > MAXIMO ) MAXIMO = NOTAS(NOTA) SOMA = SOMA + NOTAS(NOTA) END DO MEDIA = SOMA / QUANTIDADE_NOTAS WRITE(*,*) "Nota minima = ", MINIMO WRITE(*,*) "Nota maxima = ", MAXIMO WRITE(*,*) "Nota media END = ", MEDIA

e) O comando ALLOCATABLE usado para definir uma varivel do tipo alocvel, isto , uma varivel do tipo conjunto cuja quantidade de elementos que a compe definida posteriormente dentro do programa em funo de alguma outra varivel. f) O comando ALLOCATE usado para definir quantos elementos compem uma varivel do tipo conjunto e reservar o espao de memria correspondente no computador. No se pode atribuir
Captulo 9. Conjuntos 104

valores aos componentes de uma varivel do tipo conjunto antes do comando ALLOCATE ter sido usado com ela. g) Na linha REAL, ALLOCATABLE, DIMENSION(:) :: NOTAS do programa, define-se a varivel chamada NOTAS com as seguintes caractersticas: do tipo conjunto, devido ao comando DIMENSION(:); do tipo alocvel, devido ao comando ALLOCATABLE; e do tipo real, ou seja, cada elemento da varivel NOTAS poder conter nmeros reais, devido ao comando REAL. O duplo dois pontos que aparece nesta linha deve ser usado quando existe mais de uma definio para uma varivel, onde cada definio deve ser separada por vrgula. h) Na linha ALLOCATE ( NOTAS (QUANTIDADE_NOTAS) ) do programa, utilizando-se o comando ALLOCATE e a varivel QUANTIDADE_NOTAS, que um dado do programa, define-se quantos elementos compem a varivel NOTAS e reserva-se o espao de memria correspondente. Tabela 9.2 Sintaxe de comandos para variveis do tipo conjunto.
PARA DEFINIR O TIPO DE VARIAVL: REAL, ALLOCATABLE, DIMENSION(:) :: A, B INTEGER, ALLOCATABLE, DIMENSION(:) :: A, B CHARACTER(X), ALLOCATABLE, DIMENSION(:) :: A, B PARA ALOCAR A MEMRIA DOS CONJUNTOS: ALLOCATE ( A(N1), B(N2) ) onde X um valor inteiro que define o nmero de caracteres, e N1 e N2 so variveis do tipo inteiro que definem a quantidade de elementos de cada conjunto.

i) Cada elemento de uma varivel do tipo conjunto referenciado por um nmero inteiro, chamado ndice, que corresponde ordem dele dentro do conjunto. Este ndice deve ficar entre parnteses aps o nome da varivel do tipo conjunto. O ndice ou o nmero do elemento pode ser representado por uma varivel, por exemplo, na linha READ(*,*) NOTAS(NOTA) do programa, que est dentro de um ciclo. Neste ciclo, a varivel NOTA corresponde a cada elemento da varivel NOTAS. j) Na linha MINIMO = NOTAS(1) do programa, est sendo inicializado o valor da varivel MINIMO atribuindo a ela o valor do primeiro elemento da varivel NOTAS. O mesmo ocorre nas duas linhas seguintes com as variveis MAXIMO e SOMA.

Captulo 9. Conjuntos

105

k) No ciclo definido pela linha DO NOTA = 2, QUANTIDADE_NOTAS do programa, com o emprego de comandos IF, so determinados os valores MINIMO e MAXIMO dos elementos da varivel NOTAS, assim como a SOMA dos valores de todos os elementos. 7) Algoritmo do programa: a) Definir os tipos de todas as variveis b) Ler a quantidade de elementos da varivel NOTAS, que do tipo conjunto ou vetor c) Alocar a memria para a varivel NOTAS d) Ler os valores de todos os elementos da varivel NOTAS e) Determinar os valores mnimo e mximo e a mdia da varivel NOTAS f) Escrever e identificar os valores mnimo e mximo e a mdia da varivel NOTAS 8) Executar Build, Compile para compilar o programa. 9) Gerar o programa-executvel fazendo Build, Build. 10) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 9.1, dentro da qual tem-se: a) Na primeira linha, o comentrio Entre com a quantidade de notas, resultado do comando
WRITE(*,*) "Entre com a quantidade de notas" do programa.

b) Na segunda linha, o programa pra e fica aguardando que seja fornecido o valor da varivel QUANTIDADE_NOTAS, resultado do comando READ(*,*) QUANTIDADE_NOTAS do programa. Para que o programa continue sua execuo necessrio digitar 5, por exemplo, e, em seguida, clicar na tecla Enter. c) Na terceira linha, o comentrio Entre com as notas, resultado do comando WRITE(*,*) "Entre
com as notas" do programa.

d) Na quarta linha, o programa pra e fica aguardando que sejam fornecidos os valores de todos os elementos da varivel NOTAS, resultado do comando READ(*,*) NOTAS(NOTA) do programa, que est dentro de um ciclo que comea no primeiro elemento e vai at o ltimo do conjunto. Deve-se perceber que o comando READ usado para ler o valor de apenas um elemento a cada vez; assim necessrio digitar cada nota e, em seguida, clicar na tecla Enter antes de se digitar uma nova nota. Usar, por exemplo, os valores 7, 8.5, 5.7, 4.9 e 9. e) Em seguida so apresentados os resultados correspondentes execuo do programa. 11) At entender, analisar os resultados do programa9a.f90, mostrados na Figura 9.1, considerando cada linha do programa-fonte, as explicaes descritas no item 6 acima e a mdia obtida com o uso de uma calculadora. 12) Executar novamente o programa com outros valores. At entender, analisar os novos resultados do programa9a.f90 considerando cada linha do programa-fonte, as explicaes descritas no item 6 acima e a mdia obtida com o uso de uma calculadora.
Captulo 9. Conjuntos 106

Figura 9.1 Resultado do programa9a.f90. 9.2 programa9b.f90 1) Nesta seo ser usado o programa9a.f90, da seo anterior, como base para um novo programa. Portanto, deve-se executar o seguinte no Fortran: a) Selecionar todas as linhas do programa9a.f90 com o boto esquerdo do mouse b) Edit, Copy para salvar este programa-fonte na memria do computador 2) Nesta seo ser usado o mesmo projeto da seo anterior. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa9a.f90 b) Edit, Cut para retirar o programa9a.f90 do projeto. 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa9b.f90 4) No Fortran, executar Edit, Paste para inserir o programa9a.f90 dentro do programa9b.f90. 5) Dentro do espao de edio do Fortran, na subjanela maior, alterar o programa9a.f90 para que fique exatamente igual ao texto em vermelho mostrado na Tabela 9.3. 6) Objetivos do programa: a) Utilizar trs novas funes matemticas intrnsecas do FORTRAN: MINVAL, MAXVAL e SUM, que so utilizadas com variveis do tipo conjunto b) Determinar os valores mnimo e mximo e a mdia de um conjunto de variveis do tipo real 7) Comentrios sobre o programa: a) Neste programa emprega-se exatamente o mesmo algoritmo do programa anterior, isto , os dois programas fazem exatamente o mesmo. A diferena que neste programa os valores mnimo e mximo e a mdia de um conjunto de variveis do tipo real so obtidos atravs de trs novas funes matemticas intrnsecas do FORTRAN: MINVAL, MAXVAL e SUM, que so utilizadas
Captulo 9. Conjuntos 107

com variveis do tipo conjunto. A sintaxe delas, isto , a forma de utiliz-las exemplificada na Tabela 9.3. Com isso, o que foi realizado com oito linhas de programa-fonte no programa9a.f90, empregando um ciclo e comandos IF, reduziu-se a trs linhas no programa9b.f90. Tabela 9.3 Programa9b.f90.
INTEGER NOTA, QUANTIDADE_NOTAS REAL, ALLOCATABLE, DIMENSION(:) :: NOTAS REAL MINIMO, MAXIMO, SOMA, MEDIA WRITE(*,*) "Entre com a quantidade de notas" READ(*,*) QUANTIDADE_NOTAS ALLOCATE ( NOTAS (QUANTIDADE_NOTAS) ) WRITE(*,*) "Entre com as notas" DO NOTA = 1, QUANTIDADE_NOTAS READ(*,*) NOTAS(NOTA) END DO MINIMO = MINVAL(NOTAS) MAXIMO = MAXVAL(NOTAS) SOMA = SUM(NOTAS)

MEDIA = SOMA / QUANTIDADE_NOTAS WRITE(*,*) "Nota minima = ", MINIMO WRITE(*,*) "Nota maxima = ", MAXIMO WRITE(*,*) "Nota media END = ", MEDIA

b) O comando B = MINVAL(A) determina o valor mnimo entre todos os elementos da varivel do tipo conjunto A e atribui o resultado varivel simples B. c) O comando B = MAXVAL(A) determina o valor mximo entre todos os elementos da varivel do tipo conjunto A e atribui o resultado varivel simples B. d) O comando B = SUM(A) calcula a soma dos valores de todos os elementos da varivel do tipo conjunto A e atribui o resultado varivel simples B. 8) Executar Build, Compile para compilar o programa. 9) Gerar o programa-executvel fazendo Build, Build.
Captulo 9. Conjuntos 108

10) Ao se executar o programa, atravs de Build, Execute, ocorre o mesmo j explicado no item 10 da seo 9.1 deste captulo, e o resultado obtido o mesmo j mostrado na Figura 9.1. 9.3 programa9c.f90 1) Nesta seo ser usado o mesmo projeto da seo anterior. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa9b.f90 b) Edit, Cut para retirar o programa9b.f90 do projeto. 2) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa9c.f90 3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 9.4. 4) Objetivos do programa: a) Mostrar como realizar operaes com todos os elementos de um conjunto num nico comando b) Mostrar o uso de funes matemticas intrnsecas do FORTRAN com variveis do tipo conjunto c) Mostrar duas formas de escrever o contedo de variveis do tipo conjunto 5) Comentrios sobre o programa: a) Na linha REAL, ALLOCATABLE, DIMENSION(:) :: CONJUNTO_A, CONJUNTO_B, CONJUNTO_C do programa, esto sendo definidas trs variveis (CONJUNTO_A, CONJUNTO_B e CONJUNTO_C) com as seguintes caractersticas: do tipo conjunto, devido ao comando DIMENSION(:); do tipo alocvel, devido ao comando ALLOCATABLE; e do tipo real, ou seja, cada elemento das trs variveis poder conter nmeros reais, devido ao comando REAL. b) Na linha CONJUNTO_B = CONJUNTO_A + 10 do programa, soma-se o valor 10 ao valor de cada elemento da varivel CONJUNTO_A e atribui-se o resultado a cada elemento da varivel CONJUNTO_B. Portanto, num nico comando esto sendo feitos clculos com todos os elementos de um conjunto. Para que isso seja possvel, as duas variveis do tipo conjunto tm que ter exatamente o mesmo nmero de elementos. Esta linha do programa poderia ser substituda de forma equivalente ao seguinte:
DO ELEMENTO = 1, QUANTIDADE_ELEMENTOS CONJUNTO_B(ELEMENTO) = CONJUNTO_A(ELEMENTO) + 10 END DO

c) Na linha CONJUNTO_C = EXP(CONJUNTO_A) do programa, calcula-se a exponencial do valor de cada elemento da varivel CONJUNTO_A e atribui-se o resultado a cada elemento da varivel CONJUNTO_C. Assim, num nico comando esto sendo feitos clculos com todos os elementos de um conjunto envolvendo uma funo matemtica intrnseca do FORTRAN, no caso a funo
Captulo 9. Conjuntos 109

exponencial (EXP). Mas tambm podem ser usadas outras funes como aquelas apresentadas nas Tabelas 5.5 e 5.6. Esta linha do programa tambm poderia ser substituda de forma equivalente ao seguinte:
DO ELEMENTO = 1, QUANTIDADE_ELEMENTOS CONJUNTO_C(ELEMENTO) = EXP(CONJUNTO_A(ELEMENTO)) END DO

Tabela 9.4 Programa9c.f90.


INTEGER ELEMENTO, QUANTIDADE_ELEMENTOS REAL, ALLOCATABLE, DIMENSION(:) :: CONJUNTO_A, CONJUNTO_B, CONJUNTO_C WRITE(*,*) "Entre com a quantidade de elementos do CONJUNTO_A" READ(*,*) QUANTIDADE_ELEMENTOS ALLOCATE ( CONJUNTO_A(QUANTIDADE_ELEMENTOS), & CONJUNTO_B(QUANTIDADE_ELEMENTOS), & CONJUNTO_C(QUANTIDADE_ELEMENTOS) ) WRITE(*,*) "Entre com os valores do CONJUNTO_A" DO ELEMENTO = 1, QUANTIDADE_ELEMENTOS READ(*,*) CONJUNTO_A(ELEMENTO) END DO CONJUNTO_B = CONJUNTO_A + 10 CONJUNTO_C = EXP(CONJUNTO_A) WRITE(*,*) "CONJUNTO_B = ", CONJUNTO_B DO ELEMENTO = 1, QUANTIDADE_ELEMENTOS WRITE(*,20) ELEMENTO, CONJUNTO_C(ELEMENTO) 20 FORMAT(10X, "CONJUNTO_C(", I2, ") = ", 1PE15.3 ) END DO END

d) H duas formas de escrever os valores dos elementos de uma varivel do tipo conjunto. A primeira agir da mesma forma que no caso de uma varivel simples. Por exemplo, como resultado da linha WRITE(*,*) "CONJUNTO_B = ", CONJUNTO_B do programa, sero escritos os valores de todos os elementos da varivel CONJUNTO_B, na seqncia do primeiro ao ltimo
Captulo 9. Conjuntos 110

elemento, no formato default do FORTRAN. A segunda forma escrever o valor de cada elemento atravs de um ciclo, com ou sem formato de edio. Um exemplo disso apresentado no ltimo ciclo do programa9c.f90. 6) Algoritmo do programa: a) Definir os tipos de todas as variveis b) Ler a quantidade de elementos das variveis do tipo conjunto c) Alocar a memria para as trs variveis do tipo conjunto chamadas CONJUNTO_A, CONJUNTO_B e CONJUNTO_C d) Ler os valores de todos os elementos da varivel CONJUNTO_A e) Somar o valor 10 ao valor de cada elemento da varivel CONJUNTO_A e atribuir o resultado a cada elemento da varivel CONJUNTO_B f) calcular a exponencial do valor de cada elemento da varivel CONJUNTO_A e atribuir o resultado a cada elemento da varivel CONJUNTO_C g) Escrever os valores de todos os elementos das variveis CONJUNTO_B e CONJUNTO_C 7) Executar Build, Compile para compilar o programa. 8) Gerar o programa-executvel fazendo Build, Build. 9) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 9.2, dentro da qual tem-se: a) Na primeira linha, o comentrio Entre com a quantidade de elementos do CONJUNTO_A, resultado do comando
WRITE(*,*) "Entre com a quantidade de elementos do CONJUNTO_A" do programa.

b) Na segunda linha, o programa pra e fica aguardando que seja fornecido o valor da varivel QUANTIDADE_ELEMENTOS, resultado do comando READ(*,*) QUANTIDADE_ELEMENTOS do programa. Para que o programa continue sua execuo necessrio digitar 6, por exemplo, e, em seguida, clicar na tecla Enter. c) Na terceira linha, o comentrio Entre com os valores do CONJUNTO_A, resultado do comando
WRITE(*,*) "Entre com os valores do CONJUNTO_A" do programa.

d) Na quarta linha, o programa pra e fica aguardando que sejam fornecidos os valores de todos os elementos da varivel CONJUNTO_A, resultado do comando
READ(*,*) CONJUNTO_A(ELEMENTO) do programa, que est dentro de um ciclo que comea no primeiro

elemento e vai at o ltimo do conjunto. Deve-se perceber que o comando READ usado para ler o valor de apenas um elemento a cada vez; assim necessrio digitar cada valor e, em seguida, clicar na tecla Enter antes de se digitar um novo valor. Usar, por exemplo, os valores 1, 2, 3, 4, 5 e 6. e) Em seguida so apresentados os resultados correspondentes execuo do programa.
Captulo 9. Conjuntos 111

Figura 9.2 Resultado do programa9c.f90. 10) At entender, analisar os resultados do programa9c.f90, mostrados na Figura 9.2, considerando cada linha do programa-fonte e as explicaes descritas no item 5 acima. 11) Executar novamente o programa com outros dados. At entender, analisar os novos resultados considerando cada linha do programa-fonte e as explicaes descritas no item 5 acima. 9.4 programa9d.f90 1) Nesta seo ser usado o mesmo projeto da seo anterior. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa9c.f90 b) Edit, Cut para retirar o programa9c.f90 do projeto. 2) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa9d.f90 3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 9.5. 4) Objetivo do programa: aplicar os conceitos j vistos nas sees anteriores deste captulo ao caso de uma progresso aritmtica (P.A.) onde os valores dos elementos da varivel do tipo conjunto so inteiros. 5) Algoritmo do programa: a) Definir os tipos de todas as variveis b) Ler o nmero de termos da progresso aritmtica (P.A.) c) Alocar a memria para a varivel do tipo conjunto chamada A
Captulo 9. Conjuntos 112

d) Ler os valores do primeiro termo da P.A. e a diferena entre dois termos subseqentes e) Calcular os valores dos termos da P.A. e atribu-los varivel A f) Calcular a soma dos valores de todos os elementos da P.A. g) Escrever os valores de todos os elementos da P.A. e a soma deles Tabela 9.5 Programa9d.f90.
INTEGER TERMO, N, SN, D INTEGER, ALLOCATABLE, DIMENSION(:) :: A WRITE(*,*) "Todas as variaveis sao do tipo inteiro" WRITE(*,*) "Entre com o numero de termos da P.A." READ(*,*) N ALLOCATE ( A(N) ) WRITE(*,*) "Entre com o primeiro termo da P.A." READ(*,*) A(1) WRITE(*,*) "Entre com a diferenca entre dois termos subsequentes" READ(*,*) D DO TERMO = 2, N A(TERMO) = A(1) + (TERMO - 1) * D END DO SN = N * ( A(1) + A(N) ) / 2 DO TERMO = 1, N WRITE(*,10) TERMO, A(TERMO) 10 FORMAT(3X, "A(", I3, ") = ", I8 ) END DO WRITE(*,*) "Soma dos termos = ", SN END

6) Executar Build, Compile para compilar o programa. 7) Gerar o programa-executvel fazendo Build, Build.

Captulo 9. Conjuntos

113

8) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 9.3, dentro da qual so solicitados os dados (usar, por exemplo, 10, 1 e 2) e, em seguida, apresentados os resultados da execuo do programa. 9) At entender, analisar os resultados do programa9d.f90, mostrados na Figura 9.3, considerando cada linha do programa-fonte. 10) Executar novamente o programa com outros dados. At entender, analisar os novos resultados considerando cada linha do programa-fonte. 11) Encerrar a sesso seguindo o procedimento-padro.

Figura 9.3 Resultado do programa9d.f90. 9.5 EXERCCIOS Exerccio 9.1 Adaptar o programa9d.f90 para escrever os valores dos termos da progresso aritmtica num arquivo, bem como a soma dos valores de todos os termos Exerccio 9.2 Adaptar o programa9d.f90 para calcular e escrever os valores dos termos de uma progresso geomtrica num arquivo, bem como a soma dos valores de todos os termos Exerccio 9.3 Editar um programa-fonte em FORTRAN para executar o seguinte algoritmo (passos): 1) Definir os tipos de todas as variveis, sendo uma delas do tipo conjunto para caracteres, chamada NOMES
Captulo 9. Conjuntos 114

2) Ler a quantidade de elementos da varivel NOMES 3) Alocar a memria para a varivel NOMES 4) Ler os contedos de todos os elementos da varivel NOMES 5) Escrever num arquivo o contedo de cada elemento da varivel NOMES Exerccio 9.4 Adaptar o programa9b.f90 para: 1) Escrever num arquivo os valores das notas e os resultados calculados 2) Calcular e escrever o desvio-padro (D) das notas, definido por

(N
i =1

Ni )2

onde N o nmero de notas, Nm a mdia das notas, e Ni cada nota.


Exerccio 9.5

Editar um programa-fonte em FORTRAN para executar o seguinte algoritmo (passos): 1) Ler os valores inteiros de cinco variveis 2) Ordenar e escrever as cinco variveis em ordem crescente de valor 3) Ordenar e escrever as cinco variveis em ordem decrescente de valor
Exerccio 9.6

Editar um programa-fonte em FORTRAN para executar o seguinte algoritmo (passos): 1) Ler os valores inteiros de cinco variveis 2) Determinar e escrever quais variveis tm valor par 3) Determinar e escrever quais variveis tm valor mpar 4) Calcular a soma dos valores pares 5) Calcular a soma dos valores mpares

Captulo 9. Conjuntos

115

Captulo 10. MATRIZES

OBJETIVOS DO CAPTULO Conceitos de: conjunto multidimensional (matriz), ciclo implcito, ciclo duplo Comandos do FORTRAN: DIMENSION(:,:), MATMUL

10.1 programa10a.f90 Para inicializar as atividades deste captulo, deve-se executar: 1) Para acessar o programa Fortran, no Windows: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa10 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa10a.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 10.1. 5) Objetivos do programa: a) Aplicar os comandos DIMENSION, ALLOCATABLE e ALLOCATE a um conjunto bidimensional (matriz) do tipo inteiro b) Ler os elementos da matriz e escrev-los utilizando ciclos duplos 6) Comentrios sobre o programa: a) Neste programa os comandos DIMENSION, ALLOCATABLE e ALLOCATE so aplicados a uma varivel do tipo conjunto bidimensional, que tambm chamada de matriz. A sintaxe deles, isto , a forma de utiliz-los mostrada na Tabela 10.2. b) Em FORTRAN, conjunto bidimensional um conjunto no qual so necessrios dois ndices para localizar cada elemento em sua estrutura. Portanto, os conjuntos empregados no captulo 9 podem ser classificados como conjuntos unidimensionais pois basta um nico ndice para localizar cada elemento dentro deles. c) Generalizando, existem os conjuntos multidimensionais, isto , aqueles nos quais so necessrios diversos ndices (2, 3, etc) para localizar cada elemento dentro deles. Em FORTRAN, os conjuntos podem ter at sete dimenses ou ndices. Um exemplo de conjunto tridimensional aquele onde se armazenam as coordenadas X, Y e Z de um slido tridimensional.

Captulo 10. Matrizes

116

d) Todos os conceitos vistos no captulo 9 para conjuntos unidimensionais tambm so vlidos para conjuntos multidimensionais. e) O comando DIMENSION(:,:) usado para definir uma varivel do tipo conjunto bidimensional. Tabela 10.1 Programa10a.f90.
INTEGER LINHA, LINHAS, COLUNA, COLUNAS INTEGER, ALLOCATABLE, DIMENSION(:,:) :: MATRIZ WRITE(*,*) "Entre com o numero de linhas da matriz" READ(*,*) LINHAS WRITE(*,*) "Entre com o numero de colunas da matriz" READ(*,*) COLUNAS ALLOCATE ( MATRIZ ( LINHAS, COLUNAS ) ) DO LINHA = 1, LINHAS WRITE(*,*) "Entre com os valores dos elementos da matriz da linha =", LINHA DO COLUNA = 1, COLUNAS READ(*,*) MATRIZ(LINHA,COLUNA) END DO END DO WRITE(*,*) "Escrita da MATRIZ sem formato" WRITE(*,*) MATRIZ WRITE(*,*) "Escrita da MATRIZ na mesma sequencia dos dados" DO LINHA = 1, LINHAS DO COLUNA = 1, COLUNAS WRITE(*,1) LINHA, COLUNA, MATRIZ(LINHA,COLUNA) 1 FORMAT( 3X, "MATRIZ(", I1, ",", I1, ") = ", I5) END DO END DO END

f) Uma das principais aplicaes de conjuntos uni e bidimensionais a resoluo de sistemas de equaes algbricas representados por

[A][X ]

[B]

(10.1)

Captulo 10. Matrizes

117

onde [A] a matriz (conjunto bidimensional) dos coeficientes do sistema de equaes; [X] o vetor (conjunto unidimensional) incgnita, isto , representa as variveis a determinar com a resoluo do sistema; e [B] o vetor (conjunto unidimensional) independente, ou seja, ele contm valores conhecidos. g) Na linha INTEGER, ALLOCATABLE, DIMENSION(:,:) :: MATRIZ do programa, define-se a varivel chamada MATRIZ com as seguintes caractersticas: do tipo conjunto bidimensional (matriz), devido ao comando DIMENSION(:,:); do tipo alocvel, devido ao comando ALLOCATABLE; e do tipo inteiro, ou seja, cada elemento da varivel MATRIZ poder conter nmeros inteiros, devido ao comando INTEGER. h) Na linha ALLOCATE ( MATRIZ ( LINHAS, COLUNAS ) ) do programa, utilizando-se o comando ALLOCATE e as variveis LINHAS e COLUNAS, que so dados do programa, define-se, respectivamente, quantos elementos existem em cada linha e em cada coluna da varivel MATRIZ e reserva-se o espao de memria correspondente. Tabela 10.2 Sintaxe de comandos para variveis do tipo matriz (conjunto bidimensional).
PARA DEFINIR O TIPO DE VARIAVL: REAL, ALLOCATABLE, DIMENSION(:,:) :: A, B INTEGER, ALLOCATABLE, DIMENSION(:,:) :: A, B CHARACTER(X), ALLOCATABLE, DIMENSION(:,:) :: A, B PARA ALOCAR A MEMRIA DOS CONJUNTOS: ALLOCATE ( A(L,C), B(L,C) ) onde X um valor inteiro que define o nmero de caracteres, L e C so variveis do tipo inteiro que definem, respectivamente, a quantidade de elementos numa linha e numa coluna das matrizes A e B.

i) Cada elemento de uma varivel do tipo conjunto bidimensional referenciado por dois nmeros inteiros, chamado ndices, que correspondem ordem dele dentro do conjunto. O primeiro ndice corresponde linha que o elemento ocupa dentro da matriz e o segundo, coluna. Estes ndices devem ficar dentro de parnteses, e separados por vrgula, aps o nome da varivel do tipo conjunto bidimensional. Os ndices ou os nmeros do elemento podem ser representados por variveis, por exemplo, na linha READ(*,*) MATRIZ(LINHA,COLUNA) do programa, que est dentro de um ciclo duplo.

Captulo 10. Matrizes

118

j) Ciclo duplo quando tem-se um ciclo dentro de outro. So usados dois ciclos duplos no programa10a.f90. Um deles
DO LINHA = 1, LINHAS DO COLUNA = 1, COLUNAS WRITE(*,1) LINHA, COLUNA, MATRIZ(LINHA,COLUNA) 1 FORMAT( 3X, "MATRIZ(", I1, ",", I1, ") = ", I5) END DO END DO

Recomenda-se identar, isto , deslocar para a direita todas as linhas do programa que esto entre os comandos DO e END DO. Assim, facilmente se percebe os comandos que compem o ciclo. No caso de ciclos duplos, deve-se usar uma identao para cada ciclo, conforme o exemplo mostrado neste item, acima. k) So usadas duas formas para escrever os valores dos elementos de uma varivel do tipo conjunto bidimensional. A primeira agir da mesma forma que no caso de uma varivel simples, por exemplo, a linha WRITE(*,*) MATRIZ do programa. Nesta forma a matriz escrita no formato default do FORTRAN que : primeiro, escrever os valores de todos os elementos da primeira coluna, indo da primeira ltima linha; repetir o procedimento para a segunda coluna, e assim por diante at a ltima coluna. A segunda forma escrever o valor de cada elemento atravs de um ciclo duplo, com ou sem formato de edio. Um exemplo disso apresentado no final do programa10a.f90 7) Algoritmo do programa: a) Definir os tipos de todas as variveis b) Ler a quantidade de elementos em cada linha e coluna da varivel MATRIZ, que do tipo conjunto bidimensional c) Alocar a memria para a varivel MATRIZ d) Ler os valores de todos os elementos da varivel MATRIZ e) Escrever o contedo da varivel MATRIZ sem utilizar formato de edio f) Escrever os dois ndices e o valor correspondente a cada elemento da varivel MATRIZ utilizando formatos de edio 8) Executar Build, Compile para compilar o programa. 9) Gerar o programa-executvel fazendo Build, Build. 10) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 10.1, dentro da qual tem-se: a) Na primeira linha, o comentrio Entre com o numero de linhas da matriz, resultado do comando
WRITE(*,*) "Entre com o numero de linhas da matriz" do programa.

Captulo 10. Matrizes

119

b) Na segunda linha, o programa pra e fica aguardando que seja fornecido o valor da varivel LINHAS, resultado do comando READ(*,*) LINHAS do programa. Para que o programa continue sua execuo necessrio digitar 3, por exemplo, e, em seguida, clicar na tecla Enter. c) Na terceira linha, o comentrio Entre com o numero de colunas da matriz, resultado do comando
WRITE(*,*) "Entre com o numero de colunas da matriz" do programa.

d) Na quarta linha, o programa pra e fica aguardando que seja fornecido o valor da varivel COLUNAS, resultado do comando READ(*,*) COLUNAS do programa. Para que o programa continue sua execuo necessrio digitar 2, por exemplo, e, em seguida, clicar na tecla Enter. e) Na quinta linha, o comentrio Entre com os valores dos elementos da matriz da linha = 1, resultado do comando WRITE(*,*) "Entre com os valores dos elementos da matriz da
linha =", LINHA do programa.

Figura 10.1 Resultado do programa10a.f90. f) Na sexta linha, o programa pra e fica aguardando que sejam fornecidos os valores de todos os elementos da primeira linha da matriz, resultado dos comandos
DO COLUNA = 1, COLUNAS READ(*,*) MATRIZ(LINHA,COLUNA) END DO

do programa, que contm um ciclo que comea no elemento da primeira coluna e vai at a ltima. Deve-se perceber que o comando READ usado para ler o valor de apenas um elemento a cada vez; assim necessrio digitar cada valor e, em seguida, clicar na tecla Enter antes de se digitar

Captulo 10. Matrizes

120

um novo valor. Usar, por exemplo, os valores 1, 4, 2, 5, 3 e 6. Estes dados, nesta seqncia, correspondem seguinte matriz:
1 4 2 5 3 6

(10.2)

g) Em seguida so apresentados os resultados correspondentes execuo do programa. 11) At entender, analisar os resultados do programa10a.f90, mostrados na Figura 10.1, considerando cada linha do programa-fonte e as explicaes descritas no item 6 acima. 12) Executar novamente o programa com outros dados. At entender, analisar os novos resultados do programa10a.f90 considerando cada linha do programa-fonte e as explicaes descritas no item 6 acima. 10.2 programa10b.f90 1) Nesta seo ser usado o programa10a.f90, da seo anterior, como base para um novo programa. Portanto, deve-se executar o seguinte no Fortran: a) Selecionar todas as linhas do programa10a.f90 com o boto esquerdo do mouse b) Edit, Copy para salvar este programa-fonte na memria do computador 2) Nesta seo ser usado o mesmo projeto da seo anterior. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa10a.f90 b) Edit, Cut para retirar o programa10a.f90 do projeto. 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa10b.f90 4) No Fortran, executar Edit, Paste para inserir o programa10a.f90 dentro do programa10b.f90. 5) Dentro do espao de edio do Fortran, na subjanela maior, alterar o programa10a.f90 para que fique exatamente igual ao texto em vermelho mostrado na Tabela 10.3. 6) Objetivos do programa: a) Aplicar os comandos DIMENSION, ALLOCATABLE e ALLOCATE a conjuntos bidimensionais (matrizes) do tipo real b) Ler valores de elementos de matrizes e escrev-los num arquivo utilizando ciclos simples e implcitos c) Realizar operaes matemticas com matrizes 7) Comentrios sobre o programa:

Captulo 10. Matrizes

121

a) Com os ciclos usados no programa da seo anterior, programa10a.f90, consegue-se ler apenas um elemento da matriz por vez, isto , a cada comando Enter. J neste programa10b.f90, com o bloco de linhas do programa
DO LINHA = 1, LINHAS WRITE(*,*) "Entre com os valores dos elementos da MATRIZ_A da linha =", LINHA READ(*,*) ( MATRIZ_A(LINHA,COLUNA), COLUNA = 1, COLUNAS ) END DO

consegue-se ler os valores de todos os elementos de cada linha da MATRIZ_A. Isso possvel porque: existe um ciclo externo, definido pela linha DO LINHA = 1, LINHAS do programa, que a cada execuo percorre uma linha da matriz; e tambm existe um ciclo chamado de implcito na linha READ(*,*) ( MATRIZ_A(LINHA,COLUNA), COLUNA = 1, COLUNAS ) do programa, que a cada execuo percorre todas as colunas da matriz. b) O chamado ciclo implcito ou aninhado utilizado sem os comandos DO e END DO, conforme exemplificado na leitura e escrita da MATRIZ_A e na escrita da MATRIZ_B e da MATRIZ_C no programa10b.f90. Tabela 10.3 Programa10b.f90.
USE PORTLIB INTEGER LINHA, LINHAS, COLUNA, COLUNAS, CONSTANTE, VER REAL,ALLOCATABLE,DIMENSION(:,:) :: MATRIZ_A, MATRIZ_B, MATRIZ_C WRITE(*,*) "Entre com o valor da CONSTANTE (inteiro)" READ(*,*) CONSTANTE WRITE(*,*) "Entre com o numero de linhas das matrizes (inteiro)" READ(*,*) LINHAS WRITE(*,*) "Entre com o numero de colunas das matrizes (inteiro)" READ(*,*) COLUNAS ALLOCATE ( MATRIZ_A(LINHAS,COLUNAS), MATRIZ_B(LINHAS,COLUNAS), & MATRIZ_C(LINHAS,COLUNAS) ) DO LINHA = 1, LINHAS WRITE(*,*) "Entre com os valores dos elementos da MATRIZ_A da linha =", LINHA READ(*,*) ( MATRIZ_A(LINHA,COLUNA), COLUNA = 1, COLUNAS ) END DO DO LINHA = 1, LINHAS DO COLUNA = 1, COLUNAS MATRIZ_B(LINHA,COLUNA) = CONSTANTE * MATRIZ_A(LINHA,COLUNA)

Captulo 10. Matrizes

122

END DO END DO DO LINHA = 1, LINHAS DO COLUNA = 1, COLUNAS MATRIZ_C(LINHA,COLUNA) = MATRIZ_A(LINHA,COLUNA) + MATRIZ_B(LINHA,COLUNA) END DO END DO OPEN(10, FILE="SAIDA10B.TXT") WRITE(10,31) CONSTANTE 31 FORMAT("CONSTANTE = ", I5, /) WRITE(10,32) 32 FORMAT(3X, "*** MATRIZ_A (dados) ***") DO LINHA = 1, LINHAS WRITE(10,33) ( MATRIZ_A(LINHA,COLUNA), COLUNA = 1, COLUNAS ) 33 FORMAT( 10 (3X, 1PE10.3 ) ) END DO WRITE(10,41) 41 FORMAT(1/, 3X, "*** MATRIZ_B (CONSTANTE * MATRIZ_A) ***") DO LINHA = 1, LINHAS WRITE(10,33) ( MATRIZ_B(LINHA,COLUNA), COLUNA = 1, COLUNAS ) END DO WRITE(10,51) 51 FORMAT(1/, 3X, "*** MATRIZ_C (MATRIZ_A + MATRIZ_B) ***") DO LINHA = 1, LINHAS WRITE(10,33) ( MATRIZ_C(LINHA,COLUNA), COLUNA = 1, COLUNAS ) END DO CLOSE(10) VER = SYSTEM("Notepad SAIDA10B.TXT") END

c) Com o bloco de linhas do programa


DO LINHA = 1, LINHAS DO COLUNA = 1, COLUNAS

Captulo 10. Matrizes

123

MATRIZ_B(LINHA,COLUNA) = CONSTANTE * MATRIZ_A(LINHA,COLUNA) END DO END DO

o valor de cada elemento da MATRIZ_A multiplicado pela varivel CONSTANTE e o resultado atribudo a cada elemento da MATRIZ_B. d) Com o bloco de linhas do programa
DO LINHA = 1, LINHAS DO COLUNA = 1, COLUNAS MATRIZ_C(LINHA,COLUNA) = MATRIZ_A(LINHA,COLUNA) + MATRIZ_B(LINHA,COLUNA) END DO END DO

o valor de cada elemento da MATRIZ_A adicionado ao valor de cada elemento da MATRIZ_B e o resultado atribudo a cada elemento da MATRIZ_C. e) Com o bloco de linhas do programa
DO LINHA = 1, LINHAS WRITE(10,33) ( MATRIZ_A(LINHA,COLUNA), COLUNA = 1, COLUNAS ) 33 FORMAT( 10 (3X, 1PE10.3 ) ) END DO

escreve-se o contedo da varivel MATRIZ_A em formato de matriz atravs de um ciclo simples (externo) e um ciclo implcito (interno). O formato de edio empregado 10 (3X, 1PE10.3 ) permite que sejam escritos at 10 elementos a cada linha com trs colunas entre cada um (3X), utilizando o formato 1PE10.3 para nmeros reais. f) Com conjuntos multidimensionais, tambm se pode fazer simultaneamente operaes com todos os elementos, conforme j visto no programa9c.f90 do captulo 9 para conjuntos unidimensionais. Por exemplo, as cinco linhas de programa mostradas no item c acima podem ser substitudas de forma equivalente a apenas
MATRIZ_B = CONSTANTE * MATRIZ_A

E as cinco linhas de programa mostradas no item d acima podem ser substitudas de forma equivalente a apenas
MATRIZ_C = MATRIZ_A + MATRIZ_B

g) Com conjuntos multidimensionais, tambm se pode utilizar as funes intrnsecas das Tabelas 5.5 e 5.6, conforme j visto no programa9c.f90 do captulo 9 para conjuntos unidimensionais. 8) Algoritmo do programa: a) Definir os tipos de todas as variveis b) Ler o valor do tipo inteiro de uma constante e a quantidade de elementos em cada linha e coluna das variveis MATRIZ_A, MATRIZ_B e MATRIZ_C, que so do tipo conjunto bidimensional c) Alocar memria para as trs variveis do tipo matriz d) Ler os valores de todos os elementos da varivel MATRIZ_A no formato de matriz
Captulo 10. Matrizes 124

e) calcular o valor de cada elemento da MATRIZ_B atravs da multiplicao do valor de cada elemento da MATRIZ_A pela varivel CONSTANTE f) calcular o valor de cada elemento da MATRIZ_C atravs da adio do valor de cada elemento da MATRIZ_A pelo valor de cada elemento da MATRIZ_B g) Escrever num arquivo o valor da CONSTANTE e o contedo das variveis MATRIZ_A, MATRIZ_B e MATRIZ_C em formato de matriz com os dois ndices de cada elemento 9) Executar Build, Compile para compilar o programa. 10) Gerar o programa-executvel fazendo Build, Build. 11) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 10.2, dentro da qual tem-se: a) Na primeira linha, o comentrio Entre com o valor da CONSTANTE (inteiro), resultado do comando WRITE(*,*) "Entre com o valor da CONSTANTE (inteiro)" do programa. b) Na segunda linha, o programa pra e fica aguardando que seja fornecido o valor da varivel CONSTANTE, resultado do comando READ(*,*) CONSTANTE do programa. Para que o programa continue sua execuo necessrio digitar 5, por exemplo, e, em seguida, clicar na tecla Enter.

Figura 10.2 Janela DOS do programa10b.f90. c) Na terceira linha, o comentrio Entre com o numero de linhas das matrizes (inteiro), resultado do comando WRITE(*,*) "Entre com o numero de linhas das matrizes (inteiro)" do programa. d) Na quarta linha, o programa pra e fica aguardando que seja fornecido o valor da varivel LINHAS, resultado do comando READ(*,*) LINHAS do programa. Para que o programa continue sua execuo necessrio digitar 3, por exemplo, e, em seguida, clicar na tecla Enter. e) Na quinta linha, o comentrio Entre com o numero de colunas das matrizes (inteiro), resultado do comando WRITE(*,*) "Entre com o numero de colunas das matrizes (inteiro)" do programa.
Captulo 10. Matrizes 125

f) Na sexta linha, o programa pra e fica aguardando que seja fornecido o valor da varivel COLUNAS, resultado do comando READ(*,*) COLUNAS do programa. Para que o programa continue sua execuo necessrio digitar 2, por exemplo, e, em seguida, clicar na tecla Enter. g) Na stima linha, o comentrio Entre com os valores dos elementos da MATRIZ_A da linha = 1, resultado do comando WRITE(*,*) "Entre com os valores dos elementos da MATRIZ_A
da linha =", LINHA do programa.

h) Na oitava linha, o programa pra e fica aguardando que sejam fornecidos os valores de todos os elementos da primeira linha da matriz; digitar 1 4, por exemplo, e, em seguida, clicar na tecla Enter. Para a segunda linha da matriz, digitar 2 5, por exemplo, e, em seguida, clicar na tecla Enter. Para a terceira linha da matriz, digitar 3 6, por exemplo, e, em seguida, clicar na tecla Enter. Estes dados, nesta seqncia, correspondem seguinte matriz:
1 4 2 5 3 6

(10.3)

i) Em seguida, o aplicativo Notepad apresenta os resultados correspondentes execuo do programa no arquivo SAIDA10B.TXT, mostrado na Figura 10.3.

Figura 10.3 Arquivo SAIDA10B.TXT do programa10b.f90. 12) At entender, analisar os resultados do programa10b.f90, mostrados na Figura 10.3, considerando cada linha do programa-fonte e as explicaes descritas no item 7 acima.

Captulo 10. Matrizes

126

13) Executar novamente o programa com outros dados. At entender, analisar os novos resultados do programa10b.f90 considerando cada linha do programa-fonte e as explicaes descritas no item 7 acima. 14) Encerrar a sesso seguindo o procedimento-padro. 10.3 EXERCCIOS Exerccio 10.1 Editar um programa-fonte em FORTRAN para executar o seguinte algoritmo (passos): 1) Ler o valor de uma constante 2) Ler os valores reais da Matriz_A 3) Dividir pela constante o valor de cada elemento da Matriz_A e atribuir o resultado Matriz_B 4) Escrever num arquivo a Matriz_B identificando os ndices de cada elemento Exerccio 10.2 Editar um programa-fonte em FORTRAN para executar o seguinte algoritmo (passos): 1) Ler os valores reais da Matriz_A 2) Calcular a exponencial do valor de cada elemento da Matriz_A e atribuir o resultado Matriz_B 3) Escrever num arquivo a Matriz_B identificando os ndices de cada elemento Exerccio 10.3 Editar um programa-fonte em FORTRAN para calcular o produto de duas matrizes [A] x [B], executando o seguinte algoritmo (passos): 1) Ler os seguintes dados (suficientes para resolver o problema): a) nmero de linhas da Matriz_A b) nmero de colunas da Matriz_A c) nmero de colunas da Matriz_B d) Valores dos elementos da Matriz_A e) Valores dos elementos da Matriz_B 2) Calcular o valor de cada elemento da Matriz_C que resulta do produto da Matriz_A pela Matriz_B; para fazer isso, sugere-se analisar o produto literal entre uma matriz 2x2 com outra 2x1; depois, uma 3x2 com outra 2x2; deduzir o algoritmo e implement-lo 3) Escrever num arquivo todos os dados lidos e a Matriz_C identificando todas as variveis e elementos 4) Calcular a Matriz_D atravs da seguinte linha inserida dentro do programa-fonte: Matriz_D = MATMUL ( Matriz_A, Matriz_B )

Captulo 10. Matrizes

127

onde o comando MATMUL uma funo intrnseca do FORTRAN que calcula o produto de duas matrizes 5) Escrever num arquivo a Matriz_D identificando seus elementos; ela deve ser idntica Matriz_C

Captulo 10. Matrizes

128

Captulo 11. GRFICOS COM WGNUPLOT

OBJETIVOS DO CAPTULO Aprender a utilizar o aplicativo Wgnuplot para fazer grficos Aprender a utilizar o aplicativo Wgnuplot interativamente com um programa em FORTRAN

11.1 INSERO DO APLICATIVO WGNUPLOT NUM PROJETO Para inicializar as atividades deste captulo, deve-se executar: 1) Para acessar o programa Fortran, no Windows: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa11 3) Acessar o site da disciplina em ftp://ftp.demec.ufpr.br/Disciplinas/Tm102/Marchi/ 4) Clicar com o boto do lado direito do mouse sobre o arquivo WGNUPLOT.EXE 5) Escolher a opo Save Target As 6) Na opo Save in, localizar o diretrio do projeto 7) Clicar no boto Save 8) Repetir os itens 3 a 7 acima para os arquivos WGNUPLOT.HLP e WGNUPLOT.MNU 11.2 UTILIZAO BSICA DO WGNUPLOT 1) O Wgnuplot um software livre utilizado para fazer grficos bi e tridimensionais. Um manual bsico sobre ele est disponvel em ftp://ftp.demec.ufpr.br/Disciplinas/Tm102/Marchi/Wgnuplot.pdf 2) Para iniciar sua utilizao, basta clicar duas vezes sobre o arquivo Wgnuplot.exe ou Application. O resultado deve ser o mostrado na Figura 11.1. 3) Informaes detalhadas sobre a utilizao do Wgnuplot podem ser vistas no menu principal do programa, na opo Help, Index 4) Informaes detalhadas sobre os comandos do Wgnuplot podem ser vistas no menu principal do programa, na opo Help, Index, commands. Escolher, por exemplo, o comando plot. 5) Para gerar um grfico, devem ser executados os comandos adequados na chamada linha de comando do aplicativo Wgnuplot, que a linha indicada por gnuplot> na Figura 11.1, e onde o cursor fica aps ser acionado o programa.

Captulo 11. Grficos com Wgnuplot

129

6) O comando plot usado para mostrar o grfico de funes definidas atravs de um arquivo de dados ou de funes pr-definidas no Wgnuplot ou, ainda, de funes criadas pelo usurio. Por exemplo, para visualizar o grfico da funo seno, deve-se digitar plot sin(x) na linha de comando do Wgnuplot, conforme mostrado na Figura 11.2, e, em seguida, clicar na tecla Enter. Surgir uma nova janela com o grfico da funo seno, mostrado na Figura 11.3. Nas abscissas apresentado x em radianos, e nas ordenadas, o valor da funo seno.

Figura 11.1 Janela inicial do aplicativo Wgnuplot, verso 3.5.

Figura 11.2 Insero do comando plot sin(x) na linha de comando do aplicativo Wgnuplot.

Captulo 11. Grficos com Wgnuplot

130

7) O comando set xrange[x1:x2] usado para definir o intervalo dos valores das abscissas, isto , x, mostrado no grfico, onde x1 e x2 so os valores mnimo e mximo, respectivamente. Por exemplo, para definir o intervalo dos valores de x entre os nmeros 0 e 5, na linha de comando do Wgnuplot, deve-se digitar set xrange[0:5]. Em seguida, clicar na tecla Enter. Sempre que um novo comando inserido para alterar o grfico, como o set xrange, para visualizar o novo grfico necessrio digitar replot na linha de comando e clicar na tecla Enter. Em seguida, surge o novo grfico. Portanto, para visualizar o resultado do comando set xrange[0:5], deve-se digitar replot e, em seguida, clicar na tecla Enter.

Figura 11.3 Grfico da funo seno conforme o comando do item 6 da seo 11.2. 8) O comando set yrange[y1:y2] usado para definir o intervalo dos valores das ordenadas, isto , y, mostrado no grfico, onde y1 e y2 so os valores mnimo e mximo, respectivamente. Por exemplo, para definir o intervalo dos valores de y entre os nmeros 0 e 1, na linha de comando do Wgnuplot, deve-se digitar set yrange[0:1]. Em seguida, clicar na tecla Enter. Para visualizar o resultado, digitar replot e, em seguida, clicar na tecla Enter.

Captulo 11. Grficos com Wgnuplot

131

9) O comando set grid usado para facilitar a leitura dos valores de uma funo atravs de uma malha ou grade no grfico. Na linha de comando do Wgnuplot, digitar set grid e clicar na tecla Enter. Para visualizar o resultado, digitar replot e, em seguida, clicar na tecla Enter. 10) O comando set xlabel nomex usado para inserir uma legenda no eixo das abscissas, onde nomex o nome da legenda a ser inserida, que deve ficar entre aspas. Aps clicar na tecla de aspas, deve-se clicar na tecla de espao em branco para que as aspas apaream. Por exemplo, na linha de comando do Wgnuplot, digitar set xlabel x e clicar na tecla Enter. Para visualizar o resultado, digitar replot e, em seguida, clicar na tecla Enter. 11) O comando set ylabel nomey usado para inserir uma legenda no eixo das ordenadas, onde nomey o nome da legenda a ser inserida, que deve ficar entre aspas. Por exemplo, na linha de comando do Wgnuplot, digitar set ylabel seno e clicar na tecla Enter. Para visualizar o resultado, digitar replot e, em seguida, clicar na tecla Enter. 12) O comando set title nome usado para inserir um ttulo para o grfico, onde nome o nome do ttulo a ser inserido, que deve ficar entre aspas. Por exemplo, na linha de comando do Wgnuplot, digitar set title Teste do aplicativo Wgnuplot e clicar na tecla Enter. Para visualizar o resultado, digitar replot e, em seguida, clicar na tecla Enter. 13) O comando replot tambm usado para adicionar funes ou curvas a um grfico j existente. Por exemplo, na linha de comando do Wgnuplot, digitar replot cos(x) e clicar na tecla Enter. A relao de comandos dos itens 6 a 13 desta seo inseridos no Wgnuplot pode ser vista na Figura 11.4. O grfico correspondente mostrado na Figura 11.5. 14) Entrar com o comando set xrange[0:1] e testar as seguintes funes: a) plot x b) plot x**2 15) O comando splot usado para fazer grficos tridimensionais. Testar os seguintes exemplos: a) splot x+y b) splot x*y c) splot x**2 16) Para encerrar o Wgnuplot, deve-se executar File, Exit 11.3 UTILIZAO DO WGNUPLOT PARA FAZER GRFICO DE UM ARQUIVO DE DADOS 1) O aplicativo Wgnuplot pode ser usado para fazer grfico de um arquivo de dados. Isso ser exemplificado com o arquivo dados.txt. Para cri-lo com o aplicativo Notepad, executar o seguinte: a) Start, Programs, Accessories, Notepad

Captulo 11. Grficos com Wgnuplot

132

Figura 11.4 Comandos usados nos itens 6 a 13 da seo 11.2. b) Dentro do espao de edio do Notepad, digitar os seguintes nmeros em duas colunas separadas por pelo menos um espao em branco: 0 1 2 3 4 5 c) File, Save d) Na janela Save As, dentro do campo File Name, digitar dados.txt e) Ainda na janela Save As, dentro do campo Save in:, selecionar o diretrio do projeto. Em seguida, clicar sobre o boto Save. f) No aplicativo Notepad, executar File, Exit 2) Num arquivo de dados, o aplicativo Wgnuplot interpreta a primeira coluna como os dados do eixo x (abscissas) e a segunda, do eixo y (ordenadas). 3) Inicializar o aplicativo Wgnuplot clicando duas vezes sobre o arquivo Wgnuplot.exe ou Application 0 1 4 9 7 0

Captulo 11. Grficos com Wgnuplot

133

4) Na linha de comando do Wgnuplot, digitar os seguintes comandos j vistos na seo anterior, clicando na tecla Enter aps cada um deles: set xlabel x set ylabel y set title Teste do Wgnuplot set grid

Figura 11.5 Grfico resultante dos comandos usados nos itens 6 a 13 da seo 11.2. 5) O comando set data style linespoints utilizado para colocar um smbolo (crculo, quadrado etc) em cada par x-y dos dados e unir os pontos com retas entre eles. Na linha de comando do aplicativo Wgnuplot, digitar set data style linespoints e, em seguida, clicar na tecla Enter. 6) Para gerar o grfico com as coordenadas x-y do arquivo dados.txt, na linha de comando do aplicativo Wgnuplot, digitar plot dados.txt e, em seguida, clicar na tecla Enter. Dever surgir o grfico correspondente aos comandos usados nesta seo, que mostrado na Figura 11.6. 7) Encerrar o Wgnuplot com File, Exit

Captulo 11. Grficos com Wgnuplot

134

Figura 11.6 Grfico resultante dos comandos usados nos itens 1 a 6 da seo 11.3. 11.4 UTILIZAO DO WGNUPLOT COM ARQUIVO DE COMANDOS 1) O aplicativo Wgnuplot tambm pode ser usado para fazer grfico de um arquivo de dados utilizando um arquivo com os comandos do prprio Wgnuplot. Isso facilita muito a gerao de grficos de forma automatizada. A seguir, este novo procedimento aplicado ao mesmo exemplo da seo anterior utilizando o arquivo comandos.txt. Para cri-lo com o aplicativo Notepad, executar o seguinte: a) Start, Programs, Accessories, Notepad b) Dentro do espao de edio do Notepad, digitar os seguintes comandos do Wgnuplot: set xlabel x set ylabel y set title Teste do Wgnuplot set grid set data style linespoints plot dados.txt c) File, Save d) Na janela Save As, dentro do campo File Name, digitar comandos.txt

Captulo 11. Grficos com Wgnuplot

135

e) Ainda na janela Save As, dentro do campo Save in:, selecionar o diretrio do projeto. Em seguida, clicar sobre o boto Save. f) No aplicativo Notepad, executar File, Exit 2) Inicializar o aplicativo Wgnuplot clicando duas vezes sobre o arquivo Wgnuplot.exe ou Application 3) Para gerar o grfico utilizando um arquivo de comandos, deve-se usar o comando load nome, onde nome representa o nome do arquivo com comandos do Wgnuplot, que deve ficar entre aspas. Portanto, na linha de comando do aplicativo Wgnuplot, digitar load comandos.txt e clicar na tecla Enter. Em seguida, dever surgir o mesmo grfico da seo anterior, j mostrado na Figura 11.6. Deve-se notar que este novo grfico foi gerado sem qualquer comando ser digitado na linha de comando do Wgnuplot, exceto o comando load. 4) Encerrar o Wgnuplot com File, Exit 5) Com o que foi visto nesta seo, pode-se, agora, gerar arquivos (dados.txt) com curvas de resultados (os pares coordenados x-y) obtidos de programas em FORTRAN. E, dentro dos programas em FORTRAN, chamar o aplicativo Wgnuplot para gerar os grficos correspondentes utilizando arquivos de comandos (comandos.txt) do Wgnuplot. Na prxima seo mostrado como fazer isso. 11.5 programa11.f90 1) Nesta seo ser usado o mesmo projeto criado na seo 11.1. Portanto, no Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa11.f90 2) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 11.1. 3) Objetivos do programa: a) Gerar um arquivo com as coordenadas x e y de uma curva b) Plotar esta curva com o aplicativo Wgnuplot 4) Comentrios sobre o programa: a) O uso dos comandos USE e SYSTEM j foi explicado na seo 5.3 do captulo 5. b) O comando SYSTEM vinha sendo usado para que o aplicativo Notepad abrisse arquivos com resultados dos programas. No programa11.f90 ele tambm usado para acionar o aplicativo Wgnuplot e gerar um grfico, com o procedimento visto na seo 11.4. c) O arquivo de comandos do Wgnuplot utilizado no programa aquele criado na seo anterior, chamado comandos.txt. 5) Algoritmo do programa: a) Unir a biblioteca PORTLIB ao programa para usar o comando SYSTEM
Captulo 11. Grficos com Wgnuplot 136

b) Definir os tipos de todas as variveis c) Ler o nmero de pontos a usar para gerar o grfico d) Calcular as coordenadas x e y, onde y = x3, e grav-las num arquivo chamado DADOS.TXT e) Com o aplicativo Notepad, mostrar o contedo do arquivo DADOS.TXT f) Com o aplicativo Wgnuplot, gerar um grfico com os dados do arquivo DADOS.TXT utilizando os comandos do arquivo COMANDOS.TXT. Tabela 11.1 Programa11.f90.
USE PORTLIB REAL X, Y INTEGER PONTO, PONTOS, VER WRITE(*,*) "Entre com o numero de pontos" READ(*,*) PONTOS OPEN(7, FILE= "DADOS.TXT") DO PONTO = 1, PONTOS X = PONTO - 1 Y = X**3 WRITE(7,40) X, Y 40 FORMAT( 2 ( 1PE10.2 ) ) END DO CLOSE(7) VER = SYSTEM ("Notepad DADOS.TXT") VER = SYSTEM ("Wgnuplot COMANDOS.TXT") END

6) Executar Build, Compile para compilar o programa. 7) Gerar o programa-executvel fazendo Build, Build. 8) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 11.7, dentro da qual tem-se: a) Na primeira linha, o comentrio Entre com o numero de pontos, resultado do comando
WRITE(*,*) "Entre com o numero de pontos" do programa.

Captulo 11. Grficos com Wgnuplot

137

b) Na segunda linha, o programa pra e fica aguardando que seja fornecido o valor da varivel PONTOS, resultado do comando READ(*,*) PONTOS do programa. Para que o programa continue sua execuo necessrio digitar 11, por exemplo, e, em seguida, clicar na tecla Enter.

Figura 11.7 Janela DOS do programa11.f90. c) Em seguida, o aplicativo Notepad apresenta as coordenadas x e y, onde y = x3, gravadas no arquivo chamado DADOS.TXT, cujo contedo mostrado na Figura 11.8.

Figura 11.8 Arquivo DADOS.TXT do programa11.f90. d) Fechar o aplicativo Notepad, com File, Exit. Deve surgir o grfico mostrado na Figura 11.9. 9) At entender, analisar os resultados do programa11.f90, mostrados nas Figura 11.7 a 11.9, considerando cada linha do programa-fonte e as explicaes descritas nas sees anteriores deste captulo. 10) Executar novamente o programa com outro nmero de pontos. 11) Encerrar a sesso seguindo o procedimento-padro.

Captulo 11. Grficos com Wgnuplot

138

11.6 EXERCCIOS Exerccio 11.1 Adaptar o programa11.f90 para que ele gere o grfico y versus x onde y = logaritmo decimal de x Exerccio 11.2 Adaptar o programa11.f90 para que ele gere o grfico y versus x onde y = cosseno hiperblico de x

Figura 11.9 Grfico gerado com o programa11.f90.

Captulo 11. Grficos com Wgnuplot

139

Captulo 12. SUB-ROTINAS

OBJETIVOS DO CAPTULO Conceitos de: sub-rotina, programa-principal, projeto com diversos programas-fonte, passagem de argumentos Comandos do FORTRAN: PROGRAM, EXTERNAL, SUBROUTINE, CALL, CONTAINS

12.1 programa12a Para inicializar as atividades deste captulo, deve-se executar: 1) Para acessar o programa Fortran, no Windows: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa12a 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte principal1.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 12.1. 5) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte rotina1.f90 6) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 12.2. 7) Objetivos do programa: a) Aplicar os novos comandos PROGRAM, EXTERNAL, SUBROUTINE e CALL do FORTRAN b) Utilizar uma sub-rotina externa ao programa-principal 8) Comentrios sobre o programa: a) Neste programa so usados quatro novos comandos do FORTRAN: PROGRAM, EXTERNAL, SUBROUTINE e CALL. Eles so aplicados com o que se denomina em programao de subrotina. b) Sub-rotinas so programas inseridos ou usados por um programa-principal. c) O programa-principal o programa-fonte que contm o algoritmo que se deseja executar e que usa as sub-rotinas. d) As sub-rotinas podem estar contidas dentro do programa-principal ou podem estar dentro de outros programas-fonte. O primeiro caso ser exemplificado na seo 12.4 deste captulo. J o segundo caso exemplificado na presente seo e nas duas seguintes. Neste caso, isto , quando

Captulo 12. Sub-rotinas

140

h mais de um programa-fonte que constitui um projeto, usa-se o comando PROGRAM para definir qual programa-fonte o programa-principal. E o comando EXTERNAL usado para informar ao programa-principal quais so os outros programas-fonte que fazem parte do projeto. Outra forma de usar sub-rotinas utilizar o comando USE para incluir uma biblioteca dentro do programa-principal, para que este possa chamar as sub-rotinas desejadas da biblioteca. Tabela 12.1 Programa-fonte principal1.f90.
PROGRAM CAPITULO_12A EXTERNAL ROTINA1 REAL A, B, C WRITE(*,*) "Entre com o valor de A" READ(*,*) A WRITE(*,*) "Entre com o valor de B" READ(*,*) B CALL SOMA ( A, B, C ) WRITE(*,*) "A + B = ", C END PROGRAM CAPITULO_12A

e) Quando h mais de um programa-fonte no projeto, primeiro deve-se compilar os programas-fonte que contm sub-rotinas. O programa-principal deve ser compilado por ltimo. f) Cada sub-rotina pode depender de variveis do programa-principal ou pode ser um programa totalmente independente. Neste caso, com poucas adaptaes, um programa j existente pode ser transformado em uma sub-rotina de um outro programa. g) A principal vantagem de se usar sub-rotinas dividir um programa muito grande ou complexo em unidades menores, ou subprogramas, que so mais fceis de implementar e que facilitam a deteco de erros. h) Cada sub-rotina deve ter um nome especfico, que definido com o comando SUBROUTINE. Este nome usado para chamar ou usar cada sub-rotina no local desejado. As sub-rotinas so ativadas ou chamadas atravs do comando CALL. i) As sub-rotinas podem ser escritas pelo prprio programador ou por outros programadores, na forma de programas-fonte ou bibliotecas.

Captulo 12. Sub-rotinas

141

j) Na linha PROGRAM CAPITULO_12A, do programa-fonte principal1.f90, define-se o incio e o nome do programa-principal como sendo CAPITULO_12A. E na ltima linha, com o comando END
PROGRAM CAPITULO_12A, define-se o fim do programa-principal. O nome do programa no tem

utilidade prtica nenhuma. Deve-se perceber que ele diferente do nome do projeto e do nome do programa-fonte. Tabela 12.2 Programa-fonte rotina1.f90.
SUBROUTINE SOMA ( X, Y, Z ) REAL X, Y, Z Z = X + Y END SUBROUTINE SOMA

k) Na linha EXTERNAL ROTINA1, do programa-fonte principal1.f90, declara-se que o programa-fonte rotina1.f90 faz parte do programa-fonte principal1.f90. Deve-se notar que no comando EXTERNAL declarado o nome do programa-fonte que contm a sub-rotina, e no o nome da sub-rotina. l) Na linha CALL SOMA ( A, B, C ), do programa-fonte principal1.f90, chama-se a sub-rotina de nome SOMA e transfere-se a ela os valores das variveis que esto entre parnteses, isto , as variveis A, B e C, que foram declaradas como variveis reais no programa-principal. m) Na linha SUBROUTINE SOMA ( X, Y, Z ), do programa-fonte rotina1.f90, define-se o incio e o nome da sub-rotina como sendo SOMA e, ainda, quais as variveis que so recebidas e devolvidas ao programa-principal, no caso as variveis X, Y e Z. E na ltima linha, com o comando END
SUBROUTINE SOMA, define-se o fim da sub-rotina SOMA.

n) As variveis de uma sub-rotina que so recebidas e devolvidas ao programa-principal so denominadas de argumentos da sub-rotina. Elas tm que ser do mesmo tipo das variveis usadas no programa-principal que chama a sub-rotina, mas no precisam ter o mesmo nome. No obrigatrio que as sub-rotinas tenham argumentos. 9) Algoritmo do programa: a) No programa-principal, declarar que o programa-fonte rotina1.f90 faz parte do programa-principal b) No programa-principal, definir as variveis A, B e C como sendo do tipo real c) No programa-principal, ler o valor das variveis A e B d) No programa-principal, chamar a sub-rotina SOMA, transferindo a ela os valores atuais das variveis A, B e C

Captulo 12. Sub-rotinas

142

e) Na sub-rotina SOMA, receber os valores das variveis X, Y e Z, transferidos do programaprincipal f) Na sub-rotina SOMA, realizar a soma das variveis X e Y e atribuir o resultado varivel Z g) Na sub-rotina SOMA, ao encontrar o fim da sub-rotina, voltar ao programa-principal no ponto onde a sub-rotina foi chamada, transferindo os valores atuais das variveis X, Y e Z, da sub-rotina, para as variveis A, B e C do programa-principal h) No programa-principal, escrever o valor atual da varivel C i) No programa-principal, encerrar a execuo do programa 10) Executar Build, Compile para compilar o programa-fonte rotina1.f90. 11) Executar Build, Compile para compilar o programa-fonte principal1.f90. 12) Gerar o programa-executvel fazendo Build, Build. 13) Ao se executar o programa, atravs de Build, Execute, surge uma janela, mostrada na Figura 12.1, dentro da qual tem-se:

Figura 12.1 Resultado do programa12a. a) Na primeira linha, o comentrio Entre com o valor de A, resultado do comando WRITE(*,*)
"Entre com o valor de A" do programa.

b) Na segunda linha, o programa pra e fica aguardando que seja fornecido o valor da varivel A, resultado do comando READ(*,*) A do programa. Para que o programa continue sua execuo necessrio digitar 1, por exemplo, e, em seguida, clicar na tecla Enter. c) Na terceira linha, o comentrio Entre com o valor de B, resultado do comando WRITE(*,*)
"Entre com o valor de B" do programa.

d) Na quarta linha, o programa pra e fica aguardando que seja fornecido o valor da varivel B, resultado do comando READ(*,*) B do programa. Para que o programa continue sua execuo necessrio digitar 2, por exemplo, e, em seguida, clicar na tecla Enter. e) Na quinta linha, apresentado o resultado da soma das variveis A e B, calculado dentro da subrotina SOMA.

Captulo 12. Sub-rotinas

143

14) At entender, analisar os resultados do programa12a, mostrados na Figura 12.1, considerando cada linha dos dois programas-fonte envolvidos e as explicaes descritas nos itens 8 e 9 acima. 15) Executar novamente o programa com outros dados. 16) No Fortran, para fechar o projeto atual, executar File, Close Workspace 12.2 programa12b 1) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa12b 2) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte principal2.f90 3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 12.3. Tabela 12.3 Programa-fonte principal2.f90.
PROGRAM CAPITULO_12B EXTERNAL ROTINAS2 INTEGER INTEIRO REAL A, B, C WRITE(*,*) "Entre com o valor de A" READ(*,*) A WRITE(*,*) "Entre com o valor de B" READ(*,*) B CALL SOMA ( A, B, C ) WRITE(*,*) "A + B = ", C WRITE(*,*) "Entre com um valor inteiro para calcular seu fatorial" READ(*,*) INTEIRO CALL FATORIAL ( INTEIRO ) END PROGRAM CAPITULO_12B

Captulo 12. Sub-rotinas

144

4) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte rotinas2.f90 5) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 12.4. Tabela 12.4 Programa-fonte rotinas2.f90.
SUBROUTINE SOMA ( X, Y, Z ) REAL X, Y, Z Z = X + Y END SUBROUTINE SOMA

SUBROUTINE FATORIAL ( N ) INTEGER I, N, FAT FAT = 1 IF ( N < 0 ) THEN WRITE(*,*) "Nao existe fatorial de ", N ELSE DO I = 2, N FAT = FAT * I END DO END IF WRITE(*,*) "O fatorial de", N, " eh = ", FAT END SUBROUTINE FATORIAL

6) Objetivos do programa: a) Implementar um programa-fonte com duas sub-rotinas b) Utilizar duas sub-rotinas externas ao programa-principal 7) Comentrios sobre o programa: a) Um programa-fonte pode ser constitudo por uma ou vrias sub-rotinas. Um exemplo o programa-fonte rotinas2.f90 que contm duas sub-rotinas.

Captulo 12. Sub-rotinas

145

b) Na linha CALL FATORIAL ( INTEIRO ), do programa-fonte principal2.f90, chama-se a sub-rotina de nome FATORIAL e transfere-se a ela o valor da varivel que est entre parnteses, isto , a varivel INTEIRO, que foi declarada como varivel do tipo inteiro no programa-principal. 8) Algoritmo do programa: a) No programa-principal, declarar que o programa-fonte rotinas2.f90 faz parte do programaprincipal b) No programa-principal, definir as variveis A, B e C como sendo do tipo real e a varivel INTEIRO como do tipo inteiro c) No programa-principal, ler o valor das variveis A e B d) No programa-principal, chamar a sub-rotina SOMA, transferindo a ela os valores atuais das variveis A, B e C e) Na sub-rotina SOMA, receber os valores das variveis X, Y e Z, transferidos do programaprincipal f) Na sub-rotina SOMA, realizar a soma das variveis X e Y e atribuir o resultado varivel Z g) Na sub-rotina SOMA, ao encontrar o fim da sub-rotina, voltar ao programa-principal no ponto onde a sub-rotina foi chamada, transferindo os valores atuais das variveis X, Y e Z, da sub-rotina, para as variveis A, B e C do programa-principal h) No programa-principal, escrever o valor atual da varivel C i) No programa-principal, ler o valor da varivel INTEIRO j) No programa-principal, chamar a sub-rotina FATORIAL, transferindo a ela o valor atual da varivel INTEIRO k) Na sub-rotina FATORIAL, receber o valor da varivel N, transferido do programa-principal l) Na sub-rotina FATORIAL, realizar o clculo do fatorial da varivel N e atribuir o resultado varivel FAT m) Na sub-rotina FATORIAL, escrever o valor da varivel FAT n) Na sub-rotina FATORIAL, ao encontrar o fim da sub-rotina, voltar ao programa-principal no ponto onde a sub-rotina foi chamada, transferindo o valor atual da varivel N, da sub-rotina, para a varivel INTEIRO do programa-principal o) No programa-principal, encerrar a execuo do programa 9) Executar Build, Compile para compilar o programa-fonte rotinas2.f90. 10) Executar Build, Compile para compilar o programa-fonte principal2.f90. 11) Gerar o programa-executvel fazendo Build, Build. 12) Ao se executar o programa, atravs de Build, Execute, obtm-se o resultado mostrado na Figura 12.2. 13) At entender, analisar os resultados do programa12b, mostrados na Figura 12.2, considerando cada linha dos dois programas-fonte envolvidos e as explicaes descritas nos itens 7 e 8 acima.

Captulo 12. Sub-rotinas

146

14) Executar novamente o programa com outros dados. 15) No Fortran, para fechar o projeto atual, executar File, Close Workspace

Figura 12.2 Resultado do programa12b. 12.3 programa12c 1) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa12c 2) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte principal3.f90 3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 12.5. Tabela 12.5 Programa-fonte principal3.f90.
PROGRAM CAPITULO_12C EXTERNAL ROTINA3 CALL OUTRAS END PROGRAM CAPITULO_12C

4) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte rotinas2.f90 5) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 12.4. O contedo do arquivo rotinas2.f90 tambm pode ser copiado diretamente do projeto anterior, programa12b. 6) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte rotina3.f90

Captulo 12. Sub-rotinas

147

7) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 12.6. 8) Objetivos do programa: a) Implementar um programa com trs sub-rotinas divididas em dois programas-fonte b) Fazer uma sub-rotina chamar outras sub-rotinas c) Utilizar uma sub-rotina sem argumentos Tabela 12.6 Programa-fonte rotina3.f90.
SUBROUTINE OUTRAS EXTERNAL ROTINAS2 INTEGER INTEIRO REAL A, B, C WRITE(*,*) "Entre com o valor de A" READ(*,*) A WRITE(*,*) "Entre com o valor de B" READ(*,*) B CALL SOMA ( A, B, C ) WRITE(*,*) "A + B = ", C WRITE(*,*) "Entre com um valor inteiro para calcular seu fatorial" READ(*,*) INTEIRO CALL FATORIAL ( INTEIRO ) END SUBROUTINE OUTRAS

9) Comentrios sobre o programa: a) O programa12c faz exatamente o mesmo que o programa12b, da seo anterior. A diferena que tudo o que antes era feito no programa-principal agora feito pela sub-rotina OUTRAS, que chamada pelo programa-principal cuja nica funo dele essa chamada. b) Uma sub-rotina pode chamar uma ou diversas sub-rotinas. Por exemplo, a sub-rotina OUTRAS chama as sub-rotinas SOMA e FATORIAL. 10) Algoritmo do programa: o mesmo da seo 12.2, item 8.

Captulo 12. Sub-rotinas

148

11) Executar Build, Compile para compilar o programa-fonte rotinas2.f90. 12) Executar Build, Compile para compilar o programa-fonte rotina3.f90. 13) Executar Build, Compile para compilar o programa-fonte principal3.f90. 14) Gerar o programa-executvel fazendo Build, Build. 15) Ao se executar o programa, atravs de Build, Execute, obtm-se o resultado j mostrado na Figura 12.2. 16) At entender, analisar os resultados do programa12c, mostrados na Figura 12.2, considerando cada linha dos trs programas-fonte envolvidos e as explicaes pertinentes. 17) No Fortran, para fechar o projeto atual, executar File, Close Workspace 12.4 programa12d 1) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa12d 2) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte principal4.f90 3) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 12.7. Deve-se perceber que quase todo o contedo do arquivo principal4.f90 j foi digitado no projeto programa12c e, portanto, ele pode ser copiado dos arquivos rotinas2.f90 e rotina3.f90. 4) Objetivos do programa: a) Implementar um programa com sub-rotinas inseridas dentro do programa-principal b) Utilizar sub-rotina de biblioteca 5) Comentrios sobre o programa: a) O programa12d praticamente idntico ao programa12c, da seo anterior. H apenas duas diferenas. A primeira que as trs sub-rotinas (OUTRAS, SOMA e FATORIAL) que antes estavam dentro de dois programas-fonte (rotinas2.f90 e rotina3.f90) agora esto inseridas dentro do prprio programa-principal. b) O comando CONTAINS do FORTRAN usado para separar o fim do programa-principal do incio das sub-rotinas contidas dentro do programa-principal, conforme pode-se ver na Tabela 12.7. c) A segunda diferena que, aps a chamada da sub-rotina OUTRAS, foi inserido uma chamada da sub-rotina TDATE, que uma sub-rotina pertencente biblioteca MSIMSLMS. E, para utilizar esta biblioteca, no incio do programa-principal foi empregado o comando USE junto com o nome da biblioteca.

Captulo 12. Sub-rotinas

149

d) A biblioteca MSIMSLMS contm muitas sub-rotinas com diversas finalidades. A lista completa das sub-rotinas desta biblioteca, informaes detalhadas e exemplos sobre cada uma delas podem ser vistos no manual online do Fortran em: ? InfoView, IMSL Libraries Reference. 6) Algoritmo do programa: o mesmo da seo 12.2, item 8, acrescido ao final da chamada da subrotina TDATE e da escrita da data corrente. Tabela 12.7 Programa-fonte principal4.f90.
PROGRAM CAPITULO_12D USE MSIMSLMS INTEGER DIA, MES, ANO CALL OUTRAS CALL TDATE ( DIA, MES, ANO ) WRITE(*,1) DIA, MES, ANO 1 FORMAT (/, 5X, "Data de hoje eh ", I2, "/", I2, "/", I4)

CONTAINS

! ------------------------------------------------------------------SUBROUTINE OUTRAS INTEGER INTEIRO REAL A, B, C WRITE(*,*) "Entre com o valor de A" READ(*,*) A WRITE(*,*) "Entre com o valor de B" READ(*,*) B CALL SOMA ( A, B, C ) WRITE(*,*) "A + B = ", C

Captulo 12. Sub-rotinas

150

WRITE(*,*) "Entre com um valor inteiro para calcular seu fatorial" READ(*,*) INTEIRO CALL FATORIAL ( INTEIRO ) END SUBROUTINE OUTRAS ! ------------------------------------------------------------------SUBROUTINE SOMA ( X, Y, Z ) REAL X, Y, Z Z = X + Y END SUBROUTINE SOMA ! ------------------------------------------------------------------SUBROUTINE FATORIAL ( N ) INTEGER I, N, FAT FAT = 1 IF ( N < 0 ) THEN WRITE(*,*) "Nao existe fatorial de ", N ELSE DO I = 2, N FAT = FAT * I END DO END IF WRITE(*,*) "O fatorial de", N, " eh = ", FAT END SUBROUTINE FATORIAL ! ------------------------------------------------------------------END PROGRAM CAPITULO_12D

7) Executar Build, Compile para compilar o programa-fonte principal4.f90.

Captulo 12. Sub-rotinas

151

8) Gerar o programa-executvel fazendo Build, Build. 9) Ao se executar o programa, atravs de Build, Execute, obtm-se o resultado mostrado na Figura 12.3. 10) At entender, analisar os resultados do programa12d, mostrados na Figura 12.3, considerando cada linha do programa-fonte e as explicaes pertinentes. 11) Encerrar a sesso seguindo o procedimento-padro.

Figura 12.3 Resultado do programa12d. 12.5 EXERCCIO Exerccio 12.1 Alterar o programa12d, da seo 12.4, da seguinte forma: 1) Adaptar a sub-rotina FATORIAL e sua chamada na sub-rotina OUTRAS para que o valor do fatorial seja passado a sub-rotina OUTRAS 2) Implementar a sub-rotina ESCREVE para escrever num arquivo os resultados das variveis A, B, C, INTEIRO e fatorial. Esta nova sub-rotina dever ser chamada dentro da sub-rotina OUTRAS. 3) Implementar a sub-rotina ARQUIVO para mostrar, com o aplicativo Notepad, o contedo do arquivo criado pela sub-rotina ESCREVE. A sub-rotina ARQUIVO dever ser chamada pela sub-rotina OUTRAS, aps a chamada da sub-rotina ESCREVE.

Captulo 12. Sub-rotinas

152

Captulo 13. VARIVEIS DO TIPO REAL DUPLA

OBJETIVOS DO CAPTULO Conceitos de: variveis de preciso simples e dupla, variveis do tipo real simples e dupla, mistura de variveis do tipo inteiro com real simples e real dupla Funes matemticas intrnsecas e formatos de edio para variveis do tipo real dupla Comandos do FORTRAN: REAL, REAL*4, REAL(4), REAL*8, REAL(8), DOUBLE PRECISION e IMPLICIT NONE Para inicializar as atividades deste captulo, deve-se acessar o programa Fortran, no Windows atravs de: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio 13.1 programa13a.f90 1) Objetivos do programa: a) Definir uma varivel do tipo real de dupla preciso usando o comando REAL*8 b) Comparar a preciso de variveis do tipo real simples e dupla 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa13a 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa13a.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 13.1. 5) Comentrios sobre o programa: a) No captulo 3 foram abordadas as variveis do tipo real. Elas so usadas para definir variveis do tipo real, isto , variveis que podem guardar ou armazenar na memria do computador nmeros reais, positivos ou negativos, como 1.0, 1.0, 1.1, 3.1416 ou 0.003. Para definir uma varivel do tipo real num programa usa-se o comando REAL. As variveis definidas com o comando REAL podem guardar na memria do computador valores no intervalo aproximado de 1.17e-38 a 3.40e+38 e a preciso de 6 casas decimais. Estas variveis tambm podem ser chamadas de reais simples ou de preciso simples. b) O novo comando REAL*8 usado para definir variveis do tipo real dupla ou de preciso dupla. As variveis definidas com o comando REAL*8 podem guardar na memria do computador valores no intervalo aproximado de 2.22e-308 a 1.79e+308 e a preciso de 15 casas decimais.

Captulo 13. Variveis do tipo real dupla

153

Em geral, estas variveis so mais adequadas em computao cientfica. Entretanto elas exigem o dobro da memria computacional em relao s variveis reais simples. c) A linha REAL A define a varivel A como sendo do tipo real simples. d) A linha REAL*8 B define a varivel B como sendo do tipo real dupla. Tabela 13.1 Programa13a.f90.
REAL A REAL*8 B WRITE(*,*) "Entre com o valor de A (real simples) =" READ(*,*) A WRITE(*,*) "Entre com o valor de B (real dupla) =" READ(*,*) B WRITE(*,*) "Valor de A = ", A WRITE(*,*) "Valor de B = ", B END

6) Executar Build, Compile para compilar o programa 7) Gerar o programa-executvel fazendo Build, Build. 8) Executar o programa, atravs de Build, Execute, com o valor 1 para as duas variveis. O resultado deve ser o mostrado na Figura 13.1. Deve-se notar que o nmero de casas decimais da varivel A (real simples) 6, e da varivel B (real dupla) 15.

Figura 13.1 Resultado da execuo do programa13a.f90 com A e B = 1. 9) Executar novamente o programa com o valor 123456789 para as duas variveis e analisar os resultados.

Captulo 13. Variveis do tipo real dupla

154

10) Executar novamente o programa com o valor 0.001 para as duas variveis e analisar os resultados. 11) Executar novamente o programa com o valor 1.2345678901234567890 para as duas variveis e analisar os resultados. Notar que o algarismo da ltima casa decimal arredondado e os algarismos excedentes so desprezados. 12) Executar novamente o programa com outros dados e analisar os resultados. 13) No Fortran, para fechar o projeto atual, executar File, Close Workspace 13.2 programa13b.f90 1) Objetivos do programa: a) Usar diversas formas para definir variveis reais simples e dupla b) Realizar clculos elementares envolvendo variveis do tipo inteiro, real simples e real dupla 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa13b 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa13b.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 13.2. 5) Comentrios sobre o programa: a) As variveis do tipo real simples podem ser definidas atravs dos comandos REAL, REAL*4 e REAL(4). Exemplos so as definies das variveis A, B e C. b) As variveis do tipo real dupla podem ser definidas atravs dos comandos REAL*8, REAL(8) e DOUBLE PRECISION. Exemplos so as definies das variveis E, F e G. c) Os clculos das variveis D, B e C so exatamente os mesmos mostrados no programa03d.f90 do captulo 3, seo 3.2, para explicar as conseqncias de misturar variveis do tipo inteiro e real simples num clculo. Estas mesmas explicaes valem para as variveis reais dupla F e G. d) Quando se atribui uma varivel real simples a uma real dupla, esta tem sua preciso deteriorada para real simples. Um exemplo o clculo da varivel E. Isso deve sempre ser evitado. Se o objetivo usar preciso dupla num programa, todas as variveis e os clculos devem envolver preciso dupla, exceto em alguns tipos de clculo com variveis inteiras. 6) Executar Build, Compile para compilar o programa 7) Gerar o programa-executvel fazendo Build, Build. 8) Executar o programa, atravs de Build, Execute, com o valor 6.9 para a varivel A. 9) Analisar os resultados mostrados na Figura 13.2. Deve-se notar a diferena de preciso no arredondamento do clculo das variveis C e G. Tambm deve-se notar a deteriorao da preciso da
Captulo 13. Variveis do tipo real dupla 155

varivel real dupla E causada ao se igualar ela varivel real simples A: todos os algarismos que aparecem na varivel E aps os zeros so lixo, tambm chamado de erro de arredondamento. Tabela 13.2 Programa13b.f90.
INTEGER D REAL REAL*4 A B

REAL(4) C REAL*8 E

REAL(8) F DOUBLE PRECISION G WRITE(*,*) "Entre com o valor de A (real simples) =" READ(*,*) A D = A B = 1 / D C = 1.0 / D E = A F = 1 / D G = 1.0 / D WRITE(*,*) "Valor de D (inteiro) = ", D WRITE(*,*) "Valor de B (real simples) = ", B WRITE(*,*) "Valor de C (real simples) = ", C WRITE(*,*) "Valor de E (real dupla) WRITE(*,*) "Valor de F (real dupla) WRITE(*,*) "Valor de G (real dupla) END = ", E = ", F = ", G

10) Executar novamente o programa com outros valores para a varivel A e analisar os resultados. 11) No Fortran, para fechar o projeto atual, executar File, Close Workspace

Captulo 13. Variveis do tipo real dupla

156

Figura 13.2 Resultado da execuo do programa13b.f90 com A = 6.9. 13.3 programa13c.f90 1) Objetivos do programa: a) Mostrar a importncia de serem definidas todas as variveis de um programa b) Utilizar o comando IMPLICIT NONE 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa13c 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa13c.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 13.2, isto , copiar o programa13b.f90 do projeto anterior. 5) Eliminar a primeira linha do programa, ou seja, INTEGER D. 6) Executar Build, Compile para compilar o programa. Mesmo a varivel D no tendo sido definida, no ocorre erro de compilao. Quando uma varivel no definida, por default, assume-se que todas as variveis iniciadas pelas letras I at N, em ordem alfabtica, so do tipo inteiro, e as demais so do tipo real simples. 7) Gerar o programa-executvel fazendo Build, Build. 8) Executar o programa, atravs de Build, Execute, com o valor 6.9 para a varivel A. Em princpio, os mesmos resultados mostrados na Figura 13.2 deveriam ser obtidos. Porm, pode-se notar na Figura 13.3 que isso no ocorre, ressaltando-se: a varivel D passou a ser uma varivel real simples; com isso, foram alterados os valores das variveis B, C, F e G. 9) Incluir na primeira linha do programa13c.f90 o comando IMPLICIT NONE. Ele deve ser colocado antes de qualquer declarao de tipo de varivel. Recomenda-se fortemente sempre usar o comando IMPLICIT NONE porque ele obriga o programador a declarar explicitamente os tipos de

Captulo 13. Variveis do tipo real dupla

157

todas as variveis empregadas no programa. Assim, se houver a digitao errnea do nome de uma varivel, o compilador apontar o erro.

Figura 13.3 Resultado da execuo do programa13b.f90 sem definir a varivel inteira D. 10) Executar Build, Compile para compilar a nova verso do programa. Deve-se notar que agora ocorrer erro de compilao, apontando que a varivel D no foi declarada. 11) Incluir a declarao da varivel D como sendo do tipo inteiro, conforme mostrado na Tabela 13.3. 12) Executar Build, Compile para compilar o programa. 13) Gerar o programa-executvel fazendo Build, Build. 14) Executar o programa, atravs de Build, Execute, com o valor 6.9 para a varivel A. Agora os resultados so os mesmos mostrados na Figura 13.2, conforme esperado. 15) No Fortran, para fechar o projeto atual, executar File, Close Workspace Tabela 13.3 Programa13c.f90.
IMPLICIT NONE INTEGER D REAL REAL*4 A B

REAL(4) C REAL*8 E

REAL(8) F DOUBLE PRECISION G WRITE(*,*) "Entre com o valor de A (real simples) =" READ(*,*) A

Captulo 13. Variveis do tipo real dupla

158

D = A B = 1 / D C = 1.0 / D E = A F = 1 / D G = 1.0 / D WRITE(*,*) "Valor de D (inteiro) = ", D WRITE(*,*) "Valor de B (real simples) = ", B WRITE(*,*) "Valor de C (real simples) = ", C WRITE(*,*) "Valor de E (real dupla) WRITE(*,*) "Valor de F (real dupla) WRITE(*,*) "Valor de G (real dupla) END = ", E = ", F = ", G

13.4 programa13d.f90 1) Objetivos do programa: a) Usar funes matemticas intrnsecas do FORTRAN com variveis reais do tipo dupla b) Usar formatos de edio com variveis reais do tipo dupla 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa13d 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa13d.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 13.4. Tabela 13.4 Programa13d.f90.
USE PORTLIB IMPLICIT NONE REAL A4, B4, C4, Pi4 REAL*8 A8, B8, C8, Pi8 INTEGER VER WRITE(*,*) "Entre com o valor de A8 (real dupla) =" READ(*,*) A8

Captulo 13. Variveis do tipo real dupla

159

OPEN(9,file="saida13d.txt") A4 = A8 WRITE(9,*) "A4 = A8 =", A4 B4 = ABS(A4) ABS(A4) =", B4

B8 = DABS(A8) WRITE(9,*) "B4 = Mdulo com WRITE(9,*) "B8 = Mdulo com DABS(A8) =", B8 C4 = LOG10(B4) LOG10(B4) =", C4

C8 = DLOG10(B8) WRITE(9,*) "C4: Logaritmo decimal com WRITE(9,*) "C8: Logaritmo decimal com DLOG10(B8) =", C8 Pi4 = ACOS(-1.0e0) ACOS(-1.0e0) = ", Pi4

Pi8 = DACOS(-1.0d0) WRITE(9,*) "Pi com WRITE(9,*) "Pi com DACOS(-1.0d0) = ", Pi8 WRITE(9,*) A8, "= A8 sem formato" WRITE(9,21) A8, A8, A8, A8, A8 WRITE(9,11) A8, B8, C8 WRITE(9,12) A8, B8, C8 CLOSE(9) VER = SYSTEM("Notepad saida13d.txt") 11 FORMAT( 5X, "A8 =", 1PE15.3, 1/, 5X, "B8 =", 1PE15.3, 1/, 5X, "C8 =", 1PE15.3, 1/ 21 FORMAT ("A8 no formato F8.2 "A8 no formato F5.0 "A8 no formato E15.3 "A8 no formato 1PE15.2 & & ) =", F8.2, =", F5.0, =", E15.3, =", 1PE15.2, 1/, & 1/, & 1/, & 1/, & )

12 FORMAT ( 3(1PE10.1), "= variveis A8, B8 e C8 no formato 3(1PE10.1)" )

"A8 no formato 1PE15.2E3 =", 1PE15.2E3, 1/ END

5) Comentrios sobre o programa:

Captulo 13. Variveis do tipo real dupla

160

a) Os tipos de funes matemticas intrnsecas do FORTRAN so os mesmos para variveis reais simples ou dupla. Mas os nomes so distintos para preservar a preciso das variveis reais dupla; em geral, acrescenta-se a letra D frente do comando usado com variveis do tipo real simples. Por exemplo: a funo ABS(X) usada para calcular o mdulo da varivel X do tipo real simples passa a ser DABS quando X do tipo real dupla. b) As Tabelas 13.5 e 13.6 mostram algumas funes matemticas intrnsecas do FORTRAN para variveis do tipo real dupla. Estas tabelas so as correspondentes s Tabelas 5.5 e 5.6 para variveis do tipo real simples. Tabela 13.5 Algumas funes matemticas do FORTRAN com argumentos e resultados sendo variveis do tipo real dupla. Funo Mdulo ou valor absoluto Raiz quadrada Exponencial: Y Logaritmo natural Logaritmo decimal Sinal Mnimo Mximo = eX Comando Y = DABS(X) Y = DSQRT(X) Y = DEXP(X) Y = DLOG(X) Y = DLOG10(X) Y = DSIGN(X,Z) Y = DMIN1(X,Z,W) Y = DMAX1(X,Z,W) Y = valor absoluto de X vezes o sinal de Z Y = valor mnimo entre X, Z e W; o argumento pode conter 2 ou mais variveis Y = valor mximo entre X, Z e W; o argumento pode conter 2 ou mais variveis c) A lista completa de funes matemticas intrnsecas do FORTRAN pode ser vista no manual do Fortran. Para acess-lo, dentro da subjanela do lado esquerdo, deve-se executar: clicar uma vez sobre o smbolo ?InfoView; e acessar as opes Reference, Procedures, Numeric Procedures e as opes Reference, Procedures, Trigonometric, Exponential, Root, and Logathmic Procedures. d) Os tipos de formatos de edio usados com variveis do tipo real simples tambm podem ser usados com variveis do tipo real dupla. Estes formatos foram vistos no captulo 6, seo 6.3. Um outro formato que pode ser conveniente 1PEX.YEZ, onde a terminao EZ indica expoente e Z o nmero de algarismos para o expoente. Por exemplo, no programa13d.f90 usa-se o formato 1PE15.2E3. e) Nos argumentos de funes intrnsecas para variveis do tipo real dupla deve-se definir os nmeros usando-se a letra D (ou d) em vez de E (ou e) (das variveis reais simples) para
Captulo 13. Variveis do tipo real dupla 161

Observao

representar o expoente. Em clculos ou expresses que envolvam nmeros reais, tambm deve-se fazer isso. Se estas recomendaes no forem seguidas ocorrer erro de compilao ou perda de preciso nos clculos. Por exemplo, no programa13d.f90 usa-se 1.0e0 como argumento da funo real simples ACOS para calcular o valor de , e 1.0d0 como argumento da funo real dupla DACOS. f) A escala de prioridades entre os operadores matemticos e as regras adotadas nas operaes matemticas, descritas nas Tabelas 3.4 e 3.5 tambm se aplicam s variveis do tipo real dupla, onde pertinente. Tabela 13.6 Algumas funes trigonomtricas do FORTRAN com argumentos e resultados sendo variveis do tipo real dupla. Funo Seno Cosseno Tangente Arco-seno Arco-cosseno Arco-tangente Seno hiperblico Cosseno hiperblico Tangente hiperblica Comando Y = DSIN(X) Y = DCOS(X) Y = DTAN(X) Y = DASIN(X) Y = DACOS(X) Y = DATAN(X) Y = DSINH(X) Y = DCOSH(X) Y = DTANH(X) Observao X em radianos X em radianos X em radianos Y em radianos Y em radianos Y em radianos

6) Executar Build, Compile para compilar o programa 7) Gerar o programa-executvel fazendo Build, Build. 8) Executar o programa, atravs de Build, Execute, com o valor 1.234567890 para a varivel A8. 9) Analisar os resultados mostrados na Figura 13.4. 10) Executar novamente o programa com outros valores para a varivel A8 e analisar os resultados; por exemplo, A8 = 1e+3, 1.0d-3, 1.2e-30. 11) Encerrar a sesso seguindo o procedimento-padro. 13.5 EXERCCIOS Exerccio 13.1 Para testar as operaes matemticas bsicas, refazer o programa03e.f90, do captulo 3, seo 3.3, usando variveis do tipo real dupla em vez de real simples.
Captulo 13. Variveis do tipo real dupla 162

Exerccio 13.2 Para testar o uso da escala de prioridades entre os operadores matemticos e as regras adotadas nas operaes matemticas, descritas nas Tabelas 3.4 e 3.5, refazer o programa03f.f90, do captulo 3, seo 3.5, usando, onde pertinente, variveis do tipo real dupla em vez de real simples.

Figura 13.4 Resultado da execuo do programa13d.f90 no arquivo saida13d.txt com A8 = 1.234567890. Exerccio 13.3 Escrever as expresses em linguagem FORTRAN que correspondem s seguintes expresses algbricas, onde A, B e L so nmeros reais de preciso dupla, e I e J so nmeros inteiros:

a)

A =

+ 5 100

b)

A =

1 10

c)

L =

1 3 I

I2 +

1 J3

Captulo 13. Variveis do tipo real dupla

163

d)

1 2 J 3 I + 3 L = 1 I 2 1+ I

Exerccio 13.4

1) Executar o programa13d.f90 com A8 = 1.2e+308. Deve-se notar que o programa ter problema durante a execuo. Por que isso ocorre? 2) Implementar uma nova verso do programa13d.f90 com a eliminao de tudo relacionado s variveis reais de preciso simples. a) Gerar o executvel desta nova verso e execut-lo com A8 = 1.2e+308. Deve-se notar que agora o programa executado sem nenhum problema. Por que isso ocorre? Observar o que acontece com a representao dos resultados atravs dos formatos usados, principalmente com relao aos expoentes. b) Executar novamente o programa com A8 = 2.2e-308. c) Executar novamente o programa com A8 = 2.0e+308. O que acontece? Por qu? d) Executar novamente o programa com outros valores para A8.

Captulo 13. Variveis do tipo real dupla

164

Captulo 14. ARQUIVOS DE SADA, DE ENTRADA E INTERNOS

OBJETIVOS DO CAPTULO Conceitos de: arquivo de entrada, arquivo interno, arquivo texto, arquivo binrio, dispositivo e nome de arquivo genricos Comandos do FORTRAN: uso avanado de OPEN, WRITE e SYSTEM No comando OPEN, usar os parmetros FORMATTED, UNFORMATTED, REWIND e APPEND Para inicializar as atividades deste captulo, deve-se acessar o programa Fortran, no Windows, atravs de: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio 14.1 programa14a.f90 1) Objetivos do programa: relembrar os conhecimentos atuais sobre (a) o uso de janela DOS para entrar dados; (b) escrever resultados num arquivo, com o nome do arquivo e o nmero do dispositivo sendo prdefinidos; e (c) abrir o arquivo de resultados com o aplicativo Notepad. 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa14a 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa14a.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 14.1. 5) Executar Build, Compile para compilar o programa. 6) Gerar o programa-executvel fazendo Build, Build. 7) Executar o programa atravs de Build, Execute com o valor 8, por exemplo. O resultado deve ser o mostrado na Figura 14.1. 8) Executar novamente o programa com outros dados e analisar os novos resultados. 9) No Fortran, para fechar o projeto atual, executar File, Close Workspace.

Captulo 14. Arquivos de sada, de entrada e internos

165

Tabela 14.1 Programa14a.f90


USE PORTLIB IMPLICIT NONE REAL*8 Pi INTEGER UNIT, VER Pi = DACOS(-1.0d0) WRITE(*,*) "Entre com o valor de UNIT (inteiro) =" READ(*,*) UNIT OPEN(9,file="saida14a.txt") WRITE(9,11) UNIT, Pi CLOSE(9) VER = SYSTEM("Notepad saida14a.txt") 11 FORMAT( 5X, "UNIT =", I4, 1/, 5X, "Pi END &

=", 1PE25.15 )

Figura 14.1 Resultado do programa14a.f90. 14.2 programa14b.f90 1) Objetivos do programa: (a) Entrada de dados atravs de janela DOS; (b) escrever resultados num arquivo cujo nome e o nmero do dispositivo so genricos e definidos pelo usurio atravs dos dados do programa; e (c) abrir o arquivo de resultados de nome genrico com o aplicativo Notepad. 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa14b
Captulo 14. Arquivos de sada, de entrada e internos 166

3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa14b.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 14.2. Tabela 14.2 Programa14b.f90
USE PORTLIB IMPLICIT NONE REAL*8 Pi INTEGER UNIT, VER CHARACTER(50) SAIDA, TEXTO Pi = DACOS(-1.0d0) WRITE(*,*) "Unidade de saida (inteiro) =" READ(*,*) UNIT WRITE(*,*) "Nome do arquivo de saida (caracter) =" READ(*,*) SAIDA TEXTO = "Notepad " // SAIDA OPEN(UNIT, file = SAIDA ) WRITE(UNIT,11) UNIT, Pi, SAIDA, TEXTO CLOSE(UNIT) 11 FORMAT( 1/, 5X, "UNIT =", I4, 1/, 5X, "Pi 1/, 5X, "SAIDA = ", A50, 1/, 5X, "TEXTO = ", A50 VER = SYSTEM( TEXTO ) END & & )

=", 1PE25.15, &

5) Comentrios sobre o programa: (a) Na linha OPEN(UNIT, file = SAIDA ), deve-se notar que no comando OPEN, no lugar do nmero do dispositivo que identifica o arquivo, usado uma varivel chamada UNIT, que um dado do programa. E o nome do arquivo, que aparece aps a palavra-chave FILE, tambm uma
Captulo 14. Arquivos de sada, de entrada e internos 167

varivel, chamada SAIDA, que definida pelo usurio atravs dos dados do programa; observase que no se deve usar apstrofos ou aspas com esta varivel, como era feito antes, por exemplo no programa14a.f90. Os nomes das variveis UNIT e SAIDA podem ser outros quaisquer. (b) Na linha WRITE(UNIT,11) UNIT, Pi, SAIDA, TEXTO, deve-se notar que no comando WRITE, no lugar do nmero do dispositivo que identifica o arquivo, usado uma varivel chamada UNIT, que um dado do programa. (c) Na linha programa. (d) Na linha VER = SYSTEM( TEXTO ), deve-se notar que no comando SYSTEM, no lugar de um texto especfico, como era feito antes, por exemplo no programa14a.f90, usado uma varivel chamada TEXTO. 6) Executar Build, Compile para compilar o programa. 7) Gerar o programa-executvel fazendo Build, Build. 8) Executar o programa atravs de Build, Execute com: Unidade de sada = 8 Nome do arquivo de sada = saida.txt O resultado deve ser o mostrado na Figura 14.2.
CLOSE(UNIT), deve-se notar que no comando CLOSE, no lugar do nmero do

dispositivo que identifica o arquivo, usado uma varivel chamada UNIT, que um dado do

Figura 14.2 Resultado do programa14b.f90 para os dados do item 8. 9) Executar o programa atravs de Build, Execute com: Unidade de sada = 9 Nome do arquivo de sada = saida.txt 10) Executar o programa atravs de Build, Execute com: Unidade de sada = 9 Nome do arquivo de sada = saida14b.txt 11) Executar o programa atravs de Build, Execute com:

Captulo 14. Arquivos de sada, de entrada e internos

168

Unidade de sada = 9 Nome do arquivo de sada = saida 12) Analisar os resultados da execuo do programa com os dados dos itens 8 a 11. 13) Alterar a linha OPEN(UNIT, file = SAIDA ) para OPEN(UNIT, file = SAIDA, form = "formatted" ) Em seguida, executar novamente os itens 6 a 8, acima. O resultado deve ser o mostrado na Figura 14.2. Isso ocorre porque o parmetro FORMATTED, no comando OPEN, que aparece aps a palavra-chave FORM, a opo default. Ou seja, usando-o ou no, o resultado o mesmo. Ele significa que o arquivo do tipo texto, isto , ao abri-lo, consegue-se ler o contedo, principalmente os nmeros, escritos na base decimal. 14) Alterar a linha OPEN(UNIT, file = SAIDA, form = "formatted" ) para OPEN(UNIT, file = SAIDA, form = "unformatted" ) Alterar tambm a linha WRITE(UNIT,11) UNIT, Pi, SAIDA, TEXTO para WRITE(UNIT) UNIT, Pi, SAIDA, TEXTO Em seguida, executar novamente os itens 6 a 8, acima. O resultado deve ser o mostrado na Figura 14.3. O parmetro UNFORMATTED, no comando OPEN, que aparece aps a palavra-chave FORM, usado para escrever resultados num arquivo do tipo binrio. Isto , ao abri-lo, no se consegue ler o contedo, de forma geral, principalmente os nmeros, escritos na base binria. Para escrever em forma binria, no comando WRITE deve-se indicar apenas o nmero do dispositivo do arquivo, conforme exemplificado neste item 14. O formato binrio muito indicado para gravar grandes quantidades de resultados, pois precisa menos espao em disco do que o formato texto. 15) No Fortran, para fechar o projeto atual, executar File, Close Workspace.

Figura 14.3 Resultado do programa14b.f90 para o item 14. 14.3 programa14c.f90 1) Objetivo do programa: adicionar resultados num arquivo j existente. 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa14c

Captulo 14. Arquivos de sada, de entrada e internos

169

3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa14c.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 14.2, que o programa14b.f90. 5) Alterar a linha OPEN(UNIT, file = SAIDA ) para OPEN(UNIT, file = SAIDA, position = "rewind" ) 6) Comentrios sobre o programa: O parmetro REWIND, no comando OPEN, que aparece aps a palavra-chave POSITION a opo default. Ou seja, usando-o ou no, o resultado o mesmo. Ele usado para fazer com que resultados sejam escritos a partir do incio de um arquivo, seja o arquivo novo ou j existente. 7) Executar Build, Compile para compilar o programa. 8) Gerar o programa-executvel fazendo Build, Build. 9) Executar o programa atravs de Build, Execute com: Unidade de sada = 8 Nome do arquivo de sada = saida.txt O resultado deve ser o mostrado na Figura 14.2. 10) Executar o programa atravs de Build, Execute com: Unidade de sada = 9 Nome do arquivo de sada = saida.txt O novo resultado difere do mostrado na Figura 14.2 apenas em UNIT = 9. 11) Alterar a linha OPEN(UNIT, file = SAIDA, position = "rewind" ) para OPEN(UNIT, file = SAIDA, position = "append" ) O parmetro APPEND, no comando OPEN, que aparece aps a palavra-chave POSITION usado para fazer com que resultados sejam escritos a partir do fim de um arquivo j existente. Se o arquivo for novo, os resultados sero escritos a partir do seu incio. 12) Executar novamente os itens 7 e 8, acima. 13) Executar novamente o item 9, acima. O resultado da execuo do programa14c.f90 deve ser o mostrado na Figura 14.4. Deve-se perceber que ele representa a soma das execues dos itens 10 e 13. 14) No Fortran, para fechar o projeto atual, executar File, Close Workspace. 14.4 programa14d.f90 1) Objetivos do programa: (a) ler os dados do programa de um arquivo, em vez de usar a janela DOS; e
Captulo 14. Arquivos de sada, de entrada e internos 170

(b) abrir o arquivo de dados com o aplicativo Notepad.

Figura 14.4 Resultado do programa14c.f90 para o item 13. 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa14d 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa14d.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 14.3. 5) Comentrios sobre o programa: (a) O programa14b.f90 praticamente igual ao programa14d.f90. A diferena est na forma de entrar os dados do programa. No primeiro usada a janela DOS e, no segundo, um arquivo de dados. (b) Na linha OPEN(1, file = "dados.txt" ) do programa14d.f90, define-se o nmero 1 como o dispositivo associado ao arquivo de dados chamado dados.txt. Tabela 14.3 Programa14d.f90
USE PORTLIB IMPLICIT NONE REAL*8 Pi INTEGER UNIT, VER CHARACTER(50) SAIDA, TEXTO VER = SYSTEM("Notepad dados.txt" ) OPEN(1, file = "dados.txt" ) READ(1,*) UNIT

Captulo 14. Arquivos de sada, de entrada e internos

171

READ(1,*) SAIDA CLOSE(1) Pi = DACOS(-1.0d0) TEXTO = "Notepad " // SAIDA OPEN(UNIT, file = SAIDA ) WRITE(UNIT,11) UNIT, Pi, SAIDA, TEXTO CLOSE(UNIT) 11 FORMAT( 1/, 5X, "UNIT =", I4, 1/, 5X, "Pi 1/, 5X, "SAIDA = ", A50, 1/, 5X, "TEXTO = ", A50 VER = SYSTEM( TEXTO ) END & & )

=", 1PE25.15, &

(c) Nas linhas READ(1,*) UNIT e READ(1,*) SAIDA os dois dados so lidos, variveis UNIT e SAIDA. Deve-se notar que so dois comandos READ, cada um sendo usado para ler uma nica varivel. Assim, aps o programa ler o contedo da varivel UNIT na primeira linha do arquivo dados.txt, tudo que estiver nesta linha aps o valor de UNIT no considerado pelo programa. Portanto, podem ser inseridos comentrios nos arquivos de dados para ficar claramente definido ao que corresponde cada dado. O mesmo se aplica ao valor da varivel SAIDA na segunda linha do arquivo dados.txt; o que est aps este dado, na mesma linha, no considerado pelo programa. (d) Recomenda-se sempre fazer isso: um dado por linha e, em seguida, na mesma linha, um comentrio para informar o que significa a varivel. Alm disso, nunca se deve usar formato para ler dados; este o motivo do asterisco nos dois comandos READ. Os formatos devem ser usados apenas para escrever resultados. (e) Todos os comentrios j feitos nos captulos anteriores e neste sobre o comando OPEN, para arquivos de resultados ou de sada, tambm valem para arquivos de entrada ou de dados. 6) Executar Build, Compile para compilar o programa. 7) Gerar o programa-executvel fazendo Build, Build.
Captulo 14. Arquivos de sada, de entrada e internos 172

8) Antes de executar um novo programa que use arquivo de dados, necessrio criar o arquivo de dados e inserir nele os respectivos dados. No caso do programa14d.f90, necessrio criar o arquivo dados.txt e inserir os dois dados que correspondem s variveis UNIT e SAIDA. Para fazer isso, executar o seguinte: (a) Start, Programs, Accessories, Notepad (b) Dentro do espao de edio do Notepad, editar:
8 saida.txt Unidade de saida (inteiro) Nome do arquivo de saida (caracter)

(c) File, Save (d) Na janela Save As, em File Name, colocar dados.txt; em Save in:, selecionar o diretrio do projeto. Em seguida, clicar sobre o boto Save. Finalmente, selecionar File, Exit. O resultado deve ser o mostrado na Figura 14.5.

Figura 14.5 Arquivo de dados dados.txt do programa14d.f90. 9) Executar o programa atravs de Build, Execute. O resultado dever ser: (a) A abertura do arquivo dados.txt com o programa Notepad. Se o arquivo no existir no diretrio do projeto, ocorrer um erro. Se o usurio quiser, poder alterar o contedo das variveis no arquivo dados.txt. Depois, deve-se gravar o arquivo alterado com File, Save. Finalmente, fechar o arquivo com File, Exit. (b) Em seguida, ocorrer a abertura do arquivo saida.txt com o programa Notepad. O contedo dever ser o mesmo mostrado na Figura 14.2. Fechar o arquivo com File, Exit. (c) Na janela do DOS, o resultado dever ser apenas a frase Press any key to continue 10) Executar novamente o programa atravs de Build, Execute com: Unidade de sada = 9 Nome do arquivo de sada = saida.txt Analisar o novo resultado. 11) Executar novamente o programa com outros dados e analisar o novo resultado. 12) Encerrar a sesso seguindo o procedimento-padro.

Captulo 14. Arquivos de sada, de entrada e internos

173

14.5 programa14e.f90 1) Objetivo do programa: usar arquivos internos. 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa14e 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa14e.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 14.4. 5) Comentrios sobre o programa: (a) At agora o dispositivo associado a um arquivo de resultados ou de dados era explicitamente um nmero ou uma varivel do tipo inteiro, por exemplo: a linha WRITE(9,11) UNIT, Pi do programa14a.f90, na qual o dispositivo o nmero 9; e a linha WRITE(UNIT,11) UNIT, Pi,
SAIDA, TEXTO do programa14b.f90, na qual o dispositivo a varivel inteira UNIT. O

dispositivo associado a um arquivo de resultados ou de dados tambm pode ser uma varivel do tipo caracter. (b) Na linha WRITE(TEXTO2,*) UNIT do programa14e.f90, define-se a varivel TEXTO2, do tipo caracter, como o dispositivo no qual ser escrito o contedo da varivel UNIT, que do tipo inteiro. (c) Na linha WRITE(TEXTO3,*) Pi do programa14e.f90, define-se a varivel TEXTO3, do tipo caracter, como o dispositivo no qual ser escrito o contedo da varivel Pi, que do tipo real dupla. (d) Na linha WRITE(TEXTO4,*) TEXTO // TEXTO3 do programa14e.f90, define-se a varivel TEXTO4, do tipo caracter, como o dispositivo no qual ser escrito o contedo da varivel TEXTO concatenada com o contedo da varivel TEXTO3, sendo ambas do tipo caracter. (e) Na linha READ(TEXTO3,*) TEXTO5 do programa14e.f90, define-se a varivel TEXTO3, do tipo caracter, como o dispositivo do qual ser lido o contedo da varivel TEXTO5, que do tipo caracter. Tabela 14.4 Programa14e.f90
USE PORTLIB IMPLICIT NONE REAL*8 Pi INTEGER UNIT, VER CHARACTER(30) SAIDA, TEXTO, TEXTO2, TEXTO3, TEXTO5 CHARACTER(70) TEXTO4

Captulo 14. Arquivos de sada, de entrada e internos

174

Pi = DACOS(-1.0d0) WRITE(*,*) "Unidade de saida (inteiro) =" READ(*,*) UNIT WRITE(*,*) "Nome do arquivo de saida (caracter) =" READ(*,*) SAIDA TEXTO = "Notepad " // SAIDA WRITE(TEXTO2,*) UNIT WRITE(TEXTO3,*) Pi WRITE(TEXTO4,*) TEXTO // TEXTO3 READ(TEXTO3,*) TEXTO5 OPEN(UNIT, file = SAIDA ) WRITE(UNIT,11) UNIT, Pi, SAIDA, TEXTO, TEXTO2, TEXTO3, TEXTO4, TEXTO5 CLOSE(UNIT) 11 FORMAT( 1/, 5X, "UNIT 1/, 5X, "Pi 1/, 5X, "SAIDA 1/, 5X, "TEXTO =", I4, = ", A30, = ", A30, & & & & & & )

=", 1PE25.15, &

1/, 5X, "TEXTO2 = ", A30, 1/, 5X, "TEXTO3 = ", A30, 1/, 5X, "TEXTO4 = ", A70, 1/, 5X, "TEXTO5 = ", A30 VER = SYSTEM( TEXTO ) END

6) Executar Build, Compile para compilar o programa. 7) Gerar o programa-executvel fazendo Build, Build. 8) Executar o programa atravs de Build, Execute com: Unidade de sada = 8 Nome do arquivo de sada = saida.txt
Captulo 14. Arquivos de sada, de entrada e internos 175

O resultado deve ser o mostrado na Figura 14.6. Analisar o resultado.

Figura 14.6 Resultado do programa14e.f90, com o item 8. 9) Executar novamente o programa atravs de Build, Execute com outros dados. Analisar o novo resultado. 10) Encerrar a sesso seguindo o procedimento-padro. 14.6 EXERCCIOS Exerccio 14.1 Seguindo o algoritmo do programa14d.f90, Tabela 14.3, refazer o exerccio 13.1 atendendo: (a) um arquivo para entrar os dados do programa; (b) no incio da execuo do programa, abrir automaticamente o arquivo de dados com o aplicativo Notepad; (c) um arquivo para escrever os resultados do programa, com o nome do arquivo sendo definido pelo usurio; (d) no final da execuo do programa, abrir automaticamente o arquivo de resultados com o aplicativo Notepad. Exerccio 14.2 Seguindo o algoritmo do programa14d.f90, Tabela 14.3, refazer o exerccio 13.2 atendendo aos mesmos 4 itens do exerccio 14.1.

Captulo 14. Arquivos de sada, de entrada e internos

176

Exerccio 14.3 Seguindo o algoritmo do programa14d.f90, Tabela 14.3, refazer o exerccio 9.3 atendendo aos mesmos 4 itens do exerccio 14.1. Exerccio 14.4 Seguindo o algoritmo do programa14d.f90, Tabela 14.3, refazer o programa da seo 12.4, Tabela 12.7, atendendo aos mesmos 4 itens do exerccio 14.1. Exerccio 14.5 Implementar uma nova verso do programa14d.f90 para que: (a) o nome do arquivo de dados seja definido pelo usurio; e (b) no incio da execuo do programa, o arquivo de dados seja aberto automaticamente com o aplicativo Notepad.

Captulo 14. Arquivos de sada, de entrada e internos

177

Captulo 15. INICIALIZAO, TEMPO DE CPU E DOS

OBJETIVOS DO CAPTULO Inicializar variveis e constantes junto com suas definies Verses DEBUG e RELEASE de um programa-executvel Comandos do FORTRAN: PARAMETER, Formato A<X> Funo do FORTRAN: TIMEF Comandos do DOS: MKDIR, COPY, ERASE, CD, RENAME, arquivo.BAT Para inicializar as atividades deste captulo, deve-se acessar o programa Fortran, no Windows, atravs de: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio 15.1 programa15a.f90 1) Objetivos do programa: (a) usar os novos comandos do FORTRAN: PARAMETER e formato A<X> (b) ao definir variveis, inicializar seus valores; e (c) escrever variveis do tipo caracter com tamanho exato de seu contedo, usando o comando FORMAT. 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa15a 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa15a.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 15.1. Tabela 15.1 Programa15a.f90
USE PORTLIB IMPLICIT NONE INTEGER VER, X CHARACTER(50) SAIDA, TEXTO, COMENTARIO

INTEGER :: UNIT = 20 REAL*8, PARAMETER :: Pi = 3.14159E+00

Captulo 15. Inicializao, tempo de CPU e DOS

178

VER = SYSTEM("Notepad DADOS.TXT" ) OPEN(1, file = "DADOS.TXT" ) READ(1,*) COMENTARIO READ(1,*) SAIDA CLOSE(1) OPEN(UNIT, file = SAIDA ) WRITE(UNIT,10) UNIT, Pi 10 FORMAT( /, 5X, "UNIT = ", I4, & 2/, 5X, "Pi = ", 1PE25.15 )

WRITE(UNIT,11) COMENTARIO 11 FORMAT( /, A50, " = COMENTARIO" ) X = LEN(TRIM(ADJUSTL(COMENTARIO))) WRITE(UNIT,12) TRIM(ADJUSTL(COMENTARIO)) 12 FORMAT( /, A<X>, " = COMENTARIO" ) CLOSE(UNIT) TEXTO = "Notepad " // SAIDA VER = SYSTEM( TEXTO ) END

5) Comentrios sobre o programa: (a) Na linha INTEGER :: UNIT = 20 est sendo definida a varivel UNIT como sendo do tipo inteiro e est sendo atribudo o valor 20 a ela. Ou seja, ela est sendo inicializada com o valor 20. (b) Na linha REAL*8, PARAMETER :: Pi = 3.14159E+00 est sendo definida a varivel Pi como sendo do tipo real de dupla preciso, est sendo atribudo o valor 3.14159 a ela. Ou seja, ela est sendo inicializada com o valor 3.14159. Alm disso, ela est sendo definida como uma constante atravs do comando PARAMETER. (c) Variveis inicializadas podem ser alteradas dentro do programa.
Captulo 15. Inicializao, tempo de CPU e DOS 179

(d) Variveis inicializadas e definidas como constantes, com o comando PARAMETER, no podem ser alteradas dentro do programa. Isso gera erro de compilao. (e) Diversas variveis podem ser inicializadas numa mesma linha de programa. Basta separ-las por vrgula. (f) Na linha
WRITE(UNIT,12) TRIM(ADJUSTL(COMENTARIO))

escreve-se

varivel

COMENTARIO no arquivo definido por UNIT, com o formato definido pelo nmero 12. O uso das funes TRIM e ADJUSTL permite eliminar espaos em branco existentes no contedo da varivel COMENTARIO, conforme visto no Captulo 4. (g) Na linha 12 FORMAT( /, A<X>, " = COMENTARIO" ) o identificador A, usado para escrever variveis do tipo caracter, est sendo usado numa forma avanada, que permite escrever variveis do tipo caracter com o tamanho exato de seu contedo. Isto , sem espaos em branco, que ocorrem devido ao pr-dimensionamento que necessrio fazer ao se definir uma varivel caracter, no caso CHARACTER(50) aplicao da funo LEN. 6) Executar Build, Compile para compilar o programa. 7) Gerar o programa-executvel fazendo Build, Build. 8) Antes de executar o programa, necessrio criar o arquivo de dados e inserir nele os respectivos dados. No caso do programa15a.f90, necessrio criar o arquivo DADOS.TXT e inserir os dois dados que correspondem s variveis COMENTARIO e SAIDA. Usar, por exemplo, os dados mostrados na Figura 15.1.
SAIDA, TEXTO, COMENTARIO. Na sintase A<X>, X uma

varivel inteira, definida por X = LEN(TRIM(ADJUSTL(COMENTARIO))), cujo valor resulta da

Figura 15.1 Exemplo de arquivo de dados para o programa15a.f90. 9) Executar o programa atravs de Build, Execute. O resultado deve ser o mostrado na Figura 15.2. 10) Executar novamente o programa com outros dados e analisar os novos resultados. 11) No Fortran, para fechar o projeto atual, executar File, Close Workspace. 15.2 programa15b.f90

Captulo 15. Inicializao, tempo de CPU e DOS

180

1) Objetivos do programa: (a) usar uma nova funo do FORTRAN: TIMEF; e (b) mostrar a diferena, em termos de tempo de processamento, das verses DEBUG e RELEASE de um programa-executvel.

Figura 15.2 Resultado do programa15a.f90 para os dados da Figura 15.1. 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa15b 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa15b.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 15.2. Tabela 15.2 Programa15b.f90
USE PORTLIB IMPLICIT NONE INTEGER VER, PASSOS, I CHARACTER(50) SAIDA, TEXTO

INTEGER :: UNIT = 20 REAL*8 T1, T2, SOMA VER = SYSTEM("Notepad DADOS.TXT" ) OPEN(1, file = "DADOS.TXT" ) READ(1,*) PASSOS READ(1,*) SAIDA

Captulo 15. Inicializao, tempo de CPU e DOS

181

CLOSE(1) T1 = TIMEF() SOMA = 0.0D0 DO I = 1, PASSOS SOMA = SOMA + I END DO T2 = TIMEF() OPEN(UNIT, file = SAIDA ) WRITE(UNIT,11) PASSOS, SOMA, T1, T2, T2-T1 11 FORMAT( 1/, "*** PRIMEIRA SOMA ***", & 1/, 5X, "PASSOS = ", I12, & 1/, 5X, "SOMA = ", 1PE25.10E3, & 1/, 5X, "T1 (segundos) = ", 1PE25.10E3, & 1/, 5X, "T2 (segundos)= ", 1PE25.10E3, & 1/, 5X, "Tempo de CPU = T2 - T1 (segundos)= ", 1PE25.10E3 ) T1 = TIMEF() SOMA = 0.0D0 DO I = 1, PASSOS SOMA = SOMA + I END DO T2 = TIMEF() WRITE(UNIT,12) PASSOS, SOMA, T1, T2, T2-T1 12 FORMAT( 1/, "*** SEGUNDA SOMA ***", & 1/, 5X, "PASSOS = ", I12, & 1/, 5X, "SOMA = ", 1PE25.10E3, & 1/, 5X, "T1 (segundos) = ", 1PE25.10E3, & 1/, 5X, "T2 (segundos)= ", 1PE25.10E3, & 1/, 5X, "Tempo de CPU = T2 - T1 (segundos)= ", 1PE25.10E3 ) CLOSE(UNIT) TEXTO = "Notepad " // SAIDA

Captulo 15. Inicializao, tempo de CPU e DOS

182

VER = SYSTEM( TEXTO ) END

5) Comentrios sobre o programa: (a) A funo TIMEF faz parte da biblioteca PORTLIB. Ela usada para medir o tempo de processamento ou tempo de CPU do programa entre dois pontos desejados. O tempo de CPU o tempo efetivamente gasto pelo processador do computador executando um programa ou parte de um programa. (b) A funo TIMEF mede o tempo de CPU em segundos. (c) A funo TIMEF usada como na linha T1 = TIMEF() do programa, onde T1 deve ser uma varivel do tipo real dupla. (d) Dentro de um programa, a primeira chamada da funo de TIMEF zera a contagem de tempo. As chamadas sucessivas, registram o tempo total transcorrido entre a zeragem e um ponto especfico do programa. Desta forma, o tempo de processamento entre dois pontos igual diferena entre os tempos registrados nestes dois pontos. (e) Como se poder perceber nos exemplos, a funo TIMEF no tem preciso muito elevada. A repetio de um programa pode gerar diferenas de at 0.05 segundo. (f) No FORTRAN, a medio do tempo de processamento de um programa tambm pode ser feita com as funes DTIME e ETIME, e a sub-rotina CPU_TIME. (g) No FORTRAN 95, por default, uma varivel do tipo inteiro no pode ter valor maior do que 2311, que corresponde a 2 147 483 647, ou seja, mais de 2 bilhes. (h) Por default, quando se compila e se gera o executvel de um programa, obtm-se a chamada verso DEBUG. Ela til para se encontrar erros de edio ou de uso dos comandos do FORTRAN, isto , erros de sintaxe ou erros de compilao. Mas, em termos de tempo de processamento, a verso DEBUG mais lenta (podendo chegar a 50%) do que a verso RELEASE. Alm disso, a verso DEBUG geralmente resulta num programa-executvel cujo arquivo precisa de mais memria em disco do que a verso RELEASE. Para definir o tipo de verso do programa, no menu principal do Fortran, deve-se executar Build, Set Default Configuration..., escolher a opo desejada e clicar no boto OK. Depois, deve-se compilar e gerar o executvel do programa. 6) Executar Build, Compile para compilar o programa. 7) Gerar o programa-executvel fazendo Build, Build. 8) Antes de executar o programa, necessrio criar o arquivo de dados e inserir nele os respectivos dados. No caso do programa15b.f90, necessrio criar o arquivo DADOS.TXT e inserir os dois

Captulo 15. Inicializao, tempo de CPU e DOS

183

dados que correspondem s variveis PASSOS e SAIDA. Usar, por exemplo, os dados mostrados na Figura 15.3, onde PASSOS igual a 100 milhes. 9) Executar o programa atravs de Build, Execute. O resultado mostrado na Figura 15.4. Os tempos de processamento se referem execuo do programa num microcomputador Pentium III de 750 MHz. Analisando-se o programa, deve-se perceber que os dois tempos de CPU deveriam ter exatamente o mesmo valor, mas na Figura 15.4 nota-se que h uma diferena entre eles de 0.01 s. A cada execuo do programa, tanto os valores do tempo de CPU quanto suas diferenas podem variar.

Figura 15.3 Exemplo de arquivo de dados para o programa15b.f90.

Figura 15.4 Resultado do programa15b.f90 para os dados da Figura 15.3, verso DEBUG. 10) Executar novamente o programa com outros dados e analisar os novos resultados. Utilizar, por exemplo, PASSOS = 10 milhes, 1 milho e 1 bilho. 11) Verificar se dentro do diretrio do projeto existe um subdiretrio chamado DEBUG. Se no, isto , se o diretrio existente for chamado RELEASE, onde se l DEBUG, nos itens 12 a 14, abaixo, deve-se ler RELEASE e vice-versa. 12) Mudar a verso do programa para RELEASE. Para fazer isso, executar Build, Set Default Configuration..., escolher a opo RELEASE, clicar no boto OK. Depois, executar Build,

Captulo 15. Inicializao, tempo de CPU e DOS

184

Compile para compilar novamente o programa. Gerar o novo programa-executvel fazendo Build, Build. 13) Verificar se dentro do diretrio do projeto tambm existe um subdiretrio chamado RELEASE. 14) Executar o programa atravs de Build, Execute. O novo resultado mostrado na Figura 15.5. Novamente, os dois tempos de CPU deveriam ter exatamente o mesmo valor, mas na Figura 15.5 nota-se que h uma diferena entre eles de 0.099 s. Comparando-se os tempos de processamento, verifica-se que a verso DEBUG mais lenta cerca de 43% do que a verso RELEASE.

Figura 15.5 Resultado do programa15b.f90 para os dados da Figura 15.3, verso RELEASE. 15) Executar novamente o programa com outros dados e analisar os novos resultados. Utilizar, por exemplo, PASSOS = 10 milhes, 1 milho e 1 bilho. 16) No Fortran, para fechar o projeto atual, executar File, Close Workspace. 15.3 programa15c.f90 1) Objetivo do programa: utilizar comandos do DOS durante a execuo do programa. 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa15c 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa15c.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 15.3, que o programa15c.f90.

Captulo 15. Inicializao, tempo de CPU e DOS

185

Tabela 15.3 Programa15c.f90


USE PORTLIB IMPLICIT NONE INTEGER DOS CHARACTER(50) SAIDA, COMENTARIO INTEGER :: UNIT = 20 DOS = SYSTEM("Notepad DADOS.TXT" ) OPEN(1, file = "DADOS.TXT" ) READ(1,*) COMENTARIO READ(1,*) SAIDA CLOSE(1) OPEN(UNIT, file = SAIDA ) WRITE(UNIT,11) COMENTARIO, SAIDA 11 FORMAT(1/, "COMENTARIO = ", A50, & 2/, "SAIDA CLOSE(UNIT) ! edio de comandos no arquivo EXECUTA.BAT OPEN(UNIT, file = "EXECUTA.BAT" ) WRITE(UNIT,*) "MKDIR C:\TEMP\FORTRAN" WRITE(UNIT,*) "COPY " // TRIM(SAIDA) // " C:\TEMP\FORTRAN\" // TRIM(SAIDA) WRITE(UNIT,*) "ERASE " // TRIM(SAIDA) WRITE(UNIT,*) "CD C:\TEMP\FORTRAN\" WRITE(UNIT,*) "RENAME "// TRIM(SAIDA) // " NOVO.TXT" CLOSE (UNIT) ! fim = ", A50 )

Captulo 15. Inicializao, tempo de CPU e DOS

186

DOS = SYSTEM ( "EXECUTA.BAT" ) DOS = SYSTEM( "Notepad C:\TEMP\FORTRAN\NOVO.TXT" ) END

5) Comentrios sobre o programa: (a) O comando do DOS chamado MKDIR usado para criar um novo diretrio. Ele usado na forma: MKDIR DIRETORIO onde DIRETORIO o nome do diretrio a ser criado, incluindo o caminho completo desde a raiz do HD (hard disk) ou disquete. Se o caminho no especificado, o diretrio criado dentro do diretrio no qual o comando executado. (b) O comando do DOS chamado COPY usado para copiar um arquivo em outro. Ele usado na forma: COPY ARQ1 ARQ2 onde ARQ1 o nome do arquivo a ser copiado em outro arquivo com o nome de ARQ2. Junto a ARQ1 e ARQ2 deve-se definir o diretrio de cada arquivo, incluindo o caminho completo desde a raiz do HD (hard disk) ou disquete. Se os diretrios e caminhos no so especificados, ARQ1 deve existir no diretrio no qual o comando executado, e ARQ2 gerado no mesmo diretrio. (c) O comando do DOS chamado ERASE usado para eliminar ou deletar um arquivo. Ele usado na forma: ERASE ARQ onde ARQ o nome do arquivo a ser eliminado. Junto a ARQ deve-se definir o seu diretrio, incluindo o caminho completo desde a raiz do HD (hard disk) ou disquete. Se o diretrio e caminho no so especificados, ARQ deve existir no diretrio no qual o comando executado. (d) O comando do DOS chamado CD usado para mudar a execuo do programa para outro diretrio. Ele usado na forma: CD DIRETORIO onde DIRETORIO o nome do diretrio para o qual passa a ser executado o programa, incluindo o caminho completo desde a raiz do HD (hard disk) ou disquete. Subentende-se que o diretrio existe dentro do diretrio no qual o comando executado. (e) O comando do DOS chamado RENAME usado para mudar o nome de um arquivo. Ele usado na forma: RENAME ARQ1 ARQ2

Captulo 15. Inicializao, tempo de CPU e DOS

187

onde ARQ1 o nome do arquivo existente, e ARQ2 o novo nome. Aqui valem os mesmos comentrios para ARQ1 e ARQ2 feitos no item (b), acima. (f) Ao se executar um arquivo com extenso .BAT, so executados todos os comandos DOS dentro deste arquivo, linha por linha, de cima para baixo. (g) Exemplos de aplicao dos comandos acima so apresentados no programa. (h) Existem diversos outros comandos do DOS que podem ser empregados em funo do objetivo desejado. 6) Executar Build, Compile para compilar o programa. 7) Gerar o programa-executvel fazendo Build, Build. 8) Antes de executar o programa, necessrio criar o arquivo de dados e inserir nele os respectivos dados. No caso do programa15c.f90, necessrio criar o arquivo DADOS.TXT e inserir os dois dados que correspondem s variveis COMENTARIO e SAIDA. Usar, por exemplo, os dados mostrados na Figura 15.1. 9) Algoritmo do programa: (a) ocorre a abertura do arquivo DADOS.TXT (b) so lidos os dois dados (c) cria-se o arquivo o arquivo de sada; escreve-se nele os dois dados lidos; e fecha-se este arquivo (d) cria-se o arquivo EXECUTA.BAT; dentro dele, so escritas diversas instrues DOS; fecha-se este arquivo (e) acessa-se o DOS para executar as instrues contidas no arquivo EXECUTA.BAT (f) acessa-se o DOS para abrir, com o aplicativo Notepad, o arquivo NOVO.TXT localizado em C:\TEMP\FORTRAN\ 10) Executar o programa atravs de Build, Execute. Analisar os resultados. A Figura 15.6 mostra o contedo do arquivo EXECUTA.BAT, gerado pelo programa15c.f90; verificar sua existncia no diretrio do projeto. A Figura 15.7 mostra os comandos que foram executados no DOS, como resultado da execuo do arquivo EXECUTA.BAT. A Figura 15.8 mostra o contedo do arquivo de resultado do programa15c.f90; deve-se notar que seu nome NOVO.TXT e que ele se localiza no diretrio C:\TEMP\FORTRAN\; verificar sua existncia; alm disso, o arquivo de sada foi eliminado do diretrio do projeto. 11) Encerrar a sesso seguindo o procedimento-padro.

Captulo 15. Inicializao, tempo de CPU e DOS

188

Figura 15.6 Contedo do arquivo EXECUTA.BAT gerado pelo programa15c.f90.

Figura 15.7 Janela DOS resultante da execuo do programa15c.f90.

Figura 15.8 Resultado da execuo do programa15c.f90. 15.4 EXERCCIOS Exerccio 15.1 Adaptar o programa15a.f90, Tabela 15.1, para:

Captulo 15. Inicializao, tempo de CPU e DOS

189

(a) inicializar uma varivel do tipo caracter; (b) inicializar uma constante do tipo caracter; (c) inicializar duas variveis do tipo inteiro numa mesma linha de programa; (d) inicializar duas constantes do tipo inteiro numa mesma linha de programa; e (e) escrever num arquivo os contedos das variveis e constantes dos itens (a) a (d). Exerccio 15.2 Adaptar o programa15b.f90, Tabela 15.2, para usar a funo DTIME junto com TIMEF e comparar o tempo de CPU medido por cada funo. Exerccio 15.3 Adaptar o programa15b.f90, Tabela 15.2, para que a varivel SOMA seja do tipo inteiro. Notar a reduo do tempo de CPU que ocorre. Exerccio 15.4 Adaptar o programa15b.f90, Tabela 15.2, para obter e escrever o tempo de CPU gasto entre a primeira e a ltima chamada da funo TIMEF. Exerccio 15.5 Adaptar o programa15b.f90, Tabela 15.2, para incluir, antes da ltima chamada da funo TIMEF, a instruo READ(*,*) Espere alguns segundos e pressione a tecla ENTER Analisar o efeito desta instruo vazia no tempo de CPU. Exerccio 15.6 Adaptar o programa15c.f90, Tabela 15.3, visando generalizar o nome do diretrio C:\TEMP\FORTRAN\ para qualquer nome que o usurio defina atravs do arquivo de dados.

Captulo 15. Inicializao, tempo de CPU e DOS

190

Captulo 16. MEMRIA E SUB-ROTINAS 2

OBJETIVOS DO CAPTULO Estimar e verificar a memria computacional necessria para executar um programa Utilizar sub-rotina recursiva Controlar o fluxo de informaes para dentro e para fora de sub-rotinas Comandos do FORTRAN: DEALLOCATE, RECURSIVE, INTENT(IN,OUT,INOUT) Para inicializar as atividades deste captulo, deve-se acessar o programa Fortran, no Windows, atravs de: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio 16.1 programa16a.f90 1) Objetivos do programa: (a) mostrar como estimar a memria computacional necessria para executar um programa; e (b) usar um novo comando do FORTRAN: DEALLOCATE. 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa16a 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa16a.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 16.1. 5) Comentrios sobre o programa: (a) O comando DEALLOCATE usado para eliminar da memria do computador variveis para as quais foi reservado memria por meio do comando ALLOCATE. Para us-lo basta a palavra DEALLOCATE e, dentro de parnteses, as diversas variveis separadas por vrgula. No necessrio indicar novamente o tamanho das variveis, pois isso j conhecido do comando ALLOCATE. O comando DEALLOCATE s pode ser usado com variveis cuja memria foi alocada com o comando ALLOCATE. (b) Na linha DEALLOCATE ( A ) a varivel A, do tipo inteiro, com N elementos, est sendo eliminada da memria do computador. (c) A estimativa da memria necessria para executar um programa pode ser obtida atravs da seguinte equao:

Captulo 16. Memria e sub-rotinas 2

191

Memria(kB) =

4 * ( N int eiro + N real simples ) + 8 * N real dupla 1024 e Nreal

+ 1* ( L * N caracter )

(16.1)

onde Ninteiro, Nreal

simples

dupla

representam o nmero total de elementos de conjuntos ou

matrizes de variveis do tipo inteiro, real simples e real dupla, respectivamente; Ncaracter representa o nmero total de elementos de variveis do tipo caracter que tem comprimento ou nmero de caracteres igual a L. Dentro do ltimo parnteses devem ser includos os produtos de outras variveis do tipo caracter com outros comprimentos. Os valores 4, 8 e 1 representam o nmero de bytes que cada um dos tipos de variveis ocupa de memria para um nico elemento. O valor 1024 um fator usado para converter o nmero de bytes em kilobytes (kB). Tabela 16.1 Programa16a.f90
USE PORTLIB IMPLICIT NONE INTEGER VER, N INTEGER, ALLOCATABLE, DIMENSION(:) :: A REAL*8, ALLOCATABLE, DIMENSION(:) :: B CHARACTER(10), ALLOCATABLE, DIMENSION(:) :: C CHARACTER(50) SAIDA, TEXTO REAL*8 M1, M2, M3, M4 INTEGER :: UNIT = 20 WRITE(*,*) "Ver memoria em uso no primeiro comando; depois clique Enter" READ(*,*) VER = SYSTEM("Notepad DADOS.TXT" ) OPEN(1, file = "DADOS.TXT" ) READ(1,*) N READ(1,*) SAIDA CLOSE(1) ALLOCATE ( A(N), B(N), C(N) ) WRITE(*,*) "Ver memoria apos ALLOCATE para A, B e C" READ(*,*) A = 1

Captulo 16. Memria e sub-rotinas 2

192

B = 1.0D0 C = "caracteres" WRITE(*,*) "Ver memoria apos atribuicao de valores para A, B e C" READ(*,*) M1 = N*4.0 / 1024 M2 = N*8.0 / 1024 M3 = N*1.0*10 / 1024 M4 = M1 + M2 + M3 OPEN(UNIT, file = SAIDA ) WRITE(UNIT,*) "Memoria estimada para A, inteiros (kiloBytes) = ", M1 WRITE(UNIT,*) "Memoria estimada para B, reais (kiloBytes) = ", M2 WRITE(UNIT,*) "Memoria estimada para C, caracteres (kiloBytes) = ", M3 WRITE(UNIT,*) "Memoria estimada para A, B e C (kiloBytes) = ", M4 CLOSE(UNIT) TEXTO = "Notepad " // SAIDA VER = SYSTEM( TEXTO ) DEALLOCATE ( A ) WRITE(*,*) "Ver memoria com B e C" READ(*,*) DEALLOCATE ( B ) WRITE(*,*) "Ver memoria com C" READ(*,*) DEALLOCATE ( C ) WRITE(*,*) "Ver memoria sem A, B e C" READ(*,*) END

6) Executar Build, Compile para compilar o programa.

Captulo 16. Memria e sub-rotinas 2

193

7) Gerar o programa-executvel fazendo Build, Build. 8) Antes de executar o programa, necessrio criar o arquivo de dados e inserir nele os respectivos dados. No caso do programa16a.f90, necessrio criar o arquivo DADOS.TXT e inserir os dois dados que correspondem s variveis N e SAIDA. Usar, por exemplo, os dados mostrados na Figura 16.1. 9) Para ver a memria efetivamente usada pelo programa, deve-se abrir o gerenciador de tarefas ou Task Manager, executando: (a) clicar o boto do lado direito do mouse sobre a barra de tarefas do Windows (b) clicar o boto do lado esquerdo do mouse sobre a opo Task Manager... (c) clicar na opo Processes do menu principal do Task Manager

Figura 16.1 Exemplo de arquivo de dados para o programa16a.f90. 10) Executar o programa atravs de Build, Execute. 11) Conforme indica a janela DOS, ver no Task Manager qual a memria inicial que o programa est usando. Para isso, deve-se selecionar a janela do Task Manager e encontrar o processo chamado programa16a.exe. Na linha deste processo, na ltima coluna designada por Mem Usage, indicada a memria em kilobytes (kB) que o programa est usando no momento. Neste exemplo, deve ser de 584 kB, como mostrado na Figura 16.2. Isso significa que, mesmo sem abrir memria para variveis do tipo conjunto, vetores ou matrizes com o comando ALLOCATE, a execuo de um programa requer uma determinada memria. Ela necessria para guardar as instrues do programa e os outros tipos de variveis. 12) Continuar a executar o programa16a.exe, mantendo a janela do Task Manager aberta para ver a cada etapa do programa quanto de memria ele est usando. Deve-se perceber que: (a) ao ser aberto o arquivo de dados com o aplicativo Notepad, a memria aumenta para 612 kB; (b) aps a leitura dos dados e fechamento do aplicativo Notepad, a memria est em 648 kB; (c) ao ser usado o comando ALLOCATE com as variveis A, B e C, a memria sobe para 668 kB; isso significa que de fato no est ainda sendo usada a memria para estas variveis, a no ser uma indicao das posies de memria que sero ocupadas;

Captulo 16. Memria e sub-rotinas 2

194

(d) aps a atribuio de valores s variveis A, B e C a memria sobe para 22184 kB; agora, de fato, o espao de memria aberto com o comando ALLOCATE para as variveis A, B e C est sendo usado; (e) aps a eliminao da varivel A, a memria cai para 18276 kB; (f) aps a eliminao das variveis A e B, a memria cai para 10460 kB; (g) aps a eliminao das variveis A, B e C, a memria cai para 676 kB; (h) finalmente, quando surgir na janela DOS (Figura 16.3) a frase Press any key to continue, significa que o programa foi encerrado e ele no ocupa mais memria alguma, como se pode ver no Task Manager.

Figura 16.2 Memria inicial usada pelo programa16a.exe. 13) A Figura 16.4 mostra a memria estimada com a Eq. (16.1) para as variveis A, B e C do programa16a.exe. Na Tabela 16.2 tem-se a comparao entre a memria estimada (Figura 16.4) e a memria efetivamente usada, que foi obtida do Task Manager, nos subitens (d) a (g) do item 12, acima. 14) Executar novamente o programa com outros valores para N e analisar os novos resultados. 15) No Fortran, para fechar o projeto atual, executar File, Close Workspace.

Captulo 16. Memria e sub-rotinas 2

195

Figura 16.3 Janela DOS aps a execuo do programa16a.exe.

Figura 16.4 Memria estimada para executar o programa16a.exe. Tabela 16.2 Comparao entre memria estimada e efetiva para as variveis A, B e C do programa16a.f90. Varivel A B C A, B e C 16.2 programa16b.f90 1) Objetivos do programa: (a) utilizar sub-rotina recursiva; e (b) usar um novo comando do FORTRAN: RECURSIVE 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa16b 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa16b.f90
Captulo 16. Memria e sub-rotinas 2 196

Memria usada (kB) 3912 7816 9784 21508

Memria estimada (kB) 3906 7812 9766 21484

Erro % 0.15 0.05 0.18 0.11

4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 16.3. 5) Comentrios sobre o programa: (a) Em algumas aplicaes pode ser necessrio que uma sub-rotina tenha que chamar ela prpria. Neste caso, na definio da sub-rotina necessrio usar o comando RECURSIVE antes do nome da sub-rotina. Um exemplo dado no programa16b.f90 na linha RECURSIVE SUBROUTINE
TESTE

(b) A chamada da sub-rotina feita da forma j descrita no captulo 12, isto , usando o comando CALL seguido do nome da sub-rotina. Um exemplo dado no programa16b.f90 na linha CALL
TESTE

Tabela 16.3 Programa16b.f90


PROGRAM RECURSIVO INTEGER SOMA, K, I, MENOS SOMA = 0 MENOS = 0 DO I = 1, 2 WRITE(*,*) "MAIN/ciclo: I,K,SOMA,MENOS=", I, K, SOMA, MENOS K = 4 CALL TESTE END DO WRITE(*,*) "MAIN/fora do ciclo: K, SOMA, MENOS = ", K, SOMA, MENOS CONTAINS ! ------------------------------------------------------------------RECURSIVE SUBROUTINE TESTE IF ( K == 1 ) THEN WRITE(*,*) "ROTINA,IF: K=1, SOMA, MENOS = ", K, SOMA, MENOS ELSE SOMA = SOMA + 1

Captulo 16. Memria e sub-rotinas 2

197

K = K - 1 WRITE(*,*) "ROTINA,ELSE: K, SOMA, MENOS = ", K, SOMA, MENOS CALL TESTE MENOS = MENOS - 1 WRITE(*,*) "ROTINA,APOS CALL: K, SOMA, MENOS = ", K, SOMA, MENOS END IF END SUBROUTINE TESTE ! ------------------------------------------------------------------END PROGRAM RECURSIVO

6) Executar Build, Compile para compilar o programa. 7) Gerar o programa-executvel fazendo Build, Build. 8) Algoritmo do programa: (a) definies iniciais de variveis e suas atribuies (b) no programa principal, inicia-se um ciclo para a varivel I (c) dentro deste ciclo, chama-se a sub-rotina TESTE, do tipo recursiva (d) dentro da sub-rotina TESTE, so executados uma condio e alguns comandos, e chama-se a prpria sub-rotina TESTE (e) a sub-rotina TESTE continua a chamar ela prpria at que seja satisfeita a condio (f) em seguida, comea-se a retornar para fora da sub-rotina TESTE tantas vezes quanto ela foi chamada por ela prpria, desde a ltima chamada at a primeira (g) finalmente, retorna-se ao programa principal e encerra-se a sua execuo 9) Executar o programa atravs de Build, Execute. O resultado mostrado na Figura 16.5. Analisar os resultados. 10) Alterar os valores do ciclo I e de K no programa principal. Executar novamente o programa e analisar os novos resultados. 11) No Fortran, para fechar o projeto atual, executar File, Close Workspace. 16.3 programa16c.f90 1) Objetivos do programa: (a) controlar o fluxo de informaes para dentro e para fora de sub-rotinas; e (b) usar um novo comando do FORTRAN: INTENT com parmetros IN, OUT e INOUT.

Captulo 16. Memria e sub-rotinas 2

198

2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa16c 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte programa16c.f90

Figura 16.5 Resultado do programa16b.f90. 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 16.4. 5) Comentrios sobre o programa: (a) O uso do comando IMPLICIT NONE no programa-principal obriga que sejam declaradas explicitamente todas as variveis usadas no programa-principal e em todas as sub-rotinas do mesmo programa. Caso contrrio, ocorrer erro de compilao. (b) Todas as variveis definidas no programa-principal so vlidas dentro das sub-rotinas do programa. Elas so chamadas de variveis globais. Por exemplo, as variveis A, B, C, D, E e F do programa16c.f90, definidas na linha INTEGER A, B, C, D, E, F, so variveis globais do programa. (c) As variveis definidas dentro de uma sub-rotina so vlidas somente dentro da prpria subrotina. Elas so chamadas de variveis locais. Seus valores ou contedos podem ser passados para outras sub-rotinas ou para o programa-principal atravs dos argumentos da sub-rotina. Por exemplo, as variveis R e S do programa16c.f90, definidas na linha INTEGER R, S, so variveis locais da sub-rotina TESTE. (d) Todas as atribuies feitas a variveis globais so reconhecidas dentro das sub-rotinas do programa. (e) Todas as atribuies feitas a variveis locais no so reconhecidas fora das sub-rotinas do programa.
Captulo 16. Memria e sub-rotinas 2 199

Tabela 16.4 Programa16c.f90


PROGRAM CAPITULO_16C IMPLICIT NONE INTEGER A, B, C, D, E, F WRITE(*,*) "Entre com o valor de A (inteiro)" READ(*,*) A WRITE(*,*) "Entre com o valor de B (inteiro)" READ(*,*) B C = 100 D = A E = B F = A + B WRITE(*,*) "no programa principal, antes da sub-rotina: C = 100 = ", C WRITE(*,*) "no programa principal, antes da sub-rotina: F = A+B = ", F CALL SOMA ( A, B, C, D, E ) WRITE(*,*) "no programa principal, depois da sub-rotina: F = 2*(A+B) = ", F WRITE(*,*) "no programa principal, depois da sub-rotina: C = A+B = ", C ! ------------------------------------------------------------------CONTAINS ! ------------------------------------------------------------------SUBROUTINE SOMA ( X, Y, Z, T, R ) INTEGER, INTENT(IN) INTEGER, INTENT(OUT) INTEGER S = 50 R, S :: X, Y :: Z

INTEGER, INTENT(INOUT) :: T

Captulo 16. Memria e sub-rotinas 2

200

WRITE(*,*) "dentro da sub-rotina: S = 50 = ", S WRITE(*,*) "dentro da sub-rotina: Z = C = ", Z Z = X + Y WRITE(*,*) "dentro da sub-rotina: Z = A+B = ", Z WRITE(*,*) "dentro da sub-rotina: T = A = ", T T = T + 10 R = R + 10 WRITE(*,*) "dentro da sub-rotina: T = A+10 = ", T WRITE(*,*) "dentro da sub-rotina: R = B+10 = ", R WRITE(*,*) "dentro da sub-rotina: F = A+B = ", F WRITE(*,*) "dentro da sub-rotina: A = ", A F = 2 * F WRITE(*,*) "dentro da sub-rotina: F = 2*(A+B) = ", F END SUBROUTINE SOMA ! ------------------------------------------------------------------END PROGRAM CAPITULO_16C

(f) O comando INTENT usado para controlar o fluxo de informaes para dentro e para fora das sub-rotinas. Ele usado quando se define cada varivel empregada como argumento das subrotinas. (g) O comando INTENT utilizado com trs parmetros (IN, OUT e INOUT) que definem o sentido do fluxo da informao. (h) O comando INTENT(IN) permite que a varivel apenas receba informao de fora da sub-rotina. Um exemplo dado no programa16c.f90 na linha INTEGER, INTENT(IN) :: X, Y. As variveis X e Y s podem receber informao de fora da sub-rotina TESTE. A tentativa de atribuir valor a elas dentro da sub-rotina gerar erro de compilao. Mas elas podem ser empregadas em expresses dentro da sub-rotina, como na linha Z = X + Y (i) O comando INTENT(OUT) permite que a varivel apenas envie informao para fora da subrotina. Um exemplo dado no programa16c.f90 na linha INTEGER, INTENT(OUT) :: Z. A varivel Z s pode enviar informao para fora da sub-rotina TESTE.

Captulo 16. Memria e sub-rotinas 2

201

(j) O comando INTENT(INOUT) permite que a varivel receba informao de fora da sub-rotina e tambm que ela envie informao para fora da sub-rotina. Um exemplo dado no programa16c.f90 na linha INTEGER, INTENT(INOUT) :: T. A varivel T pode receber e enviar informao na sub-rotina TESTE. (k) Quando no se usa o comando INTENT numa varivel que argumento de uma sub-rotina, por default, assume-se implicitamente que ela foi definida como INTENT(INOUT). Um exemplo dado no programa16c.f90 na linha INTEGER
R, S, mas apenas para a varivel R, uma vez que a

varivel S no argumento da sub-rotina TESTE. (l) Recomenda-se o uso do comando INTENT. Ele evita erros de lgica, principalmente em programas grandes com muitas variveis. (m) Recomenda-se usar como variveis globais apenas aquelas que so efetivamente usadas no programa-principal. Variveis utilizadas em sub-rotinas devem ser definidas apenas nas prprias sub-rotinas. 6) Executar Build, Compile para compilar o programa. 7) Gerar o programa-executvel fazendo Build, Build. 8) Executar o programa atravs de Build, Execute, usando por exemplo A = 1 e B = 2. O resultado mostrado na Figura 16.6. Analisar os resultados considerando os comentrios do item 5. 9) Executar novamente o programa com outros valores para A e B, e analisar os novos resultados. 10) Encerrar a sesso seguindo o procedimento-padro.

Figura 16.6 Resultado do programa16c.f90.

Captulo 16. Memria e sub-rotinas 2

202

16.4 EXERCCIOS Exerccio 16.1 Estimar e verificar a memria computacional necessria para usar uma matriz bidimensional, cujos elementos so do tipo inteiro, com X1 por Y1 elementos. Exerccio 16.2 Estimar e verificar a memria computacional necessria para usar uma matriz bidimensional, cujos elementos so do tipo real dupla, com X2 por Y2 elementos. Exerccio 16.3 Estimar e verificar a memria computacional necessria para usar uma matriz bidimensional, cujos elementos so do tipo caracter, cada um com 100 caracteres, com X3 por Y3 elementos. Exerccio 16.4 Juntar as matrizes dos exerccios 16.1 a 16.3 num nico programa para estimar e verificar a memria computacional total que necessria para as trs matrizes. Exerccio 16.5 Adaptar a sub-rotina FATORIAL, da Tabela 12.4, do captulo 12, para ser uma sub-rotina do tipo recursiva. E implementar um programa-principal para ela. Exerccio 16.6 Adaptar o programa12d, Tabela 12.7, do captulo 12, para: (a) usar onde pertinente o comando INTENT com IN, OUT e INOUT; (b) usar o comando IMPLICIT NONE no programa-principal; (c) ter uma sub-rotina com a finalidade de ler os dados de um arquivo; (d) ter uma sub-rotina com a finalidade de escrever os resultados num arquivo; e (e) ter uma sub-rotina com a finalidade de abrir os arquivos de dados e de sada com o aplicativo Notepad.

Captulo 16. Memria e sub-rotinas 2

203

Exerccio 16.7 Adaptar o programa16c.f90, Tabela 16.4, deste captulo, para ter como argumentos da sub-rotina TESTE variveis do tipo real dupla, caracteres e um conjunto unidimensional (vetor) com elementos do tipo inteiro.

Captulo 16. Memria e sub-rotinas 2

204

Captulo 17. MDULOS

OBJETIVOS DO CAPTULO Utilizar mdulos Comandos do FORTRAN: MODULE, END MODULE, PRIVATE, PUBLIC Para inicializar as atividades deste captulo, deve-se acessar o programa Fortran, no Windows, atravs de: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio 17.1 programa17a.f90 1) Objetivos do programa: (a) exemplificar o uso e as caractersticas bsicas de mdulos em FORTRAN; e (b) usar dois novos comandos do FORTRAN: MODULE, END MODULE. 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa17a 3) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte dados.f90 4) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 17.1. 5) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte saida.f90 6) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 17.2. 7) No Fortran, seguindo o procedimento-padro, criar e inserir no projeto o programa-fonte principal.f90 8) Dentro do espao de edio do Fortran, na subjanela maior, copiar exatamente o texto em vermelho mostrado na Tabela 17.3. 9) Comentrios sobre o programa: (a) Um mdulo praticamente igual a um programa-principal. A maior diferena que num mdulo no se pode ter comandos executveis antes do comando CONTAINS, ao contrrio do que ocorre num programa-principal. (b) A definio de mdulo em FORTRAN deve seguir a sintaxe mostrada na Tabela 17.4. O nome do mdulo segue as regras vlidas para variveis em FORTRAN, no podendo ser igual a nenhum outro nome de mdulo, varivel ou sub-rotina do programa. No caso de no haver sub-

Captulo 17. Mdulos

204

rotinas num mdulo, o comando CONTAINS no deve ser usado; um exemplo disso um mdulo usado para definir as variveis globais do programa. (c) O uso de mdulos facilita muito a estruturao de programas de grande porte prprios. (d) Para no haver problemas com definio de variveis, deve-se usar o comando IMPLICIT NONE dentro de cada mdulo. (e) Um mdulo pode ser usado dentro de uma sub-rotina, de outro mdulo ou dentro de um programa-principal atravs do comando USE seguido do nome do mdulo. (f) Dentro de um mdulo, as variveis definidas antes do comando CONTAINS so reconhecidas por todas as sub-rotinas do mdulo, ou seja, elas so variveis globais do mdulo onde esto definidas. (g) Um programa-fonte pode conter um ou vrios mdulos em seqncia. (h) A compilao dos programas-fonte que contm mdulos deve ser feita na seguinte ordem: (1) os mdulos que no dependem de outros; (2) os mdulos que dependem de outros; e (3) o programa-principal. 10) Executar Build, Compile para compilar o programa-fonte dados.f90. Repetir para saida.f90 e principal.f90, nesta ordem. 11) Gerar o programa-executvel fazendo Build, Build. Tabela 17.1 Programa-fonte dados.f90
MODULE DADOS IMPLICIT NONE REAL*8 CONTAINS SUBROUTINE LE_DADOS WRITE(*,*) "Entre com o valor de I" READ(*,*) I WRITE(*,*) "Entre com o valor de J" READ(*,*) J END SUBROUTINE LE_DADOS END MODULE DADOS I, J

Captulo 17. Mdulos

205

12) Executar o programa atravs de Build, Execute. Usar, por exemplo, os valores 1 e 2 para as variveis I e J, respectivamente. Neste caso, os resultados da execuo devem ser os mostrados nas Figuras 17.1 e 17.2. 13) Analisar os resultados mostrados nas Figuras 17.1 e 17.2 considerando os trs programas-fonte e os comentrios do item 9, acima. 14) No Fortran, para fechar o projeto atual, executar File, Close Workspace. Tabela 17.2 Programa-fonte saida.f90
MODULE SAIDA USE DADOS IMPLICIT NONE REAL*8 K CONTAINS SUBROUTINE CALCULOS K = I + J END SUBROUTINE CALCULOS SUBROUTINE RESULTADOS USE PORTLIB INTEGER VER INTEGER C CHARACTER(20) B B = "teste de fortran" C = 7 OPEN(1, file = "SAIDA.TXT" ) WRITE(1,3) I, J, K 3 FORMAT( 2/, "I = ", 1PE10.3, & 2/, "J = ", 1PE10.3, & 2/, "K = ", 1PE10.3 )

Captulo 17. Mdulos

206

WRITE(1,4) B, C 4 FORMAT(1/, 5X, A, "= B", & ) 2/, 5X, I5, "= C" CLOSE(1) VER = SYSTEM("Notepad SAIDA.TXT" ) END SUBROUTINE RESULTADOS END MODULE SAIDA

Tabela 17.3 Programa-fonte principal.f90


PROGRAM PROGRAMA17A USE SAIDA IMPLICIT NONE CALL LE_DADOS CALL CALCULOS CALL RESULTADOS WRITE(*,*) "I, J, K = ", I, J, K END PROGRAM PROGRAMA17A

Tabela 17.4 Sintaxe de um mdulo em FORTRAN.


MODULE NOME comandos USE e EXTERNAL definies de variveis CONTAINS sub-rotinas END MODULE NOME

17.2 programa17b.f90 1) Objetivo do programa: entender o uso de mdulos num programa composto por quatro mdulos.
Captulo 17. Mdulos 207

2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa17b 3) Acessar o site ftp://ftp.demec.ufpr.br/Disciplinas/Tm784/programa17b/

Figura 17.1 Arquivo com resultados do programa17a.exe.

Figura 17.2 Janela DOS aps a execuo do programa17a.exe. 4) Clicar com o boto do lado direito do mouse sobre o arquivo calculos.f90 5) Escolher a opo Save Target As 6) Na opo Save in, localizar o diretrio do projeto 7) Clicar no boto Save 8) Repetir os itens 4 a 7, acima, para os arquivos dados.f90, dados.txt, modulo.f90, resultados.f90 e variaveis.f90 9) Comentrios sobre o programa: (a) Ele composto por quatro mdulos, sendo cada um editado num programa-fonte. (b) O mdulo VARIAVEIS usado para definir todas as variveis usadas no programa. (c) O programa-principal incorpora apenas o mdulo RESULTADOS. Mas este, tem incorporado dentro de si o mdulo CALCULOS, que incorpora o mdulo DADOS, que finalmente incorpora

Captulo 17. Mdulos

208

o mdulo VARIAVEIS. Assim, todos os mdulos esto tambm implicitamente inseridos dentro do programa-principal. A ordem de compilao deve ser a inversa desta seqncia. 10) Estudar os quatro mdulos e o programa-principal considerando os comentrios do item 9 desta seo e da anterior. 11) Executar Build, Compile para compilar o programa-fonte variaveis.f90. Repetir para dados.f90, calculos.f90, resultados.f90 e principal.f90, nesta ordem. 12) Gerar o programa-executvel fazendo Build, Build. 13) Executar o programa atravs de Build, Execute. Usar, os dados conforme mostrado na Figura 17.3. 14) Analisar os resultados mostrados na Figuras 17.4.

Figura 17.3 Arquivo de dados do programa17b.exe.

Figura 17.4 Arquivo de resultados do programa17b.exe.

Captulo 17. Mdulos

209

15) Executar novamente o programa usando tipo_de_calculo = 2 e analisar os novos resultados. 16) Executar novamente o programa usando tipo_de_calculo = 3 e analisar os novos resultados. 17) No Fortran, para fechar o projeto atual, executar File, Close Workspace. 17.3 programa17c.f90 1) Objetivos do programa: (a) definir variveis pblicas e privadas em mdulos; (b) usar dois novos comandos do FORTRAN: PUBLIC e PRIVATE; e (c) entender o uso de mdulos com variveis pblicas e privadas num programa-exemplo. 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome programa17c 3) Acessar o site ftp://ftp.demec.ufpr.br/Disciplinas/Tm784/programa17c/ 4) Clicar com o boto do lado direito do mouse sobre o arquivo base.f90 5) Escolher a opo Save Target As 6) Na opo Save in, localizar o diretrio do projeto 7) Clicar no boto Save 8) Repetir os itens 4 a 7, acima, para os arquivos base2.f90 e main.f90 9) Comentrios sobre o programa: (a) Dois novos comandos do FORTRAN, associados ao uso de mdulos, so usados neste programa: PUBLIC e PRIVATE. (b) O comando PRIVATE empregado para definir uma varivel como privativa do mdulo no qual ela definida. Ou seja, ela s reconhecida pelas sub-rotinas definidas dentro do prprio mdulo. Ela no reconhecida como varivel dentro de outros mdulos ou do programaprincipal que utilizem o mdulo no qual ela est definida. Um exemplo dado na linha
integer,private :: N do mdulo PRIMEIRO: a varivel N s reconhecida como tal dentro

do mdulo PRIMEIRO; o mesmo ocorre com a varivel R. As variveis R e N do mdulo SEGUNDO so diferentes das variveis R e N do mdulo PRIMEIRO. (c) O comando PUBLIC empregado para definir uma varivel como global. Isto , ela reconhecida pelas sub-rotinas definidas dentro do prprio mdulo, e tambm dentro de outros mdulos ou do programa-principal que utilizem o mdulo no qual ela est definida. Um exemplo dado na linha integer,public
:: K do mdulo PRIMEIRO: a varivel K reconhecida

como tal dentro do mdulos PRIMEIRO e SEGUNDO, e do programa-principal. (d) Todas as variveis definidas num mdulo antes do comando CONTAINS so assumidas como PUBLIC, a menos que sejam explicitamente definidas como PRIVATE. Um exemplo dado na linha integer :: L do mdulo PRIMEIRO: a varivel L entendida como PUBLIC.
Captulo 17. Mdulos 210

(e) Mas todas as variveis definidas numa sub-rotina so assumidas como PRIVATE. 10) Estudar os dois mdulos e o programa-principal considerando os comentrios do item 9 desta seo e da seo 17.1. 11) Executar Build, Compile para compilar o programa-fonte base.f90. Repetir para base2.f90 e main.f90, nesta ordem. 12) Gerar o programa-executvel fazendo Build, Build. 13) Executar o programa atravs de Build, Execute. O resultado deve ser o mostrado na Figura 17.5. 14) Analisar os resultados. 15) Encerrar a sesso seguindo o procedimento-padro.

Figura 17.5 Arquivo com resultados do programa17c.exe. 17.4 EXERCCIOS Exerccio 17.1 (a) Transformar o programa12d.f90 num mdulo. (b) Fazer o mesmo para o programa16c.f90. (c) Criar um programa-principal para executar as rotinas destes dois mdulos.

Captulo 17. Mdulos

211

Captulo 18. SOLUO DE SRIES E RAZES DE EQUAES

OBJETIVOS DO CAPTULO Calcular o resultado de sries infinitas Aplicar os mtodos de iterao linear, bisseo e Newton para determinar razes de equaes Revisar o uso de arquivos de dados e de resultados, Notepad e Wgnuplot Alterar dinamicamente arquivo de comandos do programa de grficos Wgnuplot e usar novos comandos

Para inicializar as atividades deste captulo, deve-se acessar o programa Fortran, no Windows, atravs de: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio

18.1 programa18a.f90

1) Objetivos do programa: (a) exemplificar o clculo do resultado de sries infinitas; (b) revisar o uso de arquivos de dados e de resultados, Notepad e Wgnuplot; e (c) alterar dinamicamente arquivo de comandos do programa de grficos Wgnuplot e usar novos comandos. 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome projeto_18 3) Acessar o site ftp://ftp.demec.ufpr.br/Disciplinas/Tm784/projeto_18 4) Clicar com o boto do lado direito do mouse sobre o arquivo programa18a.f90 5) Escolher a opo Copiar para pasta... (Save Target As) 6) Localizar a pasta do projeto 7) Clicar no boto OK 8) Repetir os itens 3 a 7, acima, para os arquivos dados18a.txt, comandos18a.gnu, Wgnuplot.exe 9) No Fortran, seguindo o procedimento-padro, inserir no projeto o programa-fonte

programa18a.f90, mostrado na Tabela 18.1. 10) Estudar o programa-principal considerando os comentrios do item 11, abaixo. 11) Comentrios sobre o programa: (a) O programa18a.f90 composto pelo programa-principal e seis sub-rotinas. (b) A sub-rotina DADOS usada para ler os dados do programa do arquivo dados18a.txt.

Captulo 18. Soluo de sries e razes de equaes

212

(c) A sub-rotina SERIE_1 usada para calcular a soma dos N termos da seguinte srie geomtrica infinita:
1 = 1 I I =1

1 2

1 4

1 8

+ K =

(18.1)

(d) A sub-rotina SERIE_2 usada para calcular o valor de atravs da soma dos N termos da seguinte srie infinita:
(1) I K = 4 = I =0 ( 2 I + 1)

= 4 1

1 3

1 5

1 7

1 9

(18.2)

(e) A sub-rotina SERIE_3 usada para calcular o valor do nmero e atravs da soma dos N termos da seguinte srie infinita, onde cada termo envolve a sub-rotina FATORIAL: 1

= 1 +

1 + 1!

1 + 2!

1 + K = 3!

I !
I =0

= e

(18.3)

(f) As sub-rotinas das trs sries tambm calculam o erro para a soluo exata e escrevem no arquivo saida18a.txt o nmero e valor de cada termo da srie, a soma dos termos e o erro. (g) A sub-rotina GRAFICO: abre o arquivo comandos18a.gnu; pula as sete primeiras linhas deste arquivo; na oitava linha, escreve um comentrio para representar o ttulo do grfico de acordo com a srie escolhida para clculo; na nona linha, escreve outro comentrio, que o comando replot do Wgnuplot; finalmente, esta sub-rotina executa o programa Wgnuplot para fazer o grfico semilog do erro do clculo da srie escolhida, em funo do nmero de termos N usado. (h) O programa-principal: chama a sub-rotina DADOS; cria o arquivo saida18a.txt; escreve nele um comentrio na primeira linha para indicar o significado de cada coluna de resultados; o smbolo # usado para informar ao Wgnuplot que a linha apenas um comentrio, e no dados para o grfico; dependendo do tipo de srie escolhida pelo usurio chamada a sub-rotina adequada; o Notepad abre o arquivo de sada; e, chamada a sub-rotina para fazer o grfico do erro. 12) Executar Build, Compile para compilar o programa. 13) Gerar o programa-executvel fazendo Build, Build. 14) Executar o programa atravs de Build, Execute. Usar, os dados mostrados na Figura 18.1.

Captulo 18. Soluo de sries e razes de equaes

213

Tabela 18.1 Programa18a.f90


program series

use portlib

implicit none integer :: i, n, ver, tipo_serie real*8 :: soma, exato, erro, termo

call dados

open(6,file="saida18a.txt") write(6,10) 10 format("# i", t17,"termo", t47,"soma", t77,"erro")

select case ( tipo_serie ) case ( 1 ) call serie_1 case ( 2 ) call serie_2 case ( 3 ) call serie_3 end select

close(6)

ver = system ("Notepad saida18a.txt")

call grafico

!-------------------------------------------------

contains

!-------------------------------------------------

subroutine dados

ver = system ("Notepad dados18a.txt")

open(5,file="dados18a.txt") read(5,*) tipo_serie

Captulo 18. Soluo de sries e razes de equaes

214

read(5,*) n close(5)

end subroutine dados

!-------------------------------------------------

subroutine serie_1

! calcula soma de uma srie geomtrica

exato = 1

soma = 0

do i = 1, n termo = 1.0d0 / ( 2.0d0 ** i ) soma erro = soma + termo = dabs(exato - soma)

write(6,10) i, termo, soma, erro 10 format( i8, 3(1pe30.15e3) ) end do

end subroutine serie_1

!-------------------------------------------------

subroutine serie_2

! calcula soma da srie de pi

exato = dacos(-1.0d0)

soma = 0

do i = 0, n termo = 4.0d0 * ((-1)**i) / ( 2.0d0 * i + 1 ) soma erro = soma + termo = dabs(exato - soma)

write(6,10) i, termo, soma, erro 10 format( i8, 3(1pe30.15e3) ) end do

Captulo 18. Soluo de sries e razes de equaes

215

end subroutine serie_2

!-------------------------------------------------

subroutine serie_3

! calcula soma da srie de e

real*8 fatorial_i

exato = dexp(1.0d0)

soma = 0

do i = 0, n call fatorial ( i, fatorial_i) termo = 1 / fatorial_i soma erro = soma + termo = dabs(exato - soma)

write(6,10) i, termo, soma, erro 10 format( i8, 3(1pe30.15e3) ) end do

end subroutine serie_3

!-------------------------------------------------

subroutine fatorial(j,fat)

! calcula o fatorial de j

integer j real*8 fat, k

fat = 1

do k = 2, j fat = fat * k end do

end subroutine fatorial

!-------------------------------------------------

Captulo 18. Soluo de sries e razes de equaes

216

subroutine grafico

integer k

open(9,file="comandos18a.gnu") do k = 1, 7 read(9,*) end do

select case ( tipo_serie ) case ( 1 ) write(9,*) "set title 'srie geomtrica'" case ( 2 ) write(9,*) "set title 'srie de pi'" case ( 3 ) write(9,*) "set title 'srie de e'" end select

write(9,*) "replot"

close(9)

ver = system ("Wgnuplot comandos18a.gnu")

end subroutine grafico

!-------------------------------------------------

end program series

Figura 18.1 Arquivo de dados do programa18a.f90.

Captulo 18. Soluo de sries e razes de equaes

217

15) Analisar os resultados mostrados nas Figuras 18.2 e 18.3. 16) Executar novamente o programa usando tipo_serie = 2 e analisar os novos resultados. 17) Executar novamente o programa usando tipo_ serie = 3 e analisar os novos resultados. 18) Executar novamente o programa usando outros dados e analisar os novos resultados.

Figura 18.2 Parte do arquivo de resultados do programa18a.f90 para os dados da Fig. 18.1.

Figura 18.3. Grfico com resultados do programa18a.f90 para os dados da Fig. 18.1.

Captulo 18. Soluo de sries e razes de equaes

218

18.2 programa18b.f90

1) Objetivo do programa: para uma equao quadrtica especfica, aplicar os mtodos de iterao linear, bisseo e Newton para determinar suas razes. 2) Nesta seo ser usado o mesmo projeto da seo anterior. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa-fonte. b) Edit, Cut para retirar o programa-fonte do projeto. c) Clicar dentro do campo de edio de programa-fonte.
d) File, Close.

3) Acessar o site ftp://ftp.demec.ufpr.br/Disciplinas/Tm784/projeto_18 4) Clicar com o boto do lado direito do mouse sobre o arquivo programa18b.f90 5) Escolher a opo Copiar para pasta... (Save Target As) 6) Localizar a pasta do projeto 7) Clicar no boto OK 8) Repetir os itens 3 a 7, acima, para os arquivos dados18b.txt e comandos18b.gnu 9) No Fortran, seguindo o procedimento-padro, inserir no projeto o programa-fonte programa18b.f90, mostrado na Tabela 18.2. 10) Estudar o programa-principal considerando os comentrios do item 11, abaixo. 11) Comentrios sobre o programa: (a) O programa18b.f90 composto pelo programa-principal e cinco sub-rotinas. (b) Para as sub-rotinas DADOS e GRAFICO e o programa-principal valem os mesmos comentrios da seo anterior, exceto que os arquivos envolvidos so agora dados18b.txt, comandos18b.gnu e saida18b.txt. (c) As sub-rotinas LINEAR, BISSECAO e NEWTON resolvem a equao

x2

5x + 6 = 0

(18.4)

atravs dos mtodos de iterao linear, bisseo e Newton para determinar suas razes. Detalhes sobre estes mtodos podem ser encontrados na maioria dos livros de clculo numrico. 12) Executar Build, Compile para compilar o programa. 13) Gerar o programa-executvel fazendo Build, Build. 14) Executar o programa atravs de Build, Execute. Usar, os dados mostrados na Figura 18.4. 15) Analisar os resultados mostrados nas Figuras 18.5 e 18.6.
Captulo 18. Soluo de sries e razes de equaes 219

16) Executar novamente o programa usando tipo_metodo = 2 e analisar os novos resultados. 17) Executar novamente o programa usando tipo_metodo = 3 e analisar os novos resultados. 18) Executar novamente o programa usando tipo_metodo = 3, n = 20, exato = 3 e xo = 100 e analisar os novos resultados. 19) Executar novamente o programa usando outros dados e analisar os novos resultados. 20) No Fortran, para fechar o projeto atual, executar File, Close Workspace.

Tabela 18.2 Programa18b.f90


program raizes

use portlib

implicit none integer :: i, n, ver, tipo_metodo real*8 :: exato, erro, xo, x, r

call dados

x = xo

open(6,file="saida18b.txt") write(6,10) 10 format("# i", t17,"x", t47,"erro")

erro

= dabs(exato - x)

write(6,11) 0, x, erro 11 format( i8, 2(1pe30.15e3) )

select case ( tipo_metodo ) case ( 1 ) call linear case ( 2 ) call bissecao case ( 3 ) call newton end select

close(6)

ver = system ("Notepad saida18b.txt")

Captulo 18. Soluo de sries e razes de equaes

220

call grafico

!-------------------------------------------------

contains

!-------------------------------------------------

subroutine dados

ver = system ("Notepad dados18b.txt")

open(5,file="dados18b.txt") read(5,*) tipo_metodo read(5,*) n read(5,*) exato read(5,*) xo read(5,*) r close(5)

end subroutine dados

!-------------------------------------------------

subroutine linear

! calcula raiz de uma equao quadrtica com o mtodo da iterao linear

do i = 1, n x = ( ( x ** 2 ) + 6 ) / 5 erro = dabs(exato - x)

write(6,10) i, x, erro 10 format( i8, 2(1pe30.15e3) ) end do

end subroutine linear

!-------------------------------------------------

subroutine bissecao

! calcula raiz de uma equao quadrtica com o mtodo da bisseo

Captulo 18. Soluo de sries e razes de equaes

221

real*8 a, b, fa, fx

a = xo - r b = xo + r

do i = 1, n fx = x**2 - 5*x + 6 fa = a**2 - 5*a + 6 if ( fx*fa < 0 ) then b = x else a = x end if x = (a + b) / 2 erro = dabs(exato - x)

write(6,10) i, x, erro 10 format( i8, 2(1pe30.15e3) ) end do

end subroutine bissecao

!-------------------------------------------------

subroutine newton

! calcula raiz de uma equao quadrtica com o mtodo de Newton

real*8 f, fl

do i = 1, n f = x**2 - 5*x + 6

fl = 2*x - 5 x = x - f / fl = dabs(exato - x)

erro

write(6,10) i, x, erro 10 format( i8, 2(1pe30.15e3) ) end do

end subroutine newton

!-------------------------------------------------

subroutine grafico

Captulo 18. Soluo de sries e razes de equaes

222

integer k

open(9,file="comandos18b.gnu") do k = 1, 7 read(9,*) end do

select case ( tipo_metodo ) case ( 1 ) write(9,*) "set title 'mtodo da iterao linear'" case ( 2 ) write(9,*) "set title 'mtodo da bisseo'" case ( 3 ) write(9,*) "set title 'mtodo de Newton'" end select

write(9,*) "replot"

close(9)

ver = system ("Wgnuplot comandos18b.gnu")

end subroutine grafico

!-------------------------------------------------

end program raizes

Figura 18.4 Arquivo de dados do programa18b.f90.

Captulo 18. Soluo de sries e razes de equaes

223

18.3 EXERCCIOS

Exerccio 18.1

Adaptar o programa18a.f90 para incluir as seguintes opes de sries:

1 1x 2

1 2 x3

1 3x 4

+ K =

I ( I + 1)
I =1

= 1

(18.5)

= 1 +

x + 1!

x2 2!

x3 3!

+ K =

xI I ! = ex I =0

(18.6)

x3 3!

x5 5!

x7 7!

+ K =

(1) I x 2 I +1 (2 I + 1)! = sen( x) I =0

(18.7)

= 1

x2 2!

x4 4!

x6 6!

+ K =

(1) I x 2 I (2 I )! = cos( x) I =0

(18.8)

Figura 18.5 Parte do arquivo de resultados do programa18b.f90 para os dados da Fig. 18.4.

Exerccio 18.2

Adaptar o programa18a.f90 para usar preciso simples em todos os clculos com nmeros reais. Comparar os resultados com a verso original do programa18a.f90 na qual usa-se preciso dupla.

Captulo 18. Soluo de sries e razes de equaes

224

Exerccio 18.3

Adaptar o programa18b.f90 para usar preciso simples em todos os clculos com nmeros reais. Comparar os resultados com a verso original do programa18b.f90 na qual usa-se preciso dupla.

Exerccio 18.4

Adaptar o programa18b.f90 para resolver a seguinte equao:

x2

x 6 = 0

(18.9)

Figura 18.6 Grfico com resultados do programa18b.f90 para os dados da Fig. 18.4.

Captulo 18. Soluo de sries e razes de equaes

225

Captulo 19. DERIVADAS E INTEGRAIS NUMRICAS

OBJETIVOS DO CAPTULO Calcular derivadas numricas com quatro tipos de aproximaes numricas do mtodo de diferenas finitas: UDS, DDS, CDS-2 e CDS-4. Calcular integrais numricas com trs tipos de aproximaes numricas: regras do retngulo, trapzio e Simpson.

Para inicializar as atividades deste captulo, deve-se acessar o programa Fortran, no Windows, atravs de: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio

19.1 programa19a.f90

1) Objetivo do programa: calcular derivadas numricas com quatro tipos de aproximaes numricas do mtodo de diferenas finitas: UDS, DDS, CDS-2 e CDS-4. 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome projeto_19 3) Acessar o site ftp://ftp.demec.ufpr.br/Disciplinas/Tm784/projeto_19 4) Clicar com o boto do lado direito do mouse sobre o arquivo programa19a.f90 5) Escolher a opo Copiar para pasta... (Save Target As) 6) Localizar a pasta do projeto 7) Clicar no boto OK 8) Repetir os itens 3 a 7, acima, para os arquivos dados19a.txt, comandos19a.gnu, Wgnuplot.exe 9) No Fortran, seguindo o procedimento-padro, inserir no projeto o programa-fonte

programa19a.f90, mostrado na Tabela 19.1. 10) Estudar o programa-principal considerando os comentrios do item 11, abaixo. 11) Comentrios sobre o programa: (a) O programa19a.f90 composto pelo programa-principal e quatro sub-rotinas. (b) A sub-rotina DADOS usada para ler os dados do programa do arquivo dados19a.txt. (c) A sub-rotina EXPONENCIAL usada para calcular a derivada numrica da funo f = ex com quatro tipos de aproximaes numricas do mtodo de diferenas finitas:
df dx x f ( x) h f ( x h)

(UDS: um ponto a montante)

(19.1)

Captulo 19. Derivadas e integrais numricas

226

df dx x

f ( x + h) h

f ( x)

(DDS: um ponto a jusante)

(19.2)

df dx x

f ( x + h) f ( x h) 2h

(CDS-2: diferena central de 2 pontos)

(19.3)

(CDS-4: diferena central de 4 pontos)


df dx x 8 f ( x + h) 8 f ( x h) + f ( x 2h) 12h f ( x + 2h )

(19.4)

onde h = x, intervalo em x usado para aproximar cada derivada. Esta sub-rotina tambm calcula o erro de cada uma das quatro aproximaes numricas em relao soluo analtica da derivada que ex. (d) A sub-rotina POTENCIA usada para calcular a derivada numrica da funo f = x5 com os quatro tipos de aproximaes numricas das Eqs. (19.1) a (19.4). Esta sub-rotina tambm calcula o erro de cada uma das quatro aproximaes numricas em relao soluo analtica da derivada que 5x4. (e) A sub-rotina GRAFICO abre o arquivo comandos19a.gnu e desce as primeiras doze linhas deste arquivo. Na linha seguinte, escreve um comentrio para representar o ttulo do grfico de acordo com a funo escolhida para calcular a derivada. E na linha seguinte, escreve outro comentrio, que o comando replot do Wgnuplot. Finalmente, esta sub-rotina executa o programa Wgnuplot para fazer o grfico log-log do erro do clculo da derivada da funo escolhida, para cada uma das quatro aproximaes numricas, em funo do nmero de refinos de h definido nos dados do programa. (f) O programa-principal: (1) define suas variveis globais; (2) chama a sub-rotina DADOS; (3) cria o arquivo saida19a.txt; (4) escreve nele um comentrio na primeira linha para indicar o significado de cada coluna de resultados (o smbolo # usado para informar ao Wgnuplot que a linha apenas um comentrio, e no dados para o grfico); (5) dependendo do tipo de funo escolhida pelo usurio, chamada a sub-rotina adequada; (6) o Notepad abre o arquivo de sada; e, (7) chamada a sub-rotina para fazer o grfico dos erros com os comandos mostrados na Figura 19.1. 12) Executar Build, Compile para compilar o programa. 13) Gerar o programa-executvel fazendo Build, Build. 14) Executar o programa atravs de Build, Execute. Usar, os dados mostrados na Figura 19.2.

Captulo 19. Derivadas e integrais numricas

227

Tabela 19.1 Programa19a.f90


program derivadas

use portlib

implicit none

integer :: i integer :: L

! nmero da aproximao de cada delta ! nmero de refinos de hmax

integer :: ver ! auxlio de System integer :: tipo_funcao ! tipo de funo a derivar

real*8 real*8 real*8 real*8

:: hmax :: r :: X

! maior delta ! razo de refino dos deltas ! coordenada para calcular a derivada

:: exato ! soluo analtica da derivada

call dados ! l os dados do programa

open(6,file="saida19a.txt") !

write(6,10) 10 format("#", t5,"h", t20,"E(UDS)", t35,"E(DDS)", t50,"E(CDS-2)", t65,"E(CDS-4)")

select case ( tipo_funcao ) case ( 1 ) call exponencial case ( 2 ) call potencia end select

close(6)

ver = system ("Notepad saida19a.txt")

call grafico

!-------------------------------------------------

contains

!-------------------------------------------------

Captulo 19. Derivadas e integrais numricas

228

subroutine dados

ver = system ("Notepad dados19a.txt")

open(5,file="dados19a.txt") read(5,*) tipo_funcao read(5,*) hmax read(5,*) r read(5,*) L read(5,*) X close(5)

end subroutine dados

!-------------------------------------------------

subroutine exponencial

real*8 :: xw,

h,

fp,

fw,

fl_UDS, fl_DDS, xe, fe, fl_CDS2, &

xww, xee, fww, fee, fl_CDS4

! calcula a derivada da exponencial de X

exato = dexp(X)

do i = 0, L

h = hmax / ( r ** i )

xw xe

= X - h = X + h

xww = X - 2*h xee = X + 2*h

fp fw fe

= dexp(x) = dexp(xw) = dexp(xe)

fww = dexp(xww) fee = dexp(xee)

fl_UDS fl_DDS

= ( fp - fw ) / h = ( fe - fp ) / h

fl_CDS2 = ( fe - fw ) / (2 * h)

Captulo 19. Derivadas e integrais numricas

229

fl_CDS4 = ( 8*fe - 8*fw + fww - fee ) / (12 * h)

write(6,10) h, dabs(exato-fl_UDS),

dabs(exato-fl_DDS), &

dabs(exato-fl_CDS2), dabs(exato-fl_CDS4) 10 format( 5(1pe15.5) )

end do

end subroutine exponencial

!-------------------------------------------------

subroutine potencia

real*8 :: xw,

h,

fp,

fw,

fl_UDS, fl_DDS, xe, fe, fl_CDS2, &

xww, xee, fww, fee, fl_CDS4

! calcula a derivada de X**5

exato = 5*X**4

do i = 0, L

h = hmax / ( r ** i )

xw xe

= X - h = X + h

xww = X - 2*h xee = X + 2*h

fp fw fe

= x**5 = xw**5 = xe**5

fww = xww**5 fee = xee**5

fl_UDS fl_DDS

= ( fp - fw ) / h = ( fe - fp ) / h

fl_CDS2 = ( fe - fw ) / (2 * h) fl_CDS4 = ( 8*fe - 8*fw + fww - fee ) / (12 * h)

write(6,10) h, dabs(exato-fl_UDS),

dabs(exato-fl_DDS), &

dabs(exato-fl_CDS2), dabs(exato-fl_CDS4)

Captulo 19. Derivadas e integrais numricas

230

10 format( 5(1pe15.5) )

end do

end subroutine potencia

!-------------------------------------------------

subroutine grafico

integer k

open(9,file="comandos19a.gnu") do k = 1, 12 read(9,*) end do

select case ( tipo_funcao ) case ( 1 ) write(9,*) "set title 'derivada de exponencial(X)'" case ( 2 ) write(9,*) "set title 'derivada de X**5'" end select

write(9,*) "replot"

close(9)

ver = system ("Wgnuplot comandos19a.gnu")

end subroutine grafico

!-------------------------------------------------

end program derivadas

15) Analisar os resultados mostrados nas Figuras 19.3 e 19.4. Exceto nos maiores valores de h, as aproximaes UDS e DDS apresentam quase os mesmos valores de erro. Conforme previsto pela teoria, as aproximaes CDS-2 e CDS-4 apresentam os menores valores de erro para um mesmo h. Teoricamente, o erro de cada aproximao deveria sempre se reduzir com a reduo de h, e deveria

Captulo 19. Derivadas e integrais numricas

231

atingir o valor nulo para h = 0. Porm, na prtica, os erros de arredondamento impem um limite mnimo ao erro de cada aproximao, como mostrado na Figura 19.4 para o CDS-2 e CDS-4. 16) Executar novamente o programa usando X = 10 e analisar os novos resultados. 17) Executar novamente o programa usando X = 0.1 e analisar os novos resultados. 18) Executar novamente o programa usando tipo de funo = 2 e analisar os novos resultados. 19) Executar novamente o programa usando outros dados e analisar os novos resultados.

Figura 19.1 Arquivo de comandos para o aplicativo Wgnuplot do programa19a.f90.

Figura 19.2 Arquivo de dados do programa19a.f90.

Figura 19.3 Arquivo de resultados do programa19a.f90 para os dados da Fig. 19.2.

Captulo 19. Derivadas e integrais numricas

232

Figura 19.4. Grfico com resultados do programa19a.f90 para os dados da Fig. 19.2.

19.2 programa19b.f90

1) Objetivo do programa: calcular integrais numricas com trs tipos de aproximaes numricas: regras do retngulo, trapzio e Simpson. 2) Nesta seo ser usado o mesmo projeto da seo anterior. Portanto, deve-se executar o seguinte no Fortran: a) Clicar sobre o nome do programa-fonte. b) Edit, Cut para retirar o programa-fonte do projeto. c) Clicar dentro do campo de edio de programa-fonte. d) File, Close. 3) Acessar o site ftp://ftp.demec.ufpr.br/Disciplinas/Tm784/projeto_19 4) Clicar com o boto do lado direito do mouse sobre o arquivo programa19b.f90 5) Escolher a opo Copiar para pasta... (Save Target As) 6) Localizar a pasta do projeto 7) Clicar no boto OK 8) Repetir os itens 3 a 7, acima, para os arquivos dados19b.txt e comandos19b.gnu 9) No Fortran, seguindo o procedimento-padro, inserir no projeto o programa-fonte programa19b.f90, mostrado na Tabela 19.2. 10) Estudar o programa-principal considerando os comentrios do item 11, abaixo.

Captulo 19. Derivadas e integrais numricas

233

Tabela 19.2 Programa19b.f90


program integrais

use portlib

implicit none

integer :: i integer :: j

! nmero do refino dos elementos de integrao ! nmero do elemento de integrao

integer :: Nmin ! nmero mnimo de elementos de integrao integer :: L integer :: r integer :: ver ! nmero de refinos de elementos de integrao ! razo de aumento de elementos de integrao ! auxlio de System

integer :: tipo_funcao ! tipo de funo a derivar

real*8 real*8

:: h

! tamanho dos elementos de integrao

:: exato ! soluo analtica da derivada

call dados ! l os dados do programa

open(6,file="saida19b.txt") !

write(6,10) 10 format("#", t5,"h", t20,"E(retngulo)", t35,"E(trapzio)", t50,"E(simpson)")

select case ( tipo_funcao ) case ( 1 ) call exponencial case ( 2 ) call potencia end select

close(6)

ver = system ("Notepad saida19b.txt")

call grafico

!-------------------------------------------------

contains !-------------------------------------------------

Captulo 19. Derivadas e integrais numricas

234

subroutine dados

ver = system ("Notepad dados19b.txt")

open(5,file="dados19b.txt") read(5,*) tipo_funcao read(5,*) Nmin read(5,*) r read(5,*) L close(5)

end subroutine dados

!-------------------------------------------------

subroutine exponencial

real*8 :: xp, fp, ret, trap, xw, fw, simp, xe, fe

! calcula a integral da exponencial de X entre 0 e 1

exato = dexp(1.0d0) - 1

do i = 0, L

h = 1.0d0 / ( Nmin * (r ** i) )

ret

= 0.0d0

trap = 0.0d0

do j = 1, Nmin*(r**i)

xp = h*(j-0.5d0) fp = dexp(xp) ret = ret + fp * h

xp = h*j xw = xp - h fw = dexp(xw) fp = dexp(xp) trap = trap + h*(fw+fp)/2

end do

Captulo 19. Derivadas e integrais numricas

235

simp = 0.0d0

do j = 2, Nmin*(r**i), 2

xp = h*(j-1) xw = xp - h xe = xp + h fw = dexp(xw) fe = dexp(xe) fp = dexp(xp) simp = simp + h*(fw+4*fp+fe)/3

end do

write(6,10) h, dabs(exato-ret), dabs(exato-trap), dabs(exato-simp)

10 format( 4(1pe15.5) )

end do

end subroutine exponencial

!-------------------------------------------------

subroutine potencia

real*8 :: xp, fp, ret, trap, xw, fw, simp, xe, fe

! calcula a integral de X**5 entre 0 e 1

exato = 1 / 6.0d0

do i = 0, L

h = 1.0d0 / ( Nmin * (r ** i) )

ret

= 0.0d0

trap = 0.0d0

do j = 1, Nmin*(r**i)

xp = h*(j-0.5d0)

Captulo 19. Derivadas e integrais numricas

236

fp = xp**5 ret = ret + fp * h

xp = h*j xw = xp - h fw = xw**5 fp = xp**5 trap = trap + h*(fw+fp)/2

end do

simp = 0.0d0

do j = 2, Nmin*(r**i), 2

xp = h*(j-1) xw = xp - h xe = xp + h fw = xw**5 fe = xe**5 fp = xp**5 simp = simp + h*(fw+4*fp+fe)/3

end do

write(6,10) h, dabs(exato-ret), dabs(exato-trap), dabs(exato-simp)

10 format( 4(1pe15.5) )

end do

end subroutine potencia

!-------------------------------------------------

subroutine grafico

integer k

open(9,file="comandos19b.gnu") do k = 1, 11 read(9,*) end do

Captulo 19. Derivadas e integrais numricas

237

select case ( tipo_funcao ) case ( 1 ) write(9,*) "set title 'integral de exponencial(X) entre 0 e 1'" case ( 2 ) write(9,*) "set title 'integral de X**5 entre 0 e 1'" end select

write(9,*) "replot"

close(9)

ver = system ("Wgnuplot comandos19b.gnu")

end subroutine grafico

!-------------------------------------------------

end program integrais

11) Comentrios sobre o programa: (a) O programa19b.f90 composto pelo programa-principal e quatro sub-rotinas. (b) A sub-rotina DADOS usada para ler os dados do programa do arquivo dados19b.txt. (c) A sub-rotina EXPONENCIAL usada para calcular a integral numrica da funo f = ex com trs tipos de aproximaes numricas:

f dx

[ f ( x ) h]
k =1 k

(regra do retngulo)

(19.5)

onde h = x = 1/N; N = nmero de intervalos de integrao; xk = h*(k-).

f dx

f ( xk 1 ) + f ( xk ) h 2 k =1
N

(regra do trapzio)

(19.6)

onde xk = h*k.
f ( xk 2 ) + 4 f ( xk 1 ) + f ( xk ) h 3 k = 2 , 4 ,...

f dx

(regra de Simpson)

(19.7)

Captulo 19. Derivadas e integrais numricas

238

onde xk = h*k. Esta sub-rotina tambm calcula o erro de cada uma das trs aproximaes numricas em relao soluo analtica da integral que e-1. (d) A sub-rotina POTENCIA usada para calcular a integral numrica da funo f = x5 com os trs tipos de aproximaes numricas das Eqs. (19.5) a (19.7). Esta sub-rotina tambm calcula o erro de cada uma das trs aproximaes numricas em relao soluo analtica da integral que 1/6. (e) A sub-rotina GRAFICO abre o arquivo comandos19b.gnu e desce as primeiras onze linhas deste arquivo. Na linha seguinte, escreve um comentrio para representar o ttulo do grfico de acordo com a funo escolhida para calcular a integral. E na linha seguinte, escreve outro comentrio, que o comando replot do Wgnuplot. Finalmente, esta sub-rotina executa o programa Wgnuplot para fazer o grfico log-log do erro do clculo da integral da funo escolhida, para cada uma das trs aproximaes numricas, em funo do nmero (N) de intervalos (h) de integrao definido com os dados do programa. (f) O programa-principal: (1) define suas variveis globais; (2) chama a sub-rotina DADOS; (3) cria o arquivo saida19b.txt; (4) escreve nele um comentrio na primeira linha para indicar o significado de cada coluna de resultados (o smbolo # usado para informar ao Wgnuplot que a linha apenas um comentrio, e no dados para o grfico); (5) dependendo do tipo de funo escolhida pelo usurio, chamada a sub-rotina adequada; (6) o Notepad abre o arquivo de sada; e, (7) chamada a sub-rotina para fazer o grfico dos erros com os comandos mostrados na Figura 19.5.

Figura 19.5 Arquivo de comandos para o aplicativo Wgnuplot do programa19b.f90.

12) Executar Build, Compile para compilar o programa. 13) Gerar o programa-executvel fazendo Build, Build. 14) Executar o programa atravs de Build, Execute. Usar, os dados mostrados na Figura 19.6. 15) Analisar os resultados mostrados nas Figuras 19.7 e 19.8. Conforme previsto pela teoria, as aproximaes das regras do retngulo e trapzio devem ter erros similares, enquanto que o erro da

Captulo 19. Derivadas e integrais numricas

239

regra de Simpson deve ser o menor, para um mesmo h. Teoricamente, o erro de cada aproximao deveria sempre se reduzir com a reduo de h, e deveria atingir o valor nulo para h = 0. Porm, na prtica, os erros de arredondamento impem um limite mnimo ao erro de cada aproximao, como mostrado na Figura 19.8 para a regra de Simpson. 16) Executar novamente o programa usando tipo de funo = 1 e analisar os novos resultados. 17) Executar novamente o programa usando outros dados e analisar os novos resultados. 18) No Fortran, para fechar o projeto atual, executar File, Close Workspace.

Figura 19.6 Arquivo de dados do programa19b.f90.

Figura 19.7 Arquivo de resultados do programa19b.f90 para os dados da Fig. 19.6.

19.3 EXERCCIOS

Exerccio 19.1

Acrescentar uma sub-rotina no programa19a.f90 para calcular a derivada de f = 3ex. Incluir a nova opo de funo no arquivo de dados e no programa. Apresentar arquivo com o erro dos quatro tipos de aproximaes e respectivo grfico.

Captulo 19. Derivadas e integrais numricas

240

Exerccio 19.2

Acrescentar uma sub-rotina no programa19a.f90 para calcular a derivada de f = x4. Incluir a nova opo de funo no arquivo de dados e no programa. Apresentar arquivo com o erro dos quatro tipos de aproximaes e respectivo grfico.

Figura 19.8. Grfico com resultados do programa19b.f90 para os dados da Fig. 19.6.

Exerccio 19.3

Acrescentar uma sub-rotina no programa19b.f90 para calcular a integral de f = 3ex. Incluir a nova opo de funo no arquivo de dados e no programa. Apresentar arquivo com o erro dos trs tipos de aproximaes e respectivo grfico.

Exerccio 19.4

Acrescentar uma sub-rotina no programa19b.f90 para calcular a integral de f = x4. Incluir a nova opo de funo no arquivo de dados e no programa. Apresentar arquivo com o erro dos trs tipos de aproximaes e respectivo grfico.

Captulo 19. Derivadas e integrais numricas

241

Captulo 20. SOLUO DE SISTEMAS DE EQUAES

OBJETIVOS DO CAPTULO Aplicar, num nico programa, diversos recursos e comandos do FORTRAN vistos nos captulos anteriores. Resolver sistemas de equaes lineares com mtodos diretos e iterativos.

Para inicializar as atividades deste captulo, deve-se acessar o programa Fortran, no Windows, atravs de: Start, Programs, Fortran PowerStation 4.0, Microsoft Developer Studio

20.1 programa20a.f90

1) Objetivo do programa: resolver um problema de conduo de calor unidimensional permanente atravs de simulao numrica com o mtodo de diferenas finitas. A soluo dos sistemas de equaes lineares do problema obtida com mtodos diretos e iterativos. 2) No Fortran, seguindo o procedimento-padro, criar um projeto com o nome projeto_20a 3) Acessar o site ftp://ftp.demec.ufpr.br/Disciplinas/Tm784/projeto_20a 4) Clicar com o boto do lado direito do mouse sobre o arquivo programa20a.f90 5) Escolher a opo Copiar para pasta... (Save Target As) 6) Localizar a pasta do projeto 7) Clicar no boto OK 8) Repetir os itens 3 a 7, acima, para os arquivos variaveis.f90, solvers_1D.f90, dados.f90, coeficientes.f90, resultados.f90, programa20a.ent, comandos20a.gnu e Wgnuplot.exe 9) No Fortran, seguindo o procedimento-padro, inserir no projeto o programa-fonte variaveis.f90, mostrado na Tabela 20.1. 10) Repetir o item 9 para os programas-fonte: solvers_1D.f90 (Tabela 20.2), dados.f90 (Tabela 20.3), coeficientes.f90 (Tabela 20.4), resultados.f90 (Tabela 20.5) e programa20a.f90 (Tabela 20.6). 11) Estudar o programa-principal considerando os comentrios do item 12, abaixo. 12) Comentrios sobre o programa: (a) O programa20a.f90 composto pelo programa-principal e cinco mdulos, editados em seis programas-fonte diferentes. (b) No mdulo VARIAVEIS, contido no programa-fonte variaveis.f90, so definidas as variveis globais do programa. Este mdulo no contm nenhuma sub-rotina.

Captulo 20. Soluo de sistemas de equaes

242

(c) O mdulo SOLVERS_1D, contido no programa-fonte solvers_1D.f90, dedicado soluo de sistemas de equaes lineares do tipo

AT

(20.1)

originados de problemas unidimensionais. A a matriz de coeficientes, T o vetor incgnita e B o vetor dos termos independentes. A dimenso de A NxN, e de T e B, Nx1, onde N o nmero de incgnitas (T) do problema. Este mdulo contm quatro sub-rotinas. Trs delas so mtodos para resolver sistemas de equaes. O mtodo de eliminao de Gauss resolve uma matriz A do tipo cheia de forma direta. O mtodo de Gauss-Seidel resolve uma matriz A do tipo cheia mas de forma iterativa. Neste programa-exemplo, os mtodos eliminao de Gauss e Gauss-Seidel esto adaptados para resolver uma matriz A do tipo tridiagonal, isto , apenas trs diagonais da matriz A tm valores no-nulos. Finalmente o mtodo TDMA (Tri-Diagonal Matrix Algorithm) resolve uma matriz A do tipo tridiagonal de forma direta. Alm disso, existe uma rotina que calcula a norma l1 mdia do resduo das equaes do sistema, definido por R

AT

(20.2)

O valor da norma usado para comparar com uma tolerncia especificada pelo usurio visando interromper o processo iterativo do mtodo de Gauss-Seidel. (d) O mdulo DADOS, contido no programa-fonte dados.f90, tem duas sub-rotinas. Uma usada para ler os dados do programa, do arquivo programa20a.ent. A outra usada para escrever os dados lidos num arquivo de sada de nome genrico. (e) O mdulo COEFICIENTES, contido no programa-fonte coeficientes.f90, tem duas sub-rotinas. Uma usada para definir os valores dos coeficientes da matriz A e do termo independente B do sistema de equaes das N variveis T. So definidos os valores dos coeficientes apenas em trs diagonais da matriz A. Isso ocorre porque estes coeficientes so originados da discretizao de uma equao diferencial que modela a conduo de calor unidimensional em regime permanente; e a aproximao usada, do mtodo de diferenas finitas, a diferena central de 2 ordem, CDS-2, vista no captulo 19. O valor de B depende da definio do usurio no arquivo de dados, gerando valores nulos ou no-nulos. A outra sub-rotina usada para escrever os valores dos coeficientes e do termo independente num arquivo de sada de nome genrico. (f) O mdulo RESULTADOS, contido no programa-fonte resultados.f90, tambm tem duas subrotinas. A primeira usada para: (1) chamar a sub-rotina de clculo de coeficientes e termos independentes; (2) escrever os coeficientes; (3) resolver a Eq. (20.1) com um dos trs mtodos

Captulo 20. Soluo de sistemas de equaes

243

disponveis, de acordo com a escolha do usurio no arquivo de dados; (4) cronometrar o tempo de CPU; (5) chamar a segunda sub-rotina do mdulo; e (6) escrever o tempo de CPU num arquivo de sada de nome genrico. A segunda sub-rotina deste mdulo usada para: (1) criar o arquivo T.dat; (2) escrever neste arquivo a soluo analtica e numrica de T, e seu erro; (3) escrever um ttulo no arquivo comandos20a.gnu; e (4) chamar o aplicativo Wgnuplot para fazer o grfico de T com os comandos mostrados na Figura 20.1. (g) O programa-principal: (1) apresenta comentrios descrevendo um resumo das caractersticas do programa; (2) obtm a data e a hora do sistema operacional; (3) chama a sub-rotina de leitura dos dados do programa; (4) cria o arquivo de sada de nome genrico; (5) escreve nele o ttulo da simulao, a data e hora; (6) faz a alocao de memria; (7) calcula a coordenada X correspondente a T em N pontos; (8) chama a sub-rotina que escreve os dados; (9) chama a subrotina que resolve a Eq. (20.1); (10) com o aplicativo Notepad, mostra o contedo do arquivo de sada. (h) Os campos de coeficientes, T e grfico so escritos com uma freqncia (w) definida pelo usurio.

Tabela 20.1 Variaveis.f90


module variveis

use portlib

implicit none

integer :: N

! nmero total de ns

integer :: i

! nmero do n ! i = 1, n no contorno esquerdo ! i = N, n no contorno direito ! 2 <= i <= N-1, ns internos

integer :: matriz

! tipo de matriz: 1 = sem fonte; 2 = com fonte

integer :: solver

! tipo de solver: 1 = Eliminao de Gauss (EG) ! ! 2 = Gauss-Seidel (GS) 3 = TDMA

integer :: iteracao ! nmero de iteraes para o GS

integer :: w

! freqncia de escrita de resultados

Captulo 20. Soluo de sistemas de equaes

244

real*8

:: Tol

! tolerncia sobre resduo para o GS

real*8

:: tcpu

! tempo de CPU em segundos

integer :: ver

! auxlio do comando System

real*8,dimension(:),allocatable :: T

! soluo numrica

real*8,dimension(:),allocatable :: x

! coordenada espacial nodal

real*8,dimension(:),allocatable :: aP ! coeficiente central de u real*8,dimension(:),allocatable :: aW ! coeficiente esquerdo de u real*8,dimension(:),allocatable :: aE ! coeficiente direito de u

real*8,dimension(:),allocatable :: bP ! termo fonte de u

character*20 :: caso

! nome do arquivo de sada

character*50 :: title character*62 :: head

! ttulo do grfico ! ttulo do grfico + dia

character*12 :: dia character*8 integer*4 :: hora :: var(8)

! data da simulao ! horrio da simulao ! data e hora ! data e hora ! data e hora ! data e hora

character*20 :: vardate character*20 :: vartime character*20 :: varzone

character*70 :: note_caso ! notepad + caso character*2 character*4 :: aux1,aux2 :: aux3

character*50 :: aux

end

Tabela 20.2 Solvers_1D.f90


module solvers_1D

! objetivo: resolver sistema linear de equaes algbricas ! originado de problemas unidimensionais

use variaveis

Captulo 20. Soluo de sistemas de equaes

245

implicit none

contains

!-------------------------------------------------

! Mtodo direto eliminao de Gauss

subroutine EG (N,ap,b,c,d,T)

implicit none

integer :: i integer :: ii, j real*8

! nmero do n

:: mji, S

integer,intent(in) :: N ! nmero de ns

real*8,dimension(:,:),allocatable :: A ! matriz de coeficientes

real*8,intent(in), dimension(N) :: ap ! coeficiente aP real*8,intent(in), dimension(N) :: b real*8,intent(in), dimension(N) :: c real*8,intent(in), dimension(N) :: d ! coeficiente aW ! coeficiente aE ! termo fonte bP

real*8,intent(out),dimension(N) :: T

! incgnita

allocate ( A(N,N+1) )

A = 0.0d0

! gera a matriz de coeficientes A com o termo independente

do i = 1,N

if (i > 1) A(i,i-1) = -b(i)

A(i,i) = ap(i)

if (i < N) A(i,i+1) = -c(i)

A(i,N+1) = d(i)

Captulo 20. Soluo de sistemas de equaes

246

end do

! Escalonamento

do i = 1,N-1

do ii = i+1,N

mji= A(ii,i) / A(i,i)

do j = i,N+1

A(ii,j) = A(ii,j) - mji*A(i,j)

end do

end do

end do

!Substituicao retroativa

T(N) = A(N,N+1) / A(N,N)

do i = N-1,1,-1

S = 0

do j = i+1,N

S = S + A(i,j)*T(j)

end do

T(i) = (A(i,N+1) - S) / A(i,i)

end do

deallocate ( A )

end subroutine EG

Captulo 20. Soluo de sistemas de equaes

247

!-------------------------------------------------

! mtodo iterativo de Gauss-Seidel

subroutine GS (N,ite,tol,a,b,c,d,T)

implicit none

integer :: i integer :: it

! nmero do n ! nmero da iterao

integer :: ite ! nmero de iteraes

integer,intent(in) :: N

! nmero de ns

real*8, intent(in) :: Tol ! tolerncia sobre R

real*8,intent(in), dimension(N) :: a ! coeficiente aP real*8,intent(in), dimension(N) :: b ! coeficiente aW real*8,intent(in), dimension(N) :: c ! coeficiente aE real*8,intent(in), dimension(N) :: d ! termo fonte bP

real*8,intent(out),dimension(N) :: T ! incgnita

real*8 :: R ! norma l1 mdia dos resduos

T = 0.0d0

do it = 1, ite

T(1) = ( c(1)*T(2) + d(1) ) / a(1)

do i = 2, N-1

T(i) = ( b(i)*T(i-1) + c(i)*T(i+1) + d(i) ) / a(i)

end do

T(N) = ( b(N)*T(N-1) + d(N) ) / a(N)

call norma (N,a,b,c,d,T,R)

if ( R <= Tol ) then write(10,1) it, Tol, R

Captulo 20. Soluo de sistemas de equaes

248

1 format(//, 'O processo iterativo convergiu em', I8, ' iteraes', & /, 'para a tolerncia de', 1pe10.2, & /, 'A norma l1 mdia dos resduos ', 1pe10.2, /) exit end if

end do

if ( R > Tol ) then write(10,2) ite, Tol, R 2 format(//, 'O processo iterativo NO convergiu em', I8, ' iteraes', & /, 'para a tolerncia de', 1pe10.2, & /, 'A norma l1 mdia dos resduos ', 1pe10.2, /) end if

end subroutine GS

!-------------------------------------------------

! calcula a norma l1 mdia do resduo das equaes

subroutine norma (N,a,b,c,d,T,R)

implicit none

integer :: i ! nmero do n

integer,intent(in) :: N ! nmero de ns

real*8,intent(in), dimension(N) :: a ! coeficiente aP real*8,intent(in), dimension(N) :: b ! coeficiente aW real*8,intent(in), dimension(N) :: c ! coeficiente aE real*8,intent(in), dimension(N) :: d ! termo fonte bP

real*8,intent(out),dimension(N) :: T ! incgnita

real*8,intent(inout) :: R ! norma l1 mdia dos resduos

R = 0.0d0

R = R + dabs ( c(1)*T(2) + d(1) - T(1)*a(1) )

do i = 2, N-1

Captulo 20. Soluo de sistemas de equaes

249

R = R + dabs ( b(i)*T(i-1) + c(i)*T(i+1) + d(i) - T(i)*a(i) )

end do

R = R + dabs ( b(N)*T(N-1) + d(N) - T(N)*a(N) )

R = R / N

end subroutine norma

!-------------------------------------------------

! mtodo direto Tri-Diagonal Matrix Algorithm (TDMA)

subroutine TDMA (N,a,b,c,d,T)

implicit none

integer :: i real*8

! nmero do n

:: div ! varivel auxiliar

integer,intent(in) :: N ! nmero de ns

real*8,dimension(:),allocatable :: P ! coeficiente do tdma real*8,dimension(:),allocatable :: Q ! coeficiente do tdma

real*8,intent(in), dimension(N) :: a ! coeficiente aP real*8,intent(in), dimension(N) :: b ! coeficiente aW real*8,intent(in), dimension(N) :: c ! coeficiente aE real*8,intent(in), dimension(N) :: d ! termo fonte bP

real*8,intent(out),dimension(N) :: T ! incgnita

allocate(P(N),Q(N))

P(1) = c(1) / a(1) Q(1) = d(1) / a(1)

do i = 2, N div = a(i) - b(i)*P(i-1)

P(i) = c(i) / div Q(i) = (d(i) + b(i)*Q(i-1))/div

Captulo 20. Soluo de sistemas de equaes

250

end do

T(N) = Q(N)

do i = N-1, 1, -1 T(i) = P(i)*T(i+1) + Q(i) end do

deallocate(P,Q)

end subroutine tdma

!-------------------------------------------------

end module solvers_1D

Tabela 20.3 Dados.f90


module dados

! objetivo: ler e escrever os dados

use variaveis

!-------------------------------------------------

implicit none

contains

!-------------------------------------------------

subroutine le_dados

ver = system('notepad programa20a.ent') ! lista dados

open(7,file='programa20a.ent')

read(7,*) caso read(7,*) N read(7,*) matriz read(7,*) solver read(7,*) iteracao

Captulo 20. Soluo de sistemas de equaes

251

read(7,*) Tol read(7,*) w read(7,*) title

close(7)

end subroutine le_dados

!-------------------------------------------------

subroutine mostra_dados

integer :: comp

comp = len(trim(adjustl(caso)))

write(10,1) trim(adjustl(caso)), N, matriz, solver, iteracao, Tol

1 format(/,5x,'DADOS',//,

&

a<comp>,' = caso',/, & i6,' = nmero de ns',/, & i6,' = tipo de matriz: 1 = fonte nulo; 2 = fonte no-nulo',/, i6,' = tipo de solver: 1=El.Gauss; 2=GS; 3=TDMA',/, & i6,' = nmero de iteraes para o GS',/, & 1pe10.2,' = tolerncia sobre o resduo para o GS') &

end subroutine mostra_dados

!-------------------------------------------------

end module dados

Tabela 20.4 Coeficientes.f90


module coeficientes

! objetivo: calcular os coeficientes e termos fontes ! das equaes discretizadas

use dados

implicit none

Captulo 20. Soluo de sistemas de equaes

252

contains

!-------------------------------------------------

subroutine lista_coeficientes

write(10,4) 4 format(/,5x,'COEFICIENTES E FONTES',//, &

t6,'n',t16,'X',t36,'oeste',t56,'central', & t76,'leste',t96,'fonte',/) do i = 1, N if ( i==1 .or. i==n .or. mod(i,w)==0 ) & write(10,2) i, X(i), aw(i), aP(i), ae(i), bP(i) end do

2 format(i6,4x,5(1pe20.9))

end subroutine lista_coeficientes

!-------------------------------------------------

subroutine coeficientes_e_fontes

! volumes internos do i = 2, N-1 aw(i) = 1.0d0 ae(i) = 1.0d0 aP(i) = aw(i) + ae(i) end do

select case ( matriz ) case ( 1 ) ! fonte nulo bP = 0.0d0 case ( 2 ) ! fonte no-nulo bP = - 2.0d0 / ( (N-1)**2 ) end select

! contorno esquerdo aw(1) = 0.0d0 ae(1) = 0.0d0 aP(1) = 1.0d0 bP(1) = 0.0d0

Captulo 20. Soluo de sistemas de equaes

253

! contorno direito aw(N) = 0.0d0 ae(N) = 0.0d0 aP(N) = 1.0d0 bP(N) = 1.0d0

end subroutine coeficientes_e_fontes

!-------------------------------------------------

end module coeficientes

Tabela 20.5 Resultados.f90


module resultados

! objetivo: calcular soluo numrica e ! apresentar grficos dos resultados

!-------------------------------------------------

use coeficientes use solvers_1D

implicit none

contains

! -----------------------------------------------

subroutine solucao_numerica

! clculo dos coeficientes e termos fontes call coeficientes_e_fontes

! escrita dos coeficientes e termos fontes call lista_coeficientes

tcpu = timef() ! zera cronmetro

! soluo do sistema de equaes

select case ( solver )

Captulo 20. Soluo de sistemas de equaes

254

case ( 1 ) ! Eliminao de Gauss

call EG (N,aP,aw,ae,bP,T)

case ( 2 ) ! Gauss-Seidel

call GS (N,iteracao,Tol,aP,aw,ae,bP,T)

case ( 3 ) ! TDMA

call tdma (N,aP,aw,ae,bP,T)

end select

tcpu = timef()

! escrita da varivel primria e sua visualizao call escreve_T

write(10,1) tcpu 1 format(/, f14.3, ' = tempo de processamento (segundos)')

end subroutine solucao_numerica

!-------------------------------------------------

subroutine escreve_T

real*8

:: T_exato ! auxiliar ! auxiliar

integer :: j

! abertura de arquivo para gravar resultados de T (analtico e numrico) open(7,file='T.dat')

write(10,1) 1 format(/,t4,'X',t28,'T (analtico)',t52,'T (numrico)',t76,'erro',/)

do i = 1, N

select case ( matriz ) case ( 1 ) ! fonte nulo T_exato = (i-1.0d0) / (N-1)

Captulo 20. Soluo de sistemas de equaes

255

case ( 2 ) ! fonte no-nulo T_exato = ( (i-1.0d0) / (N-1) ) ** 2 end select

if ( i==1 .or. i==n .or. mod(i,w)==0 ) then write( 7,2) X(i), T_exato, T(i), T_exato - T(i) write(10,2) X(i), T_exato, T(i), T_exato - T(i) 2 format(4(1pe24.15)) end if

end do

close(7)

! adapta arquivo de comandos para fazer grfico open(7,file='comandos20a.gnu') do j = 1, 8 read(7,*) end do write(7,3) head 3 format("set title '",a62,/,"replot") close(7)

! mostra o grfico de T ver = system('wgnuplot comandos20a.gnu')

end subroutine escreve_T

!-------------------------------------------------

end module resultados

Tabela 20.6 Programa20a.f90


program programa20a

Difuso de calor unidimensional permanente

! ! !

Verso original 1.0 (25 Mai 07) Verso atual 1.0 (25 Mai 07) 26 Mai 07

ltima alterao =

Captulo 20. Soluo de sistemas de equaes

256

autor: Carlos Henrique Marchi (Curitiba, DEMEC/UFPR)

! ! ! ! ! ! ! ! !

MODELO MATEMTICO (resumo) Equao diferencial: d2T/dx2 = S Condio de contorno de Dirichlet em x = 0: T(0) = 0 Condio de contorno de Dirichlet em x = 1: T(1) = 1 x T S = coordenada espacial (varivel independente) = temperatura (varivel dependente) = termo fonte

Soluo analtica conhecida da equao diferencial Soluo analtica conhecida da equao discretizada

! ! ! ! ! ! ! ! ! ! ! ! ! ! !

MODELO NUMRICO (resumo) Incgnita (varivel primria, dependente): T Mtodo numrico: diferenas finitas Funo de interpolao: CDS (varivel primria T) As condies de contorno so aplicadas forando os coeficientes e fontes a satisfazer a C.C. Malha uniforme Solvers: Eliminao de Gauss, Gauss-Seidel e TDMA Preciso: dupla Linguagem FORTRAN 95 Aplicativo usado: Fortran 4.0 Microsoft Tipo de projeto: Console Expresso genrica do sistema de equaes discretizado: aP(i)*T(i) = aw(i)*T(i-1) + ae(i)*T(i+1) + bP(i) onde i = 1, 2, ... N (nmero de ns)

! ! ! ! ! ! ! ! ! ! ! ! !

ARQUIVOS envolvidos no programa: programa20a.f90 = programa principal

coeficientes.f90 = calcula coeficientes e fontes do sistema linear dados.f90 resultados.f90 solvers_1D.f9 variaveis.f90 programa20a.ent "caso" T.dat comandos20a.gnu notepad.exe Wgnuplot.exe = l e lista os dados do programa = resolve equaes e gera listagens dos resultados = Solvers Eliminao de Gauss, Gauss-Seidel e TDMA = define todas as variveis globais do programa = arquivo de dados do programa = listagem dos resultados = arquivo de dados para fazer grfico = arquivo de comandos para gerar grfico = aplicativo editor dos arquivos tipo texto = aplicativo gerador de grfico

! -----------------------------------------------

Captulo 20. Soluo de sistemas de equaes

257

use dados

use resultados

! -----------------------------------------------

implicit none

integer :: comp

!-------------------------------------------------

call date_and_time(vardate,vartime,varzone,var)

write(aux,*) var(3) aux1 = trim(adjustl(aux)) write(aux,*) var(2) aux2 = trim(adjustl(aux)) write(aux,*) var(1) aux3 = trim(adjustl(aux)) dia = '('//trim(aux1)//'/'//trim(aux2)//'/'//aux3//')'

write(aux,*) var(5) aux1 = trim(adjustl(aux)) write(aux,*) var(6) aux2 = trim(adjustl(aux)) write(aux,*) var(7) aux3 = trim(adjustl(aux)) hora = trim(aux1)//':'//trim(aux2)//':'//aux3

call le_dados

head = trim(title)//" "//trim(dia)//"'"

open(10,file=caso)

comp = len(trim(adjustl(title)))

write(10,18) trim(adjustl(title)), dia, hora 18 format(/,'Ttulo = ', a<comp>, & //,5x,'Dia = ',a12,5x,'Hora = ',a8)

Captulo 20. Soluo de sistemas de equaes

258

! alocao de memria allocate ( X(N), T(N) ) allocate ( aw(N), aP(N), ae(N), bP(N) )

do i = 1, N X(i) = (i-1.0d0) / (N-1) end do

call mostra_dados

call solucao_numerica

close (10)

note_caso = 'notepad '//caso ver = system(note_caso) ! lista arquivo de resultados

! ----------------------------------------------End

Figura 20.1 Arquivo de comandos para o aplicativo Wgnuplot do programa20a.f90.

13) Executar Build, Compile para compilar o programa-fonte variaveis.f90. Em seguida, executar Build, Compile para compilar os demais programas-fonte na seguinte ordem: solvers_1D.f90, dados.f90, coeficientes.f90, resultados.f90 e programa20a.f90. 14) Gerar o programa-executvel fazendo Build, Build. 15) Executar o programa atravs de Build, Execute. Usar os dados mostrados na Figura 20.2. 16) Analisar os resultados mostrados nas Figuras 20.3 e 20.4. O erro apresentado pela soluo na Figura 20.4 deve-se aos erros de arredondamento. 17) Executar novamente o programa usando os mesmos dados da Figura 20.2, exceto, matriz = 1 e analisar os novos resultados.

Captulo 20. Soluo de sistemas de equaes

259

18) Executar novamente o programa usando os mesmos dados da Figura 20.2, exceto, matriz = 1 e solver = 3, e analisar os novos resultados. Notar a reduo significativa no tempo de CPU ao se usar o mtodo TDMA em relao ao mtodo de Eliminao de Gauss. 19) Executar novamente o programa usando os mesmos dados da Figura 20.2, exceto, matriz = 2 e solver = 3, e analisar os novos resultados.

Figura 20.2 Arquivo de dados do programa20a.f90.

Figura 20.3. Grfico com resultados do programa20a.f90 para os dados da Fig. 20.2.

20.2 EXERCCIOS

Captulo 20. Soluo de sistemas de equaes

260

Exerccio 20.1 Executar novamente o programa20a.f90 usando os mesmos dados da Figura 20.2, exceto, matriz = 1 e solver = 2. Por tentativa e erro, usar um valor para a varivel iteracao que seja suficiente para satisfazer a tolerncia (Tol) estipulada na Figura 20.2. Comparar o tempo de CPU resultante neste caso, para o mtodo de Gauss-Seidel, quele do mtodo TDMA (item 18) e do mtodo de Eliminao de Gauss (item 17).

Figura 20.4 Arquivo de resultados do programa20a.f90 para os dados da Fig. 20.2.

Exerccio 20.2 Executar novamente o programa20a.f90 usando os mesmos dados da Figura 20.2, exceto, matriz = 2 e solver = 2. Por tentativa e erro, usar um valor para a varivel iteracao que seja suficiente para satisfazer a tolerncia (Tol) estipulada na Figura 20.2. Comparar o tempo de CPU resultante neste caso, para o mtodo de Gauss-Seidel, quele do mtodo TDMA (item 19) e do mtodo de Eliminao de Gauss (item 16).

Captulo 20. Soluo de sistemas de equaes

261

Procedimento: CRIAR E INSERIR PROGRAMA-FONTE NO PROJETO

Explicaes detalhadas esto na seo 1.7 do captulo 1. Para iniciar a edio ou escrita de um programa-fonte em linguagem FORTRAN necessrio criar e inserir um arquivo dentro do projeto. Isso feito atravs dos seguintes passos: 1) No menu do Fortran, executar: Insert, Files into Project 2) Na janela Insert Files into Project, executar o seguinte: a) Na opo File Name, digitar o nome do programa-fonte a ser criado. Sempre deve-se usar f90 como extenso dos nomes dos arquivos do tipo programa-fonte. Ele indica que o programa est ou ser escrito na linguagem FORTRAN 90 ou 95. b) Clicar sobre o boto OK 3) Na janela Microsoft Developer Studio, clicar sobre o boto Yes 4) Na subjanela do lado esquerdo do Fortran, clicar sobre o sinal + ao lado do nome do projeto; dever aparecer o nome do programa-fonte que foi inserido no projeto 5) Clicar duas vezes sobre o nome do programa-fonte que foi inserido 6) Na janela Microsoft Developer Studio, clicar sobre o boto Yes 7) O programa-fonte inserido no projeto j est pronto para ser editado na subjanela do lado direito do Fortran

Procedimento: Criar e inserir programa-fonte no projeto

Procedimento: CRIAR PROJETO DO TIPO CONSOLE APPLICATION

Explicaes detalhadas esto na seo 1.6 do captulo 1. Para criar um projeto do tipo Console Application, devem ser executados os seguintes passos: 1) No menu do Fortran: File, New. 2) Na janela New, clicar sobre a opo Project Workspace. Depois, clicar sobre o boto OK. 3) Na janela New Project Workspace, necessrio executar o que segue: a) Entre os seis tipos de projetos apresentados na opo Type, clicar sobre Console Application no caso deste tipo de projeto no estar selecionado (realado em azul). b) Na opo Location estar indicado um diretrio (pasta) default, ou seja, um diretrio escolhido pelo prprio Fortran em funo de sua configurao atual. possvel que no seja o diretrio desejado. Neste caso, deve-se clicar sobre o boto Browse para indicar o diretrio onde se quer criar o projeto. Ao se fazer isso, surgir a janela Choose Directory na qual deve-se executar: Na opo Drives, escolher Z:\\SERVER1\Alunos2004_1 Na opo Directory name, clicar duas vezes sobre o nome do diretrio que idntico ao user name usado para acessar a rede Windows do DEMEC/UFPR Clicar sobre o boto OK. c) Estar de volta a janela New Project Workspace. Clicar dentro do espao de edio da opo Name. Escrever o nome do projeto. Deve-se perceber que o nome do projeto, digitado na opo Name, aparece automaticamente na opo Location. Em seguida, deve-se clicar sobre o boto Create. Aps isso, o Fortran criar um diretrio com o nome do projeto indicado, dentro do diretrio j selecionado.

Procedimento: Criar projeto do tipo Console Application

Procedimento: FIM DE SESSO

Para concluir o uso do Fortran e do Windows, deve-se executar o seguinte: 1) Para encerrar as atividades com um projeto, basta executar no menu do Fortran: File, Close Workspace 2) Na janela Microsoft Developer Studio, clicar sobre o boto Yes 3) Para fechar o aplicativo Fortran, basta fazer o seguinte em seu menu: File, Exit 4) Para fechar o Windows, executar: Start, Shut Down 5) Na janela Shut Down Windows, escolher a opo Close all programs and log on as a different user?. Clicar sobre o boto Yes

Procedimento: Fim de sesso

REFERNCIAS BIBLIOGRFICAS

ADAMS, J. C.; BRAINERD, W. S.; MARTIN, J. T.; SMITH, B. T.; WAGENER, J. L. FORTRAN 95 Handbook; Complete ISO/ANSI Reference. London : MIT Press, 1997. FORBELLONE, A. L. V.; EBERSPACHER, H. F. Lgica de Programao. 2a ed. So Paulo : Makron Books, 2000. HAHN, B. Fortran 90 for Scientists and Engineers. New York : Chapman & Hall, 1994. MORAES, P. S. Curso Bsico de Lgica de Programao. Campinas, 2000. RAMALHO, J. A. A. Introduo Informtica. So Paulo : Berkeley, 2000.

Referncias bibliogrficas

Vous aimerez peut-être aussi