Robot

   Xoşbəxtlər ölkəsinin məktəbliləri heç vaxt darıxmırdılar. Çünki onların məktəblərində Robototexnika fənni tədris olunurdu. Uşaqlar dərslərdə robot düzəldir, onlara müxtəlif missiyaları yerinə yetirməyi öyrədirdilər. Hətta aşağı siniflərin şagirdləri də boş oturmurdular. Onların robotları sadə olsa da, yeriməyi bacarırdı.

Robot

   Düzdür balacaların balaca robotları hələ ki, irəli və geriyə gedə bilirdi. Amma kiçik robot mühəndisləri söz vermişdilər ki, robotlarını gələcəkdə təkmilləşdirəcəklər və onlar nəinki sağa-sola da gedəcək, eləcə də tullanmağı və qaçmağı da bacaracaqlar.

   Məktəblilər robotlarını xüsusi bir zolaq üzərində hərəkət etdirirdilər. Eni 1 olan və hər iki tərəfə uzanan zolaq 1×1 ölçülü damalara bölünmüşdür. Bu damaların birində dayanan robot (aşağıdaki şəkildə həmin robot kvadratla işarə edilmişdir) bir damadan digərinə hərəkət edə bilər.

robot_path

   Robotun yerdəyişməsi hər bir əmri latın əlifbasının 3 böyük hərfinə – L, R, S hərflərinə uyğun proqramla müəyyənləşir. L əmri icra edildikdə robot bir dama sola, R əmrində bir dama sağa hərəkət edir, S əmrində isə olduğu damada qalır.

   Proqramın icrası dedikdə orda yazılan bütün əmrlərin ardıcıl yerinə yetirilməsi başa düşülür. Sizdən tələb olunan robotun neçə müxtəlif damaya getdiyini müəyyənləşdirən proqram yazmaqdır.

Giriş verilənləri

   Giriş verilənləri robot üçün yazılmış proqram olan L, R, S simvollarından ibarət tək sətirdir. Verilmiş bu proqram 10000 -dən çox olmayan əmrdən ibarətdir.

Çıxış verilənləri

  Tək sətirdə robotun öz proqramına əsasən gəzdiyi müxtəlif damaların sayını göstərən ədədi vermək lazımdır.

Nümunə
Giriş verilənləri Çıxış verilənləri
RRSRRLRR 6

   Proqramı özünüz tərtib etməyə çalışın. Əgər alınmasa, aşağıdakı həll ilə tanış olun.

robot_program

Mənbə: https://www.e-olymp.com

İfadələr

   İlk dərslərimizdən bu yana biz bir çox yerdə ifadələr anlayışı ilə qarşılaşdıq. Artıq bu terminin tərifini verməyin vaxtı gəlib çatdı. İfadələr, proqramlaşdırma dilində elementar əməli təsvir edən sintaksis vahidlər ardıcıllığıdır.

   İfadələr rolunda qiymətlər, dəyişənlər və əməliyyatlar çıxış edə bilər:

>>> 37 
37
>>> x = 42
>>> x
42
>>> print(x)
42
>>> x + 13
55
>>>

   Yuxarıdakı misallarda 37 qiyməti (birinci sətirdə olan) və x dəyişəni ifadədir. Eyni zamanda x = 42 , print(x)x + 13 əməliyyatları da ifadə sayılır.

   Python-un interaktiv rejimində yazılan ifadələr icra olunur və əgər varsa nəticələri ekrana çıxarılır:

>>> n = 114 
>>> m = 96
>>> a = "Oxu!"
>>> a
'Oxu!'
>>> print(a)
Oxu!
>>> type("Oxu!")
<class 'str'>
>>> 33 + 33 + 33
99
>>>

   Yuxarıdakı misallarda ilk üç sətirdəki ifadələr (mənimsətmə əməliyyatları) sadəcə icra olunur, amma ekrana heçnə çıxmır. Digər sətirlərdəki ifadələrin icrası isə həm də ekrana müvafiq nəticələri çıxarır.

   Burada bir məqama da diqqət yetirmək lazımdır. Belə ki, a dəyişəni bir ifadə olaraq icra olunanda nəticə ekrana tək dırnaq arasında çıxır. Amma biz a dəyişənini print() funksiyası ilə çapa verəndə ekrana çıxan nəticə dırnaqsız olur.

   Gəlin eyni ifadələri skriptdə yazaq və proqram faylını çalışdıraq:

