CAPÍTULO 1: F90/1 – PROGRAMAS QUE CALCULAM E IMPRIMEM

O PRIMEIRO PROGRAMA FORTRAN 90

Vamos começar o nosso estudo da linguagem Fortran analisando um pequeno exemplo, porém completo, de programa Fortran. O exemplo a seguir mostra na tela do vídeo do computador a mensagem “Meu primeiro programa!”.

 

!

! UFCG/CCT/Departamento de Sistemas e Computação

! Este é o primeiro programa desenvolvido em Fortran 90

! para a disciplina ICC - Introdução à Ciência da Computação

! Autor: Prof. Roberto M de Faria

!

PROGRAM primeiro                          ! cabeçalho do programa

   WRITE (*, *) "Meu primeiro programa!"  ! comando executável

   STOP                                   ! comando executável

END PROGRAM primeiro                      ! fim de programa

 

As linhas iniciadas com um caractere “!” são comentários, servem para acrescentar informações ao código do programa e não são executáveis. Os textos que complementam as linhas do programa e são precedidos por “!” também são comentários.

A primeira linha que não é comentário e dá início ao programa é chamada de cabeçalho do programa. O cabeçalho é obrigatório para todos os programas, e é composto da palavra-chave PROGRAM e de um nome dado ao programa, escolhido pelo programador (no caso, “primeiro”).

A linha seguinte ao cabeçalho é um comando executável, o WRITE, que serve para dar saída a dados numa unidade de saída do computador mensagem “Meu primeiro programa!”. Os dois asteriscos entre parêntese que segue a palavra WRITE também passam instruções específicas para o computador. O primeiro quer dizer que será usado como saída o dispositivo de saída-padrão (tela de vídeo) e o segundo, que os dados não serão formatados. Sem formatação significa dizer que nenhuma especificação especial é feita sobre a forma de apresentação dos dados. A cadeia de caracteres "Meu primeiro programa” será apresentada no vídeo sem os delimitadores (“”).

A penúltima linha, a com o comando STOP, dá ordem ao computador para parar a execução do programa.

A última linha. contém a diretiva END PROGRAM seguida do nome do programa e serve para avisar ao compilador que esta é a última linha da unidade de programa.

Elementos da LINGUAGEM FORTRAN

Qualquer linguagem é constituída de palavras, e estas palavras são formadas de símbolos (letras, dígitos e caracteres especiais).

Formato do Programa-fonte

As regras mais básicas de qualquer linguagem de programação são aquelas que governam o formato do programa fonte. Estas regras determinam exatamente como os comandos de um programa são introduzidos no computador e como eles são mostrados. As regras de formato do programa fonte são análogas àquelas fundamentais da linguagem natural, as quais definem o alfabeto utilizado para expressar palavras na linguagem, os símbolos de pontuação a serem usados, como as sentenças são escritas (da esquerda para a direita, de cima para baixo, da direita para a esquerda, etc.). Estas são as regras que descreveremos a seguir.

Formato livre do programa:

·        132 caracteres por linha;

·        ‘!’ é o caractere iniciador de comentário;

·        ‘&’ é o caractere de  continuação de linha;

·        ‘;’ é o caractere separador de comandos;

·        espaços em branco são significativos.

Exemplo:

 

     WRITE (*, *) "Esta linha é continuada &

         &na próxima linha"

 

Conjunto de Caracteres

Os seguintes caracteres são válidos num programa Fortran 90:

·        alfabéticos

a-z, A-Z e _ (o sublinha)

·        numéricos:

0-9

·        simbólicos:

 

Símbolo

Descrição

Símbolo

Descrição

 

espaço

=

igual

+

mais

-

menos

*

asterisco

/

barra

(

abre parêntese

)

fecha parêntese

,

vírgula

.

ponto

apóstrofo

aspas

:

dois pontos

;

ponto e vírgula

!

exclamação

&

e comercial

%

percentual

$

cifrão

> 

maior

< 

menor

?

interrogação

 

 

 

Significação dos Espaços em Branco

Em programas com formato livre, espaços em branco nos comandos podem ser vistos como sendo significativos. Espaços consecutivos em branco têm o mesmo significado que um único espaço em branco. Espaços não são permitidos nas palavras-chaves da linguagem. Por exemplo, INT EGER não é a mesma coisa que INTEGER. Nem são permitidos brancos em nomes definidos pelo programador. O nome valor não pode ser escrito como va lor. Se o nome é composto por duas palavras, é comum usar o caractere sublinha “_” como separador. O caractere de continuação & funciona como um espaço e assim não pode ser usado no meio de nomes e palavras-chaves.

