Си хэлний операторууд
·
Операторын тухай
·
Цэгтэй
таслал (;)-ын тухай
·
Үл биелэгдэх операторууд
·
Оролт, гаралтын операторууд
·
Нөхцөл шалгах оператор буюу Салаалалт бүтэц
·
Нийлмэл оператор ба блок
·
Нөхцөл шалгах оператор буюу Салаалалт бүтэц
(үргэлжлэл)
·
Давталтын операторууд
·
Шилжүүлэх операторууд
·
Сонголтын оператор буюу Сонголт бүтэц
Оператор гэж юу
вэ? Өмнөх лекцүүдийг уншиж байхад оператор гэсэн үг хэд хэд тааралдаж байгаа. Тэр
үед нь оператор гэж чухам юу болох талаар оновчтой, тодорхой хариулт өгөөгүй
билээ. Харин одоо хариулт өгөх гээд үзье.
Үүний тулд Си
хэлийг хүний хэл яриатай, тухайлбал монгол хэлтэй харьцуулъя.
Монгол хэлний
аливаа үг цагаан толгойн үсэгнүүдээс бүтдэг. Үүний адилаар, Си хэлний цагаан
толгой нь Си хэл дээр ямар нэг үг бүтээнэ. Си хэлний үгийг лексем (lexeme эсвэл
token) гэнэ. Бид Лекц#3 дээр Си хэлний цагаан толгой ба лексемүүдтэй танилцсан.
Монгол үгнүүд монгол
хэлнийхээ дүрмийн дагуу холбогдож өгүүлбэр бүтээдэг. Үүний адилаар, Си хэлний
лексемүүд Си хэлнийхээ дүрмийн дагуу холбогдож өгүүлбэр бүтээдэг. Си хэл дээр
бичигдсэн ийм өгүүлбэрийг оператор (statement) гэдэг байна.
Одоо монгол хэл
дээр бичигдсэн ямар нэг текстийг (шүлэг, өгүүлэл г.м.) төсөөлөөд үз. Энэ нь хэд
хэдэн өгүүлбэрүүдийн дараалал байдаг биз дээ. Үүний адилаар, Си хэл дээр
бичигдсэн програмын текст нь хэд хэдэн операторуудын дараалал байна.
Програмд
гүйцэтгэж буй үүргээр нь операторуудыг:
·
биелэгдэх
оператор (executable statement)
·
үл
биелэгдэх оператор (non-executable statement)
гэж ангилдаг байна. Ингэж ангилахын учрыг олохын тулд дахиад монгол хэлтэй аналог хийе.
“Түүний нэр Баяр. Тэр
20 настай.” гэсэн хоёр өгүүлбэрийг авч үзье. Эдгээр өгүүлбэрүүд хэн нэгний нэр
ба насны талаарх мэдээллийг бусдад өгч, таниулах үүрэгтэй байна. Түүнээс биш
бусдыг ямар нэг үйлдэл хийхийг заагаагүй ажээ. Тэгвэл “Түүнийг нэрээр нь дууд. Түүний
насыг асуу.” гэсэн хоёр өгүүлбэрийг авч үзье. Эдгээр өгүүлбэрүүд бол харин тус
тусдаа шууд үйлдэл хийхийг заасан байна. Түүнээс биш хэн нэгний нэр ба насны
талаарх мэдээллийг өгөөгүй байна. Үүний адилаар, компьютерээр шууд ямар нэг
үйлдэл хийлгэх үүрэгтэй операторыг биелэгдэх оператор гээд харин програмын
тухай мэдээллийг хөрвүүлэгчид өгөх үүрэгтэй операторыг үл биелэгдэх оператор
гээд байгаа юм.
Хөрвүүлэгч нь үл
биелэгдэх операторуудын тусламжтайгаар програмын бүтэц, зохион байгуулалт,
боловсруулах өгөгдлүүдийн талаарх мэдээллийг олж аваад түүндээ тулгуурлан
биелэгдэх операторуудыг машины код руу хөрвүүлнэ. Ө.х. машины код нь зөвхөн биелэгдэх операторуудын
“орчуулга” байдаг байна. Учир нь үл биелэгдэх операторууд хөрвүүлэлтийн шатанд үүргээ гүйцэтгээд “хаягддаг” ажээ.
Гэхдээ өгөгдлүүд хаягдахгүй гэдгийг санах хэрэгтэй.
Тэгэхээр зөвхөн
биелэгдэх операторууд л харгалзах машины командуудтай байдаг гэж ойлгож болох
нь ээ. Ингэхдээ нэг биелэгдэх операторт нэг буюу түүнээс олон машины команд
харгалзсан байдаг.
Ямар ямар
биелэгдэх болон үл биелэгдэх операторууд байдаг вэ?
Си хэлний
биелэгдэх операторууд нь:
·
утга оноох
оператор
·
оролт,
гаралтын операторууд
·
функц
дуудах оператор
·
нөхцөл
шалгах оператор буюу Салаалалт
бүтэц
·
давталтын
оператор буюу Давталт бүтэц
·
сонголтын
оператор буюу Сонголт бүтэц
·
шилжүүлэх
операторууд
·
нийлмэл
оператор буюу блок
г.м. болно. Харин үл биелэгдэх операторын тухайд бол, ийм оператор нь зарлах, таниулах г.м. үүрэгтэй гэснийг санаж байгаад:
·
өгөгдөл
зарлах
·
функцын
толгой хэсэг
·
функцын
прототип тодорхойлох
г.м.-ийг хамааруулж болно. Түүнчлэн препроцессорын директивийг ч бас хамааруулж үзэж болох талтай.
Эдгээр
операторууд нь бүгд урьдчилан тодорхойлогдсон загварын дагуу бичигдэх бөгөөд
түүнийх нь дагуу хөрвүүлэгч тэдгээрийг “танин мэднэ”. Хэрэв зохих загварыг
баримтлаагүй байвал хөрвүүлэгч алдаа өгөх болно.
Си хэлд цэгтэй
таслал буюу ; нь операторын төгсгөлийг заагч тэмдгийн үүргийг гүйцэтгэдэг байна.
Ө.х. аливаа операторыг бичихдээ төгсгөлд нь цэгтэй таслалыг тавих ёстой ажээ.
Тиймээс Dev С++ хөрвүүлэгч ;-аар төгссөн
дурын илэрхийллийг оператор гэж үздэг байна.
Онолын хувьд, функцын толгой хэсгээс бусад бүх биелэгдэх ба үл биелэгдэх операторын
ард цэгтэй таслал тавих боломжтой. Гэхдээ практик дээр, ард нь цэгтэй таслал
тавих боломжтой операторуудын заримыг нь л цэгтэй таслалыг бичээд, харин заримыг
цэгтэй таслалгүйгээр бичдэг байна. Учир нь:
·
утга
оноох
·
оролт-гаралт
·
функц
дуудах
·
шилжүүлэх
·
өгөгдөл
зарлах
·
функцын
прототип
гэсэн операторуудын ард цэгтэй таслалыг заавал бичих ёстой ажээ. Хэрэв бичилгүй орхивол хөрвүүлэгч алдаа заадаг байна. Харин:
·
нөхцөл
шалгах (Салаалалт бүтэц)
·
давталтын
(Давталт бүтэц)
·
сонголтын
(Сонголт бүтэц)
·
нийлмэл
операторуудын ард цэгтэй таслалыг заавал бичих албагүй юм. Бичлээ гээд хөрвүүлэгч алдаа заадаггүй, бичсэнгүй гээд мөн алдаа заадаггүй байна.
Функцын толгой хэсгийн
ард бол угаасаа цэгтэй таслал тавих ёсгүй ажээ. Хэрэв цэгтэй таслал бичвэл
хөрвүүлэгч алдаа заадаг байна.
Цэгтэй таслалыг
буруу газар бичих юм бол операторын бүтэц (загвар) алдагдаж нэг бол хөрвүүлэгч алдаа өгнө, эсвэл програм буруу ажилладаг. Эхлэн
суралцагч оюутан ялангуяа Салаалалт, Давталт, Сонголт бүтцүүдийг бичиж байхдаа ийм
алдаа гаргах магадлал өндөр байдаг. Үүнийг анхаарах хэрэгтэй.
Өгөгдөл зарлаж буй
жишээ авч үзье. Тухайлбал эерэг бүхэл төрлийн x гэсэн хувьсагч зарлагдсан байг:
unsigned int x;
Тэгэхээр ийм бичиглэл бол үл биелэгдэх оператор болдог байна. Учир нь x гэсэн нэр бүхий өгөгдлийн талаарх мэдээллийг (тогтмол эсвэл хувьсагчийн аль нь болох, ямар өгөгдлийн төрөлд хамаарах г.м.) хөрвүүлэгчид өгч байгаа юм.
Функцын толгой хэсгийн
жишээ авч үзье. Тухайлбал үндсэн функцын толгой хэсгийг:
main( )
гэж
бичдэгийг бид мэднэ. Тэгэхээр ийм бичиглэл бол үл биелэх оператор болдог байна.
Учир нь, үндсэн функц эхлэж байна гэдгийг хөрвүүлэгчид мэдээлж байгаа юм. Мөн
функцын буцаах утгын талаарх мэдээллийг бас хөрвүүлэгчид өгч байгаа.
Функцын толгой
хэсгийг ардаа цэгтэй таслалгүйгээр бичиж байгааг анхаараарай.
Функцын прототипын
жишээ авч үзье. Прототип гэдгийг функцын эх загвар гэж монголчлоод байгаа. Тухайлбал,
int төрлийн нэг, float төрлийн хоёр аргументтай ямар
нэгэн myfunc( ) гэсэн функцын эх загварыг:
void myfunc(int, float, float);
гэж бичиж болно. Тэгэхээр ийм бичиглэл бол үл биелэх оператор болдог байна. Учир нь myfunc( ) хэмээх функцын буцаах утга, бусад функцуудтэй хэрхэн холбогдох талаарх мэдээллийг хөрвүүлэгчид өгч байгаа юм.
Прототипын тухай яриа одоохондоо
ойлгомжгүй байгаа байх. Дараагийн
хичээлүүдээс функцын талаар дэлгэрэнгүй үзэх бөгөөд тэгэхдээ прототипын тухай хангалттай
ойлголтыг өгөх болно.
Оролт, гаралтын
операторууд нь харгалзан оролтын хэрэгслээр компьютерт өгөгдөл оруулах, мөн гаралтын
хэрэгслээр өгөгдөл (үр дүн) гаргах үйлдлүүдийг илэрхийлнэ. Бидний хувьд оролтын
хэрэгслийн үүргийг гар (keyboard), гаралтын хэрэгслийн үүргийг дэлгэц (display)
гүйцэтгэж байгаа.
Гаралтын операторыг бичихдээ printf() гэсэн стандарт функц ашигладаг. Програмаас дэлгэц
рүү өгөгдөл гаргах үйлдлийг дараах загвар бүхий оператораар илэрхийлдэг:
printf(форматын_мөр, аргумент1, аргумент2, ...);
Энд:
·
printf( ) – гаралтын үйлдлийг гүйцэлдүүлэх стандарт
функц
·
форматын_мөр:
o
“%d” – int төрлийн бүхэл утга
o
“%u” – unsgned int төрлийн бүхэл утга
o
“%c” – char төрлийн бүхэл утга
o
“%f” – float төрлийн бодит утга
o
“%lf” – double төрлийн бодит утга
Оролтын операторыг бичихдээ scanf() гэсэн стандарт функц ашигладаг. Програмд гараас
өгөгдөл оруулах үйлдлийг дараах загвар бүхий оператораар илэрхийлдэг:
scanf(форматын_мөр, &аргумент1, &аргумент2,
...);
Энд:
·
scanf( ) – оролтын үйлдлийг
гүйцэлдүүлэх стандарт функц
·
форматын_мөр:
o
“%d” – int төрлийн бүхэл утга
o
“%u” – unsgned int төрлийн бүхэл утга
o
“%c” – char төрлийн бүхэл утга
o
“%f” – float төрлийн бодит утга
o
“%lf” – double төрлийн бодит утга
Бид “Алгоритмчлалын
үндэс” хичээлийг үзэж байхдаа нөхцөл шалгах элементтэй танилцсан билээ.
Алгоритмд ийм элемент орж орж ирэхээрээ Салаалалт хэмээх бүтцийг үүсгэдэг
байгаа. Энэ бүтэц нь алгоритмын биелэгдэх урсгалыг салаалуулж, чухам аль салаагаар
“урсгах вэ” гэдгийг нь “шийддэг”. Салаалалт бүтэц нь гүйцэт ба гүйцэт бус гэсэн
хэлбэрүүдтэй байдаг билээ.
Си хэлэнд Салаалалт бүтцийг
нөхцөл шалгах оператор хэмээн нэрийддэг. Энэ оператор нь if гэсэн албаны үгээр илэрхийлэгдэнэ.
if оператор нь ямагт функцын бие дотор бичигдэнэ. Гүйцэт ба гүйцэт бус
хоёр хэлбэртэй байна.
Нөхцөл шалгах гүйцэт
бус оператор нь:
if (нөхцөл) үйлдэл;
гэж бичигдэнэ.
Энд:
·
if – “Хэрэв” гэсэн утгатай албаны үг
·
нөхцөл – арифметик илэрхийлэл, эсвэл нөхцөлт илэрхийлэл,
эсвэл логик илэрхийлэл байж болно. Үнэн буюу худал гэсэн хариунуудын аль нэгийг
гаргана. Эдгээр нь тоогоор илэрхийлэгддэг: 0-ээс ялгаатай байвал үнэн, 0 байвал
худал. Нөхцлийг яаж бичих талаар Лекц#3-ын
“Илэрхийлэл: Нөхцөлт ба логик илэрхийлэл” хэсэгт дурдсан байгаа.
·
үйлдэл – зөвхөн нөхцөл
үнэн үед хийгдэх оператор.
Үгээр тайлбарлах
юм бол:
“Хэрэв нөхцөл үнэн (биелж) байвал Үйлдэл-ийг хийх”
гэсэн өгүүлбэр байна.
Харин блок-схемийн
дүрслэл ашиглах юм бол:

гэсэн бүтэц байна.
Жишээ програм авч үзье.
Өгөгдсөн x бүхэл тооны урвууг олдог програмыг гүйцэт
бус нөхцөл шалгах оператор ашиглан ингэж бичиж болно:
|
Програм |
Алгоритм |
|
|
|
Бодох алгоритмын тухайд тайлбар хийх шаардлага алга. Харин програмын хувьд дараах тайлбаруудыг хэлье:
·
x нь 0-ээс ялгаатай эсэхийг шалгах нөхцлийг бичихдээ x!=0 гэж бичсэнийг анхаарна уу. Энэ тухай Лекц#3-ын “Илэрхийлэл: Нөхцөлт ба
логик илэрхийлэл” хэсэгт дурдсан байгаа.
·
1/x-ын утгыг дэлгэцэнд гаргахдаа:
(float)
1 / x
гэж
бичсэнийг анхаарна уу. Энэ нь 1/x-ийн утгыг float гэсэн бодит төрөлд шилжүүлж буй үйлдэл юм. (float)
гэдэг нь өгөгдлийн төрлийг
илээр хувиргах үйлдэл. Учир нь хуваах үйлдэл \-д оролцож буй операндууд бүхэл
төрөл байвал хариу нь бүхэл болж, бутархай хэсэг нь хаягддаг байна. Тиймээс 1/x
нь бүхэл тоо болно. Гэтэл энэ нь зөв хариу байж чадахгүй. Тиймээс 1-ийн урд (float) гэж бичсэнээр түүнийг 1.0 гэсэн
бодит тоо болгоод, дараа нь 1/x-ийг бодож байгаа юм. Ингэхэд бодит тоон хариу
гарах болно.
Гүйцэт бус салаалалтын
ийм нэг тохиолдлыг авч үзье.

