Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

u.cs101 "Алгоритм ба програмчлал" Лекц №6

2,368 views

Published on

Си хэлний заагч төрөл

Published in: Software
  • Be the first to comment

u.cs101 "Алгоритм ба програмчлал" Лекц №6

  1. 1. Лекц № 6 Си-гийн заагч А. Хүдэр
  2. 2.  Заагч хувьсагчийг зарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 212/16/2015Vanderbilt university
  3. 3.  Утга нь санах ойн хаяг байна  Энгийн хувьсагчид ямар нэг утга хадгалдаг (шууд хаяглалт)  Заагч нь ямар нэг утга агуулж байгаа хувьсагчийн хаягийг агуулна (шууд бус хаяглалт) 312/16/2015Vanderbilt university
  4. 4.  Заагч хувьсагчид * - ыг хэрэглэнэ int *myPtr;  int төрлийн заагчийг тодорхойлно (int * төрлийн заагч)  Олон заагч зарлах бол хувьсагч бүрийн өмнө * -ыг бичнэ int *myPtr1, *myPtr2;  Ямар ч төрлийн заагч зарлаж болно  Заагчийн анхны утгаар 0, NULL эсвэл ямар нэг хаяг өгөх ◦ 0 эсвэл NULL – юуг ч заахгүй ◦ 0 нь заагчид олгож болох цорын ганц бүхэл утга юм ◦ Заагчид анхны утгыг нь 0 гэж олгох нь NULL -ыг олгохтой ижил боловч NULL –ыг ихэвчлэн хэрэглэнэ ◦ NULL -ыг <stddef.h>, <stdio.h> гэх мэт хэд хэдэн толгой файлд тодорхойлсон байдаг 412/16/2015Vanderbilt university
  5. 5.  Заагч хувьсагчийг зарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 512/16/2015Vanderbilt university
  6. 6.  & (хаяг авах үйлдэл) ◦ Операндынхаа хаягийг буцаана int y = 5; int *yPtr; yPtr = &y; /* yPtr заагч y – гийн хаягийг авна */  /* yPtr заагч y-г заана*/ 612/16/2015Vanderbilt university
  7. 7.  * (шууд бус хаяглалт/хаяглах үйлдэл) ◦ Операндынхаа зааж байгаа зүйлийн өөр нэр/зохиомол нэрийг буцаана ◦ *yptr нь y-ийг буцаана (yptr нь y-г зааж байгаа учир) ◦ *-ыг утга олгоход хэрэглэж болно  Объектийн өөр нэрийг буцаана  *yptr = 7; /* changes y to 7 */  Хаяглалтанд хэрэглэж байгаа заагч нь (*-ын операнд) lvalue байх ѐстой (тогтмол байж болохгүй).  * ба & нь эсрэг үйлдлүүд юм  Бие биенийгээ устгана 712/16/2015Vanderbilt university
  8. 8. Хэрэв aPtr нь a-г зааж байгаа бол &a болон aPtr нь ижил утга юм a болон *aPtr нь ижил &*aPtr болон *&aPtr нь ижил утгатай 812/16/2015Vanderbilt university
  9. 9. 912/16/2015Vanderbilt university
  10. 10. 1012/16/2015Vanderbilt university
  11. 11.  Заагч хувьсагчийг зарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 1112/16/2015Vanderbilt university
  12. 12.  Заагч аргумент ашиглан хаягаар дуудах ◦ Аргументийн хаягийг & оператор ашиглан дамжуулна ◦ Санах ой дахь бодит байрлал дээр өөрчлөлт хийх боломж олгоно ◦ Хүснэгтийг дамжуулахад & үйлдлийг ашиглахгүй, учир нь хүснэгтийн нэр өөрөө заагч байдаг  * оператор ◦ Функцийн дотор хувьсагчийн өөр нэр ашиглахад хэрэглэгдэнэ void timestwo( int *number ) { *number = 2 * ( *number ); } ◦ *number нь дамжуулагдсан хувьсагчийн өөр нэр байдлаар ашиглагдана 1212/16/2015Vanderbilt university
  13. 13. 1312/16/2015Vanderbilt university
  14. 14. 14 Заагч аргумент авах функцийн загвар cubeByReference функц руу заагч хувьсагчийн утга байж болох хаяг дамжуулсан Энэ програмд *nPtr нь number – тэй адил тул энэ үйлдэл нь number хувьсагчийн утгыг өөрчилнө 12/16/2015Vanderbilt university
  15. 15. 1512/16/2015Vanderbilt university
  16. 16. 1612/16/2015Vanderbilt university
  17. 17.  Заагч хувьсагчийг зарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 1712/16/2015Vanderbilt university
  18. 18.  const тодорхойлогч ◦ Хувьсагчийн утга өөрчлөгдөхгүй ◦ Хэрэв функц ямар нэг хувьсагчаа өөрчлөх хэрэггүй бол const тодорхойлогчийг хэрэглэнэ ◦ const хувьсагчийг өөрчлөх гэж оролдвол алдаа гарна  const заагчид ◦ Санах ойн тогтмол байрлал руу заана ◦ Тодорхойлох үедээ анхны утгыг нь олгох ѐстой ◦ const int *myPtr = &x;  const int төрлийн энгийн заагч ◦ int *const myPtr = &x;  int *const төрөл нь int төрлийн тогтмол заагч юм  x нь өөрчлөгдөж болох боловч myPtr өөрчлөгдөхгүй ◦ const int *const Ptr = &x;  const int төрлийн const заагч 1812/16/2015Vanderbilt university
  19. 19. 19 sPtr болон *sPtr хоѐулаа тогтмол биш 12/16/2015Vanderbilt university
  20. 20. 20 sPtr болон *sPtr-ын утгыг converttoUppercase функц өөрчилнө 12/16/2015Vanderbilt university
  21. 21. 21 sPtr заагчийг өөрчилж болохгүй боловч зааж байгаа өгөгдөл *sPtr-ийг өөрчилж болно 12/16/2015Vanderbilt university
  22. 22. 22 sPtr-ийг printCharacters функц өөрчилж байна 12/16/2015Vanderbilt university
  23. 23. 23 xPtr заагч өөрчлөгдөнө харин зааж байгаа өгөгдөл *xPtr нь өөрчлөгдөхгүй Хөрвүүлэлтийн алдаа! *xPtr нь const тодорхойлогчтой байхад утгыг нь өөрчлөх гэвэл алдаа гарна 12/16/2015Vanderbilt university
  24. 24. 24 ptr заагч өөрчлөгдөхгүй боловч зааж байгаа *ptr өгөгдөл тогтмол биш Хөрвүүлэлтийн алдаа! 12/16/2015Vanderbilt university
  25. 25. 25 Заагч sPtr болон өгөгдөл *sPtr хоѐулаа тогтмол Хөрвүүлэлтийн алдаа! 12/16/2015Vanderbilt university
  26. 26.  Заагч хувьсагчийг зарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 2612/16/2015Vanderbilt university
  27. 27.  Заагч ашиглан бөмбөлгөн эрэмбэлэлтийг хэрэгжүүлэх ◦ Хоѐр элементийн байрыг солих ◦ swap функц хүснэгтийн элементүүдийн хаягийг хүлээж авна (& - г хэрэглэн) ◦ Заагч болон * операторыг хэрэглэн swap функц хүснэгтийн элементүүдийг солино  Псевдокод Хүснэгтэд анхны утга олгох өгөгдлийг анхны хэлбэрээр нь хэвлэх bubblesort функцийг дуудах эрэмбэлэгдсэн хүснэгтийг хэвлэх bubblesort функцийг тодорхойлох 2712/16/2015Vanderbilt university
  28. 28. 2812/16/2015Vanderbilt university
  29. 29. 2912/16/2015Vanderbilt university
  30. 30. 30 swap функц нь хоѐр заагчийн зааж буй int төрлийн утгуудын байрыг солино 12/16/2015Vanderbilt university
  31. 31.  Заагч хувьсагчийг зарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 3112/16/2015Vanderbilt university
  32. 32.  sizeof ◦ Операндын хэмжээг байтаар буцаана ◦ Хүснэгтийн хувьд: нэг элементийн хэмжээ х элементийн тоо ◦ Хэрэв sizeof(int) нь 4 байт бол int myArray[ 10 ]; printf( "%d", sizeof( myArray ) );  40 гэж хэвлэнэ  sizeof-ыг доорх зүйлд ашиглаж болно ◦ Хувьсагчийн нэр ◦ Төрлийн нэр ◦ Тогтмолын нэр 3212/16/2015Vanderbilt university
  33. 33. 33 float нь санах ойд 4 байт эзэлдэг бол 20 ширхэг float нь 80 байт болно 12/16/2015Vanderbilt university
  34. 34. 3412/16/2015Vanderbilt university
  35. 35. 3512/16/2015Vanderbilt university
  36. 36.  Заагч хувьсагчийг зарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 3612/16/2015Vanderbilt university
  37. 37.  Заагч дээр арифметик үйлдэл хийж болно ◦ Заагчийг нэмэгдүүлэх/хорогдуулах (++ эсвэл --) ◦ Заагч дээр бүхэл тоо нэмэх (+ эсвэл +=, - эсвэл -=) ◦ Заагчуудыг бие биенээс нь хасч болно ◦ Эдгээр үйлдлүүдийг хүснэгт дээр хийх үед л утгатай байна 3712/16/2015Vanderbilt university
  38. 38.  Бүхэл тоон төрөл нь 4 байт байдаг машин дээрх 5 элементтэй хүснэгт ◦ vPtr эхний элемент v[0] рүү заана  3000 гэсэн байрлал руу (vPtr=3000) ◦ vPtr+=2; vPtr-ийг 3008 утгатай болгоно  vPtr нь v[2] руу заах (2-оор нэмэгдсэний дараа) ба, машин 4 байтын int төрөлтэй тул зааж буй хаяг нь 3008 болно. 38v хүснэгт ба түүн рүү заах vPtr заагч 12/16/2015Vanderbilt university
  39. 39. 3912/16/2015Vanderbilt university
  40. 40.  Заагчийг хасах ◦ Нэг заагчаас нөгөөг хүртлэх элементийн тоог буцаана. Хэрэв vPtr2 = v[2]; vPtr0 = v[0]; ◦ vPtr2 – vPtr0 нь 2 болно  Заагчийг харьцуулах ◦ Аль заагч нь илүү их дугаартай хүснэгтийн элемент зааж байгааг олох ◦ Заагчийн утга 0-тэй тэнцүү эсэхийг шалгах 4012/16/2015Vanderbilt university
  41. 41.  Ижил төрлийн заагчдын хооронд утга олгох үйлдэл хэрэглэж болно ◦ Хэрэв төрөл нь ялгаатай бол төрөл хувиргах үйлдэл хэрэглэнэ ◦ Онцгой тохиолдол: void төрлийн заагч (void * төрөл)  Ерөнхий заагч, ямар ч төрлийг зааж чадна  void заагч руу шилжүүлэхэд төрөл хувиргалт хэрэггүй  void төрлийн заагч дээр шууд бус хаяглалтыг хийж болохгүй 4112/16/2015Vanderbilt university
  42. 42.  Заагч хувьсагчийг зарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 4212/16/2015Vanderbilt university
  43. 43.  Заагч ба хүснэгт нь нягт холбоотой ◦ Хүснэгтийн нэр нь тогтмол заагч юм ◦ Заагчаар хүснэгтийн индексийн үйлдлийг хийж болно  b[5] хүснэгт ба bPtr заагч зарлая ◦ Тэдгээрийг ижил болгохын тулд дараах үйлдлийг хийнэ bPtr = b;  Хүснэгтийн нэр (b) нь b[5] хүснэгтийн эхний элементийн хаяг юм bPtr = &b[0];  bPtr заагчид b хүснэгтийн эхний элементийн хаягийг олгоно 4312/16/2015Vanderbilt university
  44. 44.  b[3] элемент ◦ *(bPtr+3) гэж хандаж болно  Шилжилтийн утга n-ийн хувьд заагч/шилжилтийн тэмдэглэгээ гэж нэрлэгддэг ◦ bPtr[3] гэж хандаж болно  Заагч/индексийн тэмдэглэгээ гэж нэрлэгддэг  bPtr[3] нь b[3] –тай адил ◦ Хүснэгт дээрээ заагчийн арифметикийг хэрэглэн *(b+3) гэж хандаж болно 4412/16/2015Vanderbilt university
  45. 45. 45 Хүснэгтийн индексийн тэмдэглэгээ Заагч/шилжилтийн тэмдэглэгээ 12/16/2015Vanderbilt university
  46. 46. 46 Заагчийн индекс тэмдэглэгээ Заагчийн шилжилттэй тэмдэглэгээ 12/16/2015Vanderbilt university
  47. 47. 4712/16/2015Vanderbilt university
  48. 48. 4812/16/2015Vanderbilt university
  49. 49. 49 for давталтын нөхцөл дотор үйлдэл гүйцэтгэж байна 12/16/2015Vanderbilt university
  50. 50.  Заагч хувьсагчийг зарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 5012/16/2015Vanderbilt university
  51. 51.  Хүснэгт нь заагчуудыг агуулж болно  Жишээ: Тэмдэгт мөр төрлийн хүснэгт ◦ char *suit[ 4 ] = { "Hearts", "Diamonds”, "Clubs", "Spades" }; ◦ Тэмдэгт мөр нь эхний үсгийнхээ заагч юм ◦ char * - suit-ийн элемент бүр нь char төрлийн заагч юм ◦ Тэмдэгт мөрүүд нь suit хүснэгтэд хадгалагдахгүй ба тэнд тэдний зөвхөн заагчдыг хадгална ◦ suit хүснэгт нь тогтмол хэмжээтэй ба харин тэмдэгт мөрүүд нь ямар ч хэмжээтэй байж болно 5112/16/2015Vanderbilt university
  52. 52. 5212/16/2015Vanderbilt university
  53. 53.  Заагч хувьсагчийг зарлах ба анхны утга олгох  Заагч дээрх үйлдлүүд  Аргументыг функц руу хаягаар дамжуулах  const тодорхойлогчийг заагч дээр ашиглах  Хаягаар дуудах арга хэрэглэсэн бөмбөлгөн эрэмбэлэлт  sizeof оператор  Заагчтай илэрхийлэл ба заагчийн арифметик  Заагч ба хүснэгт  Заагч төрлийн хүснэгт  Функцийн заагч 5312/16/2015Vanderbilt university
  54. 54.  Функцийн заагч ◦ Функцийн хаягийг заана ◦ Хүснэгтийн нэр эхний элементийнхээ хаяг байдагтай адил ◦ Функцийн нэр нь функцийг тодорхойлсон кодын эхлэлийн хаяг байна  Функцийн заагч дээр дараах үйлдлүүдийг хийж болно ◦ Функц руу дамжуулах ◦ Хүснэгтэнд хадгалах ◦ Өөр функцийн заагчид олгох 5412/16/2015Vanderbilt university
  55. 55.  Жишээ: bubblesort ◦ bubble функц аргументаар функцийн заагч авна  bubble тэр туслах функцийг дуудна  энэ нь өсөх эсвэл буурахаар эрэмбэлэхийг тодорхойлно ◦ bubble функцийн аргумент болох функцийн заагч: int ( *compare )( int a, int b ); нь bubble-д хоѐр бүхэл тоон аргументтай, бүхэл тоо буцаадаг функц орж ирэхийг заана ◦ Хэрэв хаалтуудыг орхивол: int *compare( int a, int b );  хоѐр int аргументтай, int-ийн заагч буцаадаг функц гэж тодорхойлогдоно 5512/16/2015Vanderbilt university
  56. 56. 56 bubble функц аргументаараа функцийн заагч авч байна 12/16/2015Vanderbilt university
  57. 57. 57 Хэрэглэгчийн сонголтоос хамааран bubble функц ascending эсвэл descending функцийг хүснэгт эрэмбэлэхэд ашиглаж байна 12/16/2015Vanderbilt university
  58. 58. 58 Програм юуг эрэмбэлэгдээгүй байна гэж үзэх нь bubble руу ямар функцийн заагч дамжуулагдсанаас хамаарна 12/16/2015Vanderbilt university
  59. 59. 59 bubble функц руу ascending функцийг дамжуулахад програмын энэ хэсэгт ирнэ bubble функц руу descending функцийг дамжуулахад програмын энэ хэсэгт ирнэ 12/16/2015Vanderbilt university
  60. 60. 6012/16/2015Vanderbilt university
  61. 61.  Заагч: өгөгдлийн төрөл * заагч хувьсагчийн нэр (%p, арван зургаатын бүхэл тоо)  Утгаар дуудах (өөрчлөхгүй) ба хаягаар дуудах (өөрчилнө)  const тодорхойлогч нь хувьсагчийг өөрчлөхгүй байхыг заана (дөрвөн хувилбар)  sizeof нь хэмжээг байтаар тодорхойлно  Заагчийн хүснэгт  Функцийн заагч: функцийн нэр нь хаяг байдаг 6112/16/2015Vanderbilt university

×