Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
CC Para Para Bruno Jurkovski Fábio da Fontoura Beltrão Felipe Augusto Chies Kauê Soares da Silveira Lucas Fialho Zawacki Marcos Vinicius Cavinato Para Para EngenhariasEngenharias � Na última aula vimos... ‘laços’... � ...e outras coisas... Revisão da Aula 2 � ...e outras coisas... Revisão da Aula 2 Revisão da Aula 2 Revisão da Aula 2 Revisão da Aula 2 Funções - Introdução � A linguagem C é totalmente baseada em funções; � Você já deve ter notado que o corpo principal do � Você já deve ter notado que o corpo principal do programa (a main) nada mais é que a função por onde o programa começa; � Geralmente, os programas em C são várias ‘mini-funções’, ao contrário de um único bloco monolítico de código. � Conclusão: � As funções devem ser reaproveitáveis e generalistas; Funções - Introdução � Funções não devem alterar variáveis globais; � Funções devem ser atômicas, ou seja, devem, se possível, executar apenas uma operação. Funções - Declaração � Uma funções possui as seguintes partes: � Corpo, parâmetros e valor de retorno. tipo_de_retorno nome_da_funcao (parametros) { corpo_da_funcao; return (valor_de_retorno); } Tipos de Dados e Retorno � Como variáveis, as funções possuem um tipo de dado; � As funções podem ser dos cinco tipos de dados do C:do C: � int; � char; � float; � double; � void (vazio, sem valor de retorno). Tipos de Dados e Retorno � Toda função não void deve retornar um dado do tipo declarado; � Usa-se para isso o comando return; � return finaliza a função, todo código seguinte a esse comando não será executado. int sete () { printf(“Essa funcao retorna o numero 7”); return 7; } � Observe esta função: Exemplo de Função int soma2 (int x, int y) { int temp; temp = x + y;temp = x + y; return temp; } int main() { int soma, valor1 = 2, valor2 = 5; soma = soma2(valor1, valor2); printf(“A soma e %d”, soma); } Exemplo de Função int soma2 (int x, int y) { int temp; temp = x + y; soma recebe o valor do retorno de soma2 = 7temp = x + y; return temp; } int main() { int soma, valor1 = 2, valor2 = 5; soma = soma2(valor1, valor2); printf(“A soma e %d”, soma); } retorno de soma2 = 7 O main passa os valores para soma2: x = valor1 = 2 y = valor2 = 5 temp = 2 + 5 Exemplo de Função int soma2 (int x, int y) { int temp; temp = x + y; return temp; O main passa os valores para soma2:return temp; } int main() { int soma, valor1 = 2, valor2 = 5; soma = soma2(valor1, valor2); printf(“A soma e %d”, soma); } soma2: x = valor1 = 2 y = valor2 = 5 temp = 2 + 5 soma recebe o valor do retorno de soma2 = 15 � Especificação do limite dentro do qual os recursos de sistema podem ser utilizados: Em C, cada função tem o seu escopo; O Escopo � Em C, cada função tem o seu escopo; � Logo, “escondemos” os códigos e variáveis de uma função das outras; � Por isso que variáveis locais de cada função são acessíveis apenas por ela própria. � Observe as seguintes chamadas de funções: � variavel = funcao(par1,par2,par3); � funcao2(par4,par5); � printf(“%d%d”, sqrt(t), t); if (abs(n) == n); Chamadas de Funções � if (abs(n) == n); � Você pode chamar uma função em qualquer lugar onde você usaria um dado do tipo de retorno da função; � Quando você chama uma função ela irá executar independente de você usar o valor de retorno. 1. Faça uma função que receba uma string e retorne o número de caracteres que constituem essa string (não conte o ‘\0’); Exercícios � Protótipos são declarações de funções antes delas serem codificadas; Protótipos � Isso indica ao compilador que essas funções serão utilizados, tornando possível o uso de tais funções antes da codificação das mesmas. Exemplo: int soma2 (int x, int y); int main() { int soma, valor1 = 2, valor2 = 5; soma = soma2(valor1, valor2); printf(“A soma e %d”, soma); } int soma2 (int x, int y) { int temp; temp = x + y; return temp; } Protótipo da função ‘soma2’, se não houvesse o protótipo iria dar erro de compilação, pois a main tentaria chamar uma função que não foi declarada, ou seja, o compilador não sabe que ela existe. 2. Faça uma função que receba dois números , faça sua soma e chame outra função que faz o quadrado desse número. Retorne o resultado final. Exercícios final. � Use protótipos. � Parâmetros podem ser passados para uma função de duas maneiras: � Por Valor: � É passado o nome da variável para função, que faz uma cópia da mesma para uso dentro de seu escopo(variável Parâmetros cópia da mesma para uso dentro de seu escopo(variável local); � NÃO ALTERA O VALOR DO PARÂMETRO. � Por Referência: � É passado um ponteiro para a variável, tornando possível o acesso direto ao endereço da mesma; � Logo, é possível alterar o valor da variável dentro do esopo da função. � Observe as seguintes funções: � elevaQuadrado – retorna o quadrado de X. Note que a função NÃO altera o valor da variável original: int elevaQuadrado (int x) { Parâmetros � elevaQuadrado2 – retorna o quadrado de X, mas dessa vez muda o valor original de X: x = x*x; return x; } VALOR void elevaQuadrado2 (int *x){ *x *= *x; } REFERÊNCIA Como seriam as chamadas? int main() { int x = 7, y; y = elevaQuadrado(x); ‘y’ recebe 49 e ‘x’ continua com o valor 7 y = elevaQuadrado(x); printf(“%d %d\n”, x, y); elevaQuadrado2(&x); printf(“%d %d”, x, y); } O valor de ‘x’ é alterado para 49 Como seriam as chamadas? int main() { int x = 7, y; y = elevaQuadrado(x); ‘y’ recebe 49 e ‘x’ continua com o valor 7 y = elevaQuadrado(x); printf(“%d %d\n”, x, y); elevaQuadrado2(&x); printf(“%d %d”, x, y); } O valor de ‘x’ é alterado para 49 3. Faça uma função swap que troca os valores de ‘x’ e ‘y’, inteiros, recebidos como argumentos. Exercício 4. Faça uma função que receba o endereço de uma variável(int ou float) e um número(int) e retorne a variável^número. � Uma função recursiva é uma função que chama a si mesma; Recursão � Recursão é uma ferramenta poderosa. � Fazer uma função que calcula o fatorial de um número. Exemplo double fatorial(double n)double fatorial(double n) { if (n == 1) return 1; return (n * fatorial(n-1)); } � Algumas das vantagens do uso de recursão são: � A clareza na interpretação do código; Recursão � Simplicidade e elegância na implementação. � Algumas das desvantagens são: � Dificuldade para encontrar erros; � Podem ser ineficientes. * A principal preocupação na implementação de algoritmos recursivos é a questão de eficiência tanto de espaço quanto de tempo. Mesma função com for double fatorial(double n) { double res=1;double res=1; for(double i=n; i>1; i--) res *= i; return res; } 5. Fazer uma função que “descubra” o numero de Euler (Somatório de 1/n! com n tendendo ao infinto, nesse caso n tendendo ao numero que se desejar para melhorar a precisão do “e”). Exercício se desejar para melhorar a precisão do “e”). � A declaração normal da função main: � int main(int argc, char *argv[]) � Esses dois argumentos são passados como padrão pelo sistema operacional indicando os argumentos Curiosidade pelo sistema operacional indicando os argumentos passados para o programa em linha de código, como: Curiosidade � A main, normalmente declarada como int, devolve um de dois inteiros para o sistema operacional, 0 ou 1, indicando, Curiosidade II operacional, 0 ou 1, indicando, respectivamente, sucesso ou erro na execução do programa.