И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина





НазваниеИ. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина
страница32/32
Дата публикации01.09.2013
Размер1.4 Mb.
ТипЛекция
100-bal.ru > Информатика > Лекция
1   ...   24   25   26   27   28   29   30   31   32

4. Объекты-функции


Некоторые алгоритмы из библиотеки STL требуют функций в качестве параметров. Примером служит алгоритм for_each(), который вызывает функцию, переданную в качестве параметра, для каждого значения в контейнере. В программе 9.3 показано, как с помощью алгоритма for_each() можно вывести все элементы связного списка на экран.
#include

#include

#include
using namespace std;
void PrintElement( int value )

{

cout << "Список содержит значение " << value << '\n';

}
void main()

{

list intList;

for ( int i = 0; i < 100; i++ )

intList.push_back( i );

for_each( intList.begin(), intList.end(), PrintElement );

}

Программа 9.3. Применение алгоритма for_each с параметром-функцией PrintElement.
Понятие функции в STL было обобщено до понятия объекта-функции. Объект-функция – это объект класса, в котором перегружен оператор вызова функции "круглые скобки" (). В ряде случаев удобно заменить функции на объекты-функции. Когда объект-функция используется в качестве функции, то при ее вызове используется оператор "круглые скобки".

Рассмотрим следующее определение класса:
class СBiggerThanThree {

public:

bool operator () (int v)

{ return v > 3; }

};
Если мы создадим объект класса CBiggerThanThree, то каждый раз, когда мы будем ссылаться на него с использованием синтаксиса вызова функции, то будет вызываться перегруженный оператор "круглые скобки". Следующий шаг – обобщить этот класс, добавив к нему конструктор и неизменяемое поле данных, которое устанавливается конструктором:
class CBiggerThan {

public:

CBiggerThan( int x ) : testValue(x) {;}

bool operator () (int val)

{ return val>testValue; }

const int testValue;

};
В результате мы получили функцию общего вида, которая выполняет целочисленное сравнение "больше чем X", где значение X определяется при создании объекта класса. Подобную функцию можно использовать в качестве параметра при вызове некоторых алгоритмов STL, например, алгоритма логического поиска find_if. Ниже приведен пример вызова этого алгоритма для поиска в целочисленном списке первого элемента со значением больше 12:

list::iterator firstBig = find_if( intList.begin(),

intList.end(),

CBiggerThan(12) );

5. Пример программы: инвентаризация


Рассмотрим пример, иллюстрирующий создание и обработку объектов в библиотеке STL. Допустим, что требуется написать складскую программу для учета некоторых приспособлений – виджетов. Это какие-то устройства, различаемые по идентификационным номерам:
class CWidget

{

public:

CWidget(int a) : id(a) {}

CWidget() : id(0) {}

int id;

};
Для упорядочения и сравнения объектов-виджетов предназначены несколько перегруженных операторов:
bool operator== ( const CWidget& lhs, const CWidget& rhs )

{

return lhs.id == rhs.id;

}

bool operator!= ( const CWidget& lhs, const CWidget& rhs )

{

return lhs.id != rhs.id;

}

bool operator< ( const CWidget& lhs, const CWidget& rhs )

{

return lhs.id < rhs.id;

}

bool operator> ( const CWidget& lhs, const CWidget& rhs )

{

return lhs.id > rhs.id;

}
Виджеты в программе описываются двумя списками. В одном хранятся виджеты, имеющиеся в данный момент на складе. Второй список содержит типы виджетов, которые были заказаны покупателями. Первый список содержит собственно виджеты, а второй – идентификационные типы виджетов. Для работы со складом требуются две функции-члена:

  • Order() – обслуживание заказа;

  • Receive() – отслеживание поставок новых виджетов на склад.


class CInventory

{

public:

void Order( int wid ); // обработка заказа виджета типа wid

void Receive( int wid ); // получение виджета типа wid
private:

list on_hand;

list on_order;

};
Когда поступает новый виджет, надо сравнить его идентификационный номер со списком заказанных виджетов. С помощью алгоритма find() можно найти виджет в списке заказов. Если виджет был заказан, то его надо немедленно переслать покупателю. В противном случае он добавляется к списку виджетов на складе.
void CInventory::Receive( int wid )

{

cout << "Пришла партия виджетов типа " << wid << endl;

list::iterator weNeed = find( on_order.begin(),

on_order.end(), wid );

if ( weNeed != on_order.end() )

{

cout << "Отправить " << wid << " покупателю \n";

on_order.erase(weNeed);

}

else

on_hand.push_front( CWidget(wid) );

}
Когда покупатель заказывает новый виджет, мы просматриваем с помощью функции find_if() список имеющихся на складе виджетов, чтобы определить, нельзя ли обслужить заказ немедленно. Для этого определена унарная функция, которая берет в качестве аргумента виджет и определяет, соответствует ли он требуемому типу. Эта функция записывается следующим образом:
class CWidgetTester {

public:

CWidgetTester( int t ) : testid(t) { }

bool operator() ( const CWidget& wid )

{ return wid.id == testid; }

const int testid;

};
Функция, обслуживающая заказы виджетов, выглядит так:
void CInventory::Order( int wid )

{

cout << "Получен заказ на виджеты типа " << wid << endl;

list::iterator weHave = find_if( on_hand.begin(),

on_hand.end(), CWidgetTester(wid) );

if ( weHave != on_hand.end() )

{

cout << "Отправить покупателю виджет " << weHave->id << endl;

on_hand.erase(weHave);

}

else

{

cout << "Заказать виджет типа " << wid << endl;

on_order.push_front(wid);

};

}
Главная функция для тестирования класса CInventory, описывающего состояние склада и заказы, может выглядеть следующим образом:
void main()

{

CInventory inv;

inv.Receive( 5 );

inv.Order( 10 );

inv.Order( 5 );

inv.Receive( 10 );

inv.Receive( 10 );

}

6. Ассоциативные списки


В библиотеке STL реализованы различные АТД. Более сложным по сравнению со связным списком является ассоциативный список map, в котором каждому значению соответствует уникальный ключ. Частным случаем ассоциативного списка является обычный массив, в нем ключом является целочисленный индекс. В ассоциативном списке ключ может быть любого типа, и в общем можно сказать, что ассоциативный список представляет собой список пар ключ/значение. Важное достоинство ассоциативных списков – возможность получения значения по данному ключу. Например, в ассоциативном списке можно хранить имена телефонных абонентов в качестве ключей, а номера телефонов – в качестве значений.

В ассоциативном списке можно хранить только уникальные ключи. Дублирования ключей не допускается. Для создания ассоциативного списка с неуникальными ключами предназначен отдельный класс-контейнер multimap.

Пары ключ/значения в ассоциативном списке хранятся в виде объектов класса pair. Он имеет следующее описание:

template struct pair {

Ktype first; // Ключ

Vtype second; // Значение

// Конструкторы

pair();

pair( const Ktype& k, const Vtype& v );

}

В программе 9.4 приведен пример ассоциативного списка, предназначенного для хранения десяти пар ключ/значения следующего вида:

A 0

B 1

C 2

...

J 9

Пользователь может набрать на клавиатуре ключ (одну из букв от A до J) и программа выведет на экран соответствующее этому ключу значение.

Поиск нужного значения по заданному ключу выполняется с помощью алгоритма find(). Эта функция возвращает итератор, указывающий на соответствующий ключу элемент или на итератор конца списка, если указанный ключ не найден.
#include

#include

using namespace std;
void main()

{

map m;

// Размещение пар буква/число в ассоциативном списке

for ( int i = 0; i < 10; i++ )

m['A'+i] = i;
char ch;

cout << "Введите ключ: ";

cin >> ch;
map::iterator p;
// Поиск значения по заданному ключу

p = m.find( ch );

if ( p != m.end() )

cout << p->second;

else

cout << "Такого ключа в ассоциативном списке нет\n";

}

Программа 9.4. Пример ассоциативного списка.
Как и в других контейнерах STL, в ассоциативных списках можно хранить значения любых типов данных. В программе 9.5 показан пример списка строк, которые проиндексированы тоже строками. Для хранения строк используется строковый класс STL string. В этом классе перегружены операторы (например, +, -, ==), позволяющие записывать операции со строками в более естественном виде (например, сравнивать их с помощью выражения s1==s2, а не strcmp(s1, s2)). Программа 9.5 предназначена для хранения слов вместе с их антонимами (противоположными по смыслу). Для поиска значения по ключу вместо алгоритма find() можно использовать перегруженный в классе map оператор индекса [].
#include

#include

#include

#pragma warning( disable : 4786 )

using namespace std;
void main()

{

map m;

m["yes"] = "no";

m["good"] = "bad";

m["left"] = "right";

m["up"] = "down";
// Поиск антонима по заданному слову

string str;

cout << "Введите слово: ";

cin >> str;
if ( m[str] != "" )

cout << "Антоним: " << m[str];

else

cout << "Такого слова в ассоциативном списке нет\n";

}

Программа 9.5. Ассоциативный список в качестве словаря антонимов.

7. Упражнения


  1. Запустите программы 9.1, 9.2 и 9.3 и убедитесь, что понимаете, как они работают.

  2. Сформируйте программу инвентаризации из приведенных в п.5 фрагментов. В исходный файл необходимо включить заголовочные файлы algorithm и list.

  3. По аналогии с программой 9.5 разработайте ассоциативный список для хранения имен абонентов и их телефонных номеров. Имена и номера телефонов должны вводиться пользователем, а поиск нужного номера должен выполняться по введенному имени абонента.



Литература


  1. Бадд Т. Объектно-ориентированное программирование в действии. СПб.: Питер, 1999. (Введение в ООП, написанное на основе курса лекций, читаемого автором этой книги студентам Орегонского университета. В книге удачно совмещены рассмотрение общих понятий ООП и описание особенностей конкретных языков. Среди рассматриваемых языков программирования есть Си++ и Java.)

  2. Буч Г. Объектно-ориентированное проектирование с примерами применения. М.: Конкорд, 1992. (Подробное описание метода объектно-ориентированного проектирования и примеров его применения для разработки ряда программных систем на нескольких языках программирования. Описаны свойства сложных систем, подробно рассмотрены характеристики классов и объектов, много внимания уделяется проблеме классификации.)

  3. Вирт Н. Алгоритмы + структуры данных = программы. М.: Мир, 1985. (Монография по структурному программированию на основе абстрактных типов данных. Приведено решение задачи о восьми ферзях с помощью структурного подхода.)

  4. Страуструп Б. Язык программирования С++. Вторая редакция. К.:"ДиаСофт", 1993. (Подробное описание языка Си++, написанное разработчиком этого языка. Во вводной части приводится краткое, но достаточно содержательное описание различных парадигм программирования.)

  5. Шилдт Г. Самоучитель Си++. СПб.: BHV–Санкт-Петербург, 2000. (Детальное описание синтаксических особенностей международного стандарта Си++. Книга рассчитана на программистов, знакомых с процедурным языком Си.)


Учебно-методическое издание


А.А. Богуславский, С.М. Соколов

Основы программирования на языке Си++

В 4-х частях.

(для студентов физико-математических факультетов

педагогических институтов)

Компьютерная верстка Богуславский А.А.

Технический редактор Пономарева В.В.

Сдано в набор 12.04.2002 Подписано в печать 16.04.2002

Формат 60х84х1/16 Бумага офсетная

Печ. л. 20,5 Учетно-изд.л. ____ Тираж 100

Лицензия ИД №06076 от 19.10.2001



140410 г.Коломна, Моск.обл., ул.Зеленая, 30. Коломенский государственный педагогический институт.







1   ...   24   25   26   27   28   29   30   31   32

Похожие:

И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconИ. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной...
...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconИ. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной...
...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconПротокол №5 От 12 января 2012 г Заседания кафедры электроники и вычислительной...
Зав кафедрой Хакимова Г. Г. сообщила, что кафедра проводит 2-й Чемпионат по цифровой схемотехнике
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconМетодические рекомендации по подготовке, оформлению, предзащите и...
В. А. Усков, заместитель декана естественно-географического факультета по развитию, доцент кафедры физической географии и методики...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconПроблемы коммуникации
М. Е. Евсевьева (зав кафедрой, доцент А. А. Ветошкин); С. А. Борисова, директор Института международных отношений Ульяновского государственного...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconПрограмма по формированию навыков безопасного поведения на дорогах...
Елена Святославовна Симакова, кандидат педагогических наук, доцент кафедры гуманитарных и естественнонаучных дисциплин Рязанского...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconПрограмма курса по выбору «Орнитология» предназначена для студентов...
Автор программы: к б н., доцент, зав кафедрой биологии и химии Марина Николаевна Харламова
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconРоссийской Федерации Федеральное государственное образовательное...
Петренко И. М., зав кафедрой экономической теории, д-р экон наук профессор Дулин М. П., зав кафедрой педагогики и психологии, д-р...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconРахманкулова Людмила Кузьминична, кандидат филологических наук, доцент...
Автор программы: С. А. Виноградова, кандидат филологических наук, доцент, зав кафедрой английского языка и английской филологии
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconПрограмма по формированию навыков безопасного поведения на дорогах...
...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconЛингвистические проблемы
Московского государственного педагогического института иностранных языков им. М. Тореза (зав кафедрой доцент Ю. А. Денисенко); д-р...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconМгпу учебно-методический комплекс дисциплины
А. В. Прялухина, кандидат психологических наук, доцент, зав кафедрой психологии Российского государственного социального университета...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconРабочая программа по дисциплине «теория экономического анализа»
Рецензент: к с н., доцент, зав кафедрой «Экономики и управления на предприятии и маркетинга» Пятигорского государственного гуманитарно-технологического...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconРабочая программа по дисциплине «международный менеджмент»
Рецензент: к с н., доцент, зав кафедрой «Экономики и управления на предприятии и маркетинга» Пятигорского государственного гуманитарно-технологического...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconМетодические рекомендации по написанию курсовых работ дисциплине
Рецензент: к с н., доцент, зав кафедрой «Экономики и управления на предприятии и маркетинга» Пятигорского государственного гуманитарно-технологического...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconУчебное пособие Краснодар 2008
В. А. Оробец); кафедра паразитологии и ветсанэкспертизы Донского государственного аграрного университета (зав кафедрой, проф., к...


Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
100-bal.ru
Поиск