Programação de Computadores Instituto de Computação UFF Departamento 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 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, 10 38 ] DOUBLE PRECISION ou REAL*8 - Representamos um subconjunto dos reais com aproximadamente 16 algarismos significativos [ 10-308, 10 308 ]
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 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.
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
Alguns comandos úteis Comando de escrita WRITE( *,*) um texto Escreve literalmente o que for encontrado entre aspas simples ou WRITE( *,*) um texto aspas duplas
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
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 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.
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
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 e x =1+ x 1! + x2 2! + x3 3! + + x n n! mas some a partir do termo de mais alta ordem.
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 PROGRAM e2inv 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 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 e=1+ 1 1! + 1 2! + 1 3! + + 1 9! do termo maior em valor para o de menor valor dá um valor diferente de somarmos de menor valor para o maior
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 o conceito de funções em linguagens de programação
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
Estrutura de dados Em FORTRAN 77 existem apenas arranjos (array em inglês) de variáveis que podem ser acessadas por um ou mais índices. Aqui veremos dois tipos de arranjos homogêneos (que contém o mesmo tipo de variáveis): Vetores Matrizes Embora estas estruturas de dados possam ser usadas para representar vetores e matrizes da matemática, não é correto confundir uns com os outros
Estrutura de dados Os vetores e as matrizes em FORTRAN podem ser de qualquer tipo de variáveis aceitas pela linguagem O vetor se distingue das matrizes por ter apenas um índice Uma matriz em FORTRAN pode ter até sete índices Os índices em FORTRAN começam sempre de 1 A declaração de vetores e matrizes se faz junto com a declaração das demais variáveis dando a especificação do tamanho em cada dimensão do vetor e/ou da matriz
Estrutura de dados A atribuição de valores é feita como se você qualquer outra variável desde que haja definição do índice Exemplo: a(3) = j b = v(2) O índice sempre é inteiro positivo podendo ser um INTEGER
Estrutura de dados Um exemplo Crie um programa FORTRAN que gere um vetor de INTEGER de até 10 elementos com suas componentes iguais ao quadrado dos índices. Ao final do processo, imprima o vetor calculado.
Estrutura de dados PROGRAM vetor1 INTEGER vetor(10), i, j, n READ(*,*) n DO 1 i = 1, n vetor(i) = i * i 1 CONTINUE DO 2 j = 1,n WRITE(*,*) vetor(j) 2 CONTINUE STOP END
Estrutura de dados Há a possibilidade de uma forma alternativa para o WRITE que pode ser útil em certas circunstâncias. Vejamos no nosso exemplo
Estrutura de dados PROGRAM vetor2 INTEGER vetor(10), i, j, n READ(*,*) n DO 1 i = 1, n vetor(i) = i * i 1 CONTINUE WRITE(*,*) (vetor(j), j = 1, n) STOP END
Estrutura de dados Execute o programa e você verá que não teremos somente um código mais compacto como também outra maneira de apresentar os dados de saída.
Estrutura de dados Outro exemplo Crie um programa FORTRAN que gere uma matriz mat de dois índices de INTEGER de até 3 em cada índice de forma que ao final teremos o equivalente à matriz matemática abaixo ( 1 2 3 9) 4 5 6 7 8 Ao final do processo imprima a matriz.
Estrutura de dados PROGRAM mat1 INTEGER mat(3, 3), i, j, cont cont = 1 DO 1 i = 1, 3 DO 2 j = 1, 3 mat(i, j) = cont cont = cont + 1 2 CONTINUE 1 CONTINUE WRITE(*,*) ((mat(i, j), j = 1, 3), i = 1, 3) STOP END
Estrutura de dados Observe que a saída não é o que esperaríamos da apresentação de uma matriz. Para o computador isto não tem a menor importância (de fato, computador não se importa com nada. Ele só segue o que o programador especificou) Nós é que necessitamos de ordem para compreender o que ocorre a nossa volta.
Estrutura de dados Outro exemplo Crie um programa FORTRAN que gere uma matriz mat de dois índices de INTEGER de até 3 em cada índice de forma que ao final teremos o equivalente à matriz matemática abaixo ( 1 2 3 9) 4 5 6 7 8 Ao final do processo imprima a matriz no formato acima.
Estrutura de dados PROGRAM mat1 INTEGER mat(3, 3), i, j, k, cont cont = 1 DO 1 i = 1, 3 DO 2 j = 1, 3 mat(i, j) = cont 2 CONTINUE cont = cont + 1 1 CONTINUE DO 3 i = 1, 3 WRITE(*,*) (mat(i, j), j = 1, 3) 3 CONTINUE STOP END
Determinar o maior elemento de um vetor Termos as informações estruturadas simplificam vários procedimentos. Lembrem-se do código de exercício no qual era pedido achar o maior de três números INTEGER?
Determinar o maior elemento de um vetor Termos as informações estruturadas simplificam vários procedimentos. Lembrem-se do código de exercício no qual era pedido achar o maior de três números INTEGER? Façamos a versão vetorial com o seguinte algoritmo: Dado um vetor vet com valores INTEGER Faça que o primeiro elemento do vetor seja atribuído à variável maior Teste este valor com a segunda componente do vetor. Caso ela seja maior que a da variável maior, atribua este valor à variável maior, caso não, teste a próxima componente do vetor até a última componente.
Determinar o maior elemento de um vetor PROGRAM maior INTEGER vet(10), i, j, n, maior vet(1) = -3 vet(2) = 1 vet(3) = 4 vet(4) = 2 vet(5) = 4 maior = vet(1) DO 1 i = 2, 5 IF (vet(i).gt.maior) maior = vet(i) 1 CONTINUE WRITE(*,*) 'O maior elemento do vetor = ', maior STOP END
Determinar o maior elemento de um vetor Esta versão é bem tosca mas funciona.
Determinar o maior elemento de um vetor Esta versão é bem tosca mas funciona. Ela também nos faz refletir sobre o Custo Computacional. Quantas operações são feitas para obtermos o resultado que desejamos?
Determinar o maior elemento de um vetor Esta versão é bem tosca mas funciona. Ela também nos faz refletir sobre o Custo Computacional. Quantas operações são feitas para obtermos o resultado que desejamos? Observe que aqui com um vetor com 5 elementos fazemos 4 comparações. Se fosse n elementos seriam n-1 comparações.
Determinar o menor elemento de um vetor Fazer uma versão para determinar o menor elemento basta mudar o teste feito dentro do laço de repetição
Exercício Aprimore este programa: Crie um outro código no qual você entre com os valores do vetor via teclado, imprima o vetor dado e ao final imprima o maior valor do vetor.
Exercício Aprimore este programa: Crie um outro código no qual você entre com os valores do vetor via teclado, imprima o vetor dado e ao final imprima o maior valor do vetor. Mais um acréscimo ao programa: crie uma filtragem na entrada de forma que não permita o número de elementos maior do que o tamanho indicado para o vetor no programa.
Ordenação Vamos a algo mais complexo: Faça um programa que ordene de forma crescente um vetor de INTEGER.
Ordenação Vamos a algo mais complexo: Faça um programa que ordene de forma crescente um vetor de INTEGER. Imprimir três valores em ordem deu um certo trabalho. E n valores?
Algoritmo de Seleção Apresentemos um algoritmo baseado no que já vimos O Algoritmo de Seleção Esquematizemos...
Ordenação por Seleção Vetor inicial (5, 1, 3, 8, 4) Procure o menor valor do vetor (já sabemos fazer isto) e troque este valor com o primeiro valor (1, 5, 3, 8, 4) Procure o menor valor do vetor a partir da segunda posição e troque este valor com o valor que se encontra na segunda posição (1, 3, 5, 8, 4) Procure o menor valor a partir da terceira posição e troque este valor com o valor que se encontra na terceira posição (1, 3, 5, 4, 8) Procure o menor valor a partir da quarta posição e troque este valor com o valor que se encontra na quarta posição (1, 3, 4, 5, 8)
Ordenação por Seleção Observe que podemos aproveitar o código que foi escrito para determinar o maior elemento (ou o menor elemento)
Ordenação por Seleção Observe que podemos aproveitar o código que foi escrito para determinar o maior elemento (ou o menor elemento) Observe ainda que não interessa o menor valor mas onde ele se encontra
Ordenação por Seleção PROGRAM selecao INTEGER vet(10), i, j, k, n, menor, aux vet(1) = -3 vet(2) = 1 vet(3) = 4 vet(4) = 2 vet(5) = 4 DO 1 i = 1, 4 menor = i DO 2 j = i+1, 5 IF (vet(menor).gt.vet(j)) menor = j 2 CONTINUE aux = vet(menor) vet(menor) = vet(i) vet(i) = aux 1 CONTINUE WRITE(*,*) 'Vetor ordenado', (v(k), k = 1, n) STOP END
Ordenação por Seleção Qual o custo computacional deste algoritmo?
Ordenação por Seleção Qual o custo computacional deste algoritmo? Observe que para 5 elementos procuramos fazemos 4 comparações para achar o primeiro valor, 3 comparações para achar o segundo valor, 2 para o terceiro e 1 para o quarto valor.
Ordenação por Seleção Qual o custo computacional deste algoritmo? Observe que para 5 elementos procuramos fazemos 4 comparações para achar o primeiro valor, 3 comparações para achar o segundo valor, 2 para o terceiro e 1 para o quarto valor. Número total de comparações: 4 + 3 + 2 + 1 = 10
Ordenação por Seleção Qual o custo computacional deste algoritmo? Observe que para 5 elementos procuramos fazemos 4 comparações para achar o primeiro valor, 3 comparações para achar o segundo valor, 2 para o terceiro e 1 para o quarto valor. Número total de comparações: 4 + 3 + 2 + 1 = 10 Se fosse n valores teríamos n -1 + n -2 + n 3 + + 2 + 1 Sabemos que 1 + 2 + 3 + 4 + + n-2+n-1+n = n(n+1)/2 logo Se fossem n valores teríamos n(n-1)/2 comparações
Ordenação por Seleção É um algoritmo bem ruim (está entre os piores) pois se o vetor já estiver ordenado ele fará o mesmo número de comparações Quando o número de operações é proporcional ao número de elementos ao quadrado, que é como este caso, diremos que o custo computacional é quadrático.
Algoritmo da Bolha Vamos a algo mais complexo: Faça um programa que ordene um vetor dado usando o algoritmo da Bolha.
Algoritmo da Bolha Melhor deixar claro o que é o Algoritmo da Bolha com um exemplo
Ordenação por Bolha Vetor inicial (5, 1, 3, 8, 4) Compare os dois termos contíguos. Se estiverem fora de ordem, troque-os (1, 5, 3, 8, 4) Compare o segundo com o terceiro. Se estiverem fora de ordem, troque-os (1, 3, 5,8,4) Compare o terceiro com o quarto. Se estiverem fora de ordem, troque-os (1, 3, 5, 8, 4) Compare co terceiro com o quinto. Se estiverem fora de ordem, troque-os (1, 3, 5, 4, 8) Se tiver acontecido alguma troca, repita o processo
Ordenação por Bolha Vetor parcial (1, 2, 5, 4, 8) Compare os dois termos contíguos. Se estiverem fora de ordem, troque-os (1, 2, 5, 4, 8) Compare o segundo com o terceiro. Se estiverem fora de ordem, troque-os (1, 2, 5, 4,8) Compare o terceiro com o quarto. Se estiverem fora de ordem, troque-os (1, 2, 4, 5, 8) Compare co terceiro com o quinto. Se estiverem fora de ordem, troque-os (1, 2, 4, 5, 8) Se tiver acontecido alguma troca, repita o processo
Ordenação por Bolha Vetor parcial (1, 2, 4, 5, 8) Compare os dois termos contíguos. Se estiverem fora de ordem, troque-os (1, 2, 4, 5, 8) Compare o segundo com o terceiro. Se estiverem fora de ordem, troque-os (1, 2, 4, 5,8) Compare o terceiro com o quarto. Se estiverem fora de ordem, troque-os (1, 2, 4, 5, 8) Compare co terceiro com o quinto. Se estiverem fora de ordem, troque-os (1, 3, 4, 5, 8) Não havendo trocas, pare.
Ordenação por Bolha Não é difícil mostrar que no pior caso (quando o vetor está em ordem decrescente) o custo é n(n-1)/2 É fácil de ver que o número de comparações se o vetor estiver ordenado é n - 1
Ordenação por Bolha Não é difícil mostrar que no pior caso (quando o vetor está me ordem decrescente) o custo é n(n-1)/2 É fácil de ver que o número de comparações se o vetor estiver ordenado é n - 1 Este é um algoritmo sensível à ordenação do vetor Mas também não é um algoritmo eficiente
Ordenação por Bolha PROGRAM bolha LOGICAL trocou INTEGER vet(10), i, j, k, n, aux vet(1) = -3 vet(2) = 1 vet(3) = 4 vet(4) = 2 vet(5) = 4 trocou =.TRUE. DO WHILE (trocou) trocou =.FALSE. DO 1 j = 1, 4 IF (vet(j+1).lt.vet(j)) THEN aux = vet(j) vet(j) = vet(j+1) vet(j+1) = aux trocou =.TRUE. ENDIF 1 CONTINUE ENDDO WRITE(*,*) 'Vetor ordenado', (vet(k), k = 1, n) STOP END
Produto escalar Dado dois vetores v e u de mesmo tamanho n, ache o produto escalar entre eles.
Alguns exercícios Vamos agora ir por alguns programas simples que irão compor outros mais complexos
Produto escalar O produto escalar de dois vetores v e u de tamanho n é definido como n v u=v 1 u 1 +v 2 u 2 +v 3 u 3 + +v n u n = i=1 v i u i
Produto escalar PROGRAM escalar REAL v(8), u(8), pescalar INTEGER i v(1) = -3.0 v(2) = 1.0 v(3) = 4.0 u(1) = 2.0 u(2) = 5.0 u(3) = -4.0 pescalar = 0.0 DO 1 i = 1, n pescalar = pescalar + v(i) * u(i) 1 CONTINUE WRITE(*,*) 'O produto escalar dos vetores = ', pscalar STOP END
Produto escalar Basta olhar para a definição de produto escalar para sabermos que serão feitos n produtos e n-1 somas n v u=v 1 u 1 +v 2 u 2 +v 3 u 3 + +v n u n = i=1 v i u i O custo computacional é portanto 2n-1 operações. Diremos que o custo computacional é linear.
Produto de matriz por vetor O vetor u de tamanho m, que é o produto de matriz A mxn de componentes a ij pelo vetor v de tamanho n, é dado por u= A v
Produto de matriz por vetor O vetor u de tamanho m, que é o produto de matriz A mxn de componentes a ij pelo vetor v de tamanho n, é dado por u= A v ou em notação de componentes n u i =a i1 u 1 +a i2 u 2 +a i3 u 3 + +a u n = j=1 a ij u j
Produto de matriz por vetor O vetor u de tamanho m, que é o produto de matriz A mxn de componentes a ij pelo vetor v de tamanho n, é dado por u= A v ou em notação de componentes n u i =a i1 u 1 +a i2 u 2 +a i3 u 3 + +a u n = j=1 a ij u j Observem que cada componente de u é resultado do produto escalar de cada linha de A pelo vetor coluna n
Produto de matriz por vetor PROGRAM matrizvetor REAL v(3), u(2), a(2,3) INTEGER i, j v(1) = 1.0 v(2) = 3.0 v(3) = 2.0 a(1,1) = 2.0 a(1,2) = 1.0 a(1,3) = 2.0 a(2,1) = 2.0 a(2,2) = 4.0 a(2,3) = 2.0. DO 1 i = 1, 2 u(i) = 0.0 DO 2 j = 1, 3 u(i) = u(i) + a(i, j) * v(j) 2 CONTINUE 1 CONTINUE WRITE(*,*)(u(i), i = 1, 2) STOP END
Produto de matriz por vetor PROGRAM matrizvetor REAL v(3), u(2), a(2,3) INTEGER i, j v(1) = 1.0 v(2) = 3.0 v(3) = 2.0 a(1,1) = 2.0 a(1,2) = 1.0 a(1,3) = 2.0 a(2,1) = 2.0 a(2,2) = 4.0 a(2,3) = 2.0 Temos assim mais um algoritmo reaproveitado DO 1 i = 1, 2 u(i) = 0.0 DO 2 j = 1, 3 u(i) = u(i) + a(i, j) * v(j) 2 CONTINUE 1 CONTINUE WRITE(*,*)(u(i), i = 1, 2) STOP END
Produto escalar Observe que no caso particular de estarmos multiplicando uma matriz quadrada de dimensão nxn por um vetor de dimensão n, teremos n produtos escalares de n vetores. O custo computacional é portanto n vezes 2n-1 operações. Diremos que o custo computacional é O(n 2 ) ou quadrático.
Produto de matriz por matriz O a matriz C de tamanho mxn, que é o produto de matriz A mxp de componentes a ij pela matriz B de componentes b ij pxn, é dado por C=A B ou em notação de componentes p c ij =a i 1 b 1 j +a i2 b 2 j +a i 3 b 3 j + +a b nj = k=1 a ik b jk Observem que cada componente de C é resultado do produto escalar de cada linha de A por cada coluna de B.
Produto de matriz por vetor PROGRAM matrizmatriz REAL a(2, 3), b(3, 2), c(2, 2) INTEGER i, j, k a(1,1) = 1.0 a(1,2) = 3.0 a(1,3) = 2.0 a(2,1) = 1.0 a(2,2) = 2.0 a(2,3) = 3.0 b(1,1) = -3.0 b(1,2) = 3.0 b(2,1) = 1.0 b(2,2) = 1.0 b(3,1) = 2.0 b(3,2) = 2.0 DO 1 i = 1, 2 DO 2 j = 1, 2 c(i, j) = 0.0 DO 3 k = 1, 3 c(i, j) = c(i, j) + a(i, k) * b(k,j) 3 CONTINUE 2 CONTINUE 1 CONTINUE DO 4 i = 1, 2 WRITE(*,*)(c(i,k), k = 1, 2) 4 CONTINUE STOP END
Um exemplo com caracteres Para o cado especial de fazermos o produto de duas matrizes nxn, teremos n vezes n vezes 2n-1 operações ou O(n 3 ) e diremos que o custo computacional é cúbico.
Um exemplo com caracteres Vamos aproveitar que estamos com vetores e ordenação de valores para esclarecer mais algumas coisas sobre caracteres dentro de um computador
Exemplos com caracteres O tipo CHARACTER em FORTRAN reserva espaço na memória do computador e permite atribuirmos os caracteres que estão definidos na tabela ASCII e suas extensões
Tabela ASCII Caracteres - 1 B
Exemplos com caracteres Observe que temos um número inteiro associado a cada caracter. É por reconhecer o tipo da variável como CHARACTER (e se referenciar ao número associado na tabela) é que os programas que estejam executando no computador reagem a estas variáveis de forma conveniente.
Exemplos com caracteres As atribuições de caracteres são feitas como abaixo a = '/' b = 'B'
Exemplos com caracteres As atribuições de caracteres são feitas como abaixo a = '/' b = 'B' Embora o FORTRAN não distinga variáveis minúsculas de maiúsculas, a linguagem distingue o conteúdo das variáveis se são minúsculas ou maiúsculas
Um exemplo com caracteres PROGRAM caracter03 CHARACTER a, b, c, d, e, f WRITE(*,*) "Entre com dois caracteres separados por espaco em bra *nco" READ(*,*), a, b WRITE(*,*) " Os caracteres digitados foram ", a, " ", b c = '/' d = 'A' WRITE(*,*) " Os caracteres atribuidos foram ", c, " ", d e = b f = c WRITE(*,*) " Os caracteres atribuidos foram ", e, " ", f STOP END
Exemplos com caracteres Podemos fazer comparações entre caracteres nos lembrando de que as referências serão sempre os valores da tabela ASCII
Mais um exemplo com caracteres PROGRAM caracteres04 CHARACTER a, b WRITE(*,*) "Entre com dois caracteres separados por espaco em bra *nco" READ(*,*) a, b IF (a.le.b) THEN ELSE ENDIF STOP END WRITE(*,*), a, " e' menor que ", b WRITE(*,*), a, " e' maior que ", b
Exemplos com caracteres Experimente teclar algo como a letra S e a letra s e depois olhe a correspondência na tabela ASCII
Exemplos com caracteres Podemos também ter vetores de tipo CHARACTER e usá-los como os outros vetores
Exemplos com caracteres PROGRAM caracter05 CHARACTER a(5), b INTEGER i WRITE(*,*) "Entre com 5 caracteres, dando <enter> depois de cada *um" i = 1 DO WHILE (i.le.5) READ(*,*) a(i) i = i + 1 ENDDO WRITE(*,*)(a(i), i = 1, 5) STOP END
Cadeia de caracteres Outra maneira de reservarmos e definirmos operações com caracteres é por meio de cadeias de caracteres
Exemplos com cadeias de caracteres PROGRAM cadeia CHARACTER a*5, b(4)*10 WRITE(*,*) "Entre com 5 caracteres, dando <enter> depois" READ(*,*) a WRITE(*,*)a b(1) = " o pato b(2) = " o sapo b(3) = " o rato b(4) = " o gato " WRITE(*,*) (b(i), i = 1, 4) STOP END
Exemplos com cadeias de caracteres No entanto, há apenas um operador que pode ser usado quando trabalhamos com vetores de caracteres, o operador de concatenação // Vamos para um exemplo
Exemplos com cadeias de caracteres PROGRAM cadeia02 CHARACTER a*60, b(4)*10 b(1) = " o pato b(2) = " o sapo b(3) = " o rato b(4) = " o gato " a = b(1) // b(2) // b(3) // ' e ' // b(4) // "sao animais" WRITE(*,*) a STOP END
Cadeias de caracteres Existem ainda funções específicas para o trabalho com caracteres e cadeia de caracteres. Aqui apresentaremos três:
Cadeias de caracteres Existem ainda funções específicas para o trabalho com caracteres e cadeia de caracteres. Aqui apresentaremos três: c = CHAR(i) Dado um inteiro i, devolve o caracter correspondente na tabela de referência I = ICHAR(c) Dado um caracter, devolve o número correspondente na tabela de referência I = LEN(cadeia) Devolve o comprimento da cadeia de caracteres
Exemplos com cadeias de caracteres PROGRAM cadeia03 CHARACTER a*60, b(4)*10, letra, branco INTEGER n b(1) = " o pato b(2) = " o sapo b(3) = " o rato b(4) = " o gato " a = b(1) // b(2) // b(3) // ' e ' // b(4) // "sao animais" WRITE(*,*) a WRITE(*,*) "Comprimento de a ", LEN(a) WRITE(*,*) "Comprimento de letra ", LEN(letra) WRITE(*,*) Comprimento da cadeia, LEN(b(1) // b(2) // b(3) // *' e ' // b(4) // "sao animais") WRITE(*,*) "O numero da tabela ASCII referente a ", branco, "e' " *, ICHAR(branco), " e a ", letra, " e' ", ICHAR(letra) STOP END
Cadeia de caracteres Observe que LEN() não devolve o número de caracteres que inscrevemos mas o espaço total reservado para a cadeia de caracteres O caracter que representa um espaço em branco é marcado na tabela ASCII como SP Mesmo que à variável letra nada ter sido atribuído, ela obviamente ocupa espaço na memória
Cadeia de caracteres Apresentemos mais uma função trabalha com cadeias e subcadeias de caracteres i = INDEX(c1, c2) A função devolve a primeira posição da primeira ocorrência da subcadeia c2 na cadeia c1.
Cadeia de caracteres Apresentemos mais uma função trabalha com cadeias e subcadeias de caracteres i = INDEX(c1, c2) A função devolve a primeira posição da primeira ocorrência da subcadeia c2 na cadeia c1. Se o valor devolvido for zero, então a subcadeia c2 não foi encontrada em c1.
Cadeia de caracteres PROGRAM cadeia08 CHARACTER a*80, b*2 INTEGER i a = "Cortando uma cadeia de caracteres" b = "ma" i = INDEX(a, b) WRITE(*,*) "Cadeia de caracteres a:" WRITE(*,*) a WRITE(*,*) "O fragmento ", b, " se encontra na posicao ", i, "de a" STOP END
Cadeia de caracteres Mas como podemos manipular uma cadeia de caracteres?
Cadeia de caracteres Mas como podemos manipular uma cadeia de caracteres? O FORTRAN tem um comando que permite extrair subcadeias de cadeias de caracteres. Se c é uma cadeia de caracteres podemos extrair uma subcadeia s da seguinte forma s = c(m:n)... onde a subcadeia de c vai do m-ésimo elemento até o n-ésimo elemento de c.
Cadeia de caracteres Mas como podemos manipular uma cadeia de caracteres? O FORTRAN tem um comando que permite extrair subcadeias de cadeias de caracteres. Se c é uma cadeia de caracteres podemos extrair uma subcadeia s da seguinte forma s = c(m:n)... onde a subcadeia de c vai do m-ésimo elemento até o n-ésimo elemento de c. O menor valor possível é 1 e o maior valor o número de caracteres da cadeia
Cadeia de caracteres Vamos cortar uma cadeia de caracteres em vários pedaços
Cadeia de caracteres PROGRAM cadeia05 CHARACTER a*60, b(4)*10 INTEGER i a = "Cortando uma cadeia de caracteres" b(1) = a(1:8) b(2) = a(3:8) b(3) = a(10:20) b(4) = a(4:4) DO 1 i = 1,4 WRITE(*,*) b(i) 1 CONTINUE STOP END
Cadeia de caracteres Vamos fazer um programa que dado uma frase a mesma seja impressa sem caracteres SP (branco)
Cadeia de caracteres PROGRAM cadeia06 CHARACTER a*80, b(80), c(80), branco INTEGER i, j, k, n a = "Cortando uma cadeia de caracteres branco = ' ' DO 1 i = 1,80 b(i) = a(i:i) 1 CONTINUE WRITE(*,*) (b(k), k = 1, 80) k = 1 DO 2 j = 1, 80 IF (b(j).ne.branco) THEN c(k) = b(j) k = k + 1 ENDIF 2 CONTINUE WRITE(*,*) (c(k), k = 1, 80) STOP END
Cadeia de caracteres Você deve ter percebido que houve algo de estranho: O vetor impresso apresentou caracteres que não estavam na cadeia original Isto ocorre porque as variáveis em FORTRAN, incluindo as do tipo CHARACTER, não tem o seu conteúdo limpo Temos que limpar por nossa conta se desejamos isto.
Cadeia de caracteres PROGRAM cadeia06b CHARACTER a*80, b(80), c(80), branco INTEGER i, j, k, n a = "Cortando uma cadeia de caracteres branco = ' ' DO 1 i = 1,80 b(i) = a(i:i) c(i) = branco 1 CONTINUE WRITE(*,*) (b(k), k = 1, 80) k = 1 DO 2 j = 1, 80 IF (b(j).ne.branco) THEN c(k) = b(j) k = k + 1 ENDIF 2 CONTINUE WRITE(*,*) (c(k), k = 1, 80) STOP END
Cadeia de caracteres Dado uma cadeia de caracteres com letras minúsculas, faça um programa que ordene as letras em ordem alfabética
Cadeia de caracteres Dado uma cadeia de caracteres com letras minúsculas, faça um programa que ordene as letras em ordem alfabética Escolheremos o algoritmo de Seleção para ilustrar o que pode ser feito
Cadeia de caracteres PROGRAM cadeia07 CHARACTER a*80, b(80), aux INTEGER i, j, k, n, menor a = "Cortando uma cadeia de caracteres n = 80 DO 1 i = 1,n b(i) = a(i:i) 1 CONTINUE WRITE(*,*) (b(k), k = 1, n) DO 2 i = 1, 80 menor = i DO 3 j = i+1, n-1 IF (b(menor).gt.b(j)) menor = j 3 CONTINUE aux = b(menor) b(menor) = b(i) b(i) = aux 2 CONTINUE WRITE(*,*) (b(k), k = 1, n) STOP END
Cadeia de caracteres Observe que os espaços em branco aparecem antes das letras do alfabeto. Basta dar uma olhada na tabela ASCII para verificar o porque disto
Ampliando READ e WRITE Vamos ampliar as possibilidades de uso dos comandos de entrada e saída: READ e WRITE Ilustraremos com o WRITE WRITE (u, f) variável1, variável2, u é um inteiro que referencia o que é chamado unidade, a máquina pela qual será feita a operação de entrada/saída f é é um inteiro positivo que referencia o formato de entrada/saída como rótulo que indica a declaração FORMAT
Ampliando READ e WRITE READ (*, *) variável1, variável2, Significa que a unidade é o teclado e o formato segue um padrão pré-estabelecido WRITE( *,*) variável1, variável2,... Significa que a unidade é a tela e o formato segue um padrão préestabelecido
Ampliando READ e WRITE Criaremos foco sobre o formato mantendo as unidades de entrada/saída padrões
Declaração FORMAT Mostremos um fragmento de código... WRITE (*, 1000) variável1, variável2, 1000 FORMAT(...)
Declaração FORMAT Alguns Formatos Iw Aw X Lw Fw.d Imprima um INTEGER com w posições Imprima CHARATER com w posições Imprime um espaço em branco Imprime LOGICAL com w posições Imprima um REAL com w posições e d casas decimais Ew.d Imprima um Real com w posições e d casas decimais em notação científica / Salta uma linha
Declaração FORMAT Alguns Formatos Iw Aw X Lw Fw.d Imprima um INTEGER com w posições Imprima CHARATER com w posições Imprime um espaço em branco Imprime LOGICAL com w posições Imprima um REAL com w posições e d casas decimais Ew.d Imprima um Real com w posições e d casas decimais em notação científica / Salta uma linha Dentro da declaração de formato, os formatos são separados por vírgulas
Declaração FORMAT Se você quiser declarar várias variáveis de mesmo tipo em sequência, basta colocar um valor inteiro positivo antes da declaração de formato. 2I5 3A10 4X Indica a formatação de dois INTEGER DE 5 posições Indica a formatação de três CHARACTER de 10 posições Imprime quatro espaços em branco 2F15.7 Indica o formato de 2 REAL apresentado com 15 posições sendo 7 correspondendo ao número de casas decimais
Declaração FORMAT PROGRAM formato CHARACTER a*60 INTEGER i, j REAL x x = 3.141592 a = "Nos e todo o mundo guardamos pi" i = LEN(a) j = LEN("Nos e todo o mundo guardamos pi") WRITE(*,1000) a, x, x, i, j 1000 FORMAT(5X, A60, F15.3, 2/, E15.4, 2I5) WRITE(*, 2000) a, x, x, i, j 2000 FORMAT(" Cadeia = ", A60, "Pi = ", F15.3, /, "Pi = ", E15.4, /, " *i = ", I5, "j = ", I5 ) STOP END
Ampliando READ e WRITE Observe a saída e veja se compreendeu as ligações entre as formatações e o conteúdo das variáveis