- •Предисловие
- •Введение
- •Введение в программирование
- •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.7. Построение исполняемого файла
В создании готовой программы на С++ принимают участие несколько инструментальных средств, входящих в пакет разработчика. К ним относятся:
Текстовый редактор должен обеспечивать подсветку синтаксиса, то есть выделять разными цветами синтаксические элементы программы для улучшения восприятия. Сохранять результат работы редактор должен в виде простого текста без разметки и управляющих символов (чистый ASCII-код).
Препроцессор – средство предназначено для предварительной обработки текста программы, подстановки в текст макроопределений, включения текста заголовочных файлов.
Компилятор производит перевод текста на С++ в машинный код и создает объектный файл, который пока еще не готов к исполнению.
Компоновщик компонует один или несколько объектных файлов с кодом библиотек, связывает вызовы функций с точками входа в соответствующие участки кода, образуя выполняемый EXE файл.
Отладчик служит для поиска ошибок выполнения, просмотра во время выполнения программы значений переменных, участков памяти и т.п.
Текст программы помещается в один или несколько исходных файлов, по традиции имеющих расширение *.с или *.срр.
Каждый файл последовательно обрабатывает препроцессор с компилятором, выявляя ошибки компиляции (errors) и предупреждения (warnings). При наличии в тексте программы ошибок компиляция прекращается до их устранения и новой компиляции. После компиляции всех исходных файлов запускается компоновщик, который также может выдавать сообщения об ошибках. При правильно составленной программе весь процесс заканчивается появлением исполняемого файла, который, однако, еще не гарантирует правильного выполнения (при наличии ошибок выполнения).
1.8. Строительные блоки программы
Объекты разработки программы строятся и проектируются, как совокупность частей, согласованная работа которых и реализует заданные функциональные возможности. Традиционно выделяют 5 уровней исходного текста программы, составляющих в целом АРХИТЕКТУРУ ПО:
Атомарный уровень – первый уровень, состоящий из исходных конструкции самого языка программирования: операторы, операции, символические обозначения переменных и функций. Данный уровень можно назвать атомарным, поскольку он оперирует наименьшими программными конструкциями и исходными понятиями (алфавитом, операциями и т.д.). Атомарный уровень является необходимым в любой программе, как в простой, так и в сложной. Для того чтобы составлять программы на этом уровне, необходимы минимальные знания синтаксиса языка и базовых алгоритмов.
На втором уровне располагаются составные операторы, состоящие из выражений первого уровня и выполняющие в программе определенную задачу.
Например, чтение строк с клавиатуры до появления пустой осуществляется посредством:
char buf[80]; while(*gets(buf));
цикл построкового чтения файла:
while(fgets(buf,255,fp)).
Преимущество этих конструкций заключается в том, что их можно использовать практически без изменений в различных программах, что позволяет сосредоточить больше внимания на предметной области и повысить скорость разработки.
Процедуры (функции). Основным структурным элементом языка С является функция. Функция представляет собой исчерпывающее решение какой-либо небольшой задачи и представляет собой в С/C++ структурную единицу программы. Любая программа на C/С++ состоит минимум из одной функции (main), а максимальное их количество неограниченно. Оптимальный размер тела функции составляет 5-20 строк, по одному – два выражения в каждой. Однажды написанная и протестированная функция может многократно использоваться в пределах одной программы при разных наборах входных данных, осуществляя их обработку по некоторому алгоритму. Функция может считаться относительно независимой частью программы и переноситься в другие проекты по разработке ПО.
Модули-объекты. Большие программные комплексы состоят из огромного количества функций. Одной из важнейших задач в этом случае является их организация и размещение в проекте. Понятие микрозадачи, решаемой одной функцией, становится слишком малым для таких проектов, поэтому вводится макрозадача, решение которой осуществляется модулем. Модуль - это набор функций, как правило, размещенных в одном файле и определенным образом связанных друг с другом для решения макрозадачи. Например, в программе может быть модуль обработки текстовой информации, модуль интерфейса, модуль ввода-вывода. Аналогом модулей в процедурно-ориентированном и в объектно-ориентированном программировании является описание класса, или внутренней структуры объекта.
Библиотеки функций и классов. Наборы функций и иерархии классов образуют библиотеки. Содержимое библиотек должно быть универсально для решения широкого круга задач. Например, существуют библиотеки для работы с графикой (OpenGL, DirectX), со временем для обеспечения функций связи. Существующие библиотеки классов (Microsoft MFC, Borland OWL) облегчают создание Windows-приложений. Работа с текстом программы на последних двух уровнях требует от разработчика развитого абстрактного мышления и, как профессиональная деятельность, оценивается очень высоко.
Состав языка. В тексте, написанном на обычном разговорном языке, можно выделить символы, слова, словосочетания и предложения, причем более крупные единицы слагаются из мелких. Язык программирования, предназначенный для записи алгоритма решения задачи, предоставляет те же возможности.
Программа, написанная на С/C++, представляет собой текст в виде символов с ASCII-кодом и может содержать следующие лексические единицы: идентификаторы, ключевые слова, литералы, операторы и разделители. Компилятор воспринимает исходный файл, содержащий программу, как последовательность текстовых строк. Каждая строка завершается символом новой строки. Компилятор последовательно считывает строки программы и разбивает каждую строку на группы символов, которые называются лексемами.
Лексема - это единица текста программы, имеющая самостоятельный смысл для компилятора и не содержащая в себе других лексем. Никакие лексемы, кроме символьных строк, не могут продолжаться на последующих строках текста программы. Компилятор производит синтаксический анализ в порядке расположения символов в программе.
Рассмотрим определения основных составляющих языка:
- алфавит представляет собой набор допустимых символов, используемых для построения всех программных конструкций;
- идентификатор (лексема) - набор символов, предназначенный для именования программных объектов (переменных, функций и т.д);
- ключевое слово - зарезервированная последовательность символов в программе; основные ключевые слова представлены в табл. 2, расширенные ключевые слова в табл. 3;
Таблица 2
Ключевые слова подмножества С языка С++
auto |
double |
int |
struct |
break |
else |
long |
switch |
case |
enum |
register |
typedef |
char |
extern |
return |
union |
const |
float |
short |
unsigned |
continue |
for |
signed |
void |
default |
goto |
sizeof |
volatile |
do |
if |
static |
while |
Таблица 3
Расширенные ключевые слова
asm |
_cs |
_ds |
_es |
_ss |
cdecl |
far |
huge |
interrupt |
near |
pascal |
|
- литерал - символ или последовательность символов, обозначающих данные (символьные или числовые);
- выражение - набор литералов, идентификаторов и символов операций, предназначенный для записи правила вычисления значения или элементарного действия в программе;
- разделители - специальные символы, отделяющие конструкции друг от друга. Ими являются пробел, точка с запятой, скобки;
- оператор - законченное описание некоторого действия. Для описания сложного действия требуется последовательность операторов, выражений, которые могут быть объединены в блок или в составной оператор. Операторы бывают исполняемые и неисполняемые. Первые задают действия над данными, а вторые служат для описания данных.