Engenharia de Processamento Digital II AGOSTO DE 2007
BY LUIS FERNANDO ESPINOSA COCIAN ENGENHEIR O ELETRICI STA, M E. - Pr ofessor d o Curso de Engenharia ElĂŠtrica da Universidade Luterana do Brasil
Rev. 10
L
U
I
S
F
E
R
N
A
N
D
O
E
S
P
I
N
O
S
A
C
O
C
I
A
N
Sumário Sumário............................................................................................2 1.
Introdução ................................................................................5
1.1.
Objetivos Básicos ............................................................................ 5
1.2.
Habilidades Básicas ........................................................................ 5
1.3.
O que você irá aprender................................................................... 5
1.4.
Atividades Práticas de Laboratório ................................................... 6
1.5.
O que é um computador? ................................................................ 6
1.6.
Utilidade dos Computadores para a Engenharia ............................... 7
1.7.
Linguagens e Aplicações na Engenharia ........................................... 7
1.8.
Encontrando a Solução para os Problemas ....................................... 8
1.9.
A Solução dos Problemas ................................................................. 9
1.10.
Ferramentas para o desenvolvimento de Programas ........................ 15
1.11.
Os Fluxogramas ............................................................................ 18
1.12.
Problemas Típicos nos Projetos que podem ser Evitados.................. 24
2.
O C++ Builder e O IDE – Ambiente de Desenvolvimento Integrado 26
2.1.
C++ Builder - Conhecimentos Básicos ............................................ 26
2.2.
O IDE do C++ Builder .................................................................... 26
2.3.
Uma Visão Geral do IDE do C++ Builder......................................... 27
2.4.
Um Estudo mais Detalhado do IDE do C++ Builder......................... 30
2.5.
O Sistema de Ajuda ....................................................................... 47
2.8.
Estrutura e Configuração de um projeto......................................... 58
3.
Os Objetos Componentes ..........................................................63
3.1.
As Páginas de componentes ........................................................... 63
3.2.
Propriedades, Métodos e Gestores de Eventos................................. 77
3.3.
Os Componentes Visuais e Não-visuais .......................................... 82
4.
A VCL - Biblioteca de Componentes Visuais..............................84
4.1.
Detalhes da VCL............................................................................ 86
4.2.
Classes de Quadros e Aplicações.................................................... 89
4.3.
Classes de Componentes ............................................................... 94
4.4.
Restrições de uso da VCL no C++ Builder ....................................... 97
4.5.
Exercício - Quadro Negro ............................................................... 98
4.6.
Exercício - Construção de uma Aplicação usando o componente TEdit 100
2
E
N
G
E
4.7.
5.
N
H
A
R
I
A
D
E
P
R
O
C
E
S
S
A
M
E
N
T
O
D
I
G
I
T
A
L
I I
Exercício - Um Editor de Textos ................................................... 104
Programação Orientada a Objetos em C++ .............................116
5.1.
O Paradigma da POO em C++ ...................................................... 118
5.2.
Criação e Destruição de Objetos................................................... 118
5.3.
Encapsulamento ......................................................................... 120
5.4.
Construtores e Destrutores.......................................................... 122
5.5.
Herança ...................................................................................... 123
5.6.
Abstração.................................................................................... 130
5.7.
Polimorfismo ............................................................................... 135
6.
Tratamento de Exceções........................................................140
6.1.
Emissão de Exceções................................................................... 147
6.2.
Especificação de Exceções ........................................................... 148
6.3.
Captura de Exceções ................................................................... 149
6.4.
Exceções não Tratadas ................................................................ 151
6.5.
Exceções da VCL ......................................................................... 152
7.
Programação com Threads ....................................................159
7.1.
Introdução .................................................................................. 159
7.2.
A Classe Tthread ......................................................................... 160
7.3.
Inicialização dos Threads ............................................................. 161
7.4.
Execução das Threads ................................................................. 163
7.5.
Controle da execução de uma Thread ........................................... 164
7.6.
Coordenação entre as Threads ..................................................... 166
7.7.
Uso de Recursos Compartilhados ................................................. 166
7.8.
Sincronização entre Threads ........................................................ 169
8.
Criando DLLs.........................................................................171
8.1.
Tipos de Enlace Dinâmico............................................................ 172
8.2.
DLL e Gerenciamento de Memória................................................ 172
8.3.
Vantagens do Enlace Dinâmico .................................................... 172
8.4.
Função Entrada .......................................................................... 173
8.5.
Quando usar Packages e DLLs..................................................... 173
8.6.
Criando DLLs no C++Builder ....................................................... 174
8.7.
Usando DLLs no C++Builder........................................................ 177
8.8.
Criando DLLs contendo componentes VCL ................................... 180
8.9. Criando uma Aplicação que chama funções da DLL contendo componentes VCL ..................................................................................... 186
9.
Exercícios e Testes ................................................................189 3
L
U
I
S
F
E
R
N
A
N
D
O
E
S
P
I
N
O
S
A
C
O
C
I
A
N
9.1.
Engenharia de Processamento Digital II – Teste 1 de 7 .................. 189
9.2.
Engenharia de Processamento Digital II – Teste 2 de 7 .................. 192
9.3.
Engenharia de Processamento Digital II – Teste 3 de 7 .................. 194
9.4.
Engenharia de Processamento Digital II – Teste 4 de 7 .................. 196
9.5.
Engenharia de Processamento Digital II – Teste 5 de 7 .................. 199
9.6.
Engenharia de Processamento Digital II – Teste 6 de 7 - A............. 203
9.7.
Engenharia de Processamento Digital II – Teste 6 de 7 - B............. 207
9.8.
Engenharia de Processamento Digital II – Teste 6 de 7 - C............. 211
9.9.
Engenharia de Processamento Digital II – Teste 7 de 7 .................. 216
10.
Circuito RL - Tutorial ..........................................................227
10.1.
Tutorial....................................................................................... 228
10.2.
Etapa 1 – Definição do Problema.................................................. 228
10.3.
Etapa 2 - A Interface Visual ......................................................... 228
10.4.
Etapa 3 – Fluxogramas ................................................................ 237
10.5.
Etapa 4 – A Programação ............................................................. 240
10.6.
Exercícios ................................................................................... 244
11.
Considerações Finais ..........................................................246
12.
Bibliografia ........................................................................247
13.
Anexos - Notação Húngara ..................................................248
14.
Anexos - Slides ....................................................................250
4
E
N
G
E
N
H
A
R
I
A
D
E
P
R
O
C
E
S
S
A
M
E
N
T
O
D
I
G
I
T
A
L
I I
1. Introdução 1.1. Objetivos Básicos O material contido neste documento é projetado para ajudar o estudante a:
Entender a engenharia. Integrar conhecimentos de várias disciplinas. Experimentar o processo do projeto. Aprender e praticar habilidades fundamentais. Aprender sobre aplicações computacionais e gráficas. Desenvolver estudos, treinar o trabalho em equipe e praticar as suas habilidades de comunicação.
1.2. Habilidades Básicas Este material irá permitir que você:
Resolva problemas de engenharia. Desenvolva algoritmos computacionais. Adquira conhecimento útil da linguagem C e C++. Experimente algumas atividades práticas de laboratório de engenharia. Atividades Práticas
O ponto principal no escopo da disciplina é resolver problemas de engenharia, particularmente àqueles que podem apresentar solução pelo uso de sistemas computacionais.
1.3. O que você irá aprender
O processo de solução de problemas de engenharia. A linguagem de programação C++. A usar o compilador C++ Builder. A implementar rotinas de I/O e comunicação serial. As convenções de programação. A implementar aplicações computacionais. A elaborar relatórios das atividades de laboratório.
Algumas considerações e suposições sobre os acadêmicos são descritas a seguir: 1. Considera-se que o acadêmico tenha domínio completo da linguagem de programação C desde antes do início da disciplina (obtido na disciplina EPD I ou
5
L
U
I
2.
3. 4.
5.
S
F
E
R
N
A
N
D
O
E
S
P
I
N
O
S
A
C
O
C
I
A
N
equivalente) e que tenha tempo disponível reservado para efetuar o projeto além das suas outras atividades. Presume-se que o aluno estudará a linguagem C++ ao longo do semestre e que no final do mesmo demonstrará completo domínio da linguagem e da programação orientada a objetos. Considera-se que o aluno tenha acesso a um computador pessoal com sistema operacional Windows e exercite a matéria também fora do horário da aula. Presume-se que o acadêmico se exercitará de acordo com as apostilas e listas de exemplos colocados no site da disciplina até o primeiro dia do segundo mês de aulas no máximo. Presume-se também que o acadêmico não faltará às aulas e que assistirá com pontualidade (entrada e saída).
1.4. Atividades Práticas de Laboratório
Aprender os fundamentos da aquisição de dados. Medir e analisar sistemas físicos. Coletar dados com sistemas de aquisição simples em tempo real. Aprender conceitos básicos de circuitos lógicos digitais. Programar um microprocessador para controlar dispositivos do mundo-real.
1.5. O que é um computador? Então, o que é um computador? Uma definição pode ser: O computador é um sistema ou dispositivo que executa cálculos e toma decisões lógicas a velocidades de bilhões de vezes por segundo. É bom ter sempre presente que um computador não é nada além de um peso morto para segurar porta a menos que alguém diga a ele o que fazer. Para isso é necessário de um programador que coloque o conjunto de instruções que o computador irá utilizar para efetuar alguma coisa útil. Os computadores processam datas sob o controle de um conjunto de instruções chamadas programas de computador e quem os escreve são chamados de programadores. Os vários dispositivos físicos de que compõem os computadores são chamados de hardware. A coleção de programas (conjuntos de instruções com fins específicos) é chamada de software.
6
E
N
G
E
N
H
A
R
I
A
D
E
P
R
O
C
E
S
S
A
M
E
N
T
O
D
I
G
I
T
A
L
I I
1.6. Utilidade dos Computadores para a Engenharia Os engenheiros usam computadores para:
Aquisição de dados. Controle de dispositivos. Comunicações. Jogos. Sistemas expertos. Controle de processos. Análise de dados. Cálculos. Simulações. Armazenamento de informações. Automação de processos. Gráficos. Segurança. Robótica.
Algumas aplicações dos chips microprocessados são:
Controle de motores em veículos. Relógios. Sistemas ABS1 Elevadores. Câmeras. Bombas de gasolina. Termostatos. Telefones celulares. Calculadoras. Secretárias eletrônicas. Computadores pessoais. Instrumentos de medição.
1.7. Linguagens e Aplicações na Engenharia Existem várias linguagens de programação, entretanto depois de entender a sintaxe de uma única linguagem de programação, as outras são fáceis de entender. As linguagens a serem utilizadas nesta disciplina incluem a linguagem C e C++. Uso geral: C, C++, Java, Pascal, Fortran, Basic. 1
ABS: Anti-Lock Brake Systems.
7
L
U
I
S
F
E
R
N
A
N
D
O
E
S
P
I
N
O
S
A
C
O
C
I
A
N
Uso especial: MathCad, Matlab, Mathematica, Maple. Aplicações: Excel, Word, Powerpoint, LabView.
1.8. Encontrando a Solução para os Problemas A solução para um problema envolve a execução de uma série de ações em uma ordem determinada. O procedimento da solução de problemas expresso em termos de ações a serem executadas e pela ordem em que elas deverão acontecer é chamado de algoritmo. No nosso escopo a busca da solução não envolve somente a escrita de código, mas também o desenvolvimento de uma solução lógica para o problema.
1.8.1. Estruturas de Controle As estruturas de controle da ordem da execução são: Seqüência: completar as tarefas em certa ordem. Seleção: escolha do conjunto de tarefas a serem completadas baseadas em expressões lógicas (sim ou não). Repetição: completar a mesma tarefa mais de uma vez. Abstração: usando um conjunto de tarefas simples para completar uma tarefa maior. Por exemplo: a leitura de um byte de um disco requer de um algoritmo que determina onde o byte está, o coloca a cabeça leitora na posição correta e então lê o byte quando o disco estiver na posição correta.
1.8.2. A Arte da Programação “A coisa mais importante na vida é ser participativo”. Woody Allen. “A coisa mais importante na programação dos computadores é a Sintaxe” Mike Miller “Programar não é um esporte espectador. Para ser bom você tem que praticar, praticar e praticar.” Rick Freuler “A aprendizagem da programação entra mais pelos dedos do que pelos olhos” Luis Fernando Espinosa Cocian
8
E
N
G
E
N
H
A
R
I
A
D
E
P
R
O
C
E
S
S
A
M
E
N
T
O
D
I
G
I
T
A
L
I I
Para ser bem sucedido nesta disciplina você deverá ser participativo e atento. Se você faltar a um único dia, faltará a um tópico inteiro do programa. Cada dia de aula constrói mais conhecimento acima da aula anterior e requer do conhecimento adquirido tratado nela. Caso você tenha que faltar a várias aulas é importante que você se dê conta do que está perdendo. A programação funciona como a operação dos computadores, na forma binária. Isto é você pode estar certo ou estar errado. Você deverá prestar atenção na forma em que as linhas de código são colocadas e prestar especial atenção aos detalhes. A falta de um simples ponto-e-vírgula ou de uma vírgula pode determinar o sucesso ou fracasso dos seus programas. Assim como para aprender a tocar um instrumento musical ou a falar uma lingual estrangeira, você deve se envolver dedicando tempo para a prática e sendo hábil em aprender dos seus próprios erros. Qualquer um pode aprender a programar, e algumas pessoas precisam de mais prática do que de outras.
1.9. A Solução dos Problemas 1.9.1. Introdução à Solução de Problemas Os engenheiros devem analisar e resolver uma grande faixa de problemas técnicos. Alguns desses problemas podem ser simples e de única solução, enquanto que outros podem não ter solução conhecida requerendo de uma equipe de engenheiros de várias especialidades. Muitos dos problemas de engenharia podem não ter solução clara. A maioria dos problemas tem mais de uma solução, de forma que o programador deverá baseado na sua experiência tentar adquirir o conhecimento e o entendimento do problema para produzir a solução que resolve o problema de forma mais eficiente. A solução de problemas é uma arte na qual o engenheiro sintetiza a sua única solução. O foco desta disciplina é a de resolver problemas que fazem o melhor uso da programação de computadores. A solução de problemas envolve:
Experiência Conhecimento Processamento Arte
9
L
U
I
S
F
E
R
N
A
N
D
O
E
S
P
I
N
O
S
A
C
O
C
I
A
N
O nosso foco: a solução de problemas de engenharia assistida por computador. Os computadores são excelentes ferramentas para a solução de problemas baseados em regras bem determinadas.
1.9.2. Ciência e Arte Como mencionamos anteriormente, a solução de problemas requer de uma combinação de ciência e arte. Olhando pelo lado técnico você tem a Matemática, Química, Eletricidade, Mecânica, etc., e pelo lado artístico temos assuntos tais como o julgamento, experiência anterior, senso comum, know-how e outros.
Ciência
Arte
Matemática
Julgamento
Física
Experiência
Química
Senso comum
Eletricidade
Know-how
Mecânica
...
...
1.9.3. O Método de Engenharia O uso do método de engenharia é uma boa maneira de começar a desenvolver algoritmos de programação e por isso a maioria dos problemas desta disciplina serão resolvidos usando este método. Ele envolve o reconhecimento e entendimento do problema, a coleta dos dados exatos quando necessário, a seleção dos modelos, teorias e princípios aplicáveis à natureza do problema, a fazer suposições válidas e seguras quando não se tiver 100% de certeza de todas as variáveis que podem interferir no problema e na sua solução. Logo então, se tentará resolver o problema verificando posteriormente os resultados e o desempenho da solução. No caso em que os resultados não são os esperados, você deverá voltar alguns passos atrás para melhorar a solução. Para concluir, você geralmente deverá apresentar a solução para o seu chefe, seus colegas, família, amigos ou para qualquer um que pediu para você resolver o problema. O método de engenharia é implementado através dos seguintes passos: Reconhecer e entender o problema. Coletar dados (e verificar a sua exatidão). Selecionar as teorias, modelos e princípios aplicáveis ao problema.
10
E
N
G
E
N
H
A
R
I
A
D
E
P
R
O
C
E
S
S
A
M
E
N
T
O
D
I
G
I
T
A
L
I I
Fazer suposições simplificadoras quando necessário. Resolver o problema. Verificar os resultados. Apresentar a solução.
1.9.4. Tipos de Problemas de Engenharia Os problemas de engenharia podem ser agrupados em vários tipos. A maioria das pessoas pensa que os problemas de engenharia envolvem a criação de novos produtos. Os engenheiros também se envolvem na modificação de produtos existentes. O mercado está sempre procurando por formas de fazer as coisas de forma mais rápida, barata e ao mesmo tempo melhores. Um bom exemplo é a evolução da construção de computadores pessoais nos últimos trinta anos. Os engenheiros podem estar envolvidos no desenvolvimento ou melhoria de procedimentos ou processos. Por exemplo, ao invés de desperdiçar espaço para armazenar três meses de estoque, um engenheiro pode desenvolver um novo processo que produz o produto na demanda (on-demand) e usa o espaço do velho almoxarifado para alguma outra coisa. Este tipo de tarefa pode envolver vários assuntos tais como estatística, química e redes de computadores. Os engenheiros também devem levar em conta os fatores humanos. Depois de tudo, se o produto não melhorar a vida das pessoas em geral qual a utilidade dele? Alguns exemplos são o piloto automático dos carros de passeio, os air-bags de segurança, as escadas rolantes dos aeroportos e ferramentas de gestão. As leis da física podem ser discretizadas através de modelos matemáticos especiais que permitem, junto aos recursos gráficos, de simular sistemas reais. Alguns tipos de problemas podem ser: Criação de novos produtos. o Invenção e conceito. o Reprojeto de um produto existente. Redução de custos o Fazer mais rápido, barato e melhor. Desenvolvimento e otimização de processos. o Ex. Processos de Just-in-Time. Fatores humanos. o Melhoria na saúde. o Conforto: piloto automático, escadas rolantes, etc. o Comunicação: telefonia celular, VOIP, etc. Projeto assistido por computador.
11
L
U
I
S
F
E
o o o
R
N
A
N
D
O
E
S
P
I
N
O
S
A
C
O
C
I
A
N
Simulações. Comunicações. Gráficos e diagramas.
1.9.5. Tipos de Informação para a Solução de Problemas Parte do processo de solução de problemas envolve a coleta de informação antes, durante e depois da solução do problema. Os tipos de informação podem ser agrupados em: levantamentos iniciais, operações, objetivos, formulação do problema e a solução escolhida.
Dados iniciais: são informações sobre as condições iniciais do problema. Operações: são as várias ações que podem ser executadas para a solução. Objetivos: é a condição final desejada para o problema. Formulação: é o estabelecimento e descrição do problema a qualquer tempo. Solução: com os dados iniciais, operações, objetivos e a formulação sendo completamente especificados que permitem alcançar os objetivos definidos.
1.9.6. Passos no Processo da Solução de Problemas Agora que se tem uma idéia de que tipo de informações deve ser processado, podem se desenvolver os passos gerais necessários para a solução de problemas. Identificação do problema: primeiro deve se identificar a raiz do problema. Não se pode resolver um problema se não se sabe com exatidão o que está errado. Você não poderá consertar um aparelho se não identificar o que está estragado nele. 6. Determinar o que é requerido para a solução: o próximo passo é olhar para o problema e determinar a solução requerida usando um pouco de lógica. Listar o que é conhecido, o que é desconhecido (e se você pode executar algum teste para coletar maiores informações), quais sãos as restrições ou limitações e, se existem características especiais que devem ser levadas em conta neste problema. O que é conhecido? O que é desconhecido? Quais são as restrições ou limitações? Quais são as características especiais? Desenvolver um plano (algoritmo) de passo-a-passo. 7. Representar a solução na forma de um diagrama lógico: é bastante útil representar a solução de um problema de programação usando diagramas lógicos que mostram como será resolvido o problema. 8. Executar o planejado: finalmente executar o plano, e enquanto fizer isto revise o que está funcionando e o que não. 9. Analisar a solução implementada: quando a solução é alcançada, esta pode ficar totalmente como esperado. A solução implementada deve ser analisada e o plano deve ser revisado e executar novamente quantas vezes for necessário. Mantenhase no caminho que você considera como bom e altere as partes consideradas não tão boas. 10. Documente os resultados: o processo finaliza quando forem editados os relatórios escritos que descrevem os detalhes da implementação e documenta os
12
E
N
G
E
N
H
A
R
I
A
D
E
P
R
O
C
E
S
S
A
M
E
N
T
O
D
I
G
I
T
A
L
I I
resultados obtidos. É nesses documentos que o seu chefe vai conhecer que a sua solução é eficiente e que a sua idéia funcionou.
1.9.7. A Falha é a Mãe da Invenção: A História da Lata de Bebidas A seguir é contada a história de um dos dispositivos em que as pessoas usam, mas não pensam muito neles. A idéia das latas de bebidas é bastante velha e tem mudado drasticamente desde a primeira solução. A seguir são mostradas algumas poucas iterações da solução para esse problema e os problemas conseqüentes associados às novas soluções. Problema 1: Manter alimentos sem deterioração. Solução 1: Em 1809 Nicholas Appert inventou um processo para preservar alimentos em garrafas de vidro enchendo-as com água para matar as bactérias. Ele ganhou um prêmio de 12.000 francos do governo francês. Em 1810 Appert escreveu o livro “L’Art de Conserver” que teve bastante sucesso. Problema 2: As garrafas quebram com facilidade. Solução 2: O inglês Peter Durand inventou a lata selada de latão. Problema 3: Como abrir a lata? Os soldados usavam facas, baionetas e até tiros de fuzil. Uma das latas levadas por um tripulante da expedição de William Parry ao pólo norte tinha as seguintes instruções: “Corte ao redor perto da borda superior com martelo e talhadeira”. A lata (feita de ferro fundido) tinha 5 mm de espessura e uma massa de1 kg (vazia). Solução 3: Usar uma lata feita de aço (mais forte podendo ser mais fina e leve), e a criação de uma ferramenta especial para abrir latas (você deve conhecer alguma). Em 1858 o estadunidense Ezra Warner registrou uma patente para o abridor de latas que foi descrito como “parte baioneta, parte foice com uma grande lamina em curva”. Em 1870 o também estadunidense William Lyman patenteou um abridor de latas com uma roda que rodava ao redor de um furo feito no meio da lata. Problema 4: o abridor de Lyman tinha que ser ajustado para cada tamanho de lata e tinha que ser feito um furo exato no centro da lata para a ferramenta ser eficiente. Solução 4: O abridor de latas moderno foi patenteado em 1925. Ainda há lugar para melhorias nessa área.
13
L
U
I
S
F
E
R
N
A
N
D
O
E
S
P
I
N
O
S
A
C
O
C
I
A
N
Problema 5: As latas amolecem e empenam. Solução 5: Adicionar um anel de reforço na parte superior e inferior. Ondular a parte lateral. Problema 6: As latas abertas com o abre-latas ficavam com a abertura com bordas grandes e cortantes. Solução 6: A criação do abridor de ponta. Problema 7: usualmente quando necessário você não tinha ou não achava o abridor. Solução 7: Latas com abridores embutidos descartáveis. Problema 8: O que fazer com os abridores depois da lata ter sido aberta. Jogar no lixo? Artesanato? Colocá-la dentro da lata? Solução 8: Deixar os anéis abridores colados á parte superior da lata. Problema 9: Algumas pessoas com unhas compridas ou fracas, dedos artríticos não podem abrir as latas. Solução 9:...etc.etc. etc.
1.9.8. Exemplo de Solução de Um Problema Aqui é mostrado um problema a ser resolvido na classe usando o método de engenharia. O problema é simplesmente encher uma garrafa com pedras. Descrição do Problema: encher uma garrafa com pedras. Primeiro devemos documentar qualquer suposição que possa ser requerida e; 11. escrever o procedimento passo-a-passo que resolve o problema.
A seguir devem ser feitas as suposições que sejam consideradas seguras de fazer. Podemos assumir algumas tais como que a garrafa existe. É importante não fazer suposições muito amplas como aquelas que evitam o problema tais como “uma pessoa sabe como encher a garrafa sem nenhuma ajuda”. Suposições:
A garrafa existe e está disponível. As pedras existem e estão disponíveis. Existem pedras suficientes para encher a garrafa. A garrafa está vazia (ou não totalmente cheia). Algumas pedras (ou todas) cabem na abertura da garrafa.
A seguir é mostrada uma solução possível em seis passos.
14
E
N
G
1. 2. 3. 4. 5. 6.
E
N
H
A
R
I
A
D
E
P
R
O
C
E
S
S
A
M
E
N
T
O
D
I
G
I
T
A
L
I I
Algoritmo: Colocar a garrafa de boca para cima perto das pedras. Verificar para saber que a garrafa não está cheia. Se estiver, vá ao passo 6. Pegar uma pedra e tentar colocá-la na garrafa. Se a pedra for muito grande para caber, descarte-a, e volte ao passo 3. Se a pedra coube, então vá ao passo 2. Pare de encher.
EXERCÍCIOS PARA CASA Escreva um detalhado conjunto de instruções (algoritmo) para a substituição do pneu e da câmara interna da roda dianteira de uma bicicleta de 10 marchas. A bicicleta tem pinças de freios que podem ser danificados caso o pneu não estiver totalmente sem ar. A bicicleta deve ficar pronta para andar quando o trabalho descrito no seu algoritmo estiver completo. Organizar o conjunto detalhado de instruções em tarefas lógicas. Documente qualquer suposição que seja feita. O seu chefe solicitou a você para instruir um novo empregado no uso dos instrumentos de desenho. A sua tarefa é explicar como se constrói um polígono usando os instrumentos de desenho. Você decidiu começar com a construção de um dodecágono regular (polígono com doze lados) usando somente uma caneta, uma régua e um compasso. Assumir que o novo empregado não tem experiência com o uso dos instrumentos de desenho. Você deve especificar quais instrumentos serão usados. Pode ser útil desenhar diagramas simples para ajudar o novo empregado a entender você de forma mais fácil.
1.10. Ferramentas para o desenvolvimento de Programas Existem várias ferramentas e técnica que podem ser usadas para o desenvolvimento de programas e que são úteis na organização das tarefas na solução
de
problemas.
Muitas
dessas
ferramentas
estão
focadas
no
desenvolvimento de algoritmos, na representação desses algoritmos e no refinamento ou estruturação dos algoritmos desenvolvidos. Técnica de projeto Top-Down: Começar com funções gerais e efetuar vários passos de refinamento para funções mais específicas. 1. Pseudocódigo: Uso de linguagens artificiais e informais para ajudar o programador a desenvolver os algoritmos. 2. Diagramas lógicos: Representações alternativas de algoritmos incluindo gráficos e diagramas de estados.
15
L
U
I
S
F
E
R
N
A
N
D
O
E
S
P
I
N
O
S
A
C
O
C
I
A
N
As técnicas e ferramentas que serão utilizadas neste documento são: as técnicas de projeto Top-Down, pseudocódigos e diagramas lógicos. A técnica mais usada no desenvolvimento de programas (e na solução dos problemas de engenharia) é a técnica de projeto Top-Down. Esta técnica começa com a função global do problema e a sua quebra ou divisão em problemas menores. O pseudocódigo é uma ferramenta usada para desenvolver um algoritmo, usualmente numa linguagem escrita informal. Os diagramas lógicos são formas de representação de um algoritmo.
1.10.1. Método Top-Down Começa com uma formulação simples que descreve a função global do programa. Esta é uma representação completa, embora simples, do programa. A seguir se subdivide a formulação mais ampla em uma série de tarefas pequenas que são listadas na ordem que devem ser executadas para produzir a primeira formulação. A continuação essas tarefas pequenas são subdivididas em tarefas ainda menores definindo as variáveis específicas que possam ser necessárias neste segundo refinamento. Continuam-se subdividindo as tarefas enquanto for necessário até que o algoritmo esteja completamente desenvolvido. Quando este método for usado combinado com o pseudocódigo, a escrita do programa é rápida e direta. Veja o exemplo a seguir: O problema: Os estudantes da turma fizeram o seu primeiro teste. As notas (na faixa de 0 a 10) já estão disponíveis. Determinar a média das notas da turma para esse teste. Dados: Conjunto de notas e faixa válida para as mesmas. Desconhecido: Quantidade de notas. Média (a ser calculada) Suposições: Uma nota “fora da faixa” pode ser usada para indicar que todas as notas válidas foram inseridas. Isto às vezes é chamado de flag. Usando pseudocódigo podemos representar o problema global (Top) como: Determinar a média da classe para o teste.
A seguir se efetua o primeiro refinamento: 1. Determinar a média da classe para o teste. 1.1. Inicializar as variáveis. 1.2. Inserir, Somar e Contar as notas. 1.3. Calcular e Imprimir a média da turma.
A seguir continua se refinando cada um dos elementos.
16
E
N
G
E
N
H
A
R
I
A
D
E
P
R
O
C
E
S
S
A
M
E
N
T
O
D
I
G
I
T
A
L
I I
2. Determinar a média da classe para o teste. 1.4. Inicializar as variáveis: 1.4.1. Inicializar o contadores de número de inserções com zero. 1.4.2. Inicializar o acumulador de notas com zero. 1.5. Inserir, Somar e Contar as notas: 1.5.1. Inserir a primeira nota. 1.5.2. Enquanto o usuário não inserir o flag de fim: 1.5.2.1. Somar a nota ao acumulador 1.5.2.2. Adicionar um ao contador de notas 1.5.2.3. Inserir a nota seguinte (ou possivelmente o flag) 1.6. Calcular e Imprimir a média da turma. 1.6.1. Se o contador de notas for diferente de zero: 1.6.1.1. Calcular a média pela divisão entre o valor no acumulador e o número de notas inseridas. 1.6.1.2. Imprimir a média. 1.6.2. Senão (no caso em que o contador de notas for igual a zero): 1.6.2.1. Imprimir uma mensagem indicando que nenhuma nota for inserida.
MANIPULANDO CASOS ESPECIAIS Notar a estrutura Se-Senão no problema anterior, que mostra o gerenciamento de um caso especial que é também chamado de exceção. As exceções acontecem tipicamente em avaliações lógicas, expressões matemáticas ou em qualquer entrada permitida ao usuário. As conseqüências de não ter cuidado em manipular todos os casos em geral resultam o desempenho ruim do programa. Você já deve ter vivenciado a frustração na presença de uma BSOD2 das versões mais antigas do Windows®. A Figura 1-1 mostra uma situação que, a menos que você seja o piloto do avião, nunca iria esperar acontecer. Desta forma, é importante levar sempre em conta as “barbaridades” que o usuário poderá executar quando você estiver criando um programa ou produto. As exceções não vistas pelo programador serão eventualmente criadas pelo usuário final. Por isso, é necessário assegurar que todas as exceções possíveis estão sendo gerenciadas. Um método bastante popular de teste com usuários finais é a liberação de cópias de software “beta” onde o público testa o software e permite fornecer um feedback sobre os problemas encontrados. No caso dos projetos de software de engenharia, isto obviamente nem sempre pode ser feito como no caso de aplicações militares, controle de reatores nucleares ou em aplicações em satélites.
2
BSOD: Blue Screen of Death.
17
L
U
I
S
F
E
R
N
A
N
D
O
E
S
P
I
N
O
S
A
C
O
C
I
A
N
Figura 1-1 – As possíveis exceções devem ser gerenciadas.
1.10.2. Alguns Tipos de Diagramas Lógicos Os métodos de organização do pseudocódigo incluem os diagramas lógicos. Alguns tipos de diagramas lógicos são: fluxogramas, máquinas de estado, diagramas de causa-efeito, redes de Petri, diagramas de ação e muitos outros que relacionam informações mais variadas em seqüências lógicas. Os fluxogramas são representações gráficas de um algoritmo e são apropriados para que os programadores possam visualizar o fluxo dos seus programas. Eles podem ser usados como uma ferramenta auxiliar para escrever os programas e a pesar de não existir um padrão formal, existem algumas regras que serão discutidas no seguir deste documento. Os diagramas de ação são baseados numa técnica mais textual para representar na forma de diagramas as estruturas de controle do programa. O resultado é um resumo que lembra a aplicação computacional. Este tipo de diagrama indica que coisas acontecem, onde e quantas vezes. O pseudocódigo mostrado anteriormente pode ser usado como base para um diagrama de ação.
1.11.
Os Fluxogramas
Os fluxogramas podem ser ferramentas úteis no desenvolvimento dos programas. Eles não mostram a descrição completa do programa e são usados em combinação com outras ferramentas. Os fluxogramas devem ser feitos antes de escrever o programa, no entanto pode também ser usados para que os programadores possam entender o código que outros programadores já escreveram.
18
E
N
G
E
N
H
A
R
I
A
D
E
P
R
O
C
E
S
S
A
M
E
N
T
O
D
I
G
I
T
A
L
I I
O programa final pode ser diferente do fluxograma desde que somente são colocadas as declarações das funções, excluindo a especificidade das mesmas. Os fluxogramas devem incluir todas as rotinas e sub-rotinas que compõem o programa. A seguir são detalhados alguns símbolos usados comumente nos fluxogramas com as suas respectivas representações.
1.11.1. Símbolos dos Fluxogramas INÍCIO E FIM DE UM PROGRAMA OU SUBROTINA O início e fim de um programa são normalmente representados com formas ovais. Pode usar um texto comum como “início” ou no caso de uma subrotina: “enter”, por exemplo. As setas mostram o fluxo do programa apontando para o seguinte bloco seqüencial de programa no fluxograma.
Início
Fim
Figura 1-2 - Blocos de início e fim de um programa ou sub-rotina.
MENSAGENS Para indicar o envio de uma mensagem para o usuário é usado um bloco com a forma mostrada na Figura 1-3. Notar que o texto não necessariamente precisa indicar com exatidão o que será mostrado na tela (ou enviado para uma outra interface), mas um resumo da mensagem que seja familiar ao programador para lembrar quando estiver desenvolvendo o código do software.
19
L
U
I
S
F
E
R
N
A
N
D
O
E
S
P
I
N
O
Mensagem ao usuário
S
A
C
O
C
I
A
N
Resultado
Erro
Figura 1-3 - Bloco para indicar mensagem para o usuário.
ENTRADA DE DADOS DO USUÁRIO Quando devam ser lidos dados a partir de um teclado, mouse ou outro dispositivo de interação com o usuário, o símbolo do bloco é mostrado na Figura 1-4. Neste caso, cada entrada do teclado deve ser precedida de uma mensagem indicando ao usuário que é necessária a sua intervenção com informações de entrada. Isto não ocorre necessariamente a cada momento, entretanto é comum quando informações devem ser inseridas pelo teclado.
Temperatura
Figura 1-4 - Bloco de entrada de dados pelo usuário.
LEITURA E ESCRITA EM ARQUIVOS Para a leitura ou escrita de dados em arquivo utiliza-se os blocos mostrados na Figura 1-5.
Recuperar de arquivo
Armazenar em arquivo
Figura 1-5 - Bloco de armazenamento e recuperação de dados em arquivos.
20
E
N
G
E
N
H
A
R
I
A
D
E
P
R
O
C
E
S
S
A
M
E
N
T
O
D
I
G
I
T
A
I I
L
ESTRUTURAS DE DECISÃO E SELEÇÃO Os
pontos
de
decisão
que
controlam
o
fluxo
do
programa
são
representados pelo bloco da Figura 1-6. No interior do bloco é inserida uma pergunta que decidirá o fluxo do programa caso a resposta seja verdadeira ou falsa.
N
x>0
x<0 x
a > b?
x=0
S
Figura 1-6 - Bloco de decisão.
PROCESSAMENTO GERAL Os comandos gerais, como as equações matemáticas, podem ser colocados dentro de um bloco na forma retangular.
x = sqrt(y)
Figura 1-7 - Bloco de processamento geral.
OS LAÇOS DEFINIDOS Os laços podem ser representados usando estruturas um pouco mais complexas que incluem um bloco de seleção. Os laços definidos completam uma tarefa certo número de vezes e servem para cálculos ou operações iterativas. A execução começa na seta do topo que inicializa uma variável de contagem para o seu valor inicial. Enquanto esse valor for menor ou igual que o valor limite o código executado é o indicado pela seta “S” e retorna pela seta da esquerda onde a variável de contagem é incrementada. Este processo continua até que a variável
21
L
U
I
S
F
E
R
N
A
N
D
O
E
S
P
I
N
O
S
A
C
O
C
I
A
N
de contagem seja maior que o valor limite, desviando o fluxo para o código indicado pela seta “N”.
N
i=0 i <= 1000 i ++ S
Figura 1-8 - Bloco de laço definido.
OS LAÇOS INDEFINIDOS O laço indefinido indica a repetição da execução de uma tarefa pela execução de um trecho de código por um número indefinido de vezes. Dependendo do resultado da expressão lógica indicada no bloco (verdadeiro ou falso) o fluxo seguirá a seta correspondente.
N Faça enquanto: valor < = valor limite
S
Figura 1-9 - Laço indefinido.
CONECTORES Quando os fluxogramas ficam muito grandes pode ser necessário o uso de conectores para conectar as setas entre blocos afastados na mesma página ou com blocos em outras páginas. Para manter os fluxogramas simples e legíveis deve se evitar ao máximo o uso dos conectores em casos desnecessários.
Conectores dentro da mesma página Para
1
1
De
2
2
22
E
N
G
E
N
H
A
R
I
A
D
E
P
R
O
C
E
S
S
A
M
E
N
T
O
D
I
G
I
T
A
L
I I
Figura 1-10 - Conectores para pontos do fluxograma na mesma página.
Conectores para outras páginas De A
B
Para
Figura 1-11 - Conectores para pontos do fluxograma em outras páginas.
CHAMADAS DE SUB-ROTINAS A chamada de subprogramas ou sub-rotinas é representada pelo bloco da Figura 1-12. O nome da sub-rotina deve ser o nome do subprograma que cujo fluxograma pode estar na mesma página ou em outra separada.
Figura 1-12 - Bloco para representar a chamada de uma sub-rotina.
1.11.2. Exercício Com os assuntos tratados até aqui, sugere-se desenvolver as suas habilidades na elaboração de fluxogramas usando o método Top-Down através do seguinte exercício. Descrição do Problema: Existem vários componentes elétricos numa caixa que devem ser selecionados pelo tipo e colocados em caixas separadas. São resistores, capacitores, indutores, diodos, transistores e circuitos integrados. Desenvolver um fluxograma ou algoritmo para resolver o problema. Suposições: Existem 6 caixas identificadas com as seguintes palavras: “resistores”, “capacitores”, “indutores”, “diodos”, “transistores“ e “circuitos integrados“. 3. Existem contadores de algum tipo (eletromecânicos ou eletrônicos). 4. A pessoa que vai separar os componentes não é cega e sabe distinguir a diferença entre os componentes. 5. Não existem outros tipos de componentes além dos citados na caixa.
23
L
U
I
S
F
E
R
N
A
N
D
O
E
S
P
I
N
O
S
A
C
O
C
I
A
N
Quais são os dados desconhecidos? Começar com a formulação geral do problema. Desenvolver os passos para resolver o algoritmo.
1.12. Problemas Típicos nos Projetos que podem ser Evitados 1.12.1. Problemas Típicos na Elaboração de Programas de Computador
Excesso de código ineficiente. Excesso no uso de variáveis locais. Uso impróprio de funções. Inexistência de comentários no código (comentários não ocupam espaço de memória). Não uso da metodologia Top-Down. Inexistência de fluxogramas. Não ter um cronograma. Não começar a trabalhar o assunto cedo o suficiente. Deixar tudo para última hora.
Figura 1-13 - Privar-se do sono por ter deixado o seu projeto para últiima hora pode acarretar grandes problemas.
1.12.2. Problemas Potenciais do Trabalho em Equipe
Tomar decisões de consenso. Como tomar decisões. Distribuir as tarefas entre os membros da equipe. O que acontece quando um membro da equipe está com problemas de completar a sua parte do trabalho?
24
E
N
G
E
N
H
A
R
I
A
D
E
P
R
O
C
E
S
S
A
M
E
N
T
O
D
I
G
I
T
A
L
I I
1.12.3. Algumas sugestões para evitar problemas Elabore um cronograma de projeto e mantenha-o atualizado. O cronograma é um documento vivo que requer de alterações diárias e semanais. Faça a previsão do que deverá ser feito caso um membro da equipe não alcance os objetivos propostos. Defina o que deverá ser feito se alguém faltar às reuniões de integração. Elaborar planos alternativos e saiba quando devem ser aplicados, Estabeleça metas realistas.
Figura 1-14 – Estabeleça metas realistas.
Aceite riscos calculados. Todas as decisões nos projetos de engenharia (assim como na vida) envolvem riscos de alguma natureza. As escolhas e decisões devem ser baseadas nas considerações das conseqüências e resultados. Calcule cuidadosamente os riscos envolvidos nos seus projetos.
Figura 1-15 - Tome riscos calculados.
Mantenha o trabalho sempre em dia. Compartilhe a agenda do projeto com os membros da equipe. Mantenha as informações atualizadas. Documente as reuniões e as decisões feitas. Verificar a execução do cronograma de forma constante. Mantenha os membros da equipe informados do processo.
25