Vector структурасы

Vector структурасы үш өлшемді математикалық векторды қарастырады.

Үш өлшемді вектор – бұл бір нәрсенің қаншалықты алыс орналасатынын хабарлайтын үш түрлі сан. Бұл сандарды қамтитын айнымалылар x, y және z деп аталады. x –шығыс, y – батыс, z – жоғары.

Қосымша қайта жүктеулерді қосу

Векторларды бір-бірімен салыстыруға болады. Векторды скалярға көбейту оның әрбір элементін скалярға көбейтуді білдіреді. Мысалы, 2*(1.0, 2.5, 2.0) (2.0, 2.5, 4,0)-ді қайтарады.

public static static Vector operator * (double Ihs, Vector rhs)

{

return new Vector (Ihs * rhs.x, ihs * rhs.y, his *rhs.z);

}

Салыстыру операциясын қайта жүктеу

C#-та 6 салыстыру операциясы бар, оларды 3-ке бөлуге болады:

1. == және!=

2. > және <

3. >= және <=


22. Келтіру операцияларын қолданушы типтерге қосу.

Анық келтіруде кодта сіз анық түрде жақша ішіне типтерін көрсете отырып,меншіктейсіз.

Ing I=3;

Long I=I; //анық

Short s=(short)I; //анық емес

Алдын ала анықталған мәліметтер типіне келтірулер нәтижесінен туындаған жоғалтулар тәуекелі пайда болғанда анық келтірулер қажет болады.

Анық және анық емес қолданушы кетіру операциялары SimpleCurrency мысалымен көрсетілген.

Struct Currency

{

public uint Dollars;

public ushort Cents;

public Currency(uinit dollars,ushort cents)

{

this.Dollars=dollars;

this.Cents=cents;}

public override string ToString()

{return strong.Format(“${o}.{1,-2:00}”,Dollars,Cents);}

}}

Таңбасыз типтердің Dollar және Cents қатарларында қолданылуы Currency экземпляры тек оң мәндерді қамтитынын білдіреді.

Келтірулерді анық деп жарияласақ,сіз құрастырушыларға мәліметтер жоғалтулары болатынын ескерту қажет.Тестті мысал жазып көрейік,бізде Main()әдісі бар.Ол Currency экземплярын құрады және де бірнеше қайта өңдеуді жүзеге асырады.

Static void Main()

{

try

{Currency balance=new Currency(50,35);

Console.Writeline(balance);

Console.Writeline(“баланс равен”+balance);

Console.Writeline(“баланс равен(ToString() қолдана)”+balance.ToString());

Float balance2=balance;

Console.Writeline(“После преобразования в float=”+balance2);

Balance=(Currency)balance2;

Console.WriteLine(“После преобразования обратно вCurrency=”+balance);

Console.WriteLine(“После преобразуем значение вне допустимого диапазона”+”-$50.50 в Currency:”);

Checked

{

Balance=(currency) (-50.50);

Console.WriteLine(“Результат:”+balance.ToString());

Catch (Exception e)

{Console.WiteLine(“Возникло исключение:”+e.Message);

}}

Код дұрыс жасамайтыны түсінікті.Шешімі келтіру операциясында және checked блогында.Осы өзгертулерді енгізссек,келесі кодты аламыз.

public static explicit operator Currency(float value)

{

Checked

{

Uint dollars=(uint) value;

Uchort cents =Convert.ToUint16((value-dollars)*100;

Return new Currency(dollars,cents);}}

Checked-келтіруді қолдану арқылы жаңа нәтижелерді көрмейміз,себебі бұл бөлімде SimpleCurrency мысалында бірнеше модификациялар қажет.


23. Делегаттар. Лямбда-өрнектер. Уақиғалар.

Делегаттар.

Делегат — бұл тәсілдерге сілтемелерді сақтауға арналған класс түрі. Делегатты кез кезген класс тәрізді параметр ретінде беруге, осыдан кейін ондағы инкапсуляцияланған тәсілді шақыруға болады.

Делегаттар оқиғаларды қолдау үшін, сонымен қатар, тілдің тәуелсіз конструкциясы ретінде қолданылады.

Делегаттың сипаттамасы оның көмегімен шақырылуы мүмкін тәсілдер сигнатурасын анықтайды:

[ атрибуттар ] [ спецификаторлар ] delegate тип аты([ параметрлер ])

Делегатты сипаттау мысалы:

public delegate void D (int i);

Делегаттың базалық класы System.Delegate болып табылады

Делегаттар, негізінен, келесі жағдайлар үшін қолданылады:

- шақырылған тәсілді компиляция кезінде емес, программаның орындалуы кезінде динамикалық түрде анықтауға мүмкіндік алу;

- объектілер арасында «шығу көзі — бақылаушы» типі бойынша байланысты қамтамасыз ету;

- оларға басқа тәсілдерді беруге болатындай универсалды тәсілдерді құру (кері шақырулар механизмін қолдау).

Делегатты параметрлер тізімі арқылы беру

namespace ConsoleApplication1 {

public delegate double Fun(double x); // делегатты жариялау

class Class1 {

public static void Table(Fun F, double x, double b)

{ Console.WriteLine(" ----- X ----- Y -----");

while (x <= b)

{ Console.WriteLine("| {0,8} | {1,8} |", x, F(x));

x += 1; }

}

public static double Simple(double x) { return 1; }

static void Main()

{ Table(Simple, 0, 3);

Table(Math.Sin, -2, 2); // new Fun(Math.Sin)

Table(delegate (double x){ return 1; }, 0, 3);

}}}

Лямбда-өрнектер.

Лямбда-өрнектер – бұл өрнек ағашын немесе делегаттар типін құруға қолданылатын анонимді функция. Лямбда-өрнегі арқылы локальді функция жазуға болады, оны кейін аргумент ретінде немесе мән қайтару үшін басқа функцияларға беруге болады. Лямюда-өрнектер әсіресе LINQ сұраныстарын жазғанда пайдаланылады. Лямбда өрнекті құруда кіріс параметрлерін сол жақтан және блок мағынасы немесе басқа бағытта нәтижесі көрсетіледі. Келесі мысалдағыдай:

delegate int del(int i);static void Main(string[] args){ del myDelegate = x => x * x; int j = myDelegate(5); //j = 25}

Уақиғалар.

Оқиға — кластың басқа объектілерге (бақылаушыларға) өзінің күйінің өзгеруі туралы хабарламалар жіберуіне мүмкіндік беретін класс элементі.

Бақылаушы болу үшін объектінің оқиғалар өңдеушісі және ол оқиғалар өңдеушісін шығу көзі объектісінде тіркеу керек.

Оқиғалар механизмі

Оқиғалар делегаттар негізіде құрастырылған: делегаттардың көмегімен оқиғаларды өңдеуші тәсілдер шақырылады. Сондықтан класта оқиғаны құру келесі бөлімдерден тұрады:

- оқиғалар өңдеушілерінің сигнатурасын анықтайтын делегатты сипаттау;

- оқиғаның сипаттау;

Оқиғаны тудыратын тәсілді (тәсілдерді) сипаттау.

Оқиғаның синтаксисі:

[ атрибуттар ] [ спецификаторлар ] event тип аты

Оқиғаларды өңдеу хабарламаны алушы кластарда орындалады. Ол үшін осы кластарда сигнатурасы делегат типіне сәйкес келетін оқиғаларды өңдеуші әдістер сипатталады. Хабарлама алғысы келетін әрбір объект (класс емес!) жіберуші объектіде осы тәсілді тіркеуі тиіс.

Оқиға — бұл программист үшін ыңғайлы абстракция. Шын мәнінде, ол ішінде делегат экземпляры құрылатын жабық статикалық кластан және өңдеушіні осы делегат тізіміне қосуға және одан жоюға арналған екі тәсілден тұрады.

Сыртқы код оқиғалармен бір сипатта ғана жұмыс істей алады: өңдеушілерді тізімге қосу немесе тізімнен өшіру, себебі кластан тыс тек += және -= операцияларын қолдануға болады. Бұл операциялар нәтижесінің типі — void, яғни ол арифметикалық типтер үшін күрделі меншіктеу операцияларынан өзгеше болып келеді. Өңдеушілер тізіміне басқаша қатынас құру тәсілдері жоқ.


24. Сөз тіркесін құру. Жүйелі өрнектер.

Сөз тіркесін құру.

String – көптеген пайдалы әдістерді жүзеге асыратын аса мықты класс болып есептелінеді. Алайда String классының жеткіліксіздігі оның өзгертілмейтіндігі, яғни бір кез инициализацияланған жолды объект өзгертіле алмайды.

StringBuilder классы екі басты сипаттамадан тұрады:

1)Length объекттегі дәл сол уақыттағы бар жолдың ұзындығын көрсетеді

2)Capacity белгіленген объектің жадысына орналаса алатын жолдың максималды ұзындығын көрсетеді.

Кез келген жолдың модификациясы StringBuilder экземплярына бөлінген блок ішіндегі жадыда орындалады. Бұл жол бөлімдері мен инвидуалды жол символдарының ауыстыруларын өте әсерлі етеді.

Егер StringBuilder құрамын String түрінде алу үшін ToString() әдісін қолдану керек. Көп жағдайда StringBuilder –ді көптеген жолдарды манипуляциялау қажет болғанда қолданған дұрыс. Алайда қарапайым зат жасайтын кезде,мысалы, екі жолды біріктіру үшін System.String-ті қолданған ыңғайлы.

Жүйелі өрнектер.

Жүйелік өрнектер- бұл, программаның үлкен диапазонында кең қолданылатын, бірақ жасап шығарушыларда аз қолданылатын технологиялық облыстың кішігірім бөлігі болып есептеледі. Жүйелік өрнектерді бір спецификалық мақсаты бар программалаудың кішігірім тілі деп елестетуге болады. Бұл жаңа технология емес, бастапқыда ол UNIX ортасында пайда болды және әдетте Perl программалау тілінде қолданылады. Microsoft жасап шығарушылары оны Windows-қа көшірді. Қазір жүйелік өрнектер.NET-гі System.Text.RegularExpressions атаулы аймақтағы көптеген класстармен жұмыс істейді. Жүйелік өрнекті қолданған жағдайда ортаның көптеген аймағында кездестіруге болады.

Төмендегі мысалда көрсетілгендей жүйелі сөйлемдер көмегімен жолдарға қиын және жоғары деңгейлі әрекет жасауға болады.

· Жолдағы барлық ұқсас сөздерді теңестіру

· Барлық сөздің бірінші әрібін бас әріппен жазу

· Үш сөзден көп болатын сөйлемдегі бірінші сөздердің бірінші әрібін өзгерту.

· Сөйлемдердің дұрыс капиталдануын қадағалау

· URI – дағы әр түрлі элементтерді белгілеу


25. Сөз тіркесін құру. Форматтаушы өрнектер.

Сөз тіркесін құру.

String – көптеген пайдалы әдістерді жүзеге асыратын аса мықты класс болып есептелінеді. Алайда String классының жеткіліксіздігі оның өзгертілмейтіндігі, яғни бір кез инициализацияланған жолды объект өзгертіле алмайды.

StringBuilder классы екі басты сипаттамадан тұрады:

1)Length объекттегі дәл сол уақыттағы бар жолдың ұзындығын көрсетеді

2)Capacity белгіленген объектің жадысына орналаса алатын жолдың максималды ұзындығын көрсетеді.

