Ir para o conteúdo
thinkabout

Ordenador um vector por ordem decrescente

Mensagens Recomendadas

thinkabout

Como posso achar o número menor imediatamente a seguir a outro.

De forma a conseguir escrever os números todos por ordem decrescente.

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

/*
Os elementos de um vector dizem-se ordenados em pirâmide se o seu valor aumentar até
uma certa posição e a partir daí diminuir.Dois possíveis exemplos são:
{1, 2, 4, 5, 6, 3, 2, -23, -23, -120} ou {1, 20, 19, 18, 17, 16, 15, -100, -101, -102}
a) Declare um vector local à função main() com capacidade para armazenar DIM_TAB
números inteiros (sendo DIM_TAB uma constante simbólica);b) Considere que o array declarado na alínea anterior já foi completamente preenchido
com números inteiros ordenados em pirâmide.
Desenvolva uma função que receba o array (e respectiva dimensão) por argumento e escreva no monitor os valores dos
seus elementos, por ordem decrescente.
*/

int maior(int vector[])
{
 int i, maximo=0, posicao=0;
 for(i=0; i<DIM_TAB-1; i++)
 {
   if (vector[i+1]>vector[i])
   {
     maximo=vector[i+1];
     posicao=i+1;
   }
 }
 return (posicao);
}

int main()
{
 int posicao,a,b,i=0;
 int vector [DIM_TAB] = {1, 2, 4, 5, 6, 3, 2, -23, -23, -120};posicao=maior(vector);
 printf("O maior esta na posicao %d \n", posicao); // Neste caso vai ser o 6

}

Editado por Rui Carlos
Indentação.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

para apresentar todos os elementos ordenados (alínea c) terás de ordenar o array

para isso usa um qualquer algoritmo de ordenação


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
thinkabout
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define DIM_TAB 10

void decrescente(int vector[])
{			 
 int j, aux;

    for(j = 1; j < DIM_TAB; j++){

		    while((vector[j] > vector[j - 1]) && (j!=0)) {

				    aux = vector[j];
				    vector[j] = vector[j - 1];
				    vector[j - 1] = aux;
				    j--;   
		    }			  
    }
 for (j = 0; j < DIM_TAB; j++)
 {
  printf(" %d" , vector[j]);
 }
 puts("");
}

int main()
{
int vector [DIM_TAB] = {1, 2, 4, 5, 6, 3, 2, -23, -23, -120};
decrescente(vector);
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

sim senhora, o que fizeste foi implementar o insertion sort

no entanto tens um bug muito bem escondido :D

basta teres o array : {1, 0} e terás acesso inválido da memória, isto porque após a primeira troca, o j terá o valor de 0 e a comparação entre os valores do array com índice j e j-1 será efectuada.

para resolver este problema, efectua a comparação j!=0 antes da comparação que leva ao problema descrito:

//while((vector[j] > vector[j - 1]) && (j!=0)) {
while((j!=0) && (vector[j] > vector[j - 1])) {

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

ando a patinar um bocado nos arrays... espero que atine mais com as strings.

Ehhh laaa, aguenta ai os cavalos.

Percebe os arrays porque as strings sao um caso especial de arrays: uma string nao passa de um array de char em que um dos elementos tem o valor '\0'.

Por exemplo: uma string nao pode crescer alem do espaco que o array reservou.


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
happyZeBra

Boas a todos, eu estava a ter dificuldades tambem neste mesmo exercicio (enunciado igual :P), e tinha quase tudo parecido, mas ha uma coisa que nao estou a perceber bem. O decremento do "j" dentro do while. Sera que alguem me pode esclarecer ?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
cerejas

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

void decrescente(int vector[])
{			
 int j, aux;

	for(j = 1; j < DIM_TAB; j++){

			while((vector[j] > vector[j - 1]) && (j!=0)) {

					aux = vector[j];
					vector[j] = vector[j - 1];
					vector[j - 1] = aux;
					j--;  
			}			  
	}
 for (j = 0; j < DIM_TAB; j++)
 {
  printf(" %d" , vector[j]);
 }
 puts("");
}

int main()
{
int vector [DIM_TAB] = {1, 2, 4, 5, 6, 3, 2, -23, -23, -120};
decrescente(vector);
}

Há alguma resolução mais simples para este exercicio? mais simples de entender?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Há alguma resolução mais simples para este exercicio? mais simples de entender?

percebes isto ?

int comp(void * a, void * b) { return *(int*)b - *(int*)a; }

int main(void) {
 int vector[] = {3, 6, 1, 4, 2}, i;

 qsort(vector, sizeof(int), sizeof(vector), comp);
 for (i = 0; i < sizeof(vector); i++)
   printf("%d\n", vector[i]);

 return 0;
}


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Não é preciso dividir por sizeof(int), ou sou eu que estou a divagar? :D

yep ...

é o que dá escrever código e tomar conta da filha ao mesmo tempo ...


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.