Дипломна робота
Мова програмування С++
Зміст
1. Створення простих програм на С++
1.1 Структура програми
1.2 Етапи виконання програми
1.3 Порядок запуску програми
2. Форматний ввід/вивід у мові С/С++
2.1 Функції вводу/виводу мови С
2.2 Функції вводу/виводу та маніпулятори мови С++
3. Лінійні програми на С++
3.1 Стандартні типи даних мови С++
3.2. Операції мови С++
4. Основні оператори мови С++
4.1 Складові оператори
4.2 Оператори розгалуження
4.3 Оператори циклу
4.4 Оператори переходу
5. Вказівними та операції над ними
5.1 Поняття вказівника
5.2 Дії над вказівниками
6. Робота з одновимірними масивами
6.1 Статичні та динамічні масиви
6.2 Рядки, як одновимірні масиви
7. Двовимірні масиви
8. Символьна інформація та рядки
8.1 Збереження символьної інформації
8.2 Функції вводу/виводу для роботи з рядками
8.3 Спеціальні функції для роботи з рядками та символами
9. Функції користувача
9.1 Функції: визначення, опис, виклик
9.2 Передача масивів у функцію
9.3 Перевантаження функцій у С++
9.4 Функції зі змінною кількістю параметрів
10. Структури
Список літератури
1. Створення простих програм на С++
C++ (Сі-плюс-плюс) — універсальна мова програмування високого рівня з підтримкою декількох парадигм програмування: об"єктно-орієнтованої, узагальненої та процедурної. Розроблена Б"ярном Страуструпом (англ. Bjarne Stroustrup) в AT&T Bell Laboratories (Мюррей-Хілл, Нью-Джерсі) у 1979 році та названа «Сі з класами». Страуструп перейменував мову у C++ у 1983 р. Базується на мові Сі. Визначена стандартом ISO/IEC 14882:2003.
1.1 СТРУКТУРА ПРОГРАМИ
Розглянемо програму, що виводить на екран монітора фразу “Ласкаво просимо до С++!”:
Приклад 1.
// Welcome.cpp – ім^я файла з програмою
# include
void main ()
{ cout << ” Ласкаво просимо до С++! n”;
}
Результат виконання програми:
Ласкаво просимо до С++!
У першому рядку програми міститься однорядковий коментар, що починається з символу “//”, який вказує, що після цього символу йде однорядковий коментар. Коментарі не викликають ніяких дій комп^ютера і ігноруються компілятором С++, а лише допомагають іншим людям читати і зрозуміти Вашу програму.
У другому рядку розміщено команду (директиву) препроцесору, що забезпечує включення до програми засобів зв^язку зі стандартними потоками вводу і виводу даних. Вказані засоби містяться у файлі під назвою iostream.h (мнемоніка: “і” (input) – ввід; “output” – вивід; “stream” – потік; “head” - заголовний). Рядок, що починається з ”#”, обробляється препроцесором перед компіляцією програми. Файл iostream.h повинен бути залучений для всіх програм, що виводять дані на екран монітора або вводять дані з клавіатури.
Третій рядок є заголовком функції з іменем main. Будь-яка програма на С++ повинна містити лише одну функцію з таким іменем. Саме з неї починається виконання програми. void – специфікатор типу, який вказує, що функція main в даному прикладі не повертає ніякого значення. Круглі дужки після main потрібні в зв^язку з форматом (синтаксисом) заголовка будь-якої функції. В них розміщується список параметрів. У нашому прикладі параметри не потрібні.
Тіло будь-якої функції повинно починатися і закінчуватися фігурними дужками, між якими знаходиться послідовність описів, операторів і визначень. Кожен оператор, визначення чи опис повинні закінчуватися крапкою з комою.
Рядок
cout << ” Ласкаво просимо до С++! n”;
є командою комп^ютеру надрукувати на екрані рядок символів, що записаний у лапках. Повний рядок, включаючи cout, операцію ”<<”, рядок ”Ласкаво просимо до С++! n” і крапку з комою “;”, називається оператором. Всі вводи і виводи в С++ виконуються над потоками символів. Таким чином потік символів Ласкаво просимо до С++! спрямовується до об^єкта стандартного потоку виводу cout, який пов^язаний з екраном. Вже зараз слід відмітити одну з принципових особливостей мови С++, яку називають перевантаженням або розширенням дії стандартних операцій. Операція ”<<” називається операцією „розмістити у потік” лишень у тому випадку, коли зліва від неї знаходиться ім^я об^єкта cout. Інакше пара символів “<<” означає бінарну операцію зсуву вліво. Символи правого операнда зазвичай виводяться так само, як вони виглядають між лапками.
Слід зазначити, що символи ” ” не виводяться на екран. Комбінацію символів, що починаються з позначки оберненого Стеша (””), називають знаком переходу або escape-символом. Керуюча послідовність ” ” означає перехід на початок нового рядка. Цей символ в лапках може знаходитися будь-де в рядку, при цьому послідовність символів, що знаходиться за ним, виводитиметься з нового рядка. Тобто результат виконання операції
cout << ” Ласкаво просимо до С++! n”;
матиме вигляд:
Ласкаво просимо
до С++!
1.2 ЕТАПИ ВИКОНАННЯ ПРОГРАМИ
Вихідна програма, підготовлена на мові С++ у вигляді текстового файла з розширенням *.срр (welcome.cpp), проходить 3 етапи обробки:
1) препроцесорне перетворення тексту програми;
2) компіляція;
3) компоновка (редагування зв¢язків чи складання).
Після цих 3 етапів формується машинний код програми, що виконується.
Задачею препроцесора є перетворення (доповнення) тексту програми до початку її компіляції. Правила препроцесорної обробки визначаються програмістом за допомогою директив препроцесора. Директива починається з ”#” (¢дієс¢, ¢шарп¢). Наприклад,
1) #define - визначає правила заміни в тексті:
#define ZERO 0.0
Це означає, що кожне використання у програмі імені ZERO буде замінюватися на 0.0.
2) #include< ім¢я заголовного файла > - передбачена
для залучення до тексту програми тексту файлу з каталогу “Заголовних файлів” INCLUDE,
які постачаються разом зі стандартними бібліотеками. Кожна бібліотечна функція чи
об¢єкт
С++ має відповідний опис в одному з заголовних файлів (наприклад, iostream.h,
stdio.h, conio.h, math.h). Список заголовних файлів визначається стандартом
мови. Використання директиви include не під¢єднує відповідну стандартну
бібліотеку, а лише дозволяє долучити до тексту програми описи із зазначеного
заголовного файлу. В нашому випадку препроцесор обробляє директиву #include
Після компоновки утворюється модуль програми з розширенням *.ехе.
Отже, в нашому випадку, виконавши директиви, препроцесор сформує повний текст програми, компілятор створить об^єктний файл welcome.obj, за замовчуванням обравши для нього зазначене ім^я, а компоновщик (редактор зв^язків Linker) доповить програму бібліотечними функціями, наприклад, для роботи з об^єктом cout і побудує модуль welcome.exe, запустивши, який ми одержуємо на екрані бажану фразу. Схема етапів виконання програми наведена на рис. 1.1.
1.3 ПОРЯДОК ЗАПУСКУ ПРОГРАМИ
1. Відкрийте нове вікно редагування (File > New) і надайте йому ім^я Welcome (File > Save As);
2. У новому вікні наберіть текст програми, що наводиться у Прикладі 1.
3. Відкомпілюйте програму (Compile > Compile або (Alt+F9)). В разі повідомлень про помилку, перевірте текст програми і усуньте невідповідності. Щоразу, вносячи зміни у вихідний текст програми, зберігайте файл (File > Save або F2). Після чого змінену програму слід відкомпілювати;
4. Запуск відкомпільованої програми здійснюється за командою (Run > Run або Ctrl+F9). Якщо з моменту останньої компіляції вихідний код було модифіковано, ця команда виконає послідовно компіляцію і компоновку. Результат виконання програми можна переглянути, натиснувши комбінацію клавіш Alt+F5.
2. Форматний ввід/вивід у мові С/С++
2.1 ФУНКЦІЇ ВВОДУ/ВИВОДУ МОВИ С
У мові С++ немає вбудованих засобів вводу/виводу – вони здійснюються за допомогою функцій, типів та об^єктів, що містяться у стандартних бібліотеках. Використовується два способи: функції, успадковані з мови С та об^єкти С++.
Основні функції вводу/виводу в стилі
С, опис яких міститься у заголовному файлі
рrintf (<керуючий рядок>, <список аргументів>);
Керуючий рядок береться у лапки і вказує компілятору вигляд інформації, що виводиться. Вона може містити специфікації перетворення і керуючи або escape-символи.
Специфікація перетворення має такий вигляд:
% <прапор> <розмір поля . точність> специфікація,
де прапор може набувати наступних значень:
- вирівнювання вліво числа, що виводиться (за замовчуванням виконується вирівнювання вправо);
+ виводиться знак додатного числа;
розмір поля – задає мінімальну ширину поля, тобто довжину числа. Якщо ширини поля недостатня, автоматично виконується його розширення;
точність – задає точність числа, тобто кількість цифр його дробової частини;
специфікація вказує на вигляд інформації, що виводиться. У таблиці 2.1 наведено основні формати функції друку.
Таблиця 2.1
| Формат | Тип інформації, що виводиться |
| %d | десяткове ціле число |
| % і | для виведення цілих чисел зі знаком (printf (“a=%i”, -3)); |
| %u | для виводу беззнакових цілих чисел (printf(“s=%u”, s)) |
| %c | один символ |
| %s | рядок символів |
| %e | число з плаваючою крапкою (експоненційний запис) |
| %f | число з плаваючою крапкою (десятковий запис) (printf(“b=%f , c=%f , d=%f ”, 3.55, 82.2, 0.555 )); |
| %u | десяткове число без знака |
Керуючий рядок може містити наступні керуючі символи:
– перехід на новий рядок;
– горизонтальна і v – вертикальна табуляція;
– повернення назад на один символ;
– повернення на початок рядка;
a – звуковий сигнал;
” –лапки;
? – знак питання;
- зворотний слеш.
Список аргументів - об¢єкти, що друкуються (константи, змінні). Кількість аргументів та їх типи повинні відповідати специфікаціям перетворення в керуючому рядку.
Приклад 1.
#include
#define PI 3.1415926
void main()
{
int number=5, cost=11000, s=-777;
float bat=255, x=12.345;
printf ("%d студентів з¢їло %f бутербродів. ", number, bat);
printf ("Значення числа pi рівне%f. ", pi);
printf ("Вартість цієї машини %d%s ", cost,"у.е");
printf ("x=%-8.4f s=%5d%8.2f ", x, s, x);
}
В результаті виконання останньої функції printf() на екрані буде виведено:
х=12.3450 s= -777 12.34
Функція scanf передбачена для форматного вводу інформації довільного вигляду. Загальний вигляд функції:
scanf (<керуючий рядок>, < список адрес>);
На відміну від функції виводу printf(), scanf() використовує у списку адреси змінних, для одержання яких перед іменем змінної ставиться символ ”&”, що позначає унарну операцію одержання адреси. Для вводу значень рядкових змінних символ ”&” не використовується. При використанні формату %s рядок вводиться до першого пропуску. Вводити дані можна як в одному рядку через пропуск, так і в різних рядках.
Дану особливість ілюструє відповідна частина програми:
int course;
float grant;
char name[20];
printf ( "Вкажіть ваш курс, стипендію, ім¢я ");
scanf ( "%d%f", &course, &grant);
scanf ( "%s", name); /* ”&” відсутній при зазначенні масиву символів */
Для зміни кольору тексту використовують
функції із файла
Колір можна задати за допомогою цілої або іменованої константи, перелік яких наводиться у таблиці 2.2.
Таблиця 2.2
Колір |
Константа |
Значення константи |
| Чорний | BLACK | 0 |
| Синій | BLUE | 1 |
| Зелений | GREEN | 2 |
| Червоний | RED | 4 |
| Фіолетовий | MAGENTA | 5 |
| Сірий | GREY | 8 |
| Блакитний | LIGHTBLUE | 9 |
| Помаранчевий | LIGHTRED | 12 |
| Жовтий | YELLOW | 14 |
| Білий | WHITE | 15 |
2.2 ФУНКЦІЇ ВВОДУ/ВИВОДУ ТА МАНІПУЛЯТОРИ МОВИ С++
А ось як виглядає програма вводу/виводу з використанням бібліотеки класів С++:
Приклад 2.
# include
void main()
{ int i;
cout<< “Введіть ціле число ”;
//об^єкт для вводу з клавіатури і >>розміщення у потік виводу
cin>> i;
cout<< “Ви ввели число”<< i <<”дякую!”;
}
Для форматного виводу у С++ використовуються
маніпулятори, для використання яких до програми потрібно підключити заголовний файл
setw(int) – встановлює максимальну ширину поля виводу чисел та рядків (не символів);
setprecision(int) – встановлює максимальну кількість цифр дробової частини для дійсних чисел з фіксованою крапкою;
setiosflags(ios::showpoint | ios::fixed) – вивід дійсних чисел з фіксованою крапкою;
setiosflags(ios::left) або setiosflags(ios::right) – вирівнювання по лівому або правому полю;
endl – при виводі включає у потік символ нового рядка, еквівалентний “ ” (його опис міститься у файлі iostream.h).
Маніпулятори спрямовуються в потік виводу, аналогічно тому, як це зроблено у прикладі 3:
Приклад 3.
# include
#include
void main()
{float d=52.28679;
float f= 410.0;
cout<< setprecision(3);
cout< cout< } Результат виводу ( позначає пробіл): 52.287 410.000 У даному прикладі маніпулятори точності
та фіксації крапки спрямовуються у потік виводу одноразово, тоді як ширину поля
виводу необхідно встановлювати для кожного значення. 3.1 СТАНДАРТНІ ТИПИ ДАНИХ
МОВИ С++ Всі об¢єкти (змінні, масиви тощо),
з якими працює програма в С/С++, необхідно визначати або описувати. Найпростіша
форма визначення змінної: <тип> <список імен змінних>; При оголошенні об¢єкти можна ініціалізувати (задавати
початкове значення). Наприклад: int j=10,
m(3), n; float c(-1.3), l=-10.23, f1; Оголошення повідомляють компілятору про
властивості та імена об¢єктів і функцій. Змінні можуть змінювати свої значення. При наданні значення
змінній у комірці пам¢яті, яка відводиться під неї, розміщується код цього значення. Доступ до
значення цієї змінної можливий через ім¢я змінної, а доступ до ділянки пам¢яті здійснюється за
її адресою. Розмір ділянки пам¢яті, що відводиться змінній, визначається її типом. Перелік базових типів
даних наведено у таблиці 3.1. Таблиця 3.1 3.2 ОПЕРАЦІЇ МОВИ С++ Позначки
операцій – це один або декілька символів, що визначають
дію над операндами. Операції поділяють на унарні, бінарні та тернарні за кількістю
операндів, які беруть участь в операції (таблиця 3.2). Таблиця 3.2. Унарні операції Інкремент (збільшення
на одиницю): Префіксна операція
(++х) збільшує операнд на 1 до його використання. Постфіксна операція
(х++) збільшує операнд на 1 після його використання. int m=1, n=2; int a=(m++)+n;
// a=3, m=2, n=2 int b=m+(++n);//
b=6, m=2, n=3 Декремент (зменшення
на одиницю): Префіксна операція
(--х) зменшує операнд на 1 до його використання. Постфіксна операція
(х--) зменшує операнд на 1 після його використання. Обчислення розміру
(в байтах) об¢єкта того типу, який має операнд. Має дві форми: 1) sizeof (вираз); sizeof(1.0); //
Результат - 8, Дійсні константи
за замовчуванням мають тип double; 2) sizeof (тип) sizeof (char);
// Результат – 1. Бінарні операції Вираз1 ? Вираз2
: Вираз3; Першим вираховується
значення Виразу1. Якщо воно істинне, тоді обчислюється значення Виразу2, яке стає
результатом. Якщо при обчисленні Виразу1 одержуємо 0, тоді в якості результату
береться значення Виразу3. Наприклад: х<0 ? -x : x
; //обчислюється абсолютна величина x. Таблиця 3.3. Пріоритет виконання операцій Основні матичні функції мови С/С++, опис
яких міститься у файлі Таблиця 3.4 chx=1/2(ex+e-x) ex xy sh x=1/2 (ex-e-x) Таблиця 3.5 Операції присвоювання Р/=(2.2-х) еквівалентно Р=Р/(2.2-х) 4. Основні оператори мови
С++ 4.1 СКЛАДОВІ ОПЕРАТОРИ Складовий оператор – це два або більше оператори, що повинні виконуватися
у певній частині програми як один оператор. До складових операторів належать власне
складовий оператор та блок. В обох випадках - це послідовність операторів, розміщених
у фігурних дужках. Блок відрізняється від складового оператора наявністю в його
тілі оператора визначення об^єкту (змінної, константи, масиву тощо). Наприклад: {n++; summa+=n;}//це складовий оператор {int n=0; n++;summa+=n;} //це блок Оператор умовного переходу if використовується для спрямування ходу програми за однією з гілок обчислень
в залежності від певної умови. Загальна форма запису: if (умова) оператор1; else оператор2; Наприклад, для знаходження
коренів квадратного рівняння використовується запис: if (d>=0) {x1=(-b-sqrt(d))/(2*a); x2=(-b+sqrt(d))/(2*a); cout<< “
x1=”< } else cout<<“
Розв¢язку немає”; Якщо оператор1 та/або оператор2
містять два або більше операторів, їх беруть у фігурні дужки {}, тобто вони
є складовими. Оператор if перевіряє істинність чи хибність умови. Якщо умова справджується
(не рівна 0), тоді виконується оператор1, інакше, при хибності умови (==0),
виконується оператор2. Другу частину оператора (else оператор2;)
можна опускати. Така його форма має назву “скороченої”. Тоді у випадку хибності
умови, керування передається до оператора, що йде услід за умовним оператором. Якщо оператор1 і оператор2
в свою чергу є операторами if , вони є вкладеними. Загальний вигляд вкладеного оператора
if: if (умова1) оператор1; else if (умова2) оператор2; else оператор3; В якості умов у мовах С/С++ використовуються
стандартні операції відношення: <, <=, >, >=,
!=, ==. Пари наведених символів не можна відокремлювати чи переставляти. Для об^єднання в умові декількох умов
використовуються логічні операції. Наведемо їх перелік в порядку спадання пріоритету:
! (заперечення або логічне НІ), && (кон^юнкція або логічне
І), || (диз^юнкція або логічне АБО). Між позначками && та
|| не дозволяються пробіли. Наприклад: 0 ((!x)&&(y>0)||((z==1)&&(k>0)) Загальна форма запису оператора вибору: switch(вираз) { case consnant1:
оператори; break; сase consnantN:
оператори;break; default: оператори; }, де consnant1…consnantN - цілі або символьні
константи. При виконанні оператора switch, обраховується вираз, записаний після
switch і його значення послідовно порівнюється з константами, записаними після case.
При першому ж співпаданні виконуються оператори, позначені даною міткою. Якщо виконувані
оператори не містять оператор переходу break, далі виконуватимуться оператори
усіх наступних варіантів. Якщо значення виразу, записаного після switch,
не співпало з жодною константою, виконуватимуться оператори після мітки default,
яка не є обов^язковою. 4.3 ОператорИ циклУ Цикл з параметром for: Основна форма запису: for (вираз_1; вираз_2; вираз_3 ) оператор; де вираз_1 – ініціалізація
початкового значення параметру циклу; вираз_2 – перевірка умови на продовження
циклу; вираз_3 – зміна параметру циклу з кожною
ітерацією (корекція); оператор – тіло циклу, простий або складовий
оператор. Цикл продовжується до тих пір, поки вираз_3
не стане рівним 0. Будь-який вираз можна опускати, залишаючи натомість “ ; ”. Приклади використання циклу з параметром: 1) Зменшення параметра: for ( n=10; n>0; n--) { <тіло циклу>} 2) Зміна кроку коректування: for ( n=2; n>60; n+=13) { <тіло циклу>} 3)Корекція може здійснюватися не лише
за допомогою додавання чи віднімання: for ( d=100.0; d<150.0;d*=1.1) { <тіло циклу>} for (x=1;y<=75;y=5*(x++)+10) { <тіло циклу>} 5) Можна використовувати декілька виразів ініціалізації або модифікації: for (x=1, y=0; x<10;x++,y+=x) { <тіло циклу>}. Цикл з передумовою while: Основна форма запису: while (умова) оператор; де оператор – це простий,
складовий або порожній оператор. Цикл виконується до тих пір, поки
умова приймає значення “true”, тобто вираз у дужках повертає ненульовий результат.
У циклі з передумовою спочатку перевіряється істинність умови, а потім виконується
оператор тіла циклу. Тому цикл while не виконується жодного разу, якщо від
початку умова буде хибною. Цикл з післяумовою do – while: Основна форма запису: do оператор; while (умова); де оператор – це простий,
складовий чи порожній оператор. Тіло циклу виконується до тих пір, поки
умова справджується. Оскільки в циклі do–while умова перевіряється в кінці,
оператор тіла циклу виконуватиметься хоча б один раз. Для запобігання безкінечності
циклу в тілі циклів while та do–while потрібно передбачити зміну параметрів,
які входять до умови. 4.4 ОПЕРАТОРИ ПЕРЕХОДУ Оператори переходу виконують безумовну
передачу управління. 1) goto < мітка> - оператор безумовного переходу.
Керування передається оператору з даною міткою: <мітка>: оператор; В мові С мітка не декларується. 2) break - оператор перериває цикл або перемикач,
управління передається на перший наступний оператор; while (умова) {< оператори> if (<вираз-умова>) break; <оператори>}. Тобто оператор break доцільно використовувати,
коли умову продовження ітерації потрібно перевіряти в тілі циклу. 2) continue – припинення поточної і перехід до наступної
ітерації циклу. Використовується, коли тіло циклу містить розгалуження. 3) return – здійснює повернення
результату з тіла функції. 5. Вказівники та операції
над ними 5.1 ПОНЯТТЯ ВКАЗІВНИКА Кожна змінна у програмі - це об^єкт,
який володіє ім^ям і значенням. Після визначення змінної з ініціалізацією всі звернення
у програмі до неї за іменем замінюються компілятором на адресу іменованої області
оперативної пам^яті, в якій зберігається значення змінної (Рис. 5.1). Програміст
може визначити власні змінні для збереження адрес областей пам^яті. Такі змінні
називають вказівниками. int a=10;
Рис. 5.1. Вказівник визначається наступним
чином: <тип> *< ідентифікатор> <ініціалі затор>; Приклад 1. Визначення вказівників int* pa=&a;// вказівник ра
містить значення адреси змінної а float *ptr (NULL); // Нульовий вказівник на об^єкт типу float char*p; // Неініціалізований вказівник на об^єкт типу char Значення адреси змінної одержується за
допомогою унарної операції ”&”. Для доступу до комірки пам^яті,
виділеної під змінну через вказівник до останнього, слід застосувати унарну операцію
розіменування ”*”. Приклад 2. Непряма
адресація через вказівник int x=2; //змінна типу int int *y =&x;// вказівник на елемент
даних типу int *y=1; // через вказівник до поля x
вноситься значення 1, //тобто x=1 p=new char(12); В останньому операторі прикладу 2 неініціалізований вказівник р,
описаний у прикладі 1, асоціюється з ділянкою у динамічній пам^яті під змінну типу
char, до якої заноситься значення 12. 5.2 ДІЇ НАД ВКАЗІВНИКАМИ Приклад 3: Дії над
вказівниками int a=5; int *p=&a, *p2, *p2; p2=p1=p; ++p1; p2+=2; cout<<“a=”<
cout<<” p=”<<*p<<”
p=”<
Результат виконання: a=5, *p=5, p=FFC8, p1=FFCC, p2=FFD0. Конкретні значення адрес залежать від
низки причин: архітектури комп^ютера, типу і розміру оперативної пам^яті тощо. З арифметичних операцій між вказівниками
дозволена лише операція віднімання. Різницею двох вказівників одного типу
є відстань між двома областями пам^яті, кратна довжині (в байтах) об^єкта того типу,
якому відповідає вказівник. Різниця однотипних вказівників, що адресують суміжні
об^єкти, за абсолютною величиною рівна одиниці. Адреси змінних позначаються цілочисельними
16-ковими константами. Ті змінні, визначення яких розміщені
в програмі поруч, займають суміжні ділянки пам^яті, проте розміщення об^єктів у
пам^яті є оберненим в порівнянні з їх взаємним розташуванням у визначеннях тексту
програми. До вказівника дозволено додавати і віднімати
цілочисельну константу (k). При цьому він пересувається між ділянками пам^яті на
величину k*(sizeof(type)). 6.1 СТАТИЧНІ ТА ДИНАМІЧНІ
МАСИВИ Масив – це кінцева послідовність даних
одного типу. Кожен елемент масиву має однакове ім^я – ім^я масиву, і відрізняється
індексом (ціле число), за яким здійснюється доступ до елемента масиву. Індекси
масивів у С/С++ починаються з 0. У програмі одновимірний масив оголошується
наступним чином: <тип> <ім^я масиву> [розмір]
<ініціалізація>; , де розмір – кількість елементів одновимірного
масиву. Після визначення ім^я масиву стає вказівником-константою, значення якого
є незмінним і становить адресу першого (нульового) елемента масиву. За способом розміщення масиви поділяються
на статичні та динамічні. Розмір статичного масиву можна задавати константою або
константним виразом. Оскільки ділянка у оперативній пам^яті під масив задається
на етапі компіляції і її розмір визначається типом елементів масиву та їх кількістю,
розмірність масиву повинна бути визначена у тексті програми, а не підчас її виконання.
Для визначення масиву змінного розміру використовується механізм динамічного виділення
пам^яті. Наприклад: - оголошення одновимірного масиву з п^яти
елементів цілого типу: int a[5]; - динамічне виділення пам^яті під 10
цілочисельних елементів: int*m=new int [10]; Враховуючи те, що ім¢я масиву є вказівником, зрозумілим стає зміст останньої операції: вказівникові
на int m присвоюється початкова адреса ділянки пам¢яті, виділеної у динамічній
області під 10 цілочисельних елементів. Перевагою динамічних масивів є те, що їх розмірність може бути змінною,
тобто у програмі можна працювати з масивами довільного розміру, не вносячи змін
до тексту програми. Проте, динамічні масиви не можна ініціалізувати при визначенні
і вони за замовчуванням не заповнюються нулями. Натомість ініціалізацію статичних масивів
можна здійснювати при їх визначенні. При цьому слід зауважити, що у С/С++ не перевіряється
вихід індексу за межі масиву. Наприклад: double d[] = {1, 2, 3, 4, 5}; float f[10]={1.1, 2.2, 3.3, 4.4, 5.5,
6.6, 7.7, 8.8, 9.9, 10.0}; При поєднанні визначення масиву з ініціалізацією
його розмірність у квадратних дужках можна не вказувати. Довжину масиву компілятор
визначить за кількістю значень, наведених у фігурних дужках. Для звернення до елементів масивів використовуються
два способи, наприклад до 4-го (по порядку) елемента масиву a можна звернутися
як a[3] або *(a+3). Останнє звернення базується на факті, що ім^я
масиву є одночасно вказівником на його нульовий елемент, а зміщення вказівника у
пам^яті відбувається на величину індексу помножену на розмір типу елементів масиву
у байтах. Пам^ять, зарезервовану під динамічний
масив за допомогою new[ ], потрібно звільняти оператором delete [] <ім¢я массиву>. Отже, якщо кількість елементів масиву
відома до виконання програми, краще використовувати статичний масив, розмірність
якого позначити як значення іменованої константи. Якщо розмірність масиву необхідно
задавати в процесі виконання програми (до введення його елементів), то доцільно
створювати динамічний масив. 6.2 РЯДКИ, ЯК ОДНОВИМІРНІ
МАСИВИ СИМВОЛІВ У мовах С/С++ немає окремого типу
даних “рядок символів”, подібно до типу string у алгоритмічній мові PASCAL. Тому
робота з рядками реалізована шляхом використання одновимірних масивів типу char.
Рядок символів – це одновимірний масив типу char, останнім елементом якого є нульовий
байт. Нульовий байт – це байт, кожен біт якого рівний нулю, при цьому для нульового
байта визначена символьная константа ¢
3. Лінійні програми на С++
Тип даних
Назва
Розмір, біт
Діапазон значень
unsigned char
Беззнаковий цілий
довжиною не менше 8 біт
8
0 . . 255
сhar
Цілий довжиною
не менше 8 біт
8
-128 . . 127
unsigned int
Без знаковий цілий
16
0 . . 65535
short int (short)
Короткий цілий
16
-32768 . . 32767
unsigned short
Беззнаковий короткий
цілий
16
0 . . 65535
int
Цілий
16
-32768 . . 32767
unsigned long
Беззнаковий довгий
цілий
32
0 . . 4294967295
long int (long)
Довгий цілий
32
-214748348 . .
2147483647
float
Дійсний одинарної
точності
32
3.4Е-38 . . 3.4Е+38
double
Дійсний подвійної
точності
64
1.7Е-308 . . 1.7Е+308
long double
Дійсний максимальної
точності
80
3.4Е-4932 . . 1.1Е+4932
Операція
Короткий опис
&
Операція одержання
адреси операнда
*
Звернення за адресою
(розіменування)
-
Унарний мінус –
змінює знак арифметичного операнда
~
Порозрядове інвертування
внутрішнього двійкового коду (побітове заперечення)
!
Логічне заперечення
(НЕ) значення операнда. Цілочисельний результат 0 (якщо операнд ненульовий, тобто
істинний) або 1 (якщо операнд нульовий, тобто хибний). Таким чином: !1 дорівнює
0; !2 дорівнює 0; !(-5)=0; !0 дорівнює 1.
++
- -
sizeof
Арифметичні операції
+
Бінарний плюс (додавання
арифметичних операндів)
-
Бінарний мінус
(віднімання арифметичних операндів)
Мультиплікативні
*
Добуток операндів
арифметичного типу
/
Ділення операндів
арифметичного типу (якщо операнди цілочисельні, абсолютне значення результату
заокруглюється до цілого, тобто 20/3 дорівнює 6)
%
Одержання залишку
від ділення целочисельних операндів (13%4 = 1)
Операції зсуву
(визначені лише для цілочисельних операндів)
<<
Зсув вліво бітового
представлення значення лівого цілочисельного операнда на кількість розрядів, рівну
значенню правого операнда (4<<2 дорівнює 16, т.я. код 4 100, а звільнені
розряду обнуляються, 10000 – код 16)
>>
Зсув вправо бітового
представлення значення правого цілочисельного операнда на кількість розрядів,
рівну значенню правого операнда
Порозрядні операції
&
Порозрядна кон^юнкція
(І) бітових представлень значень цілочисельних операндів
|
Порозрядна диз^юнкція
(АБО) бітових представлень значень цілочисельних операндів
^
Порозрядне виключне
АБО бітових представлень значень цілочисельних операндів
Операції порівняння
<
Менше, ніж
>
Більше, ніж
<=
Менше або рівне
>=
Більше або рівне
= =
Рівне
!=
Не рівне
Логічні бінарні
операції
&&
Кон^юнкція (І)
цілочисельних операндів або відношень, цілочисельний результат (0) або (1)
||
Диз^юнкція (АБО)
цілочисельних операндів або відношень, цілочисельний результат (0) або (1) (умова
0
Тернарна операція
Умовна операція
? :
Ранг
Операції
Напрямок виконання
1
() (виклик функції), [],
->, "."
>>>
2
!, ~, +, - (унарні), ++,
--, *, (тип), sizeof, (new,delete – Сі++)
<<<
3
.* , ->* - Сі++
>>>
4
*, /, % (бінарні)
>>>
5
+, - (бінарні)
>>>
6
<<, >>
>>>
7
<, <=, =>, >
>>>
8
==, !=
>>>
9
& (порозрядна)
>>>
10
^
>>>
11
| (порозрядна)
>>>
12
&& (логічна)
>>>
13
|| (логічна)
>>>
14
?: (тернарна)
<<<
15
=, +=, -=, *=, /=, %=, &=,
^=, |=, <<=,>>=
<<<
16
"," (кома)
>>>
Матичний запис
Функція
Пояснення
Приклад
arccos x
acos
Повертає арккосинус
кута, рівного х радіан
acos(x);
arcsin x
asin
Повертає арксинус
аргументу х в радіанах
asin(x);
arctg x
atan
Повертає арктангенс
аргументу х в радіанах
atan(x);
аrctg(x/у)
atan2
Повертає арктангенс
відношення параметрів х та у в радіанах
atan2(x, y);
-
ceil
Заокруглює дійсне
значення х до найближчого більшого цілого і повертає його як дійсне
ceil(x);
cosx
cos
Повертає косинус
кута, рівного х радіан
cos(x);
cosh
Повертає гіперболічний
косинус аргументу, рівного х радіан
cosh(x);
exp
Повертає результат
піднесення числа е до степені х
exp(x);
|x|
fabs
Повертає модуль
дійсного числа х
fabs(x);
-
floor
Заокруглює дійсне
число до найближчого меншого числа і повертає результат як дійсний
floor(x);
-
fmod
Повертає залишок
ділення х на у. Аналогічна операції %, але працює з дійсними числами
fmod(x, y);
ln x
log
Повертає значення
натурального логарифму х
log(x);
lg x
log10
Повертає значення
десяткового логарифму х
log10(x);
pow
Вираховує значення
числа х у степені у
pow(x, y);
sinx
sin
Повертає синус
кута, рівного х радіан
sin(x);
sinh
Повертає гіперболічний
синус кута, рівного х радіан
sinh(x);
![]()
sqrt
Визначає корінь
квадратний числа х
sqrt(x);
tg x
tan
Повертає тангенс
кута, рівного х радіан
tan(x);
tgh x
tanh
Повертає гіперболічний
тангенс кута, рівного х радіан
tanh(x);
Операція
Пояснення
Приклад
=
Присвоїти значення
виразу-операнду з правої частини операнду лівої частини
Р=10.5-3*х
*=
Присвоїти операнду
лівої частини добуток значень обох операндів
Р*=2 еквівалентно
Р=Р*2
/=
Присвоїти операнду
лівої частини результат від ділення значення лівого операнда на значення правого
%=
Присвоїти лівому
операнду залишок від ділення цілочисельного значення лівого операнда на цілочисельне
значення правого операнда
Р%=3 еквівалентно
Р=Р%3
+=
Присвоїти операнду
лівої частини суму значень обох операндів
А+=В еквівалентно
А=А+В
-=
Присвоїти операнду
лівої частини різницю значень лівого і правого операндів
Х-=3.4-у еквівалентно
Х=Х-(3.4-у)
4.2 ОПЕРАТОРИ РОЗГАЛУЖЕННЯ
Оператор вибору switch подібний
до умовного оператора if, проте у ньому замість виразу-умови використовується
вираз, результатом якого може бути декілька цілочисельних значень, кожне з яких,
вимагає виконання свого оператора. Отже, програму можна спрямувати більше ніж у
двох напрямках.
6. Робота з одновимірними
масивами









