Dsi lec5
- 1. Лекц №5
Санах ойн динамик
хуваарилалт ба өгөгдлийн
хийсвэрлэлт LOGO
- 3. Санах ойн динамик хуваарилалт
Статик хувьсагчид нь програмыг ажиллаж
эхлэхэд санах ойд хуваарилагдан, тогтмол
зайн эзлэн байрлах бөгөөд програмыг
ажиллаж дуусахад санах ойгоос
чөлөөлөгддөг.
Програмын биелэлтийн явцад хувьсагчид
зориулан санах ой хуваарилж болдог.
Багш: Т.Гантөр
- 4. Санах ойн динамик хуваарилалт
Програмын биелэлтийн явцад санах ойн мужид
хувьсагчдад зориулан шинээр зай нөөцөлж, мөн
чөлөөлж болдог.
Ийм хувьсагчдыг динамик хувьсагч, үүссэн
санах ойн мужийг динамик муж гэж
нэрлэдэг.
C++ хэлэнд динамик хувьсагчийг санах ойд
хуваарилах болон санах ойгоос
чөлөөлөхдөө new болон delete
операторуудыг харгалзан ашиглана.
Багш: Т.Гантөр
- 5. Санах ойн динамик хуваарилалт - new
New оператор нь аргументаараа авсан төрлийн
өгөгдийг хадгалахад хүрэлцэхүйц зайг динамик
санах ойгоос нөөцлөн, түүний хаягийг буцаадаг.
New оператороор хуваарилагдсан хувьсагчид нь
санах ойн heap мужид байрлана.
Динамикаар хуваарилагдсан хувьсагч нь нэргүй
байдаг бөгөөд шууд хаяглагдаж чаддаггүй.
Тиймээс new оператороос буцаасан заагч
төрлийн утгаар шууд бусаар хаягладаг.
Багш: Т.Гантөр
- 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;
Багш: Т.Гантөр
- 11. Санах ойн динамик хуваарилалт - delete
Delete оператор нь нөөцөлсөн зайг чөлөөлдөг ба
уг санах ойн байрлалыг дахин ашиглах
боломжтой болгоно.
Санах ойн ашиглалтыг сайжруулах, програмын
найдвартай ажиллагааг хангах үүднээс new
оператороор нөөцөлсөн санах ойн хэсгийг
ашиглаж дууссаны дараа delete оператороор
чөлөөлж байх хэрэгтэй.
Багш: Т.Гантөр
- 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 хийсвэр төрөл
class DynArray{
int *a, len;
public:
DynArray(int length);
~DynArray();
int& operator[](int n);
int size();
void resize(int length);
void print();
};
Багш: Т.Гантөр
- 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 хийсвэр төрөл
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;
}
Багш: Т.Гантөр
- 27. 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();
Багш: Т.Гантөр