Palavras-chaves e nomes não podem ser colocados juntos sem espaços ou alguma pontuação para separá-los. Assim, a primeira diretiva seria ilegal e não seria equivalente à segunda:

 

    PROGRAMLimpar

    PROGRAM Limpar

De forma semelhante, o nome do tipo da  primeira declaração é válido e o da segunda não é:

 

    INTEGER :: a

    INT EGER :: a

Brancos devem aparecer:

·        entre duas palavras-chaves separadas;

·        entre palavras-chaves e nomes mas não quando separados por pontuação ou outro caractere especial.

 

    INTEGER FUNCTION ajuste(i) ! é válido

    INTEGERFUNCTION ajuste(i)  ! não é válido

    INTEGER FUNCTIONajuste(i)  ! não é válido

Brancos são opcionais entre certos pares de palavras-chaves, tais como: END < construção >, onde, < construção > é DO, FUNCTION, PROGRAM, MODULE, SUBROUTINE e outros mais. Brancos são obrigatórios em outras situações. Adicionar um branco entre duas palavras inglesas válidas é geralmente uma boa idéia e será válido.

Observadas as regras acima, espaços podem ser usados livremente para aumentar a clareza da leitura de programas. Assim os seguintes comandos,

 

    POLIN = X**3-X**2+3*X-2.0

e

 

    POLIN = X**3 - X**2 + 3*X - 2.0

são equivalentes.

Para resumir, as regras que governam o uso de espaços em brancos são amplamente de senso comum. O uso sensato de espaços em branco e de letras maiúsculas e minúsculas pode freqüentemente tornar mais claro, construções ou comandos mais complicados. Algumas convenções sistemáticas podem tornar muito mais fácil a leitura e por conseqüência a escrita de programas corretos. Como um comando pode iniciar em qualquer lugar de uma linha, a maioria dos programadores usa endentação para evidenciar o aninhamento de estruturas de controle, por exemplo, dentro de comandos IF e laços DO.

Comentários

É sempre muito bom a pratica de adicionar comentários descritivos aos programas, Em qualquer linha um caractere “!” indica que todos os caracteres subseqüentes até o final da linha são comentários. Tais comentários são ignorados pelo compilador. Comentários são parte do programa-fonte mas são destinados aos leitores humanos e não para a máquina.

!

! Programa testar condições lógicas

!

PROGRAM TestaLogico

    LOGICAL :: existeUm     ! Ocorreu pelo menos um caso?

    LOGICAL :: fimDosDados  ! Encerraram os dados?

    INTEGER :: i, j         ! variáveis de laço

A única exceção para as regras acima é se o caractere “!” aparece em um contexto de caracteres, por exemplo, na linha a seguir o “!” não inicia um comentário:

    PRINT*, "Ocorreu um erro grave!!!"

Um comentário pode conter qualquer caractere utilizável pelo computador. Um comentário não é restringido a usar o conjunto de caracteres Fortran. Um programa contendo comentários que usam caracteres fora deste conjunto pode ainda ser portável, mas os comentários têm que revistos se o programa é levado  para outro sistema com um conjunto estendido de caracteres diferentes.

Com os sistemas modernos de compilação é freqüentemente possível dar informações ao compilador através de comentários nos programas. Estes comentários, especificamente construídos, são interpretados e atuam para produzir um código eficiente. A linguagem HPF (High Performance Fortran) é implementada desta maneira.

 

    ! A próxima linha é uma diretiva HPF

    !HPF$ PROCESSORS P(3,3,3)

    ! Troca para o formato fixo

    !DIR$ FIXED_FORM

Nomes

A linguagem Fortran define um número de nomes, ou palavras-chaves, tal como WRITE, INTEGER, MAX, etc. A grafia destes nomes é definida pela linguagem. Existe um número de entidades que têm que ser nomeadas pelo programador, tal como variáveis, procedimentos, etc. Estes nomes têm que ser escolhidos obedecendo a pequenas regras simples. Um nome tem de consistir de até 31 caracteres alfanuméricos (letras ou dígitos) mais o caractere sublinha. O primeiro caractere em qualquer nome tem que ser uma letra. Em nomes, letras maiúsculas e minúsculas são equivalentes. Os seguintes nomes são válidos em Fortran:

 

