Локальные и глобальные переменные
Переменные, объявленные внутри тела функции, называются локальными и существуют только внутри самой функции. Когда выполнение программы возвращается к выполнению основного кода, локальные переменные удаляются из памяти. Переменные, объявленные в качестве параметров функции, также называются локальными. Каждая переменная характеризуется своей областью видимости, определяющей время жизни и доступность этой переменной в программе.
Переменные, объявленные внутри некоторого блока программы, имеют область видимости, ограниченную этим блоком. Блок в программе выделяется фигурными скобками. К этим переменным можно получить доступ только внутри этого блока. После завершения блока объявленные в нем переменные удаляются.
Переменные, объявленные вне тела какой либо функции (в том числе главной функции), называются глобальными.
Глобальные переменные используются в тех случаях, если требуется сделать данные доступными для многих функций, а передавать эти данные в качестве параметров функции затруднительно. Глобальные переменные следует использовать очень осторожно, так как в результате общедоступности они могут быть изменены любой функцией и это изменение может оказаться не замеченным пользователем.
Если имя локальной переменной совпадает с именем глобальной переменной, то локальная переменная во время выполнения того блока, где она объявлена, перекрывает глобальную переменную.
Примеры использования локальных и глобальных переменных
Пример 1.Использование локальных переменных и параметров функции
# include < iostream >
using namespace std;
float Convert ( float ) ;
int main ( )
{
float TempFer ;
float TempCel ;
cout << "Please enter the temperature in Fahrenheit: " ;
cin >> TempFer ;
TempCel = Convert ( TempFer ) ;
cout << "\n Here's the temperature in Celsius: " ;
cout << TempCel << endl ;
return 0 ;
}
float Convert ( float TempFer )
{
float TempCel ;
TempCel = ( ( TempFer – 32 ) * 5) / 9;
return TempCel ;
}
Результат программы на экране будет иметь вид:
Please enter the temperature in Fahrenheit: 212
Here's the temperature in Celsius: 100
Пример 2.Использование глобальных и локальных переменных
# include < iostream>
void myFunction(); // прототип функции
int x = 5, y = 7; // глобальные переменные
int main ( )
{
cout << " x from main: " << x << " \n ";
cout << " y from main: " << y << " \n \n " ;
myFunction ( ) ;
cout << " Back from myFunction! \n \n " ;
cout << " x from main: " << x << " \n " ;
cout << " y from main: " << y << " \n " ;
return 0;
}
void myFunction ( )
{
int y = 10;
cout << "x from myFunction: " << x << " \n ";
cout << "y from myFunction: " << y << " \n \n ";
}
Результат программы на экране будет иметь вид:
x from main: 5
y from main: 7
x from myFunction: 5
y from myFunction: 10
Back from myFunction!
x from main: 5
y from main: 7
Пример 3.Использование переменных, объявленных внутри блока
# include < iostream >
using namespace std;
void myFunc ( );
int main ( )
{
int x = 5;
cout << "\n In main x is: " << x;
myFunc ( ) ;
cout << " \n Back in main, x is: " << x;
return 0;
}
void myFunc( )
{
int x = 8 ;
cout << "\n In myFunc, local x: " << x << endl ;
{
cout << "\n In block in myFunc, x is: " << x;
int x = 9;
cout << "\n Very local x: " << x;
}
cout << "\n Out of block, in myFunc, x: " << x << endl;
}
Результат программы на экране будет иметь вид:
In main x is: 5
In myFunc, local x: 8
In block in myFunc, x is: 8
Very local x: 9
Out of block, in myFunc, x: 8
Back in main, x is: 5
Проанализируйте в приведенных примерах изменения значений переменных x и y до входа в функцию, во время выполнения функции, после выхода из неё и значений переменных, ограниченных блоком.
Задания к самостоятельной работе
1. Напишите функцию integerPower(base,exponent), которая возвращает значение baseexponent . Например, integerPower(3,4)=3*3*3*3. Предположим, что exponent является положительным ненулевым целым, а base целым. Для управления вычислением функция integerPower(base,exponent) должна применять цикл for. Не используйте никаких функций математической библиотеки.
2. Напишите функцию multiple для двух целых, которая определяет, кратно ли второе число первому. Функция должна получать два целых аргумента и возвращать 1, если второе число кратно первому и 0 в противном случае. Используйте эту функцию в программе, которая вводит серию пар целых чисел.
3. Напишите функцию, которая выводит у левой границы экрана сплошной квадрат из символов заданного символа (например, * ), сторона которого определяется целым параметром side. Например, если side равно 4, функция выведет следующее изображение
* * * *
* * * *
* * * *
* * * *
4. Даны действительные числа s и t.
Используйте функции и вычислите
, где
5. Даны действительные числа a,b,c. Использовать функции и получить
6. Напишите программу, которая вводит последовательность целых чисел и передает их по одному функции even, использующей операцию вычисления остатка для определения четности числа. Функция должна принимать целый аргумент и возвращать 1, если аргумент — четное число, и 0 — в противном случае.
7. Говорят, что целое число является совершенным,если его сомножители, включая 1 (но не само число) в сумме дают это число. Например, 6 — это совершенное число, так как 6=1 + 2 + 3. Напишите функцию perfect, которая определяет, является ли параметр number совершенным числом. Используйте эту функцию в программе, которая определяет и печатает все совершенные числа в диапазоне от 1 до 1000. Напечатайте сомножители каждого совершенного числа, чтобы убедиться, что число действительно совершенное.
8. Говорят, что целое число является простым числом,если оно, делится только на 1 и на само себя. Например, 2, 3, 5 — простые числа, а 4, 6, 8 — нет.
a) Напишите функцию, определяющую, является ли число простым или нет.
b) Используйте эту функцию в программе, которая определяет и печатает все простые числа, лежащие в диапазоне от 1 до 10000.
c) Вначале вы могли бы подумать, что верхней границей, до которой вы должны проводить проверку, чтобы увидеть, является ли число n простым, является n/2, но в действительности вам нужно проверить количество чисел, равное корню квадратному из п. Почему? Перепишите программу и запустите ее для обоих способов. Оцените
улучшение производительности.
9. Напишите программу, моделирующую бросание монеты. Для каждого броска монеты программа должна печатать Орел или Решка. Промоделируйте с помощью этой программы бросание 100 раз и подсчитайте, сколько раз появилась каждая сторона монеты. Напечатайте результаты. Программа должна вызывать отдельную функцию flip, которая не принимает никаких аргументов и возвращает 0 для Орла и 1 для Решки.
Замечание: если программа действительно моделирует бросание монеты, каждая сторона монеты должна появляться примерно в половине случаев.
Лабораторная работа 2
Указатели
Указатели представляют собой переменные, значениями которых являются адреса памяти. Обычная переменная содержит конкретное значение, т.е. переменная ссылается непосредственно на это значение, а указатель содержит адрес, по которому находится конкретное значение переменной.
Синтаксис объявления указателя:
int *a ; // объявленный указатель ссылается на объект целого типа.
После объявления указатель должен быть инициализирован. Указатель инициализируется адресом.
int * a ; int b = 5; // в данном случае * показывает объявление указателя, во всех
// остальных случаях * указывает на операцию косвенной адресации.
a = & b ; //инициализация указателя адресом переменной b.
b * a Имена переменных
|
|
1000 1004 адреса ячеек памяти
Для работы с указателями используются две операции:
* - операция косвенной адресации или операция разыменования,
& - операция взятия адреса (возвращает адрес своего операнда).
# include < iostream.h >
main ( ) {
int * a ;
int b = 5 ;
a = & b ; // Выполняется операция взятия адреса.
сout << a << endl ; // Выведется адрес ячейки памяти, в которой хранится // переменная “b”.
cout << * a << endl ; // Выведется значение переменной b, на которую ссылается
// указатель.
return 0 ;
}
При объявлении указатель можно инициализировать адресом ячейки памяти.
…
int b ;
int * a = & b ; // * a = & b – нельзя!
…