Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação Funções Funções O que são “Funções”? (ou subprogramas ou subrotinas) São trechos de código fonte agrupados sob um nome, que podem ser chamados sempre que for necessário executar uma determinada ação programada neste trecho; Como usar funções? Atribui-se um nome à uma seqüência de comandos, e faz-se referência a este nome nos vários lugares do programa onde a seqüência em questão deveria ser repetida. Funções Por que usar funções? Evita escrita repetida de código (uma certa seqüência de comandos deve ser repetida em vários lugares de um programa). Economiza o tempo gasto com o trabalho de copiar estas seqüências; Evitar a necessidade de mudar em múltiplos lugares caso deseje alterar o seu funcionamento; Dividir grandes tarefas de computação em tarefas menores: Facilita o gerenciamento de grandes sistemas e Aumenta a confiabilidade dos mesmos. Resumo: Principais motivações para uso das funções! Evitar repetição de código Permite chamar varias vezes o mesmo codigo Modularização Declaração de função Formato para declaração de uma função tipo-de-retorno nome-da-função(lista-de-parametros) { comandos } Lista de parametros Parametros separados por virgula Declarar o tipo de cada um dos parametros Se não tiver parametros usar void ou deixar em branco Tipo-de-retorno Tipo de dado retornado como resultado (usar void se não retornar nada) Escopo das variáveis Variáveis locais Conhecidas somente na função na qual estão definidas Todas as variáveis declaradas dentro de uma função são locais a esta função Caso uma variável local a função tenha o mesmo nome de uma variável global, a variável local será usada e não a global Parâmetros São as variáveis, declaradas na definição da função, que são passadas a função quando esta é chamada Proporcionam que informações externas a função sejam fornecidas Argumentos São os valores usados para chamar a função Função simples Não recebe parametro algum e não retorna nada void sai_do_programa() { printf(“Digite qualquer tecla para sair do programa.\n”); system(“pause”); exit(0); } Chamada: sai_do_programa(); Função com parâmetro Recebe parametro de um tipo informado void imprime_quadrado(int n) { printf(“O quadrado de %d eh %d.\n”,n, n*n); } Chamada: imprime_quadrado(5); Saída: O quadrado de 5 eh 25 Função com parâmetro e retorno int quadrado(int n) { int q; q = n * n; return(q); } Chamada: printf(“O quadrado de %d eh %d.\n”, 5, quadrado(5) ); Saída: O quadrado de 5 eh 25 Usar o comando return O valor retornado por return deve ser compatível com o tipo da função, o qual é definido quando da sua declaração. Função com parâmetro e retorno int quadrado(int n){ int q; q = n * n; return(q); } Chamada: int i; for(i=1;i<5;i++) printf(“O quadrado de %d eh %d.\n”, 5, quadrado(5) ); Saída O O O O quadrado quadrado quadrado quadrado de de de de 1 2 3 4 eh eh eh eh 1 4 9 16 Função com diversos parâmetros e retorno int potencia(int n, int p) { int i,resultado=1; for(i=1;i<=p;i++) resultado = resultado * n; return(resultado); } Chamada: printf(“%d elevado a %d vale %d.\n ”,2 , 4 , potencia(2,4)); Saída: 2 elevado a 4 vale 16 Função com diversos parâmetros e retorno int potencia(int n, int p){ int i,resultado=1; for(i=1;i<=p;i++) resultado = resultado * n; return(resultado); } Chamada: int i; for(i=1;i<5;i++) printf(“%d elevado a %d vale %d.\n”,2,i,potencia(2,i)); Saída: 2 2 2 2 elevado elevado elevado elevado a a a a 1 2 3 4 vale vale vale vale 1 4 8 16 Posicionamento das funções no programa C Sempre antes da função main() Caso queira colocar as funções após a função main(), é preciso colocar um “protótipo” da função antes da função main()!!!! (Mas o que é um protótipo de função?.....) …é a descrição da função! Ex: função “sai_do_programa” void sai_do_programa(){ printf(“Digite qualquer tecla para sair do programa.\n”); system(“pause”); exit(0); } Protótipo da função “sai_do_programa”: void sai_do_programa(); Posicionamento das funções no programa C Ex2: função “quadrado” int quadrado(int n) { int q; q = n * n; return(q); } Protótipo da função “quadrado”: int quadrado(int n); Chamada por valor e chamada por referência A chamada por valor é a passagem normal do valor dos argumentos para a função. Utilizando esta chamada os valores dos argumentos passados não são modificados. Na realidade é passada uma cópia dos valores para a função. Na chamada por referência são passados os endereços de memória onde estão os argumentos. Neste tipo de chamada os valores podem ser modificados. Implica o uso de ponteiros Exemplo usando passagem por valor #include<stdio.h> Saída: void troca(int a, int b){ Antes de chamar a função: int temp; a=2 temp=a; b=3 a=b; Depois de chamar a função b=temp; a=2 } b=3 int main(){ int a=2,b=3; printf("Antes de chamar a função :\na=%d\nb=%d\n",a,b); troca(a,b); printf("Depois de chamar a função:\na=%d\nb=%d\n",a,b); return 0; } Exemplo usando passagem por referência #include<stdio.h> Saída: void troca(int *a, int *b){ Antes de chamar a função: int temp; a=2 temp=*a; b=3 *a=*b; Depois de chamar a função *b=temp; a=3 } b=2 int main(){ int a=2,b=3; printf("Antes de chamar a função :\na=%d\nb=%d\n",a,b); troca(&a,&b); printf("Depois de chamar a função:\na=%d\nb=%d\n",a,b); return 0; } Chamada por valor e chamada por referência OBSERVAÇÃO: As strings e matrizes sempre são chamadas por referência. Quando C passa uma matriz ou string para uma função é passado o endereço inicial da matriz ou função Argumentos da linha de comando Pode-se passar argumentos diretamente para a função main() Como main () é a primeira função a ser chamada quando você chama o programa os argumentos para ela são passados junto com o comando que chama o programa, geralmente seu nome. Estes argumentos são conhecidos como argumentos da linha de comando. Argumentos de linha de comando #include <stdio.h> int main(int argc, char *argv[]) { printf("Olá %s.\n",argv[1]); return(0); } Os argumentos da linha de comando são argc e argv argc armazena o número de argumentos passados para o programa, inclusive o nome do programa argv é uma matriz de strings e armazena o nome do programa e os argumentos passados. argv[0] armazena o nome do programa, argv[1] armazena o primeiro argumento passado para o programa, argv[2] armazena o segundo argumento passado para o programa, e assim por diante. Os argumentos são seprarados por um espaço.