Ө.х. нөхцөл үнэн байвал нэг биш харин нэлээн хэдэн (ж.нь хоёр) үйлдэл дараалж хийгдэх тохиолдол байна. Энэ тохиолдолд гүйцэт бус салаалалтын оператор:
if (нөхцөл)
{
үйлдэл1;
үйлдэл2;
}
гэж бичигддэг байна. Тухайлбал өмнөх сэдэвт үзсэн жишээ програмыг дараах байдлаар өөрчилж болно:
|
Програм |
Алгоритм |
|
|
|
Бид, нуман хаалтуудаар
үндсэн функцын биеийн эхлэл, төгсгөлийг тэмдэглэж байсан билээ. Тэгвэл, нуман
хаалтууд нь if операторын гүйцэтгэх үйлдлүүдийн
эхлэл, төгсгөлийг тэмдэглэхэд мөн хэрэглэгддэг байна. Ө.х. хэсэг операторыг
бүлэглэн ялгахдаа нуман хаалтыг ашигладаг ажээ.
Ингэж нуман хаалтаар
зааглагдсан бүлэг операторыг нийлмэл оператор (compound statement) хэмээн
нэрийднэ. Операторуудыг ингэж бүлэглэж буйгийн зорилго нь, тэдгээрийг нэг “цул”
оператор мэтээр авч үзнэ гэсэн санааг илтгэдэг.
Хэрэв нийлмэл оператор
нь дотроо биелэгдэх операторуудаас гадна өгөгдөл зарлах оператор агуулсан байвал
түүнийг блок хэмээн нэрийддэг.
Энэ утгаараа бол
үндсэн функцын бие өөрөө блок болж таарч байна.
Нөхцөл шалгах гүйцэт
оператор нь:
if (нөхцөл)
үйлдэл1;
else
үйлдэл2;
гэж бичигдэнэ. Энд:
·
else – “Үгүй бол” гэсэн
утгатай албаны үг
·
үйлдэл1 – нөхцөл
үнэн үед хийгдэх оператор
·
үйлдэл2 – нөхцөл
худал үед хийгдэх оператор.
Үгээр тайлбарлах
юм бол:
“Хэрэв нөхцөл үнэн (биелж) байвал Үйлдэл1-ийг хий,
үгүй бол (нөхцөл худал байвал) зөвхөн Үйлдэл2-ыг
хий”
гэсэн өгүүлбэр байна.
Харин блок-схемийн
дүрслэл ашиглах юм бол:

гэсэн бүтэц байна.
Жишээ нь өгсөн тооны
урвууг олдог програмыг ингэж бичиж болно:
|
Програм |
Алгоритм |
|
|
|
Нийлмэл оператор
ашигласан байдлаар бол гүйцэт
оператор нь:
if (нөхцөл)
{
үйлдэл1;
үйлдэл2;
}
else
{
үйлдэл3;
үйлдэл4:
}
гэж бичигдэнэ. Энд:
·
үйлдэл1, үйлдэл2 – нөхцөл
үнэн үед хийгдэх операторууд
·
үйлдэл3, үйлдэл4 – нөхцөл
худал үед хийгдэх операторууд.
График дүрслэлээр бол:

гэж илэрхийлэгдэнэ.
Харин өмнөх жишээ
програмыг:
|
Програм |
Алгоритм |
|
|
|
гэж бичиж болно.
Энэ удаа, тэмдэгт
өгөгдөлтэй ажилладаг програм авч үзье.
АНУ-ын эрдэмтэд
Ангараг гариг луу олон удаа сансрын автомат станцуудыг илгээсэн билээ. Одоогийн
байдлаар Ангараг дээр очсон бүх станцуудын ажиглалт, судалгаагаар тэнд амьдрал
байхгүй гэсэн дүгнэлт хийж болохоор байгаа юм. Үүнтэй холбоотойгоор иймэрхүү
програм бичиж болохоор байна:
|
Програм |
Алгоритм |
|
#include <stdio.h> #include <conio.h> void main( ) { char xariult, zuv_xariult; zuv_xariult = 'n'; printf ("\nAngarag deer amidral baina uu?"); printf ("\nTiim gevel 'y', ugui gevel 'n' dar: "); scanf ("%c", &xariult); if (xariult==zuv_xariult) printf ("%c - Ta zuv xariullaa!", xariult); else printf ("%c - Buruu xariult!", xariult); getch ( ); } |
|
Манай програмд тэмдэгт төрлийн 2 хувьсагч зарлагдаж байгаа бөгөөд:
char xariult, zuv_xariult;
нэгэнд нь
програм дотроо үсгэн (тэмдэгт) утга:
zuv_xariult =
'n';
нөгөөд нь
гаднаас утга өгч байна:
scanf
("%c", &xariult);
Энэ жишээнээс харахад,
гаднаас үсгэн утга оруулахын тулд scanf( ) функцэд ’%c’ гэсэн таних тэмдэг ашигладаг
ажээ. Гаднаас зөвхөн ганц үсэг оруулах ёстой. Хэрэв үг оруулбал хамгийн эхний
үсгийг нь л авах болно. Хэрэв тоо оруулбал түүнийг үг гэж хүлээн авна.
Алгоритмд давхар
Салаалалт бүтэц орсон байж болдог шиг програмд нөхцөл шалгах оператор давхарлан
орсон байж болно. Үүний жишээнүүдийг дараах хүснэгтэд харууллаа:
|
Оператор |
Блок-схем |
|
if (нөхцөл1) if (нөхцөл2) үйлдэл; |
|
|
if (нөхцөл1) Үйлдэл1; else if (нөхцөл2) Үйлдэл2; else if (нөхцөл3) Үйлдэл3; else if (нөхцөл4) Үйлдэл4; else Үйлдэл5; |
|
Г.м.-ээр
хэдэн ч давхар салаа байж болно.
Жишээ болгож дараах
програмыг бичье. Энэ нь “бяцхан сургаал” айлдагч програм юм.
|
Програм |
Алгоритм |
|
#include <stdio.h> #include <conio.h> void main() { unsigned char on, nas; printf ("Ta heden ond tursun be?\n"); scanf ("%u", &on); nas = 2006 - on; printf ("Ta %u nastai.", nas); if (nas<=0) printf (" Odoohondoo turuugui um bish yy?"); else if (nas<=15) printf (" Balchir baina daa."); else if (nas<=30) printf (" Ex ornii gerelt ireedyi!"); else if (nas<=40) printf (" Ta zaluu baina."); else printf (" Arxi amsaj bololgyi yah ve."); getch ( ); } |
|
Алгоритмын үндсэн
бүтцүүдийн нэг нь Давталт бүтэц гэдгийг бид мэднэ. Энэ бүтцийн гурван хэлбэр
байдгийг ч бас үзсэн билээ.
Си хэлэнд Давталт
бүтцийг давталтын оператор хэмээн нэрийддэг. Гурван төрлийн оператор байдаг.
Эдгээр нь тус бүрдээ харгалзан
while, for, do-while гэсэн
албаны үгүүдээр илэрхийлэгдэнэ.
Давталтын
операторууд нь ямагт функцын бие дотор бичигдэнэ.
Одоо оператор тус
бүртэй танилцъя.
Энэ оператор нь:
while (нөхцөл) Давталтын_бие;
гэж
бичигдэнэ. Энд:
·
while – “Байхад” гэсэн утгатай албаны үг
·
нөхцөл – давталтыг цааш үргэлжлүүлэх буюу дуусгах
эсэхийг шийдэх нөхцөл. Бичих нь if
операторынхтай адилхан. Арифметик илэрхийлэл, эсвэл нөхцөлт илэрхийлэл, эсвэл
логик илэрхийлэл байж болно. Үнэн буюу худал гэсэн утгын аль нэгийг гаргана.
Эдгээр нь тоогоор илэрхийлэгддэг: 0-ээс ялгаатай байвал үнэн, 0 байвал худал.
·
Давталтын_бие – өгөгдсөн нөхцөл
үнэн байвал хийгдэх үйлдэл (үйлдлүүд).
Үгээр тайлбарлах
юм бол:
“Нөхцөл үнэн байгаад (биелж) байвал Давталтын_бие-ийг гүйцэтгээд бай”
гэсэн
өгүүлбэр байна.
График дүрслэлээр
бол:

гэсэн схем байдаг. Ө.х. энэ нь While буюу Байхад төрлийн давталтын бүтцийн Си
дээрх эквивалент юм.
Эндээс харахад, нэгэнт
нөхцөл шалгах хэсэг нь давталтын биеийнхээ өмнө байгаа учир, угаасаа худал
нөхцөл тавигдсан үед давталтын бие нэг ч удаа хийгдэхгүй байх нь ээ.
While операторын давталтын бие нь ердөө ганц оператор байж болно:
|
Оператор |
Блок-схем |
|
while (нөхцөл) Үйлдэл; |
|
Эсвэл давталтын бие нь нийлмэл оператор байж
болно:
|
Оператор |
Блок-схем |
|
while (нөхцөл) { Үйлдэл1; Үйлдэл2; … } |
|
Эндээс харахад давталтын биеийн эхлэл, төгсгөлийг мөн л нуман хаалтаар тэмдэглэдэг ажээ.
Жишээ програм авч
үзье.
[2, 100] гэсэн интервалын бүх тэгш тоог дэлгэцэнд
доош цувуулж бичих програмыг while операторын
тусламжтайгаар ингэж зохиож болно:
|
Програм |
Алгоритм |
|
|
|
Энэ жишээнд, k-ийн утгыг 2-оор ихэсгэх үйлдлийг:
k+=2;
гэж бичсэн байна. Утга оноох ийм үйлдлийн тухай Лекц#3-ын “Үйлдлийн тэмдгүүд” хэсэгт дурдсан байгаа. Энэ нь:
k=k+2;
гэсэн оператортай эквивалент юм.
Энэ оператор нь:
do
Давталтын_бие;
while (нөхцөл);
гэсэн загварын дагуу бичигдэнэ. Энд:
·
do – “Гүйцэтгэ” гэсэн утгатай албаны үг
·
Давталтын_бие - өмнө үзсэн while операторынх шиг
давталтын бие
·
нөхцөл – өмнө үзсэн while операторынх шиг
нөхцөл.
While оператораас ялгаатай нь энэ оператор do ба while гэсэн хос албаны үгээр төлөөлөгддөг байна.
Мөн нөхцөл нь давталтын биеийнхээ доод талд (хойно нь) байрлаж байна. Тиймээс, эхэлж
давталтын_бие хийгдээд дараа нь нөхцөл биелж байна уу, үгүй юу гэдгийг шалгана.
Тэгээд хэрэв нөхцөл биелж байвал давталтын бие дахиж давтагдана, үгүй бол
давтагдахгүй.
Үгээр тайлбарлах
юм бол:
“Давталтын_бие-ийг гүйцэтгээд
Нөхцөл шалгах.
Хэрэв Нөхцөл нь үнэн (биелж)
байвал дахиад гүйцэтгэх”
гэсэн өгүүлбэр байна. Нөхцөл биелэхээ болихоо хүртэл энэ нь давтагдана.
Харин график дүрслэлээр бол:

гэсэн блок-схем байна.
Do-while операторын нэг
онцлог эндээс харагдах ёстой. Юу гэвээс,
нөхцөл огт биелэхгүй үед ч гэсэн давталтын бие дор хаяж нэг удаа хийгдэж амжих
юм.
Зарим
хүн do-while операторыг Until буюу Хүртэл гэсэн давталтын бүтэцтэй адилтгаж ойлгосон байж
магадгүй. Тийм биш гэдгийг хэлэх хэрэгтэй. Do-while
оператор нь While төрлийн давталтын бүтцийн нэг хэлбэр гэдэг нь ойлгомжтой
байна (while операторын адил).
Do-while операторын давталтын бие нь ердөө ганц оператор байж болно:
do
Үйлдэл;
while (нөхцөл);
Эсвэл нийлмэл
оператор байж болно:
do
{
Үйлдэл1;
Үйлдэл2;
…
}
while (нөхцөл);
Өмнөх жишээ
програмыг do-while операторын
тусламжтайгаар дараах байдлаар бичиж болно:
|
Програм |
Алгоритм |
|
|
|
Энэ оператор нь Параметрт
Давталтыг хэрэгжүүлэгч бүтэц юм. Бичигдэх хэлбэр нь:
for (илэрхийлэл_1; нөхцөл; илэрхийлэл_2) Давталтын_бие;
Энд:
·
илэрхийлэл_1; – давталтыг эхлүүлэхэд хэрэгтэй үйлдэл (үйлдлүүд)
·
нөхцөл – давталтыг цааш үргэлжлүүлэх буюу дуусгах эсэхийг шалгах нөхцөл.
Арифметик юм уу логик илэрхийлэл байна. Бичих нь while, do-while операторуудын адил. Үнэн (≠0) эсвэл
худал (0) утга гаргана.
·
илэрхийлэл_2; – давталтыг удирдаж явуулахад хэрэгтэй үйлдэл (үйлдлүүд)
·
Давталтын_бие - нөхцөл биелж байвал гүйцэтгэгдэх үйлдэл (үйлдлүүд).
Одоо үүнийг дэлгэрэнгүй
тайлбарлая. Хамгийн эхлээд илэрхийлэл_1;
хийгдэнэ. Энэ нь ж.нь давталтын
параметрт анхны утга олгох үйлдэл байж болно. Дараа нь нөхцөл шалгагдана. Энэ нь ж.нь давталтын параметрын утга өгөгдсөн
хязгаараас хэтрээгүй эсэхийг шалгах үйлдэл байж болно. Хэрэв нөхцөл биелж
байвал давталтын_бие; хийгдэнэ. Тэгээд илэрхийлэл_2;
хийгдэнэ. Энэ нь ж.нь давталтын параметрын утгыг өөрчлөх үйлдэл байж болно.
Үүний дараа дахиад нөхцөл шалгагдана.
Хэрэв нөхцөл биелж байвал давталтын_бие; хийгдэнэ...
Г.м.-ээр бүгд
давтагдах юм. Энд, илэрхийлэл_1; бол
ердөө ганцхан удаа хийгдэж байхад харин нөхцөл
ба илэрхийлэл_2; нь олон дахин
давтагдаж байгаа юм. Энэхүү давталтын процесс нөхцөл биелэхээ болих хүртэл
үргэлжилдэг.
Энэ утгаараа for бүтэц нь:
илэрхийлэл_1;
while (нөхцөл)
{
Давталтын_бие;
илэрхийлэл_2;
}
гэсэн
кодтой эквивалент юм. Үүнийг график дүрслэлээр илэрхийлвэл:

гэсэн схем байна.
Нэг зүйлийг
онцлон хэлэхэд, илэрхийлэл_1 ба нөхцөл ба илэрхийлэл_2 нь бүгдээрээ, эсвэл дурын хоёр нь, эсвэл аль нэг
нь байхгүй байж болдог. Гэхдээ тэдгээрийг тусгаарлаж буй цэгтэй таслалын тэмдэг
нь заавал бичигдсэн байх ёстой. Хэрэв нөхцөл-ийг
бичээгүй байвал түүнийг үнэн гэж автоматаар үздэг бөгөөд үл дуусах давталт бий
болно. Ж.нь:
for ( ; ; ) Давталтын_бие;
бол үл дуусах давталт юм. Ийм үед, давталтыг хүчээр дуусгах хэрэгслүүдийг ашигладаг.
Хялбар тохиолдолд
бид for бүтцийг дараах схемээр илэрхийлэх боломжтой.
Энэ нь “Алгоритмчлалын үндэс” лекцээс бидний мэдэх Параметрт давталтын схем билээ:

Энд:
· ДП – давталтын параметр
· АУ – давталтын параметрын анхны утга
· ЭУ – давталтын параметрын эцсийн утга
· АЛХАМ – давталтын параметрын утгыг өөрчлөх алхам..
Уг схемд харгалзах for операторыг:
·
хэрэв
АУ<ЭУ бол

