30
1 В.Л. Тарасов Лекции по программированию на C++ Предисловие В настоящее время язык программирования C++ является одним из самых распространенных среди профессиональных программистов. Его предшественником был язык Си, разработанный Денисом Ритчи в начале 1970-х годов [1], который быстро завоевал популярность у программистов благодаря своей лаконичности, выразительности и эффективности. Долго время единственным руководством по языку Си была книга [1], заслужившая почетное название «Библия языка Си». В 1989 г. Международной организацией стандартов (International Standard Organization – ISO) был принят стандарт языка Си, в 1999 г. стандарт Си был переработан. Последняя версия стандарта языка принята в 2011 г. Если программа написана в соответствии со стандартом языка, это гарантирует, что она будет выполняться на любом компьютере и в любой среде разработки. В 1979 г. Бьярн Страуструп на основе языка Си разработал язык C++ [2]. Главным нововведением было включение в язык понятия класса, с помощью которого реализована концепция объектно- ориентированного программирования, облегчающая создание программ большого объема. В 1998 г. принят стандарт языка C++. Язык Си является, за небольшими исключениями, подмножеством языка C++, так что программа, написанная на Си, является одновременно и программой на C++. В 2011 г. принят обновленный стандарт языка C++. Последняя версия стандарта под названием C++14 принята в 2014 г. Синтаксис языков Си и C++ использован в новейших языках программирования Java и C# (Си-шарп), таким образом, знакомство с языком C++ может служить базой для изучения других современных языков.

Предисловие - uic.unn.rutarasov/LecturesCPP/TarasovVL_LecturesCPP_01... · программирования Java и C# ... его нужно установить отдельно

  • Upload
    ngolien

  • View
    363

  • Download
    1

Embed Size (px)

Citation preview

1

В.Л. Тарасов

Лекции по программированию на C++

Предисловие В настоящее время язык программирования C++ является одним из

самых распространенных среди профессиональных программистов. Его предшественником был язык Си, разработанный Денисом Ритчи в начале 1970-х годов [1], который быстро завоевал популярность у программистов благодаря своей лаконичности, выразительности и эффективности. Долго время единственным руководством по языку Си была книга [1], заслужившая почетное название «Библия языка Си». В 1989 г. Международной организацией стандартов (International Standard Organization – ISO) был принят стандарт языка Си, в 1999 г. стандарт Си был переработан. Последняя версия стандарта языка принята в 2011 г. Если программа написана в соответствии со стандартом языка, это гарантирует, что она будет выполняться на любом компьютере и в любой среде разработки.

В 1979 г. Бьярн Страуструп на основе языка Си разработал язык C++ [2]. Главным нововведением было включение в язык понятия класса, с помощью которого реализована концепция объектно-ориентированного программирования, облегчающая создание программ большого объема. В 1998 г. принят стандарт языка C++. Язык Си является, за небольшими исключениями, подмножеством языка C++, так что программа, написанная на Си, является одновременно и программой на C++. В 2011 г. принят обновленный стандарт языка C++. Последняя версия стандарта под названием C++14 принята в 2014 г.

Синтаксис языков Си и C++ использован в новейших языках программирования Java и C# (Си-шарп), таким образом, знакомство с языком C++ может служить базой для изучения других современных языков.

2

В.Л. Тарасов

Лекции по программированию на C++

Лекция 1

Основные понятия

1.1. Элементы языка программирования Любой язык программирования представляет собой систему

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

Алфавит Программа на языке программирования записывается с помощью

символов, образующих алфавит языка. Алфавит языка C++ включает: большие латинские буквы от A до Z малые латинские буквы от a до z цифры от 0 до 9 знаки препинания: , . ; : ! ? скобки: ( ) [ ] { } знаки математических операций: + - * / < > = специальные символы:

\(обратная наклонная черта) ~(волна или тильда) &(амперсант) #(решетка или диез) ’(апостроф или одиночная кавычка) ”(двойная кавычка) ^(стрелка) %(процент) _(знак подчеркивания)

Большие и малые буквы считаются различными. Знак подчеркивания считается буквой. Русские буквы нельзя использовать в предложениях языка C++, их можно применять в комментариях и в

Элементы языка программирования 3

строках символов, заключенных в двойные кавычки, а также как одиночные символы, заключенные в апострофы.

Лексемы Программа представляет собой последовательность лексем. Лексема – это фрагмент программы, имеющий самостоятельное

значение. Различают следующие виды лексем: ключевые слова, идентификаторы, числовые константы, строковые константы, символьные константы, знаки препинания и знаки операторов.

Ключевое слово – это лексема, имеющая некоторое предопределенное значение, например, ключевое слово int указывает, что величина, перед которой оно стоит, является целым числом, а ключевое слово for используется при организации циклов. Ключевые слова нельзя использовать для каких-либо других целей.

Идентификатор – это последовательность букв и цифр, начинающаяся с буквы. Идентификаторы используются как имена объекта программы (переменных, функций, классов). Например, в строку программы int x0;

входят три лексемы: ключевое слово int, имя переменной целого типа x0 и знак препинания (;), который завершает данную инструкцию.

Числовые константы –задают в программе конкретные целые или дробные числа, записываемые по обычным правилам, например, 123, 32.1, 3.21e2.

Строковые константы – это последовательности произвольных символов, заключенные в двойные кавычки, например, ”Строка

символов”, ”String of characters”. Символьные константы представляют в программе одиночные

символы, при записи заключаются в одиночные апострофы, например, ’a’, ’A’, ’0’, ’1’. Важно понимать, что ’0’ это символ цифры нуль, а не число нуль.

К знакам препинания в C++ относятся два символа: (;) (точка с запятой) и (,) (запятая), служащие для разделения лексем. Символом (;) оканчивается любое предложение (инструкция) программы. Запятая разделяет переменные при их объявлении, аргументы функций. В некоторых случаях запятая является не только чистым знаком препинания, но и оператором. Другие символы (. : ? !), которые в естественных языках являются знаками препинания, в C++ обозначают операторы. Кроме знаков препинания, разделителями лексем являются пробелы и знаки операторов.

4 Основные понятия

Термином оператор в языке C++ обозначают действие, которое следует выполнить над данными, например, оператор сложения чисел (+), оператор умножения чисел (*), оператор логического отрицания (!).

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

Выражения В ходе работы программы могут вычисляться значения выражений.

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

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

Значение выражения можно присвоить какой-либо переменной или использовать в дальнейших вычислениях. Выражения в программах подобны выражениям в математике. С помощью круглых скобок можно определять порядок проведения вычислений. Например, если a, b, c, d – это какие-то переменные программы, то допустима следующая инструкция: d = (a + b) * c;

Здесь можно выделить три выражения: сумма a и b, произведение этой суммы на c и выражение присваивания, создаваемое оператором (=), в результате которого d получает новое значение. Подчеркнем, что присваивание, обозначаемое знаком (=), также является выражением, значение которого равно левому операнду, в данном случае d. Выражения присваивания можно использовать как часть других выражений, например, x = (d = (a + b) * c);

или x = d = (a + b) * c;

Функции Функция – это подпрограмма, имеющая собственное имя и

вызываемая для выполнения по этому имени. Обычно программа на

5 Процесс создания программы

языке C++ состоит из нескольких функций, которые решает отдельные части общей задачи.

Каждая программа должна иметь в своем составе функцию с именем main, которая, впрочем, может быть единственной функцией программы. Вычисления в программе начинаются именно с функции main.

Комментарии Программы на языке C++ могут содержать комментарии, которые

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

Возможны два вида комментариев. Комментарии, занимающие одну строку, начинаются двумя символами наклонной черты // и оканчиваются концом строки. Текст, окаймленный знаками /* и */, также является комментарием. Такой комментарий может быть многострочным.

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

1.2. Процесс создания программы Программа, написанная на языке программирования, называется

исходной. В языке C++ исходная программа может состоять из нескольких файлов.

Чтобы исходную программу можно было выполнить, ее нужно перевести на язык машинных команд. Готовая к выполнению программа на языке машинных команд называется рабочей. Схема преобразования исходной программы в рабочую показана на рис.1.1.

6 Основные понятия

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

Рис. 1.1. Процесс создания программы

Компилятор проверяет правильность исходной программы с точки зрения правил языка и переводит ее на язык машинных команд, в результате чего создается объектный код. Объектный код не может быть непосредственно выполнен процессором, так как не содержит кода библиотечных функций. Объектный код, полученный после компиляции какого-либо файла, размещается в файлах с расширением .obj.

