Você está na página 1de 36

Modularidade

Introduo a Cincia da Computao


Engenharia de Computao

Prof. Danbia Bueno Espndola

Modularidade
Modularizar um programa consiste em dividir em mdulos o programa; Dependendo da linguagem a modularizao pode ser implementada atravs de funes, procedimentos, rotinas, etc; A linguagem C/C++ utiliza funes para modularizao;

Funes- definio
Conjunto de comandos agrupados em um bloco que recebe um nome e atravs deste pode ser ativado. Porque usar funes ? reaproveitamento de cdigo j construdo(por voc ou por outros programadores); evitar que um trecho de cdigo que seja repetido vrias vezes;

Funes
Porque usar funes ? a alterao de um trecho de cdigo de uma forma mais rpida - alterar apenas dentro da funo que se deseja; Para que os blocos do programa no fiquem grandes demais e, por conseqncia, mais difceis de entender; Para facilitar a leitura do programa-fonte de uma forma mais fcil;

Funes
Porque usar funes ? Para separar o programa em partes(blocos) que possam ser logicamente compreendidos de forma isolada.

#include <conio.h> #include <dos.h> #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <iostream> using namespace std;

int main() { EsperaEnter(); // ........... EsperaEnter(); // ........... EsperaEnter(); return 0; }

// Chamada da funo definida antes // Chamada da funo definida antes // Chamada da funo definida antes

void EsperaEnter() // Definio da funo "EsperaEnter" { int tecla; printf("Pressione ENTER\n"); do { tecla = getch(); if (tecla !=13) // Se nao for ENTER { Beep(523,500); // Ativa a emisso de um BEEP } } while(tecla != 13); // 13 e' o codigo ASCII do ENTER }

Formato Geral de uma Funo em C


tipo_da_funcao NomeDaFuncao (Lista_de_Parametros) { // corpo da funo }

A Lista_de_Parametros, tambm chamada de Lista_de_Argumentos, opcional.

Parmetros
A fim de tornar mais amplo o uso de uma funo, a linguagem C permite o uso de parmetros. Estes parmetros possibilitam que se definida sobre quais dados a funo deve operar. A funo Beep(523,500), a freqncia do som e o tempo de durao (ms)

Parmetros
Para definir os parmetros de uma funo o programador deve explicit-los como se estive declarando uma varivel, entre os parnteses do cabealho da funo. Caso precise declarar mais de um parmetro, basta separ-los por vrgulas. No exemplo a seguir temos a funo SOMA que possui dois parmetros, sendo o primeiro um float e o segundo um int.

Parmetros
void SOMA(float a, int b) // basta separar por vrgulas { float result; // a declarao de variveis igual ao que // se faz na funo main result = a+b; printf("A soma de %6.3f com %d %6.3f\n, a,b,Result); }

Os parmetros da funo na sua declarao so chamados parmetros formais. Na chamada da funo os parmetros so chamados parmetros atuais.

Parmetros
Os parmetros so passados para uma funo de acordo com a sua posio. Ou seja, o primeiro parmetro atual(da chamada) define o valor o primeiro parmetro formal (na definio da funo, o segundo parmetro atual define o valor do segundo parmetro formal e assim por diante. Os nomes dos parmetros na chamada no tem relao com os nomes dos parmetros na definio da funo.

Parmetros
No cdigo a seguir, por exemplo, a funo SOMA chamada recebendo como parmetros as variveis "b" e "a", nesta ordem.
#include <stdio.h> void SOMA(float a, int b) // basta separar os parmetros por vrgulas { float result; // a declarao de variveis igual ao que // se faz na funo main result = a+b; printf("A soma de %d com %6.3f %6.3f\n, a,b,Result); }

Parmetros
void main() { int a; float b; a = 10; b = 12.3; SOMA(b,a); // Chamada da funo SOMA(12.3,10) } O resultado do programa a impresso da seguinte mensagem: A soma de 12.300 com 10 22.300

Localizao das Funes no Fonte


A princpio podemos tomar com regra a seguinte afirmativa toda funo deve ser declarada antes de ser usada. A declarao de uma funo em linguagem C no exatamente o que fizemos at agora. O que estamos fazendo a definio da funo antes de seu uso. Na definio da funo est implcita a declarao.

Localizao das Funes no Fonte


A linguagem C permite que se declare uma funo, antes de defini-la. Esta declarao feita atravs do prottipo da funo. O prottipo da funo nada mais do que o trecho de cdigo que especifica o nome e os parmetros da funo.

Localizao das Funes no Fonte


No exemplo a seguir a funo SOMA prototipada antes de ser usada e assim pde ser chamada antes de ser definida. #include <stdio.h> void SOMA(float a, int b); // Prottipo da funo SOMA void main() { SOMA(16.7,15); // Chamada da funo SOMA antes de sua definio, } // mas aps sua prototipao void SOMA(float a, int b) // Definio da funo SOMA { float result; // a declarao de variveis igual ao que // se faz na funo main result = a+b; printf("A soma de %d com %6.3f %6.3f\n, a,b,Result); }

Localizao das Funes no Fonte


Ateno: existem compiladores mais simplificados ou antigos que no obrigam a declarao da funo antes de seu uso.

Verificao dos Tipos dos Parmetros


A princpio, dados usados parmetros atuais(aqueles da chamada da funo) devem ser dos mesmos tipos dos parmetros formais.

Verificao dos Tipos dos Parmetros


Entretanto, tenha muito cuidado se as trs condies a seguir se verificarem: se voc estiver usando um compilador que no exige a declarao antes da funo antes de seu uso; se voce usar uma funo antes de t-la prototipado (declarado); se os parmetros formais e reais no forem exatamente do mesmo tipo.

Verificao dos Tipos dos Parmetros


Se as trs condies se verificarem o resultado da execuo da funo mprevisvel !

No caso de voc declarar corretamente a funo antes de us-la, a converso de tipos feita como no caso de variveis.
No exemplo a seguir a funo SOMA chamada com os parmetros reais dos tipos int e float, nesta ordem. Como na declarao da funo o primeiro parmetro float e o segundo int, feita uma converso de int para float no caso do primeiro parmetro e de float para int no caso do segundo parmetro.

#include <stdio.h> void SOMA(float a, int b); // Prottipo da funo SOMA void main() { float f; f = 20.7 SOMA(16,f); }

Neste exemplo o primeiro parmetro convertido para 16.0 e o segundo para 20. O que ocorre, de fato, que a chamada da funo feita como se mesma fosse substituda por: SOMA((float)16,(int)f);

Escopo de Variveis
Por escopo de uma varivel entende-se o bloco de cdigo onde esta varivel vlida. Com base nisto, temos as seguintes afirmaes: as variveis valem no bloco que so definidas; as variveis definidas dentro de uma funo recebem o nome de variveis locais; os parmetros formais de uma funo valem tambm somente dentro da funo; uma varivel definida dentro de uma funo no acessvel em outras funes, MESMO ESTAS VARIVEIS TENHAM NOME IDNTICOS.

No trecho de cdigo a seguir tem-se um exemplo com funes e variveis com nomes iguais.
#include <stdio.h> #include <conio.h> void FUNC1() { int B; B = -100; printf("Valor de B dentro da funo FUNC1: %d\n", B); } void FUNC2() { int B; B = -200; printf("Valor de B dentro da funo FUNC2: %d\n", B); }

void main() { int B; clrscr(); B = 10; printf("Valor de B: %d\n", B); B = 20; FUNC1(); printf("Valor de B: %d\n", B); B = 30; FUNC2(); printf("Valor de B: %d\n", B); getch(); }

SADA Valor de B: 10 Valor de B dentro da funo FUNC1: -100 Valor de B: 20 Valor de B dentro da funo FUNC2: -200 Valor de B: 30

Passagem de parmetros
Os subprogramas (procedimentos, funes...) podem ou no ter passagem de parmetros. Parmetros so valores utilizados pelos subprogramas
Estru turas de Dado se Ling linha uage ns Prof. Dan bia Esp ndola

A chamada de sub-programas feito por de comando

15/08/2011

26

Passagem de parmetros
A passagem de parmetros feita entre parnteses aps o nome do subprograma em linha de comando A passagem de parmetros pode ser por ou por referncia
Estru turas valor de Dado se Ling uage ns Prof. Dan bia Esp ndola

15/08/2011

27

Passagem de parmetros
#include <stdio.h> #include <stdlib.h> void troca(int a,int b) { int temp; temp=a; a=b; b=temp; }

#include <stdio.h> #include <stdlib.h>

void troca(int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; }

main() { int num1, num2; num1=5; num2=6; troca(num1,num2); printf("%d %d",num1,num2); 15/08/2011 28 }

main() { int num1, num2; num1=5; num2=6; troca(&num1,&num2); printf("%d %d \n",num1,num2); }

Estru turas de Dado se Ling uage ns Prof. Dan bia Esp ndola

Passagem de parmetros por valor


O parmetro passado por valor no modificado fora do mdulo do sub-programa Os valores originais permanecem os mesmos fora do sub-modulo
Estru turas de Dado se Ling uage ns Prof. Dan bia Esp ndola

15/08/2011

29

Passagem de parmetros por referncia


Os parmetros passados por referncia atualizam fora do sub-programa as modificaes realizadas nos parmetros.

Diferena entre procedimento e funes: as funes necessitam de uma varivel para retornar o valor do tipo da funo.

15/08/2011

30

Estru turas de Dado se Ling uage ns Prof. Dan bia Esp ndola

Passagem de parmetros
* modifica parmetro; & chama parmetro;
float seno (float ang) float cosseno (float ang) { float s,c; s=seno (ang); c=cosseno(ang); return s/c; }

Se os ngulos fossem Estru turas passados por de referncia, o que Dado se aconteceria?

15/08/2011

31

Ling uage ns Prof. Dan bia Esp ndola

Passagem de parmetros
Na passagem por referncia o endereo da varivel deve ser passado na chamada da funo. Dessa forma a funo pode modificar a Estru varivel diretamente.

turas de Dado & indica que os parmetros so modificados s e Ling pela funo e retornam os valores apropriados. uage ns Prof. Dan bia Esp 15/08/2011 32 ndola

Passagem de parmetros
* modifica parmetro; & chama parmetro;
Estru turas de Dado se Ling uage ns Prof. Dan bia Esp ndola

15/08/2011

33

Passagem de parmetros
* modifica parmetro; & chama parmetro;
void complexo2 (float *r, float *t) { float real; real = (*r * *r) (*t * *t); *t = 2* *r * *t; *r = real; }

c = r +it

O simbolo *, na definio Estru turas dos parmetros real e de Dado imaginrio da funo se complexo2, indica que Ling esses parmetros PODEM uage ns ser modificados dentro Prof. Dan da funo bia
Esp ndola

15/08/2011

34

Passagem de parmetros
* modifica parmetro; & chama parmetro;
void complexo2 (float *r, float *t) { float real; real = (*r * *r) (*t * *t); *t = 2* *r * *t; *r = real; }

c = r +it Estru turas de Dado se Ling uage ns Prof. Dan bia Esp ndola

Alteraes que os parmetros r e t sofrem so sentidos FORA da funo

Funo que retorna mais de um valor


15/08/2011 35

Passagem de parmetros
Implemente o programa para a chamada do complexo2...
#include <stdio.h> #include <stdlib.h> void complexo2(float *r,float *t); main() { float a,b; printf (entre com um nro complexo <int>:) scanf(%f %f, &a,&b); complexo2(&a,&b); printf (O quadrado do nro complexo <%f +i%f> ,a,b); }

Programa principal que chama a funo...

15/08/2011

36

Estru turas de Dado se Ling uage ns Prof. Dan bia Esp ndola