• Tidak ada hasil yang ditemukan

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

N/A
N/A
Protected

Academic year: 2021

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

Copied!
34
0
0

Teks penuh

(1)

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

(2)

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

(3)

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

(4)

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 :

(5)

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

(6)

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 :

(7)

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 :

(8)

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 :

(9)

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

(10)

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

(11)

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;

(12)

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;

(13)

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

(14)

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

(15)

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

(16)

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

(17)

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

(18)

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

(19)

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

(20)

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;

(21)

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

(22)

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

(23)

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;

(24)

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;

(25)

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;

(26)

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;

(27)

'+': 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;

(28)

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;

(29)

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;

(30)

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

(31)

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.

(32)

BAB V PENUTUP

(33)

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

(34)

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

Referensi

Dokumen terkait

Langkah operasi pop pada stack yang menggunakan array adalah terlebih dahulu memeriksa apakah stack sedang keadaan kosong, jika tidak kosong maka data diambil pada posisi

Seperti halnya pada stack, untuk mengimplementasikan struktur data queue ke dalam pemrograman, kita dapat menggunakan struktur data yang pernah kita ketahui, seperti

Array atau sering disebut juga sebagai larik adalah sebuah struktur data yang menyimpan sekumpulan elemen dengan tipe yang sama dan disimpan dalam memori computer

Tiap field menyimpan data dari tipe dasar tertentu atau dari tipe bentukan lain yang sudah didefinisikan sebelumnya.. Nama rekaman ditentukan

Karena antrian merupakan suatu kumpulan data, maka tipe data yang sesuai untuk menyajikan antrian adalah menggunakan array atau list (senarai berantai).. Contoh antrian dengan

menggunakan struktur data array, struct, tree, dan file menggunakan teknik-teknik seperti stack, queue, dan linked list serta hashing.. •  Matakuliah ini juga

Tujuan dari penelitian ini adalah untuk mengetahui variasi dan jenis kesalahan mahasiswa dilihat dari lembar jawaban Ujian Akhir Semester Struktur Aljabar

2 „ Moral story: „ Pemilihan struktur data yang tepat, dapat membuat program lebih terstruktur elegan dan efesien „ Tentunya, penggunaan algoritme yang baik dapat membuat program