Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

OOP_C++ / 01

.htm
Скачиваний:
30
Добавлен:
02.02.2015
Размер:
30.37 Кб
Скачать

01 - Основные особенности С++ и среды разработки. Исходный текст программы Содержание     Предыдущее занятие     Следующее занятие

Занятие 01 Основные особенности С++ и среды разработки. Исходный текст программы 1 Языки и системы программирования Язык программирования (programming language) - формальный язык, на котором создаются компьютерные программы. Язык программирования обычно состоит из последовательности инструкций. Описание языка состоит из:

определения синтаксиса языка (правил, определяющих, как могут быть скомбинированы отдельные символы и слова);

определения семантики (смысла языковых конструкций).

По своему уровню языки программирования классифицируются на:

низкоуровневые (приближенные к машинным инструкциям) - мнемокод, ассемблер; одной инструкции такого языка чаще всего соотетсвует одна машинная команда; низкоуровневые языки манипулируют непосредственным содержимым ячеек памяти;

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

Языки высокого уровня можно разделить на на две группы:

процедурные (не поддерживающие концепций классов и объектной ориентации); примерами таких языков являются FORTRAN, BASIC, ALGOL-68, PASCAL, C, PL/1, MODULA-2;

объектно-ориентированные, такие как Smalltalk, C++, Object Pascal, Java, C# и т.д.

Текст программы на языке высокого уроня называется исходным текстом.

Для того, чтобы программа, написанная на языке высокого уровня, могла быть выполнена на компьютере, требуются системы программирования - программные средства, предназначенные для создания и трансляции высокоуровневых программ в машинные коды. Примеры систем программирования - QBASIC, Turbo Pascal, Turbo C++, Delphi, MS Visual Studio, Borland C++ Builder, Borland JBuilder, Borland C#Builder и т.д.

Основной функцией систем программирования является трансляции. Трансляторы (программы, выполняющие эту работу) делятся на две группы:

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

компиляторы - программы, осуществляющие полный перевод исходного текста в машинные команды и сохраняющие этот код в отдельном файле.

Все системы программирования, ориентированные на языки С и С++, являются компилирующими системами.

2 Основные особенности С++. Стандарт С++ В качестве базового языка для С++ был выбран С - многоцелевой, лаконичный и относительно низкоуровневый язык программирования. Основными особенностями C++ по сравнению с С являются следующие:

строгая типизация: при вызове функций осуществляется строгая проверка типов аргументов;

поддержка объектно-ориентированного программирования: возможность создания новых типов данных;

поддержка шаблонных функций и обобщенного программирования;

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

На базе синтаксиса впоследствии были созданы новые объектно-ориентированные языки. Прежде всего, это Java и C#. Можно назвать следующие отличия C++ от вновь созданных языков объектно-ориентированного программирования:

кроме объектно-ориентированного, С++ поддерживает традиционное процедурное программирование (без использования классов);

механизм создания и размещения объектов в памяти в С++ определяется программистом, в отличие от предопределенных механизмов размещения, используемых в Java и C#;

в С++ (в отличие от Java) поддерживается перегрузка операций;

для классов в С++ допускается множественное наследование;

С++ поддерживает концепцию шаблонов и предоставляет возможности обобщенного программирования;

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

Таким образом, язык С++ сочетает в себе возможности представления сложных структур данных и написания эффективных низкоуровневых программ.

В августе 1998 года был ратифицирован стандарт языка С++. Стандарт С++ представляет собой документ, полностью описывающий синтаксис языка и его возможное использование. Кроме базовых средств языка программирования С++, в стандарт вошла так называемая Стандартная библиотека (Standard C++ Library). Все последние версии систем программирования на С++ обязаны поддерживать стандарт языка. Некоторые компании предлагают специальные пакеты, проверяющие "стандартность" реализации С++.

3 Исходный текст программы. Лексические элементы С++ Алфавит языка С++ включает:

латинские буквы A...Z, a...z;

цифры 0...9;

знаки операций и разделители: { } [ ] ( ) . , -> & * + - ~ ! / % ? : ; = < > | # ^

В С++ различаются заглавные и строчные буквы.

Исходный текст на С++ состоит из лексем.

Лексемы (tokens), в свою очередь, делятся на группы: ключевые (зарезервированные) слова, идентификаторы, литералы, знаки операций и разделители.

Набор ключевых слов ограничен. В стандартном С++ имеется 63 ключевых слова. Еще 11 слов зарезервировано для альтернативного представления операций. В некоторых реализациях С++ к ним могут быть добавлены специфические ключевые слова. Ключевые слова нельзя использовать в качестве идентификаторов.

Ниже приводится список ключевых слов:

asm auto bool break case catch char class const const_cast continue default delete do double dynamic_cast else enum explicit export extern false float for friend goto if inline int long mutable namespace new operator private protected public register reinterpret_cast return short signed sizeof static static_cast struct switch template this throw true try typedef typeid typename union unsigned using virtual void volatile wchar_t while     Идентификаторы используются для именования переменных, функций и других программных объектов. Первым символом должна быть буква или символ "_". Далее могут использоваться также цифры.

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

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

Литералы и операции рассматриваются ниже.

4 Этапы обработки исходного текста Текст программы содержится в модулях, именуемых исходными файлами. Файл состоит из последовательности описаний.

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

Управляющая строка вида:

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

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

Команда вида

#define идентификатор строка-лексем называется макроопределением. Она указывает препроцессору, что надо произвести замену всех последующих вхождений идентификатора на заданную последовательность лексем, называемую строкой замены. После появления макроопределения идентификатор из него считается определенным и остается в текущей области видимости (независимо от правил областей видимости в С++) до конца единицы трансляции или пока его определение не будет отменено с помощью команды #undef. Команда #undef имеет вид:

#undef идентификатор Она заставляет препроцессор "забыть" макроопределение с этим идентификатором. Если указанный идентификатор не является определенным в данный момент макроименем, то команда #undef игнорируется.

С помощью препроцессора можно организовать условную трансляцию программы, для этого используются команды

#if выражение-константа #ifdef идентификатор #ifndef идентификатор #elif выражение-константа #else #endif С помощью #ifdef, #ifndef и #endif можно добиться, чтобы часть строк компилировалась, если идентификатор определен (не определен) ранее с помощью #define.

4.2 Обработка единиц трансляции Результат работы препроцессора есть последовательность лексем. Такую последовательность лексем, т.е. файл после препроцессорной обработки, называют единицей трансляции (translation unit). Результатом трансляции этих единиц в общем случае являются объектные модули (файлы с расширением .obj).

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

5 Стилистические особенности организации исходного текста на С++ Для имен (идентификаторов) следует использовать английскую мнемонику с соблюдением грамматики (по возможности). Идентификаторы должны начинаться со строчной буквы или знака "_". Если идентификатор составлен из нескольких слов, начиная со второго слова их можно выделять заглавными буквами или знаком "_".

Знаки операций должны выделяться с двух сторон пробелами. В выражениях после открывающейся скобки и перед закрывающимися скобками пробел не ставится. Перед точками, запятыми и точками с запятыми пробел не ставится. Операции "выбор члена" и "разрешение области видимости" пробелами не выделяются.

Отдельные инструкции должны быть размещены на отдельных строках. Все отступы должны иметь фиксированный размер (2 / 4 пробела или табуляция). Дополнительные отступы появляются после операторных скобок, а также если в теле циклов и условных операторах реализуется только одна инструкция. В циклах for, while, в конструкциях switch, if и т.д. перед скобками следует размещать пробел. Открывающиеся и закрывающиеся операторные (блочные) скобки должны размещаться строго друг под другом.

Между определениями функций пропускается строка.

6 Создание проекта в среде программирования Microsoft Visual Studio .NET Microsoft Visual Studio .NET - это комплект (suite) средств разработки, включающий Visual Basic .NET, Visual C++ .NET и Visual C# .NET, а также поддержку Web-программирования. Три основных языка разработки (Visual Basic .NET, Visual C++ .NET и Visual C# .NET) используют общую среду разработки (Integrated Development Environment, IDE), что, в частности, содействует созданию проектов, комбинирующих несколько языков программирования.

