Лекц №13
Сэдэв: Бүтэц, нэгдэл, тоочих төрөл
Бүтэц
Бүтэц
Бүтэц (Structure) гэдэг нь олон хувьсагчуудын цуглуулга юм.
Бүтцэд байгаа хувьсагчууд өөр өөр төрлийнх байж болно. Нэг нь
бүхэл тоо байхад нөгөө нь тэмдэгт мөр байх жишээтэй. Бүтэц дотор
байгаа эдгээр хувьсагчуудыг бүтцийн талбар гэж нэрлэнэ.
Бүтцийн элементүүд нь ижил эсвэл өөр хэлбэртэй байж болно.
Гэхдээ бүтэц дэх бүх элементүүд логик холбоотой байх ёстой.
Тайлбар
Бүтэц
Бүтцийг хэрхэн бий болгох вэ?
“struct” түлхүүр үгийг бүтцийг бий болгоход ашигладаг.
Бичигдэх хэлбэр:
struct бүтцийн_нэр
{
Төрлийн_нэр Гишүүд1
Төрлийн_нэр Гишүүд1
Төрлийн_нэр Гишүүд1
};
Бүтэц
Жишээлбэл:
struct address
{
char name[50];
char street[100];
char city[50];
char state[20];
int pin;
};
Бүтцийн түлхүүр үг Бүтцийн нэр
Бүтцийн
талбарын
гишүүд
Бүтэц
Бүтцийн хувьсагчдыг хэрхэн зарлах вэ?
struct Point
{
int x, y;
} p1; // p1 хувьсагч нь 'Point‘ хувьсагч юм
// Үндсэн өгөгдлийн төрлийг хувьсагч шиг зарлаж байна
struct Point
{
int x, y;
};
int main()
{
struct Point p1; // p1 хувьсагчийг энгийн хувьсагч шиг зарлаж байна
}
Бүтэц
Бүтцийн гишүүдийг хэрхэн эхлүүлэх вэ?
Бүтцийн гишүүдийг зарлаж байх явцад анхны утгыг шууд өгөх боломжгүй.
Жишээлбэл: Дараах C программын эх кодыг харуулав.
struct Point
{
int x = 0; //Хөрвүүлэгчийн алдаа: гишүүн анхны утга авч чадахгүй
int y = 0; //COMPILER ERROR: cannot initialize members here
};
Дээрх алдааны шалтгаан нь энгийн бөгөөд өгөгдлийн төрлийг зарлахад санах
ой хуваарилагдахгүй болно. Санах ойг зөвхөн хувьсагч үүсгэх үед хуваарилдаг.
Бүтэц
Бүтцийн гишүүдийг '{}' буржгар буюу гоё хаалт ашиглан эхлүүлэх
боломжтой. Жишээлбэл:
struct Point
{
int x, y;
};
int main()
{
// x хувьсагчид 0 утга, y хувьсагчид 1 утга олгож буй үйлдэл
struct Point p1 = {0, 1};
}
Бүтэц
Бүтцийн элементүүдэд хэрхэн хандах вэ?
Бүтцийн гишүүдэд цэг (.) Оператор ашиглан хандаж болно
Жишээ №1: Энгийн бүтэц
1. #include<stdio.h>
2. struct Point
3. {
4. int x, y;
5. };
6. int main() {
7. struct Point p1 = {0, 1};
8. // P1 заагч гишүүнд хандах
9. p1.x = 20;
10. printf ("x = %d, y = %d", p1.x, p1.y);
11. return 0; }
Үр дүн:
x = 20, y = 1
Бүтэц
Массив бүтэц гэж юу вэ?
Жишээ №2: Массивтай бүтэц
1. #include<stdio.h>
2. struct Point
3. {
4. int x, y;
5. };
6. int main() {
7. // Массив бүхий заагчийг зарлаж байна
8. struct Point arr[10];
9. // Массивд хандаж байна
10.arr[0].x = 10;
11.arr[0].y = 20;
12.printf("%d %d", arr[0].x, arr[0].y);
13.return 0; }
Үр дүн:
10 20
Бүтэц
Бүтцийн заагч гэж юу вэ?
Бүтцийн заагчийг хэрхэн яаж үүсгэхийг энд харуулав.
struct name {
member1;
member2;
.
.
};
int main()
{
struct name *ptr, Harry;
}
Үүнд: struct заагч нь ptr
Бүтэц
Бүтцийн заагч гэж юу вэ?
Бүтцийн заагч нь гишүүд рүү сум (->) оператор ашиглан хандах боломжтой.
Жишээ №3: Заагчтай бүтэц
1. #include<stdio.h>
2. struct Point
3. {
4. int x, y;
5. };
6.
7. int main() {
8. struct Point p1 = {1, 2};
9. // p2 нь p1 бүтцийн заагч юм
10. struct Point *p2 = &p1;
11. // Бүтцийн заагчийг ашиглан бүтцийн гишүүдэд хандах
12. printf("%d %d", p2->x, p2->y);
13. return 0; }
Үр дүн:
1 2
Бүтэц
Жишээ №4: Хэрэглэгчийн нас өндрийг бүтэц бүхий заагчаар
дамжуулж хэвлэх
1. #include <stdio.h>
2. struct person {
3. int age;
4. float weight;
5. };
6. int main()
7. {
8. struct person *personPtr, person1;
9. personPtr = &person1;
10. printf("Enter age: ");
11. scanf("%d", &personPtr->age);
12. printf("Enter weight: ");
13. scanf("%f", &personPtr->weight);
14. printf("Displaying:n");
15. printf("Age: %dn", personPtr->age);
16. printf("weight: %f", personPtr->weight);
17. return 0;
18. }
Үр дүн:
Enter age: 25
Enter weight: 178
Displaying:
Age: 25
weight: 178.000000
Бүтэц
C бүтцийн хязгаарлалт
C хэл дээр бүтэц нь төрөл бүрийн өгөгдлүүдийг нэгтгэж ашиглах боломжтой.
Бүтэц бол логикын үйлдлүүд бүхий өгөгдлүүдийг зохицуулдаг туслах
хэрэгсэл юм. Гэхдээ С бүтэц нь зарим хязгаарлалттай байдаг. Үүнд:
• C бүтэц нь бүтцийн өгөгдлийн төрлийг суулгасан өгөгдлийн төрлүүд шиг
харьцахыг зөвшөөрдөггүй.
• Бүтцийн хувьсагч дээр +, - гэх мэт операторуудыг ашиглах боломжгүй.
Жишээлбэл, дараах кодыг анхаарч үзээрэй.
Бүтэц
struct number
{
float x;
};
int main(){
struct number n1,n2,n3;
n1.x=4;
n2.x=3;
n3=n1+n2;
return 0;}
Үр дүн:
prog.c: In function 'main':
prog.c:10:7: error:
invalid operands to binary + (have 'struct number' and 'struct number')
n3=n1+n2;
*/
Бүтэц
Жишээ №5:
1. #include <stdio.h>
2. struct StudentData
3. {
4. char *stu_name;
5. int stu_id; int stu_age;
6. };
7. int main() {
8. struct StudentData student;
9. student.stu_name = "Steve";
10.student.stu_id = 1234;
11.student.stu_age = 30;
12.printf("Student Name is: %s", student.stu_name);
13.printf("nStudent Id is: %d", student.stu_id);
14.printf("nStudent Age is: %d", student.stu_age);
15.return 0; }
Үр дүн:
Student Name is: Steve
Student Id is: 1234
Student Age is: 30
Бүтэц
Жишээ №6: Функцээс бүтцийг хэрхэн буцааж өгөхийг энд харуулав.
1. #include <stdio.h>
2. struct student
3. {
4. char name[50];
5. int age; };
6. // function prototype
7. struct student getInformation();
8. int main() {
9. struct student s;
10. s = getInformation();
11. printf("nDisplaying informationn");
12. printf("Name: %s", s.name);
13. printf("nRoll: %d", s.age);
14. return 0;
15.}
Үр дүн:
Enter name: Tumur
Enter age: 45
Displaying information
Name: Tumur
Roll: 45
16. struct student getInformation() {
17. struct student s1;
18. printf("Enter name: ");
19. scanf ("%[^n]%*c", s1.name);
20. printf("Enter age: "); scanf("%d", &s1.age);
21. return s1; }
Бүтэц
Typedefs
Typedefs нь өөр нэртэй төрлийг тодорхойлох боломжийг олгодог бөгөөд энэ
нь бүтэц, заагчтай харьцахад тохиромжтой байдаг. Энэ тохиолдолд цэг
ашиглахгүй байж болно. Жишээлбэл:
typedef struct
{
int x;
int y;
} point;
Хэрэв point бүтцэд p удамшуулах бол point p; бичнэ.
Бүтэц
Жишээлбэл: Тээврийн хэрэгслийн бүтцийг дараах байдлаар
тодорхойлж болно.
typedef struct
{
char * brand;
int model; }
brand нь char заагч тул тээврийн хэрэгслийн төрөл нь мөр агуулж болно (энэ
тохиолдолд тухайн тээврийн хэрэгслийн брэндийг заана).
vehicle mycar;
mycar.brand = "Ford";
mycar.model = 2007;
Бүтэц
Жишээ №7: feet болон inch өгөгдсөн хоёр цэгийн зайг олох
#include <stdio.h>
1. struct Distance {
2. int feet;
3. float inch;
4. } dist1, dist2, sum;
5. int main() {
6. printf("1st distancen");
7. printf("Enter feet: ");
8. scanf("%d", &dist1.feet);
9. printf("Enter inch: ");
10. scanf("%f", &dist1.inch);
11. printf("2nd distancen");
12. printf("Enter feet: ");
13. scanf("%d", &dist2.feet);
14. printf("Enter inch: ");
Үр дүн:
Student Name is: Steve
Student Id is: 1234
Student Age is: 30
Бүтэц
16. scanf("%f", &dist2.inch);
17. // adding feet
18. sum.feet = dist1.feet + dist2.feet;
19. // adding inches
20. sum.inch = dist1.inch + dist2.inch;
21. // changing to feet if inch is greater than 12
22. while (sum.inch >= 12)
23. {
24. +sum.feet;
25. sum.inch = sum.inch - 12;
26. }
27. printf("Sum of distances = %d'-%.1f"", sum.feet, sum.inch);
28. return 0;
29. }
Үр дүн:
1st distance Enter feet: 12
Enter inch: 7.9 2nd distance
Enter feet: 2 Enter inch: 9.8
Sum of distances = 15'-5.7"
Бүтэц
Жишээ №7-д үзүүлсэн кодыг доорх хэлбэрээр typedef түлхүүр үг
ашиглан бичих боломжтой.
struct Distance{
int feet; float inch;
};
int main()
{
struct Distance d1, d2;
}
typedef struct Distance{
int feet; float inch;
} distances;
int main()
{
distances d1, d2;
}
Бүтэц
Жишээ №8: Эхлэх цаг, дуусах цагыг гараас оруулж тооцоолох
1. #include <stdio.h>
2. struct TIME {
3. int seconds;
4. int minutes;
5. int hours; };
6. void differenceBetweenTimePeriod(struct TIME t1,
struct TIME t2, struct TIME *diff);
7. int main() {
8. struct TIME startTime, stopTime, diff;
9. printf("Enter the start time. n");
10. printf("Enter hours, minutes and seconds: ");
11. scanf("%d %d %d", &startTime.hours,
&startTime.minutes, &startTime.seconds);
12. printf("Enter the stop time. n");
13. printf("Enter hours, minutes and seconds: ");
14. scanf("%d %d %d", &stopTime.hours,
&stopTime.minutes, &stopTime.seconds);
Бүтэц
Жишээ №8: Эхлэх цаг, дуусах цагыг гараас оруулж тооцоолох
15. // Эхлэх ба зогсоох цаг хугацааны ялгаа
16. differenceBetweenTimePeriod(startTime, stopTime, &diff);
17. printf("nTime Difference: %d:%d:%d - ", startTime.hours,
startTime.minutes, startTime.seconds);
18. printf("%d:%d:%d ", stopTime.hours, stopTime.minutes, stopTime.seconds);
19. printf("= %d:%d:%dn", diff.hours, diff.minutes, diff.seconds);
20. return 0; }
21. // Эхлэх ба зогсоох цаг хугацааны зөрүүг тооцоолох
22. void differenceBetweenTimePeriod(struct TIME start,
struct TIME stop, struct TIME *diff) {
23. while (stop.seconds > start.seconds) {
24. --start.minutes; start.seconds += 60; }
25. diff->seconds = start.seconds - stop.seconds;
26. while (stop.minutes > start.minutes) {
27. --start.hours; start.minutes += 60; }
28. diff->minutes = start.minutes - stop.minutes;
29. diff->hours = start.hours - stop.hours;
30. }
Бүтэц
Үр дүн:
Enter the start time.
Enter hours, minutes and seconds: 13
34
55
Enter the stop time.
Enter hours, minutes and seconds: 8
12
15
Time Difference: 13:34:55 - 8:12:15 = 5:22:40
Нэгдэл
Нэгдэл
Structures-ийн нэгэн адил нэгдэл нь хэрэглэгчийн тодорхойлсон
өгөгдлийн төрөл юм. Нэгдэлд бүх гишүүд ижил санах ойн
байршилтай байдаг.
Нэгдэл
Нэгдлийг хэрхэн бий болгох вэ?
“union” түлхүүр үгийг ашиглан нэгдлийг бий болгодог.
Бичигдэх хэлбэр: Жишээлбэл:
union нэгдлийн_нэр
{
Төрлийн_нэр Гишүүд1
Төрлийн_нэр Гишүүд2
Төрлийн_нэр Гишүүд3
};
union car
{
char name[50];
int price;
};
Нэгдэл
Нэгдлийн хувьсагчуудыг бий болгох
Нэгдлийг тодорхойлсон тохиолдолд хэрэглэгчийн тодорхойлсон төрлийг
үүсгэдэг. Гэсэн хэдий ч санах ой хуваарилагдаагүй болно. Тухайн нэгдлийн
төрөлд санах ой хуваарилах, түүнтэй ажиллахын тулд хувьсагч үүсгэх
хэрэгтэй. Бид нэгдлийн хувьсагчуудыг хэрхэн яаж үүсгэдэгийг энд харуулав.
union car {
char name[50];
int price;
};
int main()
{
union car car1, car2, *car3;
return 0;
}
Нэгдлийн удамшуулж авсан хувьсагчдыг
бий болгох өөр нэг арга:
union car {
char name[50];
int price;
} car1, car2, *car3;
Нэгдэл
Жишээ №9: Бүтэц нэгдэл хоёрын ялгаа
1. #include <stdio.h>
2. union unionJob{
3. char name[32];
4. float salary;
5. int workerNo;
6. } uJob;
7. struct structJob {
8. char name[32];
9. float salary;
10. int workerNo;
11. } sJob;
12. int main() {
13. printf("size of union = %d bytes",
14. sizeof(uJob));
15. printf("nsize of structure = %d bytes", sizeof(sJob));
16. return 0; }
Үр дүн:
size of union = 32 bytes
size of structure = 40 bytes
Нэгдэл ба бүтцийн хувьсагчдын хэмжээ яагаад ийм
ялгаатай байна вэ?
sJob-ийн хэмжээ нь 40 байт байна
• name[32] хэмжээ 32 байт байна
• salary хэмжээ 4 байт
• workNo хэмжээ 4 байт
Гэхдээ uJob-ийн хэмжээ 32 байт байна. Энэ нь нэгдлийн
хувьсагчийн хэмжээ үргэлж түүний хамгийн том
элементийн хэмжээ байх болно. Энэхүү жишээнд түүний
хамгийн том элементийн хэмжээ (name[32]) 32 байт байна.
Нэгдэл
Жишээ №10: Нэгдлийн гишүүдэд хандах
1. #include <stdio.h>
2. union Job {
3. float salary;
4. int workerNo;
5. } j;
6. int main() {
7. j.salary = 12.3;
8. // j.workerNo-д утга өгөөгүй үед,
9. // j.salary цаашид 12.3-ыг утга авахаа болино
10.j.workerNo = 100;
11.printf("Salary = %.1fn", j.salary);
12.printf("Number of workers = %d", j.workerNo);
13.return 0; }
Үр дүн:
Salary = 0.0
Number of workers = 100
Нэгдэл
Жишээ №11: С програм дээр x ба y хоёулаа ижил байршилтай байдаг.
Хэрэв бид x-ийг өөрчилбөл y-д тусгагдсан өөрчлөлтүүдийг харж болно.
1. // Нэгдлийг зарлахдаа бүтэцтэй ижилхэн зарлана
2. union test {
3. int x, y;
4. };
5.
6. int main()
7. {
8. // Нэгдлийн хувьсагч t
9. union test t;
10. t.x = 2; // t.y мөн 2 утга олгож байна.
11. printf("After making x = 2:n x = %d, y = %dnn", t.x, t.y);
12. t.y = 10; // t.x утгыг 10 болгон өөрчилж байна.
13. printf("After making y = 10:n x = %d, y = %dnn", t.x, t.y);
14. return 0;
15.}
Үр дүн:
After making x = 2:
x = 2, y = 2
After making y = 10:
x = 10, y = 10
Нэгдэл
Нэгдлийн хэмжээг хөрвүүлэгч хэрхэн шийддэг вэ?
Нэгдлийн хэмжээг нэгдлийн хамгийн том гишүүний хэмжээгээр авна.
Жишээ №12: Нэгдлийн гишүүдийн хэмжээ
1. #include <stdio.h>
2. union test1 {
3. int x;
4. int y;
5. } Test1;
6. union test2 {
7. int x;
8. char y;
9. } Test2;
10.union test3 {
11. int arr[10];
12. char y;
13.} Test3;
Үр дүн:
sizeof(test1) = 4, sizeof(test2) = 4, sizeof(test3) = 40
14. int main()
15. {
16. printf("sizeof(test1) = %lu, sizeof(test2) = %lu, "
"sizeof(test3) = %lu",
sizeof(Test1), sizeof(Test2), sizeof(Test3));
17. return 0; }
Нэгдэл
Нэгдлийн заагч?
Бүтцийн нэгэн адил нэгдэл рүү чиглүүлэгч сум оператор (->) ашиглан
гишүүдэд хандах боломжтой.
Жишээ №13: Заагч бүхий нэгдэл
1. #include <stdio.h>
2. union test {
3. int x;
4. char y;
5. };
6. int main() {
7. union test p1;
8. p1.x = 65;
9. // р2 нь p1-ийг нэгдлийн заагч юм
10. union test* p2 = &p1;
11. // Заагч ашиглан нэгдлийн гишүүд рүү хандах
12. printf("%d %c", p2->x, p2->y);
13. return 0; }
Үр дүн:
65 A
Тоочих төрөл
Тоочих төрөл
С програмчлалын хувьд тоочих төрөл (үүнийг enum гэж нэрлэдэг)
нь интеграл тогтмолуудаас бүрдэх өгөгдлийн төрөл юм.
Тоочих төрлийг хэрхэн бий болгох вэ?
“enum” түлхүүр үгийг ашиглан тоочих төрлийг бий болгодог.
Бичигдэх хэлбэр: Жишээлбэл:
enum flag {const1, const2, ..., constN};
enum suit {
club = 0,
diamonds = 10,
hearts = 20,
spades = 3,
};
Тоочих төрөл
Тоочих төрлийг зарлах
Энд enum төрлийн хувьсагчийг хэрхэн үүсгэхийг харуулав.
enum boolean {false, true};
enum boolean check; // enum хувьсагчийг зарлах
Энд enum boolean төрлийн check хувьсагчийн үүсгэсэн болно.
Та мөн ийм байдлаар enum хувьсагчдыг зарлаж болно.
enum boolean {false, true} check;
Энд false утга 0, true утга 1-тэй тэнцүү байна.
Нэгдэл
Жишээ №14: Тоочих төрөл
1. #include <stdio.h>
2. enum week {Sunday, Monday, Tuesday, Wednesday, Thursday,
Friday, Saturday};
3. int main()
4. {
5. // үүсгэсэн today хувьсагч нь enum week нэг төрөл юм
6. enum week today;
7. today = Wednesday;
8. printf("Day %d",today+1);
9. return 0;
10.}
Үр дүн:
Day 4
Тоочих төрөл
Яагаад enums ашигладаг вэ?
Enum хувьсагч нь зөвхөн нэг утга авах боломжтой.
Жишээ №15: Тоочих төрөл
1. #include <stdio.h>
2. enum suit {
3. club = 0,
diamonds = 10,
hearts = 20,
spades = 3
} card;
4. int main() {
5. card = club;
6. printf("Size of enum variable = %d bytes", sizeof(card));
7. return 0;
8. }
Үр дүн:
Size of enum variable = 4 bytes
Int-ийн хэмжээ 4 байт тул 4-ийг авч байна.
Энэ нь enum-ийг flag ажиллахад тохиромжтой
сонголт болгодог.
Тоочих төрөл
Хэрхэн тоочих төрөлд flag ажиллах вэ?
Жишээлбэл:
enum designFlags {
ITALICS = 1,
BOLD = 2,
UNDERLINE = 4
} button;
Та Windows програмын товчлуурыг зохиож байгаа гэж бодъё. Тексттэй
ажиллахын тулд ITALICS, BOLD, UNDERLINE flag тохируулж болно.
Бүх салшгүй тогтмолууд нь дээр дурдсан псевдокод 2-ийн тооллоор
илэрхийлэх шалтгаан байдаг.
ITALICS = 00000001
BOLD = 00000010
UNDERLINE = 00000100
Тоочих төрөл
Enum-ийг эхлэлийн утгын тухай сонирхолтой баримтууд.
1. Enum-ийн хоёр нэр ижил утгатай байж болно. Жишээлбэл, дараах C
програм дээр ‘Failed’ ба ‘Freezed’ хоёулаа ижил 0 утгатай байна.
Жишээ №16: Ижил утгатай тоочих төрөл
1. #include <stdio.h>
2. enum State {Working = 1, Failed = 0, Freezed = 0};
3. int main()
4. {
5. printf("%d, %d, %d", Working, Failed, Freezed);
6. return 0;
7. }
Үр дүн:
1, 0, 0
Тоочих төрөл
2. Хэрэв бид тоочих төрлийн хувьсагчид утгыг тодорхой зааж өгөөгүй бол
хөрвүүлэгч нь анхнаасаа 0-ээс эхэлсэн утгыг өгдөг.
Жишээ №17: Ням гараг 0, Даваа гараг 1-г авна гэх мэт.
1. #include <stdio.h>
2. enum day {sunday, monday, tuesday, wednesday, thursday, friday, saturday};
3. int main()
4. {
5. enum day d = thursday;
6. printf("The day number stored in d is %d", d);
7. return 0;
8. }
Үр дүн:
The day number stored in d is 4
Тоочих төрөл
3. Ямар ч дарааллаар ямар нэгэн нэрэнд утга өгч болно. Бүх
хуваарилагдаагүй нэрс нь өмнөх нэрний утгыг нэмж нэг утга авна.
Жишээ №18: Тогтсон дараалагүй утга олгох.
1. #include <stdio.h>
2. enum day {sunday = 1, monday, tuesday = 5,
wednesday, thursday = 10, friday, saturday};
3. int main()
4. {
5. printf("%d %d %d %d %d %d %d", sunday, monday, tuesday,
wednesday, thursday, friday, saturday);
6. return 0;
7. } Үр дүн:
1 2 5 6 10 11 12
Тоочих төрөл
4. Enum нэрүүдэд өгсөн утга нь бүхэл тогтмол байх ёстой, өөрөөр хэлбэл
утга нь хамгийн бага бүхэл тооноос хамгийн их бүхэл тоон утга хүртэлх
хязгаарт байх ёстой.
5. Бүх enum тогтмолууд хамрах хүрээгээрээ өвөрмөц байх ёстой.
Жишээ №19: Алдаатай программыг хөрвүүлэх.
1. #include <stdio.h>
2. enum state {working, failed};
3. enum result {failed, passed};
4. int main() { return 0; }
Compile Error: 'failed' has a previous declaration as 'state failed'
Тоочих төрөл
Жишээл №20: bitwise OR | оператор ашиглах
#include <stdio.h>
enum designFlags {
BOLD = 1,
ITALICS = 2,
UNDERLINE = 4 };
int main() {
int myDesign = BOLD | UNDERLINE;
// 00000001
// | 00000100
// ___________
// 00000101
printf("%d", myDesign);
return 0;
}
Үр дүн:
5
Тоочих төрөл
Жишээл №21: 7 хоногын өдөр хэвлэх
Зарлах
Утга олгох
Оператор
Түлхүүр
үг
enum
хувьсагч
төлөв=0 төлөв=1 төлөв=6
Тоочих төрлүүд
(Тогтмолуудыг таслалаар тусгаарлаж бичнэ)
days of week тоочих төрлийн
объектууд
wed=2 төлөв
Тоочих төрөл
Жишээл №21: 7 хоногын өдөр хэвлэх
1. #include<stdio.h>
2. enum week{Mon, Tue, Wed, Thur, Fri, Sat, Sun};
3. int main()
4. {
5. enum week day;
6. day = Wed;
7. printf("%d",day);
8. return 0;
9. }
Үр дүн:
2
Тоочих төрөл
Жишээл №22: Жилийн сарууд хэвлэх
1. #include<stdio.h>
2. enum year{Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};
3. int main()
4. {
5. int i;
6. for (i=Jan; i<=Dec; i++)
7. printf("%d ", i);
8. return 0;
9. }
Энэ жишээнд for давталт нь i = 0-ээс i = 11 хүртэл ажиллана, учир нь эхлээд
i-ийн утга Jan бөгөөд 0, Dec-ийн утга 11 байна.
Үр дүн:
0 1 2 3 4 5 6 7 8 9 10 11
Тоочих төрөл
Жишээл №23: Тоочих төрлийн дэд функцыг тоочих төрөлтэй
харьцуулах
1. #include <stdio.h>
2. enum State {WORKING = 0, FAILED, FREEZED};
3. enum State currState = 2;
4. enum State FindState() {
5. return currState;
6. }
7. int main() {
8. (FindState() == WORKING)? printf("WORKING"): printf("NOT WORKING");
9. return 0;
10.}
Үр дүн:
NOT WORKING

Лекц №13

  • 1.
    Лекц №13 Сэдэв: Бүтэц,нэгдэл, тоочих төрөл
  • 2.
  • 3.
    Бүтэц Бүтэц (Structure) гэдэгнь олон хувьсагчуудын цуглуулга юм. Бүтцэд байгаа хувьсагчууд өөр өөр төрлийнх байж болно. Нэг нь бүхэл тоо байхад нөгөө нь тэмдэгт мөр байх жишээтэй. Бүтэц дотор байгаа эдгээр хувьсагчуудыг бүтцийн талбар гэж нэрлэнэ. Бүтцийн элементүүд нь ижил эсвэл өөр хэлбэртэй байж болно. Гэхдээ бүтэц дэх бүх элементүүд логик холбоотой байх ёстой. Тайлбар
  • 4.
    Бүтэц Бүтцийг хэрхэн бийболгох вэ? “struct” түлхүүр үгийг бүтцийг бий болгоход ашигладаг. Бичигдэх хэлбэр: struct бүтцийн_нэр { Төрлийн_нэр Гишүүд1 Төрлийн_нэр Гишүүд1 Төрлийн_нэр Гишүүд1 };
  • 5.
    Бүтэц Жишээлбэл: struct address { char name[50]; charstreet[100]; char city[50]; char state[20]; int pin; }; Бүтцийн түлхүүр үг Бүтцийн нэр Бүтцийн талбарын гишүүд
  • 6.
    Бүтэц Бүтцийн хувьсагчдыг хэрхэнзарлах вэ? struct Point { int x, y; } p1; // p1 хувьсагч нь 'Point‘ хувьсагч юм // Үндсэн өгөгдлийн төрлийг хувьсагч шиг зарлаж байна struct Point { int x, y; }; int main() { struct Point p1; // p1 хувьсагчийг энгийн хувьсагч шиг зарлаж байна }
  • 7.
    Бүтэц Бүтцийн гишүүдийг хэрхэнэхлүүлэх вэ? Бүтцийн гишүүдийг зарлаж байх явцад анхны утгыг шууд өгөх боломжгүй. Жишээлбэл: Дараах C программын эх кодыг харуулав. struct Point { int x = 0; //Хөрвүүлэгчийн алдаа: гишүүн анхны утга авч чадахгүй int y = 0; //COMPILER ERROR: cannot initialize members here }; Дээрх алдааны шалтгаан нь энгийн бөгөөд өгөгдлийн төрлийг зарлахад санах ой хуваарилагдахгүй болно. Санах ойг зөвхөн хувьсагч үүсгэх үед хуваарилдаг.
  • 8.
    Бүтэц Бүтцийн гишүүдийг '{}'буржгар буюу гоё хаалт ашиглан эхлүүлэх боломжтой. Жишээлбэл: struct Point { int x, y; }; int main() { // x хувьсагчид 0 утга, y хувьсагчид 1 утга олгож буй үйлдэл struct Point p1 = {0, 1}; }
  • 9.
    Бүтэц Бүтцийн элементүүдэд хэрхэнхандах вэ? Бүтцийн гишүүдэд цэг (.) Оператор ашиглан хандаж болно Жишээ №1: Энгийн бүтэц 1. #include<stdio.h> 2. struct Point 3. { 4. int x, y; 5. }; 6. int main() { 7. struct Point p1 = {0, 1}; 8. // P1 заагч гишүүнд хандах 9. p1.x = 20; 10. printf ("x = %d, y = %d", p1.x, p1.y); 11. return 0; } Үр дүн: x = 20, y = 1
  • 10.
    Бүтэц Массив бүтэц гэжюу вэ? Жишээ №2: Массивтай бүтэц 1. #include<stdio.h> 2. struct Point 3. { 4. int x, y; 5. }; 6. int main() { 7. // Массив бүхий заагчийг зарлаж байна 8. struct Point arr[10]; 9. // Массивд хандаж байна 10.arr[0].x = 10; 11.arr[0].y = 20; 12.printf("%d %d", arr[0].x, arr[0].y); 13.return 0; } Үр дүн: 10 20
  • 11.
    Бүтэц Бүтцийн заагч гэжюу вэ? Бүтцийн заагчийг хэрхэн яаж үүсгэхийг энд харуулав. struct name { member1; member2; . . }; int main() { struct name *ptr, Harry; } Үүнд: struct заагч нь ptr
  • 12.
    Бүтэц Бүтцийн заагч гэжюу вэ? Бүтцийн заагч нь гишүүд рүү сум (->) оператор ашиглан хандах боломжтой. Жишээ №3: Заагчтай бүтэц 1. #include<stdio.h> 2. struct Point 3. { 4. int x, y; 5. }; 6. 7. int main() { 8. struct Point p1 = {1, 2}; 9. // p2 нь p1 бүтцийн заагч юм 10. struct Point *p2 = &p1; 11. // Бүтцийн заагчийг ашиглан бүтцийн гишүүдэд хандах 12. printf("%d %d", p2->x, p2->y); 13. return 0; } Үр дүн: 1 2
  • 13.
    Бүтэц Жишээ №4: Хэрэглэгчийннас өндрийг бүтэц бүхий заагчаар дамжуулж хэвлэх 1. #include <stdio.h> 2. struct person { 3. int age; 4. float weight; 5. }; 6. int main() 7. { 8. struct person *personPtr, person1; 9. personPtr = &person1; 10. printf("Enter age: "); 11. scanf("%d", &personPtr->age); 12. printf("Enter weight: "); 13. scanf("%f", &personPtr->weight); 14. printf("Displaying:n"); 15. printf("Age: %dn", personPtr->age); 16. printf("weight: %f", personPtr->weight); 17. return 0; 18. } Үр дүн: Enter age: 25 Enter weight: 178 Displaying: Age: 25 weight: 178.000000
  • 14.
    Бүтэц C бүтцийн хязгаарлалт Cхэл дээр бүтэц нь төрөл бүрийн өгөгдлүүдийг нэгтгэж ашиглах боломжтой. Бүтэц бол логикын үйлдлүүд бүхий өгөгдлүүдийг зохицуулдаг туслах хэрэгсэл юм. Гэхдээ С бүтэц нь зарим хязгаарлалттай байдаг. Үүнд: • C бүтэц нь бүтцийн өгөгдлийн төрлийг суулгасан өгөгдлийн төрлүүд шиг харьцахыг зөвшөөрдөггүй. • Бүтцийн хувьсагч дээр +, - гэх мэт операторуудыг ашиглах боломжгүй. Жишээлбэл, дараах кодыг анхаарч үзээрэй.
  • 15.
    Бүтэц struct number { float x; }; intmain(){ struct number n1,n2,n3; n1.x=4; n2.x=3; n3=n1+n2; return 0;} Үр дүн: prog.c: In function 'main': prog.c:10:7: error: invalid operands to binary + (have 'struct number' and 'struct number') n3=n1+n2; */
  • 16.
    Бүтэц Жишээ №5: 1. #include<stdio.h> 2. struct StudentData 3. { 4. char *stu_name; 5. int stu_id; int stu_age; 6. }; 7. int main() { 8. struct StudentData student; 9. student.stu_name = "Steve"; 10.student.stu_id = 1234; 11.student.stu_age = 30; 12.printf("Student Name is: %s", student.stu_name); 13.printf("nStudent Id is: %d", student.stu_id); 14.printf("nStudent Age is: %d", student.stu_age); 15.return 0; } Үр дүн: Student Name is: Steve Student Id is: 1234 Student Age is: 30
  • 17.
    Бүтэц Жишээ №6: Функцээсбүтцийг хэрхэн буцааж өгөхийг энд харуулав. 1. #include <stdio.h> 2. struct student 3. { 4. char name[50]; 5. int age; }; 6. // function prototype 7. struct student getInformation(); 8. int main() { 9. struct student s; 10. s = getInformation(); 11. printf("nDisplaying informationn"); 12. printf("Name: %s", s.name); 13. printf("nRoll: %d", s.age); 14. return 0; 15.} Үр дүн: Enter name: Tumur Enter age: 45 Displaying information Name: Tumur Roll: 45 16. struct student getInformation() { 17. struct student s1; 18. printf("Enter name: "); 19. scanf ("%[^n]%*c", s1.name); 20. printf("Enter age: "); scanf("%d", &s1.age); 21. return s1; }
  • 18.
    Бүтэц Typedefs Typedefs нь өөрнэртэй төрлийг тодорхойлох боломжийг олгодог бөгөөд энэ нь бүтэц, заагчтай харьцахад тохиромжтой байдаг. Энэ тохиолдолд цэг ашиглахгүй байж болно. Жишээлбэл: typedef struct { int x; int y; } point; Хэрэв point бүтцэд p удамшуулах бол point p; бичнэ.
  • 19.
    Бүтэц Жишээлбэл: Тээврийн хэрэгслийнбүтцийг дараах байдлаар тодорхойлж болно. typedef struct { char * brand; int model; } brand нь char заагч тул тээврийн хэрэгслийн төрөл нь мөр агуулж болно (энэ тохиолдолд тухайн тээврийн хэрэгслийн брэндийг заана). vehicle mycar; mycar.brand = "Ford"; mycar.model = 2007;
  • 20.
    Бүтэц Жишээ №7: feetболон inch өгөгдсөн хоёр цэгийн зайг олох #include <stdio.h> 1. struct Distance { 2. int feet; 3. float inch; 4. } dist1, dist2, sum; 5. int main() { 6. printf("1st distancen"); 7. printf("Enter feet: "); 8. scanf("%d", &dist1.feet); 9. printf("Enter inch: "); 10. scanf("%f", &dist1.inch); 11. printf("2nd distancen"); 12. printf("Enter feet: "); 13. scanf("%d", &dist2.feet); 14. printf("Enter inch: "); Үр дүн: Student Name is: Steve Student Id is: 1234 Student Age is: 30
  • 21.
    Бүтэц 16. scanf("%f", &dist2.inch); 17.// adding feet 18. sum.feet = dist1.feet + dist2.feet; 19. // adding inches 20. sum.inch = dist1.inch + dist2.inch; 21. // changing to feet if inch is greater than 12 22. while (sum.inch >= 12) 23. { 24. +sum.feet; 25. sum.inch = sum.inch - 12; 26. } 27. printf("Sum of distances = %d'-%.1f"", sum.feet, sum.inch); 28. return 0; 29. } Үр дүн: 1st distance Enter feet: 12 Enter inch: 7.9 2nd distance Enter feet: 2 Enter inch: 9.8 Sum of distances = 15'-5.7"
  • 22.
    Бүтэц Жишээ №7-д үзүүлсэнкодыг доорх хэлбэрээр typedef түлхүүр үг ашиглан бичих боломжтой. struct Distance{ int feet; float inch; }; int main() { struct Distance d1, d2; } typedef struct Distance{ int feet; float inch; } distances; int main() { distances d1, d2; }
  • 23.
    Бүтэц Жишээ №8: Эхлэхцаг, дуусах цагыг гараас оруулж тооцоолох 1. #include <stdio.h> 2. struct TIME { 3. int seconds; 4. int minutes; 5. int hours; }; 6. void differenceBetweenTimePeriod(struct TIME t1, struct TIME t2, struct TIME *diff); 7. int main() { 8. struct TIME startTime, stopTime, diff; 9. printf("Enter the start time. n"); 10. printf("Enter hours, minutes and seconds: "); 11. scanf("%d %d %d", &startTime.hours, &startTime.minutes, &startTime.seconds); 12. printf("Enter the stop time. n"); 13. printf("Enter hours, minutes and seconds: "); 14. scanf("%d %d %d", &stopTime.hours, &stopTime.minutes, &stopTime.seconds);
  • 24.
    Бүтэц Жишээ №8: Эхлэхцаг, дуусах цагыг гараас оруулж тооцоолох 15. // Эхлэх ба зогсоох цаг хугацааны ялгаа 16. differenceBetweenTimePeriod(startTime, stopTime, &diff); 17. printf("nTime Difference: %d:%d:%d - ", startTime.hours, startTime.minutes, startTime.seconds); 18. printf("%d:%d:%d ", stopTime.hours, stopTime.minutes, stopTime.seconds); 19. printf("= %d:%d:%dn", diff.hours, diff.minutes, diff.seconds); 20. return 0; } 21. // Эхлэх ба зогсоох цаг хугацааны зөрүүг тооцоолох 22. void differenceBetweenTimePeriod(struct TIME start, struct TIME stop, struct TIME *diff) { 23. while (stop.seconds > start.seconds) { 24. --start.minutes; start.seconds += 60; } 25. diff->seconds = start.seconds - stop.seconds; 26. while (stop.minutes > start.minutes) { 27. --start.hours; start.minutes += 60; } 28. diff->minutes = start.minutes - stop.minutes; 29. diff->hours = start.hours - stop.hours; 30. }
  • 25.
    Бүтэц Үр дүн: Enter thestart time. Enter hours, minutes and seconds: 13 34 55 Enter the stop time. Enter hours, minutes and seconds: 8 12 15 Time Difference: 13:34:55 - 8:12:15 = 5:22:40
  • 26.
  • 27.
    Нэгдэл Structures-ийн нэгэн адилнэгдэл нь хэрэглэгчийн тодорхойлсон өгөгдлийн төрөл юм. Нэгдэлд бүх гишүүд ижил санах ойн байршилтай байдаг.
  • 28.
    Нэгдэл Нэгдлийг хэрхэн бийболгох вэ? “union” түлхүүр үгийг ашиглан нэгдлийг бий болгодог. Бичигдэх хэлбэр: Жишээлбэл: union нэгдлийн_нэр { Төрлийн_нэр Гишүүд1 Төрлийн_нэр Гишүүд2 Төрлийн_нэр Гишүүд3 }; union car { char name[50]; int price; };
  • 29.
    Нэгдэл Нэгдлийн хувьсагчуудыг бийболгох Нэгдлийг тодорхойлсон тохиолдолд хэрэглэгчийн тодорхойлсон төрлийг үүсгэдэг. Гэсэн хэдий ч санах ой хуваарилагдаагүй болно. Тухайн нэгдлийн төрөлд санах ой хуваарилах, түүнтэй ажиллахын тулд хувьсагч үүсгэх хэрэгтэй. Бид нэгдлийн хувьсагчуудыг хэрхэн яаж үүсгэдэгийг энд харуулав. union car { char name[50]; int price; }; int main() { union car car1, car2, *car3; return 0; } Нэгдлийн удамшуулж авсан хувьсагчдыг бий болгох өөр нэг арга: union car { char name[50]; int price; } car1, car2, *car3;
  • 30.
    Нэгдэл Жишээ №9: Бүтэцнэгдэл хоёрын ялгаа 1. #include <stdio.h> 2. union unionJob{ 3. char name[32]; 4. float salary; 5. int workerNo; 6. } uJob; 7. struct structJob { 8. char name[32]; 9. float salary; 10. int workerNo; 11. } sJob; 12. int main() { 13. printf("size of union = %d bytes", 14. sizeof(uJob)); 15. printf("nsize of structure = %d bytes", sizeof(sJob)); 16. return 0; } Үр дүн: size of union = 32 bytes size of structure = 40 bytes Нэгдэл ба бүтцийн хувьсагчдын хэмжээ яагаад ийм ялгаатай байна вэ? sJob-ийн хэмжээ нь 40 байт байна • name[32] хэмжээ 32 байт байна • salary хэмжээ 4 байт • workNo хэмжээ 4 байт Гэхдээ uJob-ийн хэмжээ 32 байт байна. Энэ нь нэгдлийн хувьсагчийн хэмжээ үргэлж түүний хамгийн том элементийн хэмжээ байх болно. Энэхүү жишээнд түүний хамгийн том элементийн хэмжээ (name[32]) 32 байт байна.
  • 31.
    Нэгдэл Жишээ №10: Нэгдлийнгишүүдэд хандах 1. #include <stdio.h> 2. union Job { 3. float salary; 4. int workerNo; 5. } j; 6. int main() { 7. j.salary = 12.3; 8. // j.workerNo-д утга өгөөгүй үед, 9. // j.salary цаашид 12.3-ыг утга авахаа болино 10.j.workerNo = 100; 11.printf("Salary = %.1fn", j.salary); 12.printf("Number of workers = %d", j.workerNo); 13.return 0; } Үр дүн: Salary = 0.0 Number of workers = 100
  • 32.
    Нэгдэл Жишээ №11: Спрограм дээр x ба y хоёулаа ижил байршилтай байдаг. Хэрэв бид x-ийг өөрчилбөл y-д тусгагдсан өөрчлөлтүүдийг харж болно. 1. // Нэгдлийг зарлахдаа бүтэцтэй ижилхэн зарлана 2. union test { 3. int x, y; 4. }; 5. 6. int main() 7. { 8. // Нэгдлийн хувьсагч t 9. union test t; 10. t.x = 2; // t.y мөн 2 утга олгож байна. 11. printf("After making x = 2:n x = %d, y = %dnn", t.x, t.y); 12. t.y = 10; // t.x утгыг 10 болгон өөрчилж байна. 13. printf("After making y = 10:n x = %d, y = %dnn", t.x, t.y); 14. return 0; 15.} Үр дүн: After making x = 2: x = 2, y = 2 After making y = 10: x = 10, y = 10
  • 33.
    Нэгдэл Нэгдлийн хэмжээг хөрвүүлэгчхэрхэн шийддэг вэ? Нэгдлийн хэмжээг нэгдлийн хамгийн том гишүүний хэмжээгээр авна. Жишээ №12: Нэгдлийн гишүүдийн хэмжээ 1. #include <stdio.h> 2. union test1 { 3. int x; 4. int y; 5. } Test1; 6. union test2 { 7. int x; 8. char y; 9. } Test2; 10.union test3 { 11. int arr[10]; 12. char y; 13.} Test3; Үр дүн: sizeof(test1) = 4, sizeof(test2) = 4, sizeof(test3) = 40 14. int main() 15. { 16. printf("sizeof(test1) = %lu, sizeof(test2) = %lu, " "sizeof(test3) = %lu", sizeof(Test1), sizeof(Test2), sizeof(Test3)); 17. return 0; }
  • 34.
    Нэгдэл Нэгдлийн заагч? Бүтцийн нэгэнадил нэгдэл рүү чиглүүлэгч сум оператор (->) ашиглан гишүүдэд хандах боломжтой. Жишээ №13: Заагч бүхий нэгдэл 1. #include <stdio.h> 2. union test { 3. int x; 4. char y; 5. }; 6. int main() { 7. union test p1; 8. p1.x = 65; 9. // р2 нь p1-ийг нэгдлийн заагч юм 10. union test* p2 = &p1; 11. // Заагч ашиглан нэгдлийн гишүүд рүү хандах 12. printf("%d %c", p2->x, p2->y); 13. return 0; } Үр дүн: 65 A
  • 35.
  • 36.
    Тоочих төрөл С програмчлалынхувьд тоочих төрөл (үүнийг enum гэж нэрлэдэг) нь интеграл тогтмолуудаас бүрдэх өгөгдлийн төрөл юм. Тоочих төрлийг хэрхэн бий болгох вэ? “enum” түлхүүр үгийг ашиглан тоочих төрлийг бий болгодог. Бичигдэх хэлбэр: Жишээлбэл: enum flag {const1, const2, ..., constN}; enum suit { club = 0, diamonds = 10, hearts = 20, spades = 3, };
  • 37.
    Тоочих төрөл Тоочих төрлийгзарлах Энд enum төрлийн хувьсагчийг хэрхэн үүсгэхийг харуулав. enum boolean {false, true}; enum boolean check; // enum хувьсагчийг зарлах Энд enum boolean төрлийн check хувьсагчийн үүсгэсэн болно. Та мөн ийм байдлаар enum хувьсагчдыг зарлаж болно. enum boolean {false, true} check; Энд false утга 0, true утга 1-тэй тэнцүү байна.
  • 38.
    Нэгдэл Жишээ №14: Тоочихтөрөл 1. #include <stdio.h> 2. enum week {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday}; 3. int main() 4. { 5. // үүсгэсэн today хувьсагч нь enum week нэг төрөл юм 6. enum week today; 7. today = Wednesday; 8. printf("Day %d",today+1); 9. return 0; 10.} Үр дүн: Day 4
  • 39.
    Тоочих төрөл Яагаад enumsашигладаг вэ? Enum хувьсагч нь зөвхөн нэг утга авах боломжтой. Жишээ №15: Тоочих төрөл 1. #include <stdio.h> 2. enum suit { 3. club = 0, diamonds = 10, hearts = 20, spades = 3 } card; 4. int main() { 5. card = club; 6. printf("Size of enum variable = %d bytes", sizeof(card)); 7. return 0; 8. } Үр дүн: Size of enum variable = 4 bytes Int-ийн хэмжээ 4 байт тул 4-ийг авч байна. Энэ нь enum-ийг flag ажиллахад тохиромжтой сонголт болгодог.
  • 40.
    Тоочих төрөл Хэрхэн тоочихтөрөлд flag ажиллах вэ? Жишээлбэл: enum designFlags { ITALICS = 1, BOLD = 2, UNDERLINE = 4 } button; Та Windows програмын товчлуурыг зохиож байгаа гэж бодъё. Тексттэй ажиллахын тулд ITALICS, BOLD, UNDERLINE flag тохируулж болно. Бүх салшгүй тогтмолууд нь дээр дурдсан псевдокод 2-ийн тооллоор илэрхийлэх шалтгаан байдаг. ITALICS = 00000001 BOLD = 00000010 UNDERLINE = 00000100
  • 41.
    Тоочих төрөл Enum-ийг эхлэлийнутгын тухай сонирхолтой баримтууд. 1. Enum-ийн хоёр нэр ижил утгатай байж болно. Жишээлбэл, дараах C програм дээр ‘Failed’ ба ‘Freezed’ хоёулаа ижил 0 утгатай байна. Жишээ №16: Ижил утгатай тоочих төрөл 1. #include <stdio.h> 2. enum State {Working = 1, Failed = 0, Freezed = 0}; 3. int main() 4. { 5. printf("%d, %d, %d", Working, Failed, Freezed); 6. return 0; 7. } Үр дүн: 1, 0, 0
  • 42.
    Тоочих төрөл 2. Хэрэвбид тоочих төрлийн хувьсагчид утгыг тодорхой зааж өгөөгүй бол хөрвүүлэгч нь анхнаасаа 0-ээс эхэлсэн утгыг өгдөг. Жишээ №17: Ням гараг 0, Даваа гараг 1-г авна гэх мэт. 1. #include <stdio.h> 2. enum day {sunday, monday, tuesday, wednesday, thursday, friday, saturday}; 3. int main() 4. { 5. enum day d = thursday; 6. printf("The day number stored in d is %d", d); 7. return 0; 8. } Үр дүн: The day number stored in d is 4
  • 43.
    Тоочих төрөл 3. Ямарч дарааллаар ямар нэгэн нэрэнд утга өгч болно. Бүх хуваарилагдаагүй нэрс нь өмнөх нэрний утгыг нэмж нэг утга авна. Жишээ №18: Тогтсон дараалагүй утга олгох. 1. #include <stdio.h> 2. enum day {sunday = 1, monday, tuesday = 5, wednesday, thursday = 10, friday, saturday}; 3. int main() 4. { 5. printf("%d %d %d %d %d %d %d", sunday, monday, tuesday, wednesday, thursday, friday, saturday); 6. return 0; 7. } Үр дүн: 1 2 5 6 10 11 12
  • 44.
    Тоочих төрөл 4. Enumнэрүүдэд өгсөн утга нь бүхэл тогтмол байх ёстой, өөрөөр хэлбэл утга нь хамгийн бага бүхэл тооноос хамгийн их бүхэл тоон утга хүртэлх хязгаарт байх ёстой. 5. Бүх enum тогтмолууд хамрах хүрээгээрээ өвөрмөц байх ёстой. Жишээ №19: Алдаатай программыг хөрвүүлэх. 1. #include <stdio.h> 2. enum state {working, failed}; 3. enum result {failed, passed}; 4. int main() { return 0; } Compile Error: 'failed' has a previous declaration as 'state failed'
  • 45.
    Тоочих төрөл Жишээл №20:bitwise OR | оператор ашиглах #include <stdio.h> enum designFlags { BOLD = 1, ITALICS = 2, UNDERLINE = 4 }; int main() { int myDesign = BOLD | UNDERLINE; // 00000001 // | 00000100 // ___________ // 00000101 printf("%d", myDesign); return 0; } Үр дүн: 5
  • 46.
    Тоочих төрөл Жишээл №21:7 хоногын өдөр хэвлэх Зарлах Утга олгох Оператор Түлхүүр үг enum хувьсагч төлөв=0 төлөв=1 төлөв=6 Тоочих төрлүүд (Тогтмолуудыг таслалаар тусгаарлаж бичнэ) days of week тоочих төрлийн объектууд wed=2 төлөв
  • 47.
    Тоочих төрөл Жишээл №21:7 хоногын өдөр хэвлэх 1. #include<stdio.h> 2. enum week{Mon, Tue, Wed, Thur, Fri, Sat, Sun}; 3. int main() 4. { 5. enum week day; 6. day = Wed; 7. printf("%d",day); 8. return 0; 9. } Үр дүн: 2
  • 48.
    Тоочих төрөл Жишээл №22:Жилийн сарууд хэвлэх 1. #include<stdio.h> 2. enum year{Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec}; 3. int main() 4. { 5. int i; 6. for (i=Jan; i<=Dec; i++) 7. printf("%d ", i); 8. return 0; 9. } Энэ жишээнд for давталт нь i = 0-ээс i = 11 хүртэл ажиллана, учир нь эхлээд i-ийн утга Jan бөгөөд 0, Dec-ийн утга 11 байна. Үр дүн: 0 1 2 3 4 5 6 7 8 9 10 11
  • 49.
    Тоочих төрөл Жишээл №23:Тоочих төрлийн дэд функцыг тоочих төрөлтэй харьцуулах 1. #include <stdio.h> 2. enum State {WORKING = 0, FAILED, FREEZED}; 3. enum State currState = 2; 4. enum State FindState() { 5. return currState; 6. } 7. int main() { 8. (FindState() == WORKING)? printf("WORKING"): printf("NOT WORKING"); 9. return 0; 10.} Үр дүн: NOT WORKING