Piszę program w delphi. Ma sprawdzać poprawnosć rozwiązania układu równań.
Ma
wyświetlać takie komunikaty:
No dobrze. Na przyszłość ucz się pilnie.
Tak, dobrze to obliczyłeś
pOMYLIłEś SIę
Przecież to rozwiązywanie układ 2 równań liniowych o 2 niewiadomych
za pomocą wyznaczników (wzór Cramera).
Zależnie od współczynników układ może nie mieć rozwiązania. To
przecież nie zależy od mojej zdolności matematycznej. Jeśli współczynniki
są takie, ze układ nie ma rozwiązania to nie możesz twierdzić: "Pomyliłeś
się".
Dla zadanego zestawu współczynników możesz twierdzić tylko:
1. układ ma jedno rozwiązanie.
2. układ jest sprzeczny
3. układ ma nieskończenie wiele rozwiązań.
Jak to zrobić, bo nie moge sobie poradzić z instrukcją warunkowa?
p.s. jak połączyć dwa programy w 1 (bo to ma być druga część programu.
Pierwsza ma obliczać. Wszystko w osobnych okienkach)
Kod, który na razie zrobiłem:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
Dialogs, Menus, StdCtrls;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
File1: TMenuItem;
Edit7: TMenuItem;
Window1: TMenuItem;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Button1: TButton;
Label5: TLabel;
Label6: TLabel;
Edit8: TEdit;
Edit9: TEdit;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
procedure Window1Click(Sender: TObject);
procedure Edit7Click(Sender: TObject);
procedure File1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Window1Click(Sender: TObject);
begin
close;
end;
procedure TForm1.Edit7Click(Sender: TObject);
begin
showmessage('o mnie info')
end;
procedure TForm1.File1Click(Sender: TObject);
begin
Form1.ShowModal;
O co chodzi??? Przecież Form1 już jest wyświetlony.
Próba wywołania ShowModal dla takiego form powoduje
wyjątek.
procedure TForm1.Button1Click(Sender: TObject);
var
a, b, c, d, e, f, o, p, r, x, y : Real;
begin
a := StrToInt(Edit1.text);
b := StrToInt(Edit2.text);
c := StrToInt(Edit3.text);
d := StrToInt(Edit4.text);
e := StrToInt(Edit5.text);
f := StrToInt(Edit6.text);
o := a * e - b * d;
p := c * e - b * f;
r := a * f - c * d;
x := p / o;
y := r / o;
var
x, y, k, l : Boolean;
if x := k and y := l;
1. W bloku begin ... end nie można deklarować zmiennych.
2. Nawet jeśli p.1 jest dozwolony to aby porównać zmienne
to najpierw trzeba im nadać jakieś wartości, czego tu nie widać.
3. To chyba nie tak. Obliczysz wyznaczniki i powinieneś na
podstawie ich wartości wyrokować co do istnienia rozwiązań układu.
4. Sprawdzenie powinno być chyba tak:
Jeśli o <0 to
jest jedno rozwiązanie (x := p / o i y := r / o)
w przeciwnym razie (czyli o = 0) jeśli p <0 lub r <0 to
układ jest sprzeczny (nie ma rozwiązania)
w przeciwnym razie (czyli o = 0, p = 0, r = 0) to
układ jest sprzeczny lub nieoznaczony (nieskończenie wiele roz.)
Jeśli chcesz rozważyć i ten ostatni przypadek to chyba tak:
jeśli a <0 lub b <0 lub d <0 lub e <0 then
układ ma nieskończenie rozwiązań
(np. dla a <0 to
x = (c - b*y) / a oraz y = dowolny spełniają dany układ)
w przeciwnym razie jeśli c <0 lub f <0 to
układ sprzeczny
w przeciwnym razie (czyli a, b, c, d, e, f = 0) to
układ nieoznaczony - każde x i y dowolne spełniają układ.
Czyli w sumie jest tak:
procedure TForm1.Button1Click(Sender: TObject);
var
a, b, c, d, e, f, o, p, r, x, y : Integer;
s: string;
begin
a := StrToInt(Edit1.text);
b := StrToInt(Edit2.text);
c := StrToInt(Edit3.text);
d := StrToInt(Edit4.text);
e := StrToInt(Edit5.text);
f := StrToInt(Edit6.text);
o := a * e - b * d;
p := c * e - b * f;
r := a * f - c * d;
if o <0 then
begin
x := p / o;
y := r / o;
end
else if (p <0) or (r <0) then
ShowMessage('układ jest sprzeczny!!!')
else if (a <0) or (b <0) or (d <0) or (e <0) then
begin
if a <0 then
s := 'x = (c - b*y) / a, y = dowolny'
else if b <0 then
s := 'y = (c - a*x) / b, x = dowolny'
else if d <0 then
s := 'x = (f - e*y) / d, y = dowolny'
else
s := 'y = (f - d*x) / e, x = dowolny';
ShowMessage(s);
end
else if (c <0) or (f <0) then
ShowMessage('układ sprzeczny')
else
ShowMessage('x = dowolny, y = dowolny);
end;
Pisane w czytniku, może zawierać błędy, mogłem coś przeoczyć,
wszelkie udoskonalenie pożądane itd.
ps. Przyjąłem taki układ równań:
a*x + b*y = c
d*x + e*y = f
oraz współczynniki całkowite.
Tocbac.