- •Міністерство освіти і науки україни
- •Розділ 1. Арифметичні основи обчислювальних машин
- •1.1. Позиційні системи числення. Переведення числа з однієї системи числення в іншу
- •1.2. Форма представлення чисел. Кодування чисел
- •1.3. Арифметичні операції над двійковими числами. Машинні одиниці інформації
- •Контрольні питання
- •Завдання
- •Розділ 2. Основи алгоритмізації обчислювальних процесів
- •2.1. Поняття і властивості алгоритму
- •2.2. Засоби представлення алгоритмів
- •2.3. Типи алгоритмічних процесів. Приклади
- •Контрольні питання
- •Завдання
- •3.1. Загальна характеристика програми
- •3.3. Кроки для створення та виконання програми
- •3.4. Змінні та константи
- •3.5. Директиви препроцесора
- •Контрольні питання
- •Розділ 4. Введення-виведення даних
- •4.1. Об’єкт виведення даних cout
- •4.2. Функція виведення даних printf
- •4.3. Об’єкт введення даних cin
- •4.4. Функція введення даних scanf
- •Контрольні питання
- •5.2. Операції відношення
- •5.3. Логічні операції
- •5.4. Додаткові операції
- •5.5. Порозрядні операції
- •Контрольні питання
- •Завдання Лінійний обчислювальний процес
- •1. Визначити значення функції y
- •2. Геометричні завдання
- •Розгалужений обчислювальний процес
- •1. Визначити значення функції y
- •3. Перевірити, чи міститься точка з заданими координатами усередині заштрихованої області.
- •Розділ 6. Організація циклів
- •6.1. Організація арифметичних циклів з використанням оператору for
- •6.2. Організація ітераційних циклів з передумовою while та післяумовою do...While
- •6.3. Оператори switch та goto
- •Контрольні питання
- •Завдання Арифметичний цикл
- •Вкладені цикли
- •Ітераційний цикл
- •Суміщення розгалуженого та циклічного процесів
- •Розділ 7. Зовнішні пристрої та символьне введення/виведення. Рядкові, числові функції та функції роботи з датою та часом
- •7.1. Загальна концепція та функції символьного введення-виведення
- •7.2. Символьні функції
- •7.3. Рядкові функції
- •7.4. Числові функції
- •7.5. Функції роботи з датою та часом
- •Контрольні питання
- •Завдання
- •Розділ 8. Вказівки, посилання та масиви
- •8.1. Вказівки
- •8.2. Посилання
- •8.3. Одновимірні масиви
- •8.4. Багатовимірні масиви
- •8.5. Символьні масиви
- •Контрольні питання
- •Завдання Одновимірні масиви
- •Двовимірні масиви
- •Розділ 9. Робота з функціями
- •9.1. Засоби створення функцій
- •9.2. Видимість змінних
- •9.3. Параметри функції та передача значень
- •9.4. Передача масивів в якості параметрів функцій
- •9.5. Функції та вказівки
- •9.6. Перевантаження та шаблони функцій
- •Контрольні питання
- •Завдання
- •Розділ 10. Рекурсивне програмування
- •10.1. Основні поняття рекурсії. Визначення факторіалу числа
- •10.2. Приклади рекурсій
- •Контрольні питання
- •Розділ 11. Робота з файлами
- •11.1. Робота з текстовими та бінарними файлами
- •Можливі режими доступу
- •11.2. Довільний доступ у файлах
- •11.3. Файли потокового введення/виведення з використанням структури file.
- •Контрольні питання
- •Завдання
- •Розділ 12. Структури
- •12.1. Загальна характеристика структури
- •12.2. Масиви структур
- •12.3. Використання масивів, як елементів структур
- •3. Робота зі структурами є універсальною, передбачено додавання записів до файлу (флаг ios:app). Для підрахунку кількості структур на диску приведемо наступні рядки програми:
- •Контрольні питання
- •Завдання
- •Розділ 13. Об’єднання та інші типи даних. Обробка виключних ситуацій
- •13.1. Об’єднання
- •13.2. Перелічені типи даних (enum)
- •13.3. Бітові поля
- •13.4. Обробка виключних ситуацій
- •Контрольні питання
- •Розділ 14. Динамічні структури даних
- •14.1. Стек
- •14.2. Черга
- •14.3. Лінійний список
- •Контрольні питання
- •Завдання
- •Розділ 15. Типові методи сортування масивів
- •15.1. Бульбашкове сортування (bubble sort)
- •15.2. Сортування за допомогою вибору (choice sort)
- •15.3. Сортування вставками (insert sort)
- •15.4. Сортування Шелла
- •15.5. Швидке сортування (quick sort)
- •Контрольні питання
- •Завдання
- •Розділ 16. Чисельне диференціювання та інтегрування
- •16.1. Методи правих та центральних різниць чисельного диференціювання
- •16.2. Методи прямокутників, трапецій, Сімпсона (парабол) чисельного інтегрування
- •Контрольні питання
- •Завдання Чисельне диференціювання
- •Чисельне інтегрування
- •Розділ 17. Чисельні методи розв’язання алгебраїчних рівнянь
- •17.1. Метод половинного ділення (дихотомія)
- •17.2. Метод Ньютона (метод дотичних)
- •17.3. Метод Рибакова
- •Контрольні питання
- •Завдання
- •Розділ 18. Чисельні методи розв’язання системи лінійних алгебраїчних рівнянь
- •18.1. Визначник. Дії над матрицями. Обчислення оберненої матриці
- •18.2. Метод оберненої матриці.
- •18.3. Метод Крамера
- •18.4. Метод Гауса
- •Контрольні питання
- •Завдання
- •1. Розв’язати систему алгебраїчних рівнянь.
- •2. Обчислити добуток матриць.
- •3. Розв’язати матричні рівняння.
- •Список літератури
8.5. Символьні масиви
Рядкових змінних у C++ немає, для цього використовуються масиви символів (символьні масиви) Символом кінця рядку є символ ASCII-нуля, '\0'.
Припустимо необхідно зберегти ім’я людини, вік, зарплату. Числові змінні віку та зарплати оголошуються наступним чином:
int age;
float salary;
Рядкова змінна не має місця, але можна створити масив символів:
char name[15];
У пам’яті резервується місце під масив, який складається з 15 символів.
Під час оголошення масиву символів йому можна привласнити значення рядку.
char name[6] = "Маша";
У пам’яті ЕОМ:
|
[0] |
М |
|
[1] |
А |
|
[2] |
Ш |
|
[3] |
А |
|
[4] |
\0 |
Можна одержати доступ до визначеного елемента масиву:
name[0] = 'П';
У пам’яті ЕОМ:
|
[0] |
П |
|
[1] |
А |
|
[2] |
Ш |
|
[3] |
А |
|
[4] |
\0 |
При виведенні результату можна зазначити тільки ім’я рядку:
cout<<name; //Результат: Паша
Можна оголосити масив символів наступним чином:
char cc[] = {'a', 'b', 'c'};
Цей масив не може бути рядком, просто він містить три різних символи.
char bb = cc[1]; // Змінній bb привласнено
// значення 'b'
cout<<сс;
ПОМИЛКА! Наприкінці ланцюжка символів немає ASCII-нуля, виведення відбуватиметься доти, поки не зустрінеться '\0'.
Програма помилкова.
void main()
{
char name[20];
name = "Петя"; //Не можна імені масиву
//привласнити значення, що
//можливо тільки при
//оголошенні.
}
Для ініціалізації масиву існує 5 основних засобів. 3 з них ініціалізуються під час оголошення.
#include <iostream>
using namespace std;
void main()
{
// 1-й засіб
char f1[] = "Привіт";
// 2-й засіб
char f2[7] = "Привіт";
// 3-й засіб
char f3[] = {'П','р','и','в','і','т','\0'};
// 4-й засіб
char f4[7];
//використання бібліотечної функції
strcpy(f4, "Привіт");
// 5-й засіб
char f5[7];
f5[0]= 'П';
f5[1]= 'р';
f5[2]= 'и';
f5[3]= 'в';
f5[4]= 'і';
f5[5]= 'т';
f5[6]= '\0';
}
При виведенні рядків із символьних масивів робота з їхніми елементами шляхом зміни адрес більш корисна, ніж процедура з масивами цілих чисел.
Приклад:
char nam[]={'T','e','d','\0','E','v','a','\0',
'S','a','m','\0'};
|
Номер елемента |
Значення |
|
[0] |
T |
|
[1] |
Е |
|
[2] |
D |
|
[3] |
\0 |
|
[4] |
E |
|
[5] |
V |
|
[6] |
A |
|
[7] |
\0 |
|
[8] |
S |
|
[9] |
A |
|
[10] |
M |
|
[11] |
\0 |
cout <<nam; //Надрукує Ted
cout <<nam+4; //Надрукує Eva
cout <<nam+8; //Надрукує Sam
Використання вказівок на символи.
Розглянемо 2 рядки:
char cara[]="Привіт";
char *cp = "Москва";
Після початкової ініціалізації у вказівці на символьну змінну міститься адреса першого символу рядка.
cara = "Привіт"; //Невірно
cp = "Київ"; //Можна: занесення у вказівку
//нового рядка.
Приклад:
#include <iostream>
using namespace std;
void main()
{
char name[20] = "Іван Петров";
char *t = name;
strcpy(t+5,"Сидоров");
cout <<t; //Іван Сидоров
}
Запам’ятовування масивів рядків.
char names[5][20]=
{
{"Наташа"},
{"Георгій"},
{"Ан"},
{"Оля"},
{"Льоша"}
};
Таблиця займає в пам’яті багато місця. Нераціонально використовується пам’ять.
Для усунення проблем раціонального використання масиву символьних вказівок, кожна вказівка містить адресу рядка в пам’яті, і ці рядки можуть мати різну довжину.
|
1-й варіант |
2-й варіант |
|
char *names[5]= { {"Наташа"}, {"Георгій"}, {"Ан"}, {"Оля"}, {"Льоша"} }; |
char *names[]= { "Наташа", "Георгій", "Ан", "Оля", "Льоша" }; |
Рядки можуть знаходитися в будь-якому масиві пам’яті
|
|
Наташа\0 |
|
|
Георгій\0 |
|
|
Ан\0 |
|
|
Оля\0 |
|
|
Льоша\0 |
cout << *names; //Друкує Наташа
cout << *(names+1); //Георгій
Робота з вказівками на рядки набагато ефективніше, ніж з самими рядками. Наприклад, сортування рядків за допомогою масиву вказівок виконується швидше. Під час сортування змінюються тільки вказівки, а не вміст рядків.
Приклад:
При запровадженні чисел від 1 до 7 на екран виводиться день тижня
#include <iostream>
using namespace std;
void main()
{
char *dn[]=
{
"Понеділок",
"Вівторок",
"Середа",
"Четвер",
"П’ятниця",
"Субота",
"Неділя"
};
int day_num;
do
{
cout <<"Введіть день тижня(1-7) ";
cin >> day_num;
}
while ((day_num < 1)||(day_num > 7));
cout << *(day_num - 1 + dn) << "\n";
}

[0]
[1]
[2]
[3]
[4]