Você está na página 1de 29

Linguagem e Tcnicas de Programao

Linguagem C
Funo

Prof. Edwar Saliba Jnior


Fevereiro de 2011
Unidade 07 Funo

Linguagem e Tcnicas de Programao

Conceitos

As tcnicas de programao dizem que, sempre que possvel,


evite cdigos extensos, separando o mesmo em funes, visando
um fcil entendimento e uma manuteno facilitada;
De acordo com a tcnica, devem-se agrupar cdigos correlatos
em uma funo;
Uma outra utilizao de funo quando um trecho de cdigo
ser utilizado muitas vezes no programa. Deve-se colocar este
trecho em uma funo e sempre que for preciso chamar a funo;
A Linguagem C possibilita criar funes, sendo possvel passar
parmetros para elas e retornar valores tanto no nome da funo
como em algum parmetro passado;
Enfim, lembre-se que: tudo em C funo.

Unidade 07 Funo

Linguagem e Tcnicas de Programao

Funo e Prottipo (Assinatura da Funo)

Para ser usada, uma funo deve estar previamente definida, isto , deve-se
indicar para o compilador qual o nome da funo e quais so os parmetros
esperados;
Uma maneira simples de se resolver isto, a colocao da funo antes de seu
uso;
Quando se tm sistemas grandes, no recomendvel ter um nico arquivo
fonte, pois a manuteno seria impraticvel;
Neste caso, possvel ter uma funo definida em um programa fonte e seu uso
em outro programa fonte. Para resolver este problema a Linguagem C criou uma
definio chamada de prottipo (assinatura da funo);
No prottipo de uma funo definido somente o necessrio para o compilador
no acusar erros. A definio do prottipo geralmente colocada dentro de
arquivos header (.h) e includa dentro dos programas fontes;
No prottipo somente so informados o nome da funo, o seu tipo de retorno e o
tipo de cada parmetro esperado.

Unidade 07 Funo

Linguagem e Tcnicas de Programao

Tipos de Funes

Funes pr-definidas pela linguagem:

Funes da biblioteca;
Definidas nos arquivos da biblioteca da
linguagem;

Funes definidas pelo programador:

Escritas pelos programadores nos programas.

Unidade 07 Funo

Linguagem e Tcnicas de Programao

Por qu criar funes?

Para reduzir a complexidade de um programa:

Elaborar a soluo em partes pequenas e bem definidas;

Uma tarefa complexa dividida em funes mais simples;

Para evitar a repetio de cdigo ao longo do


programa:

Diminuir o tamanho do cdigo;


Menos erros, menor custo de manuteno, menor tempo
de programao;

Reutilizao de cdigo:

Cdigo j testado, sem erros => custo menor de


programao e maior confiabilidade.

Unidade 07 Funo

Linguagem e Tcnicas de Programao

Caractersticas das Funes

Uma funo deve realizar uma nica tarefa bem definida;


Toda funo tem um nome nico. De preferncia bem
significativo:

Uma funo pode ser invocada a partir de outras


funes:

Serve para que a funo seja invocada (chamada);

Por exemplo, a partir de main( );

Uma funo deve ser programada de forma a fazer


exatamente o que se espera dela, sem efeitos colaterais.

Unidade 07 Funo

Linguagem e Tcnicas de Programao

Caractersticas das Funes

O cdigo da funo deve ser independente do programa e


deve ser to genrico quanto possvel:

Uma funo pode receber parmetros de execuo, para se


adaptar a situaes distintas e ser genrica;
Uma funo pode retornar um valor como resultado de seu
trabalho:

Para que possa ser utilizado em outros programas;

comando return;

Uma funo constituda por instrues em C. De acordo


com a sintaxe da linguagem:

Em C no se pode definir funes dentro de funes,


portanto, todas as funes esto no mesmo nvel.

Unidade 07 Funo

Linguagem e Tcnicas de Programao

Funes e Escopo

Sintaxe:
tipoValorDeRetorno nomeDaFuno(parmetros){
declaraes;
comandos;
}

Escopo:

regio de um programa em que um identificador vlido;

o corpo da funo compe um escopo;

identificadores definidos no corpo da funo so locais;

parmetros so identificadores locais:

inicializados pelos argumentos passados na chamada da


