Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

thinkabout

Maior subida em relação ao elemento anterior

Mensagens Recomendadas

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));
}

Editado por thinkabout

Partilhar esta mensagem


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

Partilhar esta mensagem


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

Editado por thinkabout

Partilhar esta mensagem


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

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.