A, aAa, RENDIMENTO, Num1, N12O5, sub_linha

As seguintes declarações são incorretas devido a nomes incorretos,

 

INTEGER :: 1A      ! não começa com uma letra

INTEGER :: Um_nome_feito_com_mais_de_31_caracteres

                   ! nome muito grande, 40 caracteres

INTEGER :: Depth:0 ! contém o caractere ilegal ":"

INTEGER :: A-3     ! subtrair 3 de A não tem sentido aqui

O sublinha pode ser usado para separar palavras em nomes longos:

 

CHARACTER(LEN=12) :: nome_do_usuario ! nome válido

CHARACTER(LEN=12) :: nomedousuario   ! nome válido diferente

Com esta nova facilidade de nomes longos em Fortran 90 nomes simbólicos podem ser mais legíveis, significativos e descritivos. Vale a pena perder um minuto e assim escolher um bom nome que outros programadores serão capazes de entender.

 

Ordem de Comandos e Diretivas

Fortran tem algumas regras totalmente estritas sobre a ordem dos comandos. Basicamente em qualquer programa ou procedimento as seguintes regras têm que ser usadas:

1.      A diretiva de cabeçalho de programa tem que vir em primeiro lugar, (PROGRAM, FUNCTION ou SUBROUTINE). Uma diretiva PROGRAM é opcional, mas seu uso é recomendado.

2.      Todas as diretivas de especificações têm que preceder o primeiro comando executável. Mesmo que as diretivas DATA possam ser colocadas com o texto executável, se obtêm mais clareza se eles forem colocados na área de declarações. Também é uma boa idéia agrupar as diretivas FORMAT para obter maior clareza.

3.      Os comandos executáveis têm que seguir a ordem requerida pela lógica do programa.

4.      O programa ou procedimento deve terminar com uma diretiva END.

Dentro do conjunto de diretivas de especificações existe uma ordem requerida relativamente pequena, no entanto, em geral se uma entidade é usada na especificação de outra, é normalmente requerida que ela seja previamente definida. Em outras palavras, constantes nomeadas (PARAMETER s) têm que ser declaradas antes que elas possam ser usadas como parte da declaração de outros objetos.

A seguinte tabela detalha a ordem pré-descrita:

 

Diretivas PROGRAM, FUNCTION, SUBROUTINE, MODULE e BLOCK DATA

Diretiva USE

Diretivas FORMAT e ENTRY

IMPLICIT NONE

Diretiva PARAMETER

Diretiva IMPLICIT

Diretiva PARAMETER e DATA

Definição de Tipo-Derivado, Bloco interface, Diretiva de declaração de tipo, diretivas de funções e diretivas de especificação

Diretiva DATA

Construções executáveis

Diretiva CONTAINS

Procedimentos ou módulos internos

Diretiva END

 

A execução de um programa começa no primeiro comando executável do programa principal (PROGRAM...). Quando um procedimento é chamado a execução começa com o primeiro comando executável após o ponto de entrada invocado. Os comandos não executáveis são conceitualmente executados simultaneamente no início do programa, em outras palavras eles são referenciados uma vez só quando a execução do programa principal começa.

Aqui segue uma explicação da tabela:

Esta anexa um módulo cujas entidades torna-se use-associated com a unidade do programa. Quando um módulo é usado, seu conteúdo público é acessível como se eles fossem declarados explicitamente na unidade de programa. Módulos podem ser pré-compilados (como uma biblioteca) ou pode ser escrito pelo programador.

Qualquer entidade global deve ser colocada em um módulo e então usada sempre que o acesso for requerido.

