Programação de Computadores

Documentos relacionados
PROGRAMAÇÃO DE COMPUTADORES

GEO764 - Programação avançada em Geofísica. Controle da seqüência. Estrutura IF... THEN... ELSE. Comando IF

Aula 5. Uma partícula evolui na reta. A trajetória é uma função que dá a sua posição em função do tempo:

Aula 11: Desvios e Laços

Introdução ao. Script. Baltazar Tavares (Psycho Mantys)

Fundamentos de Programação. Diagrama de blocos

Universidade Federal de Goiás Campus Catalão Departamento de Matemática

2) Escreva um algoritmo que leia um conjunto de 10 notas, armazene-as em uma variável composta chamada NOTA e calcule e imprima a sua média.

Capítulo 5. ARQUIVOS E FUNÇÕES MATEMÁTICAS INTRÍNSECAS

Primeira Lista de Exercícios de Métodos Numéricos II Primeiro semestre de 2015

Programação de Computadores. Professor Ilaim Costa Junior

Uso de escalas logaritmicas e linearização

Método de ordenação - objetivos:

Física Experimental III

Introdução ao FORTRAN (Parte I)

Ciclo com Contador : instrução for. for de variável := expressão to. expressão do instrução

ENG1000 Introdução à Engenharia

Capítulo 13. VARIÁVEIS DO TIPO REAL DUPLA

Conteúdo programático

Unidade 1: O Computador

Estruturas de Repetição

1.2 OPERAÇÕES BÁSICAS EM ALGORITMOS E PROGRAMAS 18

OPERAÇÕES COM FRAÇÕES

Recorrendo à nossa imaginação podemos tentar escrever números racionais de modo semelhante: 1 2 =

O Cálculo λ sem Tipos

UNIVERSIDADE DO VALE DO RIO DOS SINOS - UNISINOS CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS - CENTRO 06. Funções, variáveis, parâmetros formais

Inteligência Artificial

UTILIZAÇÃO DE RECURSOS AVANÇADOS DO EXCEL EM FINANÇAS (PARTE III): GERENCIAMENTO DE CENÁRIOS

Lógica de Programação. Profas. Simone Campos Camargo e Janete Ferreira Biazotto

2 Segmentação de imagens e Componentes conexas

tipo e tamanho e com os "mesmos" elementos do vetor A, ou seja, B[i] = A[i].

Módulo de Equações do Segundo Grau. Equações do Segundo Grau: Resultados Básicos. Nono Ano

Matrizes. matriz de 2 linhas e 2 colunas. matriz de 3 linhas e 3 colunas. matriz de 3 linhas e 1 coluna. matriz de 1 linha e 4 colunas.

Sistemas Numéricos. Tiago Alves de Oliveira

UNIVERSIDADE ESTADUAL PAULISTA. Apostila Pascal Ed Prof. Dr. Galeno José de Sena DMA/FEG CAPÍTULO 8

Probabilidade. Luiz Carlos Terra

SOLUÇÕES N item a) O maior dos quatro retângulos tem lados de medida 30 4 = 26 cm e 20 7 = 13 cm. Logo, sua área é 26 x 13= 338 cm 2.

TUTORIAL MATLAB Victor Breder 2016

Usando potências de 10

Usando números muito pequenos e números muito grandes

0.1 Introdução Conceitos básicos

INICIADOS - 2ª Sessão ClubeMath

Calculando seno(x)/x com o interpretador Hall.

2 Conceitos Básicos. onde essa matriz expressa a aproximação linear local do campo. Definição 2.2 O campo vetorial v gera um fluxo φ : U R 2 R

Exercício. Exercício

Programação Orientada a Objetos SANTOS, Rafael

Linguagem de Programação C. Fluxo de Saída Padrão. Linguagem de Programação C. printf. Fluxo de Saída Padrão. Algoritmos e Lógica de Programação

Álgebra Linear Aplicada à Compressão de Imagens. Universidade de Lisboa Instituto Superior Técnico. Mestrado em Engenharia Aeroespacial

ISS Eletrônico. Formato de Arquivos para Transmissão de Documentos Declarados através do aplicativo OFFLINE. Extensão do Arquivo JUNHO2006.

Avaliação de Empresas Profa. Patricia Maria Bortolon

Algoritmos e Programação : Conceitos e estruturas básicas. Hudson Victoria Diniz

a) O Word é um editor de TEXTOS. Com ele é possível digitar cartas, currículos e trabalhos escolares.

Curso C: Ponteiros e Arrays

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO PROGRAMA DE EDUCAÇÃO TUTORIAL - MATEMÁTICA PROJETO FUNDAMENTOS DE MATEMÁTICA ELEMENTAR

Configuração para Uso do Tablet no GigaChef e Outros Dispositivos

Expressões Lógicas e Aritméticas. Professora Kátia Adriana Alves Leite de Barros katia.barros@pitagoras.com.br

Carlos de Salles Soares Neto Segundas e Quartas, 17h40 às 19h10

Álgebra Linear I - Aula 20

Actividade de enriquecimento. Algoritmo da raiz quadrada

Em linguagem matemática, essa proprieade pode ser escrita da seguinte maneira: x. 1 = x Onde x representa um número natural qualquer.

Simulado de Linguagem de Programação Java

Aula 8 Variações da Eliminação de Gauss/Fatoração LU.

Teoria dos Grafos. Valeriano A. de Oliveira Socorro Rangel Departamento de Matemática Aplicada.

Graphing Basic no Excel 2007

Lista de Exercícios Critérios de Divisibilidade

Teste de hipótese em modelos normais lineares: ANOVA

Introdução à Programação de Computadores Parte I

Laboratório de Programação 02

Resolução de sistemas de equações lineares: Método de eliminação de Gauss

Os eixo x e y dividem a circunferência em quatro partes congruentes chamadas quadrantes, numeradas de 1 a 4 conforme figura abaixo:

MANUAL DO PROFESSOR. - Inscrições Colégios. Colégios Participantes de Temporadas anteriores:

ALGORITMO I VARIÁVEIS INDEXADAS

SCILAB. Software livre para cálculo numérico e simulação de sistemas físicos Utilizado nas áreas de:

Manual do Formatador Kfloppy

Aplicações Diferentes Para Números Complexos

números decimais Inicialmente, as frações são apresentadas como partes de um todo. Por exemplo, teremos 2 de um bolo se dividirmos esse bolo

Notas de aula de Lógica para Ciência da Computação. Aula 11, 2012/2

Fundamentos de Bancos de Dados 3 a Prova Caderno de Questões

Lista de Exercícios 04 Estruturas de Dados Homogêneas - Vetores

Comandos de Eletropneumática Exercícios Comentados para Elaboração, Montagem e Ensaios

números decimais Inicialmente, as frações são apresentadas como partes de um todo. Por exemplo, teremos 2 de um bolo se dividirmos esse bolo

Orientação a Objetos

Registro de Retenções Tributárias e Pagamentos

Análise de Variância (ANOVA)

Programação de Computadores I Estruturas de Repetição PROFESSORA CINTIA CAETANO

M =C J, fórmula do montante

POTENCIAÇÃO, RADICIAÇÃO E LOGARITMAÇÂO NOS NÚMEROS REAIS. Potenciação 1

Matrizes e Sistemas Lineares. Professor: Juliano de Bem Francisco. Departamento de Matemática Universidade Federal de Santa Catarina.

Este Procedimento Operacional Padrão define as etapas necessárias para o processo de inventário em um estoque, filial ou loja no APLWeb.

Linguagem de Programação

Trabalhando com Mala Direta e Etiquetas de Endereçamento no BrOffice/LibreOffice

FATURA ELETRÔNICA DO PRESTADOR Layout do Arquivo Texto Versão 1.1.1

3º Ano do Ensino Médio. Aula nº06

ACCESS ) Introdução. 2) Abrindo um banco de dados. 3) A Janela do Access-2007

Capítulo 1. Importação de Dados de Instituições Financeiras - Arquivo TXT 3

Exercícios: Vetores e Matrizes

QUESTÕES PARA A 3ª SÉRIE ENSINO MÉDIO MATEMÁTICA 2º BIMESTE SUGESTÕES DE RESOLUÇÕES

Transcrição:

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