Jump to content
dramos21

[Resolvido] Duvida Funcoes

Recommended Posts

dramos21

Boas pessoal,

Eu criei uma função que me devolvesse o valor -1 0 ou 1 conforme uma condição que eu impus.

fiz um ciclo for e percorri um vector para ver se imprimia -1 0 ou 1.

só que quando eu faço return do -1 0 ou 1 dentro do for e dentro dos if que utilizei para as condicoes, a funcao no fim diz-me que me falta o return, porque eu apenas meti return dentro do for.

Share this post


Link to post
Share on other sites
dramos21
int comparaZero( double x[])
{
int i;
for(i=0; i <= DIMX; i++){
if(x[i]<DELTA && x[i]>-DELTA){
return 0;
}
if(x[i] >= DELTA){
return 1;
}
if(x[i] <= -DELTA){
return -1;
}
}

}

Edited by pmg
Falta LP (e indentacao que nao alterei)

Share this post


Link to post
Share on other sites
pmg

O teu compilador esta a avisar-te que pode haver situacoes que o codigo chega ao fim da funcao sem passar por um return.

Para o teu programa ser correcto tambem nessas situacoes, precisa de um return fora do ciclo:

int comparaZero(double *x) {
   for (...) {
   }
   return 0; /* ESTE RETURN PODE SER NECESSARIO */
}


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
dramos21

mas esse return 0 depois do for nao vai fazer com que os outros return que meti em cada if sejam esquecidos?

Share this post


Link to post
Share on other sites
pmg

mas esse return 0 depois do for nao vai fazer com que os outros return que meti em cada if sejam esquecidos?

Nao. Se o programa executar um return anterior sai da funcao nesse momento e, claro, nao executa mais nenhuma instrucao dessa funcao.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
HappyHippyHippo

int comparaZero( double x[])
{
 int i;

 for(i=0; i <= DIMX; i++)
 {
   if(x[i]<DELTA && x[i]>-DELTA){
     return 0;
   }
   if(x[i] >= DELTA){
     return 1;
   }
   if(x[i] <= -DELTA){
     return -1;
   }
 }

 // tu sabes que x[i] cairá sempre dentro das comparações apresentadas
 // é obvio que x ou está em ]-inf, -DELTA] ou em ]-DELTA, DELTA[ ou em [DELTA, inf[
 // mas o compilador não devido à maneira como os ifs estão encadiados
 // logo necessitas de um return aqui
}

mas o teu código tem um erro muito pior. imagina este caso:

int comparaZero( double x[]);

#define DELTA 2
#define DIMX 3

int main()
{
 int x[DIMX] = {1, 2, 3};
 comparaZero(x);
 return 0;
}

int comparaZero( double x[])
{
 int i;

//            v-  menor !!!
 for(i=0; i < DIMX; i++)          // ok, 0 é menor que DIMX
 {
   if(x[i]<DELTA && x[i]>-DELTA){ // ok, x[i] == 1 está dentro de ]-DELTA, DELTA[ == ]-2, 2[
     return 0;                    // return ... e então os outros elementos do array ??????
   // ...
 }
}

  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
dramos21

ou seja, o que tu estás a dizer é que a função termina sem executar o for completo? a função retorna o valor para o meu primeiro x e é como se a função estivesse finalizada?

Share this post


Link to post
Share on other sites
pmg

E tens ainda outro problema.

Supondo que o array foi definido como tendo DIMX elementos, estas a aceder a elementos inexistentes do array.

Um array definido com 5 elementos pode ser indexado pelos indices 0, 1, 2, 3, e 4.

O teu ciclo for, para o exemplo de 5 elementos, iria passar pelos indices 0, 1, 2, 3, 4, e 5.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
dramos21

Tens razão. já mudei isso, agora o resto é que nao estou a ver como fazer, eu tenho sempre de ter o return ali acho eu, e se atinge o return acaba a funcao e nao me calcula nada para os outros elementos do array

Share this post


Link to post
Share on other sites
pmg

Sugestao: faz uma outra funcao que conte quantos elementos sao "iguais" a zero :-)


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
dramos21

