Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Posibnyk_C.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.61 Mб
Скачать

МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ

Івано-Франківський національний технічний університет нафти і газу

В. М. Юрчишин, Б. В. Клим, В. Б. Кропивницька

ПРОГРАМУВАННЯ

НАВЧАЛЬНИЙ ПОСІБНИК

Івано-Франківськ

2012

УДК 004.4(075.8)

ББК 22.18

Ю 83

Рецензенти:

Литвинов В. В., доктор технічних наук, професор, завідувач відділу № 120 Інституту проблем математичних машин і систем НАН України,

Тимків Д. Ф., доктор технічних наук, професор, завідувач кафедри інформатики ІФНТУНГ,

Федорук П. І., доктор технічних наук, професор, завідувач кафедри інформаційних технологій Прикарпатського національного університету ім. В. Стефаника

Юрчишин В. М.

Ю 83 Програмування: навчальний посібник / В. М. Юрчишин, Б. В. Клим, В. Б. Кропивницька. – Івано-Франківськ: ІФНТУНГ, 2012. – 188 с.

ISBN

Навчальний посібник розроблений відповідно до робочої програми навчальної дисципліни “Основи програмування”. Містить загальні короткі відомості з основ програмування та опис засобів мови програмування С. Розглядаються окремі прийоми програмування, які демонструються на прикладах програм, зокрема з нафтогазової тематики. Подаються запитання для самоперевірки.

Посібник призначений для засвоєння прийомів програмування та отримання практичних навичок складання програм під час лабораторних і практичних занять та самостійної підготовки студентами першого курсу за напрямом підготовки 6.050103 – “Програмна інженерія” і може бути використаний студентами інших спеціальностей.

УДК 004.4(075.8)

ББК 22.18

ISBN © В. М. Юрчишин,

Б. В. Клим,

В. Б. Кропивницька,

© ІФНТУНГ, 2012

ЗМІСТ

Вступ _____________________________________________

4

1

Основні поняття ____________________________________

5

1.1

Мови програмування ________________________________

5

1.2

Системи числення __________________________________

9

1.3

Алгоритм і його властивості _________________________ 10

12

2

Засоби мови С _____________________________________ 14

14

3

Структура програми, директиви препроцесору _________ 31

31

4

Елементарні алгоритми _____________________________ 33

33

4.1

Лiнiйна програма __________________________________ 34

33

4.2

Розгалуження _____________________________________ 40

40

4.3

Цикли ____________________________________________

53

5

Бітові операції ­­­­­­­­­­­­­­­­­_____________________________________

68

6

Вкладені алгоритми ________________________________ _ 80

78

7

Складні типи даних ________________________________ 88

86

8

Обробка літерних рядків і дати _____________________

102

8.1

Рядки літер ________________________________________

102

8.2

Дата і час _________________________________________

105

9

Процедури ________________________________________ 112

110

10

Файли ____________________________________________

124

11

Динамічні конструкції даних _________________________

143

11.1

Зв’язані списки ____________________________________

143

11.2

Стеки _____________________________________________

151

11.3

Черги _____________________________________________

153

12

Сортування ________________________________________

157

12.1

Методи сортування _________________________________

157

12.2

Сортування масиву структур _________________________

167

12.3

Сортування зв’язаного списку ________________________

169

13

Пошук ____________________________________________

174

13.1

Алгоритми пошуку _________________________________

174

13.2

Використання допоміжного масиву структур для пошуку _

176

14

Класи ____________________________________________

180

14.1

Приклад програмування класу ________________________

180

14.2

Особливості класу __________________________________

184

Перелік рекомендованих джерел _____________________

188

ВСТУП

Під час розробки цього посібника автори ставили за мету привернути увагу програмістів-початківців до багатства засобів програмування та можливостей їх використання на підприємствах нафтогазової галузі. Значна його частина присвячена засвоєнню окремих прийомів програмування загального призначення. Розглядаються способи програмної реалізації деяких найбільш поширених алгоритмів і задач, таких як сортування, пошук даних, обробка текстів та ін. Демонструється дослідницький підхід до побудови алгоритмів розв’язування задач та способів їх програмної реалізації. Опис засобів програмування ілюструється прикладами програм мовою С.

