Өгөгдлийн төрлүүд

Юуны өмнө ОХП-ын хэлүүд болон C# хэлэнд байдаг тодорхой суурь ухагдхууны талаар ойлголтыг авах хэрэгтэй. ОХП-ын хэлэнд бараг бүх обьектууд өгөгдлийн төрлүүд байдаг.

  • Хувьсагч гэдэг нь төрөл бүрийн утгуудыг авч болдог дараа нь тэдгээрийг өөр төрлийн утгаар өөрчилж болдог хэлний элемент юм. Иймээс түүнийг хувьсагч гэж нэрлэдэг. Тогтмол утга гэж бас байдаг. Тогтмол утга нь хувьсагчаас ялгаатай нь өөрийн утгаа компиляц хийх үед ганц удаа аваад тухайн утгаа дахин өөрчилдөггүй. Хувьсагч гэдгийг ямар нэгэн зүйлийг эсхүл тухайн зүйл хаана байгааг заах мэдээллийг хадгалж болдог хайрцагтай зүйрлэж болно.
  • Өгөгдлийн төрөл гэдгийг хувьсагч авч болох утгуудын олонлог гэж ойлгоно. Хэрвээ бид хувьсагчийг бүхэл тоон төрлийнх гэж заавал түүнд зөвхөн бүхэл тоог эсхүл логик төрлийнх гэвэл зөвхөн логик утгыг авна гэсэн үг. Өөрөөр хэлбэл хувьсагч өөрийн төрөлд багтах утгуудын олонлогоос л утгаа авах ёстой гэсэн үг.
  • Обьект гэдэг нь хувьсагч авсан тодорхой утга эсхүл тухайн утгыг авах холбоосын утгыг хувьсагчид олгосонг хэлнэ. Энэ ойлголт нь ОХП-ын үндсэн гол ойлголт байдаг.

Өгөгдлүүдийн төрлүүдийн жишээ.

Дээрх зурагт өгөгдлүүдийн энгийн төрлүүдийн жишээг харууллаа. Хувьсагчид төрөл заан өгснөөр бид түүний авч болох утгуудын олонлогийг өгч байгаа юм. Хэрвээ хувьсагчид бүхэл тоон төрөл өгсөн бол бид түүнд бутархай тоо эсхүл логик утгыг олгож болохгүй зөвхөн бүхэл тоон утгыг л олгох ёстой. Үүнийг "төрлийн хатуу хяналт" гэж нэрлэдэг. C#, JAVA гэх мэт хэлүүд хатуу төрөлжсөн хэлүүдэд ордог. Та програмын коддоо хувьсагчийг ашиглахаасаа өмнө түүний төрлийг заан зарласан байх шаардлагатай. Програмчлалын зарим хэлүүд жишээ нь PHP хувьсагчийн төрлийг заавал заахыг шаарддаггүй.

Дадлагын ажил.

Програмчлалын хэлийг сурах хамгийн сайн арга бол практик. Бид практикийн ажилдаа Visual Studio 2015 -ын C# -ийн Console Application төрлийн төслийг ашиглана. Эхлэн суралцаж байгаа хүмүүст ийм төрлийн програм зохиох нь энгийн. Ийм програм зохиохын тулд Visual Studio боловсруулалтын орчингоо нээгээд File->New->Project гэж ороод нээгдэх цонхны зүүн талын самбарт Visual C# -ийн Windows сонголтыг хийгээд дунд самбараас Console Application төрлийг сонгоорой.

Visual Studio боловсруулалтын орчинг компьютерт суулгахад Visual C# -аас гадна Visual Basic, Visual F#, Visual C++ зэрэг хэлүүдийг цуг суулгадаг. Иймээс самбарын зүүн хэсэгт хэлний сонголтоо хийхээ мартуузай. Name талбарт өгсөн нэртэй ижилхэн Solution үүсгэнэ. Нэг Solution буюу шийдэл .NET фреймворк дэмжих өөр өөр хэл дээр хүртэл бичигдсэн олон төслийг агуулж болдог. Програмын тохиргоонуудаа хийж дуусаад OK товчийг дарахад Visual Studio орчин Console Application төрлийн төслийг үүсгэнэ. Төсөлд Program нэртэй классыг агуулсан доорх агуулга бүхий Program.cs гэсэн файлыг автоматаар оруулан ирнэ.

using System;

namespace Lesson1
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

Program класс Main гэсэн ганц аргатай бөгөөд энэ нь програмын эхлэлийн цэг юм. Програмын хувьд Main нэртэй статик арга ганцхан байж болно. Бусад програмын хэлнүүдийн адилаар C# -д өөрийн өгөгдлийн төрлийг зарлаж болно. Үүний тулд төсөлд _age гэсэн бүхэл тоон талбар бүхий Student гэсэн өгөгдлийн шинэ төрлийг зарлан өгье.

    public struct Student
    {
        public int _age;
    }

Өгөгдлийн төрлийг struct гэсэн түлхүүр үг зааж байгаа юм. Энэ нь бид утга олгогдох өгөгдлийн шинэ төрлийг үүсгэж байгааг компиляторт мэдэгдэнэ. Талбарын нэр доогуур зураасаар эхлэж байгаад анхаарна уу. Бид хичээлдээ "Унгар" тэмдэглэгээ гэж нэрлэдэг бичлэгийн дүрмийг ашиглана. Дүрмийн дагуу төрлийн талбарын нэрүүдийг доогуур зураасаар эхлээд араас нь жижиг үсгээр бичдэг. Ингэснээр төрлийн талбарыг локал хувьсагч, шинжүүдээс ялгахад амар болгоно. "Унгар" тэмдэглэгээнээс өөр програмын кодыг бичих "Camel" гэх мэтийн тэмдэглэгээнүүд бас байдаг. Код бичих аль нэгэн дүрмийг анхнаасаа хэвшил болгон ашиглаж сурах нь чухал. Одоо үүсгэсэн шинэ төрлөө програмдаа ашиглая. Үүний тулд эхлээд төрөлд тохирох хувьсагчийг

Student student = new Student();    

гэж үүсгэн өгнө. Дээрх мөр Student төрлийн student нэртэй хувьсагчийг үүсгэнэ. Бид хувьсагчийн нэрийг төрлийн нэртэй ижилхэнээр гэхдээ жижиг үсгээр өгсөн. C# -хэл том жижиг үсгийн ялгадаг учраас үүнийг алдаа гэж үзэхгүй. new Student(); хэсэг төрлийн байгуулагчийг дуудан түүний хувийг үүсгэн өгнө. Бид төрлийг үүсгэхдээ түүний байгуулагч аргыг бичин өгөөгүй хэдий ч C# -ийн бүх төрлүүдэд компилятор анхдагч байгуулагч аргыг автоматаар хэрэгжүүлэн өгдөг. Ийм болохоор дээрх мөр хувьсагчийг зарлаад зогсохгүй түүнд анхны утгыг олгох ажиллагааг хийж байгаа юм. Student төрлийн хувьсагч үүсгэсэн тул одоо түүний гишүүдэд хандах боломжтой болсон. Манай төрлийн _age гэсэн бүхэл тоон ганцхан талбарт доорх командаар утга олгоё.

student._age = 20;  

Шинэ төрлийг ингэж ашиглана. Энэ хүртэл бичсэн кодыг үзүүлбэл

using System;

namespace Lesson1
{
    public struct Student
    {
        public int _age;
    }

    class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student();
            student._age = 20;
        }
    }
}

байгаа. Төрлийг програмд хэрхэн ашиглахыг доорх кодоос харцгаая.

// ...
    class Program
    {
        static void Main(string[] args)
        {
            Student student = new Student();
            student._age = 20;

            Calculate(student);

            Console.WriteLine(student._age);
            Console.ReadLine();
        }

        static void Calculate(Student student)
        {
            student._age += 1;
        }
    }
