{*****************************************************
* program 5.14. (PROG5-14.PAS) *
* menghitung nilai ungkapan positifx. *
* ungkapan positifx dihasilkan dari ungkapan infix *
* operand pada ungkapan infix harus berupa angaka *
* sebelum dihitung ungkapan infixnya perlu *
* ditest validasinya. *
* ^, *, /, dan - *
*****************************************************}
program HITUNG_UNGKAPAN_POSITIF;
uses wincrt;
const max = 80;
operand = ['0'..'9'];
operator= ['*', '/', '+', '-', '^'];
{*deklarasi tipe simpul*}
type kalimat = string [max];
tumpukan = ^ elemen;
elemen = record
huruf : char;
angka : real;
berikut : tumpukan;
end;
var infix ,postfix : kalimat;
salah :boolean ;
kode ,cacah, I :integer ;
lagi :char ;
hitungan :real;
{*******************************************
* fungsi berikut digunakan untuk mengecek *
* valid tidaknya ungkapan infix *
* *****************************************}
function CEK_NOTASI (inf : kalimat) : boolean;
var I, N, C_Buka, C_Tutup : integer;
kar_Sah : set of char;
Salah : boolean;
I1, I2 : char;
begin
{* Notasi infix pertama kali dianggap benar *}
salah := false;
N:= length(inf);
if N <= 2 then
salah := true
else if (inf[1] = ')') or (inf[N] = ' (') then
{* jika infix diawali dengan ) atau diakhiri dengan (, berarti infixnya salah *}
salah := true
else
begin
{*himpunan dari karakter yang sah*}
Kar_Sah := operand + operator + ['(', ')'];
{*cacah kurang buka, dan kurung tutup*}
C_Buka := 0; C_Tutup := 0;
for I := 1 to N - 1 do
begin
I1 := inf[I]; I2 := inf[I+1];
if ((I1 in operand) and (I2 in operand))
or ((I1 in operator) and (I2 in operator))
or ((I1 = ')') and (I2 in operand))
or ((I1 = '(') and (I2 = ')'))
or ((I1 in operand) and (I2 = '('))
or ((I1 = ')') and (I2 in operand)) then
begin
salah := true;
I:= N - 1
end