алгоритмчлалын үндэс

24
Алгоритм гэж юу вэ? Програмыг компьютерт шууд бичиж оруулах ёстой юу? Тэгж болно. Гэхдээ, програмчлалд анхлан суралцаж буй хүний хувьд эхлээд бичих гэж буй програмынхаа загвар буюу бүдүүвчийг зохиогоод дараа нь түүнийхээ дагуу програмаа бичих нь илүү үр дүнтэй гэж мэргэжилтнүүд үздэг. Ийм загвар буюу төлөвлөөг алгоритм гэдэг. Эсвэл “алгоритм бол тодорхой үр дүн гаргаж авахын тулд дараалан гүйцэтгэх ёстой үйлдлүүдийн жагсаалт юм”. Эсвэл “алгоритм бол тодорхой үр дүн гаргаж авахын тулд баримтлах ерөнхий дүрэм юм”. Алгоритм зохиох процессыг мэдээж алгоритмчлал гэнэ. Ер нь хүн ямар ч ажлыг хийхдээ эхлээд төлөвлөгөө гаргадаг шүү дээ. Тэрэнтэй л адил гэсэн үг. Алгоритм гэдэг үг өөрөө, 783-850 онд амьдарч байсан дундад азийн гарамгай тоочин Мухаммед ибн Муса аль-Хорезми хэмээх хүний нэрний гажсан хувилбар болох Алхори[ө]мы (Algorithmi) гэсэн үгээс гаралтай ажээ. Эргэн тойрны амьдралд дүүрэн алгоритм байна. Ж.нь хот доторх автомашины жолооч гэрлэн дохионд захирагдах дүрмийг баримталдаг. Түүнийг нь: 1. Хэрэв шар гэрэл асвал гэрлэн дохио солигдох (улаан эсвэл ногоон) гэж буй тул анхааралтай бай 2. Хэрэв улаан гэрэл асвал зогс 3. Хэрэв ногоон гэрэл асвал хөдөл хэмээн томъёолъё. Энэ бол гэрлэн дохиод захирагдах алгоритм юм. Гэхдээ энэ алгоритмын хувьд үйлдлийн эрэмбэ зайлшгүй чухал биш. Учир нь жолооч замын гэрлэн дохиотой хэсгээр явж байгаад, чухам ямар гэрэл асч байна вэ (өөрөөр хэлбэл ямар нөхцөл биелж байна вэ гэдгийг шалгаад) түүнд тохирсон алхмыг дээрх алгоритмаас сонгож гүйцэтгэнэ. Тэгвэл (З+3)*(3+4)-23 гэсэн илэрхийллийг бодохын тулд: 1. 3 дээр 3-ыг нэмэх (=6) 2. 3 дээр 4-ийг нэмэх (=7)

Upload: gombo-tumuruu

Post on 18-Dec-2014

1.495 views

Category:

Documents


13 download

DESCRIPTION

 

TRANSCRIPT

Page 1: алгоритмчлалын үндэс

Алгоритм гэж юу вэ?

Програмыг компьютерт шууд бичиж оруулах ёстой юу? Тэгж болно. Гэхдээ, програмчлалд анхлан суралцаж буй хүний хувьд эхлээд бичих гэж буй програмынхаа загвар буюу бүдүүвчийг зохиогоод дараа нь түүнийхээ дагуу програмаа бичих нь илүү үр дүнтэй гэж мэргэжилтнүүд үздэг. Ийм загвар буюу төлөвлөөг алгоритм гэдэг. Эсвэл “алгоритм бол тодорхой үр дүн гаргаж авахын тулд дараалан гүйцэтгэх ёстой үйлдлүүдийн жагсаалт юм”. Эсвэл “алгоритм бол тодорхой үр дүн гаргаж авахын тулд баримтлах ерөнхий дүрэм юм”. Алгоритм зохиох процессыг мэдээж алгоритмчлал гэнэ. Ер нь хүн ямар ч ажлыг хийхдээ эхлээд төлөвлөгөө гаргадаг шүү дээ. Тэрэнтэй л адил гэсэн үг. Алгоритм гэдэг үг өөрөө, 783-850 онд амьдарч байсан дундад азийн гарамгай тоочин Мухаммед ибн Муса аль-Хорезми хэмээх хүний нэрний гажсан хувилбар болох Алхори[ө]мы (Algorithmi) гэсэн үгээс гаралтай ажээ.

Эргэн тойрны амьдралд дүүрэн алгоритм байна. Ж.нь хот доторх автомашины жолооч гэрлэн дохионд захирагдах дүрмийг баримталдаг. Түүнийг нь:

1.       Хэрэв шар гэрэл асвал гэрлэн дохио солигдох (улаан эсвэл ногоон) гэж буй тул анхааралтай бай

2.       Хэрэв улаан гэрэл асвал зогс

3.       Хэрэв ногоон гэрэл асвал хөдөл

хэмээн томъёолъё. Энэ бол гэрлэн дохиод захирагдах алгоритм юм. Гэхдээ энэ алгоритмын хувьд үйлдлийн эрэмбэ зайлшгүй чухал биш. Учир нь жолооч замын гэрлэн дохиотой хэсгээр явж байгаад, чухам ямар гэрэл асч байна вэ (өөрөөр хэлбэл ямар нөхцөл биелж байна вэ гэдгийг шалгаад) түүнд тохирсон алхмыг дээрх алгоритмаас сонгож гүйцэтгэнэ.

Тэгвэл (З+3)*(3+4)-23 гэсэн илэрхийллийг бодохын тулд:

1.       3 дээр 3-ыг нэмэх (=6)

2.       3 дээр 4-ийг нэмэх (=7)

3.       6-г 7-оор үржүүлэх (=42)

4.       2-ийг куб зэрэгт дэвшүүлэх (=8)

5.       42-оос 8-ыг хасах

