Си хэлний тухай ...

2013-01-08,
 5.5 СИ ПРОГРАММЫН БҮТЭЦ

    Си программын бүтцийг агуулгаар нь дараах 5 бүлэг хэсэгт хувааж үзнэ.

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

2.      Тогтмолуудыг зарлах хэсэг

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

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

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

 

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

    Программд стандарт функц процедур холбох шаардлага тулгардаг бөгөөд холболтыг #include түлхүүр үгийн тусламжтайгаар гүйцэтгэнэ. 

Бичигдэх хэлбэрт :    #include <Файлын нэр>  эсвэл

                                    #include “Файлын нэр”

 

Файлын нэр нь тухайн функцуудыг агуулах .h  өргөтгөлтэй файлын нэр  байна.  Эдгээр файлууд c: cinclude  санд байрлана.

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

 

·         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. Хувьсагчийг зарлах хэсэг

Программд хэрэглэгдэх глобаль хувьсагчдыг энд зарлана.

Бичих хэлбэр :    <Хувьсагчийн төрөл>  <Хувьсагчийн нэр>;

Жишээ :   int  i,j;

                  char c;

Глобаль хувьсагч

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

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

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

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

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

Функцын нэр(параметрүүд)

{ <Хувьсагчдыг зарлах хэсэг>    а    Локаль хувьсагч

   <Функцийн бие>

}

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

v  Зөвхөн тухайн функц дотроо хэрэглэгдэнэ.

v  Амьдрах хугацаа нь функцын ажиллах хугацаа юм.

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

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

main()

{ <Хувьсагч зарлах хэсэг>

   <Үндсэн программын хэсэг>

}


 

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

#include

#include

#define pr printf

const float pi=3.14;

 

int i,j,n;  

 

PrintPI()

{

    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       үед  (-) нь унар үйлдэл юм.

                        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

 

/ үйлдлээс өмнө унар - үйлдэл биелэгдэнэ.  Хэрэв үйлдлүүдийн зэрэглэл ижил бол чиглэлийнхээ дагуу бодогдоно.

 

Утга Олгох үйлдлүүд

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

 

Утга олгох үйлдэлийн бичигдэх хэлбэр :

 

<Хувьсагч>[<үйлдэл>]=<илэрхийлэл>;

 

<үйлдэл> нь:   +, -, *, /, %, <<, >>, &, ^, |  эсвэл  байхгүй байж болно.

 

Дараах жишээнд үндсэн үйлдлүүд нь утга олгох үйлдлээс өмнө биелэгдэх болно.

 

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;

 

Мөн хорогдуулагч (--) үйлдэл нь (++) үйлдэлтэй ижил зарчмаар ажиллана.  (++),(--) үйлдлүүд нь унар үйлдэл учир үндсэн 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  байна.

 

XOR үйлдэл нь 2 бит нь ялгаатай бол 1 , адил бол 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       */

 

~z= 00000001          y&~z=   00000010       x^(y&(~z))=  00000011

                    ~                       &  11111110                             ^ 00000010

        -------------               ---------------                       --------------

        11111110                          00000010                              00000001

 

буюу эцсийн үр дүн  00000001 = 1

 

Нөхцөлт илэрхийлэл  ( ? : )  үйлдэл

 

Энэ  үйлдэл нь илэрхийлэл дотор сонголтын механизмыг хэрэгжүүлдэг үйлдэл юм.

 


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

 

 

ШалгахИлэрхийлэл ?  Илэрхийлэл1 : Илэрхийлэл2

 

 

ШалгахИлэрхийлэл -ийн утга Үнэн байвал илэрхийлэл1, харин Худал байвал илэрхийлэл2  нь  энэ илэрхийллийн үр дүн буюу утга болдог.

 

Жишээ 1 :

 

z=(a>b) ? a : b;       /*      z=MAX(a,b)      */

 

Жишээ 2 :

 

x=3,  y=3,  z=1

z+=x

----------------------------

(z+зүрх өвдөхx>y) ? (x++) : (y++)))

(z+=(y++))

(z+=3)

(z=z+3)

( Үр дүн  x=3, y=4, z=4  )

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

7.1       Харьцуулах үйлдлүүд

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

 

Хүснэгт 7.1

Үйлдлүүд

Утга

==

Тэнцүү

!=

