Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Вакал - Мова Сі (Типи данних та основні структури керування)

.pdf
Скачиваний:
15
Добавлен:
07.03.2016
Размер:
460.57 Кб
Скачать

команду Make EXE file з меню Compile (клавіша <F9>) для побудови у відповідності з файлом проекту готової до виконання програми. Якщо у вікні зборки з’являється повідомлення Success (успіх), то можна викликати побудовану програму для виконання командою Run з меню Run (клавіатурна комбінація <Ctrl+F9>). Результати роботи програми відображаються на екрані користувача. Для його перегляду необхідно виконати команду User Screen з меню Run або скористатися клавіатурною комбінацією<Alt+F5>. Для повернення в ІС необхідно натиснути будь-яку клавішу.

11

РОЗДІЛ 2. Елементи мови Ci

Під елементами мови розуміються її базові конструкції, які використовуються при написанні програм. Розглянемо основні елементи мови Ci:

алфавіт

константи

ідентифікатори

ключові слова

коментарі.

Класифікація символів

Множина символів мови в залежності від призначення і використання поділяється на декілька груп.

1.Символи для утворення ключових слів та ідентифікаторів:

великі літери латинського алфавіту: ABC... XYZ;

малі літери латинського алфавіту: abc ... xyz;

арабські цифри: 0 .. 9;

символ підкреслення _.

Компілятор Ci розглядає одну й ту ж саму велику і малу літеру як різні. Всередині символьних констант, рядків та коментарів може бути

використаний будь-який представимий символ даного комп’ютера. 2. Знаки пунктуації (розділювачі). Їх список наводиться в таб.1.

Таблиця 2.1. Знаки пунктуації мови Ci

Символ

Назва

Символ

Назва

,

кома

+

знак плюс

.

крапка

-

знак мінус

;

крапка з комою

{

ліва фігурна дужка

:

двокрапка

}

права фігурна дужка

?

знак питання

