int main()
{
cout << "Сколько практических упражнений: ";
cin >> count;
num_right = 0;
do {
drill(); count--;
}while(count);
cout << "Вы дали " << num_right<< " правильных ответов.\n";
return 0;
}
void drill()
{
int count; /* Эта переменная count — локальная и никак не связана с одноименной глобальной.*/
int а, b, ans;
// Генерируем два числа между 0 и 99.
а = rand() % 100;
b = rand() % 100;
// Пользователь получает три попытки дать правильный ответ.
for(count=0; count<3; count++) {
cout << "Сколько будет " << а << " + " << b << "? ";
cin >> ans;
if(ans==a+b) {
cout << "Правильно\n";
num_right++;
return;
}
}
cout << "Вы использовали все свои попытки.\n";
cout << "Ответ равен " << a+b << '\n';
}
При внимательном изучении этой программы вам должно быть ясно, что как функция
Хранение глобальных переменных осуществляется в некоторой определенной области памяти, специально выделяемой программой для этих целей. Глобальные переменные полезны в том случае, когда в нескольких функциях программы используются одни и те же данные, или когда переменная должна хранить свое значение на протяжении выполнения всей программы. Однако без особой необходимости следует избегать использования глобальных переменных, и на это есть три причины.
■ Они занимают память в течение всего времени выполнения программы, а не только тогда, когда действительно необходимы.
■ Использование глобальной переменной в "роли", с которой легко бы "справилась" локальная переменная, делает такую функцию менее универсальной, поскольку она полагается на необходимость определения данных вне этой функции.
■ Использование большого количества глобальных переменных может привести к появлению ошибок в работе программы, поскольку при этом возможно проявление неизвестных и нежелательных побочных эффектов. Основная проблема, характерная для разработки больших С++-программ, — случайная модификация значения переменной в каком-то другом месте программы. Чем больше глобальных переменных в программе, тем больше вероятность ошибки.
До сих пор в приводимых здесь примерах функциям передавались значения простых переменных. Но возможны ситуации, когда в качестве аргументов необходимо использовать указатели и массивы. Рассмотрению особенностей передачи аргументов этого типа и посвящены следующие подразделы.
В C++ разрешается передавать функции указатели. Для этого достаточно объявить параметр типа указатель. Рассмотрим пример.
// Передача функции указателя.
#include
using namespace std;
void f (int *j);
int main()
{
int i;
int *p;
p = &i // Указатель p теперь содержит адрес переменной i.
f(p);
cout << i; // Переменная i теперь содержит число 100.
return 0;
}
void f (int *j)
{
*j = 100; // Переменной, адресуемой указателем j, присваивается число 100.
}
Как видите, в этой программе функция
*j = 100;