Anda di halaman 1dari 34

PROJECT UJIAN AKHIR SEMESTER MATA KULIAH STRUKTUR DATA Program Kalkulator Scientific Sederhana

DOSEN: MUH. ARIF RAHMAN DISUSUN OLEH KELOMPOK 2: NAMA ARISSA MUJIBUDDAWAT ERMITA IKA .P DIWA SAMPURNA BIMA ANORAGA ARIFA RETNO PAKARTI NIM 10509050111100 8 10509050011101 8 10509050711100 2 10509050011100 8 0810953006 PERANAN LEADER DAN KODING TINJAUAN PUSTAKA KODING DAN PPT PENDAHULUAN DAN PERANCANGAN IMPLEMENTASI PROGRAM

FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM UNIVERSITAS BRAWIJAYA MALANG

2012 BAB I PENDAHULUAN


1.1 Latar 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 Adapun tujuan dari pembuatan makalah ini adalah :

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*C (A + B) * C A*B+C

A+B 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 : int X[3][4];

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 : tipe_data nama_var[uk_1][uk_2]..[uk_n]; 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 real); begin case '1': '2': '3': '4': '5': '6': '7': '8': '9': '0': end; end; konversi(karakter: formula;i:integer;var hasil:

karakter[i] of hasil :=1; hasil :=2; hasil :=3; hasil :=4; hasil :=5; hasil :=6; hasil :=7; hasil :=8; hasil :=9; hasil :=0;

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; 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 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; function fullKar(stk:charStack):boolean;

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 real); begin case '1': '2': '3': '4': '5': '6': '7': '8': '9': '0': end; end; konversi(karakter: formula;i:integer;var hasil:

karakter[i] of hasil :=1; hasil :=2; hasil :=3; hasil :=4; hasil :=5; hasil :=6; hasil :=7; hasil :=8; hasil :=9; hasil :=0;

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!') 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.

4.2 Screen shot

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

Abdul Kadir. 2004. Pemrograman Pascal Andi Yogyakarta: Yogyakarta

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

Anda mungkin juga menyukai