[

ліва квадратна дужка

`

апостроф

]

права квадратна дужка

!

знак оклику

<

знак менше

|

вертикальна риска

>

знак більше

/

дробова риска

=

знак рівності

\

зворотна дробова риска

#

знак номера

 

(слеш)

 

 

~

тільда

%

процент

*

зірочка (знак

&

амперсанд

 

множення)

 

 

(

кругла ліва дужка

²

подвійні лапки

)

кругла права дужка

^

стрілка вгору

3.Символи пропуску: пропуск, символи табуляції, переведення рядка, повернення каретки, переведення формату і нового рядка. Вони відокремлюють один від одного об’єкти мови.

4.Крім цих груп символів, використовуються також послідовності управління – спеціальні символьні комбінації, що розглядаються як один

12

символ. Кожна така комбінація починається з символу ‘\’ ( зворотна дробова риска – backslash), за яким вказується або літера, або знак пунктуації, або комбінація цифр. Дані спеціальні символи не мають графічного представлення на екрані дисплею, клавіатурі або принтері. В таб. 2.2 наводиться список спеціальних символів мови Ci.

Таблиця 2.2. Спеціальні символи мови Ci

Спеціальний

Найменування

Спеціальний

Найменування

символ

 

символ

 

 

 

 

 

\n

новий рядок

\r

повернення каретки

\t

горизонтальна табуляція

\’

апостроф

\v

вертикальна табуляція

\²

лапки

\b

повернення на крок

\\

зворотна дробова риска

\f

нова сторінка

\ddd

символ з кодом у вісім-

 

 

 

ковому представленні

\a

звуковий сигнал

\xhh

символ з кодом у шістнад-

 

 

 

цятковому представленні

Якщо зворотна дробова риска передує символу, відсутньому у таблиці і який не є цифрою, то вона ігнорується, а символ представляється звичайним способом.

Константи

Константами називають величини, що не можуть змінити своє значення при виконанні програми. У мові Ci розрізняють 5 типів констант: цілі, дійсні, символьні, рядкові та переліку.

Цілі константи. Мовою Ci визначені цілі константи – десяткові, вісімкові або шістнадцяткові числа, які представляють цілі величини у десятковій, вісімковій або шістнадцятковій формі.

Десяткові константи визначені як послідовності десяткових цифр, причому першою цифрою не повинен бути 0.

Вісімкова константа представляє собою послідовність цифр від 0 до 7, що починається з 0.

Послідовність шістнадцяткових цифр (0,1,…,9, A,B,C,D,E,F), перед якою записані символи 0x або 0X, вважається шістнадцятковою константою.

Приклади цілих констант наведені в таб. 2.3.

Таблиця 2.3. Приклади цілих констант

Десяткові константи

Вісімкові константи

Шістнадцяткові константи

16

020

0X10

127

0177

0x7F

441

0674

0X1B9

Цілі константи завжди представляють собою додатні величини. Якщо необхідне від’ємне значення, то формується константний вираз, що складається із знаку мінус унарної операції зміна знаку (-) і константи. Так

13

константні вирази -12, -0xС представляють число -12.

Кожна ціла константа відноситься до відповідного типу, який визначає її представлення у пам’яті. Тип константи залежить від її значення і визначається так:

1.Десяткові константи розглядаються як величини із знаком і їм присвоюється тип int або long у відповідності з розміром константи. Якщо значення константи належить діапазону від 0 до 32767, їй присвоюється тип int, для констант з діапазону від 32768 до 2147483647 присвоюється тип long. Представлення у пам'яті констант типу int залежить від реалізації ПК і відповідає прийнятій на ньому стандартній довжині слова (звичайно 2 байти), типу long – довжині подвійного слова (4 байти).

2.В системі Турбо Ci константи можуть розглядатися як цілі беззнакові. Вони записуються як звичайні цілі, з тим лише винятком, що використання знаку заборонено. Їм присвоюється тип unsigned int (unsigned) або unsigned long. Десяткові константи без знаку типу unsigned int звичайно належать діапазону 0.. 65535 і займають у пам'яті 2 байт, unsigned long – діапазону 0..4294967295 (виділяється 4 байти).

3.Вісімковим і шістнадцятковим константам присвоюється тип int, unsigned int, long або unsigned long в залежності від розміру константи. Якщо значення константи більше максимального додатного значення, представимого типом int, то їй присвоюється тип unsigned int. Якщо значення константи більше максимального значення, представимого типом unsigned int, вона представляється як long. Якщо розміру цього типу недостатньо – типом unsigned long.

Якщо користувача не задовольняє тип, який компілятор приписує константі, він може явно вказати тип у її записі. Щоб визначити для цілої константи тип long, достатньо у кінець константи приписати суфікс ‘l’ ( або ‘L’). Наприклад, числа 12l, 956L є константами типу long. Для них в пам'яті відводиться 4 байти. Аналогічно за допомогою суфіксу ‘u’ ( або ‘U’) можна представити цілу константу у вигляді беззнакового цілого unsigned. Наприклад, 50000U є константою типу unsigned int. Їй виділяється 2 байти (замість 4, як було б при відсутності суфіксу).

Можна використовувати обидва позначення одночасно. Це дозволяє приписати цілій константі тип unsigned long, і вона займе в пам’яті 4 байти.

Зауваження. Якщо значення константи перевищує 65535, незалежно від основи, що використається, наявності чи відсутності суфікса ‘u’ ( або ‘U’), вона

стає типу unsigned long.

Дійсні константи. Для представлення дійсних чисел використовуються константи, представимі у пам’яті ЕОМ у формі з плаваючою крапкою. Кожна дійсна константа складається з цілої частини (десяткова ціла константа), десяткової точки, дробової частини (десяткова ціла константа), символу експоненти ‘e’ ( або ‘E’) і показника ступеня за основою 10 ( десяткова ціла константа, можливо із знаком ‘+’ або ‘-’). Знак ‘+’ у запису можна не писати,

14

дозволяється також опускати десяткову крапку або експоненціальну частину (але не одночасно), цілу або дробову частину (але не одночасно).

Наведемо деякі можливі способи запису десяткового числа

9.20

9.2

920e-2

92.E-1

.92E1

Дійсні

константи

завжди представляють

додатні величини подвійної

точності (мають тип double). Для визначення від’ємної величини необхідно сформувати константний вираз, який складається із знаку мінус і наступної константи.

Дійсна константа займає в пам'яті 8 байт. Їй можна явно присвоїти тип float, додавши суфікс ‘F’ ( або ‘f’) або тип long double, додавши суфікс ‘L’ ( або ‘l’). Наприклад,

5.7568F – константа типу float (виділяється 4 байти); 5.75L – константа типу long double (виділяється 10 байт).

У таб. 2.4 наводяться відомості про представлення констант дійсних типів.

 

 

Таблиця 2.4. Дані дійсних типів

Тип даних

Розмір, біт

Діапазон абсолютних значень

 

float

32

3.4E-38 .. 3.4E+38

 

double

64

1.7E-308 .. 1.7E+308

 

long double

80

3.4E-4932 .. 1.1E+4932

 

Символьні константи. Для зображення окремих знаків, що мають індивідуальні внутрішні коди, використовуються символьні константи. Вони зображуються у три способи:

1.Символи коду ASCII, обмежені апострофами, наприклад, 'A', '5', 's'.

2.Послідовності управління виду '\символ', наприклад, '\n' – символ нового рядка, '\b' – повернення на крок, '\\' – зворотна дробова риска, '\0' – нульсимвол. Перелічені константи зображаються двома і більше символами, проте позначають лише одну символьну константу, що має індивідуальний двійковий код.

3.Послідовності виду ‘\ddd’ або ‘\xhh’ чи ‘\Xhh’. Тут ‘\ddd’ – вісімкові представлення довільної символьної константи (d – вісімкова цифра від 0 до 7); ‘\xhh’ чи ‘\Xhh’ – шістнадцяткові представлення довільної

символьної константи (h – шістнадцяткова цифра від 0 до F).

Значенням символьної константи є числовий код символу у кодовій таблиці. Символьні константи мають цілий тип int, змінюються в діапазоні 0..255 або -128..127 в залежності від реалізації на ПК, для їхнього зберігання використовуються 2 байти. В останньому випадку тільки значення від 0 до 127 мають символьні еквіваленти, молодший байт є сигналом переповнення у старшому байті.

Рядкові константи (літерали). Рядкова константа визначається як послідовність символів, що береться у подвійні лапки. Наприклад,

"Це рядок символів"

15

Всі недруковані символи, лапки (”), зворотна дробова риска (\), символ нового рядка та ін. у рядковій константі представляються відповідними послідовностями управління, які розглядаються як один символ. Символи рядкової константи розташовуються у неперервній області пам'яті (послідовно). Кожний символ займає рівно 1 байт. У кінець кожної рядкової константи компілятор додає '\0' – нуль-символ.

Рядкова константа має тип char [ ]. Це означає, що вона є масивом символів. Число елементів цього масиву дорівнює числу символів у рядковій константі плюс 1, так як нуль-символ також є елементом масиву.

Рядкові константи можуть розташовуватися на декількох рядках. Традиційним способом формування таких констант є використання зворотної дробової риски з наступним натисненням клавіші <Enter>. Символ ‘\n’ ігнорується компілятором і наступний рядок вважається продовженням попереднього. Крім того, два або більше рядки, розділені символами пропуску, також розглядаються як один рядок. Розглянемо просту програму:

#include <stdio.h> main ()

{

*ch;

ch="це приклад того" "як Турбо Ci виконує\ конкатенацію\рядків"; puts(ch);

}

в результаті роботи якої утворюється рядкова константа

"це приклад того як Турбо Ci виконує конкатенацію рядків"

Константи переліку. Імена, перелічені у списку при описі типу переліку трактуються як цілі константи.

Ідентифікатори

Імена змінних, типів, функцій і міток, що використовуються у програмі, називаються ідентифікаторами. Ідентифікатор складається з послідовності латинських літер, цифр і символу підкреслення ‘_’. Ідентифікатор може починатися тільки з літери або символу підкреслення. Компілятор розрізняє великі і малі літери. У Турбо Ci допускається довільне число символів у ідентифікаторі, проте значущими є лише перші 32 символу імені. Компілятор мови Ci має опцію, що дозволяє змінювати число значущих символів у ідентифікаторах.

При виборі ідентифікаторів слід дотримуватися певних правил:

не можна використовувати ідентифікатори, які співпадають по написанню з ключовими словами;

не рекомендується використовувати ідентифікатори, що починаються з символу підкреслення ‘_’, так як вони можуть співпадати з

16

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

Ключові слова

Заздалегідь визначені ідентифікатори, що зарезервовані в мові Ci, тобто такі, що не можна вільно використовуватися як імена, називають службовими або ключовими словами. Ключові слова визначають типи даних, класи пам’яті, кваліфікатори типу, оператори та ін.

Коментарі

Послідовність символів, розташованих між знаками /* і */, називається коментарем. Символи всередині коментарю можуть бути будь-якими, крім */. Коментарі можуть займати більше одного рядка, але не можуть бути вкладеними. Коментарі допускаються всюди, де дозволені символи пропуску.

17

РОЗДІЛ 3. Типи даних мови Ci та основні структури керування

Елементи даних, які можуть змінювати свої значення в процесі виконання програми, називаються змінними. У програмі на Турбо Ci всі змінні перед використанням повинні бути оголошені, тобто віднесені до одного з наявних типів. Тип змінної визначає множину значень, яку вона може приймати, сукупність дій, що можуть бути виконані над цими значеннями, а також вигляд внутрішнього представлення змінної. Усі типи даних можна поділити на дві категорії: скалярні (прості) та складені, які будуються на основі скалярних (рис. 3.1).

 

 

 

 

 

Типи даних

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Скалярні

 

 

 

 

 

Складені

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Основні

 

 

 

 

 

 

 

 

 

Вказівники

Переліку

Масиви

Структури

Об’єднання

арифметичні

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Цілі Дійсні

Рис.3.1. Типи даних мови Ci

Перелічимо нижче ключові слова, які використовуються при оголошенні типів даних:

для цілих типів: char, int, short, long, signed, unsigned;

для дійсних типів: float, double, long double;

для структури: struct;

для об’єднання: union;

для переліку: enum.

Вказівники та масиви визначаються за допомогою спеціальних синтаксичних форм.

При оголошенні типу вказується ключове слово, яке визначає тип (char, int та ін.), потім ім’я оголошуваної змінної, яке може бути визначене з квадратними та круглими дужками (після імені) або із зірочкою (до імені). Наприклад,

int ch,a,b;

/*

ch,a,b – цілочисельні змінні */;

int *c;

/*

c –

вказівник на цілочисельну змінну */

char n[30];

/*

n –

символьний масив */

Роздільником між іменами змінних одного типу є кома, весь список змінних одного типу відокремлюється від списку змінних іншого типу крапкою з комою.

18

Ініціалізація змінних

При оголошенні змінних їм можна присвоювати початкові значення, явно вказуючи їх у визначеннях:

<тип> <імя_змінної>=<значення>;

Цей прийом називається ініціалізацією. Ініціалізація супроводжується виділенням змінній відповідного об’єму пам'яті.

Приклади оголошень з ініціалізацією:

int x=1,y=2; char a='y';

int list[2][3]={1,2,3,4,5,6};

Якщо при ініціалізації масиву вказується менше значень, чим його розмірність, всі інші елементи масиву замінюються нулями.

Іменовані константи

Дані довільного типу можуть бути оголошені як немодифіковані. Для цього при описі типу слід вказати ключове слово const, яке вказує на те, що даний об’єкт має постійне значення. Приклади:

const float pi=3.14; const double e=2.718282; const mmx=32;

Якщо у визначенні константи тип не вказується, їй приписується тип int.

3.1. Цілі типи даних

Мова Ci підтримує цілі типи, визначені як знакові (signed):

Таблиця 3.1. Цілі знакові типи

Тип даних

Розмір, біт

Діапазон значень

char

8

-128..127

int

16

-32768..32767

short int (short)

16

-32768..32767

long int (long)

32

-2147483648..2147483647

Представлення у пам’яті і діапазон значень величин типу int залежить від реалізації. У більшості систем програмування розмір типу int відповідає довжині слова на даній машині. Тому на 16-розрядних ЕОМ величина типу int займає 16 розрядів, тобто 2 байти, на 32 розрядних – 4 байти. Таким чином, тип int еквівалентний або short int або long int в залежності від розрядності комп’ютера. Проте компілятор мови Ci, реалізований на IBM-сумісних ПК, що розглядається в даному посібнику, відводить для типу int лише 16 розрядів.

Значенням об’єкту типа char є код у таблиці ASCII, який відповідає даному символу. Тип char інтерпретується як однобайтове ціле з областю значень від - 128 до 127. При цьому тільки значення від 0 до 127 мають символьні еквіваленти. У виразах змінні типу char можуть змішуватися із змінними типу int, оскільки і ті і інші належать цілому типу.

19

За умовчанням усі змінні цілого типу вважаються знаковими signed. Проте Ci дозволяє оголошувати деякі типи беззнаковими. Це означає, що величини цих типів можуть приймати тільки додатні значення.

Таблиця 3.2. Цілі беззнакові типи

Тип даних

Розмір, біт

Діапазон значень

unsigned char

1

0..127

unsigned int

2

0..65535

unsigned short

2

0..65535

unsigned long

4

0..4294967295

Ключові слова signed і unsigned можуть вживатися і самостійно при визначенні змінних. У цьому випадку змінні розглядаються як типу signed int і unsigned int. Ключові слова signed і unsigned вказують, як інтерпретується старший біт внутрішнього представлення змінної. Специфікатор signed вимагає, щоб старший біт сприймався як знаковий, unsigned означає, що старший біт розглядається як частина числа. Вибір знакового або беззнакового представлення визначає граничні значення, які може набувати описана змінна.

3.2. Дійсні типи даних

Стандартом мови Ci введені такі дійсні типи:

float – дійсні одинарної точності;

double – дійсні подвійної точності;

long double – дійсні максимальної точності.

Значення всіх дійсних типів представляються в ЕОМ у формі з плаваючою крапкою, тобто з мантисою і порядком, як було розглянуто при визначенні констант. Значення типу float займають 4 байти, що складаються із знакового біту, 7-бітової експоненти і 24 бітової мантиси. Значення типу double займають 8 байт (1 біт для знаку, 11 біт для експоненти, 52 біти для мантиси). Значення типу long double займають 10 байт. Їх формат аналогічний формату типу double, проте мантиса довша на 16 біт. Граничні значення дійсних змінних співпадають з граничними значеннями відповідних констант (таб.4).

Про пам’ять, яку займають дані у програмі, можна дізнатися за допомогою програми:

#include <stdio.h> main()

{

printf("int займає %d байта\n",sizeof(int)); printf("short займає %d байта\n",sizeof(short)); printf("long займає %d байта\n",sizeof(long)); printf("unsigned займає %d байта\n",sizeof(unsigned)); printf("unsigned short займає %d байта\n",

sizeof(unsigned short)); printf("unsigned long займає %d байта\n",

sizeof(unsigned long));

printf("char займає %d байта\n",sizeof(char)); printf("unsigned char займає %d байта\n",

20