c language

Page 1

1 Си програмын ажиллагаа Си бол хамгийн өргөн хэрэглэгддэг програмчлалын хэлүүдийн нэг. Си хэлийг судлах нь дараах давуу талуудтай.  

Орчин үеийн гол үйлдлийн системүүдээс авахуулаад микроконтоллѐруудын гэх мэт маш олон хөрс дээр програмчлах боломжтой. Обьект хандалтат програмчлал болох Cи++, C# -ийг үзэх гол суурь болж өгдөг.

2Си хэлний талаар хэдэн үг. Си нь мянган мянган програмчлалын хэлэн дундаас нийтэд хүлээн зөвшөөрөгдөж хамгийн өргөн хэрэглэгдэх болсон програмчлалын хэл юм. Саяхан Ангараг гаригт газардагч Phoenix гэхэд удирдлагын бүх програм нь 100% Си хэл дээр бичигдсэн байх жишээтэй. Гэвч Си бол сурахад амархан програмчлалын хэл.


Си хэл дээр бичихдээ зурагт үзүүлсэнчлэн энгийн текст файлд (энэ тохиолдолд samp.c) програмыг бичих бөгөөд энэ нь хүн уншиж ойлгох боломжтой харагдаж байна. Харин энэхүү Си програмыг хөрвүүлэгчээр хөрвүүлснээр биелэх програм (энэ тохиолдолд samp.exe) үүсэх бөгөөд энэ нь хүн хараад ойлгох боломжгүй боловч компьютер ойлгож ажиллуулах боломжтой байдаг. Linux үйлдлийн системийн хувьд gcc гэх хөрвүүлэгч дагалдаж ирдэг. Дасгал. Зурагт харагдаж байгаа програмыг хөрвүүлж ажиллуулах дасгал хийж үзнэ үү.

3 хялбар си програм. Хамгийн хялбар жижиг програм дараах байдалтай байж болох юм. Өмнөх 1 болон 2-р хичээл дээр үзсэн дагуу оруулж ажиллуулж үзнэ үү.


#include <stdio.h> int main() { printf("Сайн байна уу!\n"); return 0; }

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

 

#include <stdio.h> гэсэн эхний мөр нь стандарт оролт гаралтын сангийн толгой файл stdio.h-ыг оруулж ирж байна. Ингэснээр энэ програмд стандарт оролт гаралтын функцүүдийг хэрэглэх боломжтой болно. Стандарт оролт гаралтын сан нь стандарт оролт болох компьютерийн гараас өгөгдөл унших, стандарт гаралт болох дэлгэц рүү мэдээллийг хэвлэх, дискийн файлуудаас мэдээлэл унших бичих зэрэг маш өргөн хэрэглэгддэг системийн чухал сан юм. Энэ сангийн талаар man 3 stdio командаар дэлгэрүүлж хараарай. int main() гэсэн мөр нь програмын үндсэн биелж эхлэх функцыг зарлаж байна. Бүх Си програмын биелэлт нь энэ main буюу үндсэн функцээс эхэлдэг бөгөөд Си програм бүр main функцтэй байх ѐстой. { } буюу нээсэн хаасан дугуй хаалтууд нь програмын кодыг бүлэглэдэг бөгөөд энэ тохиолдолд main функцийн 2 мөр кодыг бүлэглэсэн байна. printf нь дэлгэцэнд хэвлэх үйлдлийг гүйцэтгэдэг stdio сангийн функц юм. Энэ функцийн дэлгэрэнгүй тайлбарыг man 3 printf командаар дэлгэрүүлж үзнэ үү. return 0; гэсэн мөр нь main функцийг биелэлтийг дуусгаж байгаа бөгөөд 0 гэсэн утгыг буцааж байна. main функцын буцаах утга нь үйлдлийн системд буцах бөгөөд энэ утгыг shell дотор шалгаж тусгай боловсруулалтыг хийх боломжтой байдаг. 0 нь програм ямар нэг алдаагүй амжилттай ажиллаж дуусч байгаа утгыг илэрхийлнэ.

Жич: Тусламжийг харахдаа терминалаас man командын тусламжтай хардаг. man 3 printf Энд 3 гэдэг тусламжийн бүлгийн дугаар бөгөөд дугаарыг заагаагүй тохиолдолд автоматаар 1-р бүлэг гэж ойлгодог. 1-р бүлэг нь командын мөрөөс өгдөг командын тусламж байдаг. Харин бид энд Си-ийн стандарт сангийн тусламжийг харах


хэрэгтэй байсан тул 3-р бүлгийг зааж өгсөн болно. Системийн дуудалтын хувьд 2-р бүлгийг зааж өгөх хэрэгтэй. Тэгэхээр man командын тусламжийг харах тохиолдолд man man гэж харж болно. Мөн интернэтээс дараах хаягаар харж болно. http://manpages.ubuntu.com

4Хувьсагч Програм дотор ямар нэг утгыг хадгалаад түүнийгээ буцаж хэрэглэх шаардлага гардаг бөгөөд энэ тохиолдолд утгыг хувьсагчид хадгалдаг. Тухайлбал: int b; гэсэн мөр нь b гэсэн нэртэй бүхэл тоон утга хадгалах хувьсагчийг програм дотор үүсгэхийг зааж өгч байна. Энэ тохиолдолд хувьсагчийн нэр нь: b Харин хадгалах утгын төрөл нь бүхэл тоо буюу: int гэж зааж өгсөн байна. Хувьсагчид утга олгохдоо дараах байдлаар олгоно. b = 5; Харин хувьсагчийн утгыг хэрэглэхдээ тэр хувьсагчийнхаа нэрээр нь ханддаг. Тухайлбал утыг нь хэвлэхэд дараах байдлаар хувьсагчид хандана. printf("%d", b); Си хэлэнд хувьсагчийн дараах үндсэн төрөлүүд байдаг.   

int - бүхэл тоо float - хөвөгч таслалтай бутархай тоо char - тэмдэгт буюу 'A', 'b' гэх мэт тэмдэгт үсэг

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


Жишээ: #include <stdio.h> int main() { int a, b, c; a = 5; b = 7; c = a + b; printf("%d + %d = %d\n", a, b, c); return 0; }

Энэ програм үр дүндээ ямар утга хэвлэх вэ? Hint: printf функцийн тусламжийг та бүгд өмнөх хичээлээр үзсэн гэж бодож байна. Гэвч товч тайлбар нэмж хэлье. printf функцийн эхний параметр нь хэвлэх үлгэр текст байх бөгөөд дараагийн параметрүүд нь хэвлэх утгууд байдаг. Харин хэвлэх үлгэр текст дотор % тэмдэгээр тухайн байрлалд утга хэвлэгдэхийг заадаг бөгөөд тухайлбал %d гэдэг нь decimal буюу 10-тын тоо хэвлэгдэнэ гэдэг утгыг илэрхийлж байна. Дээрх жишээнд "%d + %d = %d\n" гэдэгт 3 удаа аравтын тоо хэвлэгдэхийг зааж өгсөн байгаа тул үүний ард байгаа гурван параметрийн утгыг харгалзан %d байрлалд хэвлэх юм. Төрлийн хувьд:    

%d нь int төрөлийг аравтын тооллоор хэвлэх %f нь float (хөвөгч таслалтай бутархай) хэвлэх %c нь char (тэмдэгт) хэвлэх %s нь тэмдэгт мөр (тэмдэгтийн массив бид дараа ярьна) хэвлэх

гэх мэтээр үлгэр текст дотор хэвлэхэд хэрэглэдэг.

5 Стандарт оролт, гаралт 5-р хичээл(Си хэл). Стандарт оролт, гаралт Өмнөх хичээл дээрх програмыг арай жоохон сайжруулая. Хоѐр тооны нийлбэрийг олохдоо тоонуудыг хэрэглэгчээс асуудаг байхаар зохион байгуулая. #include <stdio.h> int main() {


int a, b, c; printf("Enter the first value:"); scanf("%d", &a); printf("Enter the second value:"); scanf("%d", &b); c = a + b; printf("%d + %d = %d\n", a, b, c); return 0; }

Дээрх програм хэрхэн ажиллахын доорх зурагаар харуулсан байна.

Өмнөх хичээл дээр хийсэн програмыг дээрх шиг болгон засч ажиллуулж үзнэ үү. Энд scanf функцыг хэрэглэсэн байгаа бөгөөд энэ функц нь стандарт оролтоос утгыг уншдаг функц юм. scanf функц нь printf-тэй харьцуулахад ялгаа нь гэвэл хувьсагчийн нэрийн нь өмнө & тэмдэгийг тавьсан байна. & тэмдэг нь Си хэлний "хаяг" гэгдэх оператор бөгөөд тухайн хувьсагчийн санах ойд байрлах хаягийг авдаг үйлдэл юм. Энэ операторын тухай бид заагчийн тухай үзэх хүртэл дэлгэрэнгүй үзэхгүй. Харин одоогоор scanf дотор хувьсагчийн өмнө & тэмдэгийг тавих ѐстой гэдэгийг санах хэрэгтэй. scanf функцийн тухай дэлгэрэнгүй тайлбарыг man 3 scanf командаар үзээрэй. Ингээд стандарт оролтоос унших функц scanf, стандарт гаралт руу хэвлэх printf функцүүдийг үзсэнээр стандарт оролт гаралттай ажиллаж бид чадах боллоо. Цааш нь дэлгэрүүлээд дараах холбогдох хичээлүүдийг сонирхоорой.    

Стандарт оролтыг төгсгөл хүртэл нь унших Сул зайгаар тусгаарлагдсан тоонуудыг гараас унших fgets ашиглан стандарт оролтоос тэмдэгт мөр унших Техт мөр гараас яаж унших вэ?

Даалгавартай холбогдох hint:


Доорх даалгаврыг хийхэд шаардлагатай математик боловсруулалтын функцыг math.h толгой файлаар оруулж ирж холбож хэрэглэнэ. Харин хөрвүүлэх үедээ -lm гэсэн linker option-ийг нэмж өгөх хэрэгтэй. Энэ нь системийн m буюу математик санг холбож хөрвүүлэлт хийхийг зааж өгч байгаа хэрэг юм. Энэ сан нь /usr/lib/libm.a байрлалд байрлах бөгөөд энэ сангийн агуулгыг ar -t /usr/lib/libm.a командаар харах боломжтой.

Гэрийн даалгавар: Арифметик үйлдлүүд, Гурвалжин

6-р хичээл(Си хэл). Нөхцөл шалгах оператор Нөхцөлөөс хамаарах боловсруулалтууд нь Си хэлэнд boolean буюу бүүлиин илэрхийллээр нөхцөлийг илэрхийлдэг. Хялбар жишээ програм үзэе. Энд if (if буюу хэрэв) үйлдлийг хэрэглэсэн байгааг анзаарна уу. #include <stdio> int main() { int b; printf("Enter a value:"); scanf("%d", &b); if (b < 0) printf("The value is negative\n"); return 0; } Энэ програм нь хэрэглэгчээс бүхэл тоо хүлээн авч түүнийгээ 0-с бага эсэхийг шалгаж хэрэв бага бол "The value is negative\n" гэсэн текстийг хэвлэж байна. Харин 0-с бага биш юм хэвлэхгүйгээр програм дуусч байна.</stdio> if үйлдэлд шалгаж байгаа нөхцөл болох b<0 гэдэг нь бүүлиин илэрхийлэл бөгөөд Си програм нь энэ илэрхийллийг боловсруулаад үр дүн нь үнэн (true) эсвэл худал (худал) үр дүнг буцаадаг. Энэ утгаас нь хамааруулж if оператар боловсруулалтыг гүйцэтгэдэг. Боловсруулалт илэрхийллийн утгаас хэрхэн хамаарахыг доорх зураг дээр харуулсан байна.


Арай жаахан том бас нэг жишээ үзэе. #include <stdio> int main() { int b; printf("Enter a value:"); scanf("%d", &b); if (b < 0) printf("The value is negative\n"); else if (b == 0) printf("The value is zero\n"); else printf("The value is positive\n"); return 0;


} Энэ жишээнд бүүлиин илэрхийллийн утга үнэн байх тохиолдолоос гадна else тохиолдол буюу худал байх тохиолдолын боловсруулалтыг оруулсан байна. Ингэхдээ else тохиолдолд нь дахин if үйлдлийг оруулан давхар нөхцөл шалгасан байна. Ингээд хэрэв хэрэглэгчийн оруулсан тоо нь тэгээс бага бол "The value is negative\n" гэсэн үгийг хэвлэнэ. Харин үгүй бөгөөд 0-тэй тэнцүү бол "The value is zero\n" гэсэн текстийг хэвлэнэ. Харин өмнөх хоѐр нөхцөлын аль нь ч биш буюу 0-с их тохиолдолд "The value is positive\n" гэсэн текстийн хэвлэхээр програм бичигдсэн байна. Тэнцүү эсэхийг шалгахдаа == операторыг шалгаж байгааг анзаарна уув</stdio> Бүүлиин илэрхийллийн арай жаахан төвөгтэй хэлбэрийг үзэе. if ((x==y) && (j>k)) z=1; else q=10; Энэ жишээнд бичигдсэн (x==y) && (j>k) гэсэн бүүлиин илэрхийллийг энгийн үгээр тайлбарлавал x нь y-тэй тэнцүү байхын зэрэгцээ j нь k-с их гэсэн хоѐр нөхцөл зэрэг биелэнэ гэсэн утгыг илэрхийлнэ. Иймээс энэ нөхцөл биелж байвал z=1; үйлдэл биелэнэ харин биелэхгүй тохиолдолд q=10; гэсэн үйлдэл биелэнэ. Энд хэрэглэгдсэн && оператор нь хоѐр бүүлийн илэрхийллийн хувьд логик AND (AND буюу монголоор БА) гэсэн үйлдэл бөгөөд хоѐулаа үнэн тохиолдолд үнэн бусад тохиолдолд худал утгыг буцаах үйлдэл юм. Доор Си хэл дээрх бүүлиин операторуудыг товч бичив.

тэнцүү == бага < их > бага буюу тэнцүү <= их буюу тэнцүү >= тэнцүү биш != ба &&


эсвэл || хоѐр бүүлийн илэрхийлэлийн хувьд хийгдэх бөгөөд хоѐр илэрхийллийн дор хаяж нэг нь үнэн бол үнэн утгыг буцаах оператор юм. үгүйсгэл ! логик илэрхийллийн үр дүнг эсрэгээр нь солих үйлдэл. үнэнийг худал, худалыг үнэн болгоно. Гэрийн даалгавар: 3 тооны 2 ихийнх нь нийлбэр, 3 тооны 0 ээс их бага тэнцүү, x тоо, Их бага тэнцүү, Их тооны үржвэр, 4н тоо их, 3н тоо дундах, Бага тоонуудын нийлбэр, Их бага тэнцүү тоонуудын тоо, Тэгээс их тоонуудын тоо 2, Тэгээс бага тоонуудын үржвэр, Тэгээс бага тоонуудын тоо, Тэгээс их тоонуудын нийлбэр, MIN, Тэгээс их тоонуудын тоо, 3н тоо бага, MAX, 2 тоо их, 4 тооны нийлбэр, Зоос 1, Илэрхийлэл 9, Гурвалжны талбай, Илэрхийлэл 8, Гурвалжны периметр, Илэрхийлэл 7, Илэрхийлэл 6, 4 өнцөгтийн периметр, Илэрхийлэл.1, Илэрхийлэл 5, Тэгш өнцөгтийн талбай

7-р хичээл(Си хэл). Давталт Нэгэн ижил үйлдлийг олон дахин давтах шаардлага програм бичих явцад олонтоо гардаг. Си хэлэнд ийм давталтыг хэд хэдэн янзаар зохион байгуулах боломжтой байдагтай танилцая. Нөхцөлт давталт буюу while гэсэн оператортай эхлээд танилцая. Бичиглэлийн хувьд else хэсэг нь байхгүй if оператортай яг ижилхэн бичигддэг. while (a < b) { printf("%d\n", a); a = a + 1; } Дээрх жишээний ажиллагааг зурагаар тайлбарлавал:


Дээрх while давталтыг зарим тохиолдолд өмнөө нөхцөлтэй давталт гэж хэлэх нь байдаг. Учир нь эхлээд нөхцөлийг шалгаад дараа нь давтах үйлдлийг гүйцэтгэж байна. Харин хойноо нөхцөлтэй давталт гэж бас байх бөгөөд үүнийг do-while гэсэн үйлдлийн тусламжтайгаар хэрэгжүүлдэг. Бичиглэл нь дараах хэлбэртэй байдаг. do { printf("%d\n", a); a = a + 1; } while (a < b); Энэ тохиолдолд эхлээд {} хаалт доторх үйлдлийг нэг удаа гүйцэтгээд дараа нь нөхцөлийг шалгаж ахин давтах эсэхээ шийддэгээрээ ялгаатай юм. Дээрх хоѐр давталтаас гадна for гэсэн давталт байдаг. for давталтыг зарим тохиолдолд тоолууртай давталт гэж нэрлэх нь байдаг бөгөөд бичиглэлийн хувьд зарим тохиолдолд илүү эвтэйхэн байдаг. Жишээ нь while давталтаар дараах үйлдлийг бид бичжээ гэж үзэе. x=1; while (x<10) { blah blah blah x++; /* x++ is the same as saying x=x+1 */ } Тэгвэл дээрх давталтыг for давталтаар дараах байдлаар бичиж болдог. for(x=1; x<10; x++) { blah blah blah } жич тайлбар: ++ оператор нь хувьсагчийн утгыг нэгээр нэмэгдүүлнэ. Өөрөөр хэлбэл: x = x + 1; гэсэнтэй ижил үйлдэл хийх боловч ++ үйлдэл нь илүү хурдан ажилладагийг санах хэрэгтэй. Тэгэхээр while давталтын тохиолдолд x=1; гэсэн анхны утга олгох үйлдэл, (x<10) гэсэн нөхцөл шалгах үйлдэл болон x++ гэсэн x-ийн утгыг нэгээр нэмэх үйлдэлүүд байна. Харин for давталтын хувьд эдгээр үйлдлүүдийг бүгдийг нь нэг мөрөнд бичиж гурван хэсэгт хуваагаад бичиж байна. Энэ жишээн дахь x-ийг for давталтын тоолуур гэдэг. Цаашлаад for давталтын гурван хэсэгт дээрх жишээнээс арай өөр байдлаар ч үйлдлүүдийг бичих боломж бүрэн нээлттэй. Тухайлбал: a=1;


b=6; while (a < b) { a++; printf("%d\n",a); } гэсэн давталтыг for давталтаар дараах байдлаар бичиж болно: for (a=1,b=6; a < b; a++,printf("%d\n",a)); Энэ тохиолдолд таслал операторыг хэрэглэсэн байна. Таслал оператор нь хэд хэдэн үйлдлийг нэг мөрөнд бөөгнүүлэн хийхэд тусгаарлагч байдлаар хэрэглэдэг оператор юм. Иймээс дээрх тохиолдолд анхны утга олгох үйлдлийн хэсэгт хоѐр утга олгох үйлдэл бичигдсэн байна. Мөн тоолуурын утыг нэмэгдүүлэх хэсэгт тоолуурын утгыг нэмэгдүүлэхээс гадна printf-р стандарт гаралт руу хэвлэх үйлдлийг хамтатган оруулсан байна. Гэрийн даалгавар: Ахмад тоо, Цифрүүдийн үржвэр, Цифрүүдийн нийлбэр, N-ын факториал, 1-ээс N, Оронг тоолох, a^n, А-г N удаа нэмэх, 3-т хуваагддаг тооны нийлбэр, Тэгш тоонуудын нийлбэр , Найз тоонууд, Палиндром

8-р хичээл(Си хэл). Массив Нэгэн жишээ үзэе. 10 ширхэг санамсаргүй тоо үүсгээд түүнийгээ эрэмбэлэх жишээ програм үзэе. Үүнийг хийхийн тулд тоонуудын цувааг хадгалдаг массивыг бид хэрэглэх болно. Массив гэдэг нь ижил төрлийн хувьсагчийн цувааг үүсгэж хэрэглэхэд ашиглагддаг. Жишээ нь 5 ширхэг бүхэл тоон хувьсагчийг бид дараах байдлаар зарлаж болно. int a, b, c, d, e; Гэвч 5 биш хэдэн мянган хувьсагч үүсгэх хэрэгтэй болбол яах вэ? Тэгэхээр дээрх таван бүхэл тоон хувьсагчийг дараах байдлаар массив хэлбэрээр зарлаж болдог. int a[5]; Энд 5 бүхэл тоон утгыг хадгалах массивыг үүсгэж байгаа бөгөөд эдгээр 5 утга тус бүр рүү индексээр нь хандах боломжтой байдаг. Массивын индекс нь Си хэлэнд 0-с эхлэдэг. Тэгэхээр массивын 5 элемент тус бүр рүү индексээр нь хандан утга олгох үйлдэлийг дараах байдлаар хийж болох юм: int a[5];


a[0] = 12; a[1] = 9; a[2] = 14; a[3] = 5; a[4] = 1; Массивын элемент рүү индексээр нь хандаж болдог тул элемент бүр рүү хандах үйлдэлийг давталтын тусламжтай гүйцэтгэхэд тохиромжтой байдаг. Жишээ нь доорх код нь массивын элемент бүрт 0 гэсэн утгыг олгох үйлдэлийг давтан гүйцэтгэж байна. int a[5]; int i; for (i=0; i<5; i++) a[i] = 0; Харин дараах код нь массивын элементэд дэс дараалсан утгуудыг олгож түүнийгээ хэвлэж байна. #include <stdio.h> int main() { int a[5]; int i; for (i=0; i<5; i++) a[i] = i; for (i=0; i<5; i++) printf("a[%d] = %d\n", i, a[i]); } Ажиллагааг ойлгохын тулд дараах кодыг оруулаад алхамаар задлан ажиллуулж үзнэ үү. #include <stdio.h> #define MAX 10 int a[MAX]; int rand_seed=10; /* from K&R - returns random number between 0 and 32767.*/ int rand()


{ rand_seed = rand_seed * 1103515245 +12345; return (unsigned int)(rand_seed / 65536) % 32768; } int main() { int i,t,x,y; /* fill array */ for (i=0; i < MAX; i++) { a[i]=rand(); printf("%d\n",a[i]); } /* more stuff will go here in a minute */ return 0; } Энэхүү програмыг gdb-ийн тусламжтайгаар алхам алхамаар ажиллуулж үзнэ үү. gdb програмын тусламжтай алхамаар ажиллуулж байгаа жишээ видеог дараах холбоосоор үзнэ үү. <энд видео холбоос оруулах> Энэ програмд хэд хэдэн шинэ ойлголтууд дурдагдаж байна. #define гэсэн мөр нь MAX гэсэн нэртэй тогтмолыг тодорхойлж утга нь 10 байхаар зарласан байна. Тогтмолын нэрийг бүх үсгийг нь томоор бичдэг кодчилолын уламжлал байдаг нь кодыг уншиж ойлгоход хялбар болгодог. Жишээ нь int a[MAX]; гэсэн бүхэл тоон массив зарлагдсан байгааг илэрхийлэх бөгөөд MAX гэдэг нь тогтмол гэдэг нь ойлгогдож байна. Харин a массивыг зарлахдаа main болон бүх функцийн гадна зарласан байгаа нь хувьсагч програмын бүх газар хэрэглэгдэх ерөнхий хувьсагч гэдэгийг илтгэж байгаа бөгөөд ийм хувьсагчийг глобаль хувьсагч гэж нэрлэдэг. int rand_seed=10; гэсэн мөр нь мөн глобаль хувьсагч зарлаж байгаа бөгөөд анхны утга нь 10 байхаар утга олгосон байна. Энэ тооноос дараа дараагийн санамсаргүй тоог үүсгэхдээ хэрэглэнэ. Иймээс яг жинхэнэ санамсаргүй тоонууд үүсгэхийн тулд эхний утга нь тогтмол 10 биш компьютерийн цаг гэх мэт ямар нэг санамсаргүй утга олгох хэрэгтэй. Харин int rand() гэсэн мөрөнд функцийг зарлаж байна. (Бид функцийн тухай дараа дэлгэрүүлж ярьна) Энэ функцийн хувьд параметр авдаггүй харин санамсаргүй бүхэл утгыг буцаадаг байхаар бичигдсэн байна. Энэ функцийн доторх кодыг одоогоор ойлгох албагүй.


Харин main функц нь массивын элементүүдэд санамсаргүй утга олгох давталтыг агуулсан байна. Одоо main функцэд дараах кодыг /* more stuff will go here in a minute */ гэсэн тайлбарын оронд нэмж оруулна уу. /* bubble sort the array */ for (x=0; x < MAX-1; x++) for (y=0; y < MAX-x-1; y++) if (a[y] > a[y+1]) { t=a[y]; a[y]=a[y+1]; a[y+1]=t; } /* print sorted array */ printf("--------------------\n"); for (i=0; i < MAX; i++) printf("%d\n",a[i]); Энэ код нь массивын элементүүдийг эрэмбэлээд хэвлэх болно. Дээрх програмыг ажиллуулах бүрт яг ижил зүйл хэвлэх боловч int rand_seed=10; гэсэн мөрийн 10-н оронд ондоо утга бичин ажиллуулбал ялгаатай үр дүнгүүдийг хэвлэнэ. Ингээд энэ програмыг задлан ажиллуулах замаар бүрэн ойлгоно уу. Гэрийн даалгавар: Хэд байгааг ол, Minimum, Maximum, Үлдэгдэлгүй хуваагдах, Сөрөг элементийн тоо, Тэгш тоонуудын тоо, Сондгой тоонуудын үржвэр, Массивын нийлбэр, Тоонуудыг эрэмбэлэх

9 Хувьсагчийн төрөл - үргэлжлэл Хувьсагчийн төрөл Си хэлний хувьсагчийн төрөл нь дараах гурван үндсэн төрөл байдаг.   

Бүхэл тоо: int Хөвөгч таслалтай бутархай: double Тэмдэгт: char

int нь 4 байт хэмжээтэй бүхэл утга хадгалах төрөл. Харин double нь 8 байт хэмжээтэй хөвөгч таслалтай бутархай утга хадгалах төрөл. char нь 1 байт хэмжээтэй тэмдэгт (тухай нь 'a', '3'гэх мэт) хадгалах төрөл. Харин "тэмдэгт мөр" (буюу string) нь тэмдэгтүүдийн массив болно. Дээрх үндсэн гурван төрлөөс үүссэн төрөл бүрийн үүсмэл төрөлүүд байдаг.


Бүхэл тооны хувьд signed, unsigned буюу тэмдэгтэй, тэмдэггүй гэсэн үгүүдийг ашиглаж болдог. Жишээ нь: unsigned int гэсэн төрөл нь 0-с 4294967295 хүртэл утгыг авдаг бол signed int нь 65536-с 65535 хүртэл утгыг авдаг. Гэхдээ signed int гэж бичих нь зүгээр int гэж бичихтэй адилхан байдаг. Тоон төрөлүүдийн урд long, short буюу урт, богино гэсэн үгүүдийг ашиглаж болно. long double short double нь float-тэй ижил. short int нь short-тэй ижил. long int нь long-тэй ижил. unsigned short int нь unsigned short-тэй ижил. unsigned long int нь unsigned long-тэй ижил. long long int нь long long-тэй ижил (зарим хуучин процессор, хөрвүүлэгч дээр ажиллахгүй). гэх мэт хослолууд байж болдог. Эдгээр төрөлүүдийн авч болох хамгийн их бага утгуудын талаар man limits.h командаар системийн гарын авлагаас харна уу. Оператор болон үйлдлийн эрэмбэ Си хэл бусад програмчлалын хэлүүдтэй нэгэн ижил дараах арифметик үйлдлүүдтэй. + - нэмэх - - хасах / - хуваах * - үржих % - жиших Гэхдээ / оператор нь бүхэл тоонуудыг хувааж байгаа бол бүхэлээр хуваах үйлдлийг гүйцэтгэдэг. Харин хоѐулаа бутархай бол бутархайгаар хуваадаг. Тухайлбал: void main() { float a; a=10/3; printf("%f\n",a); } Энэ програмын хувьд 10/3 нь бүхэл тоон дээр гүйцэтгэгдэж байгаа тул үр дүн нь 3 байх болно. Харин хэвлэхэд бутархай тоо тул 3.0 гэж хэвлэгдэнэ. Үйлдлийн эрэмбийн хувьд бусад програмчлалын хэл болон математик илэрхийлэлтэй ижилхэн байна. Өөрөөр хэлбэл үржих, хуваах, жиших үйлдэл нь нэмэх, хасах үйлдэлээсээ түрүүлж хийгдэнэ. Мөн хаалтын тусламжтайгаар


бүлэглэж болох бөгөөд хаалтан дахь илэрхийлэл түрүүлж бодогдоно гэх мэт хуулиуд ижил байна. Төрөл хөрвүүлэх Хувьсагчууд ялгаатай төрөлтэй байгаа үед тэдгээрийн төрлийг нь хөрвүүлэн нэгийнх нь утгыг нөгөөд нь олгох үйлдэлийг хийж болдог. Мөн зарим төрөл хөрвүүлэлтийг Си автоматаар хийдэг. Тухайлбал 10/3-ийн үр дүн нь 3 гэсэн бүхэл тоо байгааг автоматаар 3.0 гэсэн бутархай тоо болгон хөрвүүлж байна. Мөн төрөл хөрвүүлэх үйлдэлийг дараах байдлаар шууд зааж өгч болдог. (float)10 гэж бичвэл 10 гэдэг утгыг шууд float төрөл болгон хөрвүүлдэг. Иймээс a=(float)10/3; гэж бичвэл үр дүн нь 3.333333 гэсэн утга болно. Төрөл тодорхойлох Си хэлэнд хэрэглэгч өөрөө шинэ төрөл тодорхойлох боломжтой. Дараах байдлаар үүнийг гүйцэтгэдэг. #define TRUE 1 #define FALSE 0 typedef int boolean; void main() { boolean b; b=FALSE; blah blah blah } Энд boolean гэсэн төрлийг тодорхойлж байна. Гэхдээ энд үнэндээ int төрөлийг л boolean хэмээн тодорхойлж байна. Түүнчлэн typedef float real; гэж тодорхойлоод real r1,r2,r3; гэж хэрэглэж болох жишээтэй юм.


Олон хэмжээст массив Өмнөх хичээлээр бидний үзсэн массив бол нэг хэмжээст массив юм. Өөрөөр хэлбэл тоон цувааг дараах байдалтай цувуулан дүрсэлж байгаа гэж ойлгож болох юм. [][][][][][] Харин зарим тохиолдолд дараах хэлбэртэй хүснэгт шигээр тоог дүрсэлэх хэрэг гарч болно. [][][][][] [][][][][] [][][][][] [][][][][] [][][][][] Энэ тохиолдолд бид 2 хэмжээст массивыг зарлаж хэрэглэнэ. Жишээ нь шатрын хөлөг шиг 8x8 массивыг дараах байдалтай зарлаж болох юм. int two_dimensional_array[8][8]; Дараах програм нь үржвэрийн хүснэгтийг үүсгэж хэвлэнэ.Туршиж үзнэ үү. #include <stdio.h> int main() { int x; int y; int array[8][8]; /* Declares an array like a chessboard */ for ( x = 0; x < 8; x++ ) { for ( y = 0; y < 8; y++ ) array[x][y] = x * y; /* Set each element to a value */ } printf( "Array Indices:\n" ); for ( x = 0; x < 8;x++ ) { for ( y = 0; y < 8; y++ ) { printf( "[%d][%d]=%d", x, y, array[x][y] ); } printf( "\n" ); } } Хоёр хэмжээст гэлтгүй хэдэн ч хэмжээст массивыг зарлан хэрэглэх боломжтой байдаг.

Гэрийн даалгавар: Дөрвөлжин спирал, Paskal, Тоглоом

10 (Си хэл). Функц Бидний хамгийн анхны үзсэн функц бол програмын үндсэн биеийг илэрхийлэх main функц билээ. Функц гэдэг нь програмтай ижил гэж ойлгож болно. Иймээс том програмыг хялбар болгохын тул олон жижиг функцүүдэд хуваах нь ойлгох болон бичихэд хялбар болдог. Мөн нэгэнт үүсгэсэн функцийг програм дотороо өөр өөр газаруудад давтан ашиглах боломжтой тул энэ нь ижил кодыг давтан бичихгүй болж хөгжүүлэлтэд тустай байдаг. Програм бичихэд програмын төвөгтэй байдлыг


аль болох бага байлгахын тулд функц тус бүрийг хэт том байж болохгүй гэсэн програмыг зохиомжлох дүрэм түгээмэл мөрдөгддөг. Хэрэв хэт том болоод ирвэл заавал жижиглэж функцүүдэд хуваах хэрэгтэй юм. Си хэлэнд функц нь оролт параметрүүд хүлээн авч үр дүн буцаадаг. Зарим тохиолдолд үр дүн буцаахгүй байж болох бөгөөд энэ тохиолдолд програмд шаардлагатай нөлөөг үзүүлэх боловсруулалтыг гүйцэтгэх юм. Мөн зарим тохиолдолд оролт параметр байхгүй байж болдог. Бид өмнөх хичээлд нэг хялбар функцийг үзсэнийг санаж байгаа. : int rand() { rand_seed = rand_seed * 1103515245 +12345; return (unsigned int)(rand_seed / 65536) % 32768; } Энэ функцийн хувьд параметр авдаггүй бөгөөд int утга буцаадагаар бичигдсэн байна. int rand() гэсэн толгой хэсэг нь функцийг зарлаж байгаа хэсэг харин үлдсэн хэсэг нь энэ функцийг хэрэгжүүлсэн хэсэг юм. Эндээс харахад функцийг заавал () хаалт тавьж зарладаг болохыг анхаарах хэрэгтэй. Мөн int rand() гэсэн энэ мөрийг дангаар нь хараад энэ функц параметр авдаггүй бүхэл утга буцаадаг rand гэсэн нэртэй функц юм байна гэдэгийг ойлгох боломжтой тул энэ мөрийг функцийн prototype гэж хэлдэг. Prototype гэдэг нь аливаа зүйлийн эцсийн ажиллах хувилбар биш боловч ажиллахдаа ямар байдлаар ажиллахыг харуулсан загварыг хэлдэг. Жишээ нь веб хийх явцад вебийг ажилладагаар хийхээсээ өмнө ажилладаггүй боловч ажиллахаараа яаж ажиллахыг харуулсан дэлгэцүүдийг эхлэж хийдэг бөгөөд үүнийг ч мөн prototype гэж нэрлэдэг. Харин функцийн хувьд зөвхөн зарласан толгой хэсэг нь prototype болж өгдөг байна. Функцийг хэрэгжүүлэн код бичихэд return гэсэн үйлдэл нь маш чухал бөгөөд энүүгээр функцээс утгыг буцаадаг. Хэрэв return үйлдлийг бичилгүй мартах юм бол функц санамсаргүй утга буцааж ямар үр дүнд хүрэх нь тодорхойгүй. Мөн return үйлдэл бичигдээгүй байвал програмыг хөрвүүлэх үед хөрвүүлэгч алдаа өгөх эсвэл сануулгыг хэлдэг. Функцын код олон салаалсан төвөгтэй тохиолдолд хөрвүүлэгч мэдрэхгүй сануулга хэлэхгүй тохиолдол ч байж болно. Функцийг дуудаж хэрэглэхдээ дараах байдлуудаар хэрэглэж болно. x=rand(); //x-д функцийн үр дүнг олгох

if (rand() > 100)

//функцийн үр дүнг шалгах


rand(); /* ингэж хэрэглэж болох боловч энэ тохиолдол функцийн утыг хаана ч юунд ч хэрэглээгүй байна. Гэхдээ функц дуудагдаж ажиллах болно. */ Үр дүн буцаадаггүй функцийг void буюу хоосон үр дүнтэй гэж зарлаж өгдөг. Жишээ: void print_header() { printf("Program Number 1\n"); printf("by Marshall Brain\n"); printf("Version 1.0, released 12/26/91\n"); } Функц нь хэдэн ч тооны ямар ч төрлийн парамерт хүлээн авч болно. Жишээлбэл бүхэл тоо хүлээн түүний факториалийг буцаах функцийг дараах байдлаар бичиж болно. int fact(int i) { int j,k; j=1; for (k=2; k<=i; k++) j=j*k; return j; } Жишээ: Хоѐр тооны нийлбэр олох функц дараах байдалтай байж болно. int add (int i, int j) { return i+j; } Параметрийг зарлахдаа дараах байдлаар бас бичиж болдог. Энэ нь үнэндээ дээрхтэй ижил юм. int add(i,j) int i; int j; { return i+j; } Си хэлэнд функцийг зарлахдаа ямар ч хамаагүй зарлаж болдог боловч функцийг зарлахаасаа өмнө хэрэглэх тохиолдолд prototype-ийг нь эхлэж зарлах хэрэгтэй байдаг. Өөрөөр хэлбэл дараах байдлаар бичих хэрэгтэй.


#include <stdio.h> int add (int,int); /* function prototype for add */ void main() { printf("%d\n",add(3)); } int add(int i, int j) { return i+j; }

Энэ жишээнд add функцийг хэрэгжүүлэхээсээ өмнө int add (int,int); гэсэн prototypeийг зарлаад main функц дотороо хэрэглэсэн байна. Харин add функцийг дараа нь жинхэнээр нь хэрэгжүүлсэн байна. Гэрийн даалгавар: Функц 3, Функц 1, Функц 2

11 switch case switch case үйлдэл нь урт бүхэл тоо буюу long төрөл рүү хөрвүүлэгдэх утгуудын хувьд боловсруулалтыг салаалах үйлдэлийг хийдэг. Жишээ: printf( "1. Play game\n" ); printf( "2. Load game\n" ); printf( "3. Play multiplayer\n" ); printf( "4. Exit\n" ); printf( "Selection: " ); scanf( "%d", &input ); switch ( input ) { case 1: /* Note the colon, not a semicolon */ playgame(); break; case 2: loadgame(); break; case 3: playmultiplayer(); break; case 4: printf( "Thanks for playing!\n" ); break; default: printf( "Bad input, quitting!\n" ); break; }


Энэ жишээнд стандарт оролтоос тоо асууж оруулсан тоо 1,2,3,4 гэсэн утгуудын аль байгаагаас хамааруулж ялгаатай үйлдэл хийж байна. Энэ жишээнд хэрэглэгдэж байгаа input хувьсагч нь char, short, int, long гэх мэт төрлүүдийн аль нь ч байж болно. Учир нь эдгээр нь long төрөл рүү автоматаар хөрвүүлэгдэж болдог төрлүүд учир. Энэ үйлдэлийн ерөнхий бичлэг нь дараах хэлбэртэй байдаг. switch ( <хувьсагч> ) { case утга1: <хувсагч> == утга1 үед хийгдэх код break; case утга2: <хувсагч> == утга2 үед хийгдэх код break; ... case утгаN: <хувсагч> == утгаN үед хийгдэх код break; default: <хувьсагч>-ийн утга дээрх утгуудын аль нь ч биш тохиолдолд хийгдэх код. break; } Асуулт: Дараах кодыг ажиллуулахад юу хэвлэгдэх вэ? int a = 10; int b = 10; int c = 20; switch ( a ) { case b: printf("A"); break; case c: printf("B"); break; default: printf("C"); break; } Зарим тохиолдолд switch үйлдэлийг бичихдээ default гэсэн хэсэгийг нь хасч бичиж болно.


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.