Você está na página 1de 48

----------------------- Page 1----------------------UNIVERSIDADE DE SO PAULO ESCOLA SUPERIOR DE AGRICULTURA "LUIZ DE QUEIROZ" Introduo programao em Fortran 90 Joo Vitor Teodoro

o joao.magda@usp.br ----------------------- Page 2----------------------Este material tem por objetivo apresentar conceitos bsicos e in trodutrios programao em linguagem de alto nvel FORTRAN 90. Os cdigos e procedime ntos descritos representam uma gama de opes a serem adotadas, sendo assim, podem existir outras f ormas e comandos alternativos que aqui no so citados. Com este material, possvel capacitar-se resoluo de problemas bsicos em com putao cientca em que, apesar de exemplos e exerccios de grande simplicidad e e de fcil entendimento, o leitor pode adaptar seus problemas mais complexos ao q ue apresentado. Porm, de acordo com o rumo e necessidade para cada programa, de ve-se buscar referncias mais ricas e especcas em determinados procedimentos, alm da importncia em busca r metodologias ecientes. O texto apresentado baseado em vrios materiais e, pretendeu-se reunir de forma fcil, compreensvel e sucinta o que cada um oferece de melhor. Exemplos pronto s para execuo e descries dos procedimentos passo-a-passo foram colocados buscando a melhor compreenso desde aqueles que iniciam na rea de programao. Por estar em uma primeira edio, o material pode conter erros e necessitar de melhorias, assim, quaisquer sujestes e comentrios so bem-vindos. Verses atualizadas estaro disponveis em http://fortran.4shared.com/. Joo Vitor Teodoro ----------------------- Page 3----------------------SUMRIO 1 2 Introduo 1 Primeiros algoritmos 3 . . . . . . . . . . . . . . . . . . 3 . . . . . . . . . . . . . . . . . 3 . . . . . . . . . . . . . 4

2.1 Caracteres vlidos . . . . . . . . . . . . . . . . . 2.2 Criando um projeto . . . . . . . . . . . . . . . . . 2.2.1 "READ" e "PRINT" . . . . . . . . . . . . . . . .

2.2.2 Execuo do programa . . . . . . . . . . . . . . . . . 4 2.3 Declaraes . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.3.1 Variveis inteiras (INTEGER) . . . . . . . . . . . . . . . . . . 5 2.3.2 Variveis reais (REAL) . . . . . . . . . . . . . . . . . . 6 2.3.3 Variveis complexas (COMPLEX) . . . . . . . . . . . . . . . . . . 6 2.3.4 Variveis alfanumricas ou literais . . . . . . . . . . . . 7 2.3.5 Variveis lgicas (LOGICAL) . . . . . . . . . . . . . . . . 7 2.3.6 Variveis parmetros (PARAMETER) . . . . . . . . . . . . . . . . 7 2.4 Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.4.1 Atribuio . . . . . . . . . . . . . . . . . . . . . . . . 8 2.4.2 Operadores literais . . . . . . . . . . . . . . . . . . . . . 8 2.4.3 Operadores aritmticos . . . . . . . . . . . . . . . . . . 8 2.4.4 Operadores relacionais . . . . . . . . . . . . . . . . . . . 9 2.4.5 Operadores lgicos . . . . . . . . . . . . . . . . . . . . 9 2.4.6 Prioridades . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.5 Funes intrnsecas . . . . . . . . . . . . . . . . . . . . . . 10 2.6 Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3 Controle de execuo 12 3.1 "GOTO" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.2 Estrutura condicional . . . . . . . . . . . . . . . . . . . . . . 12 3.2.1 Estrutura condicional simples . . . . . . . . . . . . . . . . . . 13 3.2.2 Estrutura condicional composta . . . . . . . . . . . . . . . . . . 13 3.2.3 Estrutura condicional composta . . . . . . . . . . . . . . . . . 14 3.2.4 Estrutura condicional composta . . . . . . . . . . . . . . . . 14 3.3 Estrutura de repetio . . . . . . . . . . . . . . . . . . . 16 3.3.1 "LOOP" condicional . . . . . . . . . . . . . . . . . . 16 3.3.2 "LOOP" ciclo condicional . . . . . . . . . . . . . . . . . . 16 3.3.3 "DO" iterativo . . . . . . . . . . . . . . . . . . . . . 17 3.3.4 "DO-WHILE" . . . . . . . . . . . . . . . . . . . . . . 17 3.4 Exerccios . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . (CHARACTER) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . expandida simplicada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . 4 . . . . . . . . . . . . 5 Matrizes 4.1 . . 4.2 . . 4.3 . . 4.4 . . 4.5 . . 4.6 . . Declaraes . . . . . . . . . . Operaes . . . . . . . . . . . Leitura e impresso . . . . . . . . . Funes . . . . . . . . . . . . Alocao . . . . . . . . . . . . Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18 19 . . . 19 . . . 19 . . . 22 . . . 23 . . . 23 . . . 25

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Subprogramas e mdulos

26 5.1 Programa principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 i ----------------------- Page 4----------------------5.2 . . . . 5.3 . . . . 5.4 . . . . 5.5 . . . . 6 Funes . . . . . . Subrotinas . . . . . . . Mdulos . . . . . . Exerccios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 . . . . . . 27 . . . . . 28 . . . . . 29 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Entrada e sada de dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 . . . . . . . . . . . . 31 . . . . . . . . . . . . 32 . . . . . . . . . . . . 34 35

6.1 I/O simples . . . . . . . . . . . . . . . . 6.2 Ficheiros . . . . . . . . . . . . . . . . . . 6.3 Exerccios . . . . . . . . . . . . . . . . . 7 8 Algoritmos dos exerccios Bibliograa consultada

39 ii ----------------------- Page 5----------------------1 Introduo

Nos primrdios dos computadores, programar era uma tarefa extrema mente complicada e, de certa forma, extenuante. Aos programadores era exigido um conhecimento de-

talhado das instrues, registos e outros aspectos ligados com a unidade de processamento central (CPU) do computador onde era escrito o cdigo. Os programas consistiam nu ma srie de instrues numricas, denominadas por cdigo binrio. Posteriormente, desenv olveram-se algumas mnemnicas (auxiliares de memria) que resultaram no designado assembly (not ao legvel por humanos para o cdigo de mquina). No perodo entre 1954-1957 uma equipe de 13 programadores liderados por John Backus desenvolveu uma das primeiras l inguagens de alto nvel para o computador IBM 704, o FORTRAN (FORmula TRANslation). O objetivo deste projeto era produzir uma linguagem de fcil interpretao mas, ao mesmo tem po, com uma ecincia idntica linguagem assembly. A linguagem FORTRAN foi ao mesmo tempo revolucionria e inovadora. Os programadores libertaram-se assim da tarefa extenuante de usar a linguagem assembler e passaram a ter oportunidade de se concentrar mais na resoluo do problema. Mas, talvez mais i mportante, foi o fato dos computadores passarem a car mais acessveis a qualquer pessoa com vo ntade de despender um esforo mnimo para conhecer a linguagem FORTRAN. A partir dessa altura , j no era preciso ser um especialista em computadores para escrever programas para c omputador. Nos anos seguintes, outras empresas de computadores desenvolveram os se us prprios compiladores de FORTRAN para os seus computadores. Desta forma, programas escri tos para uma mquina no podiam ser usados noutras mquinas sem proceder a algumas modicaes. Vericou-se assim uma proliferao de diferentes compiladores de FORTRAN. A aquisio de programas em FORTRAN de diferentes procedncias, associado necessidade de converter todos esses programas sempre que estes eram instalados num novo comput ador, tornou os custos totais proibitivos. Para ultrapassar estes problemas, passou-se a discutir a necessidade de se proceder a uma normalizao da linguagem FORTRAN de forma a que os programas fossem portveis, isto , que pudessem ser processados em diferentes mquinas com alteraes mu ito pequenas ou, de preferncia, sem qualquer alterao. Em 1966, aps quatro anos de trabalho, a As sociao Americana de Normalizao, posteriormente passou a designar-se Instituto Americano de Normalizao Nacional (American National Standards Institute, ANSI), publicou uma ve rso normalizada designada por FORTRAN IV. Na sua essncia, esta verso era um subconjunto comum dos vrios dialetos do FORTRAN, de forma que cada dialeto era considerado co mo uma extenso da verso normalizada. Os utilizadores desta linguagem que prete ndessem escrever programas portveis teriam que ter o cuidado de evitar as extenses referidas. A proliferao de dialetos continuou a ser um problema aps a publ

icao da verso normalizada em 1966. A primeira diculdade era a relutncia das empresas que desenv olviam os diferentes compiladores a aderirem normalizao. Por outro lado, a implementao de car actersticas nos diferentes compiladores, que eram essenciais para programas de long a extenso, foram ignoradas pela verso normalizada. Esta situao, combinada com a existncia de algumas debilidades evi dentes na linguagem normalizada, conduziu introduo de um grande nmero de pr-processadores. Estes eram programas que liam o cdigo da linguagem de um determinado dialeto do FORTRAN e gerava um segundo texto na verso normalizada. Este procedimento era uma forma de estender as capacidades do FORTRAN usual, mantendo a portabilidade entre diferentes compu tadores. O aumento do nmero de pr-processadores registrado nos anos subsequentes, signicava no s a grande diversidade de dialetos do FORTRAN, mas tambm a insucincia da verso normalizada. Apesar dos programas escritos usando um pr-processador fossem portveis, o cdigo em FORTRAN gerado desta forma era geralmente de leitura e interpretao muito difcil. Estas diculdades foram parcialmente resolvidas pela publicao de uma nova n orma1 ----------------------- Page 6----------------------lizao, em 1978, conhecida por FORTRAN 77. Esta verso inclua vrias novas c aractersticas baseadas em dialetos j existentes ou em pr-processadores e, por iss o, no era um mero subconjunto dos dialetos existentes, mas sim um novo dialeto. O perodo de transio entre o FORTRAN IV e o FORTRAN 77 revelou-se, no entanto, extremamente longo, devido ao atraso na avaliao dos novos compiladores baseados na nova verso normalizada e necessidade das duas verses normalizadas coexistirem por um perodo de tempo considervel. Na realidade, somente nos meados da dcada de 80 o FORTRAN IV passou a ter um uso residual. Aps trinta anos de existncia o FORTRAN estava longe de ser a nica linguage m de programao disponvel na maioria dos computadores. As modicaes signicativas introduzidas no FORTRAN 77 no resolveram todos os problemas que apareceram com a primeira verso normalizada, nem sequer inclua muitas das novas caractersticas que, entretanto a pareceram com as novas linguagens de programao como o Pascal ou o C. A comunidade de utiliza dores do FORTRAN embora com um vasto investimento em cdigos de FORTRAN (alguns programas continham mais de 100.000 linhas de instrues) em plena utilizao, no estava completame nte satisfeita com a linguagem. Por consequncia, iniciaram-se trabalhos para reve r a verso normalizada. Para o efeito, a ANSI formou um comit tcnico, denominado por X3J3, trab

