Sunday, December 26, 2010

Стек, Stack загвар класс, стекийн хэрэглээ

Стек нь өгөгдөл хийх (оруулах) ба авах (гаргах) гэсэн үндсэн хоёр үйлдэлтэй шугаман бүтэц юм. Эдгээр үйлдлүүдийг стекийн орой гэгдэх зөвхөн нэг төгсгөлд гүйцэтгэдэг. Өөрөөр хэбэл, хамгийн сүүлд орсон элемент эхэлж гарах зарчмаар ажиллана. Стекийг "сүүлд орсон нь эхэлж гарах" LIFO (Last in, First out) жагсаалт ч гэж нэрлэх нь бий.
Стекийг массив болон жагсаалтаар нэвтрүүлж болдог.
Стек загвар класс
Гишүүн функцүүд:
empty: хоосон эсэхийг шалгана.
size: хэмжээг нь буцаана.
top: оройн элемент.
push: элемент оруулах.
pop: элемент гаргах.
эдгээр функцүүд бүгд public хандалттай.
Стекийг маш олон бодлогонд ашиглаж болно. Хамгийн өргөн ашигладаг жшиээ гэвэл илэрхийлэл бодох, хаалтны баланс тогтоох, тоог тооллын системүүдийн хооронд хөрвүүлэх г.м.
Хаалтны баланс тогтоох бодлогыг stack загвар класс ашиглан бодъё. Хаалтны баланс тогтоох гэдэг маань илэрхийлэлд орсон (), [], {} хаалтууд зөв логик дараалалтай орсон эсэхийг шалгана гэсэн үг. Жишээлбэл, 2*{10+5-3*(2*a[5] - 7)} гэвэл зөв баланслагдсан байна, харин 2*{10+5-3*(2*a[5] - 7}) тохиолдолд буруу.

Хаалт зөв баланслагдаагүй байх тохиолдлууд:
1. Хаах хаалт тааралдахад стек хоосон байх
2. Бүх тэмдэгтүүдийг уншиж дуусахад стек хоосон биш байх
3. Тухайн хаах хаалтны хувьд стекийн оройгоос авсан нээх хаалт нь харгалзахгүй байх.

#include <iostream>
#include <string>
#include <stack>
using namespace std;

int main() {
stack<char> st;
char ch[100], c;
int l, i;
bool ok = true;

string errorMessage = "";

cout<<" Ilerkhiillee oruulna uu?\n -> ";
gets(ch);
l = strlen(ch);
for(i=0; i<l; i++) {
if(ch[i] == '(' || ch[i] == '{' || ch[i] == '[')
st.push(ch[i]);
if(ch[i] == ')' || ch[i] == '}' || ch[i] == ']') {
if(!st.empty()) {
c = st.top();
if((c == '(' && ch[i] == ')') || (c == '{' && ch[i] == '}') || (c == '[' && ch[i] == ']'))
st.pop();
else {
ok = false;
errorMessage.push_back(c);
errorMessage.append("-iin khaakh khaalt buruu baina!");
break;
}
}
else {
ok = false;
errorMessage.push_back(ch[i]);
errorMessage.append("-iin neekh khaalt baikhgui baina!");
break;
}
}
}

cout<<"\n Khariu: ";
if(ok) {
if(!st.empty()) {
ok = false;
errorMessage.push_back(st.top());
errorMessage.append("-iin khaakh khaalt baikhgui baina!");
}
else
cout<<"Khaaltny balans zov baina";
}
if(!ok)
cout<<"Khaaltny balans buruu baina.\n Aldaa: "<<errorMessage;
cout<<"\n\n";
system("pause");
}

Wednesday, December 22, 2010

Жижигхэн хор

Windows-д сууриласан тухайлбал, MS-DOS, Windows XP, Windows Vista, Windows 7 үйлдлийн системтэй копмьютерт "CON" (кавичкагүй) нэртэй Фолдер яагаад үүсч чаддаггүйг Билл Гэйтс болон Майкрософт тайлбарлаж чадаагүйг та мэдэж байгаа байх. Гэвч комманд промптоор амархан үүсгэчдэг. Харин устгахдаа бас тийм аргаар л устгана. Энийг ашиглаж мангар олон CON фолдер үүсгэх вирусэнцэр хийж сууна. Хийх ч гэж дээ С++ дээр хэдэн мөр бичээд л CTRL+F9. (Залхуу хүрэхээрээ иймэрхүү хачин хобби хөдөлчдөг юм). Д дискэнд 200 ширхэг санамсаргүй нэртэй устдаггүй фолдер үүсээд л тэдгээрийн дотроос хэрэгтэй фолдероо хайгаад л... хөгжилтэй санагдаж байгаа биз?! Татаж аваад хэн нэгэнд илгээж хорлоорой!
Анти хорлогчийг эндээс аваарай.