гэсэн алгоритмыг баримтлана. Энд бол үйлдлийн дараалал чухал байна. Түүнийг зөрчвөөс зөв хариуг гаргаж чадахгүй.

Орчлон ертөнц ч өөрийн алгоритмтай. Дэлхий Нарыг дунджаар 150 сая км-ийн радиустай “тойргоор” 1 жилд бүтэн тойрно. Дэлхий өөрийн тэнхлэгийг 24 цагт бүтэн тойрно. Бүх бодис

Page 2: алгоритмчлалын үндэс

эгэл бөөмсөөс тогтоно г.м. Эдгээр алгоритмууд байгалийн хуулиудын тусламжтайгаар програмчлагдаж, цаг ямагт мөрдөгдөж байдаг.

Тэгвэл алгоритм ба компьютерын програмын хооронд ямар ялгаа байна вэ гэсэн асуулт тавья. Програм – энэ бол удирдамж, алгоритм – энэ ч гэсэн бас удирдамж байна. Тиймээ. Яг үнэндээ эдгээрийн хооронд зарчмын ялгаа байхгүй юм. Учир нь програмчлалын хэл дээр зохиосон алгоритмыг програм гэдэг ажээ. Компьютер бол алгоритмыг гүйцэтгэгч, хүн бол алгоритмыг зохиогч юм. Гүйцэтгэгчид алгоритмын зорилго ямар ч хамаагүй бөгөөд зөвхөн зохиогч л үүнийг мэдэж байдаг. Гэхдээ гүйцэтгэгч нь зохиогчийн тавьсан зорилгыг хангалттай сайн биелүүлдэг байхын тулд алгоритм сайн зохиогдсон байх нь мэдээж. Тэгвэл, сайн алгоритм дараах үндсэн чанаруудыг хангасан байх ёстой гэнэ:

1.       Алгоритм нь дараалсан алхмууд буюу үйлдлүүдээс тогтсон байх – алгоритм нь аливаа даалгаврыг гүйцэтгэх төгсгөлөг тооны алхмуудаас бүрдсэн байх

2.       Алгоритмын алхам бүр оновчтой, тодорхой байх – алгоритмын алхам бүрт чухам ямар үйлдэл хийгдэх нь тодорхой байх

3.       Алгоритмд орох өгөгдөл, гарах үр дүн байх ёстой

4.       Алгоритм нь үр дүнтэй (ашигтай) байх – алгоритм нь төгсгөлөг алхмын дараа даалгаврыг биелүүлж дуусгасан байх, хэрэв энэ нь боломжгүй бол даруй зогсдог байх; Өөрөөр хэлбэл ямар нэг тодорхой шийдэлд хүрдэг байх

г.м.

Алгоритмын гүйцэтгэх даалгаврыг заримдаа бодлого (task) хэмээн нэрийддэг. Тиймээс “мэдээлэл боловсруулах” гэдгийг “бодлого бодох” гэсэн үгээр сольж болно.

Алгоритмын график дүрслэл буюу блок-схем

Компьютерт зориулсан програмын алгоритмыг хэрхэн бичдэг вэ? Өөрөөр хэлбэл тэмдэглэгээний ямар хэлбэрүүдийг ашиглан алгоритмыг зохиодог вэ? Энд дараах хэлбэрүүд байна:

1.       Үгээр илэрхийлэх (эх хэлээр бичих)

2.       График дүрслэл (геометрын объектууд ашиглан илэрхийлэх)

3.       Хуурмаг код (эх хэл, програмчлалын хэл, математикийн үндсэн тэмдэглэгээнүүд г.м.ийн холимог ямар нэгэн зохиомол, хагас дүрэмжсэн “хэл” ашиглах)

4.       Програм (програмчлалын хэл дээр бичих)

Эхний хоёр хэлбэртэй танилцъя.

Page 3: алгоритмчлалын үндэс

Хоёр натурал тооны хамгийн их ерөнхий хуваагчийг (ХИЕХ) олох Евклидийн алгоритмыг үгээр илэрхийлвэл:

1.       Хоёр тоо өг

2.       Хэрэв хоёр тоо тэнцүү бол аль нэгийг нь хариу болгон аваад алгоритмыг төгсгөх, үгүй бол 3-р алхамд шилжих

3.       Хоёр тооны аль ихийг нь тодорхойлох

4.       Их тоог их тоо, бага тооны ялгавраар солих

5.       2-р алхамд шилжих

гэсэн хэлбэртэй болно. Энэ алгоритм хоёр тоо тэнцүү болох хүртэл хийгдэж, эцэст нь ХИЕХ-ийг гаргаж өгнө.

Хатуу тогтсон дүрэм байхгүй, нэг өгүүлбэрийг олон янзаар тайлбарлаж болдог, хэтэрхий нуршуу болох магадлалтай г.м. шалтгааны улмаас үгээр илэрхийлэх хэлбэр нь тийм ч өргөн дэлгэрээгүй ажээ.

Бид хичээлдээ график дүрслэлийн аргыг ашиглах болно.

График дүрслэлээр, алгоритмыг өөр хоорондоо холбогдсон геометр объектуудын дараалал хэлбэрээр илэрхийлдэг. Ийм дүрслэлийг алгоритмын блок-схем хэмээн нэрийднэ. Блок-схемийг бүрдүүлэгч объектуудыг үйлдлийн блокууд гэнэ. Учир нь блок болгон тодорхой нэг эсвэл хэд хэдэн үйлдлийг төлөөлдөг. Тиймээс блокуудыг хооронд нь холбосон шугамыг шилжилтийн шугам гэх бөгөөд энэ нь үйлдэл хийгдэх дарааллыг тодорхойлж өгдөг. Шугамыг заримдаа сумтай, заримдаа сумгүй зурдаг. Бидний хувьд сумтай зурах нь илүү тохиромжтой. Шилжилтийн шугам, блокуудыг нийтэд нь блок-схемийн элементүүд гэдэг.

