- •Р. Лафоре
- •Глава 1. Общие сведения 32
- •Глава 3. Циклы и ветвления 92
- •Глава 4. Структуры 142
- •Глава 5. Функции 168
- •Глава 6. Объекты и классы 217
- •Глава 7. Массивы и строки 261
- •Глава 8. Перегрузка операций 312
- •Глава 10. Указатели 411
- •Глава 9. Наследование 361
- •Глава 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
private:
string
title;
float
price;
public:
void
getdata()
{
cout
<< "\nВведите
заголовок:";cin
>>
title;
cout
<< "Введите
цену:";cin
>>
price;
}
void
putdata()const
{
cout
<< "\nЗаголовок:"
<< title;
cout
<< "\nЦена:"
<< price;
}
};
///////////////////////////////////////////////////////////
class
sales
{
private:
enum
{ MONTHS
= 3 };
float
salesArr[MONTHS];
public:
void
getdata();
void
putdata()const;
};
//---------------------------------------------------------
void
sales::getdata()
{
cout
<< "Введите
объем продаж за 3 месяца:\n
";
for(int
j = 0; j < MONTHS; j++)
{
cout
<< "
Месяц "
<< j + 1 << ":";
cin
>>
salesArr[j];
}
}
//---------------------------------------------------------
void
sales::putdata()const
{
for(int
j = 0; j < MONTHS; j++)
{
cout
<< "\nПродажи
за месяц"
<< j
+ 1 << ":";
cout
<< salesArr[j];
}
}
///////////////////////////////////////////////////////////
class
book :private
publication, private
sales
{
private:
int
pages;
public:
void
getdata()
{
publication::getdata();
cout
<< "Введите
число
страниц:";cin
>>
pages;
sales::getdata();
}
void
putdata()const
{
publication::putdata();
cout
<< "\nСтраниц:"
<< pages;
sales::putdata();
}
};
///////////////////////////////////////////////////////////
class
tape :private
publication, private
sales
{
private:
float
time;
public:
void
getdata()
{
publication::getdata();
cout
<< "Введите
время
звучания:";cin
>>
time;
sales::getdata();
}
void
putdata()const
{
publication::putdata();
cout
<< "\nВремя
звучания:"
<< time;
sales::putdata();
}
};
///////////////////////////////////////////////////////////
int
main()
{
book
book1; //
определить
публикации
tape
tape1;
book1.getdata();
//
получить сведения о публикациях
tape1.getdata();
book1.putdata();
//
вывести сведения о публикациях
tape1.putdata();
cout
<< endl;
return
0;
}
Правильный
ответ:
cout
<< &testvar;
4
байта.
в.
Правильный
ответ:
&var,
*var,
var&,
char*
Константа;
переменная.
Правильный
ответ:
float
*ptrtofloat.
Имени.Глава 10 Ответы на вопросы
Правильный
ответ:
*testptr
Указатель
на; значение переменной, на которую
ссылается указатель.
б,
в, г.
Нет.
Адрес &intvar
должен
быть помещен в указатель intptr
до
первого
обращения к переменной.
Любой
тип данных.
Оба
делают одно и то же.
Правильный
ответ:
for(int
j = 0; j < 77; j++)
cout
<< endl
<< *(intarr + j);
Потому
что имя массива — это его адрес, который
нельзя изменять.
Ссылке;
указателю.
а,
г.
Правильный
ответ:
void
func(char*);
Правильный
ответ:
for(int
j = 0; j < 80; j++)
*s2++=*s1++;
б.
Правильный
ответ:
char*revstr(char*);
Правильный
ответ:
char*numptrs[]
= {"Один
",
"Два
",
"Три
"};
а,
в.
Потерям.
Память,
которая больше не используется.
Правильный
ответ:
p->exclu();
Правильный
ответ:
objarr[7].exclu();
а,
в.
Правильный
ответ:
float*arr[8];
б.
0..9
с одного конца; 3..*
— с другого.
б.
Ложно.
а.
Решения
упражнений
1.
Верное решение:
//
ex10_1.cpp
//
находит среднее чисел, введенных
пользователем
#include
<iostream>
using
namespace std;
int
main()
{
float
flarr[100]; //
массив чисел
char
ch; //
выбор пользователя
int
num = 0; //
считает количество
//
введенных чисел
do
{
cout
<< "Введите
число:";//
получить числа
cin
>>*(flarr
+ num++);//
пока не будет ответа 'n'
cout
<< "Продолжать(y/n)?";
cin
>>
ch;
}
while(ch
!= 'n');
float
total = 0.0; //
сумма начинается с 0
for(int
k = 0; k < num; k++) //
прибавлять числа к сумме
total
+= *(flarr + k);
float
average = total / num; //
поиск
и
вывод
среднего
cout
<< "Среднее
равно
"
<< average << endl;
return
0;
}
2.
Верное решение:
//
ex10_2.cpp
//
метод переводит строки в верхний регистр
#include
<iostream>
#include
<cstring>
//
для strcpy() и т.п.
#include
<cctype>
//
для toupper()
using
namespace std;
///////////////////////////////////////////////////////////
class
String
//
пользовательский строковый тип
{
private:
char*str;
//
указатель на строку
public:
String(char*s)
//
конструктор с 1 аргументом
{
int
length
= strlen(s);
//
длина строки из аргумента
str
= new
char[length
+ 1];//
занять память
strcpy(str,
s);
//
скопировать туда строку
}
~String()
//
деструктор
{
delete
str; }
void
display() //
вывести String
{
cout
<< str; }
void
upit(); //
String в
верхний
регистр
};
//---------------------------------------------------------
void
String::upit()
//
каждый символ в верхний регистр
{
char*ptrch
= str; //
указатель на эту строку
while(*ptrch)
//
до пустого символа,
{
*ptrch
= toupper(*ptrch);
//
каждый символ в
//
ВЕРХНИЙ РЕГИСТР
ptrch++;
//
перейти к следующему символу
}
}
///////////////////////////////////////////////////////////
int
main()
{
String
s1 = "My
home is very, very beeg";
cout
<< "\ns1
=";
//
вывести
строку
s1.display();
s1.upit();
//
в ВЕРХНИЙ РЕГИСТР
cout
<< "\ns1
=";
//
вывести строку
s1.display();
cout
<< endl;
return
0;
}
3.
Верное решение:
//
ex10_3.cpp
//
сортировать массив указателей на строку
#include
<iostream>
#include
<cstring>
//
для strcmp() и т.п.
using
namespace std;
const
int
DAYS = 7; //
число указателей на массив
int
main()
{
void
bsort(char**,
int);//
прототип
//
массив указателей на char
char*arrptrs[DAYS]
= {"Воскресенье
",
"Понедельник",
"Вторник
",
"Среда
",
"Четверг
",
"Пятница
",
"Суббота
"
};
cout
<< "\nНеупорядоченный:\n
";
for(int
j = 0; j < DAYS; j++) //
вывести неупорядоченные
//
строки
cout
<< *(arrptrs + j) << endl;
bsort(arrptrs,
DAYS);
//
сортировать строки
cout
<< "\nУпорядоченная:\n
";
for(j
= 0; j < DAYS; j++)
//
вывести сортированные строки
cout
<< *(arrptrs + j) << endl;
return
0;
}
//---------------------------------------------------------
void
bsort(char**pp,
int
n)
//
сортировать указатели на строки
{
void
order(char**,
char**);
//
прототип
int
j, k; //
индексы массива
for(j
= 0; j < n
-
1;
j++) //
внешний цикл
for(k
= j
+
1;
k < n; k++)//
внутренний цикл
order(pp
+
j,
pp
+
k);
//
упорядочить содержимое
//
указателей
}
//---------------------------------------------------------
void
order(char**pp1,
char**pp2)
//
сортирует два указателя
{
//
если в первом строка больше
if(strcmp(*pp1,
*pp2) > 0)//
чем во втором
{
char*tempptr
=*pp1; //
обменять указатели
*pp1
=*pp2;
*pp2
= tempptr;
}
}
4.
Верное решение:
//
ex10_4.cpp
//
связный список включает в себя деструктор
#include
<iostream>
using
namespace std;
///////////////////////////////////////////////////////////
struct
link //
один элемент списка
{
int
data; //
элемент данных
link*next;
//
указатель на следующий элемент
};
///////////////////////////////////////////////////////////
class
linklist //
список
ссылок
{
private:
link*first;
//
указатель на первый элемент
public:
linklist()
//
конструктор без аргументов
{
first = NULL;
} //
первого элемента нет
~linklist();
//
деструктор
void
additem(int
d);//
добавить элемент
void
display(); //
вывести все ссылки
};
//---------------------------------------------------------
void
linklist::additem(int
d) //
добавление элемента данных
{
link*newlink
= new
link; //
создать новую ссылку
newlink->data
= d; //
предоставить ей данные
newlink->next
= first; //
указывает на следующий элемент
first
= newlink; //
теперь первый указывает на него
}
//---------------------------------------------------------
void
linklist::display() //
вывод
всех
ссылок
{
link*current
= first;//
установить указатель на первый элемент
while(current
!= NULL)
//
выход по достижении последнего элемента
{
cout
<< endl
<< current->data;//
вывести
данные
current
= current->next; //
перейти
к
следующей
ссылке
}
}
//---------------------------------------------------------
linklist::~linklist()
//
деструктор
