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