Funções em programação C com exemplos: recursivas e inline

⚡ Resumo Inteligente

Em linguagem de programação C, as funções são blocos de código reutilizáveis ​​que dividem um programa grande em subprogramas menores, facilitando a compreensão, os testes e as modificações. Cada função possui uma declaração, uma definição e uma chamada.

  • 🧩 Quais funções desempenham: Uma função agrupa instruções reutilizáveis, de modo que um programa grande seja dividido em subprogramas menores e mais fáceis de gerenciar e depurar.
  • 📚 Dois tipos: Funções de biblioteca como printf e scanf são funções prontas para uso, enquanto funções definidas pelo usuário são escritas pelo programador.
  • 📝 Três partes: Utilizar uma função envolve sua declaração ou protótipo, sua definição ou corpo e a chamada que a executa.
  • 🎯 Argumentos: Os valores são passados ​​por posição e, por padrão, por valor, de modo que a variável original permanece inalterada dentro da função chamada.
  • 🌐 Escopo: Variáveis ​​locais existem apenas dentro de sua função, enquanto variáveis ​​globais e estáticas mantêm seus valores ao longo de todo o programa ou entre chamadas.
  • 🤖 Assistência de IA: O GitHub Copilot e os assistentes de IA criam estruturas de funções em C, sugerem tipos de retorno e sinalizam retornos ausentes ou argumentos incompatíveis.

Funções na programação C

O que é uma função em C?

Função na programação C Uma função é um bloco de código reutilizável que torna um programa mais fácil de entender, testar e modificar sem alterar o programa original. As funções dividem o código e modularizam o programa para obter resultados melhores e mais eficazes. Em resumo, um programa maior é dividido em vários subprogramas chamados funções.

O que é uma função em C

Quando você divide um programa grande em várias funções, fica fácil gerenciar cada função individualmente. Sempre que ocorre um erro no programa, você pode facilmente investigar funções defeituosas e corrigir apenas esses erros. Você pode facilmente chamar e usar funções sempre que necessário, o que automaticamente economiza tempo e espaço.

Biblioteca vs. Funções definidas pelo usuário

Todo programa 'C' possui pelo menos uma função que é a função principal, mas um programa pode ter qualquer número de funções. A função main () em C é o ponto de partida de um programa.

Na programação 'C', as funções são divididas em dois tipos:

  1. Funções de biblioteca
  2. Funções definidas pelo usuário

A diferença entre a biblioteca e as funções definidas pelo usuário em C é que não precisamos escrever um código para uma função de biblioteca. Já está presente no arquivo de cabeçalho que sempre incluímos no início de um programa. Basta digitar o nome de uma função e usá-la junto com a sintaxe adequada. Printf, scanf são exemplos de funções de biblioteca.

Considerando que uma função definida pelo usuário é um tipo de função em que temos que escrever o corpo de uma função e chamar a função sempre que precisarmos que a função execute alguma operação em nosso programa.

Uma função definida pelo usuário em C é sempre escrita pelo usuário, mas posteriormente pode fazer parte da biblioteca 'C'. É uma grande vantagem da programação 'C'.

As funções de programação C são divididas em três atividades, como,

  1. Declaração de função
  2. Definição de função
  3. Chamada de função

Declaração de Função

A declaração de uma função consiste em escrever o nome de uma função em um programa. É uma parte obrigatória para o uso de funções no código. Na declaração de uma função, especificamos o nome da função que usaremos em nosso programa, assim como fazemos com uma variável. Não podemos usar uma função a menos que ela seja declarada no programa. A declaração de uma função também é chamada de "protótipo da função".

As declarações de funções (chamadas de protótipo) geralmente são feitas acima da função main() e assumem a forma geral:

return_data_type function_name (data_type arguments);
  • O parâmetro `return_data_type` representa o tipo de dados do valor retornado pela função à instrução que a chamou.
  • O nome da função é seguido por parênteses.
  • Os nomes dos argumentos, juntamente com suas declarações de tipo de dados, são opcionalmente colocados dentro dos parênteses.

Consideramos o seguinte programa que mostra como declarar uma função de cubo para calcular o valor do cubo de uma variável inteira

