Ordenação de Números Crescente e Decrescente
Olá !
Venho aqui pedir gentilmente o auxílio de alguém, na seguinte questão;
Criei um programinha que o usuário digita números e esses números digitados vão para uma LISTBOX NÚMEROS ADICIONADOS,após o usuário terminar de digitar esses valores ele , seleciona nos radiobuttons [Crescente ou Decrescente] e aperta no botão ordenar, os números apareceram na LISTBOX ORDENADOS, fiz a parte do crescente e acabei me perdendo,quando digito os valores, seleciono o crescente e aperto ordenar, ele me gera uma lista imensa na listbox, já não sei mais, como fazer, até mesmo para prosseguir fazendo a parte do decrescente, abaixo segue o código e a imagem do programa.
Imagem
[img]http://i.imgur.com/wmkh7Uj.jpg[/img]
Se alguém puder me ajudar, agradeço desde já !
Venho aqui pedir gentilmente o auxílio de alguém, na seguinte questão;
Criei um programinha que o usuário digita números e esses números digitados vão para uma LISTBOX NÚMEROS ADICIONADOS,após o usuário terminar de digitar esses valores ele , seleciona nos radiobuttons [Crescente ou Decrescente] e aperta no botão ordenar, os números apareceram na LISTBOX ORDENADOS, fiz a parte do crescente e acabei me perdendo,quando digito os valores, seleciono o crescente e aperto ordenar, ele me gera uma lista imensa na listbox, já não sei mais, como fazer, até mesmo para prosseguir fazendo a parte do decrescente, abaixo segue o código e a imagem do programa.
var
frmordenar: Tfrmordenar;
aux_array : integer; {Variável Auxiliar do Array}
numeros : array [1..10] of integer;
i , a : integer; { Contadores }
j,c,b,x : integer; {Variáveis de Armazenamento}
implementation
{$R *.dfm}
procedure Tfrmordenar.btn_addClick(Sender: TObject);
begin
aux_array := aux_array+1;
numeros[aux_array] := strtoint(edt_num.Text);
edt_num.SetFocus;
lstbx_num.Items.Add(edt_num.Text);
edt_num.Clear;
end;
procedure Tfrmordenar.btn_limparClick(Sender: TObject);
begin
lstbx_num.Clear;
lstbx_ordem.Clear;
edt_num.SetFocus;
end;
procedure Tfrmordenar.btn_ordenarClick(Sender: TObject);
begin
if (rdb_cresc.Checked) then
begin
for i := 1 to 10 do
begin
//lstbx_ordenados.Items.Add(IntToStr(numeros[i]));
j := numeros[i];
for a := 1 to 10 do
begin
x := numeros [a];
if j > x then
begin
b := j;
j := x;
x := b;
numeros[i] := j;
numeros[a] := x;
end;
for c := 1 to 10 do
begin
lstbx_ordem.Items.Add(IntToStr(numeros[c]));
end;
end;
end;
end;
end;
end.
Imagem
[img]http://i.imgur.com/wmkh7Uj.jpg[/img]
Se alguém puder me ajudar, agradeço desde já !
André Moutinho
Curtidas 0
Respostas
Marcos P
22/05/2015
Esse é todo o código que você desenvolveu ?
Assumindo que a procedure "ordenarClick" é responsável tanto pela ordenação crescente pele decrescente e que o radio button "rdb_cresc" define o critério de ordenação, não deveria existir um "else" para "if (rdb_cresc.Checked) then" ?
Se a opção selecionada for a decrescente, não existe como o código ser desviado para seu loop de ordenação !
Assumindo que a procedure "ordenarClick" é responsável tanto pela ordenação crescente pele decrescente e que o radio button "rdb_cresc" define o critério de ordenação, não deveria existir um "else" para "if (rdb_cresc.Checked) then" ?
Se a opção selecionada for a decrescente, não existe como o código ser desviado para seu loop de ordenação !
GOSTEI 0
André Moutinho
22/05/2015
Como disse, não terminei, travei nessa parte .
Quero resolver a parte do crescente e depois veria a parte do decrescente.
Sim, ele tem o else.....mas to perdido , depois que rodei a aplicação e vi que o que eu fiz deu errado, fiquei perdido dms :/
Quero resolver a parte do crescente e depois veria a parte do decrescente.
Sim, ele tem o else.....mas to perdido , depois que rodei a aplicação e vi que o que eu fiz deu errado, fiquei perdido dms :/
GOSTEI 0
Marcos P
22/05/2015
Mas essa rotina de ordenação crescente funciona ?
A "lista imensa" ocorre porque você carrega os itens na listbox, em cada uma das interações do loop de ordenação.
Deixe isso para ser feito, somente depois do array ordenado !
A "lista imensa" ocorre porque você carrega os itens na listbox, em cada uma das interações do loop de ordenação.
Deixe isso para ser feito, somente depois do array ordenado !
GOSTEI 0
André Moutinho
22/05/2015
É que eu já to perdido Marcos P, não sei mais como arrumar, o que arrumar .
GOSTEI 0
André Moutinho
22/05/2015
É que eu já to perdido Marcos P, não sei mais como arrumar, o que arrumar .
GOSTEI 0
Jothaz
22/05/2015
É que eu já to perdido Marcos P, não sei mais como arrumar, o que arrumar .
Você tentou pesquisar no Google, pois acredito que existam milhões de post sobre este assunto.
Fiz um consulta básica e olha o resultado.
Mais um post Ordenar TObjectList
Não acho possível que nenhum dos resultados do Google não lhe ajude.
GOSTEI 0
Marcos Saffran
22/05/2015
Olá D3chMOut,
a 'lista imensa' ocorre por seu 'for c := 1 to 10 do' estar dentro dos dois 'for anteriores', ou seja, serão 10 x 10 x 10 itens no seu listbox.
Para resolver coloque o código do 'for c := 1 to 10 do' fora dos 'for' anteriores, colocando dois 'end' abaixo dele para antes dele.
Verifique o funcionamento depois da mudança e, se necessário, continuaremos o código.
Até +
a 'lista imensa' ocorre por seu 'for c := 1 to 10 do' estar dentro dos dois 'for anteriores', ou seja, serão 10 x 10 x 10 itens no seu listbox.
Para resolver coloque o código do 'for c := 1 to 10 do' fora dos 'for' anteriores, colocando dois 'end' abaixo dele para antes dele.
Verifique o funcionamento depois da mudança e, se necessário, continuaremos o código.
Até +
GOSTEI 0
André Moutinho
22/05/2015
Olá D3chMOut,
a 'lista imensa' ocorre por seu 'for c := 1 to 10 do' estar dentro dos dois 'for anteriores', ou seja, serão 10 x 10 x 10 itens no seu listbox.
Para resolver coloque o código do 'for c := 1 to 10 do' fora dos 'for' anteriores, colocando dois 'end' abaixo dele para antes dele.
Verifique o funcionamento depois da mudança e, se necessário, continuaremos o código.
Até +
a 'lista imensa' ocorre por seu 'for c := 1 to 10 do' estar dentro dos dois 'for anteriores', ou seja, serão 10 x 10 x 10 itens no seu listbox.
Para resolver coloque o código do 'for c := 1 to 10 do' fora dos 'for' anteriores, colocando dois 'end' abaixo dele para antes dele.
Verifique o funcionamento depois da mudança e, se necessário, continuaremos o código.
Até +
Olá Marcos Alfredo, fiz como sugerido, segue como o código agora ficou ;
var i,a, j, x, c,b : integer; begin if (rdb_cresc.Checked) then begin for i := 1 to 10 do begin //lstbx_ordenados.Items.Add(IntToStr(numeros[i])); j := numeros[i]; for a := 2 to 10 do begin x := numeros [a]; if j > x then begin b := j; j := x; x := b; numeros[i] := j; numeros[a] := x; end; end; end; end; for c := 1 to 10 do begin lstbx_ordenados.Items.Add(IntToStr(numeros[c])); end; end; end.
Mas, ele ainda está me dando uma ordem totalmente desencontrada, eu digito e ele me some com o 10, ou melhor, ele desmenbra o 10, o 0 EM CIMA e o 1 no final, dando a entender que o 1 do final é o 10,não sei mais o que fazer pra essa aplicação ficar da maneira que desejo.....veja na imagem;
[img]http://arquivo.devmedia.com.br/forum/imagem/412436-20150523-174527.jpg[/img]
OBS: Outra coisa é, se eu digito, exemplo 1-2-3-4-5 e ordeno em Crescente, ele me dá os números e antes e depois deles, completa com 0, desta forma;
0
5
4
3
2
1
0
0
0
0
Sem contar, que essa é somente a parte do Crescente, ainda falta, a do Decrescente ;/
GOSTEI 0
Marcos Saffran
22/05/2015
Como eu disse, vamos por partes,
o seu 'if j > x then' irá ordenar em ordem decrescente, altere-o para 'if j < x then'
outra coisa, sua variável 'numeros[1]', está recebendo o valor 0, verifique sua lógica.
o seu 'if j > x then' irá ordenar em ordem decrescente, altere-o para 'if j < x then'
outra coisa, sua variável 'numeros[1]', está recebendo o valor 0, verifique sua lógica.
GOSTEI 0
André Moutinho
22/05/2015
Como eu disse, vamos por partes,
o seu 'if j > x then' irá ordenar em ordem decrescente, altere-o para 'if j < x then'
outra coisa, sua variável 'numeros[1]', está recebendo o valor 0, verifique sua lógica.
o seu 'if j > x then' irá ordenar em ordem decrescente, altere-o para 'if j < x then'
outra coisa, sua variável 'numeros[1]', está recebendo o valor 0, verifique sua lógica.
Em relação ao numeros[1] é porque já teve exercicios e aplicações que havia feito desta forma e ela procedeu normalmente, ou seja, não sei identificar o porque está assim e como arrumar ela.
Então, fazendo desta forma do IF, ocorre que a ordem numerica, fica totalmente confusa;
0
0
1
2
3
4
10
10
10
Desta forma.
Não sei se foi algo que eu tinha mexido de errado, mas , estava fazendo uns testes nessa parte e o 1, não se separa mais do 0, sendo assim, ele acaba ficando certinho.
Dá maneira que o código está, sem tirar nem por , ele entraria desta forma no DECRESCENTE, por que, quando eu ponho os 10 números, aperto no CRESCENTE (mesmo sem ser), ele me mostra os números em decrescente, então, assim, dava para por no RADIOBUTTON do DECRESCENTE.
E o do IF, que você me disse, já citei o que ocorre ai em cima, enfim
: (
GOSTEI 0
Marcos P
22/05/2015
André,
Duas dicas :
1. Sempre que você estiver "apanhando" para um código qualquer, "esqueça" ele por uns dois ou três dias e depois retome o trabalho. Você vai ver que, de cabeça fresca, as coisas ficam muito mais claras.
2. Sem indentação no código, fica muito mais complicado resolver qualquer problema !
Vamos lá... é óbvio que o 1 não se separou do 0, pois, se isso tivesse acontecido, nem o Padre Quevedo conseguiria explicar !
O que acontece é que sua ListBox, por algum motivo, está mostrando apenas o "1" de quando você digita "10". Revise o tipo de dado ou alguma outra configuração do objeto.
Outra coisa, os vários zeros, referem-se as posições do array que você não ocupou. Para resolver isso, uma possibilidade, é somente liberar o botão de ordenação quando as dez posições estiverem preenchidas.
Trocando o radioButton simples, por um radioGroup, onde :
> radioGroup.ItemIndex = 0 >> Crescente
> radioGroup.ItemIndex = 1 >> Decrescente
O código abaixo, resolve tanto a ordem crescente com a decrescente :
[img]http://arquivo.devmedia.com.br/forum/imagem/378439-20150525-122133.png[/img]
Duas dicas :
1. Sempre que você estiver "apanhando" para um código qualquer, "esqueça" ele por uns dois ou três dias e depois retome o trabalho. Você vai ver que, de cabeça fresca, as coisas ficam muito mais claras.
2. Sem indentação no código, fica muito mais complicado resolver qualquer problema !
Vamos lá... é óbvio que o 1 não se separou do 0, pois, se isso tivesse acontecido, nem o Padre Quevedo conseguiria explicar !
O que acontece é que sua ListBox, por algum motivo, está mostrando apenas o "1" de quando você digita "10". Revise o tipo de dado ou alguma outra configuração do objeto.
Outra coisa, os vários zeros, referem-se as posições do array que você não ocupou. Para resolver isso, uma possibilidade, é somente liberar o botão de ordenação quando as dez posições estiverem preenchidas.
Trocando o radioButton simples, por um radioGroup, onde :
> radioGroup.ItemIndex = 0 >> Crescente
> radioGroup.ItemIndex = 1 >> Decrescente
O código abaixo, resolve tanto a ordem crescente com a decrescente :
procedure Tfrmordenar.btn_ordenarClick(Sender: TObject);
{* Repare a diferença que um código indentado faz na vida de qualquer programador ! *}
begin
lstbx_ordem.Clear;
for i := 1 to 10 do
begin
j := numeros[i];
for a := 1 to 10 do
begin
x := numeros [a];
if ((j < x) AND (rdb_cresc.ItemIndex = 0)) OR
((j > x) AND (rdb_cresc.ItemIndex = 1))
then
begin
b := j;
j := x;
x := b;
numeros[i] := j;
numeros[a] := x;
end;
end;
end;
for c := 1 to 10 do
begin
lstbx_ordem.Items.Add(IntToStr(numeros[c]));
end;
end;
[img]http://arquivo.devmedia.com.br/forum/imagem/378439-20150525-122133.png[/img]
GOSTEI 0
André Moutinho
22/05/2015
André,
Duas dicas :
1. Sempre que você estiver "apanhando" para um código qualquer, "esqueça" ele por uns dois ou três dias e depois retome o trabalho. Você vai ver que, de cabeça fresca, as coisas ficam muito mais claras.
2. Sem indentação no código, fica muito mais complicado resolver qualquer problema !
Vamos lá... é óbvio que o 1 não se separou do 0, pois, se isso tivesse acontecido, nem o Padre Quevedo conseguiria explicar !
O que acontece é que sua ListBox, por algum motivo, está mostrando apenas o "1" de quando você digita "10". Revise o tipo de dado ou alguma outra configuração do objeto.
Outra coisa, os vários zeros, referem-se as posições do array que você não ocupou. Para resolver isso, uma possibilidade, é somente liberar o botão de ordenação quando as dez posições estiverem preenchidas.
Trocando o radioButton simples, por um radioGroup, onde :
> radioGroup.ItemIndex = 0 >> Crescente
> radioGroup.ItemIndex = 1 >> Decrescente
O código abaixo, resolve tanto a ordem crescente com a decrescente :
[img]http://arquivo.devmedia.com.br/forum/imagem/378439-20150525-122133.png[/img]
Duas dicas :
1. Sempre que você estiver "apanhando" para um código qualquer, "esqueça" ele por uns dois ou três dias e depois retome o trabalho. Você vai ver que, de cabeça fresca, as coisas ficam muito mais claras.
2. Sem indentação no código, fica muito mais complicado resolver qualquer problema !
Vamos lá... é óbvio que o 1 não se separou do 0, pois, se isso tivesse acontecido, nem o Padre Quevedo conseguiria explicar !
O que acontece é que sua ListBox, por algum motivo, está mostrando apenas o "1" de quando você digita "10". Revise o tipo de dado ou alguma outra configuração do objeto.
Outra coisa, os vários zeros, referem-se as posições do array que você não ocupou. Para resolver isso, uma possibilidade, é somente liberar o botão de ordenação quando as dez posições estiverem preenchidas.
Trocando o radioButton simples, por um radioGroup, onde :
> radioGroup.ItemIndex = 0 >> Crescente
> radioGroup.ItemIndex = 1 >> Decrescente
O código abaixo, resolve tanto a ordem crescente com a decrescente :
procedure Tfrmordenar.btn_ordenarClick(Sender: TObject);
{* Repare a diferença que um código indentado faz na vida de qualquer programador ! *}
begin
lstbx_ordem.Clear;
for i := 1 to 10 do
begin
j := numeros[i];
for a := 1 to 10 do
begin
x := numeros [a];
if ((j < x) AND (rdb_cresc.ItemIndex = 0)) OR
((j > x) AND (rdb_cresc.ItemIndex = 1))
then
begin
b := j;
j := x;
x := b;
numeros[i] := j;
numeros[a] := x;
end;
end;
end;
for c := 1 to 10 do
begin
lstbx_ordem.Items.Add(IntToStr(numeros[c]));
end;
end;
[img]http://arquivo.devmedia.com.br/forum/imagem/378439-20150525-122133.png[/img]
Segui seu conselho e deixei de lado a aplicação,e refiz ela inteira,tanto na parte de repensar a lógica, que ao meu ver não estava lá tão errada e substitui o RadioButton pelo RadioGroup como você havia dado como dica e funcionou melhor até do que eu esperava.
Agradeço desde já a sua colaboração, tanto nessa aplicação, como em outras que tem me auxiliado, melhor do que muitos Professores,mas enfim.
Até a próxima !
GOSTEI 0
Marcos P
22/05/2015
Sua lógica estava 99% certa... mas em programação, muitas vezes, acertar o 1% que falta dá um trabalho infernal !
Que bom que você resolveu.
Precisando de ajuda, estamos por aqui...
Que bom que você resolveu.
Precisando de ajuda, estamos por aqui...
GOSTEI 0