Várias bibliotecas acompanham os ambientes de desenvolvimento em linguagem C, como é o caso do CodeBlocks, do DevC++, entre outros. 1Uma dica que pode lhe poupar tempo é, sempre que se deparar com a necessidade de executar um conjunto de instruções para realizar uma operação que refere-se a uma necessidade comum de outros usuários, investigue se já existe uma função antes de tentar implementar a sua.
7.2.1
Funções matemáticas
A biblioteca math disponibiliza várias funções matemáticas, como funções trigonomé- tricas para o cálculo do cosseno, função cos, função para cálculo de logaritmo, como a função log, entre outras, contudo, apenas duas funções serão discutidas, a função para cálculo de raiz quadrada, sqrt() e a função para cálculo de potência, pow(x, y).
7.2.1.1 Função para cálculo da raiz quadrada
Como já mencionado, não há um operador nativo na linguagem C que permita calcular a raiz quadrada de um número, contudo, podemos utilizar a função, sqrt(), disponibili- zada pela biblioteca math para fazer este cálculo (SCHILDT,1996). A seguir a sintaxe da função sqrt().
1 //Sintaxe:
2 #include <math.h>
3 double sqrt(double num);
7.2. Funções presentes na linguagem C 113
Conforme pode ser visto na sintaxe, a função retorna um double, que no caso será o resultado do cálculo da raiz quadrada do número que foi passado como argumento na invocação da função. O número passado como argumento também é do tipo double, contudo, tanto o retorno, quanto o argumento podem ser do tipo float, visto que um
double pode assumir valores do tipo float. Veja a seguir um exemplo em forma de
exercício.
7.2.2
Exercício de Exemplo
Faça um programa em C que leia um número e após a leitura, calcule e imprima a raiz quadrada deste número.
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 5 void main() 6 {
7 float numero, raiz;
8 printf("Informe um numero: \n");
9 scanf("%f", &numero);
10
11 raiz = sqrt(numero);
12
13 printf("A raiz quadrada do numero e: %f \n", raiz);
14 }
Na resposta proposta para o exercício foi adicionada a biblioteca math na linha 3, sempre que precisar utilizar uma função de alguma biblioteca, será necessário adicionar o arquivo cabeçalho correspondente no início do código. Na linha 7 foram declaradas as variáveis numero, para armazenar o número lido, e raiz para armazenar o resultado do cálculo da raiz quadrada. As linhas 8 e 9 são responsáveis pela leitura do número. A linha 11 é o ponto de interesse neste exercício, veja que a variável raiz recebe a função
sqrt(numero), isso, porque a função sqrt() retorna um valor e requer um argumento,
desta forma, a função irá calcular a raiz quadrada do número passado como argumento e retornar à instrução que a invocou o resultado do cálculo, neste caso, a atribuição à variável raiz é que foi responsável pela invocação da função.
7.2.2.1 Função para cálculo da potência
A função para cálculo da potência, pow(), requer dois argumentos conforme pode ser visto na sintaxe a seguir. O primeiro argumento é a base, ou seja, o número que deseja-se que seja calculado a sua potência, e o segundo argumento é o expoente, que é o valor no qual, o número da base será elevado (SCHILDT,1996). Assim como na função sqrt(), a função pow() também retorna um double, no caso, o valor calculado, e também admite valores do tipo float. Veja na sequência um exercício de exemplo do uso da função pow().
1 //Sintaxe:
2 #include <math.h>
114 Aula 7. Funções
7.2.3
Exercício de Exemplo
Faça um programa em C que leia um número e um expoente, após a leitura, calcule e imprima a potência do número lido em relação ao expoente também lido.
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 5 void main() 6 {
7 float base, expoente, potencia;
8 printf("Informe a base: \n");
9 scanf("%f", &base);
10 printf("Informe o expoente: \n");
11 scanf("%f", &expoente);
12
13 potencia = pow(base, expoente);
14
15 printf("A potencia do numero e: %f \n", potencia);
16 }
Assim como no exemplo anterior, a biblioteca math foi incluída na linha 3. Na linha 7 foram declaradas as variáveis necessárias, base, para armazenar o número que será elevado a uma potência, expoente, que será utilizada para armazenar a potência desejada e potencia para armazenar o resultado do cálculo. Entre as linhas 8 e 11 os valores foram lidos e armazenados nas respectivas variáveis. Na linha 13 temos o uso da função pow(), veja que, o acionamento da função foi realizado pela uso da atribuição à variável potencia, e a função recebeu dois argumentos, o primeiro argumento é o valor da base e o segundo argumento é o valor do expoente. Com esses dois valores a função retornará o resultado do cálculo que será atribuído à variável potencia. Na linha 15 a função printf() se encarrega de apresentar o resultado do cálculo.
7.2.4
Funções de tratamento de texto
A linguagem C não dispõe, nativamente, do tipo string, como é comum em outras linguagens, desta forma, para armazenar texto, é preciso utilizar um vetor do tipo char, como se trata de um vetor, então, algumas operações não são possíveis de forma direta, como é possível com outros tipos nativos. Duas operações em especial são as de maior uso, atribuição e comparação. A seguir serão discutidas duas funções da biblioteca
string que facilitam essas tarefas.
7.2.4.1 Função para atribuição de texto
1 void main()
2 {
3 char nome[30], novoNome[30];
4 nome = novoNome;
5 .
6 .
7.2. Funções presentes na linguagem C 115
Em linguagem C, a operação na linha 4 do código-fonte apresentado neste início de tópico não é permitida, porque como nome e novoNome são dois vetores, não há como garantir, por exemplo, que os dois vetores tenham a mesma dimensão, ou que as dimensões sejam compatíveis, então, não é possível fazer a atribuição direta, como na linha 4 do trecho de código à seguir. É necessário então, percorrer o vetor de origem e, a cada posição, atribuir o valor ao vetor de destino, contudo, várias validações devem ser previamente realizadas, como a compatibilidade de tamanho entre os vetores.
Realizar essas operações requer um bom trabalho, além disso, trata-se de uma operação recorrente em programação, desta forma, é conveniente ter uma função que facilite esta operação. A biblioteca string disponibiliza a função strcpy() que faz a atribuição de um vetor do tipo char a outro vetor, também do tipo char. Além disso, faz as verificações necessárias, lançando as exceções quando for o caso. A seguir a sintaxe da função e um exemplo de uso.
1 //Sintaxe:
2 #include <string.h>
3 char *strcpy(char *str1, const char *str2);
Como pode-se ver na sintaxe, a biblioteca string.h deve ser incluída no código-fonte. Outro detalhe é que a função strcpy() recebe dois parâmetros, o primeiro, str1, é o vetor que receberá os valores do segundo vetor, que no caso é o segundo argumento, str2, ambos os argumentos devem ser do tipo char (SCHILDT,1996). Como a função recebe como argumento os dois vetores envolvidos na operação, então não há necessidade da atribuição tradicional, como pode ser visto no exemplo a seguir, na linha 11, a função é invocada com os dois argumentos necessários e ela se encarregará de fazer o restante do trabalho. 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 void main() 6 {
7 char nome[30], novoNome[30];
8 printf("Informe o novo nome: \n");
9 scanf("%s", &novoNome);
10
11 strcpy(nome, novoNome);
12
13 printf("O novo nome e: %s \n", nome);
14 }
7.2.4.2 Função para comparação de texto
Comparar texto de forma direta, por exemplo, utilizando o sinal de igualdade, é outra ação indisponível na linguagem C, pois, novamente, o uso de vetores, impede isso, visto que, comparar dois vetores, implica em analisar cada posição comparando com a posição correspondente do outro vetor e novamente, é uma operação recorrente que demanda uma função para isso, desta forma, a biblioteca string disponibiliza uma função para facilitar essa operação, strcmp(), que faz a comparação entre dois vetores devolvendo um inteiro 0 (zero), caso os dois textos sejam iguais e diferente de zero, no caso contrário (SCHILDT,1996). Veja a seguir a sintaxe:
116 Aula 7. Funções
1 //Sintaxe:
2 #include <string.h>
3 int strcmp(const char *str1, const char *str2);
A biblioteca string.h deve ser incluída para uso da função strcmp(). Veja que a função retorna um inteiro, se o retorno é igual a 0 (zero), os dois textos são iguais, se é
diferente de 0 (zero), os dois textos são diferentes. O primeiro argumento informado é
o primeiro vetor do tipo char que pretende-se comparar e o segundo argumento é o vetor a ser comparado com o primeiro. Veja a seguir um exemplo de uso da função.
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 void main() 6 {
7 char nome[30]={'t','e','s','t','e'}, novoNome[30];
8 printf("Informe o novo nome: \n");
9 scanf("%s", &novoNome);
10
11 //if (nome == novoNome) -- nao funciona!
12 if (strcmp(nome, novoNome) == 0)
13 printf("Os nomes sao iguais! \n");
14 else
15 printf("Os nomes sao diferentes! \n");
16 }
Na linha 3 do exemplo, a biblioteca string.h é incluída ao código-fonte. Veja o código comentado na linha 11, note que trata-se da comparação na forma tradicional, contudo esse código não funciona, pois nome e novoNome são vetores, assim, na linha 12 foi utilizada a função strcmp() para fazer a comparação, então o retorno da função é comparado com 0, se a condição retornar verdadeiro, a linha 13 será executada, se retornar falso, então a linha 15 será executada.