eel170 computaÇÃo i ac/eel170.htm antonio cláudio gómez de sousa [email protected] 1a série de...
TRANSCRIPT
EEL170 COMPUTAÇÃO I www.del.ufrj.br/~ac/eel170.htm
Antonio Cláudio Gómez de [email protected]
1a série de slidesversão 19/03/2012
2
Apresentação da disciplina
• Disciplina obrigatória – 1a da área de computação
• Objetivo: estudar lógica de programação e algoritmos
• Aulas teóricas sobre algoritmos
• Aulas práticas com a implementação dos algoritmos em Pascal
3
Sumário:
• Apresentação da disciplina• Solução de problemas• Algoritmos estruturados• LEA – linguagem para a especificação de algoritmos• Algoritmos numéricos e não numéricos• Estruturas de dados homogêneas e heterogêneas• Modularização• Refinamento etapa por etapa• Arquivos• Alocação dinâmica de memória• Objetos
4
Sociedade da Informação
• Desmaterialização dos produtos
• Informação e poder
• Informática: exclusão ou inclusão
• Democratização ou concentração
• Software: valor de troca ou valor de uso – software livre e proprietário
• Inclusão digital - LIpE
5
Computação
• Computar contar, calcular
• Desenvolvimento de software e hardware de computadores
6
Computador
• Máquina flexível de uso geral• Programável: pode-se alterar seu
comportamento• Armazena dados e programas• Máquina complexa: sistema operacional para
permitir utilizar seus recursos• Digital: representa e processa números, textos e
imagens em forma discreta - binária
Capítulo 1
• Arquitetura de computadores• Software• Linguagens• Tradutores
8
Numeração binária
• Posicional como a decimal
• Dígitos 0 e 1
9
Representação binária e decimal
• 514 = 500+10+4 = 5.102+1.101+4.100
• 10011 = 1.24 +0.23 +0.22 +1.21 + 1.20 = 16 + 0 + 0 + 2 + 1 = 19
• Processo inverso:
• Divisão 19/2 9/2 4/2 2/2 1/2 0
• Resto 1 1 0 0 1
10
Potências de dois
20 = 121 = 222 = 423 = 824 = 1625 = 3226 = 6427 = 12828 = 25629 = 512210 = 1024 = 1 K
11
Solução de problemas computacionais numéricos e não numéricos
• Analisar o problema• Criar soluções• Selecionar uma solução• Descrever a solução• Especificar na forma de
algoritmo• Codificar em uma
linguagem• Compilar o programa
fonte• Testar o programa
executável
• Linguagem natural• Linguagem natural• Linguagem natural• Linguagem natural• Pseudo-código:
linguagem semi-formal• Pascal: programa fonte
em linguagem formal• Gerar um programa
executável binário• Utilizar o programa
executável binário
Analisar o problema
• Descrever em linguagem natural• Especificar os requisitos em linguagem
semi-formal• Abstração: o que é importante• Centro no usuário
Criar soluções
• Descrever as soluções em linguagem natural• Especificar as soluções em linguagem semi-
formal• Definir os critérios para a escolha da melhor
solução• Escolher a melhor solução• Abstração• Modularização• Refinamento etapa por etapa• Especificação semi-formal da solução
14
Procedimento
• Sequência de passos para resolver um problema
– Ex.: Receita para fazer um bolo– Cuidado:
– Este tipo de procedimento do exemplo mostra o que o leitor deve fazer para preparar um bolo
– Os procedimentos e algoritmos computacionais que veremos devem representar o comportamento que um computador deve ter para nos auxiliar a resolver um problema
15
Procedimento para trocar uma lâmpada
• Pegar uma escada• Posicionar a escada• Buscar uma lâmpada nova• Subir na escada• Retirar a lâmpada queimada• Colocar a lâmpada nova• Descer da escada
– Novamente: aqui está o que o leitor deve fazer, não o comportamento de um computador
16
Algoritmo
• Procedimento
• Efetivo
• Para entradas finitas fornece saidas finitas repetitíveis em tempo finito
• Algoritmos computacionais: descrevem o comportamento que um computador deve ter para nos apoiar na solução de algum problema
17
Algoritmo de Euclides para o cálculo do mdc
Sejam x e y dois números inteiros maiores que zero; calcule o resto da divisão inteira de x por y; se o resto for zero, então o mdc é o y; se o resto não for zero então atribua o valor de y a x, atribua o valor do resto a y e recomece do cálculo do resto da divisão de x por y até que o resto seja zero.
18
Algoritmo de Euclides na forma de etapas
1) Escolha x e y;
2) Calcule o resto da divisão inteira de x por y;
3) Se o resto for diferente de zero faça:3.1) Atribua o valor de y a x;
3.2) Atribua o valor do resto a y;
3.3) Retorne para a etapa 2;
4) Se o resto for zero então o y é o mdc.
19
Algoritmo de Euclides como fluxograma de um programa
inicio
Leia x, y
r resto(x,y)
X yY r
r=0
Escreva: o mdc é x
fim
não sim
Ordem para o computador
Ordem para o computador
20
Algoritmo de Euclides em pseudo-código - LEA
algoritmo euclides(* algoritmo para o cálculo do mdc de dois números inteiros maiores que zero
segundo Euclides; responsável:... ; data:... *)(* bloco de repetição com teste de término após o bloco *)inicio
leia (x, y) (* dois valores estão sendo digitados e atribuidos às variáveis – o computador
“lê” os dados que o usuário digita no teclado *)repita
r resto (x,y)x yy r
até que r = 0escreva (x) // o computador “escreve” o valor no dispositivo padrão de saída
fim
inicioleia (x, y)repita
r resto (x,y)x yy r
até que r = 0escreva (x)
fim
inicio
Leia x, y
r resto(x/y)
X yY r
r=0
Escreva: o mdc é x
fim
não sim
22
Algoritmo de Euclides – teste no início
inicio
Leia x, y
r resto(x,y)
X yY r
r<>0
Escreva: o mdc é y
fim
nãosim
r resto(x,y)
23
Algoritmo de Euclides – teste no início
algoritmo euclides(* algoritmo para o cálculo do mdc de dois números inteiros maiores que zero segundo Euclides; responsável:... ; data:... *)(* bloco de repetição com teste de término antes do bloco *)inicio
leia (x, y)r resto (x,y)enquanto r <> 0 façainicio
x yy rr resto (x,y)
fimescreva (y)
fim
24
inicioleia (x, y)r resto (x,y)enquanto r <> 0 faça
iniciox yy rr resto (x,y)
fimescreva (y)
fim
inicio
Leia x, y
r resto(x,y)
X yY r
r<>0
Escreva: o mdc é y
fim
nãosim
r resto(x,y)
Algoritmos
Estruturas de controle
Soma de três números
Etapas:
Preparar
Digitar os números
Somar os números
Apresentar o resultado
27
Estrutura de controle sequencial: exemplo
// Problema: somar três números// Solução: fazer um programa que auxilie na soma de três númerosalgoritmo soma3a(* algoritmo para a soma de 3 números; responsável:...; data:... *)
inicioLer os tres númerosSomar os tres númerosEscrever a soma
fim
28
Exemplo detalhado// Problema: somar três números// Solução: fazer um programa que auxilie na soma de três númerosalgoritmo soma3a(* algoritmo para a soma de 3 números; responsável:...; data:... *)
inicio(* digitar os dados *)leia (nr1)leia (nr2)leia (nr3)(* calcular os resultados *)soma nr1 + nr2 + nr3(* apresentar os resultados *)escreva (soma)
fim
Algoritmo sequencial na forma de fluxograma
inicio
Leia nr1, nr2, nr3
Soma nr1+nr2+nr3
Escreva soma
fim
30
Estrutura de controle sequencial
• Os comandos são executados na mesma ordem em que estão escritos: seqüencialmente de cima para baixo.
• O fluxo de execução estático (programação) e o fluxo de execução dinâmico (execução do algoritmo) são correspondentes.
31
Cálculo da média de muitas variáveis
• Problema: calcular a média das notas dos alunos da turma - há 45 alunos na turma
• EtapasPrepararDigitar as notasSomar as notasDividir a soma por 45Apresentar o resultado
Cálculo da média de muitas variáveis - detalhamento
// Problema: calcular a média de 45 notas// Solução: fazer um programa que auxilie na média de 45 notasalgoritmo media45a(* algoritmo para a média de 45 números; responsável:...; data:... *)inicio
(* digitar os dados *)leia (nota1)leia (nota2)leia (nota3)…Leia (nota45)(* calcular os resultados *)soma nota1 + nota2 + nota3 + … +nota45média soma/45(* apresentar os resultados *)escreva (média)
fim
33
Cálculo da média de muitas variáveis - problema
• Há 45 alunos na turma• Apenas com a estrutura seqüencial teria de
definir 45 variáveis e repetir 45 vezes o comando para ler
• Solução do problema:• Vamos alterar o soma3a para outra forma em
que necessite apenas de uma variável para a entrada de dados
34
Nova forma para a soma de três números acumulando os valores em uma variável
// Problema: somar três números// Solução: fazer um programa que auxilie na soma de três númerosalgoritmo soma3b(* algoritmo para a soma de 3 números; responsável:...; data:... *)inicio
soma 0 // acumuladorleia (número)soma soma + númeroleia (número)soma soma + númeroleia (número)soma soma + númeroescreva (soma)
fim
35
Atribuição• O comando soma soma + número é um comando chamado de
atribuição, onde calcula-se a expressão à direita da flecha, e atribui-se seu valor à variável à esquerda da flecha. Assim a mesma variável pode constar dos dois lados do comando de atribuição.
• Com essa nova forma foi possível utilizar apenas uma variável para a entrada de três valores numéricos.
• Há ainda um problema: necessitamos de 3 comandos de entrada de dados e atribuição para ler 3 valores e somá-los em uma variável. Como há sempre dois comandos que se repetem, podemos então utilizar um comando de repetição (iteração) para mandar repetir esses comandos o número de vezes que quizermos.
Estrutura de controle de iteração
• Um bloco de comandos é repetido• Deve haver uma condição para
interromper a repetição do bloco de comandos
• A condição pode ser verificada antes de cada repetição, ou após cada repetição
• Para bloco de comandos com vários comandos independentes há como definir explicitamente os comandos que compõem o bloco de repetição
37
Nova forma para a soma de três números com iteração
// Problema: somar três números// Solução: fazer um programa que auxilie na soma de três númerosalgoritmo soma3c(* algoritmo para a soma de 3 números; responsável:...; data:... *)inicio
(* preparar *)soma 0 // acumulador ou somatóriocontador 0 // variável de controle(* digitar os dados *)repita
contador contador + 1leia (número)soma soma + número
até que contador = 3(* apresentar os resultados *)escreva (soma)
fim
38
Calcular agora a média de 45 notas utilizando a iteração
// Problema: média de 45 notas// Solução: fazer um programa que auxilie no cálculo da média de 45 notas de alunosalgoritmo média45b(* algoritmo para calcular a média de 45 notas; responsável:...; data:... *)inicio
(* preparar *)soma 0 // soma dos números digitadoscontador 0 // variável de controle - contador(* digitar dos dados *)repita
contador contador + 1leia (número)soma soma + número
até que contador = 45(* calcular os resultados *)média soma/45(* apresentar os resultados *)escreva (média)
fim
inicio
fim
Soma <- 0Contador <- 0
Contadorcontador+1
Leia número
Somasoma+número
Média soma/45
Escreva média
Contador=45não
sim
40
Generalizar o programa para calcular a média de “n” notas
• Problema: Calcular a média de “n” notas• Solução: fazer um programa que auxilie
no cálculo da média de “n” notas de alunos: permitir que o usuário escolha a quantidade de notas e digite as “n” notas; calcular a média.
• Algoritmo:
Algoritmo média de “n” valores
Etapas
Preparar : escolher quantos são os valores – “n”
Digitar e acumular os “n” valoresCalcular a médiaApresentar o resultado
42
algoritmo médian(* algoritmo para calcular a média de n notas; responsável:...; data:...*)
inicio(* preparar *)soma 0 // soma das notascontador 0 // variável de controle(* Escolher quantos são os valores *)escreva (‘Informe a quantidade de notas’) (* para orientar o usuário no que ele deve fazer *)leia (quantidade)(* Digitar e acumular os “n” valores *)repita
contador contador + 1escreva (‘Informe a nota ‘, contador) (* para orientar o usuário no que ele deve fazer *)leia (número)soma soma + número
até que contador = quantidade(* Calcular a média e apresentar os resultados *)média soma/quantidadeescreva (média)
fim
Estrutura condicional
Problema: Verificar se um número inteiro positivo é primo
Solução: Fazer um programa que calcule se um número informado pelo usuário é primo.
Técnica: Testar se o número é divisível por algum número menor que ele.
Algoritmo testePrimo(* algoritmo para testar se um número é primo;
responsável: ...; data: ... *)
Iniciodivisor 1 // preparar o valor inicial do divisorePrimo verdadeiro // variável booleana iniciada em verdadeiroEscreva (‘Informe o número que deseja testar se é primo’)Leia (numero)(* Cálculo para verificar se é primo *)Enquanto divisor <= (numero div 2) faça
Iniciodivisor divisor +1Se resto numero/divisor = 0 então
inicioePrimo falso
fim; // o ponto e vírgula é apenas para chamar a atenção para o fim do sefim
(* apresentar o resultado *)Se ePrimo então
inicioescreva (‘O número ‘,numero,’ é primo’)
fimSenão
inicioescreva (‘O número ‘, numero,’não é primo’)
fimfim
inicio
fim
Dividor 1ePrimo verdadeiro
Divisor divisor + 1
Leia número
Escreva Não é primo
ePrimo falso
Escreva É primo
Divisor <=numero/2
nãosim
Resto numer/divisor = 0
ePrimo
sim
sim
não
não
Estrutura condicional
• Há uma condição de controle• Há dois blocos de comandos• A condição é avaliada:
– Verdadeira: é executado um bloco de comandos
– Falsa: é executado o outro bloco de comandos
– Nos dois casos o algoritmo continua após o fim do comando “se”
• O bloco de comandos para a avaliação falsa pode ser optativo
47
Estrutura condicional: outro exemplo
• Problema: Calcular a altura média dos homens e das mulheres de uma população
• Solução: fazer um programa que auxilie no cálculo da altura média de homens e mulheres de uma população – para cada pessoa digitar se é homem ou mulher e sua altura; terminar a entrada de dados perguntando após cada entrada de dados se há mais pessoas.
Algoritmo:
algoritmo alturas(* algoritmo para calcular a altura média de homens e mulheres; responsável:...; data:... *)
48
inicio(* Preparar *)somaAltHomens, somaAltMulheres, qtdHomens, qtdMulheres 0 // preparar totalizadores(* Digitar os dados *)repita
escreva (‘Informe o gênero m ou f e a altura’) // para orientar o usuárioleia (gênero, altura)se gênero = ‘m’ então
iníciosomaAltHomens somaAltHomens + alturaqtdHomens qtdHomens + 1
fimSenão
iniciose gênero = ‘f’ então
IníciosomaAltMulheres somaAltMulheres + alturaqtdMulheres qtdMulheres + 1
Fimsenão escreva (‘gênero indevido: deve ser m ou f’)
fimescreva (‘Informe se terminaram os dados s ou n:’)leia (resposta)
até que resposta = ‘s’(* Calcular os resultados *)alturaMédiaHomens somaAltHomens/qtdHomensalturaMédiaMulheres somaAltMulheres/qtdMulheres(* Apresentar os resultados *)escreva (‘A altura média dos homens é: ‘, alturaMédiaHomens)escreva (‘A altura média das mulheres é: ‘, alturaMédiaMulheres)
fim
inicio
fim
Leia (altura, gênero)
Escreva Continuar ‘s’ ou ‘n’
alturaM alturaM + altura
Leia resposta
qtdH qtdH + 1
Calcular e apresentaras médias
Resposta = ‘s’
nãosim
Genero=‘m’ alturaH alturaH + alturasim não
qtdM qtdM + 1
Cuidado: há uma diferença do algoritmo anteriorCuidado: há uma
diferença do algoritmo anterior
50
Iteração com variável incrementada
// Problema: Encontrar os divisores de um número inteiro positivo maior que 1// Solução: Fazer um programa que apresente os divisores de um número inteiro maior que 1// Algoritmo:algoritmo divisores(* algoritmo para apresentar os divisores de um número maior que 1; responsável: ...; data:... *)inicio
(* Preparar *)escreva (‘Informe o número para o cálculo de seus divisores’)leia (numeroTeste)(* Percorrer os números de 2 a (númeroTeste div 2) testando quais são os divisores *)para divisor variando de 2 a (numeroTeste div 2) faça
Inicio // poderia não ter usado inicio e fim
se resto (numeroTeste div divisor) = 0 então
inicio
escreva (‘O número ‘, divisor, ‘é um divisor de ‘, numeroTeste)
fim; // veja o ponto e vírgula para o fim do se – não há o “senão”
fimfim
51
Iteração embutida
• Problema: Encontrar os números perfeitos até um número “n” inteiro e maior que 2
• Solução: Fazer um programa que calcule os números perfeitos até “n”, sendo que “n” pode variar de 2 a 32.000
• Algoritmo: • algoritmo numeroPerfeito• (* algoritmo para o cálculo dos números
perfeitos até o limite informado; responsável:......; data:.... *)
52
Inicio escreva ('Informe o limite para o cálculo dos números perfeitos')//preparaçãoleia (limite) // inteiro maior do que 2para numero variando de 2 a limite faça // gerar os númerosinicio
somaDivisores 1 // iniciar a soma dos divisores com 1para divisor variando de 2 a numero div 2 faça // gerar divisores
Iniciose resto numero div divisor = 0 então // testar se é divisor
iniciosomaDivisores = somaDivisores + divisor
fim;fim
se somaDivisores = numero então // testar se é perfeitoinicio
escreva ('O número ', numero, 'é um número perfeito')fim;
fimfim
53
• Problema: Calcular o valor de ex com erro menor do que 0,00001 e utilizando a série:
• ex = x0 + x1/1! + x2/2! + x3/3! + ...• Solução: Analisar a série.• Para x>1 os valores dos termos aumentam até
um limite, e depois decrescem monotonamente.• Para x<1 os valores dos termos da série
decrescem monotonamente.• A partir do termo com valor menor que o erro
permitido, todos os demais terão valores inferiores ao erro, e pode-se, de forma simplificada, desprezá-los.
Cálculo numérico de ex através do somatório de termos de uma série
54
Continuação do cálculo de ex
• Analisar a série: se dado um termo pudermos calcular o seguinte, temos a lei de formação dos termos da série, e podemos fazer uma iteração gerando e somando os termos da série, até que um termo seja menor que o erro.
• Algoritmo:• algoritmo serieex• (* algoritmo para o cálculo de ex;
responsável:...; data:...;*)
55
inicioescreva ('informe o valor de x')leia (x)numerador, denominador, somaTermos 1n <- 0repita
numerador numerador * x // gera numeradorn <- n + 1denominador denominador * n // gera denominadortermo numerador/denominador // calcula termosomaTermos somaTermos + termo // acumula termo
até que termo < 0,00001 // testa precisãoescreva ('O valor de e elevado a ', x, ' é ', somaTermos)
fim
56
Variáveis• Variáveis permitem manipular dados
– Ex.: idade, dataNascimento, total• Tipo: especifica os valores a que uma
variável pode estar associada– Ex.: inteiro, real, booleano, literal,
caractere• Tipo estático: o tipo é associado a uma
variável e não pode mais ser trocado• Tipo dinâmico: o tipo da variável pode
variar durante a execução do programa• Tipo explícito: o tipo da variável é
declarado explicitamente
57
Tipos primitivos comuns
• Inteiro: conjunto dos números inteiros• Real: conjunto dos números reais• Lógico (booleano): falso ou verdadeiro• Caractere: um caractere qualquer• Literal (string): uma cadeia de caracteres
58
Identificador da variável
• Nomeia uma variável• Em geral pode ser composto por letras e
dígitos numéricos• Deve dar uma idéia do conteúdo da variável• Estética java:
– todas letras minúsculas; quando o identificador é composto pela concatenação de palavras, a primeira letra de cada palavra a partir da segunda é escrita em maiúsculas.
• Ex.: dataNascimento; totalAlturaMulheres; totalSaldo; contador; temperaturaMaxima
59
Constantes
• Dado que não muda de valor• Exemplos:
– Inteiro: 5– Real: 3,4– Literal: 'Imutável'
• Declaração:– Exemplo: Pi = 3,1416
60
Operadores mais comuns
• Aritméticos: + - * / div mod• Relacionais: = > < >= <= <>• Lógicos: e ou não
61
Tabela verdade
A B A ou B A e B
F F F F
F V V F
V F V F
V V V V