Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
Italo Valcy Programação em C, 2013.1 Programação C Italo Valcy <italo@dcc.ufba.br> Aula 04 – Funções Italo Valcy Programação em C, 2013.1 2 / 35 Todo o material aqui disponível pode, posteriormente, ser utilizado sobre os termos da: Creative Commons License: Atribuição - Uso não comercial - Permanência da Licença http://creativecommons.org/licenses/by-nc-sa/3.0/ Licença de uso e distribuição Este curso foi baseado no curso “Algoritmos e Programação de Computadores” do prof. Centoducatte, da UNICAMP, disponível em <http://www.ic.unicamp.br/~ducatte/mc102/mc102.html>, e nas aulas de prof. Luciano Oliveira. Italo Valcy Programação em C, 2013.1 3 / 35 Funções Italo Valcy Programação em C, 2013.1 4 / 35 Funções Funções são blocos de código que agrupam sequências de operações que, atrelados a um “nome”, podem ser invocados em todo o programa, de forma que tal sequência possa ser executada Italo Valcy Programação em C, 2013.1 5 / 35 Funções Reaproveitamento de código Evitar repetição de código ao longo do programa Facilitar alterações de um trecho de código Evitar que blocos de código fiquem muito grandes e difíceis de entender Facilitar a leitura do fonte Separar o programa em blocos, que possam ser compreendidos separadamente Motivação Italo Valcy Programação em C, 2013.1 6 / 35 Funções Procedimento: agrupa um conjunto de instruções Função: mesmo que procedimento, porém retorna um valor! Exemplo: Em C, consideraremos tudo como Função Procedimentos serão funções que retornam “vazio” Funções vs Procedimentos void cumprimenta() { char nome[30]; scanf(“%29[^\n]”,&nome); printf(“Ola %d!\n”, nome); } int quadrado(int x) { int x2 = x*x; return(x2); } Italo Valcy Programação em C, 2013.1 7 / 35 Funções Funções da biblioteca padrão do C: printf() scanf() getchar() gets() putchar() strcmp() strlen() ... Funções em C Italo Valcy Programação em C, 2013.1 8 / 35 Funções Forma geral: Funções que não retornam nenhum valor, devem ser do tipo void. Não é possível definir uma função dentro de outra tipo_retorno nome_da_funcao(tipo_param nome_param, ...) { // comandos return (valor); } Funções em C Italo Valcy Programação em C, 2013.1 9 / 35 Funções Após fazer seu processamento, as funções podem necessitar retornar um valor ou resultado. Exemplo: quadrado(4) => 16 Tipos de retorno: int, float, double, char, void O tipo void é usado quando a função não deve retornar nada. Ex: printf() Valor de retorno Italo Valcy Programação em C, 2013.1 10 / 35 Funções O retorno de uma função é definido pelo comando return. Ex.: Provoca uma saída imediata da função chamadora Valor de retorno: comando return ... int quadrado(int x) { return x*x; } ... Italo Valcy Programação em C, 2013.1 11 / 35 Funções Exemplo de função para calcular o quadrado de um inteiro: #include <stdio.h> int quadrado(int x) { return x*x; } int main() { int numero; printf(“Digite um numero: ”); scanf(“%d”, &numero); printf(“O quadrado de %d e' %d”, numero, quadrado(numero)); } Funções em C Italo Valcy Programação em C, 2013.1 12 / 35 Funções Em C, todas as funções devem ser definidas antes da função main(). O nome da função DEVE ser ÚNICO (dentre as outras funções e variáveis) A mesma regra de nomenclatura de variáveis é aplicada à nomenclatura de funções. Funções em C Italo Valcy Programação em C, 2013.1 13 / 35 Funções Na chamada de uma função, o tipo e quantidade de parâmetros devem acordar com sua definição A comunicação com a função é feita através dos argumentos e parâmetros Na função, os parâmetros são como variáveis locais Parâmetros de funções Italo Valcy Programação em C, 2013.1 14 / 35 Funções Parâmetros de funções: Vetor como parâmetro: int myfunction(char *vetor_de_char); Parâmetros de funções Italo Valcy Programação em C, 2013.1 15 / 35 Funções Exercício: fazer uma função, pot(x,y), para calculo da potência de um número x por y (xy ) Não é permitido usar a biblioteca math.h Exercícios Italo Valcy Programação em C, 2013.1 16 / 35 Funções Todo programa em C, deve SEMPRE possuir a função main() em seu código, independente das outras funções. Diversas formas possíveis: int main () { ... } main () { ... } int main(int argc, char **argv) { ... } A função main #include <stdio.h> int main() { // comandos... return 0; } Italo Valcy Programação em C, 2013.1 17 / 35 Funções A função main: argc e argv Programa Argumentos Italo Valcy Programação em C, 2013.1 18 / 35 Funções É possível passar parâmetros para seu programa, via linha de comando (ou prompt/cmd do Windows): prompt$ ./soma 10 15 => 25 Parâmetros são separados por espaço Use aspas para fazer o escape Todos os parâmetros são considerados como string Use as funções de conversão (atoi(), atof(), etc.) Internamente no seu programa: argc e argv A função main: argc e argv Italo Valcy Programação em C, 2013.1 19 / 35 Funções argc quantidade de argumentos (> 1) argv vetor de argumentos (strings) Todo programa possui no mínimo um argumento: o nome do programa! #include <stdio.h> int main(int argc, char **argv){ if (argc < 2) { printf("Usage: %s <NOME>\n", argv[0]); return 1; } printf("Ola, %s\n", argv[1]); return 0; } A função main: argc e argv Italo Valcy Programação em C, 2013.1 20 / 35 Funções Exemplo: imprimir todos os argumentos: #include <stdio.h> int main(int argc, char **argv) { int i; for (i=0; i<argc; i++) { printf("parametro #%d: %s\n",i, argv[i]); } return 0; } A função main: argc e argv ~> /tmp/egargs argumento1 453 arg sep1 "arg sep2" parametro #0: /tmp/egargs parametro #1: argumento1 parametro #2: 453 parametro #3: arg parametro #4: sep1 parametro #5: arg sep2 Saída: Italo Valcy Programação em C, 2013.1 21 / 35 Funções Exercício: fazer um programa para somar dois números fornecidos vinha linha de comando: Dica: consulte a referência da função atoi() em <http://www.cplusplus.com/reference/clibrary/> A função main: argc e argv Italo Valcy Programação em C, 2013.1 22 / 35 Funções Funções recursivas Recursão é o processo repetitivo no qual a função chama ela própria Sequência de Fibonacci (mat.): F(n) = F(n-1) + F(n-2) F(0) = 0 ; F(1) = 1 Solução recursiva: Problema decomposto: top/down Problema resolvido: bottom/up Italo Valcy Programação em C, 2013.1 23 / 35 Funções Funções recursivas (fatorial) Exemplo clássico: Decomposição fatorial Italo Valcy Programação em C, 2013.1 24 / 35 Funções Funções recursivas (fatorial) Exemplo clássic (fatorial.c): #include <stdio.h> int fatorial(int num) { if (num<=1) return 1; else return num*fatorial(num1); } int main() { int x; scanf("%d", &x); printf("%d\n", fatorial(x)); return 0; } Italo Valcy Programação em C, 2013.1 25 / 35 Funções Toda função em C precisa ser declarada antes de ser usada É possível separar funções em arquivos diferentes (bibliotecas) Declaração vs Definição A declaração pode ser feita através do protótipo da função Localização das funções no fonte Italo Valcy Programação em C, 2013.1 26 / 35 Funções Protótipo de função Protótipo: trecho de código que especifica: Tipo de retorno da função Nome da função Tipo dos argumentos Exemplo: void funcao1(int a, floar b, char *mystr); int printf ( const char * format, ... ); Italo Valcy Programação em C, 2013.1 27 / 35 Funções Protótipo de função (exemplo) #include <stdio.h> int soma(int a, int b); int mult(int a, int b); int main() { int x, y; printf("Digite x y: "); scanf("%d %d",&x, &y); printf("%d + %d = %d\n",x,y,soma(x,y)); printf("%d * %d = %d\n",x,y,mult(x,y)); } int soma(int a, int b) { return a + b; } int mult(int a, int b) { return a * b; } Italo Valcy Programação em C, 2013.1 28 / 35 Funções Arquivos de header (.h) Já que podemos declarar a função (protótipo) e só defini-la depois... Podemos separar as declarações/definições das funções em arquivos diferentes! Criação de bibliotecas Uso da diretiva #include Os códigos objetos devem ser ligados ao executável em tempo de compilação Italo Valcy Programação em C, 2013.1 29 / 35 Funções Arquivos de header (.h) Exemplo: soma-mult separado em arquivos matematica.h #ifndef _MATEMATICA_H_ #define _MATEMATICA_H_ // declaracao de tipos int soma(int a, int b); int mult(int a, int b); #endif Italo Valcy Programação em C, 2013.1 30 / 35 Funções Arquivos de header (.h) Exemplo: soma-mult separado em arquivos matematica.c int soma(int a, int b) { return a + b; } int mult(int a, int b) { return a * b; } Italo Valcy Programação em C, 2013.1 31 / 35 Funções Arquivos de header (.h) Exemplo: soma-mult separado em arquivos somamult.c #include <stdio.h> #include "matematica.h" int main() { int x, y; printf("Digite x y: "); scanf("%d %d",&x, &y); printf("%d + %d = %d\n",x,y,soma(x,y)); printf("%d * %d = %d\n",x,y,mult(x,y)); return 0; } Italo Valcy Programação em C, 2013.1 32 / 35 Funções Arquivos de header (.h) O processo de compilação: Italo Valcy Programação em C, 2013.1 33 / 35 Funções Arquivos de header (.h) O processo de compilação: Na linha de comando: gcc -c matematica.c gcc -c soma-mult.c gcc matematica.o soma-mult.o -o soma-mult matematica.c somamult.c matematica.o somamult.o somamult Italo Valcy Programação em C, 2013.1 34 / 35 Exercício Exer04 (main.c, busca-binaria.h e busca-binaria.c): Escrever um programa que faz busca binária de um número X, informado pelo usuário, em um vetor de valores de uma P.A., cujos parâmetros serão fornecidos pelo usuário (A1, R e N, com 1<=N<=200). A busca deve ser implementada como uma função, definida em um arquivo separado da função main(). O programa imprimir na saída padrão a quantidade de passos (comparações com uma posição do vetor) necessários para encontrar (ou não) o número X. DICA: para navegar nos sub-vetores, use indices esq e dir Italo Valcy Programação em C, 2013.1 35 / 35 Exercício Exer04: Exemplos Entrada1: 10 3 8 15 Saida1: 3 Entrada2: 0 2 9 14 Saida2: 3 Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Slide 16 Slide 17 Slide 18 Slide 19 Slide 20 Slide 21 Slide 22 Slide 23 Slide 24 Slide 25 Slide 26 Slide 27 Slide 28 Slide 29 Slide 30 Slide 31 Slide 32 Slide 33 Slide 34 Slide 35