
- •Київський національний університет імені Тараса Шевченка
- •Гриф надано Міністерством освіти і науки України (лист № 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. Функція піднесення до степеня.
Розглянемо функцію power і основну програму, що її використовує:
main()
{ /*test power function*/
int i;
for (i=0;i<10;++i)
printf("%d%d%d\n",
I, power(2,I),power(-3,I));
}
power(x,n) /*raise x n-th power;n
*>0*/
int x,n;
{
int i,p;
p=1;
for (i=1;i<=n;++i)
p=p*x;
return (p);
}
Аргументи функції описані в рядкуint x,n;
Описи аргументів містяться між списком аргументів і лівою фігурною дужкою, що відкривається; кожен опис закінчується крапкою з комою. Імена, використані для аргументів функції power, локальні й недоступні жодним іншим функціям. Інші процедури можуть використовувати ті самі імена без виникнення конфлікту. Це вірно для змінних "і" та "p"; "і" у функції power ніяк не зв'язане з "і" у функції main.
Значення, обчислене функцією power, передаються в main за допомогою оператора return. Усередині круглих дужок можна написати будь-який вираз.
2. Написати й протестувати функцію I_TO_B(n,s,b), яка переводить ціле число n у рядок s, що зображує число ув системі числення з основою b:
#include <dos.h> #include <stdio.h>
#include <string.h> #include <conio.h> void I_TO_B(long n,char*str) { int i,j,g=0,z=0; long cf; static int a[10],b[10],c[10]; for(i=0,j=48;i<=9,j<=57;i++,j++) { a[i]=i; b[i]=j; } for(j=0;j<=100;j++) { if(n==0)break; cf=n%10; n/=10; for(i=0;i<10;i++) { if(a[i]==cf) c[z++]=b[i]; } } for(z=9;z>=0;z--) { if(c[z]!=0) str[g++]=c[z]; } str[g]='\0'; } void main() { static char str[80]; long n; puts("Введіть ціле число n, яке треба перевести в рядок:\n"); scanf("%ld",&n); I_TO_B(n,str); puts("\n Це рядок:\n"); puts(str); getch(); }
3. Написати програму для гри "Хрестики-нулики" на полі 3 3 для людини й комп'ютера.
#include <stdio.h> #include <conio.h> #define ESC 27 int win[24]={0,1,2,3,4,5,6,7,8,0,3,6,1,4,7,2,5,8,0,4,8,2,4,6};
int prov1(int*a) { int i,p=0,w[3]; for(i=0;i<8;i++) { w[0]=win[i*3]; w[1]=win[i*3+1]; w[2]=win[i*3+2]; if(a[w[0]]==0&&a[w[1]]==0&&a[w[2]]==-1) { a[w[2]]=0; p++; break; } if(a[w[0]]==0&&a[w[1]]==-1&&a[w[2]]==0) { a[w[1]]=0; p++; break; } if(a[w[0]]==-1&&a[w[1]]==0&&a[w[2]]==0) { a[w[0]]=0; p++; break; } } return p; }
int prov2(int*a) { int i,p=0,w[3]; for(i=0;i<8;i++) { w[0]=win[i*3]; w[1]=win[i*3+1]; w[2]=win[i*3+2]; if(a[w[0]]==1&&a[w[1]]==1&&a[w[2]]==-1) { a[w[2]]=0; p++; break; } if(a[w[0]]==1&&a[w[1]]==-1&&a[w[2]]==1) { a[w[1]]=0; p++; break; } if(a[w[0]]==-1&&a[w[1]]==1&&a[w[2]]==1) { a[w[0]]=0; p++; break; } } return p; }
void main() { int i,j,p=0,l,a[9],n; do { clrscr(); for(i=0;i<9;i++)a[i]=-1; if(p==0) { puts("Комп’ютер ходить першим"); a[4]=0; for(l=0;l<4;l++) { do { scanf("%d",&n); if(a[n]!=-1) puts("Клітинка зайнята!"); }while(a[n]!=-1); a[n]=1; if(prov1(a)!=0) {puts("Ви програли!");break;} if(prov2(a)==0) { if(a[0]<0&&a[8]!=1) a[0]=0; else if(l==1&&a[1]==1) a[6]=0; else if(a[2]<0&&a[6]!=1) a[2]=0; else for(i=0;i<9;i++) if(a[i]<0) {a[i]=0;break;} } for(i=0;i<3;i++,putchar('\n')) for(j=0;j<3;j++) printf("%2d",a[i*3+j]); } } else { puts("Ви йдете першим"); scanf("%d",&n); a[n]=1; for(l=0;l<4;l++) { if(prov1(a)!=0) {puts("Ви програли!");break;} if(prov2(a)==0) { if(a[4]==-1)a[4]=0; else if(l==1&&a[0]==1&&a[8]==1||l==1&&a[2]==1&&a[6]==1) a[1]=0; else if(a[0]<0&&a[8]!=1) a[0]=0; else if(a[2]<0&&a[6]!=1) a[2]=0; else for(i=0;i<9;i++) if(a[i]<0) {a[i]=0;break;} } for(i=0;i<3;i++,putchar('\n')) for(j=0;j<3;j++) printf("%2d",a[i*3+j]); do { scanf("%d",&n); if(a[n]!=-1) puts("Клітинка зайнята!"); }while(a[n]!=-1); a[n]=1; } } for(i=0;i<3;i++,putchar('\n')) for(j=0;j<3;j++) printf("%2d",a[i*3+j]); p=!p; puts("Знову?(Так – довільна клавіша, Ні-ESC)"); }while(getch()!=ESC); }
4. Із даної на площині множини точок вибрати такі чотири точки, які є вершинами опуклого чотирикутника найбільшої площі.
Для розв'язання задачі переглядатимемо всі можливі четвірки точок, перевірятимемо, чи є вони вершинами опуклого чотирикутника та знаходитимемо його площу при позитивній перевірці на опуклість. Тоді з усіх таких площ знайдемо максимальну. Для знаходження площі чотирикутника й перевірки його на опуклість використаємо площі трикутників. Очевидно, що площа опуклого чотирикутника завжди дорівнюватиме сумі площ двох трикутників, що утворюються його сторонами й довільною діагоналлю. Якщо ж чотирикутник не опуклий, то його площа дорівнює сумі площ трикутників лише при певному підборі вершин трикутників. Для знаходження площі трикутника використаємо формулу
S 1/2 x1 y2 x2 y3 x3 y1 – x1 y3 – x2 y1 – x3 y2 ,
де вершини трикутника задано координатами (x1, y1), (x2, y2) та (x3, y3).
#include <math.h> #include <stdio.h> #include <conio.h> #include <stdlib.h>
//Структура точки typedef struct { float x; float y; } tochka;
//Структура чотирикутника typedef struct { tochka t1; tochka t2; tochka t3; tochka t4; } choturukyt;
//Обчислюємо площу трикутника за формулою, записаною вище float s_tr(tochka t1,tochka t2,tochka t3) { return 0.5*fabs(t1.x*t2.y+t2.x*t3.y+t3.x*t1.y-t1.x*t3.y-t2.x*t1.y-t3.x*t2.y); }
//Обчислюємо площу чотирикутника //Перевіряємо, чи є він опуклим float s_ch(tochka t1,tochka t2,tochka t3,tochka t4) { float s1,s2;
s1=s_tr(t1,t2,t3)+s_tr(t1,t3,t4); s2=s_tr(t2,t3,t4)+s_tr(t1,t2,t4);
if(fabs(s1-s2)/s1<1e-4)return s1; return 0; }
//Знаходимо найбільшу площу чотирикутника //Методом перебору всіх точок float poshyk(tochka*A,int n,choturukyt*B) { long i,j,k,m; float pre=0,tek;
for(i=0;i<n;i++) for(j=i+1;j<n;j++) for(k=j+1;k<n;k++) for(m=k+1;m<n;m++)
if((tek=s_ch(A[i],A[j],A[k],A[m]))!=0) if(tek>pre) { pre=tek; B->t1=A[i]; B->t2=A[j]; B->t3=A[k]; B->t4=A[m]; }
return pre; }
//Формуємо множину точок void zapov(tochka*A,long n,long in) { long i; for(i=0;i<n;i++) { A[i].x=in*((float)rand()/(float)32767); A[i].y=in*((float)rand()/(float)32767); } }