program geometri_with_record;
{© yunisusanti informatic engineering UNS} uses wincrt;
type titik = record x, y : real; end;
garis = record
p, q : titik; end;
var garisA, garisB : garis; grad, inter, x, y, jrk : real;
procedure identitas; forward; (* memperkenalkan proc identitas yang blm dibuat, tp akan sering dipakai di procedure2 diatasnya *)
{================================= fungsi fungsi boolean ============================================} function ISSETITIK (p, q : titik): boolean; {syarat fungsi gradien, intercept, titikpot, dan jarak}
begin
issetitik := (p.x = q.x) and (p.y = q.y); {issetitik bila xP = xQ dan yP=yQ / x1 = x2 & y1 = y2}
end;
function ISVERTIKAL (p, q : titik): boolean; {syarat fungsi gradien} begin
isvertikal := (p.x = q.x) and (p.y <> q.y); {isvertikal bila x1 = x2 dan y1 tdk sm dgn y2} end;
function ISHORISONTAL (p, q : titik): boolean; {ishorisontal bila y1 = y2 dan x1 tdk sm dgn x2}
begin
ishorisontal := (p.y = q.y) and (p.x <> q.x); end;
{================================= end fungsi boolean ==============================================}
{================================= begin procedure manipulasi ======================================} procedure manipulasi;
{---begin of gradien---} procedure gradienku;
function GRADIEN (p, q : titik): real;
begin (* syarat dari menghitung gradien adl garis TIDAK setitik maupun vertikal *)
if (isvertikal(garisA.p, garisA.q) = false) and (issetitik(garisA.p, garisA.q) = false)
and (isvertikal(garisB.p, garisB.q) = false) and (issetitik(garisB.p, garisB.q) = false) then
begin
grad := (q.y - p.y) / (q.x - p.x); writeln; {rumus menghitung gradien} writeln(' ',grad:5:2); end
else begin clrscr;
gotoXY(15, 8); writeln('ada garis yang setitik/ vertikal, gradien tidak bisa dihitung !!');
gotoXY(15,10); write ('anda harus kembali ke menu !!');readln; identitas; end; end;
begin
clrscr;
gotoXY(15, 6); writeln('" gradien kedua garis "');
gradien(garisA.p,garisA.q); {memanggil fungsi gradien} gotoXY(15,13); writeln('- gradien garis B'); {untuk gradien dr garis B} gradien(garisB.p,garisB.q); {memanggil fungsi gradien} end;
{---end of gradien---} {--- begin of intercept ---} procedure intersepku;
function INTERCEPT (p,q: titik): real;
begin {intercept bisa dihitung jika garis tdk setitik}
if (issetitik(garisA.p, garisA.q) = false) and (issetitik(garisA.p, garisA.q) = false) then
begin {rumus menghitung intercept} inter := (p.y)-((p.x)*((q.y - p.y) / (q.x - p.x))); writeln; writeln(' ',inter:5:2);
end
else begin
clrscr; {jika garis setitik, maka intercept tdk bs dhitung}
gotoXY(15, 8); writeln('ada garis yang setitik, intercept tidak bisa dihitung !!');
gotoXY(15,10); write ('anda harus kembali ke menu !!');readln; identitas; end; end;
begin
clrscr;
gotoXY(15, 6); writeln('" intercept kedua garis "');
gotoXY(15, 9); writeln('- intercept garis A'); {intercept garis A}
intercept(garisA.p,garisA.q); {memanggil fungsi intercept} gotoXY(15,13); writeln('- intercept garis B'); {intercept garis B}
intercept(garisB.p, garisB.q); {memanggil fungsi intercept} end;
{--- end of intercept ---} {--- begin of titikpot ---} procedure TITIKPOTONG;
var grad1, grad2, int1, int2 : real; begin
with garisA do begin {menghitung gradien dan intersep garis A} grad1 := (q.y - p.y) / (q.x - p.x);
int1 := (p.y)-((p.x)*((q.y - p.y) / (q.x - p.x))); end;
with garisB do begin {menghitung gradien dan intersep garis A} grad2 := (q.y - p.y) / (q.x - p.x);
int2 := (p.y)-((p.x)*((q.y - p.y) / (q.x - p.x))); end;
{dibawah ini bentuk lain fungsi ISPARALEL -> yaitu mengecek apakah kedua gradien sama}
if (grad1 = grad2) then writeln(' tidak bisa dihitung titik potongnya !!') else begin {jika gradien tidak sama maka hitung titikpotong} x := (int2 - int1) / (grad1 - grad2);
y := grad1*x + int1;
writeln(' (',x:2:0,',',y:2:0,')'); end; end;
{--- end of titikpot ---} {--- begin of persamaan garis ---} procedure PERSAMAAN1; {mencetak persamaan dari garis A / garis yg pertama} begin
begin {persamaan y=intercept bila isvertikal false dan
{ishorisontal true}
if (ishorisontal(garisA.p, garisA.q) = true) then writeln(' y = ',inter:2:1) else {persamaan utuh / y=gradX + intercept jika
{isvertikal dan ishorisontal false} begin writeln(' y = ',grad:2:1,'x + ',inter:2:1,''); end;
end
else writeln(' x = ',garisA.p.x); {pers x=pX jika garisnya vertikal} end;
procedure PERSAMAAN2; {mencetak persamaan garis B / garis kedua} begin
if (isvertikal(garisB.p, garisB.q) = false) then begin
if (ishorisontal(garisB.p, garisB.q) = true) then writeln(' y = ',inter:2:1) else
begin writeln(' y = ',grad:2:1,'x + ',inter:2:1,''); end; end
else writeln(' x = ',garisB.p.x); end;
{--- end of persamaan garis ---} begin
clrscr;
gradienku; readln; {memanggil/ menampilkan gradien dan intercept} intersepku; readln;
clrscr; {menampilkan persamaan garis }
gotoXY(10, 6); writeln('" persamaan garis A dan garis B "');writeln; persamaan1; writeln; persamaan2; readln;
clrscr; {menampilkan titik potong}
gotoXY(10, 6); writeln('" titik potong garis A dan garis B "');writeln; titikpotong;
writeln; writeln;
write(' # press -enter- to back to menu... '); readln;
identitas; {kembali ke identitas / menu} end;
{================================= end procedure manipulasi =======================================} {================================= begin menghitung jarak =========================================} procedure jarakqu;
function JARAK (p, q : titik): real ; begin
jrk := sqrt(sqr(q.x - p.x) + sqr(q.y - p.y));writeln; {rumus menghitung jarak} writeln(' jarak is ', jrk:5:1);
end; var pil : char; begin
clrscr;
gotoXY(15, 7); writeln('" ingin menghitung jarak titik dari garis mana "'); gotoXY(15, 9); writeln('a. garis A B. garis B ');
gotoXY(13,18); write ('silahkan pilih !! '); readln(pil); if pil = 'a' then {jika ingin menghitung jarak titik dari garis A} begin {syarat menghitung jarak jika tidak setitik} if (issetitik(garisA.p, garisA.q) = false) then
jarak(garisA.p, garisA.q) else begin
clrscr;
gotoXY(15, 8); writeln('garis setitik, jarak tidak bisa dihitung !!'); gotoXY(15,10); write ('anda harus kembali ke menu !!');end;
end;
begin
if issetitik(garisB.p, garisB.q) = false then jarak(garisB.p, garisB.q)
else begin
clrscr; {jika garis ternyata setitik}
gotoXY(15, 8); writeln('garis setitik, jarak tidak bisa dihitung !!'); gotoXY(15,10); write ('anda harus kembali ke menu !! ');end; end;
readln;
identitas; {kembali ke menu utama / identitas} end;
{==================================== end menghitung jarak =======================================}
{================================= begin procedure cetaktitik ====================================} procedure CETAKTITIK;
var i : byte; begin
clrscr;
gotoXY(19, 6); writeln('" hasil cetak titik "');
gotoXY(15, 8); writeln('---'); gotoXY(15, 9); writeln('-- nama garis titik ke x y --'); gotoXY(15,10); writeln('---'); with garisA do {mencetak titik garis A}
begin writeln('garis a':25, '1':11, p.x:9:0, p.y:7:0);
writeln('garis a':25, '2':11, q.x:9:0, q.y:7:0); writeln; end;
with garisB do {mencetak titik garis B}
begin writeln('garis b':25, '1':11, p.x:9:0, p.y:7:0); writeln('garis b':25, '2':11, q.x:9:0, q.y:7:0); end;
writeln;
gotoXY(15,21); write('please select -enter- untuk menghitung jarak 2 titik !! '); readln;
jarakqu; {memanggil proc untuk menghitung jarak} end;
{================================= end procedure cetaktitik ========================= ============}
{================================= begin procedure inputdata =====================================} procedure INPUTDATA;
procedure garissatu; {input untuk garis A} begin
clrscr;
gotoXY(15,7); writeln('" inputkan 2 buah titik untuk garis A " '); writeln;writeln; writeln(' " titik ke (1) "');
with garisA do begin
write(' nilai x = '); readln(p.x);
write(' nilai y = '); readln(p.y); writeln; end;
writeln(' " titik ke (2) "'); with garisA do
begin
write(' nilai x = '); readln(q.x);
write(' nilai y = '); readln(q.y); writeln; end;
end;
procedure garisdua; {input untuk garis B} begin
clrscr;
gotoXY(15,7); writeln('" inputkan 2 buah titik untuk garis B" '); writeln;writeln; writeln(' " titik ke (1) "');
with garisB do begin
write(' nilai x = '); readln(p.x);
write(' nilai y = '); readln(p.y); writeln; end;
writeln(' " titik ke (2) "'); with garisB do
begin
write(' nilai x = '); readln(q.x);
write(' nilai y = '); readln(q.y); writeln; end;
end; var pil : char; label 1;
begin
garissatu; garisdua; 1: clrscr;
gotoXY(15, 6); writeln('" ingin manipulasi titik atau garis "'); gotoXY(15, 8); writeln('a. titik');
gotoXY(15,10); writeln('b. garis');
gotoXY(15,13); write('silahkan pilih !! '); readln(pil);
if pil = 'a' then cetaktitik; {jika ingin manipulasi titik/ cetak titik dan menghitung jarak}
if pil = 'b' then manipulasi {jika ingin manipulasi garis/ gradien, intersept, dll} else goto 1;
end;
{================================ begin procedure inputdata ======================================}
{================================= begin procedure identitas =====================================} procedure IDENTITAS;
label 1;
var pil : char; begin
1: clrscr;
gotoXY(15, 9); write('- n a m e " yuni susanti "'); gotoXY(15,11); write('- n i m " M0507054 "');
gotoXY(15,13); write('- program name " manipulasi perhitungan dasar geometri "'); gotoXY(15,15); write('- d a t e " 6 Maret 2008, at 07.39 pm "');
gotoXY(25,21); write('select (a) to start, and (b) to quit '); gotoXY(25,23); write('then press enter !! '); readln(pil); if pil = 'a' then inputdata; {memanggil procedure inputdata} if pil = 'b' then begin
clrscr;
gotoXY(15, 6); write('Thanks 4 Use This Program Of Geometry Manipulation !!!');
gotoXY(15,10); write('... press any key to quit ^^ ... '); readkey; donewincrt;
end
else goto 1; {jika pil selain a/ b maka akan kembali ke label 1} end;
{================================= end procedure identitas =======================================}
{================================= MAIN program ==================================================} begin
screensize.x := 90; {lebar screen horisontal/ x } screensize.y := 400; {lebar screen vertikal/ y } identitas;
end.