Baixe o app para aproveitar ainda mais
Prévia do material em texto
Objetivos Módulo 1 Linguagem C: funções Profª. Paulo Vidal Descrição 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. Buscar Baixar conteúdo em PDF Vídeos Menu 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 1/62 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 Módulo 3 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 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 2/62 1 Funções: forma geral, valor de retorno, passagem de parâmetros 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. 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. Introdução 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 3/62 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: Escrever funções. 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 4/62 Criar e passar parâmetros. Devolver um valor como resultado de uma função e de�nir variáveis locais. 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 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 5/62 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. 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 Atenção! 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. 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 6/62 dois passos: Passo 1 Declaração do protótipo da função. 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 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 Dica 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 7/62 Os seguintes componentes fazem parte da declaração de uma função: Vejamos um exemplo de declaração de função. Nesse exemplo, a função declarada soma dois números inteiros: Linguagem C Agora, vamos identificar cada um dos elementos do código: Nome da função calcula_soma. Parâmetros 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. Nome da função Tipo da função Parâmetros Corpo da função 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio#8/62 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 dTUTORIAL COPIAR C Input Console 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 9/62 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 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. 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. 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 10/62 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. No programa anterior, o nosso main() passaria a ser: Linguagem C 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: 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. Nome da função A função a ser escrita será linha(); Tipo da função Não tem tipo, isto é, a função não retorna nenhum valor após sua execução; então, coloca-se como void. Exemplo 2 dTUTORIAL COPIAR C 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 11/62 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. 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 Input Console 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 12/62 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 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. Um identi�cador 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 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 13/62 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 O que foi referido anteriormente continua a ser verdade para os parâmetros de uma função que sejam do mesmo tipo. Linguagem C 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: 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 14/62 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 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 Passagem de parâmetros por valor Passagem de parâmetros por referência Atenção! A linguagem C só implementa a passagem de parâmetrospor valor; entretanto, a passagem de parâmetros por referência pode ser simulada. 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 15/62 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: 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. 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. Exemplo 3 dTUTORIAL COPIAR C 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 16/62 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. 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: Input Console 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. 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 17/62 Empregar qualquer instrução ou conjuntos de instruções da linguagem C. Invocar qualquer função, seja ela escrita pelo usuário ou pertencente a uma biblioteca. 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 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 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 18/62 Tipo de retorno é int (inteiro). A palavra reservada int é colocada do lado esquerdo do nome da função. 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. 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 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. 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 19/62 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: 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: Execução Valor de A na função main() Valor de A na função escopo Linha 17 10 ---- Linha 18 10 ---- Linha 19 20 ---- Linha 20 20 ---- Exemplo 4 dTUTORIAL COPIAR C Input Console 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 20/62 Execução Valor de A na função main() Valor de A na função escopo Linha 5 20 -100 Linha 6 20 -100 Linha 21 20 ---- Linha 22 30 ---- Linha 23 30 ---- Linha 11 30 ---- Linha 12 30 ---- Linha 24 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. 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. 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 21/62 Vem que eu te explico! Os vídeos a seguir abordam os assuntos mais relevantes do conteúdo que você acabou de estudar. Módulo 1 - Vem que eu te explico! Objetivos na utilização de funções Módulo 1 - Vem que eu te explico! Escopo de variáveis 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 22/62 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: Vamos praticar alguns conceitos? Falta pouco para atingir seus objetivos. A Resultado = 60 B Resultado = 16 C Resultado = 32 D Resultado = 10 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 23/62 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. 2 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. E Resultado = 8 Responder A Valor de X = 21, Y = 49 Valor de X = 21, Y = 49 B Valor de X = 21, Y = 50 Valor de X = 21, Y = 50 C Valor de X = 20, Y = 50 Valor de X = 20, Y = 50 D Valor de X = 21, Y = 49 Valor de X = 20, Y = 50 E Valor de X = 20, Y = 50 Valor de X = 21, Y = 49 Responder 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 24/62 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 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 25/62 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 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 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 26/62 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 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 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 27/62 de memória. Os ponteiros são declarados com a estrutura sintática a seguir: Linguagem C 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 d d l ã d iá l) O j 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 28/62 Na linguagem C, existe a dualidade vetor/ponteiro. Dessa forma, ao declararmos int vet1[20];, vet1 poderá ser visto como um vetor caso seja sucedido por colchetes ou como ponteiro caso seja grafado sozinho. Dessa maneira, vet1 é um ponteiro para o endereço de memória onde está 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 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 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 29/62 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 possui 9 valores, enquanto a diagonal principal é formada por 3 elementos ( ). Nosso próximo programacalcula a soma da diagonal principal de uma matriz quadrada , utilizando uma função para executar essa tarefa. M3x3 M1,1, M2,2, M3,3 M3x3 Exemplo 1 dTUTORIAL COPIAR C 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 30/62 Vamos à explicação do programa: Input Console 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. 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 31/62 Linha 6 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. Recomendação Retorne ao emulador, altere os valores e faça novos testes. Aproveite a oportunidade para 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 32/62 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, isto é, objetos de dados de tipos distintos acessados pela mesma declaração de variável. O trecho de código adiante exemplifica a declaração de um registro. Em linguagem C, essa abstração é chamada de struct. Linguagem C A semântica dessa declaração é que o registro (struct) pessoa agrega três objetos de dados distintos: Um vetor de caracteres, identi�cado por nome. O inteiro idade. fixar os conceitos abordados e estimular o raciocínio lógico. 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 33/62 O número de ponto �utuante 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 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 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 dTUTORIAL COPIAR C 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 34/62 Vamos à explicação do programa: Input Console Linhas 3 a 8 Definição da struct pessoa com os campos nome, idade e salário. Linha 10 Definição da função exibir(struct pessoa f). Note que a variável f é o parâmetro recebido do tipo pessoa. 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. 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 35/62 Como se pode observar, o tipo a ser colocado no parâmetro da função corresponde ao do argumento que lhe é enviado. 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. Vem que eu te explico! Os vídeos a seguir abordam os assuntos mais relevantes do conteúdo que você acabou de estudar. Módulo 2 - Vem que eu te explico! Passagem de vetores para funções Módulo 2 - Vem que eu te explico! Dualidade vetor/ponteiro 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 36/62 Questão 1 Vamos praticar alguns conceitos? Falta pouco para atingir seus objetivos. 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 37/62 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. 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 -225 B -23 C 20 D 19 E 225 Responder 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 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 38/62 3 Recursividade Ao final deste módulo, você será capaz de aplicar o conceito de recursividade na programação. 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 39/62 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. 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 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 40/62 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. Nesse ponto surge a recursividade: o máximo da sequências2, 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: 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. Passo 1 Passo 2 Passo 3 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 41/62 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. 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. 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 dTUTORIAL COPIAR C 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 42/62 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. Verificamos que o código da função com recursividade (linhas 3 a 8) ficou mais simples que o presente no exemplo anterior. Input Console Exemplo 2 dTUTORIAL COPIAR C Input Console 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 43/62 Lógica de funcionamento de uma chamada recursiva Veremos agora o resultado de se invocar a função fatorial com o valor 4. 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: Linguagem C 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: Passo 1 Passo 2 Passo 3 Passo 4 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 44/62 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. Vem que eu te explico! Os vídeos a seguir abordam os assuntos mais relevantes do conteúdo que você acabou de estudar. Módulo 3 - Vem que eu te explico! Primeiras palavras Módulo 3 - Vem que eu te explico! Recursividade em C Critério de término Chamada recursiva Menos código 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 45/62 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 Vamos praticar alguns conceitos? Falta pouco para atingir seus objetivos. A programação orientada a funções. B recursividade direta. 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 46/62 Questão 2 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. Javascript C lista circular. D recursividade indireta. E lista indireta. Responder A 4 B 128 C 16 D 64 E 32 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 47/62 4 Utilização de biblioteca padrão Ao final deste módulo, você será capaz de selecionar as funções na biblioteca padrão adequadas à solução de um programa. Responder 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 48/62 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: 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. Bibliotecas 1970 A linguagem C tornou-se cada vez mais popular. Diferentes universidades e organizações estavam criando as próprias variações dessa linguagem para seus projetos. 1980 Aumentaram os problemas de compatibilidade por conta dessas diferentes versões. 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 49/62 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. Comentário Existem vantagens e desvantagens em ambas, mas não nos aprofundaremos nessas questões. 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 50/62 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: gui.c Agrupa as funções da interface gráfica. bd.c Agrupa as funções de comunicação com o banco de dados. principal.cCom 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, 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 51/62 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. 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. 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. 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 52/62 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 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. 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 53/62 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 E que o conteúdo de gui.h seja: Linguagem C 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 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 54/62 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: 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: As funções funcionam As funções são otimizadas para desempenho Economiza um tempo considerável de desenvolvimento As funções permitem a portabilidade dos programas 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 55/62 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 >. < math.h > Funções matemáticas. < time.h > Funções de data e hora. Exemplo 1 dTUTORIAL COPIAR C Input Console 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 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 56/62 Pesquisando funções nas bibliotecas ANSI C No vídeo a seguir, demonstraremos como pesquisar e aplicar as funções das bibliotecas ANSI C. Vem que eu te explico! Os vídeos a seguir abordam os assuntos mais relevantes do conteúdo que você acabou de estudar. Módulo 4 - Vem que eu te explico! Bibliotecas Módulo 4 - Vem que eu te explico! Bibliotecas constante. Não desista, você está no caminho certo! 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 57/62 Questão 1 Vamos praticar alguns conceitos? Falta pouco para atingir seus objetivos. 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 58/62 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. 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 As funções disponíveis dificultam a portabilidade dos programas. B Não sabemos se as funções foram criadas com um código eficiente para desempenho máximo, pois não foram realizados testes durante a programação. C A elaboração das especificações das funções da biblioteca não envolve organizações de padronização, apenas universidades 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 A < math.h > B < ctype.h > C < stdio.h > 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 59/62 Considerações �nais 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ódigode 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. Podcast Ouça o podcast. Nele falaremos sobre a aplicação de conceitos de modularidade em programas complexos. D < stdlib.h > E < string.h > Responder 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 60/62 00:00 04:55 1x 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. Referências DAMAS, L. Linguagem C. 10. ed. Rio de Janeiro: LTC, 2007. SCHILDT, H. C completo e total. São Paulo: Makron Books, 1997. Material para download Clique no botão abaixo para fazer o download do conteúdo completo em formato PDF. Download material O que você achou do conteúdo? Relatar problema 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 61/62 https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio javascript:CriaPDF() 02/05/24, 14:36 Linguagem C: funções https://stecine.azureedge.net/repositorio/00212ti/02575/index.html?brand=estacio# 62/62
Compartilhar