Основы программирования» (гр. 413

advertisement
ВОПРОСЫ
к экзамену по дисциплинам
«Основы программирования» для студентов направления ФИИТ и
«Информатика» для студентов специальности ИБТС
Лектор – доцент Жуков С.Н
1. Базовые и составные типы.
1. Объявите переменные согласно перечисленным ниже описаниям.
а. Целочисленная переменная short, имеющая значение 80.
б. Целочисленная переменная unsigned int, имеющая значение 42110.
в. Целочисленная переменная, имеющая значение 3 000 000 000.
2. Являются ли следующие два оператора C++ эквивалентными и почему?
char grade = 65;
char grade = 'A';
3. Как в C++ определить, какой символ представляется кодом 88? Сделайте это, по крайней мере, двумя
способами.
4. Присваивание значения типа long переменной типа float может привести к ошибке округления. А что
произойдет, если присвоить значение long переменной double? И что будет, если присвоить значение long long
переменной double?
5. Вычислите следующие выражения:
а. 8 * 9 + 2
б. 6 * 3 / 4
в. 3 / 4 * 6
г. 6.0 * 3 / 4
д. 15 % 4
6. Предположим, что х1 и х2 являются переменными типа double, которые вы хотите просуммировать как целые
числа, а полученный результат присвоить целочисленной переменной. Напишите для этого необходимый
оператор C++. Что если вы хотите просуммировать их как значения double, а затем преобразовать результат в
int?
7. Каким будет тип переменной в каждом из следующих объявлений?
a. auto cars = 15;
б. auto iou = 150.37f;
в. auto level = 'В';
г. auto crat = U'/U00002155' ;
д. auto fract = 8.25f/2.5;
8. Объявите следующие объекты данных и инициализируйте их:
а. actor — массив из 30 элементов char.
б. betsie — массив из 100 элементов short.
в. chuck — массив из 13 элементов float.
г. dipsea — массив из 64 элементов long double.
9. Объявите следующие объекты данных, используя шаблонный класс array вместо встроенных массивов и
инициализируйте их:
а. actor — массив из 30 элементов char.
б. betsie — массив из 100 элементов short.
в. chuck — массив из 13 элементов float.
г. dipsea — массив из 64 элементов long double.
10. Объявите массив char и инициализируйте его строкой "cheeseburger".
11. Объявите объект string и инициализируйте его строкой "Waldorf Salad".
12. Разработайте объявление структуры, описывающей рыбу. Структура должна включать вид, вес в полных
унциях и длину в дробных дюймах. Объявите переменную типа такой структуры, и инициализируйте ее.
13. Воспользуйтесь enum для определения типа по имени Response с возможными значениями Yes, No и Maybe.
Yes должно быть равно 1, No - 0, a Maybe - 2.
14. Предположим, что ted - переменная типа double. Объявите указатель, указывающий на ted, и воспользуйтесь
им, чтобы отобразить значение ted.
15. Предположим, что treacle - массив из 10 элементов float. Объявите указатель, указывающий на первый
элемент treacle, и используйте его для отображения первого и последнего элементов массива.
16. Напишите фрагмент кода, который запрашивает у пользователя положительное целое число и затем создает
динамический массив с указанным количеством элементов типа int. Сделайте это с применением операции new,
а затем с использованием объекта vector.
17. Правильный ли код приведен ниже? Если да, что он напечатает?
cout << (int *) "Home of the jolly bytes";
18. Структура, описывающая рыбу, включает Вид, Вес в полных унциях и Длину в дробных дюймах. Напишите
фрагмент кода, который динамически выделит память для структуры, и затем прочитает в нее значение для
члена Вид.
19. В листинге иллюстрируется проблема, вызванная тем, что числовой ввод следует за строчноориентированным вводом.
#include <iostream>
int main()
{
using namespace std;
cout << "What year was your house built?\n";
int year;
cin >> year;
cout << "What is its street address?\n";
char address[80] ;
cin.getline(address, 80);
cout << "Year built: " << year << endl;
cout << "Address: " << address << endl;
cout << "Done!\n";
return 0;
}
Как замена оператора cin.getline(address, 80); оператором cin >> address; повлияет на работу этой программы?
20. Объявите объект vector из 10 объектов string и объект array из 10 объектов string. Покажите необходимые
заголовочные файлы и не используйте using. Для количества строк применяйте const.
2. Циклы, ввод-вывод, операции ветвления и логические выражения.
1. Что напечатает следующий фрагмент кода, если использовать его в программе?
int i;
for (i = 0; i < 5; i + + )
cout << i;
cout << endl;
2. Что напечатает следующий фрагмент кода, если использовать его в программе?
int j;
for (j = 0; j < 11; j += 3)
cout << j;
cout << endl << j << endl;
3. Что напечатает следующий фрагмент кода, если использовать его в программе?
int j = 5;
while (++j < 9)
cout << j++ << endl;
4. Что напечатает следующий фрагмент кода, если использовать его в программе?
int k = 8;
do
cout << " k = " << k << endl;
while (k++ < 5) ;
5. Напишите цикл for, который печатает значения 1 2 4 8 16 32 64, увеличивая вдвое значение переменной
счетчика на каждом шаге.
6. Правилен ли следующий оператор? Если нет, то почему? Если да, то что он делает?
int х = (1,024);
А правилен ли такой оператор?
int у;
у = 1,024;
7. Чем отличается cin >> ch от cin.get(ch) и ch = cin.get() с точки зрения ввода?
8. Приведены два фрагмента кода для подсчета пробелов и переводов строк:
// Версия 1
while (cin.get(ch)) // завершение по eof
{
if (ch == ' ')
spaces++;
if (ch == '\n')
newlines++;
}
// Версия 2
while (cin.get(ch)) // завершение по eof
{
if (ch == ' ')
spaces++;
else if (ch == '\n' )
newlines++;
}
Какие преимущества (если они есть) у второй формы перед первой?
9. Какой эффект даст замена в листинге выражения ++ch на ch+1?
#include <iostream>
int main()
{
char ch;
std::cout << "Type, and I shall repeat.\n";
std::cin.get(ch);
while(ch != '.')
{
if (ch = '\n')
std::cout << ch;
else
std::cout << ++ch;
std::cin.get(ch);
}
std::cout << "\nPlease excuse the slight confusion.\n";
return 0;
}
10. Изучите следующую программу:
#include <iostream>
using namespace std;
int main()
{
char ch;
int ct1, ct2;
ct1 = ct2 = 0;
while ((ch = cin.get()) != '$' )
{
cout << ch;
ct1++;
if (ch = '$')
ct2++;
cout << ch;
}
cout << "ct1 = " << ct1 << ", ct2 = " << ct2 << "\n";
return 0;
}
Предположим, что вы вводите следующие две строки, нажимая клавишу <Enter> в конце каждой строки:
Hi!
Send $10 or $20 now!
Каким будет вывод?
11. Напишите программу, которая запрашивает целое число и затем отображает его в десятичной, восьмеричной
и шестнадцатеричной формах. Отобразите все формы в одной и той же строке, в полях шириной по 15
символов, с применением префиксов C++ для оснований систем счисления.
12. Напишите программу, которая запрашивает следующую информацию и форматирует ее, как показано ниже:
Enter your name: Billy Gruff
Enter your hourly wages: 12
Enter number of hours worked: 7.5
First format:
Billy Gruff: $ 12.00: 7.5
Second format:
Billy Gruff : $12.00 :7.5
13. Пусть имеется следующая программа:
#include <iostream>
int main()
{
using namespace std;
char ch;
int ct1 = 0;
cin >> ch;
while(ch != 'q')
{
ct1++;
cin >> ch;
}
int ct2 = 0;
cin.get(ch);
while(ch != 'q')
{
ct2++;
cin.get(ch);
}
cout << "ct1 = " << ct1 << "; ct2 = " << ct2 << "\n";
return 0;
}
Что она напечатает, если получит следующий ввод:
I see a q<Enter>
I see a q<Enter>
Здесь <Enter> означает нажатие одноименной клавиши.
14. Оба следующих оператора читают и отбрасывают символы, вплоть до конца строки, включая его. Чем
различается их поведение?
while (cin.get() != '\n')
continue;
cin.ignore(80, '\n');
15. Постройте логические выражения для представления перечисленных ниже условий.
а. weight больше или равно 115, но меньше 125.
б. ch равно q или Q.
в. х - четное, но не равно 26.
г. х - четное, но не кратно 26.
д. donation находится в диапазоне 1000-2000 или guest равно 1.
е. ch - буква в нижнем или верхнем регистре. (Предполагается, что буквы нижнего регистра кодируются
последовательно и буквы верхнего регистра также кодируются последовательно, но между буквами нижнего и
верхнего регистров имеется промежуток.)
16. Постройте условное выражение, которое эквивалентно нахождению модуля значения переменной.
17. Перепишите следующий фрагмент с применением switch:
if (ch == 'А')
a_grade++;
else if (ch == 'B' )
b_grade++;
else if (ch == 'C')
c_grade++;
else if (ch == 'D')
d_grade++;
else
f_grade++;
18. Приведен следующий фрагмент кода:
int line = 0;
char ch;
while (cin.get(ch))
{
if (ch == 'Q')
break;
if (ch != '\n')
continue;
line++;
}
Перепишите этот код так, чтобы в нем не использовались операторы break и continue.
19. Напишите программу, которая подсчитывает количество символов в строке вплоть до первого
встретившегося символа $.
20. Напишите программу, которая копирует клавиатурный ввод в файл.
3. Функции, модели памяти и пространства имен
1. Постройте прототипы, которые соответствовали бы следующим описаниям.
а. igor() не принимает аргументов и не возвращает значения.
б. tofu() принимает аргумент int и возвращает float.
в. mpg() принимает два аргумента типа double и возвращает double.
г. summation() принимает имя массива long и его размер и возвращает значение long.
д. doctor() принимает строковый аргумент (строка не должна изменяться) и возвращает double.
е. of_course() принимает структуру boss в качестве аргумента и не возвращает ничего.
ж. plot() принимает указатель на структуру tар в качестве аргумента и возвращает строку.
2. Напишите функцию, принимающую три аргумента: имя массива int, его размер и значение int. Функция
должна присвоить каждому элементу массива это значение int.
3. Напишите функцию, принимающую три аргумента: указатель на первый элемент диапазона в массиве,
указатель на элемент, следующий за концом этого диапазона, и значение int. Функция должна присвоить
каждому элементу диапазона массива это значение int.
4. Напишите функцию, принимающую имя массива double и его размер в качестве аргументов и возвращающую
наибольшее значение, которое содержится в этом массиве. Обратите внимание, что функция не должна
модифицировать содержимое массива.
5. Напишите функцию, имеющую следующий прототип:
int replace(char * str, char c1, char c2);
Эта функция должна заменять каждое появление с1 в строке str на с2 и возвращать количество выполненных
замен.
6. C++ позволяет передавать структуры по значению, а также передавать адрес структуры. Если glitz структурная переменная, как передать ее по значению? Как передать ее адрес? Каковы преимущества и
недостатки обоих подходов?
7. Функция judge() имеет тип возврата int. В качестве аргумента она принимает адрес функции. Функция, адрес
которой ей передается, в свою очередь, принимает аргумент типа const char и возвращает int. Напишите
прототип функции.
8. Предположим, что есть следующее объявление структуры:
struct applicant {
char name[30] ;
int credit_ratings[3];
};
а. Напишите функцию, которая принимает структуру applicant в качестве аргумента и отображает ее
содержимое.
б. Напишите функцию, которая принимает адрес структуры applicant в качестве аргумента и отображает
содержимое структуры, на которую он указывает.
9. Предположим, что функции f1() и f2() имеют следующие прототипы:
void f1(applicant * а) ;
const char * f2(const applicant * a1, const applicant * a2);
Объявите p1 как указатель на функцию f1, а р2 — как указатель на f2. Объявите ар как массив из пяти
указателей того же типа, что и р1, и объявите ра как указатель на массив из десяти указателей того же типа, что
и р2. Воспользуйтесь typedef.
10. Предположим, что функция song() имеет следующий прототип:
void song(char * name, int times);
а. Как модифицировать этот прототип, чтобы для переменной times по умолчанию принималось значение 1?
б. Какие изменения следует внести в определение функции?
в. Можно ли переменной name присвоить используемое по умолчанию значение "О, My Papa"?
11. Напишите перегруженные версии функции iquote(), которая отображает аргументы, заключенные в двойные
кавычки. Напишите три версии: одну для аргумента типа int, другую для аргумента типа double и третью для
аргумента типа string.
12. Пусть имеется следующая структура:
struct box
{
char maker [40];
float height;
float width;
float length;
float volume;
};
а. Напишите функцию, которая имеет формальный аргумент - ссылку на структуру box и отображает значение
каждого члена структуры.
б. Напишите функцию, которая имеет формальный аргумент - ссылку на структуру box и устанавливает член
volume в результат произведения членов height, width и length.
13. Ниже дано описание результатов, которые требуется обеспечить. Укажите, может ли каждый из них быть
получен с помощью аргументов по умолчанию, путем перегрузки функций, тем и другим способом, или же
можно обойтись без этих средств. Предоставьте необходимые прототипы.
а. Функция mass(density, volume) возвращает массу тела, имеющего плотность density и объем volume, а
функция mass(density) возвращает массу тела, имеющего плотность density и объем 1.0 кубический метр. Все
величины имеют тип double.
б. Вызов repeat(10, "I 'm OK") отображает указанную строку 10 раз, а вызов repeat("But you're kind of stupid")
отображает заданную строку 5 раз.
в. Вызов average(3,6) возвращает среднее значение типа int двух аргументов int, а вызов average(3.0, 6.0) среднее значение типа double двух значений double.
г. Вызов mangle("I 'm glad to meet you") возвращает символ І или указатель на строку "I'm glad to meet you" в
зависимости от того, присваивается возвращаемое значение переменной типа char или переменной типа char*.
14. Напишите шаблон функции, которая возвращает больший из двух ее аргументов.
15. Какие типы назначены переменным v1, v2, v3, v4 и v5 в следующем коде (предполагается, что код является
частью завершенной программы)?
int g(int x);
float m = 5.5f;
float & rm = m;
decltype (m) v1 = m;
decltype (rm) v2 = m;
decltype ((m)) v3 = m;
decltype (g(100)) v4;
decltype (2.0 * m) v5;
16. Перепишите следующий код таким образом, чтобы в нем не использовалось ни объявление, ни директива
using.
#include <iostream>
using namespace std;
int main ()
{
double x;
cout << "Enter value: ";
while (! (cin >> x) )
{
cout << "Bad input. Please enter a number: "; // неверный ввод
cin.clear() ;
while (cin.get() != '\n')
continue;
}
cout << "Value = " << x << endl;
return 0;
}
17. Перепишите следующий код таким образом, чтобы в нем использовались объявления using вместо
директивы using.
#include <iostream>
using namespace std;
int main()
{
double x;
cout << "Enter value: ";
while (! (cin >> x) )
{
cout << "Bad input. Please enter a number: "; // неверный ввод
cin.clear();
while (cin.get() != '\n')
continue;
}
cout << "Value = " << x << endl;
return 0;
}
18. Предположим, что функция average(3,6) должна возвращать значение int, которое является средним
арифметическим двух аргументов типа int, когда она вызывается в одном файле, и значение double, которое
является средним арифметическим от двух аргументов типа int, когда вызывается в другом файле одной и той
же программы. Как это можно реализовать?
19. Какие данные будет выводить следующая программа, состоящая из двух файлов?
// file1.cpp
#include <iostream>
using namespace std;
void other() ;
void another();
int x = 10;
int y;
int main()
{
cout << x << endl;
{
int x = 4;
cout << x << endl;
cout << у << endl;
}
other() ;
another();
return 0;
}
void other()
{
int y=l;
cout << "Other: " << x << ", " << у << endl;
}
// file2.cpp
#include <iostream>
using namespace std;
extern int x;
namespace
{
int у = -4;
}
void another()
{
cout << "another() : " << x << ", " << у << endl;
}
20. Что будет выводить следующая программа?
#include <iostream>
using namespace std;
void other();
namespace n1
{
int x = 1;
}
namespace n2
{
int x = 2;
}
int main()
{
using namespace n1;
cout << x << endl;
{
int x = 4;
cout < < x << ", " << n1::x << ", " << n2::x << endl ;
}
using n2::x;
cout << x << endl;
other();
return 0;
}
void other()
{
using namespace n2;
cout << x << endl;
{
int x = 4;
cout << x << ", " « n1::x << ", " « n2::x << endl;
}
using n2::x;
cout << x << endl;
}
4. Классы, наследование и дружественные конструкции
1. Определите класс для представления банковского счета. Данные-члены должны включать имя вкладчика,
номер счета (используйте строку) и баланс. Функции-члены должны позволять следующее:
• создание объекта и его инициализация;
• отображение имени вкладчика, номера счета и баланса;
• добавление на счет суммы денег, переданной в аргументе;
• снятие суммы денег, переданной в аргументе.
Приведите объявление класса без реализации методов.
2. Определите класс для представления банковского счета. Данные-члены должны включать имя вкладчика,
номер счета (используйте строку) и баланс. Функции-члены должны позволять следующее:
• создание объекта и его инициализация;
• отображение имени вкладчика, номера счета и баланса;
• добавление на счет суммы денег, переданной в аргументе;
• снятие суммы денег, переданной в аргументе.
Напишите код конструктора для этого класса.
3. Модифицируйте определение класса Stock
#include <string>
class Stock
{
private:
std::string company;
int shares;
double share val;
double total_val;
void set_tot() {total_val = shares * share_val;}
public:
Stock();
Stock(const std::string & со, long n = 0, double pr = 0.0);
~Stock();
void buy(long num, double price);
void sell(long num, double price);
void update(double price);
void show() const;
const Stock & topval(const Stock & s) const;
};
так, чтобы он имел функции-члены, которые возвращают значения индивидуальных данных-членов. Член,
который возвращает наименование компании, не должен давать возможности изменять массив.
4. Приведено определение класса:
class Stonewt
{
private:
enum {Lbs_per_stn = 14}; // фунтов на стоун
int stone; // полных стоунов
double pds_left; // дробное число фунтов
double pounds; // общий вес в фунтах
public:
Stonewt(double lbs); // конструктор для значения в фунтах
Stonewt(int stn, double lbs); // конструктор для значения в стоунах и фунтах
Stonewt(); // конструктор по умолчанию
~Stonewt();
void show_lbs() const; // отображение веса в формате фунтов
void show_stn() const; // отображение веса в формате стоунов
};
Воспользуйтесь функцией-членом для перегрузки операции умножения в классе Stonewt; определите операцию
умножения членов данных на значение типа double. Имейте в виду, что нужно будет позаботиться о
представлении "стоун-фунт". То есть удвоение 10 стоунов и 8 фунтов должно давать 21 стоун и 2 фунта.
5. Приведено определение класса:
class Stonewt
{
private:
enum {Lbs_per_stn = 14}; // фунтов на стоун
int stone; // полных стоунов
double pds_left; // дробное число фунтов
double pounds; // общий вес в фунтах
public:
Stonewt(double lbs); // конструктор для значения в фунтах
Stonewt(int stn, double lbs); // конструктор для значения в стоунах и фунтах
Stonewt(); // конструктор по умолчанию
~Stonewt();
void show_lbs() const; // отображение веса в формате фунтов
void show_stn() const; // отображение веса в формате стоунов
};
Воспользуйтесь дружественной функцией для перегрузки операции умножения в классе Stonewt; определите
операцию умножения значения double на значение Stone.
6. Пусть класс String содержит следующие закрытые члены:
class String
{
private:
char * str; // указывает на строку, распределенную операцией new
int len; // хранит длину строки
};
а. Что неправильно в следующем конструкторе по умолчанию?
String::String() {}
б. Что неправильно в следующем конструкторе?
String::String(const char * s)
{
str = s;
len = strlen(s);
}
в. Что неправильно в следующем конструкторе?
String::String(const char * s)
{
strcpy(str, s);
len = strlen(s);
}
7. Найдите и исправьте ошибки в следующем объявлении класса:
class nifty
{
char personality[];
int talents;
nifty();
nifty(char * s);
ostream & operator<<(ostream & os, nifty & n);
}
nifty:nifty()
{
personality = NULL;
talents = 0;
}
nifty:nifty(char * s)
{
personality = new char [strlen (s)];
personality = s;
talents = 0;
}
ostream & nifty:operator<<(ostream & os, nifty & n)
{
os << n;
}
8. Имеется следующее объявление класса:
class Golfer
{
private:
char * fullname; // указывает на строку, содержащую имя игрока в гольф
int games; // хранит количество сыгранных игр
int * scores; // указывает на первый элемент массива счетов игр
public:
Golfer();
Golfer(const char * name, int g = 0);
Golfer(const Golfer & g); // Создает пустой динамический массив из g элементов, если g > 0
~Golfer();
};
а. Какие методы класса будут вызываться следующими операторами?
Golfer nancy; // #1
Golfer lulu("Little Lulu"); // #2
Golfer roy("Roy Hobbs", 12); // #3
Golfer * par = new Golfer; // #4
Golfer next = lulu; // #5
Golfer hazzard = "Weed Thwacker"; // #6
*par = nancy; // #7
nancy = "Nancy Putter"; // #8
б. Ясно, что классу требуется больше методов для того, чтобы он был действительно полезным. Какой
дополнительный метод нужен для защиты данных от разрушения?
9. Создайте исходный базовый класс building для хранения числа этажей и комнат в здании, а также общую
площадь комнат. Создайте производный класс house, который наследует класс building и хранит число ванных
комнат и число спален. Кроме этого создайте производный класс office, который наследует класс building и
хранит число огнетушителей и телефонов.
10. Предположим, что Corporation - базовый класс, a PublicCorporation - производный. Допустим также, что в
каждом из этих классов определен метод head(), ph является указателем на тип Corporation, а переменной ph
присвоен адрес объекта PublicCorporation. Как интерпретируется ph->head (), если в базовом классе метод head()
определен как:
а. обычный не виртуальный метод;
б. виртуальный метод.
11. Есть ли ошибки в следующем коде, и если есть, то какие?
class Kitchen
{
private:
double kit_sq_ft;
public:
Kitchen() {kit_sq_ft = 0.0;}
virtual double area() const {return kit_sq_ft * kit_sq_ft;}
};
class House:public Kitchen
{
private:
double all_sq_ft;
public:
House() {all_sq_ft += kit_sq_ft;}
double area(const char *s) const {cout << s; return all_sq_ft;}
};
12. Для каждого набора классов из столбца А укажите, какое наследование - общедоступное или закрытое лучше подходит для столбца Б.
А
Б
class Bear (Медведь)
class PolarBear (Белый медведь)
class Kitchen (Кухня)
class Home (Дом)
class Person (Человек)
class Programmer (Программист)
class Person (Человек)
class HorseAndJockey (Лошадь и жокей)
class Person, class Automobile (Человек, Автомобиль) class Drive (Поездка)
13. Пусть имеются следующие определения:
class Frabjous {
private:
char fab[20];
public:
Frabjous(const char * s = "C++") : fab(s) { }
virtual void tell() {cout << fab;}
};
class Gloam {
private:
int glip;
Frabjous fb;
public:
Gloam(int g = 0, const char * s = "C++");
Gloam(int g, const Frabjous & f);
void tell();
};
Напишите определения для трех методов класса Gloam, если функция tell() из класса Gloam выводит значения
glip и fb.
14. Пусть имеются следующие определения:
class Frabjous {
private:
char fab[20];
public:
Frabjous(const char * s = "C++") : fab(s) { }
virtual void tell() { cout << fab; }
};
class Gloam : private Frabjous{
private:
int glip;
public:
Gloam(int g = 0, const char * s = "C++");
Gloam(int g, const Frabjous & f);
void tell();
};
Напишите определения для трех методов класса Gloam, если функция tell() из класса Gloam выводит значения
glip и fb.
15. Что неверно в следующих попытках создания дружественных конструкций:
а. class snap {
friend clasp;
};
class clasp {...};
б. class cuff {
public:
void snip(muff &) {...}
};
class muff {
friend void cuff::snip(muff &);
};
в. class muff {
friend void cuff::snip(muff &);
};
class cuff {
public:
void snip(muff &) { ... }
};
16. Какие проблемы могут возникнуть в следующем объявлении вложенного класса?
class Ribs
{
private:
class Sauce
{
int soy;
int sugar;
public:
Sauce(int s1, int s2) : soy(s1), sugar(s2) { }
};
};
17. Пусть имеется следующее объявление класса:
class RQ1
{
private:
char * st; // указатель на строку в стиле С
public:
RQ1() { st = new char [1]; strcpy(st, " ") ; }
RQ1(const char * s) {st = new char [strlen(s) + 1]; strcpy(st, s);}
RQ1(const RQ1 & rq) {st = new char [strlen(rq.st) + 1]; strcpy(st, rq.st);}
~RQ1() {delete [] st};
RQ & operator= (const RQ & rq);
// Другие операторы
};
Преобразуйте его в объявление, использующее объект string. Какие методы больше не нуждаются в явных
определениях?
18. Дан следующий фрагмент программы, впишите детали, как указано в комментариях:
#include <iostream>
using namespace std;
class planet {
protected:
double distance; // расстояние в милях от Солнца
int revolve; // полный оборот в днях
public:
planet(double d, int r) { distance = d; revolve = r; }
};
class earth: public planet {
double circumference; // окружность орбиты
public:
/* Создайте конструктор earth (double d, int r). Он должен передавать классу planet расстояние и число
оборотов, а также рассчитывать окружность орбиты */
/* Создайте функцию show() для вывода информации на экран */
};
int main()
{
earth ob(93000000, 365);
ob.show();
return 0;
}
19. Используя следующую иерархию классов, создайте конструктор класса С так, чтобы он инициализировал
переменную k и передавал аргументы конструкторам А() и В().
#include <iostream>
using namespace std;
class A
{
int i;
public:
A(int a) { i = a; }
};
class В
{
int j;
public:
В(int a) { j = a; }
};
class C: public A, public В
{
int k;
public:
/* Создайте такой конструктор С(), чтобы он инициализировал переменную k и передавал аргументы
конструкторам А() и В() */
};
20. Исправьте следующую программу:
#include <iostream>
using namespace std;
// Базовый класс для автомобилей разных типов
class vehicle
{
int num_wheels;
int range;
public:
vehicle(int w, int r) { num_wheels = w; range = r; }
void showv()
{
cout << "Число колес" << num_wheels << '\n';
cout <<"Грузоподъемность" << range << '\n';
}
};
enum motor {gas, electric, diesel};
class motorized: public vehicle
{
enum motor mtr;
public:
motorized(enum motor m, int w, int r): vehicle(w, r) { mtr = m; }
void showm()
{
cout <<"Мотор:";
switch(mtr)
{
case gas: cout << "На газе\n";
break;
case electric: cout << "На электроэнергии\n";
break;
case diesel: cout << "Дизельный\n";
break;
}
}
};
class road_use: public vehicle
{
int passengers;
public:
road_use(int p, int w, int r): vehicle(w, r) { passengers = p; }
void showr() { cout << "Пассажироемкость" << passengers << '\n' }
};
enum steering {power, rack_pinion, manual};
class car: public motorized, public road_use
{
enum steering strng;
public:
car(enum steering s, enum motor m, int w, int r, int p) : road use(p, w, r), motorized(m, w, r), vehicle(w, r)
{ strng = s; }
void show()
{
showv(); showr(); showm();
cout << "Управление:";
switch(strng)
{
case power: cout <<"Силовой привод\п";
break;
case rack_pinion: cout << "Механический привод\п";
break;
case manual: cout << "Ручной привод\п";
break;
}
}
};
int main()
{
car с(power, gas, 4, 500, 5);
c.show();
return 0;
}
Download