
- •Часть 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. Динамические структуры данных
- •Варианты индивидуальных заданий
1.7. Структура простой программы на языке Си
Программа на языке Си состоит из одной или нескольких функций, причем одна из них обязательно должна иметь имя main. При запуске программы система передает управление функции main, т.е. именно с main начинается выполнение всей программы.
Структуру простой программы на языке Си можно представить таким образом:
#include <stdio.h> //Подключение библиотеки функций
//стандартного ввода/вывода
void main()
{
Объявления данных
Последовательность операторов
}
Следует отметить, что на языке Си в принципе возможно написать программу, содержащую только имена переменных и ключевые слова. Но обычно так не поступают, потому что в Си нет ключевых слов для выполнения многих операций, например, таких как ввод/вывод, вычисление математических функций, обработка строк и т.п. Поэтому в большинстве программ присутствуют вызовы различных функций, хранящихся в библиотеке стандартных функций Си. Для этого необходимые разделы системной библиотеки подсоединяют к программе с помощью директивы #include.
Пример простой программы на языке Си:
#include <stdio.h>
main()
{
//Переменные, используемые в функции main
int i=2, j=3, k;
//Вычисления
k = i+j;
//Вывод результатов
printf(“Результат i+j равен: %d”, k);
}
В результате выполнения программы на экране появится:
Результат i+j равен: 5
В первой строке программы стоит команда #include, в соответствии с которой к программе будет подсоединен раздел системной библиотеки, содержащий прототипы функций ввода/вывода на стандартные устройства – stdio.h. Далее объявляются переменные k, i и j, происходит вычисление выражения k=i+j. Функция printf выводит на экран значение переменной k.
2. Операции и выражения
2.1. Выражение и его интерпретация
Выражение в языке Си – это последовательность операндов, операций и символов-разделителей. Операнды – это переменные, константы либо другие выражения. Разделителями в Си являются символы
[] () {} , ; : … * = # ,
каждый из которых выполняет свою функцию. Выражение может состоять из одной или нескольких операций и определять выполнение целого ряда элементарных шагов по преобразованию информации. Компилятор соблюдает строгий порядок интерпретации выражений, называемый правилами предшествования. Этот порядок может быть изменён, если отдельные части выражений заключить в круглые скобки. Элементарная операция по преобразованию информации задаётся знаком операции.
По числу операндов, участвующих в операции, различают две группы операций: унарные (один операнд) и бинарные (два операнда). По типу выполняемой операции различают операции отношения, арифметические, поразрядные логические операции и др. Кроме этого, Си имеет несколько специальных операций для частных задач.
2.2. Основные операции
2.2.1. Арифметические операции
В таблице 2.1 перечислены допустимые арифметические операции языка Си. Операции +, –, * и / работают в Си точно так же, как и в большинстве других языков. Их можно применять практически ко всем встроенным типам данных. Когда / применяется к целому числу или символу, остаток отбрасывается, например: 10 / 3 равно 3.
Операция взятия по модулю % выдает остаток от целочисленного деления. Операция % не может использоваться с типами float и double. Следующий фрагмент демонстрирует его использование:
int x, у;
х = 10;
y = 3;
printf ("%d", x/y); // выводит 3
printf("%d", х%у) ; // выводит 1 – остаток
// целочисленного деления
х = 1;
y = 2;
printf("%d %d", x/y, x%y); // выводит 0 и 1
Последняя строка печатает 0 и 1, т.к. в результате целочисленного деления 1/2 получается 0, с остатком 1. 1%2 выдает остаток 1.
Унарный минус фактически умножает одиночный операнд на –1, то есть число, перед которым стоит знак минус, меняет свой знак.
Таблица 2.1. Арифметические операции
Операция |
Действие |
– + * / % –– ++ |
Вычитание, а также унарный минус Сложение Умножение Деление Взятие по модулю (остаток) Инкремент Декремент |
Язык Си предоставляет две полезные операции, обычно отсутствующие в других языках. Это операции инкремента и декремента, ++ и ––. Операция ++ добавляет 1 к операнду, а –– вычитает 1. Поэтому следующие операции эквивалентны:
x = х + 1;
это то же самое, что и
++x;
Аналогично
x = x – 1;
это то же самое, что и
––x;
Как операция инкремента, так и операция декремента могут стоять перед операндом (префиксный) или после операнда (постфиксный). Например:
х = х + 1;
может быть записано как
++x;
или
х++;
Тем не менее, существует разница использования префиксной и постфиксной операций в выражениях. Когда операция инкремента или декремента стоит перед операндом, язык Си производит увеличение или уменьшение до получения значения операнда. Если операция следует за операндом, Си получает значение операнда перед его увеличением или уменьшением. Рассмотрим следующий пример:
х = 10;
у = ++x;
В этом случае у устанавливается в значение 11. А если записать это как
х = 10;
y = x++;
то у будет иметь значение 10. В обоих случаях х устанавливается в 11.