else begin
writeln(
'ERROR...'
);
STATE:=
9
end
end;
5
:
case ch of
'0'
..
'9'
:
begin
deg:=deg*
10
+ord(ch)-ord(
'0'
);
STATE:=
5
;
end;
'-'
,
'+'
:
begin
sum:=sum+sign*koef*power(x,deg);
if ch=
'-'
then sign:=-
1
else sign:=+
1
;
STATE:=
0
;
end;
' '
:
begin
sum:=sum+sign*koef*power(x,deg);
STATE:=
9
;
end;
else begin
writeln(
'ERROR...'
);
STATE:=
9
end
end;
9
:
break
;
end;
end;
close(fv);
assign(fv,
'polymon.sol'
);rewrite(fv);
writeln(fv,sum);close(fv)
end.
Ushbu dastur shunday spetsifik ravishda tashkillashtirilganki uni sozlashda “hozir biz
qayerdamiz”ni nazorat qilish qiyin, bajarishning u yoki bu qadamida qaysi simvol qayta
ishlanmoqda va qanday simvollar undan oldin borligini izlash qiyin. Ushbu masalani
osonlashtirish uchun sozlash vositalari ishlatilgan. Dastur boshida {$define ECHo} va {$define
STRING_ECHO} ismini aniqlash yozilgan. Ularning birinchisi shartli {$ifdef ECKO}…{$endif}
kompilyatsiya ko‘rsatmalarida har bir o‘qilgan simvolni ekranga chiqarishga, ikkinchisi esa
sozlash oynasida qarash mumkin bo‘lgan yordamchi s qator oxiriga tugallashga imkon beradi.
O‘qilgan simvollarni ekranga yoki sozlovchining oynasida ko‘rish imkoniyati sozlash jarayonini
yetarlicha osonlashtiradi. Biroq shartga ko‘ra dastur faqat yakuniy sonli javobnigina chiqarishi
kerak. Aslida dastur sozlashini tugallab, yordamga, fragmentlarni yo‘q qilish yetarlidir. Bittasi
aloxida-dastur tugallanganligini qanday bilish mumkin. Ushbu vaziyatda dasturning yakuniy
matnida kerak bo‘lmagan barcha “yordamga inventor” ni shartli {$ifdef ism}…{$endif}
kompilyatsiya ko‘rsatmalarining ichida joylashtirish mumkin. Ushbu ko‘rsatmalarning ma’nosi
quyidagicha: agar ifdef dan keyin (dasturda bu STRINE_ECHO va ECHO isimlari) ism
aniqlangan bo‘lsa, u holda komplyator {$ifdef ism} va {$endif} komandalar orasidagi matnini
dastur matnining odatiy qismi singari qabul qiladi. Agarda ushbu ism aniqlanmagan bo‘lsa, u
holda {$ifdef ism} va {$endif} komandalar orasidagi matn komplyatsiyada rad qilishadi.
Komlpyatsiya paytida ismni aniqlash uchun dastur matnidan yuqorida {$defrne ism} deb yozish
kerak. Keyin komplyator yordamida operatorlarni rad qilishi zarur bo‘lishida
{$defineism}
direktivalarga {va $ simvollar orasiga probel qo‘yish kerak. Komplyator {$define ism} matnni
ismni aniqlash emas izoh singari qabul qiladi} va {$ifdef ism} va {$endif} orasidagi operatorlarni
rad qiladi. Komplyatsiyani boshqarish uchun nafaqat foydalanuvchi balki komplyatorining o‘zi
tamonidan aniqlangan isimlardan foydalanish mumkin. Masalan, TER70 ismi Borland da va
Turbo Pascal 7.0 da aniqlangan bo‘lsada, Free Pascal da, xatto Turbo Pascal 7.0 bilan
moslashuvchanlik rejimi ulangan bo‘lsa ham, aniqlanmagan. Dasturning yakuniy variant katta
massivli Free Pascal bilan komplyatsiyalanishi kerak, deb tahlil qilamiz, sozlash uchun Borland
Pascal ning biz ko‘nikkan muhiti qo‘llaniladi. U holda dasturning
const MAXN=
500
;
const MAXN=
10000
;
fragmentini qanday o‘zgarishlar bo‘lmasin Borland Pascal {MaXN:500} da ham Free Pascal
dan ham komplyatsiyalanishi mumkin.
Keltirilgan har bir ikkala dasturni x
^
1 o‘rniga odiy x ni yozish mumkinligini bilib uni
modifikatsiyalash kerak.
2.2.4. Qavslar tillari.
2.10-masala. Ochiluvchiva yopiluvchi kavslar(va) ketma-ketligi qavsli ifoda deyiladi. Qavsli
ifoda agar:
a) qavslar tengligi va bir juftda avval olingan, keyin esa yopilgan bo‘lsa
b)qavslar ichidagi barcha qavslar yopilganidan keyin qavs yopilsa to‘g‘ri deyiladi.
Qavslar to‘g‘ri ifoda hosil qilishi aniqlansin.
Kirish. balance.txt matning har bir qatorida alohida test mavjud; qatorlar miqdori
cheklanmagan, tugallanish begisi bo‘lib matn oxiri hisoblanadi. Qatorlar uzilishlari 1 dan 2*10
9
gacha. Qatorlarda kavslardan farq qiluvchi simvollar yo‘qligi kafolatlangan.
Chiqish. Testlarga mos keluvchi 0 va 1 simvollardan (balance.sol fayilida) qator (testdagi
ifoda to‘g‘ri bo‘lsa 1, aksincha bo‘lsa 0).
Misol.
Kirish ( ) ( ) chiqish 1100
(( )) ( )
(()))
() ) (
Masalani yechish. NOpen hisoblagichini ishlatamiz: qatorning o‘qilgan qismidagi ochiq va
hali yopilmagan qavslar miqdori unung qiymati bo‘ladi. Har bitta qator boshida NOpen=0.
Qavsli ifodali qatorni bitta simvol bo‘yicha o‘qiymiz, bunda har bir ‘c’ bilan NOpenni 1 ga
ortiriladi va har bir ‘)’ bilan NOpen 1 ga kamayadi. Agar oldin ochilmagan yakunlovchi qavs
paydo bo‘lsa, unda NOpen<0 ni olamiz. Ushbu vaziyatda ifoda noto‘g‘ri-qator oxirini,
keyinchalik tahlil qilmasdan, o‘tkazish mumkin. Agar qator tugallangandan keyin NOpen ≠0
bo‘lsa, qavslar tengligi miqdori bajarilmagan, ya’ni ifoda noto‘g‘ri ifodaning to‘g‘rilik belgisini
bo‘lingan ok o‘zgaruvchisida eslab qolamiz. Qatorni qayta ishlagandan keyin ord(ok) natijasini
chiqaramiz. Keltirilgan harakatlarni quyidagi dasturda aniqlashtiramiz:
0>
Do'stlaringiz bilan baham: