Você está na página 1de 48

Funções

Algoritmos e Técnicas de Programação I – Prof. Piteri

Com o conceito de funções, vamos explorar outros importantes


conceitos básicos em programação, a saber:

 Modularidade (Em C, essa idéia é implementada por meio de funções);


Aula 01 – Funções

 Escopo de variáveis (variáveis locais e variáveis globais);


 Classes de armazenamento (auto, static, extern, register);
 Passagem de parâmetros (valor e referência);
 Recursividade (poderosa técnica de programação);
 Aprender a criar nossas próprias bibliotecas de funções (arquivos.h) e
distribuí-las para que outras pessoas possam utilizá-las.

Atenção!!! Na linguagem C, só existe passagem de parâmetros


por valor.
Modularidade
Algoritmos e Técnicas de Programação I – Prof. Piteri

O princípio de modularidade está presente em diferentes áreas do


conhecimento, em particular em grandes projetos na área de engenharia.
Esse conceito facilita obter a solução de problemas complexos,
independente do domínio de aplicação.
Aula 01 – Funções

Antes de explorar essa idéia no contexto do desenvolvimento de


programas, vamos verificar algumas das idéias subjacentes a ela.

Só para vocês terem uma idéia da complexidade do projeto do avião 767


da Boeing, há algo da ordem de 150.000 subprojetos associados, cada um
deles com funcionalidades específicas. A integração destes
componentes/módulos e o conjunto de funcionalidades existentes é o que
confere a aeronave, sua funcionalidade primordial – voar, com segurança!!!
Modularidade (Engenharia Automobilística)
Algoritmos e Técnicas de Programação I – Prof. Piteri

Para facilitar um pouco mais a compreensão do conceito de modularidade


e as consequências de seu uso, vamos pegar como exemplo um projeto da
área automobilística (que é mais acessível para todos).
Aula 01 – Funções

Entre os diferentes itens (componentes/subprojetos) que constitui um


carro “moderno”, podemos citar:

Chassi, carroceria, faróis, pneus, freios, câmbio, motor, sistema de direção,


ar condicionado, bancos elétricos, computador de bordo, freios ABS,
suspensão, tanque de combustível, piloto automático, controle de tração,
sistema de som, controle eletrônico de estabilidade (ESC), sensores de
estacionamento, viva voz com bluetooth, sistema de alarme, sistema de
som, retrovisores, airbags, etc.
Modularidade
Algoritmos e Técnicas de Programação I – Prof. Piteri

Se olharmos para alguns dos componentes que enumeramos, certamente


conseguimos encontrar outros, digamos, sub-componentes ou formas
diferentes (tecnologia) de desenvolver aquele componente. Por exemplo:

Sistema de Direção Freios


Hidráulica, Disco, Faixa, Sistema ABS,
Aula 01 – Funções

Elétrica, Sistema de Controle de


tração,...
Sistema híbrido, ...

Carroceria Motor
Portas dianteiras,
Bloco do motor,
Portas traseiras,
Pistões, válvulas, filtros,
Capô, Grade frontal,
Injeção eletrônica,
Parte superior da lataria,
Propulsão do Motor (Gasolina,
Tampa do tanque, ..
Álcool, Diesel, Elétrico, híbridos, ... )
Modularidade em Grandes Projetos de Engenharia
Algoritmos e Técnicas de Programação I – Prof. Piteri

Quais as informações básicas que temos desse tipo de projeto?

 Projetos altamente modulares (múltiplos componentes);


Aula 01 – Funções

 Cada um dos módulos (componentes) possui uma função específica,


ou seja, um propósito bem definido. É altamente especializado, ou seja,
só faz aquilo a que se propõe. Portanto, tem que fazer bem;

 Cada um dos módulos satisfaz requisitos (exigências) previamente


especificados;

 Os diferentes componentes possuem “interface de ligação” com outros


componentes com os quais eles se comunicam (interagem entre si);
Modularidade em Grandes Projetos de Engenharia
Algoritmos e Técnicas de Programação I – Prof. Piteri

Quais as informações básicas que temos desse tipo de projeto?

 Componentes podem ser projetados, desenvolvidos e testados de


forma independente do todo (maior produtividade, menor tempo).
Atualmente em diferentes partes do globo, por diferentes empresas;
Aula 01 – Funções

 Dezenas/centenas/milhares de pessoas trabalhando em paralelo (não


necessariamente no mesmo espaço físico) para atingir um único fim;

 A qualidade individual dos componentes e suas funcionalidades,


contribuem para a qualidade do produto final e das funcionalidades que
se deseja associada ao produto;

 Empresas diferentes (onde?) com suas respectivas expertizes/Know


how contribuem com o que sabem fazer melhor (só pensam e fazem
aquilo);
Modularidade em Grandes Projetos de Engenharia
Algoritmos e Técnicas de Programação I – Prof. Piteri

Quais as informações básicas que temos desse tipo de projeto?

 Facilidade de manutenção (na presença de um problema, troca-se o


componente, não o carro todo). No caso da indústria automobilística,
Aula 01 – Funções

facilita os recalls;

 Aumento do tempo de vida útil do produto. Alguns componentes


perdem suas funcionalidades (características funcionais) e podem ser
substituídos individualmente (eventualmente por outros mais modernos);

 Facilidade no gerenciamento e desenvolvimento do projeto.


Modularidade em Grandes Projetos de Engenharia
Algoritmos e Técnicas de Programação I – Prof. Piteri

Detalhes Importantes
 Cada componente possui um propósito bem definido, ou seja, deve
atender aos requisitos que se espera dele (saída);

 Para satisfazer os requisitos (exigências) esperadas, algumas


Aula 01 – Funções

condições iniciais (entrada) devem ser satisfeitas;

 Os componente fazem parte de um todo maior (projeto que deu origem


ao componente). Logo, deve estar integrado (ou ser passível de) com um
ou mais componentes (por meio de interfaces);

 A consistência do sistema (robustez) e a sua perfeita funcionalidade,


depende de todas as componentes;
Modularidade no Corpo Humano
Algoritmos e Técnicas de Programação I – Prof. Piteri

Uma outra analogia que poderíamos explorar relativa as idéias de


modularidade, guardada as devidas proporções, é a do Corpo
Humano.

 Altamente modular onde todos os módulos (órgão) possuem funções


Aula 01 – Funções

bem definidas;

 Alguns módulos duplicados (sistemas redundantes) com o objetivo de


potencializar ações e aumentar a segurança do sistema;

 Módulos altamente integrados entre si, com “interfaces de


comunicação” entre eles, bem definidas;
Modularidade no Corpo Humano
Algoritmos e Técnicas de Programação I – Prof. Piteri

 Módulos passando por um processo permanente de desenvolvimento


(evolução);

 Dependendo do problema, a manutenção é simples e é possível trocar


módulos danificados;
Aula 01 – Funções

 Módulos com códigos que funcionam parcialmente (“apresentam


bugs”), podem sofrer “correções”, por meio de “pílulas corretoras de erro”;

 Os diferentes “módulos” possuem entrada(s) e saída(s) bem definidas;

 O sistema só funciona bem, se todos os “módulos” estiverem


funcionando corretamente.
Modularidade na Indústria de Hardware
Algoritmos e Técnicas de Programação I – Prof. Piteri

As observações enumeradas lá atrás sobre o princípio de


modularidade, com as devidas adequações, também valem aqui.

Fabricantes:
Aula 01 – Funções

• Placas mãe;
• Processadores;
• Memórias (RAM, harddisk, pendrives, ...)
Mouse/teclado
• Placas de Vídeo; /scanner
• Dispositivos físicos de Entrada e Saída Impressoras
Monitores
Câmeras fotográficas
Modularidade na Indústria de Hardware
Algoritmos e Técnicas de Programação I – Prof. Piteri

O projeto de um computador é altamente modular (vários


componentes e diferentes fabricantes). Vamos contextualizar em
relação as observações anteriores:

• Cada componente é altamente especializado;


Aula 01 – Funções

• Atendem especificações bem definidas (requisitos), com o propósito de


se integrar num contexto maior;

• Facilidade de incorporar novos desenvolvimentos de forma muito


simples;

• Facilidade na manutenção (se tiver problemas com o monitor ou o Hd,


não precisa trocar o computador inteiro, apenas a componente com
problemas), e consequente diminuição de custos;
Modularidade na Indústria de Hardware
Algoritmos e Técnicas de Programação I – Prof. Piteri

• Novos componentes derivados de novas tecnologias, são facilmente


integrados por meio das interfaces já existentes (padrões na
indústria);

• Aumento do tempo de vida útil do produto (sobrevida);


Aula 01 – Funções

• Os diferentes componentes se integram facilmente (interfaces


padronizadas, após muito esforço da indústria);

Importante
A busca por padrões é uma constante na indústria,
incluindo a de software e a de hardware.
Programação Estruturada
Algoritmos e Técnicas de Programação I – Prof. Piteri

Programação estruturada, procura organizar (estruturar) programas em


torno de módulos separados (estruturas lógicas semi-independentes com
propósito bem definido) que podem ser usadas conjuntamente
(integrados) por meio de sequências de comandos referenciando seus
nomes (módulos);

Para a época (segunda metade da década de 60), o método revolucionou


Aula 01 – Funções

a produtividade dos programadores:


 obrigando-os a pensar na estrutura e na organização dos
programas, facilitando o desenvolvimento e a compreensão do código
elaborado;
 facilitando a manutenção e a identificação de erros em códigos
previamente gerados;
 diminuindo de forma significativa o número médio de erros por
linha de código;
Programação Estruturada
Algoritmos e Técnicas de Programação I – Prof. Piteri

Os conceitos de programação estruturada vieram para contrapor a noção


de programação não-estruturada, vigente até então e que faziam uso
excessivo do comando goto, originando programas:
 difíceis de entender (extremamente complicados de seguir o
fluxo de controle), modificar e de corrigir;
Aula 01 – Funções

Muitas vezes, gastava-se mais tempo a procura de erros do que no


próprio desenvolvimento do programa;

Importante: A estrutura de um programa (ou ausência dela) é um fator


crítico para a sua leitura, compreensão e manutenção.
Num código bem escrito é fácil seguir a lógica elaborada para a sua
solução, mesmo que seja por uma outra pessoa.
Programação Estruturada
Algoritmos e Técnicas de Programação I – Prof. Piteri

Em síntese, os conceitos associados a programação estruturada


objetivam, facilitar o desenvolvimento de programas legíveis e fáceis de
serem modificados (manutenção) por programadores;

Algumas regras básicas que os programas devem obedecer:


Aula 01 – Funções

 Usar somente as três estruturas de controle fundamentais;


 Cada uma dessas estruturas devem ter um único ponto de entrada e
um único ponto de saída;
 Evitar/eliminar o uso de estrutura de controle de fluxo incondicional
(goto);
 O programa deve ser escrito usando uma série de módulos, cada um
deles realizando uma tarefa simples e bem definida;
 ...
Programação Estruturada
Algoritmos e Técnicas de Programação I – Prof. Piteri

Algumas benefícios diretos, provenientes do uso de programação


estruturada :

 Aumento na produtividade do programador;


 Aumento da legibilidade do código;
Aula 01 – Funções

 Facilidade de modificação e de manutenção;

O advento da programação estruturada permitiu desenvolver programas


maiores, mais complexos e mais consistentes (confiáveis);

Entretanto, a complexidade do desenvolvimento de softwares para as


mais variadas áreas do conhecimento cresceu tanto, que esse modelo
mostrou suas limitações, dando origem a novos modelos;
Programação Estruturada
Algoritmos e Técnicas de Programação I – Prof. Piteri

Os conceitos de programação estruturada deram origem a uma nova


família de linguagens de programação, como: Algol, SNOBOL, Pascal,
módula e C, que por sua vez, estão na gênese das mais modernas
linguagens de programação, como: C++ e JAVA.
Aula 01 – Funções

Um dos cientistas mais influentes e que liderou o esforço pela adoção da


programação estruturada na década de 60, foi, Edger W. Dijkstra.
Funções na Linguagem C
Algoritmos e Técnicas de Programação I – Prof. Piteri

Para explorar as vantagens da noção de modularidade no


desenvolvimento de softwares (programas), em particular quando usamos
a linguagem C, é fundamental compreender todos os conceitos que estão
diretamente associados a uma função;
Aula 01 – Funções

Em outras palavras, na linguagem C é o conceito de função que permite


explorar e materializar a noção de modularidade no desenvolvimento de
programas (sistemas de software), com muitas das vantagens já
observadas.

Todas as vantagens já observadas por meio da modularidade se refletem


igualmente no processo de desenvolvimento de sistemas computacionais
(indústria de software).
Funções na Linguagem C
Algoritmos e Técnicas de Programação I – Prof. Piteri

O que já sabemos sobre funções?

 Já foi dito inúmeras vezes que um programa na linguagem C é


constituído por um conjunto de funções;
Aula 01 – Funções

 Todos os programas que desenvolvemos até o presente momento,


tinham apenas uma única função ( main(.) ), mas que chamava
(referenciava/invocava) outras funções primitivas;

 Na totalidade dos programas elaborados, fizemos uso de funções


primitivas (pré-definidas e existentes na biblioteca padrão), como por
exemplo: scanf(.), printf(.), sqrt(.), sin(), toupper(.), etc ;

 Observem que todas as funções acima têm um propósito bem definido


(único), ou seja, ela é altamente especializada;
Funções na Linguagem C
Algoritmos e Técnicas de Programação I – Prof. Piteri

Em geral, usamos funções para:


 Computar um determinado valor (realizar um determinado cálculo):
 Encontrar o k-ésimo termo na seqüência de Fibonacci;
 Obter a soma dos elementos da diagonal de uma matriz quadrada;
Aula 01 – Funções

 Verificar uma dada propriedade num valor ou conjunto de valores:


 Verificar se um dado número é primo;
 Verificar se um dado elemento pertence a um conjunto (operação de
busca);

 Provocar uma ação de mudança/alteração sobre os dados


representados:
 Permutar os elementos entre duas linhas de uma matriz;
 Ordenar (ordem crescente) um conjunto de valores reais;
Funções na Linguagem C
Algoritmos e Técnicas de Programação I – Prof. Piteri

A partir dos recursos e do domínio de conhecimentos


associados a funções, seremos capazes de:

 Criar nossas próprias funções para os mais variados propósitos, muitas


vezes usando funções já existentes;
Aula 01 – Funções

 Criar cabeçalhos .h (arquivos com funções especializadas) que


poderão ser usados por nós e outros programadores em diferentes
projetos (aumento de produtividade, ganho de consistência), a exemplo
daqueles existentes na biblioteca padrão;

 Usar bibliotecas de funções desenvolvidas por outros programadores e


integrá-las aos nossos projetos (aumento de produtividade, ganho de
consistência). Quando milhares de pessoas partilham o mesmo código, é
mais fácil detectar e corrigir erros;
Funções na Linguagem C
Algoritmos e Técnicas de Programação I – Prof. Piteri

Observem que os dois últimos itens em relação ao uso de outras


bibliotecas (feitas por nós ou terceiros) implica em acessar uma boa
documentação (o que faz, como faz, informações sobre o nível de
consistência, etc). Logo, é fundamental que nossas funções também
Aula 01 – Funções

estejam bem documentadas. Em nossa disciplina vamos nos limitar a


construção de uma documentação interna;

Sigam os exemplos iniciais que serão dados para a elaboração do


próximo trabalho, que irá explorar o conceito de funções.
Forma Geral de uma Função em C
Algoritmos e Técnicas de Programação I – Prof. Piteri

variáveis locais

Tipo_de_Dado Nome_da_Função ( Tipo_de_Dado_1 Parâmetro_1,


Tipo_de_Dado_2 Parâmetro_2,
...,
Aula 01 – Funções

Tipo_de_Dado_n Parâmetro_n )
{
Declaração de variáveis locais;

Instruções associadas a função; Corpo da Função


(código altamente especializado)

return( expressão );
}
Forma Geral de uma Função em C
Algoritmos e Técnicas de Programação I – Prof. Piteri

Onde:

Tipo_de_Dado: Pode ser qualquer tipo de dado simples existente na


linguagem C, inclusive o tipo void. Deve ser do mesmo tipo de dados
associado ao valor de retorno da função, definido por expressão no
argumento de return(.) ;
Aula 01 – Funções

Nome_da_Função: É o identificador da função (criado pelo usuário). Deve


seguir a regra de construção de um identificador. Lembram-se? Dê nomes
significativos as suas funções (que lembrem o propósito do que ela faz).
Observe os códigos que serão entregues e procure seguir os exemplos;

Tipo_de_Dado_1, Tipo_de_Dado_2, ..., Tipo_de_Dado_n: São os tipos de


dados associados a cada um dos parâmetros formais (variáveis). Podem
ser quaisquer tipos de dados existentes na linguagem, ou criados pelo
usuário ( (typedef) vamos ver no segundo semestre);
Forma Geral de uma Função em C
Algoritmos e Técnicas de Programação I – Prof. Piteri

expressão: Qualquer expressão válida na linguagem C. Deve ser do


mesmo tipo de dado especificado na definição da função (primeira linha);

return: Toda função deve possuir uma instrução desse tipo. Esse
comando, quando executado provoca um retorno imediato e incondicional
para a posição no código onde a função foi referenciada (chamada),
carregando consigo um valor de retorno, que é substituído na respectiva
Aula 01 – Funções

posição. Quando o valor de retorno da função for do tipo void, então o


comando return(expressão) deve ser simplesmente return; e
nenhum valor será usado para fazer qualquer substituição. Algumas vezes,
vamos usar essa forma para provocar efeitos sobre os dados. No momento
oportuno, voltamos ao assunto;

Parâmetro_1, Parâmetro_2, ... , Parâmetro_n: São variáveis (também podem


ser outras funções) usadas para se estabelecer o “diálogo”, a
“comunicação” entre as diferentes funções de seu programa, com o
propósito de manipular os dados existentes (copiar, modificar-trocar-
atualizar-alterar). São também referenciados por argumentos ou parâmetros
formais.
Observações
Algoritmos e Técnicas de Programação I – Prof. Piteri

Todas as variáveis locais e os parâmetros formais (também são


considerados variáveis locais) são criadas (passam a existir) somente
no momento em que a função está ativa (foi invocada/referenciada).
Após a execução do comando return(), elas deixam de existir e os
seus respectivos valores são perdidos;
Aula 01 – Funções

Logo, entre duas chamadas consecutivas de uma mesma função, não é


possível acessar os valores anteriores associados a cada uma das
variáveis;

Há uma exceção que iremos explorar através de um exemplo e que faz


uso do conceito de classes de armazenamento de variáveis (static).
Funções e Modularidade
Algoritmos e Técnicas de Programação I – Prof. Piteri

O uso de funções permite que possamos explorar ao máximo a idéia de


refinamentos sucessivos (decomposição de um problema em inúmeros
subproblemas mais simples), que facilita obter a solução de um problema
complexo;
Aula 01 – Funções

Embora a Engenharia de Software seja a mais recente entre as várias


outras engenharias e tenha suas especificidades, alguns conceitos
utilizados em outras áreas do conhecimento são muito úteis, como por
exemplo, o princípio de modularidade;

Assim, as vantagens já enumeradas anteriormente se aplicam igualmente


ao desenvolvimento de software, mas não significa que sejam suficientes.
O produto software, possui uma complexidade que demanda
metodologias próprias que tem evoluído ao longo do tempo;
Vantagens no Uso de Funções
Algoritmos e Técnicas de Programação I – Prof. Piteri

Em síntese, o uso do conceito de modularidade aplicado ao


desenvolvimento de programas, possui as seguintes vantagens:

 Uma função pode ser testada individualmente e validada “parcialmente”,


independente de outras funções. Assim, partes de “grandes projetos”
podem ser elaborados em paralelo (envolvendo múltiplos programadores);
Aula 01 – Funções

 Uma função é uma pequena parte da solução do problema e testá-la


individualmente e garantir sua correção é muito mais simples (poucas
linhas de código) que o todo;

Importante
Mesmo uma função estando correta individualmente, a sua integração
ao sistema e a ”interação” dessa, com outras funções, pode apresentar
problemas.
Vantagens no Uso de Funções
Algoritmos e Técnicas de Programação I – Prof. Piteri

 Funções já testadas e validadas podem ser usadas em outros projetos


(reusabilidade = produtividade + diminuição de custos + qualidade + ...);
Aula 01 – Funções

 O uso de funções:
 diminui o tamanho total do código (número de linhas);
 torna o código mais legível;
 facilita o desenvolvimento, gerenciamento e manutenção de sua
aplicação;
 facilita o processo de documentação interna;
 cria níveis de abstração (o que faz? Como faz?) (principalmente
quando usamos bibliotecas já existentes);
Vantagens no Uso de Funções
Algoritmos e Técnicas de Programação I – Prof. Piteri

O que faz? Como Faz?

A idéia de modularidade exige abstração. Por exemplo:


Aula 01 – Funções

O corpo de uma função (pequenas partes de código) contêm os detalhes


de “como fazer” (encapsula a complexidade das operações e das técnicas
utilizadas);

Quem usa as funções sabe “o que” elas fazem, muitas vezes não
interessa saber “como” elas fazem. Isso simplifica a vida do programador,
já que ele se preocupa apenas com as funcionalidades existentes (o que
ela faz). Isso quando você estiver usando alguma função (biblioteca)
desenvolvida por outro programador;
Vantagens no Uso de Funções
Algoritmos e Técnicas de Programação I – Prof. Piteri

Obviamente que para usar as funções de alguma biblioteca que não foi
desenvolvida por você, é necessário ler uma documentação e ser capaz
de entender a sua interface (número de parâmetros e restrições
associados aos respectivos tipos de dados), assim como o tipo de dado
relativo ao valor de retorno;
Aula 01 – Funções

Exemplo:

Por exemplo, para usar a função exp(.) da <math.h> você deve saber
que existe um único argumento real (double) e o valor retornado
também é do tipo double e corresponde ao valor da função exponencial
no argumento que foi passado. Você usa a função (sabe o que ela faz),
mas não sabe coma ela foi implementada (como faz). É como se ela fosse
uma pequena “caixa preta”.

double exp(double x); // protótipo da


função
Exemplos de Funções
Algoritmos e Técnicas de Programação I – Prof. Piteri

Embora ainda haja muitos conceitos para serem explorados, a partir de


agora, vamos dar alguns exemplos de códigos de funções para facilitar a
compreensão do que já foi apresentado.

Na aula de hoje, vamos desenvolver códigos de funções associadas aos


seguintes problemas.
Aula 01 – Funções

 Obter o Fatorial de um número inteiro positivo;


 Obter o k-ésimo termo na Seqüência de Fibonacci;
 Calcular a Raiz Quadrada e Raiz Cúbica de um número real;
 Verificar se um dado número inteiro é Primo;
 Calcular o Coeficiente Binomial;

Nos próximos slides serão apresentados somente os códigos das funções.


Posteriormente serão enviados os programas completos, incluindo os
comentários. Observem que os respectivos enunciados relativos a cada
um dos problemas já foi formalizado em outros contextos (Listas de
Exercícios e aulas anteriores).
Função Fatorial
Algoritmos e Técnicas de Programação I – Prof. Piteri

Para todos os exemplos a seguir, vamos admitir que os parâmetros formais


satisfazem as condições do problema. Em breve, vamos aprender a
verificar estas condições por meio de um novo mecanismo ( assert() ).

Tipo de dado associado


Aula 01 – Funções

ao valor de retorno Parâmetro formal


da função