Кез келген жолдың модификациясы StringBuilder экземплярына бөлінген блок ішіндегі жадыда орындалады. Бұл жол бөлімдері мен инвидуалды жол символдарының ауыстыруларын өте әсерлі етеді.

Егер StringBuilder құрамын String түрінде алу үшін ToString() әдісін қолдану керек. Көп жағдайда StringBuilder –ді көптеген жолдарды манипуляциялау қажет болғанда қолданған дұрыс. Алайда қарапайым зат жасайтын кезде,мысалы, екі жолды біріктіру үшін System.String-ті қолданған ыңғайлы.

Форматтаушы өрнектер.

Console.WriteLine()-ді шақырғанда айнымалының мәнін беретін форматты көрсету керек. Осылайша біз осы әдісті мысал ретінде қолданып форматтаушы өрнекті айта кетейік. Мысалы, егер текстік жолда немесе тізімдер терезесінде мәнді көрсету қажет болса әдетте String.Format() әдісі қолданылады. Алайда негізгі формат спецификаторлары дәл форматты нұсқау үшін Console.WriteLine()-ға жіберіледі. Сондықтан біз Console.WriteLine() мысалына көніл бөлейік.

Жолды форматтау үшін келесі операторларды қарастырайық:

Console.WriteLine(){“double мәні{0,10:E} тең, ал int {1} тұрады”,d,i};

Console.WriteLine() - String.Format() статикалық әдісіне тек қана толық жинақтар әдісін жібереді. Сонымен қатар осы әдісті жолды форматтағанда да қолдану керек, мсалы текстік жолда көрсету үшін. Мұндай үш параметрмен,WriteLine() қайта жүктеу реализациясы әдетте мынадай түрде болады:

Console.WriteLine()

Public void WriteLine(string format, object arg1)

{

This.WriteLine(string.Format(this.FormatProvider, format, new object[] {arg0, arg1}));

}

Бұл бір параметрлі, алдыңғы код мысалында қолданылған әдісті қайта жүктеу, ешқандайда форматтаусыз құрылысын шығарады.


26.Интерфейстер және коллекциялар типтері. Тізім, кезек және стектермен жұмыс.

Коллекциялардың көпшілігі System.Collections және System.Collections.Generic кеңістігінде болады.Жалпылама коллекциялар класын System.Collections.Generic кеңістігінде табуға болады.Анықталған типтің сақталуы үшін қолданылатын коллекциялар класы System.Collections.Specialized. кеңістінде орналасады. Жиындар қатысында кауіпсіз коллекциялар класы System.Collections.Concurrent. кеңістігінде анықталады.

Әрине коллекциялар класын топтарға бөлудің басқа да тәсілдері бар. Интерфейстер негізінде коллекциялар тізімде топтала алады, әсіресе коллекциялар мен сөздіктер.

Коллекция үшін маңызды интерфейстер

IEnumerable<T> -коллекциямен foreach операторын қолданғанда керек.Бұл интерфейс GetEnumerator() әдісін анықтайды.

ICollection<T> -жалпылама коллекциялар негізіне құрылады.Оның көмегімен коллекциядағы элементтер санын алуға болады және коллекцияны массивке көшіруге болады.(CopyTo әдісі).Сонымен қатар коллекция элементтерін қосуға,өшіруге(Add(), Remove(), Clear ()) болады.

Ilist<T> -тізім құру үшін қажет.Бұл интерфейс индексаторды және қою әдістерін, элементтерді өшіруді анықтайды.(Insert ()әдісі және Remove())

ConvertAll<TOutput> () және List <T> әдістерімен коллекциялар типі. ConvertAll<TOutput> () әдісі Converter делегатын қолданады:

Public sealed delegate TOutput Converter <TInput>,<TOutput> (TInput from);

Бұл жалпылау типтерінде TInput және TOutput қолданылады.

Коллекциялар оқуға және жазу үшін құрылған. Коллекция List<T> AsReadOnly әдісін пайдаланады.

