Jump to content
thinkabout

Maior subida em relação ao elemento anterior

Recommended Posts

thinkabout

Boas,

Já consegui calcular a maior subida, mas não estou a ver como vou buscar a posição.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#define TAM 10


/*
Desenvolva um função que determine em que posição de uma tabela de inteiros se encontra o
elemento que regista a maior subida em relação ao elemento anterior.
Esta posição deve ser devolvida como resultado.
A função recebe como argumentos um ponteiro para o início da tabela
e o número de elementos que esta contém.
A sua declaração é a seguinte:
int maior_subida(int *tab, int dim);
*/
int maior_subida(int *tab, int tam)
{
int i,pos=0, maiorincremento=0;
int maiorsubida[TAM];

for (i = 0; i < tam; i++)
{
 maiorsubida[i] = abs(tab[i] - tab[i+1]); // Criar um novo vector com as diferenças (subidas)
}

for (i = 0; i < tam-1; i++)
{
 // printf("%d \n" , maiorsubida[i]); //Debug novo array */
 if (maiorsubida[i] > maiorincremento)
 {
 maiorincremento = maiorsubida[i] ;
 }
}
// printf("o maior incremento foi de %d valores e esta na posicao %d \n" ,maiorincremento, pos);

return maiorsubida[i]; <-- Asneira... 
}
int main()
{					  
int tab[TAM] = {2,3,37,5,1,10,9,7,1,12};
printf("O maior subida foi na posicao %d \n", maior_subida(tab, TAM));
}

Edited by thinkabout

Share this post


Link to post
Share on other sites
HappyHippyHippo

só necessitas de um único ciclo e o uso de um array auxiliar, é completamente desnecessário.

- assinalar que a maior subida é de valor zero
- assinalar que o índice é o primeiro (zero)
- para cada elemento do array excepto o primeiro
 - se a diferença entre o elemento iterado e o anterior for maior que o valor guardado como a maior subida
      # o uso da função abs, irá resultar que a maior descida será também contabilizada, logo não deve ser usada
   - guardar o índice actual
   - guardar a diferença calculada

agora, para se poder "retornar" mais do que um valor de uma função, ou usas uma estrutura como resultado, ou o mais simples e prático é o uso de ponteiros como argumentos da função para se guardar a informação em variáveis externas da função


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

Share this post


Link to post
Share on other sites
thinkabout

Vi agora a tua mensagem, vou ver se afino isto, apesar de já estar a trabalhar.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define TAM 10

int maior_subida(int *tab, int tam)
{
int i,j=0,pos=0, maiorincremento=0;
int maiorsubida[TAM];

for (i = 0; i < tam; i++)
{
 maiorsubida[i] = (tab[i+1] - tab[i]); // Criar um novo vector com as diferenças (subidas)
}

for (i = 0; i < tam-1; i++)
{
 // printf("%d \n" , maiorsubida[i]); //Debug novo array */
 if (maiorsubida[i] > maiorincremento)
 {
 maiorincremento = maiorsubida[i] ;
 }
}
for (i = 0; i < tam-1; i++)
{

 while ( maiorincremento != maiorsubida[j]  )
{
 pos++;
 j++;
}
}
return pos;
}

int main()
{					  
int tab[TAM] = {5,2,2,5,1,55,9,7,1,27};
printf("O maior subida foi na posicao %d para a posicao %d \n", maior_subida(tab, TAM), (maior_subida(tab,TAM)+1));
}

Edited by thinkabout

Share this post


Link to post
Share on other sites
HappyHippyHippo

ora bem, deixa ca ver se percebi o teu código

- crias um array com as diferenças entre os elementos

- uma ciclo para verificar qual o valor da maior subida

- um ciclo dentro de um ciclo que não sei bem para que ...

xi ...

olha bem para os teus ciclos: tens 10 elementos, deverias fazer 9 comparações, o que não estás a fazer

e que tal resolver assim:

int maior_subida(int * list, size_t size, size_t * index, int * val)
{
 int i, result = 0;

 *index = 0;
 *val = 0;

 for (i = 1; i < size; i++)
 {
   if (list[i] - list[i - 1] > *val)
   {
     *index = i;
     *val = list[i] - list[i - 1];
     result = 1;
   }
 }

 // PRONTOS !!!

 return result;
}

int main()
{
 int list[] = {5,2,2,5,1,55,9,7,1,27};
 size_t index;
 int val;

 if (maior_subida(list, sizeof (list) / sizeof (int), &index, &val))
 {
   printf("O maior subida foi de %ld na posicao %d para a posicao %d \n", val, index - 1, index);
 }
 else
 {
   printf("Nao foram encontradas nenhumas subidas no array\n");
 }

 return 0;
}


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

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.