Редактор связей собирает в один исполняемый файл объектные модули программы, добавляет код стандартных функций из библиотек. В результате получается готовая к выполнению рабочая программа, размещаемая в файле с расширением .exe. Другие названия редактора связей – компоновщик или линкер, по имени программы Link, которая обычно используется для редактирования связей.

Препроцессор

Компилятор

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

Текст исходной программы на языке С++

Преобразованный текст программы на языке С++

Программа в машинных командах (объектный код)

Рабочая программа

Первая программа 7

1.3. Инструменты программирования В настоящее время для разработки программ используют

интегрированные среды разработки (Integrated Development Environment – IDE), включающие в свой состав редактор для написания текста программы, препроцессор, компилятор, редактор связей, а также отладчик, облегчающий поиск ошибок. Упомянем некоторые среды разработки.

Среда Eclipse [3] является бесплатной, свободно распространяемой. По умолчанию эта среда использует язык Java, но есть ее варианты для других языков, в том числе для языков C и С++ [4]. Eclipse не включает компилятор с языка C++, его нужно установить отдельно и указать в настройках среды.

Также бесплатна интегрированная среда Qt Creator [5], ориентированная на использование библиотеки Qt [6], предназначенной для разработки приложений для различных операционных систем.

Для разработки на платформе Windows в средах Eclipse и Qt Creator можно использовать свободный компилятор MinGW [7].

Компания Embarcadero Technologies выпускает систему C++ Builder [8], включающую среду разработки на C++ и компилятор.

Microsoft выпускает продукт Visual Studio [9], позволяющий разрабатывать приложения для Windows на языках Visual Basic, Visual C# и Visual C++. Существует бесплатная версия этой среды Visual Studio Express [10].

Приводимые далее примеры программ проверены в среде Visual Studio.

1.4. Первая программа

Программа 1.1. Приветствие Рассмотрим следующую простейшую программу на языке C++:

// Файл Hello.cpp #include <iostream> #include <locale> #include <cstdlib> using namespace std; int main() { setlocale(LC_ALL, "Russian"); cout << "Здравствуй, Мир!\n"; system("pause"); return 0;

8 Основные понятия

}

Она выводит на экране сообщение: Здравствуй, Мир!

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

1.5. Состав первой программы Разберем назначение каждой строки Программы 1. Строка

#include <iostream>

является директивой препроцессора. Препроцессор вместо этой строки вставляет в программу содержимое файла iostream. В этом файле находятся объявления стандартных средств ввода и вывода языка C++. Программы, которые осуществляют ввод с клавиатуры или из файла, вывод на экран или в файл, должны включать в свой состав файл iostream.

Отметим, что файлы, содержащие различные объявления, в том числе объявления (заголовки) функций, принято называть заголовочными или просто заголовками. Файл iostream – один из многих заголовочных файлов, входящих в состав системы программирования на C++.

Следующая инструкция #include <locale>

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

Инструкция #include <ctdlib>

вставляет в программу заголовочный файл ctdlib стандартной библиотеки, что нужно для вызова функции system().

Инструкция using namespace std;

делает доступными имена из стандартного пространства имен std. Без этой инструкции пришлось бы обращаться к именам, указывая явно имя

Состав первой программы 9

этого пространства, то есть писать, например, вместо имени cout его полное имя std::cout.

Строка int main()

является заголовком функции main(). Функция – это подпрограмма. Указанием на то, что main – это имя функция, а не переменной, является наличие круглых скобок (). В данном случае в скобках ничего нет, но в них может содержаться список аргументов функции. Ключевое слово int, стоящее перед именем функции, указывает тип значения, которое возвращает функция. Значение, возвращенное функцией, может быть использовано вызывающей программой.

Фигурные скобки { и } ограничивают блок операторов, образующих тело функции.

Оператор (инструкция): setlocale(LC_ALL, "Russian");

является вызовом библиотечной функции setlocale(), которая обеспечивает настройку программы на использование национальных особенностей. В качестве первого параметр использована константа LC_ALL, определенная в файле locale, которая задает настройку всех национальных особенностей, включая представление даты, времени, денежной единицы, языка вывода программы и т.д. Вторым параметром является строка с названием языка. Благодаря настройкам, которые делает данная функция, русские буквы будут выводиться правильно. (Поддержку русских букв обеспечивают среды разработки Visual Studio и Eclipse, среда C++Builder такой поддержки не обеспечивает.)

Следующая инструкция: cout << "Здравствуй, Мир!\n";

