Лекц №5


   Санах ойн динамик
хуваарилалт ба өгөгдлийн
      хийсвэрлэлт    LOGO
Хичээлийн агуулга




Багш: Т.Гантөр
Санах ойн динамик хуваарилалт
 Статик хувьсагчид нь програмыг ажиллаж
  эхлэхэд санах ойд хуваарилагдан, тогтмол
  зайн эзлэн байрлах бөгөөд програмыг
  ажиллаж     дуусахад     санах    ойгоос
  чөлөөлөгддөг.
 Програмын биелэлтийн явцад хувьсагчид
  зориулан санах ой хуваарилж болдог.




Багш: Т.Гантөр
Санах ойн динамик хуваарилалт
 Програмын биелэлтийн явцад санах ойн мужид
  хувьсагчдад зориулан шинээр зай нөөцөлж, мөн
  чөлөөлж болдог.
 Ийм хувьсагчдыг динамик хувьсагч, үүссэн
  санах ойн мужийг динамик муж гэж
  нэрлэдэг.
 C++ хэлэнд динамик хувьсагчийг санах ойд
  хуваарилах       болон     санах  ойгоос
  чөлөөлөхдөө        new      болон   delete
  операторуудыг харгалзан ашиглана.


Багш: Т.Гантөр
Санах ойн динамик хуваарилалт - new
 New оператор нь аргументаараа авсан төрлийн
  өгөгдийг хадгалахад хүрэлцэхүйц зайг динамик
  санах ойгоос нөөцлөн, түүний хаягийг буцаадаг.

 New оператороор хуваарилагдсан хувьсагчид нь
  санах ойн heap мужид байрлана.

 Динамикаар хуваарилагдсан хувьсагч нь нэргүй
  байдаг бөгөөд шууд хаяглагдаж чаддаггүй.
  Тиймээс new оператороос буцаасан заагч
  төрлийн утгаар шууд бусаар хаягладаг.

Багш: Т.Гантөр
Санах ойн динамик хуваарилалт - new
 Жишээ:
  intPointer=new int;




Багш: Т.Гантөр
Санах ойн динамик хуваарилалт - new
 Заагч хувьсагч нь ямар нэг зүйл заахгүйгаар
  хоосон утгыг заах шаардлага гардаг. Энэ
  тохиолдолд stdlib.h санд агуулагдах NULL
  тогтмол утгыг ашиглана.
 Жишээ:
         bool* truth = NULL;
         float* money = NULL;




Багш: Т.Гантөр
Санах ойн динамик хуваарилалт - new
 Жишээ:
 truth = new bool;
 *truth = true;
 money = new float;
 *money = 33.46;
 float* myMoney=new float;




Багш: Т.Гантөр
Санах ойн динамик хуваарилалт - new
 Жишээ:
   *myMoney = *money;




Багш: Т.Гантөр
Санах ойн динамик хуваарилалт - new
 Жишээ:
   myMoney = money;




Багш: Т.Гантөр
Санах ойн динамик хуваарилалт - delete
 Delete оператор нь нөөцөлсөн зайг чөлөөлдөг ба
  уг санах ойн байрлалыг дахин ашиглах
  боломжтой болгоно.

 Санах ойн ашиглалтыг сайжруулах, програмын
  найдвартай ажиллагааг хангах үүднээс new
  оператороор нөөцөлсөн санах ойн хэсгийг
  ашиглаж дууссаны дараа delete оператороор
  чөлөөлж байх хэрэгтэй.




Багш: Т.Гантөр
Санах ойн динамик хуваарилалт - new
 Жишээ:
   delete myMoney;




Багш: Т.Гантөр
Динамик массив
 Массивыг санах ойд хүссэн хэмжээтэйгээр
  хуваарилж, санах ойгоос чөлөөлж, дахин өөр
  хэмжээтэйгээр санах ойд хуваарилах зэргээр
  ашиглаж болно. Ийм массивыг динамик массив
  гэнэ.

 Програмд динамик массив ашиглах нь санах ойг
  зүй зохистой ашиглах давуу талтай




Багш: Т.Гантөр
Динамик массив
 Динамик массивыг зарлахдаа:
   Заагчийн_нэр= new заагчийн_төрөл[хэмжээ];
 Жишээ:
     int maxStack=5;
     int * items;
     items = new ItemType[maxStack];




Багш: Т.Гантөр
Динамик массив
 Динамик массивыг зарлахдаа:
   Заагчийн нэр= new заагчийн төрөл [хэмжээ]
 Жишээ:
     int maxStack=5;
     int * items;
     items = new ItemType[maxStack];




Багш: Т.Гантөр
Динамик массив
 Динамик массивыг санах ойгоос чөлөөлөхдөө:
   delete [] Заагчийн_нэр;
 Жишээ:
     delete [] items;




Багш: Т.Гантөр
Өгөгдлийн хийсвэр төрөл
 Програм бичих гэдэг нь бодит амьдрал дахь
  ямар нэг асуудлыг загварчлах ажил юм.

 Гэвч аливаа асуудал нь маш ерөнхий бүрхэг
  байдаг учраас юуны өмнө уг асуудалд
  шаардлагатай ба шаардлагагүй зүйлсийг ялган
  тодорхойлох, улмаар асуудлын хийсвэр ойлголт
  буюу загварыг гарган авна.

 Загварчлалын энэ процессыг хийсвэрлэлт гэж
  нэрлэнэ

Багш: Т.Гантөр
Өгөгдлийн хийсвэр төрөл
 Загвар нь
      • Уг асуудалд шаардлагатай өгөгдөлүүд
      • Уг өгөгдөлд хийгдэх үйлдлүүдээс тогтоно.

 Өөрөөр хэлбэл хийсвэрлэлт гэдэг нь аливаа
  тавигдсан   асуудлыг    түүний   өгөгдлүүдийг
  үйлдлүүдийн хамтаар загварчлахыг хэлнэ




Багш: Т.Гантөр
Өгөгдлийн хийсвэр төрөл
 Өгөгдөлүүдэд      зөвхөн    тэдгээрт    хийгдэх
  үйлдлүүдээр хандана. Ийм шинж чанар бүхий
  загварчлалыг өгөгдлийн хийсвэр төрөл гэнэ.
 Өгөгдлийн хийсвэр төрөл нь өгөгдлийг гадны
  орчноос далдалдаг ба зөвхөн үйлдэл нь гадна
  орчинтой холбогдон өгөгдөл хандах гүүр болж
  өгдөг.
 Өгөгдлийн хийсвэр төрөл нь өгөгдөл болон
  тэдгээрт хийгдэх багц үйлдлүүдийг агуулдаг.




Багш: Т.Гантөр
Өгөгдлийн хийсвэр төрөл


 Өгөгдлийн бүтэц нь өгөгдөл, тэдгээрийн зохион
  байгуулалтаас гадна уг өгөгдлүүдэд хийгдэх
  үйлдлүүдээр тодорхойлогддог.

 Өгөгдлийн бүтэц болон тэдгээрт хийгдэх
  үйлдлүүдийг загварчлах үйл явц нь ерөөсөө
  өгөгдлийн хийсвэр төрөл тодорхойлох үйл явц
  юм.



Багш: Т.Гантөр
Өгөгдлийн хийсвэр төрөл
 Өгөгдлийн хийсвэр төрлийг С++ програмчлалын
  хэлэнд классаар илэрхийлдэг.
 Класс гэдэг нь нууцлагдсан өгөгдөл ба
  функцуудыг багцлан агуулсан өгөгдлийн нийлэл
  төрөл юм.
 Классыг class нөөц үгээр тодорхойлно. Класст
  зарлагдсан хувьсагчдыг классын гишүүн өгөгдөл,
  класст зарлагдсан функцуудыг классын гишүүн
  функц гэнэ




Багш: Т.Гантөр
DynArray хийсвэр төрөл
class DynArray{
    int *a, len;
public:
    DynArray(int length);
    ~DynArray();
    int& operator[](int n);
    int size();
    void resize(int length);
    void print();
};



Багш: Т.Гантөр
DynArray хийсвэр төрөл
DynArray::DynArray(int length){
    len=length;
    a=new int[len];
    for(int i=0;i<len;i++) a[i]=0;
}

DynArray::~DynArray(){
    delete []a;
}




Багш: Т.Гантөр
DynArray хийсвэр төрөл
int& DynArray::operator[](int i){
    if ( i<0 || i>=len){
         cout<<"Aldaa: "<<i<<" hemjee
                          heterlee.n";
         exit(0);
         }
    return a[i];
}

int DynArray::size(){
    return len;
}

Багш: Т.Гантөр
DynArray хийсвэр төрөл
void DynArray::resize(int length){
    if (len==length) return;
    int newlen=length;
    int *newa= new int[newlen];
    int min=(newlen<len)? newlen:len;
    for(int i=0;i<min; i++)
         newa[i]=a[i];
    for(i=min; i<newlen;i++)
         newa[i]=0;
    len=newlen;
    a=newa;
    }

Багш: Т.Гантөр
DynArray хийсвэр төрөл
void DynArray::print(){
    for(int i=0; i<len;i++)
         cout<<a[i]<<",";
    cout<<endl;

}




