Приклад. Нехай ділянка кола, що складається з чотирьох резисторів (див мал) споживає різницю потенціалів U
Нехай ділянка кола, що складається з чотирьох резисторів (див мал) споживає різницю потенціалів U. Визначити силу струму I, яка протікає через дане коло.
Якби був відомий загальний опір R усієї ділянки, то струм в колі ми знайшли б за законом Ома :
Коло складається з двох паралельно з’єднаних ділянок R12 та R34. А з курсу фізики відомо, що:
· опір двох послідовно з’єднаних провідників визначається за формулою:
R12 = R1 + R2; R34 = R3 +R4
· опір двох паралельно з’єднаних провідників визначається за формулою:
Для розв’язання задачі, можна попередньо створити дві незалежні структури:
· структуру, що обчислює опір послідовно з’єднаних провідників
· та структуру, що обчислює опір паралельно з’єднаних провідників.
Тоді, використовуючи першу структуру, можна знайти опори R12 та R34, а використовуючи другу – опір R.
#include<iostream.h>
#include<conio.h>
//---------------------------------------------
float succesive(float r1,float r2)
{ //Опис функції succesive
float r; r = r1 + r2;
return r;
}
//---------------------------------------------
float parallel(float r1,float r2)
{ //Опис функції parallel
float r; r = r1*r2/(r1+r2);
return r;
}
void main() //Головна програма
{
clrscr();
float R1,R2,R3,R4;
cout<<"R1 = ";cin>>R1;
cout<<"R2 = ";cin>>R2;
cout<<"R3 = ";cin>>R3;
cout<<"R4 = ";cin>>R4;
float R;
R = parallel(succesive(R1,R2),succesive(R3,R4));
cout<<"R = "<<R<<endl; getch();
}
Другий варіант цієї програми:
#include<iostream.h>
#include<conio.h>
float succesive(float,float); //Оголошення функції succesive
float parallel(float,float); // Оголошення функції parallel
void main() //Головна програма
{
clrscr();
float R1,R2,R3,R4;
cout<<"R1 = ";cin>>R1;
cout<<"R2 = ";cin>>R2;
cout<<"R3 = ";cin>>R3;
cout<<"R4 = ";cin>>R4;
float R;
R = parallel(succesive(R1,R2),succesive(R3,R4));
cout<<"R = "<<R<<endl; getch();
}
//---------------------------------------------
float succesive(float r1,float r2) //Опис функції succesive
{
float r; r = r1 + r2;
return r;
}
//---------------------------------------------
float parallel(float r1,float r2) //Опис функції parallel
{
float r; r = r1*r2/(r1+r2);
return r;
}
Отже, як було сказано в мові С++ опис функцій може здійснюватися як перед головною програмою (перший варіант), так і після головної програми (другий варіант). Але якщо ми описуємо деяку функцію після головної програми, необхідно все ж таки перед головною програмою оголосити цю функцію.
2. Формальні та фактичні параметри.
При виклику функції їй за допомогою аргументів (формальних параметрів) можуть бути передані деякі значення (фактичні параметри), використовувані під час виконання функції.
Список формальних параметрів забезпечують взаємодію процедури з головною програмою, а саме: передачу значень з головної програми в процедуру.
Значення, які отримує підпрограма від головної програми називають фактичними параметрами.
Функція може повертати деяке (одне !) значення. Це значення і є результат виконання функції, який при виконанні програми підставляється в точку виклику функції, де б цей виклик не зустрівся. Допускається також використовувати функції що не мають аргументів і функції що не повертають ніяких значень. Дія таких функцій може полягати, наприклад, в зміні значень деяких змінних, виводі на друк деяких текстів і тому подібне.
Приклад:
double line(double x, double a,double b)
{
return (a*x+b);
}
double /* тип результату (функції)
line /* назва функції
(double x, /* тип та ім'я першого параметра
double a, /* тип та ім'я другого параметра
double b) /* тип та ім'я третього параметра
{ /* тіло функції
return (a*x+b); /* значення, котре виробляє функція
}
Для реалізації деяких процедур в мові Сі використовуються функції, які не повертають жодного значення. В полі результату такої функції рекомендується писати ключове слово void, котре якраз і вказує, що функція не виробляє ніякого значення.
Приклад:
void errmsg(char *s)
{
с<<"*** ПОМИЛКА ***\n"<<s;
}
Ця функція друкує повідомлення про помилку, текст повідомлення задається аргументом. Виклик цієї функції може мати, наприклад, такий вигляд:
errmsg("Ділення на нуль!");
Виклик функції - це вираз, значенням якого є результат, що виробляється функцією. Якщо вираз функції використовується як окремий оператор (тобто не у виразі), то значення, котре повертає функція втрачається. Якщо функція описана з типом void (як така, що не повертає значення) використовується в деякому виразі, то її значення вважається невизначеним.
Існує два способи виклику функцій:
<ім'я функцїї> (<список фактичних параметрів>)
або
(*<вказівник на функцію>)(<список фактичних параметрів>)
Вказівником на функцію є деякий вираз, значенням якого є адреса цієї функції.
В мовах програмування звичайно використовують два способи передачі переметрів: за значенням і за посиланням. При передачі параметра по значенню аргументом може бути довільний вираз, значення якого і передається в підпрограму. При передачі параметра по посиланню значенням може бути тільки змінна (як проста так і структурована).
В цьому випадку в підпрограму передається не значення змінної, а її адреса, для того, щоб в цю адресу можна було б записати нове значення і тим самим змінити значення змінної, котра передавалась в якості параметра.
В різних мовах використовуються різні рішення. В одних всі аргументи передаються по посиланню; в інших використовуються обидва механізми, і тоді в списку параметрів вказуються спеціальні ключові слова, котрі показують, що значення аргументу може змінюватись підпрограмою.
В мові С++ використано третє рішення, тобто всі аргументи передаються по значенню, а для передачі аргументу по посиланню в підпрограму передається адреса потрібної змінної з допомогою операції отримання адреси об'єкта (&).
Вказівники дозволяють нам в одній змінній зберігати адрес іншої змінної. Для роботи з вказівниками використовуються дві операції: отримання адреси змінної (&) та вибір значення змінної з використанням вказівника (*). Щоб вказати компілятору те, що зміна є вказівником на значення деякого типу, перед іменем змінної ставлять зірочку (*).
Приклад:
char ch; | Тут ch- значення символьного типу, |
char *cptr; | cptr - вказівник на значення символьного типу, |
int val,*ivptr,n; | vali n - значення цілого типу, а *ivptr - вказівник на значення цілого типу; |
double r,*rp; | r- змінна дійсного типу подвійної точності, а *rp - вказівник на змінну такого ж типу. |
При виклику функції локальним змінним відводиться пам'ять в стеку і проводиться їх ініціалізація. Управління передається першому операторові тіла функції і починається виконання функції, яке продовжується до тих пір, поки не зустрінеться оператор return або останній оператор тіла функції. Управління при цьому повертається в точку, наступну за точкою виклику, а локальні змінні стають недоступними. При новому виклику функції для локальних змінних пам'ять розподіляється знов, і тому старі значення локальних змінних втрачаються.
Параметри функції передаються за значенням і можуть розглядатися як локальні змінні, для яких виділяється пам'ять при виклику функції і проводиться ініціалізація значеннями фактичних параметрів. При виході з функції значення цих змінних втрачаються. Оскільки передача параметрів відбувається за значенням, в тілі функції не можна змінити значення змінних в зухвалій функції, що є фактичними параметрами. Проте, якщо як параметр передати покажчик на деяку змінну, то використовуючи операцію реадресації можна змінити значення цієї змінної.
П р и к л а д:
/* Неправильне використання параметрів */ void change (int x, int y) { int k=x; x=y; y=k; }У даній функції значення змінних x і у, що є формальними параметрами, міняються місцями, але оскільки ці змінні існують тільки усередині функції change, значення фактичних параметрів, використовуваних при виклику функції, залишаться незмінними. Для того, щоб мінялися місцями значення фактичних аргументів можна використовувати функцію приведену в наступному прикладі.
П р и к л а д:
/* Правильне використання параметрів */
void change (int *x, int *y) { int k=*x; *x=*y; *y=k; }При виклику такої функції як фактичні параметри повинні бути використані не значення змінних, а їх адреси change (&а,&b);
Використання вказівників можна проілюструвати таким прикладом:
Дата добавления: 2015-08-26; просмотров: 714;