- •Предисловие
- •Введение
- •Введение в программирование
- •1.1. Предисловие к курсу
- •1.2. Идеология языка
- •1.3. Обзор среды Microsoft Developer Studio
- •1.4. Жизненный цикл программного обеспечения
- •1.5. Общая структура программы
- •1.6. Директивы препроцессора
- •1.7. Построение исполняемого файла
- •1.8. Строительные блоки программы
- •Контрольные вопросы
- •Типы данных. Переменные. Массивы. Операции и Указатели
- •Стандартные типы и размеры данных
- •2.1.1. Объявление переменных
- •Управляющие символьные константы
- •2.2. Объявление указателя
- •2.2.1. Операции разыменования и взятия адреса
- •2.2.2. Указатели на указатели
- •2.2.3. Арифметические операции с указателями
- •2.3. Массивы
- •2.3.1. Инициализация массивов
- •2.3.2 Динамические массивы
- •2.3.3. Методы доступа к элементам массивов
- •2.3.4. Массивы указателей
- •2.4. Строки
- •2.5. Операции
- •2.5.1. Арифметические операции
- •Арифметические операции
- •2.5.2 Операции сравнения и логические операции
- •Операции сравнения и логические операции
- •2.5.3. Побитовые операции
- •Побитовые операции
- •Контрольные вопросы
- •3.1. Базовые операторы
- •3.1.1. Оператор выражение
- •3.2.2. Оператор switch
- •3.3.4. Оператор goto
- •3.4. Операторы цикла
- •3.4.1. Оператор for
- •3.4.2. Оператор while
- •3.4.3. Оператор do..While
- •Контрольные вопросы
- •Стандартный ввод/вывод. Работа с файлами.
- •4.1. Роль стандартного ввода/вывода
- •4.1.1. Основные функции стандартного ввода/вывода
- •4.2. Понятие файла
- •4.2.1. Строение файлов
- •4.2.2. Порядок работы с файлом
- •4.2.3. Обзор библиотечных функций с для работы с файлами
- •4.3. Программные конструкции при работе с файлами
- •4.3.1. Открытие/закрытие файла
- •4.3.2. Цикл посимвольного чтения содержимого файла
- •4.3.3. Цикл построчного чтения содержимого файла
- •Контрольные вопросы
- •Функция. Пользовательские типы данных.
- •5.1. Понятие функции
- •5.1.1. Определение функции
- •5.1.2. Формальные параметры
- •5.1.3. Тип возвращаемого значения
- •5.1.4. Тело функции
- •5.1.5. Фактические параметры
- •5.1.6. Рекурсивные вызовы
- •5.1.7. Передача параметров
- •5.1.8. Библиотеки стандартных функций
- •5.2. Пользовательские типы данных.
- •5.2.1. Ключевое слово typedef
- •5.2.2. Перечислимый тип данных
- •5.2.3. Понятие структуры
- •5.2.4. Указатели на структурный объект
- •Контрольные вопросы
- •Работа с динамической памятью. Динамические структуры данных
- •6.1. Работа с динамической памятью
- •6.1.1. Статическое и динамическое распределение памяти
- •6.1.2. Основные принципы динамического распределения
- •6.1.3. Способы работы с динамической памятью
- •6.2. Динамические структуры данных
- •6.2.1. Стек
- •6.2.2.Линейный список
- •Контрольные вопросы
- •Объектно-ориентированное программирование
- •7.1. Критерии качества декомпозиции проекта
- •7.2. Новые концепции программирования
- •7.3. Достоинства ооп
- •7.4. Объекты и классы в ооп
- •7.4.1. Определение класса
- •7.4.2. Использование класса
- •7.4.3. Вложенные классы
- •Контрольные вопросы
- •Конструкторы и Перегрузка операций.
- •8.1. Перегрузка операций
- •8.1.1. Перегрузка операций внешними функциями
- •8.1.2. Перегрузка операций методами класса
- •8.2. Конструкторы и деструктор
- •8.2.1. Конструкторы и параметры
- •Контрольные вопросы
- •9.1. Простое открытое наследование
- •9.1.1 Конструкторы и деструкторы при наследовании
- •9.1.2. Поля и методы при наследовании
- •9.1.3. Вложенные классы и наследование
- •9.1.4. Закрытое наследование
- •9.1.5. Виртуальные функции
- •9.1.6. Чистые виртуальные функции и абстрактные классы
- •9.3. Основы программирования под Windows
- •9.3.1. Типы данных в Windows
- •9.4. Cреда Microsoft Developer Studio
- •9.4.1. Библиотека mfc
- •9.4.2. Архитектура приложения
- •9.4.3. Каркас приложения
- •9.4.4. Проект приложения
- •Контрольные вопросы
- •Заключение
- •Список Литературы
1.6. Директивы препроцессора
Язык С разрабатывался как компактный, платформонезависимый, позволяющий создавать наиболее быстрые и компактные программы, поэтому в ядро языка были включены правила синтаксического разбора и ограниченный набор операторов для реализации базовых алгоритмов.
Все другие средства: математические вычисления, работа со строками, ввод/вывод, работа с файлами – были оформлены в виде функций и помещены в библиотеки.
В 1989 году появился стандарт языка С (ANSI C). Этот документ определил, какие библиотеки следует считать стандартными и включать в любой пакет разработчика. Стандартные библиотеки обеспечивают доступ к важнейшим системным функциям, минуя системозависимые аспекты. Так, например, математическая функция sin () вычисляет синус вещественного числа, скрывая от пользователя особенности работы конкретного процессора.
Использование функций стандартных библиотек, с одной стороны гарантирует их безошибочную работу (стандартные библиотеки тестируются с особенной тщательностью), а с другой – вычисление по известным и проверенным алгоритмам, которые не всегда являются оптимальными по размеру и скорости. Поэтому некоторые разработчики не останавливаются только на стандартных библиотеках, но и проектируют свои, приспособленные для наилучшей работы в определенных ОС и на аппаратных платформах.
Основные стандартные библиотеки С/С++ приведены в табл. 1.
Таблица 1
Основные стандартные библиотеки С/С++
Название |
Назначение и содержание |
1 |
2 |
math.h |
математические функции. |
ctype.h |
библиотека символьных функций |
string.h |
библиотека строковых функций |
iostream.h |
операторы стандартного ввода/вывода |
stdio.h |
функции стандартного ввода/вывода |
stdlib.h |
библиотека функций для работы с динамической памятью |
alloc.h |
работа со случайными числами, преобразования типов |
conio.h |
работа с терминалом |
time.h |
библиотека предназначена для работы со временем и датой |
Для использования функций из стандартных библиотек необходимо включить в файл с исходным текстом программы соответствующий заголовочный файл, содержащий прототипы функций и макроопределения. В современных пакетах процесс компиляции и сборки исполняемого файла автоматизирован настолько, что код библиотеки включается в программу без участия разработчика.
Директивы препроцессора, по сути, не являются составной частью языка С, а используются для подстановки кода в текст программы. Препроцессор – это особая программа, которая выполняет предварительную обработку данных до начала компиляции. Рассмотрим стандартные директивы препроцессора.
Директива #include. Директива #include, которая используется фактически во всех программах для включения в текст программы заголовочных файлов (с определениями), имеющий расширение .h, или файлов .с (не содержащих функцию main ()).
Эта директива может использоваться в двух формах:
#include <имя файла>
или
#include "имя_файла"
Если имя файла заключено между знаками "<" и ">", то он считается частью стандартной библиотеки, поставляемой вместе с компилятором. Если же имя файла заключено в двойные кавычки, то считается, что он расположен в той же папке, что и файл с исходным кодом.
Директива #define. Директива #define указывает препроцессору на необходимость выполнить подстановку в тексте программы определенной последовательности символов другой последовательностью. Формат директивы:
#define заменяемая_последовательность фрагмент_подстановки
Например:
#define MyName "John Smith"
#define Condition (a > b)
#define Operation a = b
…
char str[] = MyName; //Равнозначно char str[] = "John Smith";
int a, b;
if Condition Operatrion; //Равнозначно if (a > b) a = b;
В директиве #define могут использоваться параметры, благодаря чему она становится очень мощный и гибким инструментом, позволяющим заменять один простой текстовый элемент сложным выражением.
Директивы условной компиляции. Некоторые задачи отличаются лишь некоторыми параметрами, это позволяет создавать на языке С универсальный программный код. Однако для этого следует каким-то образом заменить те параметры, которые отличаются. Для таких целей используются директивы условной компиляции #ifdef, #ifndef, #else и #endif, а также #if и #elif.
Синтаксис для директивы #ifdef:
#ifdef имя_макроса
последовательность_операторов_1
#else
последовательноеть_операторов_2
#endif
Если имя макроса определено в программе, то компилируется первая последовательность операторов, в противном случае – вторая последовательность (ветка #else может и отсутствовать).
Синтаксис для директивы #ifndef:
#ifndef имя_макроса
последовательность_операторов_1
#else
последовательность_операторов_2
#endif
В данном случае, в отличие от директивы #ifdef, первая последовательность операторов выполняется в том случае, если имя макроса в программе не определено.
Для условной компиляции можно также воспользоваться директивами #if, #elif. Их синтаксис:
#if выражение1
последовательность_операторов_1
#elif выражение2
последовательность_операторов_2
#else
последовательность_операторов_3
#endif
Эта конструкция работает аналогично условному оператору if-else. Компилятор оценивает выражения после #if и #elif до тех пор, пока одно из них не даст в результате TRUE, после чего в текст программы подставляется соответствующая последовательность операторов. Если оба выражения дают FALSE, то подставляется последовательность операторов после директивы #else (если она присутствует).