Upload
education-for-all
View
47
Download
0
Embed Size (px)
Citation preview
Programação DEEC-IST Conceitos de Engenharia de Software 1
Programação
MEAer e MEEC
Bertinho Andrade da Costa
2013/2014
1º Semestre
Instituto Superior Técnico
Conceitos de Engenharia de Software
Introdução da instrução de selecção if
Programação DEEC-IST Conceitos de Engenharia de Software 2
Sumário
Exemplificação do desenvolvimento de um programa.
Demonstração da utilização de técnicas de depuração de
programas
Utilização de um “debugger”
Utilização da função printf.
Engenharia de Software
Modelos de desenvolvimento de software
Fases de desenvolvimento
Programação modular
Abordagem “top-down” e “bottom-up”
Conceito de abstracção
Linguagens de programação: Compilação / Interpretação
Programação DEEC-IST Conceitos de Engenharia de Software 3
Problema:
Num projecto é necessário calcular o raio de uma bóia esférica
para ser utilizada no mar, tal que, pelo menos metade do volume
da bóia fique fora da água. Considere que a espessura da bóia, a
densidade do material da bóia e a densidade da água do mar são
dados a ser lidos pelo programa.
esp
esp r = ?
ra
rb
Programação DEEC-IST Conceitos de Engenharia de Software 4
Análise do Problema:
Objectivo: Determinar o raio da bóia r. Dados:
esp – Espessura da esfera
rb- Densidade do material da bóia
ra– Densidade da água do mar
r é função de esp, rb e rb; Qual é a expressão?
esp
esp r = ?
ra
rb
Programação DEEC-IST Conceitos de Engenharia de Software 5
Análise do Problema
Resolução:
Peso da bóia <= Impulsão
3/1
3/1
333
int
2
111/
2
111
3
4
2
1)(
3
4
3
4
2
1)(
b
a
b
a
ab
extbext
hhespr
r
esp
seobtémndosimplifica
grgesprr
termososAnalisado
gVgVV
r
r
r
r
rr
r
esp
esp r = ?
ra
rb
Programação DEEC-IST Conceitos de Engenharia de Software 6
Projecto:
Listagem das acções, Versão nº1:
Pedir ao utilizador os valores de esp, rb, ra
Calcular de r
Apresentar o resultado
esp
esp r = ?
ra
rb
Programação DEEC-IST Conceitos de Engenharia de Software 7
Projecto:
Versão nº2 : Calcular r
Declarar as variáveis r, esp, rb, ra --- tipo float
Ler os dados de entrada;
Utilizar a função scanf(…)
Da expressão, é necessário especificar as operações
Multiplicação - Operador *
Subtracção- Operador -
Divisão - Operador /
Potenciação - Função pow(…)
Apresentar o resultado
Utilizar a função printf( …) para apresentar o resultado no ecrã.
esp
esp r = ?
ra
rb
Programação DEEC-IST Conceitos de Engenharia de Software 8
Codificação:
/*-----------------------------------------------------
| Programa: esfera.c
| Objectivo: Determinacao do raio da esfera rolo
|
| Input: esp- espessura, rho_a, rho_b
| rho_a, rho_b densidade da agua e do material da boia
!
| Output: r - raio da esfera
+----------------------------------------------------*/
#include <stdio.h> /* Utilizacao das funcoes printf() e scanf() */
#include <math.h> /* potencia de - pow( ) */
int main( void ) {
float esp, rho_a, rho_b; /* Raio e Densidades, agua e da boia */
float raio, haux; /* Resultado e Variavel auxiliar */
printf("Determinacao do raio da boia \n");
printf("Introduza, esp, rho_a e rho_b = ");
scanf("%f %f %f", &esp, &rho_a, &rho_b);
/* Calculo da expressao */
haux = 1-pow( 1- (1.0/2.0)* rho_a/rho_b, 1.0/3.0);
raio = esp / haux;
printf("O haux = %f raio deve ser >= %f \n", haux, raio);
return 0;
}
Programação DEEC-IST Conceitos de Engenharia de Software 9
Problema:
Pretende-se desenvolver um programa que permita calcular o
diâmetro de um rolo (dr) que é constituido por um tubo e por fio
enrolado ao tubo. O fio tem comprimento lf e diâmetro df. O tubo
tem diâmetro dt e comprimento lt.
dr = ?
lf
lt
dt
lt
Programação DEEC-IST Conceitos de Engenharia de Software 10
Análise do Problema:
Objectivo: Determinar o dr. Dados: ?
dr é função de ??? ; Qual é a expressão?
dr = ?
lf
lt
dt
lt
Programação DEEC-IST Conceitos de Engenharia de Software 11
Análise do Problema
Resolução:
Supondo uma distribuição uniforme do volume total do fio sobre o rolo
dr = ?
lf
lt
dt
lt
22
222
222
222
t
t
ff
r
tt
f
f
tr
d
l
ldd
seobtém
ld
ld
ld
aigualérolodovolumeO
Programação DEEC-IST Conceitos de Engenharia de Software 12
Projecto:
Versão nº1:
Pedir ao utilizador os valores de lf, df
Pedir ao utilizador os valores de lt, dt
Calcular dr
Apresentar o resultado
dr = ?
lf
lt
dt
lt
Programação DEEC-IST Conceitos de Engenharia de Software 13
Projecto:
Versão nº2:
Pedir ao utilizador os valores de lf, df
lf, df - representam números reais não negativos.
Declarar as variáveis lf, df, do tipo float
Utilizar a função scanf (…) para ler dados do teclado.
Verificar se o utilizador introduz números não negativos.
Utilizar uma instrução de teste/selecção – if (…) {...}
Pedir ao utilizador os valores de lt, dt
lt, dt - representam números reais positivos.
Declarar as variáveis lt, dt, do tipo float
Utilizar a função scanf (…) para ler dados do teclado.
Verificar o utilizador introduz números positivos.
dr = ?
lf
lt dt
lt
Programação DEEC-IST Conceitos de Engenharia de Software 14
Projecto:
Versão nº2 (cont.): Calcular dr
Declarar a variáveis dr, é do tipo float
Da expressão, é necessário especificar as operações de
Multiplicação - Operador *
Raiz quadrada - Função sqrt (…)
Divisão - Operador /
Potenciação - Função pow(…)
Adição - Operador +
Apresentar o resultado
Utilizar a função printf( …) para apresentar o resultado no ecrã.
dr = ?
lf
lt dt
lt
Programação DEEC-IST Conceitos de Engenharia de Software 15
Codificação:
/*-----------------------------------------------------
| Programa: rolo.c
| Objectivo: Determinacao do diametro do rolo
|
| Input: Diametro do fio - df; Comprimento do fio - lf
| Diametro do fio - df; Comprimento do fio - lf
!
| Output: Diametro do rolo - dr
+----------------------------------------------------*/
#include <stdio.h> /* Utilizacao das funcoes printf() e scanf() */
#include <math.h> /* raiz quadrada - sqrt( ) */
/* potencia de - pow( ) */
int main( void ) {
float df, lf; /* Diametro e comprimento do fio */
float dt, lt; /* Diametro e comprimento do tubo */
float dr; /* Resultado diametro do rolo */
printf("Determinacao do diametro do rolo \n");
printf("Unidades em metros \n\n");
printf("Diametro (m) do fio = ");
scanf("%f", &df);
printf("Comprimento (m) do fio = ");
scanf("%f", &lf);
Programação DEEC-IST Conceitos de Engenharia de Software 16
Codificação:
/* Teste dos dados: df, lf - UTILIZACAO DA INSTRUCAO if (…) {…} */
if ((df < 0.0) || (lf < 0.0)) {
printf("Fio: Dados negativos\n");
printf("Fim do programa");
return 0;
}
printf("Diametro (m) do tubo = ");
scanf("%f", &dt);
printf("Comprimento (m) do tubo = ");
scanf("%f", <);
/* Teste dos dados: dt, lt - UTILIZACAO DA INSTRUCAO if (…) {…} */
if ((dt <= 0.0) || (lt <= 0.0)) {
printf(“Tubo: Dados negativos ou nulos \n");
printf("Fim do programa");
return 0;
}
/* Calculo da expressao */
dr = 2*sqrt(pow(2, df/2.0) * lf/lt + pow(2, dt/2.0));
/* Apresenta o resultado */
printf("O diametro do rolo = %f", dr);
return 0;
}
Programação DEEC-IST Conceitos de Engenharia de Software 17
Teste ao programa:
Que garantias é que podemos dar de que o programa produz os resultados correctos? Neste momento nenhumas!!
Só após efectuarmos testes de validação do funcionamento do programa.
Atenção: Para demonstrar que um programa não funciona correctamente é
suficiente encontrar uma situação em que o resultado do programa é diferente do que é indicado pelos requisitos.
Para demonstrar que um programa não produz resultados errados é necessário que o programa funcione correctamente para todo o conjunto de dados de entrada do problema.
Para testar o programa devemos especificar um conjunto de valores de entrada para os quais é conhecido o valor da solução. Depois é necessário comparar o resultado do programa com o valor da solução.
Outra forma consiste na utilização de ferramentas matemáticas de demonstração do funcionamento correcto do programa.
Programação DEEC-IST Conceitos de Engenharia de Software 18
Teste ao programa:
Teste, (cont): Teste-se então o programa com os valores (em metros), df = 0.002, lf
= 10, dt = 0.02, lt = 0.01, para os quais a solução é dr = 0.066
Resultado do programa:
Determinacao do diametro do rolo
Unidades em metros
Diametro (m) do fio = 0.002
Comprimento (m) do fio = 10
Diametro (m) do tubo = 0.02
Comprimento (m) do tubo = 0.01
O diametro do rolo = 63.299301
Erro
Programação DEEC-IST Conceitos de Engenharia de Software 19
Correção (Debug):
A detecção da causa de erro pode ser um processo lento.
A técnica consiste: Inspecção do contéudo das variáveis ao longo da execução do
programa.
Determinação das instruções que foram executadas e que afectaram o conteúdo das variáveis.
Para se ter acesso ao conteúdo das variáveis Deve-se utilizar a função printf(), para mostrar os valores das variáveis no
ecrã.
Em alternativa deve-se utilizar uma ferramenta auxiliar de desenvolvimento de programas, denominado de debugger. Esta ferramenta permite executar o programa no modo passo a passo com a possibilidade de inspeccionar o conteúdo das variáveis.
Programação DEEC-IST Conceitos de Engenharia de Software 20
Correção (Debug):
No programa que foi apresentado, a causa de erro é consequência da utilização incorrecta da função pow(…), os argumentos da função estão trocados.
Para se utilizar uma função correctamente é necessário: Conhecer a finalidade da função.
Conhecer os argumentos: Número de argumentos da função.
Lugar que ocupam na lista de argumentos da função
Significados dos argumentos
Tipo dos argumentos.
Tipo e significado do valor de retorno da função.
Consultar a descrição da função, tendo o cuidado de inspeccionar o protótipo da função. (Exemplo: Em linux utilizar o comando man pow)
Programação DEEC-IST Conceitos de Engenharia de Software 21
Correção (Debug):
Informação obtida a partir da consulta do manual acerca da função pow ( ) Ficheiro de “include” necessário para utilizar a função:
#include <math.h>
Protótipo: double pow (double x, double y);
Descrição: Calcula xy .
O resultado é um número real de com precisão (double).
Se x é não nulo e y é nulo então a função devolve 1.0
Se x é nulo e y é não nulo então a função devolve 0.0
Programação DEEC-IST Conceitos de Engenharia de Software 22
Correção (Debug):
Após a substituição da linha dr = 2*sqrt(pow(2, df/2.0) * lf/lt + pow(2, dt/2.0));
por
dr = 2*sqrt(pow(df/2.0, 2) * lf/lt + pow(dt/2.0, 2));
Resultado do programa:
Determinacao do diametro do rolo
Unidades em metros
Diametro (m) do fio = 0.002
Comprimento (m) do fio = 10
Diametro (m) do tubo = 0.02
Comprimento (m) do tubo = 0.01
O diametro do rolo = 0.066332
Programação DEEC-IST Conceitos de Engenharia de Software 23
Manutenção:
Durante o tempo de vida de um programa pode ser necessário efectuar modificações: O algoritmo que foi utilizado parte do princípio que é possível distribuir o
volume total do fio de modo uniforme sobre o tubo.
Esta hipótese não é totalmente verdadeira, já que pode existir um espaço vazio entre os fios. Supondo que se secciona o rolo por um plano que passa pelo eixo do tubo obtém-se:
A) B)
† Desenvolva soluções aproximadas para os casos de A) e de B)
Programação DEEC-IST Conceitos de Engenharia de Software 24
Engenharia de Software
Tem como finalidade o desenvolvimento / construção de
programas para computadores:
Que funcionam correctamente
Que estejam:
Bem escritos
Bem documentados
Leitura fácil
Que permitam a sua modificação ao longo do tempo de vida do “produto” -
programa
Programação DEEC-IST Conceitos de Engenharia de Software 25
Engenharia de Software
Os programas podem ser classificados: De pequena complexidade:
Poucas linhas de código.
O desenvolvimento é feito por um ou dois programadores.
Utilização de uma única linguagem de programação
Preocupação com a arquitectura do programa
Se está bem organizado.
Se as estruturas de dados que servem de suporte ao algoritmo são as mais adequadas.
Se está bem documentado
Eficiência e precisão da solução que foi implementada
Preocupação com os algoritmos.
Rapidez
Se utiliza os recursos de forma eficiente
Programação DEEC-IST Conceitos de Engenharia de Software 26
Engenharia de Software
De grande complexidade:
Milhares de linhas de código,
Equipas de programadores.
Diversas ferramentas e várias linguagens de programação
Utilização de métodos de trabalho que permitem re-utilizar código que
já tenha sido desenvolvido.
Objectivo:
Finalização de um produto para ser colocado rapidamente no mercado.
Técnicas de programação e de gestão de projectos que permitem
acompanhar a evolução do produto.
Correção de erros que tenham sido detectados.
Incorporação de novas funcionalidades
Programação DEEC-IST Conceitos de Engenharia de Software 27
Modelos de desenvolvimento de software
Modelos -
Permitem definir um conjunto de acções, para serem realizadas em
determinadas fases de desenvolvimento do projecto de software, para
controlar o processo e a qualidade do produto final.
Há diversos modelos dos quais refere-se o modelo em cascata.
Especificação
dos requisitos
Análise
Projecto /
Detalhe Implementação
e Integração
Teste,
Verificação e
Manutenção
Programação DEEC-IST Conceitos de Engenharia de Software 28
Fases de desenvolvimento de software
Especificação dos requistos -
Tem como finalidade definir os objectivos que o programa deve realizar.
A especificação deve ser o mais detalhada possível de modo a evitar
ambiguidades de interpretação.
Análise -
A análise do problema tem como objectivo a determinação de soluções
para o problema. Deve ser escolhida aquela que seja mais adequada.
Devem ser utilizadas soluções de preferência que já tenham sido
testadas.
Projecto / Desenho -
Consiste na definição de um algoritmo (sequência de acções) que ao ser
implementado produz os resultados que se foram especificados ao nível
dos requisitos.
Programação DEEC-IST Conceitos de Engenharia de Software 29
Fases de desenvolvimento de software
Implementação Consiste na especificação de módulos de software, escrita e
documentação.
É importante que o código esteja bem documentado de modo a que numa fase posterior possa ser compreendido e alterado caso seja necessário.
Teste e Verificação Como qualquer obra em engenharia, um programa deve funcionar
correctamente, de acordo com as especificações.
A fase de teste e verificação tem com objectivo determinar se existem erros de execução do programa, de modo a serem corrigidos.
Manutenção: A manutenção do software envolve diversas actividades:
Alteração do código de modo a serem incorporadas novas funcionalidades.
Correção de erros que sejam encontrados após o lançamento do produto no mercado.
Modicação do software de modo a ser compatível com novas plataformas computacionais.
Programação DEEC-IST Conceitos de Engenharia de Software 30
Programação Modular
O objectivo da programação modular:
Consiste na separação de uma tarefa complexa em tarefas mais
simples de modo a facilitar a resolução do problema.
As soluções para as tarefas mais simples são agrupadas em
módulos.
Os módulos são definidos tendo em conta o princípio da
independência entre eles, grau de independência.
Cada módulo contém blocos de código, denominados de funções.
As funções num módulo estão relacionadas entre si de acordo com um
critério de organização, grau de coesão.
Programação DEEC-IST Conceitos de Engenharia de Software 31
Técnicas de Desenvolvimento
Abordagem “Top-Down” Ao longo do processo de desenvolvimento de um programa há um progressivo aumento
de detalhe e refinamento da solução.
No nível mais elevado são definidos os subsistemas que realizam a solução.
Cada subsistema é decomposto em módulos de modo a obter problemas mais simples.
Ao nível mais baixo são definidos os algoritmos e as estruturas de dados de suporte dos algoritmos.
Abordagem “Bottom-Up” A solução é construida a partir da composição de elementos já existentes.
Os módulos são construidos a partir de código já existente em bibliotecas (de funções).
Os módulos são reunidos de modo formarem subsistemas.
Na prática são utilizadas as duas técnicas: Top-Down - Para efectuar a decomposição do problema em problemas mais simples.
Bottom-Up - Para utilizar código que já foi desenvolvido e testado, e que está disponível em bibliotecas de funções.
Resultado: Permite reduzir o tempo de desenvolvimento de um programa.
Programação DEEC-IST Conceitos de Engenharia de Software 32
Técnicas de Desenvolvimento
Abstracção: Ao longo do desenvolvimento de um programa há um contínuo refinamento
dos detalhes da solução.
Os detalhes são hierarquizados em níveis de importância.
Todos os detalhes que não pertençam a um determinado nível são ignorados.
O programador controla a complexidade do problema ignorado os detalhes que não pertencem ao nível da solução com que está preocupado.
A abstracção : Procedimental: O desenvolvimento dos programas é realizado pelo
refinamento gradual das acções, das funções. Linguagens procedimentais: É o caso da linguagem C, PASCAL
Objectos: O desenvolvimento dos programas é feito partindo do princípio que o programa é constituido por um sistema de objectos (dados) sobre os quais são realizadas operações. Esta abordagem teve como princípio a tentativa de modelizar objectos reais, físicos.
Desta abordagem resultaram os conceitos de classe e de herança.
Linguagens orientadas a objectos: C++, Java
Programação DEEC-IST Conceitos de Engenharia de Software 33
Compilação / Interpretação
Existem duas formas de obter um programa executável:
Através do processo de compliação:
Neste processo o programa executável só é obtido quando as instruções
do programa fonte forem traduzidas na sua totalidade. Execução rápida.
Se existir um erro de compilação não é possível obter o programa
executável.
Através do processo de interpretação:
O programa é executado a partir do programa fonte. O interpretador lê
uma instrução de cada vez do programa fonte, efectua a tradução e
respectiva execução. Execução lenta.
Se existirem erros de sintaxe no programa fonte, serão detectados no
momento da execução da instrução que tem o erro.
A fase de desenvolvimento é mais rápida.