IMPLICIT statements should not be used, IMPLICIT NONE should be the only form of implicit typing considered. (IMPLICIT statements allow the user to redefine the implication of an object's first letter in determining what its implicit type will be if it is not declared. Cannot have an IMPLICIT statement if there is an IMPLICIT NONE line.)

Para as declarações PARAMETER, é sugerido que seja usado o estilo de PARAMETER com atributos (Fortran 90).

Diretivas de funções são uma forma de definição de comandos em linha, procedimentos internos devem ser utilizados ao invés.

Números

Constantes Inteiras

Em Fortran, são chamados de constantes inteiras (não possuem ponto decimal), os números como:

2

-5

4

278

-1082

Constantes Reais

São chamadas de constantes os valores numéricos que são escritos com ponto decimal. Números como:

2.5

-4.72

0.202

10.52E-27

0.32E2

Representação de Números Reais

Todo número real é armazenado na memória do computador forma normalizada (mantissa e expoente).

Por exemplo, o numero: 6.32546 x 108 é armazenado na forma 0.6325460E09, ou seja na forma de mantissa e expoente.

O número -34.5 = -0.345 x 102 e é armazenado na forma -0.3450000E02. (mantissa e expoente),

A primeira parte do número é chamada de mantissa e contém a parte fracionária do número, com respectivo sinal. A segunda parte do número contém a letra E, simbolizando o número escrito em potência de dez, seguido do sinal do expoente e expoente decimal do número.

SEQÜÊNCIA DE CARACTERES

Foi dito anteriormente que os computadores podem manipular números e conjunto de caracteres. Já vimos duas formas que se apresentam os números, agora vamos ver como se apresenta um conjunto de caracteres literais.

O conjunto de caracteres literais devem sempre ser escritos entre aspas ou apóstrofos. Exemplos:

“UNIVERSIDADE FEDERAL DE CAMPINA GRANDE”

'MÉDIA ARITMÉTICA'

”VOLUME DE UMA CAIXA”

'ÁREA DA BASE DA CAIXA'

Aprenderemos a utilizar as constantes literais quando surgir a instrução de impressão.

EXPRESSÕES

O número 3 é uma expressão inteira.

O número 2.7 é uma expressão real.

Agora, se combinarmos estes dois números através de qualquer operador aritmético, teremos uma expressão aritmética. Por exemplo:

 

3 - 2.7

 

Os caracteres especiais usados para operar constantes reais e inteiras no Fortran são:

 

Operador

Operação

+

Soma

-

Subtração

*

Multiplicação

/

Divisão

**

Exponenciação

 

Exemplos de expressões aritméticas:

 

2 + 3

5.2E1 * 7.8E-5

l0 – 56

 

As seguintes regras são válidas para os tipos de operandos e resultados das operações aritméticas:

o       O resultado de uma operação entre dois números inteiros é um número inteiro.

o       O resultado de uma operação entre dois números reais é um número real.

o       O resultado entre um número real e um número inteiro é um número real.

Como nem sempre a divisão entre dois números inteiros resulta num número inteiro, devemos ter o cuidado de transformar um dos números envolvidos nesta operação num número real para obtermos o resultado correto. Exemplo em Fortran:

 

7/2 = 3       ! resultado matematicamente incorreto

Transformando o denominador num número real teremos:

 

7/2. = 3.5    ! resultado correto

 

Prioridade das Operações em Expressões Aritméticas

As operações em expressões aritméticas obedecem às regras estabelecidas para a álgebra. Em primeiro lugar, executa-se prioritariamente as operações de exeponenciação. Em seguida, a mesma prioridade é dada às operações de multiplicação e divisão, sendo realizada em primeiro lugar, aquela que estiver mais à esquerda na expressão. Após todas as operações de multiplicação e divisão são realizadas as operações de soma e subtração, tendo prioridade aquela que estiver mais à esquerda.

Assim, qual será o resultado da seguinte expressão Fortran?

 

2 * 5 + 8 - 3 * 5/2. + 6

 

Aplicando as regras vistas acima, teremos:

1)      2 * 5 + 8 - 3 * 5 / 2. + 6 ® primeira multiplicação

2)      10 + 8 - 3 * 5 / 2. + 6 ® segunda multiplicação

3)      10 + 8 - 15 / 2. + 6 ® primeira divisão

4)      10 + 8 - 7.5 + 6 ® primeira soma

5)      18 - 7.5 + 6 ® primeira subtração

6)      10.5 + 6 ® segunda soma

7)      16.5 ® resultado

Alteração da Prioridade das Operações em Expressões Aritméticas

Como na ágebra, podemos aplicar parênteses para alterar a prioridade da execução das operações em expressões aritméticas. Os parênteses têm prioridade sobre todas as operações e os parênteses mais internos têm prioridade sobre os mais externos.

Agora, se na mesma expressão do exemplo anterior colocarmos parênteses, o resultado será alterado:

1)      2 * (5 + 8 - 3) * 5 / 2. + 6  ® primeira soma dentro dos parênteses

2)      2 * (13 - 3) * 5 / 2. + 6  ® primeira subtração dentro dos parênteses

3)      2 * 10 * 5 / 2. + 6  ® primeira multiplicação

4)      20 * 5 / 2. + 6  ® segunda multiplicação

5)      100 / 2. + 6  ® primeira divisão

6)      50. + 6  ® primeira soma

7)      56.  ® resultado

Um número também pode estar elevado a uma potência por meio do operador de exponenciação, que para o Fortran são dois asteriscos (**). Exemplos:

 

26 = 2 ** 6

(5 + 4)-3 = (5 + 4) ** (-3)

INSTRUÇÃO DE IMPRESSÃO

O propósito do subconjunto F90/1 é introduzir o aluno na programação da linguagem Fortran, de forma que ele possa escrever seu primeiro programa. O máximo que este programa poderá fazer e imprimir um número e um conjunto de caracteres literais mas o aluno poderá sentir que seu programa funciona.

O comando utilizado num programa para causar impressão de número ou conjunto de caracteres é o comando PRINT ou WRITE.

Forma:

PRINT *, <lista de itens>

WRITE (*, *) <lista de itens>

Exemplo:

PRINT *, "NÚMERO = ", -3.5, " INTEIRO = ", -805

O resultado produzido por um comando PRINT é colocado em campos sucessivos ao longo da linha do dispositivo de saída-padrão. O dispositivo de saída-padrão é normalmente a tela de vídeo do computador. O tamanho do campo depende do que está sendo impresso no momento:

o       Um valor inteiro é impresso num campo de 12 caracteres

o       Um valor real é impresso num campo de 16 caracteres

o       Uma constante literal é impressa num campo do tamanho da constante sem contar as aspas.

Por exemplo, o comando PRINT anterior resulta numa linha de impressão contendo o seguinte:

NÚMERO =      -3.50000     INTEIRO =         -805

                      |                                        |                         |                             |

9 caracteres               16 caracteres           11 caracteres       12 caracteres

 

A linha de apresentação possui 80 caracteres.

Se dois comandos PRINT ou WRITE são colocados um após o outro, o segundo PRINT imprimirá uma nova linha. Uma linha em branco poderá ser como o seguinte comando PRINT.

 

PRINT *

ou

 

WRITE (*, *)

 

Expressões aritméticas também podem ser colocadas num comando PRINT como:

 

PRINT *, 2 + 3.4 / 2

 

O resultado será uma linha contendo:

      3.70000   

 |         16 caracteres          |

 

Podemos imprimir também

 

PRINT *, “2 + 3 =“, 2 + 3

 

Como resultado, teremos:

 

2 + 3 =           5

| 7 carac.   |   12 caracteres    |

 

Num comando PRINT não é válido usar dois operadores aritméticos juntos. Exemplo:

 

PRINT *, 5 / -3

O correto seria:

 

PRINT *, 5 / (-3)

 

O PROGRAMA

Agora que aprendemos um comando que realiza uma ação, vamos aprender o que é necessário para fazer um programa completo.

O menor programa que podemos fazer consiste de uma diretiva PROGRAM e um único comando PRINT ou WRITE seguido do comando STOP e uma diretiva END PROGRAM:

A diretiva PROGRAM indica ao compilador que é o início de um programa e informa o nome do programa. A diretiva END, indica ao compilador Fortran que ali é o fim do programa a traduzir para linguagem de maquina. A palavra END é uma especificação Fortran.

O comando STOP indica que ali é o fim do programa a ser executado. A palavra STOP é um comando Fortran.

Então aqui está um programa completo:

 

PROGRAM completo

    WRITE (*, *) "2 + 3 = ", 2 + 3

    STOP

END PROGRAM completo

 

e este é o nosso segundo programa Fortran.

EXERCÍCIOS

1) Calcular a área de um triângulo retângulo cujos catetos são 7 e 10 centímetros respectivamente.

2) Calcular o volume de um cilindro cujo raio da base é 3 centímetros e a altura 8 centímetros.

3) Calcular a distância entre dois pontos A e B, para as coordenadas:

A = (2, 3)

B = (5, 8)

4) Calcular o valor de y na expressão y = x2 – 2x + 3, para:

x = 1

x = 2

x = 3