Program Pascal untuk mengubah Notasi Infix ke Notasi Postfix kemudian menghitungnya berdasarkan angka yang diinputkan oleh user.
program Implementasi_Stack; uses crt; const max = 255; type AInfix = string[max]; Pointer = ^Stack; Stack = record info : char; next : Pointer; end; Point = ^Angka; Angka = record info : real; next : Point; end; var Top : Pointer; TopA : Point; Infix : AInfix; Huruf : string; ATop : integer; elemen : char; data : real; lagi : char; hasil : real; Function Kosong(list:Pointer):boolean; begin Kosong:=false; if(list = nil) then Kosong:=true; end; Function Panjang(kata:string):integer; begin Panjang:=length(kata); end; Function Salah(k:string):boolean; var i : integer; SetOperator : set of char; begin SetOperator:=['^']+['*']+['/']+['+']+['-']; for i:=1 to Panjang(k) do begin if((k[i] in SetOperator) and (k[i+1] in SetOperator)) or (k[Panjang(k)] in SetOperator) or (k[1] in SetOperator) then begin Salah:=true; end; end; end; Function Derajat(opr:char):integer; begin case opr of '^' : Derajat:=3; '*','/' : Derajat:=2; '+','-' : Derajat:=1; end; end; Function Pangkat(m,n:real):real; begin if(n = 0) then Pangkat := 1 else Pangkat := m * Pangkat(m,n-1); end; Function Kali(m,n:real):real; begin if(n = 1) then Kali := m else Kali := m + Kali(m,n-1); end; Procedure Inisialisasi(var Top:Pointer; var ATop:integer; var TopA:Point); begin Top:=nil; ATop:=0; TopA:=nil; end; Procedure Isi(var Infix:Ainfix); var stop : boolean; begin stop:=false; while(not stop) do begin textcolor(WHITE);write('Notasi Infix : '); readln(Infix); if(Salah(Infix)) or (Infix = '') then begin gotoxy(55,whereY-1);textcolor(GREEN);writeln('Input Salah !'); writeln; end else stop:=true; end; end; Procedure Push(var Top:Pointer; databaru:char); var baru : Pointer; begin new(baru); baru^.info:=databaru; if(Kosong(Top)) then baru^.next:=nil else baru^.next:=Top; Top:=baru; end; Procedure Pop(var Top:Pointer; var elemen:char); var phapus : Pointer; begin phapus:=Top; elemen:=phapus^.info; if(Kosong(Top^.next)) then Top:=nil else Top:=Top^.next; dispose(phapus); end; Procedure Tampung(var ATop:integer; var Huruf:string; elemen:char); begin ATop:=ATop+1; Huruf[ATop]:=elemen; end; Procedure Postfix(var Top:Pointer); var i : integer; SetOperator : set of char; Simbol : char; begin SetOperator := ['^']+['*']+['/']+['+']+['-']; Push(Top,'('); Infix[Panjang(Infix)+1]:=')'; for i:=1 to Panjang(Infix)+1 do begin Simbol:=Infix[i]; if(Simbol = '(') then Push(Top,Simbol) else if(Simbol = ')') then begin repeat Pop(Top,elemen); Tampung(ATop,Huruf,elemen); until(Top^.info = '('); Pop(Top,elemen); end else if(Simbol in SetOperator) then begin while(Top^.info <> '(') and (Derajat(Top^.info) >= Derajat(Simbol)) do begin Pop(Top,elemen); Tampung(ATop,Huruf,elemen); end; Push(Top,Simbol); end else Tampung(ATop,Huruf,Simbol); end; if(Kosong(Top)) then begin for i:=1 to ATop do begin write(Huruf[i]); end; end; end; Procedure PushAngka(var TopA:Point; databaru:real); var baru : Point; begin new(baru); baru^.info:=databaru; if(TopA = nil) then baru^.next:=nil else baru^.next:=TopA; TopA:=baru; end; Procedure PopAngka(var TopA:Point; var data:real); var phapus : Point; begin phapus:=TopA; data:=phapus^.info; if(TopA^.next = nil) then TopA:=nil else TopA:=TopA^.next; dispose(phapus); end; Procedure HitungPostfix(var TopA:Point; var hasil:real); var i : integer; SetOperator : set of char; Simbol : char; a,b,angka,hitung : real; begin SetOperator := ['^']+['*']+['/']+['+']+['-']; Huruf[ATop+1] := ')'; for i:=1 to ATop+1 do begin Simbol:=Huruf[i]; if(Simbol in SetOperator) then begin PopAngka(TopA,data); b:=data; PopAngka(TopA,data); a:=data; case Simbol of '^' : hitung := Pangkat(a,b); '*' : hitung := Kali(a,b); '/' : hitung := a / b; '+' : hitung := a+b; '-' : hitung := a-b; end; PushAngka(TopA,hitung); end else if(Simbol = ')') then begin PopAngka(TopA,data); hasil:=data; end else begin write(' Masukkan Nilai ',Simbol,' : '); readln(angka); PushAngka(TopA,angka); end; end; end; begin repeat Inisialisasi(Top,ATop,TopA); clrscr; Isi(Infix); writeln; write('Notasi Postfix : '); Postfix(Top); writeln;writeln; HitungPostfix(TopA,hasil);writeln; write('Hasil Perhitungan Postfix : ',hasil:0:2); writeln;writeln;writeln; write('Input Notasi Infix lagi [Y/T] : '); readln(lagi); until(lagi = 'T') or (lagi = 't'); end.
Screenshot:
3 comments:
thanks'gan ...
postingannya ngebantu, ane kebetulan ada tugas kuliah tentang ini..
ini cara penulisan infix nya gimana si?? ko saya input salah mulu ya
inputan nya gimana ya ko input salah terus, reply plis butuh bgt buat referensi tugas
Posting Komentar