Notas de aula de Engenharia de Software (C) Jair C Leite, 2000
Índice | Próximo
1 Introdução à Engenharia de Software
Objetivos
Apresentar as motivações pela qual a disciplina e a profissão de engenharia de software faz-se necessária. Veremos algumas definições e uma visão geral
da área. Discutiremos o que é software, diferenciando-o de programa e vendo-o como um artefato conceitual. Discutiremos ainda as diferenças entre
programação e engenharia de software.
Algumas questões deverão ser discutidas:
Qual o contexto de um software?
Software e programa são a mesma coisa?
Engenharia de Software é o mesmo que programação?
1.1 Sistemas baseados em computador
Um sistema baseado em computador é aquele que automatiza ou apóia a realização de atividades humanas através do processamento de informações.
Um sistema baseado em computador é caracterizado por alguns elementos fundamentais.
Hardware
Software
Informações
Usuários
Tarefas
Documentação
O hardware corresponde às partes eletrônicas e mecânicas (rígidas) que possibilitam a existência do software, o armazenamento de informações e a
interação com o usuário. A CPU, as memórias primária e secundária, os periféricos, os componentes de redes de computadores, são exemplos de
elementos de hardware. Um único computador pode possibilitar a existência de diversos sistemas e um sistema pode requisitar diversos computadores.
O software é a parte abstrata do sistema computacional que funciona num hardware a partir de instruções codificadas numa linguagem de programação.
Estas instruções permitem o processamento e armazenamento de informações na forma de dados codificados e podem ser controladas pelo usuário. Este
controle, bem como a troca de informações entre o usuário e o sistema é feita através da interface de usuário, composta por hardware e software.
A informação é um componente fundamental nos sistemas baseados em computador. Por isto eles podem também ser chamados de sistemas baseados
em informação. Sistemas processam e armazenam dados que são interpretados como informações pelos usuários através da interface. São os dados que
representam elementos do domínio que tornam o sistema útil para os usuários.
Os usuários são também elementos centrais no desenvolvimento de um sistema baseado em computador. As metas de cada usuário, de acordo com o
papel que cada um desempenha no domínio, devem poder ser satisfeita pelo sistema.
As tarefas ou procedimentos compreendem as atividades que o sistema realiza ou permite realizar. As tarefas caracterizam a funcionalidade do sistema e
devem permitir aos usuários satisfazer as suas metas.
A documentação do sistema envolve os manuais de usuário, que contém informações para o usuário utilizar o sistema (documentação do sistema)
que descrevem a sua estrutura e o funcionamento. Estes últimos são fundamentais durante o desenvolvimento do sistema para a comunicação entre a
equipe de desenvolvimento e para a transição entre as suas diversas etapas e durante a manutenção de um sistema em sua fase operacional.
Um sistema baseado em computador funciona num determinado domínio de aplicação que corresponde a um tipo de ambiente ou organização onde o
sistema é utilizado.
Exemplos de sistemas baseados em computador
Sistema de Automação Bancária
Sistema de Folha de Pagamento
Sistema de Controle Acadêmico
Sistema de Biblioteca
Sistema de Controle de Tráfego Urbano
Sistema de Controle de Elevadores
Sistema de Editoração de Jornais e Revistas
converted by W [Link]
Engenharia de Sistemas baseados em computador
O desenvolvimento do sistema deve ser pensado como um todo. Os problemas que o sistema deve resolver devem ser analisados e uma solução
envolvendo todos os componentes deve ser proposta. O desenvolvimento de cada componente do sistema pode ser conduzido utilizando um "engenharia"
específica. É importante ressaltar que o termo engenharia está sendo utilizado de forma imprecisa.
Engenharia de Hardware - construção dos diversos equipamento de hardware, engenharia de redes, etc.
Engenharia de Software - desenvolvimento dos diversos componentes de software que compõe o sistema
Engenharia de Informações - modelagem e estruturação das informações para que possam ser armazenadas na forma de dados relacionados
entre si.
Engenharia de Usabilidade (ou de Fatores Humanos) - Os fatores humanos devem ser analisados para que as atividades humanas sejam
desempenhada com qualidade.
Engenharia de Procedimentos ou Métodos - Novas tarefas dos usuários devem surgir e outras podem ser extintas. Outras atividades podem
ser automatizadas pelo sistema
Todas estas "engenharias" devem ser concebidas de forma integrada uma vez que o seus elementos estão bastante relacionados entre si. A ênfase em
apenas um dos aspectos pode levar a deficiências do sistema em alguns outros componentes.
Na construção de um sistema não podemos nos concentrar apenas na engenharia de software. É preciso considerar que o hardware, bem como as
informações e os procedimentos do domínio precisam ser analisados e construídos de forma integrada ao sistema.
Os três níveis de um sistema baseado em computador
Podemos identificar três níveis distintos de visualização de um sistema baseado em computador:
Nível do domínio ou da organização
No nível do domínio todos o componentes podem ser visualizados de forma integrada. Pode-se observar como cada um deles estão relacionados.
Neste nível o hardware e o software são visto como um componente único que interage com os diversos usuários de maneira a permitir que as tarefas do
domínio possam ser realizadas. Neste nível avalia-se o quanto o sistema resolve os problemas da organização.
Neste nível podemos identificar duas perspectivas distintas. Nas perspectiva de automação os componentes hardware/software e usuários são vistos
como agentes das tarefas que o sistema pode realizar. Na perspectiva de mídia o sistema é visto como a plataforma de suporte às atividades de
comunicação entre os usuários através do apoio no processamento, armazenamento e veiculação das informações. Enquanto a primeira perspectiva
considera usuários como processadores de informação ao lado do computador, na segunda eles são considerados seres inteligentes e a função do
computador é aumentar a sua capacidade.
Nível da interação usuário-computador
Neste nível a ênfase está nas atividades que os usuários devem fazer e na forma como as informações são percebidas ou produzidas pelos usuários.
Neste nível, as tarefas do domínio devem determinar metas para cada usuário que devem poder ser realizadas utilizando o sistema. Hardware e software
são vistos através da interface de usuário que pode ser compostas por elementos como, tela, teclado, mouse, menus, comandos, ícones, etc.
É neste nível que se avalia a usabilidade do sistema - facilidade de uso e de aprendizado, produtividade, satisfação, etc.)
Também podemos distinguir duas perspectivas. Na antropomórfica busca-se construir um sistema que tenha características cognitivas humanas. Neste
caso o sistema deveria interagir na mesma língua do usuário e ter um comportamento inteligente. A outra perspectiva é a de ferramenta intelectual que
considera que o sistema deve expandir a capacidade cognitiva do usuário, apoiando-o em suas atividades.
O nível da computação
Este é o nível da tecnologia. A ênfase está no hardware e software do sistema. É preciso definir como os procedimentos podem ser automatizados e
como as informações podem ser codificadas. Neste nível podemos identificar os elementos de hardware - CPU, memórias, periféricos - e de software -
sistema operacional, sistemas de janelas e aplicação (ou aplicativo) de software. Este último compreende o software que implementa uma funcionalidade
que pode ser aplicada num certo domínio.
Neste nível é importante avaliar a qualidade dos diversos elementos do computador: confiabilidade, segurança, eficiência, etc.
Diferentes perspectivas podem ser identificadas. A perspectiva orientada-a-funções enfatiza nas funções que o sistema deve realizar. A perspectiva
orientada-a-dados centraliza todo o sistema na codificação, estruturação, armazenamento e processamento dos dados. Por último, a perspectiva
orientada-a-objetos considera que o sistema deve ser composto por objetos que encapsulam dados e funções.
1.2 O Software
Existem problemas que podem ser resolvidos por um algoritmo. Algoritmo é uma seqüência de operações bem-definidas de uma máquina (abstrata ou
real) que a partir de dados de entrada pára e pode fornecer resultados (saída).
Um programa é um conjunto de soluções algorítmicas que operam sobre estruturas de dados codificadas numa linguagem de programação. Um
converted by W [Link]
programa pode está num estado estático e dinâmico - programa executando num computador.
Um programa estático pode estar em diferentes formas. O programa fonte é aquele escrito por um programador na linguagem de programação antes de
ser traduzido para o código de máquina que a linguagem vai executar. O programa executável é o conjunto de instruções em um código que pode ser
executado diretamente pelo processador. Temos ainda o programa em código objeto que é aquele compilado a partir do programa fonte e antes de ser
associado a bibliotecas estáticas.
O software é normalmente visto como um programa que pode ser executado num computador. Entretanto esta visão é limitada. Precisamos ressaltar a
importância de que o software é mais do que um programa. Embora em sua essência software e programa sejam a mesma coisa, podemos adquirir uma
nova visão para o seu desenvolvimento se considerarmos as diferenças que podem ser identificadas.
O software deve ser visto como um artefato virtual e como tal ele é um produto a ser aplicado com utilidade num certo domínio, sendo chamado de
aplicação de software. Neste sentido, o software como produto é algo que possui um modelo conceitual próprio - a sua funcionalidade e a sua
interatividade. A funcionalidade determina aquilo que ele faz e que o torna útil para resolver problemas dos usuários. A interatividade determina a
maneira como o usuário deverá utilizar o software. O software é, portanto, um produto conceitual ou lógico.
Precisamos também chamar a atenção para uma diferença de perspectiva. Num programa a perspectiva está em como um certa solução é resolvida por
algoritmos. A perspectiva de aplicação de software, o software como produto, está em como ele pode resolver os problemas do usuário.
Um outro importante aspecto que diferencia programa de software é a complexidade. Um software pode ser composto por diversos programas que
interagem entre si, bem como podem acessar arquivos de dados e utilizar bibliotecas dinâmicas. Por fim, a atividade de construir programas requer
técnicas e ferramentas distintas daquelas que são necessárias para construir um software.
Exemplo de um software como artefato virtual
Para exemplificar esta perspectiva de software como artefato, vejamos o exemplo exemplo de um programa trivial que, com pequenas alterações no
programa, mas sem alterar a essência do algoritmo, pode ser visto como aplicações de software de distintas.
Vejamos o seguinte trecho de interação entre o usuário (U) e o sistema (S).
S: Forneça um número:
U: 5.3
S: Você deve digitar apenas números inteiros:
U: 5
S: Forneça outro número:
U: 8
S: O resultado é -3
Observando a interação do usuário com o sistema podemos concluir que o software realizou uma subtração. Assim, a funcionalidade deste software é
realizar subtrações de dois números inteiros. Vejamos, agora o algoritmo que está por trás deste software.
escreva("Forneça um Número:");
leia A;
enquanto A não for inteiro faça
escreva(Você deve digitar apenas números inteiros:)
leia A;
escreva("Forneça outro Número:");
leia B;
C = A - B;
escreva("O resultado é ", C);
Vejamos agora o que acontece se modificarmos as linhas 1, 6 e 9 deste algoritmo para
escreva("Forneça o valor de venda");
escreva("Forneça o valor de compra");
escreva("O lucro é",C);
Para o programador muito pouca coisa mudou, mas para o usuário deste sistema este software agora é visto como uma aplicação de cálculo de lucros de
vendas. As alterações no programa foram bastante pequenas, mas produziu um efeito significativo. A perspectiva de software como artefato deve
considerar como o usuário vê a aplicação. Os modelos conceituais da funcionalidade do software são distintos. Desta forma, temos software distintos
com aplicações em domínios distintos. O programa nos fornece uma visão de funcionamento. O usuário possui apenas a visão de funcionalidade.
Podemos modificar as mesmas linhas do programa para:
escreva("Salário Bruto");
escreva("Descontos");
escreva("Salário líquido,C);
que produz um novo software.
Como este exemplo podemos entender melhor que embora o software seja um programa, ele precisa ser considerado como um artefato. Nestes
exemplos, temos artefatos virtuais diferentes para programas com um mesmo algoritmo.
converted by W [Link]
Componentes do Software
O software pode ser visto nos estados dinâmico e estático. No estado estático podemos ver o software formado por componentes lógicos como
variáveis de dados, funções, procedimentos, módulos, classes, etc., que podem variar dependendo da linguagem que foi utilizada na sua implementação.
Este componentes podem estar na forma de programa fonte, objeto, executável ou em bibliotecas estáticas a serem ligadas ao código objeto.
No estado dinâmico os componentes que formam um software podem ser objetos, agentes, processos, arquivos de dados e outros, que são gerenciados
por sistemas operacionais ou sistemas de middleware. Estes componentes podem está agrupados em arquivos executáveis, bibliotecas de ligação
dinâmica ou outros. Estes componentes podem interagir por chamada de função, troca de mensagens, acesso compartilhado.
A visão de software formado por componentes interconectados entre si caracteriza a arquitetura do software.
Evolução do software
Para que um software possua uma ampla utilidade ele necessita de centenas ou milhares de algoritmos. Atualmente os softwares são bastante complexos e
podem ser formados por diversos programas.
O software evoluiu bastante na segunda metade do século 20 quando surgiram os primeiros computadores. Nos primeiros anos, de 1950 a meados dos
anos 60, os softwares eram executados em computadores de baixa capacidade (embora ocupassem salas enormes), com o processamento de dados em
lote (sem interação com o usuário no decorrer da interação), e feitos para clientes específicos com distribuição limitada.
Na segunda era, de meados dos 60's a meados dos 70's surgiram sistemas de grande porte multi-usuários e aplicações de banco de dados. Começou-
se a comercializar software genéricos que atendiam a necessidades de diversos clientes. Surgiram também os sistemas de tempo-real. No Brasil software
com estas características forma utilizados até meados dos anos 80. Linguagens de programação de alto-nível facilitou em parte a construção de software
nesta segunda era.
A terceira era começou em meados do anos 70 com o surgimento de hardware de baixo custo baseados em microprocessadores e estendeu-se até
início dos anos 90. Com o hardware mais barato, mini e microcomputadores foram adquiridos por diversas empresas e, conseqüentemente, houve uma
grande demanda por software. A falta de mão-de-obra especializada, de técnicas e ferramentas de desenvolvimento de software, e de planejamento e
gerenciamento do processo para atender a este impacto de consumo levaram à crise do software. Este crise do software levou ao surgimento de
técnicas de programação como modularização e refinamento sucessivos e metodologias para desenvolvimento de software como a Análise e Projeto
Estruturados e o Método de Jackson que buscavam resolver os problemas de desenvolvimento de software.
A quarta era, a partir de meados dos anos 80, caracteriza-se pelo surgimento de estações de trabalho "desktop" bastante poderosas interligadas em
redes e de baixo custo - os sistemas distribuídos. Grandes empresas optaram por trocar computadores de grande porte por sistemas distribuídos num
fenômeno denominado de downsize. A tecnologia de orientação-a-objetos e a de interfaces gráficas baseadas em janelas caracterizam a produção de
software nesta era. A popularização dos microcomputadores de baixo custo levou ao surgimento de inúmeros softwares aplicativos "de prateleira"
comprados por pequenas e micro-empresas e também por usuários comuns.
O surgimento da World Wide Web, no início da década de 90, popularizou bastante a utilização da Internet e vem causando uma revolução na forma
como as aplicações são desenvolvidas, utilizadas e comercializadas. O surgimento de linguagens voltadas para estes ambientes, como Java, e de
plataformas de interoperabilidade para sistemas de software distribuídos, como CORBA, vem indicando que estamos entrando numa nova era.
Tamanho do software
Muitas pessoas não têm noção da complexidade de um software, do seu tamanho e da quantidade de pessoas envolvidas no seu desenvolvimento. A
tabela abaixo classifica diferentes tamanhos de software.
Categoria Tamanho da equipe Duração do desenvolvimento Tamanho em linhas de código
trivial 1 1-4 semanas 500 linhas
pequeno 1 1-6 meses 1000 a 2000 linhas
médio 2-5 1-2 anos 5K a 50K
grande 5-20 2-3 anos 50K a 100 K
muito grande 100-1000 4-5 anos 1M
extremamente grande 2000-5000 5-10 anos 1M a 10M
O Windows 95 da Microsoft foi desenvolvido por uma equipe de 200 pessoas e possui 11 milhões de linhas de código fonte.
Qualidades do software
O software como um produto deve ter qualidade. Diversas são as qualidades do software a serem avaliadas. É preciso avaliar tanto a qualidade do
produto em si com a do processo de desenvolvimento. Vejamos algumas das qualidades que podem ser avaliadas.
Corretude - um software precisa funcionar corretamente. Um software correto é aquele que satisfaz a sua especificação e que não possui falhas
ou erros.
Validade - um software válido é aquele cuja especificação satisfaz aos requisitos dos usuários e da organização, isto é, está de acordo com as
converted by W [Link]
necessidades dos usuários.
Robustez - o software deve prever que o usuário de agir de forma não esperada e deve ser capaz de resistir a estas eventuais situações incomuns
sem apresentar falhas.
Confiabilidade - um software correto e robusto ganha a confiança dos usuários uma vez que ele deve se comportar como esperado e não falha
em situações inesperadas.
Eficiência - o software deve realizar suas tarefas em um tempo adequando à complexidade de cada uma delas. A utilização dos recursos de
hardware (memória, disco, tráfego de rede) também deve ser feita de forma eficiente.
Usabilidade - o software precisa ser fácil de aprender e de usar, permitir maior produtividade do usuário, flexibilidade de utilização, flexibilidade
de aplicação e proporcionar satisfação de uso.
Manutenibilidade - todo software precisa de manutenção, seja para corrigir erros ou atender a novos requisitos. O software deve ser fácil de
manter para que estas correções ou atualizações sejam feitas com sucesso.
Evolutibilidade - todo software precisa evoluir para atender novos requisitos, para incorporar novas tecnologias ou para expansão de sua
funcionalidade.
Portabilidade - o software deve poder ser executado no maior número possível de equipamentos de hardware.
Interoperabilidade - software em diferentes plataformas devem poder interagir entre si. Esta qualidade é essencial em sistemas distribuídos uma
vez que o software pode estar sendo executado em diferentes computadores e sistemas operacionais. É interessante que diferentes elementos de
software distintos possam ser utilizados em ambos. Por exemplo, uma certo arquivo com uma imagem feita num aplicativo deve poder ser vista em
outros aplicativos.
Reusabilidade - diversos componentes de um software devem poder ser reutilizados por outras aplicações. O reuso de funções e objetos facilita
bastante o desenvolvimento de software.
Existem diversas outras qualidades do software que podem avaliadas. Nosso objetivo foi apenas introduzir algumas delas, mesmo que de maneira
superficial. Para um estudo inicial veja alguns livros na nossa bibliografia.
1.3 Engenharia de Software
Vimos nas seções anteriores que, embora o software seja um programa em sua essência, ele precisa ser visto como um artefato virtual que tem associado
a si um modelo conceitual. Vamos discutir agora as diferenças entre construir um programa, isto é, programar, e o que vem a ser engenharia de software.
Programar é engenharia?
O desenvolvimento de um software requer pelo menos a construção de um programa. Programar envolve as atividades de codificar um algoritmo numa
determinada linguagem de programação. O resultado disto é o programa ou código fonte. Este programa precisa ser traduzido por um interpretador ou
compilador em linguagem de máquina (código executável) para que possa ser executado pelo processador. Um programa pode reutilizar ou não
funções de bibliotecas disponíveis pelo tradutor. No processo de compilação, o código fonte é traduzido em um código objeto para em seguida ser
"ligado" a eventuais funções de bibliotecas (processo de linking) quando então é gerado o programa executável em linguagem de máquina. Alguns
sistemas operacionais permitem que funções (ou classes, no caso de programas orientado a objetos) possam ser ligadas durante a execução do
programa. Estas funções são armazenadas em bibliotecas de ligação dinâmica (DLL).
Entretanto, a visão do software como artefato requer algo mais que programação. É preciso pensar no software considerando os requisitos dos usuários
e a visão que ele terá deste produto. A interface com o usuário é um componente essencial do software junto com o modelo conceitual que determina a
sua funcionalidade e a interatividade. (Para maiores detalhes sobre estes conceitos veja Conceitos Básicos. Eles também serão discutidos posteriormente
no capítulo 4).
Com esta perspectiva temos que considerar que o desenvolvimento de software é algo mais do que programar. É pensar na aplicação do programa na
resolução dos problemas dos usuário. É incorporar no programa elementos do domínio onde ele está inserido, representando-os como informações e
oferecendo funções para que os usuários possam utilizá-las.
Além destas considerações, para que este desenvolvimento possa ser considerado uma engenharia outros fatores precisam ser considerados.
O que é engenharia?
O desenvolvimento de um artefato pode ser conduzido de forma artesanal, por um processo de tentativa-e-erro, manipulando-se diretamente o
material com o qual o produto será construído.
Os erros são identificados através da avaliação experimental da qualidade do produto. A avaliação deve verificar se o produto está funcionando
adequadamente, se ele é útil aos seus usuários, e várias outras qualidades.
Este processo artesanal pode evoluir através da utilização de ferramentas específicas e de técnicas desenvolvidas a partir de experiências anteriores.
Este processo pode ainda evoluir e incorporar outras atividades. O design (desenho ou projeto) consiste na atividade de conceber e descrever o produto
a ser construído. O design permite uma visualização antecipada do produto final permitindo que se possa fazer alguma avaliação antes da sua construção.
Para que o produto tenha sucesso ele deve estar adequado às necessidades do usuário. Atividades de análise de requisitos devem anteceder o design e
a construção do artefato para que estes objetivos sejam atingidos.
Com tantas atividades é preciso um modelo do processo que descreva em qual momento cada uma será realizada. Análise, especificação, design,
converted by W [Link]
implementação e avaliação devem ser realizadas no momento adequado. Para cada etapa do processo métodos devem descrever com detalhes como
estas atividades devem ser realizadas.
Cada uma destas atividades requer pessoal com conhecimento especializado. Diversos princípios e modelos teóricos são conhecimentos indispensáveis
para o desempenho das atividades do desenvolvimento.
Os especialistas nas diversas atividades devem atuar em equipe. Existem diversas maneiras de estruturar e gerenciar uma equipe de desenvolvimento.
A alocação de tarefas específicas que foram determinadas pelos métodos do modelo de desenvolvimento para os membros da equipe em um
determinado período de tempo faz parte do processo de planejamento. O planejamento requer ainda que sejam estimados os custos e prazos de
cada uma destas atividades. Tudo o que foi estimado e planejado deve ser gerenciado para que possa ser cumprido.
Quando o desenvolvimento de um artefato incorpora as atividades de análise, design, implementação e avaliação de acordo com princípios, modelos,
técnicas, ferramentas e métodos específicos, realizados por uma equipe de especialistas e obedecendo a um planejamento e gerenciamento de custos e
prazos, podemos caracterizá-lo como uma engenharia.
Veremos, a seguir, as características destas atividades no desenvolvimento de software.
Objetivos da Engenharia de Software
A engenharia de software tem por objetivos a aplicação de teoria, modelos, formalismos e técnicas e ferramentas da ciência da computação e
áreas afins para o desenvolvimento sistemático de software.
Associado ao desenvolvimento, é preciso também aplicar métodos, técnicas e ferramentas para o gerenciamento do processo de
desenvolvimento.
Finalmente, a engenharia de software visa a produção da documentação formal do software, do processo de desenvolvimento e do gerenciamento
destinada a comunicação entre os membros da equipe de desenvolvimento bem como aos usuários finais.
Definições de Engenharia de Software
Os autores apresentam diversas definições para engenharia de software. Vamos apresentar três que consideramos complementares.
A engenharia de software é a disciplina envolvida com a produção e manutenção sistemática de software que são desenvolvidos com custos e
prazos estimados.
Disciplina que aborda a construção de software complexo - com muitas partes interconectadas e diferentes versões - por uma equipe de analistas,
projetistas, programadores, gerentes, "testadores", etc.
O estabelecimento e uso de princípios de engenharia para a produção economicamente viável de software de qualidade que funcione em máquinas
reais.
A primeira destas definições enfatiza que a engenharia visa não apenas o desenvolvimento, mas também a manutenção do produto. Além disso, ela
ressalta a importância da estimativa de custos e prazos de desenvolvimento. A segunda definição enfatiza a complexidade do produto e do processo. O
software é formado por diversos componentes interconectados e o seu desenvolvimento é realizado por uma equipe que precisa ser gerenciada. A
terceira ressalta que o desenvolvimento de software deve seguir os princípios de uma engenharia e deve visar a qualidade.
Mitos do Software
Segundo [Pressman], diversos mitos difundidos entre programadores escondem a importância de um desenvolvimento de software de acordo com os
princípios de uma engenharia. Vejamos algumas delas:
O estabelecimento de objetivos gerais é suficiente para se começar a escrever programas.
Uma vez que o programa esteja escrito e funcionando, nosso trabalho está feito.
Mudanças no software podem ser feitas facilmente porque ele é "flexível".
Dê a uma pessoa técnica um bom livro de programação e você terá um programador.
Até que o programa esteja "rodando" não é possível verificarmos a sua qualidade.
Um projeto é bem sucedido se conseguirmos um programa funcionando corretamente.
Índice | Próximo
(C) Jair C Leite, 2000 Última atualização: 22/04/00
converted by W [Link]