лістинг 6.6 | Хід роботи | Приклад 7.1. Передача в функцію параметрів стандартних типів | лістинг 7.1 | Приклад 7.2. Передача в функцію імені функції | лістинг 7.3 | лістинг 7.5 | лістинг 7.6 | лістинг 7.7 | Приклад 7.8. Многофайловий проект - форматування тексту |

загрузка...
загрузка...
На головну

лістинг 7.9

  1. Гнучка оцінка акцій, які не включені в лістинг
  2. лістинг 1.1
  3. лістинг 1.3
  4. лістинг 1.4
  5. лістинг 1.5
  6. лістинг 1.8
  7. лістинг 10.1

#include

#include

#include

#include

const int l name = 30, l year = 5, l pay = 10, l buf = l name + 1 year + l pay;

struct Man

{

int birth_year;

char name [l name + 1];

float pay;

int read dbase (const char * filename, Man dbase [], const int l dbase, int & n record);

void printtMan m);

void select (Man dbase []. const int n record. const int year);

void select (Man dbase []. const int n ecord. const float pay);

int main ()

{

const int l dbase = 100;

Man dbase [l dbase];

int n record = 0;

if (read dbase ( "txt6.txt" .dbase.1 dbase.n record)! = 0) return 1;

int option;

int year;

float pay;

do

{

cout << "---------------------" << endl;

cout << "1 - Відомості за роком народження" << endl;

cout << "2 - Відомості по окладу" << endl;

cout << "3 - вихід" << endl;

cin >> option;

switch (option)

{

Case1: << "Введіть рік" >> cin >> year;

select (dbase.n_record.year); break;

Case2: << "Введіть оклад" >> cin >> pay;

select (dbase.n_record.pay);

break;

Case 3: return 0;

default: cout << "Треба вводити число від 1 до 3" << endl;

}

}

while (true);

return 0;

}

Void select (man dbase [], const int n record, const int year)

{

Cout << "Введення відомостей за роком народження" << endl;

bool success = false;

for (int i = 0; i

if (dbase [i], birth year> = year)

{

Print (dbase [i]);

success = true;

}

if (! success) Cout << "Таких співробітників немає" << endl;

Void select (man dbase [], const int n_record, const float pay)

{

cout << "Введення відомостей по окладу" << endl;

bool success = false;

for (int i = 0; i

if (dbase [i], birth pay> = pay)

{

print (dbase [i]);

success = true;

}

if (! success) cout << "Таких співробітників немає" << endl;

Void print (Man m)

{

cout.setf (iod :: fixed);

cout.precision (2);

cout «setw (40)« m.name « ''« m.birth_year « ''« m.pay «endl;

}

int read dbase (const char * filename. Man dbase []. const int l dbase. int & n record) {

char buf [l buf +1];

if stream fin (filename. ios :: in | ios: mocreate);

if (! fin)

{

cout «" Ні файлу "« filename «endl;

return 1;

}

int i = 0;

while "(fin.getline (buf, 1 buf))

{

strncpy (dbase [i] name, buf, l name);

dbase [i] .name [l name] = '\ 0';

dbase [i] .birth year = atoi (& buf [l name]);

dbase [i] .pay = atof (& buf [l_name + l year]);

i ++;

if (i> l dbase)

{

cout «" Занадто довгий файл ";

return 2;

}

}

n record = i;

fin.close ();

return 0;

}

Правила опису перевантажених функцій:

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

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

3. Функції не можуть бути перевантажені, якщо опис їх параметрів відрізняється тільки модифікатором const або використанням посилання.

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

Шаблон функції визначається наступним чином:

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

{

/ * Тіло функції * /

}

Ідентифікатор Туре, що задає так званий параметризрвані тип, може використовуватися як в іншій частині заголовка, так і в тілі функції. Параметризрвані тип - це всього лише фіктивне ім'я, яке компілятор автоматично замінить ім'ям реального типу даних при створенні конкретної версії функції. У загальному випадку шаблон функції може містити кілька параметрезованих типів .

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

Шаблони теж можна перевантажувати, причому як шаблонами, так і звичайними функціями.



лістинг 7.8 | лістинг 7.10
загрузка...
© um.co.ua - учбові матеріали та реферати