33
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

P13 04

Embed Size (px)

Citation preview

Page 1: P13 04

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

Page 2: P13 04

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

Page 3: P13 04

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

Page 4: P13 04

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

Page 5: P13 04

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

Page 6: P13 04

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

Page 7: P13 04

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

Page 8: P13 04

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;

}

Page 9: P13 04

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

Page 10: P13 04

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

Page 11: P13 04

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

Page 12: P13 04

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

Page 13: P13 04

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

Page 14: P13 04

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

Page 15: P13 04

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

Page 16: P13 04

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", &lt);

/* 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;

}

Page 17: P13 04

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.

Page 18: P13 04

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

Page 19: P13 04

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.

Page 20: P13 04

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)

Page 21: P13 04

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

Page 22: P13 04

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

Page 23: P13 04

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)

Page 24: P13 04

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

Page 25: P13 04

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

Page 26: P13 04

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

Page 27: P13 04

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

Page 28: P13 04

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.

Page 29: P13 04

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.

Page 30: P13 04

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.

Page 31: P13 04

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.

Page 32: P13 04

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

Page 33: P13 04

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.