Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

125 Кібербезпека / Магістр (вступні питання)

.pdf
Скачиваний:
107
Добавлен:
23.10.2019
Размер:
3.84 Mб
Скачать

виводяться всі різні літери речення (не враховуючи роздільників) в алфавітному порядку:

package ua.in.iwanoff.labs.third;

import java.util.*;

public class Sentence {

public static void main(String[] args) { Scanner scanner = new Scanner(System.in);

//Функція nextLine() читає рядок до кінця:

String sentence = scanner.nextLine();

//Створюємо множину роздільників: Set<Character> delimiters = new HashSet<Character>(

Arrays.asList(' ', '.', ',', ':', ';', '?', '!', '-', '(', ')', '\"'));

//Створюємо множину літер:

Set<Character> letters = new TreeSet<Character>(); // Додаємо всі літери крім роздільників:

for (int i = 0; i < sentence.length(); i++) {

if (!delimiters.contains(sentence.charAt(i))) { letters.add(sentence.charAt(i));

}

}

System.out.println(letters);

}

}

 

Порядок сортування

елементів TreeSet можна задати, реалізувавши

інтерфейс Comparable,

або передавши в конструктор TreeMap посилання

на об'єкт класу, який реалізує інтерфейс Comparator. Наприклад, так можна відсортувати дерево у зворотному порядку:

package ua.in.iwanoff.labs.third;

import java.util.*;

public class CompTest {

public static void main(String args[]) {

TreeSet<String> ts = new TreeSet<String>(new Comparator<String>()

{

@Override

public int compare(String s1, String s2) { return s2.compareTo(s1);

}

});

ts.add("C");

ts.add("E");

ts.add("D");

ts.add("B");

ts.add("A");

ts.add("F");

for (String element : ts) System.out.print(element + " ");

}

}

}

69. Асоціативні масиви в мовах програмування. Приклади використання

Асоціативний масив дозволяє зберігати дані у вигляді набору пар "ключ — значення", доступ до значень здіснюється по їх ключу. У парі (k, v) значення v називається значенням, що асоціюється з ключем k. Асоціативний масив не може містити дві пари з однаковими ключами.

Реалізації асоціативних масивів підтримують операції додавання пари, а також пошуку та видалення пари за ключем.

Основні операції:

вставити (ключ, значення)

шукати (ключ)

вилучити (ключ)

Операція шукати(ключ) повертає значення, що асоціюється із заданим ключем, або якийсь спеціальний об'єкт, що вказує на відсутність такого асоційованого значення. Дві інші операції нічого не повертають. Зазвичай, у різних реалізаціях асоціативного масиву семантика і назви операцій можуть відрізнятися.

Простим прикладом асоціативного масиву є телефонний довідник. Ключем у цьому випадку є сукупність ПІБ + адреса, а значенням — номер телефону. Іншим прикладом може бути база даних доменних імен в Інтернеті, яка доменному імені зіставляє IP-адресу. Тут доменне ім'я буде ключем, а IP-адреса

— значенням.

Приклад простого консольного застосунока, що надає інтерфейс телефонної книжки. Він реалізований на основі контейнера map.

#include <iostream>

#include <string> #include <map> using namespace std; int main(){

string cmd, name, phone; map <string, string> book; while ( cin >> cmd ) {

if(cmd == "add") {

cin >> name >> phone; book[name] = phone; cout << "Added" << endl;

}else if (cmd == "find") { cin >> name;

cout << name << "'s phone is " << phone[name] << endl;

}else if(cmd == "del") {

cin >> name; book.erase(name);

cout << "Deleted" << endl;

}else if(cmd == "view") { map<string,string>::iterator i;

for(i = book.first(); i != book.end() ; i++) {

cout << *i.first() << "\t " << *i.second << endl;

}

}else if(cmd == "quit") {

return 0; } else {

cerr << "Bad command '" << cmd << "'" << endl;

}

}

return 0;

}

70. Робота з вводом/виводом даних в мовах програмування

Введення — це сигнал або дані, отримані системою, а вивід — сигнал або дані, надіслані нею (або з неї). Розлянемо ці операції на прикладі мови C++, де дії, що пов‘язані з операціями введення і виведення, виконуються за допомогою функцій бібліотек. Функції ведення і виведення бібліотек мови дозволяють читати дані з файлів та пристроїв і писати дані у файли і на пристрої.

При введенні-виведенні потоку всі дані розглядаються як потік окремих байтів. Для користувача потік — це файл на диску або фізичний пристрій, наприклад, дисплей чи клавіатура, або пристрій для друку, з якого чи на який

направляється потік даних. Операції введення-виведення для потоку дозволяють обробляти дані різних розмірів і форматів від одиночного символу до великих структур даних.

У мові C++ існує декілька бібліотек, які містять засоби введення-виведення, наприклад: stdio.h, iostream.h. Найчастіше застосовують потокове введеннявиведення даних, операції якого включені до складу класів istream або iostream. Доступ до бібліотеки цих класів здійснюється за допомогою використання у програмі директиви компілятора #include <iostream.h>. Для потокового введення даних вказується операція «>>» («читати з»). Це перевантажена операція, визначена для всіх простих типів і покажчика на char. Стандартним потоком введення є cin.

Формат запису операції введення має вигляд: сin [>> values];, де values — змінна. Так, для введення значень змінних х і у можна записати: сin >> х >> у;. Кожна операція «>>» передбачає введення одного значення.

Для потокового виведення даних необхідна операція «<<» («записати в»), що використовується разом з ім‘ям вихідного потоку cout. Наприклад, вираз cout << х; означає виведення значення змінної х (або запис у потік). Ця операція вибирає необхідну функцію перетворення даних у потік байтів. Формат запису операції виведення представляється як: cout << data [<< data1];, де data, data1 — це змінні, константи, вирази тощо.

При виведенні даних з використанням «cout <<» не виконується автоматичний перехід на наступний рядок, для реалізації такого переходу застосовується переведення рядка "\n" або операція endl.

71. Робота з файлами в мовах програмування.

Під файлом розуміється деяка послідовність байтів, яка має унікальне ім'я. Для роботи з файлами в мові програмування C++ необхідно підключити заголовний файл <fstream>. В <fstream> визначені кілька класів і підключені заголовні файли <ifstream> – файловий ввід і <ofstream> – файловий вивід.

Файловий ввід / вивід аналогічний стандартному вводу / виводу, єдина відмінність - це те, що введення / виведення виконаються не на екран, а в файл. Якщо введення / виведення на стандартні пристрої виконується за допомогою об'єктів cin і cout, то для організації файлового введення / виводу досить створити власні об'єкти, які можна використовувати аналогічно операторам cinі cout.

Наприклад, необхідно створити текстовий файл і записати в нього рядок «Робота с файлами.txt» в С++. Для цього необхідно виконати наступні кроки:

1.створити об'єкт класу ofstream;

2.зв'язати об'єкт класу з файлом, в який проводитиметься запис;

3.записати рядок у файл;

4.закрити файл.

Режими відкриття файлів встановлюють характер використання файлів. Для установки режиму в класі ios_base передбачені константи, які визначають режим відкриття файлів (ios_base::in - відкрити файл для читання, ios_base::out - відкрити файл для запису, ios_base::ate - при відкритті перемістити покажчик в кінець файлу, ios_base::app - відкрити файл для запису в кінець файлу, ios_base::trunc - видалити вміст файлу, якщо він існує. ios_base::binary - відкриття файлу в двійковому режимі).

72.Ітератор.Поняття та використання інтеграторів при роботі з

колекціями

Ітератор — це об'єкт, що перебирає всі елементи (переходить від одного

елемента до іншого). Він може обійти всі елементи контейнера STL чи їхню

підмножину. Ітератор представляє визначену позицію в контейнері. Для

ітератора визначені наступні фундаментальні операції. Операція * повертає

елемент, що стоїть в поточній позиції. Якщо цей елемент має члени, то за

допомогою операції -> можна одержати доступ до них безпосередньо з

ітератора. Операція ++ переміщає ітератор уперед на наступний елемент.

Більшість ітераторів також дозволяють повернення до попереднього елементу

за допомогою операції --. Операції == і != повертають результат перевірки, чи

представляють два ітератори ту саму позицію. Операція = привласнює ітератор

(позицію елемента, на яку він посилається).

Ітератор – це якийсь узагальнений покажчик. Звичайні покажчики мови

програмування С + + є окремим випадком ітераторів, що дозволяють

працювати з різними структурами даних і типами універсальним способом.

Будь-який алгоритм (Універсальна обчислювальна процедура), приймаючи в

якості параметрів ітератори, при їх обробці не замислюється про тип даних, на

які передані ітератори посилаються.

бувають п'яти видів:

вхідні (input);

вихідні (output);

односпрямовані (forward);

двонаправлені (bidirectional);

довільного доступу (random access).

Вхідні ітератори служать для читання адресованих даних.

Вихідні, навпаки, адресують об'єкти, в які дані повинні бути записані.

Однонаправлені ітератори володіють всіма властивостями вхідних і вихідних, а також можуть переміщатися від початку послідовності адресованих даних в кінець.

Що стосується двонаправлених ітераторів, то вони не тільки володіють властивостями односпрямований, але й здатні переміщатися в будь-якому напрямку по ланцюжку даних: як вперед, так і назад. довільного доступу самі універсальні. Вони володіють функціональністю всіх чотирьох інших ітераторів.

До речі кажучи, покажчики мови Сі + + також є ітераторами

довільного доступу.

Бібліотека STL побудована так, що ітератор більш старшого типу може бути підставлений замість молодшого. Так, ітератор довільного доступу може замінити двонаправлений, двонаправлений може бути підставлений замість односпрямованого і т. д.

Застосовуючи ітератори, важливо враховувати такий елемент, як індикатор кінця діапазону (end-of-range), тобто елемент, що йде безпосередньо за кінцем ланцюжка адресованих ітератором даних. Дуже схоже на схему адресації рядків у мовою Сі + +, коли ознакою кінця рядка є символ "". Але при роботі з ітераторами індикатором кінця діапазону може бути будь-яке число.

Системна інтеграція в інженерії — поєднання компонентів підсистем в єдину систему та забезпечення роботи окремих підсистем як єдиної системи. В

області інформаційних технологій системна інтеграція є процесом об'єднання різних обчислювальних систем і програмних застосунків фізично або функціонально. Системна інтеграція полягає у розробці комплексних рішень,

призначених для досягнення максимальної ефективності функціонування системи шляхом налагодження ефективної взаємодії її підсистем.

Системний інтегратор об'єднує окремі системи, використовуючи різні методи, такі як зв'язування комп'ютерів у мережі, інтеграція корпоративних застосунків, управління бізнес-процесами або ручне програмування.

Сучасні WEB-сайти є результатом узгодженої роботи множини компонентів, інтеграція яких дозволяє створювати гнучкі та легко налагоджувані WEB-ресурси. В загальному випадку робота сайту може складатися з таких компонентів:

Сторінки сайту. В найпростішому випадку (статичні) сторінки можуть бути описані за допомогою мови html. Але для динамічного формування виду сторінки використовують одну із спеціальних скриптових мов програмування,

наприклад, PHP чи ASP.NET.

Веб-сервер приймає запити від клієнтів та надає їм відповіді у виді html-

сторінки, потокових або інших даних. Найпоширенішими веб-серверами є

Apache та IIS

Програмний засіб для динамічного генерування сторінок. Ним може бути гіпертекстовий препроцесор PHP (для опрацювання сторінок, описаних за допомогою PHP) або платформа ASP.NET (для опрацювання сторінок,

описаних засобами ASP.NET)

База даних містить дані для сайту у виді послідовності структурованих записів.

Система керування базами даних, яка забезпечує можливість створення,

збереження, оновлення, пошук інформації та контролю доступу в базах даних.

В загальному випадку процес відображення сторінки для користувача виглядає так. Користувач за допомогою веб-огдядача робить запит до певної сторінки сайту. Запит надходить до веб-сервера, який звертається до файлу, що містить код сторінки. У випадку статичної сторінки у форматі html сервер відразу надсилає її користувачеві. Для динамічних сторінок веб-сервер викликає відповідний програмний засіб (наприклад, PHP), який при необхідності звертається за допомогою СУБД до бази даних та формує

кінцевий html-код. Після цього веб-сервер надсилає кінцевий код сторінки до клієнта, який за допомогою веб-оглядача побачить його у виді сторінки сайту.

В областях, пов'язаних з інформатикою і бізнесом, інтеграцією займаються спеціально створені для цієї мети компанії, а витрати на інтеграційні рішення зазвичай є вищими, ніж сумарна вартість окремих компонентів системи.

73.Шаблонні(узагальненні) класи і методи. Призначення та

використання

Шаблон класу являє собою якесь загальне опис родового класу, на основі якого створюються специфічні версії для конкретних типів даних.

Шаблон класу може бути похідним від шаблонного класу. Шаблон класу можебути похідним від не шаблонного класу. Шаблонний клас може бути похідним від шаблону класу. Не шаблонний клас може бути похідним від шаблону класу.

Дерево двійкового пошуку з 12-ма вузлами. Шаблони класу дозволяють нам створювати зв'язні класи,кожен з яких базується на різних типах параметрів, і ми можемо створювати стільки об'єктів кожного шаблону класу,

скільки нам необхідно.

Шаблон класу може бути похідним від шаблонного класу.

Шаблон класу може бути похідним від нешаблонного класу.

Шаблон класу Stack, розглянутий у попередньому розділі,

використовував тільки параметр типу в заголовку шаблону. Але в шаблонах є можливість використання і так званих нетипових параметрів.

Приклад виведення програми, наведеної на.Шаблон класу стеків використовується в функції main для реалізації стека intStack типу Stackint з

цілими числами. Цілі значення від Про до 3 поміщаються в стек intStack і

пізніше виштовхуються з нього. Шаблон класу стеків використовується також для реалізації стека зі значеннями з плаваючоюкоми floatStack типу Stackfloat.

Значення з плаваючою точкою 1.1 2.2 3.3 та 4.4 поміщаються в стек floatStack і

пізніше виштовхуються з нього.

Опис шаблону класу виглядає як традиційний опис класу, за винятком заголовка templateclass T, що вказує на те, що це описє шаблоном класу з параметром типу Т, що позначає тип класів, які створюватимуться на основі цього шаблону. Ідентифікатор Т визначає тип даних-елементів, що зберігаються в стеку, і може використовуватися в заголовку класу і у функціях-

елементах.

Чому нерідко шаблон класу називають параметризрвані типом.

Приклад виведення програми, наведеної на. Звичайно, шаблон класу списків включає й інші функції-елементи (insertAtFront і removeFromBack), які не бажано було б робити доступними для класу черг черезвідкритий інтерфейс.

Так що коли ми вказуємо, що шаблон класу черг повинен успадковувати шаблон класу списків, то задаємо приховане спадкування.

Деструктор для шаблону класу визначається з використанням синтаксису,

подібного синтаксису конструктора.

При визначенні шаблону класу можна використовувати параметри-

константи і параметри типів замість конкретних констант або типів.

Для використання шаблону класу CTypedPtrArray (або будь-якого з шаблонів MFC-класів) в програму потрібно включити файл заголовків MFC Afxtempl.Щоб зробити цей файл доступним для будь-якого заголовного або вихідного файлу в проекті MiniDraw, його можна включити в стандартний файл заголовків StdAfx.

Припустимо, що шаблон класу Employee має статичний елемент даних count. Припустимо далі, що з цього шаблонукласу отримані три шаблонних класу.

Шаблони забезпечують простий спосіб введення різного роду загальних концепцій і прості методи їх спільного використання. В результаті можна отримувати класи та функції які приблизно однакові за швидкодією та використанням пам‘яті у порівнянні з класами та функціями написаними вручну зі спеціалізованим кодом.

Шаблони забезпечують безпосередню підтримку узагальненого програмування, тобто програмування з використанням типів в якості

параметрів. Механізм шаблонів в С++ допускає використання типу як параметру при визначенні класу або функції. Шаблон залежить тільки від тих властивостей параметра-типу, які він явно використовує, і не вимагає, щоб різні типи, які використовуються в якості параметрів, були пов'язані будь-яким іншим чином. Зокрема, типи параметрів шаблону не повинні належати до однієї ієрархії успадкування.

совместно используемых Шаблон класу визначає дані та операції потенційно необмеженої множини споріднених класів. Шаблон функції визначає потенційно необмежену множину споріднених (спільно використовуваних) функцій.

Оголошення шаблону має наступний синтаксис: template <список параметрів шаблону> оголошення Тут кутові дужки є елементом синтаксису.

Оголошення в оголошенні шаблону має описувати функцію або клас.

глобальным Оголошення шаблону може бути тільки глобальним.

Список параметрів шаблону не може бути порожній. Шаблон з порожнім списком параметрів може бути просто описаний як звичайний клас або функція, і тому в ньому не має сенсу.

Процес створення оголошення класу за шаблоном класу і параметром шаблону часто називають інстанціюваням шаблону. Аналогічно, функція генерується ( «інстанцюється») з шаблону функції і параметрів шаблону. Версія шаблону для конкретного параметру називається спеціалізацією. Згенеровані класи є абсолютно звичайними класами, які підпорядковуються всім стандартним правилам для класів (наприклад, у них можуть бути дружні функції). Аналогічно, згенеровані функції є звичайними функціями, які підпорядковуються всім стандартним правилам для функцій.

Шаблони забезпечують ефективний спосіб генерації коду з порівняно коротких визначень. Тому потрібна деяка обачність для того, щоб уникнути заповнення пам'яті майже ідентичними визначеннями функцій.

Шаблони функцій