#include <stdio.h>
/*Function declaration*/
int add(int a,b);
/*End of Function declaration*/
int main() {

Lembre-se de que uma função não retorna necessariamente um valor. Neste caso, a palavra-chave void é usada.

Por exemplo, a declaração da função output_message indica que a função não retorna um valor: void output_message();

Definição de Função

Definição de função significa apenas escrever o corpo de uma função. O corpo de uma função consiste em instruções que irão realizar uma tarefa específica. Um corpo de função consiste em um único ou em um bloco de instruções. Também é uma parte obrigatória de uma função.

int add(int a,int b)	//function body	
{
	int c;
	c=a+b;
	return c;
}

Chamada de função

Uma chamada de função significa chamar uma função sempre que for necessária em um programa. Sempre que chamamos uma função, ela executa uma operação para a qual foi projetada. Uma chamada de função é uma parte opcional de um programa.

  result = add(4,5);

Segue o código completo:

#include <stdio.h>
int add(int a, int b);	//function declaration
int main()
{
	int a=10,b=20;
	int c=add(10,20); 	//function call
	printf("Addition:%d\n",c);
	getch();
}
int add(int a,int b)	//function body
{
	int c;
	c=a+b;
	return c;
}

Saída:

Addition:30

Argumentos de função

Os argumentos de uma função são usados ​​para receber os valores necessários pela chamada da função. Eles são combinados por posição; o primeiro argumento é passado para o primeiro parâmetro, o segundo para o segundo parâmetro e assim por diante.

Por padrão, os argumentos são passados ​​por valor, em que uma cópia dos dados é fornecida à função chamada. A variável efetivamente passada não será alterada.

Consideramos o seguinte programa que demonstra parâmetros passados ​​por valor:

int add (int x, int y); 
int main() {
  int a, b, result;
  a = 5;
  b = 10;
  result = add(a, b);
  printf("%d + %d\ = %d\n", a, b, result);
return 0;}
int add (int x, int y) { 
x += y;
  return(x);}

A saída do programa é:

5 + 10 = 15

Tenha em mente que os valores de a e b foram passados ​​para a função add não foram alterados porque apenas seu valor foi passado para o parâmetro x.

Escopo Variável

Escopo variável significa a visibilidade das variáveis ​​​​dentro de um código do programa.

Em C, variáveis ​​declaradas dentro de uma função são locais a esse bloco de código e não podem ser referenciadas fora da função. No entanto, variáveis ​​declaradas fora de qualquer função são globais e acessíveis de todo o programa. Constantes declaradas com um `#define` no início de um programa são acessíveis de todo o programa. Considere o seguinte programa que imprime o valor da variável global tanto da função `main` quanto de uma função definida pelo usuário:

#include <stdio.h>
int global = 1348;
void test();
int main() {
  printf("from the main function : global =%d \n", global);
  test () ;
return 0;}

void test (){
printf("from user defined function : global =%d \n", global);}

Resultado:

from the main function : global =1348
from user defined function : global =1348

Discutimos os detalhes do programa:

Escopo Variável

  1. Declaramos uma variável global inteira com 1348 como valor inicial.
  2. Declaramos e definimos uma função test() que não aceita argumentos nem retorna um valor. Esta função imprime apenas o valor da variável global para demonstrar que as variáveis ​​globais podem ser acessadas em qualquer lugar do programa.
  3. Imprimimos a variável global dentro da função principal.
  4. Chamamos a função de teste para imprimir o valor da variável global.

Em C, quando argumentos são passados ​​para parâmetros de função, os parâmetros atuam como variáveis ​​locais que serão destruídas ao sair da função.

Quando você usa variáveis ​​globais, use-os com cuidado porque podem levar a erros e podem mudar em qualquer lugar do programa. Eles devem ser inicializados antes de usar.

Variáveis ​​Estáticas

As variáveis ​​estáticas possuem escopo local. No entanto, eles não são destruídos ao sair da função. Portanto, uma variável estática retém seu valor para sempre e pode ser acessada quando a função for inserida novamente. Uma variável estática é inicializada quando declarada e precisa do prefixo estático.

O programa a seguir usa uma variável estática:

#include <stdio.h>
void say_hi();
int main() {    
  int i;
  for (i = 0; i < 5; i++) { say_hi();}
   return 0;}
void say_hi() {
  static int calls_number = 1;
  printf("Hi number %d\n", calls_number);
  calls_number ++; }

O programa exibe:

Hi number 1
Hi number 2
Hi number 3
Hi number 4
Hi number 5

Funções Recursivas

Considere o fatorial de um número que é calculado da seguinte forma: 6! = 6 * 5 * 4 * 3 * 2 * 1.

Este cálculo é feito calculando repetidamente o fato * (fato -1) até que o fato seja igual a 1.

Uma função recursiva é uma função que chama a si mesma e inclui uma condição de saída para finalizar as chamadas recursivas. No caso do cálculo de número fatorial, a condição de saída é fato igual a 1. A recursão funciona “empilhando” chamadas até que a condição de saída seja verdadeira.

Por exemplo:

#include <stdio.h>
int factorial(int number);
int main() {    
  int x = 6;
  printf("The factorial of %d is %d\n", x, factorial(x)); 
  return 0;}
int factorial(int number) {
 if (number == 1)    return (1); /* exiting condition */
  else
    return (number * factorial(number - 1));
}

O programa exibe:

 The factorial of 6 is 720

Aqui, discutimos os detalhes do programa:

Funções Recursivas

  1. Declaramos nossa função fatorial recursiva que recebe um parâmetro inteiro e retorna o fatorial deste parâmetro. Esta função irá chamar a si mesma e diminuir o número até a saída ou a condição base ser alcançada. Quando a condição for verdadeira, os valores gerados anteriormente serão multiplicados entre si e o valor fatorial final será retornado.
  2. Declaramos e inicializamos uma variável inteira com valor”6″ e então imprimimos seu valor fatorial chamando nossa função fatorial.

Considere o seguinte gráfico para melhor compreender o mecanismo recursivo, que consiste em chamar a própria função até que o caso base seja atingido ou a função pare.ping A condição é atingida e, em seguida, coletamos os valores anteriores:

Funções Recursivas

Funções Inline

A função na programação C é usada para armazenar as instruções usadas com mais frequência. É usado para modularizar o programa.

Sempre que uma função é chamada, o ponteiro da instrução salta para a definição da função. Depois de executar uma função, o ponteiro da instrução volta para a instrução de onde saltou para a definição da função.

Sempre que usamos funções, precisamos de um extra apontador head para pular para a definição da função e retornar à instrução. Para eliminar a necessidade de tais ponteiros, usamos funções inline.

Em uma função embutida, uma chamada de função é substituída diretamente por um código de programa real. Ele não salta para nenhum bloco porque todas as operações são realizadas dentro da função inline.

Funções inline são usadas principalmente para pequenos cálculos. Eles não são adequados quando há computação de grande porte envolvida.

Uma função inline é semelhante à função normal, exceto que a palavra-chave inline é colocada antes do nome da função. As funções embutidas são criadas com a seguinte sintaxe:

inline function_name ()
{
    //function definition
}

Vamos escrever um programa para implementar uma função inline.

inline int add(int a, int b)		//inline function declaration
{
	return(a+b);
}
int main()
{
	int c=add(10,20);
	printf("Addition:%d\n",c);
	getch();
}

Saída:

Addition: 30

O programa acima demonstra o uso de uma função embutida para adição de dois números. Como podemos ver, retornamos a adição de dois números apenas dentro da função inline, sem escrever nenhuma linha extra. Durante a chamada da função acabamos de passar valores nos quais devemos realizar a adição.

Perguntas Frequentes

A chamada por valor copia o argumento para a função, de modo que as alterações permanecem locais e a variável original não é afetada. A chamada por referência passa o endereço da variável por meio de um ponteiro, permitindo que a função modifique diretamente os dados originais da função que a chamou.

O parâmetro real é o valor ou variável que o chamador passa durante a chamada da função. O parâmetro formal é o marcador (ou espaço reservado) nomeado na definição da função que o recebe. Eles são correspondidos por posição, primeiro com primeiro, segundo com segundo.

A função AC retorna apenas um valor diretamente com `return`. Para retornar vários resultados, envolva-os em uma estrutura, preencha um array ou passe ponteiros como argumentos para que a função escreva cada resultado nas variáveis ​​do chamador.

As funções proporcionam reutilização, permitindo que um mesmo bloco seja executado várias vezes, e modularidade, que divide um programa grande em partes menores. Elas também melhoram a legibilidade, simplificam os testes e a depuração, e ocultam detalhes complexos por trás de um único nome, economizando tempo de desenvolvimento.

A função main() é o ponto de entrada onde todo programa em C inicia sua execução. O sistema operacional a chama primeiro, e seu valor de retorno, geralmente 0, sinaliza sucesso. Ela pode receber argc e argv para receber argumentos da linha de comando.

A recursão é adequada para problemas com uma estrutura naturalmente repetitiva, como percorrer árvores ou calcular fatoriais, resultando em um código mais curto e claro. A iteração geralmente é mais rápida e usa menos memória, pois evita chamadas repetidas. Escolha a recursão para maior clareza e a iteração para melhor desempenho com grandes volumes de dados.

Sim. Um assistente de programação com IA pode escrever uma função em C a partir de um prompt em linguagem natural, sugerir parâmetros e tipos de retorno e sinalizar erros como a ausência de um retorno ou um argumento incompatível. Sempre compile e teste a função gerada antes de utilizá-la.

Copiloto do GitHub Escreve funções em C, completando o corpo a partir do nome da função ou de um breve comentário e propondo declarações, laços de repetição e chamadas recursivas. Frequentemente, adiciona um protótipo correspondente acima de main(), embora você ainda deva revisar a lógica.

Resuma esta postagem com: