65
Programação de Computadores Instituto de Computação UFF Departamento de Ciência da Computação Otton Teixeira da Silveira Filho

Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

Programação de Computadores

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

Otton Teixeira da Silveira Filho

Page 2: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

Conteúdo

● Alguns Conceitos sobre Linguagens

● Conceito de Algoritmo

● Pseudocódigo

● Tipos de Variáveis

● Operadores

● Estruturas de Controle

● Estruturas de Dados

● Subprogramação

Page 3: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

Variáveis

Caracteres - 1 B

Page 4: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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]

Page 5: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 6: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 7: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 8: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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.

Page 9: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

Operadores

E se a e b forem de tipos diferentes?

● Tome cuidado com estas operações

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

Page 10: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 11: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

Operadores

Operadores lógicos

Caracteres Operação Exemplo

.NOT. não .NOT.b

.AND. e a.AND.b

.OR. ou a.OR.b

Page 12: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

Operadores

Tabela verdade para o operador lógico NÃO

NÃO Operando Resultado

V F

F V

Page 13: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 14: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 15: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 16: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 17: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 18: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 19: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

Alguns “comandos“ úteis

● Comando de escrita

WRITE( *,*) ‘um texto’

Escreve literalmente o que for encontrado entre aspas simples

Page 20: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 21: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

Estrutura de um programa em FORTRAN

Um cartão correspondia a uma linha do programa

Page 22: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

Estrutura de um programa em FORTRAN

Estrutura geral

PROGRAM nome

declaração 1

declaração 2

comando 1

comando 2

STOP

END

Page 23: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 24: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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) ...

Page 25: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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 ...

Page 26: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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 …

Page 27: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 28: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 29: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 30: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 31: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 32: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 33: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

E mais um exemplo...

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

Page 34: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 35: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 36: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 37: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 38: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressõ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

Page 39: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 40: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 41: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 42: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressõ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.

Page 43: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 44: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 45: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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.

Page 46: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 47: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 48: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 49: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

Laços de repetição

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

Page 50: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 51: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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...

Page 52: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 53: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

Exemplo: fatorial

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

Page 54: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 55: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 56: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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!

Page 57: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

...

Page 58: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 59: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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!

Page 60: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 61: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 62: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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 !

Page 63: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

Funções implícitas

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

Page 64: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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

Page 65: Programação de Computadores - UFFotton/graduacao/programacao/Fortran_2.pdf · Transgrediremos o padrão FORTRAN 77 em relação a alguns comandos No entanto, tais transgressões

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