1 / 94

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

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

padma
Télécharger la présentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. Programação Estruturada • Utiliza somente as estruturas de controle: • Sequencial • Iterativa • Condicional

  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

  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.

  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

  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

  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

  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

  9. 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

  10. Diagrama de estrutura Módulo principal Passa dois valores Retornam dois valores ordena

  11. 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

  12. 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

  13. 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

  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.

  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

  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 x,y,med med calcMed x,y: Passagem por valor Med: Passagem por referência

  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

  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.

  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

  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 x,y CalcMed calcMed

  21. Estruturas de dados

  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.

  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.

  24. Elementos de uma matriz com uma dimensão com 5 elementos – um índice • Matriz a • [ a1 a2 a3 a4 a5 ]

  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

  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.

  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:...*)‏

  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.

  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:...*)‏

  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.

  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: ...*)‏

  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]

  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

  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

  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

  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:

  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

  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

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

  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

  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

  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

  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)‏

  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

  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

  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

  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ça escreva(dvd[índice].título, dvd[índice].intérprete, dvd[índice].autor, dvd[índice].duração)‏ fim

  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.

  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.

  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

More Related