Ямар үйлдлийг илэрхийлж буйгаас хамааран блок-схемийн нэлээн хэдэн элемент байна. Бидний байнга хэрэглэх элементүүд бол:

ЭлементЭлементийн нэр (англи)

Элементийн нэр (монголчилсон)

Төлөөлөх үйлдэл

Terminator “Эхлэл”/”Төгсгөл”Алгоритмын Эхлэл эсвэл Төгсгөл (дотор нь бичнэ)

Manual Input “Оролт”

Алгоритм гүйцэтгэгч буюу компьютерт гаднаас өгөгдөл оруулах (дотор нь өгөгдлөө бичнэ)

Display “Гаралт”Үр дүнг хэрэглэгчид гаргаж үзүүлэх (дотор нь үр дүнг бичнэ)

Page 4: алгоритмчлалын үндэс

Data “Оролт”/”Гаралт”Оролт-Гаралтын үйлдлийн ерөнхий тэмдэглэгээ (дотор нь бичнэ)

Decision “Нөхцөл шалгах”

Өгсөн нөхцлийг шалгаж шийдвэр гаргах буюу салаа замын аль нэгээр нь явах (дотор нь нөхцлөө бичнэ)

Preparation“Параметрт давталт”

Давталт буюу циклийн эхлэл

Process “Процесс”Дээрхүүдээс бусад үйлдлүүд: арифметик үйлдлүүд ба утга олгох г.м. (дотор нь бичнэ)

Шилжилтийн шугам

Шилжилтийн шугам

Connector “Залгаас”

Тухайн хуудсанд багтахгүй байгаа блок схемийг өөр хуудаснаас үргэлжлүүлэхдээ хоёр хуудасны залгаасыг тэмдэглэх (дотор нь тэмдгээ тавина)

зэрэг болно. Эдгээрийг хэрхэн ашиглаж буй жишээг үзье. Өмнө дурдсан Евклидийн алгоритмын блок-схемийг зурвал:

гэсэн байдалтай болох юм.

Блок руу орж буй сумыг оролт, гарч буй шугам буюу сумыг гаралт гэдэг. Ихэнх элемент нэг оролт, нэг гаралттай байдаг бол харин “Нөхцөл шалгах” элемент нэг оролттой, хоёр

Page 5: алгоритмчлалын үндэс

гаралттай байна. Хоёр гаралтанд нь үнэн ба худал гэсэн утгууд харгалзана. Заримдаа үнэн гэдгийг 1-ээр, худал гэдгийг 0-ээр илэрхийлнэ. Заримдаа бас “тийм”, “үгүй” гэсэн үгээр илэрхийлдэг.

Алгоритмын биелэлт ямагт сумын дагуу чиглэлд явагдана.

“Оролт” элемент нь компьютерын гараас (keyboard) өгөгдөл оруулах үйлдлийг илэрхийлдэг бол “Гаралт” элемент компьютерын дэлгэцэнд (display) үр дүнг гаргах үйлдлийг илэрхийлнэ.

Блок-схемд зөвхөн нэг “Эхлэл”, нэг “Төгсгөл” байна.

“Оролт”, “Гаралт”, “Процесс” зэрэг элементийн дотор нэг буюу түүнээс олон харгалзах үйлдлийг бичиж болно. Өөрөөр хэлбэл хэд хэдэн дараалсан “Оролтыг” нэг “Оролтонд”, хэд хэдэн дараалсан “Гаралтыг” нэг “Гаралтанд”, хэд хэдэн дараалсан “Процессыг” нэг “Процесс” дотор нэгтгэн бичиж болно.

Өөр нэгэн жишээ. Өгсөн тооны абсолют хэмжигдхүүнийг олох алгоритмыг зуръя. Түүний блок-схемийг хажуугийн зурагт харуулав. Энэ алгоритм яаж ажиллах вэ? Үгээр тайлбарлавал:

1.       Нэг тоо өг

2.       Хэрэв уг тоо сөрөг байвал абсолют хэмжигдхүүн нь түүний эсрэг тоо болно, үгүй бол (тоо эерэг үед) абсолют хэмжигдхүүн нь тэр тоо өөрөө байна

3.       Абсолют хэмжигдхүүний утгыг дэлгэцэнд хэвлэж гаргана

4.       Төгсгөл

гэж томъёологдох ажээ.

Алгоритмын үндсэн бүтцүүд

Элементүүд нийлж тодорхой бүтцийг үүсгэдэг. Эдгээр бүтцийг алгоритмын үндсэн бүтэц (АҮБ) хэмээн нэрийднэ. Ингэснээр алгоритмыг зөвхөн эдгээр бүтцээс тогтсон мэтээр авч үзэх боломжтой. АҮБ-ийн гол онцлог бол тэдгээр нь зөвхөн нэг оролт, нэг гаралттай байна.

3 төрлийн АҮБ байдаг. Энэ нь Процесс, Салаалалт, Давталт юм. Салаалалт бүтэц гүйцэд ба гүйцэд бус гэсэн 2 янз байдаг. Давталт бүтэц нь While (Байхад), Until (Хүртэл), Параметрт гэсэн 3 хэлбэртэй байна. Эд бүгдийн схемийг дараах хүснэгтэд харууллаа.

ПроцессСалаалалтГүйцэд Гүйцэд бус

Page 6: алгоритмчлалын үндэс

ДавталтWhile Until Параметрт

Дээрх схемүүдэд буй “Урсгал” бол нэг юм уу эсвэл бүлэг үйлдлийг илэрхийлнэ. “Нөхцөл” бол ямар нэгэн логик илэрхийлэл байна.

Параметрт давталтын схемд буй “ДП” – Давталтын Параметр, “АУ” - давталтын параметрын авах Анхны Утга, “ЭУ” – давталтын параметрын авах Эцсийн Утга, “АЛХАМ” – давталтын параметрын утгын өөрчлөгдөх Алхам юм.

