program operasi_matrik;
{© yunisusanti informatic engineering UNS} uses wincrt;
type indek = 1..20;
matrik = array[indek, indek] of real;
var barissatu, barisdua, kolomsatu, kolomdua : byte; matriksatu, matrikdua : matrik; tambah, minus, kali, transp, transp2 : matrik; i, j, k : byte; ulang : char;
procedure menu; forward; { *memperkenalkan procedure menu, yang dibuat dibawah utk dipanggil diatasnya* }
{================================= begin procedure input ===============================} procedure INPUTDATA;
procedure cetakmatrix (x : matrik; n,m : byte); {*untuk mencetak matrik dalam menu input*}
var i,j : integer; begin
write (' # tampilan matrik'); writeln;
for i := 1 to n do begin
writeln; for j := 1 to m do write(x[i,j]:19:0); writeln;
end;
end; {end procedure cetak}
procedure BACADATA; {*untuk input matrik secara manual dari keyboard*} var i, j : integer;
begin
clrscr;
gotoXY(20, 6); write('...i n p u t m a t r i k m a n u a l');
gotoXY(13, 8); write('# data matrik pertama'); {*untuk mengisi data matrik yang pertama*}
gotoXY(16,10); write('- baris : '); readln(barissatu); gotoXY(16,11); write('- kolom : '); readln(kolomsatu);
gotoXY(13,13); writeln('# masukkan nilai-nilai untuk matrik pertama '); for i := 1 to barissatu do
begin
for j := 1 to kolomsatu do begin
write(' - nilai (',i,',',j,') : '); readln(matriksatu[i,j]);
end; writeln; end;
cetakmatrix(matriksatu, barissatu, kolomsatu); {*memanggil proc cetak, utk cetak matrik pertama*}
writeln;
writeln(' : : : :::::::::::::::::::::::::::::::::::::::::::: : : :'); writeln;
writeln(' # data matrik kedua'); writeln; {*untuk mengisi data matrik yang kedua*}
write(' - baris : '); readln(barisdua); write(' - kolom : '); readln(kolomdua); writeln;
writeln(' # masukkan nilai-nilai untuk matrik kedua '); for i := 1 to barisdua do
begin
for j := 1 to kolomdua do begin
write(' - nilai (',i,',',j,') : '); readln(matrikdua[i, j]);
end; writeln; end;
cetakmatrix(matrikdua, barisdua, kolomdua); readln; {*memanggil proc cetak, utk cetak matrik kedua*}
end; {* end procedure baca data / manual*}
procedure BUATDATA; {*untuk input matrik dengan membangkitkan bilangan random*} var i, j : integer;
begin
randomize; clrscr;
gotoXY(20, 6); write('...i n p u t m a t r i k a u t o m a t i c'); gotoXY(13, 8); write('# data matrik pertama');
gotoXY(16,10); write('- baris : '); readln(barissatu); gotoXY(16,11); write('- kolom : '); readln(kolomsatu); for i := 1 to barissatu do
begin
for j := 1 to kolomsatu do begin
matriksatu[i,j] := random(100); {*angka random yang ditampilkan maksimal 100*}
end; writeln; end;
cetakmatrix(matriksatu, barissatu, kolomsatu); {*memanggil proc cetak, utk cetak matrik pertama*}
writeln;
writeln(' : : : :::::::::::::::::::::::::::::::::::::::::::: : : :'); writeln;
writeln(' # data matrik kedua'); writeln; write(' - baris : '); readln(barisdua); write(' - kolom : '); readln(kolomdua); for i := 1 to barisdua do
begin
for j := 1 to kolomdua do begin
matrikdua[i,j] := random(100); {*100 adalah batas maksimal angka random yg ditampilkan* }
end; writeln; end;
cetakmatrix(matrikdua, barisdua, kolomdua); readln; {*memanggil proc cetak, utk cetak matrik pertama*}
end;
var pil1 : char; {*main menu dari procedure input data*} begin
clrscr;
gotoXY(15, 6); write(' a. input data matrik secara manual'); gotoXY(15, 9); write(' b. input data matrik secara random'); gotoXY(20,13); write('... silahkan pilih (a) atau (b) : '); readln(pil1);
if pil1 = 'a' then bacadata else {*memanggil procedure bacadata*}
if pil1 = 'b' then buatdata; {*memanggil procedure buatdata*}
{================================= end procedure input =============================}
{================================= begin procedure cetak matrik =========================} procedure CETAKMATRIK (x : matrik; n,m : byte);
var i,j : integer; begin
clrscr;
gotoXY(13, 8); write('# hasil manipulasi matrik'); writeln; writeln; {*writeln dobel untk memberi jarak*}
for i := 1 to n do begin
writeln; for j := 1 to m do write(x[i,j]:19:1); writeln;
end; end;
{================================= end procedure cetak matrik ==========================}
{================================= fungsi - fungsi dlm manipulasi ==================} function DPTGANDA: boolean;
begin
dptganda := false; { *dapat ganda di set false terlebih dulu* }
if (kolomsatu = barisdua) then dptganda := true { *syarat agar matrik bisa digandakan* } else begin
clrscr;
gotoXY(15, 8); writeln('matrik tidak memenuhi syarat dari perkalian, and need to close !!');
end; end;
function DPTJUMLAH : boolean; begin
dptjumlah := false; { *dapat jumlah di set false terlebih dulu* }
if (barissatu = barisdua) and (kolomsatu = kolomdua) {syarat suatu matrik bisa dijumlahkan/ dikurangkan}
then dptjumlah := true else begin
clrscr;
gotoXY(15, 8); writeln('matrik tidak memenuhi syarat penjumlahan/pengurangan, N need to close !!');
end; end;
function BUJURSANGKAR : boolean; begin
bujursangkar := false; { * bujursangkar di set false terlebih dulu* } if (barissatu = kolomsatu) then bujursangkar := true
else begin
clrscr;
gotoXY(15, 8); writeln('bukan matrik bujur sangkar !!'); end;
end;
{================================= end fungsi-fungsi manipulasi =======================} {================================= begin procedure jumlah matrik ==================} procedure JUMLAH;
var i, j : integer; begin
if (dptjumlah = true) then begin {proc jumlah jalan jika syarat dptjumlah=true/} for i:=1 to barissatu do
begin
tambah[i,j] := matriksatu[i,j] + matrikdua[i,j]; {rumus penjumlahan matrik} end;
writeln;
cetakmatrik(tambah, barissatu, kolomsatu); { *untuk mencetak hasil penjumlahan* } end; end;
{================================= end procedure jumlah matrik ========================} {================================= begin procedure kurang matrik ==========================} procedure KURANG;
var i, j : integer; begin
if (dptjumlah = true) then begin {proc kurang jalan jika syarat dptjumlah=true} for i:=1 to barissatu do
begin
for j:=1 to kolomsatu do
minus[i,j] := matriksatu[i,j] - matrikdua[i,j]; {rumus pengurangan matrik} end;
writeln;
cetakmatrik(minus, barissatu, kolomsatu); { *untuk mencetak hasil pengurangan* } end; end;
{================================= end procedure kurang matrik ==========================} {================================= begin procedure ganda matrik =============}
procedure GANDA; var i, j, k : byte; begin
if (dptganda = true) then begin {proc ganda jalan jika syarat dptganda=true/ terpenuhi} for i := 1 to barissatu do begin for j := 1 to kolomdua do begin kali[i,j] := 0; for k := 1 to barisdua do begin
kali[i,j] := kali[i,j] + matriksatu[i,k] * matrikdua[k,j]; {perkalian matrik} end;
end; end; writeln;
cetakmatrik(kali, barissatu, kolomsatu); { *untuk mencetak hasil perkalian* } end;
end;
{================================= end procedure ganda matrik =========================} {================================= begin procedure transpose ================}
procedure TRANSPOSE; var i, j : byte; pil3 : char; begin
clrscr;
gotoXY(13, 6); writeln('# matrik yang ingin ditranpose'); writeln; gotoXY(15, 9); writeln('a. matrik pertama');
gotoXY(15,11); writeln('b. matrik kedua');
gotoXY(15,14); write('... pilih (a) atau (b) ? '); readln(pil3);
for i := 1 to kolomsatu do begin
for j := 1 to barissatu do begin
transp[i,j] := matriksatu [j,i]; {rumus mentranspose matrik untuk matrik satu} end;
writeln; end;
clrscr; { * dibawah ini untuk mencetak hasil transpose* } gotoXY(13, 8); write('# hasil transpose matrik'); writeln; writeln for i := 1 to kolomsatu do
begin
writeln; for j := 1 to barissatu do write(transp[i,j]:19:1); writeln;
end; end;
if pil3 = 'b' then begin for i := 1 to kolomdua do begin
for j := 1 to barisdua do begin
transp2[i,j] := matrikdua [j,i]; {rumus mentranspose matrik untuk matrik kedua} end;
writeln; end;
clrscr; { *untuk mencetak hasil transpose matrik kedua* } gotoXY(13, 8); write('# hasil transpose matrik'); writeln; writeln; for i := 1 to kolomdua do
begin
writeln; for j := 1 to barisdua do write(transp2[i,j]:19:1); writeln;
end; end; end;
{================================= end procedure transpose =======================}
{================================= begin function trace ============================} function trace: real;
var i, j : byte; pil4 : char; jum : real; begin
clrscr;
gotoXY(13, 6); writeln('# matrik yang ingin dihitung trace nya'); gotoXY(15, 9); writeln('a. matrik pertama');
gotoXY(15,11); writeln('b. matrik kedua');
gotoXY(15,14); write('... pilih (a) atau (b) ? '); readln(pil4);
clrscr;
gotoXY(13,8); writeln('# tampilan diagonal'); writeln; writeln;
if pil4 = 'a' then {jika yang dihitung trace matrik pertama} begin
if (bujursangkar = true) then begin jum := 0;
for i := 1 to barissatu do begin for j := 1 to kolomsatu do if (i = j) then
begin
write(matriksatu[i,j]:19:0); {mencetak diagonal matrik} jum := jum + matriksatu[i,j]; {menghitung trace}
end
else if (i+j)=(barissatu+1) then begin
write(matriksatu[i,j]:19:0); {mencetak diagonal matrik} jum := jum + matriksatu[i,j]; {menghitung trace}
end
else write('-':19); {elemen yang bukan diagonal diberi tanda - }
writeln; end;
writeln; writeln; write(' # jumlah trace nya : ',jum:5:1) end; end;
if pil4 = 'b' then {jika yang dihitung trace matrik kedua} if (bujursangkar = true) then begin
jum := 0;
for i := 1 to barisdua do begin for j := 1 to kolomdua do if (i = j) then
begin
write(matrikdua[i,j]:19:0); {mencetak diagonal matrik} jum := jum + matrikdua[i,j]; {menghitung trace}
end
else if (i+j)=(barissatu+1) then begin
write(matrikdua[i,j]:19:0); {mencetak diagonal matrik} jum := jum + matrikdua[i,j]; {menghitung trace}
end
else write('-':19); {elemen yang bukan diagonal diberi tanda - } writeln;
end;
writeln; writeln; write(' # jumlah trace nya : ',jum:5:1) end;
end;
{================================= end function trace ===============================}
{================================= begin procedure menu manipulasi ========================} procedure MANIPULASI;
var pil2 : char; label 1;
begin
1: clrscr;
gotoXY(15, 6); write('m a n i p u l a s i m a t r i k... '); gotoXY(15, 9); write(' a. menambahkan matrik (+) ');
gotoXY(15,11); write(' b. mengurangkan matrik (-)'); gotoXY(15,13); write(' c. menggandakan matrik (x)');
gotoXY(15,15); write(' d. hitung trace matrik (elemen diagonal)'); gotoXY(15,17); write(' e. transpose matrik');
gotoXY(20,20); write('... silahkan pilih (a), (b), (c), (d), atau (e) : '); readln(pil2);
inputdata; {memanggil procedure inputdata} case pil2 of
'a' : jumlah; {jika pil=a maka memanggil proc jumlah} 'b' : kurang; {jika pil=b maka memanggil proc kurang} 'c' : ganda; {jika pil=c maka memanggil proc ganda} 'd' : trace; {jika pil=d maka memanggil proc trace} 'e' : transpose {jika pil=e maka memanggil proc transpose} else goto 1
end;
writeln; writeln;
write(' # press -enter- to back to menu... '); readln;
clrscr; menu; end;
{================================= end procedure menu manipulasi =========================}
{================================= begin procedure identitas =========================} procedure IDENTITAS;
var nama, nim, namaprogram, tgl : char; begin
clrscr;
gotoXY(15, 9); write('... s e k i l a s p r o g r a m');
gotoXY(15,12); write('Program yang diberi nama "Manipulasi Matrik Dengan Pascal" ini '); gotoXY(10,14); write('dibuat pada tanggal 21 Februari 2008, sebagai tugas pertama dari mata');
gotoXY(10,16); write('kuliah -Struktur Data Dan Algoritma');
gotoXY(15,19); write('ps. this program was created by -Yuni Susanti, ilkomp 2007, M0507054-');
gotoXY(15,24); write('... e n t e r !! (next chapter : matrik manipulation :) '); readln;
clrscr;
manipulasi; {memanggil procedure manipulasi} end;
{================================= end procedure identitas ======================}
{================================= begin procedure menu utama =======================} procedure menu;
label 1;
var pil : char; begin
1: clrscr;
gotoXY(15, 8); write(' ::: t h i s p r o g r a m b e g i n w i t h... :::');
gotoXY(15,12); write(' # pilih (a) untuk start program, atau (b) untuk quit program... '); gotoXY(15,14); write(' then press -enter-... ');
readln(pil);
if pil = 'a' then identitas; {memanggil procedure identitas} if pil = 'b' then begin
clrscr;
gotoXY(15, 6); write('Thank You !!!');
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 menu utama ===========================}
{================================= main program ==================================} begin
screensize.x := 100; {lebar screen horisontal/ x } screensize.y := 400; {lebar screen vertikal/ y } menu;
end.