n = 114 
m = 96
a = "Oxu!"
a
print(a)
type("Oxu!")
33 + 33 + 33

   Yuxarıdakı proqram icra olunduqda Python Shell pəncərəsində qarşınıza aşağıdakı mənzərə çıxacaq:

>>>
Oxu!
>>>

   Nə baş verdi? Burada bütün ifadələrin icra olunmasına baxmayaraq yalnız print(a) funksiyasının icrasının nəticəsində ekrana məlumat çıxdı.

   Yekunda ifadələr ilə bağlı bir məsələni də qeyd edək. Python-un interaktiv rejimində ən son ifadənin nəticəsi xüsusi bir dəyişəndə ( _ simvolunda) yadda saxlanılır. Aşağıdakı proqramda buna aid nümunələr verilmişdir:

>>> a = 1.2 
>>> a
1.2
>>> print(_)
1.2
>>> _ + 1
2.2
>>> a = _ 
>>> print(a)
2.2
>>> type(a)
<class 'float'>
print(_)
<class 'float'>
>>>

   Misallardan da gördüyünüz kimi, interpretator ən son ifadənin nəticəsini _ dəyişənində yadda saxlayır.

Süni İntellekt (Sİ)

  Süni İntellekt (Sİ) (ing. Artificial Intelligence (AI)) — maşınların (qurğu və cihaz) insan zəkasını simulyasiya etməsidir. Belə maşınlar elə proqramlaşdırılır ki, insan kimi düşünə, onun davranışlarını təqlid edə bilsinlər.

süni_intellekt

   Sİ ilə işləyən maşınlar nitq tanıma, öyrənmə, planlama, problem həll etmə kimi mürəkkəb işlərin öhdəsindən gəlməyi bacarır. Süni İntellektin ideal xüsusiyəti onun rasional davranması və qarşıya qoyulan konkret məqsədə çatmaq üçün doğru qərar qəbul etməsidir.

Süni İntellekt iki əsas kateqoriyaya bölünür:

  • Dar Süni İntellekt: İnsan zəkasının simulyasiyası olan və bəzən “Zəif Sİ” adlandırılan DSİ dar kontekstdə fəaliyət göstərir. DSİ konkret halda götürülmüş tək bir işin öhdəsindən məharətlə gəlməyi bacarsa da, insan zəkasının potensialından çox uzaqdır.
  • Ümumi Süni İntellekt: Bəzən “Güclü Sİ” də adlandırılan ÜSİ insan zəkasına yaxın intellektə sahib olan maşınlardır. Onların öz “ağıllarından” istifadə edərək istənilən problemi həll etmə qabiliyətləri vardır. Fantastik filmlərdən bizə tanış gələn robotlar ÜSİ ilə işləyirlər.

 

Proqram Xətası

  Proqram Xətası (ing. Software Bug) — kompüter proqramı və ya sistemdə baş verən xətadır. Bu cür xətalar yanlış və ya gözlənilməyən/nəzərdə tutulmayan nəticələrə gətirib çıxarır.

   İngilis dilində bug sözü həm də böcək mənasını verir. Amerikalı mühəndislər bir əsrdən çoxdur ki, maşındakı kiçik qüsurları “böcəklər” adlandırırlar. Tomas Edison 1870-ci illərdə elektrik dövrələrindəki nöqsanlardan “böcək” olaraq bəhs edirdi.

   Hesablama texnologiyasında bu terminin istifadəsi və məşhurlaşması 9 Sentyabr 1947-ci ildə baş verən bir hadisəylə bağlıdır. Amerikalı riyaziyyatçı və kompüter proqramçısı Grace Hopper və onun komandası Mark II kompüteri ilə çalışarkən maraqlı bir hadisə baş verir. Kompüterin kontakt releləri arasında bir güvə ilişib qalır və sistemin dayanmasına səbəb olur. Komanda üzvləri hadisəni qeydə alır və Grace Hopper (sonradan ABŞ Hərbi Dəniz Qüvvələrinin kontr-admiralı olur) xanıma  xəbər verirlər. O da kompüterin qeydiyat jurnalında tarixə keçəcək bir qeyd yazır:

“Xətanın tapılmasının ilk faktiki hadisəsi” (“First actual case of bug being found.”)

NMAH2000-03035.jpg

   Bu hadisədən sonra bug sözü hesablama texnologiyasında termin halına gəlir. Xətaların tapılması və aradan qaldırılması prosesi sazlama (debugging) adlanır. Müasir kompüter sistemləri bir çox xətaların müəyyən edilməsi və avtomatik aradan qaldırılması imkanlarına malikdir.

Alqoritm

  Alqoritm (ing. Algorithm) — verilmiş məsələni həll etmək üçün dəqiq təyin olunmuş sonlu sayda qaydalar ardıcıllığıdır. Bu qaydalar kompüterdə realizə olunabilən instruksiyalardır. Alqoritm istənilən növ məsələnin həlli üçün tərtib oluna bilər.

   Günümüzdə hesablama texnologiyasında geniş istifadə olunan bu termin IX əsrin məşhur fars riyaziyyatçısı Məhəmməd İbn Musa əl-Xarəzminin (783-850) adıyla bağlıdır.

Muhammad ibn Musa al-Khawarizmi

   Təxminən 825-ci ildə Əl-Xarəzmi onu riyaziyyat aləmində məşhur edən “Əl-kitab əl-müxtəsər fi hesab əl-cəbr vəl müqabələ” adlı kitabını yazmışdır. Yeri gəlmişkən bu gün istifadə etdiyimiz cəbr sözü də bu alimin adıyla bağlıdır. Əl-Xarəzmi öz kitabında mövqeli say sistemi, bu sistemdə hesablama qaydaları haqqında məlumat verir və ilk dəfə sıfırdan (0) istifadə edir. XII əsrin ilk yarısında onun kitabı latın dilinə tərcümə olunaraq “Algoritmi de numero Indorum” adıyla Avropaya daxil olur. Beləliklə də onluq say sistemində hesab qaydalarını alqoritm adlandırırlar. Bu gün istifadə etdiyimiz alqoritm anlayışı isə məsələləri həll etmək üçün istifadə olunan qaydalar (hesabi və məntiqi əməliyyatlar) ardıcıllığını ifadə edir.

Alqoritmin xassələri

  1. Diskretlilik xassəsi. Hər bir alqoritm məsələnin həll prosesini sadə addımların yerinə yetirilməsi ardıcıllığı şəklində ifadə edir və hər bir addımın yerinə yetirilməsi üçün sonlu zaman fasiləsi tələb olunur, yəni başlanğıc verilənlərlə icra olunan hesabi və məntiqi əməliyyatların yerinə yetirilməsi və nəticənin alınması zamana görə diskret yerinə yetirilir.
  2. Müəyyənlik xassəsi. Hər bir alqoritm dəqiq, birqiymətli olmalıdır. Bu xassəyə əsasən alqoritm yerinə yetirildikdə istifadəçinin və onun istifadə etdiyi kompüterdən asılı olmayaraq eyni nəticə əldə edilməlidir.
  3. Kütləvilik xassəsi. Müəyyən sinif məsələnin həlli üçün qurulmuş alqoritm bu sinfə aid olan yalnız başlanğıc qiymətləri ilə fərqlənən bütün məsələlərin həllini təmin etməlidir. Məsələn, ax2 + bx + c = 0 kvadrat tənliyi üçün qurulmuş alqoritm a, b, c – nin ixtiyari qiymətləri üçün məsələni həll edir.
  4. Nəticəlilik və sonluluq xassəsi. Alqoritm sonlu sayda addımdan sonra başa çatmalı və verilmiş məsələnin həlli tapılmalıdır

Alqoritmin təsvir üsulları

  1. Mətn
  2. Blok-sxem
  3. Cədvəl
  4. Alqoritmik dil