Багш: Т.Гантөр
DynArray хийсвэр төрөл
void main(){
          DynArray my(3);
          for(int i=0; i<3; i++)my[i]=i;
          my.print();
          cout<<"hemjee: "<<my.size()<<endl;
          my.resize(5);
          cout<<"hemjee: "<<my.size()<<endl;
          my.print();
          my[3]=3; my[4]=4;
          my.print();
          my.resize(10);
          my.print();
          my[7]=3; my[9]=4;
          my.print();
Багш: Т.Гантөр

Dsi lec5

  • 1.
    Лекц №5 Санах ойн динамик хуваарилалт ба өгөгдлийн хийсвэрлэлт LOGO
  • 2.
  • 3.
    Санах ойн динамикхуваарилалт  Статик хувьсагчид нь програмыг ажиллаж эхлэхэд санах ойд хуваарилагдан, тогтмол зайн эзлэн байрлах бөгөөд програмыг ажиллаж дуусахад санах ойгоос чөлөөлөгддөг.  Програмын биелэлтийн явцад хувьсагчид зориулан санах ой хуваарилж болдог. Багш: Т.Гантөр
  • 4.
    Санах ойн динамикхуваарилалт  Програмын биелэлтийн явцад санах ойн мужид хувьсагчдад зориулан шинээр зай нөөцөлж, мөн чөлөөлж болдог.  Ийм хувьсагчдыг динамик хувьсагч, үүссэн санах ойн мужийг динамик муж гэж нэрлэдэг.  C++ хэлэнд динамик хувьсагчийг санах ойд хуваарилах болон санах ойгоос чөлөөлөхдөө new болон delete операторуудыг харгалзан ашиглана. Багш: Т.Гантөр
  • 5.
    Санах ойн динамикхуваарилалт - new  New оператор нь аргументаараа авсан төрлийн өгөгдийг хадгалахад хүрэлцэхүйц зайг динамик санах ойгоос нөөцлөн, түүний хаягийг буцаадаг.  New оператороор хуваарилагдсан хувьсагчид нь санах ойн heap мужид байрлана.  Динамикаар хуваарилагдсан хувьсагч нь нэргүй байдаг бөгөөд шууд хаяглагдаж чаддаггүй. Тиймээс new оператороос буцаасан заагч төрлийн утгаар шууд бусаар хаягладаг. Багш: Т.Гантөр
  • 6.
    Санах ойн динамикхуваарилалт - new  Жишээ: intPointer=new int; Багш: Т.Гантөр
  • 7.
    Санах ойн динамикхуваарилалт - new  Заагч хувьсагч нь ямар нэг зүйл заахгүйгаар хоосон утгыг заах шаардлага гардаг. Энэ тохиолдолд stdlib.h санд агуулагдах NULL тогтмол утгыг ашиглана.  Жишээ: bool* truth = NULL; float* money = NULL; Багш: Т.Гантөр
  • 8.
    Санах ойн динамикхуваарилалт - new  Жишээ: truth = new bool; *truth = true; money = new float; *money = 33.46; float* myMoney=new float; Багш: Т.Гантөр
  • 9.
    Санах ойн динамикхуваарилалт - new  Жишээ: *myMoney = *money; Багш: Т.Гантөр
  • 10.
    Санах ойн динамикхуваарилалт - new  Жишээ: myMoney = money; Багш: Т.Гантөр
  • 11.
    Санах ойн динамикхуваарилалт - delete  Delete оператор нь нөөцөлсөн зайг чөлөөлдөг ба уг санах ойн байрлалыг дахин ашиглах боломжтой болгоно.  Санах ойн ашиглалтыг сайжруулах, програмын найдвартай ажиллагааг хангах үүднээс new оператороор нөөцөлсөн санах ойн хэсгийг ашиглаж дууссаны дараа delete оператороор чөлөөлж байх хэрэгтэй. Багш: Т.Гантөр
  • 12.
    Санах ойн динамикхуваарилалт - new  Жишээ: delete myMoney; Багш: Т.Гантөр
  • 13.
    Динамик массив  Массивыгсанах ойд хүссэн хэмжээтэйгээр хуваарилж, санах ойгоос чөлөөлж, дахин өөр хэмжээтэйгээр санах ойд хуваарилах зэргээр ашиглаж болно. Ийм массивыг динамик массив гэнэ.  Програмд динамик массив ашиглах нь санах ойг зүй зохистой ашиглах давуу талтай Багш: Т.Гантөр
  • 14.
    Динамик массив  Динамикмассивыг зарлахдаа: Заагчийн_нэр= new заагчийн_төрөл[хэмжээ];  Жишээ: int maxStack=5; int * items; items = new ItemType[maxStack]; Багш: Т.Гантөр
  • 15.
    Динамик массив  Динамикмассивыг зарлахдаа: Заагчийн нэр= new заагчийн төрөл [хэмжээ]  Жишээ: int maxStack=5; int * items; items = new ItemType[maxStack]; Багш: Т.Гантөр
  • 16.
    Динамик массив  Динамикмассивыг санах ойгоос чөлөөлөхдөө: delete [] Заагчийн_нэр;  Жишээ: delete [] items; Багш: Т.Гантөр
  • 17.
    Өгөгдлийн хийсвэр төрөл Програм бичих гэдэг нь бодит амьдрал дахь ямар нэг асуудлыг загварчлах ажил юм.  Гэвч аливаа асуудал нь маш ерөнхий бүрхэг байдаг учраас юуны өмнө уг асуудалд шаардлагатай ба шаардлагагүй зүйлсийг ялган тодорхойлох, улмаар асуудлын хийсвэр ойлголт буюу загварыг гарган авна.  Загварчлалын энэ процессыг хийсвэрлэлт гэж нэрлэнэ Багш: Т.Гантөр
  • 18.
    Өгөгдлийн хийсвэр төрөл Загвар нь • Уг асуудалд шаардлагатай өгөгдөлүүд • Уг өгөгдөлд хийгдэх үйлдлүүдээс тогтоно.  Өөрөөр хэлбэл хийсвэрлэлт гэдэг нь аливаа тавигдсан асуудлыг түүний өгөгдлүүдийг үйлдлүүдийн хамтаар загварчлахыг хэлнэ Багш: Т.Гантөр
  • 19.
    Өгөгдлийн хийсвэр төрөл Өгөгдөлүүдэд зөвхөн тэдгээрт хийгдэх үйлдлүүдээр хандана. Ийм шинж чанар бүхий загварчлалыг өгөгдлийн хийсвэр төрөл гэнэ.  Өгөгдлийн хийсвэр төрөл нь өгөгдлийг гадны орчноос далдалдаг ба зөвхөн үйлдэл нь гадна орчинтой холбогдон өгөгдөл хандах гүүр болж өгдөг.  Өгөгдлийн хийсвэр төрөл нь өгөгдөл болон тэдгээрт хийгдэх багц үйлдлүүдийг агуулдаг. Багш: Т.Гантөр
  • 20.
    Өгөгдлийн хийсвэр төрөл Өгөгдлийн бүтэц нь өгөгдөл, тэдгээрийн зохион байгуулалтаас гадна уг өгөгдлүүдэд хийгдэх үйлдлүүдээр тодорхойлогддог.  Өгөгдлийн бүтэц болон тэдгээрт хийгдэх үйлдлүүдийг загварчлах үйл явц нь ерөөсөө өгөгдлийн хийсвэр төрөл тодорхойлох үйл явц юм. Багш: Т.Гантөр
  • 21.
    Өгөгдлийн хийсвэр төрөл Өгөгдлийн хийсвэр төрлийг С++ програмчлалын хэлэнд классаар илэрхийлдэг.  Класс гэдэг нь нууцлагдсан өгөгдөл ба функцуудыг багцлан агуулсан өгөгдлийн нийлэл төрөл юм.  Классыг class нөөц үгээр тодорхойлно. Класст зарлагдсан хувьсагчдыг классын гишүүн өгөгдөл, класст зарлагдсан функцуудыг классын гишүүн функц гэнэ Багш: Т.Гантөр
  • 22.
    DynArray хийсвэр төрөл classDynArray{ int *a, len; public: DynArray(int length); ~DynArray(); int& operator[](int n); int size(); void resize(int length); void print(); }; Багш: Т.Гантөр
  • 23.
    DynArray хийсвэр төрөл DynArray::DynArray(intlength){ len=length; a=new int[len]; for(int i=0;i<len;i++) a[i]=0; } DynArray::~DynArray(){ delete []a; } Багш: Т.Гантөр
  • 24.
    DynArray хийсвэр төрөл int&DynArray::operator[](int i){ if ( i<0 || i>=len){ cout<<"Aldaa: "<<i<<" hemjee heterlee.n"; exit(0); } return a[i]; } int DynArray::size(){ return len; } Багш: Т.Гантөр
  • 25.
    DynArray хийсвэр төрөл voidDynArray::resize(int length){ if (len==length) return; int newlen=length; int *newa= new int[newlen]; int min=(newlen<len)? newlen:len; for(int i=0;i<min; i++) newa[i]=a[i]; for(i=min; i<newlen;i++) newa[i]=0; len=newlen; a=newa; } Багш: Т.Гантөр
  • 26.
    DynArray хийсвэр төрөл voidDynArray::print(){ for(int i=0; i<len;i++) cout<<a[i]<<","; cout<<endl; } Багш: Т.Гантөр
  • 27.
    DynArray хийсвэр төрөл voidmain(){ DynArray my(3); for(int i=0; i<3; i++)my[i]=i; my.print(); cout<<"hemjee: "<<my.size()<<endl; my.resize(5); cout<<"hemjee: "<<my.size()<<endl; my.print(); my[3]=3; my[4]=4; my.print(); my.resize(10); my.print(); my[7]=3; my[9]=4; my.print(); Багш: Т.Гантөр