Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Ahoj, potřeboval bych poradit. V Delphi se snažím vymyslet program, který mi vykreslí matici, ve které naleznu 2 nejmenší prvky. Ty pak vytisknu a nechám vypsat i souřadnice těch prvků v matici. Souřadnice nejmenšího čísla fungují bezproblému, souřadnice druhého nejmenšího jak kdy. Někdy jo, někdy ne. Nějaká rada? Jde to celkově udělat lehčeji? Přijde mi to takové dost zplácané.. Díky za každou radu.
Randomize;
for i := 1 to n do begin
for j := 1 to m do begin
c := 10 + random(81);
StringGrid1.Cells[i-1,j-1] := inttostr(c);
if (c < min1) then begin
min2 := min1;
min1 := c;
a := j;
b := i;
end
else if (c > min1) and (c < min2) then begin
min2 := c;
a1 := j;
b1 := i;
end;
Label1.Caption := IntToStr(min1) + ' (' + IntToStr(a) + '. řádek, ' + IntToStr(b) + '. sloupec.)';
Label2.Caption := IntToStr(min2) + ' (' + IntToStr(b1) + '. řádek, ' + IntToStr(a1) + '. sloupec.)';
Offline
↑ Kuba #8:
Zdravim O.o,
jak mas iniciovane promenne?
Offline
var m, n, i, j, c, VyskaBunky, SirkaSloupce, min2, min1, a, a1, b, b1 :integer;
begin
min2 := 90;
min1 := 90;
m := StrToInt(Edit1.Text); // počet řádků matice
n := StrToInt(Edit2.Text); // počet sloupků matice
ještě dodám, že čísla se mají do matice generovat náhodně v rozsahu 10-90, proto ta minima. Proměnné m,n jdou ze vstupu od uživatele.
Offline
↑ Kuba #8:
Tak jak generuješ čísla v matici, tak se v ní jistě mohou vyskytovat stejná čísla.
Co když těch minimálních čísel bude více?
Mají se pak vypsat všechny "souřadnice" tohoto minima?
Jak je to s druhým nejmenším číslem?
Jsou to ta čísla (zase jich může být více), která jsou druhá nejmenší nebo je to "druhé" z těch nejmenších, pokud jich je více?
Jinak k programu:
Podle mě stačí zpočátku přiřadit a := 0; b := 0; a1 := 0; b1 := 0;
a maličko přepsat podmínky
for i := 1 to n do
for j := 1 to m do
begin
c := 10 + random(81);
StringGrid1.Cells[i-1,j-1] := inttostr(c);
if (c < min1) then
begin
min2 := min1;
min1 := c;
a1 := a;
b1 := b;
a := j;
b := i;
end
else
if (c > min1) and (c < min2) then
min2 := c;
end;
Offline
Ok diky. Zkusim to takhle poupravit. Samozrejme jsem narazil na situaci, kdy se vygenerovala stejna nejnizsi cisla. V zadani se o tom nic nepise, ale preci. Dokazal bys poradit, jak postupovat, kdybych chtel vypsat vic pozic toho nejmensiho cisla?
Tak jsem to vyzkoušel a nefunguje. Přemýšlím, kde je zakopanej pes, že občas to skočí dobře, občas to ukáže úplně něco jiného ..
Offline
↑ Kuba #8:
To je zajímavé, že mně to funguje.
Offline
Tvoje reseni nebere v potaz situaci, kdy druhe nejmensi cislo se v matici vyskytne drive nez nejmensi cislo. ProtoProtoze kdyz bude nejmensi cislo pozdeji, prepises souradnice i tomu druhemu nejmensimu, diky te podmince. Mam to doma uz jakztakz vyresene, odpoledne to sem dam. Jinak jsem narazil na dalsi problem. Neumim napsat funkci, ktera by mi scitala vedlejsi diagonalu. Podminky bych zvladnul, ale syntaxi funkce s tim spojenou uz moc ne..
Offline
↑ Kuba #8:
Píšeš "...Tvoje reseni nebere v potaz situaci, kdy druhe nejmensi cislo se v matici vyskytne drive nez nejmensi cislo..."
No nevím, ale mně to pracuje dobře i když druhé nejmenší je dříve než nejmenší.
K dotazu-zkus se podívat třeba Sem
Offline
Mrknul jsem na ten odkaz, co jsi mi sem dal, něco jsem dal dohromady, ale vyhazuje mi to chybu. Prý snad špatně převádím či přirazuju IntToStr ..nebo se snažím do Stringu narvat nulovou hodnotu. Snad by měl být špatný řádek s tím StringGridem ve funkci, ale nevím, jak to opravit. Poradí někdo?
function SoucetVedlejsiDiagonaly(m:integer; n:integer):integer;
var i, j, h :integer;
begin
h := 1;
for i := 1 to n do begin
for j := 1 to m do begin
h := h + StrToInt(Form1.StringGrid1.Cells[i,j+1]);
SoucetVedlejsiDiagonaly := h; //?
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var m, n, i, j, c, VyskaBunky, SirkaSloupce, min2, min1 :integer;
a, a1, b, b1 : integer;
begin
a := 0; b := 0; a1 := 0; b1 := 0;
min2 := 90;
min1 := 90;
m := StrToInt(Edit1.Text);
n := StrToInt(Edit2.Text);
VyskaBunky := 25;
SirkaSloupce := 25;
StringGrid1.RowCount := m;
StringGrid1.ColCount := n;
StringGrid1.DefaultRowHeight := VyskaBunky;
StringGrid1.DefaultColWidth := SirkaSloupce;
StringGrid1.Width := n*SirkaSloupce + n + 20;
StringGrid1.Height := m*VyskaBunky + n + 20;
Randomize;
for i := 1 to n do begin
for j := 1 to m do begin
c := 10 + random(81);
StringGrid1.Cells[i-1,j-1] := inttostr(c);
if (c <= min1) then begin
if (a < a1) and (b < b1) then begin
a1 := a;
b1 := b;
end
else begin
a1 := a;
b1 := b;
min2 := min1;
min1 := c;
a := j;
b := i;
end
end
else if (c >= min1) and (c <= min2) then begin
min2 := c;
a1 := j;
b1 := i;
end;
Label1.Caption := IntToStr(min1) + ' (' + IntToStr(a) + '. řádek, ' + IntToStr(b) + '. sloupec.)';
Label2.Caption := IntToStr(min2) + ' (' + IntToStr(a1) + '. řádek, ' + IntToStr(b1) + '. sloupec.)';
Label7.Caption := IntToStr(SoucetVedlejsiDiagonaly(m,n));
end;
end;
end;
end.Offline