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
Mám za úkol v pascalu vytvořit program pro výpočet soustavy 4 rovnic o 4 neznámých. Rozhodl jsem se použít Cramerovo a Sarrusovo pravidlo, akorát že můj program vždy spadne nebo vypíše, že soustava nemá řešení. Pomozte mi prosím, aby to počítalo :-D
Děkuji
Sarrus + Crameron (dole)
http://ifanda.cz/clanky/matematika/mozn … terminantu
program matdet;
uses
crt;
type
Tpole = array[1..5,1..5] of real;
var
m,n,i: integer;
r: Tpole;
d0,d1,d2,d3,d4,x1,x2,x3,x4: real;
procedure zapis;
begin
writeln('Vitejte v programu pro vypocet rovnic o ctyrech neznamych. V nasledujicich krocich postupujte dle instrukci, program zbytek spocita. Stisknete ENTER');
readln();
clrscr;
writeln('Nyni dle navodu zapiste hodnoty rovnic');
m:= 1;
for i:= 1 to 4 do
begin
clrscr;
n:= 1;
writeln('ax1 + bx2 + cx3 + dx4 = e');
writeln('Zapis "a" hodnotu ',m,'. rovnice, ');
readln(r[m,n]);
writeln('Zapis "b" hodnotu ',m,'. rovnice, ');
readln(r[m,n+1]);
writeln('Zapis "c" hodnotu ',m,'. rovnice, ');
readln(r[m,n+1]);
writeln('Zapis "d" hodnotu ',m,'. rovnice, ');
readln(r[m,n+1]);
writeln('Zapis "e" hodnotu ',m,'. rovnice, ');
readln(r[m,n+1]);
m:= m+1;
end;
end;
procedure determinanty;
var
a,b,c,d: integer;
begin
d0:= ( r[1,1]*r[2,2]*r[3,3]*r[4,4] + r[2,1]*r[3,2]*r[4,3]*r[1,4] + r[3,1]*r[4,2]*r[1,3]*r[2,4] + r[4,1]*r[1,2]*r[2,3]*r[3,4] )
- ( r[4,1]*r[3,2]*r[2,3]*r[1,4] + r[1,1]*r[4,2]*r[3,3]*r[2,1] + r[2,1]*r[1,2]*r[4,3]*r[3,4] + r[3,1]*r[2,2]*r[1,3]*r[4,4] );
if d0 <> 0 then
begin
a:= 1;
b:= 2;
c:= 3;
d:= 4;
d1:= ( r[1,a]*r[2,b]*r[3,c]*r[4,d] + r[2,a]*r[3,b]*r[4,c]*r[1,d] + r[3,a]*r[4,b]*r[1,c]*r[2,d] + r[4,a]*r[1,b]*r[2,c]*r[3,d] )
- ( r[4,a]*r[3,b]*r[2,c]*r[1,d] + r[1,a]*r[4,b]*r[3,c]*r[2,d] + r[2,a]*r[1,b]*r[4,c]*r[3,d] + r[3,a]*r[2,b]*r[1,c]*r[4,d] );
a:= a-4;
b:= b+3;
d2:= ( r[1,a]*r[2,b]*r[3,c]*r[4,d] + r[2,a]*r[3,b]*r[4,c]*r[1,d] + r[3,a]*r[4,b]*r[1,c]*r[2,d] + r[4,a]*r[1,b]*r[2,c]*r[3,d] )
- ( r[4,a]*r[3,b]*r[2,c]*r[1,d] + r[1,a]*r[4,b]*r[3,c]*r[2,d] + r[2,a]*r[1,b]*r[4,c]*r[3,d] + r[3,a]*r[2,b]*r[1,c]*r[4,d] );
b:= b-3;
c:= c+2;
d3:= ( r[1,a]*r[2,b]*r[3,c]*r[4,d] + r[2,a]*r[3,b]*r[4,c]*r[1,d] + r[3,a]*r[4,b]*r[1,c]*r[2,d] + r[4,a]*r[1,b]*r[2,c]*r[3,d] )
- ( r[4,a]*r[3,b]*r[2,c]*r[1,d] + r[1,a]*r[4,b]*r[3,c]*r[2,d] + r[2,a]*r[1,b]*r[4,c]*r[3,d] + r[3,a]*r[2,b]*r[1,c]*r[4,d] );
c:= c-2;
d:= d+1;
d4:= ( r[1,a]*r[2,b]*r[3,c]*r[4,d] + r[2,a]*r[3,b]*r[4,c]*r[1,d] + r[3,a]*r[4,b]*r[1,c]*r[2,d] + r[4,a]*r[1,b]*r[2,c]*r[3,d] )
- ( r[4,a]*r[3,b]*r[2,c]*r[1,d] + r[1,a]*r[4,b]*r[3,c]*r[2,d] + r[2,a]*r[1,b]*r[4,c]*r[3,d] + r[3,a]*r[2,b]*r[1,c]*r[4,d] );
x1:= d1/d0;
x2:= d2/d0;
x3:= d3/d0;
x4:= d4/d0;
writeln('x1 = ',x1);
writeln('x2 = ',x2);
writeln('x3 = ',x3);
writeln('x4 = ',x4);
end
else
begin
writeln('Rovnice maji bud zadne nebo nekonecne mnoho reseni.');
end;
readln();
end;
begin
zapis;
determinanty;
end.Offline
Prosím ještě jednou o pomoc... chyba bude nejspíše v zadávání hodnot. Pro kontrolu jsem si je nechal vypsat a ať už jsem si předtím zadal cokoli, vždy mi vypíše všechny hodnoty nulové :( jsem už zoufalý, compilator žádnou chybu nehlásí, prosím o radu
program mat;
uses crt;
type
tpole = array[1..5,1..5] of integer;
var
m,i: integer;
r: tpole;
procedure zapis;
begin
clrscr;
m:= 1;
for i:= 1 to 4 do
begin
clrscr;
writeln('Nyni dle navodu zapiste hodnoty rovnic');
writeln('ax1 + bx2 + cx3 + dx4 = e');
writeln('Zapis "a" hodnotu ',m,'. rovnice, ');
readln(r[m,1]);
writeln('Zapis "b" hodnotu ',m,'. rovnice, ');
readln(r[m,2]);
writeln('Zapis "c" hodnotu ',m,'. rovnice, ');
readln(r[m,3]);
writeln('Zapis "d" hodnotu ',m,'. rovnice, ');
readln(r[m,4]);
writeln('Zapis "e" hodnotu ',m,'. rovnice, ');
readln(r[m,5]);
m:= m+1;
end;
end;
begin
zapis;
for i:= 1 to 4 do
begin
writeln(r[m,1]);
writeln(r[m,2]);
writeln(r[m,3]);
writeln(r[m,4]);
writeln(r[m,5]);
m:= m+1;
end;
readln;
end.Offline
Doporučoval bych používat v cyklech tu samotnou "řídící" proměnnou (v tomto případě i), ne pomocnou ( tu máš pojmenovanou m). To ale není chyba. Chyba je, že před cyklem v hlavním programu chybí
m:=1;
Takže po proceduře zapis v m zůstane hodnota 5 (čtyřikrát přičítáme jedničku, na začátku je tam jednička). V dalším cyklu, kde se vypisuje, bude tedy m nabývat hodnot 5 až 9 (jen se přičítá čtyřikrát jednička). Vypisujeme tedy hodnoty např. r[6,4], r[8,3], kde nic uloženo není. Program by tedy měl buď spadnout (pole je jen 1..5, nikoli 1..9) nebo vypsat nulu (do r[8,3] jsme opravdu nic neuložili -> je tam nula).
Řešením je tedy buď přidat řádek s nastavením m:=1; nebo vypisovat podle proměnné i, jak je videt v kódu zde:
program mat;
uses crt;
type
tpole = array[1..5,1..5] of integer;
var
m,i: integer;
r: tpole;
procedure zapis;
begin
clrscr;
for i:= 1 to 4 do
begin
clrscr;
writeln('Nyni dle navodu zapiste hodnoty rovnic');
writeln('ax1 + bx2 + cx3 + dx4 = e');
writeln('Zapis "a" hodnotu ',m,'. rovnice, ');
readln(r[i,1]);
writeln('Zapis "b" hodnotu ',m,'. rovnice, ');
readln(r[i,2]);
writeln('Zapis "c" hodnotu ',m,'. rovnice, ');
readln(r[i,3]);
writeln('Zapis "d" hodnotu ',m,'. rovnice, ');
readln(r[i,4]);
writeln('Zapis "e" hodnotu ',m,'. rovnice, ');
readln(r[i,5]);
end;
end;
begin
zapis;
for i:= 1 to 4 do
begin
writeln(r[i,1]);
writeln(r[i,2]);
writeln(r[i,3]);
writeln(r[i,4]);
writeln(r[i,5]);
end;
readln;
end.Offline
Stránky: 1