92
EEL170 COMPUTAÇÃO I www.del.ufrj.br/~ac/eel170.htm Antonio Cláudio Gómez de Sousa [email protected] 2a série de slides Versão 19/03/2012

EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa [email protected] 2a série de slides Versão 19/03/2012

Embed Size (px)

Citation preview

Page 1: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

EEL170 COMPUTAÇÃO I www.del.ufrj.br/~ac/eel170.htm

Antonio Cláudio Gómez de [email protected]

2a série de slidesVersão 19/03/2012

Page 2: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

2

Programação Estruturada

Utiliza somente as estruturas de controle: Sequencial Iterativa Condicional

Page 3: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

3

Pascal

Linguagem de programação: Estruturada De alto nível Fortemente tipificada Permite modularização Refinamento etapa por etapa Escopo de variáveis global e local Alocação estática e dinâmica de memória Orientação a objetos

Page 4: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

4

Estrutura de um programa em Pascal

program <identificador>; uses <lista de identificadores de units>; // declarações de utilização de bibliotecas const //declarações para definição de constantes <identificador> = <valor>; // exemplo de declaração de constante type //declarações de tipos <identificador> = <declaração de tipo>; // exemplo de declaração de tipo var //declarações de variáveis <identificador> : <tipo>; // exemplo de declaração de variável procedure <identificador> (<parâmetros>); // declarações de procedimentos function <identificador> (<parâmetros>) :tipo; // declarações de funções begin <comandos>; // comandos do módulo principal end.

Page 5: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

5

Principais comandos em Pascal: Atribuição // <identificador> <expressão algébrica>; if <condição> then

<comando> [else <comando>];

case <seletor> of <valor do seletor>>: <comando>; ...

end repeat

<comandos>; until <condição>; while <condição> do

<comando>; for <identificador> := <valor> to | downto <valor> do

<comando>; comandos de entrada e saida

Page 6: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

6

Regras para uma programação com qualidade

Colocar um comentário no início dos programas com seu objetivo, responsável e data

Colocar um comentário no início de cada módulo com sua finalidade e separar visualmente os módulos

Comentar Dentear/identar os comandos controlados por repita, para, enquanto,

caso, se-então-senão Utilizar identificador que lembre a semântica do conteúdo da variável ou

finalidade do procedimento – estética Java: identificador em minúsculas e maiúsculas só no início das palavras que o compõem, a partir da segunda palavra

Exemplos: dataDia, somaNotas, totalAlturasHomens Não alterar uma variável controlada por for dentro da iteração Usar for quando o escopo da variável de controle é conhecido Não usar variáveis booleanas desnecessárias

Page 7: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

7

Modularização

Dividir para vencer Para resolver programas complexos

Separá-los em programas menores - módulos ou subprogramas

Algoritmos subalgoritmos ou módulos Subalgoritmo

Módulo projetado para executar uma tarefa específica

Partes de algoritmos que se repetem: Colocados em um módulo e chamados quantas vezes for

necessário de diferentes partes

Page 8: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

8

Algoritmo complexo - método de refinamento etapa por etapa

• Desenvolver o algoritmo em alto nível de abstração criando subalgoritmos para resolver problemas específicos

• Cada subalgoritmo pode ser separado em outros subalgoritmos em níveis de abstração mais baixos

• Parar quando chegar a subalgoritmos com baixa complexidade

• Subalgoritmos módulos• Cada módulo pode ser programado e testado

de forma independente

Page 9: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

Exemplo – ordenar tres variáveis

Ordenar tres variáveis utilizando um módulo que ordena duas variáveis:

InícioLer as variáveis a, b, cOrdena a b // módulo devolve ab ordenadoOrdena b c // módulo devolve ab ordenadoOrdena a b // módulo devolve ab ordenadoApresentar as variáveis a, b, cfim

Page 10: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

Diagrama de estrutura

Módulo principal

ordena

Passa dois valores Retornam dois valores

Page 11: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

Algoritmo simplificadoInicio // módulo principal

Leia a,b,c

Ordena a,b // passa a,b e recebe ordenados

Ordena b,c // passa b,c e recebe ordenados

Ordena a,b // passa a,b e recebe ordenados

Escreva a,b,c

Fim // módulo principal

// --------------------------------------------------------------------------------------------

Ordena x,y // módulo ordena

Inicio

Se a> b então

inicio

Aux a

A b

B aux

fim

Fim // módulo ordena

Page 12: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

Algoritmo simplesInicio // módulo principal com tres variáveis globais

Leia a,b,c

Ordena a,b // passa a,b e recebe ordenados – parâmetros atuais ou reais

Ordena b,c // passa b,c e recebe ordenados – parâmetros atuais ou reais

Ordena a,b // passa a,b e recebe ordenados – parâmetros atuais ou reais

Escreva a,b,c

Fim // módulo principal

// --------------------------------------------------------------------------------------------

Ordena x,y // módulo ordena com dois partâmetros formais e uma variável local

Inicio

Se a> b então

inicio

Aux a

A b

B aux

fim

Fim // módulo ordena

Page 13: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

• A modularização do programa pode ser feita através de procedimentos ou funções

• Os procedimentos ou funções são módulos, ou sub-programas, que programamos e podem ser “chamados” de vários pontos do algoritmo

• Procedimentos: podem receber e devolver vários parâmetros

• Funções: podem receber vários parâmetros mas devolvem um valor - como uma função matemática – tem tipo

Page 14: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

14

Procedimento

• Quando chamamos um procedimento podemos passar dados para o procedimento e receber dados do procedimento, através de parâmetros que são passados entre o módulo chamador e o módulo chamado

• Exemplo: vamos fazer um algoritmo que permite digitar dois valores e calcular sua média

• A média será calculada em um procedimento que definimos no algoritmo

• Um módulo do algoritmo deverá passar os dois valores para o procedimento e o parâmetro para o resultado, e o procedimento devolverá a média calculada no parâmetro do resultado.

Page 15: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

15

algoritmo calcularMédia

(*algoritmo para calcular a média de dois pares de dados com um procedimento*)

Var

dado1, dado2, dado3, dado4, media: real // variáveis globais

// definição do procedimento

procedimento calcMed(x,y:real; var med:real)

// x,y passagem por valor – med passagem por referência

inicio

med (x + y)/2 // o retorno é pelo parâmetro passado por referência

fim

inicio // início do módulo principal

leia (dado1,dado2); // orientar e validar

calcMed(dado1,dado2,media) // chamada do procedimento

escreva(‘A média é ‘,media)

Leia (dado3, dado4); // orientar e validar

calcMed(dado3,dado4,media) // chamada do procedimento

escreva(‘A média é ‘,media)

fim

Page 16: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

16

Estrutura modular

A estrutura modular do algoritmo apresenta o módulo principal, o procedimento e duas setas indicando que há parâmetros nos dois sentidos

calcularMedia

calcMed

x,y,med med

Med: Passagem por referênciax,y: Passagem por valor

Page 17: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

17

Função

• Quando chamamos uma função podemos passar dados para a função por meio dos parâmetros, e receber o resultado calculado pela função

• Exemplo: vamos fazer um algoritmo que permite digitar dois valores e calcular sua média

• A média será calculada em uma função que definimos no algoritmo

• Um módulo do algoritmo deverá passar os dois valores para a função, e a função devolverá a média calculada.

Page 18: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

18

algoritmo calcularMédia

(*algoritmo para calcular a média de dois pares de dados com uma função*)

Var

dado1, dado2, dado3, dado4, media: real

// definição da função

função calcMed(x,y:real):real // a função tem tipo

inicio

calcMed (x + y)/2

fim

inicio // início do módulo principal

leia (dado1,dado2); // orientar e validar

media calcMed(dado1,dado2) // chamada da função

escreva(‘A média é ‘,media)

leia (dado3,dado4); // orientar e validar

escreva(‘A média é ‘, calcMed(dado3,dado4) // chamada da função

fim

Page 19: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

19

Estrutura modular

A estrutura modular do algoritmo apresenta o módulo principal, o procedimento e duas setas indicando que há parâmetros nos dois sentidos

calcularMedia

calcMed

x,y CalcMed

Page 20: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

20

Algoritmos

Estruturas de dados

Page 21: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

21

Estrutura de dados homogênea

Problema: Após ler as notas dos alunos de uma turma (uma nota por aluno), calcular a média e quantos alunos ficaram com nota acima da média.

Este problema tem uma dificuldade: em uma primeira etapa digita-se as notas de todos os alunos; em uma segunda etapa calcula-se a média, e só então em uma terceira etapa pode-se comparar a média com a nota de cada aluno, para verificar quantos ficaram com a nota acima da média. Isso exige redigitar todas as notas da primeira etapa ou guardar todas as notas de maneira que se possa recuperá-las. A segunda possibilidade é a melhor.

Page 22: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

22

Estrutura de dados homogênea

No ensino médio foi vista uma estrutura de dados que permite guardar vários valores de uma variável: a matriz.

Matriz: estrutura de dados homogênea - permite múltiplos valores de um mesmo tipo, por isso é dita homogênea.

Exemplo: uma matriz com números inteiros – em cada elemento da matriz podemos ter um número inteiro.

Dimensão: a matriz pode ter uma, duas três ou n dimensões.

Para acessar um elemento da matriz temos de saber quantas dimensões ela tem, e o índice para cada dimensão.

Page 23: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

23

Elementos de uma matriz com uma dimensão com 5 elementos – um índice

Matriz a

[ a1 a2 a3 a4 a5 ]

Page 24: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

24

Matriz em linguagens de computação

As linguagens de computação geralmente tem uma estrutura de matrizes, ou comandos que permitem manipular dados como matrizes.

Uma matriz de uma dimensão também é chamada de vetor

Como se define uma matriz em LEA: <identificador>: matriz [<dimensão1>,...,<dimensãon>]: <tipo>

<dimensão> := <valor inicial>,<valor final>

Exemplo: notas: matriz [1..45] de real; Matriz de uma dimensão com 45 elementos reais.

Exemplo: temperaturas: matriz [1..31, 1..24] de real; Matriz com duas dimensões com 31 e 24 elementos respectivamente nas dimensões

Page 25: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

25

Sintaxe das matrizes em Pascal

<identificador> : array [<dimensão1>,...,<dimensãon>]: <tipo>

<dimensão> := <valor inicial>,<valor final> Exemplo: notas: array [1..45] of real;

Matriz de uma dimensão com 45 elementos reais.

Exemplo: temperaturas: array [1..31, 1..24] of real; Matriz com duas dimensões com 31 e 24 elementos respectivamente nas

dimensões.

Page 26: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

26

Voltando ao nosso problema

Problema: Após ler as notas dos alunos de uma turma (uma nota por aluno), calcular a média e quantos alunos ficaram com nota acima da média.

Solução: Fazer um programa que permita informar as notas, guardando-as em uma matriz, calcular a média e depois comparar essa média com cada nota, contando as que estão acima da média.

Algoritmo: algoritmo mediaAcima; (* algoritmo para calcular a média das notas de alunos

e quantos estão acima da média; responsável:...; data:...*)

Page 27: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

27

var

notas: matriz [1..45] de real

inicio

somaNotas, notasAcima 0

para aluno variando de 1 a 45 faça

inicio

escreva (‘Informe a nota do aluno ‘, aluno)

leia (notaAluno) (* testar *)

notas [aluno] notaAluno

somaNotas somaNotas + notaAluno

fim

mediaNotas somaNotas / 45

para aluno variando de 1 a 45 faça

inicio

se notas [aluno] > mediaNotas então

notasAcima notasAcima + 1

fim

escreva (‘A média dos alunos é ‘,mediaNotas, ‘ e há ‘, notasAcima, ‘alunos com nota acima da média’)

fim.

Page 28: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

28

Programa em Pascal

program mediaAcima; (* programa para calcular a média das notas de

alunos e quantos estão acima da média; responsável:...; data:...*)

Page 29: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

29

var

notas: array [1..45] of real;

somaNotas, notaAluno, mediaNotas: real;

aluno, notasAcima: integer;

begin

somaNotas := 0; // iniciar somatório

notasAcima := 0; // iniciar somatório

for aluno := 1 to 45 do // para controlar a entrada de dados de 45 alunos

begin

writeln (‘Informe a nota do aluno ‘, aluno:2);

readln (notaAluno);

notas [aluno] := notaAluno;

somaNotas := somaNotas + notaAluno;

end;

mediaNotas := somaNotas / 45;

for aluno := 1 to 45 do // para comparar a nota de cada aluno com a média geral

if notas [aluno] > mediaNotas then

notasAcima := notasAcima + 1;

writeln (‘A média dos alunos é ‘,mediaNotas:4:1, ‘ e há ‘, notasAcima:2, ‘alunos com nota acima da média’);

end.

Page 30: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

30

Ordenar elementos em uma estrutura linear

Problema: Ordenar nomes em uma matriz. Solução: Fazer um programa que permita

digitar 10 nomes, ordená-los e apresentar os nomes desordenados e ordenados.

Algoritmo: Algoritmo ordenaNomes (* algoritmo para ordenar nomes em uma lista

linear; responsável: ...; data: ...*)

Page 31: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

31

Var

nomeInicial, nomeOrdenado: matriz[1..10] de literal

Inicio

para indice variando de 1 a 10 faça

inicio

escreva(‘Informe o nome ‘,índice)

leia (nomeInicial[índice]) (* testar *)

fim

// copiar os dados para a estrutura que será ordenada

para índice variando de 1 a 10 faça

nomeOrdenado[índice] nomeInicial[índice]

Page 32: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

32

(* algoritmo do bubble sort *)

para contador variando de 9 a 1 faça

inicio

para indice variando de 1 a contador faça

inicio

se nomeOrdenado[indice] > nomeOrdenado[indice+1] então

inícioauxiliar nomeOrdenado[índice]nomeOrdenado[índice] nomeOrdenado[índice+1]nomeOrdenado[índice+1] auxilir

fim

fim

fim

Page 33: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

33

{ apresentar os dados não ordenados e ordenados}

escreva (‘Nomes antes da ordenação:’)

para índice variando de 1 a 10 faça

inicio

escreva(nomeInicial[índice]) // na mesma linha

fim

escreva (‘Nomes após a ordenação:’)

para índice variando de 1 a 10 faça

inicio

escreva(nomeOrdenado[índice]) // na mesma linha

fim

fim

Page 34: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

34

Calcular o determinante de uma matriz 3x3

Problema: calcular o determinante de uma matriz 3x3.

Solução: fazer um programa que: Permita digitar os dados de uma matriz 3x3; Calcule seu determinante; usar uma matriz 5x3

para repetir as linhas 1 e 2 em 4 e 5 e facilitar o cálculo do determinante;

Apresente a matriz em sua forma matricial; Apresente o valor de seu determinante.

Algoritmo:

Page 35: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

35

algoritmo determinante3x3

(* algoritmo para o cálculo do determinante de uma matriz 3x3; responsável:...; data:...*)

var

dados: matriz[1..5,1..3] de real

Inicio

para linha variando de 1 a 3 faça // entrada de dadosinicio

para coluna variando de 1 a 3 faça // entrada dadosinicio

escreva (‘Informe o valor do elemento ‘,linha,’, ‘,coluna)

leia (dados[linha,coluna])

Fim

fim

Page 36: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

36

// cálculo do determinante

// copiar as linhas 1 e 2 para as linhas 4 e 5

para linha variando de 1 a 2 faça

iniciopara coluna variando de 1 a 3 faça

iniciodados[linha+3,coluna] dados [linha,coluna]

fim

fim

Page 37: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

//cálculo do determinante

determinante 0

para indice variando de 1 a 3 façainicio

determinante determinante + dados[indice+0,1]*dados[indice+1,2]*

dados[indice+2,3]

determinante determinante -dados[indice+0,3]*dados[indice+1,2]*

dados[indice+2,1]

fim

Page 38: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

38

// apresentar a matriz em forma matricial

escreva(‘a matriz é:’)

para linha variando de 1 a 3 faça

inicio

para coluna variando de 1 a 3 faça

inicio

escreva( dados[linha,coluna])

fim

pule uma linha

fim

escreva(‘O determinante da matriz vale ’, determinante)

fim

Page 39: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

39

Estrutura de dados heterogênea

Problema: manter os dados de uma DVDteca domiciliar. Para cada CD manter: Título Intérprete Autor Duração em minutos

Estes dados são heterogêneos Necessitamos de novo tipo de estrutura de

dados

Page 40: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

40

Estrutura: variável heterogênea

A estrutura permite definir dados heterogêneos em uma variável estruturada, através da composição da variável

Exemplo de variável heterogênea: Var Dvd: estrutura título: literal // início da definição .......................intérprete: literal .......................autor: literal .......................duração:real .......................fim // término da definição

Page 41: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

41

Como acessar cada elemento de uma variável heterogênea

Cada elemento de uma variável heterogênea é acessado pelo identificador da variável seguido de ponto (.) e do identificador do elemento

Exemplo: leia (dvd.titulo) escreva (dvd.titulo)

Page 42: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

42

Guardar os dados em uma variável estruturada

algoritmo dvdTeca1

(* algoritmo para ler e guardar os dados de um dvd; responsável:... ; data:... *)

Var

dvd: estrutura título: literal // início da definição

.......................intérprete: literal

.......................autor: literal

.......................duração:real

.......................fim // término da definição do registro

Inicio

leia (dvd.titulo, dvd.interprete, dvd.autor, dvd.duração) // orientar testar

escreva (dvd.titulo, dvd.interprete, dvd.autor, dvd.duração)

fim

Page 43: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

43

Retornando ao problema da DVDTeca

A solução não resolve o problema: permite armazenar os dados apenas de um DVD

Para armazenar os dados de vários DVDs a solução será utilizar uma matriz unidimensional de estruturas

Em cada posição da matriz haverá uma estrutura com seus elementos constitutivos

Page 44: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

44

Algoritmo dvdTeca2

(* algoritmo para manter os dados de dez DVDs; responsável: ... ; data: ... *)

Tipo // declaração de tipos de variáveis

tRegDvd = estrutura título: literal

............................ ....intérprete: literal

............................ ....autor: literal

............................ ....duração:real

............................. ...fim

Var // declaração das variáveis estruturadas

dvd: matriz[1..10] de tRegDvd

Page 45: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

45

Inicio

para índice variando de 1 a 10 faça

Início

escreva(‘Informe o título, intérprete, autor e duração do DVD ‘,índice)

Leia(dvd[índice].título, dvd[índice].intérprete, dvd[índice].autor, dvd[índice].duração) (* testar *)

fim

// apresentação dos dados

para índice variando de 1 a 10 façaescreva(dvd[índice].título, dvd[índice].intérprete, dvd[índice].autor,

dvd[índice].duração)

fim

Page 46: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

46

Menu

O algoritmo anterior não dá flexibilidade ao usuário. Muitas vezes é necessário oferecer opções, e o usuário escolher a cada momento a opção mais adequada.

Page 47: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

47

DVDteca com menu

Problema: para o problema anterior, oferecer ao usuário as opções: Incluir um DVD Listar todos os DVDs Consultar um DVD pelo título

Solução: fazer um programa que permita ao usuário, de forma interativa, escolher uma das opções até que o usuário escolha sair do programa.

Page 48: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

48

Algoritmo dvdTeca3

(* algoritmo para incluir, listar e consultar os dados de dvd; responsável:... ; data:... *)

Tipo // declaração de tipos de variáveis

tRegDvd = estrutura título: literal

.................................intérprete: literal

.................................autor: literal

.................................duração:real

.................................fim

Var // declaração das variáveis estruturadas

dvd: matriz[1..10] de tRegDvd

Page 49: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

49

Inicio

// preparar - para iniciar a primeira posição livre

primeiraPosLivre 1

repita // apresentação do menu

escreva(‘digite 1 para incluir os dados de um DVD’)

escreva(‘digite 2 para listar os dados de todos os DVDs’)

escreva(‘digite 3 para consultar os dados de um DVD por seu título’)

escreva(‘digite 4 para sair do programa’)

leia opção

Page 50: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

50

Caso opção seja

1: inicio // incluir um DVDescreva(‘Informe o título, intérprete, autor e duração do DVD ‘)

leia(dvd[primeiraPosLivre].título, dvd[primeiraPosLivre].intérprete, dvd[primeiraPosLivre].autor, dvd[primeiraPosLivre].duração) //testar

primeiraPosLivre primeiraPosLivre + 1

fim

2: inicio // listar todos os DVDspara índice variando de 1 a primeiraPosLivre - 1 faça

inicioescreva(dvd[índice].título, dvd[índice].intérprete, dvd[indice].autor, dvd[indice].duração)

fim

fim

Page 51: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

51

3: inicio // para consultar um DVD escreva(‘Informe o título do DVD que procura’) leia(titu) Índice 1 enquanto (titu <> dvd[índice].titulo) e (indice < primeiraPosLivre) faça

Ínicio Índice Índice + 1 fim

se índice < primeiraPosLivre então

escreva(‘Os dados do DVD são: ‘, dvd[índice].título, dvd[índice].intérprete, dvd[índice].autor, dvd[índice].duração)

senão escreva(‘Não há DVD com esse título’)

Fim Fim // fim do caso do menu

até que opção = 4 fim

Page 52: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

52

Estrutura de algoritmo com menu

Algoritmo ...

// prólogo

// declarações de constantes, tipos e variáveis

Início

// preparar

Repita

apresentar opções do menu

usuário escolhe uma opção

caso opcao seja

(<escalar>: <bloco de comandos>)*

fim // fim do caso

Ate que opcao tenha sido encerrar o menu

// parte final do algoritmo

fim

Page 53: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

Modularização

• Exemplo com matrizes

Page 54: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

54

Problema: Realizar operações com matrizes e apresentar os resultados na forma matricial

Solução: Fazer um programa que permita realizar operações com matrizes quadradas de 2X2 até 10X10, e ofereça interativamente as opções: 1 - Digitar os dados da primeira matriz 2 – Digitar os dados da segunda matriz 3 - Somar as matrizes 4 - Subtrair a segunda da primeira 5 - Multiplicar as matrizes 6 - Achar a transposta da primeira 7 – Sair do programa

Page 55: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

55

algoritmo operaMatriz (* algoritmo para realizar operações sobre matrizes quadradas;

responsável:...; data:... *) tipo // declaração de tipos

– tipmat = matriz[1..10,1..10] de real var

mat1, mat2, matResult: tipmat inicio repita // escolha da quantidade de elementos

escreva (‘Informe a quantidade de elementos nas linhas e colunas – deve variar de 2 a 10’)

• leia (qtd)• se (qtd < 2) ou qtd > 10 então escreva (‘Valor fora do escopo – repita’)

até que (qtd >= 2) e (qtd <= 10)

Page 56: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

56

Repita // início do menu

escreva (‘Digite 1 para informar os dados da primeira matriz’)

escreva (‘Digite 2 para informar os dados da segunda matriz’)

escreva (‘Digite 3 para somar as matrizes’)

escreva (‘Digite 4 para subtrair a segunda da primeira’)

escreva (‘Digite 5 para multiplicar as matrizes’)

escreva (‘Digite 6 para achar a transposta da primeira’)

escreva (‘Digite 7 para sair do programa’)

leia (opcao)

Page 57: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

57

caso opcao seja // para testar as várias opções

1: início // para incluir os dados na 1a matriz

• para linha variando de 1 a qtd faça

– para coluna variando de 1 a qtd faça

• inicio

• (* orientar o usuário*)

• leia (mat1[linha,coluna])

• fim

• (* apresentar a mat1 em forma matricial *)

fim // fim do caso 1

2: início // para incluir os dados na 2a matriz

• para linha variando de 1 a qtd faça

– para coluna variando de 1 a qtd faça

• inicio

• (* orientar o usuário*)

• leia (mat2[linha,coluna])

• fim

• (* apresentar a mat2 em forma matricial *)

fim // fim do caso 2

Page 58: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

58

3: inicio // para somar as duas matrizes• para linha variando de 1 a qtd faça

– para coluna variando de 1 a qtd faça• matResult[linha,coluna]

mat1[linha,coluna] + mat2[linha,coluna]• (* apresentar matriz result *)

Fim // fim do caso 34: inicio // para subtrair a segunda da primeira• para linha variando de 1 a qtd faça

– para coluna variando de 1 a qtd faça• matResult[linha,coluna]

mat1[linha,coluna] - mat2[linha,coluna](* apresentar matriz result *)fim // fim do caso 4

Page 59: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

59

5: início // para multiplicar as duas raízes

..................

..................

(* apresentar a matResult *)

fim // fim do caso 5

6: início // para calcular a transposta da primeira

para linha variando de 1 a qtd façapara coluna variando de 1 a qtd faça

matResult[linha,coluna] mat1[coluna,linha](* apresentar a matResult *)

fim // fim do caso 6

Fim // fim do caso

até que opcao = 7

fim // fim do algoritmo

Page 60: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

60

Observações sobre o algoritmo

• As entradas de dados para a 1a e 2a matrizes são iguais, muda somente a matriz destino das informações: fazer um só procedimento para os dois casos

• Após cada caso deve-se apresentar a matriz resultante, que pode ser mat1, mat2 ou matresult, mas são procedimentos idênticos: fazer um só procedimento para todos os casos

• O algoritmo ficou muito longo, o que dificulta perceber sua lógica: quebrar o algoritmo em partes menores

Page 61: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

61

Modularização do problema de operações com matrizes

• Um módulo principal que apresente a lógica geral do programa: esse módulo deve permitir que o usuário escolha a quantidade de elementos de cada dimensão, e a seguir deve permitir que o usuário escolha uma opção até que o usuário escolha sair do programa. Para cada escolha, o módulo principal chama um outro módulo que implementa a opção selecionada.

– Refinamento etapa por etapa

• Um módulo para a entrada de dados para as duas matrizes

• Um módulo para apresentar os dados das matrizes no formato matricial

Page 62: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

62

Algoritmo operaMatriz

(* algoritmo modularizado para realizar operações sobre matrizes quadradas; responsável:...; data:... *)

tipo // declaração de tipos

• tipMat = matriz[1..10,1..10] de real

var

qtd: inteiro• mat1, mat2, matResult: tipMat

Page 63: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

63

inicio

proQtd (qtd) (* escolher quantidade elementos *)

Repita

Opção proMenu (* função menu e escolha da opção *)Caso opcao seja

1: proDigDados (mat1, qtd)2: proDigDados (mat2, qtd)3: proSoSub (mat1, mat2, matResult, qtd, 1)4: proSoSub (mat1, mat2, matResult, qtd, -1)5: proMultiplicar (mat1, mat2, matResult, qtd)6: proTransposta (mat1,matResult, qtd)

Fimaté que opcao = 7

fim.

Page 64: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

64

procedimento proQtd (var qt: inteiro)

(* procedimento para escolher a quantidade de elementos em cada dimensão da matriz *)

inicio

repita

– escreva (‘Informe a quantidade de elementos nas linhas e colunas – deve variar de 2 a 10’)

– leia (qt)– se (qt < 2) ou qt > 10– então escreva (‘Valor fora do escopo – repita’)

até que (qt >= 2) e (qt <= 10)

fim

Page 65: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

65

função proMenu (): inteiro(* função para apresentar o menu e optar*)Var op: inteiroIniciorepita

escreva (‘Digite 1 para informar os dados da primeira matriz’)escreva (‘Digite 2 para informar os dados da segunda matriz’)escreva (‘Digite 3 para somar as matrizes’)escreva (‘Digite 4 para subtrair a segunda da primeira’)escreva (‘Digite 5 para multiplicar as matrizes’)escreva (‘Digite 6 para achar a transposta da primeira’)escreva (‘Digite 7 para sair do programa’)leia (op)Se (op < 1) ou (op > 7) então escreva(‘Opção inválida. Refaça’)

Até que (op >= 1) e (op <= 7)ProMenu ← opfim

Page 66: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

66

procedimento proDigDados (var matDig: tipMat; qtDig: inteiro)

(* procedimento para digitar os dados *)varlin, col: inteiroiniciopara lin variando de 1 a qtDig faça

para col variando de 1 a qtDig faça(* orientar *)leia (matDig[lin,col])

proListarMat (matDig, qtDig)fim

Page 67: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

67

procedimento proSoSub (mat1SS, mat2SS: tipMat; var matRSS:tipMat; qtdSS, sinal: inteiro)

(*procedimento para somar e subtrair matrizes *)

var

liSS, coSS: inteiro

inicio

para liSS variando de 1 a qtdSS façapara coSS variando de 1 a qtdSS faça

matRSS[liSS,coSS] mat1SS[liSS,coSS] + (sinal * mat2SS[liSS,coSS])

proListarMat (matRSS, qtdSS)

fim

Page 68: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

68

procedimento proMultiplicar (mat1M, mat2M: tipMat; var matRM:tipMat; qtdM: inteiro)

(*procedimento para multiplicar matrizes *)varliM, coM, indice: inteiroiniciopara liM variando de 1 a qtdM faça

iniciopara coM variando de 1 a qtdM faça

inicioMatRM[liM,coM] 0

Para indice variando de 1 a qtdM façamatRM[liM,coM] matRM[liM,coM] + mat1M[liM,indice]

* mat2M[indice,coM])Fim

fim

proListarMat (matRM, qtdM)fim

Page 69: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

69

procedimento proTransposta (matT: tipMat; var matR:tipMat; qtdT: inteiro)

(*procedimento para achar a transposta da 1a *)

var

liT, coT: inteiro

inicio

para liT variando de 1 a qtdT façapara coT variando de 1 a qtdT faça

matR[liT,coT] matT[coT,liT]

proListarMat (matRSS, qtdSS)

fim

Page 70: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

70

procedimento proListar (matLis: tipMat; qtdLis: inteiro)

(*procedimento para listar a matriz em forma matricial *)

var

liLis, coLis: inteiro

inicio

para liLis variando de 1 a qtdLis faça

inicio

para coLis variando de 1 a qtdLis façaEscreva (matLis[liLis,coLis] (* Pule uma linha *)

fim

fim

Page 71: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

71

opcao

operaMatriz

proQTD

proListarMat

proDigDados proSoSub proMultiplicar proTransposta

Page 72: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

72

Tratamento de erro

As linguagens verificam a ocorrência de erros em tempo de execução, e executam suas rotinas de tratamento de erro.

Algumas linguagens permitem que o usuário desabilite a rotina padrão de tratamento de erro e faça sua própria rotina de tratamento de erro.

Ao terminar de executar um comando de entrada ou saída de dados, sempre é gerado um código de erro, que será zero se não houve erro, e diferente de zero se houve erro, e esse valor será o código de erro

Page 73: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

73

Tratamento de erro padrão em E/S

Exemplo para comando de leitura de teclado: leia (variável) // pode ser mais de uma variável Rotina da linguagem verifica o que foi solicitado e habilita o teclado Usuário digita no teclado um valor e conclui a entrada de dados Rotina da linguagem verifica se o comando foi executado com êxito e se

o valor digitado é compatível com o tipo da variável, e atualiza uma variável com o resultado da execução do comando:

Se não houve erro ativa essa variável do para zero e coloca o valor digitado na variável definida no comando;

Se houve erro ativa essa variável para um valor maior que zero, que indicará o tipo de erro que ocorreu, e poderá colocar qualquer lixo na variável definida no comando ou não colocar nada.

Se houve erro, a rotina da linguagem chama uma rotina padrão de tratamento de erro, que poderá terminar a execução do programa abruptamente

Page 74: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

74

Tratamento de erro programado

Se no programa há uma leitura para uma variável numérica e o usuário digita uma tecla não numérica, este erro poderá parar a execução do programa, fazendo o usuário perder todo seu trabalho até o momento.

Solução: o programador desabilita a rotina da linguagem de tratamento padrão de erro e faz uma rotina especial de tratamento de erro que avisa ao usuário de seu erro, e permite que ele refaça a digitação, sem interromper o programa.

Page 75: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

75

Exemplo em Pascal program ... var numero: integer; ... begin ... repeat // repetir os comandos abaixo

writeln(‘Informe um valor numérico’); {$I-} // para desativar a rotina padrão de tratamento de erro readln(numero); {$I+} // para ativar a rotina padrão de tratamento de erro

until ioresult = 0 // até que o comando tenha sido executado sem erro

Page 76: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

76

Rotinas padronizadas (proposta)

Toda vez em que há entrada de dados é necessário: Orientar o usuário do que deve ser feito Testar se houve erro de execução e neste caso

executar rotina apropriada de tratamento de erro Testar se os valores digitados estão dentro do

escopo dos valores permitidos Informar adequadamente no caso de erros Repetir a entrada de dados até que os dados

estejam corretos

Page 77: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

77

Rotina para orientar, digitar e verificar variáveis inteiras

Este procedimento tem tres parâmetros passados por valor: MensInt: a mensagem para orientar o usuário MaxInt: o valor máximo permitido MinInt: o valor mínimo permitido

E um parâmetro passado por referência: ValInt para retornar o valor digitado

Page 78: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

78

procedure digInt(mensInt: string; maxInt, minInt: integer; var valInt:integer);

(* procedimento para orientar o usuário, permitir que ele digite um valor inteiro, testar se houve erro e testar se o valor está dentro do escopo de valores aceitos para a variável; responsável: ...; data:...*)

var

erro: integer; // variável para o código de erro

Page 79: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

79

begin

repeat

writeln (mensInt);

{$I-} // para desativar rotina padrão de tratamento de erro

readln (valInt);

{$I+} // para reativar a rotina padrão de tratamento de erro

erro := 1; // para fazer todos os testes

if ioresult <> 0

then writeln ('O valor digitado não é um inteiro. Digite novamente') else if (valInt > maxInt)

Then writeln(‘O valor digitado é maior que o valor máximo permitido. Digite novamente’)

Else if (valInt < minInt) Then writeln((‘O valor digitado é menor que o valor mínimo permitido. Digite

novamente’) Else erro := 0; // para aceitar o valor digitado após passar os testes

until erro = 0;

end.

Page 80: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

80

Rotina para orientar, digitar e verificar variáveis reais

Este procedimento tem tres parâmetros passados por valor: MensReal: a mensagem para orientar o usuário MaxReal: o valor máximo permitido MinReal: o valor mínimo permitido

E um parâmetro passado por referência: ValReal para retornar o valor digitado

Page 81: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

81

procedure digReal(mensReal: string; maxReal, minReal: real; var valReal:real);

(* procedimento para orientar o usuário, permitir que ele digite um valor real, testar se houve erro e testar se o valor está dentro do escopo de valores aceitos para a variável; responsável: ...; data:...*)

var erro: integer; // variável para o código de erro

Page 82: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

82

begin

repeat

writeln (mensReal);

{$I-} // para desativar rotina padrão de tratamento de erro

readln (valReal);

{$I+} // para reativar a rotina padrão de tratamento de erro

erro := 1; // para fazer todos os testes

if ioresilt <> 0

then writeln ('O valor digitado não é um real. Digite novamente')

else if (valReal > maxReal) Then writeln(‘O valor digitado é maior que o maior valor permitido. Digite novamente’) Else if (valReal < MinReal)

Then writeln(‘O valor digitado é menor que o menor valor permitido. Digite novamente’) Else erro := 0; // para aceitar o valor digitado após passar os testes

until erro = 0; end.

Page 83: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

83

Rotina para orientar, digitar e verificar variáveis string

Este procedimento tem tres parâmetros passados por valor: MensStr: a mensagem para orientar o usuário MaxStr: o comprimento máximo permitido MinStr: o comprimento mínimo permitido

E um parâmetro passado por referência: ValStr para retornar o valor digitado

Page 84: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

84

procedure digStr(mensStr: string; maxStr, minStr: integer; var valStr:string); (* procedimento para orientar o usuário, permitir que ele digite um valor string e testar se o valor

está dentro do escopo de valores aceitos para a variável; responsável: ...; data:...*)

var

tamanho: integer; // para conter o comprimento da variável digitada

begin

repeat

writeln (mensStr);

readln (valStr);

tamanho := length (valStr);

if (tamanho > maxStr)

then writeln ('Valor com comprimento maior que o maior comprimento permitido. Digite novamente');

Else if (tamanho < minStr)

writeln ('Valor com comprimento menor que o menor comprimento permitido. Digite novamente');

until (tamanho <= maxStr) and (tamanho >= minStr); end.

Page 85: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

85

Reutilização de código

Reutilização de código é utilizar um código já desenvolvido, evitando-se “reinventar a roda”. Procedimentos e funções podem ser copiados de

um programa para outro. Procedimentos e funções muito usados podem ser

guardados em uma biblioteca, já compilados. Para reutilizá-los basta em um programa informar, através de uma cláusula, a biblioteca que será utilizada. Todos os procedimentos e funções desta biblioteca estarão disponíveis para reutilização.

Page 86: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

86

Unit Em Pascal as bibliotecas são definidas como units. A unit é um código Pascal que define procedimentos e

funções, ou mesmo declarações de constantes, tipos ou variáveis, que podem ser reutilizados.

A unit segue a sintaxe do Pascal. O compilador traduz a unit para um código binário não

executável. A unit é dividida em duas partes:

Interface: onde estão declarados os procedimentos e funções, assim como outras declarações, que podem ser acessados pelos programas que utilizam a unit;

Implementation: onde é colocado o código Pascal que implementa os procedimentos e funções declarados na interface; pode ter outras declarações internas à unit.

Page 87: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

87

unit <identificador da unit>; (* prólogo com objetivo, responsável, data ... *) Interface

Declarações de incluir, const, type, var Declarações de procedimentos e funções:

Procedure <id do procedimento1> (<lista de parâmetros1>); Function <id da função2> (<lista parâmetros2): <tipo função>;

Implementation Declarações de incluir, const, type, var Código completo dos procedimentos e funções:

Procedure <id do procedimento1> (<lista de parâmetros1>); (* prólogo com objetivo, data, responsável, ...*) Declarações de , const, type, var, outros procedimentos ou funções Begin // início dos comandos

Comandos do procedimento End; ...

[ begin Código de execução inicial ]

end.

Page 88: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

88

Exemplo de unit

Unit com os procedimentos padronizados vistos antes para a digitação de três tipos de dados

O nome da unit será digDados

Page 89: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

89

Unit digDados; (* biblioteca com rotinas para orientar e validar

a digitação de três tipos de dados; responsável: fulano; data: 17/10/2008 *)

interface procedure digInt(mensInt: string; maxInt,

minInt: integer; var valInt:integer); procedure digReal(mensReal: string; maxReal,

minReal: real; var valReal:real); procedure digStr(mensStr: string; maxStr,

minStr: integer; var valStr:string);

Page 90: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

90

implementation

procedure digInt(mensInt: string; maxInt, minInt: integer; var valInt:integer); (* procedimento para orientar e validar inteiro; responsável: ...; data:...*)

Var

erro: integer; // variável para o código de erro

begin

repeat

writeln (mensInt);

{$I-} // para desativar rotina padrão de tratamento de erro

readln (valInt);

{$I+} // para reativar a rotina padrão de tratamento de erro

erro := 1; // para fazer todos os testes

if ioresult <> 0

then writeln ('O valor digitado não é um inteiro. Digite novamente')

else if (valInt > maxInt)

Then writeln(‘O valor digitado é maior que o valor máximo permitido. Digite novamente’) Else if (valInt < minInt)

Then writeln((‘O valor digitado é menor que o valor mínimo permitido. Digite novamente’)

Else erro := 0; // para aceitar o valor digitado após passar os testes until erro = 0;

end;

Page 91: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

91

procedure digReal(mensReal: string; maxReal, minReal: real; var valReal:real);

(* procedimento para orientar, validar, ...; responsável: ...; data:...*)

var

erro: integer; // variável para o código de erro

begin

repeat

writeln (mensReal);

{$I-} // para desativar rotina padrão de tratamento de erro

readln (valReal);

{$I+} // para reativar a rotina padrão de tratamento de erro

erro := 1; // para fazer todos os testes

if ioresult <> 0

then writeln ('O valor digitado não é um real. Digite novamente')

else if (valReal > maxReal)

Then writeln(‘O valor digitado é maior que o maior valor permitido. Digite novamente’) Else if (valReal < MinReal)

Then writeln(‘O valor digitado é menor que o menor valor permitido. Digite novamente’) Else erro := 0; // para aceitar o valor digitado após passar os testes

until erro = 0; end;

Page 92: EEL170 COMPUTAÇÃO I ac/eel170.htm Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 19/03/2012

92

procedure digStr(mensStr: string; maxStr, minStr: integer; var valStr:string); (* procedimento para orientar... ; responsável: ...; data:...*)

var

tamanho: integer; // para conter o comprimento da variável digitada

begin

repeat

writeln (mensStr);

readln (valStr);

tamanho := length (valStr);

if (tamanho > maxStr)

then writeln ('Valor com comprimento maior que o maior comprimento permitido. Digite novamente');

Else if (tamanho < minStr)

Then writeln ('Valor com comprimento menor que o menor comprimento permitido. Digite novamente');

until (tamanho <= maxStr) and (tamanho >= minStr); end; end.