- •Часть 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. Динамические структуры данных
- •Варианты индивидуальных заданий
8.7. Оператор typedef
Используя ключевое слово typedef, можно определять новые типы данных (точнее, определять новое имя для уже существующего типа). Это может быть полезным при обеспечении переносимости программ или для более удобного представления типов данных.
Общий вид оператора typedef такой:
typedef тип новое_имя_типа;
где тип – имя любого типа данных Си, а новое_имя_типа – новое имя этого типа, которое будет использоваться совместно с этим типом данных.
Например, если в коде программы по ошибке вместо int написано integer, можно решить эту проблему разными способами, в том числе и следующим:
typedef int integer;
Однако нужно помнить, что новый тип данных не создаётся, а только определяется новое имя для уже существующего типа.
8.8. Поля битов в структурах
Поля битов позволяют помещать, например, в ячейку памяти типа int, несколько различных переменных. Поле представляет собой набор смежных бит, внутри одной переменной типа int.
Синтаксис определения и обработки полей базируется на структурах. В общем виде определение поля следующее:
тип имя : длина;
Тип может быть signed int или unsigned int. При этом каждому полю выделяется столько бит, сколько указано.
struct
{
unsigned int pol:1;
unsigned m:1;
int k:2;
} stat;
Обращение к полям осуществляется следующим образом
stat.pol = 0;
Как и элемент структурной переменной, каждое поле доступно с помощью оператора точка.
Поля позволяют рационально использовать свободную память. Однако, существуют и минусы их использования: невозможно получить адрес поля; манипуляции с битовыми полями машинно-зависимы (например, в некоторых машинах битовые поля могут пересекать границы машинного слова, тогда как в других машинах это недопустимо); использование полей битов может привести к тому, что компилятор будет генерировать машинный код, который выполняется с низкой скоростью (приходится использовать дополнительные операции машинного языка для получения доступа к отдельным частям адресуемых элементов памяти).
8.9. Объединения
Объединение внешне напоминает структуры и может хранить в различные моменты времени данные различного типа и размера. Как и для структур, объявление объединения состоит из:
задание шаблона объединения;
объявление переменной типа объединения.
Объявление объединения начинается с ключевого слова union и в общем случае выглядит следующим образом:
union [имя_типа_объединения]
{
тип имя_члена;
тип имя_члена;
.
.
.
тип имя_члена;
} [одна или более переменных объединения];
Например:
union pole { int n; float m; char s; } var; |
|
По сути, объединения – это структуры с нулевым смещением элементов структуры относительно ее начала. Объем выделяемой памяти под объединение равен размеру самого большого элемента в объединении.
Доступ к членам объединения осуществляется с помощью оператора точка (для получения доступа к объединению с помощью указателя используется оператор стрелка ->).
var.m = 1; // элементу m из var присваивается значение 1
void f1(union pole *p)
{
...
p->m = 2; // элементу m из var присваивается значение 2
...
}
Следует помнить, что, поскольку отдельные члены объединения разделяют между собой одни и те же участки памяти, изменение одного из них приводит к изменению остальных. Например, для приведённой структуры справедливо следующее:
var.m = 0; // теперь все члены объединения равны 0
var.s = 65; // после этого младший байт двух остальных
// членов объединения станет равным 65, т.е.,
// например, при чтении var.n получим тоже 65