long int Fatorial (long int N ){ // n ≥


0
long int i=1, fat=1; // Variáveis
locais
if (N = = 0) return (fat);
else for ( ;i<=N; i++) fat = fat*i;
return (fat);
} // Fatorial
Função Fibonacci
Algoritmos e Técnicas de Programação I – Prof. Piteri

long int Fibonacci(long int F){ // F ≥ 1

if ((F == 1) || (F == 2)) return(1);


else {
// declaração de variáveis dentro do bloco onde elas serão usadas.
long int pen = 1, ant = 1, atual = 0, i = 3;
for( ; i <= F; i++) {
Aula 01 – Funções

atual = pen + ant;


pen = ant;
ant = atual;
}
return(atual);
} // else

} // Fibonacci

Variáveis definidas dentro de um bloco só podem ser acessadas em


seu interior, ou seja, seu escopo (alcance/visibilidade) é limitado.
Funções Raiz_2 e Raiz_3
Algoritmos e Técnicas de Programação I – Prof. Piteri

double Raiz_2 (double X) { // X ≥ 0


double app = 1.0;

while ( fabs(X - app*app ) > ERRO )


app = (X/app + app)/2.0;

return(app);
Aula 01 – Funções

} // Raiz_2

double Raiz_3 (double X) {


double app = 1.0;

while ( fabs(X -app*app*app) > ERRO )


app = (2*app + X/(app*app))/3.0;

return(app);
} // Raiz_3
Função Primo
Algoritmos e Técnicas de Programação I – Prof. Piteri

Verificar se um número inteiro P, (P ≥ 2), é Primo.

short Primo(int P) { // P ≥ 2
Aula 01 – Funções

int i = 3, exp1 = (int)sqrt((double)P)+1;


if (P == 2) return(1);
if (P % 2 == 0) return(0);
for (; i <= exp1; i=i+2) //testando somente P
ímpares
if (P%i == 0) return(0);

return(1);
} // Primo
Função Coeficiente Binomial
Algoritmos e Técnicas de Programação I – Prof. Piteri

n  n!
 = ( n, p ≥ 0, n ≥ p)
 p  p !( n − p )!
Aula 01 – Funções

O Coeficiente Binomial é dado pela relação acima. Permite combinar o


número de n objetos tomados p a p. Por exemplo:

 4 4! 4.3! 4
  = = = =4
 3  3!( 4 − 3) ! 3!.1! 1
Função Coeficiente Binomial
Algoritmos e Técnicas de Programação I – Prof. Piteri

Observem que, para se obter o Coeficiente Binomial, é necessário fazer


uso do cálculo do Fatorial (explorar a idéia de refinamentos sucessivos).

long int Fatorial (long int N ){


// N ≥ 0

long int i=1, fat=1; // Variáveis locais


Aula 01 – Funções

if (N == 0) return (fat);
else for ( ;i<=N; i++) fat = fat*i;
return (fat);
} // Fatorial

long int Coef_Binomial(long int N, long int P){


//N,P ≥ 0 e N ≥P

return( Fatorial(N)/(Fatorial(P)*Fatorial(N-P)) );
}
Várias referências a
função Fatorial(.).
Função Coeficiente Binomial
Algoritmos e Técnicas de Programação I – Prof. Piteri

Visão geométrica das funções que constituem o programa e a relação de


chamadas entre elas (ver programa).
Aula 01 – Funções

main(.)

Coef_Binomial(.) Fatorial(.)
Próximas Aulas
Algoritmos e Técnicas de Programação I – Prof. Piteri

 Continuação do tópico funções;


 Funções Recursivas;
 Passagem de parâmetros por endereço;
 Coerção/molde (cast) na passagem de parâmetros;
Aula 01 – Funções

 Maiores detalhes sobre:


 Escopo de variáveis (locais ou globais);
 Classes de armazenamento de variáveis;

A partir de agora, vamos explorar o uso de funções em todos os


programas que iremos desenvolver, ou seja, daqui para frente,
tudo terá funções, cada vez mais.
Exercícios
Algoritmos e Técnicas de Programação I – Prof. Piteri

Como o valor do fatorial cresce muito rapidamente, para pequenos valores


do argumento, é muito fácil esgotar a capacidade de representação dos
tipos de dados inteiros longos. Uma alternativa seria realizar a computação
usando valores reais (double ou long double), sabendo “a priori”, que a
parte fracionária é zero.

Uma outra alternativa seria obter o fatorial de forma aproximada, para


Aula 01 – Funções

grandes valores de n, por meio da Fórmula de Stirling, dada abaixo.


n
n
n ! ≈ 2π n  
e
Onde e = 2.7118282 é a base do logaritmo natural.

Escreva uma função para computar de forma aproximada o fatorial de um


valor inteiro, a partir da fórmula de Stirling. Para n = 10, o erro é inferior a
1% e diminui, quanto maior o valor de n.
Exercícios
Algoritmos e Técnicas de Programação I – Prof. Piteri

Escreva um programa para obter o fatorial de um valor inteiro positivo


usando a forma aproximada de Stirling. Compare os valores obtidos com os
valores exatos do fatorial (procure na WWW) e imprima uma tabela com os
resultados para n no intervalo [1,30]. Aproveite e calcule o erro cometido.
Aula 01 – Funções
Exercícios Adicionais
Algoritmos e Técnicas de Programação I – Prof. Piteri

Conjectura de Golbach:

Todo número par p ( p ≥ 4), pode ser escrito como a soma de dois
números primos p1 e p2, tal que p = p1+p2.
Aula 01 – Funções

Comentários : Alguns números admitem mais de um par de primos.


Por exemplo, o número 10 admite os pares (5,5), (3,7) e (7,3). Como
nos inteiros a soma é comutativa, não é necessário escrever o par (7,3).

Problema : Para cada n (4 ≤ n ≤ 1000), encontre todos os pares de


primos cuja soma seja igual a n.
Exercícios Adicionais
Algoritmos e Técnicas de Programação I – Prof. Piteri

Números Felizes:

Escolha um número natural n (n>1) e calcule a soma dos quadrados


de todos os seus algarismos, encontrando o número n1. A seguir,
pegue n1 e repita o mesmo processo (obtenha a soma dos
quadrados de n1), obtendo n2, e, assim sucessivamente. Quando o
resultado final da sequência n, n1, n2, ... termina em 1, diz-se que o
Aula 01 – Funções

número n é um número feliz. Caso contrário, dizemos que o número


é triste;

Exemplos:

O número 4599 é um número feliz.

42 + 52 + 92 + 92 = 203
22 + 02 + 32 = 13
12 + 32 = 10
12 + 02 = 1
Exercícios Adicionais
Algoritmos e Técnicas de Programação I – Prof. Piteri

Propriedades:
 Os números 203, 13 e 10 são números felizes;

 Todas as permutações de um número feliz, geram números felizes. Assim; 5499,


9495, 9945 satisfazem a propriedade;

 A introdução de zeros em um número feliz, resulta num número feliz, como:


450099, 450909, ... . Logo, existem infinitos números felizes
Aula 01 – Funções

 Números tristes resultam indefinidamente em torno dos números 4, 16, 37, 58, 89,
145, 42, 20, voltando ao 4.

Problema : Encontre todos os números felizes n (4 ≤ n ≤ 1000).


Exercícios Adicionais
Algoritmos e Técnicas de Programação I – Prof. Piteri

Primos Gêmeos:

Dois números primos são ditos primos gêmeos, se eles forem


ímpares consecutivos. Por exemplo, os pares (3,5), (5,7), (11,13) e
(17,19) são primos gêmeos.
Aula 01 – Funções

Problema : Leia dois números inteiros a e b que delimitam um


intervalo do tipo [a,b], e encontre todos os primos gêmeos no respectivo
intervalo.
Exemplos de Programas (Funções)
Algoritmos e Técnicas de Programação I – Prof. Piteri

Execução e comentários de programas envolvendo


as funções
Aula 01 – Funções

Observem que muitas das funções que iremos


ilustrar, já foram discutidas e implementadas

Você também pode gostar