Escolar Documentos
Profissional Documentos
Cultura Documentos
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
|
Aps sua execuo, programa volta ao ponto do programa situado imediatamente aps a chamada
|
FUNO
|
A chamada de uma funo pode passar informaes (argumentos) para o processamento da funo
y
O RETORNO DA FUNO
|
No seu retorno, uma funo pode retornar resultados ao programa que a chamou
return (resultados);
y
Exemplo:
FUNES
Definies de funes
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
|
void
|
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
|
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
|
Quando argumento do tipo atmico, a passagem por valor significa que a funo no pode mudar seu valor
12
FUNES
|
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
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
|
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
|
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 }
==> i = 10.
24
int x = 10, y = 20; troca(&x, &y); printf(x=%d y=%d, x, y) => x=20 y=10
25
px: py:
x: y:
26
RETORNANDO VALORES
|
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
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;
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:
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
Uma pilha pode ser implementada como um array onde o topo indicado com um ndice
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
C permite declarar funes com nmero varivel de argumentos atravs da insero de reticncias ...
funo ( arg1, arg2, ... );
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
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
38
39
40
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
por conveno, o primeiro argumento argv[0] o nome do programa e o ltimo 0 (zero) ex: echo Al, mame
argc = 3
42
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