Phigon
Son zamanlar "Phigon" adlı proqramlaşdırma dili çox populyar olub. Bu dilin əsas xüsusiyyəti, proqramların çox qısa və lakonik görünməsidir. Təəssüf ki, bu proqramlar bəzən niyə uzun müddət işlədiyini anlamaq çətin olan proqramlardır.
Sizə bu suala cavab tapmaq tapşırılıb. Bunun üçün əvvəlcə proqramın analizatorunu yazmaq lazımdır ki, bu proqramda neçə əməliyyatın yerinə yetirildiyini müəyyən etsin. Biz "Phigon" dilində proqramın sadələşdirilmiş modelini nəzərdən keçirəcəyik. "Phigon" dilində proqram nümunələrini şərtin sonunda baxın. Hər hansı bir proqramlaşdırma dilində olduğu kimi, "Phigon"da da dəyişənlər var. Dəyişənlərin adları uzunluğu 50-dən çox olmayan kiçik latın hərflərindən ibarət olan sətirlərdir. Dəyişənlər "if", "while", "or", "and" və "not" istisna olmaqla istənilən adlara malik ola bilər.
Hər hansı bir proqramlaşdırma dilində olduğu kimi, "Phigon"da da tam ədədlərdən, dəyişənlərdən və "+", "-" və "*" arifmetik əməliyyat işarələrindən ibarət arifmetik ifadələr var. Daha rəsmi olaraq, "Phigon"da arifmetik ifadələr aşağıdakı kimi təyin olunur:
<arifmetik ifadə> ::= <toplama> | (+|-) <arifmetik ifadə>
<toplama> ::= <çoxaltma> | <çoxaltma> * <toplama>
<çoxaltma> ::= -<çoxaltma> | <müsbət ədəd> | <dəyişən> | (<arifmetik ifadə>)
Beləliklə, hər hansı bir proqramlaşdırma dilində olduğu kimi, "Phigon"da unar minus çoxaltmadan daha yüksək prioritetə malikdir, o isə öz növbəsində toplama əməliyyatından daha yüksək prioritetə malikdir. Proqramda rast gəlinən hər bir mənfi ədəd müvafiq müsbət ədədə unar minus tətbiq edilməsinin nəticəsi hesab olunur. Məsələn, -42 mənfi ədədinin yazılışı 42 müsbət ədədinə unar minus tətbiq edilməsini ifadə edir.
Hər hansı bir proqramlaşdırma dilində olduğu kimi, "Phigon"da da təyin etmə operatorları var və onlar aşağıdakı kimi görünür:
<təyin etmə operatoru> ::=
<dəyişən> = <arifmetik ifadə>
Bu cür operatorun icrası nəticəsində sol tərəfdə duran dəyişənə sağ tərəfdə duran arifmetik ifadənin dəyəri təyin edilir.
İlk təyin etmə anından başlayaraq, dəyişən elan edilmiş hesab olunur və onun arifmetik ifadələrdə istifadəsi mümkün olur.
Hər hansı bir proqramlaşdırma dilində olduğu kimi, "Phigon"da da arifmetik ifadələrdən, müqayisə işarələrindən "<", "<=", ">", ">=", "==", "!=" və məntiqi operatorlardan "and", "or" və "not" ibarət məntiqi ifadələr var. Daha rəsmi olaraq,
<məntiqi ifadə> ::= <konjunksion> | <konjunksion> or <məntiqi ifadə>
<konjunksion> ::= <məntiqi şərt> | <məntiqi şərt> and <konjunksion>
<məntiqi şərt> ::= not <məntiqi şərt> | <arifmetik ifadə>
(<|<=|>|>=|==|!=) <arifmetik ifadə> | (<məntiqi ifadə>).
Beləliklə, hər hansı bir proqramlaşdırma dilində olduğu kimi, "Phigon"da inkar konjunksion operatorundan "VƏ" daha yüksək prioritetə malikdir, o isə öz növbəsində disjunksion operatorundan "VƏ YA" daha yüksək prioritetə malikdir.
Hər hansı bir proqramlaşdırma dilində olduğu kimi, "Phigon"da da şərt operatoru var və o aşağıdakı kimi görünür:
<şərt operatoru> ::=
if <məntiqi ifadə>:
<indent><operatorlar bloku>
burada <operatorlar bloku> — əlavə 4 boşluq indentasiyası ilə gedən bəzi operatorlar ardıcıllığıdır. <operatorlar bloku> üçün rəsmi tərifi daha sonra verəcəyik. Hər hansı bir proqramlaşdırma dilində olduğu kimi, əgər məntiqi ifadə doğru olarsa, müvafiq operatorlar bloku icra olunur, əgər yalan olarsa — icra olunmur. Qeyd edək ki, iç içə şərt operatoru olduqda, müvafiq operatorlar blokunun artıq 8 boşluq indentasiyası olacaq və s.
Hər hansı bir proqramlaşdırma dilində olduğu kimi, "Phigon"da da dövr operatoru var və o aşağıdakı kimi görünür:
<dövr operatoru> ::=
while <məntiqi ifadə>:
<indent><operatorlar bloku>
burada, şərt operatorunda olduğu kimi, <operatorlar bloku> — əlavə 4 boşluq indentasiyası ilə gedən bəzi operatorlar ardıcıllığıdır. Hər hansı bir proqramlaşdırma dilində olduğu kimi, operatorlar bloku məntiqi ifadə doğru olduğu müddətcə təkrar-təkrar icra olunur.
Beləliklə, nəhayət, "Phigon" proqramlaşdırma dilində proqramın ümumi görünüşünü müəyyən edə bilərik. Proqram təyin etmə operatorları, şərt operatorları və dövr operatorları blokundan ibarətdir:
<operatorlar bloku> ::= <operator> | <operator> <operatorlar bloku>
<operator> ::= <təyin etmə operatoru> | <şərt operatoru> | <dövr operatoru>
Sizin vəzifəniz proqramın icrasından sonra dəyişənlərin dəyərini və hər bir =, +, - (binar və unar olaraq cəmi), *, <=, >=, <, >, ==, !=, and, not, or əməliyyatlarının neçə dəfə icra olunduğunu öyrənməkdir.
Giriş verilənləri
Giriş faylında "Phigon" dilində proqram verilib. Hər bir təlimat öz sətirində yerləşir. Boş sətirlər yoxdur. Hər bir sətirin uzunluğu 500-dən çox deyil. Proqramda 5000-dən çox təlimat yoxdur. Bütün aralıq hesablamaların və proqramdakı ədədi sabitlərin dəyərlərinin modulu 10^500-dən kiçikdir.
Hər bir dəyişənin arifmetik ifadələrdə istifadəsindən əvvəl onun dəyərinin təyin etmə operatorunda müəyyən edildiyi təmin edilir.
Çıxış verilənləri
Əməliyyatların neçə dəfə çağırıldığını aşağıdakı formatda göstərin: icra olunan hər bir əməliyyat üçün əməliyyat: c sətirini göstərin, burada c — bu əməliyyatın neçə dəfə çağırıldığıdır. Əməliyyatlar haqqında məlumatı leksikoqrafik qaydada çıxarın (ikinci nümunəyə diqqət yetirin).
Bundan sonra "total N operations" sətirini çıxarın, burada N — icra olunan əməliyyatların ümumi sayıdır. Ümumi əməliyyatların sayının 200000-dən çox olmadığı təmin edilir.
Bundan sonra boş sətirdən sonra proqramın icrasından sonra dəyişənlərin dəyəri haqqında məlumatı leksikoqrafik artım qaydasında dəyişən adlarının formatında Dəyişən adı: v göstərin, burada v — dəyişənin dəyəridir.