Салаалалт бүтэц бүхэлдээ болон Давталт бүтцийн эхний хоёр төрөл нь “Нөхцөл шалгах элементээс” тогтсон байна.

Алгоритмд Салаалалт орж ирснээр түүний хувьд хоёр салаа зам бий болно. Чухам алинаар нь явах нь нөхцөл биелэх эсэхээс хамаарна.

Алгоритмд Давталт орж ирснээр нэг юм уу эсвэл бүлэг үйлдлийг олон дахин давтах боломжтой болдог. Ингэж давтагдах хэсгийг давталтын бие (body of cycle) хэмээн нэрийддэг.

While төрлийн давталт, нөхцөл биелж л байвал циклээ үргэлжлүүлнэ. Тэгж байгаад биелэхээ болимогц давталт хийгдэхээ больж, алгоритмын биелэлт дараагийн бүтэц рүү шилжинэ.

Until төрлийн давталт, нөхцөл биелэх хүртэл л циклээ үргэлжлүүлж байгаад биелмэгц л давталт хийгдэхээ больж, алгоритмын биелэлт дараагийн бүтэц рүү шилждэг.

Параметрт давталтын хувьд, давталтын параметр хэмээн нэрлэгдэх нэгэн хэмжигдхүүний авах утгын тоогоор давталтыг хийдэг. Хэрэв параметр нэгэнт эцсийн утгаа авсан бол давталт хийгдэхээ больж, алгоритмын биелэлт дараагийн бүтэц рүү шилжинэ.

Page 7: алгоритмчлалын үндэс

Тиймээс While, Until төрлийн давталтыг Нөхцөлт давталт, харин Параметрт давталтыг Тоолуурт давталт гэж нэрлэдэг. Нөхцөлт давталтын хувьд давталтын тоо урьдаас мэдэгдэхгүй бол Тоолуурт давталтын тоог урьдчилан тодорхойлж болно. Тэр нь:

Nдавталт = |ЭУ - АУ| / АЛХАМ + 1

гэж олддог.

Алгоритмын төрлүүд

Алгоритмыг төрлөөр нь шугаман ба шугаман бус гэж хоёр ангилдаг.

Шугаман алгоритм ( Linear algorithms )

Зөвхөн Процесс бүтцээс тогтсон алгоритм нь шугаман алгоритм болно. Учир нь түүний биелэлт зөвхөн нэг чиглэлд, дээрээс доошоо, эхлэлээс төгсгөл рүү шууд “урсана”.

Шугаман алгоритмын жишээнүүд авч үзье.

         Жишээ 1. Өмнө үзсэн (З+3)*(3+4)-23 илэрхийллийг бодох алгоритм:

Блок-схем Тайлбар1.        Алгоритм эхлэнэ.

2.        3 дээр 3-ыг нэмээд a-д утга болгож өгнө.

3.        3 дээр 4-ийг нэмээд b-д утга болгож өгнө.

4.        23-ийг олоод с-д утга болгож өгнө.

5.        a-г b-ээр үржүүлж, с-г нэмэхэд гарах хариуг d-д утга болгож өгнө.

6.        d-ийн утгыг дэлгэцэнд хэвлэж гаргана.

7.        Алгоритм төгсөнө.

         Жишээ 2. Өгсөн x-ийн хувьд y=5*x2+3*x функцыг бодох алгоритм:

Блок-схем Тайлбар

Page 8: алгоритмчлалын үндэс

1.        Алгоритм эхлэнэ.

2.        x-ийн утгыг гаднаас оруулж өгнө.

3.        5*x2+3*x илэрхийллийг бодоод гарах хариуг y-д утга болгож өгнө.

4.        y-ийн утгыг дэлгэцэнд хэвлэж гаргана.

5.        Алгоритм төгсөнө.

Энд, гаднаас тоо оруулмагц тэр нь x-ийн утга болон очих ажээ. Тэгээд бодолт хийгдэж, үр дүн дэлгэцэнд хэвлэгдэж байна.

         Жишээ 3. Гурвалжны талууд a, b, c болно. Дараах:

cosA = (b2 + c2 – a2)/ (2 * b * c)

sinB = (b * sinA) / a

C = 180o – (A + B)

томъёонуудын тусламжтайгаар түүний A, B, C өнцгүүдийг тодорхойл (градусаар). Санамж: arccos, arcsin тригонометрийн урвуу функцуудын утга радианаар илэрхийлэгддэг гэдгийг сануулъя.

Энэ бодлогын алгоритм нь:

Блок-схем Тайлбар

Page 9: алгоритмчлалын үндэс

1.        Алгоритм эхлэнэ.

2.        a-ийн утгыг гаднаас оруулж өгнө.

3.        b-ийн утгыг гаднаас оруулж өгнө.

4.        c-ийн утгыг гаднаас оруулж өгнө.

5.        180/3.14-ийг k-д утга утга болгож өгнө.

6.        arccos[(b2 +c2–a2)/(2*b*c)] томъёог бодоод гарах хариуг A_rad-д утга болгож өгнө.

7.        arcsin(b*sinA_rad/a) томъёог бодоод гарах хариуг B_rad –д утга болгож өгнө.

8.        A_rad-ыг k-аар үржүүлээд A_grad-д утга болгож өгнө.

9.        B_rad-ыг k-аар үржүүлээд B_grad-д утга болгож өгнө.

10.     C_grad=180o–(A_grad+B_grad) гэж олно.

11.     A_rad-ын утгыг дэлгэцэнд хэвлэж гаргана.

12.     B_rad-ын утгыг дэлгэцэнд хэвлэж гаргана.

13.     C_grad-ын утгыг дэлгэцэнд хэвлэж гаргана.

14.     Алгоритм төгсөнө.

