Introdução

Introdução

A biblioteca padrão C oferece uma infinidade de funções para muitas tarefas usuais. Também existem muitas bibliotecas para funcionalidade extra, como a GUI Design (GTK+) ou a interface do banco de dados (LIBPQ). No entanto, à medida que você avança no mundo da programação C, em breve você repetirá as mesmas instruções na mesma ordem repetidamente e isso se tornará demorado e ineficiente. Então você pode simplesmente envolver todas essas instruções em uma função e apenas chamar dito função quando você precisar. Aqui está o que você aprenderá lendo este artigo, além de algumas dicas úteis que facilitarão sua vida.

Criando suas funções

Para um começo simples, digamos que você queira escrever uma calculadora. Não vamos nos concentrar na interface (GUI vs maldições vs gírias vs cli), pois estamos interessados ​​nos internos. Seria desajeitado não Crie uma função para cada operação que você decide apoiar, a menos que já exista, como Pow (), definido em matemática.h, que retorna o resultado de uma base aumentada para um poder. Assim, por exemplo, para adição, você terá uma função chamada add () que leva dois argumentos, pelo menos por enquanto, e retorna o resultado. Então, quando o usuário escolhe adicionar o (s) número (s) que ele introduziu, você apenas chamar a função com os números que o usuário entrou e você não precisa se preocupar com mais nada. Esses três termos que escrevi em itálico são essenciais para entender as funções. Uma função geralmente (mas nem sempre) leva alguma coisa, faz várias operações sobre isso e cospe o resultado. "Nem sempre" porque main (), como você pode ver antes, pode ser chamado sem argumentos, e há outros exemplos também. Mas por enquanto, vamos nos concentrar em nossos exemplos. Os números que precisam ser adicionados são os argumentos, que "algo" que você dá a função para o processamento. A parte do processamento está no corpo da função, quando você diz para adicionar os números juntos. Depois disso, a parte "cuspindo" é chamada retornando um valor, que é, no nosso caso, o resultado da adição.

Vamos ver do que falamos em um exemplo prático:

#incluir  /* Isso contém a definição de printf ()*/ Adicionar duplo (duplo x, duplo y); int main () float primeiro, segundo; printf ("Por favor, insira o primeiro número.\ n "); scanf ("%f ", & primeiro); printf (" Por favor, digite o segundo número.\ n "); scanf ("%f ", & segundo); duplo add (duplo a, duplo b)  retornar a + b;  printf ("O resultado da adição é %f \ n", add (primeiro, segundo)); retornar 0; 

O código acima, embora simplista, na melhor das hipóteses, nos ajuda a apontar exatamente o que falamos antes. Primeiro, declaramos a função, antes Main (), e o objetivo é saber o nome, o tipo de argumentos e o tipo que a função retorna. Esta linha também é chamada de definição do protótipo da função. Como você pode ver, os nomes dos argumentos da declaração não precisam ser os mesmos que os usados ​​na definição, mas se isso o incomodar, use um esquema de nomeação constante, está tudo bem. Antes de usarmos a função, devemos defini -la, como no mundo, o que é exatamente que ele faz. Mesmo que o corpo da função seja uma linha única, assim como está em nosso exemplo, é melhor você usar aparelhos para legibilidade e para bom hábito. Aqui, tudo o que a função faz é retornar o resultado da adição entre dois números.

Sugerimos que você use nomes para funções, argumentos e variáveis ​​ou constantes comuns que refletem o que fazem, novamente por um bom hábito e para poupar os programadores lendo seu código as tentativas de adivinhar o que a variável "xyzgth" faz ou é usada para. Também, Use comentários. Mesmo que no código acima os comentários possam parecer exagerados, eles não estão. Quando você olha para o código dois meses depois, você não terá idéia do que estava em sua mente quando escreveu o código. Então use e abusos de comentários, eles vão te salvar, confie em mim.

Exercício

Existem funções que podem aceitar um número variável de argumentos, como printf () por exemplo. Você tem permissão para usar o Google para ver o que eles fazem e tentar reescrever a função add () para aceitar mais de dois argumentos ou criar outra função. Você também pode usar "Man 3 printf".


Dissemos a você antes que Main () pode ser chamado sem argumentos. Claro, isso significa que também pode ser chamado com argumentos. Quando isso é útil? Em programas simples, como o nosso, já que os chamamos sem argumentos, os parênteses de main () estão vazios. Mas quando seus programas crescerão em complexidade, especialmente se eles forem orientados para a linha de comando, você precisará adicionar a funcionalidade dos argumentos, como a bandeira -v do GCC que imprime a versão. Quando essa funcionalidade é desejada, Main () deve ter argumentos, dois para serem precisos. A função principal se torna

int main (int argc, char ** argv) …

Antes de surtar com os nomes enigmáticos e os asteriscos duplos, espere até obter a explicação, o que é realmente simples. O primeiro argumento é um número inteiro chamado Argc, e o nome vem de "Contagem de argumentos". Um pouco melhor, certo? Sobre o segundo argumento ... bem, o nome significa "Vetor de argumento" oficialmente e é um ponteiro para um ponteiro para um char. Agora, em inglês, enquanto o ARGC armazena o número de argumentos, o ARGV armazena os argumentos como uma série de strings. A parte "Ponteiro para ..." será explicada na próxima parte do artigo, por enquanto, tudo o que você precisa saber é que, por exemplo, o usuário digitará três argumentos para o programa, o índice zero de argv será o nome do próprio programa, o índice um armazenará o primeiro argumento para o programa e assim por diante. É assim que você pode usar um switch/estojo para verificar os argumentos passados ​​para seus programas. Antes de lhe dar um breve exemplo, nos sentimos compelidos a dizer que Main tem dois argumentos, conforme definido pelo padrão, e é assim que ele é usado nos sistemas Linux e Unix Systems. No entanto, se você () funcionar no Windows ou Darwin, Main () terá mais um ou dois argumentos, mas esses são dependentes do sistema e, portanto, não são definidos ou exigidos pelo padrão. Além disso, "char ** argv" também pode ser escrito como "char *argv []". Você verá os dois, dependendo da preferência do desenvolvedor.

Você deve se lembrar que dissemos a você na primeira parte de nossa série como vamos usar o programa mais do Kimball Hawkins para exemplos. É hora de começarmos, então aqui está como o YEST lida com uma parte da possível entrada do usuário:

se (strncmp (argv [i], "--help", 6) == 0 || strncmp (argv [i], "-?", 2) == 0 || strncmp (argv [i],"?", 1) == 0 || strncmp (argv [i]," help ", 4) == 0) yest_help (); / * Ajuda solicitada, exiba -a */ se (strncmp (argv [i], "--version", 9) == 0 || strncmp (argv [i], "--license", 9) == 0) yest_version (); / * Versão/Informações de licença solicitadas */

Você pode ver neste código como Kimball comenta seu código, embora o nome das funções que ele chama - yest_help () e yest_version () - são bastante auto -explicativos. A função STRNCMP () padrão, a ser encontrada na string.H, compara duas cordas, no nosso caso argv [i] e "help", por exemplo, mas apenas os primeiros caracteres X (4 na linha "Ajuda") e retorna zero se a primeira string corresponde à segunda.

Exercício

Como você usaria o switch/estojo para verificar se o primeiro argumento é "-Help" e o segundo é "-version"? Essas opções podem ser usadas juntas? Como o código diferiria?

Coisas a serem conscientes

C não permite que você defina uma função dentro de outra, com a exceção main (), que é, como podemos ver, especial. Esteja também ciente de que o que você define dentro de uma função "vive" dentro de uma função apenas. Assim, você pode ter uma variável chamada "A" definida em três funções diferentes, sem problemas, mas isso pode levar a problemas em programas maiores, por isso não recomendamos.

Arquivos de cabeçalho personalizados

À medida que seus programas crescem mais e maiores, você encontrará a necessidade de dividi -los. Você pode ter mais de um arquivo de origem, mas também pode escrever seus próprios cabeçalhos. Então, voltando ao nosso programa de adição, você pode criar um cabeçalho nomeado operações.h que terá a linha “Double Add (Double X, Double Y);”, então seu programa lidará apenas com a definição, a parte em que você diz que Add () retornará A + B. Incluindo o seu cabeçalho personalizado é feito exatamente como você inclui os instalados no sistema com uma exceção importante: lembre-se de usar citações duplas em vez de colchetes de ângulo, como este: “#include“ Operações.H ””. Este cabeçalho pode ser colocado no diretório onde os outros arquivos de origem são armazenados ou em outro caminho, especificado como um argumento para o GCC, para que saberia onde procurar. Os arquivos de cabeçalho podem conter também definições de constantes (com #Define) ou outras declarações, desde que você saiba que elas serão usadas em todos os arquivos de origem do programa. Não é obrigatório, é apenas uma boa prática. Então, como você escreveria uma calculadora que lida apenas com as operações aritméticas básicas e usa cabeçalhos?

Funções recursivas

Como esperamos que você tenha algum histórico de programação, temos certeza de que você sabe o que são funções recursivas e como/quando usá -las. É por isso que este subcapítulo será mais curto do que normalmente seria. Em suma, alguém diz sobre uma função para ser recursiva quando se chama. Embora o conceito possa ser assustador para novos programadores, uma recurso mais simples e da vida real pode ser explicada é a seguinte: tente sentar-se entre dois espelhos voltados para o outro. O efeito que você vê é uma representação visual da recursão. Mas vamos lhe dar um breve exemplo, para que você entenda melhor quando e como usá -lo. Você provavelmente se lembra da escola quando foi ensinado sobre fatoriais. Uma fatorial é o produto de um números inteiros menores que ele ou igual, desde que sejam maiores que zero. A notação para isso é um sinal de exclamação, então 6! = 6*5*4*3*2*1 = 720. Como podemos fazer isso em C da maneira mais eficiente? Claro, usando recursão.

int fatorial (número int)  se(número <= 1) retornar 1; outro retornar Número * Fatorial (número-1)

Conclusão

Recomendamos que você use funções o mais rápido possível e coloque seus protótipos em arquivos de cabeçalho com tanta frequência, porque seu código será mais organizado e seu trabalho ficará mais fácil. Falando em cabeçalhos, deixamos isso como um exercício final para você começar a ler o arquivo de cabeçalho que define operações matemáticas (Matemática.h) para ter uma ideia de como se parece e o que contém. Em seguida, use -o para melhorar a calculadora com alguma funcionalidade aprimorada além do básico.

Aqui está o que você pode esperar a seguir:

  • EU. C Desenvolvimento no Linux - Introdução
  • Ii. Comparação entre C e outras linguagens de programação
  • Iii. Tipos, operadores, variáveis
  • 4. Controle de fluxo
  • V. Funções
  • Vi. Ponteiros e matrizes
  • Vii. Estruturas
  • Viii. E/S básico
  • Ix. Estilo de codificação e recomendações
  • X. Construindo um programa
  • XI. Embalagem para Debian e Fedora
  • Xii. Obtendo um pacote nos repositórios oficiais do Debian

Tutoriais do Linux relacionados:

  • Coisas para instalar no Ubuntu 20.04
  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
  • Mastering Bash Script Loops
  • Coisas para instalar no Ubuntu 22.04
  • Ubuntu 20.04 Guia
  • Tutorial do SQLite Linux para iniciantes
  • Mint 20: Melhor que o Ubuntu e o Microsoft Windows?
  • Coisas para fazer depois de instalar o Ubuntu 22.04 Jellyfish…
  • Como fazer bota dupla kali linux e windows 10