Friday, December 17, 2010

Эрэмбэлэлт

Програм зохиох явцад эрэмбэлэх үйлдэл олонтаа тохиолддог. Эрэмбэлэлт нь өгөгдлүүдийг тодорхой дарааллаар (өсөхөөр эсвэл буурахаар) зохион байгуулах үйлдэл юм. Жишээлбэл,
A1<=A2<=A3<=...<=An, B1>=B2>=B3>=...>=Bn дарааллуудын хувьд A дараалал нь өсөхөөр, B дараалал нь буурахаар эрэмбэлэгдсэн дараалал байна. Хэрэв дурын дараалсан хоёр гишүүний хувьд < (эрс их), > (эрс бага) нөхцөлүүд биелэгдэж байвал харгалзан монотон өсөх, монотон буурах дараалал гэж нэрлэнэ. Өмнөх тохиолдолд (<=, >= нөхцөлүүд биелэх) монотон үл буурах, монотон үл өсөх дараалал болно. Эдгээрийн аль аль нь эрэмбэлэгдсэн дарааллын тохиолдол юм. Эрэмбэлэгдсэн өгөгдөл нь хайлтын процессыг хурдасгах ач холбогдолтой. 30 оюутантай ангийн журналаас Дорж гэдэг оюутны ирцийг харах шаардлага гарсан байг. Хэрэв оюутнуудын нэрс нь санамсаргүйгээр бичигдсэн бол бүх оюутнуудыг нэрийг эхнээс нь эхэлж унших шаардлага гарна. Харин эрэмбэлэгдсэн тохиолдолд Д-с өмнөх үсгүүдээр эхэлсэн нэртэй оюутнуудын нэрийг унших шаардлагагүй. Зөвхөн эхний үсгийг хараад л алгасаж явна.
Эрэмбэлэх маш олон аргууд байдаг. Энгийн, хүндэвтэр эрэмбэлэлтийн эрэмбэлэлтийн аргууд гэж ерөнхийд нь 2 ангилж болно.
Энгийн эрэмбэлэх аргууд:
- Сонгон эрэмбэлэх арга (Selection Sort)
- Оруулан эрэмбэлэх арга (Insertion Sort)
- Бөмбөглөн эрэмбэлэх арга (Bubble Sort)
- Индексээр эрэмбэлэх арга (Index Sort)
- Shell-ийн арга
Хүндэвтэр эрэмбэлэлтийн аргууд:
- Хурдан эрэмбэлэлтийн арга (Quick Sort)
- Сууриар эрэмбэлэх арга (Radix Sort)
- Хоёртын хайлтын модоор эрэмбэлэх (Binary Sort)
- Heap
- Нийлүүлэн эрэмбэлэх арга (Merge Sort)
зэрэг аргууд байдаг. Эдгээрээс гадна зарим програмчлалын хэлэнд шууд өөрөө эрэмбэлдэг сан, функцууд байдаг. Ж, С/C++ хэлний algorithm.h сангийн sort() функц нтр.
Эдгээр аргуудыг дараа нэг нэгээр нь тайлбарлаж, бодолтыг нь тавьж өгмой.
Мартсанаас эрэмбэлэлт нь амьдралд голдуу 1 эсвэл 2 хэмжээст хүснэгтэн дээр хийгдэнэ.

Wednesday, December 15, 2010

Pascal хэлний бичлэг төрөл

Янз бүрийн төрөлтэй өгөгдлүүдийг нэг өгөгдлийн төрөл мэт нэгэтгэсэн төрлийг бичлэг (Record) төрөл гэдэг. Түүний гишүүдийг талбар гэнэ. Бичлэг төрлийг RECORD END нөөц үгээр зарлана. (Бичлэг нь C/C++ хэлний struct гэсэн үг. Энэ талаар дараа бичинэ.)
Формат нь:
Type
нэр = Record
<Талбар1>: <Төрөл>;
<Талбар2>: <Төрөл>;
<Талбар3>: <Төрөл>;
...
<ТалбарN>: <Төрөл>
End;


