Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o...

Preview:

Citation preview

Programação de Computadores

Instituto de Computação UFFDepartamento de Ciência da Computação

Otton Teixeira da Silveira Filho

Conteúdo

● Alguns Conceitos sobre Linguagens

● Conceito de Algoritmo

● Pseudocódigo

● Tipos de Variáveis

● Operadores

● Estruturas de Controle

● Estruturas de Dados

● Subprogramação

Variáveis

Caracteres - 1 B

Variáveis

Em FORTRAN as variáveis que usaremos são do tipo

LOGICAL – Representa dois estados: .TRUE. e .FALSE.

CHARACTER – Podemos representar os caracteres convencionados na tabela ASCII, embora haja alternativa

INTEGER – Representamos um subconjunto dos inteiros com sinal [-32 768, 32767]

INTEGER*4 – Representamos um subconjunto dos inteiros com sinal [- 2 147 483 648, 2 147 483 647]

REAL ou REAL*4 – Representamos um subconjunto dos reais com aproximadamente 7 algarismos significativos [10-38, 1038]

DOUBLE PRECISION ou REAL*8 - Representamos um subconjunto dos reais com aproximadamente 16 algarismos significativos [ 10-308, 10308]

Variáveis

● Em FORTRAN especificaremos as variáveis usando os caracteres do alfabeto A-Z mais os caracteres dos algarismos 0-9

● Uma variável não poderá começar por um numeral

● FORTRAN não distingue letras maiúsculas de minúsculas

● O nome da variável será reconhecível até 6 caracteres

● Convencionalmente variáveis que começam pelas letras i, j, k, l, m e n são do tipo inteiro mas isto pode ser alterado

Operadores

Operadores aritméticos

Se a e b INTEGER e a = 3 e b = 5

a+b resulta em 8

a-b resulta em -2

a/b resulta em 0

b/a resulta em 1

b ** a resulta em 125

Operadores

Operadores aritméticos

Se a e b REAL e a = 3.0 e b = 5.0

a+b resulta em 8.0

a-b resulta em -2.0

a/b resulta em 0.6

b/a resulta em 1.6666666

b ** a resulta em 125.0

Operadores

Observem a distinção entre INTEGER e REAL que apresentamos nos exemplos do uso dos operadores

● REAL é marcado pela existência do ponto de separação decimal.

● Como os computadores foram primeiramente desenvolvidos na Inglaterra e nos Estados Unidos da América, nas linguagens de computação se usa o ponto como separador decimal e não vírgula como no Brasil, Portugal, Alemanha, França, Rússia e outros países.

Operadores

E se a e b forem de tipos diferentes?

● Tome cuidado com estas operações

● Tome como referência a tabela de “fraqueza“

Operadores

Subconjunto da tabela de fraqueza

● Na operação de tipos mistos o valor mais “fraco“ é convertido ao tipo mais “forte“

● Não é toda linguagem que faz este tipo de conversão

Tipo Fraqueza relativa

INTEGER 1

INTEGER*4 2

REAL 3

REAL*8 4

Operadores

Operadores lógicos

Caracteres Operação Exemplo

.NOT. não .NOT.b

.AND. e a.AND.b

.OR. ou a.OR.b

Operadores

Tabela verdade para o operador lógico NÃO

NÃO Operando Resultado

V F

F V

Operadores

Tabela verdade para o operador lógico E

E Operando 1 Operando 2 Resultado

F F F

F V F

V F F

V V V

Operadores

Tabela verdade para o operador lógico OU

OU Operando 1 Operando 2 Resultado

F F F

F V V

V F V

V V V

Operadores

Operadores relacionais

O resultado da comparação será verdadeiro ou falso

Caracteres Operação Exemplo

.EQ. Igual a a.EQ.b

.NE. Não igual a.NE.b

.LT. Menor que a.LT.b

.LE. Menor ou igual a a.LE.b

.GT. Maior que a.GT.b

.GE. Maior ou igual a a.GE.b

Operadores

Os operadores tem prioridades

Operador Prioridade

** 1

* e / 2

+ e - 3

.EQ. 4

.NE. 4.LT. 4

.LE. 4

.GT. 4

.GE. 4

.NOT. 5

.AND. 6

.OR. 7

Operadores

Os operadores tem prioridades

As prioridades podem ser alteradas

pelo uso de parênteses

Operador Prioridade

** 1

* e / 2

+ e - 3

.EQ. 4

.NE. 4.LT. 4

.LE. 4

.GT. 4

.GE. 4

.NOT. 5

.AND. 6

.OR. 7

Alguns “comandos“ úteis

● Comando de Leitura

READ (*, *) variável1, variável2, …

Lê as variáveis apresentadas no dispositivo padrão de entrada, em geral o teclado

● Comando de escrita

WRITE( *,*) variável1, variável2, ...

Escreve as variáveis apresentadas no dispositivo padrão de saída, em geral a tela

Alguns “comandos“ úteis

● Comando de escrita

WRITE( *,*) ‘um texto’

Escreve literalmente o que for encontrado entre aspas simples

Estrutura de um programa em FORTRAN

Um programa em FORTRAN tem uma estrutura para a linha

● As primeiras cinco colunas são reservadas para índices de referência para laços de repetição e formatos de impressão e indicação de comentários (C, * ou ! Na primeira coluna)

● A coluna seis é para indicar que é uma continuação da linha anterior

● Nas colunas de 7 até 72 se escrevem os comandos

● As colunas de 73 até 80 são reservadas para numeração do cartão

Estrutura de um programa em FORTRAN

Um cartão correspondia a uma linha do programa

Estrutura de um programa em FORTRAN

Estrutura geral

PROGRAM nome

declaração 1

declaração 2

comando 1

comando 2

STOP

END

Uma nota

Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos

No entanto, tais transgressões são comuns à maioria dos compiladores FORTRAN 77, em particular o Force (que é o recomendado aqui no curso) que foi baseado no G77 do Projeto GNU

No ambiente Linux há o gfortran, descendente do G77 mas que também compila códigos em FORTRAN 95

Testes em FORTRAN

Apresentemos uma estrutura condicional do FORTRAN que pode ser usado de várias formas

i) IF (condição lógica) comando comando

Exemplo: … IF (x .LT. y) x = x + 1 asq = sin(x) ...

Testes em FORTRAN

Apresentemos uma estrutura condicional do FORTRAN que pode ser usado de várias formas

ii) IF (condição lógica) THEN comando(s) ENDIF

Exemplo: … IF (x .GT. y) THEN asq = sin(x) isq = cos(y) ENDIF sisc = x ...

Testes em FORTRAN

Apresentemos uma estrutura condicional do FORTRAN que pode ser usado de várias formas

iii) IF (condição lógica) THEN comando(s) ELSE comando(s) ENDIF

Exemplo: … IF (x .GT. y) THEN asq = sin(x) isq = cos(y) ELSE sisc = x ENDIF …

E mais um exemplo...

Serão lidos a, b e c que são não nulos. Estes valores correspondem aos tamanhos dos lados de um triângulo. Determine se o triângulo é equilátero, isósceles ou retângulo.

Examinemos o problema:

● Um triângulo isósceles tem dois lados iguais

● Um triângulo equilátero é também isósceles

● Um triângulo é retângulo se , onde h é a hipotenusa e os outros valores são os catetos

h2=c1

2+c2

2

E mais um exemplo...

Serão lidos a, b e c que são não nulos. Estes valores correspondem aos tamanhos dos lados de um triângulo. Determine se o triângulo é equilátero, isósceles ou retângulo.

Examinemos o problema:

● Um triângulo isósceles tem dois lados iguais

● Um triângulo equilátero é também isósceles

● Um triângulo é retângulo se , onde h é a hipotenusa e os outros valores são os catetos

Examinemos o problema por partes

h2=c1

2+c2

2

E mais um exemplo...

Podemos detectar se um triângulo é isósceles com o fragmento de pseudocódigo

SE (a = b) OU (b = c) OU (a = c) ENTÃO IMPRIMA ‘triangulo isósceles‘ FIM SE

Em FORTRAN seria

IF ((a.EQ.b).OR.(b.EQ.c).OR.(a.EQ.c)) THEN WRITE(*,*) ‘triangulo isosceles‘ ENDIF

E mais um exemplo...

Podemos detectar se um triângulo é equilátero com o fragmento de pseudocódigo

SE (a = b) E (b = c) E (a = c) ENTÃO IMPRIMA ‘triangulo equilátero‘ FIM SE

Em FORTRAN seria

IF ((a.EQ.b).AND.(b.EQ.c).AND.(a.EQ.c)) THEN WRITE(*,*) ‘triangulo equilatero‘ ENDIF

E mais um exemplo...

Podemos detectar se um triângulo é retângulo com o fragmento de pseudocódigo

SE (a*a = b*b + c*c) OU (b*b = a*a + c*c) OU (c*c = a*a + b*b) ENTÃO IMPRIMA ‘triangulo retângulo‘ FIM SE

Em FORTRAN seria

IF (((a*a).EQ.(b*b + c*c)).OR.((b*b).EQ.(a*a + c*c)).OR.((c*c) .EQ.(a*a + b*b)) THEN WRITE(*,*) ‘triangulo retangulo‘ ENDIF

E mais um exemplo...

Podemos detectar se um triângulo é retângulo com o fragmento de pseudocódigo

SE (a*a = b*b + c*c) OU (b*b = a*a + c*c) OU (c*c = a*a + b*b) ENTÃO IMPRIMA ‘triangulo retângulo‘ FIM SE

Em FORTRAN seria

IF (((a*a).EQ.(b*b + c*c)).OR.((b*b).EQ.(a*a + c*c)).OR.((c*c) .EQ.(a*a + b*b)) THEN WRITE(*,*) ‘triangulo retangulo‘ ENDIF

● Certamente não é um código inteligente mas cumpre a tarefa

E mais um exemplo...

Juntemos as partes observando que o tipo de variável que aqui tem sentido é REAL

E mais um exemplo...

PROGRAM triangulos REAL a, b, c WRITE(*,*) ‘Entre com os lados do triangulo‘ READ(*,*) a, b, c IF (a.EQ.b).OR.(b.EQ.c).OR.(a.EQ.c) THEN WRITE(*,*) ‘triangulo isosceles‘ ENDIF IF (a.EQ.b).AND.(b.EQ.c).AND.(a.EQ.c) THEN WRITE(*,*) ‘triangulo equilatero‘ ENDIF

IF ((a*a).EQ.(b*b + c*c)).OR.((b*b).EQ.(a*a + c*c)).OR.((c*c) .EQ.(a*a + b*b)) THEN WRITE(*,*) ‘triangulo retangulo‘ ENDIF STOP END

E mais um exemplo...

PROGRAM triangulos REAL a, b, c WRITE(*,*) ‘Entre com os lados do triangulo‘ READ(*,*) a, b, c IF (a.EQ.b).OR.(b.EQ.c).OR.(a.EQ.c) THEN WRITE(*,*) ‘triangulo isosceles‘ ENDIF IF (a.EQ.b).AND.(b.EQ.c).AND.(a.EQ.c) THEN WRITE(*,*) ‘triangulo equilatero‘ ENDIF

IF ((a*a).EQ.(b*b + c*c)).OR.((b*b).EQ.(a*a + c*c)).OR.((c*c) .EQ.(a*a + b*b)) THEN WRITE(*,*) ‘triangulo retangulo‘ ENDIF STOP END

● Repare que o código tem uma série de problemas

E mais um exemplo...

● Nenhuma mensagem será emitida se o dado triângulo não for isósceles, equilátero ou retângulo

● Embora se afirme que a, b e c são lados de um triângulo, seria bom que houvesse uma crítica dos valores pois o usuário pode cometer enganos

E mais um exemplo...

● Nenhuma mensagem será emitida se o dado triângulo não for isósceles, equilátero ou retângulo

● Embora se afirme que a, b e c são lados de um triângulo, seria bom que houvesse uma crítica dos valores pois o usuário pode cometer enganos

● Tente criar soluções para estas situações

E mais um exemplo...

PROGRAM triangulos REAL a, b, c WRITE(*,*) ‘Entre com os lados do triangulo‘ READ(*,*) a, b, c IF ((a + b).GT.c).OR.(b + c).GT.a).OR.((a+c).GT.b) THEN IF (a.EQ.b).OR.(b.EQ.c).OR.(a.EQ.c) THEN WRITE(*,*) ‘triangulo isosceles‘ ENDIF IF (a.EQ.b).AND.(b.EQ.c).AND.(a.EQ.c) THEN WRITE(*,*) ‘triangulo equilatero‘ ENDIF

IF ((a*a).EQ.(b*b + c*c)).OR.((b*b).EQ.(a*a + c*c)).OR.((c*c) .EQ.(a*a + b*b)) THEN WRITE(*,*) ‘triangulo retangulo‘ ENDIF ELSE WRITE(*,*) ‘Os valores dados nao formam um triangulo’ ENDIF STOP END

Alguns fatos sobre computação numérica

Façamos um programa:

atribua a uma variável INTEGER*2 o valor 32767. Atribua a uma outra variável a variável anterior somada com 1. Imprima o resultado

PROGRAM inteiro1 INTEGER*2 i, j i = 32767 j = i + 1 WRITE(*,*) j STOP END

● Experimente usar INTEGER*4 ou apenas INTEGER

Alguns fatos sobre computação numérica

Façamos outro programa:

atribua a uma variável REAL o valor 1/3. Atribua a uma outra variável a variável anterior multiplicada por 3. Imprima o resultado

PROGRAM flutuante1 REAL x, y x = 1/3 y = 3 * x WRITE(*,*) y STOP END

Laços de repetição

FORTRAN 77 tem um comando clássico de repetição que tem a forma

DO rótulo variável = início da contagem, fim da contagem, passo da contagem

comando(s)

rótulo CONTINUE

rótulo é um INTEGER. Tanto a variável quanto o início da contagem, o fim da contagem e o passo da contagem podem ser INTEGER ou REAL

● A omissão do passo de contagem suporá o uso de passo 1

● Não é recomendável o uso de variáveis do tipo REAL. Isto raramente é de fato útil e tem o potencial de gerar confusões

Laços de repetição

Exemplo: PROGRAM exemploDO1 INTEGER I DO 100 i = 1, 10, 2 WRITE(*,*) i 100 CONTINUE STOP END

provocará a impressão dos números 1, 3, 5, 7, 9, um por linha.

Laços de repetição

Exemplo: PROGRAM exemploDO2 INTEGER*2 i, s s = 0 DO 100 i = 1, 1000 s = s + i 100 CONTINUE WRITE(*,*) ‘A soma dos numeros de 1 a 1000 e igual a ‘, s STOP END

Laços de repetição

Exemplo: PROGRAM exemploDO2 INTEGER*2 i, s s = 0 DO 100 i = 1, 1000 s = s + i 100 CONTINUE WRITE(*,*) ‘A soma dos numeros de 1 a 1000 e igual a ‘, s STOP END

● Experimente trocar INTEGER*2 por INTEGER

Laços de repetição

Usaremos um outro laço de repetição

DO WHILE (condição lógica)

comando(s)

ENDDO

o laço repetirá as operações até o ENDDO enquanto a condição lógica for verdadeira

● Podemos criar um “laço eterno“ se a condição lógica for sempre .TRUE.

Laços de repetição

Some os números a partir de 1 até que a soma seja maior que 1000. Imprima o valor para o qual isto ocorreu e o resultado final.

PROGRAM exemplodowhile INTEGER i,s s = 0 i = 0 DO WHILE (s.LT.1000) i = i + 1 s = s + i ENDDO WRITE(*,*) i, s STOP END

● Experimente não inicializar s

Alguns fatos sobre computação numérica

Façamos um programa:

atribua a uma variável REAL o valor 0,01. Inicialize uma variável com zero e acumule nela 100 vezes. 0 valor da outra variável. Imprima o resultado.

PROGRAM flutuante2 REAL x, s s = 0 x = 0.01 DO 100 i = 1, 100 s = s + x 100 CONTINUE WRITE(*,*) s STOP END

Alguns fatos sobre computação numérica

Façamos um programa:

atribua a uma variável REAL o valor 0,01. Inicialize uma variável com zero e acumule nela 100 vezes. 0 valor da outra variável. Imprima o resultado.

PROGRAM flutuante2 REAL x, s s = 0 x = 0.01 DO 100 i = 1, 100 s = s + x 100 CONTINUE WRITE(*,*) s STOP END

● Coloque em x 0.0078125 e some até 128

Laços de repetição

Calcule o enésimo termo da sequência de Fibonacci

Laços de repetição

Calcule o enésimo termo da sequência de Fibonacci

A sequencia de Fibonacci é dada aqui da seguinte forma:

dados como primeiros termos F1=1 e F2=1, geramos os próximos elementos usando a equação

Fn= Fn-1+Fn-2

Laços de repetição

Calcule o enésimo termo da sequência de Fibonacci

A sequencia de Fibonacci é dada aqui da seguinte forma:

dados como primeiros termos F1=1 e F2=1, geramos os próximos elementos usando a equação

Fn= Fn-1+Fn-2

Então teríamos a sequência

1, 1, 2, 3, 5, 8, 13, 21, 34, 55...

Laços de repetição

Calcule o enésimo termo da sequência de Fibonacci

PROGRAM fibonacci INTEGER a, b, n, cont, s n = 6 a = 1 b = 1 DO WHILE (cont.LT.n) s = a + b a = b b = s cont = cont + 1 ENDDO WRITE(*,*) 'O ' , n, '-esimo termo da Sequencia de Fibonacci = ', b STOP END

Exemplo: fatorial

Obtenha o fatorial de um número inteiro não negativo n

Exemplo: fatorial

programa fatorial

inteiro fat, i, n

leia n

fat ←1

para i ← 1 até n

fat ←fat * i

fim parafim para

imprima fatimprima fat

fimfim

i ← 1até n

fat ← fat * i

início

fat←1

fat

fim

n

Exemplo: fatorial

programa fatorial PROGRAM fatorial

inteiro fat, i, n INTEGER fat, i, n

leia n READ(*,*) n

fat ←1 fat = 1

para i ← 1 até n DO 100 i = 1, n

fat ←fat * i fat = fat * i

fim para 100 CONTINUEfim para 100 CONTINUE

imprima fat WRITE(*,*) fatimprima fat WRITE(*,*) fat

fim STOPfim STOP

ENDEND

Exemplo: cálculo de e

Calcule o valor da função exponencial no ponto x=1 usando a série de Taylor truncada em n termos que é dada por

e x

=1+x1!

+x2

2!+

x3

3 !+⋯+

xn

n!

Exemplo: cálculo de e

Programa exponencial

real exp inteiro fat, i, j, n

leia n

exp ← 1

para i ← 1 até n fat ←1 para j ← 1 até i fat ←fat * j fim para

exp ← exp + 1/fat fim para

imprima exp

fim

...

Exemplo: cálculo de e

Programa exponencial

real exp inteiro fat, i, j, n

leia n

exp ← 1

para i ← 1 até n fat ←1 para j ← 1 até i fat ←fat * j fim para

exp ← exp + 1/fat fim para

imprima exp

fim

PROGRAM e2

REAL exp INTEGER fat, i, j, n, ntermos

READ(*,*) n

exp = 1

DO 1 i = 1, ntermos fat = 1 DO 2 j = 1, i fat = fat * j 2 CONTINUE exp = exp + 1.0/fat 1 CONTINUE

WRITE(*,*) exp

STOP END

Mais alguns aspectos de computação numérica

Calcule o valor da função exponencial no ponto x=1 usando a série de Taylor truncada em n termos que é dada por

mas some a partir do termo de mais alta ordem.

e x=1+

x1!

+x2

2!+

x3

3 !+⋯+

xn

n!

Mais alguns aspectos de computação numérica

PROGRAM e2

REAL exp INTEGER fat, i, j, n, ntermos

READ(*,*) n

exp = 1

DO 1 i = 1, ntermos fat = 1 DO 2 j = 1, i fat = fat * j 2 CONTINUE exp = exp + 1.0/fat 1 CONTINUE

WRITE(*,*) exp

STOP END

Mais alguns aspectos de computação numérica

PROGRAM e2

REAL exp INTEGER fat, i, j, n, ntermos

READ(*,*) n

exp = 1

DO 1 i = 1, ntermos fat = 1 DO 2 j = 1, i fat = fat * j 2 CONTINUE exp = exp + 1.0/fat 1 CONTINUE

WRITE(*,*) exp

STOP END

PROGRAM e2inv

REAL exp INTEGER fat, i, j, n, ntermos

READ(*,*) n

exp = 1

DO 1 i = ntermos, 1, -1 fat = 1 DO 2 j = 1, i fat = fat * j 2 CONTINUE exp = exp + 1.0/fat 1 CONTINUE

WRITE(*,*) exp

STOP END

Mais alguns aspectos de computação numérica

Como você pode constatar somar a série

do termo maior em valor para o de menor valor dá um valor diferente de somarmos de menor valor para o maior

e=1+11!

+12!

+13 !

+⋯+19 !

Funções implícitas

O FORTRAN contém funções pré-definidas que correspondem em certo sentido a algumas funções matemáticas

Funções implícitas

O FORTRAN contém funções pré-definidas que correspondem em certo sentido a algumas funções matemáticas

Veremos mais tarde que o conceito de funções em linguagens de programação não correspondem totalmente ao que é chamado de função na matemática

Funções implícitas

Vejamos algumas da funções implícitas no FORTRAN

Nome Definição Argumento Tipo de função

SIN(x) Seno REAL em radianos REAL, REAL*8

ASIN(x) Arcosseno REAL REAL, REAL*8

COS(x) cosseno REAL em radianos REAL, REAL*8

ACOS(x) arcocosseno REAL REAL, REAL*8

TAN(x) tangente REAL em radianos REAL, REAL*8

ATAN(x) arcotangente REAL em radianos REAL, REAL*8

EXP(x) exponencial REAL REAL, REAL*8

LOG(x) logaritmo nepleriano REAL REAL, REAL*8

LOG10(X) logaritmo base 10 REAL RELA, REAL*8

ABS(x) valor absoluto INTEGER, REAL, INTEGER*4, REAL*8 REAL, REAL*8

SQRT(x) raiz quadrada REAL, REAL*8 REAL, REAL*8