Laboratório de Programação
Estudo Dirigido
Professor Gilzamir Gomes
Funções e Expressões
Um programa em C é composto por uma ou mais funções. Uma função consiste numa sequência de instruções, ou seja, comandos que dizem o que o computador subjacente ao programa deve executar. Uma instrução pode ser composta por uma expressão matemática que produz um valor e por uma expressão que armazena o valor produzido em um local da memória do programa. Por exemplo, na instrução
x = 2 * 4 + 2; (1)
a expressão “2 * 4 + 2” é avaliada e o valor produzido é armazenado no local de memória representado pela letra “x”. Se após a instrução (1), na mesma função, for executada a instrução (2):
x = 2+3; (2)
o valor do local de memória representado por x será alterado de 10 para 5. Por isso, diz-se que x é uma variável. Ou seja, x pode ter seu valor alterado ao longo da execução de um programa. As instruções (1) e (2) são atribuições. Ou seja, atribui-se o valor gerado no lado direito da instrução à variável localizada no lado esquerdo da instrução.
Analise mais cuidadosamente a instrução (1). Em C, uma instrução termina com ponto-e-vírgula. Observe que a instrução (1) manipula valores diretamente especificados em código. Esses são valores literais. Assim, o valor 2 (dois) na instrução (1) é um inteiro. Literais de inteiro são sequências de dígitos decimais, ou seja, valores no intervalo [0,9] que podem ser ou não precedidos por um sinal positivo (+) ou negativo (-). Se o sinal não for especificado, considera-se que o número dado é positivo. Assim, todos os números na instrução (1) são positivos. Símbolos especiais como * e + representam operações que combinam valores para produzirem um valor resultante. O símbolo ‘=’ representa uma instrução de atribuição da linguagem C. Essa instrução diz ao computador para armazenar o valor produzido pela expressão no lado direito do símbolo de atribuição na variável especificada no lado esquerdo do símbolo de atribuição.
Lembre-se, inicialmente dissemos que um programa em C é composto por uma ou mais funções. Além disso, dissemos que uma função consiste em uma ou mais instruções. Foi dito como se escreve uma instrução. Agora é necessário que você aprenda a escrever uma função. A declaração de uma função deve conter o tipo da função, o nome da função e uma lista de parâmetros que representa os dados que a função deve processar. Considere criar uma função chamada main. Ora, main em inglês significa PRINCIPAL. Essa é a função principal do programa no sentido de que a execução do programa inicia nessa função. O exemplo mais simples que se
pode fornecer de um programa em C, é um programa com a função main vazia, como mostra a Figura 1.
Figura 1 main(void){
}
Ora, poder-se-ia perguntar se este é um programa útil. Mas essa não é a questão, a questão é que se trata do menor programa válido que se pode escrever em C. Observe que demos um nome para a função, que é main. Essa função não possui parâmetros, portanto, utilizou-se a palavra void (vazio) para representar uma lista vazia de parâmetros. Antes do nome da função, deve-se especificar o tipo da função, que pode ser inteiro, real, caractere ou void. Os valores manipulados por uma função possuem um tipo. A função manipula valores e produz um valor. O tipo da função determina o tipo de valor que uma função produz. O tipo inteiro (valores inteiros em um determinado intervalo), por exemplo, é representado em C pela palavra int. Em C, quando não se determina o tipo de uma função, a função é considerada inteira. Portanto, a função na Figura 2 é equivalente á função mostrada na Figura 1.
Figura 2 int main(void){
}
A função mostrada na Figura 2 ainda parece incompleta. Ora, é dito que o tipo de uma função determina o valor que a função produz, mas qual valor produz a função main da Figura 2? Mais uma vez nos deparamos com uma regra da linguagem C: quando a função não produz explicitamente algum valor, um valor arbitrário é produzido (o valor retornado depende da implementação da linguagem). A função da Figura 3 torna explicito o valor produzido pela função main.
Figura 3 int main(void){
return 0; }
Observe na Figura 3 o uso da palavra return. Essa palavra é utilizada para determinar o valor produzido por uma função, no caso, a função main produz o valor 0 (zero).
Foi dito que uma função possui uma lista de parâmetros. Cada parâmetro da lista determina um valor que a função pode processar. Aqui é importante voltarmos a falar das variáveis, já que cada parâmetro da lista de parâmetros é uma variável.
As variáveis, como x na instrução (1), representam posições de memória onde um programa ou função pode armazenar valores. Em C, é necessário que o programador defina os tipos das variáveis. Para isso, utiliza-se no início de uma função uma instrução especial chamada
“declaração de variável”. Uma forma simples de declaração de variável consiste em escrever o tipo da variável seguido pelo nome da variável, como mostrado na instrução (3).
Se os tipos das variáveis precisam ser definidos pelos programadores, os valores literais possuem um tipo inferido. Literais de caracteres, por exemplo, estão símbolos entre aspas simples. Na instrução (4) é declarada uma variável capaz de armazenar caracteres, ou seja, uma variável do tipo char.
char letra; (4)
Na instrução (5) é mostrado como se pode atribuir um caractere para a variável letra.
letra = ‘a’; (5)
Portanto, antes que se utilize uma variável, é necessário declarar o seu tipo. O tipo da variável
x na instrução (3) é inteiro, representado pela palavra int. O tipo de uma variável determina
um conjunto de valores que uma variável pode armazenar. De uma forma mais ampla, um tipo de dado em uma linguagem de programação determina um conjunto de valores (valores em um determinado intervalo) e um conjunto de operações que podem ser aplicadas a estes valores. Por exemplo, em ambientes de 32 bits, uma variável do tipo int pode armazenar qualquer valor no intervalo que vai de a . Além disso, operações aritméticas e de comparação podem ser aplicadas aos valores do tipo int. A Figura 4 mostra uma função main contendo duas instruções: uma declaração de variável e a instrução (1).
Figura 4 int main(void){ int x; x = 2 * 4 + 2; return x; }
Observe na Figura 4 que o valor produzido pela função main (ou valor retornado pela função
main) é igual ao valor armazenado na variável x. O valor gerado por uma função pode ser
resultado da avaliação de uma ou mais expressões.
Podemos agora repensar sobre a definição de um programa em C. Foi dito que um programa em C consiste em um conjunto de funções. Contudo, pode-se dizer que um programa em C é mais do que isso: é um conjunto de funções que potencialmente se comunicam entre si! Uma função pode executar outra função e receber o valor produzido por essa outra função. Além disso, quando uma função A chama uma função B, a função A pode passar valores para a função B. Esses valores são chamados de argumentos. Os valores de argumentos são armazenados nos parâmetros que a função chamada possui. Por exemplo, considere uma função soma do tipo int que recebe dois valores inteiros e produz (ou retorna) a soma dos dois valores recebidos. Na Figura 5, a função main executa a função soma passando dois valores (2 e 3) e retorna o produto de 2 pelo valor produzido pela função soma. Observe ainda na Figura 5 que a função soma possui uma lista de parâmetros do tipo inteiro e que a lista de parâmetros consiste em uma sequência de declarações de variáveis separadas por virgula e entre parênteses.
Figura 5 int soma(int x, int y){
int res = x + y; return res; } int main(void){ int z; z = soma(2, 3); return z; }
Se uma função pode executar outra função. Mas quem executa a primeira função no programa? E qual a primeira função executada em um programa? Pense um pouco para responder estas questões.
Apesar da função main ser a primeira função a ser executada no contexto de um programa em C, ela não é a única função executada em um programa. A função main pode executar outras funções, que podem executar outras funções, e assim por diante.
Funções Pré-definidas
As implementações da linguagem C disponibilizam bibliotecas padrões de funções, ou seja, funções que devem estar presentes em qualquer implementação da linguagem C ANSI. Essas funções executam tarefas rotineiras, facilitando o trabalho do programador. Há funções de entrada e saída de dados, funções matemáticas, funções de manipulação de caracteres, entre outras.
As funções mais utilizadas inicialmente são as funções de entrada e saída. Estas funções estão na biblioteca padrão de entrada e saída, referenciada como STDIO (STanDard Input/Output). Para adicionar funções de uma biblioteca em um programa, utiliza-se a diretiva include, como mostra o seguinte exemplo para adicionar a biblioteca STDIO em um programa:
#include <stdio.h>
Diretivas de pré-processamento especificam tarefas que devem ser executadas antes da compilação do programa-fonte. O programa que executa estas tarefas é denominado de pré- processador. A diretiva include é de pré-processamento. No pré-processamento de uma diretiva include, declarações de funções no arquivo da biblioteca são adicionadas no arquivo do programa-fonte. Assim, as funções da biblioteca ficam visíveis no programa-fonte.
Uma função presente no arquivo stdio.h é a função printf. Esta função permite o envio de dados à saída padrão. A função printf já foi implementada por alguém, o que precisamos saber é como utilizá-la. A função printf trabalha com strings, que são sequências de caracteres. A linguagem C suporta literais de strings, mesmo não havendo um tipo básico string. Literais de
printf(“Linguagem C”);
envia para a saída padrão o texto “Linguagem C”. Ou seja, como a saída padrão é o vídeo, será mostrado no monitor o texto “Linguagem C”.
A função printf recebe um ou mais argumentos. O primeiro argumento é uma string que contém a mensagem a ser enviada para a saída padrão. Essa mensagem se parece com um template que possui valores constantes e lacunas que devem ser preenchidas com o valor de variáveis. A Figura 6 ilustra um exemplo mais interessante sobre a função printf. Observe que alguns caracteres não possuem representação visual, como a quebra de linha. Estes caracteres são representados por meio de um código que inicia com barra invertida (\). Por exemplo, o caractere de quebra de linha é representado como ‘\n’. Literais e caracteres em C são colocados entre aspas simples.
Figura 6 int soma(int x, int y){
int res = x + y; return res; } int main(void){ int z; z = soma(2, 3); printf(“Soma = %d\n”, z); return z; }
ATIVIDADES
1. Escreva uma função em C com o nome tabuada e que imprime a tabuada da soma do número 9. Utilize a função soma (mostrada na Figura 6). Escreva um programa em C que utiliza a função tabuada. A saída do programa deve ter o seguinte formato:
9+0=9 9+1=10 9+2=11 9+3=12 9+4=13 9+5=14 9+6=15 9+7=16 9+8=17 9+9=18
2. Escreva uma função como nome serie em C que recebe um valor inteiro i e produz o valor inteiro . Escreva um programa para testar essa função. O que
3. A função main é executada pelo sistema subjacente. Quando o usuário executa um programa escrito em C, geralmente o sistema operacional executa a função main do programa. A função main produz um valor. Como este valor produzido pela função main pode ser recuperado em um sistema operacional GNU/Linux?
4. Escreva a função charCode em C que recebe um caractere e retorna o código (número inteiro) que representa esse caractere na tabela ASCII. Faça um programa para testar a função charCode, que deve imprimir o código ASCII dos caracteres de quebra de linha e espaço em branco.
5. Escreva um programa em C que imprime os seguintes padrões: a. * * * ** * * **** * * b. ********* * ******** * *********