FACENS – Engenharia da Computação Lógica Computacional II Modelagem Abstrata de Programas Desenvolvimento de Software • Níveis de abstração (mais alto para mais baixo) — — — — — — — — — — — — Linguagem Natural Diagramas Módulos Classes Funções (ou Métodos) … … Pseudocódigo Linguagem de Programação Assembly Linguagem de Máquina Circuitos Lógicos … Desenvolvimento de Software • Softwares complexos devem ser particionados (dividir para conquistar) • É necessário um dispositivo para separar de fato o código em módulos, por vários motivos: — — — — Facilidade de manutenção Eliminição de repetições Trabalho em equipes Reutilização futura • Em linguagens estruturadas, utilizam-se funções, em orientação a objetos, classes Funções • Trecho de código destinado a realizar algum processamento, que pode receber parâmetros e prover algum retorno • y = f(x) , y = x2 • São chamadas, realizam o processamento e retornam para o trecho que as chamou programa ... ... funcao (x: numérico) y funcao(x) escreva y ... fim. retorno x*x fim. Estrutura das Funções • A estrutura geral de uma função é: <tipo do retorno> nome_funcao (parametros: tipos e nomes) <variaveis> inicio [ comandos, enquanto, se, escreva, leia ] < retorno valor > fim. • Exemplo: numérico quadrado (x: numérico) y: numérico inicio y x * x retorno y fim Funções e Escopo • Cada função tem suas próprias variáveis, chamadas de locais, que só existem dentro da função • Caso as funções necessitem compartilhar variáveis, devem ser declaradas variáveis do programa (globais) • A melhor alternativa é fazer isto através de passagem de parâmetros, pois as funções ficam mais independentes do contexto (melhor modularização do programa) Exemplo • Programa-exemplo: Faça um programa de eleição, onde o usuário informa o número de candidatos, e depois informa os nomes destes candidatos. A seguir, a votação é iniciada, até que o usuário deseje parar. O usuário vota digitando o nome do candidato. Finalmente, o nome do vencedor deve ser exibido na tela. Desconsidere situações de empate. Exemplo • Primeira etapa: função principal programa eleicao principal() inicio receber_candidatos() receber_votos() encontrar_maior() mostrar_vencedor() fim. fim. Exemplo • Segunda etapa: resolvendo função receber_candidatos receber_candidatos () nomes[50]: literal i, num_candidatos, votos[50]: numérico inicio leia (num_candidatos) para i0 até num_candidatos-1 passo 1 faça leia(nomes[i]) votos[i] 0 fim para retorno fim Exemplo • • Problema: nomes, votos e num_candidatos não podem pertencer a função, pois serão utilizados em outros pontos do programa Solução: transformá-los em variáveis globais programa eleicao receber_candidatos () nomes[50]: literal num_candidatos, votos[50]: numérico principal() i: numérico inicio leia (num_candidatos) para i0 até num_candidatos-1 passo 1 faça inicio receber_candidatos() leia(nomes[i]) receber_votos() votos[i] 0 encontrar_maior() fim para mostrar_vencedor() retorno fim. fim. fim Exemplo • Solução melhor: utilizar retorno e parâmetros, como exemplificado com num_candidatos programa eleicao nomes[50]: literal votos[50]: numérico principal() num_cand: numérico inicio numérico receber_candidatos () n: numérico inicio leia (n) para i0 até n-1 passo 1 faça leia(nomes[i]) num_cand = receber_candidatos() votos[i] 0 receber_votos() encontrar_maior() mostrar_vencedor() fim. fim. fim para retorno n fim Exemplo • Terceira etapa: resolvendo receber_votos. Surge a necessidade de outra função. receber_votos () nome, continuar: literal indice: numérico inicio faça leia (nome) indice encontre_nome(nome); se (indice >= 0) votos[indice] votos[indice] + 1 fim se leia (continuar) enquanto (continuar = “s”) retorno fim Exemplo • Quarta etapa: a função encontrar_maior numérico encontrar_maior () indice_maximo, i: numérico inicio indice_maximo 0; para i1 até num_candidatos-1 passo 1 faça se (votos[i] > votos[indice_maximo]) indice_maximo i fim se fim para retorno indice_maximo fim • (Vamos considerar todas as variáveis globais para simplificar) Exemplo • Quinta etapa: a função mostrar_vencedor. A função principal precisará passar o indice do vencedor mostrar_vencedor (indice: numérico) inicio escreva(“O vencedor é: ”, nomes[indice], “ com ”, votos[indice], “ votos.”). retorno fim • Funções muito simples levantam a dúvida quanto a necessidade da sua existência. Exemplo • Final: a função principal precisa de pequenos ajustes para trabalhar com as novas funções programa eleicao nomes[50]: literal i, num_candidatos, votos[50]: numérico principal() indice_vencedor: numérico inicio receber_candidatos() receber_votos() indice_vencedor encontrar_maior() mostrar_vencedor(indice_vencedor) fim. fim. Exercício 1. Escreva a função encontre_nome 2. Utilize as técnicas apresentadas no problema: Crie um programa de loja de carros, que mostra para o usuário um menu, para que ele escolha 0-sair, 1incluir, 2-excluir ou 3-listar os carros. As informações do carro são: placa, ano e nome. A opção 0 sai do programa, 1 inclui um carro na lista, 2 apaga o último carro da lista e 3 mostra a lista de carros. Considere que no máximo 1000 carros podem ser cadastrados.