Ir para o conteúdo
dramos21

[Resolvido] Duvida Funcoes

Mensagens Recomendadas

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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;
}
}

}

Editado por pmg
Falta LP (e indentacao que nao alterei)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 ??????
   // ...
 }
}

  • Voto 1

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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"

Editado por 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.