960 likes | 1.08k Views
Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 15/02/2014. EEL170 COMPUTAÇÃO I www.del.ufrj.br/~ac/eel170.htm. Programação Estruturada. Utiliza somente as estruturas de controle: Sequencial Iterativa Condicional. Pascal. Linguagem de programação: Estruturada
E N D
Antonio Cláudio Gómez de Sousa ac@del.ufrj.br 2a série de slides Versão 15/02/2014 EEL170 COMPUTAÇÃO Iwww.del.ufrj.br/~ac/eel170.htm
Programação Estruturada • Utiliza somente as estruturas de controle: • Sequencial • Iterativa • Condicional
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
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.
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
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
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
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
Exemplo – ordenar tres variáveis Ordenar tres variáveis utilizando um módulo que ordena duas variáveis: Início Ler as variáveis a, b, c Ordena a b // módulo devolve ab ordenado Ordena b c // módulo devolve bc ordenado Ordena a b // módulo devolve ab ordenado Apresentar as variáveis a, b, c fim
Diagrama de estrutura Módulo principal Passa dois valores Retornam dois valores ordena
Algoritmo simplificado Inicio // 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
Algoritmo simples Inicio // 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
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
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.
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
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 x,y,med med calcMed x,y: Passagem por valor Med: Passagem por referência
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
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.
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
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 x,y CalcMed calcMed
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.
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.
Elementos de uma matriz com uma dimensão com 5 elementos – um índice • Matriz a • [ a1 a2 a3 a4 a5 ]
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
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.
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:...*)
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.
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:...*)
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.
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: ...*)
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]
(* 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
{ 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
(* 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
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:
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
// 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
//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
// 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
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
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
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)
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
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
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
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ça escreva(dvd[índice].título, dvd[índice].intérprete, dvd[índice].autor, dvd[índice].duração) fim
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.
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.
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