// ...

Жишээнд Student төрлийн хувийг Calculate аргад параметрээр дамжуулсан байгаа. Calculate арга Student төрлийн нэг параметрийг хүлээн аваад түүний _age талбарын утгыг нэгээр нэмнэ. Програмын кодоос харвал бид эхлээд Student төрлийн student хувийг үүсгээд түүний _age талбарт 20 гэсэн утга олгоод дараа нь хувийг Calculate аргад дамжуулан талбарын утгыг нэгээр нэмээд үүний дараа талбарын утгыг дэлгэцэнд үзүүлэх болно. Энд бид 21 гэсэн утгыг хүлээн авна гэж бодож байгаа ч програмаа ажлуулбал

үр дүнг авах болно. Туршаад үзээрэй. Яагаад ийм үр дүнг авах болов. Програмын кодод багахан засвар оруулъя. Төрлийг зарлахдаа өгсөн struct түлхүүр үгийг class болгон өөрчлөе.

    public class Student
    {
        public int _age;
    }

Ингэснээр бид Student бүтцээр биш Student классаар тодорхойлогдсон өгөгдлийн төрлийг зарлаж байгаа юм. Програмаа дахин ажлуулбал

бидний хүлээж байсан үр дүнд хүрлээ. Ийм үр дүнд хэрхэн хүрснийг одоо тайлбарлая. Учир нь C# -хэлэнд стандарт болон байж болох бүх өгөгдлийн төрлүүд утгаар өгөгдөх өгөгдлийн төрлүүд, холбоосоор өгөгдөх өгөгдлийн төрлүүд гэсэн хоёр хэсэгт хуваагддаг. Бид жишээндээ Student төрлийг struct түлхүүр үгээр тодорхойлоход утгаар өгөгдөх харин class түлхүүр үгээр тодорхойлоход холбоосоор өгөгдөх өгөгдлийн төрлүүдийг үүсгэж байгаа юм.

Эдгээрийн ялгааг тайлбарлая. Ерөнхийдээ манай програмыг биелүүлэхэд ашиглагдах компьютерын санах ойг хоёр хэсэгт хуваан үзэж болно. Эхний хэсгийг "Стек" гэх бөгөөд 1 орчим мегабайт хэмжээний багахан хэмжээний санах ойг эзэлдэг. Програм ажиллагаандаа энэ хэсгийг хамгийн эрчимтэй ашигладаг. Хоёрдугаар хэсгийг "Удирдлагатай багц" гэж нэрлэнэ. Онолын хувьд энэ хэсэг компьютерын санах ойн боломжит бүх сул хэсгийг ашиглаж болох ба том обьектууд эсхүл хэмжээ нь тодорхойгүй обьектуудыг хадгалах зориулалттай. C# -хэлний утгаар өгөгдөх бүх төрлүүд "Стек"-д хадгалагдана. Ийм төрлийн хувьсагч, структурыг ямарч аргад параметрээр дамжуулахад стект байгаа төрлийг хуулбарладаг тул бид Main аргад student хувийг үүсгээд _age талбарт 20 утга олгоод хувийг Calculate аргад дамжуулсан хэдий ч үндсэн аргад үүсгэсэн хувь дамжигдахгүй харин түүний хуулбарыг үүсгэсэн болохоор програмын үр дүн 20 гэж гарч байгаа юм. Өөрөөр хэлбэл Main аргын student хувийн _age талбарт ямарч өөрчлөлт орохгүй. Үүнийг шалгахын тулд програмдаа төрлийг struct түлхүүр үгээр үүсгэсэн хэвээр үлдээгээд Calculate аргад _age талбарын утгыг дэлгэцэнд бичих командыг өгвөл 21, 20 гэсэн үр дүнг харна. C# -хэлэнд утгаар өгөгдөх төрлүүд олон байдаггүй ч эдгээрийг сайн мэдэж байх хэрэгтэй.
Харин холбоосоор өгөгдөх өгөгдлийн төрлүүдийн хувьд асуудал өөр. Бид ямарч нэгэн class -ийг үүсгэхэд тэр нь үнэн хэрэгтээ "Удирдлагатай багц" -д үүсгэгдэнэ. Харин "Стек" -т байрлах class -ийн хувь болох хувьсагчид тухайн обьектын холбоос л зөвхөн агуулагдана. Одоо бид энэ хувьсагчийг аргад параметр хэлбэрээр дамжуулан өгвөл бас л хуулбар үүсэх хэдий ч обьектын хуулбар үүсэхгүй харин түүний холбоосын хуулбар үүснэ. Харин холбоосууд "Удирдлагатай багц" -д байгаа нэг ижил обьектын холбоос учраас Calculate аргад _age талбарын утгыг өөрчилнө гэдэг нь "Удирдлагатай багц" -д байгаа обьектын талбарын утгыг өөрчилж байгаа хэрэг юм. Иймээс бид Student төрлийг class түлхүүр үгээр тодорхойлоход хүлээж байсан үр дүндээ хүрсэн. Үүнийг сайн ойлгон аваарай.
C# -хэлний өгөгдлийн бүх төрлүүд утгаар өгөгдөх, холбоосоор өгөгдөх гэж хуваагдахаас гадна энгийн ба энгийн бус өгөгдлийн төрлүүдэд бас хуваагдана. Үүнийг ойлгохын тулд доорх жишээг харцгаая.

   int myVar = 250;
   Student student = new Student();

Эхний мөрөөр бүхэл тоон төрлийн myVar хувьсагч зарлаад түүнд 250 гэсэн утга олгосон. Харин 2-р мөрөөр Student төрлийн student нэртэй хувьсагчийг new түлхүүр үгийг ашиглан үүсгээд төрлийн байгуулагчаар анхны утгыг олгож байгаа. .NET фреймворкийн компилятор new түлхүүр үг, байгуулагч аргыг ашиглахгүйгээр 1-р мөрөөр үзүүлсэнтэй адилаар хэсэг өгөгдлийн төрлийг зарлахыг дэмждэг. Гэхдээ 1-р мөрөөр зарлагдаж буй int төрлийн myVar хувьсагчийн цаана үнэндээ бол .NET фреймворкт стандартаар байдаг утгаар олгогдох struct төрлийн int32 төрөл байдаг. Иймээс манай кодын 1-р мөр доорх кодтой ижилхэн юм.

    Int32 myVar = new Int32();
    myVar = 250;

Хувьсагчийг ийм бичлэгээр зарлах нь ажиллагаа ихтэй учраас програмын кодыг хураангуйлах, ихээр ашигладаг төрлүүдийн өгөгдлийг удирдах ажиллагааг хөнгөн байлгах үүднээс энгийн төрлүүдийг оруулсан. new түлхүүр үг, байгуулагч аргыг ашиглахгүйгээр зарлаж болох төрлүүдийг энгийн төрлүүд гэж нэрлэдэг. C# -д ашигладаг өгөгдлийн энгийн төрлүүд ба тэдгээрийн .Net фреймворк дэх харгалзааны жагсаалтыг доорх зургаас харна уу.

Өгөгдлийн энгийн төрлүүд заавал бүтэц /structure/ эсхүл утгаар өгөгдөх төрлүүд байх албагүй гэдгийг дурдая. Хүснэгтийн доод хэсэгт байгаа string, object, dynamic төрлүүд бол холбоосоор өгөгдөх төрлүүд буюу классууд болно.
Програмчлалын хэлийг үзэхэд тухайн хэлний өгөгдлийн төрлүүдийг сайн ойлгож авах нь маш чухал суурь байдаг тул хичээлийн материалыг сайтар ойлгон авахыг хичээгээрэй.

Мэдээлэл таалагдсан бол найзуудтайгаа хуваалцаарай.

  Нээгдсэн тоо: 44 Төлбөртэй

Делегат нь аргыг заасан обьектоор илэрхийлэгдэнэ. Өөрөөр хэлбэл делегат гэдэг нь аргын заагч бөгөөд түүгээр тухайн аргыг дуудаж болно.

Делегатийн тодорхойлолт

Делегатийг зарлахдаа delegate түлхүүр үгийг ашиглах ба түүний араас буцаах төрөл, нэр, параметрүүд байрлана. Жишээ нь

delegate void Message();

Message делегатийн буцаах төрөл void (өөрөөр хэлбэл юу ч буцаахгүй) бөгөөд ямарч параметрийг авахгүй. Энэ нь Message делегат ямарч параметр авдаггүй бөгөөд юу ч буцаадаггүй дурын аргыг зааж болно гэсэн үг.
Message делегатийн хэрэглэгээг

Message mes;            // 2. делегатийн хувьсагчийг үүсгэх
mes = Hello;            // 3. хувьсагчид аргын хаягийг олгох
mes();                  // 4. аргыг дуудах

void Hello() => Console.WriteLine("Hello World");
delegate void Message(); // 1. делегатийг зарлах

үзүүлсэн дээрх кодийг авч үзье.

  Нээгдсэн тоо: 223 Төлбөртэй

Өмнөх хичээлүүдэд int, byte, double, string, object гэх мэтийн өгөгдлийн төрлүүдийг үзсэн. Үүний зэрэгцээ структур, тооллого /enum/, класс зэрэг нарийн төрлүүдийг ч үзсэн. Энэ бүх төрлүүдийг утгын төрлүүд (утгатай төрлүүд ч гэж бас нэрлэдэг) (value types) ба холбоосын төрлүүд (reference types) гэсэн ангилалд хувааж болно. Эдгээрийн ялгааг ойлгох нь чухал.

  Нээгдсэн тоо: 114 Төлбөртэй

Програмчлалын хэлийг судлаад код бичих нэг их хүнд биш. Харин сайн код бичнэ гэдэг нь хүндхэн асуудал. Хэлийг эхлэн суралцагсад код бичих дээр түлхүү анхаарсанаас болоод цэгцтэй, зохион байгуулалт сайтай, өргөжүүлэх болон дэмжлэг үзүүлэхэд хөнгөн буюу өөрөөр хэлбэл сайн код бичих тал дээр нэг их анхаардаггүй. Энэ нь программийн бүтээгдхүүний загварчлалтай илүү холбоотой зүйл юм. Манайхан програмийн загварчлал хийхгүйгээр асуудлыг кодлогчид шууд өгөөд хурдан хийлгэх гэдэг. Энэ нь эцэстээ зөвхөн ажилладаг л кодийг бичүүлэхэд хүргэдэг. Ийм кодийг цаашид хөгжүүлэх болон дэмжихэд нэн хүндрэлтэй буюу бараг боломжгүй болгодог. Иймээс програмчлалын хэлний боломжуудыг маш өргөн судлан мэдэхийг зөвлөе. Програмыг загварын дагуу кодлоход таниас тухайн хэлний боломжуудыг зөв оновчтой ашиглахыг шууд шаардах болно.

  Нээгдсэн тоо: 271 Төлбөртэй

Мэдээллийн технологийн салбарын хөгжлийг дагаад кодлогчийн хэрэгцээ жилээс жилд өссөөр байна. Програмийн кодлогч болоход туслах зорилгоор сайтад орчин үед өндөр эрэлттэй байгаа хэлүүдийн хичээлүүдийг цувралаар оруулсаар байх болно. Аливаа зүйлийг сурах суурь бол таны хүсэл эрмэлзлэл гэдгийг Суралцах хир хэцүү вэ? нийтлэлийг уншаад эргэцүүлэн бодоорой.

