Encontre o erro em cada um destes segmentos de programa, e explique como ele pode ser corrigido (ver também o Exercício 5.46):a)

int g( void )

{

printf( “Dentro da função g\n” );

int h( void )

{

printf( “Dentro da função h\n” );

}

}

b)

int sum( int x, int y )

{

int result;

result = x + y;

}

c)

int sum( int n )

{

if ( n == 0 ) {

return 0;

else {

n + sum( n - 1 );

}

}

d)

void f( float a );

{

float a;

printf( “%f”, a );}e)void product( void )

{

int a, b, c, result;

printf( “Digite três inteiros: “ )

scanf( “%d%d%d”, &a, &b, &c );

result = a * b * c;

printf( “Resultado é %d”, result );

return result;

}

Passo 1

Saaalve, tranquilo? Vamos lá resolver mais uma questão juntos?!

A coisa mais importante na vida de um programador é procurar erros e saber corrigi-los! Esse exercício pede justamente isso. Uma dica prévia para resolvê-lo: tenha a teoria de função na ponta da língua e analise calmamente linha por linha. Mas chega de enrolação, vamos começar.

a) A gente já começa daquele jeito, com uma função dentro da outra:

Você deve estar se perguntando: “E pode isso?”. NÃO, NÃO PODE! Não desse jeito. Nesse caso, estamos definindo a função h dentro da função g, e isso não tem o mínimo sentido. Isso poderia ser reescrito como:

Nesse caso, veja que declaramos a função g e h separadas. Mas para causar o mesmo efeito, chamamos a função h dentro da g, e depois chamamos a função g() na main. Outro detalhe importante: as funções são do tipo inteiro, mas ambas não estavam retornando nada. Por isso, agora elas retornam um inteiro (com valor verdadeiro, hein?).

Passo 2

b) Analise o seguinte código:

O começo parece correto. Temos uma função chamada sum, do tipo inteiro, e que recebe os valores de x e de y. Daí temos uma variável chamada result ao qual atribuímos o valor de x + y.

Cara, lembra:

A não ser que o tipo da função seja void, ela DEVE retornar algo.

Portanto, o problema dessa função é que ela não retorna nada. Como variáveis gastam muita memória, vamos eliminar a variável result e usar um return no lugar:

Passo 3

c) Nosso trecho da vez está a seguir:

Primeiro, vamos entender o que está acontecendo nesse código. Bom, se a gente bater o olho rapidinho, vê que sum está chamando a si própria, então deve ser uma função recursiva, certo? Bom, aí que mora o problema: para ser uma função recursiva, deveríamos estar retornando n + sum(n-1). Por isso, vamos corrigir o código:

Passo 4

d) A função abaixo é do tipo void. Bom, já sabemos que não é problema com return, haha! Olha só:

Cara, a função a gente põe o código entre chaves. Então aquele ponto e vírgula na linha 1 não tem nada ver. A gente dificilmente vai usar “;” quando usarmos chaves, e mesmo quando acontecer, vai ser logo após o fechamento das chaves, beleza? Além disso, a gente passou float a como parâmetro da função. Então não tem lógica alguma declarar dentro da função, pois estaremos redefinindo float a (nosso código provavelmente não vai nem rodar). O código certinho ficaria desse jeito:

Passo 5

e) Último item! Aqui, a gente tem o seguinte trecho de código:

Galera, temos uma função do tipo void. Então por que eu tô vendo um return na linha 8? Void não retorna nada, esse é o erro do nosso código! Por isso, resolvemos o problema apagando a linha 8:

E foi isso, agora vamos pra próxima! 😊

Resposta

  1. Não podemos declarar uma função dentro de outra.
  2. Faltou a função retornar um valor, faltou o comando return.
  3. A função recursiva deve retornar a si mesma, faltou o comando return.
  4. O “;” não deveria existir e não devemos declarar dentro da função uma variável usada como parâmetro.
  5. Função do tipo void não retorna nada.