9.4 ФУНКЦІЇ ЗІ ЗМІННОЮ КІЛЬКІСТЮ ПАРАМЕТРІВ
У мовах С та С++ допускаються функції, кількість параметрів у яких при компіляції не визначена. Крім того, можуть бути невідомими і типи параметрів. Кількість і типи параметрів стають відомими лише в момент виклику функції, коли явно задається список фактичних параметрів. Формат заголовку функції зі змінним переліком параметрів має вигляд:
<тип> <ім’я> (<специфікація_формальних_параметрів, …>)
Проте, кожна функція зі змінним переліком параметрів повинна мати механізм визначення їх кількості або типу. Для цього використовують два основні підходи:
1) Передача у функцію значення реальної кількості фактичних параметрів за допомогою одного або декількох обов’язкових параметрів;
2) Додавання до списку фактичних параметрів спеціального параметру-індикатора з унікальним значенням, яке буде сигналізувати про кінець списку.
Підхід (1) демонструє програма у прикладі 6, яка містить функцію зі змінним списком параметрів, перший з яких визначає кількість фактичних параметрів, що використовуються при викликанні функції:
Приклад 6:
# include <iostream.h>
// Функція сумує значення параметрів типу int
long summa (int k,…)// k – кількість параметрів, що додаються
{int *pik=&k;// вказівник, що звертається до параметрів функції
long total = 0;
for (;k;k--)// поки не вичерпано список параметрів
total+=*(++pik);// відбувається додавання
return total;// повернення результату
}
void main()
{// додаватимуться два параметри
cout<<”\n summa(2, 6, 4)=”<< summa(2,6,4);
// кількість параметрів, які потрібно додати - 6
cout<<”\n summa(6, 1, 2,3,4,5,6)= ”<< summa(6, 1,2,3,4,5,6);
}
Результат виконання:
summa(2,6,4)=10
summa(6,1,2,3,4,5,6)=21Наступний приклад 7 ілюструє 2-й підхід до обмеження змінного списку параметрів. Програма містить функцію для визначення добутку змінної кількості параметрів. Ознакою кінця списку фактичних параметрів служить параметр з нульовим значенням.
Приклад 7:
# include <iostream.h>
double prod (doble arg, … )
{double aa=1.0;// початкове значення добутку
double *prt=&arg;// вказівник на перший елемент у списку
if (*ptr==0) return 0.0;// чи є перший елемент нулем?
for (; *ptr; ptr++) aa*=*ptr;// знаходження добутку
return aa;
}
void main()
{cout<< “\n prod(2.0, 4.0, 3.0, 0.0)=”<< prod (2.0, 4.0, 3.0, 0.0);
cout<<”“\n prod(1.4, 3.0, 0.0, 16.0)=”<< prod (1.4, 3.0, 0.0, 16.0);
cout<<“\n prod(0.0)=”<< prod (0.0);
}
Результат виконання:
рrod (2.0, 4.0, 3.0, 0.0)=24
рrod (1.4, 3.0, 0.0, 16.0)=4.2
рrod (0.0)=0.0
10. Структури
Структура об’єднує логічно зв’язані дані різних типів. При описі структури програміст створює новий тип, на основі базових або інших складових типів, за допомогою якого можна в подальшому описувати реальні об’єкти програми, які зберігатимуться у пам’яті. Склад цих об’єктів визначатиметься типом структури, за допомогою якої вони описуються. Структурний тип даних визначається описом:
struct <ім’я структури> {
<опис елементів>
};
Для виділення пам’яті під структуру необхідно визначити структурну змінну:
<ім’я структури> <ім’я змінної>;
Приклад 1.
struct lab{
int num;
char* name;
};// визначення структурного типу з іменем lab
lab Lаb_10;// опис конкретної структуриз іменем Lab_10.
Можна одночасно визначати структурний тип і описувати за допомогою нього структуру:
Приклад 2.
struct gr // ім’я структурного типу
{ char [10];// елемент структури
int year, nomer;// однотипні елементи структури
} grupa1; // ім’я структурної змінної
Елементи структури називають полями (num, name). Поля можуть бути будь-якого базового чи похідного типу, наприклад, масивом, вказівником, об’єднанням або іншою структурою.
Для звернення до полів структури використовуються уточнені імена через операцію вибору: “крапка” (“.”) при зверненні через ім’я структури і операцію непрямого доступу “->” при зверненні через вказівник.
Приклад 3.
Lab_10.num=10;
lab*ptrlab=&Lab_10;
ptrlab->name=”Структури”;
Ввід/вивід структур виконується поелементно (cin>>Lab_10.num;).
Структури одного типу можна копіювати.
Структури, пам’ять під які виділяється на етапі компіляції, можна ініціалізувати, перераховуючи значення їх елементів:
lab Lab10={10, “Структури”}.
Можна створювати масиви структур.
Приклад 4.
// структура для опису дати
struct date { int day,month,year;};
/* масив з 5-ти структур типу date , кожна з яких складається з 3-х елементів типу int, яким надаються початкові значення*/
date d[5]={ { 1,3,1980}, { 5,1,1990}, {1,1,2002}};
Приклад 5.
Програма, що демонструє використання структур для ведення обліку успішності студентів деякої академічної групи:
#include <conio.h>
#include <iostream.h>
struct Spysok {
char PIB[20];// масив для зберігання прізвищ студентів
char Grup[10];// номер групи
int Ot[3];// масив з трьох оцінок
float S_Bal;// середній бал
} *vid;// вказівник, на структуру
void Vvid(int nom, Spysok *vid)
{ cout << "\n Vvedit vidomosti \n" << (nom+1);
cout << "\n PIB - "; cin>>vid->PIB;
cout << " Nomer Gr - "; cin >> vid->Grup;
float s=0;
for(int i=0;i<3;i++) {
cout << "\n Otsinki - "; cin >> vid->Ot[i];
s+=vid->Ot[i];
}
vid->S_Bal=s/3;
}
void main()
{ struct Spysok Stud[50]; int i, N; char Litera;
clrscr();
cout << "\n Vvedit kilkist studentiv u grupi < 50 "; cin >> N;
for(i=0;i<N;i++) Vvid(i,&Stud[i]);
cout << "\n Spysok studentiv”;
for(i=0;i<N;i++)
cout<<"\n"<<Stud[i].PIB<<endl<<Stud[i].Grup<<endl<<Stud[i].S_Bal;
cout << "\n Poshuk vidomostey pro studentiv za pershoyu\ literoyu prizvyscha\n";
cin >> Litera;
if (islower(Litera)) toupper(Litera);
cout << "\n Vidomosti pro Students:";
int kod_p=0;
for(i=0;i<N;i++)
if(Stud[i].PIB[0]==Litera)
{ kod_p=1;
cout<<”\n"<<Stud[i].PIB
<<endl<<Stud[i].Grup<<endl<<Stud[i].S_Bal;
}
if(kod_p==0) cout << " Takyx nemae!";
getch();
}
Список використаної літератури
1. Подбельский В.В. Язык СИ++: Уч. Пособие. –5-е издание. –М.: Финансы и статистика, 2001. –560 с.
2. Подбельский В. В., Фомин С. С. Программирование на языке Си: Учеб. пособие. –М.:Финансы и статистика, 1998. –600с.
3. Павловская Т.А. С/С++. Программирование на языке высокого уровня: Учебник для ВУЗов. –СПб.:Питер, 2003. –461 с.
4. Павловская Т.А., Щупак Ю.А. С/С++. Практикум. –СПб.: Питер, 2002. –204 с.
5. Дейтел Х., Дейтел П. Как программировать на С++: Пер. с англ. –М.: Бином, 2000. –1024 с.
6. Прата С. Язык программирования С++. Лекции и упражнения. Учебник: Пер. с англ. –СПб.: ДиаСофтЮП, 2003. –1104 с.
7. Либерти Дж. Освой самостоятельно С++. –М.: Вильямс, 2001. –456 с.
8. Культин Н. С/С++ в задачах и примерах. –СПб.:БХВ-Петербург, 2001. –288 с.
... . Механізм переривань забезпечує ефективна взаємодія пристроїв уведення-висновку з мікропроцесором. Переривання цікавлять нас тому, що обробка переривань - це прерогатива програмування на мові асемблера. У високорівневих мовах відсутні засоби роботи з перериваннями на машинному рівні. Переривання звичайно викликаються зовнішніми пристроями. Переривання сигналізує мікропроцесору, щоб він призупинив ...
... функцій. Щоб полегшити їх роботу, фахівці Microsoft розробили бібліотеку MicrosoftFoundationClasses— MFC . Використовуючи готові класи C++, можна набагато швидше і простіше вирішувати багато задач. Бібліотека MFC істотно полегшує програмування в середовищі Windows. Ті, хто володіє достатнім досвідом програмування на C++, можуть допрацьовувати класи або створювати нові, похідні від існуючих. Класи ...
... , що використовується, прагнути включати в рядок до 10 слів; • прагнути не поміщати більш одного-двох параграфів тексту на один екран. 1.4 Розробка цифрового освітнього ресурсу: «Задачник по мові програмування. Циклічні алгоритми» Назва розробки: електронний навчальний посібник з язика програмування. (Додаток 1) Тип розробки: електронний навчальний посібник. Предмет: інформатика; тема: « ...
... мене основним принципам побудови алгоритмів, програм, вибору структур даних. Ця дисципліна вчить мене думати, надає мені практичних знань та досвіду, щоб розробляти модель програми ще до стадії набору програми на заданій мові програмування. Ця дисципліна вчить мене тим основним речам, без яких жоден представник вибраної мною професії не може обійтись у своїй праці, тим основам, які повинні буди зі ...
0 комментариев