
- •Ф.Б. Рогальський, і.А. Лур'є, н.В. Корніловська
- •Ф.Б. Рогальський, і.А. Лур'є, н.В. Корніловська
- •Передмова
- •Лабораторна робота №1 Інтегроване середовище програмування системи
- •Теоретична частина
- •Компоненти інтегрованого середовища
- •Головне меню
- •Системне меню
- •Clear (Стерти) – видаляє обраний фрагмент тексту, але не заносить його в текстовий буфер.
- •Replace (Замінити) – відображає блок діалогу, що дозволяє вводити шуканий текст і текст, на який його варто замінити.
- •Size/Move (Змінити розмір/Перемістити) – використовується для того, щоб змінити розмір чи місце розташування активного вікна.
- •Створення першої програми
- •Контрольні питання
- •Мова програмування Сі Використовувані символи
- •Константи
- •Приклади цілих констант
- •Ідентифікатор
- •Використання коментарів у тексті програми
- •Типи даних та їх оголошення
- •Категорії типів даних Ключові слова для визначення основних типів даних
- •Стандартні функції
- •Специфікатори формату
- •Команди формату
- •Стандартні заголовні файли
- •Пріоритети операцій і порядок обчислень
- •Контрольні питання
- •Варіанти завдань роботи
- •Лабораторна робота № 3 Оператори управління
- •Теоретична частина
- •Умовний оператор if
- •If (вираз) оператор-1; [else оператор-2;]
- •Оператор switch
- •Оператор break
- •Оператор for
- •Оператор goto
- •Зразок виконання завдання
- •Контрольні питання
- •Оператор switch.
- •Оператор break.
- •Варіанти завдань роботи
- •Лабораторна робота № 4
- •Оператор do while
- •Оператор continue
- •Оператор return
- •Контрольні питання
- •Варіанти завдань роботи
- •Лабораторна робота № 5 Функції і прототипи функцій
- •Теоретична частина
- •Прототипи функцій
- •Метод половинного ділення
- •Зразок виконання завдання
- •Контрольні питання
- •Варіанти завдань роботи
- •Лабораторна робота № 6 Алгоритми обробки одновимірних масивів
- •Теоретична частина
- •Контрольні запитання
- •Варіанти завдань роботи
- •Лабораторна робота №7 Сортування даних
- •Теоретична частина
- •Обмінне сортування
- •Інші методи сортування
- •Контрольні питання
- •Варіанти завдань роботи
- •Лабораторна робота № 8 Алгоритми обробки двовимірних масивів
- •Теоретична частина
- •Перетворення одновимірних масивів у двовимірні та навпаки
- •Контрольні питання
- •Варіанти завдань роботи
- •Лабораторна робота n 9 Прийоми програмування з використанням покажчиків.
- •Теоретична частина
- •Зв’язок між покажчиками та масивами
- •Покажчики на багатовимірні масиви.
- •Операції з покажчиками
- •Приклад:
- •Масиви покажчиків
- •Контрольні питання
- •Методичні вказівки
- •Приклад виконання завдання по обробці рядків
- •Приклад виконання програми
- •Варіанти завдань роботи
- •Лабораторна робота n10 Директиви препроцесора.
- •Теоретична частина Препроцесор мови с
- •Директива #еrrоr
- •Директива #include
- •Директиви умовної компіляції
- •Визначені макроси.
- •Контрольні питання
- •Варіанти завдань роботи.
- •Лабораторна робота 11 Друк кодової таблиці.
- •Теоретична частина.
- •Особливості типу char
- •Файл ctype.H
- •Рекомендації зо вибору імен змінних і функцій
- •Контрольні питання
- •Додатки
- •Методика виконання роботи
- •Варіанти завдань роботи
- •Вид таблиці символів:
- •Лабораторна робота 12 Рядки. Потокове введення/виведення у мові с.
- •Теоретична частина
- •Функції для роботи з рядками
- •Рядки і числові типи даних
- •Робота з файлами
- •Контрольні питання.
- •Додатки
- •Варіанти завдань роботи .
- •Лабораторна робота 13
- •Теоретична частина.
- •Контрольні питання
- •Варіанти завдань роботи.
- •Лабораторна робота 14
- •Теоретична частина
- •Ключі доступу
- •Просте спадкування
- •Віртуальні методи
- •Механізм пізнього зв'язування
- •Абстрактні класи
- •Множинне спадкування
- •Відмінності структур і об'єднань від класів.
- •Контрольні питання.
- •Варіанти завдань роботи.
- •Література
- •Рогальський Франц Борисович
Лабораторна робота 13
Класи у мові С++
Мета роботи:отримати вміння та практичні навички використання класів в програмах на С++
Теоретична частина.
Ймовірно одним з найбільш важливих понять C++ є клас.
Клас — це механізм для створення об'єктів. У цьому сенсі клас лежить в основі багатьох властивостей C++. Синтаксис опису класу схожий на синтаксис опису структури. Тут показана основна форма:
class ім'я_класу {
закриті функції і змінні класу
public:
відкриті функції і змінні класу
} список об'єктів;
В описі класу список_об'єктів не є обов'язковим. Як і у випадку зі структурою, ви можете повідомляти об'єкти класу пізніше, по мірі необхідності. Хоча ім'я_класу також необов'язково, з погляду практики, воно потрібно. Доводом на користь цього є те, що ім'я_класу стає новим ім'ям типу даних, що використовується для оголошення об'єктів класу.
Функції і змінні, оголошені усередині оголошення класу, стають, як говорять, членами (members)цього класу. За замовчуванням, усі функції і змінні, оголошені в класі, стають закритими для цього класу. Це означає, що вони доступні тільки для інших членів цього класу.
Для оголошення відкритих членів класу використовується ключове слово public,за яким слідує двокрапка. Усі функції і змінні, оголошені після слова public,доступні і для інших членів класу, і для будь-якої іншої частини програми, у якій утримується клас.
Нижче приводиться просте оголошення класу:
class myclass {
// закритий елемент класу
int a;
public:
void set a(int num)
int get_a() ;
};
Цей клас має одну закриту змінну а,і дві відкриті функції, set_a() і get_a().Зверніть увагу, що прототипи функцій з'являються усередині класу. Функції, що з'являються усередині опису класу, називаютьсяфункціями-членами (member functions).
Оскільки а є закритою змінною класу, вона недоступна для будь-якої функції поза myclass. Однак оскільки set_a() і get_a() є членами myclass,вони мають доступ до а. Більш того, set_a() і get_a() з'являються відкритими членами myclass і можуть викликатися з будь-якої частини програми, що використовує myclass.
Хоча функції set_a() і get_a() і оголошені в myclass,вони ще не визначені. Для визначення функції-члена, ви повинні зв'язати ім'я класу, частиною якого є функція-член, з ім'ям функції. Це досягається шляхом написання імені функції слідом за ім'ям класу з двома двокрапками. Дві двокрапки називаютьсяоперацією розширення області видимості (scope resolution operator).Наприклад, далі показаний спосіб визначення функцій-членів set_a() і get_a():
void myclass::set a(int num)
{
a=num;
}
int myclass::get_a()
{
return a;
}
Відзначимо, що і set_a() і get_a() мають доступ до а,що для myclass є закритою. Як уже говорилося, оскільки set_a() і get_a() є членами myclass, вони можуть явно оперувати з такими закритими даними.
При завданні функції-члена, користуються наступною загальною формою:
Тип ім'я класу::ім'я функції(список_параметрів)
{
...// тіло функції
}
Оголошення класу myclass не задає жодного об'єкта типу myclass,воно визначає тільки тип об'єкта, що буде створений при його фактичному оголошенні.
Щоб створити об'єкт, використовуйте ім'я класу, як специфікатор типу даних. Наприклад, у цьому рядку з'являються два об'єкти типу myclass:
myclass ob1, ob2; // це об'єкти типу myclass
Запам'ятайте!
Оголошення класу є логічною абстракцією, що задає новий тип об'єкта. Оголошення ж об'єкта створює фізичну сутність об'єкта такого типу. (Тобто об'єкт займає пам'ять, а завдання типу немає.)
Після того як об'єкт класу створений, можна звертатися до відкритих членів класу, використовуючи операцію крапка (.), аналогічно тому, як здійснюється доступ до членів структури. Припустимо, що раніше об'єкти оголошені, тоді наступне вираження викликає set_a() для об'єктів ob1 і ob2:
ob1.set_а (10); // установка версії а оb1 у 10
ob2.set_a (99); // установка версії а ob2 у 99
Як видно з коментарів, ці оператори встановлюють значення перемінної а об'єкта оb1 у 10 і значення перемінної а об'єкта ob2 у 99. Кожен об'єкт містить власну копію всіх даних, оголошених у класі. Це значить, що а в оb1 відмінно від а в ob2.
Запам'ятайте!
Кожен об'єкт класу має власну копію всіх змінних, оголошених усередині класу.
Приклад:
1. У якості першого простого приклада, розглянемо програму, у якій використовується myclass,описаний у тексті, для завдання значення а для оb1 та ob2 і виводяться на екран ці значення для кожного об'єкту:
#include <iostream.h>
class myclass{(
// закрито для myclass
int a;
public:
void set_a(int num);
int get_a() ;
};
void myclass::set_a(int num)
{
a=num;
}
int myclass::get_a()
{
return a;
}
main()
{
myclass ob1, ob2;
ob1.set_a(10);
ob2.set_a(99);
cout « obl.get_a() « "\n'
cout « ob2.get_a() « "\n'
return 0;
}
Як і слідувало очікувати, програма виводить на екран величини 10 і 99.
2. У попередньому прикладі змінна а в myclass є закритою. Це означає, що вона безпосередньо доступна тільки для функцій членів myclass. (Це один з доводів на користь існування відкритої функції get_a().) Якщо ви спробуєте звернутися до закритого члена класу з тієї частини вашої програми, що не є членом цього класу, то результатом буде помилка при компіляції. Наприклад, припустимо, що myclass задано так, як показано в попередньому прикладі, тоді компіляція функції main() викликає помилку:
// Цей фрагмент містить помилку.
#include <iostream.h>
main()
{
myclass ob1, ob2;
ob1.a = 10; // ПОМИЛКА! до закритого члена немає
ob2.а = 99; // доступу для функції - не члена
cout « obl.get_a() « "\n";
cout « ob2.get_a() « "\n";
return 0;
}
3. Точно так само, як відкриті функції-члени, можуть існувати і відкриті змінні-члени. Наприклад, якби а була оголошена у відкритій секції myclass,тоді до неї, як показано нижче, можна було б звернутися з будь-якої частини програми:
#include <iostream.h>
class myclass {
public:
// тепер а відкрита
int a;
// і тепер не потрібні set a() і get a();
}
main()
{
myclass ob1, ob2;
// тут є явний доступ до а
оb1.а = 10;
ob2.а = 99;
cout « ob1.а « "\n";
cout « ob2.а « "\n";
return 0;
}
У цьому прикладі, оскільки а оголошена відкритим членом myclass,до неї є явний доступ з main() Зверніть увагу, як операція крапка (.) використовується для доступу до а. Звичайно, незалежно від того, чи викликаєте ви функцію-член, або здійснюєте доступ до перемінної-члена, за ім'ям об'єкта повинна випливати операція крапка (.), а за нею ім'я члена. Це необхідно для вичерпного визначення того, із членом якого об'єкта ви маєте справу.
4. Щоб оцінити можливості об'єктів, розглянемо більш практичний приклад. У цій програмі створюється клас stack, що реалізує стек, який можна використовувати для збереження символів:
#include <iostream.h>
#define SIZE 10
// Оголошення класу stack для символів
class stack {
char stck[SIZE]; // містить стек
int tos; // індекс вершини стека
public:
void init(); // ініціалізація стека
void push(char ch); // поміщає в стек символ
char pop(); // виштовхує зі стека символ
};
// Ініціалізація стека
void stack::init()
{
tos=0;
}
// Приміщення символу в стек
void stack::push(char ch)
{
if (tos==S!ZE) {
cout « "Стек повний"
return;
}
stck[tos] = ch;
tos++;
}
// Виштовхування символу зі стека
char stack::pop()
{
if (tos==0) {
cout « "Стек порожній";
return 0; // повернення нуля при порожньому стеці
}
tos--;
return stck[tos];
}
main()
{
stack sl, s2; // створення двох стеків
int і;
// ініціалізація стеків
sl.init() ;
s2.init () ;
sl.push('a');
s2.push('x');
sl.push('b');
s2.push('y');
sl.push('с');
s2.push('z');
for (і=0;і<3;і++) cout « "символ з sl:" « sl.pop() « "\n”;
for (і==0; і<3; і++) cout « "символ з s2 : " « s2.pop() « "\n”;
return 0;
}
Ця програма виводить на екран наступне:
символ з sl: c
символ з sl: b
символ з sl: a
символ з s2: z
символ з s2: y
символ з s2: x
Давайте тепер детально проаналізуємо програму. Клас stack містить дві закриті змінні: stck і tos. Масив stck фактично містить символи, що поміщаються в стек, a tos містить індекс вершини стека. Відкритими функціями стека є init(), push() і рор(), що, відповідно, ініціалізують стек, поміщають символ у стек і виштовхують його зі стека.
Усередині main() створюються дві стеки, sl і s2, і по три символи містяться в кожному з них.
Важливо розуміти, що один об'єкт (стек) не залежить від іншого. Тому символи, що поміщаються в sl,не мають способувпливати на символи, що поміщаються в s2. Кожен об'єкт містить свою власну копію stck та tos. Це фундаментальна, для розуміння об'єктів, концепція. Хоча всі об'єкти класу мають загальні функції-члени, кожен об'єкт створює і підтримуєсвої власні дані.