Тізім

LinkedList<T> класы екі байланысты тізімді анықтайды.Тізімнің артықшылығы элементті ортасына орналастыру өте жылдам орындалады. Бұл кезде Next сілтемесі келесі Previous элементін өзгертуі керек.Бір – бірімен байланысқан тізімдер өз ішіне элементтерді сақтай алмайды.Әрбір элементпен қоса оларға келесі және алдыңғы элемент жайлы ақпарат болуы қажет.Міне сол үшін мысалы,LinkedList<T> LinkedlistNode<T>элемент типін иеленеді. LinkedList<T> класының өзі тізімдегі бірінші (First) және соңғы (Last)элементке элементті қою үшін бағытты анықтайды(AddAfter(),AddBefore(),AddFirst(),AddLast()) позициясын қолданып, элементтерді жою үшін (Remove(),RemoveFist(),RemoveLast()) не болмаса тізімнің аяғынан.

Егер сұрыпталған коллекция алу үшін SortedList<TKey,TValue> қолданады.Бұл класс элементтерді кілт негізінде сұрыптап отырады.

Foreach операторы көмегімен тізім бойынша итерация орындауға болады.

Foreach (KeyValuePair < string,string> book in books)

{

Console.WriteLine (“{0},{1}”, book.Key, book.Value);

}

Кезек

Кезек(queue)- бұл элементтер «бірінші кірді, бірінші шықты»(first in, first out) схемасы бойынша өңделетін коллекция. Кезекке бірінші тұрғызылған элемент бірінші болып есептеледі. Кезекке аэропротқа кезекке тұру, жұмысқа тұруға кезекке тұру, принтерден басып шығаруға кезекке тұру не ағымдардың процессордың ресурсын бөлуге циклдық кезек. Басымдылығына сәйкес, элементтер әртүрлі өңделетін кезектер жиі кездеседі. Мысалға, аэропорттардағы кезектерде бизнес-сынып жолаушыларына эконом-сынып жолаушыларының алдында қызмет етіледі. Мұнда біреуден әрбір басымдыққа бірнеше кезектер қолдануға болады. Бұны аэропортта анық көруге болады, себебі онда екі тіркеу бағаны бизнес-сынып және эконом-сынып жолаушыларына қарастырылған. Сізде жиым элементі басымдықты білдіретін кезек тізімінің жиымы болуы мүмкін. Әрбір жиым элементінің ішінде кезек болады, және өңдеу FIFO қағидаттары бойынша орындалады.

Ары қарай нақты бөлімде басымдық тізімін анықтау үшін байланыс тізімінің әртүрлі жүзеге асырылуы қолданылады.

Кезек System.Collection.Generic аттар кеңістігінің Queue<T> класының көмегімен жүзеге асады. Queue<T> класының ішінде List<T> класы жұмысына ұқсас Т типті жиымды қолданады. Ол IEnumerable<T> және ICollection интерфейсін жүзеге асырады, ICollection<T> емес. ICollection<T> интерфейсі кезек үшін рұқсат етілмеген болатын Add() және Remove() тәсілдерін анықтайтындықтан жүзеге аспаған.

Queue<T> класы IList<T> интерфейсін жүзеге асырмайды,сондықтан кезек эелементтеріне индексатор арқылы байланысуға болмайды.

Queue<T> класының Сипаттамасы

таңдаулы мүшелері

Count Count қасиеті кезектегі элемент санын қайтарады.

Enqueue() Enqueue() тәсілі кезектің соңына элементті қосады.

Dequeue() Dequeue() тәсілі кезектің басынан элементті оқиды және өшіреді. Егер Dequeue() тәсілінің шақыру мезетінде кезекте элемент басқа жоқ болса, InvalidOperationException ерекшелігін генерациялайды.

Peek() Peek() тәсілі кезектің басынан элементті оқиды,бірақ оны жоймайды.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: