Você está na página 1de 41

Estrutura de dados

Modularização.
Procedimentos e Funções.
Estrutura de Dados
Módulo 2: modularização
Modularização

É a divisão do algoritmo em módulos ou


sub-rotinas, para que o problema dividido
em subproblemas possa ser facilmente
interpretado e desenvolvido.
Dividir para conquistar
• Subprograma ou módulos é uma forma que a LPs
utilizam para implementar o conceito de dividir para
conquistar,
• com a intenção de facilitar a resolução de problemas
computacionais, melhorar a compreensão do programa
e viabilizar o reuso de código.
• Esta técnica permite dividir o sistema em módulos
aonde os dados e os procedimentos são encapsulados,
para realizar esta tarefa se utiliza o conceito de
abstração, onde separa-se o que de fato importa no
contexto do problema.
A Programação modular
•As linguagens de programação possuem um
recurso conhecido como programação
modular.
•São compostos de agrupamentos ou bloco de
instruções em uma pequena unidade de
programa, que podem ser reutilizadas, e estão
dentre os recursos mais fundamentais em um
projeto de linguagens de programação
(SEBESTA, 2011).
Programação Modular
Necessidades de modularização
Os principais benefícios para o uso da modularização são:
• a divisão do algoritmo em módulos, para que ele seja melhor
interpretado e desenvolvido.
• a reutilização de código.
• Os módulos acabam sendo mais simples e menos complexos.
• A divisão em módulos facilita o entendimento parcial do problema
e entendendo todos os problemas parciais, no final, teremos
entendido o problema maior.
• A maioria dos módulos pode ser vista como um minialgoritmo, ou
seja, com entrada de dados, processamento desses dados e saída
de resultados.
Outros benefícios de se utilizar subprograma em geral são:
#include <stdio.h>
• Simplicidade para o desenvolvedor void sejaBemVindo(){
depurar e testar o programa. printf("Olá mundo\n");
• Simplicidade para projetar o programa, }
uma vez que cada subprograma executar
uma tarefa específica. int digitaValor(){
printf("Digite um valor:\n");
• Criar blocos de código ou módulos de
programa independentes. int var;
• Redução na quantidade de códigos de scanf("%d",&var);
programa, pois um subprograma pode ser return var;
reutilizado em diferentes lugares do }
software. int soma(int a, int b){
• Facilitar a legibilidade do programa. int var = a + b;
• Aumenta a produtividade e a qualidade return var;
no desenvolvimento de software }
Modularização: Método de Refinamento Sucessivo
Para construir os módulos, primeiro precisamos analisar o problema e dividi-
lo em partes principais, que são os módulos;
Depois precisamos analisar os módulos obtidos para verificar se a divisão está
coerente.
Se algum módulo ainda estiver complexo, devemos dividi-lo também em
outros submódulos.
Por fim, precisamos analisar todos os módulos e o problema geral para
garantir que o algoritmo mais os módulos resolvam o problema de forma
simples.
Esse processo é chamado de Método de Refinamento Sucessivo, pois o
problema complexo é dividido em problemas menores e, a partir do resultado
dos problemas menores, teremos o resultado do problema complexo.
Método de Refinamento Sucessivo
• Este procedimento para resolução de
problemas é conhecido na área de
tecnologia da informação, como dividir
para conquistar ou método dos
refinamentos sucessivos.
• Quando encontramos um problema
computacional, podemos subdividi-lo em
problemas menores facilitando o seu
entendimento, e quando esses problemas
menores também não tem solução,
podemos dividi-los novamente na forma
de módulos ou subprogramas.
Modularização
procedimentos e funções.
Modularização
Temos dois tipos de módulos:
procedimentos e funções.
Função
Conjunto de instruções, com interface bem definida, que
efetua um dado cálculo e retorna um valor.
Procedimento
Conjunto de instruções, com interface bem definida, que
executa um conjunto de instruções.
Função X Procedimento
• Dentro do conceito de módulo ou subprograma,
uma pequena particularidade distingue uma função
de um procedimento:
• A função recebe como argumento pelo menos um
parâmetro e retorna um resultado,
• enquanto, procedimento não retorna valor.
Procedimentos
•Os procedimentos são aqueles módulos que
executam um conjunto de comandos sem
retorno para o módulo que o chamou.
•Void quer dizer vazio e é este o sentido deste
tipo de dado.
•Ele permite a construção de funções que não
retornam nada (procedimentos) e/ou de
funções que não têm argumentos de entrada.
Procedimentos
A seguir são apresentados alguns exemplos de
protótipos de funções que não retornam nada e/ou
não possuem argumentos formais:
/*Sem retorno com argumentos de entrada*/
void nome_da_função (declaração_parâmetros);
/*Sem argumentos formais e retorno*/
void nome_da_função (void); void sejaBemVindo(){
printf("Olá mundo\n");
}
Função
Funções
As funções são aqueles módulos que executam um conjunto de
comandos e retornam algum dado para o módulo que o chamou.
Uma função no C tem a seguinte forma geral:
tipo_de_retorno nome_da_função
(declaração_de_parâmetros)
{
corpo_da_função
}
Função
<tipo de retorno> <nome da função> (declaração de parâmetros)
{ //início da função
...
} //final da função
O <tipo de retorno> é o tipo de variável que a função vai retornar.
O default é o tipo int, ou seja, uma função para a qual não se declara o tipo de
retorno é considerada como retornando um inteiro.
A <declaração de parâmetros> é uma lista de nomes de variáveis separadas por
vírgulas que recebem os valores dos argumentos quando a função é chamada.
Ela possui a seguinte forma geral: tipo nome_1, tipo nome_2, ... , tipo nome_n
O corpo da função contém a declaração das variáveis locais, bem como a sequência
de comandos que serão executados, ou seja, o bloco de comandos da função.
Função - Entendimento
Na linguagem C “COM RETORNO” significa que a função
tem um TIPO, que pode ser int, float, double, char, struct, etc.
Uma função do tipo VOID (vazio) é uma função que não tem
tipo definido.
Quando uma função tem um tipo definido, então, ela
obrigatoriamente deverá retornar algo do tipo definido.
Uma função do tipo int deve retornar uma variável do tipo int,
e assim por diante.
Função - Entendimento
Classificação das funções:
Comando return
O comando return tem a seguinte forma geral:
return valor_de_retorno;
Digamos que uma função está sendo executada.
Quando se chega a uma declaração return a
função é encerrada imediatamente;
Comando return
É importante lembrar que o valor de retorno fornecido
tem que ser compatível com o tipo de retorno declarado
para a função.
Uma função pode ter mais de uma declaração return.
A função é terminada quando o programa chega à
primeira declaração return.
Escopo de variáveis
Escopo de Variáveis
O escopo é o conjunto de regras que determinam o
uso e a validade de variáveis nas diversas partes do
programa.
• Variáveis Globais
• Variáveis Locais
• Parâmetros formais ou parâmetros da função
Variável global
• Uma variável global é aquela declarada no início do algoritmo e pode
ser utilizada por qualquer parte desse algoritmo, seja nos comandos
do próprio algoritmo, bem como, dentro de qualquer módulo que
pertença ao algoritmo.
• Variáveis globais são declaradas fora de todas as funções do programa.
Elas são conhecidas e podem ser alteradas por todas as funções do
programa.
• Quando uma função tem uma variável local com o mesmo nome de
uma variável global a função dará preferência à variável local.
• Nesse caso, sua declaração é feita apenas uma única vez, não sendo
permitido que o mesmo nome de variável seja declarado dentro de
qualquer outra parte do algoritmo, por exemplo, dentro de qualquer
outro módulo.
Variáveis Globais
int z, k;

func1 (...)
{ main ()
int x, y; {
... int count;
} ...
}
func2 (...)
{
int x, y, z;
...
z =10;
...
}
Variável global
Variável local
• Uma variável local é aquela declarada dentro de algum bloco, por
exemplo, dentro de um módulo.
• Nesse caso, essa variável é válida e reconhecida somente dentro
do bloco em que foi declarada.
• Um bloco começa quando abrimos uma chave e termina quando
fechamos a chave.
O mesmo nome de variável
pode ser declarado dentro
de diferentes blocos, pois
serão reconhecidas como
uma nova variável.
Variáveis Locais
Exemplos de variáveis locais

func1 (...) void main ()


{ {
int abc, x; int a, x, y;
... for (...)
} {
func (...) float a,b,c;
{ ...
int abc; }
... ...
} }
Escopo de variáveis: local ou global
• O escopo de uma variável é onde, dentro do algoritmo, uma
variável é válida ou pode ser reconhecida.
• Por exemplo, se declararmos uma variável x no início de um
algoritmo, essa variável x pode ser usada e alterada em qualquer
parte desse algoritmo e em nenhum momento declarada
novamente, ou seja, ela é única no algoritmo inteiro.
• Mas é muito importante ter o controle dessas variáveis globais,
justamente porque elas podem ser alteradas a qualquer momento.
• No entanto, se declararmos, usarmos e alterarmos uma variável y
dentro do módulo soma, poderemos também declará-la, utilizá-la
e alterá-la dentro do módulo subtração, do módulo divisão e do
módulo multiplicação, se assim o desejarmos.
Parâmetros das Funções
Parâmetros das Funções
Parâmetros das funções são declarados como sendo as
entradas de uma função.
O parâmetro é uma variável local da função.
Pode-se também alterar o valor de um parâmetro, pois esta
alteração não terá efeito na variável que foi passada à função.
O C passa parâmetros para uma função, são passadas
apenas cópias das variáveis.
Parâmetros - Entendimento
•O uso de argumentos passados como parâmetros em
módulos, sejam eles funções ou procedimentos é
muito comum.
•Quando os procedimentos e funções estão sem o uso
de parametrização de módulos, após o nome dos
módulos, os parênteses estão vazios.
•É dentro dos parênteses que os argumentos são
passados como parâmetros aos módulos.
•Argumentos são os valores atribuídos aos parâmetros.
Parâmetros – Entendimento - Resumo
•Parâmetros são as variáveis situadas na assinatura de
um método ou função.
•Um parâmetro é um valor que vem de uma variável,
ou de uma expressão, que é passado para uma rotina,
a qual utiliza esses valores atribuídos aos parâmetros
para alterar o seu comportamento em tempo de
execução.
• Não existe uma real diferença entre parâmetros e argumentos.
• Na Passagem de Parâmetros os valores são passados para as rotinas.
Passagem de parâmetros
Passagem de parâmetros
• Os valores associados aos parâmetros durante a vida
de uma função chamada são determinados com base
em como esses argumentos são passados para a
função.
• A linguagem de programação C permite que os
parâmetros sejam passados para as funções de duas
maneiras:
• por valor
• Por referência.
Passagem de parâmetros por
valor
Passagem de parâmetros por valor
• Passagem de Parâmetros por Valor: é a forma mais
comum de passar valores a uma rotina.
• Uma cópia da variável inteira é feita e esta pode ser
usada e alterada dentro da função sem afetar a
variável da qual ela foi gerada.
• Isso significa que o valor dos parâmetros sendo
alterados durante a execução da rotina não
acarretará em nenhuma modificação no valor dos
parâmetros reais (variáveis da função chamadora).
Passagem de Parâmetros por
Referência
Passagem de Parâmetros por Referência

Este tipo de chamada, não se passa para a função os


valores das variáveis, mas sim suas referências (endereço
das variáveis);
Neste caso, a alteração dos parâmetros da função,
alterará as variáveis que são passadas para a função
também.
Passagem de Parâmetros por Referência Entendimento
O endereço da variável é transferido, isto significa que um ponteiro é
manipulado na rotina.
Esta forma deve ser usada quando uma rotina precisa ser capaz de alterar
os valores das variáveis usadas como argumentos do método ou
procedimento, os parâmetros então precisam ser explicitamente declarados
como tipos ponteiros.
Isso significa que qualquer alteração no valor dos parâmetros durante a
execução da rotina será refletida no valor de seus parâmetros reais
correspondentes. Estudaremos ponteiros mais à frente.

Você também pode gostar