Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
СХІДНОУКРАЇНСЬКИЙ НАЦІОНАЛЬНИЙ
УНІВЕРСИТЕТ
імені Володимира Даля
МЕТОДИЧНІ ВКАЗІВКИ
до виконання лабораторних робіт
з дисципліни «Програмування»
(частина друга)
(для студентів денної та заочної форм навчання спеціальностей 091501 «Компютерні системи та мережі», 091502 «Системне програмування», 170101 - «Безпека інформаційних і комунікаційних систем»)
МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
СХІДНОУКРАЇНСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ
ІМЕНІ ВОЛОДИМИРА ДАЛЯ
МЕТОДИЧНІ ВКАЗІВКИ
до виконання лабораторних робіт
з дисципліни «Програмування»
(частина друга)
(для студентів денної та заочної форм навчання спеціальностей 091501 «Компютерні системи та мережі», 091502 «Системне програмування», 170101 - «Безпека інформаційних і комунікаційних систем»)
ЗАТВЕРДЖЕНО
на засіданні методичної ради кафедри компютерних систем та мереж
Протокол № _ від ____2010 р.
Луганськ 2010
УДК 681.3
Методичні вказівки до лабораторних робіт з дисципліни «Програмування» (частина друга) для студентів денної та заочної форм навчання спеціальностей 091501 «Компютерні системи та мережі», 091502 «Системне програмування», 170101 - «Безпека інформаційних і комунікаційних систем»/ Укл. Петров О. С., Дубовіков Є. Ю. Луганськ: вид-во СНУ ім. В. Даля, 2010 51с.
Дані методичні вказівки призначені для використання студентами при виконанні та оформленні лабораторних робіт з дисципліни «Програмування». Методичні вказівки містять короткі теоретичні відомості з основних розділів курсу. При розгляді кожної теми наводяться приклади вирішення типових задач з використанням середи Microsoft Visual C++. Виклад матеріалу супроводжується контрольними питаннями по кожній темі та варіантами завдань для самостійного опрацювання.
Укладачі: |
Петров О. С., проф. Дубовіков Є. Ю. викл. стаж. |
Відпов. за випуск |
Петров О.С., професор |
Рецензент |
Петрущенко Т.В., доцент |
Вступ
У 1972 році 31-річний фахівець з системного програмування з фірми Bell Labs Денис Рітчи розробив мову програмування C.
У 1984 році французький математик і саксофоніст Філіп Кан засновує фірмуBorland International.
Далі з'явився діалект мови C фірми Borland.
Початковий C був розроблений як мова для програмування в операційній системі Unix.
Незабаром він почав розповсюджуватися для програмістів-практиків. В кінці 70-х були розроблені транслятори C для Мікро ЕОМ для операційної системою Ср/m.
Після появи IBM РС почали з'являтися і компілятори C (для цього комп'ютера їх зараз більше 20).
У 1983 р. Американський Інститут Стандартів (ANSI) сформував Технічний Комітет X3J11, для створення стандарту мови C. Мова C++ корпорації Borland, що з'явився на ринку, підкоряється більшості вимог стандарту.
По суті своїй C є язиком функцій. Програмування на C, здійснюється шляхом написання функцій і звернення до бібліотечних функцій. Більшість функцій повертають деякі значення, які можуть використовуватися в інших операторах.
Серед безлічі достоїнств мови C потрібно відзначити основні:
Функції.
Оголошення функції (прототип)
Синтаксис:
[<специфікація класу памяті>] [<специфікація типу>] <оголошувач>
( [<список аргументів>] );
Оголошення функції специфікує імя функції, тип значення що повертається і, можливо, типи її аргументів та їх числові значення. Ці атрибути функції необхідні для перевірки компілятором мови C коректності звертання до неї до того, як вона визначена.
Якщо <оголошувач> функції представляє собою ідентифікатор (імя функції), то оголошується функція, тип значення якої, що повертається, заданий специфікацією типу. Функція не може повертати масив чи функцію, однак може повертати покажчик на ці обєкти.
Якщо специфікація типу в оголошенні функції пропущена, то передбачається тип int. На зовнішньому рівні може бути також пропущена специфікація класу памяті (див. класи памяті), а на внутрішньому рівні хоча б одна із специфікацій класу памяті чи типу повинна бути присутньою.
Деякі приклади оголошень функцій:
add(int, int); /* приклад 1 */
double calc( ); /* приклад 2*/
void draw(void); /* приклад 3 */
void bul(int a[n][n]); /* приклад 4 */
В першому прикладі оголошується функція з іменем add, яка приймає два аргументи типу int і повертає значення типу int.
В другому прикладі оголошується функція з іменем calc, яка повертає значення типу double. Список типів аргументів пустий.
В третьому прикладі оголошується функція draw з типом що повертає значення void (нічого не повертається). Список типів аргументів також містить ключове слово void, що вказує на відсутність аргументів функції.
В четвертому прикладі оголошується функція bul з типом що повертає значення void. Аргумент функції двомірний масив (n розмірність масиву) елементів цілого типу.
Оголошення функції
Оголошення функції визначає її імя, тип значення що повертається, клас памяті і може також задавати тип деяких чи усіх аргументів функції.
Крім явного оголошення, функція може бути оголошена неявно, по контексту її виклику. Неявне оголошення має місце в тому випадку, коли функція викликається без попереднього оголошення чи визначення. В цьому випадку компілятор мови C вважає, що функція, яка викликається, має тип значення що повертається int і клас памяті extern. Визначення функції, якщо воно є далі в тому ж самому файлі, може перевизначити тип значення що повертається і клас памяті.
Тип значення функції що повертається, вказаний у попередньому оголошенні, повинен відповідати типу значення що повертається у визначенні функції.
Наприклад:
main( )
{
int a = 0, b = 1;
float x = 2.0, y = 3.0;
double realadd(double, double);
a = intadd(a, b);
x = realadd(x, y);
}
intadd(a, b)
int a, b;
{
return (a + b); /* повертає значення типу int */
}
double realadd(x, y)
double x, y;
{
return (x + y); /* повертає значення типу double */
}
В прикладі функція intadd оголошена неявно з типом значення що повертається int, оскільки вона викликана до свого визначення. Компілятор не перевірятиме типи аргументів при виклику даної функції, тому що список типів аргументів для неї не заданий.
Функція realadd повертає значення типу double. В функції main є попереднє оголошення функції realadd. Тип значення що повертається (double), заданий у визначенні, відповідає типу значенню що повертається, заданому в попередньому оголошені. В попередньому оголошені також визначені типи двох параметрів функції realadd. Типи фактичних аргументів відповідають типам, що задані в попередньому оголошені, і також відповідають типам формальних параметрів у визначенні функції realadd.
Виклик функції
Виклик функції передає управління і фактичні аргументи (якщо вони є) заданій функції.
Синтаксично виклик функції має вигляд:
<вираз> ([<список виразів>]);
<вираз> обчислюється, і його результат інтерпретується як адрес функції. Вираз повинен мати тип функція.
<список виразів>, в якому вирази ідуть через кому, представляє собою перелік фактичних аргументів, що передаються функції. Список виразів може бути пустим.
При виконанні виклику функції відбувається присвоєння значень фактичних аргументів формальним параметрам. Перед тим кожен фактичний аргумент обчислюється, над ним виконуються необхідні перетворення, і він копіюється в стек. Перший фактичний аргумент відповідає першому формальному параметру, другий другому і т.д. Всі аргументи передаються по значенню, тільки масиви по посиланню (див. масиви).
Приклад:
main( )
{
intadd(2, 3); /*Виклик функції intadd з передачею фактичних
аргументів 2, 3 заданій функції */
}
intadd(a, b) /*Визначення функції intadd з формальними аргументами
а, b */
int a, b;
{
. . . .
}
В даному прикладі показано присвоєння фактичних аргументів 2, 3 формальним аргументам a, b функції intadd. Виклик функції в такому випадку робить наступні дії:
a = 2;
b = 3;
Таким чином формальний аргумент змінна у програмі що викликається, а фактичний аргумент конкретне значення, присвоєне цій змінній програмою що здійснює виклик. Фактичний аргумент може бути константою, змінною чи більш складним виразом.
Викликана функція працює з копією фактичних аргументів, тому ніяка зміна значень формальних параметрів не відібється на значеннях аргументів, з яких була зроблена копія.
Визначення функції
Функція самостійна одиниця програми, спроектована для реалізації конкретної задачі. Виконання програми завжди починається з команд, що містяться в функції main( ), яка в свою чергу може викликати інші функції (getchar( ), printf( ), scanf( ) та ін.).
Визначення функції специфікує імя функції, атрибути її формальних параметрів, і тіло функції, що містить оголошення і оператори. У визначені функції також може задаватися клас памяті функції і тип значення що повертається.
Синтаксис визначення функції:
[<специфікація класу памяті>] [<специфікація типу>] <імя функції>
( [<список аргументів>] )
[<оголошення аргументів>]
<тіло функції>
У визначенні функції допускається вказівка специфікації класу памяті static чи extern (див. клас памяті).
Наявність списку аргументів і оголошень не є обовязковою. Змінні, відмінні від аргументів, оголошуються в середині тіла функції.
Наприклад:
diff(x, y) /* функція diff з аргументами x, y */
int x, y; /* оголошення аргументів x, y */
{
int a, b; /* оголошення змінних а, b */
. . . .
}
Функції повинні мати той же тип, що і значення, які вони повертають в якості результатів. По замовчуванню передбачається що функції мають тип int. Якщо функція має інший тип, він повинен бути вказаний і в програмі що викликається, і в самому визначені функції.
Наприклад:
main( )
{
float q, x, duff( ); /* оголошення в програмі що викликається */
int n;
. . . .
q = duff(x, n);
. . . .
}
float duff(u, k) /* оголошення у визначенні функції */
float u;
int k;
{
float tor;
. . . .
return(tor); /* повертає значення типу float */
}
Передача значень функції
Аргументи використовуються для передачі значень із програми що викликається в функцію. Якщо значення змінних a і b будуть 5 і 2, то при виклику
с = diff(a, b);
здійснюється передача цих значень змінним x і y. Значення 5 і 2 називаються фактичними аргументами, а змінні x і y, вказані в оголошені функції diff( ), формальними аргументами.
Наприклад
main( )
{
int c;
c = diff(5, 2);
}
diff(x, y)
int x, y;
{
int z;
z = x y;
return(z);
}
Використання ключового слова return дозволяє передавати у викликаючу програму одне значення із функції що викликається. В нашому прикладі змінній с присвоюється значення змінної z що рівне 3.
Оголошення покажчика
Покажчик це змінна, котра призначена для збереження адресу обєкта деякого типу.
Синтаксис:
[<специфікація типу>] * <описувач>;
Специфікація типу задає тип змінної, на яку посилається покажчик, а символ (*) визначає саму змінну як покажчик.
Оголошення покажчика специфікує імя змінної-покажчика і тип обєкта, на який може вказувати ця змінна. Специфікація типу може задавати базовий, пустий, структурний тип чи тип обєднання. Якщо специфікація типу пропущена, передбачається тип int.
В мові C використовуються змінні типу покажчик. Значенням такої змінної слугує адреса деякої величини. Якщо ми дамо покажчику імя ptr, то зможемо написати, наприклад, такий оператор:
ptr = &pooh; /* присвоєння адресу pooh змінній ptr */
де &pooh константа типу покажчик ( адрес деякої змінної pooh);
ptr змінна типу покажчик.
В такому випадку ptr “вказує на” pooh. Різниця між двома формами запису: ptr і &pooh, полягає в тому, що ptr змінна, в той час як &pooh константа.
Таким чином, якщо, в змінній ptr міститься посилання на змінну pooh, тоді для доступу до значення цієї змінної можна скористатися операцією “непрямої адресації” :
val = *ptr; /* визначення значення, на яке вказує ptr */
Останні два оператори, взяті разом, еквівалентні наступному:
val = pooh;
Приклад:
pooh = 22;
ptr = &pooh; /* покажчик на pooh */
val = *ptr;
Результат виконання даного фрагмента присвоєння значення 22 змінній val.
Переважно виконання функції не робить ніякого впливу на значення змінних програми яка здійснює виклик. Щоб мати можливість безпосередньо змінювати значення змінних програми яка здійснює виклик, необхідно використовувати покажчики в якості аргументів. Це може виявитися необхідним у випадку, якщо у програму що здійснює виклик необхідно передати більше ніж одне значення.
Приклад:
/* Програма яка здійснює обмін значеннями між двома змінними x i y*/
main( )
{
int x = 5, y = 10;
printf(“Спочатку x = %d і y = %d. \n”, x, y);
interchange(&x,&y); /* передача адрес функції */
printf(“Тепер x = %d і y = %d. \n”, x, y);
}
interchange(u, v)
int *u, *v; /* u i v є покажчиками */
{
int temp;
temp = *u; /* temp присвоюється значення, на яке вказує u */
*u = *v;
*v = temp;
}
Результат виконання програми:
Спочатку x = 5 і y = 10.
Тепер x = 10 і y = 5.
Таким чином шляхом передачі функції адрес змінних x і y ми представили їй можливість доступу до них. Використовуючи покажчики і операцію *, функція змогла витягти величини, що поміщені у відповідні комірки памяті, і поміняти їх місцями.
Класи памяті
Класи памяті мови C дають можливість визначити, з якими функціями повязані які змінні і як довго змінна зберігається у програмі. Клас памяті дозволяє встановити два факти. По-перше, визначити, які функції мають доступ до змінної. (Межі, до яких змінна доступна, характеризують її “область дії”). По-друге, визначити, як довго змінна знаходиться в памяті.
Існує чотири ключових слова що використовуються для опису класів памяті: еxstern (для зовнішнього), auto (для автоматичного), static і register (для статичного і регістрового).
Змінні, що визначені поза функцією, є зовнішніми і мають глобальну область дії.
Наприклад:
/* глобальна змінна units */
int units; /* зовнішня змінна */
main( )
{
extern int units;
funct( );
}
funct( )
{
extern int units;
. . . .
}
Ключове слово extern пропонує компілятору шукати визначення цієї змінної поза функцією. Зовнішні змінні, які визначенні раніше функції, доступні їй навіть якщо не оголошені усередині її. В даному випадку змінна units буде доступна як функції main( ), так і функції funct( ).
По замовчуванню змінні, що оголошені усередині функції, є автоматичними і локальними (область дії такої змінної обмежена блоком {} , в якому ця змінна оголошена.) Можна, однак це підкреслити явно з допомогою необовязкового ключового слова auto.
Приклад:
main( )
{
auto int units;
. . . .
}
Автоматична змінна починає існувати при виклику функції, що містить її. Коли функція завершує свою роботу і повертає управління туди, звідки її викликали, автоматична змінна зникає.
Статичні змінні бувають як зовнішніми так і внутрішніми.
Внутрішні статичні змінні мають таку ж область дії, як і автоматичні змінні, однак вони не зникають, коли функція що їх містить, завершує свою роботу. Компілятор зберігає їх значення від одного виклику функції до іншого.
Різниця між зовнішньою змінною і зовнішньою статичною змінною полягає в області їх дії. Звичайна зовнішня змінна може використовуватися функціями в будь-якому файлі, в той час як зовнішня статична змінна може використовуватись тільки функціями того ж самого файлу, причому після визначення змінної.
Регістрові змінні, зберігаються в регістрах центрального процесора, де доступ до них і робота з ними виконується набагато швидше, ніж над звичайними змінними що зберігаються у памяті. Однак, якщо кількість доступних регістрів “зайнята”, то змінна стає простою автоматичною змінною.
КЛАС ПАМЯТІ |
КЛЮЧОВЕ СЛОВО |
ТРИВАЛІСТЬ ІСНУВАННЯ |
ОБЛАСТЬ ДІЇ |
Автоматичний |
Auto |
Тимчасово |
Локальна |
Регістровий |
Register |
Тимчасово |
Локальна |
Статичний |
Static |
Постійно |
Локальна |
Зовнішній |
Extern |
Постійно |
Глобальна (всі файли) |
Зовнішній статичний |
Static |
Постійно |
Глобальна (один файл) |
Класи памяті, які перелічені вище пунктирної лінії, оголошуються на внутрішньому рівні.
Класи памяті, які перелічені нижче пунктирної лінії, оголошуються на зовнішньому рівні.
Питання для самоконтролю
Задачі на функції
а) го члена прогресії;
б) суми перших членів прогресії.
а) знаходження го члена прогресії;
б) знаходження суми перших членів прогресії.
, якщо ;
, якщо , ;
, якщо , .
Функцію Аккермана1 називають двічі рекурсивною, оскільки сама функція і один з її аргументів визначені через самих себе. Знайти значення функції Аккермана для , .
Оголошення масивів
Масив це набір елементів одного типу, які мають одне і тeж базове імя і відрізняються один від одного числовою ознакою.
Синтаксис:
[<специфікація типу>] <оголошувач> [<константний вираз>];
[<специфікація типу>] <оголошувач> [ ];
Масив дозволяє зберігати як єдине ціле послідовність змінних однакового типу. Оголошення масиву визначає тип елементів масиву і його імя, а також може визначати число елементів в масиві. Змінна типу масив бере участь у виразах як константа-покажчик на значення що задане специфікацією типу. Якщо специфікація типу опущена, то передбачається тип int.
Оголошення масиву може мати одну з двох синтаксичних форм, вказаних вище. Квадратні дужки, які знаходяться за <оголошувачем>, є ознакою типу масив.
Константний вираз, що знаходиться в квадратних дужках, визначає число елементів в масиві. Індексація елементів масиву починається з нуля. Таким чином, останній елемент масиву має індекс на одиницю менший, ніж число елементів в масиві.
В другій синтаксичній формі константний вираз в квадратних дужках пропущений. Ця форма може бути використана, якщо в оголошені масиву є присутнім ініціалізатор, або масив оголошується як формальний параметр функції, або дане оголошення є посиланням на оголошення масиву десь в іншому місці програми. Однак для багатомірного масиву може бути пропущена тільки перша розмірність.
Для створення масиву компілятору необхідно знати тип даних і належний клас памяті, а також повинна бути відома кількість елементів масиву. Масиви можуть мати ті ж типи даних і класи памяті що і прості змінні.
Зовнішні і статичні масиви можна ініціалізувати. Автоматичні і регістрові масиви ініціалізувати не можна.
Приклади декількох оголошень масивів:
int temp[365]; /* зовнішній масив з 365 цілих чисел */
int days[ ] = {30, 31}; /* ініціалізація зовнішнього масиву */
main( )
{
float rain[365]; /* автоматичний масив з 365 чисел типу float */
static char code[12]; /* статичний масив з 12 символів */
extern temp[ ]; /* зовнішній масив; розмір вказаний вище */
}
Багатомірний масив, чи масив масивів, оголошується шляхом завдання послідовності константних виразів у квадратних дужках, що знаходяться за оголошувачем:
[<специфікація типу>] <оголошувач> [<константний вираз>] [<константний вираз>]…;
Кожен константний вираз у квадратних дужках визначає число елементів в даному вимірі масиву, тому оголошення двомірного масиву містить два константних вирази, тримірного три і т.д.
Масиву виділяється память, яка є необхідною для розміщення всіх його елементів. Елементи масиву з першого по останній розташовуються у послідовних комірках памяті, по зростанню адрес. Елементи багатомірного масиву запамятовуються по рядках. Наприклад, масив, який представляє собою матрицю розміром два рядки на три стовпці char[2][3] буде зберігатися наступним чином: спочатку в памяті запамятовуються три елементи першого рядка, потім три елементи другого рядка.
Покажчики масивів
Позначення масиву представляє собою скриту форму використання покажчиків. Наприклад, імя масиву визначає також його перший елемент, тобто якщо dates[ ] масив, тоді
dates = = & dates[0]
і обидві частини рівності визначають адресу першого елемента масиву. Обидва позначення є константами типу покажчик, оскільки вони не змінюються на протязі всієї програми. Однак їх можна присвоювати (як значення) змінній типу покажчик і змінювати значення цієї змінної.
Приклад:
#include<stdio.h>
void main(void)
{
int dates[4];
int i, *pt;
for(i = 0; i < 4; i++)
scanf(" %d ", &dates[i]);
pt = dates; /* присвоєння адресу покажчику масиву */
for(i = 0; i < 4; i++)
printf(" %d %р\n", pt[i], &pt[i]);
}
Якщо ми присвоюємо 4-м елементам масиву наступні значення: 23, 65, 89, 7, то результат виконання програми буде наступним:
23 325D:OF84
65 325D:OF86
89 325D:OF88
7 325D:OF8A
У другому стовпці виведені адреси комірок в яких знаходяться значення елементів масиву.
Таким чином, якщо dates визначає адресу першого елемента масиву то *(dates) його значення.
Наприклад:
dates + 2 = = & dates[2] /* адрес 3-го елемента масиву */
*(dates + 2) = = dates[2] /* значення 3-го елемента масиву */
Дані співвідношення показують можливість використання покажчика для визначення окремого елемента масиву, а також знаходження його значення.
Масиви можна використовувати в програмі у якості аргументів функції.
Коли імя масиву використовується в якості аргументу, функції передається покажчик. Далі функція використовує цей покажчик для виконання змін у вихідному масиві.
Скелет даної програми продемонстрований на прикладі.
Приклад:
main( )
{
int ages[50]; /* масив з 50 елементів */
convert(ages);
. . . .
}
convert(years)
int years[ ]; /* покажчик на масив*/
{
. . . .
}
ages аргумент функції convert, що є покажчиком на перший елемент масиву. Таким чином, оператор виклику функції передає їй покажчик, тобто адресу функції convert( ). Це означає що аргумент функції є покажчиком, тому функцію convert( ) можна записати наступним чином:
convert( int years[ ] )
{
. . . .
}
Оператор int years[ ]; оголошує змінну years покажчиком масиву цілих чисел. Оператори, що використовують покажчик years у функції convert( ), фактично працюють з масивом ages, що знаходиться в тілі функції main( )
У випадку використання двомірного масиву порядок його елементів визначається тим, що найправіший індекс масиву змінюється першим. Тому, наприклад, якщо ми маємо оголошення:
int dear[3][2]; /* масив типу int із 4-ох стрічок і 2-ох стовпців */
int *pr; /* покажчик на цілий тип */
тоді pr = dear вказує адрес елемента першого стовпця першого рядка:
dear = = &dear[0][0]
Тоді:
pr + 1= = &dear[0][1] /* 1-й рядок, 2-й стовпець */
pr + 5 = = &dear[2][1] /* 3-й рядок, 1-й стовпець */
Визначення і опис функції що керує двомірним масивом записується наступним чином:
main( )
{
static int dear[3][4];
convert(dear);
. . . .
}
convert(dear)
int dear[ ][4];
{
. . . .
}
Оператор int dear[ ][4]; повідомляє компілятор про необхідність розбиття масиву на рядки по чотири стовпці.
Приклад програми яка здійснює сортування елементів масиву методом обміну:
#include<stdio.h>
#define n 5
void bul(int a[n][n]);
void main(void)
{
int i,j,k;
static int a[n][n];
system("cls");
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf("a[%d][%d] =", i+1, j+1);
scanf("%d", &a[i][j]);
}
}
printf("old array\n");
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
printf ("%5d", a[i][j]);
printf("\n");
}
bul(a);
printf("\nnew array\n");
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf ("%5d", a[i][j]);
}
printf("\n");
}
}
void bul(int a[ ][n])
{
int i, k, j, c;
for(i = 0; i < n; i++)
{
for(k = n-1; k>=0; k--)
{
for(j = 0; j < k; j++)
{
if(a[i][j] < a[i][j+1])
{
c = a[i][j];
a[i][j] = a[i][j+1];
a[i][j+1] =c;
}
}
}
}
}
Стандартні функції для роботи з динамічною пам'яттю
Для роботи з динамічними об'єктами в С є функції стандартної бібліотеки malloc і free. Для їх використання потрібно включити в програму заголовний файл <stdlib.h>. У цьому файлі також вводиться позначення NULL для порожнього (нульового) покажчика.
void *malloc (size_t size)
malloc повертає покажчик на місце в пам'яті для об'єкту розміру size. Якщо пам'ять відвести не вдалося, то результат роботи функції NULL. (Тип size_t це беззнаковий цілий тип, який визначається у файлі <stddef.h>, результат операції sizeof має тип size_t). Як правило, узагальнений покажчик, який повертається цією функцією, явно приводиться до покажчика на тип даних. Наприклад, створити динамічну змінну типу double і привласнити значення, malloc, яке повертається, змінній dp покажчику на double, можна за допомогою виразу
dp = (double*) malloc (sizeof (double)).
Створена динамічна змінна існує аж до завершення роботи програми, або до моменту, коли вона явно знищується за допомогою функції free.
void free (void *p)
free звільняє область пам'яті, на яку указує p; якщо p рівне NULL, то функція нічого не робить. Значення p повинне вказувати на область пам'яті, раніше виділену за допомогою функцій malloc або calloc Після звільнення пам'яті результат розименування покажчика p непередбачуваний; результат також непередбачуваний при спробі повторного звернення до free з цим же покажчиком.
Приведемо опис ще однієї функції розподілу пам'яті в С. Нею зручно користуватися, коли потрібно розмістити масив в динамічній пам'яті.
void *calloc (size_t nobj, size_t size)
calloc повертає покажчик на місце в пам'яті, відведене для масиву nobj об'єктів, кожен з яких має розмір size. Виділена область пам'яті побітово обнуляється. (Відмітимо, що це не завжди рівнозначно привласненню нульових значень відповідним елементам масиву. У деяких реалізаціях в побітовому представленні нульового покажчика або значення 0.0 з плаваючою крапкою можуть бути ненульові біти). Якщо пам'ять відвести не вдалося, то результат роботи функції NULL.
У C++ для виділення ділянки пам'яті в динамічно розподіленій області використовується ключове слово new. Після слова new слід вказати тип об'єкту, який буде розміщений в пам'яті. Як результат оператор new повертає адресу виділеного фрагмента пам'яті, який має бути привласнений покажчику.
int* set = new int[100];
Після закінчення роботи з виділеною областю її слід звільнити. Робиться це за допомогою оператора delete, після якого записується ім'я покажчика. Оператор delete звільняє пам'ять, на яку указує покажчик.
delete [] set;
Динамічне розміщення масивів
При динамічному розподілі пам'яті для масивів слід описати відповідний покажчик і привласнювати йому значення за допомогою функції calloc() або malloc( ). Одновимірний масив а[10] з елементів типу float можна створити таким чином
float *a;
a=(float*)(calloc(10,sizeof(float));
a=(float*) malloc(10 * sizeof(float));
Для створення двовимірного масиву спочатку потрібно розподілити пам'ять для масиву покажчиків на одновимірні масиви, а потім розподіляти пам'ять для одновимірних масивів.
Наприклад:
double **a;
a=(double **) calloc(m,sizeof(double *));
for (i=0; i<=m; i++)
а[i]=(double *)calloc(n,sizeof(double));
Аналогічним чином можна розподілити пам'ять і для тривимірного масиву розміром n,m,l.
long ***a;
a=(long ***) calloc(m,sizeof(long **));
for (i=0; i<=m; i++)
{
а[i]=(long **)calloc(n,sizeof(long *));
for (j=0; i<=l; j++)
а[i][j]=(long *)calloc(l,sizeof(long));
}
Слід тільки пам'ятати, що непотрібну для подальшого виконання програми пам'ять слід звільняти за допомогою функції free().
/* --------- звільнення пам'яті ----------*/
for (i=0; i<=m; i++)
{
for (j=0; j<=l; j++)
free (а[i][j]);
free (а[i]);
}
free (a);
Покажчик на масив не обов'язково повинен показувати на початковий елемент деякого масиву. Він може бути зрушений так, що початковий елемент матиме індекс відмінний від нуля, причому він може бути як позитивним так і негативним
Питання для самоконтролю
Задачі на одновимірні масиви.
Задачі на двовимірні масиви.
Задачі на динамічні масиви
Перший масив, розміром n на m, заповнюється даними введеними з клавіатури, так що заповнення ведеться по стовпцях від перших елементів стовпця до останніх.
Другий масив, розміром n на n, заповнюється випадковими числами так, що непарні числа заносяться в елементи масиву, які на шахівниці були б чорними, а парні числа заносяться в елементи, які на шахівниці були б білими:
Третій масив, розміром n на n, заповнюється для довільного n так само, як для n=5:
25 |
24 |
20 |
19 |
11 |
23 |
21 |
18 |
12 |
10 |
22 |
17 |
13 |
9 |
4 |
16 |
14 |
8 |
5 |
3 |
15 |
7 |
6 |
2 |
1 |
1 |
2 |
3 |
4 |
5 |
6 |
20 |
21 |
22 |
23 |
24 |
7 |
19 |
32 |
33 |
34 |
25 |
8 |
18 |
31 |
36 |
35 |
26 |
9 |
17 |
30 |
29 |
28 |
27 |
10 |
16 |
15 |
14 |
13 |
12 |
11 |
F[i][j]=2, якщо i -я команда перемогла j-ю;
F[i][j]=1, якщо i-я команда зіграла внічию з j-ю;
F[i][j]=0, якщо i-я команда програла j-ю.
Визначити:
скільки очок набрала кожна команда;
скільки ігор вона виграла; зіграла внічию, програла;
скільки очок набрав переможець;
команда з яким номером стала переможницею чемпіонату;
скільки команд зіграли внічию більше половини ігор;
у скількох команд програшів більше, ніж нічиїх.
Перший масив, розміром m на n, заповнюється даними введеними з клавіатури, так що заповнення ведеться по стовпцях від останнього стовпця, а усередині стовпця від останнього рядка.
Другий масив, розміром n на n, заповнюється випадковими числами з інтервалу [-20; 200] так, що на побічній діагоналі двозначні числа.
Третій масив, розміром n на n, заповнюється для довільного n так само, як для n = 5.
1 |
2 |
1 |
4 |
1 |
1 |
2 |
3 |
2 |
4 |
3 |
2 |
3 |
3 |
1 |
1 |
4 |
2 |
2 |
2 |
5 |
1 |
3 |
1 |
1 |
Перший масив, розмірністю n на m, заповнюється даними введеними з клавіатури, так що заповнення ведеться по рядках від останніх елементів рядка до перших.
Другий масив, розмірністю n на n, заповнюється так: елементи, які знаходяться нижче головної діагоналі - випадкові числами з інтервалу [-17;36], а які знаходяться на головній діагоналі і вище - випадкові числами з інтервалу [100;10000].
Третій масив, розмірністю n на n, заповнюється для довільного n також, як для n=5:
11 |
0 |
0 |
0 |
0 |
7 |
12 |
0 |
0 |
0 |
4 |
8 |
13 |
0 |
0 |
2 |
5 |
9 |
14 |
0 |
1 |
3 |
6 |
10 |
15 |
У останньому випадку необхідно:
описати словами побудову масиву для двох різних n;
написати програму;
привести трасування для n=4.
Перший масив розміром n на m, заповнюється даними введеними з клавіатури, так, що заповнення ведеться по стовпцях від останніх елементів стовпця до перших.
Другий масив, розміром n на n, заповнюється так: елементи, які знаходяться вище за головної діагоналі - випадковими числами з інтервалу [-4.5; 45.675], а які знаходяться на головній діагоналі і нижче, випадковими числами з інтервалу [-100; 100].
Третій масив, розміром n на n, заповнюється для довільного n так само, як для n = 5:
1 |
2 |
6 |
7 |
15 |
3 |
5 |
8 |
14 |
0 |
4 |
9 |
13 |
0 |
0 |
10 |
12 |
0 |
0 |
0 |
11 |
0 |
0 |
0 |
0 |
Перший масив, розмірністю n на n, заповнюється даними введеними з клавіатури, так що заповнення ведеться по рядках від останнього рядка усередині рядка від останнього стовпця.
Другий масив, розмірністю n на m, заповнюється випадковими числами з інтервалу (-1;1) так, що в кожному рядку знаходиться число одного знаку.
Третій масив, розмірністю n x n, заповнюється для довільного n так, як для n=5
1 |
4 |
1 |
2 |
1 |
0 |
2 |
3 |
2 |
1 |
0 |
0 |
3 |
2 |
3 |
0 |
0 |
0 |
4 |
1 |
0 |
0 |
0 |
0 |
5 |
У останньому випадку необхідно:
Описати словами побудову масиву для двох різних n;
Написати програму;
Привести трасування для n=4.
Перший масив, розмірністю n на m, заповнюється даними введеними з клавіатури, так що заповнення ведеться по стовпцях від першого стовпця, а усередині стовпця від останнього рядка.
Другий масив, розмірністю n на n, заповнюється випадковими числами з інтервалу [-2;20] так, що на головній діагоналі знаходяться двозначні числа.
Третій масив, розмірністю n на m, заповнюється для довільного n так само, як для n=4.
1 |
1 |
3 |
1 |
2 |
2 |
2 |
0 |
1 |
3 |
0 |
0 |
4 |
0 |
0 |
0 |
У останньому випадку необхідно:
Описати словами побудову масиву для двох різних n;
Написати програму;
Привести трасування для n=4.
Робота з рядками
Рядки - це послідовність символів, обрамлена лапками. В кінці кожного рядка компілятор додає нульовий символ, що представляється управляючою послідовністю \0. Рядок описується як масив символів. Число елементів масиву дорівнює числу елементів в рядку плюс символ кінця рядка (\0). Символьний рядок в програмі може розташовуватися на декількох рядках. Для перенесення використовується зворотна дробова риска з подальшим натисненням клавіші введення. Зворотна дробова риска ігнорується компілятором, і наступний рядок вважається за продовження попередньої.
Для роботи з рядками дуже зручно використовувати покажчики.
Приклад. Записати введений рядок символів в зворотному порядку.
#include <stdio.h>
#include <string.h>
void main()
{
int top, bot;
char string[10], temp; /* опис рядка як масиву символів */
scanf("%s",string); /* при введенні рядків символ & не використовується, оскільки ім'я масиву є покажчиком на його початок */
for(top=0,bot=strlen(string);top<bot;top++,bot--)
{
temp=string[top];
string[top]=string[bot];
string[bot]=temp;
}
printf("%s\n",string);
}
Для введення одиночного символу з вхідного потоку використовується функція getchar(). Для виводу одиночного символу використовується функція putchar(ch), де ch - символ, що виводиться. Аргументом функції виводу може бути одиночний символ (включаючи знаки управляючої послідовностями), змінна або функція, значенням якої є одиночний символ.
Приклад. Програма вводить з вхідного потоку один символ, а потім виводить його на екран.
#include<stdio.h>
void main()
{
char ch;
ch=getchar();
putchar(ch);
}
Приклад. Програма, що реалізовує читання і друк символів до введення знаку 0.
#include<stdio.h>
#define STOP 0
void main()
{
char ch;
while(ch = getchar()!= STOP)
putchar(ch);
}
У умові, що стоїть після ключового слова while, реалізовано відразу три дії: введення символу за допомогою функції getchar(), занесення символу в змінну ch; перевірка на ознаку кінця введення. Для реалізації перевірки на кінець введення послідовності символів використовується ідентифікатор STOP, визначений директивою препроцесора.
Операції з рядками
Опис функції роботи з рядками міститься у файлі <string.h> бібліотеки стандартних функцій.
char *strcat(char *s1,char *s2)
Функція повертає покажчик на отриманий рядок.
char *strchr(char *s,int c)
Функція проглядає рядок (звернення до рядка за допомогою покажчика s) і шукає символ з кодом с. Повертає покажчик на знайдений символ або порожнє значення.
int strcmp(char *s1,char *s2)
Порівнюються два вказані рядки. Результат - змінна типу int:
s1<s2 негативне значення
s1==s2 значення 0
s1>s2 позитивне значення
char *strcpy(char *s1,char *s2)
Копіюється послідовність символів, вказана параметром s1 за адресою s2.
int strlen(char *s)
Перевірка символів
Для перевірки символів використовуються функції, що повертають значення "істина" або "хибність". Прототипи цих функцій описані у файлі <ctype.h> бібліотеки стандартних функцій.
Функція "істина", якщо
isalpha(c) з - символ алфавіту
isupper(c) з - символ верхнього регістра
islower(c) з - символ нижнього регістра
isdigit(c) з - цифра від 0 до 9
isxdigit(c) з - шістнадцятирична цифра
isalnum(c) з - буква або цифра
isspace(c) з - пропуск, табуляція, переклад рядка, переклад формату
Для введення і виведення рядків в програмі зручно використовувати функції
gets(char *string) і puts(char * string).
Приклад. Програма перевіряє введений рядок і, потім, виводить на екран ту її частина, яка починається з символу 'y'.
#include<stdio.h>
#include<string.h>
void main()
{
char string[10];
char *ptr;
printf(" Введіть рядок з у\n");
gets(string);
ptr=strchr(string,'y');
printf(" це рядок %s\n",ptr);
}
Задачі на работу з рядками
Завдання для самостійної роботи
Усі матеріали подаються у друкованому та електронному вигляді!!!
Таблиця 1
№ п/п |
Алгоритм впорядкування матриці |
Алгоритм для розрахунку fi(aij) та F(fi(aij)) |
Матриця |
1 |
Впорядкувати елементи стовпців матриці за спаданням їх значень методом вставки |
fi(aij)-максимальний елемент у кожному рядку матриці; F(fi(aij))-сума fi(aij). |
-12 7 23 13 4 67 15 34 -5 9 2 5 17 -23 45 26 -6 23 -5 -9 18 37 -8 26 12 |
2 |
Впорядкувати елементи рядків матриці за зростанням їх значень методом обміну |
fi(aij)-мінімальний елемент у кожному стовпці матриці; F(fi(aij))-добуток fi(aij) |
34 -8 27 7 12 -5 23 45 67 -2 13 -12 34 -3 25 17 56 -6 17 21 0 15 4 9 -14 |
3 |
Впорядкувати елементи стовпців матриці за зростанням їх значень методом вибору |
fi(aij)-сума елементів у кожному рядку матриці; F(fi(aij))-середнє геометричне значення fi(aij) |
2 0 33 -1 -21 78 7 -4 -3 11 -2 -7 -1 -9 0 13 61 60 42 -10 1 0 4 0 16 |
4 |
Впорядкувати елементи рядків матриці за спаданням їх значень методом вставки |
fi(aij)-добуток елементів у кожному стовпці матриці; F(fi(aij))-середнє арифме-тичне значення fi(aij) |
90 7 89 -2 17 1 -4 8 56 32 -4 -6 99 19 39 2 4 -7 0 75 11 41 22 80 -5 |
5 |
Впорядкувати елементи стовпців матриці за зростанням їх значень методом обміну |
fi(aij)-середнє арифметичне значення елементів у кожному рядку матриці; F(fi(aij))-добуток fi(aij) |
40 72 6 92 98 18 -33 -48 81 26 1 -4 6 -2 0 36 9 0 4 1 -55 2 66 70 -3 |
6 |
Впорядкувати елементи рядків матриці за спаданням їх значень методом вибору |
fi(aij)-середнє геометричне значення елементів у кожному стовпці матриці; F(fi(aij))-сума fi(aij) |
-3 -5 45 -71 -5 0 1 3 2 7 11 9 45 0 4 9 19 55 44 90 -3 -4 1 -5 0 |
7 |
Впорядкувати елементи стовпців матриці за зростанням їх значень методом вставки |
fi(aij)-добуток елементів у кожному рядку під головною діагоналлю матриці; F(fi(aij))-сума fi(aij) |
6 34 12 70 -1 -7 97 80 99 -99 1 6 -3 2 -8 3 33 -1 0 -78 -3 -5 -8 -56 -23 |
8 |
Впорядкувати елементи рядків матриці за спаданням їх значень методом обміну |
fi(aij)-сума елементів у кожному стовпці над головною діагоналлю матриці; F(fi(aij))-добуток fi(aij) |
9 67 65 45 1 12 61 48 -5 -1 0 39 0 41 2 36 95 -8 -5 0 11 22 71 3 63 |
9 |
Впорядкувати елементи рядків матриці за зростанням їх значень методом вибору |
fi(aij)-сума елементів у кожному стовпці над допоміжною діагоналлю матриці; F(fi(aij))-середнє геометричне значення fi(aij) |
44 -2 -5 38 91 2 0 6 3 22 13 1 -4 90 11 -3 -6 -98 -23 -24 10 34 32 31 69 |
10 |
Впорядкувати елементи стовпців матриці за спаданням їх значень методом обміну |
fi(aij)-добуток елементів у кожному рядку під допоміжною діагоналлю матриці; F(fi(aij))-середнє арифметичне значення fi(aij) |
-1 -5 -47 -8 -1 -4 -98 90 -45 -78 -3 -2 -5 -9 -4 -8 -67 33 -91 -40 -2 -58 11 -65 -77 |
11 |
Впорядкувати елементи рядків матриці за зростанням їх значень методом вставки |
fi(aij)-середнє арифметичне значення елементів у кожному стовпці під головною діагоналлю матриці; F(fi(aij))-добуток fi(aij) |
1 16 21 11 6 2 17 22 12 7 3 18 23 13 8 4 19 24 14 9 5 20 25 15 10 |
12 |
Впорядкувати елементи стовпців матриці за спаданням їх значень методом обміну |
fi(aij)-середнє геометричне значення елементів в кожному рядку над головною діагоналлю матриці; F(fi(aij))-сума fi(aij) |
0 2 -2 89 21 -1 -4 36 41 71 56 93 51 -2 -51 1 3 -8 0 9 23 41 5 8 -2 |
13 |
Впорядкувати елементи рядків матриці за спаданням їх значень методом вставки |
fi(aij)-середнє арифметичне значення елементів у кожному стовпці над допоміжною діагоналлю матриці; F(fi(aij))-добуток fi(aij) |
12 46 23 72 -5 59 7 -8 0 67 7 -8 -4 -97 -55 77 -1 -5 34 -8 0 22 27 24 24 |
14 |
Впорядкувати елементи рядків матриці за зростанням їх значень методом обміну |
fi(aij)-сума елементів у кожному стовпці під допоміжною діагоналлю матриці; F(fi(aij)) -середнє геометричне значення fi(aij) |
87 98 57 29 95 -8 59 -2 9 -11 6 10 20 59 -23 12 13 51 46 -7 -2 87 69 90 -3 |
15 |
Впорядкувати елементи стовпців матриці за зростанням їх значень методом вибору |
fi(aij)-добуток елементів у кожному рядку над головною діагоналлю; F(fi(aij))-середнє арифметичне значення fi(aij) |
50 98 -4 85 -8 40 73 -2 -9 -19 1 6 73 21 0 0 25 2 -5 -3 99 19 95 92 -7 |
16 |
Впорядкувати елементи рядків матриці за спаданням їх значень методом вставки |
fi(aij)-сума елементів у кожному стовпці під головною діагоналлю матриці; F(fi(aij))-середнє геометричне значення fi(aij) |
3 5 9 24 2 -23 0 37 29 10 0 1 4 -2 -5 -5 -83 74 82 -1 11 88 -5 81 -39 |
17 |
Впорядкувати елементи стовпців матриці за зростанням їх значень методом обміну |
fi(aij)-середнє геометричне значення елементів у кожному рядку матриці; F(fi(aij))-середнє арифметичне значення fi(aij) |
66 21 -3 -1 90 1 74 -2 80 -1 10 30 20 -50 91 2 4 5 81 0 33 69 -5 51 24 |
18 |
Впорядкувати елементи рядків матриці за спаданням їх значень методом вибору |
fi(aij)-середнє арифметичне значення елементів у кожному стовпці над допоміжною діагоналлю; F(fi(aij))- добуток fi(aij) |
33 -5 -9 -20 -11 0 -42 86 83 71 -6 -9 33 13 22 52 -5 -7 53 19 -3 98 72 68 0 |
19 |
Впорядкувати елементи стовпців матриці за зростанням їх значень методом вставки |
fi(aij)-середнє геометричне значення елементів у кожному рядку над головною діагоналлю; F(fi(aij))-сума fi(aij) |
34 45 65 23 98 1 -4 67 -3 -18 23 -5 -1 94 -25 2 24 4 79 -63 10 29 25 30 -6 |
20 |
Впорядкувати елементи рядків матриці за спаданням їх значень методом обміну |
fi(aij)-добуток елементів у кожному стовпці під головною діагоналлю матриці; F(fi(aij))-середнє арифметичне значення fi(aij) |
19 62 45 -1 84 23 54 -4 -2 68 36 39 96 94 97 -3 -8 -4 -6 -22 98 -5 -3 0 11 |
21 |
Впорядкувати елементи стовпців матриці за зростанням їх значень методом вибору |
fi(aij)-добуток елементів у кожному рядку над допоміжною діагоналлю матриці; F(fi(aij))-сума fi(aij) |
22 41 45 -45 -49 5 1 3 -2 0 34 97 48 72 -1 -3 -7 5 92 20 0 -3 -57 9 1 |
22 |
Впорядкувати елементи рядків матриці за спаданням їх значень методом обміну |
fi(aij)-середнє арифметичне значення елементів у кожному стовпці матриці; F(fi(aij))-середнє геометричне значення fi(aij) |
30 31 36 63 -2 2 24 -3 -7 -1 45 28 -98 2 -8 0 -1 -2 -3 93 11 10 72 85 66 |
23 |
Впорядкувати елементи стовпців матриці за зростанням їх значень методом вставки |
fi(aij)-сума елементів у кожному рядку над головною діагоналлю матриці; F(fi(aij))-середнє геометричне значення fi(aij) |
31 65 83 -2 -85 9 -2 11 -4 70 52 73 -8 -1 60 57 83 -1 82 50 1 -3 -2 78 -9 |
24 |
Впорядкувати елементи рядків матриці за спаданням їх значень методом обміну |
fi(aij)-добуток елементів у кожному стовпці під допоміжною діагоналлю матриці; F(fi(aij))-середнє арифметичне значення fi(aij) |
10 32 1 -8 -1 2 4 91 -82 96 33 62 -1 -8 0 5 -5 6 -6 7 -19 0 3 -22 -3 |
25 |
Впорядкувати елементи стовпців матриці за спаданням їх значень методом вставки |
fi(aij)-середнє геометричне значення елементів у кожному рядку під головною діагоналлю матриці; F(fi(aij))-сума fi(aij) |
9 24 -2 86 -3 40 49 -4 -3 0 27 -76 77 -1 69 71 -89 -94 -51 50 2 96 42 36 -1 |
ДОДАТОК А
Зразок титульного листа
МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
СХІДНОУКРАЇНСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ
імені ВОЛОДИМИРА ДАЛЯ
КАФЕДРА КОМПЮТЕРНИХ СИСТЕМ ТА МЕРЕЖ
ІНДИВІДУАЛЬНА КОНТРОЛЬНА РОБОТА
з дисципліни: “Програмування ”
Тема: “Програмування на мові C”
Виконав: |
студент гр.____________ |
(індекс) |
|
_____________________ |
|
(прізвище, ініціали) |
|
Керівник: |
_____________________ |
(посада, прізвище, ініціали) |
ЛУГАНСЬК 20__
ДОДАТОК Б
Зразок змісту
ДОДАТОК В
Зразок списку використаних джерел
Список використаних джерел
1. Організаційно-технічне забезпечення інформаційної безпеки. Навчальний посібник/ За ред. Проф. В.О. Хорошка/ Уклад.:А.Г. Габович, С.Б. Гордієнко, В.О. Хорошко, Д.В. Чирков. К.: ДУІКТ, Полиграфконсалтинг, 2005, -116с.
2. Петров А.С., Петров А.А. Основы безопасности информационных систем: Учебное пособие - Луганск: Изд-во ВНУ им. В.Даля, 2004. 148с.3.
3. Герасименко В.А. Защита информации в автоматизированных системах обработки данных. В 2-х книгах. - М.: Энергоатомиздат, 1994.
4. Романец Ю.В., Тимофеев П.А., Шаньгин В.Ф. Защита информации в компьютерных системах и сетях / Под ред. В.Ф. Шаньгина. - 2-е изд., перераб. и доп. М.: Радио и связь, 2001. - 376 с.
5. Стеклов В.К., Беркман Л.Н. Телекоммунікаціонні мережі.-Київ.,-2000,-396с.
6. Сучасні телекомунікації./ За ред. Довгого С.А.-М.: Экотрендз,2003-320с.
7. Коханович Г.Ф., Климчук В.П., Паук С.М., Потапов В.Г. Защита информации в телекоммуникационных системах. К.: „МК-Пресс”, 2005. -288с., ил.
8. Максименко Г.А., Хорошко В.А. Методы выявления, обработки и идентификации сигналов радиозакладных устройств. К.: ООО „ПолиграфКонсалтинг”, 2004. с.317. ил.
ДОДАТОК Г
Зразок прикладу роботи програми
ДОДАТОК Д
Зразок блок-схеми алгоритму роботи програми
Учбове видання
МЕТОДИЧНІ ВКАЗІВКИ
до виконання лабораторних робіт
з дисципліни «Програмування»
(частина друга)
(для студентів денної та заочної форм навчання спеціальностей 091501 «Компютерні системи та мережі», 091502 «Системне програмування», 170101 - «Безпека інформаційних і комунікаційних систем»)
Укладачі:
Петров Олександр Степанович
Дубовіков Євген Юрійович
Редактор |
|
Техн. редактор |
|
Оригінал-макет |
Є. Ю. Дубовіков |
Підписане у друк
Формат 60х841/16. Папір офсетний. Гарнітура Times.
Друк офсетний. Умов. друк. арк. . Уч. вид. л. .
Тираж 150 екз. Видавн. № . Заказ № . Ціна договірна.
Видавництво Східноукраїнського національного університету
імені Володимира Даля
91034, г. Луганськ, кв. Молодіжний, 20а
Адрес редакції: 91034, г. Луганськ, кв. Молодіжний, 20а
Телефон: 8(0642) 41-34-12. Факс 8(0642) 41-31-60
E-mail: uni@snu.edu.ua http: www.snu.edu.ua
1 Примітка: Розрахунок значення функції Аккермана є трудомістким навіть при малих аргументах n і m (перевірте це твердження для , ).