выводит на экран строку символов, заключенную в двойные кавычки. Сами кавычки не выводятся.

Слово cout – это имя переменной, определенной в файле iostream, которая является потоком, связанным со стандартным устройством вывода (экраном). (Для простоты можно условно считать, что cout – это экран).

Два символа << обозначают один оператор вывода в поток. После этого оператора пишется выражение, значение которого надо вывести.

Двумя знаками \n в языке C++ обозначается один символ новая строка. Существует еще несколько символов, для обозначения которых используются два знака. При выводе на экран символа \n происходит перевод курсора в начало следующей строки экрана.

10 Основные понятия

Благодаря настройкам, сделанным функцией setlocale(), русские буквы будут правильно отображаться в окне вывода.

Инструкция system("pause");

вызывает библиотечную функцию system(), которая выполняет команду операционной системы, переданную в качестве аргумента. Команда pause останавливает программу до нажатия любой клавиши на клавиатуре.

Инструкция return 0;

завершает работу функции main(). Значение 0 возвращается из функции в качестве результата.

Каждая инструкция программы завершается точкой с запятой. Для создания и выполнения программы на реальном компьютере

следует воспользоваться каким-либо средством разработки, например, одним из рассмотренных выше (см. раздел 1.3).

1.6. Консольные программы в Visual Studio Среда разработки Visual Studio фирмы Microsoft включает

несколько языков программирования: Visual Basic, C# (си-шарп), J#, C++, и позволяет разрабатывать различные виды приложений, в том числе: консольные, оконные, приложения для Интернета и работы с базами данных. При работе консольных приложений на экране дисплея создается окно, через которое осуществляется ввод и вывод. десь опишем создание простейшего консольного приложения в среде Visual Studio 2008. Начиная с этой версии, Microsoft выпускает локализованный вариант среды разработки Visual Studio с интерфейсом на русском языке и с русской справочной системой.

Создание пустого проекта Для создания любой программы загружаем среду и выполняем

команду меню Файл, Создать, Проект. Далее в окне Создать Проект (рис. 1.2) выбираем язык программирования (Visual C++), тип проекта (Win32) и шаблон проекта (Консольное приложение Win32). В поле Имя вводим имя проекта, в поле Расположение выбираем папку для проекта. При создании проекта автоматически создается папка с именем, совпадающим с именем проекта.

Консольные программы в Visual Studio 11

В Visual Studio каждый проект входит в группу проектов, называемую решение (Solution). По умолчанию имя решения совпадает с именем вновь создаваемого проекта, оно видно в неактивном поле Имя решения (рис. 1.2). Файл решения имеет расширение .sln и размещается в папке проекта. Если установить флажок Создать каталог для решения, то поле Имя решения будет доступно для редактирования. В нем можно будет задать имя решения, а для решения будет создана отдельная папка, в которую будет вложена папка проекта.

Когда ведется работа с несколько взаимосвязанными проектами, то удобно объединять их в решения. При создании простых учебных программ можно ограничиваться решениями, создаваемыми по умолчанию для каждого проекта. В таком случае флажок Создать каталог для решения не устанавливается.

Рис. 1.2. Выбор типа проекта в Visual Studio

После нажатия кнопки OK откроется окно мастера создания приложения (рис. 1.3), в котором можно нажать кнопку Готово для завершения создания приложения или Далее для уточнения настроек.

12 Основные понятия

Рис. 1.3. Первый диалог мастера создания приложения

Нажав кнопку Далее, попадаем на следующий диалог (рис. 1.4), где можно изменить тип приложения.

Рис. 1.4. Создание пустого проекта

Для переключателя Тип приложения можно выбрать: Приложение Windows (оконное приложение), DLL (Dynamic Linked Library – динамически связываемая библиотека) или Статическая библиотека. Оставим для этого переключателя Консольное приложение. Консольные приложения выполняются в отдельном окне, эмулирующем работу операционной системы DOS.

Консольные программы в Visual Studio 13

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

Флажки Добавить общие файлы заголовка для: обеспечивают включение в программу заголовочных файлов одной из библиотек, предоставляемых Visual C++:

ATL – встраивает в проект поддержку классов из библиотеки ATL (Active Template Library – библиотека активных шаблонов), доступно только для консольных приложений;

MFC – встраивает в проект поддержку библиотеки MFC (Microsoft Foundation Class – основные классы Майкрософт), доступно только для консольных приложений и статических библиотек.

Нажатием кнопки Готово (рис. 1.4) завершается создание проекта и открывается среда разработки (рис.1.5).

Рис. 1.5. Среда разработки и окно Обозреватель решений

В окне Обозреватель решений (рис. 1.5) показывается состав решения. Видно, что решение Hello содержит один проект с тем же названием, состоящий из трех разделов:

Заголовочные файлы; Файлы исходного кода; Файлы ресурсов.

Пока эти разделы пусты. На рис. 1.6 показано содержимое папки созданного проекта в

Проводнике Windows.

14 Основные понятия

Рис. 1.6. Содержимое папки проекта

При создании проекта автоматически создается текстовый файл ReadMe.txt, содержащий краткое описание состава проекта.

Файл проекта Hello.vcproj содержит информацию о версии Visual C++, которая сгенерировала этот файл, и информацию о платформе, конфигурациях и свойствах проекта.

Файл решения Hello.sln содержит сведения о проектах, входящих в данное решение.

Добавим в проект файл исходного кода. Для этого выполним команду Проект, Добавить новый элемент…. В появившемся окне Добавление нового элемента – Hello (рис.1.7) выбираем котегорию – Код, шаблон – Файл C++ (.cpp). В поле Имя вводим имя добавляемого файла кода – Hello. Расширение .cpp будет добавлено к имени файла автоматически.

Рис. 1.7. Добавление в проект файла исходного кода

Консольные программы в Visual Studio 15

В появившееся пустое окно текстового редактора вставим код Программы 1.1. (рис. 1.8).

Рис. 1.8. Окно программного кода

Построение проекта Построение рабочей программы выполняется командой

Построение, Построить Hello. При первом выполнении этой команды сначала запускается компилятор. Во время компиляции в окне Вывод показывается сообщение: 1>Компиляция... .

Если при компиляции не обнаружено ошибок, запускается компоновщик, в окно Вывод выводится: 1>Компоновка... . Если компилятор или компоновщик находят ошибки, сообщения о них также выводятся в окно Вывод.

Для более удобной работы с ошибками существует окно Список ошибок, выводимое командой Вид, Другие окна, Список ошибок.

Рис. 1.9. Сообщения о ходе построения проекта

16 Основные понятия

Если ошибок не было, в окне Вывод будет напечатано: Построение: успешно: 1 (рис.1.9).

При повторном выполнении команды Построить <Имя_Проекта> компилируются только файлы, в которые внесены изменения, и, если в исходных файлах были изменения, выполняется компоновка.

Команда Построение, Перестроить <Имя_Проекта> выполняет перекомпиляцию всех файлов проекта и компоновку.

Отдельная компиляция выделенного файла выполняется командой Построение, Компилировать или комбинацией Ctrl+F7 (рис.1.10).

Рис. 1.10. Команда компиляции файла

При построении приложения в папке проекта создается папка Debug, содержащая результаты работы компилятора и компоновщика (рис. 1.11). В этой папке мы видим объектный файл программы Hello.obj и рабочую программу Hello.exe. Используя созданный exe-файл, можно запускать программу из среды операционной системы.

Консольные программы в Visual Studio 17

Рис. 1.11. Результаты построения проекта

Запуск программы Из среды разработки программу можно запустить в режиме отладки

командой Отладка, Начать отладку, или клавишей F5. При этом окно выполнения программы сразу закрывается, после окончания работы программы.

После команды Отладка, Запуск без отладки (комбинация клавиш Ctrl+F5) окно выполнения программы остается открытым до нажатия любой клавиши (рис. 1.12).

Рис. 1.12. Окно выполнения программы

Создание непустого проекта Создадим еще один проект NotEmptyPr. При назначении параметров

приложению не устанавливаем флажок Пустой проект (рис.1.13).

18 Основные понятия

Рис. 1.13. Создание непустого проекта

После нажатия кнопки Готово открывается среда разработки (рис.1.14). В окне Обозреватель решений видно, что в состав проекта автоматически включено несколько файлов.

Рис. 1.14. Автоматически созданный файл исходного кода

Файл NotEmptyPr.cpp, содержит заготовку главной функции программы _tmain // He NotEmptyPr.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { return 0; }

Консольные программы в Visual Studio 19

Имя _tmain является макросом, значение которого зависит от используемого набора знаков. Набор знаков выбирается в окне настроек проекта NotEmptyPr: свойства, выводимом командой Проект, Свойства NotEmptyPr… (рис. 1.15). В разделе Свойства конфигурации этого окна выберем ветку Общие. Из списка Набор знаков (рис. 1.15) можно выбрать Не задано (однобайтовые символы), Использовать Юникод-кодировку (использовать множество символов Юникода) или Использовать многобайтовую кодировку.

Рис. 1.15. Выбор набора символов

При использовании символов Юникода _tmain определяется в системном заголовочном файле tchar.h директивой препроцессора: #define _tmain wmain

Здесь wmain – версия функции main для широких (размером более одного байта) символов.

Для других наборов символов _tmain определяется директивой: #define _tmain main

и является обычной функцией main, предусмотренной стандартом языка.

Выберем для свойства Набор знаков значение Не задано.

20 Основные понятия

Действующее значение для _tmain, так же как и для других имен программы, выводится при наведении курсора на это имя (рис. 1.16).

Рис. 1.16. Вывод определения для имени при наведении курсора на имя

Параметрами функции _tmain являются общее число аргументов командной строки argc и массив указателей argv на аргументы командной строки. Тип _TCHAR определяется в заголовочном файле tchar.h и зависит от используемого набора символов. Если используется Юникод, действует инструкция: typedef wchar_t _TCHAR;

Здесь wchar_t – ключевое слово C++, обозначающее тип широких символов. Для других наборов символов действует инструкция: typedef char _TCHAR;

Файлы StdAfx.h, StdAfx.cpp определяют состав предварительно компилируемых заголовочных файлов (precompiled header, PCH). При первом построении проекта, выполняемого командой Построение, Построить <ИмяПроекта>, создается файл предварительно откомпилированных заголовков NotEmptyPr.pch и откомпилированный файл с информацией о типах stdafx.obj.

Далее приведен файл stdafx.h. // stdafx.h: включаемый файл для стандартных системных включаемых файлов // или включаемых файлов для конкретного проекта, которые часто // используются,но не часто изменяются // #pragma once #include "targetver.h" #include <stdio.h> #include <tchar.h> // TODO. Установите здесь ссылки на дополнительные заголовки, // требующиеся для программы

Директива препроцессора #pragma once

обеспечивает однократное включение данного файла в другие файлы.

Консольные программы в Visual Studio 21

В файл stdafx.h по умолчанию включаются заголовочный файл stdio.h библиотеки ввода и вывода языка C и файл tchar.h, содержащий определения используемых макросов и типов данных. Другие необходимые в программе системные заголовочные файлы удобно включать в stdafx.h, чтобы выполнялась их предварительная компиляция, благодаря чему повторная компиляция выполняется быстрее.

Далее приведен текст файла stdafx.cpp. // stdafx.cpp: исходный файл, содержащий только стандартные // включаемые модули // NotEmptyPr.pch будет предкомпилированным заголовком // stdafx.obj будет содержать предварительно откомпилированные сведения // о типе #include "stdafx.h"

// TODO. Установите ссылки на любые требующиеся дополнительные заголовки // в файле STDAFX.H, а не в данном файле

Как следует из комментариев, в файл stdafx.cpp не следует вносить каких-либо дополнений.

Программа 1.2. Непустой проект Добавим в конец файла stdafx.h нужные нам заголовочные файлы

iostream, locale и cstdlib: // stdafx.h: включаемый файл для стандартных системных включаемых файлов // или включаемых файлов для конкретного проекта, которые часто // используются,но не часто изменяются // #pragma once #include "targetver.h" #include <stdio.h> #include <tchar.h>

#include <iostream> #include <locale> #include <cstdlib> using namespace std;

Изменим главную функцию программы в файле NotEmptyPr.cpp: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[])

22 Основные понятия

{ setlocale(LC_ALL, "Russian"); cout << "Здравствуй, Мир!\n"; system("pause"); return 0;

}

При первом построении непустого проекта в папке проекта создается папка Debug, содержащая результаты работы компилятора и компоновщика (рис. 1.17). В этой папке находится файл предварительно откомпилированных заголовков NotEmptyPr.pch, объектный файл stdafx.obj, объектный файл главного модуля NotEmptyPr.obj и рабочая программа NotEmptyPr.exe.

Рис. 1.17. Папка Debug для непустого проекта

Для запуска созданной программы из среды операционной системы нужно выбрать созданный exe-файл и нажать клавишу Enter.

1.7. Отладка программ В процессе создания программ неизбежно появляются ошибки.

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

Отладка программ 23

неверной логикой работы, что приводит к неверным результатам или незапланированному поведению программы.

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

Программа 1.3. Деление чисел Рассмотрим программу, в которой есть синтаксическая ошибка

(пропущена тоска с запятой) и семантическая ошибка (деление на нуль). // Файл DivNumbers.cpp

#include <iostream> using namespace std; int main() { int a, b, c; // Определение переменных a = 1; // Присваивание значений b = 0 // переменным c = a / b; // Деление чисел cout << "c = " << c; // Вывод частного return 0; }

Инструкция программы int a, b, c;

определяет три переменные целого типа a, b и c, при этом сначала указывается тип величин int, а затем перечисляются имена создаваемых переменных, разделяемые запятыми.

С помощью оператора присваивания, который обозначается знаком равенства (=), переменным a и b присваиваются значения 1 и 0 соответственно.

Далее вычисляется частное величин a и b с помощью оператора деления (/), результат присваивается переменной c, значение которой выводится на экран следующим оператором.

В тексте программы сознательно допущена ошибка – пропущена точка с запятой (;) в инструкции b = 0.

Синтаксические ошибки Выполним компиляцию, нажав Ctrl+F7. Компилятор выдаст

сообщение об ошибке: (рис.1.18):

24 Основные понятия

Ошибка 1 error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "c".

Компилятор указал на 9-ю строку программы, хотя символа (;) не хватает в конце 8-й строки. Это объясняется тем, что компилятор анализирует текст программы последовательно, символ за символом, выделяя отдельные слова (лексемы) программы. Число 0 в конце 8-й строки ошибкой не является, но имя переменной c, стоящее после числа 0 без какого-либо предшествующего знака – это ошибка.

Рис. 1.18. Сообщение о синтаксической ошибке

Для получения подробного описания ошибки можно ее выделить и нажать F1 (рис.1.19).

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

Отладка программ 25

Рис. 1.19. Описание ошибки в справочной системе

Поставим точку с запятой (;) в 8-й строке, записав ее в виде: c = a / b; // Деление чисел

и откомпилируем программу. Ошибка исчезнет.

Ошибки на стадии выполнения программы Запустим программу на выполнение командой Отладка, Начать

отладку, или нажав F5. Появится окно с сообщением Integer division by zero (Целочисленное деление на нуль) (рис. 1.20). Нажмем в этом окне кнопку Прервать, перейдем в режим отладки. При этом откроется окно с исходным кодом, в котором желтой стрелкой будет отмечена строка кода, на которой программа остановилась (рис.1.20).

26 Основные понятия

Рис. 1.20. Сообщение о делении на нуль

Рис. 1.21. Режим отладки программы

В режиме отладки можно использовать различные окна, помогающие проанализировать работу программы. Список отладочных окон выводится командой Отладка, Окна (рис.1.22).

Рис. 1.22. Отладочные окна

Кратко опишем некоторые: Контрольные значения – окна для наблюдения за текущими

значениями переменных;

Отладка программ 27

Видимые – окно, показывающее переменные, используемые в текущей строке кода и в предыдущей строке кода;

Локальные – окно, в котором автоматически показываются текущие значения локальных переменных;

На рис. 1.21 в окне Видимые показаны переменные a, b и c, используемые в строке, на которой остановилась программа. Значения переменных показаны как шестнадцатеричные числа. Для отображения чисел в десятичной системе нужно щелкнуть правой кнопкой мыши по столбцу Значение и снять флажок Шестнадцатеричный вывод (рис. 1.23).

Рис. 1.23. Контекстное меню для столбца Значение

В режиме отладки текущие значения переменных отображаются также при наведении на них курсора.

Для управления отладочными и другими окнами среды Visual Studio можно использовать команды контекстного меню, выводимые щелчком правой кнопки мыши по заголовку окна (рис. 1.24).

Рис. 1.24. Команды управления окном

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

Пошаговое выполнение программы Построчное выполнение программы осуществляется нажатием

клавиши F11 (или командой меню Отладка, Шаг с заходом). Каждое нажатие F11 приводит к выполнению одной строки кода. Выполняя по

28 Основные понятия

шагам программу, обнаруживаем, что ее выполнение прерывается при достижении строки c = a / b;

При нажатии F11 происходит «заход» в функцию, если в выполняемой строке есть обращение к функции.

Команда Отладка, Шаг с обходом или F10 также осуществляет построчное выполнение программы, но без захода в функции.

Команда Отладка, Остановить отладку (Shift+ F5) прерывает отладку.

В тексте программы можно поместить точки останова в тех строках, которые вызывают подозрение в правильности работы, для чего надо щелкнуть мышью на полосе слева от строки кода (рис. 1.25).

Рис. 1.25. Точка останова в программном коде

При запуске программы командой Отладка, Начать отладку (F5) выполнение программы прервется в точке останова. Далее можно выполнять программу пошагово командами F10 или F11, или продолжить выполнения программы командой F5 до ее конца или до следующей точки останова.

29 Основные понятия

Литература 1. Керниган Б., Ритчи Д. Язык программирования Си.– СПб.:

«Невский Диалект», 2001.– 352 с. 2. Страуструп Б. Язык программирования C++. – СПб.; М.: «Невский

Диалект» – «Издательство БИНОМ», 1999.– 991 с. 3. Eclipse.- https://www.eclipse.org/ (Дата обращения: 01.10.2015) 4. Eclipse IDE for C/C++ Developers. -

https://www.eclipse.org/downloads/packages/eclipse-ide-cc-developers/lunasr1 (Дата обращения: 01.10.2015)

5. Qt Creator.-http://qt-project.org/wiki/Category:Tools::QtCreator_Russian (Дата обращения: 01.10.2015)

6. Qt.- http://www.qt.io/ (Дата обращения: 01.10.2015) 7. MinGW (Minimalist GNU for Windows).- http://www.mingw.org/ (Дата

обращения: 01.10.2015) 8. C++ Builder.- http://www.embarcadero.com/ru/products/application-

development (Дата обращения: 01.10.2015) 9. Visual Studio.- http://www.visualstudio.com/ (Дата обращения:

01.10.2015) 10. Visual Studio Express.- http://www.visualstudio.com/ru-

ru/products/visual-studio-express-vs.aspx (Дата обращения: 01.10.2015)

11. Шилдт Г. Справочник программиста по C/C++.– М.: Издательский дом «Вильямс», 2000.– 448 с.

12. Павловская Т.А. C/C++. Программирование на языке высокого уровня.– СПб.: Питер, 2003.– 461 с.

13. Подбельский В.В. Язык Си++.– М.: Финансы и статистика, 1996.– 560 с.

14. Прата С. Язык программирования C++. Лекции и упражнения.– Киев: Издательство «ДиаСофт», 2001.–656 с.

15. Уинер Р. Язык Турбо Си. – М.: Мир, 1991. – 380 с. 16. Тондо К., Гимпел С. Язык Си. Книга ответов.– М.: Финансы и

статистика, 1994. – 160 с. 17. Тарасов В.Л. Упражнения по языку Си.– Н. Новгород: Изд-во

ННГУ, 1996. – 178 с. 18. Тарасов В.Л. Программирование на C++.– Н. Новгород: Изд-во

ННГУ, 2006. – 310 с. 19. Культин Н.Б. C/C++ в задачах и примерах.–СПб.: БХВ-Петербург,

2001.–288 с.

30 Основные понятия

20. Лафоре Р. Объектно-ориентированное программирование в C++.–СПб.: Питер, 2003.– 928 с.

21. OpenGL Programming Guide. 8th Edition. The Official Guide to Learning OpenGL, Version 4.3/ Shreiner D, Sellers G, Kessenich J. M., Licea-KaneDave B.M.: [Электронный ресурс]. URL: http://it-ebooks.info/book/2138/. (Дата обращения: 05.01.2015)

22. OpenGL Red Book (русская версия): [Электронный ресурс]. URL: http://www.hardforum.ru/download/RedBook.pdf. (Дата обращения: 04.04.2016)

23. GLUT – The OpenGL Utility Toolkit.: [Электронный ресурс]. URL: https://www.opengl.org/resources/libraries/glut/. (Дата обращения: 28.12.2014)

24. The Free OpenGL Utility Toolkit: [Электронный ресурс]. URL: http://freeglut.sourceforge.net/. (Дата обращения: 29.12.2014)

25. Transmission Zero. freeglut Windows Development Libraries: [Электронный ресурс]. URL: http://www.transmissionzero.co.uk/ software/ freeglut-devel/. (Дата обращения: 29.12.2014)