Witam mam następujący problem, w jaki sposób wyciągnąć minimalną i maksymalną wartość z Memo, nie byłoby problemu gdyby była to określona ilość liczb, ale zadanie polega na tym, że użytkownik deklaruje ile wartości wprowadzi, po czym wyświetla się inputbox. Wartości wprowadzane do inputboxa sa zapisywane w memo. Domyślam się ze powinienem to zrobić na pętli, której ilość powtórzeń była by równa wartości wprowadzanych liczb przez użytkownika. Niestety gdy robię pętle a w niej funkcje if to nie działa mi to poprawnie... z góry dzięki za pomoc.
- Rejestracja:ponad 13 lat
- Ostatnio:ponad 12 lat
- Postów:23
Wyglada to tak:
a:=StrToInt(Edit1.Text);
for x:=1 to a do
begin
b:=inputbox('','Jakis tam tekst zachety:','');
Memo1.Lines.Add(b);
No i teraz załóżmy, że user wpisze do edita 10, to wyświetli mu się kolejno 10 inputboxów, a wartości z nich zostaną zapisane w memo.
Problem mam z tym, ze chciałbym wskazać najmniejsza i największa wartość przez niego wprowadzoną.

- Rejestracja:ponad 14 lat
- Ostatnio:ponad 5 lat
- Lokalizacja:Kosmos
- Postów:1571
Acha, czyli wyznaczanie najmniejszego i największego elementu ze zbioru tak? Podam prostszy przykład: użytkownik wpisuje 20 liczb w konsoli i na koniec wyświetlasz mu największą i najmniejszą, o to chodzi?
http://edu.i-lo.tarnow.pl/inf/alg/001_search/0033.php
Trochę możesz się nie połapać, to ci powiem wprost przepis na wyszukiwanie min i max:
- pierw wczytujesz wszystkie liczby np. do tablicy. (od razu z inputów)
- ustawiasz min i max na pierwszy element.
- iterujesz do końca, jeżeli aktualny jest mniejszy od min to min się zmienia na aktualny
- to samo z max.
Sprawa jest bardzo prosta; Ja podam Ci rozwiązanie dla aplikacji konsolowej wykorzystującej macierz przechowującą liczby typu Word
, Ty zaś przeinacz ją tak, by pasowała do Twojego projektu;
program GetMinMax;
{$APPTYPE CONSOLE}
uses
SysUtils,
Dialogs;
type
TNumArr = array of Word;
function _Min(aNum: TNumArr): Word;
var
I: Word;
begin
Result := 65535;
for I := Low(aNum) to High(aNum) do
if aNum[I] < Result then
Result := aNum[I];
end;
function _Max(aNum: TNumArr): Word;
var
I: Word;
begin
Result := 0;
for I := Low(aNum) to High(aNum) do
if aNum[I] > Result then
Result := aNum[I];
end;
var
aNum: TNumArr;
wCount, I: Word;
begin
Write('Podaj ilosc wprowadzanych liczb: ');
ReadLn(wCount);
SetLength(aNum, wCount);
for I := Low(aNum) to High(aNum) do
aNum[I] := StrToInt(InputBox('Liczby', 'Podaj [' + IntToStr(I) + '] liczbę', '0'));
WriteLn(#10'Wartosc minimalna: ', _Min(aNum));
Write('Wartosc maksymalna: ', _Max(aNum));
ReadLn;
end.
Proste, prawda?


- Rejestracja:ponad 13 lat
- Ostatnio:ponad 12 lat
- Postów:23
A gdybym chciał to zrobić na instrukcji warunkowej i pętli? była by opcja?
jeżeli tak to w jaki sposób mam to zrobić?


#Artur napisał(a)
A gdybym chciał to zrobić na instrukcji warunkowej i pętli? była by opcja?
Tu jest pętla, warunki też; Nie wiem za bardzo o co Ci chodzi i gdzie jeszcze i po co chciałbyś dorobić pętle i warunki; Podaj precyzyjniej to, co chcesz wykonać;
@#Artur, uczysz się trochę od tyłu; Najpierw naucz się podstawowych elementów języka, później baw się apliakcjami okienowymi i komponentami; Inaczej będziesz miał problemy żeby pewne rzeczy zrozumieć i oprogramować;
Coś takiego...?:
procedure TForm1.Button1Click(Sender: TObject);
var
wMax, wMin, wCurr, I: Word;
begin
{ WARTOŚCI DOMYŚLNE }
wMax := 0;
wMin := 65535;
for I := 0 to memNum.Lines.Count - 1 do
begin
{ KONWERCJA ŁAŃCUCHA NA LICZBĘ }
wCurr := StrToInt(memNum.Lines.Strings[I]);
{ MIN }
if wCurr < wMin then wMin := wCurr;
{ MAX }
if wCurr > wMax then wMax := wCurr;
end;
end;
Identyfikator | Opis |
---|---|
memNum | kontrolka z klasy TMemo , w której przechowujesz liczby |
wCurr | liczba, która została pobrana z aktualnej linii komponentu |
wMin | wartość minimalna |
wMax | wartość maksymalna |
Wklej ten kod gdzie chcesz, niekoniecznie pod zdarzenie OnClick przycisku Button1 ; |



- Rejestracja:ponad 13 lat
- Ostatnio:ponad 12 lat
- Postów:23
Udało mi się to zrobić takim sposobem jakim chciałem, chodziło o takie coś:
for x:=1 to a do
if StrToInt(Memo1.Lines[n])>max then
begin
max:=StrToInt(Memo1.Lines[n]);
n:=n+1;
end
else
begin
max:=max;
n:=n+1;
end;
end;

- Rejestracja:prawie 19 lat
- Ostatnio:20 dni
- Postów:819
Powinno być tak
for x:=0 to a-1 do
if StrToInt(Memo1.Lines[x])>max then
max:=StrToInt(Memo1.Lines[x]);
A jeszcze lepiej
for x:=0 to Memo1.Lines.Count-1 do
if StrToInt(Memo1.Lines[x])>max then
max:=StrToInt(Memo1.Lines[x]);
Oczywiście przed pętlą należy przyporządkować do max jakąś bardzo małą liczbę (w zależności od tego jakich liczb spodziewasz się w Memo1)

- Rejestracja:ponad 13 lat
- Ostatnio:ponad 12 lat
- Postów:48
Można też tak:
uses
Math;
var
i, iMax, iMin: Integer;
begin
iMax := Low(Integer);
iMin := High(Integer);
for i := 0 to Memo1.Lines.Count - 1 do
begin
iMax := Max(iMax, StrToInt(Memo1.Lines[i]));
iMin := Min(iMin, StrToInt(Memo1.Lines[i]));
end;
end;
Zmienna | Opis |
---|---|
iMax |
wartość maksymalna |
iMin |
wartość minimalna |
Memo1.Lines.Count |
Ilość linii/liczb w Memo1 |
Funkcja | Opis |
---------------- | ---------------- |
High(Integer) |
Tutaj: zwraca najwyższą wartość typu Integer . |
Low(Integer) |
Tutaj: zwraca najniższą wartość typu Integer . |
Max(arg1, arg2) |
Spośród liczb arg1 i arg2 zwraca tą większą. |
Min(arg1, arg2) |
Spośród liczb arg1 i arg2 zwraca tą mniejszą. |
Dzięki modułowi <a href"http://4programmers.net/Delphi/Moduły/Math">Math</a> możemy używać funkcję Max() i Min(), oraz wiele innych. |

- Rejestracja:ponad 19 lat
- Ostatnio:około 3 lata
- Lokalizacja:Świecie
albo tak:
procedure TForm1.Button1Click(Sender: TObject);
var
max, min, i, ii :integer;
begin
max:=strtoint(Memo1.Lines.Strings[0]);
min:=max;
for i:=1 to Memo1.Lines.Count-1 do
begin
ii :=strtoint(Memo1.Lines.Strings[i]);
if ii > max then
max := ii;
if ii < min then
min := ii;
end;
Showmessage('Wartość max. '+IntToStr(max)+' Wartość min. '+IntToStr(min));
end;