estrutura de programação

94
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 15/02/2014

Upload: reinaldovsantos

Post on 18-Jan-2016

8 views

Category:

Documents


0 download

DESCRIPTION

Tutorial voltado para a Estruturação de Programação, tipos de linguagem, regras para uma boa programação, algoritmos, diagramas e suas funções.

TRANSCRIPT

Page 1: Estrutura de Programação

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 15/02/2014

Page 2: Estrutura de Programação

2

Programação Estruturada

Utiliza somente as estruturas de controle: Sequencial Iterativa Condicional

Page 3: Estrutura de Programação

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: Estrutura de Programação

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: Estrutura de Programação

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: Estrutura de Programação

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: Estrutura de Programação

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: Estrutura de Programação

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: Estrutura de Programação

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 bc ordenadoOrdena a b // módulo devolve ab ordenadoApresentar as variáveis a, b, cfim

Page 10: Estrutura de Programação

Diagrama de estrutura

Módulo principal

ordena

Passa dois valores Retornam dois valores

Page 11: Estrutura de Programação

Algoritmo simplificadoInicio // módulo principal

leia a,b,c

ordena a,b // passa a,b e recebe ordenados // ordena é o identificador de um módulo

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 x > y então

inicio

aux x

x y

y aux

fim

Fim // módulo ordena

Page 12: Estrutura de Programação

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

leia a,b,c

ordena (a,b) // passa a,b e recebe os ordenados – parâmetros atuais ou reais

ordena (b,c) // passa b,c e os recebe ordenados – parâmetros atuais ou reais

ordena (a,b) // passa a,b e os 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

var

Aux: inteiro

Inicio

se x > y então

inicio

aux x

x y

y aux

fim

Fim // módulo ordena

Page 13: Estrutura de Programação

Módulos

• 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 elas tem tipo

Page 14: Estrutura de Programação

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: Estrutura de Programação

15

algoritmo calcularMédia

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

Var

dado1, dado2, dado3, dado4, dado5: 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, dado5) // chamada do procedimento

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

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

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

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

fim

Page 16: Estrutura de Programação

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: Estrutura de Programação

17

Passagem de parâmetros

Nos procedimentos os parâmetros podem ser passados por valor ou por referência

No parâmetro passado por valor o módulo que chama passa o valor de seu parâmetro para o parâmetro do módulo chamado, o que resulta em uma passagem de dados apenas em um sentido

No parâmetro passado por referência o módulo que chama passa a referência de seu parâmetro para o parâmetro do módulo chamado; desta forma os dois parâmetros são referências para a mesma variável, o que permite passar dados nos dois sentidos

Page 18: Estrutura de Programação

18

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 19: Estrutura de Programação

19

algoritmo calcularMédia

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

Var

dado1, dado2, dado3, dado4, dado5: 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

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

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

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

dado5 ← calcMed(dado3, dado4)

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

fim

Page 20: Estrutura de Programação

20

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 21: Estrutura de Programação

21

Estruturas de dados

Page 22: Estrutura de Programação

22

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 23: Estrutura de Programação

23

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 24: Estrutura de Programação

24

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

Matriz a

[ a1 a2 a3 a4 a5 ]

Page 25: Estrutura de Programação

25

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 26: Estrutura de Programação

26

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 27: Estrutura de Programação

27

Voltando ao nosso problema

Problema: Após ler as notas dos alunos de uma turma (uma nota por aluno), calcular a média da turma 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 28: Estrutura de Programação

28

var

turma: matriz [1..45] de real

inicio

somaNotas, notasAcima 0 // preparar um acumulador e um contador

para aluno variando de 1 a 45 faça

inicio

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

leia (nota) (* testar *)

turma [aluno] nota

somaNotas somaNotas + nota

fim

mediaNotas somaNotas / 45

para aluno variando de 1 a 45 faça

inicio

