Г. Шилтд - Самоучитель C++ (PDF) (1114887), страница 87
Текст из файла (страница 87)
Для использования массивов в качестве объектов ввода/вывода в программунеобходимо включить заголовок <strstream>.3. Нет.4. extern "С" int counter О;5. Функция преобразования просто превращает объект в значение, совместимоес другим типом данных. Как правило, этим другим типом данных являетсявстроенный тип данных C++.6.
Ключевое слово explicit применяется только к конструкторам. Оно предотвращает неявное преобразование конструкторов.7. Постоянная функция-член не может модифицировать объект, который еевызывает.8. Пространство имен, объявляемое с помощью ключевого слова namespace,предназначено для локализации области видимости имен.9. Ключевое слово mutable дает возможность постоянной функции — членукласса изменять данные, являющиеся членами этого класса.Проверка усвоения материала в целом1.
Да. В ситуациях, в которых неявное преобразование выполняет то же действие, которое в отношении типа параметра конструктора было бы выполненоперегруженным оператором присваивания, перегружать оператор присваивания не нужно.2. Да.3. Новые библиотеки можно размещать в собственных пространствах имен,предотвращая тем самым конфликты имен с кодами других программ. Этаполезная возможность оказывается столь же полезной и в отношении старыхкодов, которые предполагается использовать с новыми библиотеками.ГЛАВА 14Повторение пройденного1. Пространства имен были добавлены в C++ для локализации имен идентификаторов с целью предотвращения конфликтов имен.
Проблема конфлик-ПриложениеВ.Ответынавопросыирешенияупражнений_657тов имен серьезно заявила о себе в последнее время благодаря постоянномуросту числа и объема библиотек классов сторонних фирм.2. Чтобы функцию-член сделать постоянной, необходимо за списком параметров функции указать ключевое слово const. Например:int f ( i n t a) con3t;-3. Нет. Модификатор mutable (модифицируемый) позволяет постоянной функции-члену изменить переменную- член.4.
class X {int a, b;public:X ( i n t i, int j) { a = i, b = j ; }operator i n t ( ) { return a+b; }5. Да, это так.6. Нет. Спецификатор explicit запрещает автоматическое преобразование типаint в тип Demo.Упражнения14.11. Контейнер — это объект, предназначенный для хранения других объектов.Алгоритм — это процедура, предназначенная для работы с содержимым контейнеров. Итератор по отношению к объектам библиотеки стандартных шаблонов действует аналогично указателю.2. Предикаты бывают бинарными и унарными.3. Существуют следующие пять типов итераторов: произвольного доступа, двунаправленный, однонаправленный, ввода и вывода.14.32.
Для любого объекта, хранящегося в векторе, должен быть определен конструктор по умолчанию.3. // Хранение в векторе объектов класса Coord#include <iostream>^include <vector>using namespace std;Самоучитель C++652class Coord {public:int x, y;Coord(} { x = у = 0; }Coord(int a, int b) ( x = а; у = b; }boll operator<(Coord a, Coord b)return (a.x + a.y) < (b.x •+• b.y);boll operator==(Coord a, Coord b)return (a.x + a.y) == (b.x + b.y);int main ()vector<Coord> v;int i;for(i=0; iv.push_back(Coord(i, i)) ;for (1=0; i < v . s i z e ( ) ; icout « v [ i ] . x « "," « v [ i ] .
y « " ";cout « endl;for(1=0; i < v . s i z e d ; i++)v [ i ] . x = v [ i ] . x * 2;for(i=0; K v . s i z e l ) ; i++)cout « v [ i ] . x « "," « v [ i ] . y « " ";return 0;14.42. // Основные операции списка^include <iostream>tinclude <list>using namespace std;int mainOПриложение В- Ответы на вопросы и решения упражненийlist<char> 1st; // создание пустого спискаint i;for{i=0; i<10; i++) lst.push_back( 'A' + i) ;cout « "Размер = " « 1st. size () « endl;list<char>: : iterator p;cout « "Содержимое: ";for(i=0; i<lst.size{) ; i++) {p = 1st. begin (} ;cout « *p;1st .pop_front (} ;lst.push_back(*p) ; // размещение элемента в конце списка}cout « endl;if (list. empty () )cout « "Список пустым не является \п" ;return 0;}После выполнения программы на экране появится следующее:Размер = 1 0Содержимое : ABCDE FGHI JСписок пустым не являетсяВ данной программе элементы поочередно извлекаются из начала списка иразмещаются в его конце. Таким образом список никогда не остается пустым.
В цикле по выводу на экран содержимого списка с помощью функцииsizeQ организуется непрерывный контроль его длины.3. // Слияние двух списков проектовttinclude <iostream>#include <list>^include <cstring>using namespace std;class Project {public:char name [40] ;int days_to_completion;Project (} {strcpy(name, " ");days_to_completion = 0;Самоучитель C++554Project (char *n, int d) {strcpy (name, n) ;days_to_completion = d;void add_days(int i) {days_to_completion += ivoid sub_days ( int i) (days_to_completion -= i;}bool completed () { return !days_to_corapletion; }void report () {cout « name « ": ";cout « days_to_completion;cout « " дней до завершения\п";bool operator< (const Project &a, const Project &b){return a.days_to_completion < b.
days_to__completion;}bool operator> (const Project sa, const Project &b){return a.days_to_completion > b.days__to_completion;}bool operator== (const Project &a, const Project &b)(return a.days_to_completion == b.days_to_completion;}bool operator != (const Project &a, const Project sb){return a.days_to_completion != b. days_to_completion;}int main()(list<Project> proj;list<Project> proj2;proj -push_back (Project ("Разработка компилятора", 35) ) ;proj .push_back (Project ("Разработка электронной таблицы", 190));proj.
push back(Project ("Разработка STL", 1000));Приложение В. Ответы на вопросы и решения упражненийproj2.push_back(Project("Разработка базы данных", 780));proj2.push_back(Project{"Разработка стандартных писем", 50));proj2.push_back(Project("Разработка объектов COM", 300));proj.sort();proj2.sort(} ;proj.merge(proj2); // слияние списковlist<Project>::iterator p = proj.begin();// вывод проектов на экранwhile(p != proj.end()) {p->report(};p-H-;Jreturn 0;14.52. // Ассоциативный список абонентов и телефонных номеров^include <iostream>^include <niap>^include <cstring>using namespace std;class name (char str[20] ;public:nameU { strcpyfstr, "") ; }name (char *s) { strcpy(str, s) ; }char *get() { return str; }// Для объектов типа name следует определить оператор < (меньше)bool operator< (name a, name b)<return strcmp (a.
get {) , b.getO) < 0;}class phonenura {char str[20] ;public:phonenumO { strcmp(str, ""); }phonenum(char *s) { strcpyfstr, s) ; }char *get() { return str; }655656•Самоучитель С++_int main{}{map<name, phonenum> m;// Размещение в ассоциативном списке имен абонентов// и их телефонных номеровm.insert(pair<name, phonenum>(name ("Василий") , phonenuin("541-85-51") ) ) ;m.insert(pair<name, phonenum>(name("Иосиф"), phonenum("550-09-96")));m.insert(pair<name, phonenum>(name ("Михаил"), phonenum("8-3712-41-16-36")));ra.insert (pair<name, phonenum>{пате("Никодим") , phonenum("8-095-967-85-85") ) ) ;// Поиск телефонного номера по заданному имени абонентаchar str[80];cout « "Введите имя; ";cin » str;map<name, phonenum>::iterator p;p = in.
find (name (str) ) ;if (p i= m.end() )cout « "Телефонный номер: " « p->second.get();elsecout « "Такого имени в ассоциативном списке нет\п";return 0;3. Да.14.61. // Сортировка вектора с помощью алгоритма sort^include <iostream>^include <vector>tinclude <cstdlib>^include <algoritm>using namespace std;int main (){vector<char> v;int i;// Создание вектора из случайных символовПриложение В. Ответы на вопросы и решения упражненийfor(i=0;v.push_back('A' + (rand()%26) ) ;cout « "Исходное содержимое: ";for (i=0; i<v. size () ; i++)cout « v[i] « " ";cout « endl « endl;/ / Сортировка вектораsort ( v .
begin ( ) , v . end ( } ) ;cout « "Отсортированное содержимое: ";for(i=0; i<v.size(); i++)cout « v[i] « " ";return 0;2. // Выполнение слияния двух списков с помощью алгоритма merge^include <iostream>^include <list>^include <algoritm>using namespace std;int main ( )<list<char> Istl, Ist2, Ist3(20);int i ;for(i=0; i<10; i+=2) Istl .push_back ( 'A' -t- i) ;for(i=0; i<ll; i+=2} Ist2 .push_back ( 'A' + i) ;cout « "Содержимое списка Istl: ";list<char>: : iterator p = lstl.begin.0 ;while (p != Istl. end () ) {cout « *p;P++;}cout « endl « endl;cout « "Содержимое списка Ist2: ";p = Ist2.
begin (} ;while(p != Ist2.end() ) {cout « *p;P++;}cout « endl « endl;657658____Самоучитель// Теперь выполняем слияние двух списковmerge (Istl. begin ( ) , Istl.endO ,Ist2.begin(), Ist2.end(),Ist3. begin (} ) ;cout « "Содержимое списка после слияния: ";р = Ist3.begin( ) ;while(p != Ist3.end() ) {cout « *p;return 0;14.71. ^include <iostream>#include <string>ttinclude <list>using namespace std;int{itiain()list<string> str;str.push_back(string("один"});str.push_back(string("два"));str.push_back{string("три"));str.push_back(string("четыре"));str.push_back(string("пять"));str.push__back(string ("шесть") ) ;str.push_back(string("семь"));str.push_back(string("восемь"));str.push_back(string("девять"));str.push_back(string("десять"));str.sort(); // сортировка спискаlist<string>::iterator p = str.beginf)while (p != str.endO) {cout « *p « " ";P++;}return 0;С++Приложение В.
Ответы на вопросы и решения упражнений6592. ^include <iostream>^include <string>^include <algorithm>using namespace std;int main(){string str;cout « "Введите строку: ";cin » str;int i = count {str. begin () , str.endf), 'e');cout « i « " символов являются символом е\п";return 0;3. ^include <iostream>^include <string>^include <algorithm>^include <cctype>using namespace std;int main()string str;cout « "Введите строку: ";cin » str;int i = count_if {str.beginO , str.endO, islower) ;cout « i « " символов введено в нижнем регистре\п";return 0;4.
Класс string — это конкретизация класса-шаблона basic_string.Проверка усвоения материала главы 141. Библиотека стандартных шаблонов предоставляет многократно опробованные, отлаженные версии многих традиционных структур данных и алгоритмов. Поскольку контейнеры, входящие в библиотеку стандартных шаблонов,являются классами-шаблонами, их можно использовать для хранения данныхлюбых типов.Самоучитель C++6602. Контейнер — это объект, предназначенный для хранения других объектов.Алгоритм — это процедура, предназначенная для работы с содержимым контейнеров.
Итератор по отношению к объектам библиотеки стандартных шаблонов действует аналогично указателю.._3. ^include <iostream>^include <vector>^include <list>using namespace std;int main {}{vector<int>list<int> 1st;int i;for(i=0;for(i=0;if(!(v[i]%2)) lst.push_back(v[i])list<int>::iterator p = 1st.begin ();while{p != lst.end()) {cout « *p « " ";P++;return 0;4. Строковый тип данных дает возможность обрабатывать строки с помощьюобычных операторов.