
- •Часть 1
- •Общие сведения Сведения об эумк
- •Методические рекомендации по изучению дисциплины
- •Рабочая учебная программа
- •Учреждение образования
- •«Белорусский государственный университет
- •Информатики и радиоэлектроники»
- •Часть 2 __184__
- •Содержание дисциплины
- •1. Индивидуальные практические занятия, их характеристика
- •2. Контрольные работы, их характеристика
- •3. Курсовой проект, его характеристика
- •4. Литература
- •4.1. Основная
- •4.2. Дополнительная
- •5. Перечень компьютерных программ, наглядных и других пособий, методических указаний и материалов и технических средств обучения
- •Протокол согласования учЕбной программы по изучаемой учебной дисциплине с другими дисциплинами специальности
- •Теоретический раздел Введение
- •1. Основные типы данных
- •1.1. Общие сведения
- •1.2. Данные типа int
- •1.3. Данные типа char
- •1.4. Модификаторы доступа const и volatile
- •1.5. Данные вещественного типа (с плавающей точкой)
- •1.6. Элементарный ввод-вывод
- •1.7. Структура простой программы на языке Си
- •2. Операции и выражения
- •2.1. Выражение и его интерпретация
- •2.2. Основные операции
- •2.2.1. Арифметические операции
- •2.2.2. Побитовые логические операции
- •2.2.3. Операции сдвига
- •2.2.4. Операция присваивания
- •2.2.5. Операция sizeof
- •2.2.6. Преобразование типов в выражениях
- •2.2.7. Операция преобразования типов
- •2.2.8. Приоритеты в языке Си
- •3. Операторы управления вычислительным процессом
- •3.1. Оператор if
- •3.2. Операции отношения
- •3.3. Логические операции
- •3.4. Операция запятая
- •3.5. Операция условия ?:
- •3.6. Оператор безусловного перехода goto
- •3.7. Оператор switch
- •`` ` `3.8. Операторы цикла
- •3.8.1. Оператор for
- •3.8.2. Оператор while
- •3.8.3. Оператор do...While
- •3.9. Оператор break
- •3.10. Оператор continue
- •4. Массивы и указатели
- •4.1. Одномерные массивы и их инициализация
- •4.2. Многомерные массивы и их инициализация
- •4.3. Объявление указателей
- •4.4. Операции над указателями
- •1) Взятие адреса
- •2) Косвенная адресация или разыменование указателя
- •3) Увеличение или уменьшение значения указателя на целое число
- •4) Разность указателей
- •5) Сравнение указателей
- •6) Присваивание указателей друг другу
- •4.6. Связь между указателями и массивами
- •4.7. Динамическое распределение памяти
- •4.8. Массивы указателей
- •5. Функции
- •5.1. Общие сведения
- •5.2. Область видимости переменных
- •5.2.1. Локальные переменные
- •5.2.2. Глобальные переменные
- •5.3. Передача параметров в функцию
- •5.4. Рекурсивные функции
- •5.5. Использование функций в качестве параметров функций
- •5.6. Указатели на функции
- •5.7. Структура программы на Си
- •5.8. Передача параметров в функцию main()
- •6. Строки
- •7. Классы хранения и видимость переменных
- •7.1. Общие сведения
- •7.2. Автоматический класс хранения (auto)
- •7.3. Регистровый класс хранения (register)
- •7.4. Статический класс хранения (static)
- •7.5. Внешний класс хранения (extern)
- •7.6. Заключение
- •8. Структуры, объединения и перечисления
- •8.1. Общие сведения
- •8.2. Инициализация структурных переменных
- •8.3. Вложенные структуры
- •8.4. Указатели на структуры
- •8.5. Массивы структурных переменных
- •8.6. Передача функциям структурных переменных
- •8.7. Оператор typedef
- •8.8. Поля битов в структурах
- •8.9. Объединения
- •8.10. Перечисления
- •9. Динамические структуры данных
- •9.1. Общие сведения
- •9.2. Связные списки
- •9.2.1. Односвязные списки
- •9.2.2. Двусвязные списки
- •9.2.3. Циклические списки
- •9.3. Стеки
- •9.4. Очереди
- •9.5. Деревья
- •9.5.1. Понятие графа
- •9.5.2. Бинарные деревья
- •10. Файлы
- •10.1. Общие сведения
- •10.2. Открытие и закрытие файлов
- •10.3. Функции ввода-вывода для работы с текстовыми файлами
- •10.4. Произвольный доступ к файлу
- •10.5. Функции ввода-вывода для работы с бинарными файлами
- •11. Директивы препроцессора
- •11.1. Основные понятия
- •11.2. Директива #include
- •11.3. Директивы препроцессора #define и #undef
- •11.3.1. Символические константы
- •11.3.2. Макросы с параметрами
- •11.3.3. Директива #undef
- •11.4. Условная компиляция
- •11.5. Директивы # и ##
- •12. Модульное программирование
- •13. Введение в объектно-ориентированное программирование
- •13.1. Постановка задачи
- •13.2. Решение задачи средствами Си
- •13.5. Наследование
- •13.6. Перегрузка
- •13.7. Ссылочный тип
- •Литература
- •Приложение 1. Рекомендации по оформлению текстов программ
- •Тесты к теоретическому разделу Вопросы к разделу 1. Основные типы данных
- •Вопросы к разделу 2. Операции и выражения
- •Вопросы к разделу 3. Операторы управления вычислительным процессом
- •Вопросы к разделу 4. Массивы и указатели
- •Вопросы к разделу 5. Функции
- •Вопросы к разделу 6. Строки
- •Вопросы к разделу 7. Классы хранения и видимость переменных
- •Вопросы к разделу 8. Структуры, объединения и перечисления
- •Вопросы к разделу 9. Динамические структуры данных
- •Вопросы к разделу 10. Файлы
- •Вопросы к разделу 11. Директивы препроцессора
- •Вопросы к разделу 12. Модульное программирование
- •Вопросы к разделу 13. Введение в ооп
- •Правильные ответы на вопросы тестов к теоретическому разделу
- •Вопросы к теоретическому зачету
- •Варианты индивидуальных заданий
- •Контрольная работа №2
- •Варианты индивидуальных заданий
- •Индивидуальные практические работы Указания к выбору варианта индивидуальных практических работ
- •Индивидуальная практическая работа № 1. Массивы и строки
- •Варианты индивидуальных заданий
- •Индивидуальная практическая работа № 2. Динамические структуры данных
- •Варианты индивидуальных заданий
7.5. Внешний класс хранения (extern)
Не все переменные должны быть скрытыми для функций, находящихся в других файлах, в противном случае вообще программы как единого целого не существовало бы. Поэтому в Си введен внешний класс хранения, позволяющий объявлять в функциях глобальные переменные, определенные после тел функций или в других файлах.
Приведем пример объявления переменной после ее первого использования:
#include <stdio.h>
void main(void)
{
printf("\ni=%5.2f", i);
}
float i = 10.25;
При компиляции будет выдана ошибка: неопределенный символ i. И правда, область видимости глобальной переменной – от момента объявления до окончания выполнения программы. В примере – ошибка, которую можно исправить путем добавления в функцию main перед строкой
printf("\ni=%5.2f", i);
строки
extern float i;
Это объявление переменной происходит без выделения памяти на нее, а лишь сообщает компилятору, что переменная объявлена и описана (с выделением памяти) после функции main в нашем случае. При объявлении переменной со спецификатором класса хранения extern подразумевается, что она уже существует, инициализировать переменную каким-либо значением нельзя.
Однако чаще всего ключевое слово extern используется, если область видимости глобальной переменной, описанной в одном файле, нужно расширить на функцию, находящуюся в другом файле:
/* исходный файл file1.cpp */
main()
{
...
}
funс1()
{
extern double i;
...
}
/* исходный файл file2.cpp */
double i = 9.36;
funс2()
{
...
}
Переменная i описана в файле file2.cpp, по умолчанию она – static, т.е. в других файлах не видна. Чтобы сделать ее видимой для функции func1 объявляется i в этой функции как extern. Необходимо отметить, что для функции main эта переменная по-прежнему будет недоступна. То есть, описан с выделением памяти один объект (в нашем случае переменная) может быть только единожды, объявлять же ее как внешнюю можно сколь угодно большое число раз. При разработке больших программных проектов обычно включают объявления extern в заголовочные файлы, которые затем подключаются к каждому файлу исходного текста программы. Это – очевидное упрощение по отношению к ручному объявлению переменных, которое может привести к ошибкам.
7.6. Заключение
Подведем итоги.
Глобальные переменные могут объявляться со спецификаторами классов хранения static и extern. Локальные переменные – с любым из четырех спецификаторов.
Любая локальная переменная по умолчанию – auto, любая глобальная – static. Локальные переменные auto и register автоматически не инициализируются никакими осмысленными значениями; и локальные, и глобальные static инициализируются нулем.
Переменная, объявленная глобально, видима в пределах остатка исходного файла, в котором она определена. Выше своего описания и в других исходных файлах эта переменная невидима, пока не объявлена как extern. В другом исходном файле может быть объявлена другая глобальная переменная с таким же именем и с классом хранения static, области видимости этих переменных не пересекаются, поэтому ошибок не будет.
Подводя итог, можно составить таблицу 7.1, суммирующую информацию о классах хранения.
Таблица 7.1. Информация о классах хранения
Класс хранения |
Место хранения |
Время жизни |
Область видимости |
автоматический (auto) |
сегмент стека |
равно времени выполнения программного блока |
внутри блока программы, в котором объявлена |
регистровый (register) |
регистры процессора (если доступны) |
--//-- |
--//-- |
локальный статический (static) |
сегмент данных |
равно времени выполнения всей программы |
--//-- |
глобальный статический (static) |
--//-- |
--//-- |
файл, в котором глобально объявлена |
внешний (extern) |
--//-- |
--//-- |
внутри всего проекта (даже, если программа состоит из нескольких файлов) |