Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы_экзамен_информатика.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
153.09 Кб
Скачать

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;

}