entao e para aqueles que quero que seja 1 e -1? o intuito disto é eu fazer um grafico em que apresente os valores de um polinomio nos pontos 1 a 20, e em cada ponto dizer se o valor do polinomio é positivo(1) nulo(0) ou negativo(-1). mas por exemplo eu ao fazer essa funcao nao me vou deparar com o mesmo problema? visto que eu quero avaliar cada ponto do vector

Share this post


Link to post
Share on other sites
pmg

Ah! Sorry: a minha sugestao nao serve :/

Em vez de returnares, mete o resultado noutro array com o sinal do valor ... depois usas este outro array para apresentar o resultado.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
dramos21

mas depois, eu tenho que fazer o gráfico com os pontos de 1 a 20, e imagina que eu tenho um array com os pontos 1 7 e 20 negativos(-1), como é que eu vou conseguir ordenar o meu gráfico de modo a me apresentar os valores correctos? eu posso fazer é em vez de a função ser double x[] ser apenas double x. para cada ponto avalia e aí já consigo guardar. o problema agora é que eu quero os pontos de 1 a 20 sem ter de estar a introduzir 1 a 1 :/

sendo cada valor double obrigatoriamente. nao da para fazer um for

Share this post


Link to post
Share on other sites
pmg

int resultado[WHATEVER];
double value[WHATEVER];
for (int i = 0; i < WHATEVER; i++) value[i] = 5*i*i*i - 42*i*i + 5; /* 5i^3 - 42i^2 + 5 */
/* agora precisamos dos resultados */


/* valor a valor */
for (int i = 0; i < WHATEVER; i++) resultado[i] = comparaZero(valor[i]);

/* tudo duma vez */
comparaZeroTotal(WHATEVER, valor, resultado);

E a funcao comparaZeroTotal() ia ver os valores ao array "valor" e meter o resultado no array "resultado"

Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
dramos21

certo, entendi o código, o comparaZero( valor ) nao tinha que ser feito da mesma maneira de á bocado dando aquele erro? valor é um array com Whatever tamanho, e na funcao para aceder a cada valor tinha de ser com um ciclo, ou meteste doutra maneira ali e eu nao percebi? eu percebo que tentas que ele va buscar sempre o valor do comparaZero para cada posição, mas na função tambem temos de chamar o vector, nao da para chamar um a um mesmo com um ciclo na main nao e?

Share this post


Link to post
Share on other sites
pmg

o comparaZero( valor ) nao tinha que ser feito da mesma maneira de á bocado dando aquele erro?

Sim, mais ou menos. Nao seria preciso fazer um ciclo dentro da funcao (o ciclo esta ca fora, na parte do programa que chama a funcao WHATEVER vezes).

valor é um array com Whatever tamanho, e na funcao para aceder a cada valor tinha de ser com um ciclo, ou meteste doutra maneira ali e eu nao percebi? eu percebo que tentas que ele va buscar sempre o valor do comparaZero para cada posição, mas na função tambem temos de chamar o vector, nao da para chamar um a um mesmo com um ciclo na main nao e?

Nao percebi.

Mas tens sempre de ter um (e apenas um) ciclo for. Ou o tens na funcao main(), ou o tens na funcao comparaZero().

Se tens o ciclo for na funcao main(), a funcao recebe um valor e devolve um resultado;

se tens o ciclo na funcao comparaZero(), a funcao deve receber um tamanho, um array de input (em forma de ponteiro) e um array de output (em forma de ponteiro) nao necessariamente nesta ordem.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
dramos21

o que me estás a dizer é que :

int comparaZero( double x ) pode ser utlizado assim desta maneira sendo x um valor e nao um array se eu na main fizer um for em que nesse for chame a funcao com comparaZero( valor ) é isso? porque neste caso valor vai ser tambem um valor e nao um array de elementos certo?

Share this post


Link to post
Share on other sites
pmg

o que me estás a dizer é que :

int comparaZero( double x ) pode ser utlizado assim desta maneira sendo x um valor e nao um array se eu na main fizer um for em que nesse for chame a funcao com comparaZero( valor ) é isso? porque neste caso valor vai ser tambem um valor e nao um array de elementos certo?

Correcto.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.