Ижил төрөлтэй талбаруудыг ,-аар тусгаарлаж, жагсааж бичиж болно.
Жишээлбэл,
Type
myRecord = Record
k, h, a, i: integer;
r: arary[1.100] of real;
o: boolean;
s: string
End;
Бичлэг төрлийн хувьсагчийг ердийн хувьсагч зарлахтай адилхан зарладаг. Дээрхи myRecord төрлийн хувьсагчийг дараах байдлаар зарлана гэсэн үг.
myR: myRecord;
myRec: array[1.10] of myRecord;
Бичлэгийн талбаруудад хандахдаа, мөн утга олгохдоо бичлэг төрлийн хувьсагчийн ард . тавьж цэгийн ард нь талбарын нэрийг бичинэ. Ж, Printf(' k = ', myR.k); w := myRec[2].r[1]; myR.k := 10; myR.s := 'Good luck!', myRec[1].o := TRUE; г.м.
Мөн WITH оперторыг ашиглан бичлэгийн талбаруудад шууд утга олгож болно. Формат нь:
With <хувьсагч> do <оператор>;
Ж.
With myR do begin
k := 0;
s := 'Easy';
o := FALSE;
end;

Жишээ бодлого. N тооны хүний биеийн жин ба өндөр өгөгджээ. Энэ хүмүүсийг өндөр ба жингийн харьцаа нь хамгийн их байхаас нь эхлэн эрэмбэлж гарга.
Энэ бодлогыг Бичлэг ашиглаж бодъё.

Program Example_Record;

Type
People = record
m, h: integer;
end;

var
person: array[1..100] of People;
n, i, j: integer;
q: array[1..100] of real;
p: People;
qq: real;

begin
write(' n = ');
read(n);
for i:=1 to n do begin
writeln(' ', i, '-r khun');
write(' Jin: ');
read(person[i].m);
write(' Ondor: ');
read(person[i].h);
q[i] := person[i].h / person[i].m;
end;

for i:=1 to n-1 do
for j:=i+1 to n do
if q[i] < q[j] then begin
p := person[i];
person[i] := person[j];
person[j] := p;
qq := q[i];
q[i] := q[j];
q[j] := qq;
end;
for i:=1 to n do begin
writeln('');
writeln(' ', i, '-r khun');
write(' Jin: ');
writeln(person[i].m);
write(' Ondor: ');
writeln(person[i].h);
writeln(' Kharitsaa: ', q[i]:0:2);
end;
end.

Sunday, December 12, 2010

DotNet дээр Setup (Install) бэлдэх

1. Solution Explorer (default байрлал нь баруун дээд булан) цонхонд байгаа Project дээрээ (Solution'Project-ийн нэр' гэж байгаа) баруун клик.
2. Add -> New Project.
3. Project types буюу Project-ийн төрлүүд хэсгээс Other Project Types доторхи Setup and Deployment-ийг, Templates-ээс Setup-ийг сонгоод Name талбарт Setup-ынхаа нэрийг бичээд Ok.
4. Үндсэн Project-оо Build хийнэ.

5. Setup Project-ийн File System-ийн Application Folder дээр баруун клик.
6. Add -> File -> Project-ийн bin/Debug-д байгаа бүх файлыг идэвхжүүлээд Open.
7. Setup Project дээр баруу клик -> Build.

Өгсөн нэр бүхий прожектийн Debug фолдерт нь сетап прожектийн нэртэй ижил нэртэй суулгах EXE файл үүссэн байна. Энэ нь шаардлагатай DLL-үүдийг өөртөө агуулсан байдаг учраас ямар ч ПиСи-нд шууд суулгаж ашиглах боломжтой.
Хэрэв програмдаа өөрчлөлт оруулбал үндсэн прожектоо эхлээд Build хийгээд дараа нь сетап прожектоо Build хийнэ.

Thursday, December 2, 2010

Дөрвөлжин спираль

Натурал N тоо өгөгдсөн бол 1-ээс N*N хүртэлх натурал тоог дөрвөлжин спираль буюу дараах хэлбэрээр хэвлэ гэсэн бодлогыг 3 жилийн өмнө CODER дээр бодож байсан билээ.
Ж:
Одоо харин энэ бодлого Hit болжээ. Бүх сургуулийн бүх багш нар нь бүх програмчлалын хэл дээр бодуулж байх шиг байна. Энэ долоо хоногт л гэхэд 4 өөр сургуулийн 5 оюутан энэ бодлогыг бодуулсан гэж бод доо. Дахиж бодож өгөхгүй шүү, блогтоо тавьчъя. Харин жаахан явцуу код байж магадгүй. Эсрэгээрээ тэнэг хүн ч ойлгохоор энгийн.
За өөртөө хэрэгтэйг нь татаж ав.