Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Програмування частина друга для студентів денної та заочної форм навчання спеціальностей 091501 ~ Комп~

Работа добавлена на сайт samzan.net:

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 9.11.2024

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

СХІДНОУКРАЇНСЬКИЙ НАЦІОНАЛЬНИЙ

УНІВЕРСИТЕТ

імені Володимира Даля

МЕТОДИЧНІ ВКАЗІВКИ

до виконання лабораторних робіт

з дисципліни «Програмування»

(частина друга)

(для студентів денної та заочної форм навчання спеціальностей 091501 – «Комп’ютерні системи та мережі», 091502 – «Системне програмування», 170101 - «Безпека інформаційних і комунікаційних систем»)

Луганськ 2010


МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ

СХІДНОУКРАЇНСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ

ІМЕНІ ВОЛОДИМИРА ДАЛЯ

МЕТОДИЧНІ ВКАЗІВКИ

до виконання лабораторних робіт

з дисципліни «Програмування»

(частина друга)

(для студентів денної та заочної форм навчання спеціальностей 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.  Що таке функція?
  2.  Що таке рекурсія?
  3.  Як оформлюється рекурсивна функція?
  4.  Чи можуть рекурсивні виклики функції тривати нескінченно?
  5.  Як має бути оформлена рекурсивна функція, щоб кількість рекурсивних викликів була кінцевою?
  6.  Які види функцій використовуються в програмах?
  7.  Перерахувати декілька стандартних функцій.
  8.  У яких випадках доцільно використовувати нестандартні (визначені в програмі) функції?
  9.  Як оформляються нестандартні (визначені в програмі) функції?
  10.  Які види функцій використовуються в програмах?
  11.  Чи може програміст дати функції ім'я sin?
  12.  Як в програмі виконати функцію?
  13.  Що таке фактичні параметри функції? Які правила їх використання?
  14.  Які переваги дає використання нестандартних (визначених в програмі) функцій?


Задачі
на функції

  1.  Написати функцію знаходження максимального елементу з трьох чисел .
  2.  Написати функцію знаходження мінімального числа з трьох (чотирьох) заданих чисел .
  3.  Знайти периметр трикутника, заданого координатами своїх вершин. (Визначити функцію для розрахунку довжини відрізку по координатах його вершин.)
  4.  Дано основи і висоти двох рівнобедрених трапецій. Знайти суму їх периметрів. (Визначити функцію для розрахунку периметра рівнобедреної трапеції по її основі і висоті.)
  5.  Знайти всі тризначні прості числа. (Визначити функцію, що дозволяє розпізнавати прості числа.)
  6.  Два прості числа називаються "близнятами", якщо вони відрізняються один від одного на 2 (наприклад, числа 41 і 43). Надрукувати всі пари чисел - "близнят", які не перевищують число 200. (Визначити функцію, що дозволяє розпізнавати прості числа.)
  7.  Дано два натуральні числа. З'ясувати, в якому з них сума цифр більша. (Визначити функцію для розрахунку суми цифр натурального числа.)
  8.  Дано два натуральні числа. З'ясувати, в якому з них більше цифр. (Визначити функцію для розрахунку кількості цифр натурального числа.)
  9.  Дано сторони двох трикутників. Знайти суму їх периметрів і суму їх площ. (Визначити функцію для розрахунку периметра і площі трикутника по його сторонах)
  10.  Дано основи і висоти двох рівнобедрених трапецій. Знайти суму їх периметрів і суму їх площ. (Визначити функцію для розрахунку периметра і площі рівнобедреної трапеції по її основі і висоті.)
  11.  Написати рекурсивну функцію для обчислення факторіалу натурального числа n.
  12.  Дані перший член і різниця арифметичної прогресії. Написати рекурсивну функцію для знаходження:

а) го члена прогресії;

б) суми  перших членів прогресії.

  1.  Дані перший член і знаменник геометричної прогресії. Написати рекурсивну функцію:

а) знаходження го члена прогресії;

б) знаходження суми  перших членів прогресії.

  1.  Написати рекурсивну функцію для обчислення го члена послідовності Фібоначчі. Послідовність Фібоначчі . утворюється по закону:    .
  2.  Написати рекурсивну функцію для обчислення значення так званої функції Аккерману для невід'ємний чисел  і . Функція Аккерману визначається таким чином:

, якщо ;

, якщо , ;

, якщо , .

Функцію Аккермана1 називають двічі рекурсивною, оскільки сама функція і один з її аргументів визначені через самих себе. Знайти значення функції Аккермана для , .

  1.  Написати рекурсивну процедуру переведення натурального числа з десяткової системи числення в двійкову.
  2.  Написати рекурсивну процедуру переведення натурального числа з десяткової системи числення в  - ричную. Значення  в основній програмі вводиться з клавіатури ().
  3.  Написати рекурсивну функцію, що визначає, чи є задане натуральне число простим (простим називається натуральне число, що більше 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);

Покажчик на масив не обов'язково повинен показувати на початковий елемент деякого масиву. Він може бути зрушений так, що початковий елемент матиме індекс відмінний від нуля, причому він може бути як позитивним так і негативним


Питання для самоконтролю

  1.  Що таке одномірний масив?
  2.  Для чого використовуються одномірні масиви? Як вони описуються?
  3.  Як називається номер елементу одномірного масиву?
  4.  Як в програмі використовувати значення конкретного елементу одномірного масиву?
  5.  Як можна заповнити одномірний масив?
  6.  Для чого в програмах використовуються двовимірні масиви? Як вони описуються?
  7.  Скільки індексів характеризують конкретний елемент двовимірного масиву?
  8.  Як в програмі використовувати значення конкретного елементу двовимірного масиву?
  9.  Як можна заповнити двовимірний масив?
  10.  Яку структуру даних описує двовимірний масив?
  11.  Який індекс двовимірного масиву змінюється швидше при послідовному розміщенні елементів масиву в оперативній пам'яті?


Задачі
на одновимірні масиви.

  1.  Дано масив А[5]. Знайти суму і кількість додатних елементів.
  2.  Дано масив А[6]. Знайти мінімальний елемент масиву і його порядковий номер.
  3.  Дано масив А[4]. Знайти максимальний елемент масиву і його порядковий номер.
  4.  Дано масив А[8]. Знайти мінімальний елемент масиву.
  5.  Дано масив А[6]. Знайти суму і кількість додатних елементів, які розташовані між мінімальним і максимальним елементами.
  6.  Дано масив А[7]. Знайти максимальний елемент масиву.
  7.  Дано масив А[10]. Знайти мінімальний елемент масиву.
  8.  Дано масив А[9]. Упорядкувати елементи, масиву по убуванню.
  9.  Дано масив А[10]. Упорядкувати елементи, масиву за збільшенням.
  10.  Дано масив А[5]. Визначити кількість від’ємних елементів.
  11.  Дано масив А[6]. Визначити кількість додатних елементів
  12.  Дано масив А[5]. Знайти кількість непарних додатних елементів.
  13.  Дано масив А[7]. Знайти кількість парних додатних елементів.
  14.  Дано масив А[5]. Знайти суму парних додатних елементів.
  15.  Дано масив А[8]. Знайти суму непарних додатних елементів.
  16.  Дано масив А[5]. Знайти добуток  додатних елементів.
  17.  Дано масив А[6]. Знайти визначити кількість елементів, рівних 4.
  18.  Дані масиви А[5] і В[10]. Обчислити суми відповідних елементів масивів.
  19.  Дані масиви А[5] і В[10]. Обчислити різницю відповідних елементів масивів.
  20.  Дано масив А[5]. Визначити кількість елементів, менших 4.
  21.  Дано масив А[5]. Обчислити добуток від’ємних елементів масиву. Дано масив А[5]. Знайти суму і кількість додатних елементів.
  22.  Дано масив А[5]. Знайти найменший додатний елементу серед елементів з парними номерами масиву.
  23.  Скласти програму, що знаходить найменший з від’ємний елемент масиву А[10].
  24.  Знайти найбільше число серед елементів масиву А, останні числа обнулити.

Задачі на двовимірні масиви.

  1.  Дана матриця А[5][5]. Всі елементи, які знаходяться нижче головної діагоналі обнулити, вище – замінити на «3».
  2.  Знайти суму додатних елементів матриці А[3][5].
  3.  У матриці А[3][3] знайти кількість нульових елементів.
  4.  У матриці А[3][5] знайти добуток додатних елементів.
  5.  У матриці А[4][3] необхідно визначити кількість елементів, більших одиниці.
  6.  Знайти добуток елементів головної діагоналі матриці А[5][5].
  7.  Знайти кількість від’ємних елементів матриці А[4][4].
  8.  Переписати елементи головної діагоналі матриці B[5][5] в одновимірній масив C[5].
  9.  Знайти кількість додатних елементів, розташованих під головною діагоналлю матриці А[5][5].
  10.  Знайти суму від’ємних елементів матриці А[3][3].
  11.  Дано масив А[5][5]. Знайти мінімальний елемент серед елементів, розташованих в непарних рядках масиву.
  12.  Дано масив А[5][5]. Побудувати масив B[5] за наступним правилом: B[j] привласнити максимальний елемент j – стовпця масиву А.
  13.  Дано масив А[5][5]. Знайти добуток і кількість парних додатних елементів побічної діагоналі відповідних рядків.
  14.  Дано масив А[7][7]. Знайти максимальний елемент серед елементів, розташованих вище побічної діагоналі.
  15.  Дано масив А[7][7]. Знайти максимальний елемент серед елементів, розташованих нижче побічної діагоналі. Поміняти місцями елементи рядка і стовпця, на перетині яких знаходиться максимальний елемент.
  16.  Дано масив А[5][5]. Упорядкувати елементи масиву порядково.
  17.  Дано масив А[6][6]. Знайти максимум серед елементів, які повторилися більше одного разу.
  18.  Дано масив А[8][8]. Знайти максимальний елемент серед елементів рядків.
  19.  Дано масив А[7][7]. Знайти найбільший елемент серед тих, що стоять на головній і побічній діагоналях і поміняти його місцями з елементом, що стоїть на перетині цих діагоналей.
  20.  Дано масив А[8][8]. Знайти мінімальний елемент серед елементів рядків. .
  21.  Знайти кількість нульових елементів матриці А, розташованих над головною діагоналлю.
  22.  Знайти середнє арифметичне від’ємних елементів матриці А[4][4].
  23.  Дано масив А[4][3]. Переписати всі її елементи у вектор B.
  24.  У матриці А[3][3] знайти кількість нульових елементів.
  25.  Дано масив А[5][5]. Замінити нулями всі її елементи, розташовані на головній діагоналі.

Задачі на динамічні масиви

  1.  Напишіть програму для заповнення трьох двовимірних масивів і подальшого їх виводу.

Перший масив, розміром 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.  Масив А[n][m] містить дійсні числа. Потрібно ввести ціле число K і обчислити суму елементів А, для яких I+J=К. Проте слід переконатися, що значення К дозволяє знайти рішення, інакше потрібно надрукувати повідомлення про помилку.
  7.  Дана матриця. Переставляючи її рядки і стовпці, перемістити перший найбільший елемент матриці у верхній лівий кут.
  8.  Заповнити квадратну матрицю послідовними цілими числами від 1 до N, розташованими по спіралі, починаючи з лівого верхнього кута і просуваючись за годинниковою стрілкою, наприклад:


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

  1.  Елемент масиву називається локальним мінімумом, якщо він строго менше всіх своїх сусідів. Підрахувати кількість локальних мінімумів заданої квадратної матриці і знайти максимум серед всіх локальних мінімумів.
  2.  Дана таблиця футбольного чемпіонату (F);

F[i][j]=2, якщо  i -я команда перемогла j-ю;

F[i][j]=1, якщо i-я команда зіграла внічию з j-ю;

F[i][j]=0, якщо i-я команда програла j-ю.

Визначити:

скільки очок набрала кожна команда;

скільки ігор вона виграла; зіграла внічию, програла;

скільки очок набрав переможець;

команда з яким номером стала переможницею чемпіонату;

скільки команд зіграли внічию більше половини ігор;

у скількох команд програшів більше, ніж нічиїх.

  1.  У масиві n на n вибрати таку діагональ, паралельну головній, сума елементів якої була б максимальною.
  2.  Напишіть програму для заповнення трьох двовимірних масивів і подальшого їх виводу. 

Перший масив, розміром 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

  1.  У двовимірному масиві містяться результати двох голосувань n депутатів. Підрахуйте, яких депутатів більше: тих, хто обидва рази проголосували однаково, або тих, хто змінив своє рішення.
  2.  Напишіть програму для виконання трьох двовимірних масивів і подальшого їх виводу.

Перший масив, розмірністю 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.

  1.  Поверніть трикутник, заданий координатами вершин, на вказаний кут.
  2.  Напишіть програму виведення елементів заданого двовимірного масиву так, щоб в кожному рядку кількість виведених елементів збігалася з відповідним числом послідовності Фібоначчі. Останній рядок може мати меншу кількість елементів.
  3.  Напишіть програму для заповнення трьох двовимірних масивів і подальшого їх виводу. 

Перший масив розміром 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

  1.  Напишіть програму для заповнення трьох двовимірних масивів подальшого їх виводу.

Перший масив, розмірністю 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.

  1.  У двовимірному масиві записані по m оцінок n школярів. Вкажіть номери школярів, середня оцінка яких більше 4,5.
  2.  Напишіть програму для заповнення трьох двовимірних масивів подальшого їх виводу.

Перший масив, розмірністю 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> бібліотеки стандартних функцій.

  1.  З'єднання послідовностей символів.

char *strcat(char *s1,char *s2)

Функція повертає покажчик на отриманий рядок.

  1.  Пошук першого входження символу в рядок.

char *strchr(char *s,int c)

Функція проглядає рядок (звернення до рядка за допомогою покажчика s) і шукає символ з кодом с. Повертає покажчик на знайдений символ або порожнє значення.

  1.  Порівняння рядків.

int strcmp(char *s1,char *s2)

Порівнюються два вказані рядки. Результат - змінна типу int:

s1<s2 негативне значення

s1==s2 значення 0

s1>s2 позитивне значення

  1.  Копіювання символів.

char *strcpy(char *s1,char *s2)

Копіюється послідовність символів, вказана параметром s1 за адресою s2.

  1.  Визначення довжини рядка (без завершуючого нуля).

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.  Дано речення, слова в ньому розділені пропуском, підрахувати скільки букв "а" в кожному слові.
  2.  Дано речення, слова в ньому розділені пропуском, підрахувати скільки букв та цифр в останньому слові.
  3.  Дано речення, слова в ньому розділені пропуском, поміняти місцями перше та останнє слово.
  4.  Дано речення, слова в ньому розділені пропуском, поміняти місцями парні та непарні, за порядку проходження, слова.
  5.  Дано N речень. Знайти в кожному перше слово та надрукувати їх в рядок через пропуск.
  6.  Дано N речень. Знайти в кожному останнє слово та надрукувати їх в рядок через пропуск.
  7.  Дано N речень. Підрахувати кількість слів в кожному реченні та вивести на екран.
  8.  Дано речення, слова в ньому розділені пропуском. Підрахувати кількість слів, які починаються з тієї букви, якою закінчується попереднє слово.
  9.  Дано речення, слова в ньому розділені пропуском. Підрахувати кількість слів, які починаються з тієї ж букви, як наступне слово.
  10.  Дано речення, слова в ньому розділені пропуском. Упорядкувати слова в порядку зростання їх довжини.
  11.  Дано речення, слова в ньому розділені пропуском. Упорядкувати слова за абеткою (тільки по першій букві).
  12.  Дано N речень, слова в яких розділені пропусками. Вивести їх на екран в порядку зростання кількості слів в реченні.
  13.  Дано N речень, слова в яких розділені пропусками. Вивести їх на екран в порядку зростання загальної довжини слів в реченні (без урахування кількості розділяючих пропусків).
  14.  Дано речення, слова в ньому розділені пропуском. Скласти з нього два реченні за правилом: в одне переписати всі парні по порядку проходження слова, а в інше - непарні.
  15.  Дано N речень, слова в яких розділені пропуском. Скласти новий текст за наступним правилом: виключити з тексту всі слова, які містять букву 'a'.


Завдання для самостійної роботи

  1.  Скласти блок-схему алгоритму та програму мовою Cі згідно з завданням, отриманим від викладача за табл. 1: задану прямокутну матрицю A={aij} відсортувати за вказаним алгоритмом; для відсортованої матриці знайти значення функції F(fi(aij)); алгоритм сортування і обчислення fi(aij) оформити у вигляді функції; елементи матриці вводити з клавіатури; програма повинна вивести на екран відсортовану матрицю, всі значення fi(aij) та значення функції F(fi(aij))
  2.  Оформити звіт:
    1.  Титульний лист (Додаток А);
    2.  Зміст(Додаток Б);
    3.  Текст завдання;
    4.  Опис вхідних та вихідних даних;
    5.  Блок-схему алгоритму роботи програми(Додаток Д);
    6.  Програмний код;
    7.  Тестові приклади(Додаток Г);
    8.  Список використаних джерел(Додаток В).

Усі матеріали подаються у друкованому та електронному вигляді!!!

Таблиця 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 (перевірте це твердження для , ).




1. Лекция 10 МЕТОДИЧЕСКОЕ МАСТЕРСТВО УЧИТЕЛЯ ИНОСТРАННОГО ЯЗЫКА План- Составляющие методического
2. Феноменология духа
3. первых наконецто тело стало достаточно реактивным адаптируется почти как по учебнику; на седьмой день ст
4. Город- Москва Пожелания к будущей работе Должность- менед
5. лекция ’7. Мышцы человека Мышцы или мускулы от лат
6. Теоретико-правовой анализ правоприменительной деятельности
7. Культ личности И.В. Сталина
8. заданием конкурса 10 3 колокольчика
9. Демокрит и Платон
10. вариант исчисления административных весов в иерархиях власти Определение понятия административног
11. Декабристы на Украине
12. ТЕМАТИКА КОНТРОЛЬНЫХ РАБОТ- Анкетные методы оценки спроса
13. 2 Англ М
14. Руководство по противопоказаниям к иммунизации детей
15. und Erzieherische Rolle der Theaterarbeit mit den Sch~lern in der deutschen Sprache
16. Тобиас Смоллет
17. В Тираспольском суде могут судить за одно и то же два раза
18. 10 План- Введение
19. Мифологическая структура мира
20. Использование сублимации в пищевой промышленности