Текст навчального посібника складається з 14 розділів. Наприкінці розділів даються контрольні запитання для самоперевірки.

Автори вдячні колективу кафедри програмного забезпечення автоматизованих систем Івано-Франківського національного технічного університету нафти і газу, на науково-методичному семінарі якої розглядався зміст посібника, а також студентам напряму підготовки “Програмна інженерія” за увагу до нього та цінні поради і зауваження.

1 Основні поняття

1.1 Мови програмування

Мова програмування відрізняється від звичайних мов насамперед тим, що її повинен розуміти комп’ютер. Обчислювальна машина має свою внутрішню, машинну мову, якою пишуться команди та дані, що обробляються цими командами. Машинна мова являє собою набір до декількох десятків порівняно простих і часто малозрозумілих команд. Наприклад, найпростіша машина має лише такі дві команди: логічне “І” та “НЕ”. Машинна мова базується на двійковій системі числення, тому програма, яку занесли в пам’ять обчислювальної машини і яку вона виконує, має лише два символи: нуль і одиниця. Зрозуміло, що така програма надзвичайно трудомістка, вона вимагає затрат величезної кількості часу і праці як на її складання, так на налагодження. Особливих труднощів додає й те, що текст програми, яка вже виконалася, але ще перебуває в пам’яті і яку часто потрібно прочитати, проаналізувати, знайти помилку та виправити, суттєво відрізняється від того двійкового коду, який ввели в машину спочатку. Під час виконання програми машина модифікує команди, а дані змінює, розібратися в такій програмі іноді просто неможливо.

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

Використання компілятора має свої особливості. Зрозуміло, що це автомат, машина, тому скомпільована програма буде набагато довша, а значить займе більший об’єм оперативної пам’яті і буде довше виконануватися, ніж написана безпосередньо в машинних кодах. Наприклад, компілятор мови PL/1 виготовляє програму довшу приблизно в 4 – 5 разів. Це особливо важливо враховувати при складанні системних програм. Вони керують ходом виконання прикладних програм, які працюють на їх тлі, тому не повинні забирати від них забагато ресурсів: пам’ять та час на виконання.

За ступенем близькості до машинної алгоритмічні мови поділяють на мови низького та високого рівня. Близькими до машинної мови низького рівня є асемблери, скомпільовані ними програми майже не відрізняються від програм, складених безпосередньо в машинних кодах. Однак, вони й не набагато скорочують затрати праці програміста. До мов високого рівня належать такі як Pascal, C, Java та ін.

Програма, складена мовою С, називається початковим або програмним модулем. Iм’я файлу, де вiн буде записаний має розширення *.c (операційної системи Windows). Для виконання на ПЕОМ вона повинна пройти двi стадiї: компiляцiю i редагування зв’язкiв. Результатом компiляцiї є об’єктний модуль (має розширення *.obj), який являє собою набiр машинних команд вiдповiдних операторам програми. Пiд час редагування мiж окремими дiльницями об’єктного модуля встановлюються зв’язки, пiд’єднуються зовнiшнi функцiї, призначаються конкретнi їхні адреси. Кiнцевим продуктом редагування є завантажний модуль (exe-файл).

Мову С (читається сі) розробила фiрма Bell Laboratories (США) в 1972 р., головне її призначення – забезпечити програмiста мовними засобами, якi об’єднують можливостi асемблера та мов високого рiвня. Виготовлена досвідченим програмістом програма мовою С після компіляції виходить лише приблизно на 10% довшою, ніж складена в машинних кодах.

Час її появи можна вважати переломним як у розвитку обчислювальних машин, так і їх програмного забезпечення. Найбільш поширеними в світі були тоді так звані IBM-сумісні комп’ютери, такі як IBM-370, ЕС-1035 та інші. Вони мали суттєві недоліки, зокрема, дорого коштували (по декілька мільйонів доларів), займали порівняно великі площі тих приміщень, де їх установлювали (сотні квадратних метрів), споживали багато енергії. Ставилися особливі вимоги до температури та вологості повітря приміщень, вимагалася висока кваліфікація обслуговуючого персоналу та ін. Проте, вони вже встигли продемонструвати переваги комп’ютерної техніки. На багатьох підприємствах нафтогазової галузі діяли автоматизовані та автоматичні системи управління, розв’язувалися задачі наукового характеру. Було розроблено велику кількість системних та прикладних програм.

З появою перших персональних комп’ютерів стало зрозумілим, що за ними майбутнє. Тоді й виникла гостра потреба у розробці їхнього програмного забезпечення, необхідно було швидко заповнити прогалину в нестачі насамперед системних програм. Тодішні мови програмування (PL/1, FORTRAN, Алгол-60 та ін.) не задовільняли нові вимоги. Крім того, змінилася елементна база обчислювальних машин, а значить і машинні команди, тому старі програми не могли на них виконуватися. Ці обставини й створили передумови для розробки нових алгоритмічних мов, у т. ч. мови С.

Мова С має ряд особливостей, зокрема такі:

  • має повний набiр конструкцiй структурного програмування, модульнiсть, блокову структуру програм, роздiльну компiляцiю;

  • наявнi розвиненi засоби побудови складених об’єктiв: масивiв, структур, об’єднань, даних перерахункового типу;

  • реалiзованi деякi операцiї низького рiвня, операцiї над бiтами;

  • базовi типи даних вiдображають байти, машиннi слова, символи, тобто об’єкти обробки мовою асемблер;

  • має механiзм вказівникiв на змiннi i функцiї, що дозволяє працювати безпосередньо з адресами пам’ятi;

  • є можливiсть пiдвищення ефективностi програм завдяки вiдсутностi жорстких обмежень на перетворення типiв даних;

  • має можливiсть широкого пiдключення стандартних функцiй, що робить версiю мови незалежною вiд реалiзацiї операцiйної системи та архiтектури комп’ютера.

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

З момента появи мова С постійно розвивалася, з’явилося багато її версiй, тому виникла потреба в стандарті, який був би забезпечений у будь-якій версії. Спочатку загальноприйнятим стандартом мови С вважалася книга Б. Кернігана і Д. Рітчі “Мова програмування С”. Це була одна з перших книг про С, випущена ще в 1978 році. Згодом описану в ній мову назвали класичним С, проте вона мала недоліки, зокрема відсутність опису бібліотеки. Вище в переліку особливостей мови було сказано, що багатство стандартних функцiй робить її незалежною вiд реалiзацiї операцiйної системи та архiтектури комп’ютера. Але тоді мова С стає залежною від своєї бібліотеки більше, ніж інші мови, тому виникає необхідність у стандарті й на бібліотеку.

Перший стандарт мови С разом з бібліотекою був запропонований у 1989 році ANSI (American National Standarts Institute – Національний інститут зі стандартизації США). В 1990 році цей стандарт був прийнятий ISO (International Organization for Standartization – Міжнародна організація з стандартизації). Ці стандарти називають відповідно С89 або С90, хоча по суті вони однакові (ISO/IEC 9899:1990). Пізніше з’явився стандарт С99 (ISO/IEC 9899:1999).

