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
Stránky: 1

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

↑ 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

↑ 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é ;))
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
↑ 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:
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:
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_IFDolní trojúhelníková matice by se zjišťovala třeba takto:
FOR i FROM 1 to (n-1) FOR j FROM (i+1) to n ...
Offline

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
Stránky: 1