Alqoritmin tipləri

  1. Xətti
  2. Budaqlanan
  3. Dövrü

Bernulli ədədlərini hesablayan alqoritm

   İngilis riyaziyyatçısı Ada Lavleys (1815-1852) tərəfindən tərtib olunan Bernulli ədədlərinin hesablanması alqoritmi kompüter üçün yazılan ilk proqram hesab olunur.

Diagram_for_the_computation_of_Bernoulli_numbers

   Ada xanımın özü də təbii olaraq insanlıq tarixinin ilk proqramçısı adını daşıyır. Onun Çarlz Bebbicin analitik maşını ilə bağlı gördüyü işlər gənc xanımı məşhur etmişdir.

Ada_Lovelace

   Ada Lavleysin adının əbədiləşdirilməsi məqsədilə proqramlaşdırma dillərindən birinə onun adı verilmişdir.

Kompilyator

  Kompilyator (ing. compiler) proqramlaşdırma dillərində yazılmış instruksiyaları (qaynaq kodu) maşın dilinə tərcümə edən proqramdır.

   İnterpretatordan fərqli olaraq kompilyator bütün qaynaq kodunu bir dəfəyə maşın  dilinə çevirərək obyekt modulunu meydana gətirir. Əldə edilən binar kod əməliyat sistemi tərəfindən icra olunur.

   Kompilyatorun işi aşağıdaki altı mərhələdən ibarətdir:

  • Leksik analiz
  • Sintaktik analiz
  • Semantik analiz
  • Aralıq kod generasiyası
  • Kod optimallaşdırması
  • Kod generasiyası

Kompilyatorun ümumi iş prinsipi aşağıda təsvir olunmuşdur:

kompilyator

Kompilyatorların müsbət cəhətləri:

  1. Kompilyasiya edilən proqramların daha sürətli çalışması.
  2. Əldə edilən binar kodun çalışması üçün kompilyatora ehtiyac qalmaması.

Kompilyatorların mənfi cəhətləri:

  1. Əməliyyat Sistemlərindən asılı olması.
  2. Dəyişikliklər zamanı yenidən kompilyasiyaya ehtiyacın olması.

İnterpretator

   İnterpretator (ing. interpreter) proqramlaşdırma və ya skript dillərində yazılmış instruksiyaları (qaynaq kodu) aralıq dilə tərcümə edib sonra icra edən proqramdır.

   Kompilyatordan fərqli olaraq interpretator bütün qaynaq kodunu bir dəfəyə maşın  dilinə çevirərək obyekt modulunu meydana gətirmir. İnterpretator qaynaq kodunu sətir-sətir translasiya edərək icra edir.

İnterpretatorun ümumi iş prinsipi aşağıda təsvir olunmuşdur:

interpretator

İnterpretatorların müsbət cəhətləri:

  1. Əməliyyat Sistemlərindən asılı olmaması.
  2. Dəyişikliklər zamanı yenidən kompilyasiyaya ehtiyacın olmaması.

İnterpretatorların mənfi cəhətləri:

  1. Proqramın çalışması üçün kompüterdə interpretatorun olması.
  2. İşləmə sürətinin nisbətən aşağı olması.

Sətrin açılması

   Latın əlifbasının böyük hərflərindən ibarət sətirə baxacağıq. Məsələn: AAAABCCCCCDDDD. Bu sətirin uzunluğu 14-ə bərabərdir. Burada təkrarlanan simvollar silinərək  həmin simvolların təkrarlanma sayını göstərən ədəd və bu simvolun özü ilə əvəz edilir. Yuxarıda verilmiş sətir 4AB5C4D kimi göstərilə bilər. Təsvir edilən metodu  sətirlərin yığılması adlandıracağıq.

setrlerin-acilmasi

   Yığılmış sətiri götürərək,  onun ilkin sətirini bərpa edən proqramı tərtib edin.

Giriş verilənləri

   Giriş verilənləri bir yığılmış sətirdən ibarətdir. Həmin sətirlərin maksimum uzunluğu 80-i aşmır.

Çıxış verilənləri

  Bərpa edilən sətir.

