
- •1. Базовые и составные типы.
- •2. Циклы, ввод-вывод, операции ветвления и логические выражения.
- •2. Что напечатает следующий фрагмент кода, если использовать его в программе?
- •3. Что напечатает следующий фрагмент кода, если использовать его в программе?
- •4. Что напечатает следующий фрагмент кода, если использовать его в программе?
- •3. Функции, модели памяти и пространства имен
- •4. Классы, наследование и дружественные конструкции
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;
}