Задача за програмиране 10 Програмно осигуряване на съвремените компютри (обобщение) 13 Системи за програмиране 15



страница3/12
Дата21.11.2017
Размер1.86 Mb.
#35102
ТипЗадача
1   2   3   4   5   6   7   8   9   ...   12

фиг. 17

Интервалите, в които могат да се променят стойностите на величините от различните типове на пръв поглед изглеждат странно, но ограниченията съвсем не са случайни. Те зависят от начина, по който числата се представят в компютъра - кодирани чрез 0 и 1, т. е. представени в двоична бройна система .

Ако разгледаме например типа int: за него се заделят точно 2 байта, т. е. 16 бита, като най-левият от тях се отделя за записване на знака на числото. Ако числото е положително, в този бит се записва 0, а иначе 1. Най-голямото число, представено в двоична бройна система, което може да се запише в останалите 15 бита е число, съставено от 15 единици и то е точно 32767. При типа unsigned, както личи от името му, не се отделя място за знак и затова интервалът на стойностите се измества, като те започват от 0 и достигат до 65535 (най-голямото число, което може да се запише в 16 бита). По същия начин е организирано представянето и на другите два целочислени типа.

Интересен е въпросът: Какво би станало ако към променлива със стойност 32767 от тип int прибавим числото 1? Очевидно би трябвало да се получи число извън границите на типа int. В този момент програмата преобразува полученото число в –32768, т. е. “превърта” стойностите на типа и започва отначало. Може би ви се е случвало да “превъртите” някоя игра, т. е. изведнъж тя да започне да ви дава точки отново от 0, независимо от великото ви постижение.

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

б) дробни типове данни:


Тип

Размер в байтове

Числен интервал

float-реално число със знак

4 bytes

от 3.4х10-38 до 3.4х10+38

double-реално число със знак, но много по-голямо


8 bytes

от 1.7х10-308 до 1.7х10+308

фиг. 18
Представянето на величините от реален тип в паметта се отличава значително от представянето на целочислените величини. Всяко дробно число се представя с две стойности – първата, наречена мантиса, съдържа числото, съдържащо всички значещи цифри, но представено като число не по-голямо от 10 и не по-малко от 1; втората, наречена порядък, съдържа степента, на която трябва да повдигнем числото10 преди да го умножим с мантисата, така че да се получи нашето число. Това може да стане ясно чак след разглеждане на няколко примера.

Пример 1 :

Числото 34567.68 се представя чрез мантиса: 3.456768 и порядък: 4, което означава, че като преместим десетичната точка с 4 знака надясно, се получава точно разглежданото число.

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


Число

Мантиса

Порядък

3428.453

3.428453

3

23.0007

2.30007

1

0.000000078934

7.8934

-12

6.789

6.789

0

фиг. 19

Както вече видяхме в таблицата на дробните типове за типа float се заделят 4 байта, т. е. 32 бита. Част от тях се заделят за мантиса, а останалите – за порядък. Ето защо този тип може да работи само с числа, чиято абсолютна стойност е не по-голяма от 1037 и не по-малка от 10-37. Подобно на описаният по-горе начин в отделената за порядъка не може да се запише число по-голямо от 37 или по-малко от –37. Въпреки, че числата от тип float могат да са твърде големи (все пак 1037 не е малко число), се оказва, че мястото, заделено за мантиса също е малко за представяне на число с 36 осмици. Видяхме, че в четири байта не могат да се съберат числа с много цифри по простата причина, че трябва да се кодират чрез 0 и 1. Ето защо броят на значещите цифри на едно число от тип float, независимо колко голямо е то, е не повече от 7, т.е. оказва се, че с числата от този тип може да пресмятаме стойности, които са достъпни за най-простите джобни калкулатори. Когато числото надхвърли 7 значещи цифри, програмата автоматично го закръгля, така че да се получи число с по-малък брой цифри. Например числото 99999999 се представя като число с мантиса 1 и порядък 9, т.е. закръгля се към 100000000.