При первой загрузке IDE пользователю предлагается стартовая страница (Start Page). По умолчанию раскрывается закладка "Начать работу" (Get Started). На панели этой закладки предлагается список проектов, которые открывались за последнее время. Здесь же имеются кнопки "Открыть проект" (Open Project) и "Новый проект" (New Project).

Ключевым понятием разработки приложения в Visual C++ является проект (project). Проект - это набор взаимосвязанных исходных файлов, компиляция и компоновка которых позволяет создать исполняемую программу или DLL (Dynamic link library). Исходные файлы проекта обычно хранятся в отдельном подкаталоге. Кроме того, зачастую проект зависит от многих файлов, расположенных вне подкаталога проекта, таких как включаемые (include) и библиотечные файлы.

Существует понятие конфигурации проекта. Каждый проект содержит как минимум две конфигурации - отладочную (Debug) и конфигурацию поставки (Release).

Новый проект может быть создан несколькими способами:

с использованием стартовой страницы;

с использованием главного меню;

с использованием кнопки быстрого доступа (speed button).

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

на панели "Project Types" выбрать тип проекта Visual C++ Projects;

на панели "Templates" выбрать "Win32 Project";

в строке ввода "Name" обязательно нужно ввести имя проекта. Расположение проекта по умолчанию предлагается автоматически, однако его можно изменить;

нажать кнопку "OK" для запуска мастера проекта (Project Wizard);

в окне мастера проекта следует выбрать закладку "Установки приложения" (Application Settings);

на закладке "Установки приложения" установить флажки "Console application" (консольное приложение) и "Empty project" (пустой проект);

нажать кнопку "Finish".

Следующим этапом необходимо создать новый файл с исходным текстом. Для этого нужно выполнить следующее:

в подменю "Project" главного меню выбрать "Add New Item";

на панели "Templates" окна "Add New Item" выбрать тип файла C++ File; нужно также ввести имя файла с исходным текстом в строке ввода "Name";

нажать "OK", после чего открывается новый пустой файл.

IDE содержит редактор исходного текста, поддерживающий множество возможностей - выделение цветом синтаксических конструкций, автоотступы, раскладки клавиатурных команд, а также печать. Имеется функция AutoComplete: после набора нескольких начальных символов оператора программы, редактор предлагает выбрать «всё слово» из списка возможных вариантов.

Для выполнения программы можно использовать клавишную комбинацию Ctrl-F5.

7 Отладка программы Отладчик используется для поиска и исправления ошибок времени выполнения. Для запуска отладчика используется функция Debug | Start (F5). Предварительно в исходном тексте расставляются точки прерывания (функция Debug | New Breakpoint или Ctrl-B). Для выполнения программы по строкам используются функциональные клавиши F11 (Step Into, отладка с заходом в функции) и F10 (Step Over, отладка без захода в функции).

После запуска отладчика меняется внешний вид и состав окон интегрированной среды разработки. Соответствующие кнопки на панели инструментов позволяют расставлять и убирать точки прерывания и управлять пошаговым исполнением программ. Вместо точек прерывания можно использовать функцию "Выполнять до курсора" (Ctrl-F10).

В окнах Autos, Locals и Watch можно просматривать изменение значений переменных. Если поместить курсор мыши на скалярную переменную, отладчик покажет ее значение в маленьком окошке.

8 Примеры программ на С++ Пример 1 Необходимо ввести с клавиатуры два числа и определить их среднее арифметическое.

01 // Программа вычисления среднего арифметического 02 #include <iostream> 03 using namespace std; 04 int main(int argc, char* argv[]) 05 { 06 double a, b; 07 cout << "Enter a and b:" << endl; 08 cin >> a >> b; 09 double c = (a + b) / 2; 10 cout << "Average is " << c << endl; 11 return 0; 12 }

Примечания Здесь и далее в примерах зарезервированные слова выделяются жирным шрифтом.

Номера строк не набираются. Текст набирается с первой позиции экрана с последующими отступами, где это необходимо.

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

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

Строка 02 - директива препроцессора. директива #include указывает на необходимость подключения файла iostream при компиляции. В программу подключаются описания, необходимые для работы стандартных потоков ввода- вывода. В частности, компилятору известными становятся имена cin, cout и endl, объявленные в данном файле.