Хичээлээр консолоос өгөгдөл оруулах, консолд өгөгдлийг үзүүлэхийг судлах болно.

Консолийн гаралт

Өмнөх хичээлүүдэд консолд мэдээлэл үзүүлэхдээ компиляторын Console.WriteLine аргыг хэрэглэсэн. Хэрвээ консолд мэдээллийг гаргах хэрэгтэй түүнийг Console.WriteLine аргад дамжуулах хэрэгтэй. Жишээ нь төслийн Program.cs файлд

string hello = "Сайн уу Монгол";
Console.WriteLine(hello);
Console.WriteLine("C# -д тавтай морил!");
Console.WriteLine("Баяртай Монгол...");
Console.WriteLine(24.5);

командуудыг (statement) өгөөд төслийг ажлуулбал консолд

гэж харуулна.

Кодийн сайжруулалт /рефакторинг/ хичээлээр програмийн кодоо react -ийн зарчимд нийцүүлэн компонентод салгасан.…

Нээгдсэн тоо : 9

 

Хадгалагч (Memento) хэв обьектын дотоод төлвийг түүний гадна гаргаж дараа нь хайрцаглалтын зарчмыг зөрчихгүйгээр обьектыг сэргээх боломжийг олгодог.

Нээгдсэн тоо : 18

 

Делегаттай нэргүй арга нягт холбоотой. Нэргүй аргуудыг делегатийн хувийг үүсгэхэд ашигладаг.
Нэргүй аргуудын тодорхойлолт delegate түлхүүр үгээр…

Нээгдсэн тоо : 17

 

Математикт харилцан урвуу тоонууд гэж бий. Ямар нэгэн тооны урвуу тоог олохдоо тухайн тоог сөрөг нэг зэрэг дэвшүүлээд…

Нээгдсэн тоо : 28

 

Төсөлд react-router-dom санг оруулан чиглүүлэгчдийг бүртгүүлэн тохируулсан Санг суулган тохируулах хичээлээр бид хуудас…

Нээгдсэн тоо : 28

 

Хуваах нь нэг тоо нөгөө тоонд хэдэн удаа агуулагдаж буй тодорхойлох арифметикийн үйлдэл.
Хуваалтыг нэг бус удаа…

Нээгдсэн тоо : 28

 

Зуучлагч (Mediator) нь олон тооны обьектууд бие биетэйгээ холбоос үүсгэхгүйгээр харилцан ажиллах боломжийг хангах загварчлалын хэв юм. Ингэснээр…

Нээгдсэн тоо : 26

 

Делегатууд хичээлд ухагдхууны талаар дэлгэрэнгүй үзсэн ч жишээнүүд делегатийн хүчийг бүрэн харуулж чадахааргүй байсан.…

Нээгдсэн тоо : 39

 

react програмд олон хуудас үүсгэн удирдахын тулд react -ийн бүрэлдхүүнд ордоггүй ч түүнтэй нягт холбоотой ажилладаг нэмэлт пакетийг…

Нээгдсэн тоо : 44

 
Энэ долоо хоногт

функц өгөгдөв.

  1. f(x) функцын x0=5 абсцисстай M цэгт татсан шүргэгч шулууны тэгшитгэл
  2. f(x) функцын график, дээрх шүргэгч шулуун болон координатын тэнхлэгүүдээр хүрээлэгдсэн дүрсийн талбай  
  3. f(x) функцын графикийг M цэгт шүргэх, төв нь OX (абсцисс) тэнхлэг дээр орших тойргийн тэгшитгэл

Нээгдсэн тоо : 2767

 

илэрхийллийн a=36,7 тэнцүү байх утгыг ол.

Нээгдсэн тоо : 660

 

a ба b нь 3x2-x-1=0 тэгшитгэлийн шийдүүдтэй тэнцүү бол илэрхийллийн утгыг ол.

Нээгдсэн тоо : 693