Você está na página 1de 51

24/03/2022 14:34 Linguagem C: funções

Linguagem C: funções
Profª. Paulo Descrição
Vidal
search

A definição das funções em linguagem C, sua aplicação e os principais conceitos em sua utilização, incluindo passagem
de parâmetros, retorno de valores e recursão. Acesso às bibliotecas padrão, além de vantagens do emprego delas.

Propósito
A linguagem C é muito utilizada no desenvolvimento de softwares básicos e de aplicativos que demandam um
desempenho avançado. Recurso avançado dessa linguagem, as funções utilizadas no desenvolvimento de programas
com linguagem C permitem ao programador fazer com que eles sejam mais confiáveis e manuteníveis.

Preparação
Para editar, compilar e executar os programas deste conteúdo, é necessário utilizar uma ferramenta de desenvolvimento
de programas na linguagem C. Existem três compiladores de utilização grátis em sistemas operacionais Windows:
CodeBlocks, DevC++ e Genny. Escolha uma das ferramentas para desenvolver os programas descritos em exemplos e
exercícios. Caso você possua outro compilador para a linguagem C diferente dos citados acima, também pode utilizá-lo.

Objetivos

Módulo 1

Funções: forma geral, valor de retorno, passagem de parâmetros e escopo

Identificar na função o nome, os parâmetros, o valor de retorno e o escopo de variáveis.

Acessar módulo

Módulo 2

Matrizes e estruturas como argumentos de função

Empregar como parâmetros de uma função vetores, matrizes e estruturas.

Acessar módulo

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 1/51
24/03/2022 14:34 Linguagem C: funções

Módulo 3
search
Recursividade

Aplicar o conceito de recursividade na programação.

Acessar módulo

Módulo 4

Utilização de biblioteca padrão

Selecionar as funções na biblioteca padrão adequadas à solução de um programa.

Acessar módulo

Introdução
De forma paralela ao desenvolvimento dos computadores digitais, ocorreu o das linguagens de programação. Podemos classificar essas
linguagens em gerações.

As de primeira geração são as linguagens de máquina, isto é, linguagens executadas diretamente pelo hardware. A principal característica
delas é não abstrair as operações executadas pela plataforma de hardware que as implementa. Um pouco mais à frente no desenvolvimento,
temos as linguagens de segunda geração. Sua principal característica é a sintaxe humanizada, isto é, o emprego de comandos parecidos
com a linguagem humana, e o surgimento de sub-rotinas.

As linguagens de terceira geração aprimoram o conceito de sub-rotina, permitindo que sejam passados dados como parâmetros para a sub-
rotina e recebendo como retorno um resultado do cálculo executado. A sub-rotina com tais aprimoramentos é chamada de função. Veremos
como a linguagem C, que é uma linguagem de terceira geração, permite o emprego de funções.

Inicialmente, apresentaremos os componentes da estrutura de uma função em C, mostrando, em seguida, como elaborar programas com
funções. Veremos também as aplicações avançadas por meio de recursividade, isto é, uma função que chama a si mesma. Por fim,
identificaremos um conjunto de funções predefinidas da biblioteca padrão da linguagem C que está disponível para o desenvolvedor.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 2/51
24/03/2022 14:34 Linguagem C: funções

Funções: forma geral, valor de retorno, passagem de parâmetros


search

e escopo Ao final deste módulo, você será capaz de identificar na função o nome, os parâmetros, o valor de retorno e o escopo de variáveis.

O que são funções?


Funções são blocos de instruções que executam uma tarefa específica. Uma de suas aplicações é ajudar a lidar com a complexidade de um
programa. Assim, à medida que aumenta a complexidade de programação na resolução de um problema, pode-se dividir o programa em partes
menores, ou seja, as funções (também chamadas de módulos), para facilitar o entendimento e o desenvolvimento dele. Desse modo, veremos a
seguir como:

code
Escrever funções.

code
Criar e passar parâmetros.

code
Devolver um valor como resultado de uma função e definir variáveis locais.
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 3/51
24/03/2022 14:34 Linguagem C: funções

search

Objetivo na utilização de funções


Digamos que você esteja escrevendo um programa C e precise executar a mesma tarefa nesse programa mais de uma vez. Nesse caso, você tem
duas opções:

Opção 1

Usar o mesmo conjunto de instruções sempre que quiser realizar a tarefa.

Opção 2

Criar uma função e chamá-la sempre que tiver de realizar essa tarefa.

Usar a opção 2 é uma boa prática. Um bom programador, afinal, sempre usa funções ao escrever código em C. Na linguagem C, todas as ações
ocorrem dentro de funções. O programa principal, aliás, é uma função. Vejamos um exemplo com um código que imprime duas frases:

Linguagem C
content_copy

1 #include <stdio.h>
2 main()
3 {
4 printf('Seja bem-vindo(a).\n');
5 printf('Ao módulo 1.\n');
6 }
7

Nesse trecho em linguagem C, a função main() é chamada automaticamente no início do programa. A segunda função usada é o printf(), que é
chamada duas vezes. Observe que a definição da função printf() está na biblioteca stdio.

report_problem

Atenção!

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 4/51
24/03/2022 14:34 Linguagem C: funções

Todo programa em C sempre terá de possuir a função main() escrita no seu código independentemente do número e da variedade de
funções que o programa contenha. search

Outra forma na utilização de funções é o programador criar as próprias funções. As que criamos em um programa são conhecidas como funções
definidas pelo usuário.

No desenvolvimento de aplicações, as funções são criadas com os seguintes objetivos:

Melhorar a legibilidade do código.

Melhorar a capacidade de reutilização do código (a mesma função pode ser usada em qualquer programa em vez de se escrever o mesmo
código do zero).

Reduzir o tamanho do código (conjuntos duplicados de instruções são substituídos por chamadas de função).

Separar o programa em partes (blocos) que possam ser logicamente compreendidos de forma isolada e que facilitem a depuração de erros.

Sintaxe da função
Agora aprenderemos como criar funções definidas pelo usuário e como usá-las na programação C. A declaração de uma função é dividida em dois
passos:

code
Passo 1

Declaração do protótipo da função.


arrow_forward

code
Passo 2

Declaração da função propriamente dita.

O protótipo da função é composto basicamente pelo seu cabeçalho, isto é, o tipo de retorno, o nome da função e seus parâmetros. O protótipo serve
para avisar ao compilador que aquela função existe.

O local correto de declarar o protótipo da função é no header file , ou seja, no arquivo .h. Por isso é que, para usar a função da biblioteca stdio, foi
necessário incluir o header file dessa biblioteca no código do exemplo acima. A sintaxe da declaração do protótipo de uma função é:

Pseudocódigo
content_copy

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 5/51
24/03/2022 14:34 Linguagem C: funções

1 tipo nome_da_função (tipo var1, ..., tipo varN);


search

A sintaxe da declaração do corpo de uma função é bastante semelhante à declaração do protótipo. A principal diferença é o bloco de comandos da
função após a lista de parâmetros em vez do caractere “;”:

Pseudocódigo
content_copy

1 tipo nome_da_função (tipo var1, ..., tipo varN) {


2 corpo da função
3 }

wb_incandescent

Dica

A declaração do protótipo é opcional. Caso ela não seja feita, a declaração do corpo da função valerá como protótipo.

Os seguintes componentes fazem parte da declaração de uma função:

Nome da função expand_more

Tipo da função expand_more

Parâmetros expand_more

Corpo da função expand_more

Vejamos um exemplo de declaração de função. Nesse exemplo, a função declarada soma dois números inteiros:

Linguagem C
content_copy

1 int calcula_soma (int nr1, int nr2) {


2 int soma = nr1 + nr2;

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 6/51
24/03/2022 14:34 Linguagem C: funções

3 return soma;
4 } search
5

Agora, vamos identificar cada um dos elementos do código:

Nome da função

calcula_soma.

Parâmetros

int nr1, int nr2.

Tipo da função

int, indicando que essa função retorna um inteiro após seu término.

Corpo da função

Composto pelos comandos: int soma = nr1 + nr2;


e return soma;

Melhorando o código com o uso de funções


A utilização de funções permite reduzir o tamanho do código no qual conjuntos duplicados de instruções são substituídos por chamadas de função
e melhoram a legibilidade do código. Apresentaremos dois exemplos que mostram esses conceitos.

Em nosso primeiro exemplo, o programa imprime no monitor quatro linhas de asteriscos utilizando o comando for com o formato a seguir. Clique
em executar e veja o resultado:

Exemplo 1
content_copy
C

1 #include <stdio.h>
2 main() {
3 int i;
4
5 for (i=1 ; i<=4 ; i++)

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 7/51
24/03/2022 14:34 Linguagem C: funções

6 putchar('*');
search
Input Console

play_arrow

wb_incandescent

Dica

Utilizamos emuladores de ambientes de desenvolvimento em nossos exemplos práticos. Dessa forma, você pode apagar o código
apresentado e fazer seus próprios testes.

Para imprimir cada linha, utiliza-se o comando for nas linhas 5, 9, 13 e 17. Dentro do for, existe a função putchar(), tendo como argumento o
caractere '*' a ser impresso (linhas 6, 10, 14 e 18). A função tem a seguinte sintaxe:

Pseudocódigo
content_copy

1 int putchar( int caractere );

Essa função exibe um único caractere na tela. O argumento passado será convertido para caractere e mostrado na tela. As linhas 7, 11 e 15
mostram a função putchar('\n'), que, após imprimir a linha de asteriscos, salta para próxima linha.

Se olharmos com atenção o código, veremos que o comando for aparece quatro vezes, diferindo somente no número de iterações, o qual, por sua
vez, representa o tamanho da linha. Se quisermos modificar o programa para imprimir mais linhas com asteriscos, precisaremos incluir mais linhas
com outros laços de repetição for, ou seja, teremos de colocar mais código.

Utilizando o conceito de função, podemos fatorar o código do programa e torná-lo mais legível. O ideal seria
escrever uma única função linha a ser responsável pela escrita de uma linha na tela, que recebe como parâmetro o
número de asteriscos a serem impressos em cada chamada.

Se quisermos escrever quatro asteriscos, invocaremos a função linha(4); se preferirmos sete asteriscos, a função linha(7); 30 asteriscos, a função
linha(30). Perceba que a função é sempre a mesma (função linha). O que muda é o número de caracteres a ser colocado na tela.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 8/51
24/03/2022 14:34 Linguagem C: funções

No programa anterior, o nosso main() passaria a ser:


search

Linguagem C
content_copy

1 main() {
2 linha(4);
3 linha(6);
4 linha(8);
5 linha(10);
6 }

Como seria então escrita a função linha? Essa função recebe, dentro de parênteses, um valor do tipo inteiro a ser atribuído a uma variável: o
parâmetro. Uma vez atribuído o argumento ao parâmetro, o laço for, na função linha, terá de executar o número de vezes que está armazenado
nessa variável.

Podemos planejar a função da seguinte forma:

Nome da função Tipo da função Número de parâmetros Tipo do parâmetro

A função a ser escrita será Não tem tipo, isto é, a função A função irá receber 1(um) O tipo do parâmetro será
linha(); não retorna nenhum valor parâmetro. inteiro.
após sua execução; então,
coloca-se como void.

O programa do exemplo 1 pode ser substituído usando a função do Exemplo 2 a seguir. Leia o código e identifique as diferenças.

Exemplo 2
content_copy
C

1 #include <stdio.h>
2
3 void linha(int num) {
4 int i;
5 for (i=1 ; i<=num ; i++)
6 putchar('*');

Input Console

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 9/51
24/03/2022 14:34 Linguagem C: funções

play_arrow
search

Vemos que o número de instruções do programa foi reduzido. Se precisarmos colocar mais uma linha com sete asteriscos a ser impressa, a
redução será mantida, pois basta acrescentar a chamada de função linha(7). Então, vamos analisar a diferença primordial entre os dois exemplos:

Exemplo 1

Ao fazer uma leitura inicial do Exemplo 1, o programador tem de compreender os detalhes dos quatro laços for. Os quatro laços tornam o
código mais extenso e prejudicam a legibilidade do programa.

close
Exemplo 2

O código da função linha() é apresentado no início, não sendo preciso procurar em outros lugares para entender como funciona a função. Em
seguida, na função main(), a leitura das quatro chamadas da função mostra claramente a lógica de como as linhas serão apresentadas.

Como vimos, o Exemplo 2, além de reduzir o código, também permitiu a melhora da legibilidade, ou seja, melhor leitura e entendimento do código.

Passagem de parâmetros e corpo de uma função


A comunicação com uma função se faz graças aos argumentos que lhe são enviados e aos parâmetros presentes na função que os recebe. Mas
qual é a diferença de argumento e parâmetro?

Argumento é o valor passado para o parâmetro.

Assim, no exemplo a seguir, vemos que 5 é o argumento passado para o parâmetro num da função soma, isto é, implicitamente ocorre a atribuição
num=5;.

Para entender a comunicação entre funções de um programa em C, é necessário rever o conceito de variável e de escopo de uma variável.

Uma variável é uma entidade capaz de armazenar um objeto de dados. Para isso, toda variável possui:

Um tipo
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 10/51
24/03/2022 14:34 Linguagem C: funções

Que define como objeto de dados e que será armazenado (sua codificação em memória), além das operações permitidas para tal objeto.
search

Um identificador

Que nada mais é que o nome da variável.

Uma alocação

Que é o espaço em memória RAM destinado a armazenar o objeto de dados.

O escopo de uma variável é o trecho de código no qual a variável é visível, isto é, o trecho no qual seu conteúdo pode ser manipulado. Em C, as
variáveis podem ter dois tipos de escopo:

Global

Válidas e visíveis em todo programa.

Local

Válidas e visíveis somente na função em que foram declaradas.

Revistos esses conceitos, podemos estudar como se comportam os parâmetros de uma função, que pode ter 0, 1, 2 ou mais parâmetros,
dependendo apenas das necessidades do programador. Cada função necessita, no entanto, saber qual é o tipo de cada um dos parâmetros.

Objetos de dados pertencentes a qualquer tipo de dados da linguagem podem ser enviados como argumentos para uma função, mesmo que o tipo
de dados seja definido pelo programador. Os parâmetros de uma função são separados por vírgula, sendo absolutamente necessário que, para cada
um deles, seja indicado o seu tipo.

Linguagem C
content_copy

1 funcao(int a, char letra, float k)

O que foi referido anteriormente continua a ser verdade para os parâmetros de uma função que sejam do mesmo tipo.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 11/51
24/03/2022 14:34 Linguagem C: funções

Linguagem C
search content_copy

1 funcao(int x, int y, int k) /* Exemplo Correto */


2 funcao(int x, y, k) /* Exemplo Incorreto */

Um parâmetro não é nada mais do que uma variável local à função a que pertence. Ele é automaticamente inicializado com o valor do argumento
enviado pela função invocadora.

Argumentos são valores (objetos de dados ou referências a eles) passados como parâmetros para uma função. Essa passagem deve ser realizada
colocando-os dentro de parênteses e separados por vírgulas imediatamente após o nome da função. Existem diversas mecânicas de passagem de
parâmetros para funções. Duas são mais comuns:

Passagem de parâmetros por valor expand_more

Passagem de parâmetros por referência expand_more

report_problem

Atenção!

A linguagem C só implementa a passagem de parâmetros por valor; entretanto, a passagem de parâmetros por referência pode ser
simulada.

Quando se faz a chamada de uma função, o número e o tipo dos argumentos enviados devem ser coincidentes com os parâmetros presentes no
cabeçalho da função.

No exemplo seguinte, a funcao1 recebe três parâmetros que ela armazena em três variáveis denominadas letra (do tipo char), n (do tipo int) e z (do
tipo float). As variáveis letra, n e z são automaticamente iniciadas com os valores ‘B’, 125 e 20.456, respectivamente, que lhe são enviadas a partir
do main().

Linguagem C
content_copy

1 funcao1(char letra, int n, float z)


2 {
3 …
4 }
5
6 main()
7 {
8 …
9 funcao1( ‘B’, 125, 20.456); /* chamada da função */

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 12/51
24/03/2022 14:34 Linguagem C: funções

10 …
11 { search

O número de argumentos enviados para uma função deve ser igual ao de parâmetros existentes no cabeçalho da função. O tipo dos objetos de
dados correspondentes aos argumentos precisa corresponder igualmente aos tipos dos parâmetros na mesma ordem em que foram declarados. Se
a função receber mais de um parâmetro, os argumentos enviados são associados aos parâmetros da função pela ordem em que são escritos. Após
o conceito de passagem de parâmetros, podemos resumir como funciona uma função:

O código de uma função só é executado quando ela é invocada em alguma parte do programa ao qual está, de algum modo, ligado.

Sempre que uma função é invocada, a função que a invoca é “suspensa” temporariamente. Em seguida, são executadas as instruções
presentes no corpo da função. Uma vez terminada a função, o controle de execução do programa volta ao local em que ela foi
invocada.

O programa que invoca uma função pode enviar argumentos, que são recebidos pela função. Eles são recebidos e armazenados em
variáveis locais, que são automaticamente iniciadas com os valores enviados. A essas variáveis dá-se o nome de parâmetros.

Depois de terminar o seu funcionamento, uma função pode devolver um valor para o programa que a invocou.

Nosso próximo exemplo é uma versão alterada do programa do Exemplo 2 de forma que a função linha escreva qualquer caractere – e não apenas o
caractere asterisco.

Exemplo 3
content_copy
C

1 #include <stdio.h>
2
3 linha(int num,char ch)
4 {
5 int i;
6 for (i=1 ; i<=num ; i++)

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 13/51
24/03/2022 14:34 Linguagem C: funções

Input Console
search

play_arrow

Foi adicionado um segundo parâmetro à função, permitindo a escrita de uma linha com qualquer caractere que se deve passar a adicionar na
chamada da função.

Observe o cabeçalho da função na linha 3 contendo dois parâmetros (num e ch), bem como as chamadas da função nas linhas 13 até 16. Cada
chamada passa o número e o tipo de caracteres a ser impresso.

O corpo da função
O corpo de uma função possui três características:

É constituído por instruções de C de acordo com a sintaxe da linguagem.


Tem de se seguir imediatamente ao cabeçalho da função.
É escrito entre chaves.

report_problem

Atenção!

O cabeçalho de uma função nunca deve ser seguido de ponto e vírgula (;), caso contrário, estaríamos declarando um protótipo da função.

Sempre que uma função é invocada pelo programa, o corpo da função é executado, instrução a instrução, até terminar esse corpo ou encontrar a
instrução return, voltando imediatamente à função em que foi invocada. Dentro do corpo de uma função, pode-se:

code
Empregar qualquer instrução ou conjuntos de instruções da linguagem C.

code
Invocar qualquer função, seja ela escrita pelo usuário ou pertencente a uma biblioteca.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 14/51
24/03/2022 14:34 Linguagem C: funções

No entanto, não é possível definir funções dentro delas. O número de instruções que pode estar presente dentro de uma função não tem qualquer
search
limite, mas ele deve ser relativamente pequeno e responsável por realizar uma única tarefa.

Funções que retornam um valor


É possível que uma função seja responsável por realizar determinada tarefa e que, uma vez terminada, devolva um único valor (objeto de dados)
como resultado. A devolução de um resultado é feita por meio da instrução return, seguida do valor a ser devolvido.

Para calcular a soma de dois números inteiros, a função responsável por essa tarefa precisa ter a capacidade de realizar a soma e de retornar o
resultado dela, como no código a seguir:

Repare as duas instruções acima. A função soma terá de receber dois inteiros (3 e 4) e de devolver um resultado (objeto de dados de valor 7) do tipo
inteiro para a variável n, que corresponderá à soma dos dois parâmetros recebidos pela função. A função printf() imprime o valor 7 armazenado na
variável n. Observemos agora o código da função:

Linguagem C
content_copy

1 int soma(int nr1, int nr2)


2 {
3 int resultado;
4 resultado = nr1 + nr2;
5 return resultado;
6 }

Tipo de retorno é int (inteiro). A palavra reservada int é colocada do lado esquerdo do nome da função.

wb_incandescent

Dica

Na linguagem C, o tipo default de retorno é int, isto é, caso o tipo da função seja omitido, o tipo de retorno será int.

Repare que a soma de nr1 e nr2 é colocada numa variável do tipo inteiro (resultado) cujo objeto de dados armazenado por ela é, em seguida,
devolvido como resultado da função. Os parâmetros da função são nr1 e nr2. O valor a retornar é armazenado na variável resultado.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 15/51
24/03/2022 14:34 Linguagem C: funções

search
Escopo de variáveis
Como vimos, as variáveis podem ser declaradas dentro do corpo de uma função. Elas são visíveis, ou seja, conhecidas apenas dentro da própria
função. Por isso, são denominadas variáveis locais.

A declaração de variáveis dentro de uma função precisa ser realizada antes de qualquer instrução, como mostra a estrutura da função a seguir:

Pseudocódigo
content_copy

1 função( ..........)
2 {
3 declaração de variáveis
4 instruções
5 }

Essas variáveis só podem ser utilizadas dentro da própria função. Se uma mesma variável for declarada em duas funções distintas, não haverá
qualquer tipo de problema, pois o compilador sabe qual utilizar em cada uma delas. Apesar de terem o mesmo nome, elas são variáveis distintas
sem qualquer relação, do mesmo modo que pode haver dois indivíduos chamados Paulo em salas de aula distintas.

Depois de terminada a execução de determinada função, todas as suas variáveis locais são destruídas. As variáveis, portanto, são desalocadas (ou
desalojadas) da memória. Eis um programa que mostra o uso de escopo de variáveis:

Exemplo 4
content_copy
C

1 #include <stdio.h>
2
3 void escopo1() {
4 int A;
5 A = -100;
6 i tf("V l d A d t d f ã 1 %d\ " A)

Input Console

play_arrow

Para mostrar o escopo de variáveis, criamos a variável A em vários locais. Embora sejam do mesmo tipo e nome, elas são diferentes, pois foram
definidas nas funções main(), escopo1() e escopo2().

Criaremos a tabela adiante para acompanhar os valores de cada variável A ao longo da execução do programa:

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 16/51
24/03/2022 14:34 Linguagem C: funções

Valor de A na Valor de A na função Valor de A na função


Execução search
Saída do programa
função main() escopo1() escopo2()

Linha 17 10 ---- ---- ----

Linha 18 10 ---- ---- Valor de A: 10

Linha 19 20 ---- ---- ----

Linha 20 20 ---- ---- ----

Linha 5 20 -100 ---- ----

Valor de A dentro da função


Linha 6 20 -100 ----
escopo1: -100

Linha 21 20 ---- ---- Valor de A: 20

Linha 22 30 ---- ---- ----

Linha 23 30 ---- ---- ----

Linha 11 30 ---- -200 ----

Valor de A dentro da função


Linha 12 30 ---- -200
escopo2: -200

Linha 24 30 ---- ---- Valor de A: 30

Tabela: Valores das variáveis A no programa do Exemplo 4.


Elaborada por: Paulo Vidal.

A coluna que mostra a variável A na função main() sempre tem um valor enquanto o programa está em execução. De forma diferente, a variável A na
função escopo1() e a presente na função escopo2() só possuem um valor enquanto a respectiva função está em execução. Depois que ela é
executada, a variável A é destruída.

A variável local definida no escopo da função só fica alocada na memória enquanto a função é executada.

video_library
Argumentos, parâmetros e escopo: como utilizar corretamente esses
conceitos
No vídeo a seguir, demonstraremos, por meio de um exemplo, como esses conceitos se aplicam na construção de funções em linguagem C.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 17/51
24/03/2022 14:34 Linguagem C: funções

search

playlist_play
Vem que eu te explico!
Os vídeos a seguir abordam os assuntos mais relevantes do conteúdo que você acabou de estudar.

Objetivos na utilização de funções

play_arrow
Como a evolução das linguagens de programação permitiu construir algoritmos melhores?

02:34 min.

Escopo de variáveis

play_arrow
Como é o mecanismo de ativação das funções e sua relação com o escopo?

03:18 min.

emoji_events

Falta pouco para atingir seus objetivos.


https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 18/51
24/03/2022 14:34 Linguagem C: funções

search
Vamos praticar alguns conceitos?

Questão 1
Analise o código a seguir e assinale a opção que mostra o resultado correto após a execução do programa.

Assinale a opção correta:

A Resultado = 60

B Resultado = 16

C Resultado = 32

D Resultado = 10

E Resultado = 8

Responder

Questão 2
Analise o código adiante em relação ao escopo das variáveis e o resultado do programa após a execução.

Assinale a resposta correta da saída do programa acima.

Valor de X = 21, Y = 49

A
Valor de X = 21, Y = 49

Valor de X = 21, Y = 50

B
Valor de X = 21, Y = 50

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 19/51
24/03/2022 14:34 Linguagem C: funções

Valor de X = 20, Y = 50
search
C
Valor de X = 20, Y = 50

Valor de X = 21, Y = 49

D
Valor de X = 20, Y = 50

Valor de X = 20, Y = 50

E
Valor de X = 21, Y = 49

Responder

starstarstarstarstar

Matrizes e estruturas como argumentos de função


Ao final deste módulo, você será capaz de empregar como parâmetros de uma função vetores, matrizes e estruturas.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 20/51
24/03/2022 14:34 Linguagem C: funções

search
Passagem de vetores para funções
Um vetor é uma abstração comum na maioria das linguagens de programação. Ele nada mais é que uma variável capaz de armazenar um agregado
homogêneo de objetos de dados, isto é, objetos de dados pertencentes a um mesmo tipo. Para identificá-los unicamente, o vetor emprega um
índice, ou seja, um número inteiro que distingue qual objeto de dados será acessado. No trecho de código a seguir, veremos um exemplo de como
isso é feito:

Linguagem C
content_copy

1 int vet1[20]; // declaração


2
3 vet1[0]=10; //atribuição 1
4 vet1[1]=5; //atribuição 2
5 vet1[2]=6; //atribuição 3

Na linha com comentário “declaração”, é feita a declaração de uma variável vet1 associada ao tipo inteiro. Observe que, se vet1 fosse uma variável
inteira comum, a declaração terminaria após seu nome com um ponto e vírgula “;”.

Entretanto, a declaração continua com o numeral 20 entre colchetes. A semântica disso é que a variável vet1 não armazena somente um inteiro,
mas também agrega 20 objetos de dados do tipo inteiro.

Sendo assim, como é possível acessar cada objeto de dados individualmente?

Isso é feito com a identificação da posição do objeto que se deseja acessar dentro do agregado. O primeiro objeto sempre é identificado pela
posição “0” e o último, no nosso exemplo, pela “19”. Note que a variável vet1 é única, ou seja, para identificar um dos objetos de dados, é
fundamental dizer qual deles, o que é feito pelo mecanismo já descrito. Assim, no exemplo anterior, a linha com comentário “atribuição 1” armazena
o valor “10” na primeira posição do vetor; a com “atribuição 2”, o valor “5” na segunda posição – e assim por diante.

Recordado o conceito de vetor, demonstraremos como é feita a passagem de vetores como parâmetros para funções. Para isso, definiremos duas
variáveis tipo vetor descritas a seguir:

Linguagem C
content_copy

1 int vet1[20];
2 int vet2[30];

Imaginemos que seja nossa intenção iniciar os vetores vet1 e vet2 com o valor zero em todas as posições e que pretendamos utilizar uma função
para realizar tal carga inicial. Como os vetores possuem dimensões diferentes, teremos eventualmente de definir duas funções distintas (uma para
vetores com 20 inteiros e outra para aqueles com 30 inteiros). Escrevamos o código de cada uma delas:

Linguagem C
content_copy

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 21/51
24/03/2022 14:34 Linguagem C: funções

1 void inic1(int s[20])


2 { search
3 int i;
4 for(i=0;i<20;i++)
5 s[i]=0;
6 }
7 void inic2(int s[30])
8 {
9 int i;
10 for(i=0;i<30;i++)
11 s[i]=0;
12 }

Temos, assim, o código das funções inic1 e inic2. Cada uma tem como parâmetro um vetor de inteiros. A invocação dessas funções na função
main() precisa ser realizada da seguinte forma:

Linguagem C
content_copy

1 main()
2 {
3 int vet1[20];
4 int vet2[30];
5 inic1(vet1); /* Iniciar o vetor vet1 usando a função inic1 */
6 inic2(vet2); /* Iniciar o vetor vet2 usando a função inic2 */
7 }
8

Repare que é enviado um vetor com 20 inteiros à função inic1, que deve ter um parâmetro do mesmo tipo da variável. Observe ainda que as funções
inic1 e inic2 têm semânticas muito parecidas.

Será possível escrever uma única função que seja capaz de inicializar um vetor de qualquer tamanho?

A resposta é sim. Vejamos como isso acontece. Em C, existe a dualidade vetor/ponteiro, isto é, uma variável declarada como vetor pode ser vista
como um ponteiro. Para facilitar, vamos relembrar agora o conceito dele. Um ponteiro é uma variável que armazena um endereço de memória. Os
ponteiros são declarados com a estrutura sintática a seguir:

Linguagem C
content_copy

1 int *a;

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 22/51
24/03/2022 14:34 Linguagem C: funções

search

A semântica dessa declaração é que a variável “a” armazena um objeto de dados que é um endereço de memória.

Mas para que serve o tipo inteiro associado na declaração?

A resposta é: para interpretar o conteúdo do endereço armazenado em “a” como um inteiro. Vamos ver isso por meio de um exemplo:

Vamos analisar as três primeiras linhas:

Linha 1

É declarada uma variável inteira tradicional. Como sabemos, toda variável é armazenada em um endereço de memória. Chamamos
esse endereço de alocação da variável.

Vamos supor que a variável “a” tenha alocação no endereço 0x0300 (o hexadecimal foi usado por ser usual para expressar
endereços). Assim, o valor 10 é armazenado nesse endereço após a inicialização da variável.

Linha 2

É declarado um ponteiro. Desse modo, “b” armazena um endereço de memória, sendo inicializado com o endereço da alocação de “a”
(isso é feito por meio do operador &, que retorna o endereço da alocação de uma variável). Ou seja, a variável “b” armazena o
endereço 0x0300.

Linha 3

É invocada a função printf; conforme foi escrita, a função printf imprime um inteiro, que, por sua vez, corresponde à avaliação da
expressão “*b”. O operador asterisco “*” aplica-se a ponteiros e interpreta o objeto de dados contido no endereço armazenado em seu
argumento como um inteiro. Lembre-se de que “b” foi declarada como int *b; por isso, o operador “*” interpreta o conteúdo do
endereço armazenado por b como inteiro. Dessa forma, como o endereço armazenado em “b” é o endereço da alocação de “a”, o
conteúdo interpretado é o da variável “a”: 10. Sendo assim, o resultado da execução seria:

10

0x0300

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 23/51
24/03/2022 14:34 Linguagem C: funções

Na linguagem C, existe a dualidade vetor/ponteiro. Dessa forma, ao declararmos int vet1[20];, vet1 poderá ser visto como um vetor caso seja
search está
sucedido por colchetes ou como ponteiro caso seja grafado sozinho. Dessa maneira, vet1 é um ponteiro para o endereço de memória onde
armazenado o primeiro elemento do vetor. Mas como podemos utilizar isso?

Imagine que desejemos criar uma única função para inicializar vetores de inteiros de qualquer tamanho. Como procederíamos? Simples: em vez de
passar o vetor com seu tamanho como parâmetro, passaremos um ponteiro. O código a seguir exemplifica o uso:

Linguagem C
content_copy

1 void inic(int *s, int tam)


2 {
3 int i;
4 for(i=0;i<tam;i++)
5 s[i]=0;
6 }
7 int main()
8 {
9 int a[20];
10 int b[30];
11 inic (a,20);
12 inic (b,30);
13 return 0;
14 }

Observe que a função inic tem dois parâmetros:

“s”

É um ponteiro. O parâmetro “s” foi declarado como ponteiro, embora, no corpo da função, tenha sido utilizado como vetor.

“tam”

É um inteiro. O parâmetro “tam” foi utilizado para definir até onde inicializar o vetor.

Passagem de matrizes para funções


A passagem de matrizes para funções é semelhante à de vetores para funções. Uma matriz nada mais é que um vetor de vetores, isto é, um
agregado de vetores. Sendo assim, cada objeto de dados é identificado unicamente por dois índices que chamamos de linha e coluna.

Como exemplo, construiremos uma função que receba uma matriz quadrada e retorne a soma dos elementos da diagonal principal. Uma matriz
quadrada é definida como uma matriz com o número de linhas igual ao de colunas, tendo a diagonal principal composta pelos elementos que têm o
índice da linha igual ao da coluna de uma matriz quadrada. Uma matriz $$$M_{3 x 3}$$$ possui 9 valores, enquanto a diagonal principal é formada

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 24/51
24/03/2022 14:34 Linguagem C: funções

por 3 elementos ($$$M_{1,1}, M_{2,2}, M_{3,3}$$$). Nosso próximo programa calcula a soma da diagonal principal de uma matriz quadrada $$$M_{3
x 3}$$$, utilizando uma função para executar essa tarefa. search

Exemplo 1
content_copy
C

1 #include <stdio.h>
2 int soma_diagonal(int mat[3][3]) {
3 int soma = 0;
4 for (int i=0; i < 3 ; i++)
5 {
6 f (i t j 0 j < 3 j++)

Input Console

play_arrow

Vamos à explicação do programa:

Linha 2

Definição da função soma_diagonal, recebendo a matriz de inteiros como parâmetro.

Linha 3

Definição da variável tipo int com zero, usada para armazenar a soma dos elementos da diagonal principal.

Linha 4

Laço for para a iteração de cada linha (variável i representa o número da linha).

Linha 5

Laço for para a iteração de cada coluna (variável j representa o número da coluna). A varredura da matriz é por coluna.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 25/51
24/03/2022 14:34 Linguagem C: funções

Linha 6 search
Comando if (i == j) para identificar os elementos da diagonal principal.

Linha 7

Expressão matemática para somar os elementos da diagonal principal.

Linha 8

Comando return, devolvendo o valor da variável soma para o main().

Linhas 13 a 15

Definição e inicialização da matriz. Observe os elementos das linhas 0, 1 e 2.

Linha 16

Imprime a saída do programa “Soma da diagonal principal = 15”. A chamada da função soma_diagonal(matriz) pode ser feita dentro
do comando printf() como segundo argumento da função printf(). A função soma_diagonal retorna o resultado de um valor inteiro
que é impresso na tela.

verified

Recomendação

Retorne ao emulador, altere os valores e faça novos testes. Aproveite a oportunidade para fixar os conceitos abordados e estimular o
raciocínio lógico.

Passagem de registros para funções


Um registro é uma abstração comum nas linguagens de programação. Ele constitui basicamente um agregado heterogêneo de objetos de dados,

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 26/51
24/03/2022 14:34 Linguagem C: funções

isto é, objetos de dados de tipos distintos acessados pela mesma declaração de variável.
search
O trecho de código adiante exemplifica a declaração de um registro. Em linguagem C, essa abstração é chamada de struct.

Linguagem C
content_copy

1 struct pessoa
2 {
3 char nome[50];
4 int idade;
5 float salario;
6 };

A semântica dessa declaração é que o registro (struct) pessoa agrega três objetos de dados distintos:

looks_one
Um vetor de caracteres, identificado por nome.

looks_two
O inteiro idade.

looks_3
O número de ponto flutuante salário.

A declaração da struct como está é equivalente à de um novo tipo. Esse tipo é identificado por struct pessoa. Observe então que, como está, a
declaração não instancia uma variável. Para instanciá-la, é necessária a linha adicional descrita a seguir.

Linguagem C
content_copy

1 struct pessoa funcionario;

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 27/51
24/03/2022 14:34 Linguagem C: funções

search

O aceso a cada elemento do agregado heterogêneo é feito pelo operador ponto “.”. Assim, para acessar o campo idade, por exemplo, basta grafar
este código:

Linguagem C
content_copy

1 funcionario.idade = 50;

Cuja semântica é: atribua o valor 50 ao campo idade do registro identificado por funcionario.

Entendamos, por meio de um exemplo, como é possível passar uma struct como parâmetro para uma função. Nosso próximo programa apresenta
uma função que permita escrever na tela os valores existentes em uma estrutura recebida como argumento. Essa estrutura possui informações de
um funcionário, como nome completo, idade e salário.

Exemplo 2
content_copy
C

1 #include <stdio.h>
2
3 struct pessoa
4 {
5 char nome[50];
6 i t id d

Input Console

play_arrow

Vamos à explicação do programa:

Linhas 3 a 8

Definição da struct pessoa com os campos nome, idade e salário.

Linha 10

D fi i ã d f ã ibi ( t t f) N t iá lfé â t bid d ti


https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 28/51
24/03/2022 14:34 Linguagem C: funções
Definição da função exibir(struct pessoa f). Note que a variável f é o parâmetro recebido do tipo pessoa.

search

Linhas 11 a 15

É o corpo da função no qual são impressos os dados do funcionário. Veja que não existe o comando return, pois a função não precisa
retornar valor (o tipo da função é void).

Linha 19

Inicializa a variável p.

Linha 20

Chamada da função exibir(p) com o parâmetro p.

Como se pode observar, o tipo a ser colocado no parâmetro da função corresponde ao do argumento que lhe é enviado.

video_library
Simulando passagem de parâmetros por referência em C
No vídeo a seguir, demonstraremos, por meio de um exemplo, como utilizar ponteiros para simular a passagem de parâmetros por referência em C.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 29/51
24/03/2022 14:34 Linguagem C: funções

search

playlist_play
Vem que eu te explico!
Os vídeos a seguir abordam os assuntos mais relevantes do conteúdo que você acabou de estudar.

Passagem de vetores para funções

play_arrow
O que é um ponteiro, qual sua importância e qual sua fraqueza?

02:41 min.

Dualidade vetor/ponteiro

play_arrow
Como a linguagem C implementa um vetor?

02:54 min.

emoji_events

Falta pouco para atingir seus objetivos.


Vamos praticar alguns conceitos?

Questão 1

Interprete o programa a seguir, verifique o que a funcao2() faz e assinale qual das opções será impressa na saída.

Marque a opção correta.

A -225

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 30/51
24/03/2022 14:34 Linguagem C: funções

search
B -23

C 20

D 19

E 225

Responder

Questão 2

Interprete o programa adiante, verifique o que a função func3() faz e assinale qual das opções será impressa na saída após a execução.

Aponte a opção correta.

A Paulo Cesar 50 10000,00

B Mauro Cesar 60 12500,00

C Paulo Victor 51 12000,00

D Paulo Cesar 60 12500,00

E Paulo Cesar 51 12500,00

Responder

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 31/51
24/03/2022 14:34 Linguagem C: funções

starstarstarstarstar search

Recursividade
Ao final deste módulo, você será capaz de aplicar o conceito de recursividade na programação.

Conceito de recursividade
Nós, seres humanos, temos como característica o pensamento linear. Por exemplo, se desejo fazer um bolo, procuro a receita do bolo e sigo a
receita linearmente, passo a passo. Inicialmente, executo o primeiro passo, como colocar a farinha no pote. Após isso, faço o segundo, seguindo
essa linha até o último passo: colocar o bolo para assar no forno. Esse é o típico pensamento linear ou não recursivo.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 32/51
24/03/2022 14:34 Linguagem C: funções

search

Seguir a receita de um bolo é um processo linear ou não recursivo.

Analisemos um exemplo no domínio dos algoritmos.

Desejo determinar o maior elemento em uma sequência de n elementos. Para isso, a maioria das pessoas criaria o seguinte algoritmo:

1. Passo inicial: máximo = 1º elemento da sequência.


2. Passo geral: repito para o 2º elemento até o último elemento a seguinte comparação:
3. Se máximo < elemento analisado, então máximo = elemento analisado.
4. Ao final, a variável máximo armazenará o maior elemento da sequência.

Esse raciocínio é intuitivo e bastante humano. No entanto, há uma segunda abordagem para a solução do problema. A abordagem recursiva divide o
problema em subproblemas da mesma natureza do original. Vejamos como seria essa abordagem para a determinação do máximo da sequência.

Podemos raciocinar que a determinação do máximo é feita de seguinte forma: o máximo da sequência s1, s2, s3, ... sn, com n elementos, é o
máximo entre s1 e o máximo de s2, s3, s4, ..., sn. Quando fazemos tal divisão, transformamos o problema original, que tinha tamanho n, em dois
subproblemas:

Subproblema 1

De tamanho 1 (que chamamos de problema trivial ou infantil).

Subproblema 2

Determinação do máximo na sequência de tamanho n -1, isto é, a sequência: s2, s3, ..., sn.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 33/51
24/03/2022 14:34 Linguagem C: funções

search

Nesse ponto surge a recursividade: o máximo da sequência s2, s3, ..., sn pode ser resolvido da mesma forma, ou seja, é o máximo entre s2 e o
máximo da sequência s3, s4, ... sn. Tal é a essência do pensamento recursivo.

Analisando um exemplo de tamanho 4, qual seria o máximo da sequência 10, 8, 20, 16?

Vejamos a resposta recursiva:

Passo 1 expand_more

Passo 2 expand_more

Passo 3 expand_more

Voltemos ao:

Passo 2: Agora sabemos o máximo da sequência 20,16: 20. Dessa forma, o máximo entre 8, 20, 16 é o máximo entre 8 e 20, que é 20.
Passo 1: O máximo da sequência 10, 8, 20, 16 é o máximo entre 10 e 20: 20.

Tal é a abordagem recursiva para encontrar o máximo de uma sequência.

video_library
Resolvendo o quebra-cabeça Torres de Hannoi
No vídeo a seguir, mostraremos como o raciocínio recursivo é a abordagem mais simples para solução do quebra-cabeça.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 34/51
24/03/2022 14:34 Linguagem C: funções

search

Recursividade em C
Para as linguagens de programação, a recursividade é entendida como a capacidade que uma linguagem tem de permitir que uma função possa
invocar a si mesma. A recursividade pode ser:

Direta

Uma função invoca a si mesma no seu corpo de função.


close

Indireta

Uma função f invoca outra função g, a qual, por sua vez, volta a invocar a função f.

Em nosso próximo programa, vamos implementar a função fatorial que calcula o valor de n! utilizando o comando for, sendo que: n! = n * (n-1) * (n-
2) * ... * 2 * 1 e sabendo que 0!=1. Exemplo: 4! = 4*3*2*1 = 24.

Exemplo 1
content_copy
C

1 #include <stdio.h>
2 int fatorial(int n) {
3 int fat = 1;
4 for(int i = 1; i <= n; i++)
5 fat = fat * i;
6 t f t

Input Console

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 35/51
24/03/2022 14:34 Linguagem C: funções

play_arrow
search
No entanto, poderemos olhar para a definição da função fatorial e verificar que n! = n * (n-1) * (n-2) * ... * 2 * 1 é equivalente a n! = n * (n-1)!, pois (n-
1)! = (n-1) * (n-2) * ... * 2 * 1. Dessa forma, a definição do fatorial é realizada pelo próprio conceito de fatorial:

0! = 1
n! = n * (n-1)!

Agora, vamos construir uma função que calcule o valor do fatorial de n utilizando o conceito de recursividade. A recursividade é uma forma de
implementar um laço por meio de chamadas sucessivas à mesma função.

Exemplo 2
content_copy
C

1 #include <stdio.h>
2
3 int fatorial(int n) {
4 if (n==0) /* Condição para término */
5 return 1;
6 l

Input Console

play_arrow

Verificamos que o código da função com recursividade (linhas 3 a 8) ficou mais simples que o presente no exemplo anterior.

Lógica de funcionamento de uma chamada recursiva


Veremos agora o resultado de se invocar a função fatorial com o valor 4.

Passo 1 expand_more

Passo 2 expand_more

Passo 3 expand_more

Passo 4 expand_more

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 36/51
24/03/2022 14:34 Linguagem C: funções

Observe que, se a função fatorial não tivesse a condição de parada do comando if(n==0) return 1, ela seria reduzida ao código a seguir:
search

Linguagem C
content_copy

1 int fatorial(int n) {
2 return n*fatorial(n-1); /* chamada recursiva */
3 }

O programa entraria em laço infinito (loop), pois a função não pararia de chamar a si própria até esgotar toda a memória disponível.

Boas práticas na programação de funções recursivas


Elencaremos três delas a seguir:

Critério de término Chamada recursiva Menos código

A primeira instrução de uma função recursiva deve ser sempre a implementação do critério de término das chamadas, isto é, a condição ou
as condições que se deve verificar para que a função pare de invocar a si própria.

playlist_play
Vem que eu te explico!
Os vídeos a seguir abordam os assuntos mais relevantes do conteúdo que você acabou de estudar.

Primeiras palavras

play_arrow
Como é implementada a recursividade?

03:35 min.

Recursividade em C

play_arrow
Como uma função recursiva é executada?

03:00 min.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 37/51
24/03/2022 14:34 Linguagem C: funções

search

emoji_events

Falta pouco para atingir seus objetivos.


Vamos praticar alguns conceitos?

Questão 1

Em um programa na linguagem C, duas funções fazem chamadas recíprocas: uma função f1 faz uma chamada a uma função f2, que, por sua
vez, faz outra a f1. Isso é uma técnica de programação chamada de

A programação orientada a funções.

B recursividade direta.

C lista circular.

D recursividade indireta.

E lista indireta.

Responder

Questão 2

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 38/51
24/03/2022 14:34 Linguagem C: funções

Interprete o código a seguir e assinale a opção correta quanto ao valor retornado pela função recursividade com o parâmetro de valor 5.
search
Javascript
content_copy

1 #include < stdio.h >


2 int recursividade(int n)
3 {
4 if (n>0) {
5 n = 2*recursividade(n-1);
6 return n;
7 }
8 else return 1;
9 }
10 int main()
11 {
12 recursividade(5);
13 }

A 4

B 128

C 16

D 64

E 32

Responder

starstarstarstarstar

4
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 39/51
24/03/2022 14:34 Linguagem C: funções

Utilização de biblioteca padrão search

Ao final deste módulo, você será capaz de selecionar as funções na biblioteca padrão adequadas à solução de um programa.

História da biblioteca padrão do ANSI C


Antes de ser padronizada, a linguagem C não fornecia funcionalidades nativas como operações de entrada e saída. Com o tempo, a comunidade de
usuários compartilhou ideias e implementações, o que é atualmente chamado de biblioteca padrão. Vejamos um pouco da história:

1970 1980 1983 1989

A linguagem C tornou-se cada Aumentaram os problemas de A American National O trabalho do comitê


vez mais popular. Diferentes compatibilidade por conta Standards Institute (ANSI) culminou na criação do
universidades e organizações dessas diferentes versões. formou um comitê para padrão C89.
estavam criando as próprias estabelecer uma
variações dessa linguagem especificação formal da
para seus projetos. linguagem conhecida como
ANSI C.

Parte do padrão C89 é o conjunto de bibliotecas denominado biblioteca padrão do ANSI C. Por isso, abordaremos neste módulo as funções da
biblioteca ANSI C. De maneira mais específica, veremos o que elas são e como usá-las em seu programa.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 40/51
24/03/2022 14:34 Linguagem C: funções

Bibliotecas search

Anteriormente, entendemos como codificar funções em linguagem C. No entanto, suponha que, cada vez que pretenda programar, você tenha de
reescrever aquelas funções básicas que todo programa utiliza. Um exemplo simples é a função de impressão na tela. Imagine que, toda vez que for
escrever um programa, você precise reprogramar uma função para escrever na tela. Não tem muito sentido, certo?

Como podemos resolver esse problema?

Uma solução é agrupar funções de uso corriqueiro em bibliotecas de funções. Com isso, quando a função for necessária, bastará usar a biblioteca
para ter a funcionalidade desejada disponível. Conforme já frisamos, a padronização das bibliotecas já foi feita na década de 1990. Ainda assim,
entenderemos como isso é implementado.

Para entender a forma de disponibilizar bibliotecas, é necessário lembrar como as linguagens de segunda e terceira geração são executadas por
computadores. Como se sabe, eles somente executam linguagem de máquina. Desse modo, qualquer outra linguagem de programação deve ser
traduzida para a de máquina. Há duas formas de implementar essa tradução:

Interpretação

Comando a comando.

Compilação

Todos os comandos do programa de uma única vez.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 41/51
24/03/2022 14:34 Linguagem C: funções

search

assignment_ind

Comentário

Existem vantagens e desvantagens em ambas, mas não nos aprofundaremos nessas questões.

A linguagem C é uma linguagem compilada. Assim, como já vimos, todo o código é analisado e traduzido para linguagem de máquina de uma vez.
Para um programa simples, o processo não parece muito complexo; entretanto, para um complexo, composto por diversas funcionalidades distintas,
ele não é nada obvio.

Suponha que um programa seja composto por vários arquivos diferentes, cada um agrupando funções relacionadas a alguma funcionalidade, como,
por exemplo, um sistema escrito em linguagem C composto por três arquivos:

insert_drive_file
gui.c

Agrupa as funções da interface gráfica.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 42/51
24/03/2022 14:34 Linguagem C: funções

search
insert_drive_file
bd.c

Agrupa as funções de comunicação com o banco de dados.

insert_drive_file
principal.c

Com o programa principal e suas funções acessórias.

O passo de tradução do programa em linguagem C para a de máquina é chamado de compilação. Cada arquivo é compilado individualmente,
gerando um arquivo em linguagem de máquina (usualmente com extensão bin). Assim, para o nosso exemplo, a compilação dos arquivos gui.c, bd.c
e principal.c geraria três arquivos distintos: gui.bin, bd.bin, principal.bin, que contêm a tradução das funções contidas em cada arquivo “.c” para a
linguagem de máquina.

Como juntar esses três arquivos em um único programa executável?

Isso é feito por outro aplicativo: o link editor. Sendo assim, para gerar um programa executável, são necessários dois passos:

Compilação

Passo em que é feita a tradução da linguagem de alto nível para a de máquina.


arrow_forward

Link edição

Onde os diversos arquivos bin (em linguagem de máquina) são ligados em um único executável.

Aqui surge um problema. Suponha que, dentro de uma função contida no arquivo principal.c, haja a necessidade de invocar outra declarada em gui.c.
Vamos supor ainda, por exemplo, que precisemos chamar a função draw_window(), a qual, por questões de simplificação, não tem parâmetros.

A função (draw_window) foi escrita e compilada sem erros – só que em outro arquivo. Dessa maneira, ao ser invocada dentro de uma função
contida no arquivo principal.c, essa função é desconhecida; assim, o compilador reporta um erro. Como resolver isso? Por meio do uso de
protótipos de funções.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 43/51
24/03/2022 14:34 Linguagem C: funções

search
verified

Recomendação

É considerada uma boa prática de programação associar a cada arquivo com extensão “.c” outro com extensão “.h”, que, como já vimos, é
chamada de header file ou arquivo cabeçalho. Nesse arquivo, inserirmos todos os protótipos de funções contidas no arquivo “.c”
associado a ele. Logo, quando fazemos o include do arquivo “.h” no início do nosso código, estamos incluindo todos os protótipos de
funções daquele arquivo “.c” associado. Por isso, não ocorrem erros de compilação.

Qual é a relação disso tudo com o uso de bibliotecas padrão? Uma biblioteca nada mais é do que um código em linguagem C já compilado pelo
fornecedor da biblioteca, que será o link editado com o seu código em linguagem C. Entretanto, para que o compilador seja capaz de não reportar
erros no passo de compilação, será necessário adicionar o arquivo “.h”, que contém os protótipos das funções implementadas na biblioteca. A
imagem a seguir ilustra tal processo:

Adicionando arquivo de protótipos das funções na biblioteca.

Por essa razão, é fundamental realizar o “#include” do arquivo “.h” no início do código que usa determinada biblioteca. Esse comando “#include” –
que, na verdade, constitui uma diretiva de compilação – insere no ponto que é declarado o conteúdo do arquivo “.h” (algo muito parecido com um
“control-v/control-c”).

Vamos ao exemplo. Suponha que nosso desejo seja compilar o código a seguir:

Linguagem C
content_copy

1 #include ”gui.h”
2 #include “db.h”
3

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 44/51
24/03/2022 14:34 Linguagem C: funções

4 void desenha_resposta_consulta ()
5 { search
6 char saida[80];
7 query_db (saída,”select * from aluno where matricula=123;”);
8 draw_window (saida);
9 }

Observe que a função query_db, assim como a draw_window, não está codificada no arquivo. Isso vai resultar em um erro? Em princípio, sim, a
menos que o protótipo dessas funções esteja declarado nos arquivos “.h” incluídos pela diretiva “#include”. Imagine então que o conteúdo do
arquivo db.h seja este:

Linguagem C
content_copy

1 int open_db (char *database);


2 int close_db (char *database);
3 void query_db (char *saída, char *query);

E que o conteúdo de gui.h seja:

Linguagem C
content_copy

1 void draw_window (char *str);

Podemos perceber que os protótipos das funções utilizadas estão nos arquivos “.h”; assim, o compilador substituirá a diretiva “#include” pelo
conteúdo do arquivo. Ou seja, para fins de análise, o compilador “verá” o código a seguir:

Linguagem C
content_copy

1 void draw_window (char *str);


2 int open_db (char *database);
3 int close_db (char *database);
4 void query_db (char *saída, char *query);
5
6 void desenha_resposta_consulta ()
7 {
8 char saida[80];

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 45/51
24/03/2022 14:34 Linguagem C: funções

9 query_db (saída,”select * from aluno where matricula=123;”);


10 draw_window (saida); search
11 }

Como os protótipos das funções utilizadas estão declarados, não ocorrerão erros de compilação. Mas esse código já pode ser executado?

A resposta é não. O protótipo da função não carrega o corpo da função. Esse corpo foi compilado em outro arquivo ou pertence a uma biblioteca.
Por isso, o código só pode ser executado após link edição.

Vantagens de usar funções da biblioteca C


A seguir temos as principais vantagens de usar funções da biblioteca C:

As funções funcionam expand_more

As funções são otimizadas para desempenho expand_more

Economiza um tempo considerável de desenvolvimento expand_more

As funções permitem a portabilidade dos programas expand_more

Arquivos de cabeçalho da biblioteca padrão na linguagem C


Veja a descrição dos arquivos de cabeçalho da biblioteca padrão na linguagem C:

< math.h > < time.h > < locale.h > < complex.h >

Funções matemáticas. Funções de data e hora. Funções de localização. Um conjunto de funções para
manipular números
complexos.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 46/51
24/03/2022 14:34 Linguagem C: funções

search

Em nosso próximo exemplo, para calcular a raiz quadrada de um número, você pode usar a função de biblioteca sqrt(). Essa função é definida no
arquivo de cabeçalho < math.h >.

Exemplo 1
content_copy
C

1 #include <stdio.h>
2 #include <math.h>
3 main()
4 {
5 float num, raiz;
6 i tf("Di it ú ")

Input Console

play_arrow

verified

Recomendação

Aproveite para estudar mais e fazer novos testes. Desafie-se a implementar outros programas. É muito importante que você pratique os
conceitos estudados e procure descobrir novos caminhos para as soluções desejadas. A evolução é resultado da prática constante. Não
desista, você está no caminho certo!

video_library
Pesquisando funções nas bibliotecas ANSI C
No vídeo a seguir, demonstraremos como pesquisar e aplicar as funções das bibliotecas ANSI C.

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 47/51
24/03/2022 14:34 Linguagem C: funções

search

playlist_play
Vem que eu te explico!
Os vídeos a seguir abordam os assuntos mais relevantes do conteúdo que você acabou de estudar.

Bibliotecas

play_arrow
Como organizar um header file

02:44 min.

Bibliotecas

play_arrow
Como o código das bibliotecas é ligado ao código da aplicação?

02:06 min.

emoji_events

Falta pouco para atingir seus objetivos.


Vamos praticar alguns conceitos?
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 48/51
24/03/2022 14:34 Linguagem C: funções

search

Questão 1
Em relação às boas práticas de programação, é recomendável que o desenvolvedor empregue as funções da biblioteca padrão em C. Assinale a
opção correta quanto à vantagem na utilização de funções da biblioteca padrão na programação em C.

A As funções disponíveis dificultam a portabilidade dos programas.

Não sabemos se as funções foram criadas com um código eficiente para desempenho máximo, pois não foram realizados
B
testes durante a programação.

A elaboração das especificações das funções da biblioteca não envolve organizações de padronização, apenas universidades
C
e empresas.

D O programador economiza um tempo considerável de desenvolvimento, pois as funções estão prontas para uso.

E As funções têm apresentado diversos erros de implementação que dificultam a programação.

Responder

Questão 2
Você está codificando um programa e precisa verificar se determinado caractere digitado é maiúsculo ou minúsculo, tomar uma decisão e
invocar determinada função em relação ao tipo de caractere escolhido. Você sabe que, na biblioteca padrão, existem funções de manipulação
de caracteres. Marque a opção com o arquivo cabeçalho que você precisa incluir no programa para resolver tal problema.

A < math.h >

B < ctype.h >

C < stdio.h >

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 49/51
24/03/2022 14:34 Linguagem C: funções

D < stdlib.h >


search

E < string.h >

Responder

starstarstarstarstar

Considerações finais
Iniciamos este conteúdo com a apresentação da estrutura de uma função: o tipo, o nome, os parâmetros, o corpo da função e o valor de retorno.
Pontuamos, em seguida, que o código de uma função só é executado quando ela é invocada em alguma parte do programa.

Sempre que uma função é invocada, o programa que a invoca é “suspenso” temporariamente. Em seguida, são executadas as instruções presentes
no corpo dela. Uma vez terminada a função, o controle de execução do programa volta ao local em que ela foi invocada.

Vimos ainda que qualquer tipo de dados da linguagem pode ser enviado como parâmetro para uma função, mesmo o tipo de dado que venha a ser
definido pelo programador. Esses tipos podem ser de dados básicos, bem como tipos definidos pelos usuário, como vetores, matrizes e estruturas.

Também demonstramos que C é uma linguagem com capacidade recursiva, isto é, uma função que, direta ou indiretamente, pode invocar a si
própria por meio de outra função. A recursividade é uma técnica de desenvolvimento particularmente útil na implementação de alguns algoritmos de
pesquisa, poupando muito tempo aos programadores.

Finalizamos nosso texto incentivando o uso das funções da biblioteca padrão, uma vez que elas permitem uma diminuição considerável do tempo a
ser utilizado no desenvolvimento. Esse processo facilita a portabilidade dos programas.

headset
Podcast
Ouça o podcast. Nele falaremos sobre a aplicação de conceitos de modularidade em programas complexos.

00:00 04:55
speed
1x

Referências
https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 50/51
Referências
24/03/2022 14:34 Linguagem C: funções

DAMAS, L. Linguagem C. 10. ed. Rio de Janeiro: LTC, 2007.


search

SCHILDT, H. C completo e total. São Paulo: Makron Books, 1997.

Explore +
Consulte na internet:

Documentação de referência da Microsoft

• MICROSOFT. Funções (C). Microsoft Ignite. Publicado em: 15 ago. 2021.

b) Manual do GNU C (implementação livre da linguagem C)

• GNU. The GNU C reference manual. Consultado na internet em: 3 nov. 2021.

picture_as_pdf Baixar conteúdo

https://stecine.azureedge.net/repositorio/00212ti/02575/index.html# 51/51

Você também pode gostar