Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила...

59
МЕТОДИЧНІ ВКАЗІВКИ ДО ВИКОНАННЯ лабораторних робіт З ДИСЦИПЛІНИ для студентів усіх форм навчання та студентів-іноземців за спеціальністю 141 – «Електроенергетика, електротехніка та електромеханіка», спеціалізація «Нетрадиційні та відновлювані джерела енергії» укладач Гаєвський О.Ю. ПРОЕКТ «ПІДВИЩЕННЯ ЕНЕРГОЕФЕКТИВНОСТІ ТА СТИМУЛЮВАННЯ ВИКОРИСТАННЯ ВІДНОВЛЮВАНОЇ ЕНЕРГІЇ В АГРО-ХАРЧОВИХ ТА ІНШИХ МАЛИХ ТА СЕРЕДНІХ ПІДПРИЄМСТВАХ (МСП) УКРАЇНИ» НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ «КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ ім. ІГОРЯ СІКОРСЬКОГО» «ОБЧИСЛЮВАЛЬНА ТЕХНІКА ТА АЛГОРИТМІЧНІ МОВИ» Частина 1 Мова програмування С++

Upload: others

Post on 01-Jun-2020

12 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

МЕТОДИЧНІ ВКАЗІВКИ ДО ВИКОНАННЯлабораторних робіт

З ДИСЦИПЛІНИ

для студентів усіх форм навчання тастудентів-іноземців за спеціальністю

141 – «Електроенергетика, електротехніка та електромеханіка»,спеціалізація «Нетрадиційні та відновлювані джерела енергії»

укладач Гаєвський О.Ю.

ПРОЕКТ «ПІДВИЩЕННЯ ЕНЕРГОЕФЕКТИВНОСТІ ТАСТИМУЛЮВАННЯ ВИКОРИСТАННЯ ВІДНОВЛЮВАНОЇ ЕНЕРГІЇ

В АГРО-ХАРЧОВИХ ТА ІНШИХ МАЛИХ ТА СЕРЕДНІХПІДПРИЄМСТВАХ (МСП) УКРАЇНИ»

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ «КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ ім. ІГОРЯ СІКОРСЬКОГО»

«ОБЧИСЛЮВАЛЬНА ТЕХНІКА ТА АЛГОРИТМІЧНІ МОВИ»

Частина 1Мова програмування С++

Page 2: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст
Page 3: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИНАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ

«КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ імені ІГОРЯ СІКОРСЬКОГО»

МЕТОДИЧНІ ВКАЗІВКИ ДО ВИКОНАННЯлабораторних робіт

З ДИСЦИПЛІНИ

«ОБЧИСЛЮВАЛЬНА ТЕХНІКА ТА АЛГОРИТМІЧНІ МОВИ»

Частина 1Мова програмування С++

для студентів усіх форм навчаннята студентів-іноземців за спеціальністю

141 – «Електроенергетика, електротехніка та електромеханіка»

спеціалізація «Нетрадиційні та відновлювані джерела енергії»

Київ 2017

Page 4: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

Методичні вказівки до виконання лабораторних робіт з дисципліни «Обчис-лювальна техніка та алгоритмічні мови», для студентів усіх форм навчання та студентів-іноземців за спеціальністю 141 – «Електроенергетика, електро-техніка та електромеханіка», спеціалізація «Нетрадиційні та відновлювані джерела енергії»

Укладач: Гаєвський О.Ю.

Затверджено Вченою радою ФЕА НТУУ «КПІ»(Протокол № 11 від 23 червня 2014 р.)

К.: ФЕА «КПІ ім. Ігоря Сікорського», 2017. – 52 с.

Видання здійснено за підтримки проекту ЮНІДО-ГЕФ «Підвищення енергое-фективності та стимулювання використання відновлюваної енергії в агро-харчових та інших малих та середніх підприємствах (МСП) України» Відповідальність за вміст видання несе автор публікації

Укладач:Гаєвський Олександр Юлійович, д-р.фіз.-мат.наук, проф. Відповідальний редактор:Кудря Степан Олександрович, д-р.техн.наук, проф.Рецензент: Островерхов Микола Якович, д-р.техн.наук, проф.

Page 5: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

3

Зміст

Вступ ......................................................................................................................... 5

Загальні відомості ................................................................................................... 5

Алгоритмична мова C++. Структура програми, типи даних, операції .......... 5

Структура програми ........................................................................................ 5

Типи даних ........................................................................................................ 6

Операції в С++ ................................................................................................. 8

Лабораторна робота 1. "Числа з плаваючою точкою. Точність обчислень" ... 11

Теоретичні відомості ......................................................................................... 11

Представлення чисел з плаваючою точкою ................................................ 11

Операції в С ++ з різними типами чисел ..................................................... 12

Постановка задачі .............................................................................................. 13

Варіанти .............................................................................................................. 13

Методичні вказівки ........................................................................................... 15

Зміст звіту ........................................................................................................... 16

Лабораторна робота 2. "Оператори С++" ........................................................... 17

Теоретичні відомості ......................................................................................... 17

Умовний оператор if-else .............................................................................. 17

Оператор вибору switch ................................................................................. 17

Оператори циклу ............................................................................................ 18

Приклад. Побудова геометричної фігури ................................................... 19

Постановка задачі і варіанти ............................................................................ 21

Методичні вказівки ........................................................................................... 22

Зміст звіту ........................................................................................................... 22

Лабораторна робота 3. "Ітераційні процеси" ...................................................... 23

Теоретичні відомості ......................................................................................... 23

Поняття ряду. Ітераційний процес ............................................................... 23

Алгоритм обчислення ряду ........................................................................... 23

Постановка задачі .............................................................................................. 24

Варіанти .............................................................................................................. 24

Методичні вказівки ........................................................................................... 25

Зміст звіту ........................................................................................................... 25

Лабораторна робота 4. "Функції. Форматне введення-виведення даних" . 26

Теоретичні відомості ......................................................................................... 26

Функції в С/С++ ............................................................................................. 26

Ступеневі ряди ............................................................................................... 28

Форматне виведення даних в С .................................................................... 28

Форматне введення в С ................................................................................. 29

Постановка задачі .............................................................................................. 30

Page 6: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

4

Варіанти .............................................................................................................. 30

Методичні вказівки ........................................................................................... 32

Зміст звіту ........................................................................................................... 33

Лабораторна робота 5. "Одновимірні масиви. Покажчики. Рядки" ................ 34

Теоретичні відомості ......................................................................................... 34

Масиви й покажчики ..................................................................................... 34

Записи "покажчик-зсув" і "покажчик-індекс" ............................................ 34

Рядки як одновимірні масиви ....................................................................... 35

Передача рядка у функцію ............................................................................ 36

Введення/виведення символів і рядків ........................................................ 36

Бібліотечні функції для роботи з символами та рядками .......................... 37

Постановка задачі .............................................................................................. 38

Варіанти .............................................................................................................. 38

Методичні вказівкі ............................................................................................ 42

Зміст звіту ........................................................................................................... 42

Лабораторна робота 6. "Двовимірні масиви" .................................................... 43

Теоретичні відомості ......................................................................................... 43

Оголошення багатовимірного масиву ......................................................... 43

Передача масиву у функцію ......................................................................... 43

Постановка задачі .............................................................................................. 44

Варіанти .............................................................................................................. 44

Методичні вказівки ........................................................................................... 46

Зміст звіту ........................................................................................................... 46

Лабораторна робота 7. "Динамічні одновимірні масиви" ................................. 47

Теоретичні відомості ......................................................................................... 47

Динамічні масиви .......................................................................................... 47

Видалення елемента із масиву ..................................................................... 47

Вставка елемента в масив ............................................................................. 48

Перестановка двох елементів ....................................................................... 48

Циклічна перестановка елементів ................................................................ 48

Постановка задачі .............................................................................................. 49

Варіанти .............................................................................................................. 49

Методичні вказівки ........................................................................................... 52

Зміст звіту ........................................................................................................... 52

Лабораторна робота 8. "Структури: складені типи даних" ............................... 53

Теоретичні відомості ......................................................................................... 53

Постановка задачі .............................................................................................. 53

Варіанти .............................................................................................................. 54

Методичні вказівки ........................................................................................... 55

Зміст звіту ........................................................................................................... 56

Література .............................................................................................................. 56

Page 7: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

5

Вступ

Навчальний курс "Обчислювальна техніка та алгоритмічні мови" скла-

дається з лекцій, практичних занять, лабораторних робiт і самостійної роботи

студентів (СРС). У даному методичному посібнику наведені теоретичні

відомості та варіанти завдань до 7 лабораторних робіт, результатом виконан-

ня яких є програми на мові С++.Це сучасна й потужна мова, яка застосо-

вується не тільки для системного програмування, але й для створення при-

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

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

мови С++ підвищує затребуваність фахівців і сприяє ранній професійній

орієнтації.

Для успішного застосування навичок програмування в інженерній діяль-

ності необхідне узгодження курсу програмування із загально технічними й

спеціальними дисциплінами. Тому в даній частині методичних вказівок ве-

лика увага приділена практиці складання програм для розв’язування різних

математичних задач: обчислення арифметичних виразів, обчислення і за-

стосування функцій, використання розкладів у ступеневі ряди, операції з век-

торами й матрицями.

Загальні відомості

Алгоритмична мова C++. Структура програми, типи да-них, операції

С++ – це універсальна мова програмування високого рівня, що є надмножи-

ною мови програмування C.

С – це структурована, модульна, компактна мова програмування загального

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

та створення різноманітних швидкодіючих програмних додатків.

Мови С/С++ вміщають у собі, з одного боку, засоби мов програмування ви-

сокого рівня: опис типів даних, оператори for, while, ifі т.д., а, з іншого боку,

засоби мови Асемблер: реєстрові змінні, адресну арифметику, можливість робо-

ти з бітовими полями і т.д.

Структура програми

Прості програми мовою С++ мають, як правило, таку структуру:

#директива препроцесору

. . . . . . . . .

#директива препроцесору

функція а( ) {

Page 8: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

6

оператори

}

функція b( ){

оператори

}

//Головна функція, з якої починається виконання програми

main( ) {

оператори

}

Директиви препроцесору – управляють перетворенням тексту програми до її

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

директив препроцесора, що починаються із символу #, наприклад,

#include <conio.h>

#define ZERO 0.0

де директива #include призначена для включення в програму тексту із заголо-

вного файлу conio.h, який входить в стандартну бібліотеку С,а

директива#defineвказує правила заміни в тексті (замість ідентифікатора ZERO

підставляється 0.0).

Програма являє собою набір описів і визначень, і складається з набору функ-

цій. Серед цих функцій завжди повинна бути функція з ім'ям main, з якої почи-

нається виконання програми. Перед ім'ям функції містяться відомості про тип

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

список формальних параметрів (він може бути порожнім). Після списку у фігур-

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

описів і операторів, що виконуються. Кожне визначення, опис або оператор за-

кінчується крапкою з комою.

Типи даних

У мові С++ кожна величина має певний спосіб зберігання й запису в пам'яті –

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

яких належать значення змінних. Наприклад,

float z;

int a=99;

float g(int)

Тут змінна z оголошена як дійсна типу float, змінна а – як ціла типу int, а

gоголошена як дійсна функція з аргументом цілого типу.

У С++ передбачений набір типів, що відображають особливості організації

пам'яті більшості комп'ютерів і потреби в зберіганні даних. Всі типи даних у

С++ можна розділити на дві великі групи: вбудовані типи (тобто існуючі у мові

програмування) і користувальницькі типи (створюються самим програмістом).

До вбудованих типів ставляться, насамперед, основні (або стандартні) типи:

Page 9: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

7

bool– логічний;

char– символьний;

wchar_t– розширений символьний;

int– цілий;

float– дійсний;

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

Перші чотири типи називаються інтегральними типами, останні два – типами із

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

величин із плаваючою крапкою.

Щоб розширити можливості програміста в застосуванні типів даних, існують

модифікатори, які уточнюють внутрішнє представлення й діапазон значень ста-

ндартних типів:

signed – знаковий;

unsigned – беззнаковий;

long – довгий;

short– короткий.

При оголошенні змінної модифікатор ставиться перед ключовим словом ти-

пу, наприклад,

unsigned int x;