se turma [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 29: Estrutura de Programação

29

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 30: Estrutura de Programação

30

var

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

somaNotas, nota, mediaNotas: real;

aluno, notasAcima: integer;

begin

somaNotas := 0; // iniciar o acumulador

notasAcima := 0; // iniciar o contador

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 (nota);

turma [aluno] := nota;

somaNotas := somaNotas + nota;

end;

mediaNotas := somaNotas / 45;

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

begin

if turma [aluno] > mediaNotas then

notasAcima := notasAcima + 1;

end;

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

end.

Page 31: Estrutura de Programação

31

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 32: Estrutura de Programação

32

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[indice]) (* 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 33: Estrutura de Programação

33

(* algoritmo do bubble sort *)

inicio

para contador variando de 1 a 9 faça

inicio

para indice variando de 1 a 9 faça

inicio

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

início

auxiliar nomeOrdenado[índice]

nomeOrdenado[índice] nomeOrdenado[índice+1]

nomeOrdenado[índice+1] auxilir

fim

fim

fim

Page 34: Estrutura de Programação

34

{ 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 35: Estrutura de Programação

35

(* algoritmo do bubble sort - com pequena otimização *)

inicio

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ício auxiliar nomeOrdenado[índice] nomeOrdenado[índice] nomeOrdenado[índice+1] nomeOrdenado[índice+1] auxilir

fim

fim fim

fim

Page 36: Estrutura de Programação

36

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 para facilitar o cálculo do determinante;

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

Algoritmo:

Page 37: Estrutura de Programação

37

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 dados inicio

para coluna variando de 1 a 3 faça // entrada dados inicio

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

leia (dados[linha,coluna])

fim

fim

Page 38: Estrutura de Programação

38

// 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

inicio para coluna variando de 1 a 3 faça

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

fim

fim

Page 39: Estrutura de Programação

//cálculo do determinante

determinante 0

para indice variando de 1 a 3 faça

inicio

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 40: Estrutura de Programação

40

// 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 41: Estrutura de Programação

41

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 42: Estrutura de Programação

42

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 43: Estrutura de Programação

43

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 44: Estrutura de Programação

44

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 45: Estrutura de Programação

45

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 46: Estrutura de Programação

46

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 47: Estrutura de Programação

47

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)

leia(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 48: Estrutura de Programação

48

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 49: Estrutura de Programação

49

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 50: Estrutura de Programação

50

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 51: Estrutura de Programação

51

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 52: Estrutura de Programação

52

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 DVDs para índice variando de 1 a primeiraPosLivre - 1 faça

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

fim

fim

Page 53: Estrutura de Programação

53

3: inicio // para consultar um DVD escreva(‘Informe o título do DVD que procura’)

leia(titu)

indice 1

enquanto (titu <> dvd[índice].titulo) e (indice < primeiraPosLivre) faça

ÍnicioÍndice Índice + 1

fim

se índice < primeiraPosLivre entãoescreva(‘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 54: Estrutura de Programação

54

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 55: Estrutura de Programação

Modularização

Page 56: Estrutura de Programação

56

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 57: Estrutura de Programação

57

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 realvar

mat1, mat2, matResult: tipmatinicio

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 58: Estrutura de Programação

58

Repita // início do menuescreva (‘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 59: Estrutura de Programação

59

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 60: Estrutura de Programação

60

3:inicio // para somar as duas matrizes

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

matResult[linha,coluna] mat1[linha,coluna] + mat2[linha,coluna]

(* apresentar matriz result *)fim // fim do caso 3

4:inicio // para subtrair a segunda da primeira

para linha variando de 1 a qtd façapara 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 61: Estrutura de Programação

61

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 62: Estrutura de Programação

62

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 63: Estrutura de Programação

63

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 64: Estrutura de Programação

64

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 65: Estrutura de Programação

65

inicio

proQtd (qtd) (* escolher quantidade elementos *)

Repita

Opção funMenu (* 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 66: Estrutura de Programação

66

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 67: Estrutura de Programação

67

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

repita 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)funMenu ← op

fim

Page 68: Estrutura de Programação

68

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

(* procedimento para digitar os dados *)var

lin, col: inteiroinicio

para 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 69: Estrutura de Programação

69

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ça para coSS variando de 1 a qtdSS faça

matRSS[liSS,coSS] mat1SS[liSS,coSS] +

(sinal * mat2SS[liSS,coSS])

proListarMat (matRSS, qtdSS)

fim

Page 70: Estrutura de Programação

70

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

(*procedimento para multiplicar matrizes *)

var

liM, coM, indice: inteiroinicio

para liM variando de 1 a qtdM faça

inicio para coM variando de 1 a qtdM faça

inicio MatRM[liM,coM] 0 Para indice variando de 1 a qtdM faça matRM[liM,coM] matRM[liM,coM] + mat1M[liM,indice] * mat2M[indice,coM])Fim fim

proListarMat (matRM, qtdM)

fim

Page 71: Estrutura de Programação

71

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ça para coT variando de 1 a qtdT faça

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

proListarMat (matRSS, qtdSS)

fim

Page 72: Estrutura de Programação

72

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 73: Estrutura de Programação

73

opcao

operaMatriz

proQTD

proListarMat

proDigDados proSoSub proMultiplicar proTransposta

Page 74: Estrutura de Programação

74

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 75: Estrutura de Programação

75

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 76: Estrutura de Programação

76

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 77: Estrutura de Programação

77

Exemplo em Pascal

program ...var numero: integer;...begin...

repeat // repetir os comandos abaixowriteln(‘Informe um valor numérico’);{$I-} // para desativar a rotina padrão de tratamento de erroreadln(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 78: Estrutura de Programação

78

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 79: Estrutura de Programação

79

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 80: Estrutura de Programação

80

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 81: Estrutura de Programação

81

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 testesuntil erro = 0;

end;

Page 82: Estrutura de Programação

82

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 83: Estrutura de Programação

83

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 84: Estrutura de Programação

84

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 testesuntil erro = 0;

end.

Page 85: Estrutura de Programação

85

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 86: Estrutura de Programação

86

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 87: Estrutura de Programação

87

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 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, e todos os procedimentos e funções desta biblioteca estarão disponíveis para reutilização no programa.

Deve-se colocar em bibliotecas módulos que possam ser utilizados em muitos outros programas sem a necessidade de qualquer alteração no código.

Page 88: Estrutura de Programação

88

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 89: Estrutura de Programação

89

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 90: Estrutura de Programação

90

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 91: Estrutura de Programação

91

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 92: Estrutura de Programação

92

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 testesuntil erro = 0;

end;

Page 93: Estrutura de Programação

93

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 testesuntil erro = 0;

end;

Page 94: Estrutura de Programação

94

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.