Тэнцүү биш

< 

Бага

> 

Их

<=

Бага буюу тэнцүү

>=

Их буюу тэнцүү

 

Дээрх харьцуулах үйлдлүүдийн хувьд үйлдлийн зэрэглэл нь 2 түвшинд хуваагдана.   <, >, <=, >=  нь дээд түвшний буюу өндөр зэрэглэлтэй үйлдлүүд юм.  Харин доод түвшний үйлдлүүд нь  ==, !=  болно.  Өөрөөр хэлбэл ==,!= үйлдлүүд нь бусад 4 өөсөө сүүлд бодогдоно.  Жишээ :   x=5;   y=2;    z=0;

 

a.       x>y+z                       /*   Үнэн гэсэн утгатай     */

b.      x+z<=y                    /*   Худал гэсэн утгатай     */

c.       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’             (Үнэн)

 

7.2              if команд

 

 

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

 


   if(Нөхцөлт илэрхийлэл) 

                         команд;

 

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

 

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())==’ ’) команд;

 

Дээрх жишээг тайлбарлая. Эхлээд getchar функц дуудагдан, үр дүн нь ch хувьсагчид олгогдоно. Дараа нь ch –ын утгыг ‘ ’-тэй тэнцүү эсэхийг шалгаж байна. Энд утга олгох илэрхийллийг заавал хаалтанд хийж өгөх хэрэгтэй. Учир нь  == үйлдэл нь = үйлдлээс өндөр зэрэглэлтэй учир түрүүлээд биелэгдчихнэ. Илэрхийллийг бичих ийм боломж нь Си хэлд байдаг дэвшилттэй талуудын нэг юм.  Ихэнх программчилалын хэлүүдэд дээрх жишээг дараах байдлаар бичдэг.

 

Гараас нэг тэмдэгт унших;

if (Тэмдэгт нь Enter товч бол) then команд;

 

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++;

      }

 

Энд бид давхар 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 хэрэглэхээс зайлсхийх өөр нэг арга нь логик  үйлдлийг хэрэглэж сурах явдал юм.  Си хэлэнд логик  && (БА) , || (БУЮУ) гэсэн холбоосууд байдаг.  Эдгээр логик үйлдлүүд нь харьцуулах үйлдлүүд болох   <,>- аас ч бага зэрэглэлтэй үйлдлүүд юм.  Харин  &&  үйлдэл нь   || -ээсээ  өндөр зэрэглэлтэй.  Харин зарим хэлэнд логик үйлдлүүд нь харьцуулах үйлдлээс өндөр зэрэглэлтэй байдаг бөгөөд энэ тохиолдолд хаалт хэрэглэдэг:   Жишээ нь :    Pascal  хэлэнд  ad  илэрхийлэл нь алдаатай илэрхийлэл болно.  Учир нь OR нь эхэлж биелэх бөгөөд үр дүнг нь  илэрхийлэлд  орлуулахад энэ илэрхийлэл алдаатай  илэрхийлэл болно.  Харин Си хэлд   ad  нь  зөв илэрхийлэл болно.

 

Логик (БА)  буюу && үйлдэл

Шалгагдаж байгаа нөхцөлүүд бүгд үнэн бол эцсийн үр дүн үнэн байна.  Үр дүн нь int  төрлийн утгатай ба  Үнэн=1, Худал=0 гэсэн тус тусын харгалзах утгатай байна.

 

Бичигдэх хэлбэр :  илэрхийлэл1  &&  илэрхийлэл2  . . .

 

Дээр бичиж байсан жишээгээ одоо  && үйлдэл ашиглан бичье.

 

if((ch=’  ‘)&&(өмнөх тэмдэгт нь үсэг)) num++;

else

  {  if((ch нь өгүүлбэрийн төгсгөл)&&( өмнөх тэмдэгт нь үсэг)) num++;

  }

Энэ жишээг үйлдлийн зэрэглэл ойлгосон хүн бол хаалтгүй бичнэ.

 

if(ch=’  ‘  &&  өмнөх тэмдэгт нь үсэг)

 

Гэхдээ харахад ойлгомжтой байх үүднээс хаалт хэрэглэхийг зарим хүн илүүд үздэг.

Жишээ 1 :

 

#include

 

int a=1,b=2;

char c=’k’;

 

main()

{

   if (a=1 && b=2 && c=’k’) 

       printf(“ Бүх шалгалтууд үнэн байна”);

  else

       printf(“Аль нэг нь, магадгүй бүгд худал байж ч болно.”);

}

Логик (БУЮУ)  буюу || үйлдэл

Шалгагдаж байгаа нөхцлүүдийн ядаж нэг  нөхцөл нь ҮНЭН бол үр дүн нь ҮНЭН байна.  Харин нөхцлүүд нь бүгд  ХУДАЛ тохиолдолд  л  үр дүн ХУДАЛ байна.

 

Бичигдэх хэлбэр :  илэрхийлэл1  | |  илэрхийлэл2  . . .

 

Жишээ нь :

 

#include

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

Үнэн

 

Худал

 

 

 

Худал

 

Үнэн

&&

БА

x&&y

Үнэн

Үнэн

Үнэн

 

 

 

Үнэн

Худал

Худал

 

 

 

Худал

Үнэн

Худал

 

 

 

Худал

Худал

Худал

||

БУЮУ

x||y

Үнэн

Үнэн

Үнэн

 

 

 

Үнэн

Худал

Үнэн

 

 

 

Худал

Үнэн

Үнэн

 

 

 

Худал

Худал

Худал

 

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

Тайлбар

Үйлдлүүд

Чиглэл

Хаалт

( )

Зүүнээс

Массивын элемент

[]

Зүүнээс

Бүтцийн элемент

->

Зүүнээс

Бүтцийн элемент

.

Зүүнээс

Нэмэгдүүлэх, хорогдуулах

++   --

Баруунаас

Бит “Үгүйсгэл” үйлдэл

~

Баруунаас

Логик “Үгүйсгэл” үйлдэл

!

Баруунаас

Хаяг авах үйлдэл

&

Баруунаас

Заагчийн утга үйлдэл

*

Баруунаас

Төрөл хувиргах үйлдэл

(Төрөл)

Баруунаас

Унар хасах үйлдэл

-

Баруунаас

Хэмжээ авах үйлдэл

sizeof

Баруунаас

Үржүүлэх үйлдэл

*

Зүүнээс

Хуваах үйлдэл

/

Зүүнээс

Үлдэгдэл олох үйлдэл

%

Зүүнээс

Нэмэх үйлдэл

+

Зүүнээс

Хасах үйлдэл

-

Зүүнээс

Зүүн тийш шилжүүлэх

<< 

Зүүнээс

Баруун тийш шилжүүлэх

>> 

Зүүнээс

Бага, бага буюу тэнцүү,их,их буюу тэнцүү

<, <= , > ,>=

Зүүнээс

Тэнцүү, тэнцүү биш

==  !=

Зүүнээс

Бит ‘БА’ үйлдэл

&

Зүүнээс

Бит ‘XOR’ үйлдэл

^

Зүүнээс

Бит ‘БУЮУ’ үйлдэл

|

Зүүнээс

Логик ‘БА’ үйлдэл

&&

Зүүнээс

Логик ‘БУЮУ’ үйлдэл

||

Зүүнээс

Нөхцөлт илэрхийлэл

?:

Баруунаас

Утга олгох үйлдлүүд

= += -= /= %= &= ^= |= <<= >>=

Баруунаас

Таслал үйлдэл

,

Зүүнээс

 

7.6       switch команд

Си хэлэнд тухайн нэг илэрхийлсэн утгаас шалтгаалж олон сонголт хийх шаардлагыг хэрэгжүүлдэг команд байдаг.

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

switch (Илэрхийлэл) {

                        case утга1 : Командууд; Командууд; . . . break;

                        case утга2 : Командууд; Командууд; . . . break;

                        . . .

                        default : Командууд; break;

            }

 

Энд Илэрхийллийн утгаас олон командуудын аль нь биелэгдэх нь шалтгаална.  Хэрэв илэрхийллийн утга нь утга1-тэй тэнцүү бол утга1-ын коммандууд биелэгдэнэ. Хэрэв утга2-той тэнцүү бол түүний командууд биелэгдэх гэх мэт …

 

Харин илэрхийллийн утга тухайн сонголтуудад байхгүй бол default түлхүүр үгийн дараах командууд биелэгдэнэ.  switch командыг тухайн хэрэглэх шаардлагаас хамаарч янз янзаар бичиж ашигладаг.  Үүнд :

v  break  командыг бичихгүй байж болно.

v  default сонголт байхгүй байж болно.

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

 

Гэхдээ дараах дүрмийг зайлшгүй баримтлах ёстой.

-                                                          илэрхийлэл нь int төрлийн утга буцаах ёстой.

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

-                                                          Сонголтын утгууд нь хоорондоо ялгаатай утга байх ёстой.

 

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

 

a=2;

switch (a) {

                        case 1 : printf(“ Утга 1 ”); break;

                        case 2 : printf(“ Утга 2 ”);

                        case 3 : printf(“ Утга 3 ”);

  break;

            }

Үр дүн нь :          Утга 2

                           Утга 3

 

Энд 2 гэсэн сонголтыг break –ээр төгсгөөгүй учир шууд дараачийн сонголт руу орж байна.  Олон утгаас шалтгаалах командыг биелүүлэхийн тулд switch-ийн зарим сонголтод break бичдэггүй.

   switch(x)

     {           case2 : case 4: case 6 : case 8:  printf(“ Тэгш тоо ”);   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’;

 Эдгээр 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 үсэг ”); break;

            case ‘b’ :  printf(“ b үсэг ”); break;

            case ‘c’ :  printf(“ c үсэг ”); break;

            }

 

СЭДЭВ 8.  ДАВТАЛТ

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

 

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

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

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

 

7.1       Тодорхой давталт буюу for давталт

Давтах давталтын тоо тодорхой бол энэ операторыг ашигладаг. Энэ давталтыг тоолуурт давталт ч гэж нэрлэдэг.

 

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

 

for([<ЭхлэхИлэрхийлэл>];[<ШалгахИлэрхийлэл>];[<АлхамИлэрхийлэл>])

     команд;

 

Энэ давталт нь <ШалгахИлэрхийлэл>-ийн утга худал болтол биелнэ.  Хэрэв <ЭхлэхИлэрхийлэл> нь <ШалгахИлэрхийлэл>-ийн утгаас хальсан тохиолдолд цикл ганц ч удаа  биелэхгүй. <АлхамИлэрхийлэл> нь давталтын  тоолуурын утга хэрхэн өөрчлөгдөхийг тодорхойлно.

 

 

 

 

 

 

 

 

 

 


                                            

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

 

Жишээн дээр тайлбарлавал илүү ойлгомжтой байх болно.

 

printf(“ Тоолж байна . . . ”);

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

 

Одоо дээрх программын хэсгийг тайлбарлая. Давталт нь ЭхлэхИлэрхийллээс эхлэх ба i-д утгыг 1 утгыг олгоно. ЭхлэхИлэрхийлэл нь давталтад  ердөө ганц удаа буюу хамгийн эхэнд биелэгдэнэ. Дараа нь Шалгах илэрхийлэл бодогдоно. Ингээд 1<=10 нь үнэн учир давталт цааш үргэлжилж, printf функц ажиллан дэлгэцэнд 1 гэж хэвлэнэ.  Дараа нь АлхамИлэрхийлэл бодогдон i–ын утга 2 болно.  Тэгээд  Шалгах Илэрхийлэл бодогдон i<=10 эсэхийг шалгах гэх мэтчилэн давталт үргэлжилнэ. Шалгах Илэрхийллийн утга худал болсон үед давталтаас гарна.

Дээрх жишээний үр дүн :

 

Тоолж байна . . .

1          2          3          4          5          6          7          8          9          10

 

Жишээ 2 :

 

for(i=10; i>0; i--)   printf(“%d ”,i);

 

Жишээ 3 :  Давталтын алхам нь  1- ээс ялгаатай байж болно.

 

for(i=1; i<18; i+=3)   printf(“%d ”,i);

 

Мөн for давталтыг хэдэн ч давхраар нь ашиглаж болно.

 

for(i=1, k=1; i<=3; i++) 

  {    for(j=1; j<=3; j++)  printf(“%d ”, k++);

        printf(“ ”);

  }

 

Жишээ 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

int i, sum=0;

main()

{   for(i=1; i<=10; i++)  sum+=i;

     printf(“ %d”, sum);

}

 

 

Зөвлөгөө :     

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

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

v  for давталтан дотор ;-аар илэрхийллүүд хоорондоо зааглагддагийг анхаар.

 

8.2       Нөхцөлт while давталт

Хамгийн хялбар төрлийн давталт нь while  давталт юм.

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

 

while (<илэрхийлэл>)

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

 

Илэрхийллийн утга үнэн л байвал давталт үргэлжилнэ. while –ын арын ( ) хаалтны ард  ;  тавьж болохгүй.  Хэрвээ тавьбал while командууд хэзээ ч биелэгдэхгүй.  while-ын нөхцөлт илэрхийлэл  анх удаагаа шалгагдахдаа буруу бол while-ын командууд ерөөсөө биелэгдэхгүй.

 

                                                                                ( i<10 )

 

                                                                                printf(. . . .)

 

Жишээ :

/*         Дэлгэц  цэвэрлэх           */

void cls(void)

{   int i=0;

     while(i<25)          /*       25 хоосон мөр хэвлэснээр дэлгэц цэвэрлэгдэнэ        */

       {    printf(“ ”);                 /*       Нэг хоосон мөр хэвлэх        */

             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 ашиглан хийдэг.  Нөхцөл нь  давталтын командууд биелэгдсэний дараа шалгагддаг.

Дараах программд 0 … 9 тоо ба тэдний нийлбэрийг хэвлэж байна.

main()

{ int count=0;

   int total=0;

   do {  total+=count;

            printf(“ тоо = %d ,  Нийлбэр = %d  ” , 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       Тасалдлын команд

Программ бичиж байх явцад циклээс ердийн бус аргаар (Давталтын нөхцөлөөс өөр аргаар ) гарах шаардлага тулгардаг.  Энэ зорилгыг хэрэгжүүлэх 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 командаар давхар давхар давталтаас гарахгүй, зөвхөн дотор талын давталтаас гарна.

 


for( . . .  )

      for( . . .  )  

           {      . . .

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

           }

      . . .  

 

 error :

              Хэрэглэгчид алдааны тухай мэдээлэл өгөх;

              Хийж байсан үйл ажиллагаагаа зогсоох;

 

goto  командаар удирдлага шилжүүлэхийн тулд  удирдлага шилжиж очих газар тэмдэг тавих шаардлагатай.  Тэмдэгийг нэрлэхдээ хувьсагч яаж нэрлэдэг шиг нэрлэдэг .

 

Тэмдэг тавих хэлбэр :      

 

  <Тэмдгийн нэр>  :

 

Удирдлага шилжүүлэхдээ :

 

  goto  <Тэмдгийн нэр>;

 

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

 

СЭДЭВ 9.  ФУНКЦ

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

 

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

Үндсэн хэлбэр:

 

<буцаах утгын төрөл> <ФункцНэр>(<Аргументийн жагсаалт>)

<Аргументуудын зарлалт>

{

   <Локаль хувьсагчдыг зарлах>;

    . . .

   <Функцын үндсэн бие буюу  Командууд >;

    . . .

    return (буцаах утга);

}

 

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

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

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

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

 

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

 


             Жишээ :

int Max(a,b)

int a,b;

{           int k;

                        k=(a>b) ? a : b;

                        printf(“ Max= %d”, k);

                        return k;

}

 

 Функц нь аргументгүй байж болно. Мөн заавал утга буцаах албагүй. Pascal хэлэнд утга буцаадаггүй функцыг процедур ч гэж нэрлэдэг.  Харин Си хэлд бол ялгаа байхгүй бүгд функц юм.

 

void notice()

{  printf(“ Та түр хүлээнэ үү , бодолт хийж байна . . . ”);

}

 

Хэдийгээр тухайн функц ямар ч аргументгүй ч байсан түүнийг тодорхойлохдоо нэрийнх нь ард () хос хаалтыг заавал бичдэг.  Мөн дээрх функц нь утга буцаахгүй учраас  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 үйлдэл гүйцэтгэгдэхэд удирдлага тухайн функцээс гарна.  Өөрөөр хэлбэл нэг блокт түүний ард бичигдсэн үйлдлүүд биелэгдэхгүй.

 

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);

 

Харин  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);           }

Сэтгэгдэл бичих
Сэтгэгдлүүд:

bayarlalaa
бичсэн Зочин цаг: 11:46, 2021-04-28 | Холбоос | |



:-)
 
xaax