Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 часть прикладного до конца полугодия.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
78.72 Кб
Скачать

Основы прикладного программирования с использованием языка С++

Урок 18. Структура программы на языке C++. Проект.(теория)

1. Операторы языка C++

Операторы управляют процессом выполнения программы. Набор операторов языка С++ содержит все управляющие конструкции структурного программирования.

Составной оператор ограничивается фигурными скобками. Все другие операторы заканчиваются точкой с запятой.

Пустой оператор –  ;

Пустой оператор – это оператор, состоящий только из точки с запятой. Он может появиться в любом месте программы, где по синтаксису требуется оператор. Выполнение пустого оператора не меняет состояния программы.

Составной оператор –  {...}

Действие составного оператора состоит в последовательном выполнении содержащихся в нем операторов, за исключением тех случаев, когда какой-либо оператор явно передает управление в другое место программы.

Оператор обработки исключений

  • try { <операторы> }

  • catch (<объявление исключения>) { <операторы> }

  • catch (<объявление исключения>) { <операторы> }

  • ...

  • catch (<объявление исключения>) { <операторы> }

Условный оператор

  • if (<выражение>) <оператор 1> [else <оператор 2>]

Оператор-переключатель

switch (<выражение>)

{ case <константное выражение 1>: <операторы 1>

case <константное выражение 2>: <операторы 2>

...

case <константное выражение N>: <операторы N>

[default: <операторы>]

}

Оператор-переключатель предназначен для выбора одного из нескольких альтернативных путей выполнения программы. Вычисление оператора-переключателя начинается с вычисления выражения, после чего управление передается оператору, помеченному константным выражением, равным вычисленному значению выражения. Выход из оператора-переключателя осуществляется оператором break. Если значениевыражения не равно ни одному константному выражению, то управление передается оператору, помеченному ключевым словом default, если он есть.

Оператор цикла с предусловием

while (<выражение>) <оператор>

оператор цикла с постусловием

do <оператор> while <выражение>;

В языке C++ этот оператор отличается от классической реализации цикла с постусловием тем, что при истинности выражения происходит продолжение работы цикла, а не выход из цикла.

Оператор пошагового цикла

for ([<начальное выражение>];

[<условное выражение>];

[<выражение приращения>])

<оператор>

Тело оператора for выполняется до тех пор, пока условное выражение не станет ложным (равным 0). Начальное выражение и выражение приращения обычно используются для инициализации и модификации параметров цикла и других значений. Начальное выражение вычисляется один раз до первой проверки условного выражения, а выражение приращения вычисляется после каждого выполнения оператора. Любое из трех выражений заголовка цикла, и даже все три могут быть опущены (не забывайте только оставлять точки с запятой). Если опущено условное выражение, то оно считается истинным, и цикл становится бесконечным.

Оператор пошагового цикла в языке С++ является гибкой и удобной конструкцией, поэтому оператор цикла с предусловием whileиспользуется в языке С++ крайне редко, т.к. в большинстве случаев удобнее пользоваться оператором for.

Оператор разрыва 

break;

Оператор разрыва прерывает выполнение операторов while, do, for и switch. Он может содержаться только в теле этих операторов. Управление передается оператору программы, следующему за прерванным. Если оператор разрыва записан внутри вложенных операторов while,do, for, switch, то он завершает только непосредственно охватывающий его оператор.

Оператор продолжения 

continue;

Оператор продолжения передает управление на следующую итерацию в операторах цикла while, do, for. Он может содержаться только в теле этих операторов. В операторах do и while следующая итерация начинается с вычисления условного выражения. В операторе for следующая итерация начинается с вычисления выражения приращения, а затем происходит вычисление условного выражения.

Оператор возврата

return [<выражение>];

Оператора возврата заканчивает выполнение функции, в которой он содержится, и возвращает управление в вызывающую функцию. Управление передается в точку вызывающей функции, непосредственно следующую за оператором вызова. Значение выражения, если она задано, вычисляется, приводится к типу, объявленному для функции, содержащей оператор возврата, и возвращается в вызывающую функцию. Есливыражение опущено, то возвращаемое функцией значение не определено.

С формальной точки зрения операторы break, continue и return не являются операторами структурного программирования. Однако их использование в ограниченных количествах оправдано, когда они упрощают понимание программы и позволяют избегать больших вложенных структур. Например, мы проверяем входные данные на аномалии. Если не использовать эти операторы, то всю обработку придется вложить в условный блок, что ухудшает читабельность программы. Вместо этого можно написать небольшой условный блок, который организует выход из функции при неверных исходных данных.

Ввод/вывод не является частью языка С++, а осуществляется функциями, входящими в состав стандартной библиотеки. Для подробной информации см. лекцию 4.

2. Структура программы

Программа на языке С++ состоит из  директив препроцессора, указаний компилятору, объявлений переменных и/или констант, объявлений и определений функций.

Программа на языке C/C++ обязательно состоит хотя бы из одной функции, главной функции main(). При создании нового проекта перед нами был следующий код:

1

2

3

4

5

6

7

8

9

#include <iostream>

 

using namespace std;

 

int main()

{

    cout << "Hello World!" << endl;

    return 0;

}

Тело функции обозначено фигурными скобками, внутри которых содержится блок операторов. Функция имеет свой тип, например в данном случае тип int, это видно в объявлении функции. Структура программы на языке C++ следующая:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

Директивы препроцессора и глобальные переменные

 

int main(параметры функции)

{

    блок операторов

}

 

тип func1(параметры функции)

{

    блок операторов

}

 

тип func2(параметры функции)

{

    блок операторов

}

Тип функции определяет возвращаемое значение. Например функция main() должна возвращать целочисленное значение (что и происходит в коде, она возвращает 0). Значение 0 в данном случае сигнализирует о правильности выполнения программы. Функция возвращает значение вызываемому оператору. В данном случае таким оператором является оболочка ОС или отдельный процесс. Об этом мы поговорим позднее. Возвращаясь к структуре программы, хотелось бы прокомментировать первую строчку программы. Под директивами препроцессора воспринимаются строки начинающиеся с символа # выполняющие подключение библиотек и выполняющие условную компиляцию программы. Но об этом позже, пока у нас в текущей программе имеется такая строчка, она подключает библиотеку iostream, что дает возможность использовать функцию потокового вывода cout. Так же в этом месте мы можем использовать пространства имен using namespace. В программе мы подключаем пространства имен std. Без этой строчки использовать функцию вывода приходилось с использованием префикса std:

1

std::cout << "Hello World!" << std::endl;

Главную функцию мы уже разобрали на начальном этапе, Если функция имела бы тип void возвращаемого значения бы не было. Функций в проекте может быть сколько угодно.

Урок 19. Компиляция программы и сборка исполняемого модуля. Размещение программы и данных в памяти.(

Компилятор C преобразует исходный текст на языке C в кодах ASCII в выполняемый объектный код. Процесс компиляции разделен на четыре фазы:

. Препроцессор:

- Осуществляет вставку исходных текстов из других файлов (#include)

- Раскрывает макроопределения (#define)

- Осуществляет условную обработку исходного файла (#ifdef)

- Уничтожает комментарии

. Транслятор (компилятор)

- Проверяет текст на отсутствие синтаксических ошибок

- Преобразует конструкции языка C в конструкции ассемблера

- Выполняет машинно-независимые и машинно-зависимые оптимизации

- Генерирует отладочную информацию.

. Ассемблер

- Преобразует конструкции языка ассемблера в машинные команды

- Генерирует объектный модуль и списки экспорта и импорта (списки внешних символов)

- У некоторых компиляторов этот этап исполняется той же командой, что и трансляция

. Редактор связей

- Осуществляет сборку объектных файлов в загружаемый модуль

- Просматривает библиотеки для разрешения внешних ссылок

Для запуска компилятора языка C используется команда cc (SunStudio) или gcc (GCC). Для запуска компилятора C++ используются команды CC или g++. В дальнейших примерах мы будем использовать название команды cc; когда будут обсуждаться особенности других форм запуска компилятора, это будет оговариваться отдельно.

Команда cc - это управляющая программа, которая последовательно вызывает с помощью fork и exec другие программы, реализующие фазы процесса компиляции. Каждой фазе соответствует свои опции, и у каждой фазы свои сообщения об ошибках. Раздел ФАЙЛЫ на странице Руководства cc(1) указывает, где может быть найдена каждая исполняемая фаза. В общем случае, фазы процесса компиляции не должны вызываться явно. Их вызов осуществляет команда cc(1). Каждая фаза использует файлы или программные каналы для передачи своего вывода следующей фазе.

Урок 20. : Структура исполняемого модуля. Переменные: объявление, определение, инициализация.

Исполняемый модуль — файл, содержащий программу в виде, в котором она Исполняемый модуль зависит от ОС и архитектуры ВМ

Формат модуля определяет структура файла и правила его загрузки.

Создание исполняемого файла издавна производилось в три этапа: (1) обработка исходного кода препроцессором, (2) компиляция в объектный код и (3) компоновка объектных модулей, включая модули из объектных библиотек, в исполняемый файл. Это классическая схема для компилируемых языков. (Сейчас уже используются и другие схемы.)

Часто компиляцией программы называют весь процесс преобразования исходного кода в исполняемы модуль. Что неправильно. Обратите внимание, что в IDE этот процесс называетсяпостроение (build) проекта.

IDE обычно скрывают три отдельных этапа создания исполняемого модуля. Они проявляются только в тех случаях, когда на этапе препроцессинга или компоновки обнаруживаются ошибки.

Итак, допустим, у нас есть программа на C++ «Hello, World!»:

#include <iostream>

int main() {

std::cout << "Hello, World!\n";

}

Сначала исходный код обрабатывается препроцессором. Препроцессор находит директиву#include <iostream>, ищет файл iostream и заменяет директиву текстом из этого файла, попутно обрабатывая все директивы препроцессора во включаемом тексте.

Файл, указанный в директиве #include, в данном случае является заголовочным файлом (или «хеадером», «хидером», «заголовком»). Это обычный текстовый файл, содержащий объявления(объявления типов, прототипы функций, шаблоны, директивы препроцессора и т.п.). Послетекстуального включения заголовочного файла в текст программы (или модуля) становится возможным использование в тексте программы всего того, что описано в этом заголовочном файле.

Затем результат работы препроцессора передаётся компилятору. Компилятор производит весь положенный комплекс работ: от синтаксического разбора и поиска ошибок до создания объектного файла (понятно, что если имеются синтаксические ошибки, то объектный файл не создаётся). В объектном файле обычно имеется таблица внешних ссылок — некая таблица, в которой, в частности, перечислены имена подпрограмм, которые используются в объектном модуле, но код которых отсутствует в данном объектном модуле. Эти подпрограммы внешние по отношению к модулю.

Исходный код, который может быть откомпилирован, называется единицей компиляции. Наша программа содержит одну единицу компиляции.

Что бы получить нормальный исполняемый модуль, необходимо «разрешить» внешние ссылки. Т.е. добавить в исполняемый модуль код отсутствующих подпрограмм и настроить соответствующим образом все ссылки на этот код. Этим занимается компоновщик. Он анализирует таблицу внешних ссылок объектного модуля, ищет в объектных библиотеках недостающие модули, копирует их в исполняемый модуль и настраивает ссылки. После этого исполняемый модуль готов.

Библиотека (объектная библиотека) — это набор откомпилированных подпрограмм, собранных в единый файл определённой структуры. Подключение библиотеки происходит на этапе компоновки исполняемого файла из объектных файлов (т.е. из тех файлов, которые получаются в результате компиляции исходного текста программы).

Необходимые объектные библиотеки входят в комплект поставки компилятора. В комплект поставки библиотек (любых) входит набор заголовочных файлов, которые содержат объявления, необходимые компилятору.

Если исходный код программы разделён на несколько файлов, то процесс компиляции и сборки происходит аналогично. Сначала все единицы компиляции по отдельности компилируются, а затем компоновщик собирает полученные объектные модули (с подключением библиотек) в исполняемый файл. Собственно, этот процесс и называется раздельной компиляцией.