Matematické Fórum

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

#1 02. 12. 2014 23:32 — Editoval Kuba #8 (02. 12. 2014 23:35)

Kuba #8
Zelenáč
Příspěvky: 5
Reputace:   
 

Matice - 2 nejmensi prvky a jejich souradnice

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

 

#2 03. 12. 2014 00:06 — Editoval O.o (03. 12. 2014 00:08)

O.o
Veterán
Příspěvky: 1402
Reputace:   16 
 

Re: Matice - 2 nejmensi prvky a jejich souradnice

↑ Kuba #8:

Zdravim O.o,

jak mas iniciovane promenne?

Offline

 

#3 03. 12. 2014 05:04

Kuba #8
Zelenáč
Příspěvky: 5
Reputace:   
 

Re: Matice - 2 nejmensi prvky a jejich souradnice

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

 

#4 03. 12. 2014 10:17

Honzc
Příspěvky: 4647
Reputace:   248 
 

Re: Matice - 2 nejmensi prvky a jejich souradnice

↑ 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

 

#5 03. 12. 2014 12:03 — Editoval Kuba #8 (03. 12. 2014 23:09)

Kuba #8
Zelenáč
Příspěvky: 5
Reputace:   
 

Re: Matice - 2 nejmensi prvky a jejich souradnice

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

 

#6 10. 12. 2014 06:11

Honzc
Příspěvky: 4647
Reputace:   248 
 

Re: Matice - 2 nejmensi prvky a jejich souradnice

↑ Kuba #8:
To je zajímavé, že mně to funguje.

Offline

 

#7 10. 12. 2014 08:14

Kuba #8
Zelenáč
Příspěvky: 5
Reputace:   
 

Re: Matice - 2 nejmensi prvky a jejich souradnice

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

 

#8 10. 12. 2014 09:13

Honzc
Příspěvky: 4647
Reputace:   248 
 

Re: Matice - 2 nejmensi prvky a jejich souradnice

↑ 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

 

#9 10. 12. 2014 22:42

Kuba #8
Zelenáč
Příspěvky: 5
Reputace:   
 

Re: Matice - 2 nejmensi prvky a jejich souradnice

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?

Code:

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

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson