Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 7.9






 

#include < fstream.h>

#include < str1ng.h>

#include < stdlib.h>

#include < iomanip.h>

 

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 - Cведения по году рождения“ < < 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 < n record; 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 < n record; 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 < class Туре> тип имя ([список параметров])

{

/* тело функции */

}

 

Идентификатор Туре, задающий так называемый параметризованный тип, может использоваться как в остальной части заголовка, так и в теле функции. Парамет­ризованный тип - это всего лишь фиктивное имя, которое компилятор автомати­чески заменит именем реального типа данных при создании конкретной версии функции. В общем случае шаблон функции может содержать несколько парамет­ризованных типов < class Typel. class Type2. class ТуреЗ,... >.

Процесс создания конкретной версии функции называется инстанцированием шаблона или созданием экземпляра функции. Возможны два способа инстанцирования шаблона: а) явный, когда объявляется заголовок функции, в котором все параметризованные типы заменены на конкретные типы, известные в этот момент в программе, б) неявный, когда создание экземпляра функции происходит автома­тически, если встречается фактический вызов функции.

Шаблоны тоже можно перегружать, причем как шаблонами, так и обыч­ными функциями.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.