funo.

Unidade 07 Funo

Linguagem e Tcnicas de Programao

Escopo de Variveis

Entende-se como escopo de variveis, a rea onde


o valor e o nome dela tem significado no cdigofonte.
Pode-se ter dois tipos de variveis na Linguagem C:

Global - quando a varivel definida fora de


qualquer funo. Esta varivel pode ser usada em
qualquer funo e o significado dela abrange todo o
programa fonte, a partir de sua declarao.
Locais - so definidas dentro de funes e o seu
significado vlido somente dentro da funo que foi
declarada. Assim, pode-se ter duas variveis com o
mesmo nome em funes diferentes.

Unidade 07 Funo

Linguagem e Tcnicas de Programao

Exemplo de Escopo de Variveis

Global

Unidade 07 Funo

Local

10

Linguagem e Tcnicas de Programao

Funes Retornando Valores

Exemplo:
int power(int base, int exp){
int i, p = 1;
for(i = 1; i <= exp; ++i){
p *= base;
}
return(p);
}

O valor retornado por uma funo sempre copiado para o contexto de chamada.
X = power(2,5);

// Atribuio.

if(power(7,6) > 12345)

// Comparao.

printf(Nmero muito grande!);


x = 10 * power(3,9);

// Expresso.

vetor[power(2,2)];

// ndice.

funcao(power(4,9), valor);

// Argumento.

Unidade 07 Funo

11

Linguagem e Tcnicas de Programao

Exemplo Clculo de Potncia

Faa um
programa
que imprima
na tela, o
resultado
dos
seguintes
clculos
2^9, 3^5 e
7^7.

Unidade 07 Funo

O mesmo
cdigo repetido
trs vezes.
Pssima prtica
de programao!

12

Linguagem e Tcnicas de Programao

Funo para Clculo de Potncia

Vamos
resolver
novamente,
o exemplo
anterior.
Desta vez
usaremos
funo.

Unidade 07 Funo

13

Linguagem e Tcnicas de Programao

Passagem de Parmetros em C

Por valor ou cpia:

os parmetros contm uma cpia vlida do argumento


correspondente:

esta cpia vlida no escopo da funo.

o argumento pode ser uma varivel ou o endereo de


uma varivel;
mudanas feitas nos parmetros so feitas na cpia local
e no alteram os argumentos;
a funo pode acessar uma varivel externa quando o
seu endereo (da varivel) for passado com argumento;
quando a funo termina os valores deixam de existir:

fim do escopo.

Unidade 07 Funo

14

Linguagem e Tcnicas de Programao

Passagem de Parmetros

Em C os argumentos de uma funo so sempre passados por


valor:

isto significa que uma cpia do valor do argumento passado para a


funo.
void contador(int i){
printf(i: );
while(i < 10)
printf(%d , i++);

// i: 2 3 4 5 6 7 8 9

}
void main(){
int i = 2;
contador(i);
printf(i = %d , i);

// i = 2

}
Unidade 07 Funo

15

Linguagem e Tcnicas de Programao

Passagem de Parmetros

Como mudar o valor de uma varivel externa, dentro da


funo?

passando o endereo do argumento para a funo, pois, tendo


o endereo, acessamos diretamente a posio de memria.

Observaes importantes:

alguns autores de livros de programao em C chamam este


tipo de passagem de valores de: passagem por referncia;
no entanto, como j foi dito, em s existe passagem de valores
por valor ou cpia;
mesmo quando o endereo da varivel (argumento)
passado.
o mecanismo de passagem por referncia existe em algumas
linguagens de programao: Pascal, C++, dentre outras.

Unidade 07 Funo

16

Linguagem e Tcnicas de Programao

Passagem de Parmetros

Passando o endereo do argumento:


void contador(int *i){
printf(i: );
while(*i < 10)
printf(%d , (*i)++);

// i: 2 3 4 5 6 7 8 9

}
void main(){
int i = 2;
contador(&i);
printf(i = %d , i);

// i = 10

Unidade 07 Funo

17

Linguagem e Tcnicas de Programao

Exemplo Funo e Prottipo

Poderamos ter
definido a funo
potencia, depois
da funo main.
Mas para isto,
teramos que ter
definido o
prottipo da
funo potencia,
para no termos
um erro de
compilao.

Unidade 07 Funo

18

Linguagem e Tcnicas de Programao

Funo com Tipo de Retorno void

Uma funo pode


no ter que retornar
valor algum;
Para este tipo de
funo, define-se o
tipo de retorno
como void, e neste
caso no se usa o
comando return no
final da funo;
Em algumas
linguagens de
programao, este
tipo de funo
conhecida como
procedimento.

Unidade 07 Funo

19

Linguagem e Tcnicas de Programao

Passagem de Parmetros para Funes

Por valor

Unidade 07 Funo

Por referncia (Simulao)

20

Linguagem e Tcnicas de Programao

Exemplo Clssico

A funo troca:

implementar uma funo troca(x,y) que


recebe como parmetros dois inteiros e troca
seus valores:

x deve ficar com o valor de y e vice-versa.

exemplo:
int x = 10, y = 20;
troca(x,y);
printf(x = %d e y = %d, x, y);

deve produzir:
x = 20 e y = 10

Unidade 07 Funo

21

Linguagem e Tcnicas de Programao

Funo Troca

Implementao:
void troca(int x, int y){

Memria do computador
em trs instantes.

int temp;
temp = x;
x = y;
y = temp;
}
void main(){
int a = 5, b = 7;
troca(a,b);

No funciona!
printf(a = %d e b = %d, a, b); troca copia os valores,
no altera as variveis
}
originais (a e b).
Unidade 07 Funo

22

Linguagem e Tcnicas de Programao

Funo Troca

Implementao utilizando endereo de memria dos argumentos:


void troca(int *px, int *py){
int temp;
temp = *px;
*px = *py;
*py = temp;
}
void main(){
int a = 5, b = 7;
troca(&a,&b);
printf(a = %d e b = %d, a, b);
}

Unidade 07 Funo

Passando o endereo dos argumentos


e estando a funo troca preparada
para isto, a troca efetivada.
23

Linguagem e Tcnicas de Programao

Passagem de Parmetros

Concluso: quando passar valor ou o


endereo do argumento?

se a varivel for um vetor o endereo sempre


passado, pois, o nome do vetor corresponde ao
seu endereo;
se a varivel no precisa ou no deve ser
alterada na funo chamada, ento:

passar o valor da varivel.

se a varivel precisa ser alterada pela funo


chamada e a mesma est preparada para isto:

passar o endereo da varivel.

Unidade 07 Funo

24

Linguagem e Tcnicas de Programao

Funo Copiar String

Unidade 07 Funo

25

Linguagem e Tcnicas de Programao

Passando Parmetros para main()

possvel passar parmetros diretamente para a funo main a partir do


prompt de comando;
Exemplos:
/home/aluno> fatorial 5
/home/aluno> copia arq1 arq2

O que preciso fazer?

definir os parmetros em main;

ler os parmetros na funo main;

utiliz-los no programa.

main() definida com dois parmetros:


main(int argc, char *argv[])
argc = nmero de argumentos passados;
argv = vetor de argumentos (string).

Unidade 07 Funo

26

Linguagem e Tcnicas de Programao

Parmetros para main()

Convenes:

os nomes so lidos como strings;

o nome do programa o primeiro argumento:

assim, argc no mnimo 1;

e este se encontra na posio argv[0].

os demais argumentos, se existirem, se encontram nas


posies: argv[1] at argv[argc-1];
o padro define a posio argv[argc] que conter o valor
NULL.

Exemplo:
echo Hello, world!
argc = 3

Unidade 07 Funo

27

Linguagem e Tcnicas de Programao

Exemplo

Unidade 07 Funo

28

Linguagem e Tcnicas de Programao

Bibliografia

LAUREANO, Marcos. Programao em C para


ambiente Linux. Disponvel em: <http://brc.org/doku.php>. Acesso em: 06 fev. 2011.
MURTA, Cristina Duarte. Slides da disciplina de
Programao de Computadores I. CEFET-MG, 2010.
SENNE, Edson Luiz Frana. Primeiro Curso de
Programao em C. 2. ed. Florianpolis: Visual Books,
2006.
SOARES, Gabriela Eleutrio. Slides da disciplina de
Programao de Computadores I. CEFET-MG, 2011.

Unidade 07 Funo

29