Você está na página 1de 42

ROTEIRO DA AULA

Definio de Funo | Argumentos, retornos e prottipos | Funcionamento de uma chamada | Passagem de Informaes | Passagem de parmetros por valor e por referncia | Pilha de inteiros em C | Nmero de parmetros variveis | Acesso aos parmetros | Parmetros para main()
2

FUNO - DEFINIO
|

Agrupa um conjunto de comandos e associa a ele um nome


|

O uso deste nome uma chamada da funo

Aps sua execuo, programa volta ao ponto do programa situado imediatamente aps a chamada
|

A volta ao programa que chamou a funo chamada de retorno

FUNO
|

A chamada de uma funo pode passar informaes (argumentos) para o processamento da funo
y

Argumentos = lista de expresses


Lista pode ser vazia | Lista aparece entre parnteses aps o nome da funo | Ex.
|

int Soma (int x, int y) { }

O RETORNO DA FUNO
|

No seu retorno, uma funo pode retornar resultados ao programa que a chamou

return (resultados);
y

O valor da varivel local resultados passado de volta como o valor da funo

Valores de qualquer tipo podem ser retornados


Funes predicado: funes que retornam valores y Procedimentos: funes que no retornam valores
y

Exemplo:

void function (int x)


5

FUNES

Definies de funes

Funes so definidas de acordo com a seguinte sintaxe:

tipo_de resultado nome (lista de parmetros) { corpo de funo }


6

FUNES - EXEMPLO
int MDC (int a, int b) { int aux; if (a < b) { aux = a; a = b; b = aux; } while (b != 0) { aux = b; b = a % b; a = aux; } return (a); }

uma funo C para calcular o mximo divisor comum entre dois nmeros

FUNES
|

Definies de funes
y

Tipo de resultado
|

Quando a funo um procedimento, usa-se a palavra chave

void
|

Procedimento no retorna valor

Lista de parmetros
Funcionam como variveis locais com valores iniciais | Quando funo no recebe parmetros, a lista de parmetros substituda pela palavra void
|

FUNES
| Funcionamento
y y

de uma chamada:

Cada expresso na lista de argumentos avaliada O valor da expresso convertido, se necessrio, para o tipo de parmetro formal | Este tipo atribudo ao parmetro formal correspondente no incio do corpo da funo O corpo da funo executado

FUNES
|

Funcionamento de uma chamada:


Se um comando return executado, o controle passado de volta para o trecho que chamou a funo y Se um comando return inclui uma expresso, o valor da expresso convertido, se necessrio, pelo tipo do valor que a funo retorna
y
|

O valor ento retornado para o trecho que chamou a funo

Se um comando return no inclui uma expresso nenhum valor retornado ao trecho que chamou a funo y Se no existir um comando return, o controle passado de volta para o trecho que chamou a funo aps o corpo da funo ser executado
y
10

PASSAGEM DE INFORMAES
|

Exemplo:

double mesada (double notas, int idade) { double total; if (idade > 10) return (idade * 20.0); else{ total = notas*idade*20; return total; } }
11

PASSAGEM DE INFORMAES
|

Argumentos so passados por valor


y

Quando chamada, a funo recebe o valor da varivel passada


|

Quando argumento do tipo atmico, a passagem por valor significa que a funo no pode mudar seu valor

Os argumentos deixam de existir aps a execuo do mtodo

12

FUNES
|

Prottipos ou Declarao de funes


y

Antes de usar uma funo em C, aconselhvel declar-la especificando seu prottipo


Tem a mesma forma que a funo, s que substitui o corpo por um (;) | Nomes das variveis de um parmetro so opcionais | Fornec-los ajuda a leitura do programa
|

A declarao apenas indica a assinatura ou prottipo da funo:


|

valor_retornado nome_funo(declarao_parmetros);
13

FUNES
|

Mecanismo do processo de chamada de funo 1. Valor dos argumentos calculado pelo programa que est chamando a funo 2. Sistema cria novo espao para todas as variveis locais da funo (estrutura de pilha) 3. Valor de cada argumento copiado na varivel parmetro correspondente na ordem em que aparecem 3.1 Realiza converses de tipo necessrias

14

FUNES
|

Mecanismo do processo de chamada de funo 4. Comandos do corpo da funo so executados at: 4.1 Encontrar comando return 4.2 No existirem mais comandos para serem executados 5. O valor da expresso return, se ele existe, avaliado e retornado como valor da funo 6. Pilha criada liberada 7. Programa que chamou continua sua execuo
15

FUNES
|

uma funo pode retornar qualquer valor vlido em C, sejam de tipos pr-definidos ( int, char, float) ou de tipos definidos pelo usurio ( struct, typedef )

uma funo que no retorna nada definida colocando-se o tipo void como valor retornado (= procedure)
Pode-se colocar void entre parnteses se a funo no recebe nenhum parmetro
16

FUNES
|

Projeto top-down
y

Procedimentos e funes permitem dividir um programa em pedaos menores


|

Facilita sua leitura

chamado de processo de decomposio


Estratgia de programao fundamental | Encontrar a decomposio certa no fcil | Requer experincia
|

17

FUNES
|

Projeto top-down
Melhor estratgia para escrever programas comear com o programa principal y Pensar no programa como um todo y Identificar as principais partes da tarefa completa:
y

Maiores pedaos so candidatos a funes | Mesmo essas funes podem ser decompostas em funes menores | Continuar at cada pedao ser simples o suficiente para ser resolvido por si s
|

18

EXERCCIO
int MDC (int a, b) { int aux; if (a < b) { aux = a; a = b; b = aux; } while (b != 0){ aux = b b = a % b; a = aux } return (a); }
|

Escrever um programa completo em C para calcular o mximo divisor comum entre dois nmeros desmembrando o programa em pelo menos trs funes

19

FUNES
| Menor

funo possvel:

| void

faz_nada( void ) { }

20

PASSAGEM DE PARMETROS
Em C os argumentos para uma funo so sempre passados por valor (by value), ou seja, uma cpia do argumento feita e passada para a funo void loop_count( int i ) { printf( "Em loop_count, i = " ); while( i < 10 ) printf ( "%d ", i++); ==> i = 2 3 4 5 6 7 8 9 } void main( ) { int i = 2; loop_count( i ); printf( "\nEm main, i = %d.\n", i ); ==> i = 2. }
|

21

PASSAGEM DE PARMETROS
|

Como, ento, mudar o valor de uma varivel?

passagem de parmetro por referncia

enviar o endereo do argumento para a funo

22

PASSAGEM DE PARMETROS
Passagem por valor Passagem por referncia
arg func_call (arg) Cpia de arg enviado para a funo def_funo (arg) arg func_call (& arg) Endereo de arg enviado para a funo def_funo (* arg) (* arg)
23

arg

PASSAGEM DE PARMETROS
|

Passagem por referncia:

void loop_count( int *i ) { printf( "Em loop_count, i = " ); while( *i < 10 ) printf ( "%d ", (*i)++); ==> i = 2 3 4 5 6 7 8 9 }

void main( ) { int i = 2; loop_count( &i ); printf( "\nEm main, i = %d.\n", i ); }

==> i = 10.
24

PRTICA: FUNO TROCA


Fazer uma funo troca(px, py) que recebe como parmetros 2 ponteiros para inteiros e troca o contedo deles | ex:
|

int x = 10, y = 20; troca(&x, &y); printf(x=%d y=%d, x, y) => x=20 y=10

25

PRTICA: FUNO TROCA


void troca (int *px, int *py) { int temp;

px: py:

temp=*px; *px=*py; *py=temp; }

x: y:

26

RETORNANDO VALORES
|

uma funo retorna um valor atravs do comando return Ex:


int power (int base, int n) { int i,p; p = 1; for (i = 1; i <= n; ++i) p *= base; return p; }
27

FUNES
|

o valor retornado por uma funo sempre copiado para o contexto de chamada (retorno by value)
x = power(2, 5); /* atribuio */

if (power(7, 2) > 12543) /* comparao */ printf(Numero grande!); x = 10*power(2,3); /* expresso */ array[get_index()]; /* ndice */
funcao( get_arg() ); /* argumento */

28

VETORES COMO ARGUMENTOS DE FUNES


Quando vamos passar um vetor como argumento de uma funo, podemos declarar a funo de trs maneiras equivalentes. Seja o vetor: int matrx [50]; e que queiramos pass-la como argumento de uma funo func(). Podemos declarar func() de trs maneiras: void func (int matrx[50]); void func (int matrx[]); void func (int *matrx);
29

EX: CONCATENA STRINGS


char *concatena( char cabeca[ ], char cauda[ ] ) { int i, j;

for (i = 0; cabeca[i] != '\0'; i++); for (j = 0; (cabeca[i] = cauda[j]) != '\0'; i++, j++); cabeca[i] = '\0'; return cabeca;
}
30

