187
Улаанбаатарын Их Сургууль СЭДЭВ 1. ОРШИЛ 1.1 Си хэлний ач холбогдол, ангилал Си хэл нь анх үйлдлийн системд зориулагдан бүтээгдсэн хэл юм. UNIX үйлдлийн системийг бүтээхдээ программчилалын хүчтэй орчинг бүрдүүлэхийг зорьсон хүмүүс энэ хэлийг боловсруулжээ. UNIX үйлдлийн системийг дэлхий нийтээр өргөн хэрэглэх болсноор программчилалын Си хэлний хэрэглээ ч нэмэгдэх болжээ. UNIX үйлдлийн системийн 90% нь энэ хэл дээр бичигдсэн , тэр ч бүү хэл Си хэлний өөрийнх компилятор нь хүртэл энэ хэл дээр бичигджээ. Мөн UNIX үйлдлийн системийн бараг бүх үйлчилгээний программ хангамжууд, UNIX үйлдлийн систем дээр ажиллах ихэнх хэрэглээний программ хангамжууд Си хэл дээр бичигдсэн , цаашид ч энэ хэл дээр бичигдэх болно. Иймээс Си хэл нь одоо ч хүртэл программчилалын хүчтэй зэвсэг хэмээн тооцогдсоор байна. Си хэл бол сурахад хялбар, маш бага кодчилол хийх боломжтой хэл юм. 1.2 Си программын бүтэц , онцлог шинжүүд Си программ нь функцуудын олонлогоос бүрдэх бөгөөд эдгээр функцууд нь нэг буюу хэд хэдэн эх файлд хадгалагдаж болно. Эдгээр эх файл бүр нь тус тусдаа хөрвүүлэгддэг. (машины хэлд) Си программд зөвхөн нэг л функц “main” нэртэй байж болох бөгөөд бусад функцууд нь дурын байдлаар нэрлэгдэж болно. Си программ бичихэд ядаж нэг функц заавал бичих бөгөөд энэ нь “main” функц юм. Си хэлний функц нь бас процедурын үүрэг гүйцэтгэнэ. Ө.х Си хэл нь бусад хэл шиг функцийг функц , процедур гэж ялгадаггүй. Си хэл дээр бичигдсэн программ “main” функцээс эхэлж ажиллах бөгөөд хэрвээ программ хэвийн ажилласан бол энэ функцээр үйл ажиллагаагаа дуусгах болно. Программ ажилллах явцад “main” функц нь бусад функцийг дуудаж болох бөгөөд тэр функц нь цааш өөр функц дуудах гэх мэтчилэн үйл ажиллагаа нь үргэлжилнэ. Тухайн функц үйл ажиллагаагаа дуусгамагц түүнийг дуудсан функцэд удирдлагаа шилжүүлнэ. Программын жишээ : main() { int k; Үндсэн функц зарлах хэсэг printf(“ Now I,ll print pi number ”); PrintfPI(); } Программчилалын Си хэлхичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð Лекц : Хуудас:1

Programchlaliin c hel

Embed Size (px)

Citation preview

Page 1: Programchlaliin c hel

Улаанбаатарын Их Сургууль

СЭДЭВ 1. ОРШИЛ 1.1 Си хэлний ач холбогдол, ангилал Си хэл нь анх үйлдлийн системд зориулагдан бүтээгдсэн хэл юм. UNIX үйлдлийн системийг бүтээхдээ программчилалын хүчтэй орчинг бүрдүүлэхийг зорьсон хүмүүс энэ хэлийг боловсруулжээ. UNIX үйлдлийн системийг дэлхий нийтээр өргөн хэрэглэх болсноор программчилалын Си хэлний хэрэглээ ч нэмэгдэх болжээ. UNIX үйлдлийн системийн 90% нь энэ хэл дээр бичигдсэн , тэр ч бүү хэл Си хэлний өөрийнх компилятор нь хүртэл энэ хэл дээр бичигджээ. Мөн UNIX үйлдлийн системийн бараг бүх үйлчилгээний программ хангамжууд, UNIX үйлдлийн систем дээр ажиллах ихэнх хэрэглээний программ хангамжууд Си хэл дээр бичигдсэн , цаашид ч энэ хэл дээр бичигдэх болно. Иймээс Си хэл нь одоо ч хүртэл программчилалын хүчтэй зэвсэг хэмээн тооцогдсоор байна. Си хэл бол сурахад хялбар, маш бага кодчилол хийх боломжтой хэл юм. 1.2 Си программын бүтэц , онцлог шинжүүд Си программ нь функцуудын олонлогоос бүрдэх бөгөөд эдгээр функцууд нь нэг буюу хэд хэдэн эх файлд хадгалагдаж болно. Эдгээр эх файл бүр нь тус тусдаа хөрвүүлэгддэг. (машины хэлд) Си программд зөвхөн нэг л функц “main” нэртэй байж болох бөгөөд бусад функцууд нь дурын байдлаар нэрлэгдэж болно. Си программ бичихэд ядаж нэг функц заавал бичих бөгөөд энэ нь “main” функц юм. Си хэлний функц нь бас процедурын үүрэг гүйцэтгэнэ. Ө.х Си хэл нь бусад хэл шиг функцийг функц , процедур гэж ялгадаггүй. Си хэл дээр бичигдсэн программ “main” функцээс эхэлж ажиллах бөгөөд хэрвээ программ хэвийн ажилласан бол энэ функцээр үйл ажиллагаагаа дуусгах болно. Программ ажилллах явцад “main” функц нь бусад функцийг дуудаж болох бөгөөд тэр функц нь цааш өөр функц дуудах гэх мэтчилэн үйл ажиллагаа нь үргэлжилнэ. Тухайн функц үйл ажиллагаагаа дуусгамагц түүнийг дуудсан функцэд удирдлагаа шилжүүлнэ. Программын жишээ :

main() { int k;

Үндсэн функц зарлах хэсэг

printf(“ Now I,ll print pi number ”); PrintfPI(); }

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:1

Page 2: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:3

СЭДЭВ 2. СИ ПРОГРАММЧИЛАЛ ГЭЖ ЮУ ВЭ ? Хэрвээ та урьд өмнө нь хэзээ ч программ бичиж байгаагүй бол энэ сэдэв танд программ анхлан бичихэд чинь туслана. 2.1 Программ гэж юу вэ ? Бидний сайн мэдэх компьютер бол тийм ч их ухаантай машин биш юм. Тэр бол зөвхөн зааврыг үг дуугүй дагадаг сайн туслагч төдий юм. Тэрээр таны өгсөн даалгаврыг биелүүлэхээр хэдэн ч өдрөөр , уйтгарлахгүйгээр , амрахгүйгээр ажиллаж чадна. Гэвч тэр юу хийхээ өөрөө бие даан шийдвэрлэж, бодож чадахгүй. Иймээс тэдэнд юу хийхийг нь Программ зохиогч хэлж, зааж өгдөг. Түүгээр ямар нэг ажил хийлгэхийн тулд түүнд өгч байгаа командуудын олонлогийг программ гэж нэрлэнэ. Одоогоор бидний ашиглах боломжтой мянга мянган программ зохиогдоод байгаа бөгөөд эдгээр нь маш олон төрөл , чиглэлээр зохиогдсон болно. 2.2 Си программ бичихэд юу хэрэгтэй вэ ? Си хэл дээр программ бичиж түүнийгээ ажиллуулахын тулд юуны түрүүнд Си компилятор хэрэгтэй. Си компилятор нь таны бичсэн программыг компиляци хийх буюу хөрвүүлэх үйл ажиллагааг хийдэг. Хөрвүүлэх гэдэг нь хүнд ойлгомжтой буюу Си хэл дээр бичигдсэн программыг машинд ойлгомжтой буюу командуудын дараалалд хөрвүүлэх үйл ажиллагааг хэлнэ. 2.3 Программчилах процесс Ихэнх хүмүүс программ бичихдээ дараах дарааллыг баримталдаг.

Программаа яг юу хийхийг тодорхойлно. ( Үйл ажиллагааг нь төсөөлнө. ) Алгоритмаа тодорхойлоод программаа бичнэ. Си программыг дурын текст боловсруулагч программ дээр бичиж болно. Гэхдээ ихэнх Си компиляторууд нь өөртөө текст боловсруулагчтай байдаг. Си хэл дээр бичигдсэн программ нь .С өртгөтгөлтэй файлд хадгалагдана.

Программаа хөрвүүлэх Программын алдааг хянаж, засварлах Си компилятор нь танд алдааны тухай мэдээллүүд өгдөг. Хэрвээ алдаагаа засаж дууссан бол программ ажиллахад бэлэн боллоо гэсэн үг.

Программаа ажиллуулах, үр дүнг нь үзэх Одоогоор хэрэглэгдэж байгаа ихэнх Си компиляторууд нь маш өргөн боломжтой бөгөөд энэ бүх үйл ажиллагааг нэгэн программаас хийх боломжийг бүрдүүлсэн байдаг. Жишээ нь Turbo C компилятор нь манайд өргөн хэрэглэгддэг бөгөөд энэ нь программ бичих , үр дүнг нь харах зэрэг үйл ажиллагааг нэг дэлгэцэнд меню ашиглан хийх боломжийг бүрдүүлсэн сайн компилятор юм.

СЭДЭВ 3. ДЭЛГЭЦЭНД МЭДЭЭЛЭЛ ХЭВЛЭХ 3.1 printf функц

Page 3: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:4

Таны программ ажиллаж дуусаад тодорхой үр дүнг гаргах бөгөөд түүнийг бид үзэх буюу дэлгэцэнд үр дүн нь хэвлэгдэх зайлшгүй шаардлагатай байдаг. Си хэлэнд үүнийг хэрэгжүүлдэг printf гэсэн функц байдаг. Энэ функц нь дэлгэцэнд тоо, тэмдэгт , үг гаргахад ашиглагдана. printf функц нь маш өргөн боломжтой бөгөөд ихэнх хүмүүс боломжийг нь бүрэн ашиглаж чаддаггүй. 3.2 printf функцын формат Энэ функцын үндсэн формат нь : printf(Удирдлагын тэмдэгт мөр [,өгөгдөл] ); Тайлбар: Си хэлэнд функцуудын форматыг бичиж үзүүлэхдээ зарим тусгай тэмдэглэгээг хэрэглэдэг ба энд [ ] гэсэн тэмдэглэгээг ашигласан байна. Ер нь тэмдэглэгээг зөвхөн танд ойлгуулах үүднээс л ашигладаг ба энэ нь тайлбарлаж буй функцын бичлэгт ордоггүй юм. Иймээс энэ функцыг ашиглахдаа [ ] хаалтыг бичихгүй байх болно. Энэ хаалтанд бичигдсэн өгөгдөл түүнийг бичихгүй байж болно гэсэн утгыг агуулдаг. Удирдлагын тэмдэгт мөр нь тухайн өгөгдөл ямар хэлбэрээр дэлгэцэнд гарахыг тодорхойлдог. printf(“ Жишээ %d”,1); /* Энэ жишээнд Жишээ 1 гэсэн үгийг хэвлэж байна*/ Си хэлэнд тэмдэгт мөрийг заавал хашилтанд (“”) бичдэг. Тэгэхээр удирдлагын тэмдэгт мөр нь заавал хашилтанд бичигдэнэ. Си хэлэнд бичигдсэн команд бүр “;”-аар төгсөх ёстой. Өөрөөр хэлбэл энэ нь команд дуусч байна, үүнийг биелүүлэх ёстой гэдгийг Си энэ тэмдэгтээр мэдэх болно. 3.3 Тэмдэгт мөр хэвлэх Бид дэлгэцэнд тэмдэгт мөр мэдээлэл хэвлэхдээ энэ функцыг ашиглана. printf(“ Сайн байна уу ! ”); Энэ комманд биелэгдэхэд дэлгэцэнд Сайн байна уу ! гэсэн үг хэвлэгдэнэ. printf(“ Сайн байцгаана уу !”); printf(“ Хичээлээ эхлэцгээе !”); гэсэн коммандууд юу хэвлэхийг үзэцгээе. Сайн байцгаана уу ! Хичээлээ эхлэцгээе ! Си нь тэмдэгт мөр хэвлээд дараа нь курсорыг дараагийн мөрт автоматаар шилжүүлдэггүй. Тэгвэл ингэж курсорын байрлалыг удирдахдаа Удирдлагын тэмдэгт мөр дотор тусгай тэмдэгтүүдийг ашигладаг.

Page 4: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:5

3.4 Курсорын байрлал удирдах тэмдэгтүүд Си хэлэнд маш олон ийм тэмдэгтүүд байдаг ба тэднээс зарим хэсгийг нь л их өргөн ашигладаг. Хүснэгт 3.1 Курсорын байрлал удирдах тэмдэгтүүд

Код Тайлбар \n Шинэ мөр \a Дуут дохио гаргах \t Tab тэмдэгт ( Хэд хэдэн хоосон зай ) \\ \ тэмдэгтийг өөрийг нь хэвлэх \” “ тэмдэгт хэвлэх \r Мөрийн эхэнд

“\a” тусгай тэмдэгтийг хэвлэхэд дуут дохио гардаг. Өмнөх жишээнд бид хоёр тэмдэгт мөр хэвлэхэд тэд 2 мөрт биш , 1 мөрт гарч байсан . Тэгвэл одоо \n тусгай тэмдэгт ашиглан энэ үйлдлийг гүйцэтгэе. Эхлээд эхний тэмдэгт мөрөө хэвлээд дараа нь курсорыг дараагийн мөрт шилжүүлэх шаардлагатай. printf(“ Сайн байцгаана уу !\n”); printf(“ Хичээлээ эхлэцгээе !”); Си тэмдэгт мөрийг хэвлэж байгаад \n тэмдэгт дайралдангуут курсорын байрлалыг дараагийн мөрт шилжүүлдэг. Ингэсний дараа хэвлэгдэх тэмдэгтүүд шинэ байрлалаас цааш хэвлэгдэх болно. Тусгай тэмдэгтүүдийг ашигласан жишээ : printf(“Тэмдэгт\tмөр\tхэвлэв.\n”); /* Тэмдэгт мөр хэвлэв. */ printf(“Дохио дуугарав. \a\n”); /* Дохио дуугарав. */ printf(“Тэр \”Үгүй\” гэж хэлсэн.\n”); /* Тэр “Үгүй” гэж хэлсэн. */ printf(“\\ тэмдэгтийг хэвлэв.\n”); /* \\ тэмдэгтийг хэвлэв. */ 3.5 Хөрвүүлэлтийн тусгай тэмдэгтүүд Та тэмдэгт болон тоо хэвлэхдээ тэдгээрийг яаж хэвлэгдэхийг тодорхойлох хэрэгтэй болдог. Ингэж тодорхойлохдоо хөрвүүлэлтийн тусгай тэмдэгтүүдийг ашигладаг. Хүснэгт 3.2 Хөрвүүлэлтийн тусгай тэмдэгтүүд

Тэмдэгт Тайлбар %d int төрлийн утгыг төлөөлнө.

Page 5: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:6

%i int төрлийн утгыг төлөөлнө. %c Зөвхөн нэг тэмдэгт %s Тэмдэгт мөр %o unsigned int (8-т тооллын систем) %u unsigned int %x unsigned int (16-т тооллын систем) %X unsigned int (16-т) %f Бодит тоон утга [-]dddd.ddd %e Бодит тоон утга [-]d.ddd e [+/-]ddd %% % тэмдэгт %p XXXX:YYYY санах ойн хаяг

%hd, %hi, %ho, %hx short int %ld, %li, %lo, %lx long int %le, %lE, %lf, %lg double

%Le, %LE %Lf, %Lg long double Жич : Хамгийн хялбар бөгөөд юуны түрүүнд бидэнд хэрэг болох тусгай тэмдэгтүүдийг тод хараар бичэв. Тоо, тэмдэгт хэвлэхдээ Удирдлагын тэмдэгт мөр дотор хөрвүүлэлтийн тусгай тэмдэгтүүдийг бичих ба дараа нь Удирдлагын тэмдэгт мөрийн ард хэвлэх утгуудаа таслалаар зааглан харгалзуулан жагсааж өгдөг. Жишээ : printf(“%s %d %f %c\n”,”Hi”,14,-8.76,’x’); Энэ жишээ нь дараах үр дүнг хэвлэнэ. Hi 14 -8.760000 x “Hi” тэмдэгт мөр нь хашилтанд бичигдэнэ. Харин Си хэлэнд нэг тэмдэгтийг ‘’ хашилтанд бичдэг. –8.76 гэсэн бодит тоог хэвлэхэд Си түүнийг -8.760000 болгож хэвлэсэн байна. Си хэлэнд бодит тоог хэвлэхдээ % ба f тэмдэгтийн хооронд . тэмдэгтийг хэрэглэн хэвлэгдэх хэлбэрийг тодорхойлно. Жишээ : printf(“%f %.3f %.2f %.1f”, 4.5678, 4.5678, 4.5678, 4.5678); Үр дүн : 4.567800 4.578 4.57 4.6 3.6 fprintf() функц Энэ функц нь өгөгдлийг урсгал (принтер,диск,файл) хэмээн нэрлэгдэх виртуал төхөөрөмжид гаргадаг. Бичих хэлбэр : int fprintf(FILE *stream, const char *format[, argument, . . . ]);

Page 6: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:7

Энэ функц нь UNIX үйлдлийн системд өргөн хэрэглэгддэг. Жишээ : #include<stdio.h> int main(void) {

int n=3; float x=45.875; /* Дэлгэцэнд хэвлэх */ printf(“ Сайн байна уу ? \n”); /* Принтерт хэвлэх */ fprintf(stdprn,“ Сайн байна уу ? \n”); /* Дэлгэцэнд хэвлэх */ printf(“ x=%f ба n=%d \n”,x,n); /* “Принтерт хэвлэх */ fprintf(stdprn,“ x=%f ба n=%d \n”,x,n);

}

СЭДЭВ 4. ХУВЬСАГЧ БА ӨГӨГДЛИЙН ТӨРЛҮҮД Бүх программчилалын хэлүүд хувьсагч тодорхойлж, өгөгдөлтэй ажиллах тодорхой механизмуудтай байдаг. Си хэлэнд энгийн өгөгдлийн төрлүүд болох бүхэл, бодит тоо, тэмдэгтэн төрлүүдтэй ажиллах олон арга замууд байдаг. Бусад программчилалын хэлүүдэд байдаггүй тийм аргууд нь Си хэлийг улам ч хүчирхэг болгодог. Энэ бүлэгт үзэх санаануудыг Си хэлэнд эхлэн суралцагч хэн бүхэн сайн ойлгох хэрэгтэй. Өгөгдлийн төрлүүд болон тэдгээртэй ажиллах үйлдлүүдийн олонлог нь Си хэлийг улам уян хатан болгодог ч , зарим талдаа буюу Си хэлийг төгс эзэмшиж ойлгоход хүндрэлтэй байдаг талтай. 4.1 Идентификаторууд Хувьсагчид болон функцийн нэрийг идентификатор гэнэ. Си хэлний идентификатор нь үсэг, тоо, доогуур зураас тэмдэгтээс бүрдсэн 32 тэмдэгт хүртэлх урттай байж болно. Идентификаторийг том болон жижиг үсгээр бичиж болох ба Си хэлэнд том жижиг үсгийг ялгаатайд тооцдог. Өөрөөр хэлбэл Count, count , COUNT гэсэн гурван нэр нь гурвуулаа ялгаатай нэрүүд болно. Практикаас үзэхэд өөрийн бичих программаа илүү ойлгомжтой болгохын тулд хувьсагчдын нэрийг жижиг үсгээр, тогтмолуудыг том үсгээр бичиж ашигладаг. Зөв идентификатор Буруу идентификатор far_out Tom’s TIME whicha$macallit age %dollar time do-it

Page 7: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:8

Зөвлөгөө : Хувьсагчийн нэрийг үсгээр эхлэх Хувьсагчийг түлхүүр үгтэй ижлээр нэрлэж болохгүй. ( do, while , if , int, float , case . .

. ) Хувьсагчдыг гүйцэтгэж байгаа үүрэгтэй нь зохисон нэрээр нэрлэх Дотоод хувьсагч ялангуяа индекс зэргийг богино , гадаад хувьсагчийг арай уртаар нэрлэхэд тохиромжтой.

4.2 Түлхүүр үгүүд

Си хэлэнд бүх түлхүүр үгийг жижиг үсгээр бичдэг. Хувьсагчийн нэр нь түлхүүр үгтэй яг ижил байж болохгүй. Гэхдээ бичлэгийн хувьд түлхүүр үгээс ялгаатай байж болно. Жишээ нь :

Түлхүүр үг Хувьсагч for FOR if IF

Хүснэгт 4.1

int extern else char register for float typedef do double static while struct goto switch union return case long sizeof default short break auto unsigned continue if asm cdecl huge interrupt pascal void const volatile enum signed _cs near _es _ss far _ds

4.3 Энгийн өгөгдлийн төрлүүд Си хэлэнд 4 үндсэн энгийн төрөл байдаг.

int Энэ төрлийн хувьсагч бүхэл тоон утга агуулна. Гэхдээ авах утгууд нь зарим төрлийн систем дээр өөр өөр байдаг боловч ихэнхдээ 1 үг буюу 2 byte урттай байдаг. Int утга : -32768 . . . 32767 ( тэмдэгтэй ) unsigned int : 0 . . . 65535 ( тэмдэггүй )

char Энэ төрлийн хувьсагч нь тэмдэгт утга агуулна. Char утга нь 1 byte –ийн хэмжээтэй байдаг. Char утга : -128 . . . 127 ( тэмдэгтэй ) unsigned char : 0 . . . 255 ( тэмдэггүй )

float Энэ төрлийн хувьсагч нь бодит тоон утга агуулна. float утга нь 4 byte-ийн хэмжээтэй байдаг ба 10E-38 … 10E+38 завсар дахь бодит тоон утга агуулах чадалтай.

double Энэ нь float төрлийн адил бодит тоон утга агуулах ба 8 byte хэмжээтэй.

Page 8: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:9

4.4 Хувиргагчид Си хэлэнд дараах хувиргагчдыг хэрэглэн өгөгдлийн төрлийг хувиргаж болдог.

short int Энэ нь int утгаас их биш утга авна гэсэн үг. Энэ төрлийн хэмжээ нь системээс хамааралтай байдаг. Зарим системд энэ утга нь int утгын хагас хэмжээтэй байхад заримд нь адил хэмжээтэй байдаг.

long int int-ээс 2 дахин том гэсэн үг. Мөн системээс хэмжээ нь хамаардаг ба ихэнхдээ 2 үгийн урттай байдаг.

long float float утгаас 2 дахин том буюу double төрөл гэсэн үг. unsigned int Энэ нь int төрлийн утгыг тэмдэггүйгээр хадгална гэсэн үг. Өөрөөр

хэлбэл дан эерэг утга авах буюу int утгаас 1 битээр том гэсэн үг. Хүснэгт 4.2 Өгөгдлийн төрлүүдийн хэмжээ Төрөл byte-аар битээр char 1 8 int 2 16 short 2 16 long 4 32 unsigned 2 16 float 4 32 double 8 64

short, long, unsigned хувиргагчид нь int утганд хэрэглэгддэг. Иймээс Си хэлэнд дараах бичлэгүүд адил утгатай байдаг. short int = short long int = long unsigned int = unsigned 4.5 Хувьсагч ба санах ойн хаяг Си хэлэнд хувьсагчдыг тэдгээрийн санах ойн хаяг нь төлөөлдөг. int cost; Тэгвэл энэ cost хувьсагчийн утга нь санах ойн дараалсан 2 үүрэнд хадгалагдах ба энэ үүрнийх нь хаягийг & үйлдлээр авч болно. Өөрөөр хэлбэл &cost гэвэл энэ хувьсагчийн санах ой дахь хаяг нь болно. & хаяг авах үйлдэл нь Си хэлэнд маш өргөн хэрэглэгддэг. 4.6 sizeof үйлдэл Си хэлэнд sizeof үйлдлээр тухайн хувьсагчийн утгыг санах ойд хадгалахад хичнээн byte шаардагдаж байгааг тодорхойлдог. int k;

Page 9: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:10

үед sizeof(k) нь 2 гэсэн үр дүнг буцаах болно. Учир нь int төрөл нь 2 byte хэмжээтэй байдаг шүү дээ. Мөн sizeof үйлдлийг Си хэл дээрх илэрхийлэлд ашиглаж болдог. x=s/sizeof(k); sizeof нь функц биш , үйлдэл бөгөөд иймээс ч түүнийг дуудахдаа заавал хаалт хэрэглэх шаардлагагүй. a=sizeof(cost); a=sizeof cost; /* Энэ 2 үйлдэл ижил чанартай. */ Харин тодорхой нэг төрлийн хэмжээг мэдэхийн тулд sizeof –ийг ашиглаж байгаа тохиолдолд заавал хаалт хэрэглэнэ. n=sizeof(int); 4.7 Хувьсагчид Хувьсагч гэдэг бол тодорхой төрлийн утгыг хадгалж чадах обьект юм. Хувьсагчийг зарлахдаа өгөгдлийн төрөл болон идентификаторыг ашигладаг. Бичигдэх нь : <төрөл> <утга> Жишээ нь : char ch; short i,j; Си хэлэнд хувьсагчийг зарлахгүй байж болдог. Хэрэв хувьсагч нь зарлагдаагүй бол түүнийг int төрөлтэй гэж тооцно. Ө.х Си хэлэнд int хувьсагчийг зарлахгүй байж болно. Гэхдээ бүх хувьсагчаа зарлаж байх нь илүү найдвартай. Хувьсагчид анх утгатай болох хүртлээ тодорхойгүй төлөвт байна. Хувьсагчид анхны утга олгох 2 арга байдаг. 1. Хувьсагчийг анх зарлахдаа анхны утгыг нь олгож болно. int last = 32767; char capc=’C’; float pi = 3.141593; double expo=1.0e6; Энэ арга нь тодорхой хэдэн төрөлд л үйлчилдэг. 2. Утга олгох үйлдэл ашиглан анхны утга олгож болно. main() {

int last; char capc; float pi; double expo;

Page 10: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:11

last = 32767; capc=’C’; pi = 3.141593; expo=1.0e6;

} 4.8 Тогтмолууд Программын амьдралын туршид тогтмол утгатай байх обьектыг тогтмол гэж нэрлэнэ. Си хэлэнд тогтмолыг зарлах үндсэн 2 арга байдаг.

1. #define түлхүүр үгээр тогтмолыг зарлах 2. const түлхүүр үгээр зарлах

#define тэмдэглэгээг ашиглан зарлахдаа эхлээд тогтмолын нэр , дараа нь оруулах утгыг тодорхойлдог. Харин #define – ийг ашиглахдаа ; -аар төгсгөдөггүйг анхаар. Бичигдэх хэлбэр нь : #define <Тогтмолын нэр> <утга> #define TRUE 1 #define коммандыг main() функцийн биенээс гадна ашиглах ёстой. #include <stdio.h> #define TRUE 1 #define FALSE 0 main() { . . . } ‘const’ түлхүүр үгийг ашиглан тогтмол зарлах : Бичигдэх хэлбэр : const <төрөл> <Нэр>=<утга>; Жишээ : const float pi=3.1415; const int Max=100; Тогтмолыг ингэж зарласны дараа үндсэн программд дараах үйлдлүүдийг хийхийг хориглоно.

Page 11: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:12

main() { pi=3.1; Max=50; pi=pi+1; } 4.9 Хадгалах ангилал Си хэлэнд олон янзын хадгалах ангилал байдаг. Хадгалах ангилалаас нь хамаарч обьектын амьдралын хугацаа , ажиллах хүрээ тодорхойлогддог. Ихэнх хэлүүдэд зөвхөн ажиллах хүрээ нь тодорхойлогдсон байдаг. Өөрөөр хэлбэл хувьсагч, функц нь тодорхой модульд л ашиглагдах бөгөөд бусад модульд бол тодорхойгүй байна. Харин Си хэлд амьдралын хугацаа гэдэг бол чухал ойлголт байдаг. Хэрэв хувьсагч тодорхой нэг функцэд тодорхойлогдсон бол тухайн функцын ажиллах хугацаанд л амьдарна. Тэгэхээр түүний амьдрах хугацаа нь функцын ажиллах хугацаа байна. Гэхдээ хадгалах ангилалаасаа хамаарч амьдрах хугацаа нь ийм байх уу үгүй юу гэдэг нь тодорхойлогдоно. Хадгалах ангилал нь long, unsigned гэх мэт хувиргагчидтай адилаар тодорхойлогддог. Өргөн хэрэглэгддэг хадгалах ангилалууд нь auto, static, register, extern юм. Утга нь тухайн программын амьдралын хугацаанд хадгалагддаг, харин ажиллах хүрээ нь нэг функцын хүрээгээр тодорхойлогддог хувьсагчийг статик хувьсагч гэнэ. Статик хувьсагчийг static түлхүүр үгээр зарлана. Гадаад хувьсагч болон гадаад функцыг ашиглахдаа түүнийг extern түлхүүр үгээр зарлан ашигладаг. Static болон extern хувьсагчдын тухай бид сүүлд функц сэдвийг үзэхдээ дахин танилцуулах болно. auto –оор тодорхойлогдсон хувьсагчид түүнийг агуулж байгаа функцууд дуудагдах үед оршин тогтнож эхэлдэг. Удирдлага функцээс шилжихэд auto хувьсагч санах ойгоос алга болно. Тухайн машины бодит боломж ямар байгаагаас хамааруулан register төрлийн хувьсагчдыг ашигладаг. Олон дахин ашиглагдах хувьсагчийг буюу их давтамжтай хэрэглэгдэх тоолууруудыг register хувьсагчаар зарлаж болох бөгөөд энэ хувьсагч нь процессорын регистрийг эзэмших учир бусад хувьсагчийг бодвол хурдан ажилладаг. auto int k; static int i=1; register int t; extern int n; 4.10 Төрлийн хувиргалт Си нь ялгаатай төрлүүдийн хооронд хувиргалт хийдэг. Гэхдээ программ зохиогч түүний үр дүнг тооцоолж , анхаарч байх ёстой. Жишээ нь : char утганд int утга олгоход халилт гарах магадлалтай. Илэрхийлэл дэх обьектууд нь ялгаатай төрөл байхад Си дараах дүрмийг баримталдаг.

Илэрхийлэл Тайлбар float үйлдэл int үед int утгыг float болгон хөрвүүлж бодолт хийх ба

илэрхийллийн үр дүн float утгатай байна. char үйлдэл int үед char утгыг int болгон хөрвүүлж бодолт хийх ба

Page 12: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:13

илэрхийллийн үр дүн int утгатай байна. float үйлдэл double үед float утгыг double болгон хөрвүүлж бодолт хийх ба

илэрхийллийн үр дүн int утгатай байна. int үйлдэл short үед short утгыг int болгон хөрвүүлж бодолт хийх ба

илэрхийллийн үр дүн int утгатай байна. int үйлдэл long int утгыг long руу хөрвүүлнэ. Үр дүн нь int утгатай unsigned үйлдэл int unsigned утгыг int-д хөрвүүлнэ. Үр дүн нь int утгатай

СЭДЭВ 5. ХЭРЭГЛЭГЧЭЭС ӨГӨГДӨЛ УНШИХ 5.1 scanf() функц Энэ функц нь гараас өгөгдөл уншина. Программ зохиох үед хэрэглэгчээс төрөл бүрийн өгөгдөл унших зайлшгүй шаардлага гардаг. Тиймээс юуны түрүүнд энэ функцыг ашиглаж сурах явдал чухал юм. Бичлэгийн хувьд энэ функц нь printf –тэй нэлээд адилхан байдаг , иймээс ч сурахад илүү дөхөм байх болно. Хэрэглэгчээс өгөгдөл уншихдаа ихэнх тохиолдолд printf, scanf хоёр функцыг хослуулан ашигладаг. Эхлээд printf –ээр хэрэглэгчээс унших утгын тухай буюу асуултаа хэвлээд , дараа нь scanf – аар утгаа уншдаг. Бичигдэх хэлбэр : scanf(Удирдлагын Тэмдэгт Мөр [,хувьсагч]); int scanf(“Удирдлагын Тэмдэгт Мөр”,Хувьсагч1, . . . ХувьсагчN); Таны программ биелж байгаад scanf функц дуудагдангуут, программын үйл ажиллагаа зогсож, хэрэглэгчээс өгөгдөл оруулж дуусахыг хүлээдэг. Хэрэглэгч өгөгдөл оруулаад дуусахдаа ENTER товч дарах ёстой бөгөөд тэгэхэд уншигдсан утгууд нь харгалзах хувьсагчиддаа очин , удирдлага scanf коммандын дараагийн коммандад шилждэг. scanf нь printf-тэй адил хөрвүүлэлтийн тусгай тэмдэгтүүдийг ашигладаг. Харин курсор удирдах тусгай тэмдэгтүүдийг ( \n\a\t . . . ) удирдлагын тэмлэгт мөр дотор хэзээ ч бүү ашигла. Ашиглавал функцын үйл ажиллагаа буруу явагдах болно. Мөн scanf-ыг үргэлж printf-тэй цуг хэрэглэ. Хэрэв printf-ээр асуултаа тавихгүй бол хэрэглэгч өгөгдөл оруулах ёстой гэдгийг ойлгохгүй байх болно. Жишээ : printf(“Таны массив хичнээн элементтэй байх вэ ?”); /* Асуултаа тавих */ scanf(“%d”,&n); Гэхдээ зарим шинж чанарыг нь авч үзвэл scanf нь тийм ч хялбархан функц биш юм. scanf –ыг ашиглахад гардаг нэг хэцүү асуудал нь “scanf –ын Удирдлагын тэмдэгт мөрийг ямар байдлаар бичсэн яг түүнтэй адилаар хэрэглэгч гараас өгөгдөл оруулах ёстой” юм. Жишээ : Гараас int утгыг age хувьсагчид уншья. scanf(“=%d”,&n); Энэ тохиолдолд хэрэглэгч гараас тоогоо оруулахдаа өмнө нь заавал = тэмдэг бичиж байх хэрэгтэй. Учир нь scanf ингэж хүсч байна. Тэгэхээр scanf-ын Удирдлагын тэмдэгт мөрийг

Page 13: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:14

бичиж байхдаа онц шаардлагагүй л бол хэрэгцээгүй, илүү тэмдэгтийг ашиглахгүй байх хэрэгтэй. scanf-ыг ашиглахад гардаг өөр нэг асуудал нь & тэмдэгтийг ашиглах явдал юм. scanf –д хувьсагчдын өмнө & тэмдэгтийг ашигладаг. Шаарддаг учрыг сүүлд бид “Функц” гэсэн сэдвийг үзэж байхад мэдэх болно. Харин нэг тохиолдолд буюу “%s” тэмдэгтийг ашиглаж байгаа , өөрөөр хэлбэл тэмдэгт массивтай ажиллаж байх үед & тэмдэгтийг ашигладаггүй. Дүрэм : Хэрэглэгчээс int, float, char, double,long гэх мэт энгийн төрлийн утгыг уншихыг хүсвэл & тэмдэгтийг хувьсагчийн нэрийн өмнө заавал ашигла. Харин хэрэглэгчээс тэмдэгт мөр буюу тэмдэгт массив уншихыг хүсвэл & тэмдэгтийг ашиглахгүй. Дараах программд хэрэглэгчээс овог, нэр , нас, хүндийг нь асууж байна. Тэмдэгт мөр уншихдаа & ашиглаагүй , харин нөгөө 2 хувьсагчид & ашиглаж байгааг анзаарна уу. Программд хэрэглэгчийн овог нэрийг нэг scanf –аар цугт нь уншиж чадаагүй байна. Учир нь scanf нь нэгэн зэрэг 2 үг буюу тэмдэгт мөр салгаж уншиж чадахгүй. юм. #include <stdio.h> main() { int age; float weight; char first[15], last[15];

printf(“Та нэрээ оруулна уу ?”); /* Асуулт */ scanf(“%s”,first); /* & тэмдэгт ашиглаагүй . */ printf(“Та овгоо оруулна уу ?”); /* Асуулт */ scanf(“%s”,last); /* & тэмдэгт ашиглаагүй . */ printf(“Та хэдэн настай вэ ?”); /* Асуулт */ scanf(“%d”,&age); /* & тэмдэгт ашигласан . */ printf(“Та хэдэн кг жинтэй вэ ?”); /* Асуулт */ scanf(“%f”,&weight); /* & тэмдэгт ашигласан . */ printf(“ Таны оруулсан мэдээллүүд \n”); printf(“ Овог, Нэр : %s %s\n”,last,first); printf(“Жин : %.0f\n”,weight); /* 0 байгаа учир бутархай оронг хэвлэхгүй.*/ printf(“Нас : %d”, age);

} Программ ажиллаад дараах үр дүнг үзүүлнэ.

Та нэрээ оруулна уу ? Бат Та овгоо оруулна уу ? Дорж Та хэдэн настай вэ ? 20 Та хэдэн кг жинтэй вэ ? 60 Таны оруулсан мэдээллүүд Овог, Нэр : Дорж Бат Жин : 60

Нас : 20 Жишээ :

Page 14: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:15

main() { int i; char c; float f; char Name[20]; scanf(“%d”,&i); scanf(“%c”,&c); scanf(“%f”,&f); scanf(“%s”,Name); } Жишээ : main() { int i,j,k; scanf(“%d %d %d”,&i,&j,&k); } Та scanf-ыг ашиглан хэрэглэгчээс тодорхой форматтай өгөгдлийг уншиж болно. Жишээлбэл он сар уншихад он,сар, өдөр гэсэн утгууд нь тодорхой тусгаарлагчтай ( 03/05/99 ) байдаг. Тэгвэл одоо хэрэглэгчээс mm/dd/yy гэсэн форматаар он сар уншия. scanf(“%d/%d/%d”,&month,&day,&year); Энэ тохиолдолд хэрэглэгч яг дээрх форматаар л оруулах ёстой. Дүрэм :

Хэрэглэгчээс өгөгдөл уншихдаа scanf функцыг ашиглана. scanf-ыг ашиглахдаа удирдлагын тэмдэгт мөр бичдэг ба энэ нь хэрэглэгч өгөгдлөө яаж оруулахыг тодорхойлсон тэмдэгт мөр байна.

scanf-ыг ашиглахаасаа өмнө printf-ээр заавал асуултаа хэвлэ. scanf-д массиваа өөр хувьсагч ашиглахдаа & тэмдэг ашигла. scanf-д массивын нэрийн өмнө & тэмдэг бүү ашигла.

5.2 getchar() функц getchar() нь гараас зөвхөн ганц тэмдэгт уншина, харин putchar нь дэлгэцэнд нэг тэмдэгт хэвлэнэ. Та зөвхөн нэг тэмдэгт гараас унших, эсвэл дэлгэцэнд нэг тэмдэгт хэвлэхийг хүсвэл эдгээр функцыг ашигла. Жишээ : #include <stdio.h> main() { int ch;

printf(“ Тэмдэгтээ оруулна уу ? ”); ch=getchar(); printf(“\n You typed the character ”); putchar(ch);

} Энэ команд нь int утга буцаах ба энэ нь дарагдсан товчны код байна. 5.3 getch() функц

Page 15: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:16

getch() нь оруулах өгөгдлийг буферлэдэггүй. Өөрөөр хэлбэл өгөгдлөө цуглуулан, ENTER товчийг хүлээдэггүй . Үүнээс үүдэх нэг дутагдал нь буруу оруулсан өгөгдлөө BACKSPACE товчоор залруулж, арилгаж болдоггүй. Харин getchar()-аар өгөгдлөө унших үед хэрэглэгч BACKSPACE товч дарж болно. Гэтэл getch()-д ийм боломж байхгүй. Дараах жишээнд getch()-ээр 2 тэмдэгт уншиж байна. printf(“Хоёр тэмдэгт оруулна уу ? \n”); first=getch(); second=getch(); getch() нь getchar() шиг ENTER товч хүлээдэггүй учраас түүнээс илүү хурдан ажиллана. 5.4 getche() функц getch() нь оролтын тэмдэгтүүдийг дэлгэцэнд дүрсэлдэггүй. Иймээс та дэлгэцэнд дүрслэхийг хүсвэл дараа нь putch –ийг дуудах шаардлагатай болдог. printf(“Хоёр тэмдэгт оруулна уу ? \n”); first=getch(); putch(first); second=getch(); putch(second); Гэтэл дээрх үйлдлийг гүйцэтгэхийн тулд getche функцыг ашиглахад л хангалттай. getche нь оролтын тэмдэгтүүдийг дэлгэцэнд дүрсэлдэг. Дүрэм

Нэг тэмдэгт унших, бичихийг хүсвэл getchar(), putchar()-г ашигла. Гараас Enter товчийг хүлээж зогсохыг хүсвэл getchar-ийг ашигла. Хэрэглэгч товч дарангуут түүнийг дэлгэцэнд дүрсэлэхгүйгээр уншихыг хүсвэл getch()-ийг ашигла.

Эдгээр Оролт гаралтын функцүүдтэй ажиллахдаа char биш int хувьсагч ашигла. Учир нь зарим үйлдлийн системүүд char төрлөөс их утгаар товчлууруудаа кодлосон байдаг.

5.5 СИ ПРОГРАММЫН БҮТЭЦ Си программын бүтцийг агуулгаар нь дараах 5 бүлэг хэсэгт хувааж үзнэ.

1. Холболтын хэсэг 2. Тогтмолуудыг зарлах хэсэг 3. Хувьсагчийг зарлах хэсэг 4. Функцүүдийг зарлах хэсэг

Page 16: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:17

5. Үндсэн функц 1.Холболтын хэсэг Программд стандарт функц процедур холбох шаардлага тулгардаг бөгөөд холболтыг #include түлхүүр үгийн тусламжтайгаар гүйцэтгэнэ. Бичигдэх хэлбэрт : #include <Файлын нэр> эсвэл #include “Файлын нэр” Файлын нэр нь тухайн функцуудыг агуулах .h өргөтгөлтэй файлын нэр байна. Эдгээр файлууд c:\tc\include санд байрлана. Файлуудын жишээ :

• stdio.h - Үндсэн оролт гаралтын функцүүд энэ файлд тодорхойлогдоно printf - Дэлгэцэнд өгөгдөл хэвлэх scanf - Гараас утга унших . . .

• stdlib.h - Төрөл бүрийн хөрвүүлэлтийн функц, программын удирдлага шилжүүлэх функцууд байна. atoi - Тэмдэгт мөрийг тоо болгох itoa - Тоог тэмдэгт мөр болгох . . .

• alloc.h , malloc.h - Санах ойтой харьцдаг функцууд • math.h - Математик функцууд

cos() - Косинус олох, sin() - Синус олох log() - Логарифм олох, sqrt() - Тооны кв язгуур олох pow() - х тоог у зэрэгт дэвшүүлэх

• ctype.h - Тэмдэгтийг шалгах, өөрчлөх функцуудыг агуулна. isalpha() - Тэмдэгт нь үсэг мөн эсэхийг шалгана. isdigit() - Тэмдэгт нь тоо мөн эсэхийг шалгана.

• time.h - Он сар өдөр болон цагтай ажиллах функцуудыг агуулна. clock() - Программ эхэлснээс хойших хугацааг буцаах time() - Системийн идэвхтэй цагийг буцаах

• conio.h - Дэлгэцтэй ажиллах функцуудыг агуулна. gotoxy() - Курсорын байрлалыг өөрчлөх cprintf() - Өнгө зааж өгч хэвлэх

• string.h - Тэмдэгт мөртэй ажиллах функцууд strcpy() - Нэг тэмдэгт мөрийг нөгөөд олгох функц strcat() - Хоёр тэмдэгт мөрийг залгах функц

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

1. const float pi=3.14; 2. #define MAX 100

3. Хувьсагчийг зарлах хэсэг Программд хэрэглэгдэх глобаль хувьсагчдыг энд зарлана. Бичих хэлбэр : <Хувьсагчийн төрөл> <Хувьсагчийн нэр>;

Page 17: Programchlaliin c hel

Жишээ : int i,j; char c;

Глобаль хувьсагч Глобаль хувьсагч гэдэг нь тухайн программын аль ч хэсэгт харагдах , утгыг нь өөрчилж болох хувьсагч юм. Глобаль хувьсагчийг дараах 2 шинж чанараар нь ялгана.

- Программын аль ч функц , процедур дотроос түүний утгыг хэрэглэж, өөрчилж болдог.

- Түүний амьдрах хугацаа нь программыг дуусан дуустал үргэлжилнэ.

4. Функцүүдийг зарлах хэсэг Энд хэрэглэгчийн тодорхойлсон функц , процедуруудыг (дэд программ) байрлуулна. Дэд программ нь өөрийн гэсэн нэртэй ба үндсэн программын хаанаас нь ч нэрээр нь дуудаж хэрэглэж болдог. Функцын нэр(параметрүүд) { <Хувьсагчдыг зарлах хэсэг> Локаль хувьсагч <Функцийн бие> }

Локаль хувьсагч

Зөвхөн тухайн функц дотроо хэрэглэгдэнэ. Амьдрах хугацаа нь функцын ажиллах хугацаа юм.

5.Үндсэн функц Си хэлэнд программын үндсэн функц нь main нэртэйгээр тодорхойлогддог. Үндсэн функцээс программ эхэлж ажиллана. Ө.х Си хэл дээр бичигдсэн программын хамгийн анхны ажиллах функц нь main функц юм.

main() { <Хувьсагч зарлах хэсэг> <Үндсэн программын хэсэг> }

Программын жишээ : Холболтын

хэсэг #include <stdio.h> #include <conio.h> #define pr printf const float pi=3.14;

Тогтмол зарлах хэсэг

int i,j,n; Глобаль хувьсагч зарлах хэсэг

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:18

Page 18: Programchlaliin c hel

PrintPI()

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:19

{ int k; pr(“Тоо=%d”,k); pr(“pi тоо=%f”,pi);

Хэрэглэгчийн функц тодорхойлох хэсэг

} main()

Локаль хувьсагч зарлах хэсэг

Үндсэн функц зарлах хэсэг {

int k; pr(“ Now I,ll print pi number ”); PrintfPI(); }

Локаль хувьсагч зарлах хэсэг

СЭДЭВ 6. ИЛЭРХИЙЛЭЛ БА ҮЙЛДЛҮҮД 6.1 Илэрхийлэл Бүх төрлийн хувьсагч, тогтмол болон үйлдлүүдийг илэрхийлэлд хэрэглэж болно. Тогтмол болон хувьсагчдыг үйлдлийн тэмдэгээр холбосон дарааллыг илэрхийлэл гэнэ. (x + y - 10) * 10 Си хэлний илэрхийлэлд хоосон зай ямар нэг нөлөө үзүүлдэггүй. Өөрөөр хэлбэл илэрхийлэлд хичнээн урт хоосон зай ашиглаж болно. Харин хаалт хэрэглэх нь илэрхийллийг ойлгомжтой болгох төдийгүй, үйлдлүүдийн биелэх дарааллыг баттай болгож өгдөг. Илэрхийлэлд хэрэглэгдэх үйлдлүүдийг УНАР , БИНАР гэж ангилдаг. Унар үйлдэл : Зөвхөн ганц хувьсагч (эсвэл тогтмол) дээр гүйцэтгэгдэх үйлдэл бөгөөд үйлдлийн тэмдэг нь хувьсагчийн өмнө бичигддэг. Бинар үйлдэл : Хоёр хувьсагчийн хооронд ( тогтмолуудын хооронд ) үйлдэл хийгдэх ба үйлдлийн тэмдэгийг хувьсагчдын дунд бичдэг. Жишээ : -i үед (-) нь унар үйлдэл юм.

Page 19: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:20

x + y үед (+) нь бинар үйлдэл юм. Си хэлэнд арифметик, логик үйлдлүүдийг илэрхийлэлд өргөн ашигладаг. Си хэл нь маш том үйлдлийн олонлогтой. Энэ сэдэвт өргөн хэрэглэгддэг зарим үйлдлүүдийг авч үзэх болно. 6.2 Арифметик үйлдлүүд Үндсэн 4 арифметик үйлдэл нь +, - , *, / үйлдлүүд болно. Си хэлний үйлдлүүд аль болох цаг хэмнэх , мөн үр дүн нь ашигтай байх зарчмыг баримтлан зохиогдсон байдаг. Бинар үйлдэл : + - * / % Унар үйлдэл : - ( Turbo C хэлэнд унар + үйлдэл байдаг. ) 6.3 Үндсэн үйлдлүүдийн зэрэглэл Хүснэгт 3.4-т үндсэн үйлдлүүдийн зэрэглэлийг үзүүлэв. Хамгийн эхний мөрд байгаа нь хамгийн өндөр зэрэглэлтэй, мөр доошлох тусам зэрэглэл буурна. Ижил зэрэглэлтэй үйлдлүүдийн хувьд аль талаас нь эхэлж үйлдлүүдийг гүйцэтгэхийг чиглэл нь тодорхойлно.

Үйлдлүүд Чиглэл ( ) Зүүнээс баруун

Унар - Зүүнээс баруун * / Зүүнээс баруун + - Зүүнээс баруун

Одоо дараах илэрхийллийг хэрхэн бодогдохыг авч үзье. - (-3 * (5+ 2 * 6))+ (3 * 4 + 4)/ 2 - (-3 * (5+ 12))+ (3 * 4 + 4)/ 2 - (-3 * 17)+ (3 * 4 + 4)/ 2 - (-51)+ (3 * 4 + 4)/ 2 - (-51)+ (12 + 4)/ 2 - (-51)+ 16/ 2 51+ 16/ 2 51+ 8 59 / үйлдлээс өмнө унар - үйлдэл биелэгдэнэ. Хэрэв үйлдлүүдийн зэрэглэл ижил бол чиглэлийнхээ дагуу бодогдоно.

Утга Олгох үйлдлүүд Утга олгох үйлдлээр аливаа нэг илэрхийллийн эцсийн үр дүнг хувьсагчид олгогдоно. Утга олгох үйлдэл хамгийн бага зэрэглэлтэй үйлдэлд тооцогддог. Утга олгох үйлдэлийн бичигдэх хэлбэр :

Page 20: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:21

<Хувьсагч>[<үйлдэл>]=<илэрхийлэл>; <үйлдэл> нь: +, -, *, /, %, <<, >>, &, ^, | эсвэл байхгүй байж болно. Дараах жишээнд үндсэн үйлдлүүд нь утга олгох үйлдлээс өмнө биелэгдэх болно. A=2 + 3 * 4; /* Үр дүн : 14 */ Нэгэнт л утга олгох үйлдэл нь үйлдэл учраас үйлдэл ашиглаж болох бүх л газар түүнийг ашиглаж болно. Жишээ : a=b=c+4; c=3 * (d=12.0 / x ); Мөн утга олгох үйлдлүүд нь Си хэлний бичлэгийг авсаархан болгоход чухал үүрэг гүйцэтгэдэг. Яаж авсаархан болгосныг доорх жишээнээс үзнэ үү.

= үйлдлээр +=,-=,*=,/= . . . үйлдлүүд i = i + 2; i+=2; k=k*10; k *= 10;

x=x*(y+1) x*=y+1 Жишээ : x=20; x*=y=z=6; Энэ жишээ биелэгдэхдээ : x*=(y=(z=6)) /* z=6 */ x*=(y=6) /* y=6, z=6 */ x*=6 /* x=x*6 */ x=120; /* Үр дүн 120 */ 6.4 Нэмэгдүүлэх, хорогдуулах үйлдэл Си хэлэнд маш өргөн хэрэглэгддэг үйлдлүүд нь нэмэгдүүлэх (++), хорогдуулах (--) үйлдлүүд юм. i++ гэсэн илэрхийлэл нь i=i+1 гэсэн илэрхийлэлтэй ижил чанартай юм. Нэмэгдүүлэх, хорогдуулах үйлдэл нь обьектын утгыг 1-ээр нэмэгдүүлж, хорогдуулдаг. Энэ үйлдэл нь ихээхэн хэрэглэгддэг үйлдэл боловч түүний дүрэм, зэрэглэлийг сайн ойлгоогүй тохиолдолд хэрэглэхэд хэцүү үйлдэл юм. Дараах илэрхийлэлд c + i ++ эхлээд i-ийн утга c-дээр нэмэгдээд , дараа нь i-ын утга 1-ээр нэмэгдэнэ. Дараах хоёр бүлэг командууд ижил чанартай.

b=c + i++; b=c + i; i=i+1; ++ үйлдэл нь мөн обьектын өмнө бичигдэж болно. Жишээ : c=++i; ++ үйлдэл өмнө нь бичигдэх тохиолдолд c-д i-ын утга олгогдохоос өмнө i-ын утга 1-ээр нэмэгдэнэ.

b=c + ++i; i=i+1; b=c + i;

Page 21: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:22

Мөн хорогдуулагч (--) үйлдэл нь (++) үйлдэлтэй ижил зарчмаар ажиллана. (++),(--) үйлдлүүд нь унар үйлдэл учир үндсэн 4 үйлдлээс өндөр зэрэглэлтэй байна. Дүрэм : ++, -- үйлдлийг зөвхөн обьекттой хийдэг гэдгийг анхаар. Эдгээр үйлдлийг тогтмол утган дээр хийхгүй. / 5++ , 5 -- , ++5 , --5 бол АЛДАА /

Үйлдлүүдийн зэрэглэл II ()

++ -- - ( Унар үйлдлүүд ) / * %

+ - =, +=, -= , …

Мөн Си хэлд өргөн хэрэглэгддэг арифметик үйлдэл нь үлдэгдэл олох (%) үйлдэл юм. Энэ үйлдэл нь хуваалт үйлдлийн үлдэгдлийг олдог үйлдэл юм. y=5; x=12; z=x % y; Үр дүн : z=2 12-ыг 5-д хуваахад 2 ногдож 2 үлдэнэ. Энэ үйлдэл нь float эсвэл double төрлийн утгатай ажиллахгүй, зөвхөн бүхэл тоон төрлийн утгатай ажиллана. 6.5 Бит үйлдлүүд Бит үйлдэл гэдэг нь тооны битүүд дээр хийгддэг үйлдлийг хэлнэ. Си хэлэнд дараах 6 бит үйлдлийг ашигладаг. 1. & бит БА үйлдэл 2. | бит БУЮУ үйлдэл 3. ^ бит XOR үйлдэл 4. << бит дүрслэлийг нь зүүн тийш шилжүүлэх үйлдэл 5. >> бит дүрслэлийг нь баруун тийш шилжүүлэх үйлдэл 6. ~ үгүйсгэл 1 бит нь 0 ба 1 гэсэн 2 л утгыг авна. Эдгээр утгууд дээр бит үйлдлүүд хэрхэн үйлчилэхийг авч үзье.

x1 x2 x1 & x2 x1 | x2 x1^x2 ~x1 1 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 1 1 0 0 0 0 0 1

Хүснэгтээс харахад : & үйлдлийн утга нь : Хоёр утга хоёулаа 1 бол эцсийн үр дүн 1 байна, бусад тохиолдолд 0 байна. | үйлдлийн утга нь : Хоёр утга хоёулаа 0 бол эцсийн үр дүн 0 байна, бусад тохиолдолд 1 байна. ^ үйлдлийн утга нь : Хоёр утга хоёулаа ижил бол эцсийн үр дүн 0 байна, ялгаатай бол 1 байна. ~ үйлдлийн утга нь : Утга 1 бол үр дүн 0 байна, эсрэг тохиолдод 1 байна.

Page 22: Programchlaliin c hel

XOR үйлдэл нь 2 бит нь ялгаатай бол 1 , адил бол 0 гэсэн үр дүн буцаадаг.

00000001 & 00000010 ------------ 00000000 = 0

Жишээ 1 : x1=1; x2=2; printf(“ %d ”, x1&x2); << үйлдэл нь тухайн тооны бит дүрслэлийг тодорхой тоогоор зүүн тийш шилжүүлдэг. Энэ нь тухайн тоог 2-ын зэрэгтээр үржүүлж буйтай утга адил болно. Харин >> үйлдэл нь баруун тийш шилжүүлэх ба энэ нь тухайн тоог 2-ын зэрэгтэд хувааж байгаатай утга адил болно. Жишээ 2 : x=1; x=x<<2; /* x = x * 22 = x * 4 */ 00000001 << 2 ------------ 00000100 = 4 Жишээ 3 : x=8; x=x>>2; /* x = x / 23= x / 4 */ 00001000 >>2 ------------ 00000010 = 2 Жишээ 4 : x=10; x=x<<3; printf(“%d”,x); 00001010 <<3 ------------ 01010000 = 64+16=80 Жишээ 5 : x=3; y=2; z=1; printf(“%d”,x^y&~z); /* (x^ (2 & -1 ))=(3 ^ 2)=1 */ “Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:23

Page 23: Programchlaliin c hel

~z= 00000001 y&~z= 00000010 x^(y&(~z))= 00000011 ~ & 11111110 ^ 00000010 ------------- --------------- -------------- 11111110 00000010 00000001 буюу эцсийн үр дүн 00000001 = 1

Нөхцөлт илэрхийлэл ( ? : ) үйлдэл Энэ үйлдэл нь илэрхийлэл дотор сонголтын механизмыг хэрэгжүүлдэг үйлдэл юм.

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:24

Бичигдэх хэлбэр : ШалгахИлэрхийлэл ? Илэрхийлэл1 : Илэрхийлэл2

Үнэн тохиолдолд

Худал тохиолдолд

ШалгахИлэрхийлэл -ийн утга Үнэн байвал илэрхийлэл1, харин Худал байвал илэрхийлэл2 нь энэ илэрхийллийн үр дүн буюу утга болдог. Жишээ 1 : z=(a>b) ? a : b; /* z=MAX(a,b) */ Жишээ 2 : x=3, y=3, z=1 z+=x<y ? x++ : y++; ---------------------------- (z+=((x>y) ? (x++) : (y++))) (z+=(y++)) (z+=3) (z=z+3) ( Үр дүн x=3, y=4, z=4 )

СЭДЭВ 7. СОНГОЛТЫН КОМАНДУУД

Page 24: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:25

7.1 Харьцуулах үйлдлүүд Си хэл нь үйлдлүүдийн арвин олонлогтой. Бид өмнө нь арифметик, утга олгох зэрэг үйлдлүүдийг үзэж байсан. Удирдлага шилжүүлэх командуудад одоо бидний үзэх харьцуулах үйлдлүүд өргөн ашиглагддаг. Хүснэгт 7.1

Үйлдлүүд Утга == Тэнцүү != Тэнцүү биш < Бага > Их

<= Бага буюу тэнцүү >= Их буюу тэнцүү

Дээрх харьцуулах үйлдлүүдийн хувьд үйлдлийн зэрэглэл нь 2 түвшинд хуваагдана. <, >, <=, >= нь дээд түвшний буюу өндөр зэрэглэлтэй үйлдлүүд юм. Харин доод түвшний үйлдлүүд нь ==, != болно. Өөрөөр хэлбэл ==,!= үйлдлүүд нь бусад 4 өөсөө сүүлд бодогдоно. Жишээ : x=5; y=2; z=0; a. x>y+z /* Үнэн гэсэн утгатай */ b. x+z<=y /* Худал гэсэн утгатай */ c. z<x==y+z>=x /* Худал гэсэн утгатай */ а жишээнд + үйлдэл эхэлж биелэх бөгөөд 5>2 нь үнэн юм. b жишээнд нэмэх үйлдэл эхэлж биелэх бөгөөд 5 <=2 нь худал юм. с жишээнд эхлээд нэмэх үйлдэл, дараа нь <,>= үйлдлүүд биелж, эцэст нь == үйлдэл биелнэ. 0 < 5 == 2 >=5 1 == 0 Тоон төрлийн утгуудыг жишихдээ утгынх нь их багаар жишдэг. Харин тэмдэгт утгыг жишихдээ тэдгээрийн ASCII дугаараар нь жишдэг. Жишээ нь ASCII дугааруудын заримаас нь :

A-65 B-66 C-67 D-68 . . . X-88 Y-89 Z-90 a-97 b-98 c-99 d-100 . . . x-120 y-121 z-122 ASCII дугаараас нь харвал эдгээр тэмдэгтүүдийн эрэмбэ нь :

‘A’<’B’<’C’ . . . ‘Z’<’a’<’b’. . .<’z’

‘A’>’z’ (Худал) ‘Z’>’a’ (Худал) ‘z’>’Z’ (Үнэн)

Page 25: Programchlaliin c hel

7.2 if команд if нөхцөлт командын хамгийн хялбар хэлбэр нь :

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:26

if(Нөхцөлт илэрхийлэл) команд; Си хэлэнд Үнэн ба Худал гэсэн утгуудыг тоогоор төлөөлүүлэн ойлгодог. Хэрэв нөхцөлт илэрхийлэлийн утга нь 0 бол түүнийг Худал гэж ойлгоно, харин 0-ээс ялгаатай утгыг үнэн гэж тооцдог.

if (n >1000) printf(“ Утга хязгаараас хэтэрлээ … ”);

0 0 утгыг ХУДАЛ гэж ойлгоно.

… -10,-9 … -1,1,2 … 10 , 11 … 0-ээс ялгаатай бүх утгыг ҮНЭН гэж ойлгоно. Жишээ нь : . . . done=1 if(done) printf(“ Үнэн ”); … Энэ тохиолдолд дэлгэцэнд Үнэн гэж хэвлэгдэнэ. Учир нь 1 бол үнэн гэсэн утгыг төлөөлнө. Дээрх жишээн дэх илэрхийллийг өөрөөр дүрсэлбэл : if(done ! =0) printf(“ Үнэн ”); Хэрэв if команд -д нэгээс олон команд бичих хэрэгтэй бол тэдгээрийг хос хаалтанд бичиж өгнө. if(нөхцөлт илэрхийлэл) { команд1;

команд2; команд3;

} Си хэлэнд дээрх нөхцөлт илэрхийлэл нь дурын илэрхийлэл байж болно. Харин бусад программчилалын хэлэнд зөвхөн үнэн, худал утга буцаах илэрхийллийг л зөвшөөрдөг. Жишээ : if((ch=getchar())==’\n’) команд; Дээрх жишээг тайлбарлая. Эхлээд getchar функц дуудагдан, үр дүн нь ch хувьсагчид олгогдоно. Дараа нь ch –ын утгыг ‘\n’-тэй тэнцүү эсэхийг шалгаж байна. Энд утга олгох илэрхийллийг заавал хаалтанд хийж өгөх хэрэгтэй. Учир нь == үйлдэл нь = үйлдлээс өндөр зэрэглэлтэй учир түрүүлээд биелэгдчихнэ. Илэрхийллийг бичих ийм боломж нь Си хэлд байдаг дэвшилттэй талуудын нэг юм. Ихэнх программчилалын хэлүүдэд дээрх жишээг дараах байдлаар бичдэг. Гараас нэг тэмдэгт унших; if (Тэмдэгт нь Enter товч бол) then команд;

Page 26: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:27

if – else команд if else –ийн үндсэн формат нь : if(Илэрхийлэл) команд; else команд; Энэ команд нь 2 сонголт хийх боломжийг бүрдүүлдэг. Хэрэв илэрхийлэл худал бол удирдлага нь else түлхүүр үгийн дараах командад шилжинэ. Жишээ нь кв тэгшитгэлийн язгуур олох программ бичье. d=b*b – 4*a*c; if(d>=0) { x1=(-b + sqrt(d)) / (2*a); x2=(-b - sqrt(d)) / (2*a); printf(“ Язгуурууд нь : %f , %f”,x1, x2 ); } else printf(“ Энэ кв тэгшитгэлд язгуур байхгүй. ”); Энэ жишээнд нөхцөл шалган, сонголттой үйл ажиллагаа хийж байна. 7.3 Давхар if команд Та if командыг хэдэн ч давхраар нь бичиж хэрэглэж болно. Доорх жишээнд хэрэв илэрхийлэл1 –ын утга үнэн бол удирдлага дараагийн if-д шилжих ба илэрхийлэл2-ын утга үнэн бол команд биелнэ. Өөрөөр хэлбэл илэрхийлэл1 ба илэрхийлэл2 хоёр хоёул үнэн утгатай байхад л команд биелнэ. if(илэрхийлэл1) if(илэрхийлэл2 ) команд; Текст дахь үгийн тоог олдог программ зохиоё. Өгүүлбэр нь цэгээр эсвэл ? ! тэмдэгтүүдээр төгсөнө гэж үзье. if(өмнөх тэмдэгт нь үсэг бол) if(Одоогийн тэмдэгт нь үгийн төгсгөл тэмдэгт бол ) үгийн_тоо++; Энэ жишээнд үгийг үсэг бүрээр нь шалгаад үгийн төгсгөл байвал түүнийг тоолж байна. Тэгвэл дээрх жишээг арай өргөтгөе. if(ch==’ ‘) { if(өмнөх тэмдэгт нь үсэг бол) num++; } else { if(ch тэмдэгт нь өгүүлбэрийн төгсгөл бол ) num++; }

Page 27: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:28

Энд бид давхар if-үүдийг хэрэглэсэн жишээ үзлээ. Давхар if-үүдийг хэрэглэж байхдаа хаалтыг зөв хэрэглэх ёстой. Жишээ : if(илэрхийлэл1) if(илэрхийлэл2) команд1; else команд2; Хэрэв илэрхийлэл1, илэрхийлэл2 хоёулаа Үнэн бол команд1 биелнэ. Хэрэв илэрхийлэл1 нь үнэн, илэрхийлэл2 нь худал бол команд2 биелнэ. Жишээгээ дахин харцгаая. Харагдах байдлаас нь үзвэл илэрхийлэл1 худал байхад команд2 биелэх ч юм шиг. Тэгэхээр энд “Энэ else аль if-д хамаарах вэ ?” гэсэн асуулт гарч ирнэ. Компиляторт хоосон зай тэмдэгтийн тоо нөлөөлдөггүй гэдгийг санах хэрэгтэй. Өөрөөр хэлбэл бид else-г аль ч if-ын харалдаа бичсэн компилятор нэг л янзаар ойлгоно. Иймээс энд Си хэл тодорхой дүрэм баримталдаг байж таарна. Дүрэм : Си нь else –г түүнд хамгийн ойр бөгөөд түүнээс өмнө орших, өөрийн гэсэн else –гүй if-д харгалзуулан ойлгодог. Өөрөөр хэлбэл хаалтны баланстай яг ижил зарчмаар ойлгодог. /* [ …. { …. ( ….. ) … } … ] */ Одоо дээрх жишээ ойлгомжтой боллоо. else –г яаж ч бичсэн түүнд хамгийн ойр орших if-д буюу if(илэрхийлэл2)- т хамаарах else нь байна гэсэн үг. Харин ийм ойлгомжгүй байдлаас зайлсхийх 2 арга байдаг. Жишээ : Хаалт хэрэглэх Бүх if-д харгалзах else-г нь бичих if(илэрхийлэл1) { if(илэрхийлэл2) команд1; } else команд2;

if(илэрхийлэл1) if(илэрхийлэл2) команд1; else ; else команд2;

Харин энд ; буюу хоосон командыг дүрсэлсэн байна. Хоосон команд нь программд их хэрэглэгддэг бөгөөд үүнийг хэрэглэх нь программын зөв бичлэг, уншигдах хэлбэрийг сайжруулдаг. Гэхдээ хаалт хэрэглэх нь илүү өргөн хэрэглэгддэг зохимжтой арга юм. if(ch==’ ‘) { if(өмнөх тэмдэгт нь үсэг бол) num++; } else { if(ch тэмдэгт нь өгүүлбэрийн төгсгөл бол ) if(өмнөх тэмдэгт нь үсэг бол) num++; } 7.4 Логик үйлдлүүд Олон давхар if хэрэглэхээс зайлсхийх өөр нэг арга нь логик үйлдлийг хэрэглэж сурах явдал юм. Си хэлэнд логик && (БА) , || (БУЮУ) гэсэн холбоосууд байдаг. Эдгээр логик үйлдлүүд нь харьцуулах үйлдлүүд болох <,>- аас ч бага зэрэглэлтэй үйлдлүүд юм.

Page 28: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:29

Харин && үйлдэл нь || -ээсээ өндөр зэрэглэлтэй. Харин зарим хэлэнд логик үйлдлүүд нь харьцуулах үйлдлээс өндөр зэрэглэлтэй байдаг бөгөөд энэ тохиолдолд хаалт хэрэглэдэг: Жишээ нь : Pascal хэлэнд a<b OR c>d илэрхийлэл нь алдаатай илэрхийлэл болно. Учир нь OR нь эхэлж биелэх бөгөөд үр дүнг нь илэрхийлэлд орлуулахад энэ илэрхийлэл алдаатай илэрхийлэл болно. Харин Си хэлд a<b || c>d нь зөв илэрхийлэл болно.

Логик (БА) буюу && үйлдэл Шалгагдаж байгаа нөхцөлүүд бүгд үнэн бол эцсийн үр дүн үнэн байна. Үр дүн нь int төрлийн утгатай ба Үнэн=1, Худал=0 гэсэн тус тусын харгалзах утгатай байна. Бичигдэх хэлбэр : илэрхийлэл1 && илэрхийлэл2 . . . Дээр бичиж байсан жишээгээ одоо && үйлдэл ашиглан бичье. if((ch=’ ‘)&&(өмнөх тэмдэгт нь үсэг)) num++; else { if((ch нь өгүүлбэрийн төгсгөл)&&( өмнөх тэмдэгт нь үсэг)) num++; } Энэ жишээг үйлдлийн зэрэглэл ойлгосон хүн бол хаалтгүй бичнэ. if(ch=’ ‘ && өмнөх тэмдэгт нь үсэг) Гэхдээ харахад ойлгомжтой байх үүднээс хаалт хэрэглэхийг зарим хүн илүүд үздэг. Жишээ 1 : #include <stdio.h> int a=1,b=2; char c=’k’; main() { if (a=1 && b=2 && c=’k’) printf(“ Бүх шалгалтууд үнэн байна”); else printf(“Аль нэг нь, магадгүй бүгд худал байж ч болно.”); }

Page 29: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:30

Логик (БУЮУ) буюу || үйлдэл Шалгагдаж байгаа нөхцлүүдийн ядаж нэг нөхцөл нь ҮНЭН бол үр дүн нь ҮНЭН байна. Харин нөхцлүүд нь бүгд ХУДАЛ тохиолдолд л үр дүн ХУДАЛ байна. Бичигдэх хэлбэр : илэрхийлэл1 | | илэрхийлэл2 . . . Жишээ нь : #include <stdio.h> int a=1,b=2; char c=’k’; main() { if (a=1 || b=1 || c=’a’) printf(“ Нөхцөлүүдийн аль нэг нь үнэн байна”); else printf(“Нөхцөлүүд бүгд худал байна.”); } Өмнөх үг тоолдог жишээгээ БУЮУ үйлдэл ашиглан кодчилолыг улам багасгая. Жишээ : if((ch=’ ‘ && өмнөх тэмдэгт нь үсэг) || (ch нь өгүүлбэрийн төгсгөл && өмнөх тэмдэгт нь үсэг)) num++; && үйлдэл нь ||-аасаа өндөр зэрэглэлтэй учраас энд мөн хаалт хэрэглэхгүй байж болно. Гэхдээ ингэж кодчилолыг багасгах нь түүнийг ойлгоход улам төвөгтэй болгож байна . if(ch=’ ‘ && өмнөх тэмдэгт нь үсэг || ch нь өгүүлбэрийн төгсгөл && өмнөх тэмдэгт нь үсэг) num++;

Логик Үгүйсгэл буюу ! үйлдэл Логик илэрхийлэл нь үнэн, худал гэсэн 2 л утгатай байдаг. Тэгвэл энэ үйлдлээр илэрхийллийн үр дүнг урвуугаар хөрвүүлнэ. Өөрөөр хэлбэл ҮНЭН утгыг ХУДАЛ, ХУДАЛ утгыг ҮНЭН болгоно. Жишээ : ! (5 < 7) Энэ илэрхийлэл нь худал утгатай байна. Логик үгүйсгэл үйлдэл нь унар үйлдэл юм. Тиймээс && ба || үйлдлүүдээс өндөр зэрэглэлтэй үйлдэл юм. !(5<7) || (3>2) -ын үр дүн ҮНЭН !(5<7 || 3>2) -ын үр дүн ХУДАЛ Үйлдэл Тайлбар Илэрхийлэл Х Y Үр дүн

! Үгүйсгэл !x Үнэн Худал

Page 30: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:31

Худал Үнэн && БА x&&y Үнэн Үнэн Үнэн

Үнэн Худал Худал Худал Үнэн Худал Худал Худал Худал || БУЮУ x||y Үнэн Үнэн Үнэн Үнэн Худал Үнэн Худал Үнэн Үнэн Худал Худал Худал

7.5 Үйлдлүүдийн зэрэглэл

Тайлбар Үйлдлүүд Чиглэл Хаалт ( ) Зүүнээс Массивын элемент [] Зүүнээс Бүтцийн элемент -> Зүүнээс Бүтцийн элемент . Зүүнээс Нэмэгдүүлэх, хорогдуулах ++ -- Баруунаас Бит “Үгүйсгэл” үйлдэл ~ Баруунаас Логик “Үгүйсгэл” үйлдэл ! Баруунаас Хаяг авах үйлдэл & Баруунаас Заагчийн утга үйлдэл * Баруунаас Төрөл хувиргах үйлдэл (Төрөл) Баруунаас Унар хасах үйлдэл - Баруунаас Хэмжээ авах үйлдэл sizeof Баруунаас Үржүүлэх үйлдэл * Зүүнээс Хуваах үйлдэл / Зүүнээс Үлдэгдэл олох үйлдэл % Зүүнээс Нэмэх үйлдэл + Зүүнээс Хасах үйлдэл - Зүүнээс Зүүн тийш шилжүүлэх << Зүүнээс Баруун тийш шилжүүлэх >> Зүүнээс Бага, бага буюу тэнцүү,их,их буюу тэнцүү <, <= , > ,>= Зүүнээс Тэнцүү, тэнцүү биш == != Зүүнээс Бит ‘БА’ үйлдэл & Зүүнээс Бит ‘XOR’ үйлдэл ^ Зүүнээс Бит ‘БУЮУ’ үйлдэл | Зүүнээс Логик ‘БА’ үйлдэл && Зүүнээс Логик ‘БУЮУ’ үйлдэл || Зүүнээс Нөхцөлт илэрхийлэл ?: Баруунаас Утга олгох үйлдлүүд = += -= /= %= &= ^=

|= <<= >>= Баруунаас

Таслал үйлдэл , Зүүнээс 7.6 switch команд Си хэлэнд тухайн нэг илэрхийлсэн утгаас шалтгаалж олон сонголт хийх шаардлагыг хэрэгжүүлдэг команд байдаг. Бичигдэх хэлбэр : switch (Илэрхийлэл) {

Page 31: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:32

case утга1 : Командууд; Командууд; . . . break; case утга2 : Командууд; Командууд; . . . break; . . . default : Командууд; break; } Энд Илэрхийллийн утгаас олон командуудын аль нь биелэгдэх нь шалтгаална. Хэрэв илэрхийллийн утга нь утга1-тэй тэнцүү бол утга1-ын коммандууд биелэгдэнэ. Хэрэв утга2-той тэнцүү бол түүний командууд биелэгдэх гэх мэт … Харин илэрхийллийн утга тухайн сонголтуудад байхгүй бол default түлхүүр үгийн дараах командууд биелэгдэнэ. switch командыг тухайн хэрэглэх шаардлагаас хамаарч янз янзаар бичиж ашигладаг. Үүнд :

break командыг бичихгүй байж болно. default сонголт байхгүй байж болно. Хамгийн сүүлчийн сонголтын ард break бичих шаардлагагүй.

Гэхдээ дараах дүрмийг зайлшгүй баримтлах ёстой. - илэрхийлэл нь int төрлийн утга буцаах ёстой. - case түлхүүр үгийн хойно зөвхөн тэмдэгтэн болон тоон тогтмол л

бичигдэнэ. - Сонголтын утгууд нь хоорондоо ялгаатай утга байх ёстой. switch-ээс тасалдлын оператор break-ийн тусламжтайгаар гардаг. a=2; switch (a) { case 1 : printf(“ Утга 1 \n”); break; case 2 : printf(“ Утга 2 \n”); case 3 : printf(“ Утга 3 \n”);

break; } Үр дүн нь : Утга 2 Утга 3 Энд 2 гэсэн сонголтыг break –ээр төгсгөөгүй учир шууд дараачийн сонголт руу орж байна. Олон утгаас шалтгаалах командыг биелүүлэхийн тулд switch-ийн зарим сонголтод break бичдэггүй. switch(x) { case2 : case 4: case 6 : case 8: printf(“ Тэгш тоо \n”); break; } switch, if хоёр нь хоёулаа сонголтын командууд бөгөөд олон сонголттой үед switch ашиглах нь илүү тохиромжтой байдаг. if(score>=90) grade=’A’; else if(score>=80) grade=’B’; else if(score>=70) grade=’C’; else if(score>=60) grade=’D’; else grade=’F’;

Page 32: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:33

Эдгээр if-үүдийг нэг л switch орлож чадна. int n; n=score/10; switch(n) { case 10: case 9: grade=’A’; break; case 8: grade=’B’; break; case 7: grade=’C’; break; case 6: grade=’D’; break; default: grade=’F’; break; } Жишээ :

switch(c) { case ‘a’ : printf(“ a үсэг \n”); break; case ‘b’ : printf(“ b үсэг \n”); break; case ‘c’ : printf(“ c үсэг \n”); break;

}

СЭДЭВ 8. ДАВТАЛТ Нэг буюу хэд хэдэн үйлдлийг олон дахин гүйцэтгэх зорилгоор давталтын командуудыг ашигладаг. Си хэлэнд дараах 3 давталтын командыг ашигладаг.

1. Тодорхой давталт ( for ) 2. Нөхцөлт давталт ( while ) 3. Нөхцөлт давталт ( do . . . while )

7.1 Тодорхой давталт буюу for давталт Давтах давталтын тоо тодорхой бол энэ операторыг ашигладаг. Энэ давталтыг тоолуурт давталт ч гэж нэрлэдэг. Бичигдэх хэлбэр : for([<ЭхлэхИлэрхийлэл>];[<ШалгахИлэрхийлэл>];[<АлхамИлэрхийлэл>]) команд; Энэ давталт нь <ШалгахИлэрхийлэл>-ийн утга худал болтол биелнэ. Хэрэв <ЭхлэхИлэрхийлэл> нь <ШалгахИлэрхийлэл>-ийн утгаас хальсан тохиолдолд цикл ганц ч удаа биелэхгүй. <АлхамИлэрхийлэл> нь давталтын тоолуурын утга хэрхэн өөрчлөгдөхийг тодорхойлно.

Page 33: Programchlaliin c hel

Эхлэх утга i=1

i<=10 printf(“%d”,i) i++

Нөхцөл

Командууд

Алхам

1. Хэрэв Шалгах илэрхийллийн утга үнэн бол оператор биелнэ. Дараа нь алхам тодорхойлсон илэрхийлэл бодогдоно.

2. Хэрэв Шалгах илэрхийлэл байхгүй бол түүний утгыг үнэнд тооцож, дээрх маягаар давталт үргэлжилнэ. Ийм тохиолдолд давталт төгсгөлгүй үргэлжилнэ.

3. Хэрэв нөхцөлт илэрхийллийн утга худал бол for операторын хийх үйлдэл төгсөж удирдлага түүний дараагийн операторт шилжинэ.

Жишээн дээр тайлбарлавал илүү ойлгомжтой байх болно. printf(“ Тоолж байна . . . \n”); for(i=1; i<=10; i++) printf(“%d \t”,i); Одоо дээрх программын хэсгийг тайлбарлая. Давталт нь ЭхлэхИлэрхийллээс эхлэх ба i-д утгыг 1 утгыг олгоно. ЭхлэхИлэрхийлэл нь давталтад ердөө ганц удаа буюу хамгийн эхэнд биелэгдэнэ. Дараа нь Шалгах илэрхийлэл бодогдоно. Ингээд 1<=10 нь үнэн учир давталт цааш үргэлжилж, printf функц ажиллан дэлгэцэнд 1 гэж хэвлэнэ. Дараа нь АлхамИлэрхийлэл бодогдон i–ын утга 2 болно. Тэгээд Шалгах Илэрхийлэл бодогдон “Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:34

Page 34: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:35

i<=10 эсэхийг шалгах гэх мэтчилэн давталт үргэлжилнэ. Шалгах Илэрхийллийн утга худал болсон үед давталтаас гарна. Дээрх жишээний үр дүн : Тоолж байна . . . 1 2 3 4 5 6 7 8 9 10 Жишээ 2 : for(i=10; i>0; i--) printf(“%d \t”,i); Жишээ 3 : Давталтын алхам нь 1- ээс ялгаатай байж болно. for(i=1; i<18; i+=3) printf(“%d \t”,i); Мөн for давталтыг хэдэн ч давхраар нь ашиглаж болно. for(i=1, k=1; i<=3; i++) { for(j=1; j<=3; j++) printf(“%d \t”, k++); printf(“\n”); } Жишээ 4 : for(i=0,i=1000; j>i; i++, j/=10) printf(“%d %d”,i,j); Эхлэхдээ i=0, j=1000 дуусахдаа i=3, j=1 утгатай болно. Жишээ 5: 1-ээс 10 хүртэлх тооны нийлбэр ол. #include<stdio.h> int i, sum=0; main() { for(i=1; i<=10; i++) sum+=i; printf(“ %d”, sum); } Зөвлөгөө :

for давталтыг хувьсагчийн утга тодорхой утгаар нэмэгдэх, хасагдах давталтанд ашигла.

for давталтын ШалгахИлэрхийлэл нь зөв илэрхийлэл эсэхийг анхаарч бай. for давталтан дотор ;-аар илэрхийллүүд хоорондоо зааглагддагийг анхаар.

8.2 Нөхцөлт while давталт Хамгийн хялбар төрлийн давталт нь while давталт юм. Бичигдэх хэлбэр : while (<илэрхийлэл>)

Page 35: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:36

{ нэг буюу хэд хэдэн команд; } Илэрхийллийн утга үнэн л байвал давталт үргэлжилнэ. while –ын арын ( ) хаалтны ард ; тавьж болохгүй. Хэрвээ тавьбал while командууд хэзээ ч биелэгдэхгүй. while-ын нөхцөлт илэрхийлэл анх удаагаа шалгагдахдаа буруу бол while-ын командууд ерөөсөө биелэгдэхгүй. ( i<10 ) printf(. . . .) Жишээ : /* Дэлгэц цэвэрлэх */ void cls(void) { int i=0; while(i<25) /* 25 хоосон мөр хэвлэснээр дэлгэц цэвэрлэгдэнэ */ { printf(“\n”); /* Нэг хоосон мөр хэвлэх */ i++; } } Бараг бүх Си компилятор дэлгэц цэвэрлэдэг функцтэй байдаг. Энэ арга нь хэдийгээр муу боловч дэлгэц цэвэрлэдэг аргуудын нэг юм. Харин Turbo Си- д clrscr ( conio.h-д байдаг ) функцээр дэлгэц цэвэрлэнэ. Дээрх жишээнд i-ын утга 0-ээс 25 хүртэл давтана.Учир нь 25 –нь 25 –аас бага биш юм. ( Тэнцүү ) Хэрэв дээрх жишээнд i-ын утгыг өөрчилж өгөөгүй бол давталт мөнхийн болох магадлалтай. 8.3 Нөхцөлт do while давталт while нь do командтай хамт нэгэн давталтыг үүсгэдэг. do … while нь while давталттай бараг адилхан юм. Бичигдэх хэлбэр :

do { нэг буюу хэд хэдэн команд; }

while(<илэрхийлэл>); do давталтын команд нь илэрхийллийн утга худал болтол давтагдана. Давталтын командууд нь дор хаяж нэг удаа биелэгдэх давталтыг do - while ашиглан хийдэг. Нөхцөл нь давталтын командууд биелэгдсэний дараа шалгагддаг.

Page 36: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:37

Дараах программд 0 … 9 тоо ба тэдний нийлбэрийг хэвлэж байна. main() { int count=0; int total=0; do { total+=count; printf(“ тоо = %d , Нийлбэр = %d \n” , count++, total); } while (count<10); } 8.4 Үргэлжлүүлэх команд Бичигдэх хэлбэр : continue; Энэ нь do, for, while давталтын командуудтай хамтарч хэрэглэгдэнэ. Өөрөөр хэлбэл энэ команд нь давталтын командуудын блок дотор хэрэглэгдэнэ. Программ биелж байгаад тухайн давталтын командын блок доторх continue –д удирдлага шилжвэл түүний дараагийн үйлдлүүд биелэхгүй бөгөөд дараагийн цикл шууд эхэлнэ. Жишээ :

i=1; while(i<100) { if (i % 2==0) { i++; continue; } printf(“ %d ”, i++); }

Энэ жишээнд 1 … 99 гэсэн завсраас сондгой тоонуудыг хэвлэж байна. Тэгш утгууд дайралдахад if –ын нөхцөл биелэн, continue команд биелэгдэн дараагийн цикл эхлэнэ. i –ын утга нэмэгдсэн байх тул энэ циклд i сондгой тоо байна. Гэх мэтчилэн бүх сондгой тоог хэвлэнэ. Жишээ : Өмнөх жишээг for давталтаар гүйцэтгэе.

for(i=1;i<100;i++) { if(i % 2==0) continue; printf(“ %d ”,i); }

8.5 Тасалдлын команд

Page 37: Programchlaliin c hel

Программ бичиж байх явцад циклээс ердийн бус аргаар (Давталтын нөхцөлөөс өөр аргаар ) гарах шаардлага тулгардаг. Энэ зорилгыг хэрэгжүүлэх break команд Си хэлэнд байдаг. Бичигдэх хэлбэр : break;

Энэ нь мөн л давталт дотор агуулагдах ба давталтаас гарах үүрэгтэй оператор юм. Үүнийг мөн for, while, do давталтуудаас, мөн switch сонголтоос гарах зорилгоор ашигладаг. Давталт биелж байгаад тасалдлын команд тааралдан биелмэгц удирдлага давталтаас гарна. Өөрөөр хэлбэл break команд биелснээр давталт дуусна. Жишээ : Өмнөх жишээний continue-г break-ээр сольё.

i=1; while(i<100) { if (i % 2==0) { i++; break; } printf(“ %d ”, i++); }

Тэгвэл энд зөвхөн 1 гэсэн утгыг хэвлээд л давталт дуусна. Учир нь i-ын утга 2 болсноор break комманд биелэгдэнэ. 8.6 Удирдлага шилжүүлэх goto комманд Энэ командыг ашиглан программын удирдлагыг нэг цэгээс нөгөөд шилжүүлдэг. Гэхдээ ямар ч программыг энэ коммандыг ашиглахгүйгээр бичиж болдог. Ер нь энэ командыг их хэрэглэх хэрэггүй юм. Учир нь үүнийг их хэрэглэж бичсэн программ зөв бүтэцтэй алгоритм болоход их түвэгтэй. Үүнийг улам ихээр хэрэглэх тусам шийдэхэд төвөгтэй асуудлууд гарч ирдэг. Гэхдээ үүнийг зайлшгүй хэрэглэх зарим тохиолдлууд байдаг. Олон давхар хэрэглэгдсэн давталтаас гарахын тулд энэ командыг ашиглана. Учир нь break командаар давхар давхар давталтаас гарахгүй, зөвхөн дотор талын давталтаас гарна.

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:38

for( . . . ) for( . . . ) { . . . if( Алдаа гарвал) goto error;

Давхар давталтуудаас гарах

} . . .

goto –ээр удирдлага шилжих тэмдэг error : Хэрэглэгчид алдааны тухай мэдээлэл өгөх; Хийж байсан үйл ажиллагаагаа зогсоох; goto командаар удирдлага шилжүүлэхийн тулд удирдлага шилжиж очих газар тэмдэг тавих шаардлагатай. Тэмдэгийг нэрлэхдээ хувьсагч яаж нэрлэдэг шиг нэрлэдэг . Тэмдэг тавих хэлбэр : <Тэмдгийн нэр> : Удирдлага шилжүүлэхдээ :

Page 38: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:39

goto <Тэмдгийн нэр>; Тэмдгийн үйлчлэх хүрээ нь зөвхөн нэг функцээр хязгаарлагдана. Өөрөөр хэлбэл өөр функцд тавьсан тэмдэг рүү goto –г ашиглан удирдлага шилжиж болохгүй.

СЭДЭВ 9. ФУНКЦ Си хэлэнд функцуудыг стандарт ба хэрэглэгчийн гэж 2 ангилдаг. Стандарт функцууд нь урьдчилан тодорхойлогдсон (зохиогдсон) функцууд байдаг ба *.h файлуудад тодорхойлогддог. Харин хэрэглэгчийн функцийг программ зохиогч зохионо. Функц нь программд олон давтан хийгдэх үйлдлүүдийг багасгаж, үйлдлүүдийг бүлэглэж өгдөг.

Хэрэглэгчийн функц тодорхойлох Үндсэн хэлбэр: <буцаах утгын төрөл> <ФункцНэр>(<Аргументийн жагсаалт>) <Аргументуудын зарлалт> { <Локаль хувьсагчдыг зарлах>; . . . <Функцын үндсэн бие буюу Командууд >; . . . return (буцаах утга); } 1. Хэрэв функц утга буцаах шаардлагатай бол функцын нэрийн өмнө тухайн функцээс

буцаах утгын төрлийг бичиж өгнө. Хэрэв функц утга буцаадаггүй бол түүний нэрийн өмнө нь void түлхүүр үгийг бичиж өгнө эсвэл ерөөсөө түлхүүр үг бичихгүй.

2. Хэрэв функц руу аливаа утга дамждаг бол түүнийг хүлээж авах хувьсагчдыг аргументууд гэж нэрлэдэг ба хувьсагчдыг функцын нэрийн ард ( ) хаалтанд таслалаар зааглан бичиж өгнө. Хэрэв функц утга хүлээн авдаггүй бол ( ) хаалтанд юу ч бичихгүй. Аргументуудын төрлийг буюу тэдний зарлалтыг дараагийн мөрд хувьсагч зарладаг шигээр зарлаж өгнө.

3. Локаль хувьсагчдыг зарлах хэсэгт тухайн функц дотор л хэрэглэгдэх хувьсагчдыг зарлаж өгнө.

4. Харин return үйлдлийг ашиглан тухайн функцын үр дүнг түүнийг дуудсан газарт буцаана.

Функцын биеийг { } хаалтанд бичнэ.

Page 39: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:40

Жишээ :

int Max(a,b)

Аргументууд

int a,b; Аргументуудын зарлалт

{ int k; k=(a>b) ? a : b; printf(“ Max= %d”, k);

Буцаах утга

Локаль хувьсагч

return k; Утга буцаах үйлдэл }

Функц нь аргументгүй байж болно. Мөн заавал утга буцаах албагүй. Pascal хэлэнд утга буцаадаггүй функцыг процедур ч гэж нэрлэдэг. Харин Си хэлд бол ялгаа байхгүй бүгд функц юм. void notice() { printf(“ Та түр хүлээнэ үү , бодолт хийж байна . . . \n”); } Хэдийгээр тухайн функц ямар ч аргументгүй ч байсан түүнийг тодорхойлохдоо нэрийнх нь ард () хос хаалтыг заавал бичдэг. Мөн дээрх функц нь утга буцаахгүй учраас return –ыг бичээгүй байна. Утга буцаадаггүй функцыг тодорхойлохдоо функцын нэрийнх нь өмнө void түлхүүр үгийг бичиж өгдөг. Функцыг дуудахдаа нэрээр дуудах ба хэрэв функц аргумент авдаг бол түүүнийг хаалтанд жагсааж өгнө. Дээрх жишээнд үзүүлсэн Max функцыг дуудъя. Max(i,n); Мөн функцыг илэрхийлэлд ашиглаж болно. k = Max(i,n); if (Max(k,100)==100) printf(“ Max = 100 ”);

Функцээс утга буцаах үйлдэл Си хэлэнд функцээс утга буцаахдаа return түлхүүр үгийг хэрэглэдэг. Бичигдэх хэлбэр : return [ ( ] <илэрхийлэл> [ ) ]; Жишээ : return a+b;

return (a+b); return a; return (a);

return үйлдэл гүйцэтгэгдэхэд удирдлага тухайн функцээс гарна. Өөрөөр хэлбэл нэг блокт түүний ард бичигдсэн үйлдлүүд биелэгдэхгүй.

Page 40: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:41

int Sum(int a, int b) { int k; k=a+b; return k; printf(“Sum=%d”,k); Үйлдэл хэзээ ч биелэгдэхгүй }

Функцыг зарлах Функц нь char, float, double гэх мэт янз бүрийн утга буцаадаг. Хэрэв функц int-ээс ялгаатай утга буцаадаг бол түүнийг заавал зарлах шаардлагатай. Функцыг зарлахдаа тухайн функц рүү дамжих аргументын болон буцаах утгын төрлийг зааж өгдөг. float round_n(); /* Функцыг зарлах */ main() { round_n(123.6789, 2); /* Функцыг дуудах нь */ } /* Функцыг тодорхойлолт */ /* Энэ функц нь x тоог n оронгоор нарийвчлана. */ float round_n(x,n) float x; int n; { float factor=1.0; int i; for(i=1;i<=n;i++) factor*=10.0; return ((float)((int)(factor*x+0.5))/factor); } Дээрх жишээнд х тоог таслалаас хойш n оронгоор нарийвчилж байна. Жишээг тоон туршиж үзвэл: 54.6789 тоог 2 оронгоор нарийвчлая. factor –д 10*10 буюу 100 гэсэн утга олгогдоно. Тоогоо үүгээр үржүүлснээр 5467.89 утга гарна. 0.5 –ийг нэмснээр 5468.39 болох ба (int) хувиргалт хийснээр 5468 болно. Энэ утгаа factor –д хувааснаар эцсийн үр дүн 54.68 гарна. Функц нь дараах байдлаар дуудагдаж болно. a) x=round_n(x,2); b) m=3;

z=round_n(x,m); c) if(round_n(cost,2)>100.0)

командууд; Функцыг Си хэлний дурын илэрхийлэлд дотор дуудаж ашиглаж болно. Гэхдээ төрлийн зохицуулалтыг зөв хийх ёстой. Жишээ : power функц int төрлийн утга буцаадаг. Тэгвэл түүнийг дараах илэрхийлэлд ашиглахдаа төрлийн зохицуулалт хийх ёстой. float x; x=(float)power(a,b);

Page 41: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:42

Харин x=power(a,b) байдлаар дуудаж болохгүй. Хэрэв функцыг дуудахдаа түүний нэрийн өмнө буцаах утгын төрлийг заагаагүй бол Си энэ функцын буцаах утгыг int төрөлтэй гэж ойлгоно. Өөрөөр хэлбэл default өгөгдлийн төрөл нь int юм Хэрэв функц үнэхээр юу ч буцаадаггүй бол түүнийг зарлахдаа нэрийн өмнө void түлхүүр үгийг хэрэглэдэг. void print_it(n) Ингэж void гэж тодорхойлж өгснөөр функц зарлалт ба функц дуудалтыг ялгаж өгнө . Жишээнээс үзвэл : int i,j; wizard(); Энэ жишээнд тухайн функцыг ажиллуулахаар дуудаж байгаа юу эсвэл түүнийг зарлаж байгаа юм уу гэдгийг ялгахад түвэгтэй болжээ. Энэ функц нь утга буцаадаггүй учраас түүнийг зарлахдаа төрөл бичихгүй гэвэл энэ нь функц дууддаг бичлэгтэй адилхан болох юм. Иймээс утга буцаадаггүй функцыг зарлахдаа void түлхүүр үгийг хэрэглэдэг. int i,j; void wizard(); Одоо ийм бичлэг хэрэглэсэн тохиолдолд ямар ч түвэгтэй асуудал байхгүй болно. Void төрлийг мөн ямар ч аргумент авдаггүй функцын зарлалт болон тодорхойлолтонд хэрэглэдэг. Ингэж void төрлийг хэрэглэх нь аливаа хоёрдмол шийдлээс зайлсхийдэг сайн талтай. Мөн аргумент авдаггүй функцыг зарлахдаа ч void түлхүүр үгийг ашигладаг.

void Sum(void); main() { Sum(); } Sum()

{ printf(“ Sum = %d”, a+b); }

Функцын аргументууд Функцын тодорхойлолтонд тухайн функцын аргументуудыг жагсааж тодорхойлж өгдөг. print_n(x,y,k) int x,y,k; { } Энэ жагсаалтанд хэдэн ч хувьсагч байж болно эсвэл бүр хоосон ч байсан болно. Функцын тодорхойлолтонд байгаа аргументуудыг тодорхойлсон аргументууд гэж нэрлэнэ. Функцыг дуудахдаа мөн аргументуудыг зааж өгөх бөгөөд тэдгээрийг жинхэнэ аргументууд гэж нэрлэнэ.

Page 42: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:43

Тодорхойлсон болон жинхэнэ аргументууд тоогоороо мөн төрлөөрөө харгалзан тэнцүү байх ёстой боловч Си хэл нь яг ийм хатуу дүрэм баримталдаггүй. Энэ нь Си хэлний бас нэг өргөн боломж юм. Гэтэл бусад хэлэнд харгалзан тэнцүү байх дүрмийг баримталдаг. Си хэлэнд жинхэнэ аргументуудын тоо нь тодорхойлсон тооноосоо бага байж болно. Жишээ нь зарим стандарт функц буюу printf , scanf нь хувьсах тооны жинхэнэ аргументуудтай байдаг.

Төрөл шалгах Си хэл нь хэлний дүрэм нь уян хатан байдаг. Иймд жинхэнэ аргументуудын төрөл нь тодорхойлсон төрөлтэйгээ ижил байх албагүй. Энэ нь тийм ч муу тал биш юм. Жишээ нь 2 тооны ихийг олдог функц зохиоё. Энэ тохиолдолд тоо гэсэн ойлголтонд бодит тоо, бүхэл тоо багтана. Иймээс хатуу дүрэмт хэл Паскал дээр ийм функц бичье гэвэл бодит бүхэл тоон төрөл тус бүр дээр ажиллах 2 өөр функц бичих хэрэгтэй болно. Харин Си хэлэнд ингэх шаардлагагүй. main() { float x,y,z,w,max(); i=5; j=7; m=2; n=(int)max((float)i,(float)j); /* 1 */ z=max(x,y); printf(“%d %f”,n,z); w=max((float)i,x); m=(int)max(y,(float)j); printf(“%f %d”,w,m); } float max(a,b) float a,b; { if(a>b) return a; else return b; } Энд max функц нь float төрлийн утгууд аван, float төрлийн утга буцаасан байна. Иймээс n,m мэтийн бүхэл тоон төрлийн хувьсагчид функцын үр дүнг олгохдоо төрлийн хувиргалт хийх шаардлагатай. Мөн аргументэд нь бүхэл тоон төрлийн хувьсагч олгохдоо (float) төрлийн хувиргалт хийх хэрэгтэй. Дараах жишээнд sqrt функц нь double төрөлтэй аргумент авдаг. Тэгвэл дараах байдлаар дуудсанаар буруу үр дүн үзүүлж болно.

int n; double x; n=7; x=sqrt(n);

Учир нь n аргумент нь sqrt –ийн аргументаас өөр төрөлтэй байна. Тиймээс төрлийн хувиргалтыг дараах 2 аргын аль нэгээр хийх ёстой. a. y=(double)n;

x=sqrt(y); b. x=sqrt((double)n);

Функцээс утга буцаах Бидний өмнө үзсэн байдлаар функцэд аргумент дамжуулахад тухайн утгууд нь функцын мужид дахин нэг хувь хуулагддаг. Иймээс энэ аргументийн утгыг өөрчилсөн ч тухайн

Page 43: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:44

функцэд утгаа дамжуулсан үндсэн хувьсагчийн утга өөрчлөгддөггүй. Ийм байдлаар функцэд аргумент дамжуулахыг утгаар дамжуулах гэж нэрлэдэг. Харин хувьсагчийн утгыг функц дотроос өөрчлөхийн тулд хаягаар дамжуулах гэдэг аргыг хэрэглэдэг. Энэ аргын гол мөн чанар нь функцэд хувьсагчийн утга дамжуулахын оронд хувьсагчийн хаягийг дамжуулдаг. Дараах жишээнд хоёр бүхэл тоон хувьсагчийн утгыг сольдог функцыг үзүүлэв.

swap(m,n) int *m,*n; { int temp; temp=*m; *m=*n; *n=temp; }

Энэ функцыг дуудахдаа swap(&m,&n) байдлаар дуудна. Өөрөөр хэлбэл тухайн функцэд хувьсагчдын утгыг биш тэдгээрийн хаягийг дамжуулах ёстой учраас & үйлдлийг ашиглан хаягийг нь авч функцэд дамжуулж байна. Харин функц дотроо эдгээр хувьсагчдын утгыг уншихдаа заагч хувьсагч дээр ажилладаг унар * үйлдлийг ашиглан тэдгээрийн утгыг уншиж, өөрчилж байна. Дээрх функцын үйл ажиллагааг тайлбарлавал : temp=*m; /* m –ын агуулж байгаа хаягт байгаа утгыг temp –д хийж байна */ *m = *n; /* n –ын агуулж байгаа хаягт байгаа утгыг m хаягт хийж байна */ *m=temp; /* temp-ын утгыг m –ын агуулж байгаа хаягт хийж байна */ Харин int *m,*n; гэсэн бичлэг нь int төрлийн обьект заах n,m хувьсагч зарлаж байна гэсэн үг.

Хадгалах ангилал Бид урьд нь хадгалах ангилалын талаар бага зэрэг үзэж байсан. Хувьсагч зарлахад түүний хадгалах ангилал нь тодорхойлогддог. Хувьсагч зарлах : [ХадгалахАнгилал] [Хувиргагч] Төрөл Идентификатор; Хадгалах ангилал нь хувьсагчийн ажиллах хүрээ ба амьдралын хугацааг тодорхойлдог. default буюу анхдагч хадгалах ангилал нь auto ангилал юм. Өөрөөр хэлбэл хувьсагчийг зарлахдаа хадгалах ангилалыг нь зааж өгөөгүй бол тэр хувьсагч нь шууд auto хадгалах ангилалаар зарлагдана. Ийм хадгалах ангилалтай зарлагдсан хувьсагчийн ажиллах хүрээ нь локал буюу функцын хүрээнд л ажиллана. Мөн амьдралын хугацаа нь функцын ажиллах хугацаагаар хязгаарлагдана. Функцээс удирдлага шилжихэд хувьсагч санах ойгоос арилна. Утга нь тухайн программын амьдралын хугацаанд хадгалагддаг, харин ажиллах хүрээ нь нэг функцын хүрээгээр тодорхойлогддог хувьсагчийг статик хувьсагч гэнэ. Статик хувьсагчийг static түлхүүр үгээр зарлана. Зөвхөн хувьсагч ч биш, функцыг статик ангилалаар зарлаж болно. Хэрэв таны бичсэн С программ хэд хэдэн файлаас тогтдог бол

Page 44: Programchlaliin c hel

статик ангилалаар зарлагдсан функцыг тухайн файлд л хэрэглэх буюу бусад файлаас энэ функцыг ашиглах боломжгүй болно. Бичигдэх хэлбэр : static <төрөл> <хувьсагч>; Жишээ : #include <stdio.h> Count() { static int k=1; printf(“k=%d\n”, k++); } main() { Count(); /* k = 1 */ Count(); /* k = 2 */ Count(); /* k = 3 */ Count(); /* k = 4 */ Count(); /* k = 5 */ } Гадаад хувьсагч болон гадаад функцыг ашиглахдаа түүнийг extern түлхүүр үгээр зарладаг. Өөрөөр хэлбэл таны ашиглах гэж буй функц , хувьсагч нь энэ файлд биш өөр бусад файлд байрладаг үед энэ түлхүүр үгийг ашиглан зарласнаар тэдгээрийг ашиглах боломжтой болно. Зөвхөн глобаль хувьсагчдыг л extern хадгалах ангилалаар тодорхойлж өгнө. Доорх жишээнд хувьсагчдын хадгалах ангилалуудын ялгааг үзүүлжээ. Хүснэгт 9.1 Хадгалах ангилал, ажиллах хүрээ, хугацаа

Түлхүүр үг Ажиллах хүрээ Амьдралын хугацаа auto Локаль Функцын хугацаа static Локаль Программын туршид register Локаль Программын туршид external Бүх файлуудад Байнга external static Нэг файлд Байнга

Дараах жишээнд external хувьсагчийг хэрхэн тодорхойлох болон зарлахыг үзүүлжээ. Prg1.c Prg2.c #include <stdio.h>

int max,sum; Sum(int a,int b) { sum=a+b; } Max(int a,int b) { max=a>b?a:b; }

#include <stdio.h> extern int max,sum; extern int Sum(int,int),Max(int,int); main() { Sum(2,3); Max(2,3); printf(" Sum : %d\n",sum); printf(" Max : %d\n",max); }

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:45

Page 45: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:46

Дээрх 2 файлыг нэгтгэн нэг программ болгохын тулд PRJ файл тодорхойлох шаардлагатай.

Блок бүтэц

Бидний өмнө үзсэнчлэн auto , register, static хувьсагчид нь функц дотор тодорхойлогдвол локаль ажиллах хүрээтэй болдог. Тэгвэл блок дотор локаль ажиллах хувьсагч зарлах боломж Си хэлд байдаг. Ийм хувьсагч нь зөвхөн тухайн блок дотор л ажиллах ба блокоос гарахад устаж үгүй болно. int exam(a1,a2) int a1,a2; { int i, n; . . . { int i,temp; for(i=1;i<n;i++) temp+=i; } . . . } Тухайн блок дотор л i, temp хувьсагчид ашиглагдах бөгөөд блокын гадна эдгээр хувьсагчид ашиглагдах боломжгүй юм. Функц дотор зарлагдсан i хувьсагч, блок дотор зарлагдсан i хувьсагч хоёр нь ялгаатай хувьсагчид юм.

Рекурс

Хэрэглэгчийн функц нь шууд болон шууд бус аргаар өөрөө өөрийгөө дуудах боломж Си хэлэнд байдаг ба үүнийг рекурс гэж нэрлэдэг. Тоог тэмдэгт мөр болгон хэвлэдэг функц дээр жишээ авч үзье. Ингэж хэвлэхийн тулд тооны цифрүүдийг олж хэвлэх шаардлагатай ба цифрүүдийг олоход тэдгээр нь урвуу дарааллаар буюу хойноосоо эхэлж олддог. Иймээс тэдгээрийг зөв дараалалд оруулан хэвлэх шаардлагатай. Үүнийг 2 аргаар гүйцэтгэж болно. Нэгд цифрүүдийг нь хадгалж аваад (массивт) эргүүлэн хэвлэх арга байж болно. Хоёрт рекурс функц бичиж болно. #include <stdio.h> void pr(long n) { if(n<0) { putchar('-'); n=-n; } if(n/10) pr(n/10); putchar(n%10+'0'); } main() { clrscr(); pr(1234); printf("\n"); pr(7654321); printf("\n"); pr(-1234567); printf("\n"); }

Page 46: Programchlaliin c hel

Функц нь өөрийгөө дуудах тохиолдолд шинээр дуудагдах функц нь өөрийн бүх локаль хувьсагчдаа дахин анхны утгыг нь тогтоон үүсгэдэг ба энэ үүссэн хувьсагчид нь өмнөх функцын хувьсагчдаас ялгаатай юм. Хамгийн эхний дуудсан жишээг буюу pr(1234) –г тайлбарлая. n=1234 байна. Функц руу 123 гэсэн утга дамжина. Pr(1234/10)

n=123 байна. Функц руу 12 гэсэн утга дамжина. Pr(123/10)

n=12 байна. Функц руу 1 дамжина. Pr(12/10)

n=1, n%10 => 1 Putchar(‘1’)

n=12, n%10 => 2 Putchar(‘2’)

Putchar(‘3’) n=123, n%10 => 3

Putchar(‘4’) n=1234, n%10 => 4 Үүнийг мөн алхамаар үзүүлбэл :

1. pr(1234); 8. if(1/10) /* Худал */ 2. if(1234/10) 9. putchar(1%10+'0'); Функцээс буцах; 3. pr(123); 10. putchar(12%10+'0'); Функцээс буцах; 4. if(123/10) 11. putchar(123%10+'0'); Функцээс буцах; 5. pr(12); 12. putchar(1234%10+'0'); Функцээс буцах; 6. if(12/10) 13. РЕКУРС дуусав. 7. pr(1);

Дээр үзүүлсэн жишээ нь рекурсын нэг төрөл буюу функц нь шууд өөрийгөө дуудсан байна. Харин шууд бус аргаар рекурс үүсгэж болдог. Энэ нь тухайн функц нь өөрийгөө шууд дуудах бус түүний дуудсан өөр нэг функцээс тухайн функцыг дууддаг арга юм.

Жишээнд Func1 функц нь ажиллах явцдаа Func2 функцыг дуудах ба тэр функц нь эргээд Func1 –ийг дуудах замаар рекурсыг үүсгэж байна.

Func1()

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:47

{ . . . Func2() . . . } Func2() { . . . Func1() . . . } Ингэж рекурс байдлаар функц бичих нь дараах ач холбогдолуудтай байдаг. 1. Программын кодчилолыг бага хэмжээтэй болгох 2. Бичих, ойлгоход хялбар болох

Page 47: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:48

3. Мод гэх мэтийн шатласан зохион байгуулалттай бүтцүүдтэй ажиллах боломжийг бүрдүүлж өгдөг.

TYPEDEF–ээр төрөл тодорхойлох Та энэ командыг ашиглан шинээр төрөл тодорхойлох боломжтой. Бичигдэх хэлбэр : typedef <Төрөл> <Шинэ төрөл>; Жишээ : typedef float real; Энэ команд нь хаана зарлагдсанаас шалтгаалж ажиллах хүрээ нь тодорхойлогддог. Өөрөөр хэлбэл функц дотор зарлагдвал ажиллах хүрээ нь локаль, функцээс гадна зарлагдвал глобаль байна.

void ff() { typedef short int integer; }

СЭДЭВ 10. МАССИВ

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

int name1=101; int name2=202; int name3=303;

Хувьсагчдын тоо ихсэх тохиолдолд тэдгээртэй ажиллахад маш их хүндрэлтэй болдог ба энэ тохиолдолд массив гэж нэрлэгдэх нийлмэл төрлийг ашигладаг. Ижил төрлийн олон утгыг хадгалах боломжтой , өгөгдлийн нийлмэл төрлийг массив гэнэ. Массив нь олон элементтэй матриц мэтээр төсөөлөгдөх бөгөөд элементэд нь хандахын тулд тусгай дугаараар хандана. Өөрөөр хэлбэл массивын элемент бүр тодорхой дугаартай байна. Си хэлэнд массивын дугаарлалт нь 0 гэсэн утгаас эхэлнэ. Массивыг зарлахын тулд хувьсагчийн нэрийн ард [ ] буюу хос хаалт ашиглана. Хос хаалтанд тухайн массивын элементүүдийн тоог бичиж өгнө.

Нэг хэмжээст массивыг зарлах

Нэг хэмжээст массив гэдэг нь шугаман массив юм. <төрөл> <нэр>[<индекс>] Жишээ : int a[5]; int b[100]; Дээрх жишээг массиваар зарлавал :

Page 48: Programchlaliin c hel

Массивын

элементийн төрөл

Массивын агуулж чадах элементийн тоо

int names[4];

names[0]=101; names[1]=202; names[2]=303; names[3]=404;

Хандаж байгаа элементийн дугаар

Массивт утга олгох

Массивын элементэд хандахдаа [ ] хос хаалтыг ашиглана. names[2] гэж хандахад тухайн массивын 3-р элементэд хандана.

Массив санах ойд байрлах

Нэг хэмжээст массив нь санах ойд дараалсан байрлалтай байна. int А[5] массив санах ойд байгаа нь :

A[0] A[1] A[2] A[3] A[4] . . . . . .

Хэрэв sizeof үйлдлийг ашиглан А-гийн хэмжээг олбол 10 гэсэн үр дүнг үзүүлнэ. Учир нь int төрөл нь 2 byte хэмжээтэй ба нийт 5 элементтэй тул 5*2=10 byte юм.

Массивын анхны утгыг олгон зарлах Массивын зарлахдаа түүний элементүүдийн анхны утгыг олгож зарлаж болно. Массивын элементүүдийн анхны утгыг { } хос хаалтанд зарладаг. int val[5]={ 10, 40, 70, 90, 120 }; Ингэж зарласан нь массивын элементүүдэд дараах байдлаар утга олгосонтой ижил юм.

val[0] = 10; val[1] = 40; val[2] = 70; val[3] = 90; val[4] = 120;

Эндээс Си хэлэнд массивын элементүүдийг 0-ээс эхлэн дугаарладаг нь харагдаж байна.

int a[5]={1,2,3,4,5}; /* Эхний 5 элементэд утга олгох */ int b[20]={0,1,2,3,4,5,6,7,8,9}; /* Эхний 10 элементэд нь утга олгож байна. Бусад элементүүд нь 0 утгатай болно. */ float money[10]={ 6.23, 2.45, 8.01, 2.97, 6.41 };

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:49

Page 49: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:50

char grades[5]={‘A’,’B’,’C’,’D’,’\0’}; Жишээнд char төрлийн 5 элементтэй массивт анхны утгыг олгон зарлажээ. Үүнийг мөн дараах аргаар зарлаж болно. char grades[5]=”ABCD”; Массивыг зарлахдаа хос хаалтанд үргэлж элементийн тоог бичиж бай. Харин массивт анхны утгыг олгож зарлахдаа л тоог бичихгүй байж болно. int ages[5]={ 5,27,40,65,92 }; /* Зөв */ int ages[]; /* Буруу */ int ages[] ={ 5,27,40,65,92 }; /* Зөв */ Хэрэв та массивын бүх элементийг 0-ээр дүүргэхийг хүсвэл, дараах бичлэгийг ашиглана. float A[100]={0.0}; /* Бүх элементийг тэглэх */ Жишээнд массивын эхний нэг элементэд л утга олгож байна. Гэвч Си бусад элементийг нь 0-ээр дүүргэдэг. Өөрөөр хэлбэл массивын ядаж нэг элементэд анхны утгыг нь олговол Си бусад элементийг нь 0-ээр дүүргэдэг гэсэн үг.

Массивын элементэд утга олгох түүнийг илэрхийлэлд ашиглах

a[1]=20; a[6]=a[2]; a[0]=i; a[1]=b[i]; x=y+a[3]*a[i]; printf(“ 3-р элемент : %d”,a[3]); Массивын элементэд утга олгох мөн элемент дээрх үйлдлүүд нь ердийн хувьсагчид утга олгох, илэрхийлэлд оролцох хэлбэртэй ижил болно.

Массивын элементүүдийг гараас унших Массивын элементийг хэрэглэх нь хувьсагч ашиглах хэлбэртэй ижил учир элементүүдийг гараас уншихдаа дараах байдлаар уншина. scanf(“%d”,&a[1]); scanf(“%d”,&a[2]); scanf(“%d”,&a[3]); Массивын элементүүдийг гараас уншихдаа цикл ашиглах нь тохиромжтой.

int a[10], i; for(i=0;i<10;i++) scanf(“%d”,&a[i]);

Жишээнд циклийн тоолуур 0 -оос 9 хүртэлх утгыг авах бөгөөд scanf функц нь a[0]. . . a[9] элементүүдийн утгуудыг гараас уншина.

int a[10],i;

Page 50: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:51

for(i=0;i<10;i++) { printf(“ A[%d] =”,i); scanf(“%d”,&a[i]); } Үр дүн нь : A[0]= 101 A[1]= 122 . . . A[9]= 222

Массивын элементүүдийг хэвлэх Массивын зарим элементийг хэвлэхдээ дараах байдлаар хэвлэнэ. printf(“ %d ”,a[0]); printf(“ %d ”,a[1]); printf(“ %d ”,a[2]); Массивын бүх элементүүдийг хэвлэхдээ цикл ашиглах нь тохиромжтой.

int a[10], i; for(i=0;i<10;i++) printf(“ A[%d]=%d \n”, i, a[i]);

Үр дүн нь :

A[0]= 101 A[1]= 122 . . . A[9]= 222

Хоёр хэмжээст массив

Си хэлэнд нэгээс олон хэмжээст массив зарлан ашиглах боломжтой байдаг. Олон хэмжээст массив дээр хэрхэн ажиллахыг 2 хэмжээст буюу хүснэгт маягийн массив дээр авч үзье. Ийм массивын элементэд мөр, багана гэсэн 2 дугаараар хандана. Дугаарлах утга нь мөн л 0-ээс эхэлнэ.

А массив (3 мөр 4 баганатай)

A[0][0] A[0][1] A[0][2] A[0][3] A[1][0] A[1][1] A[1][2] A[1][3] A[2][0] A[2][1] A[2][2] A[2][3]

2 хэмжээст массив санах ойд байрлах

A[0][0] A[0][1] A[0][2] A[0][3] A[1][0] A[1][1] A[1][2] . . . Өөрөөр хэлбэл :

1-р мөр 2-р мөр 3 мөр

Page 51: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:52

Хоёр хэмжээст массивыг зарлах <төрөл> <нэр>[<индекс>][<индекс>]

эсвэл <төрөл> <нэр>[][<индекс>] Жишээ :

int a[3][4]; int b[2][5];

Массивын анхны утгыг олгох 2 хэмжээст массивын анхны утгыг олгохдоо 1 хэмжээст массивын анхны утга олгодог байдалтай төстэй буюу энэ массивыг нэг хэмжээст массивуудын массив байдлаар ойлгохоор бичлэгтэй байдаг.

int a[3][2]={{1,2},{3,4},{5,6}};

int b[2][3]={{1,2,3},{4,5,6},{7,8,9}}; int A[3][3]={1,2,3,4,5,6,7,8,9};

2 хэмжээст массивын элементэд утга олгох түүнийг илэрхийлэлд ашиглах

a[1][1]=20; a[6][2]=a[2][2]; a[0][2]=i; a[1][1]=b[i][1]; x=y+a[3][1]*a[i][1]; printf(“[1,3]-р элемент : %d”,a[1][3]);

2 хэмжээст массивын элементүүдийг гараас унших Массивын элементийг хэрэглэх нь хувьсагч ашиглах хэлбэртэй ижил учир элементүүдийг гараас уншихдаа дараах байдлаар уншина. scanf(“%d”,&a[1][1]); scanf(“%d”,&a[2][1]); scanf(“%d”,&a[3][1]); 2 хэмжээст массивын элементүүдийг гараас уншихдаа давхар цикл ашиглах нь тохиромжтой. Нэг цикл нь мөрийн дугаарыг тодорхойлно. Нөгөө нь баганын дугаарыг тодорхойлно.

Page 52: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:53

int a[2][2], i,j; for(i=0; i<2; i++) for(j=0; j<2; j++) { printf(“ A[%d][%d]=”,i,j); scanf(“%d”,&a[i][j]); }

Үр дүн нь :

A[0][0]= 101 A[0][1]= 122 A[1][0]= 122 A[1][1]= 222

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

int a[2][2], i,j; for(i=0; i<2; i++) { for(j=0; j<2; j++) printf(“%7d”, a[i][j]); printf(“\n”); }

Үр дүн нь :

101 122

122 200

СЭДЭВ 11. ТЭМДЭГТ МӨР Тэмдэгт мөр төрлийн хувьсагч Тэмдэгт мөр нь ASCII системээр кодлогдсон тэмдэгтүүдийн дараалал юм. Тэмдэгтүүд нь : үсэг : ABC. . .XYZ, abc. . . xyz

Page 53: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:54

цифр : 0123456789 тусгай тэмдэгт : + - * / | \ $ # . . . Тэмдэгт мөр төрлийн хувьсагчийг Си хэлэнд char түлхүүр үгээр , массив хэлбэрээр зарлана. char a[15]; Си хэлэнд тэмдэгт мөр хамгийн ихдээ 256 byte эзэлдэг. Дээр зарлагдсан а хувьсагч санах ойд хэдэн byte эзэлж буйг тодорхойлохдоо sizeof үйлдлийн тусламжтайгаар мэднэ. Жишээ : printf(“ %d ”, sizeof(a)); Үр дүн : 15 Тэмдэгт мөрт дараах хэлбэрүүдээр анхны утга олгож зарладаг. char a[8]=”HELLO”; char Name[25]=”Batbold”; char grades[5]={‘A’,’B’,’C’,’D’,’\0’}; Тэмдэгт мөрийг гараас уншихдаа & тэмдэгтийг scanf-д ашигладаггүй. scanf(“%d”,a); Си хэлэнд ‘\0’ тэмдэгт нь мөрийн төгсгөлийг заана. Дээрх жишээнд grades массивын 4-р элементэд ‘\0’ элементийг олгосон нь тухайн тэмдэгт мөр дуусч буйг тодорхойлж байна. Тэмдэгт мөр төрлийн хувьсагчийг илэрхийлэлд ашиглах Тэмдэгт мөр төрлийн хувьсагчдыг шууд илэрхийлэлд оролцуулах боломж байдаггүй. Өөрөөр хэлбэл тэмдэгт мөр төрөл нь олон элементээс бүрдэх нийлмэл төрөл учир нэг элемент нь л илэрхийлэлд оролцохоос биш бүхлээрээ илэрхийлэлд оролцдоггүй. Дараах үйлдлүүд нь боломжгүй үйлдлүүд юм.

char a[15]; a=”Hello !!!”; a=a+” World”;

Иймд эдгээр үйлдлүүдийг функцээр гүйцэтгэдэг. Өөрөөр хэлбэл утга олгох үйлдэл, тэмдэгт мөр залгах үйлдлийг гүйцэтгэдэг функцууд байдаг. Тэмдэгт мөр хувьсагчид утга олгох strcpy() функц Бичигдэх хэлбэр : char *strcpy(char *s1, const char *s2); / s2 тэмдэгт мөрийн утгыг s1 тэмдэгт мөрт олгох / Жишээ 1 : #include<stdio.h> char str[]=”ПХ-ын 1”,str1[]=”ПХ-ын 2”;

Page 54: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:55

main() { strcpy(str,str1); /* str=str1 */ printf(“ Тэмдэгт мөр = %s \n”,str); } Үр дүн : Тэмдэгт мөр = ПХ-ын 2 Жишээ 2 : #include<stdio.h> char str[]=”ПХ-ын 1”; main() { strcpy(str,”ПХ-ын 2”); printf(“ Тэмдэгт мөр = %s \n”,str); } Тэмдэгт мөрүүдийг залгах strcat функц Бичигдэх хэлбэр : char *strcat(char *s1, const char *s2); Жишээ : #include <string.h> char str[100],str1[100]; main() { printf(“ str= ”); scanf(“%s”,&str); /* ПХ-ын */ strcat(str,“2a”); /* s1=s1+s2 */ printf(“%s\n”,str); } Үр дүн : ПХ-ын 2а Мөр төрлийн хувьсагчдыг харьцуулах нь strcmp() функц Бичигдэх хэлбэр : int strcmp(const char *s1, const char *s2); Хэрэв буцаах утга нь : ==0 бол s1==s2 ( Тэнцүү ) >0 бол s1>s2 ( s1 нь их ) <0 бол s1<s2 ( s2 нь их ) Жишээ : . . . i=strcmp(“aac”,“aab”); switch(i) { case 0: printf(“Тэнцүү тэмдэгт мөр”); break; default: printf(“Ялгаатай тэмдэгт мөр”); } . . .

Page 55: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:56

Тэмдэгт мөрийн уртыг тодорхойлох strlen функц Бичигдэх хэлбэр : int strlen(char *s); Тэмдэгт мөрийн уртыг тооцохдоо төгсгөлийн “\0” тэмдэгтийг үл тооцно. Жишээ :

#include<string.h> char str[]=”ПХ-ын 1”; main() { int count; count=strlen(str); printf(“ Тэмдэгт мөрийн урт = %d”, count); }

Үр дүн : Тэмдэгт мөрийн урт = 7

СЭДЭВ 12. БҮТЭЦ ТӨРӨЛ

Бүтэц төрөл нь утгын хувьд хоорондоо уялдаа холбоотой олон төрлийн хувьсагчдын олонлогоос тогтох нийлмэл төрөл юм. Бүтэц гэж нэрлэгдэх өгөгдлийн хэлбэр нь янз бүрийн төрөлтэй өгөгдлүүдийг хамтатган тодорхойлж, хэрэглэгчдэд шинэ өгөгдлийн хэлбэрийг үүсгэхэд хэрэглэгдэнэ. Бүтэц төрлийг тодорхойлох хэлбэр нь : struct [<Бүтцийн нэр>] { [<төрөл1> <хувьсагчийн нэр1>] [<төрөл2> <хувьсагчийн нэр2>] [<төрөл3> <хувьсагчийн нэр3>] . . . . . [<төрөл n> <хувьсагчийн нэрn>] }; Оюутны мэдээллийг хадгалах бүтэц үүсгэх жишээ авч үзье. struct student {

char name[20]; int age;

float GPA; };

Бүтэц төрлийг тодорхойлохдоо struct түлхүүр үгийг ашигладаг. Бүтцэд агуулагдах хувьсагчдыг бүтцийн гишүүн гэнэ.

Бүтэц төрлийн хувьсагч зарлах хэлбэр :

Page 56: Programchlaliin c hel

struct <бүтцийн нэр> <хувьсагчийн нэр>;

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:57

Жишээ :

1. struct student sum;

Төрлийн нэр

Хувьсагчийн нэр

2. struct student { char name[15]; int age;

}sum; 3. struct { char name[15];

int age; }sum;

Бүтэц төрлийн хувьсагчид анхны утга олгох Бүтэц төрлийн хувьсагчид дараах хэлбэрээр анхны утгыг олгоно. struct student sum={ “Бат”, 25 };

Бүтцийн гишүүн элементэд хандах Бүтэц доторхи элементэд хандахын тулд . тэмдгийг хэрэглэнэ. student . age = 18;

Бүтэц төрөлтэй массив Бүтэц төрөлтэй массивыг зарлах хэлбэр : struct <Бүтэц төрөл> <Массивын нэр>[хэмжээ] ; Жишээ нь : struct student { char name[20]; Бүтэц төрлөө

тодорхойлох int grade; };

struct student sw102[100]; Массиваа зарлах

sw102[0].name sw102[0].grade

Page 57: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:58

sw102[1].name sw102[1].grade sw102[2].name sw102[2].grade sw102[3].name sw102[3].grade

. . . . . . sw102[100].name sw102[100].grade

Бүтэц төрлийн массив санах ойд байрлах

name1 grade1 Name2 grade2 . . . Бүтэц төрөл ашигласан жишээ программ : #include<stdio.h> struct student { char name[20]; int age; float GPA; }; struct student Who; /* Who нь student бүтэцтэй */ int i,j; main() { printf(“ Оюутны нэр : “); scanf(“%s”,Who.name); printf(“ Оюутны нас : “); scanf(“%d”,&Who.age); printf(“ Оюутны дүн : “); scanf(“%f”,&Who.GPA); printf(“ Оюутны нэр : %s \n”,Who.name); printf(“ Оюутны нас : %d \n”,Who.age); printf(“ Оюутны дүн : %f \n”,Who.GPA); }

Бит талбар Утгыг түүний авч болох хязгаарт нь тохируулж хадгалах зорилгоор бит талбар гэж нэрлэгдэх талбарыг ашигладаг. Жишээ нь Оюутны хүйсийг тэмдэглэхэд 0 ба 1 гэсэн хоёр утга л хангалттай . 0 -эм , 1-эр гэж тооцоё. Тэгвэл бид түүнийг хадгалахдаа хамгийн багаар 1 byte хэмжээтэй хувьсагч буюу char төрлийн хувьсагч зарлана.

char Sex; Тэгвэл зөвхөн 0 ба 1 гэсэн утгыг хадгалахын тулд 8 бит зарцуулж байна. Хэрвээ хувьсагчдыг битээр зарлаж болдог бол үүнд зөвхөн 1 л бит хангалттай. Си хэлэнд ийм байдлаар бит талбарыг зарлах боломж байдаг.

Page 58: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:59

Жишээ : #include <stdio.h> struct AAAAA { int Sex : 1; /* 0..1 */ int k : 2; /* 0..3 */ int l : 5; /* 0..31*/ int s : 2; /* 0..3 */ int m : 6; /* 0..63 */ } AA; main() { AA.Sex=1; printf(“%d\n”,AA.Sex); AA.k=3; printf(“%d\n”,AA.k); AA.l=31; printf(“%d\n”,AA.l); AA.s=3; printf(“%d\n”,AA.s); AA.m=63; printf(“%d\n”,AA.m); printf(“%u\n”,AA); }

ENUM төрөл Си хэлэнд олонлогийг enum түлхүүр үгийн тусламжтайгаар тодорхойлдог. Дараах жишээнд долоо хоногийн өдрүүдийг төлөөлсөн нэрүүдтэй Weekdays олонлогийг тодорхойлов. Жишээ : #include <stdio.h> enum DAYS { Dabaa=1, Migmar=2, Lhagva=3, Purev=4, Baasan=5, Bimba=6, Nim=0 } Weekdays; main() { int i; printf(“ Day = ”); scanf(“%d”,&i); switch(i) { case Dabaa : printf(“Даваа”);break; case Migmar : printf(“Мягмар”);break; case Lhagva : printf(“Лхагва”);break; case Purev : printf(“Пүрэв”);break; case Baasan : printf(“Баасан”);break; case Bimba : printf(“Бямба”);break; case Nim : printf(“Ням”);break; default : printf(“Долоо хоногийн өдөр биш ”); } }

Page 59: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:60

UNION төрөл Энэ төрлийг ашиглан ялгаатай төрлүүдийн хувьсагчдыг хугацааны өөр агшинд хадгалах хувьсагчийг зарладаг. Өөрөөр хэлбэл хугацааны өөр өөр агшинд тухайн үүрэнд өөр өөр төрлийн өгөгдлүүдийг хадгалах бололцоотой гэсэн үг. Түр зуур утга хадгалах зорилгоор хэрэглэгдэх temp хувьсагч дээр жишээ авч үзье. #include<stdio.h> union TEMPERARY { int n; float m; }temp; int i=10,j=20; float k=10.1,l=20.1; main() { temp.n=i; i=j; j=temp.n; printf("%d %d\n",i,j); temp.m=k; k=l; l=temp.m; printf("%f %f\n",k,l); } Энэ программыг харвал ердийн struct ашигласнаас нэг их ялгараад байх зүйлгүй байна. Өөрөөр хэлбэл үүнийг дараах хэлбэрээр бас бичиж болно. #include<stdio.h> struct TEMPERARY { int n; float m; }temp; int i=10,j=20; float k=10.1,l=20.1; main() { temp.n=i; i=j; j=temp.n; printf("%d %d\n",i,j); temp.m=k; k=l; l=temp.m; printf("%f %f\n",k,l); } struct болон union –ны гол ялгаа нь санах ойг хэрхэн ашиглаж байгаа явдал юм. Өмнөх жишээнд зарласан temp нэртэй хувьсагч нь санах ойд 2byte эзэлнэ. Учир нь union –ны гишүүн элементүүд санах ойг ээлжлэн, хамтарч эзэмшдэг. Харин сүүлийн жишээнд буй temp хувьсагч нь санах ойд 4byte эзэлнэ. Яагаад гэвэл энэ нь struct төрөл юм. Иймд union төрлийн гишүүн элементүүд нь санах ойг хамтарч эзэмшдэг.

Page 60: Programchlaliin c hel

СЭДЭВ 13. ЗААГЧ ТӨРӨЛ

Заагч гэдэг бол обьектыг заах хувьсагч юм. Заагч төрлийн хувьсагчийг зарлахдаа өмнө нь (*) од тавина. Заагч хувьсагч нь санах ойд байрласан хувьсагчийн хаягийг нь агуулна. Заагч хувьсагч ба ердийн хувьсагчийн ялгааг дараах жишээн дээр авч үзье.

int Var=10; int *pVar=&Var;

Дээрх хоёр хувьсагч нь санах ойд дараах байдлаар байрлана. 900 901 902 903 904

10 901 901- р хаяг нь Var хувьсагчийн байрлах санах ойн үүр 902- р хаяг нь pVar хувьсагчийн байрлах санах ойн үүр

Эндээс харвал ердийн хувьсагч нь утга агуулдаг, харин заагч хувьсагч нь санах ойд байрласан хувьсагчийн хаягийг нь агуулна. Ө.х тухайн хувьсагчийн утганд шууд бусаар хандах арга юм. Заагч хувьсагч нь төрөлт ба төрөлт биш гэсэн хоёр янз байдаг.

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:61

Төрөлт заагч Төрөлт заагч гэдэг нь тодорхой төрөлтэй хувьсагчийг заах заагчийг хэлнэ.

int i=10; /* int төрлийн хувьсагч зарлах */ int *k; /* int төрлийн заагч */

Бүхэл тоон төрлийн заагч нь зөвхөн бүхэл тоон (int) төрлийн хувьсагчийг, обьектийг заана. Заагчид утга олгоогүй байх үед тэр ямар ч обьектийг заахгүй, харин түүнд ямар нэг хувьсагчийн хаягийг олгохдоо & үйлдлийг ашиглана.

Заагчид анхны утга олгох Заагч хувьсагчид анхны утга олгохдоо дараах байдлаар олгоно. int i; int *p=&i; /* p заагчид i хувьсагчийн хаягийг олгох буюу i хувьсагчийг заалгах */ Заагч хувьсагчийг ямар нэг обьектийг заалгахдаа дараах байдлаар заалгана. int i;

Page 61: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:62

int *p; p=&i;

/* p заагчид i хувьсагчийн хаягийг олгох буюу i хувьсагчийг заалгах */

Заагчийн зааж байгаа обьектод хандах

Заагчийн зааж байгаа обьектод хандахдаа * тэмдгийг ашиглана. Жишээ : int i=3, *p;

p=&i; /* p заагчид i хувьсагчийн хаягийг олгох буюу i хувьсагчийг заалгах */

printf(“ i =%d”, *p); /* 3 гэсэн утга хэвлэгдэнэ */

*p=10; /* i=10 гэсэнтэй ижил */ printf(“ i=%d”, i); /* 10 гэсэн утга хэвлэгдэнэ */ Дараах программд char төрөлт заагч ашигласан байна. #include <stdio.h> main() { char c = 'Q'; char *ch = &c; printf("%c %c\n", c, *ch); c = 'Z'; printf("%c %c\n", c, *ch); *ch= 'Y'; printf("%c %c\n", c, *ch); }

Заагч дээрх үйлдлүүд

1. Заагчийг олгох Нэг заагчийг нөгөөд нь олгох боломжтой. Жишээ нь : int i=100,*p1,*p2; p1=&i; /* i-г заалгах */ p2=p1; /* p1-ийн обьектийг заалгах */ printf(“%d \n”,*p1);/* 100 -г хэвлэх */ printf(“%d \n”,*p2);/* 100 -г хэвлэх */

Page 62: Programchlaliin c hel

2. Заагчийг харьцуулах Хоёр заагчийг хооронд нь харьцуулж болно. Жишээ: int x=2,y=1; int *p1, *p2; p1=&x; p2=&y; if(p1!=p2)

printf(“2 заагч тэнцүү биш”); else printf(“2 заагч тэнцүү”); 3. Арифметик үйлдлүүд Заагч дээр нэмэгдүүлэх (++), хорогдуулах (--), нэмэх (+), хасах (-) үйлдлүүдийг гүйцэтгэж болно. Төрөлт заагч ашиглаж байгаа үед эдгээр үйлдлүүдийг гүйцэтгэхэд заагчийн төрлийн хэмжээгээр нэмэгдэж, хорогдоно. int i, *p1=&i; p1++, p1--, p1+=2, p1-=2 . . . гэх мэт үйлдэл хийж болно. int *p1=&i; p1++; /* Хаяг = хаяг + 2 */ p1--; /* Хаяг = хаяг - 2 */ p1+=2; /* Хаяг= хаяг + 4 */ p1-=2; /* Хаяг= хаяг - 4 */

Дараах зурагт 900 –р хаягт байрлах i хувьсагчийг заасан p заагч дээр үйлдэл хийхэд заагч хэрхэн шилжихийг харуулав. 900 901 902 903 904

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:63

I i P P++ P+=2

Заагч дээр хийгдэх эдгээр үйлдлүүд нь зөвхөн заагчийн агуулж байгаа хаягийг өөрчилнө. Түүнээс биш хаягт байгаа өгөгдөлд хандахгүй. Хаягт байгаа өгөгдлийг өөрчлөхийн тулд дараах байдлаар хандах хэрэгтэй.

int *p1=&i; ++*p1; /* i=i+1 */ (*p1)++; /* i=i+1 */ *p1=*p1+2; /* i=i+2 */ *p1-=2; /* i=i-1 */

Page 63: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:64

Жишээ : #include <stdio.h> main() { int i=10, *p1=&i; printf(“%d \n”, ++*p1); /* 11 */ printf(“%d \n”, i) /* 11 */ }

Төрөлт заагч дээр үйлдэл хийхэд түүний хаяг нь төрлийнх нь хэмжээгээр нэмэгдэж буурдаг.

Жишээ : #include <stdio.h> main() { char c[10]=”ababababab”; int i, *p1=c;

for(i=0;i<5;i++) printf(“%c ”,*p1++);

} Үр дүн: a a a a a

Жишээ : #include <stdio.h> main() { char c[10]=”ababababab”; int i, *p1=c+1; for(i=0;i<5;i++) printf(“%c ”,++*p1++); }

Үр дүн:

c c c c c

Дараах үйлдлүүдийг заагчид зөвшөөрдөггүй. - Хоёр заагчийг нэмэх - Ялгаатай обьект дээрх 2 заагчийг хасах - Бодит тоотой заагчийг нэмэх - Заагчийг үржүүлэх - Заагчийг хуваах

Заагчийг шилжүүлэх үйлдэл

Page 64: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:65

“ Программчилалын хэл1 буюу Си хэл ” хичээлийн лекцийн төлөвлөгөө (32 цаг)

7 хоногууд Цаг Бүлэг Сэдэв 1 2.25 1,2 Хэлний элементүүд Цагаан толгой

Хувьсагчид ба тогтмолууд Өгөгдлийн төрөл

2 3.4 3,4 Хэлний элементүүд Өгөгдлийн төрөл Тогтмолыг зарлах Логик үйлдлүүд Нөхцөлт оператор

3 3.11 5,6 Хэлний элементүүд Илэрхийлэл Арифметик үйлдэл Бит үйлдэл Үйлдлүүдийн дараалал, зэрэглэл

4 3.18 7,8 Си программын бүтэц Холболтын хэсэг Тогтмолуудыг зарлах хэсэг Хувьсагчийг зарлах хэсэг Глобаль хувьсагч Функцүүдийг зарлах хэсэг Үндсэн функц

5 3.25 9,10 Си хэлний операторууд Утга олгох оператор Хэрэглэгчээс утга унших функц Дэлгэцэнд мэдээлэл хэвлэх функц Хэвлэх форматууд Нөхцөлт операторууд (if, switch)

6 4.1 11,1 2

Си хэлний операторууд Давталтын оператор ( for ) Нөхцөлт давталт ( while, do . . while ) Удирдлага шилжүүлэлт оператор ( continue, break ) Шилжүүлэлт ( goto )

7 4.8 13,14 Тэмдэгт мөр хувьсагч Тэмдэгтэн мөр тогтмол Тэмдэгтэн мөр хувьсагч дээр хийх үйлдлүүд Мөр төрлийн хувьсагчийг жиших Функцууд

8 4.15 15,16 Хэрэглэгчийн функц Хэрэглэгчийн функц Локаль хувьсагч ( static, extern, register ) Функцийн параметр Функцээс утга буцаах & үйлдэл

Page 65: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:66

9 4.22 17,18 Өгөгдлийн нийлмэл төрөл Массив Массив дээр хийгдэх үйлдлүүд Олон хэмжээст массив Бүтэц төрөл

10 4.29 19,20 Өгөгдлийн нийлмэл төрөл Бүтэц төрөлтэй массив Бүтэц доторхи бүтэц Төрөл тодорхойлох ( typedef ) Бүтэц төрөлтэй хувьсагчийг функцэд дамжуулах Union, Бит талбар

11 5.6 21,22 Өгөгдлийн заагч төрөл Заагч ба хаяг Заагч дээрх илэрхийлэл Төрөлт биш заагч

12 5.13 23,24 Өгөгдлийн заагч төрөл Заагч ба функц Заагч ба массив Олон хэмжээст массив ба заагч Заагч ба бүтэц

13 5.20 25,26 Өгөгдлийн заагч төрөл Заагчийн заагч Заагч ба мөр тэмдэгт Бүтэц төрлийн массив ба заагч

14 5.27 27,28 Оролт ба гаралт Урсгал нээх, хаах Урсгалаас унших урсгалд бичих Урсгалын заагч тогтоох

15 6.3 29,30 Оролт ба гаралт Текст горим Формат хэлбэрээр оруулах , гаргах Файл нээх , хаах

16 6.10 31,32 Оролт ба гаралт Файлаас унших, бичих Консоль ба порт руу оруулах, гаргах

Page 66: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:67

Хичээл 1

Си хэлний элементүүд

Page 67: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:68

1. Си хэлний элементүүд -Үсэг -Тогтмолууд -Нэр (идентификатор) -Түлхүүр үг -Тайлбар

1.1 Си хэлний цагаан толгой

-Үсэг ба цифр (А, В... Z, a,b...z, 0,1,2...9) -Хоосон зай буюу пробелын тэмдэгтүүд ( хоосон зай , табуляци,мөр шилжүүлэх...) -Тусгаарлагч тэмдэгтүүд (, . ; : ? ‘() %{} ^<> } ! / \ ~_# & - = + * гэх мэт … ) -Тусгай тэмдэгтүүд ( Дэлгэц принтерт мэдээлийг гаргах буцаах үйл ажилгаанд ашиглагдана)

\n - Шинэ мөрөнд шилжих \t - Хэвтээ мөрт зай шилжих \v - Босоо мөрт зай шилжих \b - Нэг тэмдэгт урагшлах \r , \f, \a, \`, \``, \\, \dd, \xdd...

printf(`` Нийт элемент : % d \ n `` ) printf (`` String \ b ``)

-Үйлдэл ( ! - + - * / % ,<< >> ,< <= >> = == ! = & | && || ? : ++-- +=-= * = / = % = >> = << = & = | =^)

Page 68: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:69

1.2 Си хэлний тогтмолууд -Бүхэл тоон тогтмолууд -Бодит тоон тогтмол -Тэмдэгтэн тогтмол -Тэмдэгтэн мөр тогтмол

1.2.1 Бүхэл тоон тогтмол ( Int, unsigned int , long, unsigned long )

10т 8т 16т <цифрүүд> 0<цифр> 0x<цифр> 0..9 (цифр нь 0..9) (цифр нь 0..9,

A-F, a-f) Ж: 14750 Ж: 0723 Ж: 0xAB

1.2.2 Бодит тоон тогтмол

( double, float ) <цифрүүд><exp-ын тэмдэг>±<цифрүүд> Жишээ : 1.5e3 1.5e-3

1.2.3 Тэмдэгтэн тогтмол үсэг + цифр + тусгай тэмдэгт + . . . Бичигдэх нь : ’<утга>’ Жишээ : ‘a’ , ‘b’

1.2.4 Тэмдэгтэн мөр тогтмол

Page 69: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:70

Бичигдэх хэлбэр : “<утга>“ Жишээ : “abc123 456 ?!: “

1.3 Нэр (идентификатор) Программд ашиглагдах функц, тэмдэг, хувьсагчийн нэр зэргийг нэрлэдэг. Нэр нь үсгээр эхэлсэн , доогуураа зураастай тэмдэгт, цифр, нэг буюу хэд хэдэн дараалсан латин үсэг байж болно.

• Нэрийн урт <= 32 тэмдэгт • Том жижиг үсгүүд ялгаатай тооцогдоно.

1.4 Түлхүүр үг auto, break, case, char, continue, do, default, double, else, extern, enum, float, for, if, goto, int, long, return, register, short, signed,

static, sizeof, struct, switch, union, typedef, unsigned, void, while Тусгай түлхүүр үг far, const, huge, near, pascal . . .

1.5 Тайлбар Бичигдэх хэлбэр : /* <Тэмдэгтүүд> */ Жишээ : /* Программ зохиогч : Билл Гейтс Бичсэн хугацаа : 1998.12.31 - 1999.01.01 Хувилбар : 1.00 */

2. Төрөл , Үйлдэл, Илэрхийлэл

2.1 Хувьсагчийн нэр

• Хувьсагчийн нэрийг үсгээр эхлэх

Page 70: Programchlaliin c hel

• Хувьсагчийг түлхүүр үгтэй ижлээр нэрлэж болохгүй. ( do, while , if , int, float , case . . . )

• Хувьсагчдыг гүйцэтгэж байгаа үүрэгтэй нь зохисон нэрээр нэрлэх • Дотоод хувьсагч ялангуяа индекс зэргийг богино , гадаад хувьсагчийг

арай уртаар нэрлэхэд тохиромжтой.

2.2 Өгөгдлийн төрөл

Бүх өгөгдлийг төрлийнх нь хувьд 2 ангилна. - Скаляр - Нийлмэл бүтэц

Скаляр Заагч

Арифметик Бүхэл тоо Бодит тоо

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:71

Нийлмэл Массив Бүтэц Тоочих Нэгдэл

2.2.1 Заагч Заагч гэдэг бол обьектыг заах хувьсагч юм. Заагч хувьсагчийг зарлахдаа өмнө нь (*) тэмдгийг ашигладаг. Бичигдэх хэлбэр : <төрөл>*<нэр> Жишээ : unsigned int *point; char *text; Тодорхойгүй заагчийн бичигдэх хэлбэр : void *<нэр>; Жишээ : void *box; float x; box=&x; (float *)box++;

Page 71: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:72

2.2.2 Бүхэл тоон төрөл

• char • int • long • short

Төрөл Хэмжээ Хязгаар

unsigned char 1b 0..255 char 1b -128..127 unsigned int 2b 0..65535 int 2b -32768..32767 unsigned short 2b 0..65535 short 2b -32768..32767 unsigned long 4b 0..4294967295 long 4b -2147483648..2147483647

unsigned 0..2n-1 (n=битийн тоо)

Бүхэл тоон хувьсагчийг зарлах

Бичигдэх хэлбэр : <төрөл><нэр>

Жишээ : int count; char Summary; short mas;

Хувьсагч зарлахдаа түүний анхны утгыг тодорхойлж болно.

Жишээ : char st=’a’; int k=0;

2.2.3 Бодит тоон төрөл float - Дан нарийвчлалтай бодит тоо double - Өргөтгөсөн нарийвчлалтай бодит тоо long double - Өргөтгөсөн нарийвчлалтай long тоо

Төрөл Хэмжээ Хязгаар

float 4b 3.4e-38 . . . 3.4e+38 double 8b 1.7e-308 . . . 1.7e+308

Page 72: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:73

long double 10b 3.4e-4932 . . . 1.1e+4932 Хувьсагчийг зарлах Бичигдэх нь : <төрөл><утга> Жишээ : float count; double Summary; long double mas;

2.2.4 Массив, түүнийг зарлах Нэг төрөлтэй хэсэг элементийг массив гэнэ. Бичигдэх хэлбэр : <төрөл> <нэр>[<индекс>] <төрөл> <нэр>[<индекс>][<индекс>]

эсвэл <төрөл> <нэр>[] <төрөл> <нэр>[][<төрөл>] Жишээ : char mass[10][10]; Int mas[][20]; /* мөрийн урт нь тодорхойлогдсон массив */ float a[100]; char b[]; /* хэмжээс нь тодорхойгүй нэг хэмжээст массив*/

• Массивын индекс 0-ээс эхэлнэ. • Массивын нэр нь эхний элементийн хаяг байдаг. а=Хаяг(a [0])

Массивын анхны утгыг олгох Жишээ : Int a[]={1,2,3,4,5}; /* Эхний 5 элементэд утга олгож байна */ Int b[20]={0,1,2,3,4,5,6,7,8,9}; /* Бусад элементүүд нь 0

утгатай болно. */

Page 73: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:74

Массивын элементэд утга олгох

a[1]=20; a[6]=a[2]; a[0]=i; a[1]=b[i];

mas[5][1]=10; mas[5][2]=11;

Page 74: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:75

Хичээл 2

Нийлмэл төрлүүд, логик операторууд

2.2.5 Бүтэц Бүтэц гэж нэрлэгдэх өгөгдлийн хэлбэр нь янз бүрийн төрөлтэй өгөгдлүүдийг хамтатган тодорхойлж, хэрэглэгчдэд шинэ өгөгдлийн хэлбэрийг үүсгэхэд хэрэглэгдэнэ. Бичигдэх хэлбэр нь : struct [<Бүтцийн нэр>] { [<төрөл1> <хувьсагчийн нэр1>] [<төрөл2> <хувьсагчийн нэр2>] [<төрөл3> <хувьсагчийн нэр3>] . . . . . [<төрөл n> <хувьсагчийн нэрn>] };

Page 75: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:76

Жишээ : struct student { char name[20]; int age; float GPA; }; struct student Who; /* Who нь student бүтэцтэй */ struct student Mas[10]; /* Mas нь student бүтэцтэй массив */ int i,j; main() { printf(“ Оюутны нэр : %s \n”,Who.name); printf(“ Оюутны нас : %d \n”,Who.age); printf(“ Оюутны нэр : %f \n”,Who.GPA); }

2.2.6 Union ( нэгдэл )-г зарлах union нь өөр өөр төрлийн өгөгдлүүдийг санах ойд нэг газар хадгалах арга юм. Бичигдэх хэлбэр нь : union <Нэгдэлийн Нэр> { <төрөл1> <хувьсагч1>; <төрөл2> <хувьсагч2>; <төрөл3> <хувьсагч3>; . . . . . <төрөл4> <хувьсагч4>;

}

Page 76: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:77

Жишээ : union students { char first_name[12]; char last_name[12]; int age; } union students Who; union students Mas[20];

main() { printf(“ Оюутны нэр : %s \n”,Who.name); printf(“ Оюутны нас : %d \n”,Who.age); printf(“ Оюутны нэр : %f \n”,Who.GPA); }

2.2.7 Enum ( Тоочих )-г зарлах Зарим тохиолдолд олон дахин өөрчлөгдөхгүй хувьсагчдад тоон утга оноон тоочих хэлбэрээр зарлаж болно. Тоон утга нь -32768 . . . 32767 утгын хязгаарт багтах ёстой. Бичигдэх хэлбэр : enum <Төрлийн нэр> { <Нэр>=<утга>,

<Нэр>=<утга>, . . . }

эсвэл

Page 77: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:78

enum <Төрлийн нэр> { <Нэр>,

<Нэр>, . . . } Жишээ : enum DAYS{ даваа, мягмар,лхагва,пүрэв,баасан,бямба,ням }Weekday;

2.3 Тогтмолыг зарлах Си хэлэнд тогтмолыг зарлах үндсэн 2 арга байдаг.

1. #define түлхүүр үгээр тогтмолыг зарлах 2. const түлхүүр үгээр зарлах

1. #define

Бичигдэх хэлбэр нь : #define <Тогтмолын нэр> <утга> Жишээ : #include <stdio.h> #define MAXCOUNT 10 int Mas[MAXCOUNT]; main() { for(I=1;I<MAXCOUNT;I++) printf(“ Value = %d”,I); }

Page 78: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:79

2. const Бичигдэх хэлбэр : const <төрөл> <Нэр>=<утга>; Жишээ : const float pi=3.1415; const int Max=100; Тогтмолыг ингэж зарласны дараа үндсэн программд дараах үйлдлүүдийг хийхийг хориглоно. main() { pi=3.1; Max=50; pi=pi+1; }

2.4 Нөхцөлт илэрхийлэл Сонголтын үйлдлийг гүйцэтгэхдээ if . . . else . . . түлхүүр үгүүдийг ашигладаг. Жишээ : if(a>b) { i=1; printf(“ А хувьсагчийн утга их байна ”); }

Page 79: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:80

else printf(“ B хувьсагчийн утга их байна ”);

Си хэлний үйлдлүүд 2.5 Логик операторууд

Си хэлэнд хоёр буюу түүнээс дээш нөхцөл шалгасан илэрхийлэл тохиолддог бөгөөд үүнийг шийдэхийн тулд логик операторыг хэрэглэнэ.

1. <Ба> үйлдэл && 2. <Буюу> үйлдэл || 3. <Үгүйсгэл> үйлдэл !

Дээрх үйлдлүүд нь зүүнээс баруун тийш гүйцэтгэгдэнэ.

<БА> буюу && үйлдэл Шалгагдаж байгаа нөхцөлүүд бүгд үнэн бол эцсийн үр дүн үнэн байна. Үр дүн нь int төрлийн утгатай ба Үнэн=1, Худал=0 гэсэн тус тусын харгалзах утгатай байна. Жишээ 1 : #include <stdio.h> int a=1,b=2; char c=’k’; main() { if (a=1 && b=2 && c=’k’)

Page 80: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:81

printf(“ Бүх шалгалтууд үнэн байна”); else printf(“Аль нэг нь, магадгүй бүгд худал байж ч болно.”); } Жишээ 2 : 1 && 1 && 1 = 1 /* Үнэн && Үнэн && Үнэн =Үнэн */ 1 && 0 && 1 = 0 /* Үнэн && Худал && Үнэн =Худал */ 0 && 0 && 0 = 0 /* Худал && Худал && Худал =Худал */

<БУЮУ> үйлдэл || Шалгагдаж байгаа нөхцлүүдийн зөвхөн нэг нь буюу түүнээс дээш тооны нөхцөл ҮНЭН бол үр дүн ҮНЭН гарна. Жишээ 1 : #include <stdio.h> int a=1,b=2; char c=’k’; main() { if (a=1 || b=1 || c=’a’) printf(“ Нөхцөлүүдийн аль нэг нь үнэн байна”); else printf(“Нөхцөлүүд бүгд худал байна.”); } Жишээ 2 : 1 || 1 || 1 = 1 /* Үнэн || Үнэн || Үнэн =Үнэн */ 1 || 0 || 1 = 1 /* Үнэн && Худал && Үнэн =Үнэн */ 0 || 0 || 0 = 0 /* Худал && Худал && Худал =Худал */

<ҮГҮЙСГЭЛ> үйлдэл буюу !

Page 81: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:82

Нөхцөлийн үр дүнг урвуугаар хөрвүүлнэ. Өөрөөр хэлбэл ҮНЭН утгыг ХУДАЛ, ХУДАЛ утгыг ҮНЭН болгоно. Жишээ 1 : int i=10; main() { if (!(x=10)) printf(“ Хувьсагчийн утга 10-аас ялгаатай. ”); else printf(“ Хувьсагчийн утга 10-тай тэнцүү. ”); } Жишээ 2 : ! 1 = 0 /* !Үнэн =Худал */ ! 0 = 1 /* !Худал =Үнэн */ Үйлдэл Тайлбар Илэрхийлэл Х Y Үр дүн

! Үгүйсгэл !x true False false True

&& БА x&&y true true True true false False false true False false false False || БУЮУ x||y true true True true false True false true True false false False

Page 82: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:83

Хичээл 3

Илэрхийлэл, үйлдлүүд, биелэх дараалал

Илэрхийлэл

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

Жишээ : (x + y - 10) * 10

Page 83: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:84

Илэрхийлэлд хэрэглэгдэх үйлдлүүдийг УНАР , БИНАР гэж ангилдаг. Унар үйлдэл : Зөвхөн ганц хувьсагч (эсвэл тогтмол) дээр

гүйцэтгэгдэх үйлдэл ба үйлдлийн тэмдэгийг хувьсагчийн өмнө бичдэг.

Бинар үйлдэл : Хоёр хувьсагчийн хооронд ( тогтмолуудын

хооронд ) үйлдэл хийгдэх ба үйлдлийн тэмдэгийг хувьсагчдын дунд бичдэг.

Жишээ : -i үед (-) нь унар үйлдэл юм. x + y үед (+) нь бинар үйлдэл юм. Си хэлэнд арифметик, логик үйлдлүүдийг илэрхийлэлд өргөн ашигладаг. Арифметик үйлдлүүд Бинар үйлдэл : + - * / % Унар үйлдэл : - Жишээ 1 : Үйлдлүүдийн хийгдэх дараалал | x=(-3) + 4 * 5 - 6 int X; | x=((-3)+(4*5))-6 | x=((-3+20) - 6) X=-3+4*5-6; | x=(17-6) x=11 Жишээ 2 : | Үйлдлүүдийн хийгдэх дараалал | x=(-3) * 4 % (-6) / 5 Int X; | x=((-3)*4)% (-6) / 5 | x=(((-3)*4)%(-6))/ 5 X=-3*4%-6/5; | x=((-12 % -6) / 5) | x=(0/5) x=0

Page 84: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:85

Арифметик үйлдлүүдийн зэрэглэл

Үйлдэл Зэрэглэл Ангилал - Их Унар үйлдэл

* / % Дунд Үржих, хуваах + - Бага Нэмэх хасах

Харьцуулах үйлдэл Хоёр илэрхийллийн үр дүнг жишиж “үнэн”, “худал” ( int төрөлтэй ) утга буцаах үйлдлийг харьцуулах үйлдэл гэнэ. Си хэлэнд дараах харьцуулах үйлдлүүд байдаг. >, <, >=, <= 2 үр дүнгийн аль нь их болохыг шалгах == 2 үр дүнгийн утга тэнцүү эсэхийг шалгах != 2 үр дүнгийн утга ялгаатай эсэхийг шалгах Нэмэгдүүлэх ба хорогдуулах үйлдэл

X=X+1; X++; Y=Y-1; Y- - ;

++ Утгыг нэгээр нэмэгдүүлэх - - Утыг нэгээр хорогдуулах Жишээ 1 : x++; x--; y++; y--; ++x; --x; ++y; --y; Хувьсагчийн аль талд бичигдсэнээс шалтгаалан үйлдлүүдийн илэрхийлэлд үзүүлэх нөлөө өөрчлөгддөг. ++(Хувьсагч), --(Хувьсагч) Илэрхийлэл бодогдохоос өмнө тухайн хувьсагчийн утга нэмэгдэх (хасагдах) ба нэмэгдсэн (хасагдсан) утгаараа илэрхийлэлд оролцоно.

Page 85: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:86

(Хувьсагч)++, (Хувьсагч)-- Илэрхийлэл бодогдсоны дараа тухайн хувьсагчийн утга нэмэгдэх (хасагдсан) ба нэмэгдээгүй (хасагдаагүй) утгаараа илэрхийлэлд оролцоно. Жишээ 2 : I=0; Printf(“ Тоо = %d ”, I++); /* 0 гэсэн утга хэвлэгдэнэ */ Printf(“ Тоо = %d ”, ++I); /* 2 гэсэн утга хэвлэгдэнэ */ Жишээ 3 : I=0; J=I+++10; Printf(“ I=%d, J=%d’,I,J); /* I=1 J=10 */ Бит үйлдлүүд

Си хэлэнд дараах 6 бит үйлдлийг ашигладаг. 1. & бит БА үйлдэл 2. | бит БУЮУ үйлдэл 3. ^ бит XOR үйлдэл 4. << бит дүрслэлийг нь зүүн тийш шилжүүлэх үйлдэл 5. >> бит дүрслэлийг нь баруун тийш шилжүүлэх үйлдэл 6. ~ үгүйсгэл

x1 x2 x1 & x2 x1 | x2 x1^x2 ~x1 1 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 1 1 0 0 0 0 0 1

XOR үйлдэл нь 2 бит нь ялгаатай бол 1 (TRUE), адил бол 0 (FALSE) гэсэн үр дүн буцаадаг.

Жишээ 1 : x1=1; x2=2; printf(“ %d ”, x1&x2); /* 0 */

Page 86: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:87

printf(“ %d ”, x1&&x2); /* 1 */ 00000001 TRUE & & 00000010 TRUE ------------ ---------- 00000000 = 0 TRUE Жишээ 2 : x=1; x=x<<2; /* x=x * 22= x * 4 */ 00000001 << 2 ------------ 00000100 = 4 Жишээ 3 : x=8; x=x>>2; /* x=x / 23=x / 4 */ 00001000 >>2 ------------ 00000010 Жишээ 4 : x=10; x=x<<3; printf(“%d”,x); 00001010 <<3 ------------ 01010000 = 64+16=80 Жишээ 5 :

Page 87: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:88

x=3; y=2; z=1; printf(“%d”,x^y&~z); --------------------------- (x^(2&-1))=(3^2)=1 ~z= 00000001 y&~z= 00000010 x^(y&(~z))= 00000011 ~ & 11111110 ^ 00000010 ------------- --------------- -------------- 11111110 00000010 00000001 буюу эцсийн үр дүн 00000001 = 1

Үйлдлүүдийн зэрэглэл

Үйлдэл Зэрэглэл Ангилал ( ) Хаалтууд

- , &(төрөл), sizeof(), ! , ~ ,

++ , - -, ? :

Их

Унар төрлийн үйлдлүүд

* , / , %, <<, >>, &, ^, |

Дунд Үржих төрлийн

+, -, &&, || Бага Нэмэх төрлийн ==, !=, >, <, >=,

<= Харьцуулах

төрлийн =, +=, -=, /=,

%=, &=, ^=, |= Утга олгох

төрлийн

Илэрхийлэлд үйлдлүүдийн биелэх дараалал буюу чиглэл

Бидний мэддэг арифметик илэрхийлэлд ижил зэрэглэлтэй үйлдлүүдийн хувьд ЗҮҮН-> БАРУУН чиглэлээр буюу аль эхэнд оршихыг нь эхэлж боддог.

Page 88: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:89

Жишээ 1: x*y * k гэвэл эхлээд x*y дараа нь гарсан үр дүнг нь k-аар үрждэг буюу энэ нь зүүнээс баруун дарааллаар илэрхийллийг бодож байна. Тэгвэл Си хэлэнд үйлдлүүд үүний эсрэг чиглэлд бодогдож болдог.

Үйлдлүүд Биелэх дараалал ( ) [ ] -> . Зүүнээс баруун тийш ! ~ ++ -- + - * &(төрөл) sizeof() Баруунаас зүүн тийш * / % Зүүнээс баруун тийш + - Зүүнээс баруун тийш << , >> Зүүнээс баруун тийш <, <= , > ,>= Зүүнээс баруун тийш == != Зүүнээс баруун тийш & Зүүнээс баруун тийш ^ Зүүнээс баруун тийш | Зүүнээс баруун тийш && Зүүнээс баруун тийш || Зүүнээс баруун тийш ?: Баруунаас зүүн тийш = += -= /= %= &= ^= |= <<= >>= Баруунаас зүүн тийш | , Зүүнээс баруун тийш

Жишээ 6 : x=1; x=!x|x; ((!TRUE) | x)= (FALSE | 1)= (0 | 1)=1 0 | x = x , 1 & x = x Утга Олгох үйлдлүүд

Page 89: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:90

Утга олгох үйлдлээр аливаа нэг илэрхийллийн эцсийн үр дүн утга олгох үйлдлийн хувьсагчид олгогдоно. Утга олгох үйлдэлийн бичигдэх хэлбэр : <үйлдэл>=<илэрхийлэл>; <үйлдэл> нь: +, -, *, /, %, <<, >>, &, ^, | Жишээ 1:

i=i+2; i+=2; k=k*10; k*=10; j=j<<4; j<<=4; x=x*(y+1); x*=y+1; Жишээ 2 : x=20; x*=y=z=6; -------------------------- x*=(y=(z=6)) /* z=6 */ x*=(y=6) /* y=6, z=6 */ x*=6 /* x=x*6 */ x=120; /* Үр дүн 120 */ Жишээ 3 : x=1; z=4; x==(y=z); -------------------------------------- (x==(y=z)) /* y= 4; z=4; x=1; */ (1==4) /* Үр дүн FALSE буюу 0 */ Жишээ 4 : x=2; y=1; z=0; z+=-x++ + ++y; ---------------------------- z+=((-(x++))+(++y)) z+=((-2)+2) /* Үйлдэл гүйцэтгэгдсэний дараа x=3, y=2 болно. */

Page 90: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:91

z+=0; z=0+0; 0 /* Эцсийн үр дүн 0 байна */ Нөхцөлт илэрхийлэл 2 ( ? : )

Бидний өмнө товчхон үзсэн if else нөхцөлт оператороос энэ үйлдлийн ялгаа нь түүнийг илэрхийлэлд ашиглаж болдогоороо ялгаатай. Бичигдэх хэлбэр : Илэрхийлэл1 ? Илэрхийлэл2 : Илэрхийлэл3 Илэрхийлэл1 -ийн утга Үнэн байвал илэрхийлэл2 Худал байвал илэрхийлэл3 -ийн утга энэ илэрхийллийн үр дүн буюу утга болдог. Жишээ 1 : z=(a>b) ? a : b; /* z=MAX(a,b) */ Жишээ 2 : x=3, y=3, z=1 z+=x<y ? x++ : y++; ---------------------------- (z+=((x>y) ? (x++) : (y++))) (z+=(y++)) (z+=3) (z=z+3) ( Үр дүн x=3, y=4, z=4 )

Page 91: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:92

Хичээл 4

Си программын бүтэц

Си программын бүтэц

1. Холболтын хэсэг 2. Тогтмолуудыг зарлах хэсэг 3. Хувьсагчийг зарлах хэсэг 4. Функцүүдийг зарлах хэсэг 5. Үндсэн функц

Page 92: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:93

1.Холболтын хэсэг

Программд стандарт функц процедур холбох шаардлага тулгардаг бөгөөд холболтыг #include түлхүүр үгийн тусламжтайгаар гүйцэтгэнэ. Формат : #include <Файлын нэр> эсвэл #include “Файлын нэр” Файлын нэр нь тухайн функцуудыг агуулах .h өргөтгөлтэй файлын нэр байна. Эдгээр файлууд c:\tc\include санд байрлана.

Файлуудын жишээ :

• stdio.h - Үндсэн оролт гаралтын функцүүд энэ файлд тодорхойлогдоно printf - Дэлгэцэнд өгөгдөл хэвлэх scanf - Гараас утга унших . . .

• stdlib.h - Төрөл бүрийн хөрвүүлэлтийн функц, программын удирдлага шилжүүлэх функцууд байна. atoi - Тэмдэгт мөрийг тоо болгох itoa - Тоог тэмдэгт мөр болгох . . .

• alloc.h , malloc.h - Санах ойтой харьцдаг функцууд • math.h - Математик функцууд

cos() - Косинус олох sin() - Синус олох log() - Логарифм олох sqrt() - Тооны кв язгуур олох pow() - х тоог у зэрэгт дэвшүүлэх

• ctype.h - Тэмдэгтийг шалгах, өөрчлөх функцуудыг агуулна. isalpha() - Тэмдэгт нь үсэг мөн эсэхийг шалгана. isdigit() - Тэмдэгт нь тоо мөн эсэхийг шалгана. . . .

• time.h - Он сар өдөр болон цагтай ажиллах функцуудыг агуулна. clock() - Программ эхэлснээс хойших хугацааг буцаах time() - Системийн идэвхтэй цагийг буцаах

• conio.h - Дэлгэцтэй ажиллах функцуудыг агуулна. gotoxy() - Курсорын байрлалыг өөрчлөх

Page 93: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:94

cprintf() - Өнгө зааж өгч хэвлэх • string.h - Тэмдэгт мөртэй ажиллах функцууд

strcpy() - Нэг тэмдэгт мөрийг нөгөөд олгох функц strcat() - Хоёр тэмдэгт мөрийг залгах функц

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

1. const float pi=3.14; 2. #define MAX 100

3. Хувьсагчийг зарлах хэсэг

Программд хэрэглэгдэх глобаль хувьсагчдыг энд зарлана. Формат : <Хувьсагчийн төрөл> <Хувьсагчийн нэр>; Жишээ : int i,j; char c; Глобаль хувьсагч Глобаль хувьсагч гэдэг нь тухайн программын аль ч хэсэгт харагдах , утгыг нь өөрчилж болох хувьсагч юм. Глобаль хувьсагчийг дараах 2 шинж чанараар нь ялгана.

- Программын аль ч функц , процедур дотроос түүний утгыг хэрэглэж, өөрчилж болдог.

- Түүний амьдрах хугацаа нь программыг дуусан дуустал үргэлжилнэ.

4. Функцүүдийг зарлах хэсэг

Энд хэрэглэгчийн тодорхойлсон функц , процедуруудыг (дэд программ) байрлуулна. Дэд программ нь өөрийн гэсэн нэртэй ба үндсэн программын хаанаас нь ч нэрээр нь дуудаж хэрэглэж болдог. Функцын нэр(параметрүүд) { <Хувьсагчдыг зарлах хэсэг> Локаль хувьсагч

Page 94: Programchlaliin c hel

<Функцийн бие> } Локаль хувьсагч

- Зөвхөн тухайн функц дотроо хэрэглэгдэнэ. - Амьдрах хугацаа нь функцын ажиллах хугацаа юм.

5.Үндсэн функц

Си хэлэнд программын үндсэн функц нь main нэртэйгээр тодорхойлогддог. Үндсэн функцээс программ эхэлж ажиллана. Ө.х Си хэл дээр бичигдсэн программын хамгийн анхны ажиллах функц нь main функц юм.

main() { <Хувьсагч зарлах хэсэг> <Үндсэн программын хэсэг> }

Программын жишээ :

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:95

#include <stdio.h> #include <conio.h>

Õîëáîëòûí õýñýã

#define pr printf const float pi=3.14;

Òîãòìîë çàðëàõ õýñýã

Page 95: Programchlaliin c hel

int i,j,n; Ãëîáàëü õóâüñàã÷ çàðëàõ

õýñýã PrintPI()

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:96

{ int k; pr(“Тоо=%d”,k); pr(“pi тоо=%f”,pi);

Õýðýãëýã÷èéí ôóíêö òîäîðõîéëîõ õýñýã

} main()

Ëîêàëü õóâüñàã÷

çàðëàõ õýñýã

¯íäñýí ôóíêö çàðëàõ õýñýã

{ int k; pr(“ Now I,ll print pi number ”); PrintfPI(); }

Ëîêàëü õóâüñàã÷

çàðëàõ õýñýã

Page 96: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:97

Хичээл 5

Си хэлний операторууд

Хэрэглэгчээс утга унших функц ( scanf )

Энэ функцыг ашиглан форматласан өгөгдлийг хэрэглэгчээс уншина. Бичлэг : int scanf(const char * format,. . .); буюу int scanf(“Форматласан тэмдэг мөр”,Хувьсагч1,

Хувьсагч2, . . . ХувьсагчN);

Page 97: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:98

Форматласан тэмдэгт мөр : Тусгай тэмдэгтүүд болон ердийн тэмдэгтүүдийг ашиглаж бичсэн мөр бөгөөд хэрэглэгч ямар хэлбэрээр хувьсагчдыг оруулахыг тодорхойлно. Буцаах утга : Амжилттай уншигдсан талбаруудын тоо Ашиглагдах тусгай тэмдэгтүүд

%d signed int төрлийн утгыг төлөөлнө. %I signed int %o unsigned int (8-т тооллын систем) %u unsigned int %x unsigned int (16-т тооллын систем) %X unsigned int (16-т) %f Бодит тоон утга [-]dddd.ddd %e Бодит тоон утга [-]d.ddd e [+/-]ddd %c Зөвхөн нэг тэмдэгт %s Тэмдэгт мөр %% % тэмдэгт %p XXXX:YYYY санах ойн хаяг

%hd, %hi, %ho, %hx

short int

%ld, %li, %lo, %lx

long int

%le, %lE, %lf, %lg

double

%Le, %LE %Lf, %Lg

long double

Жишээ 1 : main() { int i; char c; float f; char Name[20]; scanf(“%d”,&i); scanf(“%c”,&c); scanf(“%f”,&f); scanf(“%s”,Name); }

Page 98: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:99

Жишээ 2: main() { int i,j,k; scanf(“%d %d %d”,&i,&j,&k); } /* 75 100 50 */ Жишээ 3 : main() { int year , month, day, i; printf(“ Date : ”); scanf(“%d . %d . %d”,&year, &month, &day); } Үр дүн :

Date : 1999 . 1 . 17

Дэлгэцэнд мэдээлэл хэвлэх printf - Форматласан өгөгдлийг дэлгэцэнд хэвлэх функц int printf(const char *format,...); Буцаах утга : Амжилттай хэвлэгдсэн өгөгдлийг тоог буцаана. printf(“Форматласан мөр”,Хувьсагч1,Хувьсагч2,... ХувьсагчN); Форматласан мөр гэдэг нь тухайн функцээр ямар ямар хувьсагчдыг хэвлэхийг тодорхойлсон тэмдэгт мөр байна. Тэмдэгт мөрийг бичихдээ өмнө үзсэн тусгай тэмдэгтүүдийг ашиглана. Жишээ 1 : main() { float k,k1;

Page 99: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:100

k=378.786; k1=3456.4; printf(“%f %e”,k,k1); } 378.786 3.45640e+03 Жишээ 2 : main() { int y,k1; k1=30399; y=6787; printf(“%10d %8d \n”,y,k1); } Жишээнд у хувьсагч харгалзах 4 орон, үлдэгдэл 6 нь хоосон зай, к1 хувьсагчийн 5-н цифр, 3-н хоосон зайг хэвлэнэ. Жишээ 3 : main() { float y, k1; k1=30399; y=6787; printf(“%9.2f %18f \n”,y ,k1); } Үр дүн : 6787.00 30399.000000000000

Курсорын байрлалыг удирдах тусгай тэмдэгтүүд

Эдгээр тэмдэгтүүд нь printf функцэд ашиглагдах бөгөөд \ тэмдэгтэй хослон бичигдэнэ. \b - Зүүн тийш нэг тэмдэгт шилжих \n - Шинэ мөрөнд шилжих \r - Мөрийн эхэнд очих \t - Хэвтээ мөр табуляци \v - Босоо табуляци

Page 100: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:101

\\ - \ тэмдэгтийг өөрийг нь дүрслэх \” -“ тэмдэгтийг дүрслэх \’ -‘ тэмдэгтийг дүрслэх \nnn - Тэмдэгтийн тоон утга ( 8-т тоолол) \0xnn - Тэмдэгтийн тоон утга (16-т тоолол) Жишээ : printf(“\007 Анхаар, сигнал дуугарлаа ! ”);

Сонголтын оператор ( if, switch) 1. IF оператор

Үндсэн формат : if (Илэрхийлэл) илэрхийлэл1; else илэрхийлэл2; Хэрэв Илэрхийлэл = Үнэн бол Илэрхийлэл1 биелэгдэнэ, худал бол Илэрхийлэл2 биелэгдэнэ. Хэрэв Илэрхийлэл1 эсвэл Илэрхийлэл2 нь нэгээс олон үйлдлээс тогтох бол түүнийг { } хос хаалтанд бичиж өгнө. Жишээ 1 : if (i>0) if(j>1) { x=i; i=0; } else { x=1; y=10; j=k; } Жишээ 2 : if (i>0) { if(j>i) x=j; } else x=1; Хэрэв хаалт хэрэглээгүй бол Си хэлний компилятор else

түлхүүр үгийг хамгийн ойрын if операторт харгалзуулна.

2. SWITCH оператор

Page 101: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:102

Энэ оператор нь тодорхой хувьсагчийн утга, эсвэл илэрхийллийн утгаас хамаарч харгалзах үйлдэл хийх оператор юм. Бичигдэх хэлбэр : switch (Илэрхийлэл) { case утга1 : Үйлдлүүд; Үйлдлүүд; . . . break; case утга2 : Үйлдлүүд; Үйлдлүүд; . . . break; . . . default : Үйлдлүүд; break; }

- case түлхүүр үгийн хойно зөвхөн тэмдэгтэн болон тоон тогтмол л бичигдэнэ.

- Вариантын тогтмолууд хоорондоо ялгаатай утгатай байх ёстой.

- default түлхүүр үгийн дараах оператор нь switch-ийн илэрхийллийн утга ямар ч вариантын тогтмолтой ижил биш үед хэрэглэгдэнэ.

- switch-ээс тасалдлын оператор break-ийн тусламжтайгаар гардаг.

Жишээ 1: switch(c) { case ‘A’ : row++; break; case ‘B’ : col++; break; default : sum++; } Жишээ 2: switch(m) { case 1 : if(a>0) b=3; break; case 2 : b=3; k=0; break; case 3 : k=0; } Жишээ 3: switch(c)

Page 102: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:103

{ case ‘a’ : case ‘b’ : case ‘c’ : d=d+1; break; }

Page 103: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:104

Хичээл 6

Си хэлний операторууд

Давталтын оператор Нэг буюу хэд хэдэн үйлдлийг олон дахин гүйцэтгэх зорилгоор давталтын операторуудыг ашигладаг. Си хэлэнд дараах 3 давталтын операторыг ашигладаг.

1. Тодорхой давталт ( for )

Page 104: Programchlaliin c hel

2. Нөхцөлт давталт ( while ) 3. Нөхцөлт давталт ( do . . . while )

Тодорхой давталт ( for )

Давтах давталтын тоо тодорхой бол энэ операторыг ашигладаг. Энэ давталтыг тоолуурт давталт ч гэж нэрлэдэг. Бичигдэх хэлбэр : for([<Эхлэх утга>];[<Нөхцөлт илэрхийлэл>];[<Илэрхийлэл Алхам>]) үйлдэл; Энэ давталт нь <нөхцөлт илэрхийлэл>-ийн утга худал болтол биелнэ. Хэрэв <эхлэх утга> нь <нөхцөлт илэрхийлэл>-ийн утгаас хальсан тохиолдолд цикл ганц ч удаа биелэхгүй. <Илэрхийлэл алхам> нь давталтын тоолуурын утга хэрхэн өөрчлөгдөхийг тодорхойлно.

i=1 i<10 printf(“%d”,i) i++

1. Хэрэв нөхцөлт илэрхийллийн утга үнэн бол оператор биелнэ. Дараа нь алхам тодорхойлсон илэрхийлэл бодогдоно.

2. Хэрэв нөхцөлт илэрхийлэл байхгүй бол түүний утгыг үнэнд тооцож, дээрх маягаар давталт үргэлжилнэ. Ийм тохиолдолд давталт төгсгөлгүй үргэлжилнэ.

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:105

Page 105: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:106

3. Хэрэв нөхцөлт илэрхийллийн утга худал бол for операторын хийх үйлдэл төгсөж удирдлага түүний дараагийн операторт шилжинэ.

Жишээ 1: for(i=1; i<10; i++) j=i; Энэ жишээнд i-гийн утга 1-ээс 10 хүртэл өөрчлөгдөх ба 10 гэсэн утгатай болмогц давталтаас гарна. Жишээ 2: for(i=1; i<10; i++) { j=i; printf(“%d ”,i); } Жишээ 3: for(i=1; (j=i)<10; i++); Жишээ 4: for(i=0,i=1000; j>i; i++, j/=10) printf(“%d %d”,i,j); Эхлэхдээ i=10, j=1000 дуусахдаа i=3, j=1 утгатай болно. Жишээ 5: 1-ээс 10 хүртэлх тооны нийлбэр ол. #include<stdio.h> int i, sum=0; main() { for(i=1; i<=10; i++) sum+=i; printf(“ %d”, sum); } Жишээ 6: n! олох программ зохио. (n!=1*2*3 . . . * (n-1) * n) #include<stdio.h> int i, n, p=1; main() { scanf(“%d”,&n);

Page 106: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:107

for(i=1; i<=n; i++) p=p*i; printf(“ Факториал = %d”, p); }

Нөхцөлт давталт ( while ) Бичигдэх хэлбэр : while (<илэрхийлэл>) <оператор>; Илэрхийллийн утга үнэн л байвал дараах оператор нь биелэгдэнэ. Худал болбол давталтаас гарна. ( i<10 ) printf(. . . .) Жишээ 1: while (i>=0) { a[i]=b[i]; i--; } Жишээ 2: main() { int x,y; x=y=0; /* x,y-д анхны утга 0 олгох */ while(y<10) /* y-г 10-с бага байхыг шалгах */ x+=++y; /* y=y+1; x=x+y */ printf(“ x=%d ”, x) ; } Жишээ 3: main() { int x,y,z; y=1;

Page 107: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:108

while(y<10) { x=y++; z=++y; } printf(“ x=%d ”, x); }

Нөхцөлт давталт ( do . . . while ) Бичигдэх хэлбэр :

do <оператор>;

while(<илэрхийлэл>); do давталтын оператор нь илэрхийллийн утга худал болтол давтагдана.

Жишээ 1:

x=5; do { y=x; x--; } while(x>0);

Жишээ 2: А тооны В зэргийг хэвлэх int i, p=1, a=10, b=3; main() { i=1; p=1; do { p=p*a; i++; } while(i<=b); } Жишээ 3: 100 хүртэлх сондгой тоонуудын нийлбэр ол. int i,sum=0; main() { i=1;

Page 108: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:109

do { sum+=i; i+=2; } while(i<100); }

Үргэлжлүүлэх оператор Бичигдэх хэлбэр : continue; Энэ нь do, for, while давталтын операторуудтай хамтарч хэрэглэгдэнэ. Давталтын оператор дотор continue бичигдсэн бол түүний дараагийн үйлдлүүд биелэхгүй бөгөөд дараагийн цикл шууд эхэлнэ. Жишээ :

while(i<10) { if(x==i) continue; y*=x; printf(“ %d ”,y); i++; } for(i=1;i<10;i++) { if(x==i) continue; y*=x; printf(“ %d ”,i); }

Тасалдлын оператор

Бичигдэх хэлбэр : break;

Энэ нь мөн л давталт дотор агуулагдах ба давталтаас гарах үүрэгтэй оператор юм.

for(i=1;i<10;i++) { if(a[i]<0) { printf(“error”); break; } a[i] =(a[i]-3)%10; } --------------------------------------------------- while(1) { if(i>10) break; j=i; k=k-j; i++; }

Page 109: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:110

Page 110: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:111

Хичээл 7

Тэмдэгт мөр хувьсагч

Page 111: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:112

Тэмдэгт мөр, мөр төрлийн хувьсагч Тэмдэгт мөр нь ASCII системээр кодлогдсон тэмдэгтүүдийн дараалал юм. Тэмдэгтүүд нь : үсэг : ABC. . .XYZ, abc. . . xyz цифр : 0123456789 тусгай тэмдэгт : + - * / | \ $ # . . . Си хэлэнд ‘\0’ тэмдэгт нь мөрийн төгсгөлийг заана. Тэмдэгтийн тоог мөрийн урт гэнэ. Мөр төрлийн хувьсагчийг Си хэлэнд char нөөц үгээр , массив хэлбэрээр зарлана. Жишээ : char a[15]; Жишээнд а тэмдэгт мөрийг 15 тэмдэгтийн урттайгаар зарласан байна. Си хэлэнд тэмдэгт мөр хамгийн ихдээ 256 byte эзэлдэг. Мөр төрлийн уртыг sizeof функцын тусламжтайгаар мэднэ. Жишээ : printf(“ %d ”, sizeof(a)); Үр дүн : 15 Тэмдэгт мөрт анхны утга олгож зарлахдаа : char a[8]=”HELLO”; char Name[25]=”Michael”; Тэмдэгт мөртэй ажиллах функцууд Тэмдэгт мөр хувьсагчид утга олгох, тэмдэгт мөр залгах функцууд

strcpy() функц char *strcpy(char *s1, const char *s2); / s2 тэмдэгт мөрийн утгыг s1 тэмдэгт мөрт олгох / Жишээ 1 :

Page 112: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:113

#include<stdio.h> char str[]=”ПХ-ын 1”,str1[]=”ПХ-ын 2”; main() { *str=*strcpy(str,str1); /* str=str1 */ printf(“ Тэмдэгт мөр = %s \n”,str); } Үр дүн : Тэмдэгт мөр = ПХ-ын 2 Жишээ 2 : #include<stdio.h> char str[]=”ПХ-ын 1”; main() { *str=*strcpy(str,”ПХ-ын 2”); printf(“ Тэмдэгт мөр = %s \n”,str); } Тэмдэгт мөрүүдийг залгах strcat функц Бичигдэх хэлбэр : char *strcat(char *s1, const char *s2); Жишээ : #include <string.h> char str[100],str1[100]; main() { printf(“ str= ”); scanf(“%s”,&str); /* ПХ-ын */ *str= *strcat(str,“2a”); /* s1=s1+s2 */ printf(“%s\n”,str); } Үр дүн : ПХ-ын 2а

Page 113: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:114

Мөр төрлийн хувьсагчдыг харьцуулах нь strcmp() функц Бичигдэх хэлбэр : int strcmp(const char *s1, const char *s2); Хэрэв буцаах утга нь : ==0 бол s1==s2 ( Тэнцүү ) >0 бол s1>s2 ( s1 нь их ) <0 бол s1<s2 ( s2 нь их ) a) 2 тэмдэгт мөр тэнцүү байхын тулд тэдгээрийн тэмдэгтүүд нь харгалзан тэнцүү байх ёстой. “abc”==”abc” (Үнэн) “abc”==”ABC” (Худал) “abc”==”aab” (Худал)

b) 2 тэмдэгт мөр тэнцүү биш бол аль нэг нь их байх ёстой. Тэмдэгт мөрийг их багаар нь жишихдээ тэдгээрийн ASCII дугаараар нь (тэмдэгт бүрийнх нь ) жишдэг. A-65 B-66 C-67 D-68 . . . X-88 Y-89 Z-90 a-97 b-98 c-99 d-100 . . . x-120 y-121 z-122

--------------------------------------------- ‘A’<’B’<’C’ . . . ‘Z’<’a’<’b’. . .<’z’

‘A’>’z’ (Худал) ‘Z’>’a’ (Худал) ‘z’>’Z’ (Үнэн)

Тэмдэгт мөрүүдийг жишихдээ тэмдэгт бүрээр нь жишдэг.

“abc”>”ABC” (Үнэн) “abc”>”abd” (Худал) “aac”<”aab” (Худал)

Page 114: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:115

Жишээ : . . . i=strcmp(“aac”,“aab”); switch(i) { case 0: printf(“Тэнцүү тэмдэгт мөр”); break; default: printf(“Ялгаатай тэмдэгт мөр”); } . . . Тэмдэгт мөрийн уртыг тодорхойлох strlen функц Бичигдэх хэлбэр : int strlen(char *s); Тэмдэгт мөрийн уртыг тооцохдоо төгсгөлийн “\0” тэмдэгтийг үл тооцно.

Жишээ :

#include<string.h> char str[]=”ПХ-ын 1”; main() { int count; count=strlen(str); printf(“ Тэмдэгт мөр = %d”, count); }

Үр дүн : Тэмдэгт мөр = 7 Тэмдэгт мөрийг хөрвүүлэх функцууд

1. strlwr() Бичигдэх хэлбэр : char *strlwr(char *s); / s тэмдэгт мөрийн том үсгүүдийг жижиг болгох үсгүүд / Жишээ :

Page 115: Programchlaliin c hel

#include<string.h> main() { char str[100]=”ALL LETTERS”; *str= *strlwr(str); printf(“%s”, str); } Үр дүн : all letters

2. strupr() Бичигдэх хэлбэр : char *strupr( char *s ); / Тэмдэгт мөрийг жижиг үсгүүдийг том болгох функц / Жишээ : #include <string.h> main() { char str[100]=”all letters”; *str= *strupr(str); printf(“%s”,str); } Үр дүн : ALL LETTERS

Жишээ : Давталт ашиглан тэмдэгт мөрийг хэвлэх . . . for(i=0; i<strlen(s); i++) printf(“%c”,s[i]); . . . Жишээ : while давталтыг ашиглая. i=0;

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:116

while (s[i]!=’\0’) printf(“ %c ”,s[i++]); . . . s[0] s[1] s[2] . . . s[9] s[10]

Òºãñãºëèéã çààã÷ òýìäýãò

A l l l e t t e r s \0

Íèéò óðò = 11 òýìäýãò

Page 116: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:117

Жишээ : strupr функцийг давталт ашиглан хийе. #include <string.h> main() { char str[20]=”all letters”; int i; for(i=0; i<strlen(str); i++) if((str[i]>=97)&&(str[i]<=122)) str[i]-=32; printf(“%s”,str); } Үр дүн : ALL LETTERS

Page 117: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:118

Хичээл 8

Хэрэглэгчийн функц

Page 118: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:119

Си хэлээр хэрэглэгчийн функц

тодорхойлох Си хэлэнд функцуудыг стандарт ба хэрэглэгчийн гэж 2 ангилдаг. Стандарт функцууд нь урьдчилан тодорхойлогдсон (зохиогдсон) функцууд байдаг ба *.h файлуудад тодорхойлогддог. Харин хэрэглэгчийн функцийг программ зохиогч зохионо. Функц нь программд олон давтан хийгдэх үйлдлүүдийг багасгаж, үйлдлүүдийг бүлэглэж өгдөг. Хэрэглэгчийн функц зарлах Бичих хэлбэр: <буцаах утгын төрөл> <ФункцНэр>(<төрөл> <хувьсагч> , <төрөл> <хувьсагч> . . .) { <Функцын бие> } 1. Хэрэв функц утга буцаах шаардлагатай бол функцын нэрийн өмнө тухайн функцээс буцаах утгын төрлийг бичиж өгнө. Хэрэв утга буцаадаггүй бол өмнө нь void түлхүүр үгийг бичиж өгнө эсвэл ерөөсөө түлхүүр үг бичихгүй.

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

Page 119: Programchlaliin c hel

3. Функцын биеийг { } хаалтанд бичнэ.

Àðãóìåíòóóä Жишээ :

int Max(int a, int b)

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:120

{ int k; k=(a>b) ? a : b;

Áóöààõ óòãà Ëîêàëü õóâüñàã÷

printf(“ Max= %d”, k); return k;

Óòãà áóöààõ ¿éëäýë } Утга буцаадаггүй функцыг зарлах 1. void түлхүүр үг ашиглах

void Sum(int a, int b) { printf(“ Sum = %d”, a+b); }

2. Түлхүүр үг ашиглахгүй Sum(int a, int b) { printf(“ Sum = %d”, a+b); }

Функц утга буцаахгүй тохиолдолд түүнийг илэрхийлэлд ашиглаж болохгүй.

К=Sum(a,b)*10+123; алдаа printf(“%d”, Sum(a,b)); алдаа

Функцээс утга буцаах оператор Си хэлэнд функцээс утга буцаахдаа return түлхүүр үгийг хэрэглэдэг. Бичигдэх хэлбэр : return [ ( ] <илэрхийлэл> [ ) ]; Жишээ : return a+b;

Page 120: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:121

return (a+b); return a; return (a); Return үйлдэл гүйцэтгэгдэхэд удирдлага тухайн функцээс гарна. Өөрөөр хэлбэл нэг блокт түүний ард бичигдсэн үйлдлүүд биелэгдэхгүй. Жишээ :

int Sum(int a, int b) { int k; k=a+b; return k; printf(“Sum=%d”,k); Үйлдэл хэзээ ч биелэгдэхгүй }

Аргументгүй функцийг зарлах

Sum(void) { printf(“ Sum = %d”, a+b);

}

Sum() { printf(“ Sum = %d”, a+b);

} Функцыг дуудах Функцыг түүний нэрээр, аргументийг нь дамжуулан дуудна. Жишээ : Sum(); /* Аргументгүй функц дуудах */ Sum(5,7); /* Тогтмол утгыг функцэд дамжуулах */

Page 121: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:122

Sum(i,k); /* Хувьсагчдын утгыг дамжуулах */ i=Sum(5,7); /* Утга буцаадаг функцыг ашиглах */ i=Sum(i,k); i=m+Sum(5,k); /* Илэрхийлэлд ашиглах */

Page 122: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:123

Жишээ : 2 тооны нийлбэр олдог программ зохио.

#include <stdio.h> int Sum(int a, int b) { return a+b; } main() { int i,j; scanf(“%d %d”,&i,&j); printf(“Sum=%d”,Sum(i,j)); }

Хэрэглэгчийн функцуудыг бусад функцээс

хэрэглэх нь Си хэлэнд тухайн функц дотор өөр хэрэглэгчийн функцийг дуудах бол зөвхөн өөрөөсөө өмнө тодорхойлогдсон функцийг дуудаж болно.

Жишээ : int Sum(int a, int b) { return a+b; } main() { /* Sum функц main функцээс өмнө тодорхойлогдсон учир түүнийг main функцээс дуудаж болно. */ printf(“Sum = %d”, Sum(5,7)); /* Max функц main функцээс өмнө тодорхойлогдоогүй учир түүнийг main функцээс дуудаж болохгүй. */ printf(“Max = %d”,Max(5,7)); } int Max(int a, int b) { return (a>b) ? a : b; }

Page 123: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:124

Энэ тохиолдолд тухайн функцийг дуудахын тулд өөрөөсөө өмнө зарлаж ( функцын зөвхөн тодорхойлолтыг нь зарлана ) өгдөг. Ингэж зарлахдаа тухайн функц рүү дамжих аргументын болон буцаах утгын төрлийг зааж өгдөг. Бичих хэлбэр : <буцаах төрөл> < ФункцНэр>(<Аргументийн төрөл> , . . .); Жишээ : int Sum(int a, int b) { return a+b; } int Max(int,int); main() { /* Sum функц main функцээс өмнө тодорхойлогдсон учир түүнийг main функцээс дуудаж болно. */ printf(“Sum = %d”, Sum(5,7)); /* Max функц main функцээс өмнө тодорхойлогдоогүй учир түүнийг main функцээс дуудаж болохгүй. */ printf(“Max = %d”,Max(5,7)); } int Max(int a, int b) { return (a>b) ? a : b; } Функцийн дотоод хувьсагч Зөвхөн тухайн функц дотроо л хэрэглэгдэх локаль хувьсагчийг дотоод хувьсагчид гэнэ. Өөр өөр функцуудын дотоод хувьсагчид бие биедээ нөлөө үзүүлэхгүй. Удирдлага тухайн функцэд шилжихэд эдгээр хувьсагчид санах ойд үүсэх ба функцээс гарахад санах ойгоос устаж үгүй болно. Ө.х тухайн функцийн амьдрах хугацаанд оршин тогтноно.

Page 124: Programchlaliin c hel

Жишээ :

{ int

return k;

int k;

Sum(int a, int b)

k=a+b;

}

main()

k=1;

Статик хувьсагч (static)

int Max(int a, int b)

k; Äîòîîä õóâüñàã÷

k=(a>b) ? a : b;

} Жишээ : #include <stdio.h>

{ int k;

printf(“k=%d”,k);

{

printf(“k=%d”,k); /* k = 1 */ Sum(2,2); /* k = 4 */ printf(“k=%d”,k); /* k = 1 */ }

Утга тухайн программын амьдралын хугацаанд хадгалагддаг хувьсагчийг статик хувьсагч гэнэ. Функц дотор статик хувьсагчийг зарлаж болдог . Энэ тохиолдолд тухайн функцийг дуудах болгонд хувьсагчийг шинээр үүсгэхгүй харин өмнөх үйлдлийн үр дүнгээр тогтоогдсон утгыг авна. Бичигдэх хэлбэр :

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:125

Page 125: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:126

static <төрөл> <хувьсагч>;

Жишээ :

#include <stdio.h>

{

printf(“k=%d\n”, k++);

main()

Count(); /* k = 1 */

Multiple(int a)

Count()

static int k=1;

}

{

Count(); /* k = 2 */ Count(); /* k = 3 */ Count(); /* k = 4 */ Count(); /* k = 5 */ } Жишээ : #include <stdio.h>

{ static int k=1; printf(“k=%d\n”, k); k*=a; } main() { int i; for(i=1; i<=5; i++) Multiple(2); } /* k=1 k=2 k=4 k=8 k=16 */

Page 126: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:127

Хичээл 9

Массив

Page 127: Programchlaliin c hel

Массив

Массивын элементэд хандахдаа [ ] хос хаалтыг ашиглана. names[2] гэж хандахад тухайн массивын 3-р элементэд хандана.

Ижил төрлийн олон утгыг хадгалах боломжтой , өгөгдлийн нийлмэл төрлийг массив гэнэ.

Программист нь ижил зорилгоор хэрэглэгдэх олон утгыг хадгалахдаа дараах байдлаар олон хувьсагчид зарлаж болно.

int name1=101; int name2=202; int name3=303;

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

Массив нь олон элементтэй хайрцаг мэтээр төсөөлөгдөх бөгөөд хувьсагчид хандахын тулд тусгай дугаараар хандана. Ө.х массивын элемент бүр тодорхой дугаартай байна. Си хэлэнд массивын дугаарлалт нь 0 гэсэн утгаас эхэлнэ. Дээрх жишээг массив ашиглан зарлая.

Ìàññèâûí àãóóëæ ÷àäàõ ýëåìåíòèéí òîî

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:128

int names[4];

Ìàññèâûí ýëåìåíòèéí òîî

names[0]=101; names[1]=202; names[2]=303; names[3]=404;

Ìàññèâò óòãà îëãîõ

Õàíäàæ áàéãàà ýëåìåíòèéí äóãààð

Массив санах ойд байрлах

Page 128: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:129

Нэг хэмжээст массив нь санах ойд дараалсан байрлалтай байна.

А[5] массив санах ойд байгаа нь :

. . . A[0] A[1] A[2] A[3] A[4] . . . . . . Нэг хэмжээст массивыг зарлах

<төрөл> <нэр>[<индекс>]

Жишээ :

Массивын анхны утгыг олгох

int a[5]={1,2,3,4,5}; /* Эхний 5 элементэд утга олгох */

a[1]=20; a[6]=a[2]; a[0]=i; a[1]=b[i];

x=y+a[3]*a[i]; printf(“ 3-р элемент : %d”,a[3]);

scanf(“%d”,&a[2]);

int a[5]; int b[100];

Жишээ :

int b[20]={0,1,2,3,4,5,6,7,8,9}; /* Эхний 10 элементэд нь утга олгож байна. Бусад элементүүд нь 0 утгатай болно. */

Массивын элементэд утга олгох түүнийг илэрхийлэлд ашиглах

Массивын элементэд утга олгох мөн элемент дээрх үйлдлүүд нь ердийн хувьсагчид утга олгох, илэрхийлэлд оролцох хэлбэртэй ижил болно.

Массивын элементүүдийг гараас унших scanf(“%d”,&a[1]);

scanf(“%d”,&a[3]); Массивын элементүүдийг гараас уншихдаа цикл ашиглах нь тохиромжтой.

Page 129: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:130

Жишээ 1:

. . .

Массивын элементүүдийг хэвлэхдээ цикл ашиглах нь тохиромжтой.

int a[10], i; for(i=0;i<10;i++) scanf(“%d”,&a[i]);

Дээрх жишээнд циклийн тоолуур 0 -оос 9 хүртэлх утгыг авах бөгөөд scanf функц нь a[0]. . . a[9] утгуудыг гараас уншина. scanf(“%d”,&a[0]); гэх мэтчилэн scanf(“%d”,&a[9]);

Жишээ 2 :

int a[10],i; for(i=0;i<10;i++) { printf(“ A[%d] =”,i); scanf(“%d”,&a[i]);

}

Үр дүн нь : A[0]= 101 A[1]= 122

A[9]= 222

Массивын элементүүдийг хэвлэх printf(“ %d ”,a[0]); printf(“ %d ”,a[1]); printf(“ %d ”,a[2]);

Жишээ 1 :

Page 130: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:131

int a[10], i;

while ( n!=0 ) a[i++]=n%10,n/=10;

for(i=0;i<10;i++) printf(“ %d ”,a[i]);

Жишээ 2 :

int a[10], i; for(i=0;i<10;i++) printf(“ A[%d]=%d \n”, i, a[i]);

Үр дүн нь :

A[0]= 101 A[1]= 122 . . . A[9]= 222 Нэг хэмжээст массив ашигласан бодлого :

Жишээ : Дурын тооны цифрүүдийг олох #include <stdio.h> int a[10],i=0; long n; main() { printf(“ Тоогоо оруулна уу : ”); scanf(“%ld”,&n);

for(i=i-1;i>=0;i--) printf(“%d \t”,a[i]); }

Page 131: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:132

Хоёр хэмжээст массив Си хэлэнд 2 хэмжээст буюу тэгш өнцөгт хүснэгт маягийн

массив зарлаж ашигладаг. Ийм массивын элементэд мөр, багана гэсэн 2 дугаараар хандана. Дугаарлах утга нь мөн л 0-ээс эхлэнэ.

А массив (3 мөр 4 баганатай)

A[0][0] A[0][1] A[0][2] A[0][3

] A[1][0] A[1][1] A[1][2] A[1][3

] A[2][0] A[2][1] A[2][2] A[2][3

] 2 хэмжээст массив санах ойд байрлах

A[0][0]

A[0][1]

A[0][2]

A[0][3]

A[1][0]

A[1][1]

A[1][2]

. . .

Ө.х :

1-р мөр 2-р мөр 3 мөр Хоёр хэмжээст массивыг зарлах <төрөл> <нэр>[<индекс>][<индекс>]

эсвэл <төрөл> <нэр>[][<төрөл>] Жишээ : int a[3][4]; int b[2][5];

Массивын анхны утгыг олгох Жишээ :

Page 132: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:133

int a[3][2]={{1,2},{3,4},{5,6}}; int b[2][3]={{1,2,3},{4,5,6},{7,8,9}};

int A[3][3]={1,2,3,4,5,6,7,8,9};

2 хэмжээст массивын элементэд утга олгох түүнийг илэрхийлэлд ашиглах

int a[2][2], i,j;

for(i=0; i<2; i++)

{ printf(“ A[%d][%d]=”,i,j);

a[1][1]=20; a[6][2]=a[2][2]; a[0][2]=i; a[1][1]=b[i][1]; x=y+a[3][1]*a[i][1]; printf(“[1,3]-р элемент : %d”,a[1][3]);

2 хэмжээст массивын элементүүдийг

гараас унших scanf(“%d”,&a[1][1]); scanf(“%d”,&a[2][1]); scanf(“%d”,&a[3][1]); 2 хэмжээст массивын элементүүдийг гараас уншихдаа давхар цикл ашиглах нь тохиромжтой. Нэг цикл нь мөрийн дугаарыг тодорхойлно. Нөгөө нь баганын дугаарыг тодорхойлно.

Жишээ 1:

int a[2][2], i,j;

for(i=0; i<2; i++) for(j=0; j<2; j++) scanf(“%d”,&a[i][j]);

Жишээ 2:

for(j=0; j<2; j++)

scanf(“%d”,&a[i][j]); }

Page 133: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:134

Үр дүн нь :

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

int a[2][2], i,j;

Үр дүн нь :

A[0][0]= 101

A[1][0]= 122

A[0][0]= 101 A[0][1]= 122 A[1][0]= 122 A[1][1]= 222

2 хэмжээст массивын элементүүдийг хэвлэх

printf(“%d”,a[0][0]); printf(“%d”,a[0][1]); printf(“%d”,a[0][2]);

Жишээ 1:

for(i=0; i<2; i++) for(j=0; j<2; j++) printf(“%d ”,a[i][j]);

Жишээ 2:

int a[2][2], i,j;

for(i=0; i<2; i++) for(j=0; j<2; j++) printf(“ A[%d][%d]= %d \n”, i, j, a[i][j]);

A[0][1]= 122

A[1][1]= 222

Page 134: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:135

Жишээ 3:

printf(“\n”);

101 122

122 200

int a[2][2], i,j;

for(i=0; i<2; i++) { for(j=0; j<2; j++) printf(“%7d”, a[i][j]);

}

Үр дүн нь :

Page 135: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:136

Хичээл 10

Бүтэц төрлүүд

Page 136: Programchlaliin c hel

[<төрөл1> <хувьсагч1>]

}sum;

3. struct { char name[15];

Бүтэц

<Бүтэц> гэж нэрлэгдэх өгөгдлийн энэ хэлбэр нь янз бүрийн төрөлтэй өгөгдлийг хамтатган тодорхойлоход хялбархан бөгөөд хэрэглэгчдэд шинэ өгөгдлийн хэлбэрийг үүсгэхэд хэрэглэгдэнэ.

Бүтэц төрөл тодорхойлох :

struct [<бүтцийн нэр>] {

[<төрөл2> <хувьсагч2>] . . . [<төрөлN> <хувьсагчN>] }

Бүтэц төрлийн хувьсагч зарлах : struct <бүтцийн нэр> <хувьсагчийн нэр>;

Òºðëèéí íýð

Жишээ :

1. struct student { char name[15]; Õóâüñàã÷äûí íýð

int age; };

struct student sum; ÕÓÂÜÑÀÃ×ÈÉÍ ÍÝÐ

2. struct student { char name[15];

int age;

int age; }sum;

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:137

Page 137: Programchlaliin c hel

2 byte Санах ойд байрлах нь :

15 byte Нийт : 17 byte

Бүтэц төрлийн хувьсагчид Бүтэц төрлийн хувьсагчид массивт утга олгодог шиг хамаагүй анхны утга олгож болохгүй. Бүтэц төрлийн хувьсагч нь гадаад эсвэл static хэлбэрээр зарлагдсан бол утга олгож болно.

Жишээ :

static struct student sum={“Бат”, 25

Бүтцийн элементэд хандах

};

Бүтэц доторхи элементэд хандахын тулд . тэмдгийг

хэрэглэнэ.

Жишээ : student . age = 18; Бүтэц төрөлтэй массив Бичигдэх хэлбэр : struct <Бүтэц төрөл> <Массивын нэр>[хэмжээ] ; Жишээ нь : struct student { char name[20]; Á¿òýö òºð뺺 òîäîðõîéëîõ

int grade; };

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:138

Page 138: Programchlaliin c hel

struct student sw102[100]; Ìàññèâàà çàðëàõ

sw102[0].name sw102[0].grade sw102[1].name sw102[1].grade sw102[2].name sw102[2].grade sw102[3].name sw102[3].grade

sw102[100].name sw102[100].grade

Бүтэц төрлийн массив санах ойд байрлах Жишээ :

name1 grade1 name2 grade2 . . . Жишээ : Бүтэц төрлийн массивыг ашигласан жишээ Оюутнуудыг дүнг бүртгэх #include <stdio.h> struct student { char name[20]; int grade;

} struct student sw[100]; main()

{ int i,n; printf(“Оюутны тоог оруул : N=”); scanf(“%d”,&n); for(i=0;i<n;i++) { printf(“ %d-р оюутны нэр : ”,i+1); scanf(“%s”,sw[i].name); printf(“ дүн : ”); scanf(“%d”,&sw[i].grade);

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:139

Page 139: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:140

}; printf(“\n\n\n”); for(i=0;i<n;i++) printf(“ %25s %5d \n”,sw[i].name,sw[i].grade); }

Бүтэц доторхи бүтэц Нэг бүтэц нөгөөгөө агуулах жишээ өргөн тохиолддог. Жишээ : Оюутнуудын мэдээллийг агуулсан student гэсэн бүтэц байг. Тэгвэл тухайн оюутны дүнгүүдийг ямар байдлаар хадгалах вэ ? Үүнийг давхар бүтэц ашиглан шийдье. #include <stdio.h> struct LessGrading { char LessCode[5]; /* sw102 эсвэл sw101 */ int Grade;

}

scanf(“%s”,

struct Student { char Name[20]; char SID[8]; struct LessGrading Lessons[40];

sw.Lessons.LessCode);

} struct Student sw[100]; main() { int i,j,n=50; for(i=0;i<n;i++) { printf(“Оюутны нэр :”); scanf(“%s”,sw.Name); printf(“Оюутны код :”); scanf(“%s”,sw.SID); for(j=0;j<40;j++) { printf(“Хичээлийн Код :”);

printf(“Хичээлийн Дүн :”); scanf(“%d”,&sw.Lessons.Grade);

Page 140: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:141

}

int k : 2; /* 0..3 */

int s : 2; /* 0..3 */

} } Бит талбар Утгыг түүний авч болох хязгаарт нь тохируулж хадгалах зорилгоор бит талбар гэж нэрлэгдэх талбарыг ашигладаг. Жишээ нь Оюутны хүйсийг тэмдэглэхэд 0 ба 1 гэсэн хоёр утга л хангалттай . 0 -эм , 1-эр гэж тооцоё. Тэгвэл бид түүнийг хадгалахдаа хамгийн багаар 1 byte хэмжээтэй хувьсагч буюу char төрлийн хувьсагч зарлана.

char Sex; Тэгвэл зөвхөн 0 ба 1 гэсэн утгыг хадгалахын тулд 8 бит зарцуулж байна. Хэрвээ хувьсагчдыг битээр зарлаж болдог бол үүнд зөвхөн 1 л бит хангалттай. Си хэлэнд ийм байдлаар бит талбарыг зарлах боломж байдаг. Жишээ :

#include <stdio.h> struct AAAAA { int Sex: 1; /* 0..1 */

int l : 5; /* 0..31*/

int m:6; /* 0..63 */ } AA; main() { AA.Sex=1; printf(“%d\n”,AA.Sex); AA.k=3; printf(“%d\n”,AA.k); AA.l=31; printf(“%d\n”,AA.l); AA.s=3; printf(“%d\n”,AA.s); AA.m=63; printf(“%d\n”,AA.m); printf(“%u\n”,AA); }

Page 141: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:142

ENUM Жишээ :

}

#include <stdio.h> enum DAYS { Dabaa=1, Migmar=2, Lhagva=3, Purev=4, Baasan=5, Bimba=6, Nim=0 } Weekdays;

main() { int i; printf(“ Day = ”); scanf(“%d”,&i); switch(i) { case Dabaa : printf(“Даваа”);break; case Migmar : printf(“Мягмар”);break; case Lhagva : printf(“Лхагва”);break; case Purev : printf(“Пүрэв”);break; case Baasan : printf(“Баасан”);break; case Bimba : printf(“Бямба”);break; case Nim : printf(“Ням”);break; default : printf(“Долоо хоногийн өдөр биш ”);

}

Page 142: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:143

Хичээл 11

Өгөгдлийн заагч төрөл

Page 143: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:144

Заагч хувьсагч нь 2 янз байна. ( Төрөлт, Төрөлт биш )

Жишээ : Заагч хувьсагч зарласан үйлдэл

Заагч ба хаяг

Заагч гэдэг бол обьектыг заах хувьсагч юм. Заагч төрлийн хувьсагчийг зарлахдаа өмнө нь (*) од тавина. Заагч хувьсагч нь ердийн хувьсагч шиг санах ойд зай эзлэхгүй, харин санах ойд байрласан хувьсагчийн хаягийг нь агуулна. Ө.х тухайн хувьсагчийн утганд шууд бусаар хандах арга юм.

Төрөлт заагч Төрөлт заагч гэдэг нь тодорхой төрөлтэй хувьсагчийг заах заагчийг хэлнэ.

int i=10; /* Ердийн хувьсагч зарлах */ int *k; /* int төрлийн заагч */

Жишээн дэх бүхэл тоон төрлийн заагч нь зөвхөн бүхэл тоон (int) төрлийн хувьсагчийг , обьектийг заана. Заагчид утга олгоогүй байх үед тэр ямар ч обьектийг заахгүй, харин түүнд ямар нэг хувьсагчийн хаягийг олгохдоо & үйлдлийг ашиглана. Заагчид анхны утга олгох

Жишээ : int i; int *p=&i; /* p заагчид i хувьсагчийн хаягийг олгох буюу i хувьсагчийг заалгах */ Заагчид утга олгох

Заагч хувьсагчийг ямар нэг обьектийг заалгахдаа дараах байдлаар заалгана. Жишээ : int i; int *p;

p=&i;

Page 144: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:145

/* p заагчид i хувьсагчийн хаягийг олгох буюу i хувьсагчийг заалгах */ Заагч хувьсагч нь зөвхөн санах ойн хаяг л агуулна.

Заагчийн зааж байгаа обьектод

хандах Заагчийн зааж байгаа обьектод хандахдаа * тэмдгийг ашиглана. Жишээ : int i=3, *p;

p=&i; /* p заагчид i хувьсагчийн хаягийг олгох буюу i хувьсагчийг заалгах */

printf(“ i =%d”, *p); /* 3 гэсэн утга хэвлэгдэнэ */ *p=10; /* i=10 гэсэнтэй ижил */ printf(“ i=%d”, i); /* 10 гэсэн утга хэвлэгдэнэ */ Дараах программд char төрөлт заагч ашигласан байна. #include <stdio.h> main()

printf("%c %c\n", c, *ch);

{ char c = 'Q'; char *ch = &c; printf("%c %c\n", c, *ch); c = 'Z'; printf("%c %c\n", c, *ch); *ch= 'Y';

}

Page 145: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:146

1. Заагчийг олгох

int x=2,y=1;

хасах (-) үйлдлүүдийг гүйцэтгэж болно. Төрөлт заагч ашиглаж байгаа үед эдгээр үйлдлүүдийг гүйцэтгэхэд заагчийн төрлийн хэмжээгээр нэмэгдэж, хорогдоно.

Заагч дээрх үйлдлүүд

Нэг заагчийг нөгөөд нь олгох боломжтой. Жишээ нь : int i=100,*p1,*p2; p1=&i; /* i-г заалгах */ p2=p1; /* p1-ийн обьектийг заалгах */ printf(“%d \n”,*p1);/* 100 -г хэвлэх */ printf(“%d \n”,*p2);/* 100 -г хэвлэх */ 2. Заагчийг харьцуулах

Хоёр заагчийг хооронд нь харьцуулж болно. Жишээ:

int *p1, *p2; p1=&x; p2=&y; if(p1!=p2)

printf(“2 заагч тэнцүү биш”); else printf(“2 заагч тэнцүү”); 3. Арифметик үйлдлүүд Заагч дээр нэмэгдүүлэх (++), хорогдуулах (--), нэмэх (+),

int i, *p1=&i;

Page 146: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:147

p1++, p1--, p1+=2, p1-=2 . . . гэх мэт үйлдэл хийж болно. int *p1=&i; p1++; /* Хаяг = хаяг + 2 */ p1--; /* Хаяг = хаяг - 2 */ p1+=2; /* Хаяг= хаяг + 4 */ p1-=2; /* Хаяг= хаяг - 4 */ Эдгээр үйлдлүүд нь зөвхөн заагчийн агуулж байгаа хаягийг өөрчилнө. Түүнээс биш хаягт байгаа өгөгдөлд хандахгүй. Хаягт байгаа өгөгдлийг өөрчлөхийн тулд дараах байдлаар хандах хэрэгтэй. int *p1=&i; ++*p1; /* i=i+1 */ (*p1)++; /* i=i+1 */ *p1=*p1+2; /* i=i+2 */ *p1-=2; /* i=i-1 */ Жишээ : #include <stdio.h> main() { int i=10, *p1=&i; printf(“%d \n”, ++*p1); /* 11 */ printf(“%d \n”, i) /* 11 */ } Төрөлт заагч дээр үйлдэл хийхэд түүний хаяг нь төрлийнх нь хэмжээгээр нэмэгдэж буурдаг.

Жишээ : #include <stdio.h> main() { char c[10]=”ababababab”;

Page 147: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:148

int i, *p1=c; for(i=0;i<5;i++)

}

- Бодит тоотой заагчийг нэмэх

- Заагчийг хуваах

printf(“%c ”,*p1++);

Үр дүн: a a a a a

Жишээ : #include <stdio.h> main() { char c[10]=”ababababab”; int i, *p1=c+1; for(i=0;i<5;i++) printf(“%c ”,++*p1++); }

Үр дүн:

c c c c c

Дараах үйлдлүүдийг заагчид зөвшөөрдөггүй.

- Хоёр заагчийг нэмэх - Ялгаатай обьект дээрх 2 заагчийг хасах

- Заагчийг үржүүлэх

- Заагчийг шилжүүлэх үйлдэл

Төрөлт биш заагч

Төрөл нь тодорхойлогдоогүй заагчийг төрөлт биш заагч гэнэ. Ийм заагчийг ашиглан бүх төрлийн обьектод хандах боломжтой. Төрөлт биш заагчийг зарлахдаа void түлхүүр үгийг ашигладаг. Жишээ : #include <stdio.h> main(){ int x=567; double y=56.23;

void * p;

Page 148: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:149

p=&x; printf(“x=%d \n”,*(int *)p);

void *p1=(void *)c;

{ printf("%c ",*(char *)(p1));

/* Үр дүн нь : a a a a */

p=&y; printf(“y=%lf \n”,*(double *)p); } |

| Төрөлт биш заагчаас тодорхой нэг төрлийн утгыг уншихдаа өмнө заавал хөрвүүлэлт хийж өгнө. #include <stdio.h> char c[12]="ababababab"; int i=10;

main() { for(i=0;i<4;i++)

(char *)p1=(char *)p1+2; } }

Page 149: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:150

төрөл

Хичээл 12

Өгөгдлийн заагч

Page 150: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:151

/* Энэ тохиолдолд функц руу зөвхөн 2, 3 гэсэн утгууд л дамжигдана.Функцээс буцаж ирэхэд тухайн i, j хувьсагчдын утга өөрчлөгдөхгүй. */

Тэгэхээр бидний өмнө үзсэн , хэрэглэж байсан аргументууд маань утга дамжуулж байсан

Заагч ба функц

Си хэлэнд функц руу дамжих аргументуудыг 2 янзаар дамжуулж болдог.

1. Утгаар дамжуулах 2. Хаягаар дамжуулах

1. Утгаар дамжуулах

Энэ дамжуулалтын үед функц руу аргументийн утгууд л дамжигддаг.

Swap(x,y) int x,y; /* Эдгээр хувьсагчдыг санах ойд үүсгэж, дамжигдаж ирсэн утгыг олгодог. */ { int tmp; tmp=x; x=y; y=tmp; } /* Функцээс гарахад x,y хувьсагчид үгүй болно. */ main() { int i=2, j=3; Swap(i,j);

}

Page 151: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:152

байна.

1. Функц 2 утга буцаахгүй.

Энэ тохиолдолд хаягаар дамжуулах механизмыг хэрэглэдэг. Энэ аргын үед функц рүү хувьсагчдын утгыг дамжуулдаггүй, харин тэдгээр хувьсагчдын санах ойд байрлаж байгаа хаягийг функцэд дамжуулдаг.

/* Дамжигдаж ирэх утгыг заагч

{ int tmp;

}

2. Хаягаар дамжуулах

Хэрвээ аргументийг үргэлж утгаар дамжуулдаг байсан бол функцээс зөвхөн ганц утга л буцдаг байх болно. Мөн функц дотор глобалиас бусад хувьсагчдын утгыг өөрчилж чадахгүйд хүрнэ.

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

2. Дээрх 2 хувьсагч хоёул глобаль биш иймээс шууд хандах боломжгүй.

Дээрх жишээг дахин бичье. Swap(p1,p2) int *p1, *p2;

хувьсагчийн утга болгон авна. */

tmp=*p1; /* Заагч байдлаар хандаж */ *p1=*p2; /*утгуудыг солих, тухайн хаягт */ *p2=tmp; /*байгаа утгуудыг солих */

main() { int i=2, j=3; Swap(&i, &j); /* Хувьсагчдын хаягийг нь дамжуулах*/ /* Функцээс гарч ирсний дараа 2 хувьсагчийн утга солигдсон байх ёстой. */

Page 152: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:153

}

Жишээ : Тэмдэгт мөр дамжуулах

Жишээ : A[N] массивын MAX элементийг массивын төгсгөлд аваач.

#include<stdio.h> Swap(p1,p2) int *p1, *p2; { int tmp; tmp=*p1; *p1=*p2; *p2=tmp; } main() { int A[10]={4,2,5,1,3,1,3,6,2,1},

n=10, i; for(i=0;i<n-1;i++)

if(A[i]>A[i+1]) Swap(&A[i], &A[i+1]); printf(“MAX=%d”,A[n-1]); } Энэ мэтчилэн функцэд дурын хувьсагчдыг хаягаар дамжуулж болно.

MyStr(s1) main() char *s1; { char str[10]=”Yes”; { . . . MyStr(str); } } Жишээ : float, long төрлийн хувьсагч MyNum(f1,k1) main() float *f1; { float f1=2.5; long k1=12; long *k1; MyNum(&f1, &k1); { . . . } }

Массивыг дараах байдлаар дамжуулна. #include<stdio.h>

MyMas(k) int k[];

Page 153: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:154

{ int i; for(i=0;i<5;i++) k[i]++; } main() { int a[5]={0,1,2,3,4},i; MyMas(a); for(i=0;i<5;i++) printf("%d",a[i]); }

Функцийн заагч

Бид өмнө нь функцийг шууд дуудаж байсан . Ө.х шууд нэрээр нь хандаж дуудна. Sum(x,y)

}

{

}

Функцийг шууд бусаар дуудахдаа функцийн заагч

Си хэлэнд функцийг дуудах 2 арга байдаг. 1. Шууд дуудах 2. Шууд бус дуудах

{ . . .

main()

Sum(5,6); /* Шууд нэрээр нь дуудах */

Шууд бус дуудах

гэж нэрлэгдэх заагч хувьсагчийг ашигладаг.

Функцийн заагчийг зарлах :

<Буцаах төрөл> (*<ФункцийнНэр>)(<Төрөл>, ..);

Page 154: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:155

/* int өгөгдөл буцаадаг, аргументгүй

*/

int (*func)();

Утга олгохдоо :

<Функцийн заагч>=&<Функц>;

Ажиллуулахдаа :

<Функцийн заагч>( [аргументууд] );

Жишээ : 2 тооны нийлбэр олох

int Sum(a,b)

гэж үзсэн. Тэгвэл : A[100] массив

Жишээ : Шууд бусаар дуудах гэж байгаа функц ямар байна, яг тийм байдлаар зарладаг.

функцийг дуудахад ашиглах функцийн заагч

#include<stdio.h>

int a,b; { return (a+b); } main() { int (*func)(int,int); func=&Sum; printf("%d", func(5,3)); /* 8 */ }

Заагч ба массив

*(p++) : p хаягийг 1-ээр нэмэгдүүлэн утгыг нь авах *(p+2) : p хаягаас хойших 2-р хаягт байгаа утгыг авах Бид массивын талаар үзэж байхдаа массивын

эхний элементийн хаяг нь массивын нэр байдаг

Page 155: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:156

А - Массивын 0-р элементийн хаяг буюу &А[0] A+1 - 1-р элементийн хаяг буюу &A[1] A+2 - 2-р элементийн хаяг буюу &A[2] A+3- 3-р элементийн хаяг буюу &A[3] . . . . . . A+i - i-р элементийн хаяг буюу &A[i]

Тэгвэл массивын i-р элементэд хандахдаа A[i] гэж хандана. Эсвэл *(A+i) гэж хандаж болно гэсэн үг. Жишээ : A[50] Массивыг хэвлэх for(i=0; i<50; i++) printf(“%d \n”, *(A+i)); Жишээ : Өөр заагч хувьсагч ашиглая. int A[50], *p=A; while(p<(A+50)) printf(“%d \n”, *p++); Жишээ : Массивт утга олгоё. for(i=0; i<50; i++) *(A+i)=i;

Олон хэмжээст массив ба заагч 2 хэмжээст массивын хувьд : *(A+i) бол i-р мөрийн эхний элементийн хаяг *(A+i)+j бол i-р мөрийн j-р элементийн хаяг *(*(A+i)+j) бол i-р мөрийн j-р элементийн утга

Өөрөөр хэлбэл :

A[i][j] == *(*(A+i)+j)

&A[i][j] == *(A+i)+j

Page 156: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:157

Жишээ : 2 хэмжээст массивыг хэвлэх

for(i=0;i<10;i++)

printf(“\n”);

{ for(j=0;j<10;j++) printf(“%d ”, *(*(A+i)+j));

} Жишээ : 2 хэмжээст массивт утга олгох for(i=0,k=0; i<10; i++) for(j=0; j<10; j++) *(*(A+i)+j)=k++;

Хичээл 13

Өгөгдлийн заагч төрөл

Page 157: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:158

int a[4]={1,2,3,4};

2. **pp++;

3. **++pp; /* 4 */

4. ++**pp;

Заагчийн заагч

Заагчийн хаягийг заах хувьсагчийг заагчийн заагч гэнэ. Үүнийг заагчид хамаарах массив ба мөр тэмдэгтийн хувьд хэрэглэхэд тохиромжтой.

Жишээ :

int *p[4]={a, a+1, a+2, a+3}; int **pp=p;

1. pp++; printf(“%d”,**pp); /* 2 */

/* 2 */

/* 5 */ 5. *(--*pp);

/* 3 */ Заагч ба мөр тэмдэгт

Page 158: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:159

Мөр тэмдэгт бол заагч төрөлтэй байдаг. Тэмдэгт мөрт заагч ашиглаж хандах нь нэг хэмжээст массивт заагч ашиглан хандахтай адил. Харин тэмдэгт мөр төрлийн массивын элементүүдэд заагчийн заагч ашиглан хандвал илүү тохиромжтой. #include <stdio.h>

{ clrscr();

1. ++cpp; **cpp; буюу “Add” гэсэн үг хэвлэнэ. 2. ++cpp; --*cpp; **cpp + 1; буюу “dd” гэсэн үг хэвлэнэ.

struct Student {

int grade;

main() { scanf("%s",p->Name); scanf("%d",&p->grade); printf("\n\n");

printf("Grade =%d \n",p->grade); }

Бүтэц төрөлтэй хувьсагчийг хаягаар функцэд дамжуулах

char *c[]={“Input”, ”Add”, ”Data”, “Debug”};

char **cp[]={c,c+1,c+2,c+3}; char ***cpp=cp; main()

printf(“%s\n”,*(*(++cpp))); printf(“%s\n”,(*(--(*(++cpp))))+1); printf(“%s\n”,(*(cpp[-2]))+2); }

3. cpp[-2]; *cpp[-2]; *cpp[-2]+2; буюу “put” гэсэн үг хэвлэнэ.

Бүтэц төрөл ба заагч

Бүтэц төрлийн заагч зарлах :

#include<stdio.h>

char Name[20];

}SW; struct Student *p=&SW;

printf("Name =%s \n",p->Name);

Жишээ :

Page 159: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:160

#include <stdio.h>

char *depart; int num_student;

}stand={“Программ хангамж”, 23400,

struct Instit *dep_num;

}

{ printf(“Total: %d”,Sum(&stand)); }

Мэргэжлийн сургалтын тэнхим

struct Instit {

char *depart1; int num_student1;

“Техник хангамж”, 4500 };

int Sum(dep_num)

{ return (dep_num->num_student + dep_num->num_student1);

main()

ШУТИС-ын харьяа Технологийн Их Сургууль

Page 160: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:161

Программчилалын Си хэл (SW202)

Бие даах ажлын гарын авлага

Багш Н.Ганнибал

Баруун-Урт 2001

Бие даах ажлыг гүйцэтгэх журам Бие даах ажлыг хийснээр оюутан лекц, семинарын мэдлэгээ улам бүр батжуулж, өөрийн мэдлэгээ сорих, шалгах зэрэг сайн талуудтай. Өөрөөр хэлбэл бие даах ажил нь оюутан өөрийн мэдлэгийг сорих чухал шалгуур болж өгнө. Бие даах ажил бүр 1.6 оноотой. Хэрэв тухайн бие даах ажил хэд хэдэн хэсгээс тогтох бол хэсэг тус бүрийн онооны нийлбэр нь 1.6 оноо байна. / 0.5 + 0.3 +0.4 +0.4 =1.6 /

Бие даах ажлыг тодорхой хугацааны дотор хийж үзүүлэх ёстой бөгөөд хугацаа хоцорсон тохиолдолд үзэхгүй. / Онцгой шалтгаангүй л бол /

Тухайн бие даах ажлыг оюутан зөв буруу ч гэсэн өөрөө хийх ёстой бөгөөд буруу тохиолдолд багш алдааг нь хэлж өгч засуулна. Хэрэв тухайн бие даах ажлыг үзүүлэхдээ оюутан өөрөө хийгээгүй нь тогтоогдвол (бусдаас хуулсан, хуулан засварласан, бусдаар хийлгэсэн, бусадтай хамтарч хийсэн зэрэг шалтгаан ) багш тухайн бие даах ажилд үнэлгээ өгөхгүй бөгөөд оюутан тухайн бие даах ажлыг дахин үзүүлэх эрхгүй. Өөрөөр хэлбэл шийтгэл нь тухайн оюутан 1.6 оноо алдана гэсэн үг.

Бие даалт Хамгаалж дуусах эцсийн хугацаа Оноо Бие даалт 1 III долоо хоног 1.6 Бие даалт 2 III долоо хоног 1.6 Бие даалт 3 IV долоо хоног 1.6

Page 161: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:162

Бие даалт 4 V долоо хоног 1.6 Бие даалт 5 VI долоо хоног 1.6 Бие даалт 6 VII долоо хоног 1.6 Бие даалт 7 VIII долоо хоног 1.6 Бие даалт 8 IX долоо хоног 1.6 Бие даалт 9 X долоо хоног 1.6 Бие даалт 10 XI долоо хоног 1.6 Бие даалт 11 XII долоо хоног 1.6 Бие даалт 12 XIII долоо хоног 1.6 Бие даалт 13 XIV долоо хоног 1.6 Бие даалт 14 XV долоо хоног 1.6 Бие даалт 15 XVI долоо хоног 1.6

Бие даах ажлыг хийснээр тухайн оюутан нийт 1.6 * 15 буюу 24 оноо авна. Бие даах ажлыг хэвлэж үзүүлж чадахгүй бол .doc байдлаар үзүүлж болно. Бие даах ажил нь тодорхой сэдэвтэй байх бөгөөд тухайн сэдвээс хамаарч ажлын бодлогын даалгавар тодорхойлогдоно. Бие даах ажил нь дараах бүлэг хэсгүүдээс тогтоно. 1. Бодлого зохиох 2. Тестийн асуулт зохиох 3. (*.h ) файлуудаас стандарт функцууд болон тэдгээрийн хэрэглээг тайлбарлах, жишээ программ бичих 4. Бодлого бодох Багш бие даах ажлын бодлогын даалгавар өгөхдөө хэд хэдэн вариантаар өгөгдлүүдийг санал болгох ба оюутан өөрийн сонгосон вариантын өгөгдлийг ашиглан бие даах ажлыг гүйцэтгэнэ. Оюутан нэг л удаа вариантаа сонгосон бол дараа дараагийн бие даах ажлуудыг тэр вариантаар л хийх болно. Тиймээс оюутан эхний бие даах ажлыг хийхдээ л вариантаа сонгон түүнийгээ багшид тэмдэглүүлэх ёстой. - БОДЛОГО ЗОХИОХ - Бие даах ажил нь тодорхой сэдэвтэй байх бөгөөд тухайн сэдвийг сайн ойлгосон оюутан тухайн бодлогыг бодож чадахаар тийм бодлогуудыг зохиох ёстой. Бодлогын бодолтыг заавал бичих албагүй. Гэхдээ багш энэ хэсгийг оюутан өөрөө хийсэн эсэхийг шалгахын тулд бодлогын бодолтыг асуух болно. Иймээс оюутан өөрийн зохиосон бодлогоо бодож чаддаг байх ёстой. Зохиосон бодлого бүрийг 0.1 хүртэлх оноогоор дүгнэнэ. Оюутан бодлогоо зохиохдоо өөрийн үзсэн мэдлэгтээ л тулгуурлан зохиох ёстой. Өөрөөр хэлбэл тухайн оюутан өөрөө бодож чадахгүй буюу өөрийн үзээгүй сэдвийг хамарсан бодлого зохиох ёсгүй. Жишээ нь : “ Оюутан printf , scanf функц ба + - * / үндсэн арифметик үйлдлүүд ба хувьсагч, хувьсагчийн төрлүүдийн тухай үзжээ . ” гэвэл энэ үзсэн мэдлэгээ ашиглаж л бодох тийм хялбар бодлого зохиох ёстой. ♦ 2 тооны арифметик дундаж ол. ♦ Бодит тоо оруулахад түүний бутархай хэсгийг хэвлэх программ зохио ♦ гэх мэт . . . ♦ Тухайн оюутан хэр зэрэг хэцүү бодлого зохиосон бэ ? гэдгээс хамаарч багш үнэлгээ тавихгүй. ♦ Зөвхөн өмнөх сэдвүүдийг (Бие даах ажлын сэдэв буюу түүнээс өмнөх сэдэв) үзсэн оюутан л бодож

чадах тийм хялбар бодлого байх ёстой. ♦ Өөрөөр хэлбэл бодлогын хүнд хөнгөнөөс дүн шалтгаалахгүй. - ТЕСТИЙН АСУУЛТ ЗОХИОХ -

Page 162: Programchlaliin c hel

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

b) printf(“%.2f”,d);

Тестийн асуултын агуулга нь тухайн бодлогын даалгаварт зааж өгсөн сэдвүүдийн хүрээнд л байх ёстой. Жишээ :

Бодлогын даалгавар : scanf , printf функцуудын хэрэглээгээр тестийн асуулт зохио. 1. d нэртэй float хувьсагчийн утгыг 2 орны нарийвчлалтайгаар хэвлэ.

a) printf(“%f”,d);

c) printf(“%2f”,d); d) printf(“%f”,&d);

2. d нэртэй бодит тоон хувьсагчийн утгыг хэрэглэгчээс унших команд ? a) scanf(“%s”,d); b) scanf(“d”); c) scanf(“%f”,&d); d) scanf(“%f”,d);

Энэ жишээнд зөвхөн scanf ба printf функцуудын хэрэглээгээр л тестийн асуулт зохиожээ. Тестийн асуултыг дүгнэхдээ асуулт бүрийг 0.2 хүртэлх оноогоор дүгнэнэ. Оюутан оновчтой сайн асуулт зохиосон бол багш нэмэлт оноо өгч болно. Тестийг оюутан өөрөө зохиосон эсэхийг багш шалган, оюутнаар тайлбарлуулах болно. Тестийн асуултуудыг зохиохдоо тестийн дараах хэлбэрийг голчлон ашиглана. Гэхдээ оюутан өөрөө оновчтой шинэ хэлбэр сонгож чадсан бол багш үнэлгээ нэмж өгнө. 1 . _________________________ _________________________ _________________________ бодлогын даалгавар эсвэл асуулт

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:163

_________________________ a) _____________________________ Хариултууд b) _____________________________ c) _____________________________ d) . . .

- СТАНДАРТ ФУНКЦУУД - Си хэлийг зохиохдоо программ зохиогчийн ажлыг хөнгөвчлөх үүднээс байнга хэрэглэгддэг хэрэгтэй функцуудыг урьдчилан бичиж, функцуудын сан байдлаар бэлдэж өгсөн байдаг. Ийм функцуудыг стандарт функцууд гэж нэрлэдэг. Оюутнууд мэргэжлийн хичээлүүдийн курсын ажил, лабораторийн ажил гүйцэтгэхдээ эдгээр функцыг өргөнөөр ашиглах шаардлагатай болдог. Иймээс эдгээр функцуудыг урьдчилан судалж мэдсэн байх нь зүйтэй юм. Бие даалтын ажлын энэ хэсэгт оюутан бодлогын даалгаварт зааж өгсөн функцуудыг судалж, тэдгээрийг ашигласан жишээ программ бичих болно. Turbo C хэл нь өөрийн стандарт функцуудын санг тайлбарласан тусламжийн мэдээлэлтэй байдаг ба энэ мэдээллийг ашиглаж болно. Энэ даалгаврыг хийснээр Turbo C хэлний стандарт функцуудыг судлан тэднийг хэрэглэх дадлага эзэмшинэ. ♦ Оюутан тухайн функцын хэрэглээг тайлбарлахдаа түүний аргументуудын талаар дэлгэрэнгүй

танилцуулах ёстой.

Page 163: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:164

♦ Мөн аргументуудын тодорхой утгаас хамаарч функцын хэрэглээ өөрчлөгддөг бол тухайн утга тохиолдол бүрийг хамарсан жишээ үзүүлэх шаардлагатай. Жишээ нь fprintf –ээр дэлгэц болон принтерт хэвлэдэг тул тухайн тохиолдол бүрийг тусгасан жишээ авах ёстой.

♦ Оюутан жишээ программ бичихдээ тухайн функцын буцаах утгыг боловсруулах шаардлагатай. Өөрөөр хэлбэл функцын буцаах утгын талаар бас танилцуулах ёстой. Жишээ : n=scanf(“%d/%d/%d”, &m, &d, &y); if(n=3) printf(“ Бүх утгууд амжилттай уншигдлаа …”); else printf(“ Зарим утгууд амжилттай уншигдсангүй ... ”);

Энэ хэсэгт оюутны тайлбарласан 1 функцэд багш 0.2 хүртэлх оноо өгнө. Оюутан 4 функц тайлбарласан бол багш 0.8 хүртэлх оноо өгнө гэсэн үг. Багш бие даах ажлын бодлогын даалгавар өгөхдөө хэд хэдэн вариантаар функцуудыг санал болгох ба оюутан өөрийн сонгосон вариантын функцуудыг л тайлбарлах болно. Оюутан нэг л удаа вариантаа сонгосон бол дараа дараагийн бие даах ажлуудыг тэр вариантаар л хийх болно. Тиймээс оюутан эхний бие даах ажлыг хийхдээ л вариантаа сонгон түүнийгээ багшид тэмдэглүүлэх ёстой. - БОДЛОГО БОДОХ -

БОДЛОГО 2 :

Машины азтай дугааруудыг хэвлэ. / Машины дугаар 4 оронтой /

/* Машины азтай дугааруудыг хэвлэх */

Энэ хэсэгт багш тодорхой бодлогуудыг даалгавар болгон өгөх ба оюутан эдгээр бодлогыг зөвхөн өөрөө бодох шаардлагатай. Энэ бодлогууд нь бие даах ажлын сэдэв болон түүнээс өмнөх сэдвүүдийг хамарсан хялбар бодлогууд байх болно. Иймд эдгээр бодлогыг бодсоноор оюутан үзсэн мэдлэгээ улам баталгаажуулах алхам болно.

Бодлогууд нь бодолтын хувьд хялбар алгоритмаар шийдэгдэх хөнгөн бодлогууд байна. Гагцхүү оюутан тухайн бодлогыг бодохдоо Си хэлний өргөн боломжуудаас түлхүү ашиглах шаардлагатай. Өөрөөр хэлбэл оюутан бодлого бодоход биш Си хэлэнд суралцах ёстой.

Оюутан тухайн бодсон бодлогынхоо тесктэнд сайн тайлбар хийсэн байх шаардлагатай. Энэ нь тухайн оюутны программ зохиогч болох замд тустай үйл ажиллагаа юм. Оюутны бодсон бодлогыг багш 0.2 хүртэлх оноогоор дүгнэх болно. Гэхдээ оюутан бодлогыг өөрөө бодоогүй гэж багш дүгнэвэл түүнд оноо тавихгүй бөгөөд тэр дахиж энэ бодлогыг үзүүлэх эрхгүй. Дараах жишээнээс оюутан хэрхэн бодлого бодсон, мөн бодлогын тесктээ хэрхэн тайлбарласан болохыг үзнэ үү .

Бодлогын даалгавар :

Бодолт :

/* БИЕ ДААЛТЫН АЖИЛ № 1 */ /* БОДЛОГО 2 */

/* Бодсон : Д. Чинбат SW99B099 */

Page 164: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:165

/* */ #include <stdio.h> #include <conio.h> unsigned int i,a,b,s; main()

getch(); / * Товч дарахыг хүлээх */

{ printf(“\n Машины азтай дугаарууд \n\n”); for(i=1; i<100;i++) /* 2 оронтой тоонуудаас шалгах */ { s=i%10 + (i/10); /* 2 оронтой тооны 2 цифрийг олох */ for(a=0;a<10;a++) /* Дахин өөр 2 оронтой тоонуудаас өмнөх */ for(b=0;b<10;b++) /* тоотой таарах хосыг сонгох */ if(s==a+b) /* Олдсон хос 2 оронтой тоонуудаар */ printf(“%d”, 100*i+10*a+b); /* азтай дугаар үүсэх бол хэвлэх */ };

} Бие даах ажлын агуулгыг танилцууллаа. Оюутнуудад санаа өгөх зорилгоор бие даах ажлыг хэрхэн хийж гүйцэтгэсэнг харуулах жишээг хавсаргав.

Компьютерийн техник Менежментийн Сургууль

Программ хангамж, Үйлдлийн

судалгааны тэнхим

БИЕ ДААЛТЫН АЖИЛ 1

Гүйцэтгэсэн : Д. Чинбат / SW99B099 /

Page 165: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:166

БОДЛОГЫН ДААЛГАВАР :

Даалгаврууд Оноо 1. scanf функцыг ашиглах 2 ш бодлого зохио. тус бүр 0.1 2. printf() функцыг ашиглаж сурсан эсэхийг шалгах 4ш тестийн

асуулт зохио. тус бүр 0.2

3. printf функц нь ямар аргументууд авч яаж ажилладаг болохыг тайлбарла.

0.2

4. Машины азтай дугаар олох программ бич. 0.4 Даалгавар 1 . Бодлого зохиох 1. Он сарыг дараах форматаар хэрэглэгчээс унших программ зохио.

mm/dd/yy буюу хэрэглэгч 12/31/99 гэж оруулах ёстой. - БОДОЛТЫГ ХҮСВЭЛ БИЧИЖ БОЛНО -

2. Тэмдэгт нэр массивыг хэрэглэгчээс унших программ зохио. Жишээ нь хүмүүсийн нэрсээс бүрдэх массив байгуулах …

Даалгавар 2 . Тест зохиох 1. Сайн байна уу гэсэн үгийг хэвлээд , курсорыг дараагийн мөрд шилжүүлж буй функц нь ?

a) printf(“Сайн байна уу \n”); b) print(“Сайн байна уу \n”); c) printf(‘Сайн байна уу \n’); d) printf(“Сайн байна уу \n”)

2. d нэртэй float хувьсагчийн утгыг 2 орны нарийвчлалтайгаар хэвлэ. a) printf(“%f”,d); b) printf(“%.2f”,d); c) printf(“%2f”,d); d) printf(“%f”,&d);

3. Сайн байна уу гэсэн үгийг хэвлээд , дуут дохио гаргах функц нь ?

Page 166: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:167

a) printf(“Сайн байна уу BEEP ”); b) print(“Сайн байна уу \a”); c) printf(‘Сайн байна уу \a’); d) printf(“Сайн байна уу \b ”);

4. d нэртэй unsigned int хувьсагчийг хэвлэдэг функц ?

a) printf(“%i”,d); b) printf(“%d”,d);

c) printf(“%u”,d); d) printf(“%f”,d);

Даалгавар 3 . Стандарт функцууд

1. printf функц

Таны программ ажиллаж дуусаад тодорхой үр дүнг гаргах бөгөөд түүнийг бид үзэх буюу дэлгэцэнд үр дүн нь хэвлэгдэх зайлшгүй шаардлагатай байдаг. Си хэлэнд үүнийг хэрэгжүүлдэг printf гэсэн функц байдаг. Энэ функц нь дэлгэцэнд тоо, тэмдэгт , үг гаргахад ашиглагдана. printf функц нь маш өргөн боломжтой бөгөөд ихэнх хүмүүс боломжийг нь бүрэн ашиглаж чаддаггүй. printf функцын формат Энэ функцын үндсэн формат нь : printf(Удирдлагын тэмдэгт мөр [,өгөгдөл] ); Тайлбар: Си хэлэнд функцуудын форматыг бичиж үзүүлэхдээ зарим тусгай тэмдэглэгээг хэрэглэдэг ба энд [ ] гэсэн тэмдэглэгээг ашигласан байна. Ер нь тэмдэглэгээг зөвхөн танд ойлгуулах үүднээс л ашигладаг ба энэ нь тайлбарлаж буй функцын бичлэгт ордоггүй юм. Иймээс энэ функцыг ашиглахдаа [ ] хаалтыг бичихгүй байх болно. Энэ хаалтанд бичигдсэн өгөгдөл түүнийг бичихгүй байж болно гэсэн утгыг агуулдаг. Удирдлагын тэмдэгт мөр нь тухайн өгөгдөл ямар хэлбэрээр дэлгэцэнд гарахыг тодорхойлдог. printf(“ Жишээ %d”,1); /* Энэ жишээнд Жишээ 1 гэсэн үгийг хэвлэж байна*/ Си хэлэнд тэмдэгт мөрийг заавал хашилтанд (“”) бичдэг. Тэгэхээр удирдлагын тэмдэгт мөр нь заавал хашилтанд бичигдэнэ. Си хэлэнд бичигдсэн команд бүр “;”-аар төгсөх ёстой. Өөрөөр хэлбэл энэ нь команд дуусч байна, үүнийг биелүүлэх ёстой гэдгийг Си энэ тэмдэгтээр мэдэх болно. Курсорын байрлал удирдах тэмдэгтүүд Си хэлэнд маш олон ийм тэмдэгтүүд байдаг ба тэднээс зарим хэсгийг нь л их өргөн ашигладаг.

Page 167: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:168

Курсорын байрлал удирдах тэмдэгтүүд Код Тайлбар \n Шинэ мөр \a Дуут дохио гаргах \t Tab тэмдэгт ( Хэд хэдэн хоосон зай ) \\ \ тэмдэгтийг өөрийг нь хэвлэх \” “ тэмдэгт хэвлэх \r Мөрийн эхэнд

Си тэмдэгт мөрийг хэвлэж байгаад \n тэмдэгт дайралдангуут курсорын байрлалыг дараагийн мөрт шилжүүлдэг. Ингэсний дараа хэвлэгдэх тэмдэгтүүд шинэ байрлалаас цааш хэвлэгдэх болно.

“\a” тусгай тэмдэгтийг хэвлэхэд дуут дохио гардаг. Өмнөх жишээнд бид хоёр тэмдэгт мөр хэвлэхэд тэд 2 мөрт биш , 1 мөрт гарч байсан . Тэгвэл одоо \n тусгай тэмдэгт ашиглан энэ үйлдлийг гүйцэтгэе. Эхлээд эхний тэмдэгт мөрөө хэвлээд дараа нь курсорыг дараагийн мөрт шилжүүлэх шаардлагатай. printf(“ Сайн байцгаана уу !\n”); printf(“ Хичээлээ эхлэцгээе !”);

Тусгай тэмдэгтүүдийг ашигласан жишээ : printf(“Тэмдэгт\tмөр\tхэвлэв.\n”); /* Тэмдэгт мөр хэвлэв. */ printf(“Дохио дуугарав. \a\n”); /* Дохио дуугарав. */ printf(“Тэр \”Үгүй\” гэж хэлсэн.\n”); /* Тэр “Үгүй” гэж хэлсэн. */ printf(“\\ тэмдэгтийг хэвлэв.\n”); /* \\ тэмдэгтийг хэвлэв. */ Хөрвүүлэлтийн тусгай тэмдэгтүүд Та тэмдэгт болон тоо хэвлэхдээ тэдгээрийг яаж хэвлэгдэхийг тодорхойлох хэрэгтэй болдог. Ингэж тодорхойлохдоо хөрвүүлэлтийн тусгай тэмдэгтүүдийг ашигладаг. Хөрвүүлэлтийн тусгай тэмдэгтүүд

Тэмдэгт Тайлбар %d int төрлийн утгыг төлөөлнө. %i int төрлийн утгыг төлөөлнө. %c Зөвхөн нэг тэмдэгт %s Тэмдэгт мөр %o unsigned int (8-т тооллын систем) %u unsigned int %x unsigned int (16-т тооллын систем) %X unsigned int (16-т) %f Бодит тоон утга [-]dddd.ddd %e Бодит тоон утга [-]d.ddd e [+/-]ddd %% % тэмдэгт %p XXXX:YYYY санах ойн хаяг

%hd, %hi, %ho, %hx short int

Page 168: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:169

%ld, %li, %lo, %lx long int %le, %lE, %lf, %lg double

%Le, %LE %Lf, %Lg long double Жич : Хамгийн хялбар бөгөөд юуны түрүүнд бидэнд хэрэг болох тусгай тэмдэгтүүдийг тод хараар бичэв. Тоо, тэмдэгт хэвлэхдээ Удирдлагын тэмдэгт мөр дотор хөрвүүлэлтийн тусгай тэмдэгтүүдийг бичих ба дараа нь Удирдлагын тэмдэгт мөрийн ард хэвлэх утгуудаа таслалаар зааглан харгалзуулан жагсааж өгдөг. Жишээ : printf(“%s %d %f %c\n”,”Hi”,14,-8.76,’x’);

/* БОДЛОГО 1 */

/* Бодсон : Д. Чинбат SW99B099 */

#include <conio.h>

Энэ жишээ нь дараах үр дүнг хэвлэнэ.

Hi 14 -8.760000 x “Hi” тэмдэгт мөр нь хашилтанд бичигдэнэ. Харин Си хэлэнд нэг тэмдэгтийг ‘’ хашилтанд бичдэг. –8.76 гэсэн бодит тоог хэвлэхэд Си түүнийг -8.760000 болгож хэвлэсэн байна. Си хэлэнд бодит тоог хэвлэхдээ % ба f тэмдэгтийн хооронд . тэмдэгтийг хэрэглэн хэвлэгдэх хэлбэрийг тодорхойлно.

Жишээ : printf(“%f %.3f %.2f %.1f”, 4.5678, 4.5678, 4.5678, 4.5678); Үр дүн : 4.567800 4.578 4.57 4.6

Даалгавар 4 . Бодлого бодох БОДЛОГО 1 : Бодлогын даалгавар : Машины азтай дугааруудыг хэвлэ. / Машины дугаар 4 оронтой / Бодолт : /* БИЕ ДААЛТЫН АЖИЛ № 1 */

/* Машины азтай дугааруудыг хэвлэх */

/* */ #include <stdio.h>

unsigned int i,a,b,s; main() { printf(“\n Машины азтай дугаарууд \n\n”);

for(i=1; i<100;i++) /* 2 оронтой тоонуудаас шалгах */ { s=i%10 + (i/10); /* 2 оронтой тооны 2 цифрийг олох */ for(a=0;a<10;a++) /* Дахин өөр 2 оронтой тоонуудаас өмнөх */

Page 169: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:170

for(b=0;b<10;b++) /* тоотой таарах хосыг сонгох */ if(s==a+b) /* Олдсон хос 2 оронтой тоонуудаар */ printf(“%d”, 100*i+10*a+b); /* азтай дугаар үүсэх бол хэвлэх */ }; getch(); / * Товч дарахыг хүлээх */

}

БИЕ ДААХ АЖИЛ № 1 / СЭДЭВ : PRINTF ФУНКЦ /

Энэ бие даах ажил нь оюутан Лекц 1 –ээр үзсэн мэдлэгээ баталгаажуулах дасгалуудаас бүрдэнэ. Даалгавар 1 . БОДЛОГО ЗОХИОХ Энэ даалгаврыг хийхдээ дараах зүйлсийг анхаарах хэрэгтэй.

♦ Бид хувьсагч болон өгөгдлийн төрөл үзээгүй байгаа гэдгийг санах ёстой. ♦ Бид тэмдэгт мөр хэвлэж , тусгай тэмдэгтүүдийг хэрэглэж л мэднэ. ♦ Тиймээс бодлого зохиохдоо хувьсагч ашиглаж бодох бодлого зохиож болохгүй.

#include <stdio.h>

БОДЛОГЫН ДААЛГАВАР: printf функцыг ашиглах 4 бодлого зохио. БОДЛОГЫН ҮНЭЛГЭЭ : 1 бодлого 0.1 оноо буюу нийт 0.4 оноо ЖИШЭЭ : 10 ш (*) тэмдэгтийг доорх байдлаар хэвлэ.

* * * * ** * * * *

ЖИШЭЭНИЙ БОДОЛТ :

main() { printf(“* *\n”); printf(“* *\n”); printf(“**\n”); printf(“* *\n”); printf(“* *\n”); } Бодлого зохиохдоо хөрвүүлэлтийн тусгай тэмдэгтүүд болон курсор шилжүүлэх тусгай тэмдэгтүүдийг

Page 170: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:171

ашиглаж сурахаар бодлого зохио. Даалгавар 2 . ТЕСТ ЗОХИОХ Энэ даалгаврыг хийхдээ “Үзсэн сэдвийнхээ хүрээнд л тест зохиох” гэсэн дүрмийг баримтлах хэрэгтэй. БОДЛОГЫН ДААЛГАВАР: printf функцын хэрэглээгээр 4 ш тестийн

асуулт зохио. БОДЛОГЫН ҮНЭЛГЭЭ : 1 асуулт 0.2 оноо буюу нийт 0.8 оноо ЖИШЭЭ : 1. Сайн байна уу гэсэн үгийг хэвлээд , курсорыг дараагийн мөрд шилжүүлж буй функц нь ?

a) printf(“Сайн байна уу \n”); b) print(“Сайн байна уу \n”); c) printf(‘Сайн байна уу \n’); d) printf(“Сайн байна уу \n”)

Даалгавар 3 . СТАНДАРТ ФУНКЦУУД Энэ даалгаврыг хийхдээ оюутан вариантаа сонгон багшид тэмдэглүүлэх хэрэгтэй. вариант Функц 1

Оноо : 0.1 Жишээ хэрэггүй

Функц 2 Оноо : 0.1 Жишээ хэрэггүй

Функц 3 Оноо : 0.1 Жишээ хэрэгтэй Жишээ : 0.1

Нийт

a) sprintf clrscr clreol + Жиш 0.4 b) vprintf clrscr clreol + Жиш 0.4 c) fprintf clrscr clreol + Жиш 0.4 d) vsprintf clrscr textcolor + Ж 0.4 e) cprintf clrscr 0.4 textcolor + Ж

Вариантаа сонгосон оюутан зөвхөн өөрийн вариантын функцуудыг тайлбарлана. Тайлбарлахдаа хэрвээ хүснэгтэд жишээ хэрэггүй гэсэн тэмдэглэгээ хийсэн бол тухайн функцыг дэлгэрэнгүй тайлбарлахдаа жишээ программ бичих хэрэггүй гэсэн үг. Харин жишээ бичих шаардлагатай функцууд дээр + Жиш гэсэн тэмдэглэгээ хийсэн байх бөгөөд дээр нь жишээний оноог зааж өгсөн байна. Дээр даалгаварт өгсөн функцууд нь stdio.h, conio.h файлуудад тодорхойлогдсон функцууд болно.

БИЕ ДААХ АЖИЛ № 2 / СЭДЭВ : ХУВЬСАГЧ ЗАРЛАХ, SIZEOF ҮЙЛДЭЛ, ТОГТМОЛ ЗАРЛАХ, ТӨРЛИЙН ХУВИРГАЛТ /

Даалгавар 1 . БОДЛОГО ЗОХИОХ БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан

4 ш бодлого зохио. БОДЛОГЫН ҮНЭЛГЭЭ : 1 бодлого 0.1 оноо буюу нийт 0.4 оноо ЖИШЭЭ : long double төрлийн k гэсэн нэртэй хувьсагчид анхны утга олгон зарлаад, тухайн хувьсагчийн утгыг таслалаас хойш 2 орны нарийвчлалтайгаар хэвлэх программ зохио. ЖИШЭЭНИЙ БОДОЛТ :

Page 171: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:172

#include <stdio.h> long double k=10.35612; main() { printf(“ k = %.2Lf ”, k); } Бодлого зохиохдоо дээрх сэдэв бүрийг хамарсан бодлого зохиовол сайн. Даалгавар 2 . ТЕСТ ЗОХИОХ Энэ даалгаврыг хийхдээ “Үзсэн сэдвийнхээ хүрээнд л тест зохиох” гэсэн дүрмийг баримтлах хэрэгтэй. БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан

4 ш тестийн асуулт зохио. БОДЛОГЫН ҮНЭЛГЭЭ : 1 асуулт 0.2 оноо буюу нийт 0.8 оноо ЖИШЭЭ : 1. Max гэсэн тогтмолыг зөв зарласан үйлдэл нь ?

a) int Max=1; b) #define MAX 1 c) #define Max 1 d) #define Max 1;

2. arctan гэсэн нэртэй бодит тоон хувьсагчийг зөв зарласан нь ? a) arctan : float; b) real arctan; c) double arctan; d) arctan float;

Даалгавар 3 . СТАНДАРТ ФУНКЦУУД Энэ даалгаврыг хийхдээ оюутан вариантаа сонгон багшид тэмдэглүүлэх хэрэгтэй. вариант Функц 1

Оноо : 0.1 Жишээ хэрэгтэй Жишээ : 0.1

Функц 2 Оноо : 0.1 Жишээ хэрэгтэй Жишээ : 0.1

Нийт

a) textbackground + Жиш gotoxy + Жиш 0.4 b) textbackground + Жиш gotoxy + Жиш 0.4 c) textattr + Жиш gotoxy + Жиш 0.4 d) textattr + Жиш gotoxy + Жиш 0.4 e) wherex, wherey + Жиш gotoxy + Жиш 0.4

Вариантаа сонгосон оюутан зөвхөн өөрийн вариантын функцуудыг тайлбарлана. Тайлбарлахдаа хэрвээ хүснэгтэд жишээ хэрэггүй гэсэн тэмдэглэгээ хийсэн бол тухайн функцыг дэлгэрэнгүй тайлбарлахдаа жишээ программ бичих хэрэггүй гэсэн үг. Харин жишээ бичих шаардлагатай функцууд дээр + Жиш гэсэн тэмдэглэгээ хийсэн байх бөгөөд дээр нь жишээний оноог зааж өгсөн байна.

Page 172: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:173

Дээр даалгаварт өгсөн функцууд нь conio.h файлд тодорхойлогдсон функцууд болно.

БИЕ ДААХ АЖИЛ № 3 / СЭДЭВ : SCANF, GETCHAR, GETCH,

GETCHE ФУНКЦ / Даалгавар 1 . БОДЛОГО ЗОХИОХ БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан 4 ш бодлого зохио. БОДЛОГЫН ҮНЭЛГЭЭ : 1 бодлого 0.1 оноо буюу нийт 0.4 оноо ЖИШЭЭ : Он сарыг дараах форматаар хэрэглэгчээс унших программ зохио. mm/dd/yy буюу хэрэглэгч 12/31/99 гэж оруулна. ЖИШЭЭНИЙ БОДОЛТ : #include <stdio.h> int month,day,year, k;

main()

{ printf(“ Төрсөн өдрөө оруулна. Формат : mm/ dd/yy \n”); k=scanf(“%d/%d/%d”,&month, &day, &year); printf(“ Амжилттай уншсан хувьсагчдын тоо = %d \n”,k); printf(“ Таны төрсөн өдөр : %d оны %d сарын %d \n”,year,month,day); } Бодлого зохиохдоо дээрх сэдэв бүрийг хамарсан бодлого зохиовол сайн. Даалгавар 2 . ТЕСТ ЗОХИОХ Энэ даалгаврыг хийхдээ “Үзсэн сэдвийнхээ хүрээнд л тест зохиох” гэсэн дүрмийг баримтлах хэрэгтэй. БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан

4 ш тестийн асуулт зохио. БОДЛОГЫН ҮНЭЛГЭЭ : 1 асуулт 0.2 оноо буюу нийт 0.8 оноо ЖИШЭЭ : 1. d нэртэй бодит тоон хувьсагчийн утгыг хэрэглэгчээс унших команд ?

a) scanf(“%s”,d); b) scanf(“d”); c) scanf(“%f”,&d); d) scanf(“%f”,d);

Page 173: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:174

Даалгавар 3 . СТАНДАРТ ФУНКЦУУД Энэ даалгаврыг хийхдээ оюутан вариантаа сонгон багшид тэмдэглүүлэх хэрэгтэй. вариант Функц 1

Оноо : 0.1 Жишээ хэрэггүй

Функц 2 Оноо : 0.1 Жишээ хэрэггүй

Функц 3 Оноо : 0.1 Жишээ хэрэгтэй Жишээ : 0.1

Нийт

a) sscanf kbhit ungetch + Жиш 0.4 b) vscanf kbhit ungetch + Жиш 0.4 c) fscanf kbhit ungetch + Жиш 0.4 d) vsscanf kbhit ungetch + Жиш 0.4 e) cscanf kbhit ungetch + Жиш 0.4

Вариантаа сонгосон оюутан зөвхөн өөрийн вариантын функцуудыг тайлбарлана. Тайлбарлахдаа хэрвээ хүснэгтэд жишээ хэрэггүй гэсэн тэмдэглэгээ хийсэн бол тухайн функцыг дэлгэрэнгүй тайлбарлахдаа жишээ программ бичих хэрэггүй гэсэн үг. Харин жишээ бичих шаардлагатай функцууд дээр + Жиш гэсэн тэмдэглэгээ хийсэн байх бөгөөд дээр нь жишээний оноог зааж өгсөн байна. Дээр даалгаварт өгсөн функцууд нь stdio.h, conio.h файлуудад тодорхойлогдсон функцууд болно.

БИЕ ДААХ АЖИЛ № 4 / СЭДЭВ : ИЛЭРХИЙЛЭЛ, АРИФМЕТИК ҮЙЛДЛҮҮД,

УТГА ОЛГОХ ҮЙЛДЭЛ, ++ -- ҮЙЛДЛҮҮД, БИТ ҮЙЛДЛҮҮД / Даалгавар 1 . БОДЛОГО ЗОХИОХ БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан 4 ш бодлого зохио. БОДЛОГЫН ҮНЭЛГЭЭ : 1 бодлого 0.1 оноо буюу нийт 0.4 оноо ЖИШЭЭ : Өгөгдсөн 3 бодит тооны арифметик дундажийг ол. ЖИШЭЭНИЙ БОДОЛТ : #include <stdio.h> float a,b,c; main() { printf(“Бодит тоо оруул : ”); scanf(“%f”,&a); printf(“Бодит тоо оруул : ”); scanf(“%f”,&b); printf(“Бодит тоо оруул : ”); scanf(“%f”,&c);

Page 174: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:175

printf(“\nАрифметик дундаж : %.2f”,(a+b+c)/3); } Бодлого зохиохдоо дээрх сэдэв бүрийг хамарсан бодлого зохиовол сайн. Даалгавар 2 . ТЕСТ ЗОХИОХ Тест зохиохдоо дээрх сэдэв бүрийг хамарсан асуулт зохиовол сайн. БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан

4 ш тестийн асуулт зохио. АСУУЛТЫН ҮНЭЛГЭЭ : 1 асуулт 0.2 оноо буюу нийт 0.8 оноо ЖИШЭЭ : 1. char x=1,y=0,z=1,d=0;

d=++x | ++y | z++; бол илэрхийлэл биелэгдсэний дараах хувьсагчдийн утга нь : a) x=1 y=1 z=2 d=3 b) x=2 y=1 z=2 d=3 c) x=2 y=1 z=2 d=2 d) x=2 y=1 z=2 d=2

Даалгавар 3 . СТАНДАРТ ФУНКЦУУД вариант Функц 1

Оноо : 0.1 Жишээ хэрэггүй

Функц 2 Оноо : 0.1 Жишээ хэрэггүй

Функц 3 Оноо : 0.1 Жишээ хэрэгтэй Жишээ : 0.1

Нийт

a) pow10 sqrt ceil + Жиш 0.4 b) pow10 sqrt floor + Жиш 0.4 c) pow10 ceil + Жиш 0.4 sqrt d) pow10 sqrt floor + Жиш 0.4 e) pow10 sqrt ceil + Жиш 0.4

Функцуудыг дэлгэрэнгүйгээр тайлбарлах шаардлагатай. Дээр даалгаварт өгсөн функцууд нь math.h файлуудад тодорхойлогдсон функцууд болно.

Page 175: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:176

БИЕ ДААХ АЖИЛ № 5 / СЭДЭВ : ХАРЬЦУУЛАХ ҮЙЛДЛҮҮД, ЛОГИК ҮЙЛДЛҮҮД

IF, SWITCH КОМАНД, ҮЙЛДЛҮҮДИЙН ЗЭРЭГЛЭЛ / Даалгавар 1 . БОДЛОГО ЗОХИОХ

БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан

float a,b,c, d;

d=a; if(d<b) d=b;

printf(“\nХамгийн их утга нь : %.2f”,d);

4 ш бодлого зохио.

БОДЛОГЫН ҮНЭЛГЭЭ : 1 бодлого 0.1 оноо буюу нийт 0.4 оноо

ЖИШЭЭ : Өгөгдсөн 3 тооны хамгийн ихийг ол.

ЖИШЭЭНИЙ БОДОЛТ : #include <stdio.h>

main() { printf(“Бодит тоо оруул : ”); scanf(“%f”,&a); printf(“Бодит тоо оруул : ”); scanf(“%f”,&b); printf(“Бодит тоо оруул : ”); scanf(“%f”,&c);

if(d<c) d=c;

}

Бодлого зохиохдоо дээрх сэдэв бүрийг хамарсан бодлого зохиовол сайн.

Даалгавар 2 . ТЕСТ ЗОХИОХ

1. k хувьсагчийн утга 10-тай тэнцүү бол YES гэж хэвлэх үйлдэл нь ?

Тест зохиохдоо дээрх сэдэв бүрийг хамарсан асуулт зохиовол сайн.

БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан 5 ш тестийн асуулт зохио.

АСУУЛТЫН ҮНЭЛГЭЭ : 1 асуулт 0.2 оноо буюу нийт 1.0 оноо ЖИШЭЭ :

a) if( !(k<>10) ) printf(“YES \n”); b) if( k=10 ) printf(“YES \n”); c) if( !(k!=10) ) printf(“YES \n”); d) if( !k==10 ) printf(“YES \n”);

Даалгавар 3 . СТАНДАРТ ФУНКЦУУД

Page 176: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:177

вариант Функц 1

Оноо : 0.1 Жишээ хэрэгтэй Жишээ : 0.1

Нийт

a) isalpha + Жишээ 0.2 b) isaalnum + Жишээ 0.2 c) isdigit + Жишээ 0.2 d) isspace + Жишээ 0.2 e) iscntrl + Жишээ 0.2

Функцуудыг дэлгэрэнгүйгээр тайлбарлах шаардлагатай. Дээр даалгаварт өгсөн функцууд нь ctype.h файлд тодорхойлогдсон функцууд болно.

БИЕ ДААХ АЖИЛ № 6 / СЭДЭВ : FOR, WHILE, DO WHILE ДАВТАЛТУУД,

CONTINUE, BREAK, GOTO КОММАНД / Даалгавар 1 . БОДЛОГО ЗОХИОХ

int i,s;

БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан 2 ш бодлого зохио. БОДЛОГЫН ҮНЭЛГЭЭ : 1 бодлого 0.1 оноо буюу нийт 0.2 оноо ЖИШЭЭ : 1-ээс 10 хүртэлх тоонуудын нийлбэрийг ол. ЖИШЭЭНИЙ БОДОЛТ :

#include <stdio.h>

main() { for(i=1,s=0; i<=10; i++) s+=i; printf(“ Нийлбэр : %d ”, s); }

Page 177: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:178

Бодлого зохиохдоо дээрх сэдэв бүрийг хамарсан бодлого зохиовол сайн.

Даалгавар 2 . ТЕСТ ЗОХИОХ Тест зохиохдоо дээрх сэдэв бүрийг хамарсан асуулт зохиовол сайн. БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан

5 ш тестийн асуулт зохио. АСУУЛТЫН ҮНЭЛГЭЭ : 1 асуулт 0.2 оноо буюу нийт 1.0 оноо

d) for(i=1,s=0; i<=10; j++) s+=i;

Даалгавар 3 . СТАНДАРТ ФУНКЦУУД

ЖИШЭЭ : 1. 1-ээс 10 хүртэлх тоонуудын нийлбэрийг олсон үйлдэл нь :

a) for(i=1; i<=10; i++) s+=i; b) for(i=1,s=0; i<=10; i++) s+=i; c) for(s=0,i=1; i<10; i++) s+=i;

Функцуудыг дэлгэрэнгүйгээр тайлбарлах шаардлагатай.

Оноо : 0.1 Жишээ хэрэгтэй Жишээ : 0.1

Нийт вариант Функц 1

Жишээ хэрэггүй

Функц 2 Оноо : 0.1 Жишээ хэрэггүй

Функц 3 Оноо : 0.1

a) islower max rand + Жиш 0.4 b) isupper min random + Жиш 0.4 c) tolower max randomize+ Жиш 0.4 d) toupper min rand + Жиш 0.4 e) isxdigit max random + Жиш 0.4

Дээр даалгаварт өгсөн функцууд нь math.h, ctype.h файлуудад тодорхойлогдсон функцууд болно.

Page 178: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:179

БИЕ ДААХ АЖИЛ № 7 / СЭДЭВ : ФУНКЦ, ЛОКАЛЬ ХУВЬСАГЧ,

УТГА БУЦААХ, & ҮЙЛДЭЛ / Даалгавар 1 . БОДЛОГО ЗОХИОХ БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан 2 ш бодлого зохио. БОДЛОГЫН ҮНЭЛГЭЭ : 1 бодлого 0.1 оноо буюу нийт 0.2 оноо ЖИШЭЭ : Өгөгдсөн 2 тооны MIN –ийг олох функц зохио. ЖИШЭЭНИЙ БОДОЛТ :

main()

Даалгавар 2 . ТЕСТ ЗОХИОХ

#include <stdio.h> float MIN(i,j) float i,j; { if (i>j) return j; else return i; }

{ printf(“ MIN : %.3f ”, MIN(10.12,10.423)); }

Бодлого зохиохдоо дээрх сэдэв бүрийг хамарсан бодлого зохиовол сайн.

Тест зохиохдоо дээрх сэдэв бүрийг хамарсан асуулт зохиовол сайн. БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан

5 ш тестийн асуулт зохио. АСУУЛТЫН ҮНЭЛГЭЭ : 1 асуулт 0.2 оноо буюу нийт 1.0 оноо ЖИШЭЭ : 1. return үйлдлийг зөв хэрэглэсэн нь :

a) return a; b) return (a) c) return x=a+k d) return x, k;

Даалгавар 3 . СТАНДАРТ ФУНКЦУУД

Page 179: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:180

Функцуудыг дэлгэрэнгүйгээр тайлбарлах шаардлагатай. вариант Функц 1

Оноо : 0.1 Жишээ хэрэггүй

Функц 2 Оноо : 0.1 Жишээ хэрэггүй Жишээ хэрэгтэй

Функц 3 Оноо : 0.1

Жишээ : 0.1

Нийт

a) isgraph frexp fmod + Жишээ 0.4 b) isprint hypot exp + Жишээ 0.4 c) ispunct labs modf + Жишээ 0.4 d) isprint ldexp poly + Жишээ 0.4 e) isascii cabs matherr + Жишээ 0.4

Дээр даалгаварт өгсөн функцууд нь math.h, ctype.h файлуудад тодорхойлогдсон функцууд болно.

БИЕ ДААХ АЖИЛ № 8 / СЭДЭВ : СТАТИК ХУВЬСАГЧ, EXTERN ХУВЬСАГЧ,

РЕКУРС ФУНКЦ, TYPEDEF / Даалгавар 1 . БОДЛОГО ЗОХИОХ БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан 2 ш бодлого зохио. БОДЛОГЫН ҮНЭЛГЭЭ : 1 бодлого 0.1 оноо буюу нийт 0.2 оноо Бодлого зохиохдоо дээрх сэдэв бүрийг хамарсан бодлого зохиовол сайн. Даалгавар 2 . ТЕСТ ЗОХИОХ Тест зохиохдоо дээрх сэдэв бүрийг хамарсан асуулт зохиовол сайн. БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан

АСУУЛТЫН ҮНЭЛГЭЭ : 1 асуулт 0.2 оноо буюу нийт 1.0 оноо

5 ш тестийн асуулт зохио.

Даалгавар 3 . СТАНДАРТ ФУНКЦУУД

Page 180: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:181

Функцуудыг дэлгэрэнгүйгээр тайлбарлах шаардлагатай. вариант Функц 1

Оноо : 0.1 Жишээ хэрэгтэй Жишээ : 0.1

Оноо : 0.1

Жишээ : 0.1

Нийт Функц 2

Жишээ хэрэгтэй

a) atof + Жишээ itoa + Жишээ 0.4 b) atoi + Жишээ 0.4 ltoa + Жишээ c) atol + Жишээ fcvt + Жишээ 0.4 d) ultoa + Жишээ 0.4 strtod + Жишээ e) strtol + Жишээ fcvt + Жишээ 0.4

Дээр даалгаварт өгсөн функцууд нь stdlib.h файлд тодорхойлогдсон функцууд болно.

БИЕ ДААХ АЖИЛ № 9 / СЭДЭВ : НЭГ БА ОЛОН ХЭМЖЭЭСТ МАССИВ /

Даалгавар 1 . БОДЛОГО ЗОХИОХ БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан 2 ш бодлого зохио. БОДЛОГЫН ҮНЭЛГЭЭ : 1 бодлого 0.1 оноо буюу нийт 0.2 оноо Бодлого зохиохдоо дээрх сэдэв бүрийг хамарсан бодлого зохиовол сайн. Даалгавар 2 . ТЕСТ ЗОХИОХ Тест зохиохдоо дээрх сэдэв бүрийг хамарсан асуулт зохиовол сайн. БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан

5 ш тестийн асуулт зохио. АСУУЛТЫН ҮНЭЛГЭЭ : 1 асуулт 0.2 оноо буюу нийт 1.0 оноо Даалгавар 3 . СТАНДАРТ ФУНКЦУУД

Жишээ хэрэгтэй

Функцуудыг дэлгэрэнгүйгээр тайлбарлах шаардлагатай. вариант Функц 1

Оноо : 0.1 Жишээ хэрэгтэй Жишээ : 0.1

Функц 2 Оноо : 0.1

Жишээ : 0.1

Нийт

a) _lrotl + Жишээ ecvt + Жишээ 0.4 b) _lrotr + Жишээ gcvt + Жишээ 0.4 c) _rotl + Жишээ srand + Жишээ 0.4 d) _rotr + Жишээ ecvt + Жишээ 0.4 e) srand + Жишээ gcvt + Жишээ 0.4

Дээр даалгаварт өгсөн функцууд нь stdlib.h файлд тодорхойлогдсон функцууд болно.

Page 181: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:182

БИЕ ДААХ АЖИЛ № 10

/ СЭДЭВ : ТЭМДЭГТ МӨР БА ӨГӨГДЛИЙН НИЙЛМЭЛ ТӨРӨЛ /

Даалгавар 1 . БОДЛОГО ЗОХИОХ

БОДЛОГЫН ҮНЭЛГЭЭ : 1 бодлого 0.1 оноо буюу нийт 0.2 оноо

БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан 2 ш бодлого зохио.

Бодлого зохиохдоо дээрх сэдэв бүрийг хамарсан бодлого зохиовол сайн.

Даалгавар 2 . ТЕСТ ЗОХИОХ Тест зохиохдоо дээрх сэдэв бүрийг хамарсан асуулт зохиовол сайн.

БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан

5 ш тестийн асуулт зохио. АСУУЛТЫН ҮНЭЛГЭЭ : 1 асуулт 0.2 оноо буюу нийт 1.0 оноо

Даалгавар 3 . СТАНДАРТ ФУНКЦУУД Функцуудыг дэлгэрэнгүйгээр тайлбарлах шаардлагатай. вариант Функц 1

Оноо : 0.1 Жишээ хэрэгтэй Жишээ : 0.1

Функц 2 Оноо : 0.1 Жишээ хэрэгтэй Жишээ : 0.1

Нийт

a) strdup + Жишээ strchr + Жишээ 0.4 b) stricmp + Жишээ strcspn + Жишээ 0.4 c) strncat + Жишээ strspn + Жишээ 0.4 d) strncat + Жишээ strchr + Жишээ 0.4 e) stricmp + Жишээ strspn + Жишээ 0.4

Дээр даалгаварт өгсөн функцууд нь string.h файлд тодорхойлогдсон функцууд болно.

БИЕ ДААХ АЖИЛ № 11 / СЭДЭВ : ЗААГЧ ХУВЬСАГЧ /

Даалгавар 1 . БОДЛОГО ЗОХИОХ БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан 2 ш бодлого зохио. БОДЛОГЫН ҮНЭЛГЭЭ : 1 бодлого 0.1 оноо буюу нийт 0.2 оноо Бодлого зохиохдоо дээрх сэдэв бүрийг хамарсан бодлого зохиовол сайн.

Page 182: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:183

Даалгавар 2 . ТЕСТ ЗОХИОХ Тест зохиохдоо дээрх сэдэв бүрийг хамарсан асуулт зохиовол сайн. БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан

5 ш тестийн асуулт зохио. АСУУЛТЫН ҮНЭЛГЭЭ : 1 асуулт 0.2 оноо буюу нийт 1.0 оноо Даалгавар 3 . СТАНДАРТ ФУНКЦУУД

Функц 1

Функцуудыг дэлгэрэнгүйгээр тайлбарлах шаардлагатай. вариант

Оноо : 0.1 Жишээ хэрэгтэй Жишээ : 0.1

Функц 2 Оноо : 0.1 Жишээ хэрэгтэй Жишээ : 0.1

Нийт

a) strrev + Жишээ strstr + Жишээ 0.4 b) strerror + Жишээ strtok + Жишээ 0.4 c) strset + Жишээ strrchr + Жишээ 0.4 d) strtok + Жишээ strpbrk + Жишээ 0.4 e) strrchr + Жишээ strnset+ Жишээ 0.4

Дээр даалгаварт өгсөн функцууд нь string.h файлд тодорхойлогдсон функцууд болно.

БИЕ ДААХ АЖИЛ № 12 / СЭДЭВ : ЗААГЧ БА ФУНКЦ, ФУНКЦЫН ЗААГЧ,

ЗААГЧ БА МАССИВ / Даалгавар 1 . БОДЛОГО ЗОХИОХ БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан 2 ш бодлого зохио. БОДЛОГЫН ҮНЭЛГЭЭ : 1 бодлого 0.1 оноо буюу нийт 0.2 оноо Бодлого зохиохдоо дээрх сэдэв бүрийг хамарсан бодлого зохиовол сайн. Даалгавар 2 . ТЕСТ ЗОХИОХ Тест зохиохдоо дээрх сэдэв бүрийг хамарсан асуулт зохиовол сайн. БОДЛОГЫН ДААЛГАВАР: Бие даах ажлын дээрх сэдвүүдийг хамарсан

5 ш тестийн асуулт зохио. АСУУЛТЫН ҮНЭЛГЭЭ : 1 асуулт 0.2 оноо буюу нийт 1.0 оноо Даалгавар 3 . СТАНДАРТ ФУНКЦУУД

Page 183: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:184

Функцуудыг дэлгэрэнгүйгээр тайлбарлах шаардлагатай.

Оноо : 0.1 вариант Функц 1

Жишээ хэрэгтэй Жишээ : 0.1

Функц 2 Оноо : 0.1 Жишээ хэрэгтэй Жишээ : 0.1

Нийт

a) memccpy + Жишээ movedata + Жишээ 0.4 b) memcpy + Жишээ memset + Жишээ 0.4 c) memmove + Жишээ 0.4 memchr + Жишээ d) movmem + Жишээ memcmp + Жишээ 0.4 e) memmove + Жишээ memicmp + Жишээ 0.4

Дээр даалгаварт өгсөн функцууд нь mem.h файлд тодорхойлогдсон функцууд болно.

Page 184: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:185

2000 оны 3 сарын 26 ЯВЦЫН ТЕСТ № 1 Нийт оноо : 100

1. Си программ бичихэд ядаж нэг функц заавал бичих буюу тэр нь _________ функц байна.

a) ALT – F5 b) CTRL – F9 c) F9

a) %XX c) %p

5. Welcome гэсэн тэмдэгт мөрийг хэвлээд, курсорыг мөрийн эхэнд шилжүүлэх нь : a) printf(“Welcome\n”); b) printf(“Welcome\r”); c) printf(“Welcome”,’\n’); d) printf(“Welcome”,”\r”);

6. letter гэсэн тэмдэгт хувьсагчийн утгыг аль нь хэвлэх вэ ? a) printf(“%s letter”); b) printf(“%c”,&letter); c) printf(“%c letter”); d) printf(“%c”,letter);

7. Hi 14 -8.760000 x гэсэн үр дүнг хэвлэх нь : a) printf(“%s %i %f %c\n”,”Hi”,14,-8.76,’x’); b) printf(“%s %d %e %c\n”,”Hi”,14,-8.76,’x’);

d) printf(“%s %d %f %d\n”,”Hi”,14,-8.76,’x’); 8. long double төрлийн К хувьсагчийн утгыг аль нь хэвлэх вэ ?

a) printf(“%Lf”,K); b) printf(“%lE”,K); c) printf(“%lf”,K); d) printf(“%le”,K);

9. Аль нь принтерт өгөгдөл хэвлэж байна вэ ? a) printf(stdprn,“ Hello world !\n ”); b) fprintf(lpt1,“ Hello world !\n ”); c) fprintf(stdprn,“ Hello world !\n ”);

10. Хасах тэмдэг нь аргументийн зэрэгцүүлэлтийг тодорхойлно. Хасах тэмдэгтэй бол баруун, тэмдэггүй бол зүүн зэрэгцүүлэлт хийгдэнэ.

11. printf("[%3.4d]",10); команд нь дараах үр дүнг хэвлэнэ. b) [010]

c) [ 10]

a) [ Hell]

d) тоо, үсэг, @

“SW202 – Программчлалын хэл1” хичээл

2. Хөрвүүлэх гэдэг нь машинд ойлгомжтой буюу Си хэл дээр бичигдсэн программыг хүнд ойлгомжтой буюу командуудын дараалалд хөрвүүлэх үйл ажиллагааг хэлнэ. a) Үнэн b) Худал

3. Turbo C редактор дээр программыг ажиллуулдаг товчны комбинаци ?

d) ALT – F9 4. Дэлгэцэнд санах ойн хаяг хэвлэхэд хэрэглэгддэг тусгай тэмдэгтийг ол.

b) %m d) %*X

c) printf(“%s %i %e %c\n”,”Hi”,14,-8.76,’x’);

d) printf(lpt1,“ Hello world !\n ”);

a) Үнэн b) Худал

a) [0010] d) [ 010]

12. printf("[%-5.4s]","Hello"); команд нь дараах үр дүнг хэвлэнэ. b) [Hell]

c) [ Hello] d) [Hell ] 13. Си хэлний идентификатор дараах тэмдэгтүүдээс бүрдэнэ.

a) тоо, том жижиг үсэг, _ b) үсэг, тоо, _ , @ c) том жижиг үсэг, _ , @

14. Си хэлний түлхүүр үгүүдийг л агуулсан мөрийг ол. a) byte, asm, far, default,

Page 185: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:186

b) continue, pascal, Volatile

15. int төрлийн хувьсагч нь _______ -аас ________ хүртэл бүхэл тоон утга авна.

b) k long int;

d) 11 10.9 10.99

a) [Hello]

. . . stdlib.h b) itoa c) cprintf

30. int i=3,j=2,k=2;

c) do, struct, typedef, begin d) enum, signed, static, float

16. long short int i=1000; гэсэн бичлэг зөв үү ?

a) Зөв b) Буруу 17. long int төрлийн k хувьсагчийг зөв зарласан үйлдэл нь :

a) longint k;

c) long k; d) long k int;

18. sizeof- ыг буруу ашигласан үйлдлийг ол. a) sizeof(long) b) sizeof (k) c) sizeof k d) sizeof long

19. Max гэсэн тогтмолыг зөв зарласан үйлдэл нь : a) int Max=1; b) #define MAX 1 c) #define Max 1 d) #define Max 1;

20. Sum гэсэн макрог зөв тодорхойлсон үйлдэл : a) #define Sum(x,y) (x+y) b) const Sum(x,y) (x+y) c) #define Sum(x,y) (x+y); d) #define Sum{x,y} (x+y)

21. Буруу тодорхойлолтыг ол. a) #define Byte unsigned char b) #define clr clrscr(); c) #define if IF d) #define elseif else if

22. Утга нь тухайн программын амьдралын хугацаанд хадгалагддаг, харин ажиллах хүрээ нь функцын хүрээгээр тодорхойлогддог хувьсагчийг _____________ хувьсагч гэнэ.

23. printf("%.0f\t%.1f\t%.2f",10.987654321, 10.987654321, 10.987654321); нь дараах үр дүнгүүдийн алийг нь хэвлэж гаргах вэ ?. a) 11.0 11.0 10.99 b) 11 11.0 10.99 c) 11.0 10.9 10.99

24. scanf("%5ld",&i); байдлаар хувьсагчийн утгыг уншихад хэрэглэгч гараас ямар байдлаар өгөгдөл оруулах вэ ? / Жич : [ ] – уртыг нь үзүүлэхэд л ашигласан /

a) [ 100] b) [00100] c) [100] d) [100 ]

25. scanf("%5s",s); байдлаар хувьсагчийн утгыг уншихад тэмдэгт мөр яаж уншигдсан байх вэ ? / Унших тэмдэгт мөр нь : Hello World /

b) [Hello World] c) [ Hello] d) [World]

26. Стандарт функцууд аль файлд байрладаг вэ ? a) getche

. . . conio.h

. . . ctype.h d) isalpha . . . Аль нь ч биш

27. ___________ хувьсагч гэдэг нь тухайн программын аль ч хэсэгт харагдах, утгыг нь өөрчилж болох хувьсагч юм.

28. Утга олгох үйлдлүүдийг тэмдэглэ. a) == b) -= c) != d) := e) ?: f) /=

29. float i; int k=5; printf("%f",i); Энэ командын үр дүн ?

a) 2 b) 2.5 c) 2.500000 d) 2.000000

printf("%d",i++<=++k?i++:++k); a) 4 b) 3

Page 186: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:187

c) 5 d) 2 31. i=3,j=5,k=4;

k^=-i++ + ++j; printf("i=%d j=%d k=%d\n",i,j,k); a) i=3 j=6 k=6

c) 3

b) 1 3 5 7 9 11

d) 1 3 6 8 9 10

a) 3 4 5

b) i=4 j=6 k=7 c) i=-3 j=5 k=6 d) i=- 4 j=6 k=7

32. i=3,j=3, k=4; k<<=i++&&++j&&i-j||++i+j; printf("i=%d j=%d k=%d\n",i,j,k); a) i=5 j=4 k=2 b) i=4 j=4 k=8 c) i=4 j=4 k=2 d) i=5 j=4 k=8

33. i=3,j=3, k=4; k<<=i++&++j&i-j|++i+j; printf("i=%d j=%d k=%d\n",i,j,k); a) i=5 j=4 k=1024 b) i=4 j=4 k=2048 c) i=5 j=4 k=2 d) i=4 j=4 k=512

34. x=3, y=2, z=1; printf(“%d\n”,x^y&~z);

a) 2 b) 1 d) 4

35. Дараах программаас алдаа ол. 1. #include<stdio.h> 2. #define printf pr 3. #define scanf sc 4. int n; 5. main() 6. { pr(" Please input a number(XXX) which have 3 digits: ");sc("%d",n); 7. pr(" Last digit : %d\n",n%10); 8. pr("Midlle digit: %d\n",(n/10%10); 9. pr("First digit : %d\n",n/10); 10. printf("Sum of digits : %d\n",n%10+(n%10)/10+n/100); 11. getch(); 12. } Алдаатай мөрийн дугаарууд нь : a) 2 3 7 8 9 11

c) 2 3 6 8 9 10

36. sum хувьсагчийн утга 10-аас ялгаатай ба total хувьсагчийн утга 0-ээс ялгаатай байхыг шалгаад, нөхцөл биелж байвал “алдаа” гэж хэвлэх үйлдлүүд нь : a) if(sum!=0) &&(total==0) printf(“алдаа”); b) if(sum!=0) && total printf(“алдаа”); c) if(sum!=0) || (total!=0) printf(“алдаа”); d) if(sum!=0) &&(total<>0) printf(“алдаа”);

37. int i=3; switch(i) { case 1: printf("1\t"); case 2: printf("2\t"); case 3: printf("3\t"),++i; case 4: printf("4\t"); case 5: printf("5\t"),++i; break; case 6: printf("6\t");++i; break; } Дэлгэцэнд юу хэвлэх вэ ?

b) 3 4 5 6 c) 3 d) 3 4

38. 1 –ээс 10 хүртэлх integer утгыг хэвлэсэн нь ? /* 12345678910 */

Page 187: Programchlaliin c hel

“Программчилалын Си хэл” хичээл, ÌÓÒÈÑ-Ñ¿õáààòàð äàõü ñàëáàð

Лекц : Хуудас:188

a) count=1; while(count<=10) printf(“%d”,count++);

c) count=1; while(count<=10) printf(“%d”,++count);

c) printf(“j = %d”,i>10?j>10?20:10:0);

2 2

5 5

a) int i=1,j=1;

else { printf("%*d\r",6+j,i); printf("%*d\n",6-j++,i++); } }while(i<=9);

do{ if(i>5) { printf("%*d\r",10-j+4,i); printf("%*d\n",j++ +4,i++); }

do{ if(i>5) { printf("%*d\r",10-j+4,i); printf("%*d\n",j++-4,i++); }

}while(i<=9);

do{ if(i>5) { printf("%*d\r",10-j+4,i); printf("%*d\n",j++-4,i++); }

b) count=1; while(count<=10); printf(“%d”,count++);

d) count=1; while(count<=10) printf(“%d\n”,count++); 39. total –ын анхны утгыг 0-ээр тогтоогоод, 1 –ээс 100 хүртэлх сондгой тоонуудын нийлбэрийг бодож

total-д хийсэн үйлдэл нь : a) for(a=1,total=0; a<=100; a=a+1) if(a%2==0) break; else total+=a; b) for(a=1,total=0; a<=100; a++) if(total%2==0) continue; else total+=a; c) for(a=1,total=0; a<=100; a++) if(a%2==0) break; else total+=a; d) for(a=1,total=0; a<100; a=a+1) if(a%2==0) continue; else total+=a;

40. if(i>10) if(j>10) printf(“ j = 10”); else printf(“ j = 20 ”); else printf(“ j = 0 ”); программын хэсгийг ? : нөхцөлт илэрхийлэл ашиглан бичвэл : a) printf(“j = %d”,i>10?j>10?10:20:0); b) printf(“j = %d”,i>10?j>20?10:20:0);

d) printf(“j = %d”,i>10?j>10?10,20,10); 41. for(i=0,j=62;j!=0;j>>=1) if(j & 1) i++;

printf(" 1 bits' count of j = %d",i); a) 1 bits' count of j = 5 b) 1 bits' count of j = 4 c) 1 bits' count of j = 6 d) 1 bits' count of j = 2

42. 1 –ээс 9 хүртэлх тоонуудыг дараах байдлаар хэвлэх программыг ол. 1

3 3 4 4

6 6 7 7 8 8 9

do{ if(i>5) { printf("%*d\r",12-j+4,i); printf("%*d\n",j++-4,i++); }

b) int i=1,j=1;

else { printf("%*d\r",4+j,i); printf("%*d\n",6-j++,i++); } }while(i<=9);

c) int i=1,j=1;

else { printf("%*d\r",4+j,i); printf("%*d\n",6+j++,i++); }

d) int i=1,j=1;

else { printf("%*d\r",4+j,i); printf("%*d\n",6-j++,i++); } }while(i<=9);