Baixe Passagem de Parâmetros em C: Valor e Referência e outras Exercícios em PDF para Matemática, somente na Docsity! FUNÇÕES EM C Material preparado pela profa Silvana Maria Affonso de Lara 2º semestre de 2010 1 Universidade de São Paulo – São Carlos Instituto de Ciências Matemáticas e de Computação ROTEIRO DA AULA Definição de Função Argumentos, retornos e protótipos Funcionamento de uma chamada Passagem de Informações Passagem de parâmetros por valor e por referência Pilha de inteiros em C Número de parâmetros variáveis Acesso aos parâmetros Parâmetros para main() 2 O RETORNO DA FUNÇÃO No seu retorno, uma função pode retornar resultados ao programa que a chamou return (resultados); O valor da variável local resultados é passado de volta como o valor da função Valores de qualquer tipo podem ser retornados Funções predicado: funções que retornam valores Procedimentos: funções que não retornam valores Exemplo: void function (int x) 5 FUNÇÕES 6 Definições de funções Funções são definidas de acordo com a seguinte sintaxe: tipo_de resultado nome (lista de parâmetros) { corpo de função } FUNÇÕES - EXEMPLO 7 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 função C para calcular o máximo divisor comum entre dois números FUNÇÕES Funcionamento de uma chamada: Se um comando return é executado, o controle é passado de volta para o trecho que chamou a função Se um comando return inclui uma expressão, o valor da expressão é convertido, se necessário, pelo tipo do valor que a função retorna O valor então é retornado para o trecho que chamou a função Se um comando return não inclui uma expressão nenhum valor é retornado ao trecho que chamou a função Se não existir um comando return, o controle é passado de volta para o trecho que chamou a função após o corpo da função ser executado 10 PASSAGEM DE INFORMAÇÕES Exemplo: 11 double mesada (double notas, int idade) { double total; if (idade > 10) return (idade * 20.0); else{ total = notas*idade*20; return total; } } PASSAGEM DE INFORMAÇÕES Argumentos são passados por valor Quando chamada, a função recebe o valor da variável passada Quando argumento é do tipo atômico, a passagem por valor significa que a função não pode mudar seu valor Os argumentos deixam de existir após a execução do método 12 FUNÇÕES Mecanismo do processo de chamada de função 4. Comandos do corpo da função são executados até: 4.1 Encontrar comando return 4.2 Não existirem mais comandos para serem executados 5. O valor da expressão return, se ele existe, é avaliado e retornado como valor da função 6. Pilha criada é liberada 7. Programa que chamou continua sua execução 15 FUNÇÕES uma função pode retornar qualquer valor válido em C, sejam de tipos pré-definidos ( int, char, float) ou de tipos definidos pelo usuário ( struct, typedef ) uma função que não retorna nada é definida colocando-se o tipo void como valor retornado (= procedure) Pode-se colocar void entre parênteses se a função não recebe nenhum parâmetro 16 FUNÇÕES Projeto top-down Procedimentos e funções permitem dividir um programa em pedaços menores Facilita sua leitura É chamado de processo de decomposição Estratégia de programação fundamental Encontrar a decomposição certa não é fácil Requer experiência 17 FUNÇÕES Menor função possível: void faz_nada( void ) { } 20 PASSAGEM DE PARÂMETROS Em C os argumentos para uma função são sempre passados por valor (by value), ou seja, uma cópia do argumento é feita e passada para a função 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 PARÂMETROS Como, então, mudar o valor de uma variável? 22 enviar o endereço do argumento para a função passagem de parâmetro por referência PRÁTICA: FUNÇÃO TROCA Fazer uma função troca(px, py) que recebe como parâmetros 2 ponteiros para inteiros e troca o conteúdo deles ex: int x = 10, y = 20; troca(&x, &y); printf(“x=%d y=%d”, x, y) => x=20 y=10 25 PRÁTICA: FUNÇÃO TROCA void troca (int *px, int *py) { int temp; temp=*px; *px=*py; *py=temp; } 26 px: py: x: y: RETORNANDO VALORES uma função retorna um valor através 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 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 PRÁTICA: LOCALIZA CHAR EM STRING Fazer uma função que procura um caracter em um string e retorna o seu endereço caso o encontre, senão retorna NULL (ponteiro nulo) Ex: char *achachar (char *str, char c) {...} char str[] = “abcd5678”; achachar(str, „c‟); ==> retorna endereço do terceiro caracter do string: &str[2] 32 PILHA COM ARRAY Uma pilha pode ser implementada como um array onde o topo é indicado com um índice 35 index C D tipo pilha[MAXPIL]; pilha[0] pilha[1] pilha[2] pilha[3] Topo(): index aponta para a posição 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 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 NÚMERO DE PARÂMETROS VARIÁVEL C permite declarar funções com número variável de argumentos através da inserção de reticências “...” função ( arg1, arg2, ... ); Como determinar o número de parâmetros passados: string de formato, como no comando printf: Ex: printf ( “%s %d %f\n”, s, i, f); pela especificação do número de parâmetros Ex: soma (3, 10, -1, 5); pela inclusão de um valor de terminação Ex: media ( 1, 4, 6, 0, 3, -1 ); 37 EXEMPLO PARÂMETROS VARIÁVEIS #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; } 40 sum( 5, 3, 5, 18, 57, 66 ) ==> 149 sum( 2, 3, 5 ) ==> 8 PARÂMETROS PARA MAIN( ) ao executar programas a partir de linha de comando, é possível passar parâmetros diretamente para a função main( ) os argumentos são fornecidos na forma de um array de strings. main( ) é definida com dois parâmetros: main ( int argc, char *argv[] ) argc é o número de argumentos argv é o array de argumentos 41 PARÂMETROS PARA MAIN() por convenção, o primeiro argumento argv[0] é o nome do programa e o último é 0 (zero) ex: echo Alô, mamãe 42 argv 0 echo\0 Alô, \0 mamãe\0 argc = 3