Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
КН
Кафедра:
Не вказано

Інформація про роботу

Рік:
2013
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Комп’ютерні системи

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ Національний університет “Львівська політехніка” Кафедра САП  Звіт до лабораторної роботи № 1 РЕКУРСИВНІ ФУНКЦІЇ, ВКАЗІВНИКИ НА ФУНКЦІЇ В АЛГОРИТМІЧНІЙ МОВІ С з курсу “Проблемно-орієнтоване програмування” для студентів спеціальності "Комп’ютерні системи проектування" Львів 2013 ТЕОРЕТИЧНІ ВІДОМОСТІ Рекурсивні функції Рекурсивним називається такий спосіб реалізації функції., коли функція може звертатися сама до себе. У рекурсивній функції повинні виконуватися наступні правила: - при кожному виклику такої функції в неї повинні передаватися модифіковані дані; - на якомусь етапі повинен бути припинений подальший виклик даної функції. Рекурсивний процес повинен крок за кроком так спрощувати завдання, щоб зрештою для нього з'явилося не рекурсивне рішення. Тут легко припуститися помилки, що полягає в тім, що функція буде послідовно викликати саму себе нескінченно довго; після завершення кожного виклику рекурсивної функції в точку повернення повинен передаватися деякий результат для подальшого використання. Вказівники на функції. Масиви вказівників на функції У мові С сама функція не може бути значенням змінної, але можна визначити вказівник на функцію. З ним уже можна оперувати, як зі змінною: передавати його іншим функціям, поміщати в масиви й т.д. Оголошення виду: int ( *fl ) ( ); говорить про те, що fl - вказівник на функцію, що повертає ціле значення. Перша пара дужок необхідна, без них int *f 1 ( ); /* це не вказівник на функцію */ означало б, що fl -функція, що повертає вказівник на ціле значення. Після оголошення вказівник а на функцію в програмі можна використовувати оператори виду: y = ( *fl ) ( . . .); або y = f1(...); Вказівник на функцію - такий тип змінної, котрій можна присвоювати адреси точки входу у функцію, тобто адресу першої виконуваної команди. Ця змінна надалі може використовуватися для виклику функції замість її імені. Визначення вказівника на функцію має наступний загальний вид: тип_результату (* ім'я вказівника на функцію) (список типів параметрів) ; Наприклад: double (*fd) ( int, int ); /* fd - покажчик на функцію, що повертає результат типу double і приймає два параметри типу int. */ int ( *find ) ( int, float * ) ; / find - вказівник на функцію. Функція повертає результат типу int і приймає два параметри: число типу int і вказівник на число типу float.*/ char* ( * comp ) ( const char *sl, const char *s2 ) ; /* comp - вказівник на функцію, що повертає результат вказівник на char і приймаючу як параметри два вказівники на char.*/ При визначенні вказівника на функцію дозволяється одночасно із вказівкою типу параметрів задавати і їхні імена. Нехай є прототипи функцій піднесення числа типу int у третю, п'яту і сьому степінь і які повертають результат типу int (звичайно, все це легко реалізувати й в одній функції): int f3 ( int ); int f5 ( int ) ; int f7 ( int ); і є вказівник на функцію наведеного вище виду: int ( *fst ) ( int ); Тоді оператор fst = f3; присвоїть вказівнику fst адресу входу у функцію f3, fst = f5; - адресу входу у функцію f5 і, відповідно, fst = f7; - адресу входу у функцію f7. Після цього викликати кожну з функцій (f3, f5, f7) можна будь-яким оператором, записаним нижче (наприклад, f3): f3 ( a ); // звертання до функції, використовуючи її ім'я. (*fst ) ( а ); // виклик функції через вказівник. fst( a ); // виклик функції також через вказівник. Останній варіант також правильний, тому що f3, fst - це адреси входу у функцію. Однак виклик ( *fst ) ( а ) явно показує, що використовується вказівник на функцію, а не викликається функція з ім'ям fst, якщо бачити тільки один оператор fst ( a );. У ряді задач, що використовують математичні методи, вказівник на функцію необхідно передавати як параметр у функцію, що реалізує відповідний метод. Наприклад, для обчислення значення інтеграла треба знати ім'я функції, у якій обчислюється значення підінтегрального виразу; для пошуку екстремума деякої цільової функції треба знати ім'я цієї функції і т.п. Вказівники типу near і far Як і звичайні вказівники на дані, вказівники на функцію можуть мати тип near, far або huge. Вказівник типу near займає в пам’яті 2 байти, вказівники far і huge – 4 байти. Тип вказівника на функцію, який встановлюється по замовчуванню, залежить від моделі пам’яті. В моделях пам’яті COMPACT, TINY i SMALL по замовчуванню вказівник на функцію має тип near і задає тільки зміщення до точки входу в функцію відносно значення в сегментному регістрі CS. При прямому чи побічному виклику функції через near-вказівник використовується машинна команда “близького” прямого чи побічного виклику процедури, яка пов’язана з установкою нового значення тільки у регістрі IP. Для моделей пам’яті MEDIUM, LARGE і HUGE по замовчуванню вказівник на функцію займає 4 байти і включає як зміщення, так і адресу сегмента точки входу у функцію. При прямому чи побічному виклику функції через far-вказівник на функцію використовується машинна команда далекого прямого чи побічного виклику процедури, яка пов’язана як з установкою нового значення в регістрі IP, так і зі зміною значення сегментного регістра CS. В моделі пам’яті HUGE при вході у функцію додатково встановлюється значення регістра DS, яке відповідає сегменту даних функції. Пряма адресація при виклику процедури відповідає виклику функції через вказівник-константу. Побічний виклик використовується при виклику функції по вказівнику-змінній. Прийнятий по замовчування формат вказівника на функцію може бути відмінений явним заданням типу функції з використанням ключових слів near, far або huge. Наприклад: int far function (int, int); / * Прототип функції */ . . . int far function (int a, int b) /* Визначення функції */ { Тіло функції} Синтаксис мови С вимагає співпадіння модифікаторів типу функції як в прототипі, так і у визначенні функції. Компілятор завжди трактує першу частину визначення як тип значення, яке повертає функція, а наступне слово, як модифікатор. Тому, наприклад, char far *far str_func (void); є прототипом far-функції, яка повертає значення вказівника типу char far *. Сама функція є far-функцією. Опис, наведений нижче, визначає вказівник func_ptr на far-функцію (можна сказати, і far-вказівник на функцію), яка приймає два аргументи типу int і повертає значення типу char far *: char far *far (*func_ptr) (int, int); При порівнянні far-вказівників операціями <, >, <=, >= використовуються тільки зміщення (вказівники порівнюються як числа типу int), а операціями != і == far-вказівники порівнюються як числа типу long. Нехай, наприклад, оголошені наступні вказівники: void far* vp1=0xb8000000; void far* vp2=0xb4004000; void far* vp3=0xb0008000; Дані вказівника вказують на одну і ту ж фізичну адресу, але операція порівняння == дає результат FALSE, != дає значення TRUE. При нарощенні вказівника типу far використовується тільки його зміщення. Якщо при цьому результат не вміщається у зміщення, то відбувається відрізання старших розрядів результату. Наприклад, після додавання до vp3 числа 8000h зміщення вказівника стане рівним b000:0000h. Таким чином, за межі сегмента вийти неможливо. ЗАВДАННЯ ДО ЛАБОРАТОРНОЇ РОБОТИ(1 варіант) Не оголошуючи масиву, ввести групу даних і вивести їх у зворотному порядку. КОД ПРОГРАМИ #include <iostream.h> #include <stdio.h> #include <conio.h> void rec() { int i; scanf("%d",&i); if (i != 0) rec(); else printf("vyid\n"); printf("%d\n",i); } int main() { clrscr(); rec(); getсh(); return 0; } РЕЗУЛЬТАТ ВИКОНАННЯ 
Антиботан аватар за замовчуванням

29.09.2014 20:09-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!