- •1. Лабораторна робота 1. "Структури: складені типи даних"
- •Теоретичні відомості
- •1.1.1. Структури
- •1.1.2. Робота з масивом структур
- •1.2. Постановка задачі
- •1.3. Варіанти
- •1.4. Методичні вказівки
- •Постановка задачі.
- •2. Лабораторна робота 2 "Динамічні структури даних"
- •2.1. Теоретичні відомості
- •2.1.1. Списки
- •2.1.2. Стеки
- •2.1.3. Черги
- •2.2. Постановка задачі
- •2.3. Варіанти завдань
- •3.1.2. Члени класу
- •3.1.3. Доступ до членів класу
- •3.1.4. Черги-масиви
- •3.1.5. Стеки-масиви
- •3.2. Постановка задачі
- •3.3. Варіанти завдань
- •3.4. Методичні вказівки
- •4. Лабораторна робота 4. "Перезавантаження конструкторів"
- •4.1. Теоретичні відомості
- •4.1.1. Перезавантаження конструкторів
- •4.1.3. Операції з матрицями
- •4.2. Постановка задачі
- •4.3. Варіанти завдань
- •4.4. Методичні вказівки
- •5. Лабораторна робота 5. "Перезавантаження операторів. Дружні функції"
- •5.1. Теоретичні відомості
- •5.1.1. Дружні функції
- •5.1.1. Перезавантаження операторів
- •5.1.2. Операторні функції для комплексних чисел
- •5.2. Постановка задачі
- •5.3. Варіанти завдань
- •5.4. Методичні вказівки
- •6. Лабораторна робота 6. "Спадкування. Віртуальні функції"
- •6.1 Теоретичні відомості
- •6.1.1. Спадкування й модифікатори спадкування
- •6.1.2. Віртуальні функції
- •6.1.3. Відділення інтерфейсу від реалізації
- •6.2. Постановка задачі
- •6.3. Варіанти завдань
- •6.4. Методичні вказівки
- •7. Лабораторна робота 7. "Шаблони"
- •7.1. Теоретичні відомості
- •7.1.1. Шаблони функцій
- •7.1.2. Шаблони класів
- •7.1.3. Приклад. Методи шаблона вектора
- •7.1.4. Приклад. Шаблон класу зв'язного списку
- •7.2. Постановка задачі
- •7.3. Варіанти завдань
- •7.4. Методичні вказівки
- •8. Лабораторна робота 8. "Файловий введення-виведення"
- •8.1. Теоретичні відомості
- •8.1.2. Потоки й файли
- •8.1.3. Текстові файли. Форматоване введення-виведення
- •8.1.4. Неформатоване двійкове введення-виведення
- •8.1.5. Файли довільного доступу
- •8.2. Постановка задачі
- •8.3. Варіанти завдань
- •8.4. Методичні вказівки
- •Література
1.4. Методичні вказівки
Дані, що вводить користувач, розміщуються в масиві структур - записах. Інтерфейс програми повинен бути побудований у вигляді меню з опціями: введення, відображення, пошук, зміна записів і іншими. Введення даних передбачає додавання даних у перший вільний запис.
1.5. Зміст звіту
Постановка задачі.
Код програми.
Скріншот з результатами роботи програми.
Пояснення результатів і висновки.
2. Лабораторна робота 2 "Динамічні структури даних"
Ціль роботи: Вивчення створення структур даних змінної довжини: списків, черг і стеків. Складання програм, що дозволяють оперувати з динамічними структурами.
2.1. Теоретичні відомості
2.1.1. Списки
Слідом за масивами найпоширенішими структурами даних у програмуванні є списки, які являють собою логічно зв'язані елементи. Доступ до кожного елемента не обмежений. Будь-який елемент списку може бути вилучений, і його значення можуть бути обчислені або змінені. Крім цього, у будь-яке місце списку може бути вставлений новий елемент.
Динамічна реалізація списку називається зв'язним списком. Кожний елемент списку називається вузлом і містить дві величини: дані й покажчик на наступний вузол списку (покажчик останнього вузла має значення NULL).
Розглянемо приклад зв'язного списку, побудованого на основі наступної структури:
struct node {
char name[20];
long tel;
node *nxt;// Покажчик на наступний елемент
};
Список таких структур може являти собою телефонний довідник, що складається з полів name (ім'я абонента) і tel (номер телефону). Вузли списку послідовно зв'язані між собою покажчиком nxt.
Наведемо основні функції для маніпуляцій зі списками. У цих функціях будуть використані глобальні змінні:
node *pstart = NULL; //Покажчик початку списку
node *curr; //Поточний покажчик для переміщення уздовж списку
char key[20]; //Ключ, по якому виконується пошук вузла
Функція введення значень вузла:
node *input(){
node *temp;
temp = new node; //Тимчасовий вузол
cout << "Enter the name of the person: "; cin >> temp->name;
cout << "Enter the telephon : "; cin >> temp->tel;
return temp;
}
Функція додавання вузла:
void add(){
node *temp=input(); //Введення даних у новий вузол
temp->nxt = NULL; //Оскільки temp - останній вузол
//Зв'язування вузла зі списком
if (pstart == NULL){
pstart = temp;
curr = pstart;
}
else {
node *temp2; //Тимчасовий покажчик
temp2 = pstart; //Встановлення покажчика на початок списку
while (temp2->nxt != NULL) // Поки не кінець списку,
temp2 = temp2->nxt;// перемістити покажчик
temp2->nxt = temp; //Прив'язати до списку новий вузол
}
}
Функція пошуку вузла за ключем:
node *find(char *key){
node *temp=new node; //Тимчасовий покажчик
temp=pstart; //Сполучення покажчика з початком списку
for( ; temp->name!=NULL; temp=temp->nxt) //Пошук елемента
if (strcmp(key, temp->name)== 0) break;
return temp; //Повернення покажчика на знайдений елемент
}
Функція видалення вузла із заданим значенням:
void remove (char *key){
node *previous; //Покажчик на попередній вузол
int f1=0;
if (node *fkey=find(key)){ //Якщо за ключем key знайдений вузол
if (fkey==pstart){ //Якщо вузол на початку списку
pstart=pstart->nxt; //Початком вважати наступний вузол
}
else {
//Установка покажчика на попередній вузол
previous = pstart;
while (previous->nxt != fkey)
previous = previous->nxt;
previous->nxt = fkey->nxt;
//Якщо видаляється вузол, що розташований наприкінці списку
if (fkey->nxt == NULL) previous->nxt=NULL;
}
delete fkey;
}
else cout<<"Element "<<key<<" not found"<<endl;
}
Функція вставки елемента після вузла із заданим значенням:
void insert (char *key){
int f1=0;
if (node *fkey=find(key)){ //Якщо за ключем key знайдений вузол
node *temp=input(); //Введення значень нового вузла
//Якщо вставлено вузол, що попадає в кінець списку
if (fkey->nxt==NULL){
fkey->nxt = temp;
temp->nxt = NULL; }
else {
//Вузол після вставленого вузла:
node *after=fkey->nxt;
//Зв'язування вставленого вузла із сусідами
fkey->nxt = temp;
temp->nxt=after;
}
;}
else cout<<"Element "<<key<<" not found"<<endl;
}
Функція виведення списку на екран:
void display() {
node *temp;
temp = pstart;
cout << endl;
if (temp == NULL) //Якщо список порожній
cout << "The list is empty!" << endl;
else {
while (temp != NULL) {//Поки не досягнуто кінець списку
cout << "Name : " << temp->name << " ";
cout << "tel : " << temp->tel << " ";
cout << endl;
temp = temp->nxt;
}
cout << "End of list!" << endl;
}
}
Функція виведення одного елемента списку:
void display1(node *temp) {
cout << "Name: " << temp->name << " ";
cout << "tel : " << temp->tel <<endl;
}
Роботу зі списком зручно організовувати за допомогою меню, з якого викликається та або інша функція:
void main() {
int opt = 0;
pstart = NULL;
do {
cout << "0. Exit the program" << endl;
cout << "1. Add a node" << endl;
cout << "2. Find element" << endl;
cout << "3. Remove element" << endl;
cout << "4. Insert element" << endl;
cout << "5. Display list" << endl;
cout << endl << ">> ";
cin >> opt;
switch (opt) {
case 1 : add(); break;
case 2 : cout<<"Name? "; cin>>key; curr=find(key);
if (curr) display1(curr);
else cout<<"Element "<<key<<" not found"<<endl; break;
case 3 : cout<<"Name? "; cin>>key; remove (key);break;
case 4 : cout<<"After? "; cin>>key; insert (key); break;
case 5 : display();
}
}
while (opt!= 0);
}