Funções

Objetivo

Exemplo

Uma função que calcula a média aritmética de dois valores:

float media(float a, float b)
{ 
   float m = (a + b) / 2.0;
   return m;
}

Corpo da função

O corpo da função está delimitado entre chavetas:

{
   float m = (a + b) / 2.0;
   return m;
}

Invocação da função

Um expressão: identificador(arg1, arg2, ...)


Fluxo de execução

    z = media(x*0.5, y+1);
    printf("%f\n", media(x*0.5,y+1));

Exemplo: calcular médias

Vamos escrever um programa que lê três números e calcula as médias dois a dois.

Introduza 3 números: 3.5 9.6 10.2
Médias
3.5 e 9.6: 6.55
9.6 e 10.2: 9.9
3.5 e 10.2: 6.85

#include <stdio.h>

float media(float a, float b) {
  float m = (a + b)/2;
  return m;
}

int main(void) {
  float x, y, z;
  printf("Introduza 3 números: ");
  scanf("%f %f %f", &x, &y, &z);
  printf("Médias\n");
  printf("%f e %f: %f\n", x, y, media(x,y));
  printf("%f e %f: %f\n", y, z, media(y,z));
  printf("%f e %f: %f\n", x, z, media(x,z));
  return 0;
}

Declarações e definições

    float media(float, float);

Exemplo

float media(float, float); // protótipo

int main(void) {
 ...
 printf(..., x, y, media(x,y));   // uso
 ...
 return 0;
 }

float media(float a, float b) {  // definição
   m = (a + b)/2.0;
   return m;
}

Funções sem valor de retorno

Exemplo

void print_time(int n)
{
  printf("T minus %d and counting\n", n);
}

int main(void) {
    print_time(3);
    print_time(2);
    print_time(1);
    return 0;
}

Instrução return

  return 0;
  return n;
  return (x + y) / 2.0;

Instrução return

Podemos usar return para terminar a execução da função a meio do corpo.

int max(int a, int b)
{
   if(a >= b)
       return a;  // termina imediatamente
           
   // se a execução chegar a este ponto,
   // então a < b; logo o máximo é b
   return b;
}

Instrução return

void print_time(int n)
{
    if (n < 0)
        return;   // terminar imediatemente
    printf("T minus %d and counting\n", n);
}

Quando usar múltiplos return

Passagem de argumentos

Exemplo 1

// máximo de 2 valores
// NB: modifica o primeiro argumento
int max(int a, int b) {
    if (b > a)
        a = b;
    return a;
}

int main(void) {
   int x = 1, y = 2;
   printf("%d\n", max(x,y)); // imprime 2
   printf("%d %d\n", x, y); // imprime 1, 2
   return 0;
}

Exemplo 2

// Tenta trocar os valores de a, b;
// não funciona porque a,b são temporários
void trocar(int a, int b) {
   int t;
   t = a;
   a = b;
   b = t;
}

int main(void) {
   int x = 1, y= 2;
   trocar(x, y);  
   printf("%d %d\n", x, y); // imprime 1, 2
   return 0;
}

Decomposição funcional

Exemplo: imprimir algarismos

Escrever um programa que imprime os algarismos das dezenas e unidades de um inteiro até 99.

Exemplos de execução:

12
um dois 

78
sete oito 

7
zero sete

Sub-problema

Dado o valor de um algarismo de 0–9, imprimir o texto correspondente em português:

0 "zero"
1 "um"
2 "dois"
3 "três"
4 "quatro"
5 "cinco"
6 "seis"
7 "sete"
8 "oito"
9 "nove"

Função auxiliar

Vamos definir uma função auxiliar:

void imprime_algarismo(int a);

A definição da função é longa mas simples: uma sequência de condições if em cascata.

Função auxiliar

void imprime_algarismo(int a) {
  if (a == 0)
    printf("zero");
  else if (a == 1)
    printf("um");
  else if (a == 2)
    printf("dois");
  else if (a == 3)
    printf("três");
  else if (a == 4)
    printf("quatro");

(continua no slide seguinte)


(continuação do slide anterior)

  else if (a == 5)
    printf("cinco");
  else if (a == 6)
    printf("seis");
  else if (a == 7)
    printf("sete");
  else if (a == 8)
    printf("oito");
  else if(a == 9)
    printf("nove");
  else 
    printf("algarismo inválido!");
}

Solução do problema original

Função principal

int main(void) {
  int n, d, u;
  scanf("%d", &n);
  if (!(n>=0 && n<=99)) {
     printf("número inválido\n");
     return -1;  // erro
  }
  u = n % 10;  // unidades (0..9)
  d = n / 10;  // dezenas (0..9)
  imprime_algarismo(d); printf(" ");
  imprime_algarismo(u); printf("\n");
  return 0;      // OK
}

Observações

Conclusão

A decomposição em funções permitiu: