- •Київський національний університет імені Тараса Шевченка
- •Гриф надано Міністерством освіти і науки України (лист № 1.4/18-г-1523 від 20.09.07)
- •Основи алгоритмізації
- •1.1. Поняття алгоритму
- •1.2. Класифікація внутрішніх структур алгоритмів
- •1. Ввести а,b.
- •3. Вивести значення s.
- •4. Кінець.
- •6. Закінчити роботу.
- •1. Ввести число n.
- •6. Перехід до п.3.
- •7. Друк к.
- •8. Кінець.
- •1.3. Складність алгоритмів
- •1.4. Складність задач
- •Завдання для самостійної роботи
- •Форма Бекуса – Наура
- •Завдання для самостійної роботи
- •Void main(){
- •3.2. Структура с-програми
- •3.3. Описувачі
- •3.4. Основні операції мови с
- •If(!inword)
- •Void main()
- •Int rozmir;
- •3.5. Оператори мови с
- •3.5.1. Прості оператори
- •3.5.2. Умовний оператор
- •3.5.3. Оператор циклу for
- •3.5.4. Оператори do-while, while
- •3.5.5. Оператор continue
- •3.5.6. Оператор-перемикач switch
- •3.5.7. Оператор break
- •3.5.8. Оператор goto
- •If(error(I,j,k)) goto exit;
- •3.5.9. Оператор return
- •3.6. Директиви препроцесору та вказівки компілятору
- •3.6.1. Директива препроцесору #define
- •1. Макровизначення:
- •3.6.3. Директива #include
- •3.6.4. Директиви умовної компіляції #if, #elif, #else, #endif
- •3.6.5. Директива #line
- •If(!cond)
- •3.7. Описувачі з модифікаторами
- •3.7.1. Моделі пам'яті
- •3.7.2. Модифікатори типу доступу в пам'яті
- •Int huge*near X;
- •3.7.3. Модифікатори const, volatile, cdecl, pascal, interrupt
- •Volatile int t;
- •Void interrupt timer()
- •Void wait(int interval)
- •Завдання для самостійної роботи
- •Принципи типізації даних
- •4.1. Прості типи даних
- •4.2. Похідні типи
- •4.3. Еквівалентність типів
- •4.4. Успадкування атрибутів
- •4.5. Перераховні типи
- •4.6. Логічні типи
- •4.7. Символьні типи
- •4.8. Числові типи
- •4.9. Структурні типи даних
- •4.9.1. Масиви
- •4.9.2. Структури
- •Int year;
- •4.10. Деякі особливості типів даних c
- •4.10.1. Базові типи даних
- •4.10.2. Перетворення типів
- •Int atoi(char s[]) /*char* s*/
- •4.10.3. Засіб typedef
- •Int curs;
- •4.10.4. Покажчики та масиви
- •Void * p;
- •Int array[12];
- •Void f(int a[])
- •Int f(char * s)
- •Наведемо деякі приклади розв'язання задач.
- •Int shift; /*відступ*/
- •Int count[n]; /*кількість монет даного типу (коефіцієнти ai)*/
- •Int coin;
- •Int sum; /*монета, яку міняємо*/
- •Int maxcoin; /*індекс по масиву cost[] монети максимальної вартості, допустимої при даному розміні.*/
- •If(count[I])
- •If(maxcoin)
- •Int* ctranspon (int *a,int n,int m)
- •Void dobutok(int* a, int* b, int** c, int n, int m)
- •Int n,m,I,size;
- •Int main()
- •4.10.5. Структури та об'єднання
- •Розглянемо деякі приклади розв'язання задач.
- •Int hashfunc(key); int eqkey(key, key);
- •Void freeval(val); void setval(val, val);
- •Void freekey(key); void setkey(key, key);
- •Int hashfunc(key key){
- •Val val; /*значення*/
- •Void set(key key, val val){
- •Void printcell(struct cell *ptr){
- •Void main(void)
- •Завдання для самостійної роботи
- •Зображення чисел у комп'ютері
- •Int main(void)
- •5.1. Системи числення
- •5.2. Правила переведення чисел з однієї системи числення в іншу
- •5.3. Правило визначення точності зображення
- •5.4. Двійкова арифметика
- •5.4.1. Додавання двійкових чисел
- •5.4.2. Зображення від'ємних чисел
- •XXXXXXXX 00000001 00000000.
- •5.4.3. Віднімання двійкових чисел
- •5.4.4. Множення двійкових чисел
- •5.4.5. Ділення двійкових чисел
- •5.5. Ознака переповнення розрядної сітки при арифметичних операціях
- •5.6. Зображення цілих чисел
- •5.7. Зображення дійсних чисел
- •5.8. Керування машинним зображенням чисел та особливості виконання арифметичних операцій
- •Завдання для самостійної роботи
- •Реалізація концепції структурного програмування
- •6.1. Оголошення та визначення функцій
- •Int d;} people;
- •6.2. Формальні та фактичні параметри
- •Void swap(int a,int b)
- •Void swap(int a,int*b)
- •6.3. Функції зі змінною кількістю параметрів
- •Void sum(char *msg,...)
- •6.5. Параметри функції main
- •6.6. Лiтернi покажчики та функцiї
- •Void strcpy(char*s,char*t)
- •Void f(void)
- •6.8. Класи пам'яті
- •Розглянемо деякі приклади розв'язання задач.
- •I, power(2,I),power(-3,I));
- •Void main() { choturukyt b; tochka *a; float s; long n,in; srand(time(null));
- •6.9. Введення–виведення с. Файли та потоки
- •6.9.1. Функції введення–виведення верхнього рівня
- •6.9.2. Функції введення–виведення консольного термінала та порту
- •Int main(void)
- •6.9.3. Функції введення–виведення нижнього рівня
- •Int main(void)
- •Int handle;
- •Розглянемо приклади розв'язання задач.
- •Void main(void)
- •Void main(argc,argv)
- •If(c& masks[I])
- •If (цей рядок довший за найдовший з попередніх)
- •Int max; /*максимальна довжина*/
- •Int len; /*довжиною цього рядка*/
- •Int nwords; /*кількість слів у рядку*/
- •If(!*s) /*рядок закінчився*/
- •Int ctr; /*кількість входжень слова*/
- •If(!strcmp(word,w[I].Wrd)){
- •If(alert){
- •Void main() { float X,y,z,t,s; int I,j,flag,n,k; m1: clrscr();
- •InitBase (void){
- •Int key, /*новий ключ*/
- •InitBase();
- •Завдання для самостійної роботи
- •7.1. Елементи концепції обєктно-орієнтованого програмування
- •Int year;
- •Int year;
- •7.3. Опис протоколу класу
- •7.4.1. Коментарі
- •7.4.2. Прототипи функцій
- •Void f();
- •7.4.5. Перевантаження функцій
- •Int Name (int first)
- •Int Name (unsigned first)
- •Int Name (int first,char*second)
- •7.4.6. Значення формальних параметрів за умовчанням
- •7.4.7. Посилання й покажчики
- •Void increment(int& X)
- •Int anotherint;
- •7.4.10. Покажчик на void
- •Void*void_ptr;
- •Void swap(void*&item1,void*&item2)
- •7.4.11. Зв'язування зі збереженням типів
- •7.4.12. Про структури та об'єднання
- •7.5. Функції-члени класу
- •X *this;
- •Int year;
- •7.6. Конструктори та деструктори
- •7.6.1. Поняття про конструктори
- •Int*data;
- •Int size;
- •7.6.3. Конструктор копіювання
- •Int data[large];
- •Inline Large1 Large1::fast(const Large1 & b)
- •7.7. Глобальні та локальні об'єкти
- •Void main(void)
- •7.8. Статична пам'ять і класи
- •Int statpol::I;
- •Vоid draw()
- •Int large;
- •Int bigwant;
- •Void f() {
- •Void g(int a)
- •7.9. Успадкування
- •7.9.1. Синтаксична реалізація успадкування
- •7.9.2. Правила доступу до полів даних
- •Void f(void)
- •Void g(void){}//...}
- •7.9.3. Конструктори та деструктори в похідних класах
- •7.9.4. Використання заміщуючих функцій-членів
- •Void Display (void); //замiщувальна функцiя
- •Void Region::Display(void)
- •Void Display(void);};
- •Void Population::Display(void)
- •7.9.5. Похідні класи й покажчики
- •7.9.6. Ієрархія типів
- •XyValue(int_x,int_y):X(_x),y(_y)
- •XyData(int_x,int_y)
- •7.9.7. Множинне успадкування
- •Void SetLoc(int_x,int_y);};
- •Int data;
- •7.10. Віртуальні функції та класи
- •7.10.1. Віртуальні функції
- •Int value;
- •Virtual int GetValue();
- •Int Value::GetValue(){return value;}
- •7.10.2. Чисті віртуальні функції. Абстрактні класи
- •Virtual void f1(void);
- •Virtual void f2(void);//...}
- •Int index;
- •7.10.3. Віртуальні деструктори
- •7.10.4. Посилання як засіб для реалізації поліморфізму
- •7.10.5. Дещо про механізм віртуальних функцій
- •Virtual int method1(float r);
- •Int data;
- •Void func(void){//тіло}};
- •Virtual public CocaCola {
- •Int size;
- •Void ShowValue(void)
- •Void ShowValues(void);};
- •Void Two::ShowValues(void)
- •7.11.2. Дружні функції
- •Void Show(One &c1,Two &c2)
- •Void Show(One &c1);
- •Void Two::Show(One &c1)
- •7.12. Перевантаження операцій
- •7.12.1. Загальний підхід
- •Void main()
- •7.12.2. Перетворення типів
- •X::operator т();
- •7.12.3. Перевантаження операції індексування масиву
- •Int znach;
- •7.12.4. Перевантаження операції виклику функції
- •Int operator()(void);
- •Int FuncClass::operator()(void)
- •Vidnosh*vec;
- •7.12.5. Перевантаження операції доступу до члена класу
- •7.12.6. Перевантаження операцій інкремента й декремента
- •Int index;
- •Void*operator new(size_t)
- •Void*operator new(size_t);
- •8.1. Функціональні шаблони
- •8.1.1. Визначення й використання шаблонів функцій
- •Void func(t t)
- •Int main(void)
- •8.1.2. Перевантаження шаблонів функції
- •Int main(void)
- •8.1.3. Cпецiалiзованi функцiї шаблона
- •Int main(void){
- •8.2. Шаблони класів
- •8.2.1. Визначення шаблонів класу
- •Void push(t t);
- •Int numitems;
- •8.2.2. Константи й типи як параметри шаблона
- •8.2.3. Використання шаблонних класів
- •Int main(void)
- •8.2.4. Спеціалізація шаблонів класу
- •Void add(t item);
- •Int main(void)
- •IArray.Add(i1);
- •Int main(void)
- •IList.Add(i1);
- •Завдання для самостійної роботи
- •Автоматна технологія програмування
- •If(!stop)printf("не входити");
- •Завдання для самостійної роботи
- •Список літератури
- •Передмова 3
Завдання для самостійної роботи
1. Цілочисельний масив упорядкувати за спаданням a1 a2 ... an і знайти сукупність елементів ai, ..., ak, сума яких дорівнює заданому числу m. Якщо такої сукупності не знайдено, то видати відповідне повідомлення (використайте за можливістю рекурсивні процедури).
2. Скласти програму для з'ясування, чи є серед a1, a2, ..., an принаймні одна пара збіжних за величиною елементів.
3. Написати програми, після виконання яких у масиві a1, a2, ..., an визначається кількість сусідств:
а) двох додатних чисел;
б) двох чисел різного знака;
в) двох чисел одного знака, причому абсолютна величина першого числа має бути більше абсолютної величини другого.
4. Обчислити значення багаточлена
використовуючи формулу Горнера.
5. Обчислити значення полінома
Якщо коефіцієнти полінома – числа натурального ряду, то зводити їх у масив не має сенсу. Обчислення їх доцільно робити в процесі розв’язання. Тоді формула для обчислення поточного значення полінома буде мати вигляд
6. Обчислити значення використовуючи формулу Горнера:
Множник, на який множиться будь-яка дужка, можна подати як
де m 8.
7. Обчислити суму членів ряду використовуючи формулу Горнера
5
Зображення чисел у комп'ютері
Основи сучасного програмування Основи сучасного програмування Основи сучасного програмування Основи сучасного програмування Основи сучасного програмування Основи сучасного
Програми обробляють дані, змінюючи стан інформаційного середовища. Тому велике значення має зображення інформації усередині комп'ютера. Неможливо грамотно використовувати його можливості, не знаючи способу зображення, – це може призвести до помилок. Розглянемо таку програму:
#include <iostream.h>
Int main(void)
{
float h,x;
int i,m;
m=512;
for(i=m–1; i<=m+1;i++)
{
h=1./i;
x=0.;
for(int j=1;j<=i;j++)
x=x+h;
printf("x=%10.8f\n",x);
}
return 0;
}
Неважко бачити, що програма для трьох сусідніх значень підсумовує i разів величину 1/i. Здавалося б, кінцевий результат її роботи –і*(1/і) – має дорівнювати одиниці. Перевіримо. Запустивши програму, побачимо на екрані
511 |
0.99999666 |
512 |
1.00000000 |
513 |
0.99999666 |
Точним є лише значення i==512. Тому необхідно розібратися із зображенням чисел усередині комп'ютера.
5.1. Системи числення
Числа, якими ми звикли користуватися, називаються десятковими, тому арифметика дій з ними також називається десятковою. Кожне число можна скласти з набору цифр, що містить 10 символів – цифр. Якщо припустити, що алфавітом є множина {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, а число – це слово, то зрозуміло, що назва "десяткове" походить від кількості літер алфавіту.
Візьмемо, наприклад, число 358. Цей запис означає, що в числі три сотні, п'ять десятків і вісім одиниць. Отже, можна записати таку рівність: 358 300 50 8 3 * 102 5 * 101 8 * 100.
Цифри, які утворюють наше число, множаться на послідовні степені числа 10. Вони збільшуються на десять у степені, який на одиницю менше порядкового номера цифри, при нумерації справа наліво. Таким чином, кожне написане нами число може бути зображене у вигляді спеціального розкладу за степенями числа 10, а для запису використовується набір з десяти цифр.
Позначимо i-ту цифру числа через ai. Тоді число можна записати у вигляді anan-1…...a2a1. Запис числа можна зобразити так:
anan-1…...a2a1 an х10n-1 an-1 х 10n-2 …... a2 х 101 a1 х 100, (6.1)
де ai – символ з алфавіту {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}.
Число 10 є основою утворення числа, яка називається основою системи числення, а сама система числення називається десятковою.
Під системою числення розуміється спосіб зображення будь-якого числа за допомогою деякого алфавіту символів, що називаються цифрами.
Наочність зображення чисел і порівняльна простота виконання арифметичних операцій характерні для позиційних систем числення.
Система числення називається позиційною, якщо цифра має різні значення, залежно від того, яку позицію вона займає в послідовності цифр, що зображують число. Прикладом непозиційної системи числення є римська система зображення чисел.
Кількість р символів алфавіту, що використовуються в позиційній системі числення, називається її основою.
У загальному випадку в системі з основою р будь-яке число можна зобразити у вигляді полінома з основоюр:
тоді саме число у вигляді послідовності літер алфавіту записується як
У цій послідовності крапка відокремлює цілу частину числа від дробової, тобто коефіцієнти при позитивних степенях основи, включаючи нуль, – від коефіцієнтів при негативних степенях.
Технічно реалізувати десяткову систему числення на комп'ютері дуже складно: для збереження десяткової цифри потрібен пристрій з десятьма стійкими станами.
У комп'ютерах застосовують позиційні системи числення з недесятковою основою: двійкову, вісімкову, шістнадцяткову.
Технічно досить просто реалізувати двійковий елемент: є сигнал – немає сигналу. Крім того, у двійковій системі найпростіше реалізуються всі арифметичні операції: наприклад, двійкова таблиця множення складається лише із чотирьох рядків:
0 0 0 0 1 0 1 0 0 1 1 1
Вивчати принципи роботи комп'ютера без двійкової системи числення неможливо. Для двійкової системи числення формулу (6.1) можна записати у вигляді
,
де – або 0, або 1.
У вісімковій системі застосовуються вісім цифр: 0, 1, 2, 3, 4, 5, 6, 7. Для неї формула (6.1) має вигляд
де коефіцієнти набувають значень від0 до 7.
Аналогічне зображення справедливе і для шістнадцяткової системи. Алфавіт складається з 16 літер: десяти цифр і шести літер – A, B, C, D, E, F, що позначають числа 10, 11, 12, 13, 14, 15, відповідно.
У табл. 5.1 подано відповідність чисел у різних системах числення.
Таблиця 5.1
Десяткова |
Двійкова |
Вісімкова |
Шістнадцяткова |
00 |
0000 |
00 |
0 |
01 |
0001 |
01 |
1 |
02 |
0010 |
02 |
2 |
03 |
0011 |
03 |
3 |
04 |
0100 |
04 |
4 |
05 |
0101 |
05 |
5 |
06 |
0110 |
06 |
6 |
07 |
0111 |
07 |
7 |
08 |
1000 |
10 |
8 |
09 |
1001 |
11 |
9 |
10 |
1010 |
12 |
A |
11 |
1011 |
13 |
B |
12 |
1100 |
14 |
C |
13 |
1101 |
15 |
D |
14 |
1110 |
16 |
E |
15 |
1111 |
17 |
F |
Розглянемо процес зображення чисел у різних системах числення.