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 06. 06. 2011 21:56

motycka.majk
Zelenáč
Příspěvky: 4
Reputace:   
 

Matice, hledání nejmenšího a největšího čísla, procedury

Dobrý den, potřebuji od vás pomoc - jsem v koncích. Absolutně nevím, jak hnout s příkladem v pascalu.

Vytvoř program, který načte matici A velikosti 8x8 reálných čísel z klávesnice. Dále program určí pozici a hodnotu největšího a nejmenšího prvku matice a zjistí, zda matice A je trojúhelníková. Nakonec program matici i výsledky vypíše na. Pro načtení, výpis a zjištění výše uvedených vlastností použij funkce nebo procedury.
Budu rád za jakékoliv rady a pomoc.
Děkuji

Offline

 

#2 06. 06. 2011 21:59 — Editoval janca361 (06. 06. 2011 22:02)

janca361
.
Příspěvky: 3284
 

Re: Matice, hledání nejmenšího a největšího čísla, procedury

↑ motycka.majk:
Ani toto nezvládneš? Vytvoř (pod)program (proceduru), který načte matici A velikosti 8x8 reálných čísel z klávesnice.

Offline

 

#3 26. 06. 2011 20:29

janca361
.
Příspěvky: 3284
 

Re: Matice, hledání nejmenšího a největšího čísla, procedury

↑ janca361:
Kolega se asi už nehlásí a aby nezůstalo téma nevyřešené využiju ho k vlastnímu rozvoji ;) (Snad to nebude trestné ;))

Code:

program matice_procedury;
uses crt;
type typ_matice=array[1..8,1..8]of real;
procedure nacteni(var matice:typ_matice);
  var i1,i2:integer;
  begin
    for i1:=1 to 8 do
      begin
        for i2:=1 to 8 do
          begin
            write('Zadej prvek matice: ');
            readln(matice[i1,i2]);
          end;
       end;
   end;
procedure vypsani(var matice:typ_matice);
  var i1,i2:integer;
  begin
    for i1:=1 to 8 do
      begin
        for i2:=1 to 8 do write(matice[i1,i2],'');
        writeln;
      end;
  end;
procedure nejmensi_prvek(matice:typ_matice;var min:real;pozice1:integer;pozice2:integer);
  var i1,i2:integer;
      pomocna:real;
  begin
  pomocna:=matice[1,1];
  pozice1:=1;
  pozice2:=1;
    for i1:=1 to 8 do
      begin
        for i2:=1 to 8 do
          begin
            if matice[i1,i2]>pomocna then
              begin
                pomocna:=matice[i1,i2];
                pozice1:=i1;
                pozice2:=i2;
              end;
          end;
      end;
  end;
procedure nejvetsi_prvek(matice:typ_matice;var max:real;pozice1:integer;pozice2:integer);
  var i1,i2:integer;
      pomocna:real;
  begin
  pomocna:=matice[1,1];
  pozice1:=1;
  pozice2:=1;
    for i1:=1 to 8 do
      begin
        for i2:=1 to 8 do
          begin
            if matice[i1,i2]<pomocna then
              begin
                pomocna:=matice[i1,i2];
                pozice1:=i1;
                pozice2:=i2;
              end;
          end;
      end;
  end;
var matice:typ_matice;
    min,max:real;
    pozice1,pozice2:integer;

begin
clrscr;
nacteni(matice);
vypsani(matice);
nejmensi_prvek(matice,min,pozice1,pozice2);
writeln('Nejmensi prvek matice je ',min,'na pozici [',pozice1,',',pozice2,'].');
nejvetsi_prvek(matice,max,pozice1,pozice2);
writeln('Nejvetsi prvek matice je ',max,'na pozici [',pozice1,',',pozice2,'].');
end.

1) Jak formátovat real při vypisování?
2) Dá se dát pole (matice jako konstanta)? Kdo to má pořád zadávat, když to chci projet a zkusit ;)
3) Jak zjistit zda je matice trojúhelníková?

Čtvercová matice, která má nulové všechny prvky pod hlavní diagonálou (horní trojúhelníková matice) nebo nad hlavní diagonálou (dolní trojúhelníková matice).

Děkuji.

Možná, že tam jsou ještě nějaké chyby, ale když to píše takové hrůzy, tak je ani moc dobře odhalit nejde ;)

Offline

 

#4 27. 06. 2011 07:16 — Editoval musixx (27. 06. 2011 07:44)

musixx
Místo: Brno
Příspěvky: 1771
Reputace:   45 
 

Re: Matice, hledání nejmenšího a největšího čísla, procedury

↑ janca361: Jen pár připomínek -- k tvému vlastnímu rozvoji, jak píšeš:

Do procedury vypsani() není třeba předávat matici odkazem, protože pak by tu matici mohla ta procedura modifikovat. Na druhou stranu předání odkazem šetří stack (ale nevím, jestli jsi až tak daleko uvažovala).

Procedury na hledání nejmenšího a největšího (raději minimálního a maximálního) prvku máš přesně opačně a navíc nevrací indexy toho prvku, protože pozice1 a pozice2 předáváš hodnotou (bez "var").

V proceduže vypsani() by v tom write() měla na konci být asi mezera a ne prázdný řetězec, ne?

Načítání jde pro odlaďovací účely upravit třeba takto (nebo níže viz typovaná konstanta):

procedure nacteni(var matice:typ_matice);
  var i1,i2:integer;
  begin
    for i1:=1 to 8 do
      begin
        for i2:=1 to 8 do
          begin
            {write('Zadej prvek matice: ');
            readln(matice[i1,i2]);}
            matice[i1, i2] := random;

          end;
       end;
   end;

Výpis reálného čísla jde v Pascalu v proceduře write() ovlivnit takto: write(cislo:m:n). Detaily v manuálu. V praxi třeba write(cislo:0:2), což vypíše čísla na dvě desetinná místa.

Jestli rozumím správně dotazu 2), pak hledáš typovanou konstantu. Tohle:

Code:

type typ_matice=array[1..8,1..8]of real;
var matice: typ_matice;
const init_matice: typ_matice = ((1,2,3,4,5,6,7,8),
                                 (2,3,4,5,6,7,8,9),
                                 (3,4,5,6,7,8,9,0),
                                 (4,5,6,7,8,9,0,1),
                                 (5,6,7,8,9,0,1,2),
                                 (6,7,8,9,0,1,2,3),
                                 (7,8,9,0,1,2,3,4),
                                 (8,9,0,1,2,3,4,5));
begin
  { nacteni(matice); -- docasne nahrazeno za: }
  matice := init_matice;
end.

Matice je trojúhelníková, jestliže má pod hlavní diagonálnou nuly. Teda přesněji řečeno to je horní trojúhleníková matice. Dolní trojúhleníková by byla analogicky. Ale když se neřekne víc, myslívá se ta horní trojúhelníková. Takový pseudokód:

Code:

je_trojuhelnikova := TRUE

FOR i FROM 2 TO n
  FOR j FROM 1 TO (i-1)
    IF matice[i, j] <> 0 THEN
      je_trojuhelnikova := FALSE
      BREAK(2)
    END_IF
  END_FOR
END_FOR

IF je_trojuhelnikova THEN
  //matice je (horni) trojuhelnikova
ELSE
  //matice neni (horni) trojuhelnikova
END_IF

Dolní trojúhelníková matice by se zjišťovala třeba takto:

Code:

FOR i FROM 1 to (n-1)
  FOR j FROM (i+1) to n
...

Offline

 

#5 27. 06. 2011 16:49

janca361
.
Příspěvky: 3284
 

Re: Matice, hledání nejmenšího a největšího čísla, procedury

↑ musixx:

Do procedury vypsani() není třeba předávat matici odkazem, protože pak by tu matici mohla ta procedura modifikovat. Na druhou stranu předání odkazem šetří stack (ale nevím, jestli jsi až tak daleko uvažovala).

Není, ani nevím, proč jsme to tak dávala a opravdu jsem až tak daleko neuvažovala.

Procedury na hledání nejmenšího a největšího (raději minimálního a maximálního) prvku máš přesně opačně a navíc nevrací indexy toho prvku, protože pozice1 a pozice2 předáváš hodnotou (bez "var").

Měla jsem to spuštěné jen jednou a vylezly z toho takové čísla, že tam opravdu chybu objevit nešlo.
Myslela jsem si, že stačí var napsat před 1. a pak u ostatních bude taky, ale jak vidím, tak nestačí.

proceduže vypsani() by v tom write() měla na konci být asi mezera a ne prázdný řetězec, ne?

Měla, ale prý Borland Pascal nahrazuje prázdný řetězec mezerou, nezkoušela jsem to. Ale opět chyba, kterou bych objevila při spuštění, snad.

NAd trojúhelníkovou maticí popřemýšlím a případně se ozvu. Zatím děkuji.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson