Робота з функціями в мові програмування Сі

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Лабораторна робота

"Робота з функціями в мові програмування Сі + +"

Мета роботи: ознайомитися з особливостями застосування функцій у мові Сі + +, з поняттям прототипу і областю його застосування, з поняттям автоматичних зовнішніх, статичних і реєстрових змінних і їх застосуванням при складанні програм з використанням функцій.

  1. Теоретичні відомості

Функції

Програми на мові СІ зазвичай складаються з великої кількості окремих функцій (підпрограм). Як правило, вони мають невеликі розміри і можуть знаходитися як в одному, так і в декількох файлах.

Зв'язок між функціями здійснюється через аргументи, повернені значення і зовнішні змінні.

Виклик функції здійснюється наступним чином: <тип функції>; (варіант 1, варіант 2, ...);

Якщо функція має змінне число параметрів, то замість останнього з них вказується три крапки.

Передача одного значення з викликаної функції в викликала відбувається за допомогою оператора повернення, який записується в наступному вигляді:

return (вираз);

У цьому випадку значення виразу (в окремому випадку може бути просто змінна) передається в основну програму і підставляється замість звернення до функції.

Нехай викликає програма звертається до функції наступним чином:

a = fun (b, c);

Тут b і c - аргументи, значення яких передаються до спричинюється підпрограму.

Якщо опис функції починається так: fun (i, j), то змінні i і j отримають значення a і b відповідно.

Приклад 1. Оформити отримання абсолютної величини числа у вигляді функції. Сама функція може бути оформлена у вигляді окремого файлу. У цьому випадку виконується його включення процедурою # include.

Програма має наступний вигляд:

# Include <stdio.h>

main ()

{Int a = 10, b = 0, c =- 20;

int d, e, f;

d = abs (a) / * звернення до функції abs * /

b = abs (b);

f = abs (c);

printf ("% d% d% d", d, b, f);

}

# Include "abc.c" / * включення файлу abc.c з функцією abs * /

/ * Функція, що обчислює абсолютну величину числа * /

abs (x)

int x; / * Опис змінних, що працюють у функції * /

{Int y;

y = (x <0)?-x: x; / * Визначення абсолютної величини числа * /

return (y) / * Повертає значення у зухвалій програмі * /

}

У наведеній програмі опис типу функції було опущено. Це можливо тільки в тому випадку, якщо повернене значення має цілий тип. У всіх інших випадках опис типу функції обов'язково. наведемо приклад, коли результатом роботи функції буде число подвійної точності.

Приклад 2. Оформити у вигляді функції обчислення f = Ö x + y / z.

У першому прикладі функція зберігалася у вигляді окремого файлу і включалася процедурою # include. Функція може бути включена в один файл з викликає програмою. У цьому випадку процедура # include не потрібно, а сама функція повинна бути оголошена в основній програмі, якщо вона має не цілий тип. Наведемо програму для прикладу 2, оформлену у такий спосіб.

Програма має вигляд:

# Include <stdio.h>

main ()

{Double f, x = 5.5, y = 10.1, z = 20.5, vv () / * оголошені змінні і функція vv * /

f = vv (x, y, z) / * звернення до функції vv * /

printf ("lf", f) / * висновок результату * /

}

/ * Функція * /

double vv (x, y, z)

double x, y, z / * оголошення змінних функції * /

{Double f;

f = sqrt (x) + y / z / * обчислення значення функції * /

return (f) / * повернення обчисленого значення функції * /

}

У мові СІ аргументи функції передаються за значенням, тобто викликана функція отримує тимчасову копію кожного аргументу, а не його адресу. Це означає, що функція не може змінювати оригінальний аргумент на викликала її програмі. Однак це легко зробити, якщо передавати у функцію не змінні, а їх адреси.

Приклад 3. У наведеній нижче програмі вводяться деякі значення змінних а і b, потім у функції izm вони міняються місцями.

# Include <stdio.h>

main ()

{Int a, b;

scanf ("% d% d", & a, & b);

izm (& a, & b) / * звернення до функції izm; аргументами є адреси змінних a і b * /

printf ("% d,% d", a, b) / * висновок на екран змінених значень * /

}

# Include "izm.c" / * включення файлу izm.c з функцією izm * /

/ * Функція * /

izm (a, d); / * аргументи a і b є покажчиками * /

int * a, * b / * * a і * b - значення, на які вказують покажчики * /

{Int c;

c =* a;

* A = * b;

* B = c / * обмін місцями * /

}

Функція izm отримує копію адрес змінних a і b, міняє місцями значення, записані за цими адресами, і передає управління в основну програму. Адреси & a і & b в основній програмі не змінювалися, а от значення, на які вони вказують, помінялися місцями.

Якщо в якості аргументу функції використовується ім'я масиву, то їй передається адресу початку масиву, а самі елементи не копіюються. Функція може змінювати елементи масиву, зрушуючи (індексуванням) від його початку.

Приклад 4. У масиві S поміняти місцями елементи: перший з другим, третій з четвертим і т.д. Оформити цей алгоритм у вигляді функції reverse.

# Include <stdio.h>

main ()

{Int i, j, s [6]; / * опис змінних i, j і масиву s цілого типу * /

for (i = 0; i <6; i + +)

scanf ("% d", & s [i]); / * введення елементів масиву s * /

reverse (s) / * звернення до функції reverse * /

for (i = 0; i <6; i + +)

printf ("% d", s [i]); / * висновок отриманого масиву * /

}

include "reverse.c" / * включення файлу reverse.c з функцією reverse * /

/ * Функція * /

reverse (s)

int s []; / * опис працює в підпрограмі масиву * /

{

int a, i;

for (i = 1; i <5; i + = 2)

{A = s [i]; s [i] = s [i +1]; s [i +1] = a;} / * обмін елементів місцями * /

}

Розглянемо особливості роботи функції з двовимірним масивом. У попередньому прикладі у функції масив був описаний як int s []; для двовимірного масиву а не можна записати a [][]. В описі двовимірного масиву в другій квадратної скобці повинно бути зазначено кількість стовпців, наприклад: a [] [3].

Приклад 5. Збільшити всі елементи масиву а (5,5) у два рази. Оформити цей алгоритм у вигляді підпрограми.

# Include <stdio.h>

main ()

{Int a [5] [5]; / * опис масиву a * /

int i, j; / * оголошення змінних i, j * /

for (i = 0; i <5; i + +)

for (j = 0; j <5; j + +)

scanf ("% d", a [i] [j]); / * введення масиву * /

mas (a) / * звернення до функції mas * /

for (i = 0; i <5; i + +)

for (j = 0; j <5; j + +)

printf ("% d", a [i] [j]); / * висновок отриманого результату * /

}

/ * Функція * /

mas (a)

int a [] [5]; / * опис масиву а * /

{Int i, j / * опис змінних i, j * /

for (i = 0; i <5; i + +)

for (j = 0; j <5; j + +)

a [i] [j] = 2 * a [i] [j]; / * збільшення елементів масиву в 2 рази * /

}

Класи пам'яті

У мові СІ розрізняють чотири основних пам'яті: зовнішню (глобальну), автоматичну (локальну), статичну і реєстрову.

Зовнішні змінні визначені поза будь-якою з функцій, отже, доступні для багатьох з них. Область зовнішньої змінної простягається від точки у вхідному файлі, де вона оголошена, і до кінця файлу. Якщо зовнішня мінлива визначена в іншому файлі, то вступає в силу опис extern (зовнішній). На рис.1 показано, де оголошуються і на що поширюється область дії зовнішніх змінних, якщо програма main і функція, що викликається знаходяться в цьому файлі. На рис. 2 демонструються відмінності, які мають місце, коли main і функція, що викликається знаходяться в різних файлах. У файлі з спричиненої функцією зовнішні змінні будуть доступні після їх опису за допомогою ключового слова extern.

Приклад 5. Оформити у вигляді функції обчислення виразу:

f = a × x 2 + b × x + c;

У наведеній нижче програмі задані змінні оголошені як зовнішні, причому основна програма і функція знаходяться в одному файлі.

# Include <stdio.h>

int a = 5, b = 7, c = 10, x; / * Оголошення зовнішніх змінних a, b, c, x цілого типу * /

main ()

{Int f;

scanf ("% d", & x) / * Введення значення змінної x * /

f = kv (); / * звернення до функції * /

printf ("% d", f) / * висновок на екран значення змінної f * /

}

/ * Функція * /

kv ()

{Int f;

f = a * x * x + b * x + c / * обчислення значення f * /

return (f) / * повертає значення f викликає програмі * /

}

Якщо порівняти цю програму з програмою, наведеною в прикладі 2, то можна виявити дві відмінності:

  1. після імені функції в дужках відсутні аргументи;

  2. у функції не оголошені змінні, з якими працює функція.

Це стало можливим тому, що змінні оголошені зовнішніми, а значить вони відомі всьому файлу, в тому числі і функції.

Зовнішні змінні повинні бути описані до функції main (). Тільки в цьому випадку вони стають зовнішніми (див. рис. 1).

Наведемо програму для цього ж прикладу, розглянувши випадок, коли основна програма і функція розташовані в різних файлах.

# Include <stdio.h>

int a = 5, b = 7, c = 10, x, f / * Оголошення зовнішніх змінних a, b, c, x, f цілого типу * /

main ()

{

scanf ("% d", & x) / * Введення значення змінної x * /

f = kv (); / * звернення до функції * /

printf ("% d", f) / * висновок на екран значення змінної f * /

}

# Include "kv.c" / * включення файлу kv.c функцією kv * /

/ * Функція * /

kv ()

{Extern int a, b, c, x, f;

f = a * x * x + b * x + c / * обчислення значення f * /

return (f) / * повертає значення f викликає програмі * /

}

Як було сказано вище (див. рис. 2), якщо основна програма і функція розташовані в різних файлах, то змінні у функції повинні бути вписані за допомогою ключового слова extern.

Розглянемо тепер статичні змінні. Статичні змінні мають таку ж область дії, як автоматичні, але вони не зникають, коли містить їх функція закінчить свою роботу. Компілятор зберігає їх значення від одного виклику функції до іншого. Статичні змінні оголошуються за допомогою ключового слова static. Можна статичні змінні описати поза будь-якої функції. Це створює зовнішню статичну змінну. Різниця між зовнішньою змінною і зовнішньої статичної змінної полягає в області їх дії. Звичайна зовнішня змінна може використовуватися функціями в будь-якому файлі (за допомогою ключового слова extern), в той час як зовнішня статична змінна може використовуватися лише функціями того ж самого файлу.

Реєстрові змінні ставляться до останнього класу. Ключове слово register вказує, що змінна, про яку йде мова, буде інтенсивно використовуватися. Якщо це можливо, значення таких змінних поміщаються у внутрішні регістри процесора, завдяки чому програма буде більш швидкою.

  1. Завдання

Взяти завдання з лабораторної роботи № 4 і оформити її рішення у вигляді функції наступними способами:

  1. функція розташована після її виклику;

  2. функція розташована після до її виклику;

  3. функція розташована після в іншому файлі;

Література

  1. Подбельський В.В. Мова Cu + +: Навчальний посібник. - М.: Фінанси і статистика, 1995, - 560 с.

  2. Страуструп Б. Мова програмування Сг + +. - М.: Радіо і зв'язок, 1991. - 352 стор

  3. Собоцінскій В.В. Практичний курс Turbo Cu + +. Основи об'ктно-орієнтованого програмування. - М.: Світ, 1993. - 236 с.

  4. Романов В.Ю. Програмування на мові Cu + +. Практичний підхід. - М.: компьтер, 1993. - 160 с.

  5. Уінер Р. Мова турбо Cu. - М.: Світ, 1991. - 384 с.

  6. Юлін В.А., Булатова І.Р. Запрошення до Cu. - Мн.: Вищ. Шк., 1990, - 224 с.

  7. Котлинського Г.П., Галиновський О.І. Програмування на мові Cu. -Мн.: Вищ. Шк., 1991. - 156 с.


Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Лабораторна робота
39.1кб. | скачати


Схожі роботи:
Робота зі структурами в мові програмування Сі
Робота з фінансовими функціями Excel
Програмування на мові Сі
Програмування на мові С
Програмування на мові Асемблер
Програмування на алгоритмічній мові Бейсік
Масиви та покажчики в мові програмування Сі
Оператори циклу у мові програмування Сі
Логічні задачі на мові програмування Prolog
© Усі права захищені
написати до нас