Энд, градус=радиан*180/π=радиан*k гэсэн томъогоор радианаар олдсон өнцгийн утгуудыг (A_rad, B_rad, C_rad) градуст шилжүүлж (A_grad, B_grad, C_grad) байна.

         Жишээ 4. Хүнээс нэрийг нь асуугаад, дараа нь түүнийг мэндчилэх алгоритм:

Блок-схем Тайлбар

Page 10: алгоритмчлалын үндэс

1.        Алгоритм эхлэнэ.

2.        Дэлгэцэнд “Чамайг хэн гэдэг вэ?” гэсэн өгүүлбэрийг хэвлэж гаргана.

3.        Хэн нэгэн хүний нэрийг гаднаас оруулж name-д утга болгож өгнө.

4.        Дэлгэцэнд “Сайн уу” гэсэн үг хэвлээд араас нь name-ийн утгыг хэвлэж гаргана.

5.        Алгоритм төгсөнө.

Энэ жишээ өмнөх 3 жишээнээс ялгаатай нь ямар нэг тооцоо хийлгүй, зөвхөн хэрэглэгчтэй хялбар харилцан яриа үүсгэж байна. Алгоритм ажиллангуут хүний нэрийг асууна. Гараас нэр оруулмагц дэлгэцэнд мэндчилгээ хэвлэгдэх болно. Тухайлбал Бат гэж оруулахад “Сайн уу, Бат” гэж гарна.

Шугаман бус алгоритм ( Nonlinear algorithms )

Алгоритм нь салаалалт юм уу давталт агуулсан бол түүнийг шугаман бус алгоритм гэнэ. Учир нь түүний биелэгдэх чиглэл буюу “урсгал” нь мөчирлөсөн юм уу мушгирсан байдалтай болдог.

Тухайн тохиолдолд шугаман бус алгоритм нь зөвхөн салаалалт, эсвэл зөвхөн давталт агуулсан байх бол ерөнхий тохиолдолд салаалалт+давталт агуулсан байна. Жишээ алгоритмууд үзье.

Салаалалт.

         Жишээ 1. Өгсөн тооны урвууг олдог алгоритм:

Блок-схем Тайлбар

Page 11: алгоритмчлалын үндэс

1.        Алгоритм эхлэнэ.

2.        x-ийн утгыг гаднаас оруулна.

3.        x¹0 нөхцөл биелж буй эсэхийг шалгаад

хэрэв тийм байвал:[1] 1/x-ийг олж y-д утга болгон өгнө;

[2] y-ийн утгыг дэлгэцэнд хэвлэж гаргаад 4-р алхамд шилжинэ;

үгүй бол:4-р алхамд шилжинэ.

4.        Алгоритм төгсөнө.

Энэ алгоритм бол гүйцэд бус салаалалтын жишээ юм. Учир нь “Нөхцөл шалгах” элементийн хоёр гаралтын зөвхөн нэгэнд нь тодорхой үйлдэл харгалзаж байна. Гаднаас оруулсан тоо 0-ээс ялгаатай байвал л түүний урвууг бодож, дэлгэцэнд гаргах бөгөөд хэрэв 0 байвал бодолт хийхгүй, үр дүн хэвлэхгүй, алгоритм шууд дуусна.

         Жишээ 2. Өмнөх алгоритмыг дараах байдлаар зуръя:

Блок-схем Тайлбар1.        Алгоритм эхлэнэ.

2.        x-ийн утгыг гаднаас оруулна.

3.        x¹0 нөхцөл биелж буй эсэхийг шалгаад

Хэрэв тийм байвал:[1] 1/x-ийг олж y-д утга болгон өгнө;

[2] y-ийн утгыг дэлгэцэнд хэвлэж гаргаад 4-р алхам руу шилжинэ;

үгүй бол:“Хязгааргүй!” гэсэн мэдэгдлийг дэлгэцэнд гаргаад 4-р алхам руу шилжинэ.

4.        Алгоритм төгсөнө.

Харин энэ алгоритм бол гүйцэд салаалтын жишээ юм. Учир нь “Нөхцөл шалгах” элементийн хоёр гаралтанд хоёуланд нь тодорхой үйлдлүүд харгалзаж байна. Гаднаас оруулсан тоо 0-ээс ялгаатай байвал түүний урвууг бодож, дэлгэцэнд гаргаад алгоритм дуусна. Эсрэгээр 0 байвал бодолт хийлгүйгээр дэлгэцэнд “Хязгааргүй!” гэсэн үг хэвлээд алгоритм дуусна.

Page 12: алгоритмчлалын үндэс

Салаалалт бүтэц дотроо бас Салаалалт бүтцийг агуулсан байж болно. Өөрөөр хэлбэл нөхцөл шалгах үйлдлийн хоёр гаралтын аль нэгэнд, эсвэл хоёуланд нь дахиад нөхцөл шалгах үйлдэл хийгдэж болно. Үгүй яах вэ дээ, модны мөчир дахиад мөчирлөж салаалдагтай л адил гэх үү дээ. Ийм алгоритмын жишээтэй танилцъя.

         Жишээ 3. Бат, Болд хоёрын насыг нь асуугаад, тэдгээрийг оруулмагц хэн нь насаар ах болохыг мэдээлж гаргадаг алгоритм:

Блок-схем Тайлбар1.        Алгоритм эхлэнэ.

2.        Дэлгэцэнд “Бат хэдэн настай вэ?” гэж гаргана.

3.        Батын насыг гаднаас age1-т утга болгож оруулна.

4.        Дэлгэцэнд “Болд хэдэн настай вэ?” гэж гаргана.

5.        Болдын насыг гаднаас age2-т утга болгож оруулна.

6.        age1=age2 нөхцөл биелж буй эсэхийг шалгаад

хэрэв тийм байвал:“Бат Болд хоёр нас чацуу” гэж дэлгэцэнд гаргаад 7-р алхамд шилжинэ;