alhando como um corpo de desenvolvimento do comit ISO, designado por ISO/IEC JTC1/SC22/WG 5 (que ser referido abreviadamente por WG5), na nova verso normalizada, inicialmente referida por FORTRAN 8x que resultou posteriormente no FORTRAN 90. As motivaes para o desenvolvimento da nova verso eram no somente normalizar as diferentes extenses comercializadas, mas tambm modernizar a linguagem como resposta a outras linguagens de programao como o APL, Algol, Pascal, Ada, C e C++. De forma a preservar o vasto investimento nos cdigos anteriormente desenvolvidos, todo o F ORTRAN 77 considerado como um subconjunto da nova verso, embora algumas caractersticas se jam desaconselhadas na elaborao de novos programas. Ao contrrio das verses anteriores que resultaram em grande parte de um es foro para normalizar "prticas" j existentes, o FORTRAN 90 muito mais do que um desenvolvimen to da linguagem, introduzindo aspectos que so novidade em FORTRAN e resultam da expe rincia obtida noutras linguagens. As novas caractersticas mais importantes so a facilida de de utilizar variveis indexadas ("arrays") com uma notao mais concisa e poderosa e a facilidade de denir e manipular diferentes tipos de dados denidos pelo utilizador. O primeiro aspect o permite uma simplicao na programao de problemas matemticos e torna a linguagem FORTRAN mais eciente quando se utilizam super-computadores uma vez que se adapta mais convenie ntemente ao hardware. O segundo aspecto permite aos programadores descrever os seus pr oblemas em termos dos dados-tipo que combinam perfeitamente com as suas necessidades. Aps a publicao da verso normalizada do FORTRAN 90, o WG5 optou por uma nova forma de atuao para revises futuras. A losoa atual a seguinte: se uma nova caracterstica com possibilidade de ser introduzida no futuro no se encontrar sucien temente desenvolvida at uma data pr-estabelecida, ento prefervel abandonar essa caracterstica em vez de retardar a nova reviso. O WG5 passou a ser assim a entidade que decide os vetores de desenvolv imento para as futuras verses do FORTRAN. Entretanto, apareceu o FORTRAN 95 como resultado de sta nova losoa de revises. Esta verso consiste numa pequena reviso do FORTRAN 90 con-

sistindo unicamente em "correes, claricaes e interpretaes", algumas novas caracterstic e desaparecimento de outras. O padro FORTRAN 2003 dita regras mais precisas sobre a implementao de car actersticas inerentes a orientao a objetos (iniciado no FORTRAN 90). Alm disso, entre os compiladores, existem aqueles que melhoram a portabilidade da linguagem com vist a programao com mquinas paralelas ampliando as possibilidades de otimizao de tempo e memria.

Texto retirado de http://paginas.fe.up.pt/aarh/pc/PC-capitulo2.pdf 2 ----------------------- Page 7----------------------2 Primeiros algoritmos

Uma das primeiras coisas que se deve aprender, como resolver problemas com o auxlio do computador, isto , como montar, logicamente, as instrues para obter a soluo de um problema que o computador resolver utilizando as instrues programadas pelo usurio, ou seja, projetar e escrever um algoritmo, que uma sequncia ordenada de passos execu tveis, e precisamente denidos, que manipulam um volume de informaes, a m de obter um resultad o. O algoritmo um mtodo nito, escrito em um vocabulrio simblico xo, regido por instrues precisas, que se movem em passos discretos Para que possamos desenvolver um algoritmo, primeiramente devemos ente nder o problema a ser resolvido e quais sero as informaes de entrada e sada. Denind o isso, deve-se esquematizar um processo lgico que o computador entenda. Fazer um bolo pode ser associado a um algoritmo, denindo os ingredientes como componentes de entrada, o trabalho do cozinheiro como a execuo do a lgoritmo e o bolo (resultado nal) como componente de sada. Assim, como fazer um bolo, um algoritimo pode ser feito de vrias formas, ecientes ou no, que produziro um mesmo resultado. Os computadores s podem executar diretamente os algoritmos expressos em linguagem de mquina. A traduo de um programa escrito em linguagem de alto nvel para lingua gem de mquina feita por um programa tradutor denominado Compilador. Aqui ser discutida uma verso que suporta o FORTRAN 90, apesar de j existirem verses mais novas. 2.1 Caracteres vlidos

Nesse ambiente, regras e restries devem ser seguidas, porm o FO RTRAN no sensvel a letras maisculas e minsculas (no Case sensitive), ou seja, cada palavra, independentemente dos caracteres maisculos ou minsculos, tem mesma represent ao para o programa. Para que um algoritmo seja executado com sucesso, somente ess es caracteres devem ser utilizados na programao: Tabela 1: Caracteres vlidos. 0, ..., 9 Algarismos Cifro A, ..., Z Letras maisculas nto e vrgula a, ..., z Letras minsculas Sinal de mais Sinal de menos Barra (slash) $ ; Po Me

nor que ' r que " Aspas Porcentagem ( Parnteses esquerda o de interrogao ) Parnteses direita Asterisco Ponto : Dois pontos Sinal de igual ! & Ponto de exclamao "E" comercial ? , . Pont Vrgula Plica ou apstrofe Espao em branco Maio

Alm disso, aceitvel o mximo de 132 caracteres por linha e nom es com at 31 caracteres. 2.2 Criando um projeto

Este material baseado na utilizao do compilador Fortran PowerStation 4.0. Para que se possa iniciar um programa em seu ambiente, necessrio criar novo espao de tr abalho (diretrio) do projeto, para isto, aps abrir o Fortran PowerStation 4.0, deve-se ac essar atravs da barra de ferramentas File/New.../Project Workspace e clicar OK. No campo Name: deve ser inserido um nome para o ambiente de trabalho, e no campo Location: o local onde este deve ser salvo. 3 ----------------------- Page 8----------------------Aps o preenchimento desses campos clicar em Create. Aps a criao do espao de trabalho se faz necessrio criar tambm um arquivo de texto onde seu programa ser dig itado, para sua criao acessar, pela barra de ferramentas File/New.../Text File e clicar OK. A tela em branco com cursor que aparece o editor de texto. Apesar do espao de trabalho estar criado, o projeto ainda no est associado a ele, portanto para isso necessrio acessar File/Save ou atalho equivalente e digitar o nome do programa .f90 no campo File Name. Em Directories possvel selecionar o espao de tr abalho em que se deseja salvar o projeto. Para acessar outro projeto salvo com respectivo espao de trabalho neces srio acessar File/Open Workspace..., selecionar o espao de trabalho desejado em Directories e selecionar o arquivo mdp na tela esquerda antes do OK. Clicando no projeto dentro do espao de trabalho que aparece na janela possvel retomar o projeto. Um programa em FORTRAN deve ter o seguinte formato: program nome declaraes comandos end program nome

O nome do programa deve iniciar sempre por letra e no pode conter espao, caso necessrio utilizar "_" e, para nalizar o programa, em vez de escrever "end program nome", pode-se usar apenas "end program" ou "end". A declarao "program nome" opcional, porm o seu uso recomendado . O nico campo no opcional na estrutura de um programa, na denio do padro da linguagem, a instruo "end", a qual possui dois propsitos: indicar ao compilador que o programa chegou ao m e, quando da execuo do cdigo, provoca a parada do mesmo. 2.2.1 "READ" e "PRINT"

Para que se possa entrar com um valor a ser operacionado no programa, utiliza-se o comando "read*," seguido pelas variveis a serem lidas, separadas por vrgula e na o rdem da leitura. Para imprimir valores operacionados no programa, utiliza-s e o comando "print*," seguido pelas variveis a serem impressas, separadas por vrgula e na ordem da impre sso. program read*,a Exemplo 2.1 print*,a end program exemplo exemplo

No exemplo, o programa l um valor representado pela varivel a, e em segu ida imprime este valor. 2.2.2 Execuo do programa acessar pela

1. Aps ter escrito o programa no editor de dexto, barra de ferramentas File/Save, para salvar seu projeto.

2. Compilar o projeto signica converte-lo em linguagem de mquina e, para isso se faz necessrio acessar pela barra de ferramentas Build/Compile.... Ao compilar seu programa, informaes contendo possveis erros e avisos sero apresentadas, caso apa rea "0 error(s), 0 warning(s)" pode prosseguir, caso contrrio, deve vericar a(s) c ausa(s) do(s) problema(s). 4 ----------------------- Page 9----------------------3. Aps a compilao nenhum e problema encontrado, um executvel deve ser gerado, pa ra isso se faz necessrio acessar pela barra de ferramentas Build/Build.... No vamente sero apresentados possveis erros e avisos.

4. O programa est pronto para ser executado. Arquivos aparecero na pasta do e spao de trabalho, assim, se houverem alteraes no programa, para que essas sejam a tualizadas no projeto os passos 1, 2 e 3 devem ser repetidos. 5. Para executar o programa basta acessar Build/Execute... na barra de ferr amentas. Exerccio 2.1 2.3 Executar o algoritmo do exemplo 2.1.

Declaraes

As variveis podem ser inteiras, reais, complexas, literais ou lgicas. A declarao de uma varivel deve vir antes que ela seja usada, se isto no ocorrer o compilador ass umir que as variveis que comeam com as letras I at N como inteiras (INTEGER*4) e todas as ou tras como reais (REAL*4), ou seja, delaradas implicitamente como ocorrido no Exemplo 2.1. Esta forma de declarao implcita pode ser modicada usando o comand o "implicit tipo (a1-a2,b1-b2,...)" sendo a1, a2, b1, b2 quaisquer letras do alfab eto. A vrgula separa os intervalos de letras e o sinal "" determina o intervalo. As letras que no estiver em em nenhum dos intervalos ter o seu tipo dado pela declarao implcita. O comando seguinte indica que as variveis que comeam com as letras a, b, c e de r at z so do tipo real: implicit real (a, b, c, r-z). Os espaos so usados para dar clareza e so ignorados pelo compilador. Quando no se deseja que nenhuma varivel seja declarada implicita mente usa-se o comando "implicit none". Se este comando for usado e uma varivel citada no programa no estiver em nenhuma outra declarao o complilador acusar um erro. sempre bom utiliza r o comando "implicit none" evitando erros no programa. Para se declarar variveis que sejam matrizes e vetores deve-se indicar s uas dimenses logo aps o nome da varivel, entre parnteses, e separadas umas das outras por vrgula. Por exemplo, "a(4,3)" indica uma matriz a de 4 linhas por 3 colunas. As variveis podem receber valores iniciais usando "/valor/", logo aps sua declarao. No caso de vetores e matrizes devem ser dados os valores para todos os elementos de cada linha em sequncia. 2.3.1 Variveis inteiras (INTEGER) As variveis declaradas como inteiras podem assumir os seguintes valores: INTEGER*1: 128 a 127 INTEGER*2: 32.768 a 32.767

INTEGER*4 ou INTEGER: 2.147.483.648 a 2.147.483.647 Os nmeros aps o "*" indicam quantos bytes a varivel ocupa na memria do computador. Esta observao vlida para todos os tipos de variveis. Quando uma varivel inteira recebe o resultado de uma diviso com resto, es te resto desprezado, ou seja o valor truncado. program exemplo implicit none integer*1:: c, f Exemplo 2.2 integer:: comandos end d, a/6/, b(2,2)/0,1,2,3/

5 ----------------------- Page 10----------------------Neste caso, o programa identica c e f como variveis inteiras que podem assumir valores de 128 a 127, d como varivel inteira que pode assumir valores de 2.147.483.648 a 2.147.483.647, a como varivel inteira que assume, priori, o valor 6, mas pode ass umir durante a execuo do programa atravs dos comandos valores de 2.147.483.648 a 2.147 .483.647 e b como uma matriz 2x2 de variveis inteiras que assume, priori,

, mas pode assumir durante a execuo do programa atravs dos comandos, para cada elem ento da matriz, valores de 2.147.483.648 a 2.147.483.647. O smbolo "::", na maioria dos casos, no precisa ser usado e po de ser trocado por espao, assim, por exemplo "integer*1:: c, f", pode ser escrito como "integer*1 c , f". 2.3.2 Variveis reais (REAL) As variveis declaradas como reais podem assumir os seguintes valores: REAL*4 ou REAL(Preciso simples com 6 casas decimais): Varia de (-3.402823E+38) a (+3.402823E +38) e tem incremento mnimo de a , ou seja, nmeros reais neste intervalo so considerados zero. REAL*8 ou DOBLE PRECISION (Preciso dupla com 15 casas decimais): Varia de (-1.797693134862316D +308) a (+1.797693134862316D+308) e tem inc remento mnimo de a . A parte

exponencial deve ser separada por um d ou D no lugar do e ou E para re al do tipo *8. Colocando-se "." aps um nmero no programa garantimos ele seja real, caso contrrio somente ser reconhecida sua parte inteira. program exemplo implicit none real*4 r1,r2 real*8 r3,r4 integer i1,i2,a read*,a r1=a/3. Exemplo 2.3 r2=a/3 r3=a/3. r4=a/3 i1=a/3. i2=a/3 print*,r1,r2,r3,r4,i1,i2 end 2.3.3 Variveis complexas (COMPLEX) COMPLEX*8 ou COMPLEX (Preciso simples com 6 casas decimais) COMPLEX*16 (Preciso dupla com 15 casas decimais) Os valores que um complexo pode assumir so os mesmos que os r eais representado por um par ordenado (parte real,parte complexa) de reais. 6 ----------------------- Page 11----------------------program exemplo implicit none complex c c = (-1,0) c = sqrt (c) print*,c end que

Exemplo 2.4

2.3.4

Variveis alfanumricas ou literais (CHARACTER)

A varivel do tipo character declarada digitando-se "character nome*w" em que nome a varivel alfanumria e w representa o nmero mximo de caracteres que a varivel pode conter dentro do programa. A varivel poder conter at 32.767 caracteres e caso w no seja apresentado ("character nome") ele corresponder a 1. O tamanho, em bytes, de um tipo character igual a quantidade de caracte res que a constante ou varivel possui mais 1, onde este byte a mais, guarda o tamanho da co nstante ou varivel.

Quando a varivel recebe os caracteres na prpria execuo do program a, ou seja, atravs da atribuio, ou no momento da impresso, os caracteres atribudos devem vir entr e aspas e contendo apenas caracteres vlidos. Quando a varivel recebe os caracter es na execuo do programa atravs do "read*," espaos entre palavras no podem ocorrer, neste caso sugerido o uso de "_". program exemplo implicit none character nome*30 print*, "Qual e seu nome?" read*, nome print*, "Eu me chamo ", nome end

Exemplo 2.5

2.3.5

Variveis lgicas (LOGICAL)

A varivel lgica uma varivel binria que pode assumir somente os valores .true. (verdadeiro) ou .false. (falso). Ou at mesmo 0 e 1. Utiliza 4 bytes de memria . program exemplo implicit none logical log1, log2, log1= 1 Exemplo 2.6 log2= .false. log3= 0 print*, log1, end 2.3.6 Variveis parmetros (PARAMETER) log2, log3

log3

As vezes necessitamos, em um programa, de constante ou parmetro que no deve receber outro valor, uma vez que j foi atribudo um valor no momento de sua declarao. Para casos como este que utilizamos variveis parmetros. 7 ----------------------- Page 12----------------------program exemplo implicit none real raio, pi parameter (pi = 3.14159) read*, raio print*, "A area do crculo end

Exemplo 2.7

", pi*raio*raio

2.4 2.4.1 m

Operadores Atribuio A varivel ou identicador que estiver esquerda do sinal de atribuio "" recebe

o valor da expresso, constante ou varivel que estiver direita. Identicador Alguns exemplos de atribuies: . . . nome = "Jonatas Henrique" curso = "Ciencias Biologicas" !No se pode usar acentuao ano = 1999 ! No preciso de ";" no final prova(1)= 9.6; prova(2)= 8; prova(3)= .8 ! Atribuindo valores a vetores t= 9.9; data1 = "12/10/10" nota = (2*prova(1)+3*prova(2)+4*prova(3)+t)/10 ! Casas decimais so separadas por ponto . . . Estas declaraes poderiam estar na mesma linha desde que fossem separadas p or ponto e vrgula ";". 2.4.2 Operadores literais Expresso

Uma funo til para variveis literais a concatenao, ou a juno de duas ou mais palavras. Em FORTRAN a concatenao feita pelo operador "//". Por exemplo, program exemplo implicit none character a*3,b*5,c*8 a = "mel" Exemplo 2.8 b = "ancia" c = a//b print*, c !c = "melancia" end 2.4.3 Operadores aritmticos Executam operaes aritmticas comuns. 8 ----------------------- Page 13----------------------Tabela 2: Operadores aritmticos. Fortran Algbrico Signicado Soma Subtrao Multiplicao Diviso Potenciao

2.4.4

Operadores relacionais

Comparam variveis, constantes ou expresses e retornam ".TRUE.", "T" ou "1 " se a comparao for verdadeira, ".FALSE.", "F" ou "0" se a comparao for falsa. Tabela 3: Operadores relacionais. Fortran .LT. .LE. .EQ. .NE. .GT. .GE. F90 Algbrico Signicado menor que menor ou igual que igual a diferente de maior que maior ou igual que

program implicit logical real a, read*, Exemplo 2.9

exemplo none e, f, g b, c, d a, b, c, d

e = (a + b)*0.5 .LT. (c + d)*0.5 f = (a + b)*0.5 == (c + d)*0.5 g = (a + b)*0.5 > (c + d)*0.5 print*, e, f, g end 2.4.5 Operadores lgicos

So usados quando so necessrias mais de uma condio relacional ou quando preci so inverter seu resultado. Tabela 4: Operadores lgicos. Fortran .AND. ros .OR. dadeiro .NOT. .NEQV. ou .XOR. eiro .EQV. dadeiros Por exemplo, 9 ----------------------- Page 14----------------------program exemplo implicit none logical r1, r2, r3, r4, r5, r6, r7, r8 r1 = 10.GT.5 .AND. 20.GT.25 ! .FALSE. r2 = 10.GT.5 .OR. 20.GT.25 ! .TRUE. r3 = .NOT. 20.GT.25 ! .TRUE. r4 = 10 > 5 .XOR. 20 >= 25 ! .TRUE. r5 = 10.GT.5 .NEQV. 25.GT.20 ! .FALSE. Verdadeiro se os dois operadores forem falsos ou ver Verdadeiro se o operador for falso (negao) Verdadeiro se somente um dos operadores for verdad Verdadeiro se ao menos um dos dois operadores for ver Signicado Verdadeiro se os dois operadores forem verdadei

Exemplo 2.10

r6 = 10 < 5 .EQV. 20 <= 25 ! .FALSE. r7 = 10.LT.5 .EQV. 25.GT.20 ! .FALSE. r8 = "Jos" == "Pedro" ! .FALSE. print*, r1, r2, r3, r4, r5, r6, r7, r8 end 2.4.6 Prioridades FORTRAN usa a seguinte relao de prioridades: Tabela 5: Ordem de prioridade. Prioridade 6 7 Operador . .and. .or. 1 2 2 3 3 4 4 4 4 4 4 5

.eq. .ne. .gt. .ge. .lt. .le. .not

O uso de parnteses pode ser feito para trocar a ordem de prioridade. 2.5 Funes intrnsecas Existem vrias funes predenidas em FORTRAN, que podem ser usadas em qualquer parte do programa. Aqui sero sitadas algumas delas, outras funes intrnseca s podem ser encontradas. Tabela 6: Funes diversas. Nome Denio o de funo ALOG10(x) Logaritmo de x na base 10 Real ALOG(x) Logaritmo neperiano de x Real EXP(x) O nmero elevado a x Real ABS(x) Valor absoluto de x Real IABS(x) Valor absoluto de x Inteiro IFIX(x) Trunca de real para inteiro Inteiro FLOAT(x) Converso de inteiro para real Real DBLE(x) Converte para dupla preciso Real*8 CMPLX(x) Converte para o tipo complexo Complexo SIGN(x,y) Fornece |x| se y 0 e -|x| se y 0 Real MOD(x,y) Resto da diviso de x por y Inteiro AMOD(x,y) Resto da diviso de x por y Real SQRT(x) Raiz quadrada de x Real/Complexo MAX(x,y) Maior entre x e y Inteiro/Real Tipo de argumento Real Real (x 0) Real Real Inteiro Real Inteiro Real Real Real Inteiro Real Real (x 0)/Complexo Inteiro/Real Tip

MIN(x,y) Inteiro/Real

Menor entre x e y 10

Inteiro/Real

----------------------- Page 15----------------------Tabela 7: Funes trigonomtricas. Nome e funo SIN(x) REAL*4 ASIN(x) REAL*4 COS(x) REAL*4 ACOS(x) REAL*4 TAN(x) REAL*4 ATAN(x) REAL*4 SINH(x) REAL*4 COSH(x) REAL*4 TANH(x) REAL*4 2.6 Exerccios Denio Seno (radianos) Arcoseno (radianos) Coseno (radianos) Arcocoseno (radianos) Tangente (radianos) Arcotangente (radianos) Seno Hiperblico (radianos) Coseno Hiperblico (radianos) Tangente Hiperblica (radianos) Tipo de argumento Real ou complexo Real, |x| 1 Real ou complexo Real, |x| 1 Real Real Real Real Real Tipo d

Exerccio 2.2 Desenvolver um algoritmo que l uma amostra com 5 valores reais e imprime mdia e varincia. Exerccio 2.3 Dado um nmero inteiro de quatro algarismos imprimir o nmero formado pelos 2 primeiros dgitos, o nmero formado pelos 2 ltimos dgitos e a soma desses dois resul tados. Exerccio 2.4 em Fazer um algoritmo que calcule as razes da funo ,

que a, b e c so informaes fornecidas no momento da execuo do programa. Exerccio 2.5 Fazer um algoritmo que imprima o quociente e o resto da diviso entre dois nmeros fornecidos no momento da execuo do programa. Exerccio 2.6 O nmero 3025 tem a seguinte caracterstica: 30 25 55 e 55 55 3025

Fazer um algoritmo que l um nmero inteiro de quatro algarismos e testa se ele tem ou no a mesma caracterstica do 3025. Exerccio 2.7 So dados dois nmeros inteiros positivos tm respectie , sendo que e

vamente 2 e 7 dgitos. Vericar se um subnmero de . Exemplo: 23, 5723835, subnmero de . 23, 2583479, no subnmero de . 11 ----------------------- Page 16----------------------3 Controle de execuo

Os programas em FORTRAN devem conter os comandos escritos na ordem em que sero executados, com exceo das funes, subrotinas e laos de repetio. O comando "end" indica o m do programa. Se o programador preferir pode nalizar o programa prematu ramente usando os comandos "stop" ou "call exit". Por exemplo: program exemplo implicit none integer a, b read*, a, b Exemplo 3.1 print*, a, b stop !ou "call exit" a = a**b print*, a end Neste caso, o programa encerrar na linha de comando em que aparece "stop " ou, se preferir pode colocar "call exit". 3.1 "GOTO"

Quando se deseja que o comando do programa avance ou recue e m sua estrutura de forma no sequencial, usa-se o comando "goto". ... goto n ... n comando ... Em que n um nmero inteiro positivo no um comando, na qual o programa, ao executar a linha n comando", podendo esta estar antes ou depois de "goto n". estar em branco e pode no conter comando, pode-se usar a Por exemplo: program exemplo implicit none integer a, b read*, a, b goto 12 print*, a, b a = a**b 12 print*, a que rotula uma linha que possua ou "goto n" redireciona-se linha " Como uma linha rotulada no pode palavra chave "continue".

Exemplo 3.2

end 3.2 Estrutura condicional

Toda linguagem de programao estruturada necessita de artifcios que possibi litem a execuo condicional de comandos. Esses comandos normalmente alteram o uxo de execuo de um programa. Uma das caractersticas da linguagem FORTRAN o processamento de cima para baixo, linha por linha. Entretanto, essa ordem pode ser alterada quando utilizamos algumas condies para que os clculos sejam realizados. Isso pode ser feito utilizando o com ando IF. 12 ----------------------- Page 17----------------------3.2.1 Estrutura condicional simples A sintaxe do comando de uma estrutura condicional simples descrita por: ... if (condio) comando ... ou ... if (condio) then bloco de comandos end if ... Quando a condio for verdadeira o comando ou bloco de comandos ser executado, quando for falsa o programa segue para o prximo comando logo abaixo d a estrutura condicional. A primeira opo s vlida quando for executado um nico comando. Este comando pode ser de qualquer tipo, atribuio, escrita, leitura, "goto" ou interrupo do progra ma. Por exemplo, program exemplo implicit none integer a,b read*, a,b Exemplo 3.3 if (mod (a,b)==0) then print*, a," e multiplo end if end . 3.2.2 Estrutura condicional composta Na estrutura condicional composta, se a condio for verdadeira, o bloco1 e xecutado, de", b

Obs.: permitido o uso de estruturas condicionais umas dento das outras

se no o bloco2 que ser executado. Mesmo quando s h um comando no bloco1, no se pode omitir a palavra chave "then". A sintaxe do comando : ... if (condio) then bloco1 else bloco2 end if ... Por exemplo, program exemplo implicit none integer a,b read*, a,b if (mod (a,b)==0) then Exemplo 3.4 print*, else print*, end if end a," e multiplo de", b de", b a," nao e multiplo

13 ----------------------- Page 18----------------------3.2.3 Estrutura condicional composta expandida

Na estrutura condicional composta expandida vrias condies so testadas. A e strutura da sintaxe : ... if (condio1) then bloco1 else if (condio2) then bloco2 ... else if (condion) then blocon else bloco(n+1) end if ... Dessa forma, se a condiok for satisfeita, as seguintes so ignoradas. Por exemplo: program exemplo implicit none real nota print*, "Qual foi sua nota?" read*, nota if (nota .ge. 9.00) then print*, "Muito bem! Conceito A" else if (nota .ge. 7.00) then print*, "Voce foi bem! Conceito B" else if (nota .ge. 5.00) then print*, "Voce nao foi tao bem! Conceito

Exemplo 3.5

C"

else print*, end if end 3.2.4

"REPROVADO!!!!!!"

Estrutura condicional composta simplicada

Uma outra forma de se usar uma estrutura condicional composta usando o comando "case". A sintaxe de comando : ... nome_case: select case case (lista de seleo comandos1 case (lista de seleo comandos2 ... case (lista de seleo comandosn case default comandosd end select nome_case ... 14 ----------------------- Page 19----------------------Em que "exp. case" uma expresso ou constante inteira, lgica ou liter al (somente um caractere "character*1"). Caso o valor de "exp. case" estiver na "lista de seleo 1", os "comandos1" sero executados. Se o valor no estiver na "lista de seleo 1" o computador ir avaliar a "lista de seleo 2", se for verdadeira sero executados os " comandos2" e assim at terminar os comandos "case (lista de seleo n)". O comando "case defau lt" opcional, e faz com que os "comandosd" sejam executados caso nenhuma das outras avaliaes sejam verdadeiras. "nome_case" opcional e deve seguir as mesmas regras usadas para da r nomes as variveis. A sua utilidade apenas de dar maior clareza ao programa. importante lembrar que somente uma das condies (lista de seleo) deve ser sa tisfeita. As listas de seleo podem ser da seguinte forma: Tabela 8: Listas de seleo. Estrutura case (valor) r case (:valor) alor case (valor:) alor case (valor1:valor2) exp. case entre valor1 e va exp. case maior ou igual ao v exp. case menor ou igual ao v Condio para ser verdadeira exp. case igual ao valo (exp. 1) 2) n) case)

lor2 case (valor1,valor2,...,valorn) or2 ou ... valorn exp. case igual ao valor1 ou igual ao val

Por exemplo, utilizando uma constante literal: program exemplo implicit none character i*1 i="h" valor_i: select case (i) case ("a","b","c") Exemplo 3.6 print*, "i=a ou b ou c" case ("d":"m") print*, "i esta entre d e m" case ("D":"M") print*, "i esta entre D e M" end select valor_i end Por exemplo, utilizando uma constante inteira: program exemplo implicit none integer a read*, a select case (a) case (:-2) print*, a, " menor ou case (0) print*, a, " igual a case (2:7) print*, a, " entre 2 case default print*, "nenhuma das end select end 15 ----------------------- Page 20----------------------3.3 Estrutura de repetio

igual zero" e 7" condicoes

