.RU
Карта сайта

Решения и упътвания - Предварителна (алфа) версия!

Решения и упътвания


  1. Използвайте методите

    Console.ReadLine()

    и

    Int32.Parse()

    .

  2. Използвайте константата

    Math.PI

    и добре известните формули от планиметрията.

  3. Форматирайте текста с

    Write(…)

    или

    WriteLine(…)

    подобно на този от примера с писмото, който разгледахме.

  4. Използвайте форматиращите настройки, предоставени от съставното форматиране и метода

    Console.WriteLine()

    .

  5. Има два подхода за решаване на задачата:

Първи подход: Използват се математически хитрини за оптимизирано изчисляване, базирани на факта, че всяко пето число се дели на 5.

Вторият подход е по-лесен, но работи по-бавно. Чрез

for

цикъл може да се провери всяко число в дадения интервал. За целта трябва да прочетете от Интернет или от главата "Цикли" [TODO: link] как се използва

for

цикъл.

  1. Можете да прочетете числата в пет различни променливи и накрая да ги сумирате. При парсване на поредното число използвайте условно парсване с

    TryParse(…)

    . При въведено невалидно число повторете четенето на число. Можете да сторите това чрез

    while

    цикъл с подходящо условие за изход. За да няма повторение на код, можете да разгледате конструкцията за цикъл "

    for

    " от главата "Цикли" [TODO: link].

  2. Трябва да използвате конструкцията за сравнение "

    if

    ", за която можете да прочетете в Интернет или от главата "Условни конструкции" [TODO: link]. За да избегнете повторението на код, можете да използвате конструкцията за цикъл "

    for

    ", за която също трябва да прочетете в Интернет или от главата "Цикли" [TODO: link].


Глава 5. Условни конструкции

В тази тема...


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

if

и

if

-

else

с подходящи примери и ще разясним практическото приложение на оператора за избор

switch

.

Ще обърнем внимание на добрите практики, които е нужно да бъдат следвани, с цел постигане на по-добър стил на програмиране при използването на вложени или други видове условни конструкции.

Оператори за сравнение и булеви изрази


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

Оператори за сравнение


В C# има няколко оператора за сравнение, които се използват за сравняване на двойки цели числа, числа с плаваща запетая, символи, низове и други типове данни:

Оператор



Действие



==

равно

!=

различно

>



по-голямо

>=



по-голямо или равно

<



по-малко

<=



по-малко или равно

Операторите за сравнение могат да сравняват произволни изрази, например две числа, два числови израза или число и променлива. Резултатът от сравнението е булева стойност (

true

или

false

).

Нека погледнем един пример, в който използваме сравнения:

int weight = 700;

Console.WriteLine(weight >= 500); // True

char gender =

'm'

;

Console.WriteLine(gender <=

'f'

); // False

double colorWaveLength = 1.630;

Console.WriteLine(colorWaveLength > 1.621); // True

int a = 5;

int b = 7;

bool condition = (b > a) && (a + b < a * b);

Console.WriteLine(condition); // True

Console.WriteLine(

'B'

==

'A'

+ 1); // True

В примерния програмен код извършваме сравнение между числа и между символи. При сравнението на числа те се сравняват по големина, а при сравнението на символи се сравнява тяхната лексикографска подредба (сравняват се Unicode номерата на съответните символи).

Както се вижда от примера, типът

char

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

Стартирайки примера ще получим следния резултат:

T

rue



F

alse



T

rue



T

rue



T

rue



В C# има няколко различни типа данни, които могат да бъдат сравнявани:

Всяко едно сравнение може да засегне две числа, две

bool

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

Сравнение на цели числа и символи


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

int

, ще бъдат сравнени стойностите на съответните поредици от 4 байта, които ги съставят. Ето един пример за сравнение на символи и числа:

Console.WriteLine(

"char 'a' == 'a'? "

+ (

'a'

==

'a'

)); // True

Console.WriteLine(

"char 'a' == 'b'? "

+ (

'a'

==

'b'

)); // False

Console.WriteLine(

"5 != 6? "

+ (5 != 6)); // True

Console.WriteLine(

"5.0 == 5L? "

+ (5.0 == 5L)); // True

Console.WriteLine(

"true == false? "

+ (true == false)); // False

Резултатът от примера изглежда по следния начин:

char 'a' == 'a'? True



char 'a' == 'b'? False



5 != 6? True



5.0 == 5L? True



true == false? False


Сравнение на референции към обекти


В .NET Framework съществуват референтни типове данни, които не съдържат директно стойността си (както числовите типове), а съдържат адрес от динамичната памет, където е записана стойността им. Такива типове са стринговете, масивите и класовете. Те имат поведение на указател към някакви стойности и могат да имат стойност

null

, т.е. липса на стойност. При сравняването на променливи от референтен тип се сравняват адресите, които те пазят, т.е. проверява се дали сочат на едно и също място в паметта, т.е. към един и същ обект.

Два указателя към обекти (референции) могат да сочат към един и същи обект или към различни обекти или някой от тях може да не сочи никъде (да има стойност

null

). В следващия пример създаваме две променливи, които сочат към една и съща стойност (обект) в динамичната памет:

string str = "beer";

string anotherStr = str;

След изпълнението на този код, двете променливи

str

и

anotherStr

ще сочат към един и същи обект (

s

tring

със стойност "beer"), който се намира на някакъв адрес в динамичната памет (managed heap).

Променливите от тип референция към обект могат да бъдат проверени, дали сочат към един и същ обект, посредством оператора за сравнение

==

. За повечето референтни типове този оператор не сравнява съдържанието на обектите, а само дали се намират на едно и също място в паметта, т. е. дали са един и същ обект. За променливи от тип обект, не са приложими сравненията по големина (

<

,

>

,

<=

и

>=

).

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

string str =

"beer"

;

string anotherStr = str;

string thirdStr =

"be"

+

'e'

+

'r'

;

Console.WriteLine(

"str = {0}"

, str);

Console.WriteLine(

"anotherStr = {0}"

, anotherStr);

Console.WriteLine(

"thirdStr = {0}"

, thirdStr);

Console.WriteLine(str == anotherStr); // True - same object

Console.WriteLine(str == thirdStr); // True - equal objects

Console.WriteLine((object)str == (object)anotherStr); // True

Console.WriteLine((object)str == (object)thirdStr); // False

Ако изпълним примера, ще получим следния резултат:

str = beer

anotherStr = beer

thirdStr = beer

True

True

True

False

Понеже стринговете, използвани в примера (инстанциите на класа

System.String

, дефинирани чрез ключовата дума

string

в C#), са от референтен тип, техните стойности се заделят като обекти в динамичната памет. Двата обекта, които се създават

str

и

thirdStr

имат равни стойности, но са различни обекти, разположени на различни адреси в паметта. Променливата

anotherStr

също е от референтен тип и приема адреса (референцията) на

str

, т.е. сочи към вече съществуващия обект

str

. Така при сравнението на променливите

str

и

anotherStr

се оказва, че те са един и същ обект и съответно са равни. При сравнението на

str

с

thirdStr

резултатът също е равенство, тъй като операторът

==

сравнява стринговете по стойност, а не по адрес (едно много полезно изключение от правилото за сравнение по адрес). Ако обаче преобразуваме трите променливи към обекти и тогава ги сравним, ще получим сравнение на адресите, където стоят стойностите им в паметта и резултатът ще е различен. Това показва, че операторът

==

има специално поведение, когато се сравняват стрингове, но за останалите референтни типове (например масиви или класове) той работи като ги сравнява по адрес.

Повече за класа

String

и за сравняването на символните низове ще научите в главата "Символни низове" [TODO: fix link].

Логически оператори


Да си припомним логическите оператори в C#, тъй като те често се ползват при съставянето на логически (булеви) изрази. Това са операторите:

&&

,

||

,

!

и

^

.
Логически оператори && и ||
Логическите оператори

&&

(логическо И) и

||

(логическо ИЛИ) се използват само върху булеви изрази (стойности от тип

bool

). За да бъде резултатът от сравняването на два израза с оператор

&&

true

(истина), то и двата операнда трябва да имат стойност

true

. Например:

bool result = (2 < 3) && (3 < 4);

Този израз е "истина", защото и двата операнда: (2 < 3) и (3 < 4) са "истина". Логическият оператор

&&

се нарича още и съкратен оператор, тъй като той не губи време за допълнителни изчисления. Той изчислява лявата част на израза (първи операнд) и ако резултатът е

false

, не губи време за изчисляването на втория операнд, тъй като е невъзможно крайният резултат да е "истина", ако първият операнд не е "истина". По тази причина той се нарича още

съкратен логически оператор "и"

.

Аналогично операторът || връща дали поне единият операнд от двата има стойност "истина". Пример:

bool result = (2 < 3) || (1 == 2);

Този израз е "истина", защото първият му операнд е "истина". Както и при

&&

оператора, изчислението се извършва съкратено – ако първият операнд е

true

, вторият изобщо не се изчислява, тъй като резултатът е вече известен. Той се нарича още

съкратен логически оператор "или"

.
Логически оператори & и |
Операторите за сравнение

&

и

|

са подобни, съответно на

&&

и

||

. Разликата се състои във факта, че се изчисляват и двата операнда един след друг, независимо от това, че крайния резултат е предварително ясен. Затова и тези оператори за сравнение се наричат още

несъкратени логически оператори

и се ползват много рядко.

Например, когато се сравняват два операнда с

&

и първият операнд се сведе до "лъжа", въпреки това се продължава с изчисляването на втория операнд. Резултатът е ясно, че ще бъде сведен до "лъжа". По същия начин, когато се сравняват два операнда с

|

и първия операнд се сведе до "истина", независимо от това се продължава с изчисляването на втория операнд и резултатът въпреки всичко се свежда до "истина".

Не трябва да бъркате булевите оператори

&

и

|

с побитовите оператори

&

и

|

. Макар и да се изписват по еднакъв начин, те приемат различни аргументи (съответно булеви изрази или целочислени изрази) и връщат различен резултат (

bool

или цяло число) и действията им не са съвсем идентични.
Логически оператори ^ и !
Операторът

^

, известен още като

изключващо ИЛИ (

XOR)

, се прилага само върху булеви стойности. Той се причислява към несъкратените оператори, поради факта, че изчислява и двата операнда един след друг. Резултатът от прилагането на оператора е "истина", когато само и точно един от операндите е истина, но не и двата едновременно. В противен случай резултатът е "лъжа". Ето един пример:

Console.WriteLine("Изключващо ИЛИ: " + ((2 3)));

Резултатът е следният:

Изключващо ИЛИ: False

Предходният израз е сведен до лъжа, защото и двата операнда: (2 3) са истина.

Операторът

!

връща като резултат противоположната стойност на булевия израз, към който е приложен. Пример:

bool value = !(7 == 5); // Тrue

Console.WriteLine(value);

Горният израз може да бъде прочетен, като "обратното на истинността на израза "

7 == 5

". Резултатът от примера е

T

rue

(обратното на

F

alse

).
2014-07-19 18:44
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • Контрольная работа
  • © sanaalar.ru
    Образовательные документы для студентов.