ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Процедури та функції в мові Паскаль. Сфера дії описів
         

     

    Інформатика, програмування

    Процедури та функції в мові Паскаль. Сфера дії описів

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

    Структура процедури або функції дуже схожа на структуру головної процедури, вона також містить розділ описів і розділу операторів; розділ операторів починається з BEGIN і закінчується END; (але не END. - Як у головної процедури). Єдиним новим оператором для вас буде оператор заголовка, з якого починається будь-яка процедура і функція. Всі процедури і функції записуються в розділі описів будь-якої іншої процедури або функції, у тому числі і головною процедури. Оператор заголовка процедури має вигляд:

    PROCEDURE ім'я (список параметрів);

    Тут ім'я - ім'я процедури (будь-який ідентифікатор), список параметрів може відсутнім, але якщо він є, записується в круглих дужках після імені процедури і має вигляд:

    [VAR] ім'я, ... ім'я: тип;

    ...........................

    [VAR] ім'я, ... ім'я: тип

    Тут ім'я - імена параметрів, кожен параметр може використовуватися усередині процедури як звичайна змінна відповідного типу. Тип - ім'я типу, але не опис користувацького типу; скажімо, опис параметра у вигляді x: 1 .. 5 невірно, але, якщо вище описаний відповідний тип: TYPE MyType = 1 .. 5, то параметр можна описати у вигляді x: MyType. Ключове слово VAR перед описом параметрів означає в даному випадку, що всі параметри до ";" або до ")" -- параметри-змінні, якщо ж VAR відсутній, то параметри є параметрами-значеннями. Сенс цих понять ми розглянемо трохи пізніше.

    Процедури викликаються в інших процедурах і функції за допомогою вже відомого вам оператора виклику:

    ім'я (список аргументів);

    Список аргументів задається в тому і тільки в тому випадку, коли в заголовку процедури задано список параметрів. Аргументи в списку розділяються комами і можуть бути будь-якими виразами, якщо відповідний параметр є параметр-значення, або тільки іменами змінних, якщо відповідний параметр є параметр-змінна. Кількість аргументів завжди має збігатися з кількістю параметрів, і тип аргументу повинен бути таким же, як тип параметра. При виклику процедури значення відповідних аргументів передається параметрах, і таким чином процедура одержує інформацію з викликає процедури або функції. Запишемо програму, що використовує процедуру, яка буде акуратно виводити значення змінної:

    PROCEDURE OutVar (x: Real; Name: Char);

    BEGIN WRITELN ( 'Variable', Name, 'дорівнює ', x); END;

    VAR a, b, c, d: Real;

    BEGIN WRITE ( 'Введіть змінні a, b, c, d'); READ (a, b, c, d);

    OutVar (a, 'a'); OutVar (b, 'b'); OutVar (c, 'c'); OutVar (d, 'd');

    END.

    Наша процедура OutVar отримує з головної процедури дійсне число x і символ Name, але нічого не передає назад. Тепер спробуємо написати процедуру, яка по заданих значень x і y обчислює cos (x) + cos (y) і cos (x)-cos (y):

    PROCEDURE T (x, y: Real; Cplus, Cminus: Real);

    BEGIN Cplus: = cos (x) + cos (y); Cminus: = cos (x)-cos (y); END;

    VAR p, m: Real;

    BEGIN T (1.235,0.645, p, m); WRITELN (p: 7:3, m: 7:3); END.

    Запустимо цю програму і - замість правильного результату 1.129, -0.470 - отримаємо у кращому випадку нулі. Справа в тому, що через параметри-значення (а Cplus і Cminus описані в нашій процедурі як параметри-значення!) неможливо передати інформацію з процедури, але лише у процедуру. Щоб правильно вирішити нашу задачу, слід Cplus і Cminus описати в заголовку як параметри-змінні:

    PROCEDURE T (x, y: Real; VAR Cplus, Cminus: Real);

    BEGIN Cplus: = cos (x) + cos (y); Cminus: = cos (x)-cos (y); END;

    Таким чином, вхідні параметри процедури можуть бути і параметрами-значеннями й параметрами-змінними, а вихідні параметри - тільки параметрами-змінними. Для того, щоб глибше зрозуміти це правило, з'ясуємо, що ж відбувається з параметрами та аргументами при виклику процедури. У момент дзвінка для кожного параметра-значення в спеціальній області пам'яті, званої стеком (за контроль переповнення стека відповідає описана вище опція компілятора Stack cheking), створюється його копія - змінна відповідного типу, якій присвоюється значення аргументу. Надалі процедура працює з цією копією, і при виході з процедури копія знищується. Таким чином, ніякі зміни параметра-значення не можуть бути відомі за межами процедури. По-іншому обробляються параметри-змінні: у процедуру передається не значення аргументу, а його адресу, і вона працює з аргументом (тепер зрозуміло, чому аргумент, що відповідає параметру-змінної, повинен бути тільки ім'ям змінної: він повинен мати адресу). Так що всі зміни параметра на самому справі відбуваються з аргументом і відомі в зухвалому процедурою.

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

    FUNCTION ім'я (список параметрів): тип;

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

    ім'я (список параметрів)

    Покажчик функції може використовуватися як і будь-яке інше вираження того ж типу, але це не оператор, на відміну від оператора виклику. Запишемо приклад функції:

    FUNCTION Na3 (x: LongInt): Boolean;

    ( функція перевіряє, чи x ділиться на 3)

    BEGIN Na3: = x MOD 3 = 0; END;

    VAR L: LongInt;

    BEGIN WRITE ( 'Введіть ціле число'); READ (L);

    WRITE ( 'Число', L);

    IF NOT Na3 (L) THEN WRITE ( 'не');

    WRITELN ( 'ділиться на 3 !');

    END.

    В будь-якої процедури і функції можна використовувати надзвичайно корисну стандартну процедуру Exit без параметрів для негайного виходу в зухвалу процедуру.

    Всі процедури і функції Паскаля є рекурсивними, тобто можуть викликати самі себе, жодних зусиль з боку програміста для цього не потрібно. В якості прикладу запишемо функцію, яка обчислює n!

    FUNCTION Factorial (n: Byte): Real;

    BEGIN IF n <= 1 THEN Factorial: = 1

    ELSE Factorial: = n * Factorial (n-1);

    END;

    Але це, звичайно, дуже погана функція, набагато краще записати цей алгоритм так:

    FUNCTION Factorial (n: Byte): Real;

    VAR i: Byte; f: Real;

    BEGIN f: = 1; FOR i: = 2 TO n DO f: = f * i;

    Factorial: = f;

    END;

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

    Для чого потрібні процедури та функції, коли і як їх слід застосовувати? Багато починаючі програмісти уникають процедур і функцій, стверджуючи, що "без них простіше ". Насправді обійтися без функцій і процедур легко тільки в самих тривіальних програмах. Скільки-небудь складна програма, записана "одним шматком", вимагає при налагодженні від програміста величезних зусиль, які найчастіше все одно пропадають марно. Обов'язково використовуйте у своїх програмах процедури і функції! Гарна програма повинна містити головним чином звернення до процедур і функцій. Звичайно, не існує ніяких жорстких правил, що визначають, коли використовувати функції, а коли ні, але автор цієї книжки може запропонувати кілька нестрогим, але корисних рецептів:

    -- виділяйте в процедуру (функцію) невеликий логічно завершений фрагмент алгоритму;

    -- не змішуйте в одній процедурі (функції) введення-виведення даних та обчислювальні алгоритми;

    -- називайте свої процедури (функції) мнемонічний іменами;

    -- якщо алгоритм, який ви вирішили виділити в процедуру (функцію), все ще занадто складний, оформіть фрагмент цього алгоритму в іншій процедурі (функції);

    -- якщо алгоритм повинен обчислити одне скалярний значення, нехай це буде функція, а не процедура;

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

    -- якщо текст вашої програми не вміщується на одному екрані - подумайте про процедурах;

    -- використовуйте в процедурах та функціях процедуру Exit.

    Список літератури

    Для підготовки даної роботи були використані матеріали з сайту http://elib.albertina.ru/

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status