Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Продовжимо розгляд шаблона класу вектора vector (див. попередній розділ) і визначимо методи, що фігурують в оголошенні цього класу. Конструктор класу-шаблона:
template <class T> vector <T>:: vector(int num){
a= new T[num];
vector:: num = num;
}
Функція введення значень елементів вектора:
template <class T> void vector <T>:: in() {
cout<<"Enter elements: ";
for (i=0; i<num; i++)
cin>>a[i];
}
Функція виведення елементів вектора на екран:
template <class T> void vector <T>:: show() {
for(i=0; i<num; i++)
cout<<a[i]<<" ";
cout<<endl;
}
Функція пошуку найменшого елемента; повертає значення цього елемента:
template <class T> T vector <T>:: find (int &min){
for (i=0; i<num; i++)
if (a[i]<a[min]) min=i;
return a[min];
}
Створення об'єкта-вектора (наприклад, цілочисельного масиву) і звертання до методів шаблона може виглядати так:
vector <int> arr (n);
arr.in();
arr.show();
int am = arr.find(min);
7.1.4. Приклад. Шаблон класу зв'язного списку
Параметрами шаблона можуть виступати не тільки стандартні типи даних, але й користувальницькі типи, наприклад, структура. Розглянемо приклад створення шаблона класу для списку (порівняйте з кодом у розд. "2.1.1. Списки"):
template <class T> class List {
T *pstart; //Покажчик початку списку
public:
List() { pstart=NULL; };
void add();
void display();
};
//Функція додавання вузла в список
template <class T> void List<T>:: add(){
T *temp; //Тимчасовий вузол
temp = new T;
cout << "Enter field1: ";
cin >>temp->field1; //Введення значення в поле 1
cout << "Enter field2: ";
cin >>temp->field2; //Введення значення в поле 2
temp->nxt = NULL; //Оскільки temp - останній вузол
//Зв'язування вузла із списком
if (pstart == NULL) pstart = temp;
else {
T *temp2; //Тимчасовий покажчик
temp2 = pstart; //Покажчик на початок списку
while (temp2->nxt!= NULL) //Поки не кінець списку
temp2 = temp2->nxt;//перемістити покажчик
temp2->nxt = temp; //Прив'язати до списку новий вузол
}
}
//Функція відображення списку на екрані
template <class T> void List<T>:: display(){
T *temp;
temp = pstart;
cout << endl;
if (temp == NULL) //Якщо список порожній
cout << "The list is empty!" << endl;
else {
while (temp!= NULL) {//Поки не кінець списку
cout << "field1: " << temp->field1<< " ";
cout << "field2: " << temp->field2<<endl;
temp = temp->nxt;
}
cout << "End of list!" << endl;
}
}
У цьому класі визначені функції додавання вузла в список (add) і відображення списку (display). Параметром шаблона T є тип даних вузла, наприклад, для списку "Блокнот" це може бути наступна структура:
struct node {
char field1[20];
long field2;
node *nxt;
};
Змінна field1 зберігає ім'я, а field2 – номер телефону. Тоді для створення об'єкта-списку потрібно записати:
List <node> mylist;
Якщо дані вузла містять не два (field1 і field2), а інше число полів, функції add і display потрібно видозмінити очевидним чином. Звернення до всіх полів структури як і раніше буде виконуватися через покажчик на вузол.
7.2. Постановка задачі
Створити шаблон функції або шаблон класу відповідно до варіанта завдання. Використати створений шаблон для роботи з об'єктами.
7.3. Варіанти завдань
1. Створити функцію-шаблон для сортування масиву по зростанню методом обміну. Використати шаблон для сортування масиву випадкових чисел і символів у слові, введеному користувачем.
2. Створити функції-шаблони для сортування масиву по зростанню методом вибору і для перестановки елементів. Використати шаблони для сортування масиву випадкових чисел і символів у слові, введеному користувачем.
3. Створити функції-шаблони для сортування масиву по зростанню методом вставок, для перестановки елементів і для виведення даних. Використати шаблони для сортування масиву випадкових чисел і символів у слові, введеному користувачем.
4. Створити шаблон класу вектора. Скласти програму, що для цілих і дійсних чисел виконує ручне введення даних, виводить елементи вектора, обчислює суму елементів і норму вектора.
5. Створити шаблон класу вектора. Скласти програму, що для цілих чисел і символів виконує ручне введення даних, виводить елементи вектора в прямому й зворотному порядку.
6. Створити шаблон класу вектора. Скласти програму, що виконує введення елементів вектора – випадкових чисел і випадкових букв, виводить елементи вектора, сортує елементи по зростанню.
7. Створити шаблон класу вектора. Скласти програму, що виконує введення елементів вектора – випадкових чисел і випадкових букв, виводить елементи вектора, видаляє елементи в зазначених користувачем позиціях, копіює вектор.
8. Створити шаблон класу стека. Скласти програму, що із цілими й дійсними числами виконує наступні операції: поміщає елемент у стек, видаляє елемент із стека, зчитує елемент у вершині, визначає довжину стека.
9. Створити шаблон класу стека. Скласти програму, що із цілими числами й символами виконує наступні операції: поміщає елемент у стек, видаляє елемент із стека, перетворить послідовність елементів у зворотну за допомогою нового стека.
10. Створити шаблон класу стека. Скласти програму, що з цілими й дійсними числами виконує наступні операції: поміщає елемент у стек, видаляє елемент із стека, копіює від’ємні числа в новий стек.
11. Створити шаблон класу стека. Скласти програму, що з цілими й дійсними числами виконує наступні операції: поміщає елемент у стек, видаляє елемент із стека, копіює елементи в новий стек, перетворює їх до цілого типу.
12. Створити шаблон класу стека. Скласти програму, що з цілими й дійсними числами виконує наступні операції: поміщає елемент у стек, видаляє елемент із стека, виводить вміст стека на екран, обчислює суму елементів стека.
13. Створити шаблон класу стека. Скласти програму, що з цілими й дійсними числами виконує наступні операції: поміщає елемент у стек, видаляє елемент із стека, виконує чотири арифметичних операції, виводить результат операції на екран.
14. Створити шаблон класу черги. Скласти програму, що з цілими й дійсними числами виконує наступні операції: поміщає елемент у чергу, видаляє елемент із черги, зчитує перший елемент черги, обчислює довжину черги.
15. Створити шаблон класу черги. Скласти програму, що з цілими числами й символами виконує наступні операції: поміщає елемент у чергу, видаляє елемент із черги, виводить вміст черги на екран.
16. Створити шаблон класу черги. Скласти програму, що з цілими й дійсними числами виконує наступні операції: поміщає елемент у чергу, видаляє елемент із черги, копіює від’ємні числа в нову чергу.
17. Створити шаблон класу черги. Скласти програму, що з цілими й дійсними числами виконує наступні операції: поміщає елемент у чергу, видаляє елемент із черги, виводить вміст черги на екран, обчислює суму елементів черги.
18. Створити шаблон класу черги. Скласти програму, що з цілими й дійсними числами виконує наступні операції: поміщає елемент у чергу, видаляє елемент із черги, копіює елементи в нову чергу, перетворює їх до цілого типу.
19. Створити шаблон класу списку. Використати його при розв'язанні варіанта 1 лабораторної роботи 2 "Динамічні структури даних".
20. Створити шаблон класу списку. Використати його при розв'язанні варіанта 3 лабораторні роботи 2 "Динамічні структури даних".
21. Створити шаблон класу списку. Використати його при розв'язанні варіанта 5 лабораторної роботи 2 "Динамічні структури даних".
22. Створити шаблон класу списку. Використати його при розв'язанні варіанта 7 лабораторної роботи 2 "Динамічні структури даних".
23. Створити шаблон класу списку. Використати його для формування списку "Блокнот" (прізвище, ім'я, телефон, день народження) і списку "Студент" (прізвище, ім'я, група, середній бал). Реалізувати операції додавання елемента в початок списку, видалення елемента, виведення списку на екран.
24. Створити шаблон класу списку. Використати його для формування списку "Предметний покажчик" (назва теми, номер сторінки) і списку "Поїзд" (пункт призначення, номер поїзда). Реалізувати додавання елемента в початок списку, пошук за значенням першого поля й виведення значень другого поля.
7.4. Методичні вказівки
Інтерфейс програми має бути побудований у вигляді меню, що дозволяє вибрати потрібну операцію над даними.
7.5. Зміст звіту
1. Постановка завдання.
2. Код програми.
3. Скриншот з результатами роботи програми.
4. Пояснення принципів використання шаблонів функцій і класів.
8. Лабораторна робота 8.
"Файловий введення-виведення"
Ціль роботи: Вивчення системи введення-виведення С++: класів-шаблонів потоку, прапорців формату, маніпуляторів введення-виведення. Освоєння посимвольних і блокових операцій з файлами, а також прийомів послідовного й довільного доступу.
8.1. Теоретичні відомості
8.1.1. Система введення-виведення С++
У мові програмування С++ операції введення/виведення виконуються за допомогою класів istream (потокове введення) і ostream (потокове виведення). Третій клас, iostream, є похідним від них. Для використання бібліотеки iostream необхідно підключити заголовний файл <iostream>.
Система введення-виведення С++ дозволяє форматувати дані аналогічно тому, як це робить у С функція printf. Форматуванням управляють прапорці формату, які являють собою бітові маски. Прапорці формату підтримуються в базовому класі ios бібліотеки iostream. Кожний прапорець встановлюється функцією setf(), а скидається функцією unsetf() класу ios.
Прапорці left, right дозволяють вирівнювати виведену інформацію по лівій і правій границях поля за допомогою символів, що друкуються відповідно в правій і лівій порожніх позиціях. Використовуваний символ заповнення задається за допомогою функції fill() класу ios або маніпулятора потоку setfill()(всі маніпулятори підключаються заголовним файлом <iomanip>). Прапорець showpos приводить до обов'язкового друку знака +. Прапорець fixed установлюється для виведення чисел із плаваючою крапкою у звичайній нотації. Прапорець scientific установлюється для виведення чисел із плаваючою крапкою в експонентній формі. Для установки ширини поля виведення може бути використана функція width() класу ios або маніпулятор потоку setw(). Кількість значущих цифр задається функцією precision() або маніпулятором setprecision().
Розглянемо застосування прапорців і маніпуляторів у програмі:
#include <iostream.h>
#include <iomanip.h>
int main(){
double x=12.345;
cout.setf(ios::right);
cout<<setw(10)<<x<<endl;
cout.setf(ios::left);
cout.fill('#');
cout<<setw(10)<<x<<endl;
cout.unsetf(ios::left);
cout.unsetf(ios::right);
cout.fill('*');
cout<<setw(10)<<setprecision(4)<<x<<endl;
cout.setf(ios::left | ios::showpos);
cout<<setw(10)<<setfill('$')<<x<<endl;
return 0; }
Результат роботи програми буде наступним:
12.345
12.345####
*****12.35
+12.35$$$$
Установка ширини поля застосовується тільки до наступної операції "помістити" або "взяти" з потоку; потім ширина поля встановлюється такою, яка необхідна для подання вихідних значень.
Дата публикования: 2015-04-07; Прочитано: 389 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!