Си хэлний тухай
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();
}
СЭДЭВ 2. СИ ПРОГРАММЧИЛАЛ ГЭЖ ЮУ ВЭ ?
Хэрвээ та урьд өмнө нь хэзээ ч программ бичиж байгаагүй бол энэ сэдэв танд программ анхлан бичихэд чинь туслана.
2.1 Программ гэж юу вэ ?
Бидний сайн мэдэх компьютер бол тийм ч их ухаантай машин биш юм. Тэр бол зөвхөн зааврыг үг дуугүй дагадаг сайн туслагч төдий юм. Тэрээр таны өгсөн даалгаврыг биелүүлэхээр хэдэн ч өдрөөр , уйтгарлахгүйгээр , амрахгүйгээр ажиллаж чадна. Гэвч тэр юу хийхээ өөрөө бие даан шийдвэрлэж, бодож чадахгүй. Иймээс тэдэнд юу хийхийг нь Программ зохиогч хэлж, зааж өгдөг.
Түүгээр ямар нэг ажил хийлгэхийн тулд түүнд өгч байгаа командуудын олонлогийг программ гэж нэрлэнэ. Одоогоор бидний ашиглах боломжтой мянга мянган программ зохиогдоод байгаа бөгөөд эдгээр нь маш олон төрөл , чиглэлээр зохиогдсон болно.
2.2 Си программ бичихэд юу хэрэгтэй вэ ?
Си хэл дээр программ бичиж түүнийгээ ажиллуулахын тулд юуны түрүүнд Си компилятор хэрэгтэй. Си компилятор нь таны бичсэн программыг компиляци хийх буюу хөрвүүлэх үйл ажиллагааг хийдэг. Хөрвүүлэх гэдэг нь хүнд ойлгомжтой буюу Си хэл дээр бичигдсэн программыг машинд ойлгомжтой буюу командуудын дараалалд хөрвүүлэх үйл ажиллагааг хэлнэ.
2.3 Программчилах процесс
Ихэнх хүмүүс программ бичихдээ дараах дарааллыг баримталдаг.
v Программаа яг юу хийхийг тодорхойлно. ( Үйл ажиллагааг нь төсөөлнө. )
v Алгоритмаа тодорхойлоод программаа бичнэ.
v Си программыг дурын текст боловсруулагч программ дээр бичиж болно. Гэхдээ ихэнх Си компиляторууд нь өөртөө текст боловсруулагчтай байдаг. Си хэл дээр бичигдсэн программ нь .С өртгөтгөлтэй файлд хадгалагдана.
v Программаа хөрвүүлэх
v Программын алдааг хянаж, засварлах
v Си компилятор нь танд алдааны тухай мэдээллүүд өгдөг. Хэрвээ алдаагаа засаж дууссан бол программ ажиллахад бэлэн боллоо гэсэн үг.
v Программаа ажиллуулах, үр дүнг нь үзэх
Одоогоор хэрэглэгдэж байгаа ихэнх Си компиляторууд нь маш өргөн боломжтой бөгөөд энэ бүх үйл ажиллагааг нэгэн программаас хийх боломжийг бүрдүүлсэн байдаг. Жишээ нь Turbo C компилятор нь манайд өргөн хэрэглэгддэг бөгөөд энэ нь программ бичих , үр дүнг нь харах зэрэг үйл ажиллагааг нэг дэлгэцэнд меню ашиглан хийх боломжийг бүрдүүлсэн сайн компилятор юм.
СЭДЭВ 3. ДЭЛГЭЦЭНД МЭДЭЭЛЭЛ ХЭВЛЭХ
3.1 printf функц
Таны программ ажиллаж дуусаад тодорхой үр дүнг гаргах бөгөөд түүнийг бид үзэх буюу дэлгэцэнд үр дүн нь хэвлэгдэх зайлшгүй шаардлагатай байдаг. Си хэлэнд үүнийг хэрэгжүүлдэг printf гэсэн функц байдаг. Энэ функц нь дэлгэцэнд тоо, тэмдэгт , үг гаргахад ашиглагдана. printf функц нь маш өргөн боломжтой бөгөөд ихэнх хүмүүс боломжийг нь бүрэн ашиглаж чаддаггүй.
3.2 printf функцын формат
Энэ функцын үндсэн формат нь :
printf(Удирдлагын тэмдэгт мөр [,өгөгдөл] );
Тайлбар: Си хэлэнд функцуудын форматыг бичиж үзүүлэхдээ зарим тусгай тэмдэглэгээг хэрэглэдэг ба энд [ ] гэсэн тэмдэглэгээг ашигласан байна. Ер нь тэмдэглэгээг зөвхөн танд ойлгуулах үүднээс л ашигладаг ба энэ нь тайлбарлаж буй функцын бичлэгт ордоггүй юм. Иймээс энэ функцыг ашиглахдаа [ ] хаалтыг бичихгүй байх болно. Энэ хаалтанд бичигдсэн өгөгдөл түүнийг бичихгүй байж болно гэсэн утгыг агуулдаг.
Удирдлагын тэмдэгт мөр нь тухайн өгөгдөл ямар хэлбэрээр дэлгэцэнд гарахыг тодорхойлдог.
printf(“ Жишээ %d”,1); /* Энэ жишээнд Жишээ 1 гэсэн үгийг хэвлэж байна*/
Си хэлэнд тэмдэгт мөрийг заавал хашилтанд (“”) бичдэг. Тэгэхээр удирдлагын тэмдэгт мөр нь заавал хашилтанд бичигдэнэ.
Си хэлэнд бичигдсэн команд бүр “;”-аар төгсөх ёстой. Өөрөөр хэлбэл энэ нь команд дуусч байна, үүнийг биелүүлэх ёстой гэдгийг Си энэ тэмдэгтээр мэдэх болно.
3.3 Тэмдэгт мөр хэвлэх
Бид дэлгэцэнд тэмдэгт мөр мэдээлэл хэвлэхдээ энэ функцыг ашиглана.
printf(“ Сайн байна уу ! ”);
Энэ комманд биелэгдэхэд дэлгэцэнд Сайн байна уу ! гэсэн үг хэвлэгдэнэ.
printf(“ Сайн байцгаана уу !”);
printf(“ Хичээлээ эхлэцгээе !”); гэсэн коммандууд юу хэвлэхийг үзэцгээе.
Сайн байцгаана уу ! Хичээлээ эхлэцгээе !
Си нь тэмдэгт мөр хэвлээд дараа нь курсорыг дараагийн мөрт автоматаар шилжүүлдэггүй. Тэгвэл ингэж курсорын байрлалыг удирдахдаа Удирдлагын тэмдэгт мөр дотор тусгай тэмдэгтүүдийг ашигладаг.
3.4 Курсорын байрлал удирдах тэмдэгтүүд
Си хэлэнд маш олон ийм тэмдэгтүүд байдаг ба тэднээс зарим хэсгийг нь л их өргөн ашигладаг.
Хүснэгт 3.1 Курсорын байрлал удирдах тэмдэгтүүд
Код | Тайлбар |
| Шинэ мөр |
Дуут дохио гаргах | |
| Tab тэмдэгт ( Хэд хэдэн хоосон зай ) |
\ | тэмдэгтийг өөрийг нь хэвлэх |
” | “ тэмдэгт хэвлэх |
| Мөрийн эхэнд |
“” тусгай тэмдэгтийг хэвлэхэд дуут дохио гардаг. Өмнөх жишээнд бид хоёр тэмдэгт мөр хэвлэхэд тэд 2 мөрт биш , 1 мөрт гарч байсан . Тэгвэл одоо тусгай тэмдэгт ашиглан энэ үйлдлийг гүйцэтгэе. Эхлээд эхний тэмдэгт мөрөө хэвлээд дараа нь курсорыг дараагийн мөрт шилжүүлэх шаардлагатай.
printf(“ Сайн байцгаана уу ! ”);
printf(“ Хичээлээ эхлэцгээе !”);
Си тэмдэгт мөрийг хэвлэж байгаад тэмдэгт дайралдангуут курсорын байрлалыг дараагийн мөрт шилжүүлдэг. Ингэсний дараа хэвлэгдэх тэмдэгтүүд шинэ байрлалаас цааш хэвлэгдэх болно.
Тусгай тэмдэгтүүдийг ашигласан жишээ :
printf(“Тэмдэгт мөр хэвлэв. ”); /* Тэмдэгт мөр хэвлэв. */
printf(“Дохио дуугарав. ”); /* Дохио дуугарав. */
printf(“Тэр ”Үгүй” гэж хэлсэн. ”); /* Тэр “Үгүй” гэж хэлсэн. */
printf(“\ тэмдэгтийг хэвлэв. ”); /* \ тэмдэгтийг хэвлэв. */
3.5 Хөрвүүлэлтийн тусгай тэмдэгтүүд
Та тэмдэгт болон тоо хэвлэхдээ тэдгээрийг яаж хэвлэгдэхийг тодорхойлох хэрэгтэй болдог. Ингэж тодорхойлохдоо хөрвүүлэлтийн тусгай тэмдэгтүүдийг ашигладаг.
Хүснэгт 3.2 Хөрвүүлэлтийн тусгай тэмдэгтүүд
Тэмдэгт | Тайлбар |
%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 |
%ld, %li, %lo, %lx | long int |
%le, %lE, %lf, %lg | Double |
%Le, %LE %Lf, %Lg | long double |
Жич : Хамгийн хялбар бөгөөд юуны түрүүнд бидэнд хэрэг болох тусгай тэмдэгтүүдийг тод хараар бичэв.
Тоо, тэмдэгт хэвлэхдээ Удирдлагын тэмдэгт мөр дотор хөрвүүлэлтийн тусгай тэмдэгтүүдийг бичих ба дараа нь Удирдлагын тэмдэгт мөрийн ард хэвлэх утгуудаа таслалаар зааглан харгалзуулан жагсааж өгдөг.
Жишээ :
printf(“%s %d %f %c ”,”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, . . . ]);
Энэ функц нь UNIX үйлдлийн системд өргөн хэрэглэгддэг.
Жишээ :
#include
int main(void)
{
int n=3;
float x=45.875;
/* Дэлгэцэнд хэвлэх */
printf(“ Сайн байна уу ? ”);
/* Принтерт хэвлэх */
fprintf(stdprn,“ Сайн байна уу ? ”);
/* Дэлгэцэнд хэвлэх */
printf(“ x=%f ба n=%d ”,x,n);
/* “Принтерт хэвлэх */
fprintf(stdprn,“ x=%f ба n=%d ”,x,n);
}
СЭДЭВ 4. ХУВЬСАГЧ БА ӨГӨГДЛИЙН ТӨРЛҮҮДБүх программчилалын хэлүүд хувьсагч тодорхойлж, өгөгдөлтэй ажиллах тодорхой механизмуудтай байдаг. Си хэлэнд энгийн өгөгдлийн төрлүүд болох бүхэл, бодит тоо, тэмдэгтэн төрлүүдтэй ажиллах олон арга замууд байдаг.
Бусад программчилалын хэлүүдэд байдаггүй тийм аргууд нь Си хэлийг улам ч хүчирхэг болгодог. Энэ бүлэгт үзэх санаануудыг Си хэлэнд эхлэн суралцагч хэн бүхэн сайн ойлгох хэрэгтэй. Өгөгдлийн төрлүүд болон тэдгээртэй ажиллах үйлдлүүдийн олонлог нь Си хэлийг улам уян хатан болгодог ч , зарим талдаа буюу Си хэлийг төгс эзэмшиж ойлгоход хүндрэлтэй байдаг талтай.
4.1 Идентификаторууд
Хувьсагчид болон функцийн нэрийг идентификатор гэнэ. Си хэлний идентификатор нь үсэг, тоо, доогуур зураас тэмдэгтээс бүрдсэн 32 тэмдэгт хүртэлх урттай байж болно. Идентификаторийг том болон жижиг үсгээр бичиж болох ба Си хэлэнд том жижиг үсгийг ялгаатайд тооцдог. Өөрөөр хэлбэл Count, count , COUNT гэсэн гурван нэр нь гурвуулаа ялгаатай нэрүүд болно. Практикаас үзэхэд өөрийн бичих программаа илүү ойлгомжтой болгохын тулд хувьсагчдын нэрийг жижиг үсгээр, тогтмолуудыг том үсгээр бичиж ашигладаг.
Зөв идентификатор | Буруу идентификатор |
far_out | Tom’s |
TIME | whicha$macallit |
age | %dollar |
Time | do-it |
Зөвлөгөө :
v Хувьсагчийн нэрийг үсгээр эхлэх
v Хувьсагчийг түлхүүр үгтэй ижлээр нэрлэж болохгүй. ( do, while , if , int, float , case . . . )
v Хувьсагчдыг гүйцэтгэж байгаа үүрэгтэй нь зохисон нэрээр нэрлэх
v Дотоод хувьсагч ялангуяа индекс зэргийг богино , гадаад хувьсагчийг арай уртаар нэрлэхэд тохиромжтой.
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 хэмжээтэй. |
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;
үед 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;
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
#define TRUE 1
#define FALSE 0
main()
{
. . .
}
‘const’ түлхүүр үгийг ашиглан тогтмол зарлах :
Бичигдэх хэлбэр : const <төрөл> <Нэр>=<утга>;
Жишээ :
const float pi=3.1415;
const int Max=100;
Тогтмолыг ингэж зарласны дараа үндсэн программд дараах үйлдлүүдийг хийхийг хориглоно.
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 болгон хөрвүүлж бодолт хийх ба илэрхийллийн үр дүн 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-тэй адил хөрвүүлэлтийн тусгай тэмдэгтүүдийг ашигладаг.
Харин курсор удирдах тусгай тэмдэгтүүдийг ( . . . ) удирдлагын тэмлэгт мөр дотор хэзээ ч бүү ашигла. Ашиглавал функцын үйл ажиллагаа буруу явагдах болно. Мөн scanf-ыг үргэлж printf-тэй цуг хэрэглэ. Хэрэв printf-ээр асуултаа тавихгүй бол хэрэглэгч өгөгдөл оруулах ёстой гэдгийг ойлгохгүй байх болно.
Жишээ :
printf(“Таны массив хичнээн элементтэй байх вэ ?”); /* Асуултаа тавих */
scanf(“%d”,&n);
Гэхдээ зарим шинж чанарыг нь авч үзвэл scanf нь тийм ч хялбархан функц биш юм. scanf –ыг ашиглахад гардаг нэг хэцүү асуудал нь “scanf –ын Удирдлагын тэмдэгт мөрийг ямар байдлаар бичсэн яг түүнтэй адилаар хэрэглэгч гараас өгөгдөл оруулах ёстой” юм.
Жишээ : Гараас int утгыг age хувьсагчид уншья.
scanf(“=%d”,&n);
Энэ тохиолдолд хэрэглэгч гараас тоогоо оруулахдаа өмнө нь заавал = тэмдэг бичиж байх хэрэгтэй. Учир нь scanf ингэж хүсч байна. Тэгэхээр scanf-ын Удирдлагын тэмдэгт мөрийг бичиж байхдаа онц шаардлагагүй л бол хэрэгцээгүй, илүү тэмдэгтийг ашиглахгүй байх хэрэгтэй.
scanf-ыг ашиглахад гардаг өөр нэг асуудал нь & тэмдэгтийг ашиглах явдал юм.
scanf –д хувьсагчдын өмнө & тэмдэгтийг ашигладаг. Шаарддаг учрыг сүүлд бид “Функц” гэсэн сэдвийг үзэж байхад мэдэх болно. Харин нэг тохиолдолд буюу “%s” тэмдэгтийг ашиглаж байгаа , өөрөөр хэлбэл тэмдэгт массивтай ажиллаж байх үед & тэмдэгтийг ашигладаггүй.
Дүрэм : Хэрэглэгчээс int, float, char, double,long гэх мэт энгийн төрлийн утгыг уншихыг хүсвэл & тэмдэгтийг хувьсагчийн нэрийн өмнө заавал ашигла. Харин хэрэглэгчээс тэмдэгт мөр буюу тэмдэгт массив уншихыг хүсвэл & тэмдэгтийг ашиглахгүй.
Дараах программд хэрэглэгчээс овог, нэр , нас, хүндийг нь асууж байна. Тэмдэгт мөр уншихдаа & ашиглаагүй , харин нөгөө 2 хувьсагчид & ашиглаж байгааг анзаарна уу. Программд хэрэглэгчийн овог нэрийг нэг scanf –аар цугт нь уншиж чадаагүй байна. Учир нь scanf нь нэгэн зэрэг 2 үг буюу тэмдэгт мөр салгаж уншиж чадахгүй. юм.
#include
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(“ Таны оруулсан мэдээллүүд ”);
printf(“ Овог, Нэр : %s %s ”,last,first);
printf(“Жин : %.0f ”,weight); /* 0 байгаа учир бутархай оронг хэвлэхгүй.*/
printf(“Нас : %d”, age);
}
Программ ажиллаад дараах үр дүнг үзүүлнэ.
Та нэрээ оруулна уу ? Бат
Та овгоо оруулна уу ? Дорж
Та хэдэн настай вэ ? 20
Та хэдэн кг жинтэй вэ ? 60
Таны оруулсан мэдээллүүд
Овог, Нэр : Дорж Бат
Жин : 60
Нас : 20
Жишээ :
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);
Энэ тохиолдолд хэрэглэгч яг дээрх форматаар л оруулах ёстой.
Дүрэм :
v Хэрэглэгчээс өгөгдөл уншихдаа scanf функцыг ашиглана.
v scanf-ыг ашиглахдаа удирдлагын тэмдэгт мөр бичдэг ба энэ нь хэрэглэгч өгөгдлөө яаж оруулахыг тодорхойлсон тэмдэгт мөр байна.
v scanf-ыг ашиглахаасаа өмнө printf-ээр заавал асуултаа хэвлэ.
v scanf-д массиваа өөр хувьсагч ашиглахдаа & тэмдэг ашигла.
v scanf-д массивын нэрийн өмнө & тэмдэг бүү ашигла.
5.2 getchar() функц
getchar() нь гараас зөвхөн ганц тэмдэгт уншина, харин putchar нь дэлгэцэнд нэг тэмдэгт хэвлэнэ. Та зөвхөн нэг тэмдэгт гараас унших, эсвэл дэлгэцэнд нэг тэмдэгт хэвлэхийг хүсвэл эдгээр функцыг ашигла.
Жишээ :
#include
main()
{ int ch;
printf(“ Тэмдэгтээ оруулна уу ? ”);
ch=getchar();
printf(“ You typed the character ”);
putchar(ch);
}
Энэ команд нь int утга буцаах ба энэ нь дарагдсан товчны код байна.
5.3 getch() функц
getch() нь оруулах өгөгдлийг буферлэдэггүй. Өөрөөр хэлбэл өгөгдлөө цуглуулан, ENTER товчийг хүлээдэггүй . Үүнээс үүдэх нэг дутагдал нь буруу оруулсан өгөгдлөө BACKSPACE товчоор залруулж, арилгаж болдоггүй. Харин getchar()-аар өгөгдлөө унших үед хэрэглэгч BACKSPACE товч дарж болно. Гэтэл getch()-д ийм боломж байхгүй. Дараах жишээнд getch()-ээр 2 тэмдэгт уншиж байна.
printf(“Хоёр тэмдэгт оруулна уу ? ”);
first=getch();
second=getch();
getch() нь getchar() шиг ENTER товч хүлээдэггүй учраас түүнээс илүү хурдан ажиллана.
5.4 getch() функц
getch() нь оролтын тэмдэгтүүдийг дэлгэцэнд дүрсэлдэггүй. Иймээс та дэлгэцэнд дүрслэхийг хүсвэл дараа нь putch –ийг дуудах шаардлагатай болдог.
printf(“Хоёр тэмдэгт оруулна уу ? ”);
first=getch();
putch(first);
second=getch();
putch(second);
Гэтэл дээрх үйлдлийг гүйцэтгэхийн тулд getche функцыг ашиглахад л хангалттай. getche нь оролтын тэмдэгтүүдийг дэлгэцэнд дүрсэлдэг.
Дүрэм
v Нэг тэмдэгт унших, бичихийг хүсвэл getchar(), putchar()-г ашигла.
v Гараас Enter товчийг хүлээж зогсохыг хүсвэл getchar-ийг ашигла.
v Хэрэглэгч товч дарангуут түүнийг дэлгэцэнд дүрсэлэхгүйгээр уншихыг хүсвэл getch()-ийг ашигла.
v Эдгээр Оролт гаралтын функцүүдтэй ажиллахдаа char биш int хувьсагч ашигла. Учир нь зарим үйлдлийн системүүд char төрлөөс их утгаар товчлууруудаа кодлосон байдаг.