C# изборна дисциплина



страница1/5
Дата27.09.2016
Размер0.88 Mb.
#10986
  1   2   3   4   5
C#



Зимен семестър 2008/2009
Лектор – доц.д-р Стоян Бъчваров

1.Общи сведения за C# и .NET Framework
През последните години се прави преход от концепцията за програмиране на отделни системи към създаване на интерактивно мрежово приложение. Пред съвременните езици за програмиране стоят съвършено нови задачи за решение, за които е създаден C# - стъпка в еволюцията. От своите предшественици взема най-доброто и обединява най-новите разработки в областта на езиците за програмиране. C# е взел най-доброто от C++ и Java, освен това в него има елементи като делегати и индескатори, а тъй като C# използва системата .NET Framework, то неговия код е доста преносим и може да се използва при разработката на програмни комплекси в многоезикови среди. Компонентите за програмно осигуряване в C# са съвместими с кода писан на друг .NET език.

.NET Framework Class Library – обширна библиотека. C# е нов език, който се развива и усъвършенства като се добавят нови възможности. Visual Studio .NET + Framework са необходими за работа със C#. C# е разработен от Microsoft за работа в .NET Framework. Той е подходящ и ефективен за писане на Windows приложения, използващи интернет. C# е наследил много полезни възможности на други езици за програмиране (Pascal, Ada) и е свързан със C/C++ и Java. За разбирането на C# е необходимо да се анализира природата на тази връзка.

Езикът C е създаден от Кърнинган и Ричи през 1972г., на C е писан 90% от UNIX, който преди е бил писан на Assembler. От 1980 година C е един от най-използваните езици за структурно програмиране. През 1979 година Бьорн Страустрап разширява C за ООП – C++ (първоначално C with Classes). Фактически C++ е ООП-ориентирана версия на C. Затова след изучаване на C при преход към C++ трябва да се изучат новите му възможности. C++ се използва масово в началото на 90те, а към края вече е най-използван.

Java е създаден през ‘91г. От Sun Microsystems като независим от платформата език, който да се ползва при програмиране за вградени контролери. През ‘93 става очевидно, че технологията за решаването на проблема за преносимостта в малък мащаб може да се реши в голям (интернет). Java създава междуплатформен преносим код. В Java преносимостта се достига чрез транслиране на изходния код на програмата в междинен език наричан байт-код, който се изпълнява от Java Virtual Machine. JVM се реализира лесно и е достъпна за много платформи. Използването на байт-код в JVM радикално се отличава от използването на кодове в C/ C++, които винаги се компилират в изпълним машинен код. Машинния код е свързан с определен процесор и операционна система и, следователно, за да се ползва друга конфигурация е необходимо да се прекомпилира, а Java решава този проблем. Това решение го има и в C#.

Java е създаден на базата на C/C++, има сходен синтаксис, но е несъвместим като код. След появата на Java, C/C++ става общоприет фундамент. JVM решава доста проблеми за преносимостта, но за успешна работа трябва да има взаимодействие на различни езици. За решаване на този проблем Microsoft разработва C#, който е съставна част от общата стратегия .NET на тази фирма. Главен архитект е Андерс Хейлсберг.

Между Java и C# няма пряка връзка и те имат много различия. Едно от много важните въведения на C# се отнася до вградената поддръжка на компонентите за програмно осигуряване включващо елементите. Т.е. C# е компонентно ориентиран език.

.NET определя средата, която поддържа развитието и изпълнението на платформено независими приложения. Важно е да се отбележи, че .NET не е ограничен с платформата на Windows и в бъдеще може да се пренесе на други платформи. C# използва независима от езика среда за изпълнение – CLR – Common Language Runtime. Това е система, която управлява изпълнението на програмата и е част от .NET Framework, която дава преносимост и многоезичност. C# ползва .NET библиотека от класове, която дава достъп до средата за изпълнение.

При компилирането на C# се получава неизпълним, междинен език на Microsoft – Microsoft Intermediate Language (MSIL) подобен на псевдокод. Междинният език определя набор от преносими команди независими от процесора. MSIL прилича на байт-кода на Java, но има различия. .NET транслира междинния код в изпълним по време на изпълнение на програмата. Програмата на MSIL се транслира в изпълним код с използване на just-in-time компилатор. При изпълнение на .NET програма се активира just-in-time компилатор, който транслира не цялата програма, части от нея се транслират при необходимост. При компилиране на C# програмата, освен програма на MSIL, се получават метаданни описващи данните използвани в програмата, което позволява използването на различни езици.



2. Обектно-ориентирано програмиране. Примерна програма
Езикът C# се базира на принципите на ООП и всички C# програми са в някаква степен обектно-ориентирани. При структурното програмиране кодът въздейства на данните, при ООП типът на данните задава вида на операциите, които могат да бъдат приложени към тях. За поддържането на принципите на ООП, всички ООП езици, включително C#, имат 3 общи черти – инкапсулация, полиморфизъм и наследяване.

Инкапсулацията е механизъм за програмиране, обединяващ в едно код и данни, които той обработва, а също така ограничава от външен достъп и неправилно използване. В обектно-ориентираните езици кодът и всички данни могат да се свържат така, че да се създаде автономна структура, наречена обект. С други думи обектът е структура, която поддържа инкапсулацията. В границите на обекта, кодът и данните могат да бъдат закрити или открити. Закритите входни данни са известни и достъпни само от други части на същия обект, т.е. към закрития код и данни не може да има достъп от онези части от програмата, които са извън границите на обекта. Когато кодът и данните са открити, то другите части могат да работят с тях. Обикновено частите на обекта, които са открити правят интерфейс. В C# класът е основна инкапсулационна структура, специфицираща данните и кодът, работещ с тях.

C# използва спецификацията на класа за конструиране на обекта – екземпляр на класа, следователно класът е набор от инструкции, в които е оказано как трябва да бъде създаден обект. Кодът и данните се наричат членове на класа. Данните в обекта, определени от класа, се наричат променливи на екземпляра, фрагментите от кода, които работят с тези данни се наричат методи. В C# термина „метод” е възприет за подпрограми, които в C/C++ се наричат функции. Понеже C# е пряк наследник на C++, то в C# понякога се използва термина ‘функция”.

Полиморфизмът е свойство, което позволява на няколко обекта, имащи някои общи характеристики, да получат достъп до един интерфейс и да реализират упоменатите в него методи. Например стек, може да се работи с програма, която изисква 3 стека от различни типове – цял, реален, символен. В този случай за реализацията на всеки стек се използва един и същи алгоритъм, въпреки че съхраняваните данни са от различен тип. В необектно-ориентираните езици трябва да бъдат създадени 3 различни набора от стекове и процедури. В C# чрез полиморфизъм може да се реализира един общ набор подходящ за работа с трите стека. По такъв начин, определяйки методи, които се използват за един тип стек, те могат да бъдат използвани и за другите типове. Концепцията за полиморфизъм е – един интерфейс, множество от методи. Това означава, че за група сходни процеси може да се създаде унифициран интерфейс. Полиморфизмът позволява да се намали сложността на програмите чрез използване на единен интерфейс за специализация на общ клас от действия. Компилаторът, чрез създадената програма, автоматично избира специфично действие вместо това програмистът да го прави ръчно. Програмистът трябва само да реализира изпълнимите методи.

Наследяването е средство, с помощта на което един обект може да получи свойствата на друг. Без наследяване всеки обект трябва да определи всички свои характеристики. С наследяване обектът трябва да определи само тези качества, които го правят уникален в рамките на този клас. Той може да наследява свойствата на родителските си обекти, което дава възможност на един обект да бъде специфичен екземпляр на своя клас.

Създаването на програма минава през 3 етапа:



  1. Първичен файл на C#;

  2. Компилиране;

  3. Изпълнение.

Прието е файлът с програмата на C# да има разширение .cs. За работа при някой други езици за програмиране (Java) името на файла е произволно, но много програмисти предпочитат да се казва както главния клас. Компилаторът транслира C# в междинен език. Изпълнението на програмата става под управлението на независима от езика среда за програмиране, която при нужда стартира JIT компилатор, който при нужда транслира части от програмата от междинен в машинен език и ги изпълнява.

В програмата се преобразува стойността от Фаренхайт в Целзий, има едноредови и многоредови коментари. Коментарите обикновено обясняват как работят определени части от програмата и какво съдържат определени елементи.


/*Програма за извеждане на таблица със стойността на температурата по скалата на Фаренхайт и съответните й стойности по скалата на Целзий*/

using System;

/*Програмата използва пространството от имена System за методите, асоциирани с библиотеката от класове в .NET Framework*/
class FtoCTable

{

public static void Main()



{

double f, c;

int counter;

counter = 0;

for (f = 0.0; f < 100.0; f++)

{

//преобразуване в градуси по Целзий



c = 5.0 / 9.0 * (f - 32.0);

Console.WriteLine(f + " градуса по скалата на Фаренхайт са равни на " + c + " градуса по скалата на Целзий.");

counter++;

//след всеки 10 реда извеждаме празен ред

if (counter == 10)

{

Console.WriteLine();



counter = 0;

}

}



}

}

Дефинирането на класа започва с отваряща скоба „{” и завършва с затваряща „}”. Елементите между двете скоби се наричат членове на класа. В C# всички процеси в програмата се извършват в границите на класа. Всички приложения на C# започват от метода Main, аналогично на програма на C/ C++, която започва да се изпълнява с извикване на main. Ключовата дума public е спецификатор/модификатор за достъп. Модификаторът определя как другите части на програмата може да достъпват членовете на класа. Ако имаме public – то имаме достъп от извън класа, private – не позволява пряко използване на членове от класа от кода, който е определен извън този клас. В разглежданата програма Main() е public, тъй като при стартиране ще бъде извикан от операционната система. В C# не се изисква Main() да е public, но е прието.



Ключовата дума static позволява да се извика метода Main() преди да бъде създаден обект от неговия клас, тъй като той се вика при стартиране на програмата, то той трябва да е static. Ключовата дума void показва, че Main не връща стойност. Празните скоби след него значат, че не приема аргументи. Кодът на Main е в { }, WriteLine е вграден метод за извеждане на екрана на монитора, Console е вграден клас за вход и изход. Точката между двете съобщава, че метода WriteLine е член на класа Console. В C# всяка операция завършва с „;”, главните и малки букви са различни. Компилаторът извежда съобщения за грешки по време на компилация, които са най-често синтактични; някой съобщения може да са подвеждащи и мястото на грешката може да не е посоченото. В C# е възможно да се определи името на класа/метода като се използва името на нивото, където е дефиниран.

Пример:


Console.WriteLine == System.Console.WriteLine

Променливата е име на поле от оперативната памет, което е последователност от един или няколко байта, в него се записва стойността на променливата. По време на изпълнение тази стойност може да бъде променяна. В C# всички променливи трябва да бъдат дефинирани преди тяхното използване. Общ вид на дефиницията:



тип списък_от_имена_на_променливи;

Типът определя множеството от допустимите стойности на променливата. В C# операцията за присвояване (=) копира стойността, стояща отдясно на знака, в променливата стояща отляво.

В метода WriteLine може да се използва операцията знак „+” която свързва заедно произволен брой елементи (конкатенация). Както в много други езици за програмиране, така и в C# има аритметичния набор от операции. Вградения метод Write е сходен на метода WriteLine, без да се минава на нов ред след всяко извикване. За числа с плаваща точка в C# има 2 типа – float и double, при които числата се представят с обикновена или двойна точка. По-често се използва double. Само за минаване на нов ред се използва метода WriteLine(); без аргументи. В тялото на метода операторите се изпълняват последователно отгоре надолу (в реда на записване). Този ред може да се променя с използване на различни оператори в C# - if. Кратката форма на условния оператор if има следния общ вид:

i
f (булев_израз) оператор;

Булевият израз, който има стойности true и false, задава условието на оператора.

В булевите изрази могат да се използват следните операции за отношение <, >, <=, >=, ==, !=.

Един или няколко последователни оператора могат да се изпълняват многократно с помощта на оператор за цикъл (например for). Общ вид на for:

f
or(израз_1; израз_2; израз_3) оператор;

Той се изпълнява по следния начин:

Обикновено с израз_1 се инициализира управляваща променлива на цикъла, с израз_2 (булев) се определя условие, с което се проверява стойността на управляващата променлива, с израз_3 се определя как да се изменя управляващата променлива при всяко изпълнение на тялото му. Операцията „++” означава увеличаване с 1 и се изпълнява по ефективно от f=f+1. Аналогично има „--” за намаляване с 1.

Последователност от 2 или повече оператора, заключени във фигурни скоби, се нарича съставен оператор или блок. Съставния оператор може да се използва по същия начин като единичен оператор.Той често се използва в операторите if и for. Използването на блокове не води до увеличаване на времето за изпълнение, но може да доведе до опростяване на определен алгоритъм, което води до увеличаване на скоростта и ефективността на програмата. Както вече казахме, всеки отделен оператор завършва с „;” обаче съставните оператори не завършват с „;” тъй като завършват с „}”. В C# понятието ред не се използва за определяне на синтаксиса на една програма и затова „;” може да се използва на произволно място в реда и в частност някъде може да няма „;” – това дава възможност за нагледно, ясно и разбираемо оформяне на текста на програмата.

В C# има 77 ключови думи, които не могат да се използват като имена на променливи, класове и методи. Както в C++, в C# ключовите думи съдържат само малки букви, към буквите е причислен и символа „_”. Хубав стил на програмиране е използването на мнемонични идентификатори. В C# може да се започва и с „@”. Библиотеката от класове на .NET Framework се използва в C# за реализация на операциите за вход и изход, обработка на низове, работа в мрежа, графичен интерфейс и др. Библиотеката осигурява повечето от функционалните възможности използвани във всяка програма на C#.


3.Типове данни
C# е език със строг контрол на типовете данни. Това означава, че всички операции в C# се контролират от компилатора за съвместимост на типовете данни. Ако операцията е недопустима, то тя няма да се компилира. Такава строга проверка на типовете данни позволява да се откриват грешките и да се повиши надеждността. За да се осъществи този контрол, на резултатите от изрази и на стойностите е задаван определен тип, нещо повече, типът на стойностите определя вида на операциите, които е разрешено да се извършват с тях. Операция разрешена за един тип може да е забранена за друг.

C# включва две основни категории вградени типове данни – обикновени (прости) и reference типове (нещо като указатели, примерно име на масив е от тип reference, класовете също са към тях). В C# има 13 обикновени типа:



bool – булев тип, 2 стойности (true/false), не се преобразува в цял тип;

byte – 8-битово цяло число без знак;

char – символен тип;

decimal – число в тип за финансови пресмятания;

double – число с плаваща точка с двойна точност (64bit);

float – число с плаваща точка с единична точност (32bit);

int – цяло число със знак;

long – дълго цяло число със знак;

sbyte – 8-битово цяло число със знак;

short – кратко цяло число със знак;

uint – цяло число без знак;

ulong – дълго цяло число без знак;

ushort – кратко цяло число без знак.

В C# за всеки тип данни строго се специализира диапазона от стойности и възможните операции с тях. Строгата спецификация е необходима за достигане на преносимост, въпреки че на някой платформи това може да доведе до неголяма загуба на производителност. В C# има 9 целочислени типа. Типът на данни char основно се използва за символи. Останалите 8 типа се използват за извършване на операции с цели числа.



Тип

Брой битове

Диапазон на допустимите стойности

byte

8

0 ÷ 255

sbyte

8

-128 ÷ 127

short

16

-32 768 ÷ 32 767

ushort

16

0 ÷ 65 535

int

32

-2 147 483 648 ÷ 2 147 483 647

uint

32

0 ÷ 4 294 967 295

long

64

~ -9.10^18 ÷ ~ +9.10^18

ulong

64

0 ÷ ~18.10^18

Целочислените типове са със знак и без знак. Разликата между тях се състои в начина на интерпретация на старшия бит на цялото число. При цяло число със знак той се интерпретира като знаков бит – „0” за „+” и „1” за „-”. При целите числа на практика всичките битове на числата с изключение на знаковите се инвертират и след това се добавя единица. Целите числа със знак обхващат половината от абсолютната стойност на съответните цели числа без знак, тъй като при тях знаковият бит се интерпретира като част от двоичното число. int e най-използваният цял тип.

long m;


long n;

m=n*m;


Тип byte е полезен да се използва при работа с необработени числени данни като поток от байтове данни, както и например да използваме byte като управляваща променлива в цикъл for:

byte i;


int suma;

suma = 0;

for (i = 0; i <= 100; i++)

suma += i;

В C# има 2 типа за числа с плаваща точка:

float – 32bit 1.5e-45 – 3.4e+38

double – 64bit 5e-324 – 1.7e+308

Най-често се използва тип double, една от причините е че много математически функции от .NET Framework ползват стойности от тип double – примерно sqrt() определен в System.Math;

Пресмятане на хипотенуза с sqrt:

using System;

class Hypot

{

public static void Main()



{

double x, y, z;

x = 3;

y = 4;


z = Math.Sqrt(x * x + y * y);

Console.WriteLine("Дължината на хипотенузата е равна на: " + z);

}

}

Тук името на методът sqrt е отделено с „.” от името на класа Math.



Един от най-интересните числови типа е decimal, който се използва в парични пресмятания. За представяне на стойности от типа decimal се разпределят 128 бита и те са в диапазона от 1е-28 ÷ 7.9e+28. Пресмятанията извършвани над числа с плаваща „.” са свързани с нееднократни закръгляния на стойности, което води до неточни резултати. Типът decimal премахва тези грешки, тази възможност за представяне на десетични стойности без грешки е полезна при финансови разчети.

Пример за пресмятане на баланс след начисляване на лихва.

decimal balance, rate;

balance=1000.10m;

rate = 0.1m;

balance*=rate;

Ще отбележим, че след десетичните const от тип decimal трябва да следва суфикс „M” или „m”, иначе ще се интерпретират като константи с плаваща точка и няма да са съвместими с decimal. decimal е уникален в C#, такъв тип данни няма в C/C++. За разлика от другите езици за програмиране, като C++, в който за представяне на символ се определят 8 бита (255 символа), в C# се използва стандартния набор от символи UNICODE, в който са представени символите на всички езици на света. В C# char е символен тип без знак, за който са разпределени 16 бита което позволява да се предоставят стойности в диапазона от 0 ÷ 65 535, т.е. 65 535 символа. Стандартния ASCII 8 битов набор от символи е част от UNICODE и е в диапазона 0 ÷ 127. По такъв начин ASCII остава достъпна в C#.

char ch;


ch= ‘x’;

Типът char, определен в C# като целочислен тип данни, основно се използва за съхраняване на символи и не е свободно съвместим с целочисления тип, тъй като отсъства автоматично преобразуване от цял тип в char. Например ch=10 води до грешка. По-нататък ще разгледаме как може да се отстрани това ограничение.

В C# bool има 2 стойности – true и false, следователно променлива от тип bool или логически (булев) израз ще има една от двете стойности. В C# няма начин за преобразуване от тип bool в цели стойности:

bool b;


b=false;

При извеждане на стойности от тип bool чрез WriteLine на екрана се извеждат думите „true” и „false”. Може да се използва променлива/израз от булев тип като условие в if. Резултатът от операциите за сравнение е от тип bool. За форматиране на числови данни е необходимо да се използва предефиниран метод WriteLine, който има следния общ вид:

WriteLine(“Форматиращ низ”, арг0, арг1, ..., аргn);

където форматиращия низ се състои от символи за извеждане и спецификатори на формат със следния общ вид:

{номер_на_аргумента, ширина: формат}

Тук елементът „номер_на_аргумента” задава номер на аргумента, започвайки от 0, който трябва да бъде изведен на екрана. Елементът „ширина” определя минимална ширина на извеждане на дадения аргумент, а елементът „формат” специфицира форматирането. При изпълнение на метода, ако във форматиращия низ се срещне спецификатор на формата, то програмата го заменя със съответния аргумент, който се извежда на екрана т.е. позицията на спецификатора на формата определя мястото, където на екрана ще бъдат изведени съответните данни. „Ширина” и „формат” не са задължителни т.е. в „най-простия” случай спецификатора на формата определя мястото на което да бъде изведен аргумента:

Console.WriteLine(“Във Февруари има {0} или {1} дена.”, 28 ,29);

Нека в примера добавим минималната ширина в полето за извеждане:

Console.WriteLine(“Във Февруари има {0,10} или {1,5} дена.”, 28 ,29);

Ако числото за извеждане е по-късо от зададената ширина, то се подравнява отдясно, а неизползваната част от ляво се запълва с интервали. Ако за извежданото число трябват повече позиции те ще бъдат заделени автоматично.

Във Февруари има 28 или 29 дена.

Един от най-простите начини за спецификация на формата е задаване на шаблон, например с помощта на символа за номер “#” се определят позициите на извежданите цифри:

Console.WriteLine(“10/3={0:#.##}”, 10.0/3.0);

Този шаблон задава извеждане на число с две цифри в дробната част. Ако цялата част на числото съдържа повече от една цифра, то за да се избегне загуба на данни ще се изведат всички цифри от цялата част. Ако трябва да се извеждат парична сума се ползва спецификатора на формат ‘c’.

decimal balance;

balance=12 323.09m;

Console.WriteLine(“Текущия баланс е: {0:c}”, balance);

В резултат:

Текущия баланс е: 12,323.09 лв



Каталог: files -> lekcii
files -> Рецептура на лекарствените форми рецептурни бланки и тяхната валидност
files -> Прогностични възможности на тестовете, използвани за подбор на млади футболисти
files -> Правила за реда за ползване, стопаниване и управление на стадион "христо ботев" благоевград глава първа общи положения
lekcii -> Е п и с к о п к о н с т а н т и н п р е с л а в с к и
lekcii -> Лекции на IV курс, уктц правец Съдържание Подпрограми в паскал 3 Дефиниране на подпрограми 3
lekcii -> C# изборна дисциплина


Сподели с приятели:
  1   2   3   4   5




©obuch.info 2024
отнасят до администрацията

    Начална страница