Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Основы программирования на C++.doc
Скачиваний:
148
Добавлен:
02.05.2014
Размер:
872.96 Кб
Скачать

Типовые вопросы с ответами

Можно ли в С++ объявлять вложенные функции?

Нет, так как это приводит к большим накладным расходам во время выполнения программы.

В каких случаях нужно использовать статические глобальные переменные?

Можете использовать их, где хотите. Когда вы объявляете статической глобальную переменную (которые я вам не советую использовать вообще), вы даете указание компилятору сделать ее невидимой для функций из других файлов. Такая переменная недоступна из других файлов вашего проекта.

Как расходуется память при обслуживании вызовов рекурсивной функции?

Исполняющая система использует стек для хранения временных данных, в том числе необходимых для генерирования вызова рекурсивной функции. Как и другие ресурсы, стек ограничен в своем размере. В результате при длинной цепочке вызовов рекурсивной функции стек может переполниться, что приведет к остановке программы из-за ошибок выполнения или переполнения стека.

Практикум Контрольные вопросы

1. Каков будет результат работы следующей программы? Что вы можете сказать по поводу функции swap?

*/

# include <iostream.h>

void swap(int i, int j)

{

int temp = i;

i = j;

j = temp;

}

int main()

{

int a = 10, b = 3;

swap (a, b);

cout << "а = " << a << " and b = " << b;

return 0;

}

/*

2. Каков будет результат работы следующей программы? Что вы можете сказать по поводу еще одной функции swap?

*/

#include <iostream.h>

void swap(int &i, int &j)

{

int temp = i;

i = j;

j = temp;

}

int main()

{

int a = 10, b = 3;

swap (a, b);

cout << "а = " << a << " and b = " << b;

return 0;

}

/*

3. Что за проблема возникнет со следующими перегруженными функциями?

*/

void inc(int &i)

{

i = i + 1;

}

void inc(int &i, int diff = 1)

{

i = + diff;

}

/*

4. Найдите ошибку в функции.

/*

double volume(double length, double width = 1, double height)

{

return length * width * height

}

/*

5. Найдите ошибку в функции.

*/

void inc (int &i, int diff = 1)

{

i = I + diff;

}

/*

6. В этой программе есть ошибка. Что это за ошибка и как ее исправить?

*/

# include<iostream.h>

int main()

{

double x = 5.2;

cout << x << " ^ 2 = " << sqr(x);

return 0;

}

double sqr( double х)

{ return x * x; }

/*

7. Попробуйте в функции вычисления факториала использовать операцию ?: .

Массивы

// Листинг 6.1. исходный текст программы AVERAGE1.CPP

// Программа иллюстрирует использование одномерных массивов

// при расчете среднего значения.

#include <iostream.h>

const int MAX = 0x1FFF; //64K/8 - максимальный размер массива типа double ***

int main()

{

double array[MAX]; // объявление одномерного массива ***

int num_elem;

// Ввод количества обрабатываемых данных

do

{

cout << "Введите размер массива данных [2 ... "

<< MAX << "]: ";

cin >> num_elem;

cout << endl;

} while (num_elem < 2 || num_elem > MAX);

// Ввод данных

for (int ix = 0; ix < num_elem; ix++)

{

cout << "массив[" << ix << "]: ";

cin >> array[ix];

}

// Расчет среднего значения

double sum = 0;

for (ix = 0; ix < num_elem; ++ix)

sum += array[ix];

cout << endl << "Среднее: " << sum / num_elem << endl;

return 0;

/*

- При объявлении одномерных массивов им можно присвоить начальные значения. Список ИНИЦИАЛИЗАЦИИ должен быть заключен в фигурные скобки, а элементы в нем должны быть разделены запятыми. Можно при инициализации задать данных МЕНЬШЕ, чем размер массива. В этом случае компилятор автоматически присвоит нулевые значения тем элементам, которые вы не инициализировали. И вдобавок, если вы не укажете размерность инициализируемого массива, она будет определена по количеству элементов в списке инициализации.

*/

// Листинг 6.2. исходный текст программы AVERAGE2.CPP

// Программа иллюстрирует использование одномерных массивов

// при расчете среднего значения.

// Данные задаются при инициализации массива.

#include <iostream.h>

const int MAX = 10; //50

int main()

{

double array[MAX] = { 12.2, 45.4, 67.2, 12.2, 34.6, 87.4,

83.6, 12.3, 14.8/*, 55.5*/ };

int num_elem = MAX;

//double array[] = { 12.2, 45.4, 67.2, 12.2, 34.6, 87.4,

// 83.6, 12.3, 14.8, 55.5 };

//int num_elem = sizeof(array) / sizeof(array[0]);

double sum = 0;

for (int ix = 0; ix < num_elem; ++ix)

{

sum += array[ix];

cout << "массив[" << ix << "]: " << array[ix] << endl;

}

cout << endl << "Среднее: " << sum / num_elem << endl;

return 0;

}

- Объявление одномерных массивов в качестве параметров функции возможно в двух формах: массив-параметр фиксированной размерности и массив-параметр неопределенной длины (открытый массив), При объявлении параметром массива фиксированной размерности указывается размер массива. В этом случае передаваемые функции аргументы должны соответствовать параметру по типу и размеру. Массив- араметр неопределенной длины объявляется с пустыми скобками, означающими, что аргумент может быть любого размера.

(Листинг 6.3а. исходный текст программы MINMAX.CPP)

(Листинг 6.3. исходный текст программы MINMAX.CPP)