Upload
others
View
5
Download
0
Embed Size (px)
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