В сроке 03 осуществляется подключение так называемого пространства имен. В данном случае подключается пространство имен std.

Строка 04 представляет собой заголовок функции main. В каждой программе на С++ должна быть своя функция main, программа начинается с выполнения этой функции. Зарезервированное слово int в начале строки - тип результата функции (в данном случае - целый). Результат функции main() используется операционной системой. Параметры функции (int argc, char* argv[]) могут быть использованы в программе для анализа содержания командной строки. В данном примере эти параметры не используются.

Открывающаяся фигурная скобка в строке 05 указывает на начало группы утверждений (операторов), относящихся к функции main(). Данную группу завершает закрывающаяся фигурная скобка в строке 12.

Утверждение в строке 06 представляет собой определение двух переменных типа double. Данный тип используется для представления вещественных данных повышенной точности. Объявление переменных должно завершаться точкой с запятой.

В строке 07 последовательность символов, заключенная в двойные кавычки "Enter a and b:" записывается в стандартный выходной поток вывода cout. При выполнении данного оператора на экран выводится текст строки (без кавычек). Занесение в поток вывода манипулятора endl обеспечивает перевод курсора на новую строку.

В строке 08 представлена операция чтения значений a и b из стандартного потока ввода cin (в данном случае - с клавиатуры).

В строке 09 определение переменной c совмещено с вычислением выражения.

В строке 10 на экран выводится строковая константа "Average is " и значение переменной c.

Утверждение return 0 в строке 11 возвращает операционной системе значение 0, означающее успешное завершение программы.

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

01 // Программа вычисления степени 02 #include <iostream> 03 using namespace std; 04 int main(int argc, char* argv[]) 05 { 06 double x; 07 int n; 08 cout << "Enter base of power and exponent of power:" << endl; 09 cin >> x >> n; 10 double power = 1; 11 for (int i = 1; i <= n; i++) 12 power *= x; 13 cout << "Power is " << power << endl; 14 return 0; 15 } В отличие от основания степени (x), показатель степени n определяется в строке 07 как целая переменная.

В строке 10 объявляется переменная power типа double и ей присваивается значение 1. Данное значение используется как первое приближение результата.

Строка 11 содержит оператор цикла for - цикла с параметром. Параметр i определяется внутри цикла и меняется от 1 (int i = 1) с шагом 1 (i++) пока выполняется условие i <= n (меньше либо равно). На каждом шаге цикла выполняется инструкция, следующая непосредственно после инструкции for (...).

Строка 12 представляет собой "тело цикла". В нем n раз осуществляется домножение значения переменной power на значение x (в ячейку, содержащую сначала 1, n раз записывается значение, равное предыдущему, умноженному на x).

Пример 3 Необходимо ввести с клавиатуры 8 чисел и найти их произведение.

// Программа вычисления произведения #include <iostream> using namespace std; int main(int argc, char* argv[]) { double x; double product = 1; cout << "Enter 8 values:" << endl; for (int i = 1; i <= 8; i++) { cin >> x; product *= x; } cout << "Product is " << product << endl; return 0; } 9 Задания на самостоятельную работу Реализовать следующие задачи в виде консольных приложений Microsoft Visual C++. Использовать отладчик для выполнения программ по шагам и просмотра промежуточных значений переменной.

Задача 1 Ввести с клавиатуры три числа и найти их произведение. Использовать стандартные средства ввода / вывода С++.

Задача 2 Ввести целое число n и вещественное число x, вычислить и вывести на экран y:

y = (1 + x)* (2 + x)* ... * (n + x).

Использовать цикл и стандартные средства ввода / вывода С++.

Задача 3 Ввести с клавиатуры 10 чисел. Найти их среднее арифметическое. Вывести результат на экран. Использовать стандартные средства ввода / вывода С++.

Задача 4* Решить задачу 2 с помощью рекурсивной функции.

 

* Далее звездочкой отмечены задачи повышенной трудности

 

Содержание     Предыдущее занятие     Следующее занятие

 

© 2001 - 2006 Иванов Л.В

Соседние файлы в папке OOP_C++