Стандарт C99 ввів декілька таких нових особливостей:

  • забезпечується вкладення функції;

  • змінні можна оголошувати в будь-якому місці програми;

  • введено нові типи даних, зокрема long long int, явний логічний (булевий) і комплексний для оголошення комплексних чисел;

  • дозволено обробляти масиви даних змінної довжини;

  • підтримуються короткі однорядкові коментарі, які починаються з двох знаків прямий слеш (//);

  • додано нові бібліотечні функції;

  • введено нові заголовкові файли, такі як stdbool.h та inttypes.h;

  • вдосконалена підтримка стандарту IEEE, який регламентує обробку чисел з пересувною крапкою.

C99 сумісний з C90, однак, має деякі відмінності; зокрема, якщо в декларації ідентифікатора невистачає специфікатора типу, змінна чи функція надалі не сприймається оголошеною за замовчуванням як int. Комітет стандартів вирішив за доцільне, щоб компілятор діагностував опущення програмістом специфікатора типу. Деякі сучасні компілятори, діагностуючи таке опущення, все-таки приймають змінну оголошеною як int. Однією з особливостей стандарту С99 є забезпечення роботи програм на 64-розрядних комп’ютерах.

Практично всі компілятори C, зокрема GCC та інші, наразі підтримують багато з нових можливостей C99. Проте, ці можливості меншою мірою підтримуються компіляторами таких компаній, як Microsoft і Borland, котрі зосередилися переважно на C++ з тих пір, як C++ забезпечує подібну до С функціональність.

Стандарти регулярно обновлюються і доповнюються відповідними робочими групами спеціалістів. На даний момент діє опублікована в 2007 році версія ISO/IEC 9899:1999 TC3 стандарту С99. Кожна нова версія стандарту відміняє і замінює попередні.

За назвою версії можна знайти опис стандарту в мережі Internet.

1.2 Системи числення

Система числення – це сукупність правил запису чисел та виконання над ними певних дій.

Мова С широко використовується для розв’язку задач системного та низькорівневого програмування, тому однією з необхідних умов програмування є розуміння порядку представлення чисел та правил конвертації числових даних у різних системах числення.

Для представлення чисел використовують спеціальні знаки, наприклад, цифри. За вагою кожного знака розрізняють два види систем числення: позиційні та непозиційні. У позиційних системах числення кожний розряд числа має власну вагу, наприклад, у числі 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.

1.3 Алгоритм і його властивості

Хід виконання будь-якої роботи можна представити у вигляді послідовності елементарних операцій, яку називають алгоритмом. Алгоритм будують для певного виконавця, який має свою власну систему команд і може їх розпізнавати та виконувати, тому алгоритм – це послідовність команд виконавця.

Алгоритм може мати різні ступені деталізації. Якщо виконавець – комп’ютер, то алгоритмом для нього буде програма, записана в машинних кодах, тоді буде досягнено найвищого ступеня деталізації. Програма, написана алгоритмічною мовою, теж алгоритм, але з меншим ступенем деталізації, він призначений для компілятора.

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

Слово алгоритм походить від аль-Хорезмі – імені арабського математика, який жив у ІХ ст. в м. Хіва (нині обласний центр на півночі Узбекистану). Він відомий тим, що розробив послідовність виконання чотирьох арифметичних операцій: додавання, віднімання, множення і ділення так, як ми це виконуємо зараз. У ХІV ст. цю послідовність дій почали застосовувати в Європі і назвали її алгоритмом. До того європейці виконували цю роботу настільки складно, що її міг виконувати тільки кваліфікований спеціаліст. У ХІХ ст. поняття алгоритму було поширено на будь-яку послідовність операцій.

Алгоритм має такі властивості:

  1. масовість. Алгоритм, побудований для розв’язання однієї задачі, повинен бути придатним для всіх задач даного класу;

  2. результативність. Обов’язково повинна бути досягнена поставлена мета;

  3. дискретність. Алгоритм повинен складатися з дискретних команд виконавця;

  4. однозначність. Кожна команда повинна бути чітко й однозначно визначена.

Будь-який алгоритм можна розчленити на такі три елементарні: лінійний, розгалужений і циклічний. Складні алгоритми містять вкладені один в одного елементарні алгоритми, найчастіше це вкладені цикли та розгалуження в циклі.

Запитання для самоперевірки

  1. Поясніть терміни: машинна мова, транслятор, інтепретатор, компілятор.

  2. Назвіть властивості мов програмування високого рівня, перелічіть та поясніть особливості мови С.

  3. Що таке система числення?

  4. Що таке позиційні та непозиційні системи числення?

  5. Які системи числення найчастіше використовуються в обчислювальній техніці і обгрунтуйте чому?

  6. Як перекладаються числа з однієї системи числення в іншу?

  7. Як виконуються арифметичні операції над числами, представленими в різних системах числення?

  8. Що таке алгоритм і які він має властивості?

  9. Перелічіть типи елементарних алгоритмів.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]