a -2"

Exemplo 3.7

foi sati

sfeita"

Quando o mesmo comando precisa ser executado vrias vezes at que se atinja uma certa condio ou um nmero certo de repeties, o melhor usar as estruturas de repetio. Estas estruturas so bem simples e podem economizar vrias linhas de comando. 3.3.1 "LOOP" condicional

"Loop" consiste de um bloco de comandos que so executados cicl icamente, innitamente. necessrio um mecanismo condicional para sair do "loop". O bloco de comandos que executado ciclicamente delimitado pelo comando "do ... end do" e o comando exit determina a sada do "loop". A sintaxe de comando : ...

do ... if (expresso ... end do ... Por exemplo:

lgica) exit

Exemplo 3.8

program exemplo implicit none integer i i=0 do i = i + 1 if (i .GT. 100) exit print*, "i vale", i end do print*, "Fim do loop. end

i = ", i

3.3.2

"LOOP" ciclo condicional

"Loop" cclico consiste de um mecanismo condicional para sair e iniciar o "loop" novamente. O comando "cycle" determina, novamente, o incio imediato do "loop". A sintaxe de comando : ... do ... if (expresso if (expresso ... end do ... Por exemplo: 16 ----------------------- Page 21----------------------program exemplo implicit none integer i i=0 do i = i + 1 Exemplo 3.9 if (i >= 50 .AND. i <= 59) cycle if (i .GT. 100) exit print*, "i vale", i end do print*, "Fim do loop. i = ", i end 3.3.3 "DO" iterativo

lgica) cycle lgica) exit

O "DO" iterativo consiste num "loop" que possui um nmero xo de ciclos. A sintaxe de comando : ... do varivel = expresso1,expresso2,expresso3 ... end do ...

Em que, expresso1 o valor inicial, expresso2 o valor nal e expresso3 o valor de incremento. Podemos interpretar "do varivel = expresso1,expresso2,expresso3 ... end do" como "Para varivel, de expresso1 at expresso2 passo expresso3 faa ... m para". Por exemplo: program implicit integer do i = print*, end do end exemplo none i 2,100,2 "i vale", i

Exemplo 3.10

3.3.4

"DO-WHILE"

O "DO-WHILE" consiste num "loop" que condiciona a sua execuo antes de exe cutar o bloco de comandos, pois a condio testada no topo do "loop". A sintaxe de comand o : ... do while ... end do ... (expresso lgica)

Podemos interpretar "do while (expresso lgica) ... end do" como "Faa enquanto expresso lgica ... m para". Por exemplo: 17 ----------------------- Page 22----------------------program exemplo implicit none integer I I = 1 do while (I<25) if (I==1) then print*, "Passei", I, " vez" else print*, "Passei" , I, " vezes" endif I=I+1 enddo end

Exemplo 3.11

3.4

Exerccios primeiros elementos da se

Exerccio 3.1 Fazer um algoritmo que gere os quncia de Fibonacci, dada por: 1, 1, 2, 3, 5, 8, 13, 21, ...

Exerccio 3.2 Desenvolver um programa que calcule para um qualquer.

inteiro no negativo

Exerccio 3.3 Desenvolver um programa que solicita que se digite trs valo res e informa se eles podem corresponder a trs lados de um tringulo equiltero, issceles, esc aleno ou no formam um tringulo. Exerccio 3.4 Desenvolver um programa que informe os nmeros primos entre 1 e 1000. Exerccio 3.5 Desenvolver um programa que escreva um nmero natural produto de nmeros primos. Exerccio 3.6 O nmero 3025 tem a seguinte caracterstica: 30 25 55 e 55 55 3025 como

Fazer um algoritmo que apresente todos os nmeros naturais de quatro dgitos que tm a mesma caracterstica do 3025. Exerccio 3.7 Sabendo que o nmero dos logartimos naturais neperianos apro ximadamente 2,718281 e sabendo que este nmero representado numericamente pela soma abaixo, em que quanto maior o valor de , melhor a aproximao. Crie um programa que calcule o valor de que nos dar quantos elementos da srie sero somados para que se obtenha um valor maior ou igual ao apresentado.

Exerccio 3.8 Escreva um programa para identicar os nmeros amigveis menores que 2000 . Dois nmeros so amigveis quando cada um igual soma dos divisores do ou tro nmero (excluindo apenas o prprio nmero). Exemplo: 220 e 284 so nmeros amigveis pois a som a dos divisores de 220 (1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110) igual a 284 e a s oma dos divisores de 284 (1, 2, 4, 71, 142) igual a 220.

Exerccio 3.9 Escreva um programa para calcular uma aproximao para , onde um valor inteiro lido da unidade padro de entrada. A aproximao pode ser obtida de: . O programa deve encerrar o processamento quando a variao no valor calculado for inferior a 0.001. 18 ----------------------- Page 23----------------------4 Matrizes

