Contenu connexe
Similaire à Dotnet lekts (20)
Plus de E-Gazarchin Online University (20)
Dotnet lekts
- 1. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐1‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
Лекц 1.
Сэдэв: .NET Framework ба C# хэл
Дэд сэдвүүд
1.1. .NET Платформ
1.2. .NET Фрэймворк
1.3. Хөрвүүлэлт ба MSIL
1.4. C# хэл
1.5. Класс, Объект, Төрөл
1.6. Програмаа хөрвүүлэх, ажиллуулах
1.1 .NET Платформ
2000 оны 7 сард Microsoft .NET платформыг албан ёсоор зарласан байна үүнтэй
хамт C# хэл зарлагдсан юм. .NET платформ нь 1990‐ээд оноос хойших Microsoft‐
н гаргасан олон технологиудыг нэг дор авчирсан, шинэлэг програмчлалын
интерфэйсүүдээр тоноглогдсон шинэ хөгжүүлэлтийн орчин болсон юм. Үүнд
COM+ сервисүүд, ASP вэб хөгжүүлэлт, XML болон объект хандлагат дизайн, мөн
SOAP, WSDL, UDDI зэрэг шинэ вэб үйлчилгээний протоколуудыг дурдаж
болно.
Платформ нь 4 тусдаа бүтээгдэхүүний бүлгээс тогтддог. Үүнд:
• Хөгжүүлэлтийн орчин: C#, J#, Visual Basic.NET зэрэг хэлүүд; Хөгжүүлэх
хэрэгсэл: Visual Studio.NET; Веб үйлчилгээ, виндоуз орчны програмууд
хийхэд зориулагдсан баялаг классын сан; Объектуудыг ажиллуулах
Common Language Runtime (CLR). Эдгээр нь бүхэлдээ платформын
томоохон хэсэг юм.
• Веб үйлчилгээ: Худалдааны вэб үйлчилгээнүүдийг хөгжүүлэх боломж
олгоно, мөн програм бүтээхэд нэг хэсэг нь болон ашиглагдаж болно
• Тусгай серверүүд: B2B худалдаа (Business‐To‐Business) худалдаа, и‐мэйл,
өгөгдлийн менежмент зэрэгт тусгайлан зориулагдсан BizTalk, Exchange,
SQL Server зэрэг сервер системүүд
• Төхөөрөмж: .NET нь үүрэн утаснаас эхлээд тоглоомын төхөөрөмжүүд
хүртэлх PC‐бус төхөөрөмжүүд дээр ажиллаж чадна
1.2 .NET Фрэймворк
.NET фрэймворк нь үйлдлийн системийн дээд талд ажиллах ба үйлдлийн
систем нь Windows ангиллын ямар ч үйлдлийн систем байж болно. Мөн .NET
систем нь онолын хувьд өөр үйлдлийн системүүд дээр ажиллах боломжтой,
- 2. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐2‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
тухайлбал Linux, MAC, Solaris зэрэг. Энэ чиглэлээр MONO нэртэй төсөл
амжилттай хийгдэж байна. Вэб хаяг нь http://www.mono‐project.com/Main_Page.
Зураг1‐1 .NET системийн архитектур
.NET фрэймворкын хамгийн чухал гишүүн бол CLR (Common Language
Runtime) юм, CLR нь програм ажиллах орчин болж өгдөг. CLR ийг Java
виртуаль машинтай адилхан гэж ойлгож болно. Виртуаль машин гэдэг нь
компьютерийн платформ болон хэрэглэгчийн програмын хооронд хиймэл
орчинг бүрдүүлж харилцан ажиллах боломж олгодог системийн програм юм.
CLR нь объектуудыг идэвхжүүлж, тэдгээр дээр шалгалт хийж, санах ойд
ачаалж, ажиллуулж, мөн тэдний ашиглахгүй орхисон санах ойн үлдэгдэлүүдийг
нь цэвэрлэж байдаг.
.NET фрэймворк нь дараахь хэсгүүдээс бүрддэг:
• Үндсэн хэлүүд1
: C#, J#, VB.NET, Managed C++, JScript.NET
• CLR ‐ энэ нь дээрх бүх хэлүүд хоорондоо хамтран ашиглах Windows
болон Веб хөгжүүлэлтэд зориулсан объект хандлагат платформ юм.
• Framework Class Library (FCL) гэж нэрлэгдэх хоорондоо хамаарал бүхий
классуудын сан.
.NET нь хэлний эрх чөлөөнөөс гадна хэлний нэгдмэл байдлыг хангадаг. Энэ нь
өөр өөр хэл дээр бичигдсэн классуудын хооронд удамшуулах, алдаа барих,
1 Мөн CLR дээр ажиллах COBOL, Python, Fortran, Smalltalk зэрэг олон тооны хэлүүд бий болсон
- 3. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐3‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
полиморф хийх давуу талтай юм. Энэ боломжийг Common Type System (CTS)
гэж нэрлэгдэх тодорхойлолтын тусламжтайгаар бий болгодог. Тухайлбал, .NET
дэх бүх зүйл нь System.Object гэж нэрлэгдэх язгуур классын объектууд юм. CTS
нь класс, интерфэйс, төлөөлөгч2, заалт төрөл3, үндсэн төрөл зэрэг ерөнхий
ухагдахуунуудыг өөртөө агуулдаг.
Мөн .NET нь хэл хоорондын нэгдмэл байдлыг хангахад зориулагдсан Common
Language Specification (CLS)‐г өөртөө агуулдаг. CLS нь .NET хэл байх хамгийн
доод шаардлагуудыг тодорхойлсон байдаг. FCL нь CLS‐тэй тохирдог ямар ч
хэлнээс ашиглаж болох классуудыг агуулсан сан юм.
.NET Фрэймворкын үндсэн классуудын санг Framework Class Library (FCL) гэх
ба энэ нь түүхэнд байсан томоохон классын сангуудын нэг болох юм. 5000‐аас
илүү тооны классуудыг өөртөө агуулсан FCL нь дэсктоп, клиент/сервер, вэб
үйлчилгээ болон бусад програм хангамжуудыг хөгжүүлэх ажлыг үлэмж
хөнгөвчилдөг.
FCL‐н доод түвшин болох үндсэн классуудын сан нь үндсэн оролт/гаралт,
тэмдэгт мөр боловсруулалт, хамгаалалтын менежмент, сүлжээний холболтууд,
параллель боловсруулалт, өгөгдлийн бүтцийн үйлдлүүд зэргийг дэмждэг.
Үүний дээрх давхарга нь өгөгдлийн менежмент, XML боловсруулалтыг дэмжих
зорилгоор үндсэн суурь классуудыг өргөтгөсөн классууд юм. Классууд нь
стандарт SQL хэлээр дамжуулан өгөгдлийг удирдах боломж олгодог, энэ
классуудын олонлогыг ADO.NET гэж нэрлэдэг. Мөн XML өгөгдөл боловсруулах,
XML хайлт хийх боломжтой классууд байдаг.
Өгөгдлийн болон суурь классуудыг өргөтгөж гурван өөр технологиор програм
хөгжүүлэхэд зориулж тоноглосон байна: Web Services, Web Forms, Windows
Forms. Вэб үйлчилгээний сан нь firewall болон NAT програмын асуудал
тулгарсан ч ажиллах чадвартай, сүлжээний орчны авсаархан үйлчилгээнүүдийг
хөгжүүлэхэд зориулсан классуудыг агуулна. Вэб үйлчилгээнүүд нь HTTP болон
SOAP протоколуудыг холболтдоо ашигладаг учраас энэ нь сүлжээний орон
зайд чөлөөтэй ажиллах боломжтой болгодог.
Web Forms болон Windows Forms сангууд нь веб болон виндоуз орчны програм
хангамжуудыг Хурдан Хугацаанд Хөгжүүлэх (Rapid Application Development)
боломж олгоно. Контролуудыг зүгээр л чирч тавих замаар програмын цонхон
дээр оруулж, double‐click хийж харгалзах үзэгдэл боловсруулалт хийх кодыг
бичнэ.
1.3 Х рв лэлт ба MSIL
2
delegate төрөл, C хэлний функцийн заагчтай төстэй
3
reference type – C# дахь бүх объектууд нь заалт төрөлд хамаарна
- 4. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐4‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
.NET‐д програмууд нь машины биелэгдэх код руу хөрвүүлэгддэггүй, харин
Microsoft Intermediate Language (MSIL) код руу хөрвүүлэгддэг, энэ нь CLR‐аар
ажиллах боломжтой тусгай код4 юм. C# хэлний үүсгэдэг MSIL (ихэвчлэн IL гэж
товчилдог) нь өөр хэлнүүдийн үүсгэдэг IL файлтай ижилхэн байдаг. Үүний
ачаар .NET нь хэл хамааралгүй платформ болж чаддаг.
Програмаа хөрвүүлэх үед C# код нь IL руу хөрвүүлэгддэг. IL нь диск дээр файлд
хадгалагдана. Програмаа ажиллуулах үед IL код нь Just In Time (JIT)
хөрвүүлэгчээр дахин хөрвүүлэгддэг (энэ процессыг ихэвчлэн JIT’ing гэж хэлдэг).
Үр дүнд нь машины код гарч машины процессор үүнийг биелүүлдэг байна.
Стандарт JIT хөрвүүлэгч нь идэвхжихэд бэлэн горимд ажилладаг. Програм
дуудагдсан үед JIT хөрвүүлэгч нь IL код дээр шинжилгээ хийгээд дараа нь
машинтай зохицон маш хурдтай ажиллах машины кодыг үүсгэдэг. JIT
хөрвүүлэгч нь програм ажиллаж байх үед код хөрвүүлэгдсэн эсэхийг таних
чадвартай учраас шаардлагатай үед л хөврүүлэлт хийгддэг. .NET програм
ажиллахдаа урьдчилан‐хөрвүүлэгдсэн кодыг дахин ашиглаж улам хурдтай
ажиллахыг тэмүүлдэг байна.
4 Java байт кодтой төстэй
- 5. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐5‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
Ассемблай гэдэг нь IL кодыг агуулсан Dynamic Link Library (DLL) эсвэл биелэх
файлыг (EXE) хэлнэ. Ассемблай бол програмын дахин ашиглагдах (reuse),
хувилбарлах (versioning), нууцлах (security), зөөвөрлөн байршуулах
(deployment) үндсэн нэгж нь юм. CLR нь ассемблайг удирдах классуудыг мөн
өөртөө агуулдаг.
1.4 C# хэл
C# бол шинэ хэл юм, гэхдээ сүүлийн хэдхэн жилийн дотор маш олон програм
зохиогчдын сонирхолыг татаж чадсан хэл юм.
Энэ хэл нь маш энгийн бөгөөд ердөө 80 түлхүүр үг, 12 үндсэн өгөгдлийн
төрөлтэй. Тийм боловч C# нь орчин үеийн програмчлалын асуудлуудыг
шийдэхэд маш тохиромжтой, үр бүтээмж өндөртэй хэл юм. C# нь C++ болон
Java хэлнээс удамшин үүссэн бөгөөд объект хандлагат, компонентод суурилсан,
бүтцийн програмчлалуудыг дэмждэг.
C# хэлийг Microsoft‐н инженерүүд болох Anders Hejlsberg, Scott Wiltamuth
нараар удирдуулсан цомхон баг хөгжүүлсэн юм. Hejlsberg нь хамгийн түгээмэл
PC хэл болох Turbo Pascal хэлийг үүсгэгчдийн нэг бөгөөд мөн Borland Delphi
хэлийг хөгжүүлсэн багийг удирдаж байсан юм.
C# програм бичиж эхлэх
Уламжлалт “Hello World” програмаа бичиж эхлэе. Доорх жижигхэн
програмаар C# хэлний түлхүүр онцлогуудыг гаргахыг оролдоё.
class HelloWorld {
static void Main() {
// системийн консоль объектыг ашиглаж байна
System.Console.WriteLine(“Hello World”);
}
}
HelloWorld –г хөрвүүлээд ажиллуулахад “Hello World” гэсэн текстийг консоль
(текст командын горимд ажилладаг) дээр харуулна. Энэ жижигхэн програм
дээр илүү дэлгэрэнгүй цааш авч үзэе.
1.5 Класс, Объект, Төрөл
Объект хандлагат програмчлалын үндэс суурь бол шинэ төрлүүдийн үүсэн бий
бололт юм. Төрөл гэдэг нь нэг зүйл юм. Зарим тохиолдолд зүйл гэдэг нь
өгөгдлийн хүснэгт, thread гэх мэт хийсвэр, зарим тохиолдолд цонхон доторх
товчлуур гэх мэт бодитой байдаг. Төрөл нь зүйлүүдийн ерөнхий нийтлэг шинж
чанар (property), авирыг (behavior) тодорхойлдог.
- 6. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐6‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
Жишээлбэл, програмд Help, Ok, Cancel гэсэн гурван товчлууртай гэж бодоё.
Эдгээр тус бүрдээ өөрийн хэмжээ, байрлал, гарчигтай. Мөн бүгд зурагдах,
идэвхжих, дарагдах гэх мэт нийтлэг авиртай. Иймээс хэдийгээр бие биенээсээ
ялгагдах боловч эд бүгдээрээ нэг төрлийнх юм.
Объект хандлагат прорамчлалын хэлэнд байдаг шиг C# ‐д төрөл нь классаар
тодорхойлогддог. Классын төлийг5 нь объект гэж нэрлэдэг.
“Hello World” програмд нэг төрөл тодорхойлогдсон байна, тэр нь HelloWorld
класс юм. C#‐д төрлийг классаар тодорхойлох ба class гэсэн түлхүүр үгийг
ашигладаг, тэгээд нэр өгнө ‐ энэ тохиолдолд нэр нь HelloWorld, дараа нь түүний
шинжүүд, авируудыг тодорхойлдог.
Методууд
Класс нь шинж чанар, авир хоёуланг өөртөө агуулдаг. Авир нь түүний гишүүн
методуудаар тодорхойлогддог. Шинж чанарыг дараагийн сэдвээр авч үзэе.
Метод гэдэг нь класс доторх функц юм. Заримдаа методыг гишүүн функц гэж
нэрлэдэг. Методууд WriteLine(), AddNumbers() гэх мэт нэртэй байна. Дээрх
жишээнд класс нь Main() гэж нэрлэгдэх тусгай нэртэй методыг агуулсан байна,
энэ тодорхойлолт нь классын үндсэн буюу эхний метод юм шүү гэдгийг CLR‐д
хэлж өгдөг. Програм ажиллаж эхлэхэд CLR нь Main() функцийг дууддаг. C#
програм болгон Main() методтой байх ёстой.
Зарчмын хувьд програмд хэд хэдэн Main() метод байж болох ба /main
директивыг ашиглан аль классын Main() метод нь тухайн програмын эхлэх цэг
болох вэ гэдгийг зааж болно.
Метод тодорхойлолт нь дараахь байдалтай.
int myMethod(int size);
Энэ тодорхойлолт нь myMethod нэртэй метод size хувьсагчаар дамжуулан нэг
параметерийг хүлээн авах ба бүхэл тоон утгыг үр дүн болгон гаргана гэдгийг
хэлж байна.
Зарим методууд үр дүн буцаадаггүй, энэ тохиолдолд түүнийг void буцааж байна
гэж хэлдэг. Жишээ нь:
void myVoidMethod( );
Тайлбар хийх
5 Instance – Төл, нэг хувь, нэг хуулбар
- 7. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐7‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
C# програм дотор мөн тайлбар бичигдэж болно.
// системийн консоль объектыг ашиглаж байна
Хоёр налуу зураасаар эхэлсэн мөр нь тайлбар гэдгийг илэрхийлдэг. Тайлбар нь
програм зохиогчийн бичсэн тэмдэглэгээ бөгөөд програмын ажиллагаанд нөлөө
үзүүлэхгүй. C# хэлэнд тайлбарыг гурван янзаар хийж болно.
Эхнийх нь, //‐аар эхлээд тухайн мөрийн төгсгөл хүртэл нэг мөр тайлбар байж
болно.
Хоёр дахь нь, /*‐ээр эхлүүлж */ –ээр дуусгаж олон мөр тайлбар хийж болно.
Гурав дахь нь, кодыг XML дээр суурилсан баримттай холбож тайлбар хийх
боломжтой байдаг. Үүнийг дараа үзнэ.
Консоль програм
“HelloWorld” програм нь консоль ангиллын програм юм. Консоль програм нь
товч, сонголт зэрэг хэрэглэгчийн график интерфэйс байхгүй, зөвхөн текст
өгөгдөл оруулах, гаргах үйлдлүүд хийгддэг програм юм (MS‐DOS
програмуудтай төстэй).
Дээрх програмд консоль руу гаралт нь Console классаар хийгдэж байна, Console
класс нь стандарт гаралт рүү текстийг хэвлэх WriteLine() методтой байдаг.
Методыг дуудахдаа (.) цэг үйлдлийг ашиглана.
Нэрмуж
.NET системийн классын санд ArrayList, Dictionary, Event гэх мэт хэдэн арав,
хэдэн зуун мянган нэрсүүд байдаг. Эдгээр нэрсийг ялгахад асуудал үүсдэг.
Програм зохиогч тэдгээр нэрсийг бүгдийг нь санаж чадахгүй, мөн аль нэг
нэртэй нь ижил нэртэй өөрийн гэсэн классыг үүсгэх үед асуудал гарна.
Тухайлбал, програм зохиогч өөрийн Dictionary нэртэй классыг үүсгэхийг хүсэж
болно, гэтэл энэ нь .NET‐д байдаг Dictionary классын нэртэй зөрчил үүсгэнэ,
учир нь класс бүр үл давхардах нэртэй байх ёстой байдаг.
Үүнийг шийдэх шийдэл нь нэрмуж6 юм. Нэрмуж нь тодорхой зүйлсийг нэгэн
нэрийн дор хамаатуулан утга учиртай нэрлэх боломж олгодог юм.
Том, жижиг сг д
C# хэлэнд нэрний үсгийн том, жижиг нь ялгаатай, ө.х writeLine ба WriteLine нь
ялгаатай юм. Тиймээс програмын код дахь хувьсагч, функц, тогтмолын
нэрсүүдийг тодорхой дүрмийн дагуу нэршиж занших нь зүйтэй.
6 namespace
- 8. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐8‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
static т лх р г
Өмнөх жишээн дэх Main() методод өөр нэг шинж ажиглагдаж байна, энэ нь static
гэсэн түлхүүр үгээр эхэлсэн байна. static түлхүүр үг нь Hello объектыг эхэлж
үүсгэлгүйгээр Main() методыг дуудаж болно гэдгийг илэрхийлнэ.
Програмаа х рв лэх, ажиллуулах
“HelloWorld” програмыг хөрвүүлэх олон арга байна. Нэг бол Visual Studio.NET
хөгжүүлэлтийн хэрэгслийн тусламжтай хөрвүүлж болно. Эсвэл C#‐ийн
командын мөрний хөрвүүлэгчийг ашиглан дараахь байдлаар хөрвүүлж болно.
1. Програмаа hello.cs нэртэйгээр хадгална
2. Командын цонхыг нээнэ (Start‐>Run гээд cmd гэж бичнэ)
3. Командын мөр дээр дараахь командыг бичнэ. (хөрвүүлэгчийн замыг
тодорхойлж өгөхийн тулд Path хувьсагчид .NET фрэймворкын замыг
зааж өгөх хэрэгтэй)
csc hello.cs
4. Програмаа ажиллуулахдаа Hello гэж бичээд ажиллуулна.
JIT (Just In Time) Хөрвүүлэлт
csc командыг ашиглан hello.cs кодыг хөрвүүлэхэд биелэх файл үүснэ. Энэхүү
.exe файл нь IL кодыг агуулна гэдгийг санаж байх хэрэгтэй.
Сонирхолтой нь, хэрэв энэ програмыг VB.NET юмуу өөр хэл дээр бичээд
хөрвүүлэхэд адилхан IL үүсэх болно. Өөр хэлнүүдээс үүссэн IL нь бараг ялгагдах
боломжгүй байдаг.
Хөрвүүлэгч нь IL код дээр нэмээд стандарт Win32 биелэх файлын толгойг .exe
файлын зөвхөн‐уншигдах хэсэгт оруулдаг.
- 9. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐9‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
Лекц 2.3
C# хэлний үндэсүүд
Дэд сэдвүүд:
• Үндсэн төрлүүд (тогтмол,хувьсагч, илэрхийлэл)
• Үйлдлүүд (энгийн, арифметик, жиших, нөхцөлт, логик үйлдэл, үйлдлийн
зэрэглэл)
• Заавар
Үндсэн төрлүүд
C# хэл нь хатуу төрөлтэй хэл юм. Хатуу төрөлтэй хэлэнд үүсгэж байгаа объект
бүрийн төрлийг заавал тодорхой заах ёстой. Ингэснээр хөрвүүлэгч тухайн
объектод тохирсон утгыг оноохыг шаарддаг, энэ нь мөн алдаа гаргахаас
сэргийлдэг. Өгөгдлийн төрөл нь хөрвүүлэгчид тухайн объектын хэмжээ (жнь,
int төрөл нь 4 байт объектыг заана), авируудыг мэдээлдэг (жнь, Button нь зурах,
дарах гэх мэт авиртай).
C#‐ийн төрлүүдийг хоёр ангилалд хуваана: үндсэн төрөл (value type), заалт төрөл
(reference type). Үндсэн төрөл болон заалт төрлийн хоорондох ялгаа бол санах
ойд утгуудаа яаж хадгалж байгаа арга юм. Үндсэн төрөл нь өгөгдлөө стект
хадгалдаг. Заалт төрлийн хувьсагчийн хаяг нь стект байрлана, харин жинхэнэ
объект нь хийпэд7 байрладаг.
Стек ба Хийп
Стек гэдэг нь “эхэлж орсон нь сүүлд гарах“ зарчмаар элементүүдийг хадгалдаг
өгөгдлийн бүтэц юм. Энд дурдсан стек нь локаль хувсагчидыг хадгалах санах
ойн мужийг хэлж байна.
C# хэлэнд үндсэн төрлүүд нь, жишээ нь integer, стект хувиарлагдах бөгөөд
хувьсагчийн нэр нь санах ойн хаягаа илэрхийлж байдаг.
Заалт төрлүүд нь (жнь, object) хийпэд хувиарлагддаг. Объект хийпэд
хувиарлагдах үед түүний хаяг нь буцаагдах ба энэхүү хаяг нь заалт болон
хувьсагчид оноогддог.
Хог цуглуулагч8 нь объектын зарлагдсан стек хүрээ дууссанаас хойш хэсэг
хугацааны дараа тэрхүү объектыг санах ойгоос устгадаг. Стек хүрээ гэдэг нь
үндсэндээ функцүүдээр тогтоогддог. Тухайлбал, функц дотор локаль хувьсагч
зарлавал уг функ ажиллаж дууссаны дараа үлдэгдэл цуглуулагч түүнийг устгах
ёстой гэдгийг ойлгох болно.
Хийп дэх объектуудын хувьд түүнийг зааж байгаа хамгийн сүүлийн заалт
7
Heap – санах ойн нэг төрлий н муж
8
Garbage collector
- 10. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐10‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
устсанаас хойш хэсэг хугацааны дараа уг объект үлдэгдэл цуглуулагчаар
устгагддаг.
C# хэлэнд орчин үеийн хэлэнд байвал зохих бүх үндсэн төрлүүд байдаг бөгөөд
эдгээр нь харгалзан .NET CLS төрөл рүүгээ бууж байдаг. C# төрлийг .NET рүү
харгалзуулсан буулгалт нь C# дээр үүсгэгдсэн объект өөр хэл дээр үүсгэгдсэн
объекттой харилцан ажиллах боломжийг олгодог.
Төрөл бүр санах ойд тогтмол хэмжээ эзэлдэг.
Төрөл Хэмжээ(байт) .NET төрөл Тодорхойлолт
byte 1 Byte Байт, 0‐255
char 1 Char Юникод тэмдэгт
bool 1 Boolean true эсвэл false
sbyte 1 Sbyte Тэмдэгтэй байт, ‐128 ‐ 127
short 2 Int16 Бага бүхэл тоо (‐32768 ‐ 32767)
ushort 2 Uint16 Тэмдэггүй бага бүхэл тоо, 0 ‐ээс 216‐1
int 4 Int32 Бүхэл тоо ‐(231‐1) –ээс (231‐1)
uint 4 Uint32 Тэмдэггүй бүхэл тоо, 0 ‐ээс 232‐1
float 4 Single Бодит тоо, ±1.5*10‐45 ээс ±3.4*1038
double 8 Double Давхар нарийвчлалтай бодит тоо, ±5.0*10‐324 ээс
±1.7*10308
decimal 8 Decimal 28 хүртэл цифртэй, тогтмол нарийвчлалтай
бутархай тоо. Энэ нь ихэвчлэн санхүүгийн
тооцоололд ашиглагддаг. “m” эсвэл “M” гэсэн
дагаваруудыг хэрэглэдэг.
long 8 Int64 Их бүхэл тоо, ‐9,223,372,036,854,775,808 ээс
9,223,372,036,854,775,807
ulong 8 Uint64 Тэмдэггүй их бүхэл тоо, 0 ээс 0xffffffffffffffff
Эдгээр үндсэн төрлүүдээс гадна C# хэлэнд enum ба struct гэсэн үндсэн төрлүүд
байдаг.
ндсэн т рл с сонгож хэрэглэх
Ерөнхийдөө ямар хэмжээтэй бүхэл тоон төрөл (short, int эсвэл long) сонгох вэ
гэдэг нь ямар хэмжээтэй өгөгдөл хадгалах вэ гэдгээс хамаарна. Жишээлбэл,
ushort төрөл нь 0‐ээс 65535 хүртэлх тоон утгыг хадгалж чадна.
Санах ой хангалттай байгаад онцын өөр шалтгаан байхгүй бол int төрлийг ихэнх
тохиолдолд хэрэглэх нь зүйтэй.
Тогтмол ба Хувьсагч
Хувьсагч гэдэг нь тодорхой төрөл бүхий санах ойн хадгалах үүр юм. Хувьсагчид
утга оноож болно мөн тэрхүү утга нь програмын ажиллах үед өөрчлөдөнө.
- 11. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐11‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
Хувсагчийг зарлахдаа түүний төрөл, нэрийг зааж өгөх ёстой. Хувьсагчийг зарлах
үед түүнд анхны утгыг оноож өгч болно.
class Values {
static void Main( ) {
int myInt = 7;
System.Console.WriteLine("Initialized, myInt: {0}", myInt);
myInt = 5;
System.Console.WriteLine("After assignment, myInt: {0}", myInt);
}
}
Энэ жишээн дээр myInt хувьсагчийг зарлах үедээ түүнд 7 гэсэн анхны утга
оноож байна, тэгээд түүний утгыг хэвлээд дараа нь 5 гэсэн утгыг дахин оноож
дахин хэвлэж байна.
WriteLine( )
Дээрх жишээнд WriteLine методын өөр нэг хэлбэрийг ашигласан байна. Энэ
жишээнд WriteLine метод нь 2 параметр хүлээн авах ба эхний параметр нь
өгөгдлийг хэвлэх форматыг “Initialized, myInt: {0}” хэлбэртэй гэж тодорхойлно,
хоёр дахь нь хэвлэгдэх хувьсагчийн нэр. Энд {0} бичиглэл нь эхний хувьсагч
гэдгийг заана.
C# хэл нь хувьсагчийн ашиглахын өмнө заавал утга оноосон байхыг шаардана.
Энэ дүрмийг шалгахын тулд myInt хувьсагчид утга оноолгүйгээр дээрх жишээг
өөрчилж үзэж болно.
class Values {
static void Main( ) {
int myInt;
System.Console.WriteLine("UnInitialized, myInt: {0}", myInt);
myInt = 5;
System.Console.WriteLine("Assigned, myInt: {0}", myInt);
}
}
Энэ програмыг хөрвүүлэх үед C# хөрвүүлэгч дараахь алдааг заана.
values.cs(6,55): error CS0165: Use of unassigned local variable 'myInt'
Тэгэхээр програм дахь хувьсагч бүрийг зарлахдаа анхны утга оноох ёстой юу?
Үгүй, заавал анхны утга оноох хэрэггүй, гэхдээ заавал ашиглахын өмнө утга
оноосон байх хэрэгтэй гэсэн үг.
- 12. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐12‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
class Values {
static void Main( ) {
int myInt;
myInt = 7;
System.Console.WriteLine("UnInitialized, myInt: {0}", myInt);
myInt = 5;
System.Console.WriteLine("Assigned, myInt: {0}", myInt);
}
}
Нэр
Хувьсагч нь нэртэй байх бөгөөд нэр нь үсгээр эсвэл доогуур зураасаар эхлэх
ёстой.
Нэрэнд үсгийн том, жижиг нь ялгаатай байдаг, myVariable ба MyVariable
нэрнүүд нь ялгаатай юм. C# хэлэнд өөрийн гэсэн тогтсон нэрлэх дүрэм байдаг,
хувьсагчдын хувьд Камель тэмдэглэгээ (жнь, someVariableName), метод болон
бусад нэрнүүдийн хувьд Паскаль тэмдэглээг (жнь, SomeFunction) ашигладаг.
Камель ба Паскаль тэмдэглээний ялгаа гэвэл Паскаль тэмдэглэгээнд нэр нь
том үсгээр эхэлдэг.
Нэр нь түлхүүр үгтэй адил байж болохгүй. Ө.х int эсвэл class гэсэн нэртэй
хувьсагчид байж болохгүй.
Тогтмол
Тогтмол гэдэг бол түүний утгыг нь өөрчлөх боломжгүй хувьсагч юм. Зарим
тохиолдолд хувьсагчийн утга өөрчлөгдөхгүй байх хэрэгцээ гардаг.
Тогтмол нь 3 хэлбэрээр байж болно: эх хэлбэрээрээ, нэрлэсэн тогтмол, тоочсон
тогтмол.
x = 32;
Энд 32 гэсэн тоо нь эх хэлбэрээрээ байгаа тогтмол юм. Ө.х 32‐н утга бол үргэлж
32 байна, 32‐д шинэ утга оноож чадахгүй, өөрчилж чадахгүй.
Нэрлэсэн тогтмол нь тогтмол утгад нэр оноосон хэлбэр юм. Дараахь байдлаар
ийм тогтмолыг зарлаж болно.
const type identifier = value;
Тогтмол нь зарлагдах үедээ анхны утга нь оноогдсон байх ёстой.
- 13. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐13‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
const int FreezingPoint = 32;
Энд 32 нь эх хэлбэрээрээ байгаа тогтмол, FreezingPoint нь нэрлэсэн тогтмол юм.
using System;
class Values {
static void Main( ) {
const int FreezingPoint = 32; // degrees Farenheit
const int BoilingPoint = 212;
Console.WriteLine("Freezing point of water: {0}", FreezingPoint );
Console.WriteLine("Boiling point of water: {0}",BoilingPoint );
//BoilingPoint = 21;
}
}
Тоочсон тогтмол
Тоочих төрөл нь тогтмолын өөр нэг хувилбар юм. Тоочих төрөл нь тодорхой
тооны нэрлэсэн‐тогтмолуудын олонлог юм. Өмнөх жишээн дэх
const int FreezingPoint = 32;
const int BoilingPoint = 212;
тогтмолууд дээр
const int LightJacketWeather = 60;
const int SwimmingWeather = 72;
const int WickedCold = 0;
тогтмолуудыг нэмэх хэрэгтэй гэж үзэе. C#‐д enum тоочих төрөл нь энэ
боломжийг олгоно.
enum Temperatures {
WickedCold = 0,
FreezingPoint = 32,
LightJacketWeather = 60,
SwimmingWeather = 72,
BoilingPoint = 212,
}
Ерөнхийдөө, тоочсон тогтмолыг зарлах хэлбэр нь дараахь байдалтай.
[attributes] [modifiers] enum identifier [:base-type] {enumerator-list};
attributes, modifiers –н тухай дараа үзнэ. base‐type нь тухайн тоочилтын суурь төрөл
нь юм. Хэрэв энэ заалтыг орхивол тухайн тоочсон утгуудыг integer байна гэж
ойлгодог. Мөн бусад тоон төрлүүдийг ашиглаж болно. Жишээ нь, ushort, uint
- 14. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐14‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
enum ServingSizes :uint {
Small = 1,
Regular = 2,
Large = 3
}
Тоочих төрөл дэх тогтмол бүр түүнд харгалзах тоон утгатай байдаг, хэрэв энэ
утгыг зааж өгөхгүй бол 0‐ээс эхлэн дараалуулан автоматаар өмнөх утга дээр
нэгийг нэмсэн утга олгогдох болно. Жишээ нь:
enum SomeValues {
First,
Second,
Third = 20,
Fourth
}
Энд First=0, Second=1, Third=20, Fourth=21 болох юм.
Тоочих төрөл нь хийсвэр төрөл юм, тиймээс тоочих төрөл болон бүхэл тоон
төрлийн хооронд хөрвүүлэлт хийх бол ил хөрвүүлэлт хийхийг шаарддаг.
Тэмдэгт м р тогтмол
Мөр тогтмол нь тэмдэгтүүдийн дараалал юм. Тэмдэгт мөр төрлийн хувьсагчийг
string түлхүүр үгээр зарлана.
string myString;
Тэмдэгт мөр утга нь давхар хашилтад хийгдэж бичигдэнэ:
“Hello World”
Анхны утга оноосон тэмдэгт мөр төрлийн хувьсагч:
string myString = “Hello World”;
Илэрхийлэл
Үр дүндээ утга гаргадаг хувьсагч, тогтмол, объект, үйлдлүүдийн дараалсан
нийлэмжийг илэрхийлэл гэдэг. Жишээлбэл, myVariable = 57 нь илэрхийлэл юм.
Учир нь энэ нь 57 гэсэн утгыг үр дүн болгон гаргаж байна. Энд (=) тэмдэгт нь
утга оноох үйлдэл юм (тэнцүүлэх үйлдэл биш!).
myVariable = 57 нь илэрхийлэл учраас өөр илэрхийлэл дотор мөн оролцож
болно.
- 15. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐15‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
mySecondVariable = myVariable = 57;
Энэ жишээнд 57 утга myVariable хувьсагчид оноогдож байна, энэ олголтын үр
дүн нь дахиад хоёр дахь хувьсагч болох mySecondVariable‐д оноогдож байна.
Илэрхийлэлд илүү сул зайнуудыг оруулж болно. Жишээлбэл,
myVariable = 5;эсвэл:
myVariable = 5;
Хөрвүүлэгч нь дээрх хоёр зааврыг адилхан гэж үзнэ. Гэхдээ энэ дүрэм нь
тэмдэгт мөр тогтмолын хувьд буруу болох юм. Ө.х “Hello World” ба “Hello World”
тэмдэгт мөрүүд нь ялгаатай.
Сул зайг ихэвчлэн програмыг уншихад илүү ойлгомжтой болгох зорилгоор
ашигладаг, хөрвүүлэгчийн хувьд энэ нь ялгаагүй зүйл.
йлдэл
Энгийн тооцоолол хийхэд олгох, нэмэх, хасах гэх мэт олон үйлдлүүдийг
ашигладаг.
Олгох йлдэл (=)
Энэ тэмдэгт нь олгох үйлдлийг төлөөлөх ба зүүн талд байгаа хувьсагчид баруун
талд байгаа утгыг олгоход хэрэглэгддэг.
Арифметик йлдл д
C# нь нэмэх (+), хасах (‐), үржих (*), хуваах (/), үлдэгдэл олох (%) арифметик
үйлдлүүдийг ашигладаг.
Хуваах үйлдлийн хувьд бүхэл 2 тоог хуваах үед ногдворын бүхэл хэсэг нь үр дүн
болж гарна. Жишээ нь, 17‐г 4‐д хуваахад үр дүн нь 4 болно (17/4=4 ба 1
үлдэгдэлтэй). Харин бодит тоог хуваах үед үр дүн нь бутархай тоо гарна.
Үлдэгдэл олох үйлдэл нь мөн тоог ямар нэг тоо өөр тоонд бүхлээр хуваагддаг
эсэхийг шалгахад хэрэглэгдэж болно. 80 % 10 = 0 учраас 80 нь 10‐д бүхлээр
хуваагдана.
Тооцоолоод олгох йлдэл
mySalary хувьсагчийн утгыг 5000‐аар нэмэгдүүлэх хэрэгтэй гэж бодоё. Үүнийг
mySalary = mySalary + 5000;
эсвэл
- 16. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐16‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
mySalary += 5000;
гэж бичиж болно. C#‐д тооцоолол хийгээд гарсан үр дүнг нь олгодог += (нэмээд
олгох), ‐= (хасаад олгох), *= (үржээд олгох), /= (хуваагаад олгох), %= (үлдэгдэл
олгох) операторууд байдаг.
Хувьсагчийн утгыг 1‐ээр нэмэгдүүлэх, хорогдуулах шаардлага олонтаа
тохиолддог, үүнд зориулж ++, ‐‐ үйлдлүүд бий. Жишээлбэл,
myAge++;
firstValue = secondValue++;
гэж хэрэглэж болно.
Эдгээр үйлдлүүдийг олгох үйлдэлтэй хамт хэрэглэсэн үед хувьсагчийн утгыг 1‐ээр
нэмсэний дараа нөгөө хувьсагчид гарсан үр дүнг олгох уу, эсвэл олгосны дараа
нь 1‐ээр нэмэгдүүлэх үү гэсэн асуулт гарна. Үүнийг шийдэхэд угтвар (prefix),
дагавар (postfix) бичиглэлүүдийг хэрэглэнэ.
firstValue = secondValue++; // postfix
firstValue = ++secondValue; // prefix
Угтвар, дагавар операторуудын ялгааг ойлгохын тулд дараахь жишээг харая.
using System;
class Values {
static void Main( ) {
int valueOne = 10;
int valueTwo;
valueTwo = valueOne++;
Console.WriteLine("After postfix: {0}, {1}", valueOne, valueTwo);
valueOne = 20;
valueTwo = ++valueOne;
Console.WriteLine("After prefix: {0}, {1}", valueOne, valueTwo);
}
}
Гарах үр дүн:
After postfix: 11, 10
After prefix: 21, 21
Н хц лт йлдэл
Ихэнх үйлдэл нэг юмуу хоёр илэрхийллийг холбогддог. Харин нөхцөлт үйлдэл нь
(?:) гурван илэрхийллийг холбодог.
cond-expr ? expr1 : expr2
- 17. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐17‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
Энэ үйлдэл нь cond‐expr нөхцөлд бичигдсэн илэрхийллийг үнэлээд хэрэв утга нь
үнэн бол expr1, худал бол expr2‐г үр дүн болгон гаргадаг.
class Values {
static void Main( ) {
int valueOne = 10;
int valueTwo = 20;
int maxValue = valueOne > valueTwo ? valueOne : valueTwo;
Console.WriteLine("ValueOne: {0}, valueTwo: {1}, maxValue: {2}",
valueOne, valueTwo, maxValue);
}
}
Гаралт:
ValueOne: 10, valueTwo: 20, maxValue: 20
Жиших йлдэл
Жиших үйлдэл нь хоёр утгыг харьцуулаад үнэн эсвэл худал (boolean) утга
буцаадаг оператор юм. Жишээ нь, эрс их (>) операторыг 5 > 2 гэж хэрэглэвэл үр
дүн нь true, 2 > 5 гэж хэрэглэвэл үр дүн нь false болно.
Нэр Оператор
Тэнцүүлэх ==
Тэнцүү биш !=
Их >
Их буюу тэнцүү >=
Бага <
Бага буюу тэнцүү <=
Логик йлдэл
Логик илэрхийллүүдийг9 холбоход логик үйлдлүүдийг ашигладаг.
Нэр Оператор
Ба &&
Эсвэл ||
Үгүйсгэл !
Жишээ нь, (x==3) && (y==7) энэ логик илэрхийлэл нь (x==3), (y==7) гэсэн хоёр логик
илэрхийллээс тогтсон бөгөөд БА (&&) логик үйлдлээр холбогдсон байна. Энэ
илэрхийллийн утга нь x нь 3‐тай тэнцүү бөгөөд y нь 7‐той тэнцүү байх үед үнэн
байна.
Богино үнэлэлт
9 үнэн эсвэл худал утга гаргадаг илэрхийлэл
- 18. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐18‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
Дараахь кодыг авч үзэе.
int x=8;
((x==8) || (y==12) ? expr1 : expr2)
Энэ илэрхийллийг үнэлэхэд x нь 8‐тай тэнцүү учраас үр дүн нь true гарна. Хоёр
дахь илэрхийллийг бодох шаардлага байхгүй. Ө.х y нь 12‐той тэнцүү байна уу,
тэнцүү биш байна уу гэдгээс хамаарахгүй. Мөн дараахь илэрхийллийг авч үзэе.
int x=8;
((x==5) && (y==12) ? expr1 : expr2)
Энэ тохиолдолд мөн л хоёр дахь илэрхийллийг үнэлэх шаардлагагүй, үр дүн нь
false утга гарах юм. Учир нь эхний x==5 илэрхийлэл false утга өгнө (&& үйлдэл нь
хоёр утга хоёулаа үнэн үед үнэн гардгийг санаарай).
Эдгээр тохиолдлуудад C# хөрвүүлэгч нь богино‐үнэлэлт хийдэг, ө.х хоёр дахь
илэрхийлэл дээр хэзээ ч үнэлэлт хийгдэхгүй.
йлдлийн зэрэглэл
Хөрвүүлэгч нь илэрхийлэл дэх үйлдлүүдийн биелэх дарааллыг мэддэг. Жишээ
нь,
myVar = 5 + 7 * 3;
Энэ илэрхийлэлд * үйлдэл нь + үйлдлээс өмнө үнэлэгдэх ёстой. Ө.х * үйлдэл нь
+ үйлдлээс өндөр зэрэглэлтэй байна.
Мөн нийлмэл илэрхийллүүд дотор хаалт хэрэглэн үйлдлүүдийн үнэлэх
дарааллыг өөрчилж болно.
Дараахь хүснэгтэд үйлдлүүдийн биелэх дарааллыг тодорхойллоо.
Ангилал Үйлдлүүд
Үндсэн (x) x.y f(x) a[x] x++ x—new typeof sizeof checked unchecked
Унар + ‐ ! ~ ++x —x (T)x
Үржих * / %
Нэмэх + ‐
Шилжүүлэх << >>
Жиших < > <= >= is
Тэнцүүлэх == !=
Бит Ба &
Бит XOR ^
Бит Буюу |
- 19. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐19‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
Логик Ба &&
Логик Буюу ||
Гурван байрт ?:
Олгох = *= /= %= += ‐= <<= >>= &= ^= |=
3. Заавар
Зааварууд нь ямар боловсруулалт хийхийг компьютерт зааварлана. Заавруудын
олонлогоос програм нь тогтоно. Заавар бүр цэгтэй таслалаар (;) төгсөх ёстой.
Жишээлбэл,
int x; // заавар
x = 23; // өөр заавар
int y = x; // бас нэг заавар
Зааврууд нь програмд бичигдсэн дарааллынхаа дагуу биелэгддэг: програм
ажиллахдаа хамгийн эхний заавраас эхлээд сүүлийн заавар хүртэл явдаг. Гэхдээ
энэ нь салаалах заавруудын тохиолдолд өөр болох юм. Хоёр төрлийн салаалах
заавар байдаг: нөхцөлт салаалах болон нөхцөлгүйээр салаалах.
Програмын биелэх дараалал нь мөн давтах заавруудаар өөрчлөгдөж болно.
Эдгээр нь for, while, do, in, foreach түлхүүр үгүүдээр тэмдэглэгддэг.
3.1 Н хц лт бус салаалах заавар
Нөхцөлт бус салаалалт нь хоёр замаар хийгдэж болно. Эхнийх нь метод дуудалт
юм. Програм ажиллаж байх үед метод дуудахад тухайн эгшинд ажиллаж
байсан методын биелэлтийг зогсоогоод шинэ “дуудагдсан” метод руу
салаалдаг. Тэр метод нь ажиллаж дуусаад утга буцаахад анхны методын
дараагийн мөрнөөс биелэлтийг үргэлжлүүлдэг.
using System;
class Functions {
static void Main( ) {
Console.WriteLine("In Main! Calling SomeMethod( )...");
SomeMethod( );
Console.WriteLine("Back in Main( ).");
}
static void SomeMethod( ) {
Console.WriteLine("Greetings from SomeMethod!");
}
}
Гаралт:
In Main! Calling SomeMethod( )...
Greetings from SomeMethod!
Back in Main( ).
- 20. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐20‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
Хоёр дахь зам нь нөхцөлт бус салаалах түлхүүр үгүүдийг ашиглах: goto, break,
continue, return, throw. Эдгээрийн тухай дараа дэлгэрүүлэн судлана.
3.2 Н хц лт салаалах заавар
Нөхцөлт салаалалт нь if, else, switch зэрэг түлхүүр үгүүдийн тусламжтай
хийгдэнэ. Өгөгдсөн нөхцөлөөс хамааран салаалалт хийгдэнэ.
3.2.1 If..else заавар
if..else заавар нь нөхцөлт салаалалт хийхэд ашиглагдана. Нөхцөл гэдэг нь логик
илэрхийлэл юм. Энэ илэрхийллийн утга үнэн үед if заавар доторх командууд
биелэнэ. if заавар нь else зааврыг агуулж болно, энд нөхцөл худал үед биелэх
командууд бичигдэнэ.
if (expression)
statement1
[else
statement2]
using System;
class Values {
static void Main( ) {
int valueOne = 10;
int valueTwo = 20;
if ( valueOne > valueTwo ) {
Console.WriteLine("ValueOne: {0} larger than ValueTwo: {1}",
valueOne, valueTwo);
}
else {
Console.WriteLine("ValueTwo: {0} larger than ValueOne: {1}",
valueTwo,valueOne);
}
}
}
Зааврын блок
Зааврын блок гэдэг нь { } хаалтуудаар хашигдсан заавруудын олонлог юм.
Тухайлбал,
if (someCondition) {
statementOne;
statementTwo;
statementThree;
}
- 21. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐21‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
гэж бичиж болно.
3.2.2 Давхар if заавар
Нийлмэл нөхцөлүүдийг боловсруулахын тулд if зааврыг үүрлүүлж хэрэглэж
болно. Жишээлбэл,
using System;
class Values {
static void Main( ) {
int temp = 32;
if (temp <= 32) {
Console.WriteLine("Warning! Ice on road!");
if (temp == 32) {
Console.WriteLine("Temp exactly freezing, beware of water.");
}
else {
Console.WriteLine("Watch for black ice! Temp: {0}", temp);
}
}
}
}
Програмын нь агаарын температур 32‐оос бага эсэхийг шалгаж байна. Хэрэв
тийм бол ʺWarning! Ice on road!ʺ гэсэн сэрэмжлүүлгийг хэвлэж байна. Дараа нь
32‐той тэнцүү эсэхийг шалгаж дараагийг мэдэгдлийг хэвлэж байна. Энд if
зааврыг if заавар дотор давхар хэрэглэсэн байна. Энд байгаа else заавар нь
температур 32‐оос эрс бага нөхцөлд биелэх юм.
Тэнцүүлэх оператор
C#‐д тэнцүүлэх оператор нь “==” ээр тэмдэглэгддэг.
if (temp == 32)
Үүнийг “=” утга олгох оператортай андуурч болохгүй.
3.2.3 switch заавар
Сэлгэх заавар нь угсраа if зааврын өөр нэг хувилбар нь юм, угсраа if заавар нь
уншихад их төвөгтэй байдаг. Олон нөхцөлөөс сонголт хийх тохиолдолд сэлгэх
зааврыг ашиглах нь илүү тохиромжтой юм. Сэлгэх зааврын логик нь тохирох
утгыг олох, тэгээд биелүүлэх юм.
switch (expression) {
- 22. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐22‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
case constant-expression:
statement
jump-statement
[default: statement]
}
Сэлгэх зааврын толгойд логик илэрхийлэл бичигдэнэ, case заавар бүрийн ард
тогтмол утга тавихыг шаардана. Энд эх хэлбэрээрээ тогтмол, нэрлэсэн
тогтмол, тоочих төрлийн тогтмолууд байж болно.
Case зааврын ард талын утга тохирсон үед харгалзах зааврууд биелэнэ, тэгээд
үсрэлт хийгдэх ёстой. Ерөнхийдөө, үсрэлт хийх заавар нь break юм. Эсвэл өөр
заавар руу шилжих шаардлагатай бол goto зааврыг ашиглаж болно.
using System;
class Values {
static void Main( ) {
const int Democrat = 0;
const int LiberalRepublican = 1;
const int Republican = 2;
const int Libertarian = 3;
const int NewLeft = 4;
const int Progressive = 5;
int myChoice = Libertarian;
switch (myChoice) {
case Democrat:
Console.WriteLine("You voted Democratic.n");
break;
case LiberalRepublican: // fall through
case Republican:
Console.WriteLine("You voted Republican.n");
break;
case NewLeft:
Console.Write("NewLeft is now Progressive");
goto case Progressive;
case Progressive:
Console.WriteLine("You voted Progressive.n");
break;
case Libertarian:
Console.WriteLine("Libertarians are voting Republican");
goto case Republican;
default:
Console.WriteLine("You did not pick a valid choice.n");
break;
}
Console.WriteLine("Thank you for voting.");
}
}
- 23. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐23‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
Энэ жишээнд улс төрийн бүлгүүдийг төлөөлсөн тогтмолууд тодорхойлсон
байна. Дараа нь myChoice хувьсагчид Libertarian утгыг оноосон байна. Хэрэв
myChoice нь Democrat ‐тай тохирч байвал харгалзах текстийг хэвлэнэ. Энэ
тохиолдолд break заавраар төгссөн байгааг ажиглаарай, энэ нь switch зааврын
гадна гарч дараагын зааврыг биелүүлэх юм.
LiberalRepublican утгын дор харгалзах заавар байхгүй байна, тийм учраас энэ нь
дараагийн заавар болох Republican руу “бууна”. Энэ нь сонгогдсон утга
LiberalRepublican эсвэл Republican байх үед Republican заавар биелэнэ гэсэн үг.
Өөр заавар руу шилжих шаардлагатай үед goto зааврыг ашиглаж болно. Хэрэв
аль ч тохиолдол нь таарахгүй бол default‐н ард бичигдсэн заавар биелэх болно.
Програм дараахь үр дүнг хэвлэнэ:
Libertarians are voting Republican
You voted Republican.
Thank you for voting.
Энэ жишээнд сонголт хийгдэх утга нь бүхэл тоон тогтмол байна. C# нь мөн
тэмдэгт мөр төрлийн утга дээр сонголт хийх боломж олгодог. Жишээ нь:
case “Libertarian”:
3.3 Давтах заавар
C#‐д үйлдлийг давтан гүйцэтгэхэд зориулсан for, while..do, do..while, foreach
зааврууд байдаг. C# нь мөн goto, break, continue, return үсрэх заавруудыг
хэрэглэх боломжтой.
3.3.1 goto заавар
Goto заавар нь бусад бүх давтах заавруудын үндэс нь юм. Гэхдээ энэ зааврыг
ашиглахгүй байх хэрэгтэй, учир нь энэ нь кодыг ойлгомжгүй болгодог, ийм
төрлийн програмыг “шпагетти” програм гэж хэлдэг. Ихэнхи туршлагатай
програм зохиогчид goto зааврыг ашиглахаас зайлсхийдэг, гэхдээ энд яаж
хэрэглэх тухай дурдая.
1. Тодорхой байрлалд хаяг (label) тодорхойлно
2. Дараа нь хаа нэг газраас энэ хаяг руу goto‐ээр үсрэнэ
using System;
public class Tester {
public static int Main( ) {
int i = 0;
- 24. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐24‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
repeat: // the label
Console.WriteLine("i: {0}",i);
i++;
if (i < 10)
goto repeat; // the dasterdly deed
return 0;
}
}
Хэрэв goto заавар олон ашигласан програмын командын биелэх дарааллыг
зурж үзвэл бие биен дээгүүрээ үсэрсэн, огтлолцсон шпагетти‐тэй төстэй дүр
зураг харагдана. Эндээс “шпагетти програм” гэсэн нэр томъёо үүссэн юм.
3.3.2 while давталт
while давталтын үндсэн санаа нь “энэ нөхцөл биелж байвал энэ ажлыг хий”
гэсэн утга юм.
while (expression) statement
Энд илэрхийлэл нь логик илэрхийлэл байх ёстой.
using System;
public class Tester {
public static int Main( ) {
int i = 0;
while (i < 10) {
Console.WriteLine("i: {0}",i);
i++;
}
return 0;
}
}
Энэ код нь өмнөх goto‐н жишээн дэх кодтой ижил үйлдэл хийнэ. Гэхдээ
програмын логик нь илүү ойлгожтой харагдаж байна. while заавар нөхцөл
худал үед нэг ч удаа биелэхгүй.
3.3.3 do..while давталт
Зарим тохиолдолд “үнэн үед үүнийг гүйцэтгэ” гэсэн өгүүлбэрээ “үүнийг
гүйцэтгэ, үнэн байх үед давт” гэж өөрчлөх хэрэг гарч болно. Ө.х үйлдэл эхлээд
хийгдэнэ, үүний дараа шалгалт хийгдэнэ. Энэ зорилгоор do..while давталтыг
ашиглаж болно.
do expression while statement
- 25. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐25‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
Жишээ нь,
using System;
public class Tester {
public static int Main( ) {
int i = 11;
do {
Console.WriteLine("i: {0}",i);
i++;
} while (i < 10);
return 0;
}
}
Энд i хувьсагчийн анхны утга 11 байна, тиймээс while дахь нөхцөл тохирохгүй,
гэвч давталт доторхи заавар нэг удаа ажиллах юм.
3.3.4 for давталт
Өмнөх давтах заавруудаас харахад дараахь хэв загварын зааврууд олон
тааралдаж байна: хувьсагчид анхны утга оноох (i = 0), нөхцөл шалгах (i < 10) , хэсэг
зааврыг биелүүлэх, мөн хувьсагчийн утгыг өөрчлөх (i++). For давталт нь энэ бүх
алхмуудыг нэг дор нэгтгэж өгдөг.
for ([initializers]; [expression]; [iterators]) statement
Жишээ нь,
using System;
public class Tester {
public static int Main( ) {
for (int i=0; i<100; i++) {
Console.Write("{0} ", i);
if (i%10 == 0) {
Console.WriteLine("t{0}", i);
}
}
return 0;
}
}
Энэ жишээнд 10‐д үлдэгдэлгүй хуваагдах тоонуудыг хэвлэж байна. Хэвлэхдээ
Console.Write методыг ашигласан байна, энэ нь WriteLine –тай адил боловч
шинэ мөрөнд шилжихгүй үргэлжлүүлж хэвлэдэгээрээ ялгаатай.
Энд зарласан i хувьсагч нь for давталтын хүрээн дотроо л үйлчлэх юм. Ө.х
дараахь мөрийг нэмбэл хөрвүүлэгч алдаа заах болно.
- 26. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐26‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
using System;
public class Tester {
public static int Main( ) {
for (int i=0;i<100;i++) {
Console.Write("{0} ", i);
if (i%10 == 0) {
Console.WriteLine("t{0}", i);
}
}
Console.WriteLine("n Final value of i: {0}", i);
return 0;
}
}
Сул зай ба Хаалт
Сул зай ба хаалтыг ямар байдлаар хэрэглэх нь програм зохиогчийн дурын
хэрэг боловч код уншихад хялбар байлгахыг бодох хэрэгтэй. Жишээлбэл,
for (int i=0;i<100;i++) {
Console.Write("{0} ",i);
if (i%10==0) Console.WriteLine("t{0}", i);
}
кодын нээх хаалтуудыг шинэ мөрөнд оруулж, үйлдлүүдийн хооронд сул зай
аван дараахь байдлаар бичиж болно.
for (int i=0; i<100; i++)
{
Console.Write("{0} ", i);
if (i%10 == 0)
{
Console.WriteLine("t{0}", i);
}
}
Энэ нь илүү уншихад ойлгомжтой бичиглэл юм.
3.3.5 foreach давталт
Энэ давталт нь C төрлийн програм зохиогчдын хувьд шинэ зүйл юм, гэхдээ
Visual Basic програм зохиогчдын хувьд танил байх. Энэ давталт нь массив болон
бусад өгөгдлийн бүтцийн бүх элементүүдээр давталт хийхэд хэрэглэгддэг.
foreach (type identifier in expression) statement
Жишээ:
- 27. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐27‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
using System;
public class Tester {
static void Main() {
int[] intArray;
intArray = new int[5];
// populate the array
for (int i = 0;i<intArray.Length;i++) {
intArray[i] = i;
}
foreach (int i in intArray) {
Console.WriteLine(i.ToString());
}
}
}
3.3.6 continue ба break зааврууд
Зарим тохиололд давталт доторх үлдсэн хэсгийг билүүлэлгүйгээр давталтыг
шинэчлэн эхлүүлэх шаардлага гардаг. continue заавар нь давталтын удирдлагыг
дахин эхэнд нь аваачиж биелүүлэхэд хэрэглэгддэг.
Мөн давталтыг таслан зогсоох боломжтой, үүнд break зааврыг ашиглаж болно.
break ба continue зааврууд нь кодыг олон гарцтай болгож унших болон засахад
төвөгтэй болгодог. Тиймээс бодолтой хэрэглэх хэрэгтэй.
Доорхи жишээ нь урсгалын дохио хянах програм юм. Дохиог гарнаас
Console.ReadLine методын тусламжтай оруулна.
Алгоритм нь энгийн: “0” дохио хүлээж авбал нөхцөл хэвийн байна гэсэн үг, арга
хэмжээ авах шаардлагагүй. Таслах дохио “A” хүлээн авсан үед боловсруулалт
шууд зогсоно. Бусад дохио авсан үед анхааруулга гарч арга хэмжээ авахыг
мэдэгдэнэ. “X” дохио хүлээн авсан үед анхааруулга хийж бөгөөд давталт
зогсоно.
using System;
public class Tester {
public static int Main( ) {
string signal = "0"; // initialize to neutral
while (signal != "X") { // X indicates stop
Console.Write("Enter a signal: ");
signal = Console.ReadLine( );
// do some work here, no matter what signal you receive
Console.WriteLine("Received: {0}", signal);
if (signal == "A") {
// faulty - abort signal processing
- 28. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐28‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
// Log the problem and abort.
Console.WriteLine("Fault! Abortn");
break;
}
if (signal == "0") {
// normal traffic condition
// log and continue on
Console.WriteLine("All is well.n");
continue;
}
// Problem. Take action and then log the problem and then continue on
Console.WriteLine("{0} -- raise alarm!n",signal);
}
return 0;
}
}
Нэр тодорхойлох
#define DEBUG заавар нь DEBUG нэртэй препроцессорт зориулсан тогтмол утга
үүсгэнэ. Мөн ийм зааврууд нь өөр кодноос using заавраар дагаж орж ирж болно.
#define DEBUG
//... ердийн код – препроцессорт хамааралгүй
#if DEBUG
// туршилт хийх үед хөрвүүлэгдэх, ажиллах код
#else
// туршилт хийгээгүй үед ажиллах код
#endif
//... ердийн код – препроцессорт хамааралгүй
Препроцессор ажиллах үед #define зааврын дагуу DEBUG нэрийг үүсгэнэ. Дараа
нь хэсэг ердийн кодыг алгасана, дараа нь #if‐#else‐#endif блоктой таарна.
#if заавар нь DEBUG нэртэй тогтмол зарлагдсан эсэхийг шалгаж байна, ийм нэр
өмнө үүссэн учраас #if ба #else –н хооронд бичигдсэн код програм руу
хөрвүүлэгдэнэ. Харин #else ба #endif‐н хоорондох код хөрвүүлэгдэхгүй. Ө.х энэ
хоорондох код нь эцсийн ассемблай файл дотор үүсэхгүй гэсэн үг.
#if ба #endif‐н хооронд бичигдээгүй бусад кодын хувьд препроцессорт хамаагүй
бөгөөд програм руу хөрвүүлэгдэх болно.
Үүсгэсэн нэрийг #undefine заавраар хасаж болно. Жишээ нь:
#define DEBUG
#if DEBUG
// энэ код хөвүүлэгдэнэ
#endif
- 29. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐29‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
#undef DEBUG
#if DEBUG
// энэ код хөрвүүлэгдэхгүй
#endif
Эхний #if биелэгдэнэ, дараагийнх нь биелэгдэхгүй. (DEBUG нэр байхгүй
болсон)
#if, #elif, #else, #endif
Препроцессорт олон сонголтоос сонгох заавар байхгүй, гэхдээ #elif, #else
заавруудаар орлуулж болно. #elif заавар нь else‐if гэсэн логиктой юм.
#if DEBUG
// compile this code if debug is defined
#elif TEST
// compile this code if debug is not defined
// but TEST is defined
#else
// compile this code if neither DEBUG nor TEST
// is defined
#endif
#region
#region заавар нь тайлбар бүхий текст мужийг тодорхойлдог. Энэ зааврар нь
Visual Studio гэх мэт хэрэгсэл ашиглах үед програмын кодын зарим хэсгийг
эвхэж зөвхөн тайлбарыг нь харуулахад хэрэглэгддэг. Жишээлбэл, доорх
жишээнд ийм кодын муж тодорхойлсон ба муж нь дэлгэгдсэн харагаж байна.
- 31. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐31‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
Лекц №4.5.6
Сэдэв: Класс ба Объектууд
Дэд сэдвүүд:
• Класс тодорхойлох
• Объект үүсгэх
• Статик гишүүд
• Объектыг устгах
• Параметер дамжуулах
• Метод болон байгуулагчыг дахин тодорхойлох
• Операторыг дахин тодорхойлох
• Өгөгдлийг далдлах – Проперти
Бид int, long, char гэх мэт үндсэн төрлүүдийг мэднэ. Програмчлалын хэл нь
програм зохиогчид шинэ, илүү нийлмэл төрлүүдийг үүсгэх боломжийг олгох
ёстой. C#‐д класс үүсгэж шинэ төрлүүдийг бий болгож болно.
Классын төлийг объект гэж хэлдэг. Програм ажиллаж байх үед объект нь санах
ойд үүсдэг. Класс ба Объектын хоорондох ялгаа бол нохойны тухай дүрслэл,
төсөөлөл ба жинхэнэ таны өмнө сууж байгаа нохой хоёрын хоорондох ялгаатай
болон ижил зүйл юм. Та нохойны дүрслэлтэй тоглож чадахгүй, зөвхөн бодит
нохойтой л чадна.
Dog класс нь “нохой ямар байдаг вэ” гэдгийг тодорхойлно: жин, өндөр, нүдний
өнгө, үсний өнгө гэх мэт. Тэд мөн идэх, явах, хуцах, унтах гэх мэт хийж чаддаг
авируудтай. Тодорхой нэг нохой, жишээ нь миний нохой, тодорхой жин (62
pounds), өндөр (22 inches), нүдний өнгө (black), үсний өнгөтэй (yellow). Тэр мөн
нохойнуудын хийж чаддаг бүх л зүйлийг хийж чадна.
- 33. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐33‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
Класс үүсгэх үед түүний бүх шинжүүд, авируудыг тодорхойлох ёстой. Дараахь
цаг хадгалах, хэвлэх жишээнд анхаарал хандуулая. Классын дотоод төлөв нь
одоогийн он, сар, өдөр, цаг, минут, секундыг дүрслэх чадвартай байх ёстой. Мөн
энэ класс нь цагыг хэвлэн харуулах чадвартай байх хэрэгтэй. Ийм классыг 6
хувьсагч, 1 методтойгоор тодорхойлоё.
using System;
public class Time {
// public methods
public void DisplayCurrentTime( ) {
Console.WriteLine("stub for DisplayCurrentTime");
}
// private variables
int Year;
int Month;
int Date;
int Hour;
int Minute;
int Second;
}
public class Tester {
static void Main( ) {
Time t = new Time( );
t.DisplayCurrentTime( );
}
}
Энэ жишээнд Main() метод дотор Time классын объектыг үүсгэж t хувьсагчид
оноосон байна. t нь Time классын объект учраас DisplayCurrentTime( ) методыг
ашиглаж болно гэсэн үг.
t.DisplayCurrentTime( );
3.1.1 Хандалт тодорхойлох
Хандалт тодорхойлох гэдэг нь тухайн классын гишүүн хувьсагч, методууд руу
ямар методууд хандаж болох вэ гэдгийг тодорхойлохыг хэлнэ.
Хандалт Хязгаарлалт
public Хязгаарлалт байхгүй. Public гэж тэмдэглэгдсэн гишүүд рүү ямар ч метод,
ямар ч классаас хандаж болно.
private Private гэж тэмдэглэгдсэн гишүүд рүү зөвхөн тухайн классын методууд
хандана
protected Protected гэж тэмдэглэгдсэн гишүүд рүү тухайн классын методууд ба
түүнээс удамшсан классын методууд хандана
internal Internal гэж тэмдэглэгдсэн гишүүд рүү тухайн классыг агуулж байгаа
ассемблай доторх бүх классуудаас хандах боломжтой
protected internal Ассемблай доторх бүх классуудаас хандахаас гадна тухайн классаас
- 35. “.NET програмчлал” хичээлийн лекцийн хураангуй
‐35‐ Боловсруулсан багш ММЗТэнхимийн ахлах багш,
магистр Б.Болормаа
Time t = new Time();
Үнэндээ, объектыг үүсгэх үед метод дуудагддаг юм. Энэ дуудагдах методыг нь
байгуулагч гэж нэрлэдэг. Байгуулагчыг нь класс дотор тодорхойлж өгөх ёстой,
эсвэл CLR үүнийг орлуулж хийж өгдөг. Байгуулагчын үүрэг бол классаар
заагдсан объектыг үүсгэх, түүнийгээ зөв төлөвт оруулах юм. Байгуулагч
ажиллахын өмнө объект нь тодорхой бус санах ойн муж байдаг, байгуулагч
ажилласны дараа зөв болж санах ойн муж эзэлдэг.
Байгуулагчийг тодорхойлохдоо классын нэртэй ижил медотыг тодорхойлдог.
Байгуулагч нь буцаах утгагүй байдаг ба ихэнхдээ public хандалттай байдаг.
Хэрэв аргумент авах шаардлагатай бол аргументуудыг зааж өгөх ёстой.
Time класс нь байгуулагч тодорхойлогдоогүй байна. Хэрэв байгуулагч байхгүй
бол хөрвүүлэгч default байгуулагчийг санал болгох ба энэ нь объектыг санах ойд
үүсгэнэ, гэхдээ өөр ямар нэг үйлдэл хийхгүй. Гишүүн хувьсагчдад нь тогтсон
(default) утгууд оноогдоно. Жишээлбэл үндсэн төрлүүдийн хувьд дараахь
байдалтай:
Төрөл Тогтсон утга
numeric (int, long г.м) 0
bool false
char ‘0’ (null)
enum 0
reference null
Time класст DateTime төрлийн нэг параметер хүлээн авах байгуулагч нэмж
бичие.
public class Time {
// public accessor methods
public void DisplayCurrentTime( ) {
System.Console.WriteLine(ʺ{0}/{1}/{2} {3}:{4}:{5}ʺ, Month, Date,
Year, Hour, Minute, Second);
}
// constructor
public Time(System.DateTime dt) {
Year = dt.Year;
Month = dt.Month;
Date = dt.Day;
Hour = dt.Hour;
Minute = dt.Minute;
Second = dt.Second;
}
// private member variables
int Year;
int Month;
int Date;
int Hour;