PROJECT UJIAN AKHIR SEMESTER MATA KULIAH STRUKTUR DATA ‘’Program Kalkulator Scientific Sederhana’’
DOSEN:
MUH. ARIF RAHMAN
DISUSUN OLEH KELOMPOK 2:
NAMA NIM PERANAN
ARISSA MUJIBUDDA’WAT 10509050111100 8
LEADER DAN KODING ERMITA IKA .P 10509050011101 8 TINJAUAN PUSTAKA DIWA SAMPURNA 10509050711100 2 KODING DAN PPT BIMA ANORAGA 10509050011100 8 PENDAHULUAN DAN PERANCANGAN ARIFA RETNO PAKARTI 0810953006 IMPLEMENTASI PROGRAM
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM UNIVERSITAS BRAWIJAYA
2012 BAB I PENDAHULUAN 1.1Latar Belakang
Saat ini banyak terdapat alat-alat hitung yang dapat membantu untuk menyelesaikan masalah perhitungan. Alat hitung ini sangat membantu baik itu mahasiswa, siswa, pedagang, ibu rumah tangga dan pebisnis lainya. Salah satu alat hitung yang banyak digunakan pada zaman ini adalah kalkulator. Dengan sebuah alat bantu seperti Kalkulator penyelesaian masalah-masalah penghitungan seperti pembagian perkalian, pertambahan, pengurangan serta operasi hitung lainnya akan dapat dilakukan dengan cepat, efisien, teliti juga akurat. Dan dengan menggunakan kalkulator penghitungan aritmatika standart dalam menyelesaikan sebuah permasalahan matematika yang sering dijumpai.
Kalkulator merupakan salah satu alat hitung yang mudah digunakan. Kalkulator dapat membantu para pedagang dalam menghitung penjualan ataupun pembelian barang. Kebanyakan kalkulator yang beredar dipasaran merupakan kalkulator standar, baik itu dari segi warna, bentuk dan susunan tombol-tombol di dalamnya. Untuk itu penulis mencobauntuk memberikan desain yang berbeda, sehingga lebih menarik dan lebih mudah untuk digunakan.
Salah satu software yang dapat membantu untuk menyelesaikan masalah perhitungan adalah Delphi, Berangkat dari hal tersebut, mendorong penulis untuk memanfaatkan software tersebut dalam pembuatan program kalkulator scientific.
Dalam makalah yang berjudul “PEMBUATAN KALKULATOR DENGAN LAZARUS dan PASCAL” ini penulis akan menguraikan cara pembuatan dan penggunaan kalkulator scientific dengan menggunakan Program Delphi.
1.2 Batasan Masalah
Pada penulisan ilmiah ini, penulis membatasi masalah mengenai pembuatan aplikasi kalkulator untuk perhitungan sederhana dari inputan angka yang diinput oleh pengguna kalkulator.
1.3 Tujuan
1. Sebagai syarat memenuhi tugas akhir pengganti UAS
2. Mengetahui tata cara pembuatan sebuah kalkulator sederhana dan scientific kalkulator
1.4 Manfaat
Manfaat dari penulisan makalah ini diantaranya adalah: 1. Dapat mengerti dan memahami aplikasi stack dan program
2. Dapat mengetahui tata cara membuat sebuah kalkulator sederhana
3. Dapat mengetahui bagamiana mengkombinasikan koding-koding yang ada agar dapat menghasilkan suatu program tepat guna
BAB II
TINJAUAN PUSTAKA Definisi Kalkulator
Kalkulator adalah alat yang melakukan operasi aritmatika pada angka. Kalkulator sederhana dapat melakukan penambahan saja, pengurangan, perkalian, dan pembagian. Kalkulator yang lebih canggih dapat menangani operasi eksponensial, akar, logaritma, fungsi trigonometri, dan fungsi hiperbolik.
Kalkulator menjadi lebih maju sejak tahun 1970, mereka menjadi mampu membuat perhitungan yang melibatkan variabel (tidak diketahui) yaitu komputer pribadi. Komputer pribadi saat ini masih bisa melakukan operasi tersebut, dan sebagian disediakan dengan program kalkulator virtual yang tampilannya seperti kalkulator genggam. Tombol-tombol diaktifkan dengan menunjuk dan mengklik. Secara teoritis, sebuah komputer modern adalah kalkulator yang bekerja dengan biner angka dan memiliki memori jauh lebih besar. Namun dalam arti praktis, komputer jauh lebih dari kalkulator belaka, karena berbagai macam program yang terdapata pada komputer lebih canggih dari pada kalkulator.
Stack atau Tumpukan
Stack atau tumpukan adalah bentuk khusus dari linear list. Pada stack, penghapusan serta pemasukan elemennya hanya dapat dilakukan di satu posisi, yakni posisi akhir dari list. Posisi ini disebut puncak atau top dari stack. Elemen stack S pada posisi ini dinyatakan dengan TOP(S). Jelasnya, bila stack S [S1, S2, …, ST], maka TOP(S) adalah ST. Banyaknya elemen stack S pada suatu saat tertentu biasa kita sebut sebagai NOEL(S). Jadi untuk stack kita di atas, NOEL(S) = T. Seperti halnya pada semua linear list, pada stack dikenal operasi penghapusan dan pemasukan.
Operator penghapusan elemen pada stack disebut POP, sedangkan operator pemasukan elemen, disebut PUSH. Untuk menggambarkan kerja kedua operator di atas, berikut ini suatu contoh bermula dari stack hampa S[ ], yang kita gambar sebagai :
Terlihat bahwa kedua operasi di atas, pada stack adalah bersifat ‘terakhir masuk pertama keluar’ atau ‘last in first out (LIFO)’. Pada hakekatnya kita tidak membatasi berapa banyak elemen dapat masuk ke dalam stack. Untuk suatu stack S[S1, S2,..., SNOEL], kita katakan bahwa elemen Si, berada di atas elemen Sj, jika i lebih besar dari j. Suatu elemen tidak dapat kita POP ke luar, sebelum semua elemen di atasnya dikeluarkan.
Operasi pada stack
Terdapat empat operasi pada stack, yakni CREATE (stack), ISEMPTY(stack), PUSH(elemen, stack), dan POP (stack). CREATE(S) adalah operator yang menyebabkan stack S menjadi satu stack hampa. Jadi NOEL(CREATE(S)) adalah 0, dan TOP(CREATE(S)) tak terdefinisi. Sedangkan operator ISEMPTY(S) bermaksud memeriksa apakah stack S hampa atau tidak. Operandnya adalah data bertipe stack, sedangkan hasilnya merupakan data bertipe boolean. ISEMPTY(S) adalah true, jika S hampa, yakni bila NOEL(S) = 0, dan false dalam hal
lain. Jelas bahwa ISEMPTY(CREATE(S)) adalah true. Operator PUSH (E,S) akan bekerja menambahkan elemen E pada stack S. E ditempatkan sebagai TOP(S). Operator POP(S) merupakan operator yang bekerja mengeluarkan elemen TOP(S) dari dalam stack. POP(S) akan mengurangi nilai NOEL(S) dengan 1. Suatu kesalahan akan terjadi apabila, kita mencoba melakukan POP(S) terhadap stack S yang hampa.
Notasi Postfix
Aplikasi lain dari stack adalah pada kompilasi dari ekspresi dalam bahasa pemrograman tingkat tinggi. Kompilator harus mampu menyerahkan bentuk yang biasa, misalnya ((A+B)*C/D+E^F)/G ke suatu bentuk yang dapat lebih mudah dipergunakan dalam pembentukan kode objeknya. Cara yang biasa kita lakukan dalam menulis ekspresi aritmetik seperti di atas, dikenal sebagai notasi infix. Untuk operasi binar seperti menjumlah, membagi, mengurangi, mengalikan ataupun memangkatkan, operator tampil di antara dua operand, misalnya operator + tampil di antara operand A dan B pada operasi A + B. Stack dapat digunakan untuk mentransformasikan notasi infix ini menjadi notasi posfix. Pada notasi posfix, kedua operand tampil bersama di depan operator, misalnya AB+ atau PQ* dan sebagainya. Kompilator akan lebih mudah menangani ekspresi dalam notasi posfix ini. Berikut contoh melakukan pengalihan ekspresi infix ke postfix secara manual. Ekspresi infix = A + B / C * D akan dialihkan menjadi ekspresi postfix.
1. Pilih sub-ekspresi yang berisi “dua operand dan satu operator” yang memiliki level tertinggi di ekspresi di atas. Didapat B / C dan C * D. Pilih yang paling kiri, maka kita peroleh : B / C.
2. Ubah sub-ekspresi tersebut menjadi sebuah operand, misalkan B / C menjadi E, maka ekspresi semula menjadi : A + E * D.
3. Lakukan langkah ke (2) hingga ekspresi di atas menjadi “dua operand dan satu operator” saja. Didapat : A + F
4. Alihkan menjadi bentuk postfix : operand-operand-operator, diperoleh A F +
5. Kembalikan setiap operand menjadi ekspresi semula. F tadinya adalah E * D, maka nilai F = E * D. Satukan dengan ekspresi yang telah menjadi postfix. Hasilnya = A * E + D 6. Ulangi langkah ke (5) hingga terbentuk ekspresi postfix. Didapat A * B + C / D. Dengan
demikian, ekspresi infix : A+B/C*D akan menjadi ABC/D*+ dalam notasi postfix. Perhatikan dan pelajari tabel berikut ini :
Ekspresi Infix Ekspresi Postfix A + B A + B A + B * C A + B * C (A + B) * C A + B * C A * B + C A + B * C
Bila ada sub-ekspresi di dalam tanda kurung, maka sub-ekspresi tersebut harus dikerjakan terlebih dulu. Berikut ini diberikan sebuah algoritma untuk mengubah notasi infix ke dalam notasi posfix. Sebuah stack digunakan untuk keperluan ini. Ekspresi diamati satu persatu dari kiri ke kanan. Pada algoritma ini terdapat 4 aturan dasar, sebagai berikut :
1. Jika simbol adalah ''('' (kurung buka), maka ia kita PUSH ke dalam stack
2. Jika simbol adalah '')'' (kurung tutup), POP dari stack elemen-elemen stack, sampai pertama kali kita POP simbol ''(''. Semua elemen stack yang di POP tersebut merupakan output, kecuali ''('' tadi.
3. Jika simbol adalah sebuah operand, tanpa melakukan perubahan elemen stack, operand tersebut langsung mcrupakan output.
4. Jika simbol adalah sebuah operator, maka jika TOP stack adalah operator dengan level lebih tinggi atau sama, maka elemen TOP kita POP, sekaligus keluar sebagai output, dilanjutkan proses seperti ini sampai TOP merupakan ''('' atau operator dengan level lebih rendah. Kalau hal ini terjadi, operator (yang diamati) kita PUSH ke dalam stack. Biasanya ditambahkan simbol ; (titik-koma) sebagai penutup ekspresi. Dalam keadaan ini, kita POP semua elemen stack, sehingga stack menjadi hampa. Dapat dicatat bahwa terdapat 3 level operator, yakni pemangkatan (level tertinggi), level menengahnya adalah perkalian (*) dan pembagian (/) dan level terendah adalah penjumlahan (+) dan pengurangan (-).
Array
Array merupakan kumpulan dari nilai-nilai data yang bertipe sama dalam urutan tertentu yang menggunakan nama yang sama. Array merupakan kumpulan dari nilai-nilai data yang bertipe sama dalam urutan tertentu yang menggunakan nama yang sama. Dilihat dari dimensinya array dapat dibagi menjadi Array dimensi satu, array dimensi dua dan array multi-dimensi. Suatu array dapat dibedakan atas 2 (dua) bagian, yaitu :
a. Array berdimensi satu
Array berdimensi satu dapat dikatakan sebagai suatu daftar yang linier atau sebuah kolom.
Bentuk deklarasi dari array jenis ini dalam bahasa Pascal adalah : VAR nama_array : ARRAY [index] OF jenis_elemen;
Contoh :
VAR x : ARRAY [1..10] OF integer;
Contoh :
VAR A : ARRAY [1..3,1..4] OF integer; Array A di atas terdiri atas 12 elemen, yaitu : A[1,1] A[1,2] A[1,3] A[1,4] A[2,1] A[2,2] A[2,3] A[2,4] A[3,1] A[3,2] A[3,3] A[3,4] Masing-masing A[i,j] diatas adalah integer (i = 1,2,3 ; j = 1,2,3,4)
Array dapat bertipe data sederhana seperti byte, word, integer, real, bolean, char, string dan tipe data scalar atau subrange.
b. Array berdimensi dua
Array dua dimensi merupakan array yang terdiri dari m buah baris dan n buah kolom. Bentuknya dapat berupa matriks atau tabel.
Deklarasi array :
tipe_array nama_array[baris][kolom]; Contoh :
int X[3][4];
Cara mengakses array : Contoh :
X[0][3] = 33; X[2][0] = 34; X[1][2] = 97; X[3][2] = ?
Seperti array berdimensi satu, array berdimensi dua juga bisa diinisialisasi. Contoh deklarasi:
int nilai[2][3] = {{24,63,91},{13,25,68}}; Atau
int nilai2[2][3]= {24,63,91,13,25,98}; Array Berdimensi Banyak
Bentuk umum deklarasi array dimensi banyak :
dimana uk_1, uk_2, uk_n adalah ukuran dari array. Contoh deklarasi:
int nilai[4][2][7]; Array Tak Berukuran
Array dapat dideklarasikan tanpa memberi ukuran (jumlah data dalam array). Dengan syarat:
- Harus langsung diinisialisasi.
- Hanya elemen pertama yang boleh tidak berukuran. Contoh:
int nilai[] = {32, 45, 67,21};
int nilai[][2]={{9,7},{4,2},{8,3}}; int nilai[][] = {32, 45, 67,21}; int nilai[];
Contoh Array Tdk Berukuran: #include <stdio.h> void main()
{float x[] = {5,3,7}, total = 0;int i;for (i=0;i<=2;i++)total = total + x[i];
printf (“Total = %f\n”,total);}
BAB III PERANCANGAN
Pada program aplikasi kalkulator sederhana yang kami buat dengan bahasa pemograman pascal menggunakan tipe data array dan stack. Untuk tipe data stack kami menggunakan 2 buah stack yaitu realStack dan charStack serta satu array yaitu
Prinsip dan cara kerja kalkulator sederhan dalam penggunaanya adalah perhitungann aritmatika yaitu menginputkan karakter yang sesuai (operan jenis angka atau operator operasi matematik). Selanjutnya akan membaca karakter tersebut sebagai ekspresi matematika. Karakter yang diinputkan kemudian dikonversi ke dalam bentuk real. Setelah dikonversi kemudian disimpan kedalam 2 buah stack untuk mempermudah pemanggilan dan mengecek operator atau operan sebelum melakukan perhitungan. Perhitungan dilakukan dengan memanfaatkan aplikasi stack dan menggunakan notasi infix. Hasilnya kemudian ditampilkan sebagai hasil dari perhitungan
Class dalam program Kalkulator_statB Type formula realStack CharStack Element Var Operands Operators Error Karakter JmlKarakter X Next
Procedure inisialKarakter Function clearReal Function emptyReal Function fullReal Procedure pushReal Procedure popReal Procedure clearChar Function emptyChar Function fullChar Procedure pushChar Procedure popChar Procedure konversi Procedure KonversiKeAsli Function derajat Procedure OperasiMatematik Procedure tanpaKurung Procedure hitung Procedure display
Kelas-kelas dalam program Program Kalkulator_statB; uses crt;
const
maxStack= 50; type
formula = array[1..maxStack] of char; realStack = record top: integer; element:array[1..maxStack] of real; end; charStack= record top: integer; element: formula; end;
var operands: realStack; operators: charStack; karakter: formula; jmlKarakter: integer; next: char; error : boolean; procedure inisialKarakter
procedure inisialKarakter(var karakter : formula; var akhir: integer);
var
i: integer; begin
writeln ('Kalkulator Sederhana Statistika');
writeln('Tulislah ekspresi Aritmatika tanpa tanda ("=") diakhir inputan');
writeln; i:=0;
while not eoln do begin i:=i+1; read(karakter[i]); end; readln; akhir:=i;akhir:=i;
end;
procedure clearReal
procedure clearReal(var stk: realStack); begin
stk.top:=0; end;
function emptyReal
function emptyReal (stk: realStack):boolean; begin
emptyReal:=stk.top=0; end;
function fullReal
function fullReal (stk: realStack) : boolean; begin
fullReal:=stk.top=maxStack; end;
procedure pushReal
procedure pushReal(var stk: realStack;elementBaru: real); begin
stk.top:=stk.top+1;
stk.element[stk.top]:=elementBaru; end;
procedure popReal
procedure popReal(var stk: realStack;var poppedElement:real);
begin
poppedElement:=stk.element[stk.top]; stk.top:= stk.top-1;
end;
procedure clearKar
procedure clearKar(var stk: charStack); begin
stk.top:=0; end;
function emptyKar
function emptyKar(stk: charStack):boolean; begin emptyKar:=stk.top=0; end; function fullKar function fullKar(stk:charStack):boolean; begin fullKar:=stk.top=maxStack; end; procedure pushKar
procedure pushKar(var stk: charStack;ElementBaru: char); begin
stk.top:=stk.top+1;
stk.element[stk.top]:=ElementBaru; end;
procedure popchar
procedure popchar(var stack: charStack;var poppedElement:char); begin poppedElement:=stack.element[stack.top]; stack.top:= stack.top-1; end; procedure konversi
procedure konversi(karakter: formula;i:integer;var hasil: real); begin case karakter[i] of '1': hasil :=1; '2': hasil :=2; '3': hasil :=3; '4': hasil :=4; '5': hasil :=5; '6': hasil :=6; '7': hasil :=7; '8': hasil :=8; '9': hasil :=9; '0': hasil :=0; end; end; procedure KonversiKeAsli
procedure KonversiKeAsli(var operands : realstack; i:integer);
var basis,j: integer; angka,poppedReal:real; begin basis:=1; angka:= 0; for j:=1 to i-1 do begin popReal(operands, poppedReal); angka:=angka+basis*poppedReal; basis:=basis*10; end; pushReal(operands, angka); end; function derajat function derajat(op:char):integer; begin case op of '*','/': derajat:=2; '+','-': derajat:=1; end; end; procedure OperasiMatematik
procedure OperasiMatematik(var operands:realStack;var operators:charStack);
var x,y,z : real; stackOperandPenuh,stackOperatorKosong,stackOperandKosong :boolean; poppedReal : real; poppedChar : char; begin stackOperandKosong:=emptyReal(operands); if not stackOperandKosong then
popReal(operands,poppedReal); x:=poppedReal;
stackOperandKosong:=emptyReal(operands); if not stackOperandKosong then
popReal(operands,poppedReal); y:=poppedReal;
stackOperatorKosong:=emptyKar(operators); if not stackOperatorKosong then
popChar(operators,poppedChar); case poppedChar of '*': z:=x*y; '/': z:=x/y; '+': z:=x+y; '-': z:=y-x; end; stackOperandPenuh:= fullReal(operands); if not stackOperandPenuh then
pushReal(operands, z); end;
procedure tanpaKurung
procedure tanpaKurung(var operands: realStack; var operators: charStack; var z:real);
type simpanReal= record penanda: integer; isi : real; end; simpanChar= record drjt,penanda: integer; isi : char; end; var
tempReal: array[1..maxStack] of simpanReal; tempChar: array[1..maxStack] of simpanChar; i,iTempReal,iTempOp : integer; stackOperatorKosong,stackOperandKosong : boolean; x,y,poppedReal: real; poppedChar: char; begin z:=0; iTempReal:=1; stackOperandKosong:=emptyReal(operands); while (not stackOperandKosong) do
begin popReal(operands, poppedReal); tempReal[iTempReal].isi:=poppedReal; tempReal[iTempReal].penanda:=1; iTempReal:=iTempReal+1; stackOperandKosong:=emptyReal(operands); end; iTempReal:=iTempReal-1; iTempOp:=1; stackOperatorKosong:=emptyKar(operators); while (not stackOperatorKosong) do
begin popChar(operators, poppedChar); tempChar[iTempOp].isi:=poppedChar; tempChar[iTempOp].drjt:=derajat(poppedChar); tempChar[iTempOp].penanda:=1; iTempOp:=iTempOp+1; stackOperatorKosong:=emptyKar(operators);
end;
iTempOp:=iTempOp-1;
for i:=iTempOp downto 1 do begin
if ((tempChar[i].drjt=2) and
(tempReal[i+1].penanda=1) and(tempReal[i].penanda=1)) then begin x:=tempReal[i+1].isi; tempReal[i+1].penanda:=0; y:=tempReal[i].isi; if tempChar[i].isi='*' then z:=x*y else z:=x/y; tempReal[i].isi:=z; tempChar[i].penanda:=0; end; end;
for i:=iTempOp downto 1 do begin if tempChar[i].penanda<>0 then begin x:=tempReal[i+1].isi; tempReal[i+1].penanda:=0; if tempReal[i].penanda<>0 then y:=tempReal[i].isi; if tempChar[i].isi= '+' then z:=x+y else z:=x-y; tempReal[i].isi:=z; end; end; end; procedure hitung
procedure hitung (var operands:realStack;var operators:charStack;banyakKarakter:integer); var
i, posisiOperator:integer; hasilKonversi, hasil:real; op : set of char;
stackOperatorPenuh, stackOperandPenuh: boolean; begin op:=['+','/','-','*']; i:=1; posisiOperator:=0; while i<=banyakKarakter do begin if karakter[i]=')' then begin posisiOperator:=i-posisiOperator; if posisiOperator>2 then KonversiKeAsli(operands, posisiOperator); posisiOperator:=i; OperasiMatematik(operands, operators); i:=i+1; end else begin if karakter[i]='(' then begin i:=i+1; posisiOperator:=posisiOperator+1; end else begin if karakter[i] in op then begin stackOperatorPenuh:=fullKar(operators); if not stackOperatorPenuh then
pushKar(operators, karakter[i]); posisiOperator:=i-posisiOperator; if posisiOperator>2 then
KonversiKeAsli(operands, posisiOperator);
if ((posisiOperator <= 1) or (i = banyakKarakter)) then error := true;
posisiOperator:=i; i:=i+1;
else begin
konversi(karakter, i, hasilKonversi); stackOperandPenuh:=fullReal(operands); if not stackOperandPenuh then
pushReal(operands, hasilKonversi); i:=i+1; end; end; end; end; if karakter[banyakKarakter]<>')' then begin posisiOperator:=banyakKarakter-posisiOperator+1; KonversiKeAsli(operands, posisiOperator); end; if operands.top>1 then begin
tanpaKurung(operands, operators, hasil); stackOperandPenuh:=fullReal(operands); if not stackOperandPenuh then
pushReal(operands, hasil); end;
end;
procedure display
procedure display(operands: realStack); var
stackOperandKosong: boolean; poppedReal: real;
begin
if error then
writeln('Maaf Salah Syntax Error, Masukan Yang Bener Ya!')
else begin
stackOperandKosong:=emptyReal(operands); if not stackOperandKosong then
popReal(operands, poppedReal);
writeln('Hasilnya = ',poppedReal:8:2); end;
readln;
write('Pilih Y [LANJUT] untuk menghitung kembali, atau T [TIDAK] untuk keluar: ');
end; begin clrscr; repeat clrscr; writeln('***KALKULATOR***'); inisialKarakter(karakter, jmlKarakter); clearKar(operators); clearReal(operands); error := false;
hitung (operands, operators, jmlKarakter); display(operands);next:=readkey;
until upcase(next)<>'Y'; end.
BAB IV
IMPLEMENTASI DAN UJICOBA 4.1 Pengimplementasian source code
Program Kalkulator_statB; uses crt;
const
maxStack= 50; type
formula = array[1..maxStack] of char; realStack = record top: integer; element:array[1..maxStack] of real; end; charStack= record top: integer; element: formula; end;
var operands: realStack; operators: charStack; karakter: formula; jmlKarakter: integer; next: char;
error : boolean;
procedure inisialKarakter(var karakter : formula; var akhir: integer);
var
i: integer; begin
writeln ('Kalkulator Sederhana Statistika');
writeln('Tulislah ekspresi aritmatika tanpa tanda ("=") diakhir inputan');
writeln; i:=0;
while not eoln do begin i:=i+1; read(karakter[i]); end; readln; akhir:=i;akhir:=i;
end;
procedure clearReal(var stk: realStack); begin
stk.top:=0; end;
function emptyReal (stk: realStack):boolean; begin
emptyReal:=stk.top=0; end;
function fullReal (stk: realStack) : boolean; begin
fullReal:=stk.top=maxStack; end;
procedure pushReal(var stk: realStack;elementBaru: real); begin
stk.top:=stk.top+1;
stk.element[stk.top]:=elementBaru; end;
procedure popReal(var stk: realStack;var poppedElement:real);
begin
poppedElement:=stk.element[stk.top]; stk.top:= stk.top-1;
end;
procedure clearKar(var stk: charStack); begin
stk.top:=0; end;
function emptyKar(stk: charStack):boolean; begin
emptyKar:=stk.top=0; end;
begin
fullKar:=stk.top=maxStack; end;
procedure pushKar(var stk: charStack;ElementBaru: char); begin
stk.top:=stk.top+1;
stk.element[stk.top]:=ElementBaru; end;
procedure popchar(var stack: charStack;var poppedElement:char);
begin
poppedElement:=stack.element[stack.top]; stack.top:= stack.top-1;
end;
procedure konversi(karakter: formula;i:integer;var hasil: real); begin case karakter[i] of '1': hasil :=1; '2': hasil :=2; '3': hasil :=3; '4': hasil :=4; '5': hasil :=5; '6': hasil :=6; '7': hasil :=7; '8': hasil :=8; '9': hasil :=9; '0': hasil :=0; end; end;
procedure KonversiKeAsli(var operands : realstack; i:integer); var basis,j: integer; angka,poppedReal:real; begin basis:=1; angka:= 0;
for j:=1 to i-1 do begin popReal(operands, poppedReal); angka:=angka+basis*poppedReal; basis:=basis*10; end; pushReal(operands, angka); end; function derajat(op:char):integer; begin case op of '*','/': derajat:=2; '+','-': derajat:=1; end; end;
procedure OperasiMatematik(var operands:realStack;var operators:charStack); var x,y,z : real; stackOperandPenuh,stackOperatorKosong,stackOperandKosong :boolean; poppedReal : real; poppedChar : char; begin stackOperandKosong:=emptyReal(operands); if not stackOperandKosong then
popReal(operands,poppedReal); x:=poppedReal;
stackOperandKosong:=emptyReal(operands); if not stackOperandKosong then
popReal(operands,poppedReal); y:=poppedReal;
stackOperatorKosong:=emptyKar(operators); if not stackOperatorKosong then
popChar(operators,poppedChar); case poppedChar of
'*': z:=x*y; '/': z:=x/y;
'+': z:=x+y; '-': z:=y-x; end;
stackOperandPenuh:= fullReal(operands); if not stackOperandPenuh then
pushReal(operands, z); end;
procedure tanpaKurung(var operands: realStack; var operators: charStack; var z:real);
type simpanReal= record penanda: integer; isi : real; end; simpanChar= record drjt,penanda: integer; isi : char; end; var
tempReal: array[1..maxStack] of simpanReal; tempChar: array[1..maxStack] of simpanChar; i,iTempReal,iTempOp : integer; stackOperatorKosong,stackOperandKosong : boolean; x,y,poppedReal: real; poppedChar: char; begin z:=0; iTempReal:=1; stackOperandKosong:=emptyReal(operands); while (not stackOperandKosong) do
begin popReal(operands, poppedReal); tempReal[iTempReal].isi:=poppedReal; tempReal[iTempReal].penanda:=1; iTempReal:=iTempReal+1; stackOperandKosong:=emptyReal(operands); end; iTempReal:=iTempReal-1;
iTempOp:=1;
stackOperatorKosong:=emptyKar(operators); while (not stackOperatorKosong) do
begin popChar(operators, poppedChar); tempChar[iTempOp].isi:=poppedChar; tempChar[iTempOp].drjt:=derajat(poppedChar); tempChar[iTempOp].penanda:=1; iTempOp:=iTempOp+1; stackOperatorKosong:=emptyKar(operators); end; iTempOp:=iTempOp-1;
for i:=iTempOp downto 1 do begin
if ((tempChar[i].drjt=2) and
(tempReal[i+1].penanda=1) and(tempReal[i].penanda=1)) then begin x:=tempReal[i+1].isi; tempReal[i+1].penanda:=0; y:=tempReal[i].isi; if tempChar[i].isi='*' then z:=x*y else z:=x/y; tempReal[i].isi:=z; tempChar[i].penanda:=0; end; end;
for i:=iTempOp downto 1 do begin if tempChar[i].penanda<>0 then begin x:=tempReal[i+1].isi; tempReal[i+1].penanda:=0; if tempReal[i].penanda<>0 then y:=tempReal[i].isi; if tempChar[i].isi= '+' then z:=x+y else z:=x-y; tempReal[i].isi:=z;
end; end;
end;
procedure hitung (var operands:realStack;var operators:charStack;banyakKarakter:integer); var
i, posisiOperator:integer; hasilKonversi, hasil:real; op : set of char;
stackOperatorPenuh, stackOperandPenuh: boolean; begin op:=['+','/','-','*']; i:=1; posisiOperator:=0; while i<=banyakKarakter do begin if karakter[i]=')' then begin posisiOperator:=i-posisiOperator; if posisiOperator>2 then KonversiKeAsli(operands, posisiOperator); posisiOperator:=i; OperasiMatematik(operands, operators); i:=i+1; end else begin if karakter[i]='(' then begin i:=i+1; posisiOperator:=posisiOperator+1; end else begin if karakter[i] in op then begin stackOperatorPenuh:=fullKar(operators); if not stackOperatorPenuh then
pushKar(operators, karakter[i]); posisiOperator:=i-posisiOperator;
if posisiOperator>2 then
KonversiKeAsli(operands, posisiOperator);
if ((posisiOperator <= 1) or (i = banyakKarakter)) then error := true; posisiOperator:=i; i:=i+1; end else begin konversi(karakter, i, hasilKonversi); stackOperandPenuh:=fullReal(operands); if not stackOperandPenuh then
pushReal(operands, hasilKonversi); i:=i+1; end; end; end; end; if karakter[banyakKarakter]<>')' then begin posisiOperator:=banyakKarakter-posisiOperator+1; KonversiKeAsli(operands, posisiOperator); end; if operands.top>1 then begin
tanpaKurung(operands, operators, hasil); stackOperandPenuh:=fullReal(operands); if not stackOperandPenuh then
pushReal(operands, hasil); end;
end;
procedure display(operands: realStack); var
stackOperandKosong: boolean; poppedReal: real;
begin
if error then
writeln('Maaf Salah Syntax Error, Masukan Yang Bener Ya!')
begin
stackOperandKosong:=emptyReal(operands); if not stackOperandKosong then
popReal(operands, poppedReal);
writeln('Hasilnya = ',poppedReal:8:2); end;
readln;
write('Pilih Y [LANJUT] untuk menghitung kembali, atau T [TIDAK] untuk keluar: ');
end; begin clrscr; repeat clrscr; writeln('***KALKULATOR***'); inisialKarakter(karakter, jmlKarakter); clearKar(operators); clearReal(operands); error := false;
hitung (operands, operators, jmlKarakter); display(operands);next:=readkey;
until upcase(next)<>'Y'; end.
BAB V PENUTUP
5.1 Kesimpulan
Tipe data kalkulator sederhana ini yaitu menggunakan array dan stack.Array adalah suatu tipe data terstruktur yang dapat menyimpan banyak data dengan suatu nama yang sama menempati temapat di memori yang berurutan serta bertipe data sama pula. Pada stack, penghapusan serta pemasukan elemennya hanya dapat dilakukan di satu posisi, yakni posisi akhir dari list. Posisi ini disebut puncak atau top dari stack. Elemen stack S pada posisi ini dinyatakan dengan TOP(S). Jelasnya, bila stack S [S1, S2, …, ST], maka TOP(S) adalah ST. Dari aplikasi program kalkulator scientific sederhana yang kelompok kami buat dengan tipe data inputan string dapat mengoperasikan operasi matematika yaitu berupa pertambahan, pengurangan, perkalian, dan pembagian. Selain itu memiliki kemampuan membaca ekspresi operasi hitung yang berada di dalam simbol tanda kurung dengan mendahulukan operator lalu kemudian operan berikutnya. Dalam kalkulator ini juga kita dapat mengetahui apabila kita salah menginputkan operator yang dimasukan dalam perhitungan maka secara otomatis akan muncul peringatan “Maaf Salah Syntax Error, Masukan Yang Bener Ya!”
5.2 Saran
Sebaiknya dalam kalkulator ini ditambahkan fungsi matematika yang seperti trigonometri, log, pangkat eksponensial, akar, dan fungsi lainnya yang membuat kalkulator ini menjadi lebih scientific lagi dan dalam pengkombinasian koding perlu ketelitian dan kesabaran dalam membuat
DAFTAR PUSTAKA
Jogiyanto HM. 2005.Torbo Pascal Jilid 1 dan 2. Andi Yogyakarta: Yogyakarta Lipschutz,Seymour.1986. Data Structures.McGraw Hill
Rinaladi Munir. 2007. Algoritma Dan Pemrograman Bahasa Pascal dan C .Bandung: Informatika