Nümunələr
Giriş verilənləri Çıxış verilənləri
3A4B7D AAABBBBDDDDDDD
12AB AAAAAAAAAAAAB

   Proqramı özünüz tərtib etməyə çalışın. Əgər alınmasa, aşağıdakı həll ilə tanış olun.

setrlerin_acilmasi

Rekursiyalar

   Biz artıq bilirik ki, bir funksiya öz daxilində başqa funksiyanı çağıra bilər. Amma bilməmiz gərəkən daha bir şey var: funksiya özü özünü də çağıra bilər. Proqramlaşdırmada funksiyaların özü özünü çağırmasına rekursiya, bu cür funksiyalara da rekursiv funksiyalar deyilir.

   Gəlin verilmiş ədədin faktoriyalını (n!) hesablayan kiçik bir funksiya hazırlayaq. Riyaziyyatdan da bildiyiniz kimi n ədədinin faktorialı 1-dən n-ə qədər (daxil olmaqla) natural ədədlərin hasilinə bərabərdir. Məsələn, 5!=5*4*3*2*1. Və o da məlumdur ki, 1!=1 və 0!=1. Buradan belə bir məntiq yürütmək olur ki, n! hesablamaq üçün n*(n-1)! hesablamalıyıq, yəni 5!=5*4!. Belə olan halda 4! üçün 4*3!, 3! üçün 3*2!, 2! hesablamaq üçün də 2*1! hesablanmalıdır. 1! isə 1-ə bərabər olduğuna görə rekursiya burada bitmiş olur.

   O zaman rekursiv funksiya aşağıdakı kimi olacaq:

>>> def fakt(n):
        if n<=1:
                return 1
        else:
                return n*fakt(n-1)


>>> fakt(5)
120
>>>

   Rekursiv funksiyalardan istifadə edərkən diqqət etmək lazımdır ki, sonsuz rekursiya alınmasın. Adətən sonsuz rekursiyalara gətirib çıxaran aşağıdakı iki səbəb olur:

  1. Rekursiyadan çıxışın düzgün təşkil edilməməsi. Məsələn, yuxarıdakı faktorial funksiyasında if n<=1 şərti verilməsəydi, rekursiya mənfi ədədlərə doğru sonsuz şəkildə davam edərdi.
  2. Rekursiv çağırışda parametrlərin düzgün verilməməsi. Məsələn, əgər fakt(n) funksiyası fakt(n-1) əvəzinə elə fakt(n) funksiyasını çağırsaydı, yenə də sonsuz rekursiya alınardı.

   Gəlin daha bir misal işləyək. Verilmiş a ədədini n qüvvətinə yüksəldən funksiya təyin edək:

>>> def power(a,n):
        if n==1:
                return a
        else:
                return a*power(a,n-1)


>>> power(2,4)
16
>>> power(8,3)
512
>>>

 Biz ən başda qeyd etdik ki, rekursiv funksiyalar özü özünə müraciət edən funksiyalardır. Amma bu müraciətlərin sayı (rekursiyanın dərinliyi) sonsuz ola bilməz. Hətta səhvən sonsuz rekursiya təşkil etsək belə praktiki olaraq funksiya sonsuz sayda icra olunmayacaq. Rekursiyanın dərinliyi ilə bağlı aşağıdakıları bilmək vacibdir:

  1. Rekursiyanın dərinliyinə məhdudiyyət qoyulmuşdur. Default olaraq (susmaya görə) rekursiv funksiya 1000 dəfə özü özünə müraciət edə bilər. 
  2. Bu məhdudiyyət sys.setrecursionlimit() funksiyasından istifadə edilməklə dəyişdirilə bilər. Cari limitə baxmaq üçün isə sys.getrecursionlimit() funksiyası çağırılmalıdır.
  3. Buna baxmayaraq rekursiyanın dərinliyi əməliyyat sistemi tərəfindən təyin olunan stekin ölçüsü ilə məhdudlaşdırılır.

  Son olaraq onu da deyək ki, rekursiv funksiyalar ümumilikdə proqramın məhsuldarlığını azaltdığı üçün onlara yalnız zərurət halında müraciət etmək lazımdır.