
- •210700 Инфокоммуникационные технологии и системы связи
- •220700 Автоматизация технологических процессов и производств
- •230400 Информационные системы и технологии
- •1. Цели и задачи дисциплины
- •2. Место дисциплины в структуре основной образовательной программы
- •3. Требования к уровню освоения содержания дисциплины
- •Для специальности 210700 Инфокоммуникационные технологии и системы связи
- •4. Объем дисциплины и виды учебной работы
- •5. Содержание дисциплины
- •Для специальности 210700 Инфокоммуникационные технологии и системы связи
- •6. Лабораторный практикум
- •7. Библиографический список
- •8. Материально-техническое обеспечение дисциплины
- •9. Опорный конспект
- •1. Основы алгоритмизации
- •1.1 Этапы решения задач на эвм.
- •1.2. Алгоритм. Свойства алгоритмов
- •1.3. Формы представления алгоритмов
- •1.4. Алгоритмическая конструкция ветвления
- •1.5. Алгоритмическая конструкция цикла
- •2.1. Разработка консольного проекта
- •2.3. Комментарий
- •2.4. Организация ввода и вывода информации
- •Вывод данных
- •Ввод данных
- •2.5. Разработка проекта типа Windows Forms Application
- •3. Основные элементы языка
- •3.1. Алфавит
- •3.2. Идентификаторы
- •3.3. Переменные и константы
- •3.4. Символьные типы данных
- •3.5. Данные типа int
- •3.6. Данные с плавающей точкой
- •3.7. Логический тип данных
- •3.8. Операции и выражения
- •Арифметические операции
- •Операции инкремента и декремента
- •Операции отношения и логические операции
- •Оператор присваивания
- •Составные операторы присваивания
- •Оператор условия ? :
- •Операция sizeof
- •4. Программирование разветвляющих и циклических алгоритмов
- •4.1. Общие сведения
- •4.2. Оператор if
- •4.3. Оператор switch
- •4.4. Оператор цикла for
- •4.5. Оператор цикла while
- •4.6. Оператор цикла do while
- •4.7. Применение оператора continue
- •4.8. Оператор goto
- •5. Массивы и строки
- •5.1. Массивы
- •5.2. Строки
- •6. Функции
- •6.1. Общие сведения
- •6.2. Описание функции и ее тип
- •6.3. Вызов функции
- •6.4. Область действия переменной
- •6.5. Классы памяти
- •Глоссарий
- •10. Задания на лабораторные работы и методические указания к их выполнению
- •11. Задания на контрольную работу и методические указания к их выполнению
- •Оглавление
6.4. Область действия переменной
Область действия переменной – это правила, которые устанавливают, какие данные доступны из данного места программы.
С точки зрения области действия переменных различают три типа переменных: глобальные, локальные и формальные параметры. Правила области действия определяют, где каждая из них может применяться.
Локальные переменные - это переменные, объявленные внутри блока, в частности внутри функции. Язык С++ поддерживает простое правило: переменная может быть объявлена внутри любого блока программы. Локальная переменная доступна внутри блока, в котором она объявлена
Локальная переменная существует пока выполняется блок, в котором эта переменная объявлена. При выходе из блока эта переменная (и ее значение) теряется.
Пример 6_3. Использование локальных переменных.
#include "stdafx.h"
using namespace System;
void f(void);
int main()
{
int i = 1;
f();
Console::WriteLine("В функции main() значение i = " + i);
Console::ReadLine();
return 0;
}
void f(void)
{
int i = 10;
Console::WriteLine("В функции f() значение i = " + i);
}
Результат работы программы:
В функции f() значение i = 10
В функции main() значение i = 1
Пример показывает, что при вызове функции значение переменной i, объявленной в main(), не изменилось.
Формальные параметры - это переменные, объявленные при описании функций как ее аргументы. Функции могут иметь некоторое количество параметров, которые используются при вызове функций для передачи значений в тело функции. Формальные параметры могут использоваться в теле функции так же, как и локальные переменные, которыми они по сути дела и являются. Область действия формальных параметров - блок, являющийся телом функции.
Глобальные переменные - это переменные, объявленные вне какой-либо функции. В отличие от локальных переменных глобальные переменные могут быть использованы в любом месте программы, но перед их первым использованием они должны быть объявлены. Область действия глобальной переменной - вся программа.
Использование глобальных переменных имеет свои недостатки:
они занимают память в течение всего времени работы программы;
использование глобальных переменных делает функции менее общими и затрудняет их использование в других программах;
использование внешних переменных делает возможным появление ошибок из-за побочных явлений. Эти ошибки, как правило, трудно отыскать.
6.5. Классы памяти
В языке С++ есть инструмент, позволяющий управлять ключевыми механизмами использования памяти и создавать мощные и гибкие программы. Этот инструмент - классы памяти. Каждая переменная принадлежит к одному из четырех классов памяти. Эти четыре класса памяти описываются следующими ключевыми словами:
auto - автоматическая,
extern - внешняя,
static - статическая,
register - регистровая.
Тип памяти указывается модификатором - ключевым словом, стоящим перед спецификацией типа переменной. Например,
static int sum;
register int p;
Если ключевого слова перед спецификацией типа локальной переменной при ее объявлении нет, то по умолчанию она принадлежит классу auto. Поэтому практически никогда это ключевое слово не используется.
Автоматические переменные (auto) имеют локальную область действия. Они известны только внутри блока, в котором они определены. Автоматическая переменная создается (т.е. ей отводится место в памяти программы) при входе в
блок функции. При выходе из блока автоматическая переменная пропадает, а область памяти, в которой находилась эта переменная считается свободной и может использоваться для других целей.
Автоматические переменные хранятся в оперативной памяти машины, точнее в стеке. Регистровые (register) переменные хранятся в регистрах процессора. Доступ к переменным, хранящимся в регистровой памяти, осуществляется гораздо быстрее, чем к тем, которые хранятся в оперативной памяти. В остальном регистровые переменные аналогичны автоматическим переменным. Регистровая память процессора невелика, и если доступных регистров нет, то переменная становится просто автоматической. Описание регистровой переменной имеет вид
register int c;
Внешняя переменная (extern) относится к глобальным переменным. Она может быть объявлена как вне, так и внутри тела функции.
void f (void)
{
extern int k; // объявление внешней переменной внутри
// функции
…
}
Появление ключевого слова extern связано с модульностью языка С++, т.е. возможностью создавать многофайловую программу с возможностью раздельной компиляции каждого файла. Когда мы в одном из файлов опишем вне тела функции глобальную переменную
float x;
то для нее выделится место в памяти, в разделе переменных и констант. Если мы используем эту глобальную переменную в текущем файле выше ее объявления или в другом файле, то при раздельной компиляции без дополнительного объявления переменной компилятор не будет знать, что это за переменная. Использование объявления
extern float x;
не приводит к выделению памяти, а сообщает компилятору, что такая переменная будет описана либо ниже в текущем файле, либо в другом файле.
Пример 6_4. Использование глобальной переменной.
#include "stdafx.h"
using namespace System;
extern int i;
void fun1(void);
int main()
{
i++;
fun1();
i++;
Console::WriteLine("В функции main() значение i = " + i);
Console::ReadLine();
return 0;
}
int i = 10; // объявление глобальной переменной
// здесь под переменную выделяется память
void fun1(void)
{
i++;
Console::WriteLine("\nВ функции fun1() значение i = " + i);
}
Результат работы программы:
В функции fun1() значение i = 12
В функции main() значение i = 13
Одно и то же имя переменной может быть сначала описано на глобальном, а затем на локальном уровне. В таком случае локальная переменная "закроет" собой глобальную переменную в теле функции.
Для подобных ситуаций в языке C++ существует оператор расширения области видимости (::). Будучи примененным к переменной в теле функции, он позволяет сослаться на глобальную переменную с указанным именем, даже если в самой функции объявлена одноименная локальная переменная. Синтаксис оператора таков: ::переменная
Пример 6_5. Использование оператора расширения области видимости.
#include "stdafx.h"
using namespace System;
extern int m;
void fun1(void);
int main()
{
int m=100;
fun1();
m++;
::m++;
Console::WriteLine("В функции main() значение локальной m = " + m);
Console::WriteLine("В функции main() значение глобальной m = " + ::m);
Console::ReadLine();
return 0;
}
int m = 10; // объявление глобальной переменной
// здесь под переменную выделяется память
void fun1(void)
{
m++;
Console::WriteLine("\nВ функции fun1() значение глобальной m = " + m);
}
Результат работы программы:
В функции fun1() значение глобальной m = 11
В функции main() значение локальной m = 101
В функции main() значение глобальной m=12
При описании статических переменных перед описанием типа ставится ключевое слово static. Область действия локальной статической переменной – вся программа. Место в памяти под локальные статические переменные выделяется в начале работы программы в разделе глобальных и статических переменных. Однако область видимости локальных статических переменных такая же, как и у автоматических. Значение статических переменных сохраняется от одного вызова функции до другого. Локальные статические переменные инициализируются нулем, если не указан другой инициализатор. При этом описание с инициализацией
static int d = 5;
локальной статической переменной d вызывает однократную инициализацию переменной d при выделении под нее места. При последующих вызовах функции, в которой описана эта переменная, инициализации не происходит.
Пример 6_6. Использование статической переменной.
#include "stdafx.h"
using namespace System;
void f(void);
int main()
{
int i;
for (i=1; i<=3; i++)
f();
Console::ReadLine();
return 0;
}
void f(void)
{
static int c = 10;
c++;
Console::WriteLine("\nВ функции f() значение c = " + c);
}
Результат работы программы:
В функции f() значение с = 11
В функции f() значение c = 12
В функции f() значение c = 13
Тестовые задания
ЗАДАНИЕ 1
Определите результат работы программы
void schet(int c, int d)
{
c+=3;
d+=10;
}
int main()
{
int x = 14, y=30;
schet( x, y);
Console::WriteLine("x={0}, y={1}", x, y);
return 0;
}
Варианты ответов
1. x=27, y=43
2. c=17, d=40
3. x=14, y=30
4. x=24, y=33
ЗАДАНИЕ 2
Определите результат работы программы
void schet (int m, int c)
{ m += 15;
c += 2;
}
int main()
{
int m = 10, c = 20;
schet(m, c);
Console::WriteLine("m={0}, c={1}", m, c);
return 0;
}
Варианты ответов
1. m=10, c=20
2. m=25, c=22
3. m=15, c=2;
4. m=27, c=37
ЗАДАНИЕ 3
Определите результат работы программы
void Schet(int k)
{
k += 10;
}
int main()
{
int k = 3;
for (int i=1; i<3; i++)
Schet(k);
k += 20;
Console::WriteLine("k={0}",k);
return 0;
}
Варианты ответов
1. k=43
2. k=3
3. k=23
4. k=53
ЗАДАНИЕ 4
Определите результат работы программы
extern int m;
void fun( int y)
{
m += 8;
y += 10;
}
int m = 10;
int main()
{ int b = 4;
m += 5;
fun( b);
Console::WriteLine(" b = " + b + " m = " + m);
return 0;
}
Варианты ответов
1. b=4 m=10
2. b=4 m=23
3. b=14 m=23
4. b=4 m=15
ЗАДАНИЕ 5
Определите результат работы программы
void fun()
{ static int y = 24;
y ++;
Console::Write(" y = " + y);
}
int main()
{ int c;
for ( c = 1; c <= 3; c++)
fun();
Console::ReadLine();
return 0;
}
Варианты ответов
1. y=24 y=24 y=24
2. y=25 y=26 d=27
3. y=24 y=25 y=26
4. y=25 y=25 y=25