
- •Р. Лафоре
- •Глава 1. Общие сведения 32
- •Глава 3. Циклы и ветвления 92
- •Глава 4. Структуры 142
- •Глава 5. Функции 168
- •Глава 6. Объекты и классы 217
- •Глава 7. Массивы и строки 261
- •Глава 8. Перегрузка операций 312
- •Глава 9. Наследование 361
- •Глава 10. Указатели 411
- •Глава 11. Виртуальные функции 476
- •Глава 12. Потоки и файлы 536
- •Глава 13. Многофайловые программы 596
- •Глава 14. Шаблоны и исключения 640
- •Глава 15. Стандартная библиотека шаблонов (stl) 681
- •Глава 16. Разработка объектно-ориентированного по 752
- •Глава 1 «Общие сведения» включает список тем, касающихся uml, с указа- нием их расположения в книге.
- •Глава 1
- •Глава 2
- •Глава 3
- •If внутри циклов
- •If и else во вложенных ветвлениях
- •Глава 4
- •Глава 5 Функции
- •Глава 6
- •Глава 7
- •123456. Россия
- •123456. Россия
- •Глава 8
- •Глава 9
- •Глава 10 Указатели
- •Main() передает адрес переменной var в ptrd в centimize()
- •Centimize() использует этот адрес для доступа к var
- •Глава 11
- •Глава 12
- •Тип:менеджер Фамилия: Александров Номер:1111
- •Тип:Ученый Фамилия: Лебедев Номер:2222
- •Тип:рабочий Фамилия:Шевелев Номер:3333
- •Глава 13
- •Глава 14
- •Много объектов разных классов в памяти Рис. 14.2. Шаблон класса
- •Алгоритмы используют итераторы для работы с объектами контейнеров. Рис. 15.1. Контейнеры, алгоритмы и итераторы
- •Глава 16
- •Глава 1
- •Глава 2
- •Глава 3
- •Глава 4
- •Глава 5
- •Глава 6
- •Глава 7
- •Глава 8
- •Глава 9
- •Глава 10 Ответы на вопросы
- •Глава 11
- •Глава 12 Ответы на вопросы
- •Глава 13 Ответы на вопросы
- •Глава 14 Ответы на вопросы
- •Глава 15 Ответы на вопросы
- •Глава 16
#include
<iostream>
using
namespace std;
#include
<process.h>
//
для exit()
int
main(int
argc, char*argv[])
{
if(argc
!= 2)
{
cerr
<< "\nФормат:filename
\n ";exit(-1);
}
ifstream
infile;
//
создать входной файл
infile.open(argv[1]);
//
и открыть его
if(!infile)
//
проверка наличия ошибок
{
cerr
<< "\nНевозможно
открытие"
<< argv[1];exit(-1);
}
infile.seekg(0,
ios::end);//
перейти на конец файла
//
сообщить номер байта
cout
<< "Размер
"
<< argv[1]
<< "
равен "
<<
infile.tellg();
cout
<< endl;
return
0;
}
а,
б, в, г.
Директивы
#include.
Компилятора
для компилирования .cpp файла и компоновщика
для свя-
зывания с .OBJ
файлами.
а,
б.
Библиотекой
класса.
Истинно.
в,
г.
Истинно.
Ложно.
а,
в, г.
Связывания.
Ложно.
г.
Областью
видимости.
Объектными.
Объявлена,
файле b.
Истинно.
б.
Ложно.
г.
Глава 13 Ответы на вопросы
б.
namespace.
б,
г.
б
и в.
class.
Ложно;
различные функции создаются в процессе
компиляции.
Правильный
ответ:
template<class
Т>
Т
times2(T arg)
{
return
arg*2;
}
б.
Истинно.
Реализацией.
в.
Фиксированный
тип данных, произвольного типа данных.
Хранят
данные.
в.
try,
catch,
throw.
Правильный
ответ:
throw
BoundsError();
Ложно;
они должны быть частью блока повторных
попыток.
г.
Правильный
ответ:
class
X
{
public:
int
xnumber;
char
xname[MAX];
X(int
xd, char*xs)
{
xnumber
= xd;
strcpy(xname,
xs);
}
};
Ложно.
а
и г.
Глава 14 Ответы на вопросы
г.
Истинно.
Независимый,
зависимый.
а.
Ложно.
Дополнительную
информацию.
Решения
упражнений
1.
Верное решение:
//
ex14_1.cpp
//
использование шаблона для нахождения
среднего от значений
//
элементов
массива
#include
<iostream>
using
namespace std;
///////////////////////////////////////////////////////////
template
<class
atype> //
шаблон
функции
atype
avg(atype*array, int
size)
{
atype
total = 0;
for(int
j = 0; j < size; j++) //
среднее
по
массиву
total
+= array[j];
return
(atype)total / size;
}
///////////////////////////////////////////////////////////
int
intArray[] = { 1, 3, 5, 9, 11, 13 };
long
longArray[] = { 1, 3, 5, 9, 11, 13 };
double
double
Array[]
= { 1.0, 3.0, 5.0, 9.0, 11.0, 13.0 };
char
charArray[] = { 1, 3, 5, 9, 11, 13 };
int
main()
{
cout
<< "\navg(intArray)="
<< avg(intArray, 6);
cout
<< "\navg(longArray)="
<< avg(longArray, 6);
cout
<< "\navg(double
Array)="
<< avg(double
Array,
6);
cout
<< "\navg(charArray)="
<< (int)avg(charArray,
6) << endl;
return
0;
}
2.
Верное решение:
//
ex14_2.cpp
//
реализует очередь как шаблон
#include
<iostream>
using
namespace std;
const
int
MAX = 3;
///////////////////////////////////////////////////////////
template
<class
Type>
class
Queue
{
private:
Type
qu[MAX]; //
массив
произвольного
типа
int
head; //
индекс начала очереди (отсюда — удаление
элементов)
int
tail; //
индекс хвоста очереди (сюда вставлять
//
новые элементы)
public:
Queue()
//
конструктор
{
head
=-1; tail
=-1; }
void
put(Type
var)
//
вставка элемента в хвост
{
qu[++tail]
= var;
if(tail
>= MAX - 1)//
зациклить хвост
tail
=-1;
}
Type
get()
//
удаление элемента из начала
{
Type
temp
= qu[++head];
//
сохранение элемента
if(head
>= MAX - 1) //
зациклить
начало
head
=-1;
return
temp;
//
вернуть временное значение
}
};
///////////////////////////////////////////////////////////
int
main()
{
Queue<float>q1;
//
q1 - объект класса Queue<float>
q1.put(1111.1F);
//
занести 3
q1.put(2222.2F);
q1.put(3333.3F);
cout
<< "1:"
<< q1.get()
<< endl;
//
получить 2
cout
<< "2:"
<< q1.get()
<< endl;
q1.put(4444.4F);
//
занести 2
q1.put(5555.5F);
cout
<< "3:"
<< q1.get()
<< endl;
//
получить 1
q1.put(6666.6F);
//
занести 1
cout
<< "4:"
<< q1.get()
<< endl;
//
получить 3
cout
<< "5:"
<< q1.get()
<< endl;
cout
<< "6:"
<< q1.get()
<< endl;
Queue<long>q2;
//
q2 - объект класса Queue<long>
q2.put(123123123L);//
занести 3 (long),
получить 2
q2.put(234234234L);
q2.put(345345345L);
cout
<< "1:"
<< q2.get()
<< endl;
cout
<< "2:"
<< q2.get()
<< endl;
cout
<< "3:"
<< q2.get()
<< endl;
return
0;
}
3.
Верное решение:
//
ex14_3.cpp
//
реализует очередь в виде шаблона
//
использует механизм исключений для
обработки ошибок
#include
<iostream>
using
namespace std;
const
int
MAX = 3;
///////////////////////////////////////////////////////////
template
<class
Type>
class
Queue
{
private:
Type
qu[MAX]; //
массив
произвольного
типа
int
head;
//
индекс начала массива (т. е.,
//
очереди. Отсюда будут удаляться
//
старые элементы)
int
tail;
//
индекс хвоста очереди, куда будут
//
добавляться новые элементы
int
count; //
число элементов в очереди
public:
class
full { }; //
классы исключений
class
empty
{ };
//---------------------------------------------------------
Queue()
//
конструктор
{
head =-1; tail =-1; count = 0; }
void
put(Type
var) //
добавление элемента в конец
{
if(count
>= MAX) //
если очередь заполнена,
throw
full(); //
выдать исключение
qu[++tail]
= var;
//
сохранить элемент
++count;
if(tail
>= MAX
-
1)
//
зациклить хвост
tail
=-1;
}
//---------------------------------------------------------
Type
get()
//
удаление элемента из начала
{
if(count
<= 0)
//
если очередь пуста,
throw
empty();
//
выдать исключение
Type
temp = qu[++head];
//
получить элемент
--count;
if(head
>= MAX
-
1)
//
зациклить начало
head
=-1;
return
temp; //
вернуть элемент
}
};
///////////////////////////////////////////////////////////
int
main()
{
Queue<float>q1;
//
q1 - объект класса Queue<float>
float
data; //
элемент данных, получаемый от пользователя
char
choice = 'p';//
'x',
'p'
или 'g'
do
//
цикл (введите 'x' для выхода)
{
try
//
блок повторных попыток
{
cout
<< "\nВведите
'x' для выхода,
'p'
для добавления,
'g'
для выдачи:";
cin
>>
choice;
if(choice
== 'p')
{
cout
<< "Введите
значение:";
cin
>>
data;
q1.put(data);
}
if(choice
== 'g')
cout
<< "Data
="
<< q1.get()
<< endl;
} //
конец блока повторных попыток
catch(Queue<float>::full)
{
cout
<< "Ошибка:
очередь заполнена."
<< endl;
}
catch(Queue<float>::empty)
{
cout
<< "Ошибка:
очередь пуста."
<< endl;