үгүй бол:age1>age2 нөхцөл биелж буй эсэхийг шалгаад хэрэв тийм байвал

“Бат насаар ах нь” гэж дэлгэцэнд гаргаад 7-р алхамд шилжинэ;

үгүй бол:“Болд насаар ах нь” гэж дэлгэцэнд гаргаад 7-р алхамд шилжинэ.

7.        Алгоритм төгсөнө.

Page 13: алгоритмчлалын үндэс

Ингэж давхар салаалалт ашиглан age1<age2, age1=age2, age1>age2 гэсэн 3 нөхцлийг хоёр Салаалалт бүтцээр буюу хоёр “Нөхцөл шалгах” элементийн тусламжтайгаар тооцож байгаа юм.

Логик холбоос.

Бидний үзсэн дээрх жишээнүүдэд, “Нөхцөл шалгах” элементийн тоо дотор нь бичигдсэн нөхцлийн тоотой тэнцүү байна. Өөрөөр хэлбэл нэг нөхцөл шалгадаг элемент дотор нэг л нөхцөл бичигдсэн байна. Тэгвэл And (Ба), Or (Буюу) гэсэн логик холбоосуудыг хэрэглэн нэг нөхцөл шалгадаг элемент дотор хоёр буюу түүнээс олон нөхцлийг бичиж болдог. Логик холбоосыг хоёр нөхцлийн дунд тавьдаг.

And холбоос нь түүний хоёр талын нөхцөл хоёулаа үнэн тохиолдолд үнэн гэсэн хариу өгөх бөгөөд аль нэг нөхцөл л худал болчихвол худал гэсэн хариу гаргана. Тиймээс энэ холбоосыг логик үржилт хэмээн нэрийднэ.

Or холбоос нь түүний хоёр талын нөхцлийн аль нэг нь үнэн байвал үнэн гэсэн хариу өгөх бөгөөд хоёр талын нөхцөл хоёулаа худал тохиолдолд л худал гэсэн хариу гаргана. Тиймээс энэ холбоосыг логик нэмэлт хэмээн нэрийднэ.

Логик холбоос хэрэглэж буй тохиолдолд гол анхаарах зүйл бол Ба, Буюугийн ялгааг зөв ойлгох явдал юм. Дараах жишээнүүдийг үзье.

         Жишээ 4. Өгсөн a тоо [0,20] завсарт байвал түүнийг 2-оор үржүүлэх, энэ завсарт орохгүй бол 2-оор нэмэх алгоритм:

Блок-схем Тайлбар1.        Алгоритм эхлэнэ.

2.        a-ын утгыг гаднаас оруулна.

3.        Хэрэв a³0 ба a£20 байвал:

a-ийн утгыг 2 дахин ихэсгээд 4-р алхамд шилжинэ;

үгүй бол:a-ийн утгыг 2-оор ихэсгээд 4-р алхамд шилжинэ.

4.        a-ын утгыг дэлгэцэнд хэвлэж гаргана.

5.        Алгоритм төгсөнө.

Энэ жишээнд, a тоо [0,20] завсарт орших уу гэсэн нөхцлийг “(a>=0) And (a<=20)” гэж бичсэн байна. Мэдээж a³0 ба a£20 үед л aÎ[0,20] байна гэж үзнэ шүү дээ. Уг илэрхийлэл хэзээ худал

Page 14: алгоритмчлалын үндэс

байх вэ? And холбоос түүний хоёр талын аль нэг нөхцөл л худал бол худал гэсэн хариу гаргадгийг дээр дурдсан. Тиймээс, гаднаас оруулсан утга 0-ээс бага юм уу 21-ээс их болчихвол худал болно. Түүнчлэн логик холбоос ашигласны ачаар блок-схем зөвхөн ганц дан Салаалалт бүтцийг агуулжээ. Хэрэв And оруулаагүй бол бид давхар салаалалт хийх байсан.

         Жишээ 5. Өмнөх жишээний бодлогыг бид дараах байдлаар томъёолж болно. Өгсөн a тоо [0,20] завсрын гадна байвал түүнийг 2-оор ихэсгэх, энэ завсарт орох бол 2-оор үржүүлэх алгоритм:

Блок-схем Тайлбар1.        Алгоритм эхлэнэ.

2.        a-ын утгыг гаднаас оруулна.

3.        Хэрэв a<0 буюу a>20 байвал:

a-ийн утгыг 2-оор ихэсгээд 4-р алхамд шилжинэ;

үгүй бол:a-ийн утгыг 2 дахин ихэсгээд 4-р алхамд шилжинэ.

4.        a-ын утгыг дэлгэцэнд хэвлэж гаргана.

5.        Алгоритм төгсөнө.

Энэ жишээнд, a тоо [0,20] завсрын гадна орших уу гэсэн нөхцлийг “(a<0) Or (a>20)” гэж бичсэн байна. Мэдээж a<0 юм уу a>20 үед л aÏ[0,20] байна гэж үзнэ шүү дээ. Уг илэрхийлэл хэзээ худал байх вэ? Or холбоос түүний хоёр талын нөхцөл хоёулаа худал бол худал гэсэн хариу гаргадгийг дээр дурдсан. Тиймээс, гаднаас оруулсан утга 0-оос их буюу тэнцүү ба 20-иос бага буюу тэнцүү тохиолдолд худал гэсэн хариу гарна.

Давталт.

Алгоритмд яагаад давталт орж ирдэг вэ? Өгсөн бодлогыг хялбар аргаар түргэн шуурхай бодохын тулд. Гэхдээ алгоритмдаа давталт ашиглах хэрэгцээ шаардлага байгаа эсэхийг тухайн бодлогын нөхцөл тодорхойлно. Ж.нь ийм бодлого байна. “2-оос 10 хүртэлх бүх тэгш тоог дэлгэцэнд хэвлэ”. Үүнийг бид ямар ч давталт ашиглалгүй зүгээр шугаман алгоритм зохион гүйцэтгэж болно. Ингэхдээ гаралтын элементийг 5 удаа эсвэл нэг удаа ашиглана:

Page 15: алгоритмчлалын үндэс

За тэгвэл, “2-оос 200 хүртэлх бүх тэгш тоог дэлгэцэнд хэвлэ” гэсэн бол яах вэ? Дээрх шигээр, гэхдээ 100 Процесс блокийг доош цувуулах юм уу нэг Процесс дотор 100 ширхэг тоог цувуулан бичиж болно нь л доо. Харин зарцуулах хөдөлмөр маань цаг үрсэн, зурагдах блок-схем маань сунжирсан урт “болхи” болно. Энэ тохиолдолд давталт ашиглах нь тохиромжтой.

Давталтын 3 төрөл байдгийг бид өмнөх сэдвээс мэдэж авсан. Одоо дээрх бодлогыг эдгээр төрөл бүрээр хэрхэн гүйцэтгэх жишээтэй танилцъя.

         Жишээ 1. 2-оос 200 хүртэлх бүх тэгш тоог дэлгэцэнд хэвлэх алгоритмд While төрлийн нөхцөлт давталт ашигласан байдал:

Блок-схем Тайлбар1.        Алгоритм эхлэнэ.

2.        k гэсэн хувьсагчид 2 гэсэн утга онооно.

3.        k-ийн утга 200-аас хэтрээгүй эсэхийг шалгаад

хэрэв тийм байвал:[1] k-ийн утгыг дэлгэцэнд хэвлэж гаргана;

[2] k-ийн утгыг 2-оор ихэсгээд 3-р алхамд шилжинэ;үгүй бол:

4-р алхамд шилжинэ.4.        Алгоритм төгсөнө.

Page 16: алгоритмчлалын үндэс

Алгоритм яаж ажиллаж байна вэ? Хамгийн эхлээд 2 гэсэн утгатай k гэсэн хувьсагчийг 200-аас хэтрээгүй утгатай байна уу гэдгийг шалгана. 2<200 учраас 1 гаралтаар явна. Дэлгэцэнд 2 гэж гарна. Дараа нь k-г 2-оор ихэсгэнэ. Дахиад k-ийн утга 200-аас хэтрээгүй эсэхийг шалгана. Мэдээж 4<200 учраас 1 гаралтаар явж, дэлгэцэнд 4 гэж гарна. k=6 болно. Дахиад нөхцөл шалгана. 6<200 учраас мөн л 1 гаралтаар явна. Харгалзах үйлдлүүд хийгдэнэ. Иймэрхүү маягаар, k£200 байгаад л байвал, түүний агшин зуурын утгыг хэвлэн, 2-оор ихэсгэх үйлдлүүд давтагдах болно. Давталт хийгдсээр дэлгэцэнд 2 4 6 8 10 12 ... 196 198 гэж гарсны дараа юу болохыг авч үзье. k=k+2 үйлдлээр k-ийн утга 200 болж таарна. Нөхцөл шалгахад 200=200 учраас k нь 200-аас хэтрээгүй гэсэн үг. Тиймээс 1 гаралтаар явж дэлгэцэнд 200 гэж хэвлэгдэнэ. k=202 болно. Дахиад k£200 нөхцлийг шалгана. Мэдээж 202 нь 200-аас эрс их тоо (202>200) учир одоо бол k£200 нөхцөл биелэхгүй. Тиймээс 0 гаралтаар явж, алгоритм шууд төгсөх ажээ. Нөхцөл биелээд байхад давталт хийгдсээр, биелэхээ болимогц давталт хийгдэхээ больчихож байна. Давталтын бие нь энд юу болох вэ? Яг давтагдаж байгаа: k-г хэвлэх, k-г 2-оор ихэсгэх гэсэн үйлдлүүд бол давталтын бие юм. While бүтцийн хувьд давталтын бие нь нөхцөл шалгах элементийн 1 гаралтанд харгалзаж байна.

         Жишээ 2. Дээрх бодлогын алгоритмд Until төрлийн нөхцөлт давталт ашигласан байдал:

Блок-схем Тайлбар1.        Алгоритм эхлэнэ.

2.        k гэсэн хувьсагчид 2 гэсэн утга онооно.

3.        k-ийн утгыг дэлгэцэнд хэвлэж гаргана.

4.        k-ийн утгыг 2-оор ихэсгэнэ.

5.        k-ийн утга 200-аас хэтэрсэн эсэхийг шалгаад

хэрэв тийм байвал:6-р алхамд шилжинэ;

үгүй бол:3-р алхамд шилжинэ.

6.        Алгоритм төгсөнө.

Алгоритм яаж ажиллаж байна вэ? Хамгийн эхлээд k гэсэн хувьсагчийн утгыг хэвлэж байна. Дэлгэцэнд 2 гэж гарна. Дараа нь k-г 2-оор ихэсгэнэ. Тэгээд k-ийн утга 200-аас хэтэрсэн байна уу гэдгийг шалгана. 2>200 биш учраас 0 гаралтаар явж, дэлгэцэнд 4 гэж гарна. k=k+2 болно. Дахиад k-ийн утга 200-аас хэтэрсэн эсэхийг шалгана. Мэдээж 4>200 биш учраас 0 гаралт хийгдэж, дэлгэцэнд 6 гэж гарна. k=8 болно. Дахиад нөхцөл шалгана. Нөхцөл биелэхгүй тул мөн л 0 гаралтаар явна. Харгалзах үйлдлүүд хийгдэнэ. Иймэрхүү маягаар, k>200 болох хүртэл л түүний агшин зуурын утгыг хэвлэж, 2-оор ихэсгэх үйлдлүүд давтагдах болно. Давталт хийгдсээр дэлгэцэнд 2 4 6 8 10 12 ... 196 198 гэж гарсны дараа юу болохыг авч үзье. k=k+2 үйлдлээр k-ийн утга 200 болж таарна. Нөхцөл шалгахад 200=200 учраас k>200 болоогүй гэсэн үг. Тиймээс 0 гаралтаар явж дэлгэцэнд 200 гэж хэвлэгдэнэ. Тэгээд k=202

Page 17: алгоритмчлалын үндэс

болно. Дахиад k£200 нөхцлийг шалгана. Одоо бол, 202 нь 200-аас эрс их тоо (202>200) учир k>200 нөхцөл биелнэ. Тиймээс 1 гаралтаар явж, алгоритм шууд төгсөх ажээ. Нөхцөл биелэхгүй байхад буюу нөхцөл биелэх хүртэл давталт хийгдсээр, биелмэгц давталт хийгдэхээ больчихож байна. Давталтын бие нь энд юу болох вэ? Давтагдаж байгаа: k-г хэвлэх, k-г 2-оор ихэсгэх гэсэн үйлдлүүд давталтын бие болно. Until бүтцийн хувьд давталтын бие нь нөхцөл шалгах элементийн 0 гаралтанд харгалздаг байна.

         Жишээ 3. Өмнөх бодлогын алгоритмд Параметрт давталт ашигласан байдал:

Блок-схем Тайлбар1.        Алгоритм эхлэнэ.

2.        k=2 гэсэн утга авна.

3.        Хэрэв k£200 байвал:

[1] k-ийн утгыг дэлгэцэнд хэвлэж гаргана;

[2] k-ийн утгыг 2-оор ихэсгээд 3-р алхамд шилжинэ;үгүй бол:

4-р алхамд шилжинэ.4.        Алгоритм төгсөнө.

Энэ тохиолдолд k гэсэн хувьсагчийг давталтын параметр буюу тоолуур болгон ашиглажээ. Тоолуур [2,200] завсраас 2-оор өөрчлөгдсөн утгуудыг авна. Завсрын доод хязгаарын 2 гэсэн утга бол Анхны Утга, дээд хязгаарын 200 бол Эцсийн Утга, өөрчлөлтийн 2 бол Алхам юм. Түүний шинэ утга бүрт харгалзсан гаралтын үйлдэл хийгдэж байна. Дэлгэцэнд хамгийн эхлээд 2, дараа нь 4, 6, 8, ... г.м. тоонууд гарна. Иймэрхүү маягаар k нь 100 өөр утга авахад түүнийг нь дэлгэцэнд мөн 100 удаа хэвлэнэ. Хамгийн сүүлд k=200 болоход түүнийг дэлгэцэнд гаргасны дараагаар бол тоолуур Эцсийн Утгаасаа хэтэрсэн утга авахгүй учраас алгоритмын дараагийн хэсэг буюу төгсгөл рүү явах болно. Давталтын бие бол одоо зөвхөн k-г хэвлэх ганц үйлдлээс тогтсон байна. Давталтын тоо нь тоолуурын авах утгын тоотой тэнцүү байна.

Дээрх 3 жишээнд бид нэг бодлогыг давталтын 3 төрлөөр бодлоо. Гэхдээ практик дээр бол, бодлогын нөхцөл, онцлогоос шалтгаалан аль нэг давталтын хэлбэрийг ашиглах нь илүү тохиромжтой байх тохиолдол гардаг. Чухам алиныг нь вэ гэдгийг алгоритм зохиогч өөрөө оновчтой сонгох ёстой.

Давхар салаалалт гэж байдгийн адилаар давхар давталт бас байж болно. Өөрөөр хэлбэл нэг Давталт бүтцийн доторх давталтын биед мөн Давталт бүтэц оршиж болно гэсэн үг. Хэрэв гадна талын давталт N удаа, дотор талын давталт M удаа хийгдэхээр заагдсан байвал дотор талын давталт нийт N*M удаа хийгдэнэ. Учир нь гадаад давталтын нэг эргэлтэнд дотоод давталт M удаа хийгдэнэ шүү дээ. Одоо давхар давталт ашигласан жишээ үзье.

Page 18: алгоритмчлалын үндэс

         Жишээ 4. z(x,y)=x2+y2 функцыг xÎ[-5,5], yÎ[-5,5] завсарт (x, y нь бүхэл тоо) бодуулах алгоритм:

Блок-схем Тайлбар1.        Алгоритм эхлэнэ.

2.        x=-5 гэсэн утга авна.

3.        Хэрэв x£5 байвал:

[1] y=-5 гэсэн утга авна;

[2] Хэрэв y£5 байвал:[[1]] z=x2+y2 томъёог бодно;

[[2]] z-ийн утгыг дэлгэцэнд хэвлэнэ;

[[3]] y-ийн утгыг 1-ээр ихэсгээд [2]-р алхамд шилжинэ;

үгүй бол:[3]-р алхамд шилжинэ;

[3] x-ийн утгыг 1-ээр ихэсгээд 3-р алхамд шилжинэ.үгүй бол:

4-р алхамд шилжинэ.4.        Алгоритм төгсөнө.

Алгоритм хэрхэн ажиллаж байна вэ? x нь -5-аас +5 хүртэлх 11 утга авах бүрд y нь -5-аас +5 хүртэлх утга авч байна. Өөрөөр хэлбэл x-ийн нэг утганд y-ийн 11 утга харгалзаж байна. Иймээс дотоод давталтын бие болох [[1]], [[2]] үйлдлүүд (блок-схемийн тайлбарыг хар) 11*11=121 удаа хийгдэх нь ээ. Энд манай 2 хэмжээст функц 11 мөртэй, 11 баганатай хүснэгт болон гарч ирж байгаа юм. Хэрэв график байгуулвал гадаргуу зурагдах болно.