Buscar

VA Analise Algoritmos 04

Prévia do material em texto

Aula 4
Estratégias básicas
Análise de Algoritmos
Gisele Alves Santana
Nesta aula, você vai:
§ Conhecer os dois principais tipos de técnicas 
para a otimização de algoritmos
• Refinamento sucessivo;
• Modularização.
Resumo da aula
Aplicações práticas de algoritmos podem ser 
observadas por toda parte. 
Por exemplo, aplicações que funcionam na 
Internet permitem que as pessoas acessem e 
recuperem grandes quantidades de informações. 
Aplicações procuram alocar recursos da melhor 
forma possível, visando maior 
produtividade e menor custo.
Estratégias básicas
Estratégias para a otimização de 
recursos computacionais 
§ Consistem em definir as propriedades e estruturas 
de dados que são implementadas em um algoritmo; 
§ É aconselhado que o algoritmo seja exaustivamente 
testado, simulando diferentes entradas e 
observando as propriedades especificadas.
Estratégias básicas
Problemas de grande porte 
§ Grande motivação está relacionada à otimização 
do tempo de execução e utilização de espaço 
de memória;
§ Complexidade e dificuldade de entendimento de 
como aquele algoritmo realmente funciona, já 
que este geralmente possui um elevando número 
de componentes e um 
alto grau de interação 
entre os mesmos.
Estratégias básicas
Ideia básica
§ Redução da complexidade através do 
desenvolvimento de um programa em 
diferentes fases
• Refinamento sucessivo;
• Decomposição do programa em módulos 
funcionais, utilizando um número limitado de 
estruturas básicas dentre 
de cada módulo.
Estratégias básicas
Conhecida por desenvolvimento top-down.
Princípio: 
§ A resolução de um problema complexo é mais fácil 
se não for necessário considerar todos os aspectos 
deste problema ao mesmo tempo. 
Objetivo principal:
§ Decomposição de um problema de grande porte em 
uma série de subproblemas 
mais simples até chegar 
a um nível onde pode-se 
tentar uma solução.
Refinamento sucessivo
A definição inicial do problema é realizada em um 
nível mais geral (alto nível). 
Depois, o processo avança em etapas. 
Em cada nova etapa, as tarefas são decompostas 
em tarefas mais específicas, até que todos os 
problemas do programa estejam expressos em 
instruções claras e objetivas. 
Refinamento sucessivo
Permite abordar o problema de maneira mais objetiva 
§ Diminui a probabilidade de erros e facilita a sua 
reparação quando os mesmos ocorrerem. 
Existem diversas técnicas que ajudam no 
desenvolvimento de algoritmos facilitando 
seu entendimento para as pessoas. 
Refinamento sucessivo
Exemplo
Refinamento sucessivo
Algoritmo Divisão 
Informar o denominador 
Informar o divisor 
Divisão = Denominador / Divisor
Algoritmo Divisão 
Informar o denominador 
Informar o divisor 
Se o divisor for diferente de zero: Divisão = Denominador / Divisor 
Se o divisor for igual a zero: Divisão não existe 
Técnicas que permitem contornar a complexidade 
de alguns problemas
§ “dividir-para-conquistar”; 
§ Dividir problemas em subproblemas menores; 
§ A partir das soluções obtidas com a resolução dos 
subproblemas, a solução do problema é 
construída como um todo;
§ Se a resolução de um 
subproblema ainda é muito 
complexa, o mesmo pode ser 
dividido em subproblemas ainda 
menores e assim por diante. 
Refinamento sucessivo
Um subprograma precisa ser “chamado” ou 
“invocado” de algum ponto do código do 
programa como um todo do qual faz parte. 
Se durante a execução o fluxo de controle (ordem 
em que os comandos são executados) atingir um 
ponto de invocação, então o fluxo de controle da 
execução passa para o subprograma. 
Subprogramas podem 
ser vistos como funções.
Refinamento sucessivo
Continuando...
Estratégias básicas 
Conjunto de instruções que realizam uma 
tarefa particular. 
São usadas para criar pequenos pedaços de 
códigos separados do programa principal.
Principal finalidade: 
§ Impedir que o programador 
tenha que escrever o mesmo 
código repetidas vezes.
Funções
Sintaxe
Exemplo
Funções
<tipo> <nome>(<parâmetros>)
{
<declarações locais>;
<comandos>;
return 
}
int quadrado (int a)
{
int quad;
quad = a*a;
return quad;
}
Chamando a função
§ Escreve-se o nome da função seguido dos 
parâmetros fornecidos (entre parênteses);
§ Exemplos: 
• quadrado (int x);
• soma ( ).
Funções
Chamando a função
Funções
int soma ( ) //cabeçalho da função
{
int a, b, soma; //variáveis locais
printf (“Digite um numero: \n“); 
scanf(“%d”, &a);
printf (“Digite um numero: \n“); 
scanf(“%d”, &b);
soma = a + b;
printf(“\nSoma = %d“, soma);
}
int main () //programa principal
{
soma ( ); //chamando a função
}
Não se pode utilizar uma função sem antes declará-la. 
O protótipo é uma forma de se escrever uma função 
depois do programa principal (colocado no após a 
inclusão das bibliotecas).
Considerado como declaração de funções. 
Sintaxe: int soma (int a, int b)
Protótipo de funções
#include<iostream.h>
int soma (); // protótipo da função
int main () {
soma ( ); //chamando a função
}
int soma ( ) { // definição da função
Comandos...
}
Sintaxes:
§ return;
§ return expressão;
§ return (expressão).
Exemplo:
Comando return
int Quadrado (int a)
{
return a*a;
}
São utilizados para transmitir informações 
para a função. 
Uma função pode receber qualquer número 
de argumentos. 
Existem funções que não recebem 
nenhum argumento. 
Parâmetros são inseridos 
entre os parênteses após 
o nome da função e 
separados por vírgulas.
Parâmetros
Parâmetros
int celsius (int fahr); // protótipo
int main () {
int c, f;
printf(“\nDigite a temperatura em 
Fanrenheit: “);
scanf(“%d”, &f);
c = celsius ( f ); //chamando a função 
com a passagem da variável f
printf(“\nTemperatura em celsius: %d”, 
c); 
}
int celsius (int fahr) { //função
int c;
c = (fahr – 32) *5/9;
return c; //retorna um valor para o 
programa principal
}
Considere funções trigonométricas, como seno, 
cosseno, etc. 
A função seno, por exemplo, recebe o valor de um 
ângulo e devolve o seno desse ângulo
§ float seno (float angulo).
Quando as variáveis são passadas por valor, a função 
cria novas variáveis do mesmo tipo e copia nelas os 
valores dos parâmetros. 
As funções não têm acesso 
às variáveis da função 
principal (int main). 
Passagem por valor
Algumas vezes é necessário retornar mais de um 
valor e quando isso é necessário, utiliza-se a 
passagem por referência. 
Principal vantagem
§ A função pode acessar as variáveis da 
função principal.
A passagem por referência 
utiliza o operador unário 
de referência (“&”). 
Esse operador cria outro 
nome para uma variável. 
Passagem por referência
Considere as instruções:
§ int n;
§ int & n1 = n.
Operador &n1 = n
§ Indica que n1 é outro nome para n;
§ O operador “&”faz referência ao endereço de 
memória de uma variável;
§ Uma referência não é uma 
cópia da variável, mas a mesma 
variável sob diferentes nomes.
Passagem por referência
São declaradas duas 
variáveis: n e n1.
Finalizando...
Estratégias básicas 
Durante a fase de projeto, a solução do problema total 
vai sendo organizada em soluções de subproblemas
§ Possibilita a divisão do programa em vários módulos 
que possuem funções claramente definidas. 
Essas funções podem ser implementadas 
separadamente por vários programadores 
de uma mesma equipe. 
Modularização
Um dos métodos utilizados para a resolução de 
problemas complexos trata da divisão de um 
grande problema em problemas menores. 
A partir disso, os sub problemas menores 
são resolvidos um de cada vez. 
Modularização
Umalgoritmo pode ser composto por vários 
subalgoritmos
§ Denominados de módulos. 
Um problema complexo pode ser visualizado 
como um conjunto de problemas mais simples.
Módulos 
§ Conceito computacional, 
que aplica a divisão de um 
programa em partes funcionais, 
sendo que estas partes 
se comunicam entre si.
Modularização
O módulo representa uma tarefa relacionada 
ao programa. 
No caso de um conjunto de comandos ou apenas 
um comando que executa uma única função para 
a solução do problema, o mesmo pode ser 
considerado como um módulo funcional
§ Função. 
Modularização
Os algoritmos são executados linha por linha 
(uma linha após a outra). 
Quando funções são implementadas, o algoritmo 
para em determinado ponto, executa essa função, 
mas volta imediatamente após o ponto que parou. 
Nesse caso, a função faz parte do programa 
principal, somente está em uma 
região diferente e é acessada 
através de uma chamada a ela.
Modularização
Um programa pode ser pensado de maneira modular
§ Como um conjunto de blocos a serem 
ligados de alguma forma. 
Como a função realiza uma operação específica, ela 
pode ser considerada como a parte modularizada de 
um programa.
Modularização
Um bom algoritmo deve tentar reduzir a interação 
entre módulos (denominada de acoplamento) e 
aumentar o relacionamento dos elementos de um 
mesmo módulo (denominado de coesão).
Modularização
Modularizar um problema 
§ Dividir o mesmo em pequenas partes, sendo que 
cada uma dessas partes será responsável pela 
realização de uma etapa do problema.
Para auxiliar no desenvolvimento de um algoritmo 
é utilizada a modularização, a qual torna mais fácil 
a resolução de pequenos 
problemas ao invés de 
um problema complexo.
Modularização
Dúvidas?

Continue navegando