
- •Основні положення теорії алгоритмів та її застосування
- •Введення до теорії алгоритмів
- •Загальні риси алгоритмів
- •Машина Поста
- •Машина т’юринга
- •Основи лямбда-числення та функціонального програмування
- •Теза Черча-т’юринга про алгоритмічну розв’язність задачі
- •Проблема розв’язності (зависання)
- •Алгоритмічно нерозв’язні задачі
- •Проблема відсутності загального методу вирішення задачі
- •Проблема інформаційної невизначеності задачі
- •Проблема логічної нерозв’язності задачі
- •Побудова машини т’юринга для обчислення деяких простих функцій
- •Введення до оцінки складності алгоритмів
- •Визначення порядку складності алгоритму
- •Оптимізація алгоритмів
- •Структури даних в алгоритмічній мові програмування
- •Визначення алгоритмічної мови програмування
- •Базові елементи сучасної мови програмування: типи даних; екземпляри даних; вирази; оператори; функції; класи.
- •Поняття типу даних
- •Прості типи: числові; символьні; логічні.
- •Тип даних рядок
- •Структуровані типи даних: масиви, записи, множини
- •Типи даних за значенням і за посиланням
- •Сумісність типів та перетворення між типами даних
- •Екземпляри даних: змінні, константи
- •Видимість даних
- •Управління ходом виконання та структурування програм в алгоритмічній мові програмування
- •Вирази, операнди та операції
- •Основні операції: арифметичні; логічні; бульові; з використанням рядків
- •Поняття оператора
- •Прості оператори: присвоювання; виклику функції
- •Оператори управління ходом виконання: розгалуження; вибору; цикли; переходу
- •Структурування програм: функції та класи
- •Параметри функцій: вхідні, результуючі.
- •Рекурсивні функції
- •Файли: текстові, бінарні
- •Алгоритми чисельних методів, апроксимації функцій, інтегрування та вирішення рівнянь з одним невідомим
- •Чисельні методи
- •Особливості вирішення задач чисельними методами, точність та коректність рішень
- •Апроксимації функцій: лінійна інтерполяція; інтерполяційний многочлен Ньютона.
- •Чисельне інтегрування: метод трапецій; метод Сімпсона; метод Сімпсона з оцінкою погрішності.
- •Вирішення рівнянь з одним невідомим: метод простих ітерацій; метод Ньютона; метод парабол.
- •Алгоритми вирішення системи лінійних рівнянь, пошуку екстремуму функції
- •Вирішення системи лінійних рівнянь методом Гауса
- •Пошук екстремуму функцій одної змінної: метод золотого перетину; метод парабол.
- •Пошук екстремуму функцій багатьох змінних: метод координатного спуску; метод найскорішого спуску.
- •Алгоритми обробки масивів
- •Визначення масивів
- •Операції над масивами
- •Упорядкування масивів: сортування вибором; сортування вставкою; бульбашкове сортування; сортування методом Шелла; метод швидкого сортування.
- •Вибір методів сортування
- •Пошук в упорядкованих масивах методом половинного поділу, інтерполяційним методом
- •Застосування індексів для пошуку у невпорядкованих даних
- •Алгоритми обробки даних на основі списків та дерев
- •Визначення списку
- •Види списків: незалежні списки, однозв’язані списки; двозв’язані списки; кільцеві списки; упорядковані списки
- •Основні операції над списками: включення елементу до списку; видалення елементу; перехід між елементами; ітератор для списку
- •Упорядкування та пошук в списках
- •Похідні структури даних: черга, стек, дек
- •Визначення дерева
- •Впорядковані дерева
- •Бінарні дерева
- •Основні операції з бінарними деревами: включення елементу; видалення елементу; обхід дерева
- •Балансування дерева
- •Алгоритми обробки текстових даних на основі регулярних виразів
- •Введення до теорії кінцевих автоматів
- •Графічне представлення кінцевих автоматів
- •Використання кінцевого автомату: синтаксичний аналіз.
- •Реалізація синтаксичного аналізу файлу з розділяючими комами
- •Детерміновані та недетерміновані кінцеві автомати
- •Регулярні вирази
- •Форма Бекуса-Наура для запису регулярних виразів
- •Синтаксичний аналіз регулярних виразів
- •Компіляція регулярних виразів
- •Інструменти для спрощення роботи з регулярними виразами
- •Зіставлення рядків з регулярними виразами.
- •Алгоритми систем числення
- •Введення до систем числення
- •Двійкова система числення
- •Шістнадцяткова система числення
- •Системи числення з нетрадиційними основами
- •Перетворення між різними системами числення
- •Арифметика чисел з плаваючою комою
- •Точність операцій з плаваючою комою
- •Арифметика великих чисел
- •Алгоритми криптографії та хешування
- •Значення випадкових чисел у програмуванні
- •Алгоритми генерації рівномірно розподілених псевдовипадкових чисел
- •Перевірка якості випадкових чисел
- •Кодування з виправленням помилок
- •Стиснення даних
- •Стиснення даних зі словником
- •Алгоритм стиснення даних Лемпела-Зіва
- •Введення до криптографії
- •Елементи теорії порівнянь
- •Шифрування за допомогою випадкових чисел
- •Створення таємного ключа по Діффі-Хеллману
- •Система rsa
- •Алгоритми цифрового підпису
- •Введення до хешування
- •Функції хешування
- •Проста функція хешування рядків
- •Функції хешування з використанням рандомізації
- •Вирішення конфліктів за допомогою лінійного зондування
- •Псевдовипадкове зондування
- •Подвійне хешування
Прості оператори: присвоювання; виклику функції
Оператор присвоювання передбачає наявність змінної (зліва) і виразу (зправа), значення якого присвоюється змінній.
Приклад:
a = b + 12;
Оператор виклику функції (методу) передбачає наявність назви функції (методу) і, якщо необхідно, параметрів:
SomeFunc(SomePar);
Якщо параметри відсутні, то після назви функції слід залишати пусті дужки:
SomeFunc();
Оператори управління ходом виконання: розгалуження; вибору; цикли; переходу
Оператори управління ходом виконання дозволяють виконувати або не виконувати ділянки програми в залежності від певних умов.
Оператор розгалуження передбачає перевірку умови, в залежності від виконання якої (true) буде виконуватися один блок, а невиконання (false) – другий. Наявність другого блоку не є обов’язковою. Якщо у блоці має виконуватись один оператор, то оформлення його у вигляді складеного оператору (з фігурними дужками) не обов’язково.
Приклад:
if (a < 10)
{
j++;
b = a + c;
}
else
j--;
Оператор вибору (switch) – це оператор управління ходом виконання, який на основі умови передає керування одному із варіантів.
int caseSwitch = 1;
switch (caseSwitch)
{
case 1:
Console.WriteLine("Case 1");
break;
case 2:
Console.WriteLine("Case 2");
break;
default:
Console.WriteLine("Default case");
break;
}
Більш складний приклад використання switch:
class SwitchTest
{
static void Main()
{
Console.WriteLine("Coffee sizes: 1=Small 2=Medium 3=Large");
Console.Write("Please enter your selection: ");
string s = Console.ReadLine();
int n = int.Parse(s);
int cost = 0;
switch(n)
{
case 1:
cost += 25;
break;
case 2:
cost += 25;
goto case 1;
case 3:
cost += 50;
goto case 1;
default:
Console.WriteLine("Invalid selection. Please select 1, 2, or 3.");
break;
}
if (cost != 0)
{
Console.WriteLine("Please insert {0} cents.", cost);
}
Console.WriteLine("Thank you for your business.");
}
}
Оператори циклів дозволяють повторно виконувати оператор (у тому числі складений оператор – блок) поки виконується певна умова, C# підтримує наступні варіанти циклів:
цикл do..while – передбачає повторне виконання оператору, доки вираз не прийме значення false
int x = 0;
do
{
Console.WriteLine(x);
x++;
} while (x < 5);
цикл while – передбачає виконання оператору, доки вираз не прийме значення false:
int n = 1;
while (n++ < 6)
{
Console.WriteLine("Current value of n is {0}", n);
}
цикл for (параметризований цикл) – передбачає виконання оператору, доки вираз не прийме значення false, при чому у операторі циклу задається змінна, значення якої буде змінюватися при кожній ітерації:
for (int i = 1; i <= 5; i++)
{
Console.WriteLine(i);
}
цикл foreach – передбачає виконання оператору над усіма елементами масиву чи колекції:
int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 };
foreach (int i in fibarray)
{
System.Console.WriteLine(i);
}
Оператори переходу здійснюють безумовний перехід на певну ділянку коду.
Операторами переходу є:
break – призначений для завершення найближчого внутрішнього циклу чи оператору switch і переходу до наступного оператору, який йде за ним;
continue – передає керування на наступну ітерацію циклу, в якому він знаходиться;
return – перериває виконання методу, в якому він знаходиться і повертає керування методу, який його викликав. Якщо метод має повертати значення, то при виклику оператора слід вказати значення, що повертається, виклик оператору є обов’язковим. Якщо метод не передбачає повернення значення, то виклик цього оператору не є обов’язковим;
goto – здійснює перехід на певний іменований оператор (мітку). У сучасних програмах на C# найчастіше використовується лише в операторі switch для того, щоб перейти на інший варіант. У багатьох інших випадках використання цього оператору є вкрай небажаним, оскільки ставить під загрозу структуру програми.