Програм зохиох жишээ 1

Практикгүй онол бол хоосон зүйл гэж ярьдаг. Иймээс энэ хичээлээр .NET Framework -ийн стандарт сан WinForms -ийг ашиглан бүрэн хэмжээний програмыг зохиох болно. Хичээлийн зорилго бол өмнөх хичээлүүдэд үзсэн бүх аргчлалуудыг практикт хэрхэн ашиглахыг сурах юм. Эдгээрээс  интерфейсийг ашиглахыг түлхүү үзэх болно. Бидний зохиох програм бол энгийн текст засварлагч байх бөгөөд дараах зүйлсийг хийдэг байхаар боловсруулагдана.

Үүнд:

  1. Текстэн файлыг нээх
  2. Файлын агуулгыг засварлах
  3. Засварлахаар нээгдсэн файлын тэмдэгтийн тоог үзүүлэх
  4. Файлд оруулсан өөрчлөлтийг хадгалах
  5. Файлын агуулгын текстийн фонтын хэмжээг ихэсгэх ба багасгах боломж

Эдгээрийг бид програмын техникийн даалгавар гэж үзэж болох юм. Ингээд програм зохиох ажлаа эхлэе.

Visual Studio дээр төсөл /project/ үүсгэх

Visual Studio -г нээгээд File->New->Project гэж ороход нээгдэх New Project цонхонд зурагт үзүүлснээр тохиргоо хийгээд Ok товчийг дарна.

Төслийн нэрийг TextEditor гэж өгье. Location талбарт төслийг хадгалах хавтасны нэрээ сонгон өгч болно. Ok товчийг дарахад Windows програмын суурь хэвээр төслийг үүсгэнэ.

Ажлын цонх хэсэгт форм, програмын кодын засвар гээд үндсэн ажлуудыг гүйцэтгэнэ. Solution Explorer цонхонд таны төслийн агуулга харагдана. Ажлын дэлгэц дээрх цонхнуудыг View цэсийг ашиглан удирдаж болно. Visual Studio -той ажиллах нь ердийн Windows програмтай ажиллахтай төстэй тул ажиллаж сурахад амархан. Иймд Visual Studio -гийн ажиллагааны талаар хичээлд нарийн авч үзэхгүй. Шаардлагатай зүйлийг тухай бүрд нь тэмдэглээд явна. Нэг шийдэл буюу Solution -д олон төслүүд байж болдог. Одоо манай шийдэлд Windows орчинд шууд ажиллах exe өргөтгөлтэй файл болон компиляц хийгдэх TextEditor гэсэн нэг төсөл байгаа. Бидэнд бас нэгэн төсөл хэрэгтэй. Үүний тулд Solution -ний нэр дээрээс баруун даралт хийхэд гарч ирэх цэснээс Add->New Project командыг өгөхөд шинэ төсөл үүсгэхтэй ижилхэн шинэ төсөл нэмэх цонх нээгдэнэ. Цонхны дунд хэсгээс төслийн төрлийг Class Library гэж сонгоод төслийн нэрийг TextEditor.BL гэж өгье. Ингэснээр манай шийдэл доорх бүтэцтэй боллоо.

Шийдэлд багтсан хоёр төслийн TextEditor нь манай програмын хэрэглэгчид ашиглах төрөл бүрийн удирдах элементүүдийг харуулах интерфейсийн үүргийг гүйцэтгэнэ. Хоёрдахь төсөл TextEditor.BL -нь програмын логикийг агуулсан DLL сан байх юм. Өөрөөр хэлбэл програмын техникийн даалгаварт заагдсан функцуудыг хэрэгжүүлнэ. Програмын хэрэглэгчийн интерфейсийн хэсэг програмын цөмд хэрэгжүүлсэн функцуудыг ашиглах боломжтой болгохын тулд програмын графикийн хэсэг буюу TextEditor төсөлд TextEditor.BL төслийн холбоосыг үүсгэх шаардлагатай. Үүний тулд TextEditor төслийн References хэсгээс баруун даралт хийхэд гарах цэснээс Add Reference цэсээр ороод нээгдэх цонхонд дараах тохиргоог хийгээд

OK товчийг дарахад TextEditor төслийн References хэсгийн жагсаалтад TextEditor.BL төсөл орж ирнэ. Одоо TextEditor төслөөс TextEditor.BL төслийн функцуудад хандах боломжтой боллоо.

Програмын бизнес логикийн кодчлол

Програмын боловсруулалтаа бид түүний суурь функцууд буюу цөмөөс эхлэе. Анхдагч байдлаар Visual Studio -гоос TextEditor.BL төсөлд үүсгэсэн Class1.cs нэртэй файлыг устгаад TextEditor.BL төсөлд FileManager.cs шинэ классыг нэмэн өгөөрэй. FileManager класст бид програмын техникийн даалгаварт тусгагдсан бүх функцуудыг хэрэгжүүлэх юм. Visual Studio классыг анхдагч байдлаар үүсгэхдээ

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TextEditor.BL
{
    class FileManager
    {

    }
}

гэсэн кодыг оруулан өгдөг. FileManager класст гаднаас хандахын тулд түүнийг public хандалтын төрөлтэй болгох хэрэгтэй. Кодын дээд хэсэгт байгаа using гэсэн удирдамжаар анхдагч байдлаар ашиглах нэрийн орон зайнуудыг зааж байгаа. Жишээ нь using System; гэх мэтээр
namespace буюу нэрийн орон зай гэж юу вэ? Нэрийн орон зай гэдгийг классуудын хавтас гэж ойлгож болно. Классуудыг төрөл зориулалтаар нь өөр өөр нэрийн орон зайд /хавтасуудад/ байрлуулснаар тэдгээрийг илүү нарийн зааглан хандалтыг ойлгомжтой, амархан болгон өгдөг. Та компьютер дээрх файлуудаа бүгдийг нэг хавтаст байрлуулбал ямар байх билээ. Файлуудыг цэгцтэй байлгах үүднээс тэдгээрийг хавтаст хувиарлан байрлуулдагтай адилаар төслийн классуудыг нэрийн орон зай буюу хавтасуудад хуваан өгөх нь цэгцтэй болоод ойлгомжтой болгоно. Жишээ нь манай FileManager класс TextEditor.BL нэртэй нэрийн орон зайд байрлана.
Visual Studio төслийг үүсгэхдээ анхдагч байдлаар оруулан ирсэн нэрийн орон зайнууд ашиглагдахгүй байх нь бий. Ийм тохиолдолд тэдгээрийг төслөөс хасах хэрэгтэй. Үүнийг доорх зурагт үзүүлснээр хасан өгнө.

FileManager классын кодын using удирдамжуудын хэсэгт хулганы заагчийг аваачихад зураг дээрх улаан хүрээн доторх тэмдэг гарч ирэх бөгөөд дүрсний баруун байрлах товчийг дарахад ашиглагдахгүй байгаа орон зайны нэрүүдийг үзүүлнэ. Remove Unnecessary Usings даран  ашиглагдаагүй орон зайн using удирдамжуудыг устгаад файлтай ажиллахад шаардлагатай System.IO орон зай, тект, кодчлол гэх зэрэгтэй ажиллахад хэрэгтэй System.Text орон зайг using System.IO; , using System.Text; гэж нэмэн өгөөрэй.
Манай техникийн даалгаварын 1-р зүйлээр програм текстийн файлыг нээж чаддаг байх ёстой. Энэ функцийг FileManager класс доорх кодод үзүүлснээр хэрэгжүүлнэ.

using System.IO;
using System.Text;

namespace TextEditor.BL
{
    public class FileManager
    {
        public string GetContent(string filePath, Encoding encoding)
        {
            string content = File.ReadAllText(filePath, encoding);
            return content;
        }

    }
}

Бид класст эхний параметрээр файлын замыг, хоёрдахь параметрээр файлын кодчлолыг авах GetContent аргыг тодорхойлон өгсөн. Арга File статик классын ReadAllText аргыг ашиглан өгөгдсөн файлын агуулгыг content хувьсагчид уншин аваад түүнийг удирдах кодод буцаана. Кодод бид File классын хувийг үүсгэлгүй шууд ашиглаж байгаа учраас энэ нь статик класс гэдгийг бид урд нь үзсэн. File класс System.IO орон зайд байрладаг. Нэрийн орон зайнд ямар классууд байдгийг мэддэг байх шаардлагатай.
Бид ихэнх тохиолдолд тодорхой кодчлолтой /өөрөөр хэлбэл UTF/ файлуудыг ашиглана гэдгийг бодох хэрэгтэй. Үүний тулд GetContent аргын хэт ачаалалтай /overloaded/ зөвхөн файлын замыг параметрээр авах аргыг тодорхойлоод файлын кодчлолыг талбараар заан өгсөн кодыг нэмье.

    public class FileManager
    {
        private readonly Encoding _defaultEncoding = Encoding.GetEncoding(65001);

        public string GetContent(string filePath)
        {
            return GetContent(filePath, _defaultEncoding);
        }

        public string GetContent(string filePath, Encoding encoding)
        {
            string content = File.ReadAllText(filePath, encoding);
            return content;
        }

    }

Кодод _defaultEncoding талбар үүсгээд түүнд анхдагч кодчлолын кодыг олгосон. Дараа нь хэт ачаалалтай зөвхөн файлын замыг параметрээр авах GetContent арга өмнө зарлагдсан байсан GetContent аргыг дуудахдаа _defaultEncoding талбарыг хоёрдахь параметр болгон дамжуулна. Ингэснээр бид програмын уян хатан байдлыг хангаж өгнө. Хэрвээ кодчлолыг заан өгөөгүй бол _defaultEncoding талбарын утгыг анхдагчаар авна. Үүнээс гадна нээх гэж байгаа файлын кодчлол _defaultEncoding талбарын утгаас өөр гэдгийг мэдэж байвал бид агуулыг уншихдаа түүний кодчлолыг шууд заан өгөх боломжтой. Хэт ачаалалтай аргын утга санаа үүнд л оршиж байгаа юм. Файлын агуулгыг унших ажиллагааг дээрх хоёр арга гүйцэтгэх болно.
Техникийн даалгаварын бас нэгэн шаардлага болох файлын агуулгыг хадгалах ажиллагааг нэмэн оруулъя.

    public class FileManager
    {
        private readonly Encoding _defaultEncoding = Encoding.GetEncoding(65001);

     // ...

        public void SaveContent(string content, string filePath)
        {
            SaveContent(content, filePath, _defaultEncoding);
        }

        public void SaveContent(string content, string filePath, Encoding encoding)
        {
            File.WriteAllText(filePath,content,encoding);
        }
    }

Файл хадгалах ажиллагаа нь агуулгыг уншихтай төстэй. Файлын агуулга, файлын зам, кодчлолыг параметрээр авах SaveContent арга File классын WriteAllText стандарт аргыг ашиглан агуулгыг заагдсан файлд хадгална. Үүний зэрэгцээ анхдагч кодчлолыг ашиглах SaveContent аргын хэт ачааллагдсан хувилбарыг тодорхойлсон.
Одоо FileManager класс файлын агуулгыг унших, түүнийг хадгалах боломжтой болсон. Гэхдээ дикс дээрх файлд хандахын өмнө тухайн файл үнэхээр байгаа эсэхийг шалгасан нь илүү. Файл байгаа эсэхийг шалгахын тулд IsExist аргыг

    public class FileManager
    {
        private readonly Encoding _defaultEncoding = Encoding.GetEncoding(65001);

        public bool IsExist(string filePath)
        {
            bool isExist = File.Exists(filePath);
            return isExist;
        }

        // ...
    }

гэж хэрэгжүүлье. Арга энгийн. Өгөгдсөн замаар файл байгаа эсэхийг File классын Exists стандарт аргыг ашиглан шалгана. Exists арга файл байвал True байхгүй бол False утгыг буцаана.   
Эцэст нь FileManager классын сүүлийн функционал болох файлын тэмдэгтийн тоолох GetSymbolCount аргыг тодорхойлон өгцгөөе.

    public class FileManager
    {
        private readonly Encoding _defaultEncoding = Encoding.GetEncoding(65001);

        // ...

        public int GetSymbolCount(string content)
        {
            int count = content.Length;
            return count;
        }
    }

Арга файлын агуулгыг аваад түүний уртыг буцаах энгийн логиктой. FileManager классын аргуудын хэрэгжүүлэлтүүд танд их энгийн мэт санагдаж байж магадгүй. Энэ нь хичээлээр ямар нэгэн нарийн логиктой асуудлыг шийдэх програм зохиох зорилгыг тавиагүй харин програмыг хэрхэн зөв зохион байгуулах талаар үзэж байгаатай холбоотой. Иймээс жишээнд энгийн шийдэлтэй логикийг хэрэглэж байгаа юм. Таны програмын логик ямарч байсан програмаа хичээлд үзэж байгаа хэлбэрээр зохион байгуулах нь чухал. Програмын бүрдүүлэгчдийн зохион байгуулалтыг зөв хийх нь код бичихээс илүү нарийн төвөгтэй асуудал гэдгийг сайн тогтоон аваарай.

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

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

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

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

Reflection гэдэг үгийг монголчилбол тусгал эсвэл ойлт гэж хэлж болно. Технологийн талаар мэдээлэл хайн судлахын тулд орчуулгаар тогтоох гэснээс шууд Reflection гэж хэрэглэвэл илүү. Reflection гэж юу болох талаар ярилцая. .NET Framework орчинд компиляц хийгдсэн ердийн dll эсхүл exe файлыг авч үзье. Энд бид дурын dll эсхүл exe файл биш яг .NET Framework -ийн бүрэлдхүүнд багтсан аль нэгэн хэл дээр бичин компиляц хийн гаргасан dll эсхүл exe файл гэдгийг онцлоё. dll эсхүл exe файлаа Ассемблай /Assembly/ гэж нэрлэе.

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

Хичээлээр илэрхийллийн мод сэдвийг үргэлжлүүлэн судлана. Бид өмнөх хичээлд ойлголтын талаар авч үзээд түүнийг хэрхэн ашиглах жишээг эхлүүлсэн байгаа. Жишээнд хүмүүсийн мэдээллийг дэлгэц дээр жагсаалт байдлаар харуулаад жагсаалтын баганы толгой дээр дарахад жагсаалтыг тухайн баганаар хэрхэн эрэмбэлэхийг хэрхэн шийдэх бодлого тавигдсан. Асуудлыг та шийдэж чадсан уу. Одоо бид энэхүү асуудлыг илэрхийллийн модыг ашиглан хэрхэн шийдэхийг үзье.

  Нээгдсэн тоо: 157 Бүртгүүлэх

Хувьсагч бүр тодорхой контекст эсхүл харагдах бүсдээ хүчинтэй. Энэ контекстийн гадна хувьсагч байхгүй болно.

Төрөл бүрийн контекстүүд байдаг.

  • Классийн контекст. Классийн түвшинд тодорхойлогдсон хувьсагчид энэ классийн дурын аргад хүчинтэй. Эдгээрийг глобал хувьсагид эсхүл талбарууд гэж бас нэрлэдэг.
  • Аргын контекст. Аргын түвшинд тодорхойлогдсон хувьсагчдийг локал гэх бөгөөд зөвхөн тухайн арга дотроо хүчинтэй. Өөр аргад хувьсагчид хүчингүй. Байхгүй гэсэн үг.
  • Кодийн блокийн контескт. Блокийн кодийн түвшинд тодорхойлогдсон хувьсагчид бас локал бөгөөд зөвхөн тухайн блокдоо хүчинтэй (харагдана). Өөрийн блокийн гадна тэд хүчингүй.

Математикийн үйлдлүүдэд нэг ба тэг тоонууд онцгой шинжүүдтэй. Үржих үйлдэлд нэг ба тэг

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

 

Давталт (Iterator) паттерн нийлмэл обьектын бүх элементүүдэд тэдгээрийн дотоод бүтцийг задлахгүйгээр хандах абстракт интерфейсийг тодорхойлдог. C# хэл дээр…

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

 

Тодорхой нөхцөлд жишээ нь тоог тэгд хуваах гэх мэт тохиолдолд систем өөрөө онцгой нөхцлийн генерацийг хийдэг. Гэхдээ C#

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

 

Програмийг удирдах цэсийг нээх болон хаах ажиллагааг хариуцах компонентийг боловсруулъя. Үүний тулд төслийн components хавтаст Navigation хавтасыг үүсгээд…

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

 

Арифметикийн үндсэн 4 үйлдлийн нэг бол үржих. Нэмэх , хасах үйлдлийн талаар…

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

 

Шаблоны арга (Template Method) хэв дэд классуудад алгоритмын бүтцийг өөрчлөхгүйгээр зарим алхамуудыг дахин тодорхойлох боломж олгосон ерөнхий алгоритмыг…

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

 

Гурвалжны медиантай холбоотой бодлогууд шалгалт шүүлэгт ихээр орж ирдэг. Иймээс гурвалжны медиан, түүний шинжүүдийг бүрэн мэддэг байх хэрэгтэй.

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

 

Бүх онцгой нөхцлүүдийн суурь бол Exception төрөл. Төрөлд онцгой нөхцлийн талаарх мэдээллийг авч болох хэдэн шинжийг тодорхойлсон байдаг.…

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

 

Сорилгын үр дүнгийн QuizResult компонентод сорилгыг дахин эхлүүлэх товч байгаа. react -ийг зохиогчид  програмийг компонент дээр суурилан хийх…

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

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

илэрхийллийг хялбарчил

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

 

ABCD трапецийн бага диагонал BD=6 бөгөөд суурьтай перпендикуляр. Трапецийн AD=3, DC=12 бол B, D мохоо өнцгийн нийлбэрийг ол.

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

 

Геометрийн шалгалтанд сурагчид шалгалтын асуултуудаас нэг асуулт ирнэ. Сурагч "Дотоод өнцөг" сэдвийн асуултуудад хариулах магадлал 0,35 харин "Багтаасан тойрог" сэдвийн асуултуудад хариулах ммагадлал 0,2 байжээ. Шалгалтын асуултуудад энэ хоёр сэдэвт хоёуланд зэрэг хамаарах асуулт байхгүй бол сурагчид энэ хоёр сэдвийн аль нэгэнд нь хамааралтай асуулт ирэх магадлалыг ол.

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