
- •Часть 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. Динамические структуры данных
- •Варианты индивидуальных заданий
4.2. Многомерные массивы и их инициализация
Массивы в Си могут иметь несколько индексов. Многомерные массивы часто применяются для представления таблиц, состоящих из значений, упорядоченных по строкам и столбцам. Для обращения к конкретному элементу массива нужно указать два индекса: первый, идентифицирующий строку элемента, и второй, идентифицирующий столбец. Массивы, требующие двух индексов для обращения к элементам, называются двумерными массивами. Существуют также трехмерные, четырехмерные и т.д., многомерные массивы, которые, в общем случае, могут иметь более двух индексов.
Рис.4.2 иллюстрирует двумерный массив b. Массив содержит три строки и четыре столбца, поэтому говорят, что это массив 3 на 4. В общем случае, массив с m строками и n столбцами называется массивом m на n.
На рис.4.2 каждый элемент массива идентифицируется как b[i][j]; здесь b имя массива, i и j его индексы, которые однозначно определяют каждый элемент в массиве b.
Рис.4.2. Двумерный массив с тремя строками и четырьмя столбцами
Многомерный массив, как и одномерный, может быть инициализирован при его объявлении. Например, двумерный массив с[2][2] может быть объявлен и инициализирован следующим образом:
int c[2][2] = {{1,2},{3,4}};
либо так
int c[2][2] = {1,2,3,4};
Значения в фигурных скобках в первом объявлении группируются по строкам.
Если для данного массива недостаточно инициализирующих значений, оставшиеся его элементы инициализируются нулями. Таким образом, объявление
int c[2][2] = {{1},{3,4}};
инициализировало бы с[0][0] единицей, с[0][1] нулем, c[1][0] тройкой и c[1][1] четверкой.
Двумерные массивы хранятся в памяти по строкам.
4.3. Объявление указателей
Си поддерживает два способа доступа к переменным:
1) прямой доступ при помощи переменных, например:
int a;
a = 5;
2) косвенный доступ с использованием указателей, который и будет рассмотрен ниже.
Указатель – это переменная, значением которой является адрес другой переменной. Указатель может указывать на данные любого типа.
При объявлении переменной типа указатель необходимо явно определить тип данных, адрес которых будет содержать эта переменная, и имя указателя (идентификатор) с предшествующей звездочкой.
Формат объявления указателя:
тип_данных *идентификатор;
Например,
int *p1; // указатель на переменную типа int;
float *p2; // указатель на переменную типа float;
char *p3; // указатель на переменную типа char;
Символ * обязателен и идентифицирует переменную, стоящую справа от неё, как указатель.
Следует обратить внимание на то, что при объявлении нескольких укзателей звездочка ставится перед каждым из них.
Например,
int *p1, *p2;
означает создание двух указателей. Если же записать объявление так:
int *p1, p2;
то компилятор создаст один указатель (p1) и одну переменную целого типа (p2).
4.4. Операции над указателями
В Си для работы с указателями используются следующие основные операции:
1) Взятие адреса
Операция взятия адреса & является унарной операцией, которая возвращает адрес своего операнда. Используется также при вызове функции scanf, для сообщения ей ячейки памяти, в которую следует поместить введенное значение.
При работе с указателями операция взятия адреса используется следующим образом:
int *p;
int a, c[20];
p = &a;
Теперь значением указателя p является адрес целой переменной a, то есть p указывает на a.
Операция взятия адреса не может применяться к константам (кроме объявленных при помощи ключевого слова const), а также к выражениям или к переменным, объявленным с модификатором register. Например, недопустимы следующие выражения:
a) &(a+1) // попытка взять адрес выражения
б) &5 // попытка взять адрес числовой константы 5
в) &c // т.к. имя массива является указателем-константой на первый элемент массива
Последний случай (взятие адреса массива) успешно компилируется и выполняется в Borland C++ 3.1. При этом результатом взятия адреса является указатель на первый элемент массива. Между тем, другие компиляторы могут интерпретировать подобную запись иначе, поэтому использование этой конструкции не рекомендуется.