Matrizes ou "Arrays" so uma coleo de dados armazenados na memria e acessado s, individualmente, de acordo com a sua posio espacial, denida pelas dimenses da matriz . O FORTRAN armazena os elementos de matrizes em espaos contguos de memria. Este ordenamento obtido variando-se inicialmente o ndice da primeira dimenso da ma triz, depois variando-se o ndice da segunda dimenso e assim por diante. Em um a matriz com 2 dimenses isto obtido variando-se inicialmente as linhas e depois as colunas, ou seja, os elemenos so distribudos por colunas. 4.1 Declaraes Para declarar matrizes existem as seguntes formas: tipodevarivel , dimension mats ou tipodevarivel mat1(a1, ., bl) ou dimension mat1(a1, bl) tipodevarivel mat1, ..., mats a2, ..., ak), ..., mats(b1, b2, ..., a2, ..., ak), ..., mats(b1, b2, .. (a1, a2, ..., ak) :: mat1, ...,

Em que "tipodevarivel" determina o tipo de varivel para cada elemento da matriz, podendo ser inteiro, real, complexo, alfanumrico ou lgico. O FORTRAN 90 trabalha com vertores de at 7 dimenses. O limite inferior e superior de nveis por dimenso cam separados pelo caractere ":". Caso no exista ess e caractere, o limite inferior ser sempre 1 e o limite superior, o informado na denio da matriz . Se esse limite inferior no for informado, ento a alocao de memria ser dinmica, ou seja, durant a execuo do programa. Para leitura e impresso, a ordem por coluna, ser utilizada. Por Default cada elemento das matrizes recebe, inicialmente, valor zero . Porm, podese iniciar os elementos da matriz utilizando "/.../". Por exemplo,

Exemplo 4.1

program implicit integer, integer print*, print*, end

exemplo none dimension (4) B(2,2)/1,2,3,4/ A B

::

A = (/2,3,4,5/)

4.2

Operaes Para a matriz toda. program exemplo implicit none integer A(3,2), A = 1 B = 2*B*A + 1 A = B + A print*, A print*, B end 19

B(3,2)/1,2,3,4,5,6/

Exemplo 4.2

----------------------- Page 24----------------------Neste caso, a matriz A declarada de ordem or Default nula, e a matriz B declarada de ordem os, priori: formada por elementos inteir formada por elementos inteiros, p

Depois, a matriz A recebe valor 1 para todos seus elementos. Cada elemento B (i,j ) da matriz B recebe Bij Aij , ou seja, quando apresentado "A*B" calculado o produto elemento a elemento, valendo tambm para as outras operaes matemticas. Eno comando seguinte cada elemento Aij da matriz A recebe Bij Aij e, por m, A e B so impressas. Observa-se que quando dimenso ou ordem de matri zes so diferentes essas operaes no podem ser feitas entre elas. Para alguns elementos da matriz program exemplo implicit none integer A(3,2), B(3,3)/1,2,3,4,5,6,7,8,9/ A(1,1) = 80 Exemplo 4.3 A(3,2) = B(1,1) + B(3,3) print*, A print*, A(1,1) end Neste caso, a matriz A declarada de ordem or Default nula, e a matriz B declarada de ordem os, formada por elementos inteir formada por elementos inteiros, p

priori:

Depois, os elementos A(1,1) e A(3,2) da matriz A recebem respectivamente valor es 80 e B1 1 B3 3 e, por m, a matriz A e seu elemento A(1,1) so impressos. Observa-se que elementos de matrizes de dimenso ou ordem diferentes podem ser operacionado s. Para algumas sees de elementos da matriz Para se operacionar somente uma seo da matriz, podemos escrever: matriz(liminf 1:limsup 1:incremento 1, ..., liminf n:limsup n:incremento n) Em que liminf k, limsup k e imcremento k representam respectivamente l imite inferior, limite superior e incremento da dimenso k. Se um dos limites, inferior ou superior (ou ambos) for omitido, ento o limite ausente assumido como o limite inferior ou superior da correspondente dimenso da matriz da qual a seo est sendo extrada e se o incremento for omitido, ento assume-se que vale r um. Dessa forma, por exemplo, dada a matriz: 20 ----------------------- Page 25-----------------------

X (:,:) ou X representa todos os elementos da matriz: 1 6 11 16 21

2 7 12 17 22 3 8 13 18 23 4 9 14 19 24 5 10 15 20 25 X (2:2,2:2) ou X (2,2) representa o elemento da linha 2 e coluna 2.

X (3,3:5) representa os elementos de linha 3 que variam da coluna 3 5:

13 18 23

X (2:3,2:5:2) representa os elementos das linhas 2 e 3 e das colunas 2 5 e in cremento 2:

7 8

17 18

X (1::2,2:4) representa os elementos da linha 1 at terminar as linhas com incr emento 2 e das colunas 2 4: 6 11 16

8 13 18 10 15 20 21 ----------------------- Page 26----------------------program exemplo

implicit none integer X(5,5),i,j do i= 1,5,1 do j= 1,5,1 X(i,j) = (j-1)*5+i enddo Exemplo 4.4 enddo print*, print*, print*, print*, print*, end 4.3 Leitura e impresso X(:,:) X(2:2,2:2) X(3,3:5) X(2:3,2:5:2) X(1::2,2:4)

H vrias formas de leitura e impresso de matrizes, entre elas podemos apena s utilizar o comando "read*, A" e "print*, A" para ler e imprimir uma matriz A. No entanto, os elementos sero lidos e impressos no vdeo em uma linha contnua na ordem por colunas. Outra forma de leitura e impresso de matrzes muito til utilizan do um processo iterativo. Por exemplo, caso queiramos entrar com os valores da matriz A por li nhas e depois imprimir tambm nesta mesma ordem: program exemplo implicit none integer A(3,3),i,j do i= 1,3,1 do j= 1,3,1 read*, A(i,j) enddo Exemplo 4.5 enddo do i= 1,3,1 do j= 1,3,1 print*, A(i,j) enddo enddo end Porm, apesar de apresentar funcionalidade matemtica, ainda h decincia esttica . Para que a matriz seja apresentada em uma melhor forma utiliza-se: ( expresso , i = a, n, b ) Em que, ocorre uma repetio de expresso para i de a at b passo n. Ou seja, equivalente a: ... do i = a, n, b expresso end do ...

22 ----------------------- Page 27----------------------Porm, este tipo de repetio, alm representar muito bem o "DO" iterativo, muda de linha na tela sempre que termina. Assim, por exemplo: program exemplo implicit none integer A(3,3),i,j do i= 1,3,1 read*, ( A(i,j) , j=1, 3, 1 ) Exemplo 4.6 enddo do i= 1,3,1 print*, ( A(i,j) , j=1, 3, 1 ) enddo end Apresenta o vetor A em linhas e colunas. Outras formataes sero vistas nas sesses posteriores. 4.4 as. Tabela 9: Funes de matrizes. Funo LBOUND UBOUND SHAPE SIZE TRANSPOSE Signicado Limite inferior das dimenses da matriz Limite superior das dimenses da matriz Ordem da matriz Nmero de elementos da matriz Transposta da matriz Funes Algumas funes podem ser utilizadas para apresentar informaes e tributos dest

Para obter as informaes para uma determinada dimenso, basta inserir vrgula e a dimenso aps o nome da matriz. Por exemplo: program exemplo implicit none integer A(2,3)/1,2,3,4,5,6/,i,j,B(3,2) B = TRANSPOSE (A) do i= 1,2,1 print*, ( A(i,j) , j=1, 3, 1 ) enddo do i= 1,3,1 print*, ( B(i,j) , j=1, 2, 1 ) enddo print*, LBOUND (A), LBOUND (A,1), LBOUND (A,2) print*, UBOUND (A), UBOUND (A,1), UBOUND (A,2) print*, SHAPE(A) print*, SIZE(A), SIZE(A,1), SIZE(A,2) end

Exemplo 4.7

4.5

Alocao Uma novidade importante introduzida no FORTRAN 90 a habilidade de se dec

larar variveis dinmicas e em particular, matrizes dinmicas. O FORTRAN 90 fornece tanto matrizes alocveis quanto matrizes automticas, ambos os tipos sendo matrizes dinmicas. Usando 23 ----------------------- Page 28-----------------------

matrizes alocveis, possvel alocar e de-alocar espao de memria conforme necessrio. O recurso de matrizes automticas permite que matrizes locais em uma funo ou subrotina t enham forma e tamanho diferentes cada vez que a rotina invocada. Matrizes alocveis permitem que grandes fraes da memria do computad or sejam usadas somente quando requerido e, posteriormente, liberadas, quando no mais necessrias. Este recurso oferece um uso de memria muito mais eciente que o FORTRAN 77, o qual oferecia somente alocao esttica (xa) de memria. Alm disso, o cdigo torna-se muito mais robusto, pois a forma e o tamanho das matrizes podem ser decididos durante o pro cessamento do cdigo. Uma matriz alocvel declarada na linha de declarao de tipo de v arivel com o atributo "ALLOCATABLE". O posto da matriz deve tambm ser declara do com a incluso dos smbolos de dois pontos ":", um para cada dimenso da matriz. Por exemplo, a ma triz de duas dimenses A declarada como alocvel atravs da declarao: REAL, DIMENSION(:,:), ALLOCATABLE :: A sta forma de declarao no aloca espao de memria imediatamente matriz, como acontece com as declaraes usuais de matrizes. O status da matriz nesta situao not currently allocated, isto , correntemente no alocada. Espao de memria dinamicamente al ocado durante a execuo do programa, logo antes da matriz ser utilizada, usando-se o comando "ALLOCATE". Este comando especica os limites da matriz. Por exemplo: ALLOCATE (A(0:N,M)) O espao alocado matriz com o comando "ALLOCATE" pode, mais tarde, ser liberado com o comando "DEALLOCATE". Este comando requer somente nome da matriz pr eviamente alocada. Por exemplo, para liberar o espao na memria reservad o para a matriz A: DEALLOCATE (A) Tanto os comandos "ALLOCATE" e "DEALLOCATE" possuem o especicado r opcional "STAT", o qual retorna o status do comando de alocao ou de-alocao. Neste cas

o, a forma geral do comando : ALLOCATE (lista de objetos alocados , STAT= status) DEALLOCATE (lista de objetos alocados , STAT= status) Em que "status" uma varivel inteira escalar. Se STAT= est presente no co mando, "status" recebe o valor zero se o procedimento do comando ALLOCATE/DEALLOCATE fo i bem sucedido ou um valor positivo se houve um erro no processo. Se o especicador STAT= no estiver presente e ocorra um erro no processo, o programa abortado. Fin almente, possvel alocar-se ou de-alocar-se mais de uma matriz simultaneamente, como indic a "lista de objetos alocados". Matrizes alocveis tornam possvel o requerimento freqente de declar ar uma matriz tendo um nmero varivel de elementos. Por exemplo, pode ser necessrio ler variveis, digamos tam1 e tam2 e ento declarar uma matriz com tam1 tam2 elementos. possvel vericar se uma matriz est ou no correntemente alocada usando-se a f uno intrnseca ALLOCATED. Esta uma funo lgica com um argumento, o qual deve ser o nome de uma matriz alocvel. Usando-se esta funo, comandos como os seguintes so possveis: IF (ALLOCATED(A)) DEALLOCATE (A) IF (.NOT. ALLOCATED(A)) ALLOCATE (A(5,20)) 24 ----------------------- Page 29----------------------Por exemplo: program exemplo implicit none real , dimension (:), allocatable :: A real , dimension (:,:), allocatable :: B integer N, I, J, ERRO read*, N allocate (A(N), B(N,N), STAT=ERRO) if (ERRO/=0) print*, "Problemas de alocacao " Exemplo 4.8 do I = 1,N,1 A(I)=N**(1./I) enddo do I = 1,N,1 B(I,:)= I*A enddo do I = 1,N,1 print*, ( B(I,J) , J=1, enddo deallocate (A, B) end

N, 1 )

4.6

Exerccios Desenvolver um algoritmo que construa uma matriz identidade .

Exerccio 4.1

Exerccio 4.2 Desenvolver um algoritmo que l uma amostra com eais e imprime mdia e varincia. Exerccio 4.3 a possvel. Exerccio 4.4

valores r

Calcular C=AB para A e B matrizes quaisquer tal que o produto sej Quadrado Mgico uma tabela quadrada de lado , onde a soma dos nmeros

das linhas, das colunas e das diagonais constante, sendo que nenhum destes nmeros se repete. Fazer um algortmo que verica se uma tabela um quadrado mgico. Exerccio 4.5 Pascal. Fazer um algoritmo que imprime as primeiras linhas do Tringulo de

Exerccio 4.6 Dado um experimento com delineamento inteiramente casualiza do que testa t tratamentos com repeties cada, apresentar o valor do F calculado para tratament o. 25 ----------------------- Page 30----------------------5 Subprogramas e mdulos

Quando um algoritmo tem muitas linhas de comandos comea a ser de difcil manipulao. Normalmente alguns programas apresentam esta catacterstica e algumas instrues so muitas vezes repetidas. Assim, possvel dividir o programa em unidade s menores que executam as instrues repetidas separadamente com dados ou parmetros diferentes, ou seja, em subprogramas. possvel escrever um programa completo em um nico arquivo, ou como uma uni dade simples. Contudo, se o cdigo sucientemente complexo, pode ser necessrio que um det erminado conjunto de instrues seja realizado repetidas vezes, em pontos distintos do programa. Cada uma das unidades de programa corresponde a um conjunto c ompleto e consistente de tarefas que podem ser, idealmente, escritas, compiladas e tes tadas individualmente, sendo posteriormente includas no programa principal para gerar um arquivo executve l. Em FORTRAN h dois tipos de estruturas que se encaixam nesta categoria: subrotinas e funes (externas ou extrnsecas). Um cdigo executvel criado a partir de um programa principal, q ue pode invocar rotinas externas e usar mdulos tambm. A nica unidade de programa que deve ne cessariamente existir sempre o programa principal. Quaisquer das trs unidades de programas podem tambm invocar roti nas internas, as quais tm estrutura semelhante s rotinas externas, porm no podem ser testadas isol

adamente. 5.1 Programa principal

Todo cdigo executvel deve ser composto a partir de um, e somen te um, programa principal. Opcionalmente, este pode invocar subprogramas. Um programa principal possui a seguinte estrutura: program nome declaraes comandos contains subprogramas internos end program nome A declarao "contains" indica a presena de subprogramas internos (funes ou su brotinas). 5.2 Funes

Uma funo retorna um nico valor (matriz ou escalar), e esta usualmente no al tera os valores de seus argumentos. Neste sentido, uma funo em FORTRAN age como uma fu no em anlise matemtica. O FORTRAN tem dois tipos de funes, intrnsecas e denidas pelo usurio. Funes intrnsecas so prprias (latentes) da linguagem FORTRAN, tais como sin(x ), cos(x), sqrt(x), entre outras. Estas j foram abordadas em 2.5. As funes denidas pelo usurio so funes que o programador cria para executar uma tarefa especca. Exceto pela declarao inicial, as funes apresentam uma forma semelhant e a de um programa principal: 26 ----------------------- Page 31----------------------... contains function nome (argumentos) declaraes comandos contains subprogramas internos end function nome ... O efeito do comando "end" em um subprograma consiste em retor nar o controle unidade que o chamou, ao invs de interromper a execuo do programa. Recomenda-se o uso da forma completa do comando para deixar claro ao compilador e ao programador qu al parte do programa est sendo terminada.

Nas declaraes dentro da funo devem aparecer: a prpria funo, os arg mentos e variveis auxiliares da funo. Estas declaraes no so declaradas novamente ju to s declaraes do programa principal. O comando "contains" inserido dentro da funo s necessrio se houverem subpro grams internos funo. Uma funo ativada ou chamada de forma semelhante como se usa uma funo em anlise matemtica. Por exemplo, dada uma funo "func(n,x)", esta pode ser chamada par a atribuir seu valor a uma varivel escalar ou a um elemento de matriz: y func(n,x) Uma funo pode fazer operaes em uma expresso, por exemplo: y (n,x) 5*func(n,x**3), ou ainda servir de argumento para uma outra rotina. Por exemplo: program exemplo implicit none real y1, y2, y3, y4 read*, y1, y2, y3, y4 print*, func(y1,y2) print*, func(y3,y4) contains Exemplo 5.1 function func(x,y) real func, a, b, x, y a=1 b=2 func = a*x+b*y end function func end 5.3 Subrotinas func

Uma subrotina pode executar uma tarefa mais complexa que a funo e retorna r diversos valores atravs de seus argumentos, os quais podem ser modicados ao longo da co mputao da subrotina. Exceto pela declarao inicial, as subrotinas apresentam uma forma semelha nte a de um programa principal: 27 ----------------------- Page 32----------------------... contains subroutine nome (argumentos) declaraes comandos contains subprogramas internos end subroutine nome ...

Nas declaraes dentro da subrotina, devem aparecer as variveis auxiliares e os argumentos da subrotina. Estas declaraes no so declaradas novamente junto s declaraes do programa principal. Uma subrotina, devido ao fato de retornar, em geral, mais de um valor em cada chamada, no pode ser operada como uma funo em anlise matemtica e deve ser chamada atravs da instruo "call". Qualquer unidade de programa pode chamar uma subrotina, at mesmo outra subrotina. Por exemplo, se existe uma sub-rotina "subrot", ser obtida atravs da chamada: call subrot(x1, x2, ..., xn) A ordem e tipo dos argumentos na lista de argumentos devem corresponder ordem e tipo dos argumentos declarados na subrotina. A subrotina naliza sua execuo quando encontra um "return" ou um "end subroutine" e, retorna ao programa qu e a requisitou na linha seguinte ao "call". Por exemplo: program exemplo implicit none real y1, y2, y3, y4, r1, r2 read*, y1, y2, y3, y4 call subrot(y1,y2,r1,r2) print*, r1, r2 call subrot(y3,y4,r1,r2) print*, r1, r2 contains subroutine subrot(x,y,z1,z2) real a, b, x, y, z1, z2 a=1 b=2 z1 = a*x+b*y z2 = a*(x**2)+b*(y**2) end subroutine subrot end

Exemplo 5.2

5.4

Mdulos

No que diz respeito a modularizao de programas, a linguagem FOR TRAN oferece facilidades atravs de subrotinas e funes, o que torna possvel a implementao de program as modulares e estruturados. No FORTRAN 90, esta modularizao teve um avano signicativo atravs das declaraes e procedimentos "module", tanto que esta declarao tem status de programa. 28 ----------------------- Page 33----------------------A declarao "module" (ou mdulo) pode conter dados, procedimentos, ou ambos,

que podemos compartilhar entre unidades de programas (programa principal, su bprograma e em outros mdulos). A estrutura de um mdulo idntica de um programa, porm deve-se trocar "program" por "module". Os dados e procedimentos estaro disponveis para uso na un idade de programa atravs da declarao "use", seguida do nome do mdulo. Por exemplo: module funcao implicit none contains subroutine raizes (a1,b1,c1,raiz1,raiz2) real a1, b1, c1 complex a, b, c, raiz1, raiz2, delta a = cmplx(a1) Exemplo 5.3 b = cmplx(b1) c = cmplx(c1) delta = b*b - 4*a*c raiz1 = (-b + sqrt(delta))/(2*a) raiz2 = (-b - sqrt(delta))/(2*a) end subroutine raizes end module funcao Que deve ser compilado como se fosse um programa principal. Assim, pos svel criar programas no mesmo espao de trabalho (diretrio) que o utilize: program exemplo use funcao implicit none real a, b, c complex raizum, raizdois read*, a, b, c call raizes(a,b,c,raizum,raizdois) print*, raizum, raizdois end

Exemplo 5.4

5.5

Exerccios

Exerccio 5.1 Faa uma subrotina que receba uma matriz (10,10), o nmero de uma li nha , o nmero de uma coluna e retorne a matriz (9,9) resultante da re moo da linha e da coluna . Exerccio 5.2 Escreva um programa que jogue o jogo da velha com o us urio, o qual deve ter a seguinte estrutura: inicializar a matriz 33 com zeros; pedir par a o jogador escolher o seu smbolo ( ou ); pedir a jogada do usurio; gerar a jogada do comp utador (que simplesmente deve preencher com o seu smbolo o primeiro espao vazio que encontrar (el e no muito inteligente!); mostrar a matriz alterada na tela; vericar se h ve ncedor (linhas, colunas ou diagonais com um mesmo smbolo) e anunci-lo; caso contrrio, pedir nova jogada ao

usurio, etc. Depois que um jogador vencer, o programa deve perguntar se o usurio quer jogar novamente. Se a resposta for negativa, terminar o programa. Exerccio 5.3 O nmero de cadastro de pessoas fsicas do Ministrio da Fazenda (CPF) tem 9 dgitos seguidos de dois dgitos vericadores, os quais servem como teste para erros d e digitao 29 ----------------------- Page 34-----------------------

na sequncia. Dada a sequncia dos 9 dgitos ( ) o primeiro dgito vericador () gerado seguindo-se a regra: a) calcula-se a soma 109... 32; b) calcula-se o resto da diviso de por 11; c) subtrai-se de 11; d) s e resultar 10 ou 11, transforme para 0. O segundo dgito vericador () gerado usando-se o : calcula -se a soma 1110...432 e seguem-se os demais passos de forma semelhante. Escreva um programa para vericar se um CPF, dado numa se quncia de 11 dgitos, sem pontos ou hfen, vlido, ou seja, no contm erros de digitao. (Usar mdulo Exerccio 5.4 Escreva um programa que l um nmero no determinado de valores , todos

inteiros e positivos, um valor de cada vez, e, se utiliza um sub-programa do tipo funo que calcula o fatorial de , e caso contrrio, utiliza um sub-programa do tipo funo p ara obter o nmero de divisores de (quantos divisores possui). Escrever cada lido e s eu fatorial ou seu nmero de divisores com uma mensagem adequada. Neste caso, t emos um programa principal e dois sub-programas. 30 ----------------------- Page 35----------------------6 Entrada e sada de dados

Entrada e sada de dados uma parte de fundamental importncia na programao. O FORTRAN 90 possui uma grande variedade de opes de I/O (input/output), que permitem diferentes tipos de arquivos se conectarem ao programa principal para leitura e gravao. 6.1 I/O simples

Neste material foram utilizados, at agora, para leitura e impresso de dad os no ecr (tela do computador), respectivamente os comandos "read*," e "print*," porm, outr as formas mais elaboradas podem ser utilizadas. Leitura: read (n unidade , n formato / cdigo do formato ) variveis Impresso: write (n unidade , n formato / cdigo do formato ) variveis Em que, n unidade corresponde ao nmero que representa um cheiro (arqui

vo) ou um ecr, sua utilizao ser descrita frente. E n formato corresponde ao nmero que repres enta um rtulo para declarao de formato ou pode ser substitudo pelo prprio cdigo do formato sem uso de declarao de formato. Para simplicao destas declaraes, utiliza-se "*" em vez de nmeros, i sto utilizado quando se deseja ler e imprimir variveis ou textos no ecr e no h preocupao com formatao: Leitura: read (*,*) variveis Impresso: write (*,*) variveis Para utilizao de formatao dos dados, utiliza-se a sintaxe: ... write ... ou ... write (*, n formato) variveis ... n formato format (cdigo do formato) ... Os cdigos de formatao mais utilizados so: Tabela 10: Cdigos de formatao mais utilizados. Cdigo Iw Iw.m Fw.d s nX Ew.d Aw pEw.d n n espaos horizontais Dado real em notao exponencial com largura total de campo w e d casas decimais Dado de caractere com largura de campo Dado real com p nmeros antes da vrgula, em notao exponencial com largura total de campo w e d casas decimais n espaos verticais (saltar linha) 31 ----------------------- Page 36----------------------Se um nmero ou texto no preencher o tamanho do campo declarado, sero somad os espaos. Normalmente o texto ser ajustado direita, mas as regras variam pra forma taes diferentes. program exemplo implicit none real x integer n Representao Dado inteiro com largura total de campo w Dado inteiro com largura total de campo w e numero mnimo de caracteres m Dado real com largura total de campo w e d casas decimai (*, '(cdigo do formato)') variveis

character*19 c x = 13.760 n = 276 c = "Programa em Fortran" write (*,23) c write (*,900) x write (*,1) n Exemplo 6.1 write (*,'(5/)') write (*,'(10x,A19)') c write (*,'(10x,F8.4)') x write (*,'(10x,E8.3,10x,I10.2)') write (*,'(10x,I10.2)') n write (*,'(10x,I8)') n write (*,'(5/)') 23 format (15x,A8) 1 format (15x,I6) 900 format (15x,F8.1) end 6.2 Ficheiros

x, n

possvel, atravs de comandos em FORTRAN, ler ou imprimir em cheiros, que so armazenados em dispositivos de armazenamento de dados. Inicialmente, necessrio e fetuar a abertura de um arquivo, j existente ou no. Um programa pode gerar tantos dados, que todos eles no caberiam na tela de uma s vez, e ainda seriam perdidos ao nalizar o programa. Os dados salvos em arquivos podem ser usados pelo prprio programa ou exportados para serem processados de outra forma. Arquivos de leitura economizam um tempo precioso para o usurio do programa, pois ele no vai precisar enviar dados via teclado, e com arquivos milhares de dados podem ser lidos em se gundos. Alm de que, no necessrio executar o programa sempre que se desejar consultar dados de sada em arquivos, A sintaxe bsica para abertura, criao ou substituio de um cheiro : ... open(n ... close(n ... unidade, unidade) file="nome do arquivo")

Em que "open" faz a chamada, se j existente, ou a criao do ar quivo "nome do arquivo" e atribui a este um inteiro "n unidade" que o representar nos comandos d o algoritmo. Quando no for utilizado o comando "open", o programa emitir uma mensagem na tela p edindo o seu nome, podendo o usurio escolher um nome diferente a cada vez q ue o programa for executado. Todos os arquivos devem estar ou sero criados no mesmo diretrio em que estiver

32 ----------------------- Page 37----------------------o programa. Outros comandos opcionais podem ser inseridos em "open" de acordo com cada compilador. E, "close" efetua o fechamento do arquivo representado por "n unidade". Outros comandos opcionais podem ser inseridos em "close" dacordo com cada compilador. Para impresso em um arquivo representado por "n unidade", utiliza do o comando "write (n unidade , n formato / cdigo do formato ) variveis" aps a aber tura ("open") e antes do fechamento ("close") do arquivo. Por exemplo: program exemplo implicit none integer n, i read*, n open(503,file="arquivo.txt") Exemplo 6.2 do i=1,n,1 write (503,'(3x,I5)') enddo close(503) end i

program exemplo implicit none integer n, j real i read*, n open(10, file="arquivo.dat") Exemplo 6.3 do i=1,n,1 write (10, '(10000(1x,f5.0))') n,1 ) print*, i enddo close (10) end Alguns comandos extras podem ser inseridos caso necessrio: Tabela 11: Comandos extras de formatao. Comando rewind (n unidade) backspace (n unidade) Representao Recuo total Recuo de um campo ( i , j=1,

Apesar de se poder usar qualquer extenso de arquivo ou at omitla, as extenses .dat para leitura e .out para sada so mais comumente encontradas. Por exemplo:

33 ----------------------- Page 38----------------------program exemplo implicit none open(10, file="arquivo.txt") write (10,*) "Texto" write (10, '(1x,f6.3)') 12.234 write (10, '(1x,f6.3)') 23.876 rewind (10) write (10, '(1x,f6.3)') 56.789 write (10, '(1x,f6.3)') 67.123 backspace (10) write (10, '(1x,f6.3)') 77.153 close (10) end

Exemplo 6.4

6.3

Exerccios

Exerccio 6.1 Fazer um algortmo que leia 10 valores reais e imprima uma tabela c uja primeira coluna seja formada por estes nmeros, a segunda coluna apresente a parte inteira desses valores e a terceira coluna apresente estes valores em notao cientca. NOTA: Consi derar, por facilidade, valores de 0 a 100 com um mximo de trs casas decimais. Exerccio 6.2 Criar um arquivo txt contendo uma matriz identidade 500500.

Exerccio 6.3 Desenvolver um programa que cria um arquivo txt com uma sequncia d e 1000 nmeros aleatrios. Cada nmero deve estar entre 0 e 1, conter duas casa s decimais e os nmeros devem ser impressos numa mesma linha com trs espaos horizonta is entre eles. NOTA: Para gerao de nmeros aleatrios utilizar o comando "ran(n)", em que um inteiro qualquer informado que serve como semente. Exerccio 6.4 Desenvolver um programa que leia os dados do arquivo cri ado no exerccio anterior e apresente na tela de execuo a porcentagem de elementos menores que 0,5. Exerccio 6.5 Desenvolver um programa que resolva um SUDOKU espresso po r um arquivo com extenso txt e imprima a resoluo em outro arquivo txt. Exerccio 6.6 Desenvolver um programa que gere, aleatoriamente, um SUDOKU no res olvido de soluo nica e o imprima em um arquivo txt. 34 ----------------------- Page 39----------------------7 Algoritmos dos exerccios Sero apresentados alguns dos algortmos em FORTRAN exigidos nos e

xerccios. importante salientar que ser apresentada apenas uma forma de resolver cada proble ma, assim, no existe um gabarito para os exerccios e cada programador ter, provavelmente um pr ograma diferente que resolva o mesmo problema. Espera-se do leitor a compreenso dos pro cedimentos realizados de modo a ampliar seus horizontes s prprias criaes e a resolver os proble mas em sua determinada rea. program exercicio_2_2 implicit none real a1, a2, a3, a4, a5, m, v read *, a1, a2, a3, a4, a5 m = (a1 + a2 + a3 + a4 + a5)/5 v=(((a1-m)**2)+((a2-m)**2)+((a3-m)**2)+((a4-m)**2)+((a5-m)**2))/4 print*, "media", m print*, "variancia", v end program exercicio_2_3 implicit none integer m,r,s,t read *, m r = m/100 s = m-(r*100) t = r + s print*, r, s, t end program exercicio_2_4 implicit none real a1, b1, c1 complex a, b, c, raiz1, raiz2, delta read*, a1, b1, c1 a = CMPLX(a1) b = CMPLX(b1) c = CMPLX(c1) delta = b*b - 4*a*c raiz1 = (-b + sqrt(delta))/(2*a) raiz2 = (-b - sqrt(delta))/(2*a) print*, raiz1, raiz2 end program exercicio_2_5 implicit none real a, b integer q, r read*, a, b q = a / b r = a-(b*q) print*, "quociente: ", q print*, "resto: ", r end 35 ----------------------- Page 40-----------------------

program exercicio_2_6 implicit none integer m,r,s logical resp read*, m r = m/100 s = m-(r*100) resp = ((r+s)**2) == m print*, resp end program exercicio_2_7 implicit none integer p, q, a, b, c, d, e, f, g logical r read*, p, q a=(q/1000000) b=(q/100000)-(a*10) c=(q/10000)-(a*100)-(b*10) d=(q/1000)-(a*1000)-(b*100)-(c*10) e=(q/100)-(a*10000)-(b*1000)-(c*100)-(d*10) f=(q/10)-(a*100000)-(b*10000)-(c*1000)-(d*100)-(e*10) g=q-(a*1000000)-(b*100000)-(c*10000)-(d*1000)-(e*100)-(f*10) r=10*a+b==p.or.10*b+c==p.or.10*c+d==p.or.10*d+e==p.or.10*e+f==p.or.10*f+g==p print*, r end program exercicio_3_1 implicit none integer n, a, b, c, i a=1 b=1 read*, n if (n==1) then print*, a else print*, a print*, a do i=3,n,1 print*, a+b c=b b=a+b a=c enddo endif end 36 ----------------------- Page 41----------------------program exercicio_3_2 implicit none integer n, nfat, i read*, n nfat=1 if (n>0) then do i=1,n,1 nfat=nfat*i enddo

endif if (n>=0) then print*, nfat endif end program exercicio_3_3 implicit none real a, b, c read*, a, b, c if (min (a,b,c)>0 .and. a+b>c .and. a+c>b .and. if (a==b .and. b==c) then print*, "O triangulo e equilatero" elseif (a==b .or. b==c .or. a==c) then print*, "O triangulo e isosceles" else print*, "O triangulo e escaleno" endif else print*, "Nao pode ser um triangulo" endif end program exercicio_3_4 implicit none integer n, i, cont do n=1,1000,1 cont=0 do i=1,n,1 if (mod (n,i)==0) then cont=cont+1 endif enddo if (cont==2) then print*, n endif enddo end 37 ----------------------- Page 42----------------------program exercicio_3_5 implicit none integer m, n, i read*, n m=n print*, n, " pode 20 do i=2,m,1 if (mod (n,i)==0) then print*, i n=n/i goto 20 endif enddo end program implicit exercicio_3_6 none

b+c>a) then

ser

escrito

como

produto

de:"

integer m, r, do m=1000,9999,1 r = m/100 s = m-(r*100) if (((r+s)**2) print*, m endif enddo end

==

m) then

program exercicio_3_7 implicit none real soma, nfat integer n, i n=0 soma=0 do while (soma<2.718281) nfat=1 if (n>0) then do i=1,n,1 nfat=nfat*i enddo endif soma=soma+(1/nfat) n=n+1 enddo print*, "Valor somado", print*, "x =", n-1 end

soma

38 ----------------------- Page 43----------------------8 Bibliograa consultada http://paginas.fe.up.pt/~aarh/pc/PC-apontamentos.htm http://www.orengonline.com/arquivos/mcf90.pdf http://www.fisica.uece.br/graduacao/caf/sites/default/files/80_ exercicios.doc http://www.inf.ufes.br/~thomas/fortran/tutorials/inpe_fortran.pdf http://www.cenapad.unicamp.br/servicos/treinamentos/apostilas/apostila_ fortran90.pdf http://www.inf.ufes.br/~thomas/fortran/tutorials/helder/fortran.pdf http://minerva.ufpel.edu.br/~rudi/grad/ModComp/Apostila/ http://astro.uesc.br/~apaula/Tutorial_fortran.pdf http://www.fis.ufba.br/~edmar/fortran/abel/HOME%20MAT045%20-%20HOME% 20PAGE/APOSTILAS%20FORTRAN%20FORMATO%20WORD http://pt.scribd.com/doc/28356002/VisuAlg-Ref http://www.orengonline.com/computacao_fortran.html

http://www.nr.com/oldverswitcher.html 39