Makalah Edit stukur data

41
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 105090501111 008 LEADER DAN KODING ERMITA IKA .P 105090500111 018 TINJAUAN PUSTAKA DIWA SAMPURNA 105090507111 002 KODING DAN PPT BIMA ANORAGA 105090500111 008 PENDAHULUAN DAN PERANCANGAN ARIFA RETNO PAKARTI 0810953006 IMPLEMENTASI PROGRAM

description

membuat kalkulator

Transcript of Makalah Edit stukur data

Page 1: Makalah Edit stukur data

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 105090501111008 LEADER DAN KODING

ERMITA IKA .P 105090500111018 TINJAUAN PUSTAKA

DIWA SAMPURNA 105090507111002 KODING DAN PPT

BIMA ANORAGA 105090500111008 PENDAHULUAN DAN

PERANCANGAN

ARIFA RETNO PAKARTI 0810953006 IMPLEMENTASI PROGRAM

FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM

UNIVERSITAS BRAWIJAYA

MALANG

2012

Page 2: Makalah Edit stukur data

BAB IPENDAHULUAN

1.1 Latar Belakang

Saat ini banyak terdapat alat-alat hitung yang dapat membantu untuk menyelesaikanmasalah 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 UAS2. Mengetahui tata cara pembuatan sebuah kalkulator sederhana dan scientific kalkulator

Page 3: Makalah Edit stukur data

1.4 Manfaat

Manfaat dari penulisan makalah ini diantaranya adalah:

1. Dapat mengerti dan memahami aplikasi stack dan program2. Dapat mengetahui tata cara membuat sebuah kalkulator sederhana3. Dapat mengetahui bagamiana mengkombinasikan koding-koding yang ada agar dapat

menghasilkan suatu program tepat guna

Page 4: Makalah Edit stukur data

BAB IITINJAUAN 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 :

Page 5: Makalah Edit stukur data

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

Page 6: Makalah Edit stukur data

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 + D6. 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 :

Page 7: Makalah Edit stukur data

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 stack2. 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

Page 8: Makalah Edit stukur data

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 duaArray 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];

Page 9: Makalah Edit stukur data

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 BanyakBentuk 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 BerukuranArray 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);}

tipe_data nama_var[uk_1][uk_2]..[uk_n];

Page 10: Makalah Edit stukur data

BAB IIIPERANCANGAN

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 programKalkulator_statB

Type

formula

realStack

CharStack

Element

Var

Operands

Operators

Error

Karakter

JmlKarakter

X

Next

Page 11: Makalah Edit stukur data

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

Page 12: Makalah Edit stukur data

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);vari: 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]);

Page 13: Makalah Edit stukur data

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;

Page 14: Makalah Edit stukur data

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;

Page 15: Makalah Edit stukur data

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;

Page 16: Makalah Edit stukur data

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;

Page 17: Makalah Edit stukur data

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;

Page 18: Makalah Edit stukur data

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;

vartempReal: 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;

Page 19: Makalah Edit stukur data

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;

Page 20: Makalah Edit stukur data

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

Page 21: Makalah Edit stukur data

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]<>')' thenbegin posisiOperator:=banyakKarakter-posisiOperator+1; KonversiKeAsli(operands, posisiOperator);end;if operands.top>1 thenbegin tanpaKurung(operands, operators, hasil); stackOperandPenuh:=fullReal(operands); if not stackOperandPenuh then pushReal(operands, hasil);end;end;

Page 22: Makalah Edit stukur data

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.

Page 23: Makalah Edit stukur data

BAB IVIMPLEMENTASI 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);vari: 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]);

Page 24: Makalah Edit stukur data

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

Page 25: Makalah Edit stukur data

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 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

Page 26: Makalah Edit stukur data

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

Page 27: Makalah Edit stukur data

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;

vartempReal: 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;

Page 28: Makalah Edit stukur data

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

Page 29: Makalah Edit stukur data

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

Page 30: Makalah Edit stukur data

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]<>')' thenbegin posisiOperator:=banyakKarakter-posisiOperator+1; KonversiKeAsli(operands, posisiOperator);end;if operands.top>1 thenbegin 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

Page 31: Makalah Edit stukur data

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.

Page 32: Makalah Edit stukur data

4.2 Screen shot

BAB V

Page 33: Makalah Edit stukur data

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

Page 34: Makalah Edit stukur data

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