• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

jfbr

Ordem decrescente

7 mensagens neste tópico

Boas,

tenho estado a desenvolver o trabalho de gestão de viaturas de uma auto estrada, que já tem sido falado aqui no fórum.

Na parte do excesso de velocidade, vou guardando dados num vector. Acedendo a esse vector com:

int k;
for(k=0;k<n_viaturas;k++){
if(vector_velocidades[k]>=120.00){
printf("%.2f\n",vector_velocidades[k]);
}
}

tenho a seguinte lista:

183.39

199.89

123.63

183.49

185.95

141.29

139.86

169.81

153.19

122.28

153.58

169.01

196.94

161.87

170.45

190.68

166.05

187.21

136.36

171.76

133.63

153.85

161.29

146.70

169.01

154.24

128.30

170.78

165.14

Pensando agora no método para a ordenar da maior para a menor ocorrência, estou na dúvida sobre o método a usar. Pesquisei sobre o bubblesort em C e obtive estes códigos na Wikipedia. http://pt.wikipedia.org/wiki/Bubblesort#C

Como é um método que nunca usei, gostaria de saber se será o mais adequado.. e se será só dar como entrada o meu vector com as velocidades para obter a lista ordenada.

Obrigado desde já.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como o Rui Carlos referiu, se usares o "qsort" da stdlib é muito mais eficiente e simples de programar. No entanto, como não entendes o seu funcionamento, não sei o que será melhor no teu caso..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

.

boas, usando o qsort não estou a obter uma ordenação correcta.

122.28
123.63
128.30
139.86
146.70
153.58
161.87
165.14
169.01
169.01
170.78
183.49
185.95
196.94
199.89
133.63
136.36
141.29
153.19
153.85
154.24
161.29
166.05
169.81
170.45
171.76
183.39
187.21
190.68

usando:

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

.........
..........

qsort (vector_velocidades, n_viaturas, sizeof(int), compare);

como se pode ver chego obtenho 2 "sub listas".. o que estará a causar isto?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque é que usas inteiros nas função compare.

alterando para float, tenho um resultado diferente, mas ainda com algumas entradas trocadas.

alguem me diz porque é usado o parametro sizeof?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A função qsort funciona com qualquer tipo de dados, por isso recebe um void pointer. Assim, necessita de saber o tamanho dos dados que está a manipular, daí o tamanho ser um dos parametros.

Deves ter-te enganado na função de comparação. O valor (inteiro) absoluto devolvido não é relevante. Apenas interessa se devolves um valor negativo ( a < b ) ou não. Por isso podes fazer simplesmente

int compare (const void * a, const void * b)
{
 return ( *(float*)a < *(float*)b ) ? -1 : 1 ;
}

PS: Com isto penso que compreendes que o 3º parametro não é sizeof(int), podes ver uma descrição breve em http://www.cppreference.com/stdother/qsort.html

0

Partilhar esta mensagem


Link 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