EXEMPLO (CONT.)
int main( ) { char nome[80] = "Santos"; char sobrenome[ ] = " Dumont"; printf( "O nome %s.\n", concatena(nome, sobrenome) ); return 0;

==> Santos Dumont


31

PRTICA: LOCALIZA CHAR EM STRING


|

Fazer uma funo que procura um caracter em um string e retorna o seu endereo caso o encontre, seno retorna NULL (ponteiro nulo)
char *achachar (char *str, char c) {...} char str[] = abcd5678; achachar(str, c);

| Ex:

==> retorna endereo do terceiro caracter do string: &str[2]


32

ACHACHAR
char *achachar (char *str, char c) { char *pc = str; while (*pc != c && *pc != '\0') pc++; return *pc ? pc : NULL; }

33

EXEMPLO: PILHA
|

Um pilha definida como uma estrutura onde os dados so inseridos em uma ordem e retirados em ordem inversa. Operaes bsicas:
T B vazia() T cheia()

push(A)

pop()

topo()

A A B C D

B C D

B C D

A B C D

34

PILHA COM ARRAY


|

Uma pilha pode ser implementada como um array onde o topo indicado com um ndice

tipo pilha[MAXPIL]; pilha[3] pilha[2] pilha[1] pilha[0]

index

C D

Topo(): index aponta para a posio vazia: retorna pilha[index-1]; Vazia: retorna index == 0 Push(d): pilha[index] = d; incrementa index; Pop(): decrementa index; retorna pilha[index]; Cheia(): retorna index == MAXPIL+1

35

PILHA DE INTEIROS EM C
#define MAXPIL 10 int pilha[MAXPIL]; int index = 0;

void push(int dado) { pilha[index++] = dado; } int pop() { return pilha[--index]; } int topo() { return pilha[index-1]; } int vazia() { return (index == 0); } int cheia() { return (index == MAXPIL+1; }
36

NMERO DE PARMETROS VARIVEL


|

C permite declarar funes com nmero varivel de argumentos atravs da insero de reticncias ...
funo ( arg1, arg2, ... );

Como determinar o nmero de parmetros passados:


y y y

string de formato, como no comando printf: Ex: printf ( %s %d %f\n, s, i, f); pela especificao do nmero de parmetros Ex: soma (3, 10, -1, 5); pela incluso de um valor de terminao Ex: media ( 1, 4, 6, 0, 3, -1 );
37

ACESSO AOS PARMETROS


|

C oferece uma srie de macros para acessar uma lista de argumentos:


um ponteiro para os argumentos da lista

va_list um tipo pr-definido utilizado para declarar va_start(va_list ap, arg_def ) inicia o ponteiro ap
fazendo-o apontar para o primeiro argumento da lista, ou seja, o primeiro argumento depois de arg_def.
y

arg_def o nome do ltimo argumento especificado na declarao da funo

38

ACESSO AOS PARMETROS


type va_arg( va_list ap, type ) retorna o valor do argumento apontado por ap e faz ap apontar para o prximo argumento da lista. type indica o tipo de argumento lido (int, float, etc.)
void va_end ( va_list ap ) encerra o acesso lista de parmetros. Deve sempre ser chamada no final da funo

39

EXEMPLO PARMETROS VARIVEIS


#include <stdio.h> #include <stdlib.h> #include <stdarg.h> int sum( int nro_args, ... ) { va_list ap; int result = 0, i; va_start( ap, nro_args ); for( i = 1; i <= nro_args; i++ ) { result += va_arg( ap, int ); } va_end(ap); return result; } sum( 5, 3, 5, 18, 57, 66 ) ==> 149 sum( 2, 3, 5 ) ==> 8

40

PARMETROS PARA MAIN( )


|

ao executar programas a partir de linha de comando, possvel passar parmetros diretamente para a funo main( ) | os argumentos so fornecidos na forma de um array de strings. main( ) definida com dois parmetros: main ( int argc, char *argv[] )
argc o nmero de argumentos argv o array de argumentos

41

PARMETROS PARA MAIN()


|

por conveno, o primeiro argumento argv[0] o nome do programa e o ltimo 0 (zero) ex: echo Al, mame
argc = 3

argv echo\0 Al, \0 mame\0 0

42

PARMETROS PARA MAIN()


#include <stdio.h>

Uma possvel implementao para echo:

void main( int argc, char *argv[] ) { int i; for ( i = 1; i < argc; i++ ) printf(%s%s, argv[i], (i < argc-1)? :); printf(\n); }

43