- •1 Загальні поняття
- •1.1 Стандарт мови с
- •1.2 Алгоритм і його властивості
- •1.3 Системи числення
- •2 Засоби мови с
- •2.1 Алфавiт мови
- •2.2 Константи
- •2.3 Прості змiннi
- •2.4 Оголошення даних
- •2.5 Cтандартні функцiї
- •2.6 Операцiї
- •2.7 Вирази
- •2.8 Оператори
- •3 Структура програми, директиви препроцесору
- •4 Елементарні алгоритми
- •4.1 Лiнiйна програма
- •4.2 Розгалуження
- •4.3 Цикли
- •5 Вкладені алгоритми
- •6 Складні типи даних
- •7 Процедури
- •8 Операції над бітами
- •9 Файли
- •10 Зв’язані списки
1.2 Алгоритм і його властивості
Хід виконання будь-якої роботи можна представити у вигляді послідовності елементарних операцій, яку називають алгоритмом. Алгоритм будують для певного виконавця, який має свою власну систему команд і може їх розпізнавати та виконувати, тому алгоритм – це послідовність команд виконавця.
Алгоритм може мати різні ступені деталізації. Якщо виконавець – комп’ютер, то алгоритмом для нього буде програма, записана в машинних кодах, тоді буде досягнена найвища ступінь деталізації. Програма, написана алгоритмічною мовою, теж алгоритм, але з меншим ступенем деталізації, він призначений для компілятора.
Як правило, алгоритм представляють у графічному вигляді. Графічний алгоритм будують за допомогою спеціальних графічних символів, кожний з яких означає певну дію, вони стандартизовані.
Слово алгоритм походить від аль-Хорезмі – імені арабського математика, який жив у ІХ ст. в м. Хіва (нині обласний центр на півночі Узбекистану). Він відомий тим, що розробив послідовність виконання чотирьох арифметичних операцій: додавання, віднімання, множення і ділення так, як ми це виконуємо зараз. У ХІV ст. цю послідовність дій почали застосовувати в Європі і назвали її алгоритмом. До того європейці виконували цю роботу настільки складно, що її міг виконувати тільки кваліфікований спеціаліст. У ХІХ ст. поняття алгоритму було поширено на будь-яку послідовність операцій.
Алгоритм має такі властивості:
-
Масовість. Алгоритм, побудований для розв’язання однієї задачі, повинен бути придатним для всіх задач даного класу;
-
Результативність. Обов’язково повинна бути досягнена поставлена мета;
-
Дискретність. Алгоритм повинен складатися з дискретних команд виконавця;
-
Однозначність. Кожна команда повинна бути чітко й однозначно визначена.
Будь-який алгоритм можна розчленити на такі три елементарні: лінійний, розгалужений і циклічний. Складні алгоритми містять вкладені один в одного елементарні алгоритми, найчастіше це вкладені цикли та розгалуження в циклі.
1.3 Системи числення
Система числення – це сукупність правил запису чисел та виконання над ними певних дій.
Мова С широко використовується для розв’язку задач системного та низькорівневого програмування, тому однією з необхідних умов програмування є розуміння порядку представлення чисел та правил конвертації числових даних в різних системах числення.
Для представлення чисел використовують спеціальні знаки, наприклад, цифри. За вагою кожного знака розрізняють два види систем числення: позиційні та непозиційні. У позиційних системах числення кожний розряд числа має власну вагу, наприклад, у числі 2008 наймолодший розряд (цифра 8) визначає кількість одиниць, друга – десятків і т. д. Прикладом непозиційної систем числення є римська, в якій те саме число 2008 буде виглядати як MMVIII. Тут три наймолодші розряди (знаки I) мають однакову вагу, кожний з них дорівнює одиниці. А кожна з двох перших цифр (ММ) означає одну тисячу, хоча знаходяться вони в різних місцях (розрядах) числа.
Сьогодні широко вживається позиційна десяткова система числення, основою якої є число 10. У процесі розвитку людства використовувалися й системи з іншими основами, наприклад, дюжина дорівнює 12 одиниць, година складається з 60 хвилин та інші.
В техніці найчастіше застосовуються позиційні системи числення, бо вони дозволяєть спростити автоматизацію обчислювального процесу за рахунок упорядкованості ваги розрядів. У сучасних цифрових обчислювальних машинах використовується двійкова система числення, яка має лише два знаки (дві цифри): 0 і 1. Її найпростіше технічно реалізувати: 1 – є електрична напруга, 0 – немає, при цьому не вимагається висока стабільність напруги.
Процес запам’ятовування чисел комп’ютером можна продемонструвати за допомогою пристрою, який називається тригером.
Тригер – це найпростіша цифрова схема, яка є цифровим автоматом. У комбінаційних схемах стан виходу Y в будь-який момент часу визначається лише поточним значенням входу X: Y=f(X). На відміну від них, стан виходу цифрового автомата залежить ще й від внутрішнього стану схеми Q: Y=f(X,Q). Іншими словами, цифровий автомат є не тільки перетворювачем інформації, але й зберігає попередню інформацію та є джерелом поточної інформації (джерелом поточного стану). Така властивість забезпечується наявністю в схемі зворотних зв’язків. Тригер має два стійких стани: Q = 1 та Q = 0, тому його часом називають бістабільною схемою. В якому із цих станів опиниться тригер залежить від рівнів сигналів на входах тригера та від його попереднього стану, тобто він “має пам’ять”.
Таким чином, тригер – це елементарна комірка пам’яті. З’єднавши послідовно декілька тригерів, одержимо комірку пам’яті, де в двійковій системі числення буде знаходитися число імпульсів, поданих на вхід першого тригера. Найменший об’єм пам’яті, де записано 0 або 1 називається один біт, 8 біт складають 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.
Дії над двійковими та іншими числами відбуваються подібно до десяткових, лише враховується, що під час виконання операції додавання переповнення молодшого розряду настає при досягненні основи. Якщо в десятковій системі числення переповнення молодшого та додавання одиниці до старшого розряду відбувається при десятій одиниці, то в двійковій – при другій. Наприклад, додамо два десяткові числа: 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.