Fórum Lógica: Pegar segundo menor valor #283246
29/05/2005
0
Fiz um algoritimo usando 3 loops, mas não fiquei satisfeito!
Idéias?
Vamos exercitar a lógica! :)
Valew!!
Caninha51
Caninha51
Curtir tópico
+ 0Posts
29/05/2005
Marco Salles
procedure TForm1.Button1Click(Sender: TObject); var i,nunMaior,nunMenor:Integer; begin i:=0; nunMaior:=0; while i<=tamanhodoarray do begin if A[i] > nunMaior then begin nunMenor:=nunMaior; nunMaior:=A[i] end else if A[i] > nunMenor Then nunMenor:= A[i]; i:=i+1; end; Showmessage(inttostr(nunmenor)); end;
Gostei + 0
30/05/2005
Carlosrm
saúde!
procedure TForm1.Button1Click(Sender: TObject);
var
MeuArray : array[0..5] of integer;
pri, seg, I : Integer;
begin
// preenchi o array aqui só para facilitar a visualização
MeuArray[0] := 5;
MeuArray[1] := 9;
MeuArray[2] := -7;
MeuArray[3] := 3;
MeuArray[4] := -7;
MeuArray[5] := 6;
pri := MeuArray[0];
seg := MeuArray[0];
For I := Low(MeuArray) to High(MeuArray) do begin
if (MeuArray[I] < pri) then begin
if (pri < seg) then
seg := pri;
pri := MeuArray[I];
continue;
end;
if (MeuArray[I] < seg) and (MeuArray[I] <> pri) then
seg := MeuArray[I];
end;
showmessage(´O segundo menor número é: ´+inttostr(seg));
end;
1) Do jeito que está, este código considera apenas os conteúdos não repetidos dos items do array.
(5; 9; -7; 3; -7; 6) => o segundo menor número é 3. (O valor repetido -7 foi considerado uma vez.)
2) Para considerar inclusive os valores repetidos, basta remover (ou comentar) o trecho (no segundo IF) ´and (MeuArray[I] <> pri)´.
Neste caso, (5; 9; -7; 3; -7; 6) => o segundo menor número é -7
Espero ter ajudado.
carlosrm
Gostei + 0
30/05/2005
Caninha51
Agradeço aos dois! :o
Valew!
Caninha51
Gostei + 0
31/05/2005
Marco Salles
[b:d70e683368]O Código que lhe passei , não funciona nen de cara e nen sem Cara[/b:d70e683368]
:cry: :cry:
Na verdade cometi um Lapso , na interpretação Do enunciado:
:arrow: Fiz uma lógica Para Pegar o Segundo Maior Valor :cry: :cry:
:lol: :lol:
Logo , para o código lhe atender , sera necessário somente umas Pequenas modificações no mesmo...
:wink: :wink: se por ventura ainda... estiver precisando , apesar deu achar que o Codigo que o amigo carlosrm lhe passou deve lhe [b:d70e683368]atender plenamente[/b:d70e683368] , e so postar,
Gostei + 0
05/06/2005
Caninha51
De qualquer forma valeu ae!
caninha51
Gostei + 0
07/06/2005
Carlosrm
Peço desculpas aos amigos, mas o código que eu cometi não funciona em todas as situações. Erro do programador (nunca do programa!). Agradeço mais uma vez ao Marco Salles por ter me alertado. Assim que tiver consertado meu erro, posto novamente. Não foi por má intenção, foi por má dedução...
carlosrm :oops:
Gostei + 0
09/06/2005
Caninha51
Aki funcionou sim! :)
Gostei + 0
09/06/2005
Marco Salles
Eu enviei uma Mp para o Carlosrm , igualmente o fiz para voce , levantando algumas situaçoes onde o cogido passado , tem um comportamneto diferente do sugerido ... Quem quiser que faça o teste com a seguinte inicialização do array
procedure TForm1.Button1Click(Sender: TObject); var MeuArray : array[0..5] of integer; pri, seg, I : Integer; begin // preenchi o array aqui só para facilitar a visualização MeuArray[0] := 33; MeuArray[1] := 79; MeuArray[2] := 41; MeuArray[3] := 80; MeuArray[4] := 55; MeuArray[5] := 77; pri := MeuArray[0]; seg := MeuArray[0]; For I := Low(MeuArray) to High(MeuArray) do begin if (MeuArray[I] < pri) then begin if (pri < seg) then seg := pri; pri := MeuArray[I]; continue; end; if (MeuArray[I] < seg) and (MeuArray[I] <> pri) then seg := MeuArray[I]; end; showmessage(´O segundo menor número é: ´+inttostr(seg)); end;
[b:377549757a]To obtendo como resposta o 33 , Quando o correto seria o 41
O Que pode estar errado [/b:377549757a]
:?: :?: :?: :?:
Gostei + 0
15/06/2005
Caninha51
Fiz umas modificações e acho q agora deu certo!
Testa ai...
procedure TForm1.Button1Click(Sender: TObject); var MeuArray : array[0..5] of integer; seg, menor, maior, I : Integer; begin // preenchi o array aqui só para facilitar a visualização MeuArray[0] := 33; MeuArray[1] := 79; MeuArray[2] := 41; MeuArray[3] := 80; MeuArray[4] := 55; MeuArray[5] := 77; menor := MeuArray[0]; maior := MeuArray[0]; For I := Low(MeuArray) to High(MeuArray) do if (MeuArray[I] < menor) then menor := MeuArray[I] else if (MeuArray[I] > maior) then maior := MeuArray[I]; seg := maior; For I := Low(MeuArray) to High(MeuArray) do if (MeuArray[I] > menor) and (MeuArray[I] < seg) then seg := MeuArray[I]; showmessage(´O segundo menor número é: ´+inttostr(seg)); end;
Gostei + 0
18/06/2005
Carlosrm
Salve! Eu tinha feito um código quase igual ao que vc fez, com pequena
diferença.
Provavelmente isso não acontece numa situação real, mas eu verifiquei também a possibilidade de todos os elementos do array serem iguais.
Fora isso, acabamos pensando mais ou menos igual. Desculpe, novamente pelo primeiro código estar furado (mal programado).
Agradeço também ao Marco Salles por ter testado e informado os furos encontrados.
carlosrm :)
procedure TForm1.Button1Click(Sender: TObject); var MeuArray : array[0..5] of integer; pri, seg, H, I : Integer; begin MeuArray[0] := 33; // 4 75;// MeuArray[1] := 33; // 9 9;// MeuArray[2] := 33; //-7 63;// MeuArray[3] := 33; // 3 57;// MeuArray[4] := 33; //-7 54;// MeuArray[5] := 33; // 6 6;// // listbox1.Clear; // for H := low(MeuArray) to High(MeuArray) do // listbox1.items.add(format(´¬3.3d´,[MeuArray[h]])); pri := MeuArray[0]; seg := MeuArray[1]; For I := Low(MeuArray)+2 to High(MeuArray) do begin if (MeuArray[I] = seg) or (MeuArray[I] = pri) then continue; if (MeuArray[I] < pri) then begin if (pri < seg) then seg := pri; pri := MeuArray[I]; continue; end; if (seg = pri) then seg := MeuArray[I]; if (MeuArray[I] < seg) then seg := MeuArray[I]; end; if (pri = seg) then showmessage(´Todos os elementos do array são iguais: ´+inttostr(pri)) else if (pri < seg) then showmessage(´O segundo menor número é: ´+inttostr(seg)) else showmessage(´O segundo menor número é: ´+inttostr(pri)); end;
Gostei + 0
19/06/2005
Beppe
// ensure Length(A) >= 2 function SegundoMenorInteiro(const A: array of Integer): Integer; var I, Min, Sec: Integer; begin Min := A[0]; Sec := High(Integer); for I := 1 to High(A) do if A[I] < Sec then begin if A[I] <= Min then begin Sec := Min; Min := A[I]; end else Sec := A[I]; end; Result := Sec; end;
Entretanto, o problema não está bem resolvido. E se for preciso o 3º, ou o 4º, ou ainda o 284473º menor elemento? Criar tantas variáveis conforme necessário!
Quem cursa CC sabe que este método se torna [i:538ee23f5c]O[/i:538ee23f5c](n²), o que significa lentidão. Resolver o problema primeiro ordenando o array é [i:538ee23f5c]O[/i:538ee23f5c](n lg n). Pra isso se usa a lógica de particionamento do QuickSort.
Claro que para o caso específico do colega que postou a questão, o algoritmo SegundoMenorInteiro dá conta do recado perfeitamente.
Gostei + 0
19/06/2005
Carlosrm
Valeu!. Obrigado pelos esclarecimentos.
carlosrm :)
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)