- •1.1 Алгоритм і його властивості
- •1.2 Мови програмування
- •1.3 Системи числення
- •2 Засоби мови с
- •2.1 Алфавiт мови
- •2.2 Константи
- •2.4 Оголошення даних
- •3 Структура програми, директиви препроцесору
- •4 Елементарні алгоритми
- •4.1 Лiнiйна програма
- •4.2 Розгалуження
- •4.3 Цикли
- •6 Вкладені алгоритми
- •7 Складні типи даних
- •9 Процедури
- •9 Файли
- •10 Динамічні конструкції даних
- •11 Сортування
- •12 Пошук
- •13 Класи
1.3 Системи числення
Система числення – це сукупність правил запису чисел та виконання над ними певних дій.
Мова С широко використовується для розв’язку задач системного та низькорівневого програмування, тому однією з необхідних умов програмування є розуміння порядку представлення чисел та правил конвертації числових даних в різних системах числення.
Для представлення чисел використовують спеціальні знаки, наприклад, цифри. За вагою кожного знака розрізняють два види систем числення: позиційні та непозиційні. У позиційних системах числення кожний розряд числа має власну вагу, наприклад, у числі 2008 наймолодший розряд (цифра 8) визначає кількість одиниць, друга – десятків і т. д. Прикладом непозиційної систем числення є римська, в якій те ж число 2008 буде виглядати як MMVIII. Тут три наймолодші розряди (знаки I) мають однакову вагу, кожний з них дорівнює одиниці. А кожна з двох перших цифр (ММ) означає одну тисячу, хоча знаходяться вони в різних місцях (розрядах) числа.
Сьогодні широко вживається позиційна десяткова система числення, основою якої є число 10. У процесі розвитку людства використовувалися й системи з іншими основами, наприклад, дюжина дорівнює 12 одиниць, година складається з 60 хвилин та інші.
В техніці найчастіше застосовуються позиційні системи числення, бо вони дозволяєть спростити автоматизацію обчислювального процесу за рахунок упорядкованості ваги розрядів. У сучасних цифрових обчислювальних машинах використовується двійкова система числення, яка має лише два знаки (дві цифри): 0 і 1, що дозволяє найпростіше її технічно реалізувати: 1 – є електрична напруга, 0 – немає, при цьому не вимагається висока стабільність напруги.
Найменший об’єм пам’яті, де записано 0 або 1, називається один біт, 8 біт складають 1 байт.
Процес запам’ятовування чисел комп’ютером можна показати на прикладі електронного пристрою, який називається тригером. Він має один вхід і два виходи, стійких стани: Q1 = 1 та Q2 = 0. Якщо на вхід тригера подати електричний імпульс, то його стани зміняться на протилежні, тобто Q1 = 0, а Q2 = 1. Таким чином, тригер – це елементарна комірка пам’яті, об’єм якої дорівнює один біт. З’єднавши послідовно декілька тригерів, одержимо комірку пам’яті, де в двійковій системі числення буде знаходитися число імпульсів, поданих на вхід першого тригера.
За допомогою тригерів можна також забезпечити трійкову систему числення, яка вважається оптимальною. Її три цифри 0, 1, 2 фізично можна представити як -1, 0 і 1.
У програмуванні мовою С, крім десяткових, часто приходиться обробляти цілі числа двійкової системи числення. Для перекладу цілого десяткового числа в двійкове необхідно його та всі результати першого ділення поділити на 2. Першою цифрою двійкового числа буде результат останнього ділення, решта – всі залишки від ділення від першого до останнього Продемонструємо хід роботи на перекладі числа 18.
18:2=9, залишок: 0;
9:2=4, залишок: 1;
4:2=2, залишок: 0;
2:2=1, залишок: 0;
останній результат ділення на 2: 1.
Одержане двійкове число дорівнюватиме 10010, для перевірки результату перекладемо його назад у десяткову систему числення. Для цього помножимо кожний розряд на 2і , де 2 – основа двійкового числа, (нумерація розрядів починається з крайнього правого), n – кількість розрядів (тут n=5), і додамо всі результати множення. Отже,
1×24+0×23+0×22+1×21+0×20=16+0+0+2+0=18.
Якщо число дійсне, то його цілу і дробову частину перекладають окремо. Під час перекладу дробової частини числа її багаторазово послідовно множать на два, а цілі результати цього множення читають зверху до низу. Нижче подано приклад перекладу десяткового числа 0,2 у двійкову систему числення:
0,2 × 2 = 0,4, ціла частина множення дорівнює 0;
0,4 × 2 = 0,8, ціла частина множення дорівнює 0;
0,8 × 2 = 1,6, ціла частина множення дорівнює 1;
0,6 × 2 = 1,2, ціла частина множення дорівнює 1;
0,2 × 2 = 0,4, ціла частина множення дорівнює 0 і т. д.
Тоді одержимо: 0,2 десяткове = 0,(0011) двійкове – періодичний дріб. Оскільки довжина комірки машинної пам’яті фіксована, то число 0,2 буде представлено неточно, його “хвіст” буде відкинений. Покажемо це на прикладі, перекладемо число 0,2 назад у десяткову систему числення, взявши лише його перші 4 розряди, тоді:
0×2-1+0×2-2+1×2-3+1×2-4=0+0+1/8+1/16=3/16=0,1875.
Дії над двійковими та іншими числами відбуваються подібно до десяткових, лише враховується те, що під час виконання операції додавання переповнення молодшого розряду настає при досягненні основи. Якщо в десятковій системі числення переповнення молодшого та додавання одиниці до старшого розряду відбувається при десятій одиниці, то в двійковій – при другій. Наприклад, додамо два десяткові числа 15+3=18 у двійковому представленні:
1111
+11
=10010
Відповідно при відніманні “позичений” сташий розряд “розмінюється” на декількість одиниць основи. Покажемо приклад віднімання двох чисел: 18-15=3. Тоді в двійковій системі числення матимемо такий результат:
10010
-1111
=11
Поряд із десятковою та двійковою в програмах мовою С застосовують вісімкову та шістнадцяткову системи числення, основою яких є числа відповідно 8 і 16. Вони утворюються з десяткових цифр, а якщо цифр замало, то й букв А, B, C, D, E, F. Наприклад, у 16-й системі числення число С=12 десяткових одиниць. Ці системи вигідні тим, що спрощують переклад своїх чисел у двійкові та навпаки за рахунок кратності. Нехай, наприклад, десяткове число дорівнює 23. Перекладемо його в вісімкову систему числення. 23:8=2, залишок дорівнює 7, отже, вісімкове число дорівнює 27. Представимо його двійковими тріадами, для цього кожну цифру перекладемо у двійкову систему числення. Тоді одержимо дві тріади: 010 111, а, відкинувши зайвий нуль у старшому розряді, матимемо двійкове число 10 111. Перевірка:
1*24+0*23+1*22+1*21+1*20=16+0+4+2+1=23.