Все пак не можем да допуснем, че в ежедневната практика никага няма да се наложи да използваме числа с повече значещи цифри. Напротив, можем да дадем куп примери за обратното. (Опитайте да преброите цифрите на разстоянието от Земята до Луната или на дължината на екватора.). В такива случаи се използва тип double, който запазва до 15 значещи цифри.


  1. Допустими операции за стандартните числови типове:

а) аритметични:

знак

операция

+

събиране

-

изваждане

*

умножение

/

деление

%

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

Използват се по познатият математически начин: a+b, c-d, x*y, z/t и т.н. Изброените операции са валидни за всички числови типове. Изключение прави операцията “%”. Тя е дефинирана само за операнди от цял тип. Интересна е интерпретацията на операцията “/” при прилагането и към различните типове данни. Когато се прилага към целочислени величини, резултатът е цялата част от делението на тези величини, докато ако се прилага към реални – резултатът е закръглена десетичната дроб, получена при делението на двете величини.



Пример 2:

5 / 2 2

5.0 / 2=2.5

5 % 2=1


Пример 3:

int a, b;

a=5; b=2;

тогава:

a/b=2;


a%b=1;

Пример 4:

float a, b;

a=5; b=2;

тогава:

a/b=2.5;


Естествено е да си зададем въпроса: Можем ли да получим резултата от делението на две цели числа като десетична дроб? Ако става дума за конкретни стойности, то чрез записване на точка след стойността на поне едно от целите числа, участващи в операцията, го превръщаме в дробно. Програмата приема тази операция за дробна и я изпълнява като такава, т. е. резултатът от операцията 5. / 2 е 2.5, тъй като числото 5. се приема от програмата за дробно.

Задача:

Нека int a,b,c;



float x,y;

Определете типа на резултата:



Пример

Резултат

Пример

Резултат

c=a/b

x=a/b


c=a/x

c=x/a


int

int


int

int


x=a/y

a/b


a/x

x/a


float

int


float

float

фиг. 20

б) операции за присвояване


  • обикновена (стандартна) – позволява присвояване на стойности на променливи. Означава се със символа за равенство “=”.

Ето и нейните синтаксис и семантика:

Синстаксис (правило за запис):

име_на_променлива=израз;



Семантика (правило за изпълнение):

- Пресмята се стойността на израза.

- Получената стойност се записва на мястото, заделено в паметта на компютъра за съответната променлива.

- Резултатът от операцията за присвояване е присвоеният израз.



Пример 5 :

a=5;


b=a*3+2;

С първият оператор за присвояване на мястото в оперативната памет, което е заделено за променливата с име а, се записва числото 5. При втория оператор за присвояване първо се пресмята стойността на израза вдясно(17) и след това тази стойност се записва на мястото, заделено за променливата b.



Забележка 1:

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

a=b=1.

В този случай първо ще се пресметне изразът вдясно от първата операцията за присвояване и тъй като това също е операция за присвояване, първо на променливата b ще се присвои стойност 1, след това операцията b=1 ще върне стойност 1, която от своя страна ще се присвои на променливата а.



Забележка 2:

Има разлика между “=” в математиката и “=” – операцията за присвояване. Например, докато в математиката е напълно безмислен записа х=х+1, то в езика за програмиране С++ това означава, че първо ще се прочете от паметта, заделена за променливата х, нейната стойност, след това към нея ще се прибави числото 1 и получената в резултат на това стойност ще се присвои на променливата х, при което старата стойност на тази променлива ще бъде заместена с новата. Освен това в математиката е разрешено вляво от знака за присвояване да стои израз, докато тук е задължително това да е име на променлива, на която се присвоява изразът отдясно.



Забележка 3:

В случай на присвояване на стойност, различна по тип от типа на променливата отляво компилаторът на С++ не извежда съобщение за грешка, а се извърщва автоматично преобразуване на типа на данните така, че да съответства на типа на променливата отляво. В такива ситуации може да се получи загуба на информация! Следният пример ясно я демонстрира.



Пример 6:

Нека int a=4, b=5,C;

float x=3.0,Y;


Израз

Резултат

C=a/b

Y=a/b


C=a/x

Y=a/x


C=0

Y=0


C=1

Y=1.333333


фиг. 21


  • съкратени операции за присвояване:

Стремежът за по-кратко записване на алгоритмите и увеличаване на скоростта за тяхното изпълнение е довело до по-странен начин на записване на операциите за присвояване, характерни за езика С:

a=a+b a + =b

a=a-b a - =b

a=a*b a * =b

a=a/b a / = b

a=a%b a % = b


Задача 1: Нека int x=3, y=1,z=5. Запишете в разширен вид операциите за присвояване:

x - =100;

y * =x;

z / =x+y;



Определете стойностите на променливите след изпълнение на операциите при зададените начални стойности.

  • операции за увеличаване и намаляване с 1:

++ -увеличаване с единица

-- -намаляване с единица

Записваме по следният начин: а=а+1++а;

а++;


а=а-1 --а;

а--;


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

Забележка 1:

Има разлика при използването на операциите ++ и --, в зависимост от това дали са записани преди или след операнда, към който се прилагат. Ако операцията е записана след операнда, то той участва в израза с досегашната си стойност и чак след като се извърши пресмятането, увеличава (намалява) стойността си с 1. Например, ако имаме променливите int x,y, след изпълнение на операциите

x=15;

y=5+х++;



променливите х и у ще имат стойности, съответно х=16, у=20. Това е така, защото когато се пресмята изразът, който трябва да се присвои на променливата у, променливата х участва в него със стойността си 15 и чак след изчислението се увеличава с 1.

Ако в същият пример променим мястото на операцията ++р т.е.

х=15;

у=5+(++х);



то резултатът от изпълнението им ще бъдат стойности за х и у, съответно х=16 и у=21. Сега вече три пресмятането на израза от втората операция, първо се х увеличава с 1 и чак тогава се пресмята стойността на израза.

в) Операция за последователно изпълнение – означава се с “ ,”

Синстаксис (правило за запис):

операнд1 , операнд2



Семантика (правило за изпълнение):

  • изчислява се операнд1

  • изчислява се операнд2

Резултат от операцията:

операнд2.



Тип на резултата:

типът на операнд2.



Пример 7:

Нека int а=5; тогава резултатът от операцията

а+6,а+7

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



Съвсем друг смисъл би имала операцията ако в първия израз вместо + се използва операцията +=. Тогава резултатът от операцията:

а+=6, а+7

ще бъде 18, защото при прилагане на първата операция ще се промени стойността на променливата а.

г) Операция за размер на обект – означава се със sizeof

Синстаксис (правило за запис):

sizeof (операнд)



Резултат от операцията:

размерите в байтове на отделните типове данни



Пример 8:

sizeof (int)=2

sizeof (float)=4

д) Операция за преобразуване на типове – означава се със ()

Синстаксис (правило за запис):

(тип)израз



Резултат от операцията:

Резултата от израза след операцията се интерпретира от програмата от типа, посочен в операцията.

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

Пример 9:

Нека са дадени променливите



int a=5, b=2;

Резултатът от операцията a/b ще бъде 2, тъй като с цели числа се извършва само целочислено деление. Ако искаме да получим реалния резултат като десетична дроб, ще трябва да използваме операцията за преобразуване на типове по следния начин:

(float)a/b, при което типът на израза се преобразува в реален и резултатът ще бъде 2.5.


  1. Изрази

а) как се получават изразите?

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

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



Пример 10:

(c/a)+(z*t)-(a+c)

(x1*10)=(c/10)

б) приоритет на операциите (или ред на изчисляване на изразите) Приоритета на операциите определя реда, в който те ще се изпълняват при пресмятането на изразите. В обикновенните математически изрази, с които сме свикнали да работим всеки ден първо се пресмятат операциите умножение и деление и след това събиране и изваждане. Изключение правят случаите когато използваме скоби. Тук в езика за програмиране С++, правилата са същите, с тази разлика, че използваме само един вид скоби за промяна на приоритета на операциите и това са кръглите скоби ( ). Останалите видове скоби, използвани в математиката [ ] и { } имат друг смисъл в езика С++. Ето разгледаните до тук операции, подредени по техния приоритет:

- ( )


++ --

* / %


+ -

= += -= *= /=

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

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



  1. Задачи за упражнение

Зад. 1. Кои от константите са от цял и кои от реален тип?

256, .256, -67, 12.0, -127, 5.0, 4.2538, 67.



Зад. 2. Кои от изброените операции са допустими за величини от реален тип?

+, *, %, /, -



Зад. 3. Какъв е резултатът от изпълнение на аритметичните операции:

15.0/4


16%4

17%3


-29%4

15/4


-16+4

7*4


35/(-6)

Зад. 4. Посочете какъв е резултата от операциите за присвояване b/=a, b-=a b%=a, ako:

а) int a=5, b=-7

б) float a=5.0; int b=-7;

в) int a=5; float b=-7.0;



Зад. 5. Какви са окончателните стойности на променливите x и y:

a) x=1+2*7; б) x=4+2*6; в) x=6*2;

y=3+x--; y=2*--x ; у=24/х++;

Зад. 6. Пресметнете:

а)(int) 17/4;

б)(int) 17/4.0;

в)sizeof (int);

г)x=(y=3, y+2).
Въвеждане и извеждане на данни в С++ програма


  1. Теоретични бележки

Един алгоритъм може да се изпълни от компютър, ако е записан като програма на даден език за програмиране. За използването и в конкретна ситуация трябва величините в програмата да получат конкретни стойности – т.нар. входни данни.


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

При работата на програмата с входните данни се получава конкретен резултат или т.нар. изходни данни.

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





#include

void main()




{

1. Задава се дъжината а и ширината b на правоъгълника.

float a,b,P;

cin>>a>>b;

2. Пресмята се периметъра P на правоъгълника по форулата P=2*(a+b).

P=2*(a+b);

3. Съобщава се P.

cout<




}

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


  • първата, с която определяме първоначалните стойности на величините, т.е. входните данни;

  • последната, с която извеждаме резултатите от работата (изпълнението) на програмата, т.е. иходните данни.

За реализиране на тези стъпки в програмата използваме оператора cin>>a>>b, които ще наричаме оператор за вход, и cout<оператор за изход.

  1. Библиотеки

Както вече неколкократно стана дума, тъй като в езика С и С++ не са реализирани всички стандартно използвани функции, те се предоставят на програмистите в множество библиотеки. Към тези библиотеки принадлежат и библиотеките, съдържащи различни средства за вход и изход. Библиотеките, които основно осъществяват вход-изхода в езика С са stdio.h и conio.h, в езика С++ към тях се прибавят още iostream.h и fstream.h.

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




# include

void main()

{

float a,b,P;

cin>>a>>b;

P=2*(a+b);

cout<

}

Каталог: tadmin -> upload -> storage
storage -> Литература на факта. Аналитизъм. Интерпретативни стратегии. Въпроси и задачи
storage -> Лекция №2 Същност на цифровите изображения Въпрос. Основни положения от теория на сигналите
storage -> Лекция 5 система за вторична радиолокация
storage -> Толерантност и етничност в медийния дискурс
storage -> Ethnicity and tolerance in media discourse revisited Desislava St. Cheshmedzhieva-Stoycheva abstract
storage -> Тест №1 Отбележете невярното твърдение за подчертаните думи
storage -> Лекции по Въведение в статистиката
storage -> Търсене на живот във вселената увод
storage -> Еп. Константинови четения – 2010 г някои аспекти на концептуализация на богатството в руски и турски език


Сподели с приятели:
1   2   3   4   5   6   7   8   9   ...   12




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

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