Tuesday, 30 September 2014

Си хэлний Лекц №2



СИ ХЭЛНИЙ ЭЛЕМЕНТҮҮД
/Elements of C Programming language/
Зорилго: Энэ хичээлээр програмчлалын си хэлний товч идентификаторууд болон түлхүүр үгсийг хэрэглэж, програмд тайлбар бичиж сурна.
Лекцийн агуулга:
1.1.     Товч түүх
1.2.     Идентификатор
1.3.     Түлхүүр үг
1.4.     Програмд тайлбар хийх
2.1. Товч түүх
       Програмчлалын Си хэлийг 1972 онд Bell Laboratories (АНУ) компанийн ажилтан 
Деннис Ритчи (Dennis M. Ritchie) UNIX үйлдлийн системийг боловсруулж байх явцдаа
зохиожээ. Сихэл нь системийн програмчлалын хэрэгсэл мэтээр бүтээгдсэн байна. 
      Өөрийн онцлог, давуу талуудын ачаар энэ хэл богино хугацааны дотор хэрэглээний
болон системийн програмчлалын хамгийн түгээмэл хэл болж чадсан юм. Тиймээс хэ-
дийгээр сургалтын зориулалттай биш боловч компьютерын ухааны боловсролд өргөн  хэрэглэгддэг. Си хэлнийхөрвүүлэгчид орчин үеийн бараг бүх төрлийн компьютер дээр,UNIX /Linux, MS-DOS, MAC OS, OS/2, Windows, Solaris г.м. үйлдлийн системүүдэд ажиллаж байна.
Си хэл анхнаасаа л цомхон хүрээнд зориулагдсан “ажлын багаж” мэтээр зохиогдсон тул 1989 оныг хүртэл ямар нэгэн стандарт хэлбэрт (албан ёсны хувилбар) ороогүй байжээ. Тийм учраас Си хэлний янз бүрийн хөрвүүлэгч програмыг боловсруулагчид Б.Керниган, Д.Ритчи нарын “Програмчлалын Си хэл” (“The C Programming Language”, 1st Edition, Brian Kernighan & Dennis Ritchie, 1978) номыг албан бус стандарт лавлах болгон хэрэглэдэг байв. Энэ номын дагуух хувилбарыг ном, сурах бичигт “K&R C” гэж тэмдэглэж заншсан. Иймэрхүү байдалтай байж байгаад 1989 онд ANSI C хэмээх стандарт гарчээ. 1990 онд Олон Улсын Стандартчилалын Холбоо (ISO) ANSI C стандартыг үл ялиг өөрчлөөд ISO C олон улсын стандартыг баталжээ. Үүнээс хойно C99 хэмээх стандарт гарсан. Гэхдээ өнөөдөр дэлхий нийтээр ANSI C стандартыг илүү өргөн хэрэглэж байна. Энэ стандартын үндсэн эх сурвалжаар мөнөөх Б.Керниган, Д.Ритчи нарын “Програмчлалын Си хэл” (“The C Programming Language”, 2nd Edition, Brian Kernighan & Dennis Ritchie, 1988) номын 2 дахь хэвлэлийг тооцдог.
Цагаан толгой
Си хэлний цагаан толгойд:
         Латин цагаан толгойн том, жижиг үсгүүд: (A, B, ..., Z, a, b, ..., z)
         Цифрүүд: 0, 1, 2, 3, 4 , 5, 6, 7, 8, 9
         Тусгай тэмдгүүд:
,
{ }
|
[ ]
( )
+
-
/
%
\
;
.
:
?
=
_
!
&
*
#
~
^
         Үл дүрслэгдэх тэмдэгтүүд: лексемүүдийг нэг нэгээс нь тусгаарлах үүрэг бүхий сул зай, табуляци, шинэ мөрөнд шилжих г.м.
Цагаан толгойн тусламжтайгаар хэлний бусад бүрдэл хэсгүүд болох тайлбар, лексем зэргийг бүтээдэг. Си хэлэнд:
·         идентификаторууд (чөлөөт нэрс)
·         албаны (нөөц) үгс
·         тогтмолууд
·         тэмдэгт мөр төрлийн тогтмолууд
·         үйлдлийн тэмдгүүд
·         тусгаарлагч тэмдгүүд гэсэн 6 төрлийн лексем байна. 
Эдгээр лексемүүдийг ашиглан програмын эх кодыг бичнэ.
2.2. Идентификатор (Чөлөөт нэр)
Үсэг юм уу доогуур зураас “_”аар эхлэсэн, үсэг, цифр, доогуур зураасуудын 
дарааллыг идентификатор гэнэ. Ж.нь:
X, y_, x2, value, _mydata, kom16, TIME, time, aa, b2c3, week_days
Том, жижиг үсгүүд ялгаатай утгыг илэрхийлнэ. Тиймээс ж.нь TIME болон time нь ялгаатай нэрнүүд байна.
Идентификатор нь дурын урттай байж болох ч Turbo C++ хөрвүүлэгч эхний 32 
тэмдэгтийг л тооцдог.
Албаны (нөөц) үгс
Си хэлэнд урьдаас тодорхойлогдож нөөцлөгдсөн учраас програм зохиогч хүн чөлөөт нэр болгон ашиглах боломжгүй тийм идентификаторуудыг албаны үгс гэнэ. Албаны үгс ньөгөгдлийн төрөл, санах ойн ангиллууд, өгөгдлийн хэлбэрүүд, модификаторууд, хуурмаг хувьсагчууд  (регистрийн хувьсагчууд), операторууд г.м.-ийг тодорхойлно.
Си хэлэнд өөрт нь:
auto
break
Case
char
Const
continue
default
do
double
else
enum
extern
Float
for
goto
If
Int
long
register
return
Short
signed
sizeof
static
Struct
switch
typedef
union
unsigned
void
volatile
while
гэсэн нөөц үгнүүд тодорхойлогдсон байдаг.
Үүнээс гадна Си хэлний янз бүрийн хөрвүүлэгч, стандарт сан боловсруулагчдын дунд тогтсон нэг тохиролцоо бий. Энэ нь, нэг юм уу хоёр доогуур зураас “_”-аар эхлэсэниндентификаторыг нөөц үг гэж тооцох явдал юм. Тиймээс ийм идентификаторыг эх кодонд чөлөөт нэр болгон ашиглах нь зохимжгүй.
2.3. Тайлбар
Эх код дотор, зүүн гар талаасаа /*, баруун гар талаасаа */ тэмдгүүдээр
хашигдсан текстийг тайлбар (comment) гэнэ. Тайлбарыг кирилл үсгээр хийж болно. 
Ж.нь:                                                    /* Энэ бол тайлбар */
Си хэлэнд нэг тайлбарыг өөр тайлбар дотор хийж болохгүй. Тухайлбал:
/* Энэ бол тайлбар 1 /* Энэ бол тайлбар 2 */ Энэ бол тайлбар 3 */
гэсэн бичиглэл байж болохгүй. “Энэ бол тайлбар 3” гэсэн текстийг тайлбар гэж үзэхгүй.
Хөрвүүлэгч нь тайлбарыг хөрвүүлэх оролдлого хийхгүй. Хөрвүүлэлтийн явцад бүх тайлбарыг хоосон зайгаар солино. Учир нь тайлбар бол хөрвүүлэгчид бус хүнд зориулагдсан.
Тогтмолууд
Өөрчлөгдөх боломжгүй утгыг тогтмол гэнэ. Си хэлэнд:
         тэмдэгт төрлийн тогтмол
         бүхэл тоо
         бодит тоо
         тоочсон төрлийн тогтмол
         тэг-заагч (null-pointer)
гэсэн үндсэн 5 төрлийн тогтмол тодорхойлогдсон байдаг. Тэг-заагчаас бусад төрлийн 
тогтмолыг арифметик буюу тоон тогтмолууд гэдэг.
Тэмдэгт тогтмол
ASCII тэмдэгттэй ажиллахын тулд тэмдэгт тогтмолыг хэрэглэнэ. Тэмдэгт
 тогтмол гэдэг нь ASCII тэмдэгт, энэ тэмдэгтийг хоёр талаас нь хашсан дан хашилт
(апостроф) зэргээс тогтох лексем юм. Ж.нь:
‘A’        ‘a’         ‘B’        ‘b’         ‘8’         ‘0’         ‘+’        ‘;’
г.м. нь тэмдэгт тогтмолууд болно. Хашилтуудын хооронд, гаралтын төхөөрөмжид 
дүрслэгдэх боломжтой дурын ASCII-тэмдэгтийг бичиж болно. Харин удирдах кодыг
(өмнөх лекцийг хар) илэрхийлэхийн тулд хэдхэдэн дүрслэгдэгч ASCII тэмдэгтийн 
комбинацийг ашигладаг. Ингэхдээ комбинаци болгон гэдрэг налуу зураас ‘\’-аар 
(backslash) эхлэх ёстой. Ямар ямар удирдах кодыг хэрхэн бичихийгхаруулваас:
         ‘\n’ – курсорыг шинэ мөрөнд шилжүүлэх
         ‘\t’ – хэвтээ табуляци
         ‘\r’ – курсорыг одоо байрлах мөрийнх нь эхэнд аваачих
         ‘\\’ – гэдрэг налуу зураас \
         ‘\’’ – дан хашилт ‘
         ‘\”’ – давхар хашилт “
         ‘\0’ – тэгийн тэмдэг
         ‘\a’ – дуут сигнал
         ‘\b’ – курсорыг зүүн гар тийш нэг байр (нэг тэмдэгтээр) шилжүүлэх
         “\f’ – хуудас шилжүүлэх
         ‘\v’ – босоо табуляци
         ‘\?’ – асуултын тэмдэг.
Дээрх тэмдэгт тогтмолууд бүгд хоёр буюу түүнээс олон тэмдэгтээр бичигдсэн боловч бүгд харгалзан нэг нэг удирдах кодыг илэрхийлнэ гэдгийг дахин хэлье.
Тэмдэгт тогтмолыг бүхэл тоон төрөлд хамааруулж үздэг байна. Тиймээс илэрхийлэлд бүхэл тоон өгөгдөл мэтээр оролцож болдог.
Бүхэл тоо
Си хэлэнд:
         10-тын (Decimal)
         16-тын (Hexadecimal)
         8-тын (Octal)
гэсэн 3 төрлийн бүхэл тоон тогтмол тодорхойлогдсон байдаг.
10-тын тогтмолыг стандарт хэлбэрээр бичнэ. Ж.нь:
44        684      0          1024
г.м.
Харин 8-тын тогтмолыг 0-ээр эхлүүлж бичнэ. Ж.нь:
016 (= 1410)                045 (= 3710)
г.м.
16-тын тогтмолыг бичихдээ урд талд нь 0x юм уу 0X гэсэн угтваруудыг
залгана. Ж.нь:
0x16 (= 2210)               0XFF (= 25510) г.м.
Бодит тоо
Бодит тоон тогтмолыг дараах хэсгүүдээс бүтээнэ. Бүхэл хэсгийг 10-тын 
тогтмолоор, бутархайн таслалыг цэгээр, бутархай хэсгийг мөн 10-тын тогтмолоор
бичнэ. Хэрэв тоог 10-ын зэрэгт хэлбэрээр (мантисс+зэрэг) бичих бол зэргийн суурийг “e” юм уу “E” үсгээр,  зэрэг илтгэгчийг 10-тын тогтмолоор дүрсэлнэ. Бүхэл юм уу бутархай хэсгийн аль нэг нь 0 байвал бичихгүй орхиж болно, гэхдээ хоёуланг нь зэрэг орхиж болохгүй. Ж.нь:
44.       3.14159           44e0                0.314159E1                 0.0 г.м.
Өгөгдлийн төрөл ба тоон тогтмолууд. Хязгаарын утгууд
Програмд зарлагдсан тогтмол болгон санах ойд ямар нэг зай эзэлнэ. Энэ зай ямар хэмжээтэй байх вэ, энд агуулагдах код юуг дүрсэлсэн бэ гэдгийг өгөгдлийн төрөл гэсэн ойлголтоор тодорхойлдог.
Тэмдэгт төрлийн тогтмолд хөрвүүлэгч санах ойд 1 байтын зай олгоно.
Харин бүхэл тоон тогтмол ямар утгын мужид байгаагаас шалтгаалан хөрвүүлэгч өөр өөр зайг санах ойд олгоно. Тухайлбал [0, 32767] завсарт орших тогтмолд 2 байт өгөх бол [32768, 4294967295] завсрын тогтмолд 4 байт өгнө.
Бодит тоон тогтмолд хөрвүүлэгч санах ойд 8 байтын зайг олгодог. Ө.х. давхар (double) нарийвчлалаар дүрсэлнэ. Тиймээс ж.нь 3.141592653589763 болон 3.14 гэсэн тогтмолууд ижилхэн 8 байт эзэлдэг. Гэхдээ програм зохиогч нь бодит тооны санах ойд эзлэх хэмжээг хөрвүүлэгчийн сонголтоос өөрөөр олгоё гэвэл тоог бичихдээ ард нь F (эсвэл f), L (эсвэл l) гэсэн дагаварыг залгах боломжтой. Ж.нь 3.14159F гэвэл 4 байт, 3.14L гэвэл 10 байт болдог.
Тэг-заагч
Тэг-заагч нь цорын ганц тоон бус тогтмол юм. Үүний тухай хойно дэлгэрэнгүй үзнэ.
Тоочсон төрлийн тогтмол
Тоочсон төрлийн тогтмолууд гэдэг нь:
enum тоочсон_төрлийн_нэр { тогтмолуудын_нэр(с)ийн_жагсаалт } ;
хэмээх загвараар бичигдсэн тогтмолуудыг хэлнэ. Энд:
         enum – тоочсон төрлийг илэрхийлэх албаны үг
         тоочсон_төрлийн_нэр – заавал байх албагүй чөлөөт идентификатор
         тогтмолуудын_нэр(с)ийн_жагсаалт – нэг нэгээсээ таслалаар тусгаарлагдан цувж бичигдсэн тогтмолуудын нэрс. Заримдаа: тогтмолын_нэр=тогтмолын_утга гэсэн загвараар бичигдсэн байж болно.
Ж.нь:
enum { ONE = 1, TWO, THREE, FOUR } ;
enum DAY { SUN, MON, TUE, WED, THU, FRI, SAT } ;
enum BOOLEAN { NO, YES } ;
г.м. Хэрэв нэрсийн жагсаалт дунд ‘=’ орсон элемент байхгүй бол тогтмолуудыг зүүн талаасаа 0-ээр эхлээд 1-ээр нэмэгдсэн утгатай гэж үздэг. Тиймээс NO=0, YES=1, SUN=0, 
FRI=5 байна. Бас TWO=2, THREE=3, FOUR=4 байна.
Тэмдэгт мөр төрлийн тогтмол
Эх код дотор, давхар хашилтанд бичигдсэн ASCII-тэмдэгтүүдийн дарааллыг тэмдэгт мөр төрлийн тогтмол (мөр-тогтмол) гэнэ. Ж.нь:
Ene bol temdegt mur!
эсвэл:
“Bid programchlaliin C kheliig uzej baina”
г.м.
Тэмдэгтүүдийн дунд удирдах кодууд орсон байж болно. Удирдах кодыг бичихдээ  өмнө дурдсанчлан ‘\’-аар эхлүүлэх ёстой. Ж.нь:
“\n Ene text \n delgetsen deer \n 3 murund dooshoo tsuvarch garna”
Мөр төрлийн тогтмолыг хөрвүүлэгч санах ойд яаж хадгалдаг вэ? Тэмдэгт болгон (удирдах код ч гэсэн) 1 байт эзэлж, бүх тэмдэгтүүд дараалсан нүднүүдэд цуварч байрладаг байна. Харин хамгийн сүүлийн тэмдэгтийн ард хөрвүүлэгч өөрөө ‘\0’ гэсэн тэмдэгтийг залгадаг. Тиймээс мөр-тогтмолын санах ойд эзлэх байтын тоо нь мөрийн тэмдэгтийн тооноос 1-ээр их байдаг ажээ. Ж.нь:
“Ene mur sanax oid 34 byte ezelne.”
гэсэн тэмдэгт мөрийн санах ой дахь дүрслэл:
E
n
E

m
u
r

s
a
n
a
x

o
i
d

3
4

b
y
t
e

e
z
e
L
n
e
.
\0
болно.
Эндээс ж.нь ‘F’ гэсэн тэмдэгт тогтмол ба F” гэсэн тэмдэгт мөрийн ялгаа харагдана. Юу гэвээс ‘F’ нь санах ойд 1 байт болох бол “F” нь 2 байт болох юм.
Хэрэв хоёр мөр-тогтмолын дунд сул зай эсвэл табуляци байвал хөрвүүлэгч тэдгээрийг нэг бүхэл мөр-тогтмол мэтээр ойлгоно. Ж.нь:
“Namriin nalgar” “ shar udruud”
гэсэн тэмдэгт мөрүүд нь:
“Namriin nalgar shar udruud”
гэсэн ганц мөр-тогтмол болох юм.
Яг үүний адилаар, эх кодын хэд хэдэн дараалсан мөрөнд цуварч байрласан тэмдэгт мөрүүд мөн нэг бүхэл мөр-тогтмол мэтээр ойлгогдоно. Ж.нь:
“Ikh Mongol uls ”
“baiguulagdsanii ”
“800 jiliin ”
“oi”
гэсэн дараалал бол:
Ikh Mongol uls baiguulagdsanii 800 jiliin oi”
гэсэн ганц мөр-тогтмол болох юм.
Дүгнэлт
Энэ удаагийн лекцээр програмчлалын си хэлний товч түүхтэй танилцаж, идентификаторууд болон түлхүүр үгсийг хэрэглэж, програмд тайлбар бичиж сурлаа.

Түлхүүр ойлголт (товч тодорхойлолтууд)
Идентификатор - Үсэг юм уу доогуур зураас “_”-аар эхлэсэн, үсэг, цифр,  доогуур зураасуудын дарааллыг идентификатор гэнэ.
Албаны үгс -Си хэлэнд урьдаас тодорхойлогдож нөөцлөгдсөн учраас програм зохиогч 
хүн чөлөөт нэр болгон ашиглах боломжгүй тийм идентификаторуудыг албаны үгс гэнэ.
Тайлбар - Эх код дотор, зүүн гар талаасаа /*, баруун гар талаасаа */ тэмдгүүдээр
хашигдсан текстийг тайлбар гэнэ.
Тогтмол - Өөрчлөгдөх боломжгүй утгыг тогтмол гэнэ.
Мөр тогтмол - Эх код дотор, давхар хашилтанд бичигдсэн ASCII-тэмдэгтүүдийн дарааллыг тэмдэгт мөр төрлийн тогтмол гэнэ.
Сорих асуултууд
1.      Програмчлалын Си хэлийг хэдэн онд хэн анх зохиосон бэ?
2.      ANSII C хэмээх стандэрт хэдэн онд гарсан бэ?
3.      Програмчлалын Си хэлэнд хэдэн төрлийн лексем байдаг вэ?
4.      Лексемийн төрлүүдийг тайлбарлана уу?
5.      Тэг заагч гэж юу вэ?
Оюутнуудын бие дааж судлах материал
1.      Д.Цэдэвсүрэн “Си програмчлал” УБ хот, 2012 он
2.      И.Цэдэн-Онолт “Програмчлалын Си хэл” УБ хот, 1999 он цуврал №1, 2.
3.      Л.Чойжоованчиг ба бусад “Мэдээлэл зүйн олимпиадын бодлогын хураамж №1-16” УБ хот, 2011 он
4.      С.Ууганбаяр “Си хэл” УБ хот, 2010 он
Ашиглах вэб сайт
1.      www.kt.mn
2.      www.google.com
3.      www.wikipedia.com
4.      www.dot.mn
Гэрийн даалгавар
1.      Ном, сурах бичиг, сонин сэтгүүл, интернет зэрэг эх сурвалжаас аль нэгийг сонгон лекцийн сэдвийн дагуу дэлгэрүүлж уншин, товчлол хийж ирэх.
2.      Лекцийн агуулгаар 10 тест зохиож ирэх. Үүнд:
ü  Сонгох тест – 5
ü  Нөхөх тест – 3
ü  Тохируулах тест - 2
Сэдвийн хүрээнд хэрэглэгдэх англи үг хэллэг
§  Идентификатор - Чөлөөт нэр
§  Тайлбар – Сomment
§  Тогтмолууд - const

No comments:

Post a Comment