- •Міністерство освіти і науки, молоді та спорту України Технічний коледж національного університету водного господарства та природокористування Лабораторна робота № 10
- •10.1. Мета роботи
- •10.2. Теоретичні відомості
- •If(s[I]) return &s[I]; /* повертає адреса першого пробілу */
- •Int func(int a, float b, char* с);
- •Int func(int, float, char*);
- •Int *sqr(int *I) /* Прототип функції */
- •Int *sqr(int *I) /* Оголошення функції */
- •Int sqr(int *I) /* Прототип функції */
- •Void line_ (void); /* прототип функції /
- •Void line_(void)
- •Void f(void);
- •Void f(void)
- •10.3. Програма роботи
- •10.4. Контрольні питання Які типи циклів Ви можете назвати?
If(s[I]) return &s[I]; /* повертає адреса першого пробілу */
else return NULL; /* повернення нульового покажчика */
}
Коли функція не повертає ніякого значення, вона повинна бути описана як функція типу void (порожня).
Ви не зобов'язані описувати функцію типу void, тоді вона по умовчанню буде мати тип int і не повертати ніякого значення. Це викликає попереджуюче повідомлення компілятора, але не буде перешкодою для компіляції. Однак оголошення типу що повертається значення функції є гарним правилом.
Прототипи функцій
Особливістю стандарту ANSI мови С є те, що для створення правильного машинного коду функції йому необхідно повідомити до першого виклику тип що повертається результату, а також кількість і типи аргументів. Для цієї цілі в С використовується поняття прототипу функції. Прототип функції задається в такий спосіб: тип <ім'я функції>(список параметрів);
Використання прототипу функції є оголошенням функції (declaration). Частіше усього прототип функції цілком збігається з заголовком в описі функції, хоча це і не завжди так. При оголошенні функції компілятору важливо знати ім'я функції, кількість і тип параметрів і тип значення що повертається. При цьому імена формальних параметрів функції не грають ніякої ролі й ігноруються компілятором. Тому прототип функції може виглядати або так:
Int func(int a, float b, char* с);
або так:
Int func(int, float, char*);
Два цих оголошення абсолютно рівноправні.
Розглянемо приклад.
# include <stdio. h>
float sqr(float a); /* це прототип функції, оголошення функції */
main()
{
float b;
b=5.2;
printf(“Квадрат числа %f дорівнює %f", b, sqr(b)):
}
float sqr(float a) /* Це опис функції */
{
return a*a;
}
Наступні два приклади використання функцій викликають повідомлення про помилку при компіляції. У першому прикладі перешкодою для компіляції буде невідповідність значення що повертається оголошеному типу функції. Мови С и C++ автоматично перетворять дані до іншого типу, але тільки тоді, коли це можливо. Цілий тип не може бути автоматично перетвреним в покажчик на ціле.
#include <stdio.h>
/* Приклад неправильний */
Int *sqr(int *I) /* Прототип функції */
main( )
{
int i;
sqr(&x);
}
Int *sqr(int *I) /* Оголошення функції */
{
return *i=(*i)*(*i);
}
#include <stdio.h>
/*Приклад неправильний */
Int sqr(int *I) /* Прототип функції */
main()
{
int x=10:
sqr(&x, 10); /* Невідповідність кількості аргументів */
}
int sqr(int *i)
{
*i=(*i)*(*i);
}
Звернемо увагу на те, що якщо ми виправимо ці програми, то функція буде повертати квадрат числа i не через значення функції, а через параметр функції.
Якщо функція не має аргументів, то при оголошенні прототипу такої функції слід замість аргументів писати ключове слово void. Це повинно стосуватися і функції main().Її оголошення повинно мати вигляд void main(void) або main(void).
#include <stdio.h>
Void line_ (void); /* прототип функції /
main (void)
{
line_();
}
Void line_(void)
{
int i:
for(i=0;i<80;i++) printf("-“);
}
Заголовні файли мови С містять прототипи стандартних функцій, що відносяться до цього заголовного файла. Прикладами таких заголовних файлів є файли stdio.h, string.h, conio.h і ін.
Область дії й область видимості
Область дії (scope rules) перемінної - це правила, що встановлюють, які дані доступні з даного місця програми.
У мові С кожна функція - це окремий блок програми. Потрапити в тіло функції не можна інакше, як через виклик даної функції. Зокрема, не можна оператором локального переходу goto перейти в cepeдину іншої функції.
З погляду області дії перемінних розрізняють три типи перемінних: глобальні, локальні і формальні параметри. Правила області дії визначають, де кожна з них може застосовуватися.
Локальні перемінні - це перемінні, оголошені усередині блока, зокрема усередині функції. Мова С підтримує просте правило: перемінна може бути оголошена усередині будь-якого блока програми. Локальна перемінна доступна усередині блока, у якому вона оголошена. Згадаємо що блок відчиняється фігурною дужкою і закривається фігурною дужкою. Область дії локальної перемінної - блок.
Локальна перемінна існує поки виконується блок, у котрому ця перемінна оголошена. При виході з блока ця перемінна (і її значення) втрачається.
#include < stdio.h>