·
хэрэв
АУ>ЭУ бол

гэж бичдэг.
Бид цаашид хичээлдээ эдгээр хялбар тохиолдлуудыг хэрэглэх болно.
While, do-while операторуудын адилаар
for операторын давталтын бие нь
ганц, эсвэл нийлмэл оператор байж болно.
Одоо жишээ авч
үзье.
Өмнөх сэдвүүдэд
үзээд байгаа програмыг ингэж бичиж болно:
|
Програм |
Алгоритм |
|
|
|
Энэ
жишээнд, дэлгэцэнд утгыг нь хэвлэх ёстой нөгөө k хувьсагчийг шууд давталтын
параметр болгон аваад түүний утгаар давталтыг удирдан явуулж байна. k-ийн утгыг
өмнөхөөс нь 2-оор ихэсгэх үйлдэл давталтын биед биш харин for операторынхаа хаалтан дотор бичигджээ.
Өгөгдсөн [A, B] натурал тоон завсарт орших бүх бүхэл тоонуудын нийлбэрийг олох програм
зохиоё. Энд A<=B байна.
|
Програм: while оператор |
Алгоритм |
|
#include <stdio.h> #include <conio.h> void main() { unsigned int S=0; unsigned int A, B, i; printf ("\nA="); scanf ("%d", &A); printf ("B="); scanf ("%d", &B); if (A<=B) { i=A; while (i<=B) S+=i++; printf ("[%u,%u] zavsriin toonuudiin niilber = %u baina", A, B, S); } else printf ("Zavsar buruu ugudsun baina!"); getch (); } |
|
|
Програм: do-while оператор |
Алгоритм |
|
#include <stdio.h> #include <conio.h> void main() { unsigned int S=0; unsigned int A, B, i; printf ("\nA="); scanf ("%d", &A); printf ("B="); scanf ("%d", &B); if (A<=B) { i=A; do S+=i++; while (i<=B); printf ("[%u,%u] zavsriin toonuudiin niilber = %u baina", A, B, S); } else printf ("Zavsar buruu ugudsun baina!"); getch (); } |
|
|
Програм: for оператор |
Алгоритм |
|
#include <stdio.h> #include <conio.h> void main() { unsigned int S=0; unsigned int A, B, i; printf ("\nA="); scanf ("%d", &A); printf ("B="); scanf ("%d", &B); if (A<=B) { for (i=A; i<=B; i++) S+=i; printf ("[%u,%u] zavsriin toonuudiin niilber = %u baina", A, B, S); } else printf ("Zavsar buruu ugugdsun baina!"); getch (); } |
|
Энд дараах зүйлд тайлбар хийе гэж бодож байна. While болон do-while оператор ашигласан програмуудын давталтын биед:
S+=i++;
гэсэн
оператор буйг анзаарав уу. Ийм “өвөрмөц бичлэгүүд” хэрэглэж болдог нь Си хэлний
онцлог юм. Хөрвүүлэгч энэ операторыг:
S+=i;
i++;
буюу:
S=S+i;
i=i+1;
гэсэн дараалсан операторууд хэмээн ойлгоно. Утга оноох
+= үйлдэл нь 1-ээр ихэсгэх ++
үйлдлээс өндөр эрэмбэтэй учраас түрүүлж хийгдэнэ. Энэ тухай Лекц#3-ын “Үйлдлийн тэмдгүүд” сэдэвт дурдсан байгаа.
Алгоритмд давхар
Давталт бүтэц орсон байж болдог шиг програмд мөн Давталтын операторууд давхар
орсон байж болно. Ө.х. нэг давталтын операторын давталтын биед дахиад нэг
давталтын оператор байрлана гэсэн үг.