– оголошення цілої беззнакової змінної x. За умовчанням всі інтегральні типи є

знаковими, тобто модифікатор signed для них можна вилучати. Замість

shortint і longintдля стислості можна записувати:

short x=221;

long z=-12345678;

До користувальницьких типів належать перелічуваний тип (enum), структури

(struct) і класи (class).

Діапазони значень для основних типів даних, а також розмір пам'яті під них

наведені у таблиці 1.

Табл. 1. Розмір пам'яті й діапазони значень для основних типів даних

Тип Розмір(байт) Інтервал значень

bool 1 true, false

char 1 -128.. 127

unsigned char 1 0.. 255

short 2 -32768 .. 32767

unsigned short 2 0.. 65535

int

16-розр. платформа

2 -32768 .. 32767

32-розр. платформа

4 -2147483648 .. 2147483647

Page 10: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

8

unsigned int

16-розр. платформа

2 0.. 65535

32-розр. платформа

4 0.. 4294967295

long 4 -2147483648 .. 2147483647

unsigned long 4 0.. 4294967295

float 4 3.410-38 .. 3.41038

double 8 1.710-308 .. 1.710308

long double 10 3.410-4932 .. 1.1104932

Для змінної типу int виділяється 2 або 4 байти пам'яті залежно від розрядно-

сті платформи (мікропроцесора, операційної системи, середовища програмуван-

ня).

Операції в С++

У мові С++ є обмежений набір базових типів даних, однак визначений вели-

кий набір операцій над даними. Операції служать для побудови виразів. Вираз

являє собою послідовність операндів і знаків операцій і служить для обчислення

деякого значення. Результат обчислення виразу залежить від пріоритетів опера-

цій (табл. 2).

Таблиця2 . Пріоритети операцій у С++

Пріо-ритет

Знак операції Призначення Схема

1 ::

Розширення області види-мості (доступ до глобаль-ного імені або імені зіншої області)

: : ідентифікатор (глобальний) ім'я області: : ім'я_елемента структури

1 -> Звертання до елемента структури по покажчику на структуру

покажчик ->ім'я_члена_структури

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

ім'я_структури . ім'я_члена_структури

1 [] Звертання до елемента масиву

покажчик [індекс]

1 typedef Перетворення типу даного ім'я_типу (вираз) або (тип) вираз

1 () Виклик функції Функція(аргументи)

2 ++ Інкремент ++ L-значення або L-значення++

2 -- Декремент -- L-значення або L-значення--

Page 11: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

9

2 ~ Бітове інвертування ~ цілий_вираз

2 ! Логічне заперечення ! вираз

2 - Унарний мінус - вираз

2 + Унарний плюс + вираз

2 & Одержання адреси & L-значення

2 * Розіменування покажчика * покажчик

2 new Виділення динамічної пам'яті

new тип даного

2 delete Звільнення пам'яті delete покажчик

2 sizeof Розмір даного (типу даних)

sizeof вираз sizeof (ім'я типу )

3 * Множення вираз * вираз

3 / Ділення вираз / вираз

3 % Залишок від ділення двох цілих

вираз % вираз

4 ->* Звертання до елементу структури за покажчиком

покажчик_на_структуру->* ім'я_елемента_структури-покажчика

4 .* Звертання до елементу структури за іменем стру-ктури

ім'я_структури.*ім'я_члена_структури-покажчика

5 + Додавання вираз + вираз

5 - Віднімання вираз – вираз

6 << Зсув вліво цілий_вираз<< цілий _вираз

6 >> Зсув вправо цілий _вираз >> цілий _вираз

7 < Менше вираз < вираз

7 <= Менше або дорівнює вираз <= вираз

7 > Більше вираз > вираз

7 >= Більше або дорівнює вираз >= вираз

8 == Дорівнює вираз == вираз

8 != Не дорівнює вираз != вираз

Page 12: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

10

9 & Побітове "І" вираз & вираз

10 ^ Виключне побітове "АБО" вираз ^ вираз

11 | Побітове "АБО" вираз | вираз

12 && Логічне "І" вираз && вираз

13 || Логічне "АБО" вираз | | вираз

14 ?: Умовний вираз вираз ? вираз1 : вираз2

15 = Просте присвоювання вираз = вираз

15 @=

Складне присвоювання; @ - один зі знаків опера-цій * / % + - <<>>& ^ |

вираз @= вираз

16 , Операція слідування (опе-рація "кома")

вираз, вираз

Page 13: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

11

Лабораторна робота 1. "Числа з плаваючою точ-кою. Точність обчислень"

Мета роботи: Формування уміння роботи з арифметичними типами даних, уяв-

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

програм.

Теоретичні відомості

Представлення чисел з плаваючою точкою

Число з плаваючою точкою (або число з плаваючою комою) – це форма

представлення дійсних чисел у вигляді мантиси і показника ступеня. Найбільш

вживаним є представлення чисел відповідно до стандарту IEEE 754, згідно з

якому число з плаваючою точкою складається з наступних частин:

• знак мантиси (те саме, що і знак числа),

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

• порядок числа.

Нормальною формою числа з плаваючою точкою називається форма, в якій

мантиса (без урахування знака) знаходиться в полуінтервалі [0 1). Запис числа в

нормальній формі забезпечує максимальну точність представлення числа. Однак

така форма запису є неоднозначною (наприклад, 0.0001 можна записати як

0.001×10-1, 0,01×10-2 і т.д.). Тому в обчислювальній техніці частіше використову-

ється інша форма запису – нормалізована, в якій мантиса десяткового числа зна-

ходиться в полуінтервалі [1 10), а мантиса двійкового числа – в полуінтервалі

[1 2).

Число одинарної точності (float) займає в пам'яті одне машинне слово (в

разі 32-бітного комп'ютера це 32 біта або 4 байти), використовується для роботи

з дійсними числами, якщо не потрібна висока точність обчислень. Старший роз-

ряд мантиси двійкового числа (крім 0) в нормалізованому вигляді дорівнює 1

(неявна одиниця), тому при запису мантиси старший розряд не записується.

Число подвійної точності (double) займає в пам'яті два машинних слова (в

разі 32-бітного комп'ютера – 64 біта або 8 байт). Часто використовується завдяки

своїй досить високої точності, незважаючи на подвійну витрату пам'яті.

Розподіл по бітам в числах float виглядає як

|1 знаковий біт|8 біт експоненти|23 біта мантиси|,

а в числах double цей розподіл наступний:

|1 знаковий біт|11 біт експоненти|52 біта мантиси|.

Ці розподіли між частинами числа можна проілюструвати малюнком:

Page 14: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

12

На малюнку буквою S позначений знак числа (0 – додатне число, 1 –

від’ємне), Е – порядок, М – мантиса.

Порядок –це звичайне бінарне представлення цілого числа, в яке потрібно

звести основу десяткових чисел 10, щоб множення на мантиссу в нормалізова-

ному вигляді дало вихідне число. Щоб не оперувати з від’ємними значеннями

порядку, вводиться відповідно до стандарту IEEE 754 зміщення, яке потрібно

віднімати з бінарного представлення, щоб отримати шукану ступінь десятки.

Для одинарної точності зсув дорівнює 127, а для подвійний – 1023.

Максимальна мантиса в форматі float в десяткових знаках не перевищує

2^(23+1) = 16 777 216, тобто точність представлення дійсних чисел float ста-

новить трохи більше 7 десяткових знаків. Це означає, що в даному форматі не

можна зберегти, наприклад, число 123 456.78 – сота частка в даний формат не

вміщається, тому при операціях буде використовуватись неточне представлення

даного числа.

У C ++ для дійсних чисел за замовчуванням використовується тип double.

Мантиса числа з подвійною точністю вже перевищує 15 десяткових знаків:

2^(52+1) = 9 007 199 254 740 992.

Операції в С ++ з різними типами чисел

Якщо у виразу (праворуч від операції присвоювання) беруть участь операнди

різних типів, то менш точний тип приводиться до більш точного. Наприклад,

int a1;

float c2=a1/99.;

при обчисленні c2 тип першого операнду a1 приводиться до float, тобто до ти-

пу другого операнду – дійсної константи 99.

В операціях присвоювання тип результату (правої частини) приводиться до

типу лівого операнду. Наприклад, при виконанні фрагмента:

double a1=2.2, b1=3;

int mult=a1*b1;

змінна mult одержить значення 6, але точне значення повинне бути 6.6.

Результатом виконання операторів:

int m=4, n=5;

Page 15: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

13

double div=m/n;

буде значення div=0, оскільки цілочисельне ділення цілих змінних m і n дасть 0.

Щоб одержати правильне значення для змінної div у даному прикладі необхід-

но виконати явне приведення типів, що записується як вираз (тип) перед тієї

змінної, котру потрібно явно привести до зазначеного типу. Тому для змінних m

і n цілого типу правильним буде запис:

double div=(double)m/n;

Тоді змінна m, до якої застосована операція приведення, розглядається як дій-

сна величина типу double. Так що ділення здійснюється вже не з цілими, а з

дійсними числами, і дає правильний результат: 0.75.

Постановка задачі

1. Обчислити шляхом алгебраїчних перетворень точне значення виразу відпо-

відно свого варіанту (див. розд. "Варіанти").

2. Знайти значення виразу, яке отримується при чисельних розрахунках для за-

даного a і різних b. Виконати обчислення при різних дійсних типах даних

(float і double) для обох змінних. Величина b повинна приймати не менше

трьох значень (значення змінюваті при кожному запуску програми). Ці значення,

наприклад, b1, b2, b3, необхідно підібрати таким чином, щоб

• При b=b1 типи float и double давали точний результат;

• При b=b2 тип float давав похибку, більшу, ніж помилка, що повстає з 4-

байтного представлення, а тип double давав похибку, меншу, ніж похибка

8-байтного представлення.

• При b=b3 обидва типи float и double давали похибки обчислення біль-

ші, ніж це передбачено їх точністю представлення.

Очевидно, має бути 3 2 1 1b b b .

3. Порівняти й пояснити результати, отримані згідно п.1 і п.2.

Варіанти

№ Завдання

1 2 2

2

( ) ( 2 )a b a ab

b

, при а=10

2 2

22 )2()(

b

ababa , при а=10

Page 16: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

14

3 32

233

3

)3()(

bab

baaba

, при а=10

4 babab

aba232

33

33

)(

, при а=10

5 23

233

3

)3()(

abb

baaba

, при а=10

6 bab

ababa23

233

3

)3()(

, при а=10

7 baabb

aba223

33

33

)(

, при а=10

8 43

22344

4

)64()(

bab

babaaba

, при а=10

9 4322

344

46

)4()(

babba

baaba

, при а=100

10 34

22344

4

)64()(

abb

babaaba

, при а=100

11 4322

344

46

)4()(

babba

baaba

, при а=1000

12 2

22 )2()(

b

ababa , при а=100

13 2

22 )2()(

b

ababa , при а=100

14 32

233

3

)3()(

bab

baaba

, при а=100

15 babab

aba232

33

33

)(

, при а=100

Page 17: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

15

16 23

233

3

)3()(

abb

baaba

, при а=1000

17 bab

ababa23

233

3

)3()(

, при а=1000

18 baabb

aba223

33

33

)(

, при а=100

19 43

22344

4

)64()(

bab

babaaba

, при а=10

20 4322

344

46

)4()(

babba

baaba

, при а=100

21 34

22344

4

)64()(

abb

babaaba

, при а=100

22 4322

344

46

)4()(

babba

baaba

, при а=10

23 32

233

3

)3()(

bab

baaba

, при а=100

24 babab

aba232

33

33

)(

, при а=100

25 23

233

3

)3()(

abb

baaba

, при а=100

Методичні вказівки

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

resultdenom

, де nom c d .

2. Вивести на екран значення всіх змінних і виразу, наприклад, у наступному ви-

гляді:

Page 18: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

16

3. Для введення b використати операцію cin. Числа з плаваючою крапкою вар-

то вводити у вигляді: 1e-2 (= 0.01), 1E-4 (=0.0001), 0.123e+2 (=12.3) і т.д.

4. Виведення значень, які отримуються в ході розрахунку, здійснювати за допо-

могою операції cout з точністю до 15 – 16 значущих цифр. Для цього необхідно

використовувати маніпулятор setprecision(int). Наприклад, інструкція

cout<<setprecision(16)<<x;

виводить 16 значущих цифр змінної x, починаючи з першої цифри. Доступ до

маніпулятора setprecision забезпечується заголовним файлом iomanip.h

5. Для виведення даних на білий екран консолі запишить в глобальній області

інструкцію

const int NotUsed=system("color F0");

Зміст звіту

1. Постановка задачі.

2. Результати обчислення з використанням алгебраїчних перетворень.

3. Код програми.

4. Результати роботи програми для даних типу float і різних значень b.

5. Результати роботи програми для даних типу double і різних значень b.

6. Пояснення результатів.

Page 19: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

17

Лабораторна робота 2. "Оператори С++"

Мета роботи: Формування уміння роботи з основними операторами С++: умовни-

ми операторами, операторами циклу різних типів.

Теоретичні відомості

Оператори – це синтаксичні конструкції, що визначають дії, які виконуються

програмою.

Умовний оператор if-else

Цей оператор використовується для вибору серед двох альтернативних спо-

собів виконання обчислень. Оператор може записуватись в скороченій і повній

формах, яким відповідають схеми:

if (умова) оператори

if (умова) оператори-1 else оператори-2

У скороченому умовному операторі if обчислюється умова і, якщо її значення

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

випадку не виконується ніяких дій. На відміну від скороченого оператора, у пов-

ному умовному операторі за словом else передбачені оператори, які викону-

ються, якщо значення умови дорівнює нулю.

У наступному прикладі на екран буде виведене те або інше повідомлення за-

лежно від значення змінної temp, яка характеризує температуру:

if (temp <0)

cout<<"Frost";

else cout<<"Thaw";

Замість оператора if-else можна застосовувати умовну операцію ?:, що у

розглянутому прикладі має вигляд:

cout<<(temp<0?"Frost":"Thaw");

Оператор вибору switch

Якщо необхідно реалізувати одну з декількох можливих гілок обчислень чи

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

ється за наступною схемою:

switch (управляючий вираз){

case константа-1: оператори; break;

case константа-2: оператори; break;

............................

default : оператори

}

Виконання оператора починається з обчислення управляючого виразу (він пови-

нен бути цілочисельним), після чого здійснюється перехід до групи операторів,

Page 20: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

18

позначених case-мітками. Зі списку вибирається case-мітка, у якій константа

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

тім виконується вихід з switch завдяки наявності оператора break.

Всі константи в списку case-міток повинні бути різними, але бути того ж

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

оператори, розташовані за міткою default (а при відсутності default управ-

ління передається наступному за switch операторові).

Приклад використання перемикача switch у програмі калькулятора:

#include <iostream.h>

void main(){

float x, y, res;

char op;

cout<<"Input x,y: "; cin>>x>>y;

cout<<"Input operation (+, -, *, /): "; cin>>op;

switch (op){

case '+': res=x+y; break;

case '-': res=x-y; break;

case '*': res=x*y; break;

case '/': res=x/y; break;

default:cout<<"Unknown operation";}

cout<<"Result:"<<res;

}

У даній програмі передбачено виведення на екран повідомлення «Unknown

operation», якщо користувач увів неправильний символ операції.

Оператори циклу

У С/С++ є три варіанти оператора циклу: цикл із передумовою, цикл із пос-

тумовою і цикл із параметром.

Цикл із передумовою, записується за схемою:

while (умова) оператори

При кожному повторенні циклу обчислюється умова і якщо ії значення не дорі-

внює нулю, виконуються оператори – тіло циклу. Як приклад, розглянемо підра-

хунок суми елементів деякого масиву a[n] з n елементів (нумерація елементів

масиву починається з 0):

int s=0, i=0;

while (i<n) {s+=a[i]; i++;}

Цикл із постумовою записується за схемою:

do оператори while (умова)

Page 21: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

19

Умова обчислюється й перевіряється після кожного повторення операторів – ті-

ла циклу. Цикл повторюється, поки умова виконується. Обчислення суми елеме-

нтів масиву a[n]:

int s=0, i=0;

do {s+=a[i]; i++;} while (i<n);

Цикл із параметром записується за схемою:

for (E1; E2; E3) оператори

Спочатку обчислюється вираз E1, що виконує підготовку до початку циклу. По-

тім обчислюється вираз E2 і, якщо він дорівнює нулю, виконується перехід до

наступного оператора програми (вихід із циклу). Якщо E2 не дорівнює нулю,

виконується тіло циклу (оператори). Нарешті, обчислюється вираз E3 і знову ві-

дбувається повернення до обчислення Е2 з наступним повторенням кроків.

Щоб обчислити суму елементів деякого масиву з n елементів, можна викори-

стати наступний оператор:

for (int s=0, i=0; i<n; i++) s+=a[i];

Для переривання повторень оператора циклу будь-якого типу в тілі циклу

використовують оператор break. Перехід до наступного повторення циклу з будь-

якого місця тіла циклу забезпечує оператор continue.

Приклад. Побудова геометричної фігури

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

фігуру – трикутник, яка на екрані має вигляд:

*

* *

* *

* *

* *

* * * * *

Для цього будемо використовувати умовний оператор і оператор циклу, а також

маніпулятори:

setw(int) – установлює ширину поля виведення (кількість позицій під зна-

чення змінної) з вирівнюванням по правому краю;

setfill('x') – задає символ x для заповнення вільних позицій ширини поля

виводу (за умовчанням виводиться пробіл).

Для використання маніпуляторів необхідно підключити заголовний файл

iomanip.h.

Виконання головної функції main починається з ініціалізації змінної n (кіль-

кість рядків). Потім у перший рядок виводиться символ «*» (вершина трикутни-

ка). За допомогою циклу for виконується виведення наступних рядків (від

2 до n). В усі рядки, крім останнього, виводяться дві зірочки «*» для лівої й пра-

Page 22: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

20

вої сторони трикутника . Останній рядок заповнюється зірочками від першої по-

зиції до позиції n. Алгоритм головної функції подається у вигляді наступної

блок-схеми:

Блок-схема функції main()побудови трикутника

Відповідно до цієї блок-схеми складаємо програму:

#include <iostream.h>

#include <iomanip.h>

void main(){

int n=6;

cout<<'*'<<endl; //Виведення 1-ого рядку

Page 23: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

21

for(int k=2; k<=n; k++) {

cout<<'*'; //Виведення лівого символу

if(k!=n)

cout << setw(k-1) << '*'; //Виведення правого символу

else

cout<<setw(n)<<setfill('*'); //Останній рядок

cout<<endl;

}

}

Постановка задачі і варіанти

Скласти програму, що дозволяє вивести на екран геометричну фігуру, яка

складається з символів зірочка *. Завдання містяться в наступних варіантах.

№ Завдання № Завдання

1

14

2

15

3

16

4

17

5

18

6

19

Page 24: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

22

7

20

8

21

9

22

10

23

11

24

12

25

13

26

Методичні вказівки

1. При складанні програм використати оператори циклу й умовні оператори.

2. Побудову фігури виконати по рядках у текстовому режимі.

3. Для виведення символів на екран використати операцію cout, а для позиціо-

нування символу й заповнення поля виводу – маніпулятори setw і setfill.

Зміст звіту

1. Постановка задачі.

2. Варіант завдання.

3. Блок-схема алгоритму.

4. Код програми.

5. Скріншот вікна з результатами.

6. Висновки.

Page 25: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

23

Лабораторна робота 3. "Ітераційні процеси"

Ціль : Формування уміння використовувати оператори циклу, а також організову-

вати ітераційні процеси.

Теоретичні відомості

Поняття ряду. Ітераційний процес

Ряд – це сума елементів виду:

......210 naaaaS

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

Ряд називається збіжним, якщо сума S має певне скінчене значення.Звичайно

ряд описується за допомогою формули для загального члена ряду. Наприклад,

сума спадної геометричної прогресії ......1 2 nqqqS описується

загальним членом nq і сума членів прогресії дорівнює )1/(1 qS .

Однак не завжди для суми ряду існує аналітичний вираз. У подібних випад-

ках для визначення суми застосовуються наближені обчислення, які виконують-

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

Ітераційний процес реалізується за допомогою циклу, а саме: при кожному

проході циклу обчислюється окремий член ряду й додається до значення суми. У

деяких випадках, щоб скоротити об'єм обчислень при знаходженні члена ряду

1na , можна використати результат попереднього проходу циклу na . Тоді насту-

пний член ряду визначається за допомогою рекурентного співвідношення виду:

nn anfa )(1

У наближених обчисленнях спадного ряду враховується скінчене число чле-

нів ряду. Їх кількість визначається на основі одного з наступних критеріїв:

1. При обчисленні суми спадного ряду враховується рівно стільки членів, скі-

льки необхідно для досягнення заданої точності обчислення . Цей підхід

звичайно застосовують, якщо відомо точне значення суми.

2. При обчисленні суми спадного ряду враховуються члени, що перевищують

задане значення , наступні члени, які менше , відкидаються.

Алгоритм обчислення ряду

Скласти програму для обчислення спадного ряду:

...)!2(

)!(...

6

1

2

11

2

n

nS

Page 26: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

24

з додатними членами. При обчисленні суми враховувати члени, що перевищу-

ють задане значення . Передбачити багаторазове введення значення корис-

тувачем.

Насамперед, знайдемо рекурентне співвідношення між найближчими члена-

ми ряду:

)12(2

1

!!)!22(

)!2()!1()!1(

)!()!22(

)!2())!1((2

2

1

n

n

nnn

nnn

nn

nn

a

a

n

n,

звідки:

nna

n

na

)12(2

)1(1

Обчислення ряду починаємо з оголошення й ініціалізації наступних змінних:

n (номер поточного члена ряду; ураховуємо, що початкове значення 0n і

1!0 ), an (значення поточного члена), sum (сума членів). Оголошуємо змінну

delta, у якій зберігається значення точності обчислень, і символьну змінну

cont, яка буде містити символ, що означає відповідь на запит про продовження

обчислень. Далі програма пропонує ввести delta, і користувач уводить значен-

ня delta. Запускається цикл while для обчислення поточного члена ряду й до-

даванню його до змінноїsum. Обчислення спадного ряду з додатними членами

припиняються, коли поточний член виявляється менше delta. Сума ряду, а та-

кож точність обчислень і кількість врахованих членів ряду виводяться на екран.

Потім формується запит, чи потрібно продовжити обчислення даного ряду при

іншому значенні delta. Якщо користувач натискає клавішу «y» (yes), програма

пропонує знову ввести delta. Якщо ж натиснута будь-яка інша клавіша, обчис-

лення припиняються. Обробка запиту реалізується за допомогою циклу

do...while.

Постановка задачі

Скласти програми на С++ для знаходження суми членів ряду, починаючи

спершого скінченного члена. Обчислення суми виконати з різною точністю

від 0.1 до 10-6 (не менше трьох значень ). Передбачити введення значення по

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

Варіанти

№ Загальний член ряду № Загальний член ряду

1 )3(!

1

nnan 14

)2)(1(

3

nnn

nan

2 )!12(

1

nan 15

)12(2

1

nnan

Page 27: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

25

3 )2)(1(

1

nnan 16

)!2(!

1

nnan

4 )2)(1(

1

nnnan 17

)!3(

12

n

nan

5 )!1(!

1

nnan 18

)!13(

n

nan

6 2)!(2

1

nan 19 2)1(

n

nan

7 )13)(23(

1

nnan 20

!

ln

n

nan

8 2)!2(

12

n

nan

21

!

ln

n

na

n

n

9 !

10

na

n

n 22 )!3()!2(

32

nn

nan

10 )!2(

!

n

nan 23

)!12(

)!1(

n

nan

11 )!3()!2(

!

nn

nan 24

)!4()!2(

!

nn

nan

12 )!2(

!2

n

na

n

n 25 )!3()!2(

)1(

nn

nnan

13 )!3(

!3

n

na

n

n 26 )!3()!2(

)2)(1(

nn

nnnan

Методичні вказівки

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

одержаннянаступного члена ряду.

Зміст звіту

Звіт з виконаної роботи включає наступні розділи:титульнийлист, постановка

задачі, варіантзавдання, блок-схема алгоритму, текстпрограми, скріншот з ре-

зультатами роботи програми, висновки.

Page 28: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

26

Лабораторна робота 4. "Функції. Форматне введення-виведення даних"

Ціль роботи: Формування уміння використовувати функції, для організації ітера-

ційних процесів, а також для форматного введення-виведення даних.

Теоретичні відомості

Функції в С/С++

Функція в С/C++ можна розглядати як мінімальний модуль, що виконує про-

грама.Всі функції мають єдиний формат визначення:

<тип> <ім'я_функції> (<список_формальних_параметрів>)

<тіло_функції>,

де <тип>– або void, якщо функція не повертає значення, або тип значення, що

повертається функцією;

<ім'я_функції>– або main для основної функції, або довільний ідентифікатор,

що не збігається зі службовими словами й іменами інших об'єктів програми;

<список_формальних_параметрів> – або порожній (), або список, кожний

елемент якого має вигляд:

<позначення_типу> <ім'я_параметра>

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

(int k )

(char i, char j, int z)

<тіло_функції>– це частина функції, обмежена фігурними дужками

{ }.Тіло функції може бути одним оператором, або блоком. Визначення функцій

не можуть бути вкладеними.

Для передачі результату з функції в точку виклику використовується опера-

тор return. Він може бути записаним у двох формах:

return;

– завершує функцію, що не повертає ніякого значення (тобто перед ім'ям функ-

ції зазначений тип void)

return <вираз>;

– повертає значення виразу, вираз повинен мати тип, зазначений перед ім'ям фу-

нкції.

Якщо програміст не пише оператор return явно, то компілятор автоматично

дописує return у кінець тіла функції перед закриваючою фігурною дужкою}.

Page 29: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

27

Виклик функції здійснюється в такий спосіб:

<позначення функції>(<список фактичних параметрів>);

де <позначенняфункції>– або ім'я функції, або покажчик на функцію;

<список фактичних параметрів>– список виразів, кількість яких дорівнює

числу формальних параметрів функції. Між формальними й фактичними пара-

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

Визначення функції не обов'язково повинне передувати її виклику. У таких

випадках до виклику функції міститься оголошення – прототипфункції, що

встановлює відповідність типів переданих фактичних параметрів типам форма-

льних параметрів. Прототип має такий же вид, як і визначення функції, однак ті-

ло функції відсутнє, імена формальних параметрів можуть бути опущені.

Якщо в програмі будуть використовуватися елементарні математичні функ-

ції, необхідно підключити заголовний файл math.h. Наведемо список корисних

функцій цієї бібліотеки.

Тригонометричніфункції:

sin(x)– синус числа x;

asin(x)– головне значення арксинуса (в радіанах);

cos(x)– косинус;

acos(x)– головне значення арккосинуса;

tan(x)– тангенс;

atan(x)– головне значення арктангенса;

Гіперболічніфункції:

sinh(x)–гіперболічний синус ;

asinh(x)–зворотнийгіперболічний синус ;

cosh(x)–гіперболічний косинус ;

acosh(x)–зворотнийгіперболічний косинус ;

tanh(x)–гіперболічний тангенс ;

atanh(x)–зворотнийгіперболічний тангенс ;

Експоненціальні та іншіфункції:

exp(x)–експонента числа x;

log(x)–натуральний логарифм ;

log10(x)–десятковий логарифм ;

sqrt(x)–квадратнийкорінь з числа x;

pow(a,x) – ступенева функціяax;

abs(x)– модуль цілого числа х ;

fabs(х)– модуль числа х з плаваючою крапкою;

Функціїокруглення:

floor(x)–округлення до цілого у бік–∞;

ceil(x)–округлення до цілого у бік +∞;

Page 30: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

28

Ступеневі ряди

Дійсна функція )(xf називається аналітичною в точці , якщо в деякій око-

лиці Rx || цієї точки функція розкладається в ступеневий ряд (ряд Тейло-

ра):

...)(!

)(...)(

!2

)())(()()(

)(2

n

n

xn

fx

fxffxf

(1)

При 0 одержуємо ряд Маклорена:

...!

)0(...

!2

)0()0()0()(

)(2

n

n

xn

fx

fxffxf

Різниця

n

k

kk

n xk

fxfxR

0

)(

)(!

)()()(

називається залишковим членом і служить для оцінювання помилки при заміні

функції )(xf поліномом Тейлора.

Для ряду Маклорена

1)1(

)!1(

)()(

n

n

n xn

xfxR

,де 0<<1.

Таким чином, обчислення значення функції можна звести до обчислення суми

числового ряду

......10 naaa

Задача зводиться до заміни функції ступеневим рядом і знаходження суми

деякої кількості доданків ),( nxaS n для одного або кількох заданих зна-

чень параметра x . Кожний доданок суми залежить від параметра x і номера n ,

що визначає місце цього доданка в сумі.

Форматне виведення даних в С

У мові С, що є попередником мови С++, введення-виведення даних здійсню-

ється за допомогою бібліотеки stdio, що підключається директивою:

#include <stdio.h>

Форматне виведення реалізується функцією:

printf (<форматний рядок>,<список аргументів>);

<форматний рядок> – рядок символів у лапках, що показує, як повинні бути на-

друковані аргументи. Наприклад:

printf ("Value PI equals %f\n", pi);

Page 31: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

29

Форматний рядок може містити символи тексту для виведення, специфікації пе-

ретворення та управляючі символи.. Кожному аргументу відповідає своя специ-

фікація перетворення, наприклад,

%d, %i – десяткове ціле число;

%f – число із плаваючою крапкою типу float;

%lf – число із плаваючою крапкою типу double;

%e – число в експонентній формі типу float або double;;

%c – символ;

%s – рядок.

Після символу % перед символом перетворення може перебувати:

– Знак мінус, що вказує на вирівнювання перетвореного аргументу по лівому

краю поля виведення.

– Ширина поля виведення – задає мінімальне число позицій для перетвореного

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

виведення автоматично розширюється. Якщо ж величина має менше символів,

чим зазначена ширина поля, то ліворуч від її додаються пробіли.

– Точність – число, яке стоїть через крапку за значенням ширини поля виведен-

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

float або double (для float точність за умовчанням дорівнює 6).

Приклади:

printf ("x=%20.8f\n", x);

– виведення значення аргументу x у поле шириною 20 з 8 знаками після десят-

кової крапки.

printf ("x=%-10d\ny=%-10d", x,y);

– виведення значень x і yв окремі рядки з вирівнюванням зліва.

Форматне введення в С

Форматне введення реалізується функцією:

scanf (<форматний рядок>,<список аргументів>);

<форматний рядок> – рядок символів у лапках, що містить специфікації перет-

ворення аргументів. Ця специфікація складається із символу % і закінчується си-

мволом перетворення d, f, c або іншим:

%d, %i – при введенні очікується десяткове ціле число;

%c – очікується окремий символ; для читання наступного символу потрібно

користуватися специфікацією %1s;

%s – очікується символьний рядок

%f – очікується число із плаваючою крапкою типу float.

%е – цей символ перетворення є синонімом для f. Формат введення змінної

типу floatвключає необов'язковий знак, рядок цифр, можливо десяткову

крапку й необов'язкове поле експоненти.

Page 32: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

30

Аргументами в функції scanf мають бути покажчики. Покажчик – це об'єкт, що

зберігає адресу області пам'яті, у яку записано значення змінної. Приклади ви-

користання функції scanf:

scanf("%f", &x);

– введення значення дійсного аргументу x типу float (а не double);

scanf("%s%d", &str,&k);

– введеннярядка символів strі цілочисельного аргументу k.

Постановка задачі

Відповідно свого варіанту скласти програми на С для обчислення значень

функції та суми ряду, який апроксимує дану функцію. Аргумент функції x змі-

нюється від a до b із кроком )1/()( kab , де k – кількість точок. Наближене

значення функції )(xy обчислюється за допомогою ступеневогоряда(ряд Тейло-

ра) для двох випадків:

- для заданого числа членов рядуn ,

- для заданої точності =0.0001.

Точне значення функції )(xy , яке також обчислюється програмою, служить

для перевірки отриманих наближених значень.

Варіанти

№ Функція Діапазон зміни ар-гументу

n Сума

1 xy 3 10 x 5 0,...

!

3ln...

!2

3ln

!1

3ln1 2

2

nxn

xxS nn

2 xy ln 102 x 10 1...,)1(

....2

)1(12

2

nnx

x

x

x

x

xS

n

n

3 xy ln 5.01.0 x 5 0,...)1(

)1(...3

)1(

2

)1()1( 1

32

nn

xxxxS

nn

4

x

xy

1ln2

1 101 x 5 1,...

)12)(12(

1...

)12(3

1

12

1123

nxnxx

Sn

5

x

xy

1

1ln2

1 10 x 5 1,

12.....

3

123

nn

xxxS

n

Page 33: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

31

6

1

1ln2

1

x

xy 102 x 5 0,

)12(

1.....

5

1

3

111253

nxnxxx

Sn

7 xy sin 10 x 5 0...,)!12(

)1(....!3

123

nn

xxxS

nn

8 xy cos 10 x 5 0...,)!2(

)1(....!2

122

nn

xxS

nn

9 4

y x

20

x 10 2 2

sin3 sin(2 1)sin ... ( 1) ..., 0

3 (2 1)

nx n xS x n

n

10 2

xy 11 x 5 1,...

sin)1(.....

2

2sinsin n

n

nxxxS n

11 xy 1 10 x 5 1,...!)!2(

!)!32(...

8

1

2

11 2

nx

n

nxxS n

12 xy 1 10 x 5 1,...!)!2(

!)!32()1(...

8

1

2

11 12

nx

n

nxxS nn

13 x

y

1

1 5.00 x 5 0,.......1 2 nxxxS n

14 x

y

1

1 5.00 x 5 0,...)1(...1 32 nxxxxS nn

15 2)1(

1

xy

10 x 10 0,...)1()1(...4321 32 nxnxxxS nn

16 3)1(

1

xy

10 x 10 0,...

2

)2)(1()1(..631 2

nx

nnxxS nn

17 x

y

1

1 10 x 5 1,...

!)!2(

!)!12()1(....

8

3

2

11 2

nx

n

nxxS nn

Page 34: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

32

18 3)1(

1

xy

10 x 5 0,...

!)!2(

!)!12()1(....

8

15

2

31 2

nx

n

nxxS nn

19 xey 2 10 x 5 0,...

!

)2()1(.....

2

)2(21

2

nn

xxxS

nn

20 y arcsin x 10 x 5 0,...!)!2)(12(

!)!12(....

40

3

3

1 1253

nx

nn

nxxxS n

21 arctgxy 10 x 10 0,...12

)1....(53

1253

nn

xxxxS

nn

22 arctgxy 52 x 5 0,

)12(

1)1(....

5

1

3

11

2 12

1

53

nxnxxx

Sn

n

23 arcctgxy 10 x 10 0,...12

)1(....532

121

53

nn

xxxxS

nn

24 2

xx eey

10 x 5 0,...

)!2(....

!21

22

nn

xxS

n

25 2

xx eey

10 x 5 0...,

)!12(....

!3

123

nn

xxxS

n

Позначення: )12(...531!)!12(,2...642!)!2( nnnn

Методичні вказівки

1. Виконання роботи зводиться до обчислення при фіксованому аргументі x

наступних величин: точного значення функції )(xy ; суми ряду nS при фік-

сованому n ; суми ряду eS , що апроксимує )(xy c заданою точністю .

2. Алгоритм обчислень функції та ряду може бути наступним. Спочатку оголо-

шуються змінні: x (значення аргументу), n (число членів ряду, що врахову-

ються),eps (величина членів, що відкидаються), інтервали зміни аргументу:

x1 і x2. За запитом користувачем уводяться значення n, eps, x1,x2. Ко-

рисно увести в програму функції (наприклад, sum1 і sum2), які розраховують

ряд при фіксованому n і при заданій точності відповідно. В цих функціях

Page 35: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

33

може бути корисною функція (наприклад, term) для обчислення членів ряду,

Для розрахунку значень функції y та ряду при різних x запускається цикл

for із параметром. При кожному проході циклу для поточного х обчислю-

ються y(x) і значення функцій sum1 і sum2, котрі записуються в стовпчики x,

sn,se,y відповідної таблиці:

x Sn Se y

..... ..... ..... ......

..... ...... ..... ......

..... ...... ..... .....

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

Кількість рядків у таблиці має бути не менш 11.

Зміст звіту

Звіт з виконаної роботи включає наступні розділи:

1. титульнийлист,

2. постановка задачі,

3. варіант завдання,

4. блок-схема алгоритму, текст програми,

5. скріншот з результатами роботи програми,

6. порівняння й аналіз результатів,

7. висновки.

Page 36: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

34

Лабораторна робота 5. "Одновимірні масиви. Покажчики. Рядки"

Ціль роботи:Формування уміння описувати, ініціалізувати масиви, роздруковува-

ти вміст масиву, виконувати прості операції над масивами. Одержання навичок вико-

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

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

Теоретичні відомості

Масиви й покажчики

Зі змінних будь-якого типу можна утворювати масиви. При оголошенні ма-

сиву вказується тип даних, ідентифікатор (ім'я) масиву й число елементів масиву

у квадратних дужках:

double mas[10] ; // Масив з п'яти елементів типу double

Індекси елементів масиву починаються з 0, індекс останнього елемента на оди-

ницю менше числа елементів у масиві. Масив можна ініціалізуватисписком зна-

чень у фігурних дужках:

int b[4] = {1,2,3,4};

Для звертання до елемента масиву вказується ідентифікатор масиву й індекс

елемента в квадратних дужках, наприклад, b[2], mas[5].

Змінна, значенням якої є адреса іншої змінної, називається покажчиком. При

оголошенні покажчика перед ідентифікатором записується знак *:

int a, *pa;

– оголошення цілої змінної а й покажчика ра на цілочисельну змінну. Щоб по-

кажчик зв'язати з певною змінною, потрібно покажчику присвоїти адресу цієї

змінної:

pa=&a;

У С/С++ ім'я масиву є також покажчиком на масив, що посилається на перший

елемент масиву (елемент із індексом 0). Таким чином, адресу першого елемента

масиву можна одержати як paабо &a[0]. Значення першого елемента масиву по-

вертається операцією розіменування:

int w=*pa;

– зміннійw присвоїли значення змінної, розміщеної за адресоюpa, тобто a[0].

Записи "покажчик-зсув" і "покажчик-індекс"

Покажчик масиву посилається на перший елемент. Зміщуючи покажчик, мо-

жна звернутися до наступних елементів масиву, наприклад,

W=*(pa+2);

– змінній w присвоюється значення 3-го елемента масиву. Наведений запис – це

запис "покажчик-зсув". Дужки обов’язкові, оскільки пріоритет операції * вище,

Page 37: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

35

ніж пріоритет +. Адреса елемента a[2], тобто &a[2], може бути записана як

pa+2.

Усі елементи масиву можна записати за допомогою покажчиків і зсувів, а за-

пис "покажчик-зсув" можна застосовувати до імені масиву як до покажчика, на-

приклад.

w=*(a+1)

– змінній w присвоєне значення 2-го елемента a[1].

Покажчики можна проіндексувати точно так само, як і масив. Наприклад, ви-

разpa[1]посилається на елемент масиву a[1]. Даний вираз називається запи-

сом "покажчик-індекс".

Наведемо приклад виведення елементів масиву з використанням запису "по-

кажчик-зсув"

int v[3]={1,3,5};

int*p1=v;

for(int i=0;i<3;i++)

cout<<*(p1+i)<<"\t";

Для виведення елементів із використанням запису "покажчик-індекс" в опе-

рації cout потрібно записати:

cout<<p1[i]<<"\t";

Рядки як одновимірні масиви

У мові С рядок подається як одновимірний масив змінних типу char, остан-

нім елементом якого автоматично є нульовий символ '\0'. Можливі кілька видів

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

вказівки розміру масиву:

char name[] = "Andrey";

Тут число елементів масиву визначається автоматично й дорівнює 7 (з ураху-

ванням останнього елемента '\0'). По-друге, масив символів може мати більше

елементів, чим містить абстрактний рядок:

char name[10] = "Andrey";

Тут три останніх елементи масиву не використовуються. Нарешті, рядок може

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

рядок вже повинен існувати, наприклад:

char name[] = "Andrey";

char *namePtr;

namePtr = name;

Відзначимо, що при присвоєнні покажчику адреси масиву не потрібно викорис-

тати адресний оператор &, тому що ім'я масиву поводить себе подібно адреси.

Page 38: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

36

Передача рядка у функцію

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

ім'я рядка-масиву або покажчик на рядок.

Використання імені масиву. Запишемо визначення функції, що друкує ря-

док, і виклик цієї функції:

void print(char client[]){

cout<< "Name of client: " <<client<<endl;}

...

int main(){

char client1[] = "Serg";

...

print(client1);

...

Використання покажчика на рядок. Якщо є покажчик на масив-рядок:

char *client1Ptr= client1;

то можна передати у функцію покажчик:

print(client1Ptr);

Результат буде тим же, як і при передачі імені масиву, оскільки масив переда-

ється у функцію через посилання, тобто через покажчик.

Введення/виведення символів і рядків

Розглянемо функції, якіпризначені для введення/виведення символів і рядків

і належать до стандартної бібліотеки (заголовний файл stdio.h).

Введення по одному символу з потоку введення – здійснюється із клавіа-

тури за допомогою функції getchar(), що повертає код уведеного символу:

int getchar(void);

Виведення одного символу на екран – здійснюється функцією putchar(),

параметром якої є код виведеного символу:

int putchar(intch);

Введення символу без відображення на екрані – здійснюється функцією

getch()з бібліотеки conio. (заголовний файл conio.h).

char getch(void);

У цієї функції, як і в getchar немає параметру. Крім того, значення, що по-

вертається функцією, може бути присвоєно символьній змінній типу char.

Введення рядка символів із клавіатури – здійснюється функцією gets(),

параметром якої є покажчик на початок того рядка, у який вводяться дані. Фун-

кція повертає той же самий покажчик:

char *gets(char *string);

Page 39: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

37

Функція gets читає все, що набирається, поки не натиснута Enter. Ця функ-

ція дозволяє вводити пробіли, чим відрізняється від функції введення scanf, що

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

Виведення рядка символів на екран – здійснюється функцією puts(), па-

раметром якої є покажчик на початок того рядка, з якого виводяться дані. Функ-

ція повертає кількість виведених символів:

int puts(char *string);

Бібліотечні функції для роботи з символами та рядками

У мовах С/С++ передбачені спеціальні функції, призначені для роботи із си-

мволами (табл. 1). Частина функцій перевіряють одиночні символи й повертають

ненульове значення (true) або нуль (false). Наприклад, isdigit(c) дозволяє

перевірити, чи є зміннаc однієї із цифр між 0 і 9. Інша частина функцій у таб-

лиці 1 забезпечує конвертування регістра букв. Так, tolower(c) повертає вер-

сію букви c у нижньому регістрі, тобто малу літеру. Наприклад, інструкція

cout<<tolower('F') виведе на екран символ f.

Наступний фрагмент коду використовується як елемент циклу do-while, у

якому користувач для продовження циклу повинен увести 'Y'. Цикл буде вико-

нуватися незалежно від того, у якому регістрі уведений символ: 'y' або 'Y'.

do{ // тіло циклу

}

while (toupper(choice)=='Y')

Параметром функцій у таблиці 1 є змінна c типу char або int, а для звертан-

ня до функцій підключається заголовний файл ctype.h.

Табл. 1. Функції для роботи із символами

Тип Функція Опис

int isalnum(c) повертає true, якщо c – буква або цифра

int isalpha(c) повертає true, якщо c – буква

int isblank(c) повертає true, якщо c – пробіл або символ табуляції

int isdigit(c) повертає true, якщо c – цифра

int islower(c) повертає true, якщо c – символ у нижньому регістрі

int isupper(c) повертає true, якщо c – символ у верхньому регістрі

int isspace(c) повертає true, якщо c – пробіл, табуляція, повернення каретки, новий рядок

int tolower(c) повертає символ c у нижньому регістрі

int toupper(c) повертає символ c у верхньому регістрі

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

string.h. Найбільш популярні з них наведені в таблиці 2.

Page 40: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

38

Табл. 2. Функції обробки рядків

Прототип Опис

int strlen(char*s) Довжина рядка, але без нуль-символу кінця рядка

int strcmp(char*s1, char*s2) Порівнює рядки s1 і s2, повертає 0 (рівні), < 0 (s1<s2), > 0 (s1 > s2)

char *strcpy(char*s1, char*s2) Копіювання рядка s2 у рядок s1; повертає s2

char *strcat(char*s1, char*s2) Додає s2 до рядка s1; перший символ s2 за-писується поверх нуль-символу s1; повертає s1

char *strchr (char*s, charch) Пошук у рядку s першого входження симво-лу ch

Постановка задачі

1. Скласти програму, у якій створюється одновимірний чисельний масив і

виконується його обробка відповідно до варіанта завдання.

2. Скласти програму для роботи з рядками відповідно свого варіанту, вико-

ристовуючи по можливості бібліотечні функції.

Варіанти

№ Завдання

1. Створити масив з 30-ти натуральних чисел від 1 до 10. Елементи ма-

сиву послідовно зростають від 1 до 10, потім після 10 слідує 1, 2 і так

далі.Вивести масив на екран в один рядок за допомогою cout.

Вивести на екран таблицю ASCII (стовпці - три старших двійкових

розряди таблиці ASCII, рядки - чотири молодших розряди).

2. Створити масив з 30-ти парних чисел 2, 4, 6,... Вивести масив на ек-

ран в один рядок за допомогою printf. Вивести на екран тільки еле-

менти, які кратні 4.

Скласти програму, що у рядку, уведеному користувачем, підраховує

число входжень того або іншого символу. Написати функ-

ціюcountобчислення числа входжень у рядок s символу c:

int count(char *s, char c);

3. Створити масив з 30-ти непарних чисел 1, 3, 5,.. Вивести масив на ек-

ран за допомогою printf. Вивести на екран елементи, кратні 3.

Скласти програму, що скорочує рядок на n символів. Якщо довжина

вихідного рядка менше або дорівнює n, рядок не міняється. Написати

функцію "скорочування" із прототипом: void truncate(char *s, int n);

Page 41: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

39

4. Створити масив з 10-ти чисел-квадратів 12, 22 32, .. Вивести масив на

екран за допомогою printf. Вивести на екран тільки елементи, які

поданіпарними числами.

Скласти програму, що у рядку, уведеному користувачем, перетворить

першу букву кожного слова в прописну. Написати функцію такого

перетворення, що має прототип: void capitalize(char *s);

5. Створити масив з 10-ти чисел-квадратів 12, 22 32, .. Вивести масив на

екран за допомогою printf. Обчислити суму 5-гоі 10-гоелементів

масиву, доступ до яких забезпечується записом "покажчик-зсув".

Скласти програму, що дозволяє для рядка, уведеного користувачем,

визначити кількість слів, що починаються із цифри.

6. Створити масив з 10-ти чисел-кубів 13, 23 33, .. Вивести масив на ек-

ран за допомогою cout. Обчислити різницю 6-го і 10-го елементів ма-

сиву, доступ до яких забезпечується записом "покажчик-зсув".

Скласти програму, що дозволяє для рядка, уведеного користувачем,

визначати: (1) його довжину; (2) кількість цифр; (3) кількість букв.

Вибір дії здійснюється за допомогою меню.

7. Користувач уводить елементи в цілочисельний масив mas[5] за до-

помогою cin. Вивести отриманий масив на екран за допомогою cout.

Обчислити і вивести суму елементів масиву з непарними індексами.

Скласти програму, що додає до слова пробіли ліворуч і праворуч так,

щоб центрувати слово й зробити його довжину рівноюn. Якщо дов-

жина слова більше або дорівнює n, слово не міняється. Якщо загальне

число пробілів непарне, то праворуч ставиться додатковий пробіл.

Написати функцію центрування слова, що має прототип: void center(char *s, int n);

8. Користувач уводить елементи в цілочисельний масив mas[5] за до-

помогою операції cin і запису "покажчик-зсув". Вивести масив на ек-

ран за допомогою cout. Визначити суму елементів масиву й вивести

її на екран.

Вивести на екран всі букви й цифри таблиці ASCII.

9. Користувач вводить елементи в цілочисельний масив mas[5] за до-

помогою функції scanf. Вивести масив на екран за допомогою

printf. Визначити суму елементів зпарнимиіндексамиі вивести її на

екран.

У масиві рядків, уведених користувачем, знайти перші входження си-

мволу 'm'. Використати функцію strchr().

Page 42: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

40

10. Створити і вивести на екран масив з 30-ти непарних чисел 1, 3, 5,...

Користувач визначає номери елементів, суму яких потрібно обчисли-

ти. Вивести суму на екран.

У масиві рядків, уведених користувачем, знайти перші входження си-

мволів 's' і 'S'. Використати функції strchr(),tolower().

11. Створити і вивести на екран масив з 10-ти чисел-кубів 13, 23 33, … За

допомогою запису "покажчик-індекс" визначити суму елементів ма-

сиву й вивести її на екран.

Скласти програму сортування масиву рядків, уведених користувачем.

Використати функцію strcmp().

12. Створити і вивести на екран масив з 10-ти чисел-квадратів 12, 22 32, ..

За допомогою запису "покажчик-індекс" визначити суму непарних

елементів масиву й вивести її на екран.

Скласти програму, що видаляє всі пробіли в рядку, уведеному корис-

тувачем.

13. Створити і вивести на екран масив з 10-ти чисел-квадратів 12, 22 32, ..

За допомогою запису "покажчик-індекс" визначити суму парних еле-

ментів масиву, суму елементів і вивести ці дані на екран.

Скласти програму, що дозволяє для двох рядків, уведених користува-

чем, виконати: (1) порівняння; (2) копіювання; (3) конкатенацію. Ви-

бір дії здійснюється за допомогою меню.

14. Створити і вивести на екран масив з 30-ти непарних чисел 1, 3, 5,.....

Користувач визначає номери елементів, суму яких потрібно обчисли-

ти. Знайти суму за допомогою запису "покажчик-індекс".

Скласти програму, що дозволяє для рядка, уведеного користувачем,

визначати: (1) його довжину; (2) кількість слів; (3) кількість подвій-

них пробілів. Вибір дії здійснюється за допомогою меню.

15. Користувач уводить елементи в цілочисельний масив mas[10]. Виве-

сти масив на екран за допомогою printf. Знайти номери непарних

елементів і вивести ці номери на екран.

Скласти програму, що підраховує число слів у рядку, уведеному ко-

ристувачем, а також формує масив з довжин слів.

16. Користувач уводить елементи в цілочисельний масив mas[10]. Виве-

сти масив на екран за допомогою cout. Знайти номери парних елеме-

нтів і суму цих номерів.

Написати функцію, що повертає значення 0 (не паліндром) і 1 (палін-

дром) і яка маєпрототип: int palindrome(char *s);

Page 43: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

41

17. Користувач уводить елементи в цілочисельний масив mas[10] за до-

помогою функції scanf.. Вивести масив на екран за допомогою

printf. Знайти максимальний елемент масиву й вивести на екран

значення елемента і його номер.

Скласти програму, що визначає, чи є слово, уведене користувачем,

паліндромом.

18. Користувач уводить елементи в цілочисельний масив mas[10] за до-

помогою функції scanf і запису "покажчик-зсув". Вивести масив на

екран за допомогою printf. Знайти мінімальний елемент масиву й

вивести на екран значення елемента і його номер.

Скласти програму, що читає слово, уведене користувачем, і міняє по-

рядок букв у слові на зворотний. Написати функцію обертання слова,

що має прототип: char *word_reverse(char *s);

19. Користувач уводить елементи в цілочисельний масив mas[10] за до-

помогою операції cin і запису "покажчик-зсув". Вивести масив на ек-

ран за допомогою cout.Визначити, чи є в масиві рівні елементи, і ви-

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

Вивести на екран таблицю ASCII, а також малі літери, код яких крат-

ний 3.

20. Користувач уводить елементи в цілочисельнні масиви mas1[5] і

mas2[5]. Вивести масиви на екран за допомогою cout.Визначити, чи

є рівні елементи у двох масивах, і вивести відповідне повідомлення на

екран.

Скласти програму, що додає до рядка пробіли ліворуч, роблячи дов-

жину рядка рівної n. Якщо довжина вихідного рядка більше або дорі-

внює n, рядок не міняється. Написати функцію додавання пробілів,

що має прототип: void blank_left(char *s, int n);

21. Користувач уводить елементи в цілочисельнні масиви mas1[5] і

mas2[5]. Вивести масиви на екран за допомогою printf. Визначити,

чи є рівні елементи із двох масивів. Порівняння елементів виконувати

шляхом переміщення покажчика за допомогою запису "покажчик-

зсув".

Скласти програму, що підраховує число слів у рядку, уведеного кори-

стувачем. Для цього написати функцію із прототипом: int num_word (char *s);

22. Користувач уводить елементи в цілочисельні масиви mas1[7] і

mas2[7]. Вивести масиви на екран за допомогою cout.Визначити, чи

Page 44: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

42

є рівні елементи із двох масивів. Порівняння елементів виконувати

шляхом переміщення покажчика за допомогою запису "покажчик-

індекс".

Вивести на екран таблицю ASCII, а також прописні букви, код яких

кратний 5.

23. Створити масив з 6-ти чисел-квадратів 12, 22 32, .. Вивести масив на

екран за допомогою printf. З використанням запису "покажчик-

індекс" вивести адреси елементів; кожну адресу в окремий рядок.

Скласти програму, що підраховує число малих літер у рядку, уведеної

користувачем. Для цього написати функцію із прототипом: int num_lower(char *s);

24. Створити масив з 6-ти чисел-кубів 13, 23 33, .. Вивести масив на екран

за допомогою cout. З використанням запису "покажчик-зсув" вивести

адреси елементів; адреси відокремити табуляцією.

Скласти програму, що підраховує число прописних букв у рядку, уве-

деного користувачем. Для цього написати функцію із прототипом: int num_upper (char *s);

25. Користувач уводить елементи в цілочисельний масив mas[5] за до-

помогою cin і запису "покажчик-зсув". Вивести масив на екран зви-

користанням операції cout.Знайти максимальний елемент масиву й

вивести на екран значення елемента і його номер.

Скласти програму, що підраховує число слів у рядку, уведеного кори-

стувачем. Для цього написати функцію із прототипом: int num_word (char *s);

Методичні вказівкі

1. Для відділення елементів масиву на екрані використовувати табуляцію,

пробіли або маніпулятори (при роботі з cout).

2. Операції над рядками оформляти у вигляді окремих функцій.

Зміст звіту

Звіт з виконаної роботи включає наступні розділи:

1. титульнийлист,

2. постановка задачі,

3. варіант завдання,

4. текст програми,

5. скріншот з результатами роботи програми,

6. висновки.

Page 45: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

43

Лабораторна робота 6. "Двовимірні масиви"

Ціль роботи: Формування уміння визначати й ініціалізувати багатовимірні маси-

ви;виконуватиоперації над масивами з використанням функцій. Освоєння передачі у

функціїмасиву й елементів масиву.

Теоретичні відомості

Оголошення багатовимірного масиву

При оголошенні багатовимірного масиву необхідно вказати, що масив має

більш ніж один вимір, наприклад,.

int t[2][3];

– оголошення двовимірного масиву з 2 рядків і 3 стовпців. Елементи цього ма-

сиву: розташовуються в пам'яті одне за одним. t[0][0] t[0][1] t[0][2]

t[1][0] t[1][1] t[1][2]

Тобто багатовимірний масив подається як одновимірний масив, кожний з елеме-

нтів якого, у свою чергу, являє собою масив.

Передача масиву у функцію

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

цього використовується операція непрямої адресації (*), тобто покажчик на ма-

сив. У списку аргументів прототипу й визначення функції ставиться покажчик, а

у виклику функції – ім'я масиву. Наведемо приклад визначення й виклику функ-

ції enter, яка призначенадля введення елементів одновимірного масиву:

void enter(int []); //Прототип функції

void main(){

int v[5];

enter(v); //Виклик функції

}

void enter(int a[]) { //Визначення функції

for (int i=0; i<5; i++)

scanf("%d", &a[i]);

}

Замість enter(inta[]) в оголошенні функції можна використовувати за-

пис: enter(int*a). При передачі у функцію багатовимірного масиву має бути

зазначені границі всіх вимірів, крім першого. Наприклад, для двовимірного ма-

сиву:

int arr[2][3]={{1,2,3},{4,5,6}}; //Визначення масиву

void display (int a[][3], int n1) { //Визначення функції

for (int i=0;i<n1;i++){

for (int j=0;j<3; j++) cout<<a[i][j]<<" ";

cout<<endl;}

}

Page 46: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

44

. . .

display (arr); //Виклик функції

Постановка задачі

Скласти програму, використовуючи окремі функції для розв'язку кожної за-

дачі свого варіанта. Масив повинен передаватися у функції як параметр.

Варіанти

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

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

зації масиву й функцію виведення на екран. Порахувати скільки сусід-

ніх елементів, рівних 1, є у елемента (2;2).

2. На головній діагоналі квадратной матрицірозташуватиі числа від N до 1, під

головною діагоналлю нулі, а над головною діагоналлю по рядках числа в по-

рядку зростання від заданого. Оформити заповнення масиву у вигляді окре-

мої функції ініціалізації. Вивести отриману матрицю за допомогою функції.

3. На головній діагоналі квадратной матрицізнаходяться елементи рівні 1, ниж-

че головної діагоналі - 0, а вище - сумі індексів. Оформити заповнення маси-

ву у вигляді окремої функції. Виведіть матрицю на екран (функція).

4. Написати функцію транспонування квадратної матриці. З її допомогою ви-

значити чи є задана матриця симетричної (транспонована матриця дорівнює

вихідній).

5. Заповнити квадратну матрицю випадковими числами (функція). Написати

функцію транспонування матриці. Написати функцію додавання матриць.

Скласти вихідну матрицю й транспоновану. Вивести матриці на екран (фун-

кція).

6. Заповнити квадратну матрицю випадковими числами (функція). Написати

функцію для видалення одного рядка. Після видалення рядка останній рядок

матриці повинен бути заповнено нулями. Вивести вихідну й отриману мат-

риці на екран (функція).

7. Написати функцію для обчислення суми елементів квадратної матриці, які

розташовані нижче головної діагоналі. З її допомогою знайти максимальне

значення такої суми (функція) в N матрицях випадкових чисел (функція).

8. Заповнити квадратну матрицю випадковими числами (функція). Написати

функцію для пошуку мінімального елемента в зазначеному рядку. Зрушити

елементи цього рядка циклічно вліво на кількість елементів, рівну мінімаль-

ному елементу рядка. Вивести вихідну й отриману матриці (функція).

9. Заповнити квадратну матрицю випадковими числами (функція). Знайти суму

елементів першого стовпця без одного останнього елемента, суму елементів

другого стовпця без двох останніх, суму елементів третього стовпця без

Page 47: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

45

трьох останніх і т.д. Останній стовпець не обробляється. Серед знайдених

сум знайти максимальну (функція).

10. Заповнити квадратну матрицю випадковими числами (функція). Знайти міні-

мальний з неповторюваних елементів матриці. Вивести матрицю (функція) і

мінімальний елемент на екран.

11. Заповнити квадратну матрицю випадковими числами (функція). Знайти сере-

днє арифметичне першого стовпця (функція) і кількість елементів матриці,

що перевищують середнє арифметичне першого стовпця.

12. Заповнити квадратну матрицю випадковими числами (функція). Знайти сере-

днє арифметичне головної діагоналі (функція) і кількість елементів у першо-

му рядку, менших цього середнього арифметичного.

13. Заповнити квадратну матрицю випадковими числами (функція). Визначити

скільки елементів матриці більше будь-якого елемента на головній діагоналі.

Вивести масив (функція). і елементи, що задовольняють заданій умові.

14. Заповнити квадратну матрицю випадковими числами (функція). Знайти сере-

днє арифметичне найбільшого (функція) і найменшого (функція) її елементів.

Замінити отриманим середнім арифметичним всі елементи заданого рядка.

Вивести на екран вихідний і отриманий масиви (функція).

15. Заповнити квадратну матрицю випадковими числами з діапазону від -10 до

10 (функція). Записати всі додатні елементи двовимірного масиву в однови-

мірний масив arrP, а від’ємні - в одновимірний масив arrN. Вивести вихід-

ний (функція) і отриманий (функція) масиви на екран .

16. Заповнити квадратну матрицю випадковими числами з діапазону від -10 до

10 (функція). Обчислити суму елементів, що перебувають нижче поточного

рядка, але вище головної діагоналі (функція). Записати подібні суми в одно-

вимірний масив s[k] (k - номер поточного рядка). Знайти найбільшу із цих

сум (функція). Вивести вихідний (функція) і одновимірний (функція) масиви.

17. Заповнити квадратну матрицю випадковими числами від -20 до 20 (функція).

Обчислити суму елементів, що перебувають вище поточного рядка, але ниж-

че головної діагоналі (функція). Записати подібні суми в одновимірний масив

s[k] (k - номер поточного рядка). Знайти найменшу із цих сум (функція).

Вивести вихідний (функція) і одновимірний (функція) масиви на екран.

18. Заповнити квадратну матрицю випадковими числами від -10 до 10 (функція).

Обчислити суми елементів рядків (функція) і записати їх в одновимірний ма-

сив. Знайти найменшу (функція) і найбільшу (функція) із цих сум. Вивести

вихідний (функція) і одновимірний (функція) масиви на екран.

19. Заповнити квадратну матрицю випадковими числами від -20 до 20 (функція).

Обчислити суми елементів на всіх діагоналях (функція) і записати їх в одно-

вимірний масив. Знайти найменшу (функція) і найбільшу (функція) із цих

сум. Вивести вихідний (функція) і одновимірний (функція) масиви на екран.

Page 48: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

46

20. Заповнити квадратну матрицю випадковими числами (функція). Написати

програму побудови одновимірних масивів, елементи яких рівні а) сумам еле-

ментів рядків (функція); б) добуткам елементів рядків (функція). Вивести ви-

хідний (функція) і одновимірні (функція) масиви на екран.

21. Заповнити квадратну матрицю випадковими числами (функція). Написати

програму побудови одновимірного масиву, елементи якого рівні різниці най-

більшого (функція) і найменшого (функція) елементів рядків. Вивести вихід-

ний (функція) і одновимірні (функція) масиви на екран.

22. Заповнити квадратну матрицю випадковими числами від -10 до 10 (функція).

Для даного двовимірного масиву обчислити й запам'ятати в іншому двовимі-

рному масиві суму (функція) і число додатних елементів (функція) кожного

стовпця вихідного двовимірного масиву. Вивести вихідний і отриманий ма-

сиви на екран (функція).

23. Заповнити квадратну матрицю випадковими цілими числами (функція).

Знайти для кожного рядка число елементів, кратних 5 (функція), записати

інформацію в одновимірний масив і знайти найбільший з отриманих резуль-

татів. Вивести вихідний (функція) і одновимірний (функція) масиви на екран.

24. Заповнити двовимірний масив випадковими цілими числами (функція). Знай-

ти найбільший (функція) і найменший (функція) елементи масиву й, чергую-

чи, заповнити ними одновимірний масив заданої розмірності. Вивести вихід-

ний (функція) і одновимірний (функція) масиви на екран.

25. Заповнити квадратну матрицю випадковими числами з діапазону від -50 до

50 (функція). Сформувати одновимірний масив шляхом ділення додатних

елементів матриці на число k. Вивести вихідний (функція) і отриманий (фун-

кція) масиви на екран.

Методичні вказівки

Всі основні операції над масивом, які виконуються відповідно варіанту за-

вдання, реалізуються за допомогою функцій У більшості варіантів приініціалі-

зації масиву використовується генератор випадкових цілих чисел (див. лабора-

торну роботу №5).

Зміст звіту

Звіт з виконаної роботи включає наступні розділи:

1. титульнийлист,

2. постановка задачі,

3. варіант завдання,

4. текст програми,

5. скріншот з результатами роботи програми,

6. висновки.

Page 49: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

47

Лабораторна робота 7. "Динамічні одновимірні масиви"

Ціль роботи: Формуванняуміння створювати й видаляти динамічні масиви, ініціа-

лізувати масив випадковими числами. Освоєння прийомів вставки й видалення елеме-

нтів із масиву, перестановок елементів і ін.

Теоретичні відомості

Динамічні масиви

Якщо до початку роботи програми число елементів у масиві невідоме або це

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

Пам'ять під такі масиви виділяється в ході виконання програми за допомогою

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

клад,

int n=20;

float *a=newfloat[n];

Обнулювання пам'яті при її виділенні не відбувається. Ініціалізувати динамі-

чний масив не можна. Звертання до елемента динамічного масиву здійснюється

так само, як і звертання до елемента звичайного, наприклад, a[5] або *(a+5).

Якщо динамічний масив для роботи програми більше не потрібний, можна

звільнити пам'ять, що він займав. Це виконується інструкцією:

delete []a;

Квадратні дужки для видалення масиву обов'язкові, розмір масиву не вказу-

ється.

Видалення елемента із масиву

Щоб видалити k-й елемент із масиву arr, що має розмір num, необхідно зро-

бити наступне

– залишити без зміни перші (k-1) елементів;

– зсувати всі елементи, починаючи з k-го, на один елемент уліво;

– зменшити кількість елементів масиву num на одиницю.

Ці операції реалізуються за допомогою інструкцій:

for(int i=k; i<num-1; i++)

*(arr+i)=*(arr+i+1);

num--;

Page 50: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

48

Вставка елемента в масив

Нехай є динамічний масив arr розміром num, і нехай k - номер елемента, пі-

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

нати наступне:

– створити новий масив arr1 на одиницю більшого розміру, ніж вихідний;

– скопіювати в arr1 без зміни перші k елементів;

– скопіювати в arr1 елементи, починаючи з (k+1)-го (зсув на один елемент),

– на місце (k+1)-го елемента записати значенняхins;

– видалити з пам'яті вихідний масив arr.

Відповідний код може мати вигляд:

int *arr1=new int[++num]; //Створення нового масиву

for(i=0; i<=k; i++)

*(arr1+i)=*(arr+i);

*(arr1+k+1)=xins;

for(i=k+1; i<num; i++)

*(arr1+i+1)=*(arr+i);

delete []arr; //Видалення колишнього масиву

Перестановка двох елементів

Перестановка елементів k і m цілочисельного масиву здійснюється за допо-

могою робочої змінної intwork:

work=arr[k];

arr[k]=arr[m];

arr[m]=work;

Циклічна перестановка елементів

Циклічну перестановку елементів масиву можна відбразити, як одночасне

переміщення всіх елементів по масиву, замкнутому у кільце. Циклічну переста-

новку вліво можна виконати в такий спосіб:

– скопіювати 1-й елемент масиву в робочу змінну;

– зсунути інші елементи з 2-го до N-го на одну позицію вліво;

– скопіювати елемент із робочої змінної в останню звільнену позицію.

Відповідний код буде мати вигляд:

work=*arr;

for(i=0;i<num-1;i++)

*(arr+i)=*(arr+i+1);

*(arr+num-1)=work;

Якщо необхідно виконати циклічну перестановку на kелементів, то організу-

ється ще один (зовнішній) цикл:

Page 51: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

49

int k=5, circle=0;

while(circle<k){

work=*arr;

for(i=0;i<num-1;i++)

*(arr+i)=*(arr+i+1);

*(arr+num-1)=work;

circle++;

}

Постановка задачі

Скласти програму, у якій створюється одновимірнийдинамічний масив і ви-

конується його обробка відповідно до варіанта завдання.

Варіанти

1. Сформувати одновимірний масив цілих чисел, використовуючи датчик випа-

дкових чисел. Роздрукувати отриманий масив. Видалити елемент із номе-

ром К. Додати після кожного парного елемента масиву елемент із значен-

ням 0. Роздрукувати отриманий масив.

2. Сформувати одновимірний масив цілих чисел a[], використовуючи датчик

випадкових чисел. Роздрукувати отриманий масив. Видалити перший еле-

мент рівний 0. Додати після кожного парного елемента масиву елемент із

значенням a[i-1]+2. Роздрукувати отриманий масив.

3. Сформувати одновимірний масив цілих чисел a[], використовуючи датчик

випадкових чисел. Роздрукувати отриманий масив. Видалити всі елементи

рівні 0. Додати після першого парного елемента масиву елемент із значенням

a[i-1]+2. Роздрукувати отриманий масив.

4. Сформувати одновимірний масив цілих чисел a[], використовуючи датчик

випадкових чисел. Роздрукувати отриманий масив. Видалити елементи, інде-

кси яких кратні 3. Додати після кожного від’ємного елемента масиву елемент

із значенням |a[i-1]+1|. Роздрукувати отриманий масив.

5. Сформувати одновимірний масив цілих чисел, використовуючи датчик випа-

дкових чисел. Роздрукувати отриманий масив. Видалити елементи кратні 7.

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

Роздрукувати отриманий масив.

6. Сформувати одновимірний масив цілих чисел a[], використовуючи датчик

випадкових чисел. Роздрукувати отриманий масив. Видалити елемент із за-

даним номером. Додати після другого парного елемента масиву елемент із

значенням a[i-1]+2. Роздрукувати отриманий масив.

7. Сформувати одновимірний масив цілих чисел, використовуючи датчик випа-

дкових чисел. Роздрукувати отриманий масив. Видалити останній елемент

Page 52: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

50

рівний 0. Додати після елемента масиву із заданим індексом елемент із зна-

ченням 100. Роздрукувати отриманий масив.

8. Сформувати одновимірний масив цілих чисел, використовуючи датчик випа-

дкових чисел. Роздрукувати отриманий масив. Видалити всі елементи із за-

даним значенням. Додати перед кожним парним елементом масиву елемент

із значенням 0. Роздрукувати отриманий масив.

9. Сформувати одновимірний масив цілих чисел, використовуючи датчик випа-

дкових чисел. Роздрукувати отриманий масив. Видалити перший елемент із

значенням, яке відповідає заданій умові. Зсунути масив циклічно на k елеме-

нтів вправо. Роздрукувати отриманий масив.

10. Сформувати одновимірний масив цілих чисел, використовуючи датчик випа-

дкових чисел. Роздрукувати отриманий масив. Видалити 5 перших елементів

масиву. Додати до кінця масиву 3 нових випадкових елементи. Роздрукувати

отриманий масив.

11. Сформувати одновимірний масив цілих чисел a[], використовуючи датчик

випадкових чисел. Роздрукувати отриманий масив. Видалити 5 останніх

елементів масиву. Додати в початок масиву 3 елементи із значенням 33. Роз-

друкувати отриманий масив.

12. Сформувати одновимірний масив цілих чисел, використовуючи датчик випа-

дкових чисел, і роздрукувати масив. Поміняти місцями мінімальний і макси-

мальний елементи масиву. Видалити з масиву всі елементи, які перевищу-

ють його середнє значення більш, ніж на 10%. Роздрукувати отриманий ма-

сив.

13. Сформувати одновимірний масив цілих чисел, використовуючи датчик випа-

дкових чисел, і роздрукувати масив. Видалити з масиву всі елементи, що збі-

гаються з його мінімальним значенням. Додати в початок масиву 3 елементи,

які рівні середньому арифметичному масиву. Роздрукувати отриманий масив.

14. Сформувати одновимірний масив цілих чисел a[], використовуючи датчик

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

що число елементів масиву непарне, видалити його середній елемент. Додати

в початок масиву 3 елементи із значенням 99. Роздрукувати отриманий ма-

сив.

15. Сформувати одновимірний масив цілих чисел, використовуючи датчик випа-

дкових чисел. За запитом виконати циклічну перестановку елементів масиву

вліво або вправо. Роздрукувати отриманий масив зліва направо, починаючи з

k-ого елемента, і до k-1-го. Видалити з масиву перший і останній елементи.

Роздрукувати отриманий масив справа наліво відk-го до k+1-го елемента.

16. Сформувати одновимірний масив цілих випадкових чисел. Видалити всі еле-

менти, більші даного числа x (x увести з клавіатури).Роздрукувати отрима-

Page 53: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

51

ний масив. Циклічно переставити елементи на 3 позиції вправо. Вставити чи-

сло y(увести з клавіатури) після всіх елементів, менших його.

17. Сформувати одновимірний масив цілих чисел, використовуючи датчик випа-

дкових чисел. Виконати циклічну перестановку елементів масиву вліво на 5

позицій. Роздрукувати отриманий масив зліва направо, починаючи з k-ого

елемента й до k-1. Додати в масив два елементи – у першу й останню пози-

цію. Роздрукувати отриманий масив справа наліво, починаючи з k-ого елеме-

нта й до k+1.

18. Сформувати одновимірний масив цілих чисел, використовуючи датчик випа-

дкових чисел. Виконати циклічну перестановку елементів масиву на k пози-

цій вправо. Роздрукувати отриманий масив зліва направо, починаючи з k-ого

елемента й до k-1.Додати в масив два елементи – у першу й останню пози-

цію. Видалити з масиву парні елементи. Роздрукувати отриманий масив

справа наліво, починаючи з k-ого елемента й до k+1.

19. Сформувати одновимірний масив цілих чисел, використовуючи датчик випа-

дкових чисел. Виконати циклічну перестановку елементів масиву на k пози-

цій уліво або вправо (із запитом). Роздрукувати отриманий масив. Додати в

масив два елементи – у першу й останню позицію. Видалити з масиву непа-

рні елементи. Роздрукувати отриманий масив справа наліво, починаючи з k-

ого елемента й до k+1.

20. Сформувати одновимірний масив цілих чисел, користуючись датчиком випа-

дкових чисел. За запитом виконати циклічну перестановку елементів масиву

вліво або вправо. Роздрукувати отриманий масив зліва направо, починаючи з

k-ого елемента й до k-1. Додати в масив після елементів з індексами кратни-

ми 5 елементи рівні 0. Роздрукувати отриманий масив справа наліво, почи-

наючи з k-ого елемента й до k+1.

21. Сформувати одновимірний масив цілих чисел, використовуючи датчик випа-

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

на k елементів.. Додати в масив 4 нових елементи: один - перед першим і три

– після останнього. Роздрукувати отриманий масив справа наліво, починаючи

з k -ого елемента й до k+1.

22. Сформувати одновимірний масив цілих чисел, використовуючи датчик випа-

дкових чисел. Видалити всі елементи, кратні 3 або 5. Роздрукувати отрима-

ний масив. Вставити два елементи: перший - після максимального елемента,

другий - перед максимальним елементом. Роздрукувати отриманий масив.

23. Сформувати одновимірний масив цілих чисел, використовуючи датчик випа-

дкових чисел. За запитом виконати серію циклічних перестановок уліво або

вправо з виведенням масиву на екран після кожної перестановки. Серія пере-

становок припиняється за запитом. Видалити з масиву всі елементи, що збі-

Page 54: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

52

гаються з його максимальним значенням. Роздрукувати отриманий масив

справа наліво, починаючи з k-ого елемента й до k+1.

24. Сформувати одновимірний масив цілих чисел, використовуючи датчик випа-

дкових чисел. Виконати циклічну перестановку елементів масиву на k пози-

цій уліво. Роздрукувати отриманий масив зліва направо, починаючи з k-ого

елемента й до k-1.Видалити з масиву парні елементи. Роздрукувати отрима-

ний масив справа наліво, починаючи з k-ого елемента й до k+1.

25. Сформувати одновимірний масив цілих чисел, використовуючи датчик випа-

дкових чисел. За запитом виконати серію циклічних перестановок вправо з

виведенням масиву на екран після кожної перестановки. Серія перестановок

припиняється за запитом. Роздрукувати отриманий масив справа наліво, по-

чинаючи з k-ого елемента й до k+1. Видалити з масиву непарні елементи. Ро-

здрукувати отриманий масив справа наліво, починаючи з k-ого елемента й до

k+1.

Методичні вказівки

1. При складанні програми використовуються динамічні масиви.

2. Всі відсутні параметри й режими роботи програми задаються користувачем.

3. Після виконання кожного пункту завдання організувати виведення масиву.

Зміст звіту

Звіт з виконаної роботи включає наступні розділи:

1. титульнийлист,

2. постановка задачі,

3. варіант завдання,

4. текст програми,

5. скріншот з результатами роботи програми,

6. висновки.

Page 55: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

53

Лабораторна робота 8. "Структури: складені типи даних"

Ціль роботи: Освоєння прийомів роботи із структурами й складання програм, що

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

дані, записані в структуру.

Теоретичні відомості

Структури – це складені типи даних, які побудовані з використанням інших

типів. Наприклад,

struct person {

char name[100];

intage;};

де struct – службове слово; person – ім'я (ідентифікатор, тег) структури;

name і age – два елементи, що становлять структуру (масив змінних char і ціле

число). Оголошення структури повинне закінчуватися крапкою з комою.

Змінні структури оголошуються так само, як змінні інших типів, наприклад,

person fath, ladies[5], *Pfath;

тут ladies[5] – масив структур, *Pfath – покажчик на структуру типу

person.

Доступ до елементів структури здійснюється операцією . (крапка) для імені

структури й -> (стрілка) – для покажчика на структуру, наприклад:

fath.age=12;

ladies[3].age=27;

cout<<fath.name;

cout<<ladies[3].age;

cout<<Pfath->name;

Вираз Pfath->nameеквівалентний виразу (*Pfath).name, що розіменовує

покажчик і робить доступним елемент через операцію "крапка".

Після визначення структури можна оголосити масив структур. Наприклад,

щоб оголосити масив з 30 елементів типу name_struct, досить записати:

name_struct elem[30];

Для одержання доступу до конкретного елемента масиву структур потрібно

проіндексувати ім'я структури.

Постановка задачі

Скласти програму, що створює масив структур і дозволяє вводити дані в ма-

сив, виводити дані на екран і виконувати інші дії. Управління структурами по-

винне здійснюватися за допомогою меню. У меню присутні опції:

– введення даних,

Page 56: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

54

– виведення даних,

– вихід із програми,

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

Варіанти

№ Структура (поля) Додаткові опції меню

(наступні операції)

1 "Абітурієнт" (прізвище, ім'я, рік народження, оцінки вступ-них іспитів (5 ісп.))

- Пошук за прізвищем ( –> введення прізвища –> виведення даних по абітурієнту, а також середнього бала й результату «прийнято/не прийнято»)

2 "Абітурієнт" (прізвище, ім'я, рік народження, оцінки вступ-них іспитів (5 ісп.))

- Пошук за роком народження (–> введення року –> виведення знайдених записів)

3 "Абітурієнт" (прізвище, ім'я, рік народження, оцінки вступ-них іспитів (5 ісп.))

- Зміна даних (–> введення прізвища –> вве-дення нових даних)

4 "Абітурієнт" (прізвище, ім'я, рік народження, оцінки вступ-них іспитів (5 ісп.))

- Фільтрація за роком народження (–> вве-дення року –> виведення знайдених записів)

5 "Студент" (прізвище, ім'я, но-мер групи, середній бал сесії)

- Упорядкувати за номером групи (–>виведення даних)

6 "Студент" (прізвище, ім'я, но-мер групи, оцінки іспитів)

- Упорядкувати за середнім балом (–>виведення даних)

7 "Студент" (прізвище, ім'я, но-мер групи, середній бал сесії)

- Студенти із середнім балом > 4.2 (–>виведення прізвищ і номерів груп)

8 "Студент" (прізвище, ім'я, но-мер групи, оцінки іспитів)

- Студенти з оцінками 4 і 5 (–>виведення прі-звищ і номерів груп, а також кількості таких студентів)

9 "Студент" (прізвище, ім'я, но-мер групи, оцінки іспитів)

- Студенти з оцінками 2 (–> виведення прі-звищ)

- Кількість «двієчників» у кожній групі

10 "Співробітник" (прізвище, іні-ціали, посада, стаж роботи, оклад)

- Додати співробітника

- Упорядкувати за прізвищем

11 "Співробітник" (прізвище, іні-ціали, посада, стаж роботи, оклад)

- Співробітники зі стажем більше…(–>введення числа із клавіатури –> виведен-ня прізвищ співробітників)

12 "Співробітник" (прізвище, іні-ціали, посада, стаж роботи, оклад)

- Виведення даних (поля структури, а також виплачена сума: оклад за винятком подат-ку 20%)

- Змінити дані (-> запит на введення прізви-ща -> введення нових даних)

Page 57: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

55

13 "Співробітник" (прізвище, іні-ціали, посада, стаж роботи, оклад)

- Співробітники з окладом в інтервалі… (–>введення границь діапазону –> виведення прізвищ співробітників)

14 "Поїзд" (пункт призначення, номер поїзда, час відправлен-ня)

- Поїзда після…(–>введення часу –> виве-дення поїздів, що відправляються пізніше уведеного часу)

15 "Поїзд" (пункт призначення, номер поїзда, час відправлен-ня)

- Пункт призначення …(–> введення назви пункту –> виведення інформації про поїз-ди в даний пункт)

16 "Поїзд" (пункт призначення, номер поїзда, час відправлен-ня)

- Номер поїзда …(–> введення номера по-їзда –> виведення інформації про поїзд)

17 "Поїзд" (пункт призначення, номер поїзда, час відправлен-ня)

- Зміна в розкладі (–> введення номера по-їзда –> введення нового часу відправлен-ня)

18 "Поїзд" (пункт призначення, номер поїзда, час відправлен-ня)

- Зміна в розкладі (–> введення номера по-їзда –> введення нового пункту призначення)

19 "Блокнот" (прізвище, ім'я, те-лефон, день народження)

- Пошук телефону (–> введення прізвища –> виведення номера телефону)

20 "Блокнот" (прізвище, ім'я, те-лефон, день народження)

- У кого сьогодні день народження? (–> вве-дення поточної дати –> виведення прізвищ персон із зазначеною датою народження)

21 "Блокнот" (прізвище, ім'я, те-лефон, день народження)

- Змінити номер телефону (–> введення прі-звища –> введення нового номера)

22 "Накладна" (назва товару, ціна, кількість, вартість)

- Введення даних (товар, ціна, кількість) - Виведення даних (товар, ціна, кількість,

вартість) - Загальна сума

23 "Накладна" (назва товару, ціна, кількість, вартість)

- Введення даних (товар, ціна, кількість) - Виведення даних (товар, ціна, кількість,

вартість) - Додати товар

24 "Накладна" (назва товару, ціна, кількість, вартість)

- Введення даних (товар, ціна, кількість) - Виведення даних (товар, ціна, кількість,

вартість) - Внести зміни ((-> введення назви товару ->

введення нових дані)

Методичні вказівки

Дані, що вводить користувач, розміщуються в масиві структур - записах. Ін-

терфейс програми повинен бути побудований у вигляді меню з опціями: введен-

ня, відображення, пошук, зміна записів і іншими. Введення даних передбачає

додавання даних у перший вільний запис.

Page 58: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст

56

Зміст звіту

Звіт з виконаної роботи включає наступні розділи:

1. титульний лист,

2. постановка задачі,

3. варіант завдання,

4. текст програми,

5. скріншот з результатами роботи програми,

6. висновки.

Література

1. Шилдт Г. С++. Базовый курс. – М: Вильямс.–2014, 624 с.

2. Прата С. Язык программирования. Лекции и упражнения. Учебник. – М.–

С-Пб.– К.: ДиаСофт, 2005. – 1104 с.

3. Грицюк Ю., Рак Т. Програмування мовою С++. –Львів: Вид-во ЛДУ БЖД,

2011. – 292 с.

4. Либерти Дж. Освой самостоятельно С++. 5-е изд. –М: Вильямс,2006. –

784 с.

5. Подбельский В.В. Язык Си++. –М.: Финансы и статистика, 2005. – 560 с.

6. Березин Б.И., Березин С.Б. Начальный курс С и С++. – М.: Диалог-

МИФИ, 2000. – 288 с.

7. Культин Н.. С/С++ в задачах и примерах. –С.-Пб.: BHV, 2005. – 292 с.

Page 59: Œˇˆ‹ Ž˘ ˛˚‘˘ ˛ ‰˝’ˆ˛˜ ˇ˘ ˜˝ ˆ» · компіляції. Правила препроцесорної обробки визначає програміст