Вы находитесь на странице: 1из 94

EEL170 COMPUTAO I

www.del.ufrj.br/~ac/eel170.htm

Antonio Cludio Gmez de Sousa


ac@del.ufrj.br
2a srie de slides
Verso 15/02/2014

Programao Estruturada

Utiliza somente as estruturas de controle:

Sequencial

Iterativa

Condicional

Pascal

Linguagem de programao:

Estruturada

De alto nvel

Fortemente tipificada

Permite modularizao

Refinamento etapa por etapa

Escopo de variveis global e local

Alocao esttica e dinmica de memria

Orientao a objetos
3

Estrutura de um programa em
Pascal

program <identificador>;

uses <lista de identificadores de units>; // declaraes de utilizao de bibliotecas

const //declaraes para definio de constantes

<identificador> = <valor>; // exemplo de declarao de constante

type //declaraes de tipos

<identificador> = <declarao de tipo>; // exemplo de declarao de tipo

var //declaraes de variveis

<identificador> : <tipo>; // exemplo de declarao de varivel

procedure <identificador> (<parmetros>); // declaraes de procedimentos

function <identificador> (<parmetros>) :tipo; // declaraes de funes

begin

<comandos>; // comandos do mdulo principal

end.
4

Principais comandos em Pascal:

Atribuio // <identificador> <expresso algbrica>;

if <condio> then

<comando>

[else <comando>];

case <seletor> of

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

end

repeat

<comandos>;

until <condio>;

while <condio> do

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

<comando>;
<comando>;

comandos de entrada e saida


5

Regras para uma programao com


qualidade

Colocar um comentrio no incio dos programas com seu objetivo,


responsvel e data
Colocar um comentrio no incio de cada mdulo com sua finalidade e
separar visualmente os mdulos
Comentar
Dentear/identar os comandos controlados por repita, para, enquanto,
caso, se-ento-seno
Utilizar identificador que lembre a semntica do contedo da varivel ou
finalidade do procedimento esttica Java: identificador em minsculas e
maisculas s no incio das palavras que o compem, a partir da segunda
palavra

Exemplos: dataDia, somaNotas, totalAlturasHomens

No alterar uma varivel controlada por for dentro da iterao

Usar for quando o escopo da varivel de controle conhecido

No usar variveis booleanas desnecessrias


6

Modularizao

Dividir para vencer


Para resolver programas complexos

Separ-los em programas menores - mdulos ou


subprogramas

Algoritmos subalgoritmos ou mdulos


Subalgoritmo

Mdulo projetado para executar uma tarefa


especfica
Partes de algoritmos que se repetem:

Colocados em um mdulo e chamados quantas vezes for


necessrio de diferentes partes
7

Algoritmo complexo - mtodo de


refinamento etapa por etapa
Desenvolver o algoritmo em alto nvel de
abstrao criando subalgoritmos para resolver
problemas especficos
Cada subalgoritmo pode ser separado em
outros subalgoritmos em nveis de abstrao
mais baixos
Parar quando chegar a subalgoritmos com baixa
complexidade
Subalgoritmos mdulos
Cada mdulo pode ser programado e testado de
forma independente
8

Exemplo ordenar tres variveis


Ordenar tres variveis utilizando um mdulo que
ordena duas variveis:
Incio
Ler as variveis a, b, c
Ordena a b // mdulo devolve ab ordenado
Ordena b c // mdulo devolve bc ordenado
Ordena a b // mdulo devolve ab ordenado
Apresentar as variveis a, b, c
fim

Diagrama de estrutura

Mdulo principal

Passa dois valores

Retornam dois valores

ordena

Algoritmo simplificado
Inicio // mdulo principal
leia a,b,c
ordena a,b // passa a,b e recebe ordenados // ordena o identificador de um mdulo
ordena b,c // passa b,c e recebe ordenados
ordena a,b // passa a,b e recebe ordenados
escreva a,b,c
Fim // mdulo principal
// -------------------------------------------------------------------------------------------ordena x,y // mdulo ordena
Inicio
se x > y ento
inicio
aux x
x y
y aux
fim
Fim // mdulo ordena

Algoritmo simples
Inicio // mdulo principal com tres variveis globais
leia a,b,c
ordena (a,b) // passa a,b e recebe os ordenados parmetros atuais ou reais
ordena (b,c) // passa b,c e os recebe ordenados parmetros atuais ou reais
ordena (a,b) // passa a,b e os recebe ordenados parmetros atuais ou reais
escreva a,b,c
Fim // mdulo principal
// -------------------------------------------------------------------------------------------Ordena( x,y) // mdulo ordena com dois partmetros formais e uma varivel local
var
Aux: inteiro
Inicio
se x > y ento
inicio
aux x
x y
y aux
fim
Fim // mdulo ordena

Mdulos
A modularizao do programa pode ser feita
atravs de procedimentos ou funes
Os procedimentos ou funes so mdulos, ou
sub-programas, que programamos e podem ser
chamados de vrios pontos do algoritmo
Procedimentos: podem receber e devolver
vrios parmetros
Funes: podem receber vrios parmetros
mas devolvem um valor - como uma funo
matemtica elas tem tipo

Procedimento
Quando chamamos um procedimento podemos passar
dados para o procedimento e receber dados do
procedimento, atravs de parmetros que so
passados entre o mdulo chamador e o mdulo
chamado
Exemplo: vamos fazer um algoritmo que permite
digitar dois valores e calcular sua mdia
A mdia ser calculada em um procedimento que
definimos no algoritmo
Um mdulo do algoritmo dever passar os dois valores
para o procedimento e o parmetro para o resultado, e
o procedimento devolver a mdia calculada no
parmetro do resultado.
14

algoritmo calcularMdia
(*algoritmo para calcular a mdia de dois pares de dados com um procedimento*)
Var
dado1, dado2, dado3, dado4, dado5: real // variveis globais
// definio do procedimento
procedimento calcMed(x,y:real; var med:real)
// x,y passagem por valor med passagem por referncia
inicio
med (x + y)/2 // o retorno pelo parmetro passado por referncia
fim
inicio // incio do mdulo principal
leia (dado1,dado2); // orientar e validar
calcMed(dado1, dado2, dado5) // chamada do procedimento
escreva(A mdia ,dado5)
Leia (dado3, dado4); // orientar e validar
calcMed(dado3,dado4,dado5) // chamada do procedimento
escreva(A mdia ,dado5)
fim

15

Estrutura modular
A estrutura modular do algoritmo apresenta o
mdulo principal, o procedimento e duas setas
indicando que h parmetros nos dois sentidos
calcularMedia

x,y,med

med
calcMed

x,y: Passagem por valor

Med: Passagem por referncia


16

Passagem de parmetros
Nos procedimentos os parmetros podem ser
passados por valor ou por referncia
No parmetro passado por valor o mdulo que
chama passa o valor de seu parmetro para o
parmetro do mdulo chamado, o que resulta
em uma passagem de dados apenas em um
sentido
No parmetro passado por referncia o mdulo
que chama passa a referncia de seu
parmetro para o parmetro do mdulo
chamado; desta forma os dois parmetros so
referncias para a mesma varivel, o17 que
permite passar dados nos dois sentidos

Funo
Quando chamamos uma funo podemos
passar dados para a funo por meio dos
parmetros, e receber o resultado calculado
pela funo
Exemplo: vamos fazer um algoritmo que
permite digitar dois valores e calcular sua mdia
A mdia ser calculada em uma funo que
definimos no algoritmo
Um mdulo do algoritmo dever passar os dois
valores para a funo, e a funo devolver a
mdia calculada.
18

algoritmo calcularMdia
(*algoritmo para calcular a mdia de dois pares de dados com uma funo*)
Var
dado1, dado2, dado3, dado4, dado5: real
// definio da funo
funo calcMed(x,y:real):real

// a funo tem tipo

inicio
calcMed (x + y)/2

fim
inicio // incio do mdulo principal
leia (dado1,dado2); // orientar e validar
dado5 calcMed(dado1,dado2) // chamada da funo
escreva(A mdia ,dado5)
leia (dado3,dado4); // orientar e validar
dado5 calcMed(dado3, dado4)
escreva(A mdia , dado5) // chamada da funo
fim
19

Estrutura modular
A estrutura modular do algoritmo apresenta o
mdulo principal, o procedimento e duas setas
indicando que h parmetros nos dois sentidos
calcularMedia

x,y

CalcMed
calcMed

20

Estruturas de dados

21

Estrutura de dados homognea

Problema: Aps ler as notas dos alunos de uma turma


(uma nota por aluno), calcular a mdia e quantos
alunos ficaram com nota acima da mdia.
Este problema tem uma dificuldade: em uma primeira
etapa digita-se as notas de todos os alunos; em uma
segunda etapa calcula-se a mdia, e s ento em
uma terceira etapa pode-se comparar a mdia com a
nota de cada aluno, para verificar quantos ficaram
com a nota acima da mdia. 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.
22

Estrutura de dados homognea

No ensino mdio foi vista uma estrutura de dados que


permite guardar vrios valores de uma varivel: a
matriz.
Matriz: estrutura de dados homognea - permite
mltiplos valores de um mesmo tipo, por isso dita
homognea.
Exemplo: uma matriz com nmeros inteiros em cada
elemento da matriz podemos ter um nmero inteiro.
Dimenso: a matriz pode ter uma, duas trs ou n
dimenses.
Para acessar um elemento da matriz temos de saber
quantas dimenses ela tem, e o ndice para cada
dimenso.
23

Elementos de uma matriz com uma


dimenso com 5 elementos um ndice

Matriz a

[ a1

a2

a3

a4

a5 ]

24

Matriz em linguagens de
computao

As linguagens de computao geralmente tem uma


estrutura de matrizes, ou comandos que permitem
manipular dados como matrizes.
Uma matriz de uma dimenso tambm chamada de
vetor

Como se define uma matriz em LEA:

<identificador>: matriz [<dimenso1>,...,<dimenson>]: <tipo>

<dimenso> := <valor inicial>,<valor final>

Exemplo: notas: matriz [1..45] de real;

Matriz de uma dimenso com 45 elementos reais.

Exemplo: temperaturas: matriz [1..31, 1..24] de real;

Matriz com duas dimenses com 31 e 24 elementos respectivamente nas dimenses

25

Sintaxe das matrizes em Pascal

<identificador> : array [<dimenso1>,...,<dimenson>]: <tipo>

<dimenso> := <valor inicial>,<valor final>

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

Matriz de uma dimenso com 45 elementos reais.

Exemplo: temperaturas: array [1..31, 1..24] of real;

Matriz com duas dimenses com 31 e 24 elementos respectivamente nas


dimenses.

26

Voltando ao nosso problema

Problema: Aps ler as notas dos alunos de uma turma


(uma nota por aluno), calcular a mdia da turma e
quantos alunos ficaram com nota acima da mdia.
Soluo: Fazer um programa que permita informar as
notas, guardando-as em uma matriz, calcular a mdia e
depois comparar essa mdia com cada nota, contando
as que esto acima da mdia.

Algoritmo:

algoritmo mediaAcima;

(* algoritmo para calcular a mdia das notas de alunos


e quantos esto acima da mdia; responsvel:...;
data:...*)
27

var
turma: matriz [1..45] de real
inicio
somaNotas, notasAcima 0

// preparar um acumulador e um contador

para aluno variando de 1 a 45 faa


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 faa
inicio
se turma [aluno] > mediaNotas ento
notasAcima notasAcima + 1
fim
escreva (A mdia dos alunos ,mediaNotas, e h , notasAcima, alunos com nota acima da mdia)
fim.

28

Programa em Pascal
program mediaAcima;
(* programa para calcular a mdia das notas de
alunos e quantos esto acima da mdia;
responsvel:...; data:...*)

29

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 mdia geral
begin
if turma [aluno] > mediaNotas then
notasAcima := notasAcima + 1;

end;
writeln (A mdia dos alunos ,mediaNotas:4:1, e h , notasAcima:2, alunos com nota acima da mdia);
end.

30

Ordenar elementos em uma


estrutura linear
Problema: Ordenar nomes em uma matriz.
Soluo: 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; responsvel: ...; data: ...*)
31

Var
nomeInicial, nomeOrdenado: matriz[1..10] de literal
Inicio
para indice variando de 1 a 10 faa
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 faa
nomeOrdenado[ndice] nomeInicial[ndice]
32

(* algoritmo do bubble sort *)


inicio
para contador variando de 1 a 9 faa
inicio

para indice variando de 1 a 9 faa


inicio
se nomeOrdenado[indice] > nomeOrdenado[indice+1] ento
incio
auxiliar nomeOrdenado[ndice]
nomeOrdenado[ndice+1]

nomeOrdenado[ndice]
nomeOrdenado[ndice+1] auxilir

fim
fim

33

{ apresentar os dados no ordenados e ordenados}


escreva (Nomes antes da ordenao:)
para ndice variando de 1 a 10 faa
inicio
escreva(nomeInicial[ndice]) // na mesma linha
fim
escreva (Nomes aps a ordenao:)
para ndice variando de 1 a 10 faa
inicio
escreva(nomeOrdenado[ndice]) // na mesma linha
fim
fim
34

(* algoritmo do bubble sort - com pequena otimizao *)


inicio
para contador variando de 9 a 1 faa
inicio

para indice variando de 1 a contador faa


inicio
se nomeOrdenado[indice] >

nomeOrdenado[indice+1] ento

incio
auxiliar nomeOrdenado[ndice]
nomeOrdenado[ndice] nomeOrdenado[ndice+1]
nomeOrdenado[ndice+1] auxilir
fim
fim
fim
fim
35

Calcular o determinante de uma


matriz 3x3

Problema: calcular o determinante de uma


matriz 3x3.
Soluo: 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
clculo do determinante;
Apresente a matriz em sua forma matricial;
Apresente o valor de seu determinante.

Algoritmo:
36

algoritmo determinante3x3
(* algoritmo para o clculo do determinante de uma
matriz 3x3; responsvel:...; data:...*)
var
dados: matriz[1..5,1..3] de real
inicio
para linha variando de 1 a 3 faa // entrada de dados
inicio
para coluna variando de 1 a 3 faa // entrada dados
inicio
escreva (Informe o valor do elemento ,linha,, ,coluna)
leia (dados[linha,coluna])
fim

fim
37

// clculo do determinante
// copiar as linhas 1 e 2 para as linhas 4 e 5
para linha variando de 1 a 2 faa
inicio
para coluna variando de 1 a 3 faa
inicio
dados[linha+3,coluna] dados [linha,coluna]

fim
fim

38

//clculo do determinante
determinante 0
para indice variando de 1 a 3 faa
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

// apresentar a matriz em forma matricial


escreva(a matriz :)
para linha variando de 1 a 3 faa
inicio
para coluna variando de 1 a 3 faa
inicio
escreva( dados[linha,coluna])
fim
pule uma linha
fim
escreva(O determinante da matriz vale , determinante)
fim
40

Estrutura de dados heterognea

Problema: manter os dados de uma DVDteca


domiciliar. Para cada CD manter:

Ttulo

Intrprete

Autor

Durao em minutos

Estes dados so heterogneos


Necessitamos de novo tipo de estrutura de
dados
41

Estrutura: varivel heterognea

A estrutura permite definir dados heterogneos


em uma varivel estruturada, atravs da
composio da varivel
Exemplo de varivel heterognea:

Var
Dvd: estrutura ttulo: literal // incio da definio
.......................intrprete: literal
.......................autor: literal
.......................durao:real
.......................fim // trmino da definio
42

Como acessar cada elemento de


uma varivel heterognea

Cada elemento de uma varivel heterognea


acessado pelo identificador da varivel seguido
de ponto (.) e do identificador do elemento
Exemplo:

leia (dvd.titulo)

escreva (dvd.titulo)

43

Guardar os dados em uma varivel


estruturada
algoritmo dvdTeca1
(* algoritmo para ler e guardar os dados de um dvd; responsvel:... ; data:... *)
Var
dvd: estrutura ttulo: literal // incio da definio
.......................intrprete: literal
.......................autor: literal
.......................durao:real
.......................fim // trmino da definio do registro

Inicio
leia (dvd.titulo, dvd.interprete, dvd.autor, dvd.durao) // orientar testar
escreva (dvd.titulo, dvd.interprete, dvd.autor, dvd.durao)
fim

44

Retornando ao problema da
DVDTeca

A soluo no resolve o problema: permite


armazenar os dados apenas de um DVD
Para armazenar os dados de vrios DVDs a
soluo ser utilizar uma matriz unidimensional
de estruturas
Em cada posio da matriz haver uma
estrutura com seus elementos constitutivos

45

Algoritmo dvdTeca2
(* algoritmo para manter os dados de dez DVDs;
responsvel: ... ; data: ... *)
Tipo // declarao de tipos de variveis
tRegDvd = estrutura ttulo: literal
............................ ....intrprete: literal
............................ ....autor: literal
............................ ....durao:real
............................. ...fim

Var

// declarao das variveis estruturadas

dvd: matriz[1..10] de tRegDvd


46

Inicio
para ndice variando de 1 a 10 faa
Incio
escreva(Informe o ttulo, intrprete, autor e durao do DVD ,ndice)
leia(dvd[ndice].ttulo, dvd[ndice].intrprete)
leia(dvd[ndice].autor, dvd[ndice].durao)

(* testar *)

fim

// apresentao dos dados


para ndice variando de 1 a 10 faa
escreva(dvd[ndice].ttulo, dvd[ndice].intrprete, dvd[ndice].autor,
dvd[ndice].durao)

fim
47

Menu

O algoritmo anterior no d flexibilidade ao


usurio. Muitas vezes necessrio oferecer
opes, e o usurio escolher a cada momento
a opo mais adequada.

48

DVDteca com menu

Problema: para o problema anterior, oferecer


ao usurio as opes:

Incluir um DVD

Listar todos os DVDs

Consultar um DVD pelo ttulo

Soluo: fazer um programa que permita ao


usurio, de forma interativa, escolher uma das
opes at que o usurio escolha sair do
programa.
49

Algoritmo dvdTeca3
(* algoritmo para incluir, listar e consultar os
dados de dvd; responsvel:... ; data:... *)
Tipo // declarao de tipos de variveis
tRegDvd = estrutura ttulo: literal
.................................intrprete: literal
.................................autor: literal
.................................durao:real
.................................fim

Var

// declarao das variveis estruturadas

dvd: matriz[1..10] de tRegDvd


50

Inicio
// preparar - para iniciar a primeira posio livre
primeiraPosLivre 1
repita

// apresentao 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 ttulo)
escreva(digite 4 para sair do programa)
leia opo
51

Caso opo seja


1: inicio

// incluir um DVD

escreva(Informe o ttulo, intrprete, autor e durao do DVD )


leia(dvd[primeiraPosLivre].ttulo, dvd[primeiraPosLivre].intrprete,
dvd[primeiraPosLivre].autor, dvd[primeiraPosLivre].durao)
(*testar*)
primeiraPosLivre primeiraPosLivre + 1
fim

2: inicio

// listar todos os DVDs


para ndice variando de 1 a primeiraPosLivre - 1 faa
inicio
escreva(dvd[ndice].ttulo, dvd[ndice].intrprete, dvd[indice].autor,
dvd[indice].durao)
fim

fim

52

3: inicio

// para consultar um DVD

escreva(Informe o ttulo do DVD que procura)


leia(titu)
indice 1
enquanto (titu <> dvd[ndice].titulo) e (indice < primeiraPosLivre)
faa
nicio
ndice ndice + 1
fim

se ndice < primeiraPosLivre ento


escreva(Os dados do DVD so: , dvd[ndice].ttulo,
dvd[ndice].intrprete, dvd[ndice].autor, dvd[ndice].durao)

seno
escreva(No h DVD com esse ttulo)

Fim

fim
// fim do caso do menu

at que opo = 4
fim
53

Estrutura de algoritmo com menu


Algoritmo ...
// prlogo
// declaraes de constantes, tipos e variveis
Incio
// preparar
Repita
apresentar opes do menu
usurio escolhe uma opo
caso opcao seja
(<escalar>: <bloco de comandos>)*
fim // fim do caso
Ate que opcao tenha sido encerrar o menu
// parte final do algoritmo
fim

54

Modularizao

Problema: Realizar operaes com matrizes e


apresentar os resultados na forma matricial
Soluo: Fazer um programa que permita
realizar operaes com matrizes quadradas de
2X2 at 10X10, e oferea interativamente as
opes:

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
56

algoritmo operaMatriz
(* algoritmo para realizar operaes sobre matrizes quadradas;
responsvel:...; data:... *)

tipo // declarao 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 ento
escreva (Valor fora do escopo repita)
at que (qtd >= 2) e (qtd <= 10)
57

Repita // incio 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)
58

caso opcao seja // para testar as vrias opes


1: incio // para incluir os dados na 1a matriz
para linha variando de 1 a qtd faa
para coluna variando de 1 a qtd faa
inicio
(* orientar o usurio*)
leia (mat1[linha,coluna])
fim
(* apresentar a mat1 em forma matricial *)
fim // fim do caso 1
2: incio // para incluir os dados na 2a matriz
para linha variando de 1 a qtd faa
para coluna variando de 1 a qtd faa
inicio
(* orientar o usurio*)
leia (mat2[linha,coluna])
fim
(* apresentar a mat2 em forma matricial *)
fim // fim do caso 2

59

3:inicio // para somar as duas matrizes


para linha variando de 1 a qtd faa
para coluna variando de 1 a qtd faa
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 faa
para coluna variando de 1 a qtd faa
matResult[linha,coluna] mat1[linha,coluna]
- mat2[linha,coluna]
(* apresentar matriz result *)
fim // fim do caso 4
60

5:incio // para multiplicar as duas razes


..................
..................
(* apresentar a matResult *)
fim // fim do caso 5
6:incio // para calcular a transposta da primeira
para linha variando de 1 a qtd faa
para coluna variando de 1 a qtd faa
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
61

Observaes sobre o algoritmo


As entradas de dados para a 1a e 2a matrizes
so iguais, muda somente a matriz destino das
informaes: fazer um s procedimento para
os dois casos
Aps cada caso deve-se apresentar a matriz
resultante, que pode ser mat1, mat2 ou
matresult, mas so procedimentos idnticos:
fazer um s procedimento para todos os
casos
O algoritmo ficou muito longo, o que dificulta
perceber sua lgica: quebrar o algoritmo em
partes menores
62

Modularizao do problema de
operaes com matrizes

Um mdulo principal que apresente a lgica geral do


programa: esse mdulo deve permitir que o usurio
escolha a quantidade de elementos de cada
dimenso, e a seguir deve permitir que o usurio
escolha uma opo at que o usurio escolha sair
do programa. Para cada escolha, o mdulo principal
chama um outro mdulo que implementa a opo
selecionada.

Refinamento etapa por etapa

Um mdulo para a entrada de dados para as duas


matrizes
Um mdulo para apresentar os dados das matrizes
no formato matricial
63

Algoritmo operaMatriz
(* algoritmo modularizado para realizar operaes
sobre matrizes quadradas; responsvel:...;
data:... *)
tipo // declarao de tipos
tipMat = matriz[1..10,1..10] de real
var
qtd: inteiro
mat1, mat2, matResult: tipMat

64

inicio
proQtd (qtd) (* escolher quantidade elementos *)
Repita
Opo funMenu (* funo menu e escolha da opo *)
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)
fim
at que opcao = 7
fim.

65

procedimento proQtd (var qt: inteiro)


(* procedimento para escolher a quantidade de
elementos em cada dimenso 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 ento
escreva (Valor fora do escopo repita)
at que (qt >= 2) e (qt <= 10)
fim
66

funo funMenu (): inteiro


(* funo para apresentar o menu e optar*)
Var op: inteiro
Inicio
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) ento
escreva(Opo invlida. Refaa)

at que (op >= 1) e (op <= 7)


funMenu op
fim

67

procedimento proDigDados (var matDig: tipMat;


qtDig: inteiro)
(* procedimento para digitar os dados *)
var
lin, col: inteiro
inicio
para lin variando de 1 a qtDig faa
para col variando de 1 a qtDig faa
(* orientar *)
leia (matDig[lin,col])

proListarMat (matDig, qtDig)


fim
68

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 faa
para coSS variando de 1 a qtdSS faa
matRSS[liSS,coSS] mat1SS[liSS,coSS] +
(sinal * mat2SS[liSS,coSS])

proListarMat (matRSS, qtdSS)


fim
69

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


inteiro)
(*procedimento para multiplicar matrizes *)
var
liM, coM, indice: inteiro
inicio
para liM variando de 1 a qtdM faa
inicio
para coM variando de 1 a qtdM faa
inicio

MatRM[liM,coM] 0
Para indice variando de 1 a qtdM faa
matRM[liM,coM] matRM[liM,coM] + mat1M[liM,indice] *
mat2M[indice,coM])Fim
fim
proListarMat (matRM, qtdM)
fim

70

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 faa
para coT variando de 1 a qtdT faa
matR[liT,coT] matT[coT,liT]

proListarMat (matRSS, qtdSS)


fim
71

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 faa
inicio
para coLis variando de 1 a qtdLis faa
Escreva (matLis[liLis,coLis]
(* Pule uma linha *)
fim
fim
72

operaMatriz

proQTD

opcao

proDigDados

proSoSub

proMultiplicar

proListarMat

73

proTransposta

Tratamento de erro

As linguagens verificam a ocorrncia de erros


em tempo de execuo, e executam suas
rotinas de tratamento de erro.
Algumas linguagens permitem que o usurio
desabilite a rotina padro de tratamento de erro
e faa sua prpria rotina de tratamento de erro.
Ao terminar de executar um comando de
entrada ou sada de dados, sempre gerado
um cdigo de erro, que ser zero se no houve
erro, e diferente de zero se houve erro, e esse
valor ser o cdigo de erro
74

Tratamento de erro padro em E/S

Exemplo para comando de leitura de teclado:

leia (varivel) // pode ser mais de uma varivel


Rotina da linguagem verifica o que foi solicitado e habilita o teclado
Usurio 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 compatvel com o tipo da varivel, e atualiza uma
varivel com o resultado da execuo do comando:

Se no houve erro ativa essa varivel do para zero e coloca o valor digitado
na varivel definida no comando;
Se houve erro ativa essa varivel para um valor maior que zero, que indicar
o tipo de erro que ocorreu, e poder colocar qualquer lixo na varivel
definida no comando ou no colocar nada.

Se houve erro, a rotina da linguagem chama uma rotina padro de


tratamento de erro, que poder terminar a execuo do programa
abruptamente
75

Tratamento de erro programado

Se no programa h uma leitura para uma


varivel numrica e o usurio digita uma tecla
no numrica, este erro poder parar a
execuo do programa, fazendo o usurio
perder todo seu trabalho at o momento.
Soluo: o programador desabilita a rotina da
linguagem de tratamento padro de erro e faz
uma rotina especial de tratamento de erro que
avisa ao usurio de seu erro, e permite que ele
refaa a digitao, sem interromper o
programa.
76

Exemplo em Pascal
program ...
var numero: integer;
...
begin
...
repeat
// repetir os comandos abaixo
writeln(Informe um valor numrico);
{$I-} // para desativar a rotina padro de tratamento de erro
readln(numero);
{$I+} // para ativar a rotina padro de tratamento de erro

until ioresult = 0 // at que o comando tenha sido


executado sem erro
77

Rotinas padronizadas (proposta)

Toda vez em que h entrada de dados


necessrio:

Orientar o usurio do que deve ser feito


Testar se houve erro de execuo e neste caso
executar rotina apropriada de tratamento de erro
Testar se os valores digitados esto dentro do
escopo dos valores permitidos
Informar adequadamente no caso de erros
Repetir a entrada de dados at que os dados
estejam corretos
78

Rotina para orientar, digitar e verificar


variveis inteiras

Este procedimento tem tres parmetros passados por


valor:

MensInt: a mensagem para orientar o usurio

MaxInt: o valor mximo permitido

MinInt: o valor mnimo permitido

E um parmetro passado por referncia:

ValInt para retornar o valor digitado

79

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


valInt:integer);
(* procedimento para orientar o usurio, 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
varivel; responsvel: ...; data:...*)
var
erro: integer; // varivel para o cdigo de erro

80

Begin
repeat
writeln (mensInt);
{$I-}

// para desativar rotina padro de tratamento de erro

readln (valInt);
{$I+}

// para reativar a rotina padro de tratamento de erro

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


if ioresult <> 0 then
writeln ('O valor digitado no um inteiro. Digite novamente')
else if (valInt > maxInt) then
writeln(O valor digitado maior que o valor mximo permitido.
novamente)

Digite

Else if (valInt < minInt) then


writeln((O valor digitado menor que o valor mnimo permitido.
novamente)
Else erro := 0; // para aceitar o valor digitado aps passar os testes

until erro = 0;
end;

81

Digite

Rotina para orientar, digitar e


verificar variveis reais

Este procedimento tem tres parmetros passados


por valor:

MensReal: a mensagem para orientar o usurio


MaxReal: o valor mximo permitido
MinReal: o valor mnimo permitido

E um parmetro passado por referncia:

ValReal para retornar o valor digitado

82

procedure digReal(mensReal: string;


maxReal, minReal: real; var valReal:real);
(* procedimento para orientar o usurio,
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
varivel; responsvel: ...; data:...*)
var
erro: integer; // varivel para o cdigo de erro

83

begin
repeat
writeln (mensReal);
{$I-}

// para desativar rotina padro de tratamento de erro

readln (valReal);
{$I+}

// para reativar a rotina padro de tratamento de erro

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


if ioresilt <> 0 then
writeln ('O valor digitado no 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 aps passar os testes
until erro = 0;
end.

84

Rotina para orientar, digitar e


verificar variveis string

Este procedimento tem tres parmetros passados


por valor:

MensStr: a mensagem para orientar o usurio


MaxStr: o comprimento mximo permitido
MinStr: o comprimento mnimo permitido

E um parmetro passado por referncia:

ValStr para retornar o valor digitado

85

procedure digStr(mensStr: string; maxStr, minStr: integer; var valStr:string);


(* procedimento para orientar o usurio, permitir que ele digite um valor string e testar se o valor
est dentro do escopo de valores aceitos para a varivel; responsvel: ...; data:...*)
var
tamanho: integer;

// para conter o comprimento da varivel 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.

86

Reutilizao de cdigo

Reutilizao de cdigo utilizar um cdigo j


desenvolvido, evitando-se reinventar a roda.

Procedimentos e funes muito usados podem ser


guardados em uma biblioteca, j compilados. Para
reutiliz-los basta em um programa informar, atravs
de uma clusula, a biblioteca que ser utilizada, e
todos os procedimentos e funes desta biblioteca
estaro disponveis para reutilizao no programa.
Deve-se colocar em bibliotecas mdulos que
possam ser utilizados em muitos outros programas
sem a necessidade de qualquer alterao no cdigo.
87

Unit

Em Pascal as bibliotecas so definidas como units.


A unit um cdigo Pascal que define procedimentos e
funes, ou mesmo declaraes de constantes, tipos
ou variveis, que podem ser reutilizados.
A unit segue a sintaxe do Pascal.
O compilador traduz a unit para um cdigo binrio no
executvel.
A unit dividida em duas partes:

Interface: onde esto declarados os procedimentos e


funes, assim como outras declaraes, que podem ser
acessados pelos programas que utilizam a unit;
Implementation: onde colocado o cdigo Pascal que
implementa os procedimentos e funes declarados na
interface; pode ter outras declaraes internas unit.
88

unit <identificador da unit>;

(* prlogo com objetivo, responsvel, data ... *)

Interface

Declaraes de incluir, const, type, var


Declaraes de procedimentos e funes:

Implementation

Declaraes de incluir, const, type, var


Cdigo completo dos procedimentos e funes:

Procedure <id do procedimento1> (<lista de parmetros1>);


(* prlogo com objetivo, data, responsvel, ...*)
Declaraes de , const, type, var, outros procedimentos ou funes
Begin // incio dos comandos
Comandos do procedimento
End;
...

[ begin

Procedure <id do procedimento1> (<lista de parmetros1>);


Function <id da funo2> (<lista parmetros2): <tipo funo>;

Cdigo de execuo inicial ]

end.
89

Exemplo de unit

Unit com os procedimentos padronizados


vistos antes para a digitao de trs tipos de
dados
O nome da unit ser digDados

90

Unit digDados;
(* biblioteca com rotinas para orientar e validar a
digitao de trs tipos de dados; responsvel:
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);
91

implementation
procedure digInt(mensInt: string; maxInt, minInt: integer; var valInt:integer);
(* procedimento para orientar e validar inteiro; responsvel: ...; data:...*)
Var
erro: integer; // varivel para o cdigo de erro
begin
repeat
writeln (mensInt);
{$I-}

// para desativar rotina padro de tratamento de erro

readln (valInt);
{$I+}

// para reativar a rotina padro de tratamento de erro

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


if ioresult <> 0 then
writeln ('O valor digitado no um inteiro. Digite novamente')
else if (valInt > maxInt) then
writeln(O valor digitado maior que o valor mximo permitido. Digite novamente)
else if (valInt < minInt) then

until erro = 0;
end;

writeln((O valor digitado menor que o valor mnimo permitido. Digite novamente)
else erro := 0; // para aceitar o valor digitado aps passar os testes

92

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


(* procedimento para orientar, validar, ...; responsvel: ...; data:...*)
var
erro: integer; // varivel para o cdigo de erro
begin
Repeat

writeln (mensReal);
{$I-}

// para desativar rotina padro de tratamento de erro

readln (valReal);
{$I+}

// para reativar a rotina padro de tratamento de erro

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


if ioresult <> 0 then
writeln ('O valor digitado no 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 aps passar os testes
until erro = 0;
end;

93

procedure digStr(mensStr: string; maxStr, minStr: integer; var valStr:string);


(* procedimento para orientar... ; responsvel: ...; data:...*)
var
tamanho: integer;

// para conter o comprimento da varivel 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.

94