|
Aula 11: Programação Modular I
Funções
|
|
Traduzido por Ana Paula Costa
Até agora estivemos apenas a utilizar coisas que foram fornecidas
pelo C. Aprendemos como escrever ciclos (for, while,
do-while),
como obter input e output (scanf, e printf), como controlar
o fluxo de um programa (if, if-else, switch),
como declarar variáveis, como atribuir valores a constantes (=)
e como calcular álgebra Booleana, mas nunca inventamos nada NOVO.
Com funções podemos fazer exactamente isso.
Já conhecemos algumas funções que são standard
em C, nomeadamente
printf e scanf. Agora vamos definir
as nossas próprias funções.
Funções são pequenos subprogramas ou módulos
do programa principal. Cada um destes módulos executa uma determinada
tarefa. Isto ajuda a organizar o programa e a torná-lo mais lógico
e pode também aumentar a eficiência de programação
evitando repetições de partes do programa. Mais ainda, as
funções permitem copiar facilmente partes do código
para outros programas.
input/output
Módulos (funções) podem ter input e/ou output.
Neste caso, input(entrada) significa aceitar parâmetros, enquanto
output(saída) significa retornar um valor. De notar que, independentemente
do facto da função aceitar parâmetros de entrada ou
não, a função terá sempre parêntesis,
tanto na declaração como na chamada da função,
como veremos mais à frente. Isto serve para distinguir funções
de variáveis.
exemplos |
sem
input
|
com
input
|
sem
output |
abort() |
printf() |
com
output |
rand() |
sqrt() |
abort() pára o programa, rand() retorna um valor
aleatório, sqrt() retorna a raíz quadrada do argumento,
printf()
mostra o argumento no écran.
Funções são como programas dentro de programas.
Elas
-
têm que ter um nome. As regras que se aplicam para nomear identificadores,
aplicam-se para nomear funções. Ver aula 5.
-
podem ter variáveis. Estas têm que ser declaradas na função
e estão acessíveis apenas para a função.
-
têm que ter uma combinação { e }a
indicar o início e o fim da função.
-
(podem) ter instruções.
Um protótipo da declaração de uma função:
tipo nomedafunção(tipo
<parâmetros>)
{
tipo <variáveis>;
instruções;
} |
output (tipo, void, return)
O tipo de valor que a função irá retornar tem
que ser especificado na declaração da função.
Por exemplo
int countnumber();
significa que a função irá retornar um valor do
tipo inteiro.
Algures dentro da função temos que retornar um
valor para o programa que chamou a função. Para fazer isso
utilizamos a instrução return
return <valor>;
por exemplo
return 3;
Quando queremos que a função não retorne nada,
podemos especificar isso com a palavra void:
void showresult();
não irá retornar nada. Assim, funções do
tipo void não precisam da instrução return.
Nota: em alguns compiladores a declaração do tipo do valor
a retornar é opcional. Em alguns compiladores, a ausência
da declaração do tipo significa que a função
é do tipo int, enquanto em outros significa void.
Para aumentar ainda mais a confusão, omitir a instrução
return em alguns compiladores é um erro, enquanto noutros não
é.
Assim sendo: o melhor é seguir as convenções standard
do ANSI C (em cima) e escrever programas independentes do compilador!
main()
De facto, main não é mais do que uma função
normal, com a única diferença de o programa começar
sempre pela primeira instrução desta função.
De resto, main segue todas as regras de funções
descritas antes. Tecnicamente falando, ou temos que especificar o tipo
como void ou retornar algo no fim do programa.
void main()
{
...
} |
int main()
{
...
return 0;
} |
posicionamento/localização
O local para declarar as nossas próprias funções é
antes
da função main. Se forem declaradas depois da função
main não poderemos utilizar as funções dentro de main
porque o compilador não terá conhecimento da sua existência
quando começa a compilar a função main. Uma função
só pode chamar outras funções que tenham sido declaradas
antes (de alguma forma).
|
chamada
Após declarar uma nova função, podemos utilizá-la
no programa principal. A isto designa-se chamada
da função. Para fazer a chamada da função escreve-se
o nome da função. Eis um exemplo completo de um programa
com um único módulo (função) sem parâmetros
de entrada ou saída (void): |
código do programa
#include <stdio.h>
void module1()
{
int y;
printf("Now I am entering Procedure
Module1\n");
printf("Give a value for y\n");
scanf("%d", &y);
printf("%d", 3*y);
// Type of function is void.
// No need to return anything.
}
void main()
{
// The program starts at the first instruction
// of function main:
printf("Starting the program\n");
// now our function will be called:
module1();
} |
output
Starting the program
Now I am entering Procedure Module1
Give a value for y:
4
12
Um programa a chamar uma
das suas funções
|
|
funções a chamar funções
As funções também podem ser chamadas por outras funções.
Vamos ver o programa que se segue e o resultado que gera ao correr: |
código do programa
# include <stdio.h>
void module1()
{
printf(" inside
module 1\n");
printf(" Hello World\n");
printf(" leaving
module 1\n");
}
void module2()
{
printf(" inside module 2\n");
printf(" calling module 1\n");
module1();
printf(" back in module 2\n");
printf(" leaving module 2\n");
}
void main()
{
printf("starting the program\n");
printf("calling module 2\n");
module2();
printf("back in main\n");
printf("ending program");
} |
output
starting the program
calling module 2
inside module 2
calling module 1
inside module 1
Hello World
leaving module 1
back in module 2
leaving module 2
back in main
ending program
Um programa a chamar uma das suas funções
que, por seu lado, está a chamar uma outra função
|
De notar que chamar funções que só são declaradas
depois, como seria no exemplo anterior uma chamada de module2()
feita em module1(), não são permitidas em circunstâncias
normais. main pode chamar module1() e module2(), module2()
pode chamar module1() e module1() não pode chamar
nada.
Teste Rápido:
Para testar os conhecimentos sobre o que aprendeu nesta aula, prima aqui
para fazer um teste on-line. De notar que este Não é
o formato que será utilizado no teste final!
Peter Stallinga. Universidade do Algarve, 5 November
2002