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 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).


funny dude calling with big horn

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

main calling a function
Um programa a chamar uma 
das suas funções


two funny dudes calling

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

functions calling functions
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