Jump to content

[Resolvido] Duvida Funcoes


dramos21

Recommended Posts

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.

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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
Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.