Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
visual с++.doc
Скачиваний:
28
Добавлен:
18.08.2019
Размер:
10.99 Mб
Скачать

Лабораторная работа №1. Интегрированная среда разработки Microsoft Visual Studio. Программирование алгоритмов линейной структуры

Цель работы и содержание: изучение возможностей среды разработки Microsoft Visual Studio, разработка консольных приложений в среде Microsoft Visual Studio, приобретение навыков программирования линейных процессов, основы отладки программ в среде Microsoft Visual Studio. Освоить технологию программирования линейных алгоритмов на языке C++, функции ввода/вывода данных, оператора присваивания.

Ход работы

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

Язык программирования C++(читается «си плюс плюс») был разработан на основе языка C(Си) Бьярном Страуструпом в 1972 году. На первых этапах разработки язык носил условное название «Си с классами», а позже Рик Маскитти придумал название «C++», что образно отразило происхождение этого нового языка от языка C. Язык C++ является расширением языка C, поэтому программы, написанные на языке C, могут обрабатываться компилятором языка C++. Язык C++ был создан, чтобы улучшить язык C, поддержать абстракцию данных и обеспечить объектно-ориентированное программирование (ООП).

С++ - это язык программирования общего назначения, хорошо известный своей эффективностью, экономичностью, и переносимостью. Указанные преимущества C++ обеспечивают хорошее качество разработки почти любого вида программного продукта. Использование C++ в качестве инструментального языка позволяет получать быстрые и компактные программы. Во многих случаях программы, написанные на C++, сравнимы по скорости с программами, написанными на языке Ассемблера.

Основные элементы среды разработки Microsoft Visual Studio. Integrated Development Environment (интегрированная среда разработки), или, со­кращенно, IDE - это программный продукт, объединяющий текстовый редактор, компилятор, отладчик и справочную систему.

Любая программа, создаваемая в среде Visual C++.NET, даже такая простая, как «Hello, World!», всегда оформляется как отдельный проект (project). Проект - это набор взаимосвязанных исходных файлов и, возможно, включаемых (заголовочных) файлов, компиляция и компоновка которых позволяет создать исполняемую про­грамму. Рабочая область может содержать любое ко­личество различных проектов, сгруппированных вместе для согласованной разра­ботки: от отдельного приложения до библиотеки функций или целого программ­ного пакета. Очевидно, что для решения наших учебных задач каждая программа будет воплощаться в виде одного проекта, поэтому рабочая область проекта у нас всегда будет содержать ровно один проект.

Запуск IDE. Типы приложений. Вызов Visual C++.NET осуществляется или через меню Пуск ► Программы ► Microsoft Visual Studio ► Microsoft Visual Studio, или щелчком мышью по пиктограмме с соответствующим именем.

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

Рисунок 1.1 - IDE Micro­soft Visual Studio

На самом деле главное окно (рабочий стол) Visual C++ принадлежит сту­дии разработчика Microsoft Developer Studio - интегрированной среде, общей для Visual C++, Visual J#, Visual Basic, Visual C# и некоторых других про­дуктов. Рабочий стол Visual C++ включает в себя три окна.

  1. Окно Project Workspace (окно рабочей области) предназначено для оказания помощи при написании и сопровождении больших многофайловых программ. Пока что оно закрыто, но после создания нового проекта (или загрузки сохраненно­го ранее проекта) одна из вкладок этого окна будет содержать список файлов проекта.

  2. Окно Editor (окно редактора) используется для ввода и проверки исходного кода.

  3. Окно Output (окно вывода) служит для вывода сообщений о ходе компиляции, сбор­ки и выполнения программы. В частности, сообщения о возникающих ошибках появляются именно в этом окне.

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

Microsoft Developer Studio позволяет строить проекты разных типов, ориентированные на различные сферы применения. Так как эта студия спроектирована на Windows-платформе, то почти все типы проектов являются оконными Windows-приложе­ниями с соответствующим графическим интерфейсом. В то же время разработчики Microsoft Developer Studio предусмотрели работу и с так называемыми консольными прило­жениями. При запуске консольного приложения операционная система создает так называемое консольное окно, через которое идет весь ввод-вывод программы. Внеш­не это напоминает работу в операционной системе MS DOS или других операци­онных системах в режиме командной строки.

Создание нового проекта. Для создания нового проекта типа «консольное приложение» выполните следу­ющие действия:

  • выберите в строке меню главного окна команду File ► New...

  • в открывшемся диалоговом окне New выберите вкладку Projects:

Рисунок 1.2 - Создание консольного проекта С++ в Microsoft Visual Studio

  • выберите тип Win32 Console Application;

  • введите имя проекта в текстовом поле Project Name, например First;

  • введите имя каталога размещения файлов проекта в текстовом поле Location (если указанный вами каталог отсутствует, то он будет создан автоматически);

  • щелкните левой кнопкой мыши на кнопке ОК.

Рисунок 1.3 - Окно приветствия при создании консольного проекта в Visual C++

  • После щелчка запускается так называемый мастер приложений Application Wizard, который открывает диалоговое окно Win32 Console Application с предложением определиться, какой подтип консольного приложения вам требуется создать.

  • Установите опции проекта согласно рисунка 1.4.

  • Щелкните на кнопке Finish.

Рисунок 1.4 - Опции консольного проекта Microsoft Visual C++

  • После щелчка появится окно New Project Information со спецификациями проекта и информацией о каталоге, в котором будет размещен создаваемый проект. Щелкните на кнопке ОК.

Допустим, что в качестве Project Name вы ввели имя First. Тогда после выполнен­ных шагов вы увидите на экране примерно то, что показано на рисунке 1.5.

Рисунок 1.5 - Результат работы мастера создания консольного проекта в Visual C++

Прежде чем продолжать работу, свернем временно главное окно Visual C++ на панель задач и заглянем в папку First, созданную мастером приложений для наше­го проекта, а точнее - для нашей рабочей области. Там находятся файлы First.dsw, First.dsp, First.opt, First.ncb, а также папку Debug (или Release - в зависимости от конфигурации проекта). Дадим краткое описание каждого из файлов:

  • First.dsw - файл рабочей области проекта, используемый внутри интегрирован­ной среды разработки. Он объединяет всю информацию о проектах, входящих в данную рабочую область.

  • First.dsp - проектный файл, используемый для построения (building) отдель­ного проекта или подпроекта.

  • First.opt - файл, содержащий опции рабочей области проекта. Благодаря этому файлу при каждом открытии рабочей области проекта все параметры Developer Studio, выбранные во время последнего сеанса работы с данной рабочей областью, будут восстановлены.

  • First.ncb - служебный файл. Он создается компилятором и содержит информацию, которая используется в инструменте интегрированной среды под названием ClassView. Панель ClassView находится в окне Project Workspace и показывает все классы C++, для которых доступны определения в рамках данного проекта, а также все элементы этих классов.

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

Развернем главное окно Visual C++ с открытой рабочей областью First, чтобы продолжить работу по созданию нашей первой программы. Первое, что бро­сается в глаза - окно Project Workspace «оживилось», в нем появились две вклад­ки: Class View и File View. С вкладкой Class View в ближайшее время мы работать не будем, поэтому щелчком мыши переключимся на вкладку File View. Она предназ­начена для просмотра списка файлов проекта. Откроем список First files, щелкнув мышью на значке «+». Появится дерево списка файлов, содержащее пиктограммы трех папок: Source Files, Header Files, Resource Files. Так как в консольных приложе­ниях файлы ресурсов не используются, то про последнюю папку сразу забудем. Попробуем заглянуть (щелчком мыши) в первые две папки. Попытка окажется неудачной - папки пусты. Это и неудивительно: ведь мы выбрали в качестве под­типа консольного приложения пустой проект - опцию An empty project. Так что наполнение проекта конкретным содержанием у нас еще впереди.

Добавление к проекту файлов с исходным кодом. Рассмотрим две ситуации:

- добавление существующего файла,

- создание ново­го файла.

Добавление существующего файла. В этом случае файл с исходным кодом (пусть это будет файл first.cpp) уже подготовлен ранее в каком-то текстовом редакторе. Продолжение должно быть следующим:

  • Скопируйте исходный файл (first.cpp) в папку рабочей области проекта (в дан­ном случае - First).

  • Вернитесь к списку First files в окне Project Workspace вашего проекта и щелкните правой кнопкой мыши на папке Source Files.

  • В появившемся контекстном меню щелчком мыши выберите команду добавле­ния файлов Add Files to Folder....

  • В открывшемся диалоговом окне Insert Files... выберите нужный файл (first.cpp) и щелкните на кнопке ОК.

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

  • Выберите в строке меню главного окна команду File ► New.... В результате от­кроется диалоговое окно New.

  • На вкладке Files:

    1. выберите тип файла (в данном случае: C++ Source File);

    2. в текстовом поле File Name введите нужное имя файла (в данном случае: first.cpp);

    3. флажок Add to project должен быть включен;

    4. щелкните на кнопке ОК.

Многофайловые проекты. В многофайловых проектах обычно присутствуют заголовочные файлы - они создаются/добавляются после щелчка правой кнопкой мыши на пиктограмме папки Header Files в окне Project Workspace; при этом на вкладке Files диалогового окна New выбирается тип файла C/C++ Header File, а при вводе имени файла используется расширение .h.

Папки Source Files и Header Files, пиктограммы которых вы видите в окне Project Workspace, на самом деле физически не существуют, то есть все файлы помещаются в основную папку рабочей области проекта, имя которой было задано при создании проекта в окне Project Name.

Компиляция, компоновка и выполнение проекта. Эти операции могут быть выполнены или через меню Build главного окна. Опишем кратко основные команды меню Build:

- Compile - компиляция выбранного файла. Результаты компиляции выводятся в окно Output.

- Build - компоновка проекта. Компилируются все файлы, в которых произошли изменения с момента последней компоновки. После компиляции происходит сборка (link) всех объектных модулей, включая библиотечные, в результирующий исполняемый файл. Сообщения об ошибках компоновки выводятся в окно Output. Если обе фазы компоновки завершились без ошибок, то созданный исполняемый файл с расширением .ехе может быть запущен на выполнение.

- Rebuild All - то же, что и Build, но компилируются все файлы проекта независи­мо от того, были ли в них произведены изменения.

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

- Execute - выполнение исполняемого файла, созданного в результате компоновки проекта.

Проблемы с вводом-выводом кириллицы. Работа в среде Visual C++ (в режиме консольных приложений) сопряжена с определенными неудобствами, вызванными различными стандартами кодировки символов кириллицы в операционных системах MS DOS и Windows. Весь ввод-вывод в консольном окне идет в кодировке стандарта ASCII, а текст в исходных файлах, набираемый в текстовом редакторе Visual C++, имеет кодировку в стан­дарте ANSI. Существует несколько способов нормального вывода строки, содержащей буквы русско­го алфавита:

1. Эту строку надо сначала «пропустить» через функцию CharToOem(), а уже потом отправлять на консольный вывод. Аналогично, если в программе есть кон­сольный ввод текста и этот текст в дальнейшем надо сохранять в документах (фай­лах) с кодировкой ANSI, то перед сохранением его надо «пропустить» через функ­цию OemToChar().С учетом сказанного выше можно предложить следующую адаптацию нашей пер­вой программы:

#include "stdafx.h"

#include <iostream>

#include "conio.h"

#include "windows.h"

using namespace std;

int tmain(int argc, _TCHAR* argv[])

{

char buff[256];

CharToOemA("Добро пожаловать в С++", buff);

cout<< buff;

return 0;

}

2. Второй метод – с помощью функции setlocale( LC_ALL, "Russian" ):

#include "stdafx.h"

#include <iostream>

#include "conio.h"

#include "windows.h"

using namespace std;

int tmain(int argc, _TCHAR* argv[])

{

setlocale( LC_ALL, "Russian" );

cout<<"Добро пожаловать в С++"<< endl;

return 0;

}

3. И, наконец, третий способ – с помощью подключения библиотеки <locate>:

#include "stdafx.h"

#include <iostream>

#include "conio.h"

#include "windows.h"

#include <locate>

using namespace std;

int tmain(int argc, _TCHAR* argv[])

{

LOCATE LOC("Russian Russia" );

cout<<"Добро пожаловать в С++"<< endl;

return 0;

}

Конфигурация проекта. Visual C++ позволяет строить проект либо в отладочной конфигурации (Win32 Debug), либо в выпускной конфигурации (Win32 Release). Мы рекомендуем вам всегда работать с проектами в отладочной конфигурации. Обычно она установле­на по умолчанию. Все же не мешает проверить, с какой конфигурацией на са­мом деле идет работа. Для этого выберите в меню Project пункт Settings... От­кроется диалоговое окно Project Settings. Проверьте, какое значение установлено в окне комбинированного списка Settings For:.. Если это не Win32 Debug, то переключитесь на нужное значение через команду меню Build ► Set Active Con­figuration...

Завершение работы над проектом. Можно выбрать меню File, пункт Close Workspace. А можно просто закрыть прило­жение Visual C++.

Открытие проекта, над которым вы работали ранее.

1. Способ первый:

  • Запустите на выполнение Visual C++.

  • Выберите меню File, пункт Open Workspace...

  • В открывшемся диалоговом окне найдите папку с вашим проектом, а в ней найдите файл ProjectName.dsw.

  • Откройте этот файл, щелкнув по нему мышью.

2. Способ второй:

  • Запустите на выполнение Visual C++.

  • Выберите меню File, наведите курсор мыши на пункт Recent Workspaces.

  • Если в появившемся меню со списком последних файлов, с которыми шла работа, вы найдете интересующий вас файл ProjectName.dsw, то щелкните по нему мышью.

3. Способ третий:

  • Не вызывая Visual C++, найдите папку с вашим проектом, а в ней - файл ProjectName.dsw.

  • Щелкните мышью на файле ProjectName.dsw.

Встроенная справочная система. В IDE Visual С ++ имеется обширная справочная система, доступная через меню Help главного окна.

Кроме этого, очень удобно пользоваться интерактивной справкой: если вы нахо­дитесь в окне Editor, поставьте текстовый курсор на интересующий вас оператор или библиотечную функцию C++ и нажмите клавишу F1. Тотчас будет вызвана справочная система MSDN с предоставлением необходимой информации. Если запрошенный термин встречается в разных разделах MSDN, то сначала появится диалоговое окно «Найденные разделы». В списке разделов выберите тот, в кото­ром упоминается «Visual C++».

Работа с отладчиком. Программу можно выполнять последовательно, строку за строкой - такой процесс называется пошаговым выполнением. Этот режим позволяет следить за тем, как изменяются значения различных переменных. Иногда он помогает по­нять, в чем заключается проблема: если обнаруживается, что переменная прини­мает неожиданное значение, то это может послужить отправной точкой для выяв­ления ошибки. После обнаружения ошибки ее можно исправить и выполнить программу заново в отладочном режиме.

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

Чтобы задать точку прерывания перед некоторым оператором, необходимо установить перед ним текстовый курсор и нажать клавишу F9 или щелкнуть мышью на кнопке Insert/Remove Breakpoint на панели инструментов Build MiniBar. Точка прерывания обозначается в виде коричневого кружка на левом поле окна редактирования. Повторный щелчок на указанной кнопке снимает точку прерывания. В программе может быть несколько точек прерывания.

Выполнение программы до точки прерывания. Программа запускается в отладочном режиме с помощью команды Build ► Start Debug ► Go (или нажатием клавиши F5).

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

Рисунок 1.6 - Запуск отладчика в Microsoft Visual C++

Среди различных команд этого меню особый интерес представляют команды Step Into (F11), Step Over (F10), Step Out (Shift+F11), Run To Cursor (Ctrl+F10) и Stop Debug­ging (Shift+F5).

Выбор последней команды (или нажатие комбинации клавиш Shift+F5) вызывает завершение работы с отладчиком.

Пошаговое выполнение программы. Нажимая клавишу F10, можно выполнять один оператор программы за другим.

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

Допустим, что вы вошли в код функции func(), нажав клавишу F11, но через не­сколько строк решили выйти из него, т.е. продолжить отладку после возврата из функции. В этом случае надо нажать клавиши Shift+F11.

Существует и другая возможность пропустить пошаговое выполнение некоторого куска программы: установите текстовый курсор в нужное место программы и нажмите клавиши Ctrl+F10.

Создание первой программы. Необходимо ввести в редакторе кода текст, представленный в листинге 1.1.

Листинг 1.1

#include “stdafx.h”

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

cout << “Hello, world!” << endl;

cout << “Press any key to stop the program…”;

return 0;

}

Рисунок 1.7 - Текст программы в Microsoft Visual C++

Это и есть наша первая программа на языке C++ в среде Visual С++. По традиции она выводит на экран надпись «Hello, World!» (Здравствуй, Мир!). Далее программа поясняет, что для ее завершения необходимо нажать какую-либо клавишу на клавиатуре.

Запустите программу на выполнение. Если вы все сделали правильно, на экране появится окно с соответствующими надписями. Чтобы закрыть это окно, нажмите любую клавишу на клавиатуре (рис. 1.8).

Рисунок 1.8 - Результаты работы программы

После того как программа завершилась, вы можете запустить ее еще раз тем же способом. Если между запусками в текст программы не были внесены изменения, то, запуская программу повторно, вы обнаружите, что запуск выполняется быстрее. Это происходит потому, что при первом запуске Visual C++ должен скомпилировать программу, то есть преобразовать ее исходный текст в исполни­мый машинный код.

Основные сведения о программах на языке C++. Состав языка С++:

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

Лексема или элементарная конструкция - это минимальная единица языка, имеющая самостоятельный смысл.

Выражение задает правило вычисления некоторого значения.

Оператор задает законченное описание некоторого действия.

Алфавит C++ включает:

  • прописные и строчные латинские буквы и знак подчеркивания;

  • арабские цифры от 0 до 9;

  • специальные знаки: “ { } , | [ ] ( ) + - / % * . \ ‘ : ? < = > ! & # ~ ; ^

  • пробельные символы: пробел, символы табуляции, символы перехода на но­вую строку.

Из символов алфавита формируются лексемы языка:

  • идентификаторы;

  • ключевые (зарезервированные) слова;

  • знаки операций;

  • константы;

  • разделители (скобки, точка, запятая, пробельные символы).

Основная программная единица на языке C++ - это текстовый файл с названием имя.cpp, где cpp - это принятое расширение для программ на C++, а имя - определяется исходя из семантики разрабатываемой программы.

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

#include <имя_включаемого_(заголовочного)_файла>

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

Таблица 1.1 - Типы заголовочных файлов

Заголовочный файл

Назначение

assert.h

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

ctype.h

Содержит декларации функций преобразования типов

errno.h

Содержит описание кодов ошибок

floaf.h

Содержит декларации математических функций для работы с вещественными числами одинарной точности

limits.h

Содержит определение границ диапазона изменения значений переменных различных типов

locale.h

Содержит функции для поддержки национальных стандартов

math.h

Содержит декларации математический функций для работы с вещественными числами двойной точности

sefjmp.h

Содержит декларации функций для осуществления межсегментных переходов (используется только в операционной системе MS-DOS)

stdarg.h

Содержит макросы для работы с функциями с переменным числом аргументов

stdio.h

Содержит декларации функций ввода-вывода в C++

stdlib.h

Содержит декларации функций библиотеки времени исполнения (RTL - Runtime Library) C++

string.h

Содержит декларации функций для работы с ASCIIZ строками

conio.h

Содержит декларации функций консольного ввода-вывода (используется только в операционной системе MS-DOS)

time.h

Содержит декларации функций для работы с датой/временем

dos.h

Содержит декларации функций, используемые для обращения к сервисам DOS (используется только в операционной системе MS-DOS)

iostream.h

Содержит объекты и классы потокового ввода-вывода

Программа на языке C++ состоит из функций, описаний и директив препроцессо­ра. Одна из функций должна иметь имя main() (либо WinMain, если программа пишется для операционной системы Windows).

Простейшее определение функции имеет следующий формат:

тип возвращаемого значения имя ([ параметры ])

{

операторы, составляющие тело функции

}

Как правило, функция используется для вычисления какого-либо значения, по­этому перед именем функции указывается его тип.

Сведения:

  • если функция не должна возвращать значение, указывается тип void;

  • тело функции является блоком и, следовательно, заключается в фигурные скобки;

  • функции не могут быть вложенными;

  • каждый оператор заканчивается точкой с запятой (кроме составного опера­тора).

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

Листинг 1.2

// Приложение с использованием стандартной

// библиотеки ввода-вывода

#include “stdafx.h”

#include <stdio.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

printf(“\tHello world!\n”);

return 0;

}

Листинг 1.3

// Приложение с использованием потоковой

// библиотеки ввода-вывода

#include “stdafx.h”

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

cout << ‘\t’ << “Hello world” << ‘\n’;

// можно и так: cout << “\tHello world!\n”;

return 0;

}

Эта программа выводит на экран фразу «Hello world!». Кроме переменных, cout и printf воспринимают еще и управляющие символы, такие как \n - символ перевода строки. Все, что встречается после символов \n, будет показано с начала следующей строки. В приведенном примере кроме \n присутствует еще и символ табуляции \t. Он поводит к тому, что фраза «Hello world!» окажется не в начале строки, а с некоторым отступом вправо.

Последовательности символов, начинающиеся с обратной косой черты, называ­ют управляющими, или escape-последовательностями. Управляющая последовательность интерпретируется как одиночный символ. Если непосредственно за обратной косой чертой следует символ, не предусмотренный таблице, результат интерпретации не определен. Если в последовательности цифр встречается недопустимая, она считается кон­цом цифрового кода.

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

"Открытое Акционерное Общество \"Волна\""

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

Управляющие символы (табл. 1.2) заключаются в одинарные кавычки и начинаются с обратной косой черты (обратного слеша). Не будь ее, объект cout и функция printf воспринял бы запись 'n' как строчную латинскую букву «n», а 't' - как латинскую букву «t» и т.д. Поэтому фразу «Hello world!» можно вывести на экран «по буквам».

Таблица 1.2 - Управляющие символы

Название

Обозначение

Символ новой строки

\n

Горизонтальная табуляция

\t

Вертикальная табуляция

\v

Возврат на шаг

\b

Возврат каретки

\r

Обратная слэш

\\

Апостроф

\’

Двойная кавычка

\”

Нулевой символ

\0

Звуковой сигнал

\a

Перевод страницы (формата)

\f

Восьмеричный код символа

\0ddd

Шестнадцатеричный код символа

\0xddd

Листинг 1.4

#include “stdafx.h”

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

cout << ‘\t’ << ‘H’ << ‘e’ << ‘l’ << ‘l’ << ‘o’

<< ‘\x20’ << ‘w’ << ‘o’ << ‘r’ << ‘l’ << ‘d’

<< ‘!’ << ‘\n’;

return 0

}

Одна из особенностей языка C++ - так называемая перегрузка дает необязательным использование указателей формата. В отличие от функции printf(), которая требует обязательное указание формата, cout при передаче параметров сам определяет формат на основании типа получаемых данных. Этот процесс называется перегрузкой. Аналогично оператору потокового вывода cout работает оператор потокового ввода cin:

cin >> t;

где t - переменная, значение которой необходимо ввести пользователем.

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

В программах на C++, использующих консоль, должна присутствовать функция main(), в отличие от приложений Windows, где точкой входа является функция WinMain(). Круглые скобки являются частью имени функции и ставить их надо обязательно, так как именно они указывают компилятору, что имеется в виду функция, а не просто английское слово main. В противном случае компиляция не будет завершена. Фактически каждая функция включает в свое имя круглые скобки, но в большинстве случаев в них содержится некая информация. В дальнейшем в тексте книги, ссылаясь на функцию, мы всегда будем ставить после ее имени круглые скобки.

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

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

При запуске программы компьютер начинает ее выполнение с первой инструк­ции функции main().

Функции консольного ввода-вывода clrscr(), getch(), cputs(). Поскольку разрабатываемые в данном методическом указании программы будут совместимы с MS-DOS, то рассмотрим функции консольного ввода-вывода.

Все прототипы этих функций находятся в файле conio.h. Приведем краткое назначение каждой из этих функций.

Функция clrscr() предназначена для очистки экрана.

Функция getch() предназначена для ввода одного символа с клавиатуры. Она ожидает нажатие клавиши и не отображает введенный символ на экран. Часто эту функцию используют для задержки окна вывода.

Функция puts() выводит на экран текстовую константу, заключенную в кавычки, в конце строки в обязательном порядке печатаются символы ‘\r’ и ‘\n’, иными словами при использовании данной функции курсор автоматически переводится на новую строку. В отличие от предыдущих двух функций, данная функция входит в библиотеку стандартного ввода-вывода, и для ее использования необходимо подключить заголовочный файл stdio.h. Аналогом данной функции в библиотеке консольного ввода-вывода служит функция cputs().

Ниже приведен листинг программа на C++, которая выводит на экран монитора фразу «Hello world!» с помощью описанных функций.

Листинг 1.5

#include “stdafx.h”

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

puts(“Hello world!”);

cputs(“Hello world!”);

}

Кавычки, отмечающие слово внутри круглых скобок в функции puts() не выводятся на экран. В языке C++ они означают, что на экран следует вывести заключенную в них последовательность символов, а не константу или переменную.

Точка с запятой в языке C/C++ является разделителем и отмечает конец инструк­ции. Разделитель показывает компилятору что данная инструкция завершена и дальше начинается следующая инструкция или заканчивается программа. Точку с запятой необходимо ставить после каждой отдельной инструкции, так, как это показано в листинге 1.5. Вышесказанное не означает, что точку с запятой надо ставить в конце каждой строки. Иногда инструкция занимает больше одной строки и в этом случае точку с запятой надо ставить только один раз, отмечая конец команды.

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

int main(){puts("Hello world!"); return 0}

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

  • помещать функцию main() на отдельной строке;

  • помещать фигурные скобки на отдельных строках;

  • создавать в тексте программы отступы с помощью табуляции.

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

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

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

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

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

Комментарий либо начинается с двух символов «прямая косая черта» (//) и за­канчивается символом перехода на новую строку, либо заключается между сим­волами-скобками /* и */. Внутри комментария можно использовать любые до­пустимые на данном компьютере символы, а не только символы из алфавита языка C++, поскольку компилятор комментарии игнорирует. Вложенные ком­ментарии-скобки стандартом не допускаются, хотя в некоторых компиляторах разрешены.

Листинг 1.6

/*Эта программа выводит сообщение на экран*/

#include “stdafx.h”

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

puts("Hello world!");

return 0;

}

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

Листинг 1.7

/*Эта программа выводит сообщение на экран */

#include “stdafx.h”

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

/*На экран выводится сообщение "ОК"*/

puts("Hello world");

return 0; /*Возврат в операционную систему*/

}

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

Весьма распространенным недосмотром, который часто допускают начинающие программисты, является то, что они забывают ставить символы */ в конце комментария, и в результате получают сообщение об ошибке компилятора, в C++ использование комментария несколько облегчается за счет введения пары символов //, указывающих начало строки комментария. В этом с концом комментария считается конец строки, так что нет необходимости отмечать его специальным символом:

Листинг 1.8

//Эта программа выводит сообщение на экран

#include “stdafx.h”

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

puts("Hello world!");

return 0; //Возврат в операционную систему

}

Однако если комментарий занимает больше одной строки, каждая строка должна начинаться с символов //.

Литералы. Идентификаторы, константы, переменные, ключевые слова. Литералом называется любой элемент данных, который вводится непосредственно в инструкции языка C++. Литералом может являться любое число, символ или строка, которые вводятся как начальные значения переменной. Например: cout=8, где число 8 являться литералом.

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

Идентификатор - это имя программного объекта. В идентификаторе могут ис­пользоваться латинские буквы, цифры и знак подчеркивания. Прописные и строчные буквы различаются, например, sysop, SySoP и SYSOP - три различных имени. Первым символом идентификатора может быть буква или знак подчерки­вания, но не цифра. Пробелы внутри имен не допускаются.

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

  • идентификатор не должен совпадать с ключевыми словами именами используемых стандартных объектов языка;

  • не рекомендуется начинать идентификаторы с символа подчеркивания, по­скольку они могут совпасть с именами системных функций или переменных, и, кроме того, это снижает мобильность программы;

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

Константами называют неизменяемые величины. Различаются целые, вещест­венные, символьные и строковые константы. Компилятор, выделив константу в качестве лексемы, относит ее к одному из типов по ее внешнему виду. Форматы констант, соответствующие каждому типу, приведены в таблице 1.3.

Таблица 1.3 - Форматы констант, соответствующие каждому типу

Константа

Формат

Примеры

Целая

Десятичный: последовательность десятичных цифр, начинающаяся не с нуля, если это не число нуль

8, 0, 199226

Восьмеричный: нуль, за которым следуют восьмеричные цифры (0,1,2,3,4,5,6,7)

01, 020, 07155

Шестнадцатеричный: 0х или 0Х, за которым следуют шестнадцатеричные цифры (0,l,2,3,4,5,6,7,8,9,A,B,C,D,E,F)

0хА, 0x1B8, 0X00FF

Вещественная

Десятичный: [цифры].[цифры]

5.7, .001, 35.

Экспоненциальный:

[цифры][.][цифры]{Е|е}[+-][ЦиФры]

0.2Е6, .lle-3, 5E10

Символьная

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

‘А’, ‘ю’, ‘*’, ‘db’, ‘\0’, ‘\n’, ‘\012’, ‘\x07\x07’

Строковая

Последовательность символов, заключенная в кавычки

“Здесь был Vasia”, “\tЗначение r=\0xF5\n”

Если требуется сформировать отрицательную целую или вещественную кон­станту, то перед константой ставится знак унарной операции изменения знака (-), например: -218, -022, -0хЗС, -4.8, -0.1е4.

Вещественная константа в экспоненциальном формате представляется в виде ман­тиссы и порядка. Мантисса записывается слева от знака экспоненты (Е или е), по­рядок - справа от знака. Значение константы определяется как произведение мантиссы и возведенного в указанную в порядке степень числа 10. Обратите вни­мание, что пробелы внутри числа не допускаются, а для отделения целой части от дробной используется не запятая, а точка.

Символьные константы, состоящие из одного символа, занимают в памяти один байт и имеют стандартный тип char. Двухсимвольные константы занимают два байта и имеют тип int, при этом первый символ размещается в байте с меньшим адресом.

Символ обратной косой черты используется для представления:

  • кодов, не имеющих графического изображения (например, \a - звуковой сиг­нал, \n - перевод курсора в начало следующей строки);

  • символов апострофа ( ' ), обратной косой черты ( \ ), знака вопроса (?) и ка­вычки ( " );

  • любого символа с помощью его шестнадцатеричного или восьмеричного кода, например, \073, \0xF5. Числовое значение должно находиться в диапазоне от 0 до 255.

Определить константу - это, значит, сообщить компилятору C ее имя, тип и значение. Для определения константы в языке C перед функцией main() часто помещают директиву #define для объявления констант и макроопределений. Однако использование этой директивы сопряжено с появлением трудно диагностируемых ошибок, лучшей альтернативой для констант является использование переменных с модификатором const. Такие переменные носят название константных переменных и объявляются следующий образом:

const <Тип> <Имя_Переменной> = <Значение>;

Наличие инициализатора <Значение> при объявлении константной переменной обязательно. Значение константной переменной не может быть изменено в процессе работы программы. Например:

const double pi = 3.1415926; // вещественная кон.

const int size = 400; // целая константа

const char new_line = ‘\n’; // символьная константа

const char topic[] = “Тема”; // строковая константа

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

Переменная - это именованная область памяти, в которой хранятся данные определенного типа. У переменной есть имя и значение. Имя служит для обращения к области памяти, в которой хранится значение. Во время выполнения про­граммы значение переменной можно изменять. Перед использованием любая переменная должна быть описана. Пример описания целой переменной с именем а и вещественной переменной х:

int a; double x;

Общий вид оператора описания переменных:

[класс памяти] [const|volatile] тип имя[инициализатор];

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

  • большие и малые буквы латинского алфавита,

  • арабские цифры,

  • символ подчеркивания ­«_».

Компилятор C++ рассматривает одну и ту же большую и малую буквы как разные символы. Например, переменные dx_1, Dx_1, dX_1, DX_1 имеют различные имена и являются, соответственно, разными литералами.

Первым символом в имени должна стоять буква или знак подчеркивания. Например: Num, _min, max_, sum_7, и так далее. Тем не менее, не рекомендуется использовать знак подчеркивания в качестве первого символа литерала, поскольку таковые в основном используются для системных нужд и определяют литералы собственно компилятора или операционной системы, например _UNICODE, литерал, используемый в директивах условной компиляции, если программа написана с использованием кодировки Unicode.

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

<Тип> <Имя_Переменной> = <Начальное_значение>;

Знак «=» обозначает инструкцию присваивания. Она предназначена для изменения значения переменных

<имя>=<выражение>;

Разновидность операции присваивания

<имя>=<имя> <знак операции> <выражение>;

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

Ключевые слова - это зарезервированные идентификаторы, которые имеют спе­циальное значение для компилятора. Их можно использовать только в том смыс­ле, в котором они определены.

Таблица 1.4 - Ключевые слова стандарта языка C++

asm

else

new

this

auto

enum

operator

throw

bool

explicit

private

true

break

export

protected

try

case

extern

public

typedef

catch

false

register

typeid

char

float

reinterpret_cast

typename

class

for

return

union

const

friend

short

unsigned

const_cast

goto

signed

using

continue

if

sizeof

virtual

default

int

static

void

delete

inline

static_cast

volatile

do

long

struct

wchar_t

double

mutable

switch

while

dynamic_cast

namespace

template

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

Время жизни может быть постоянным (в течение выполнения программы) и вре­менным (в течение выполнения блока).

Областью видимости идентификатора называется часть текста программы, из которой допустим обычный доступ к связанной с идентификатором областью па­мяти. Чаще всего область видимости совпадает с областью действия. Исключе­нием является ситуация, когда во вложенном блоке описана переменная с таким же именем. В этом случае внешняя переменная во вложенном блоке невидима, хотя он и входит в ее область действия. Тем не менее, к этой переменной, если она глобальная, можно обратиться, используя операцию доступа к области видимо­сти ::.

Для задания класса памяти используются следующие спецификаторы:

auto - автоматическая переменная. Память под нее выделяется в стеке и при не­обходимости инициализируется каждый раз при выполнении оператора, содер­жащего ее определение. Освобождение памяти происходит при выходе из блока, в котором описана переменная. Время ее жизни - с момента описания до конца блока. Для глобальных переменных этот спецификатор не используется, а для локальных он принимается по умолчанию, поэтому задавать его явным образом большого смысла не имеет.

extern - означает, что переменная определяется в другом месте программы (в другом файле или дальше по тексту). Используется для создания переменных, доступных во всех модулях программы, в которых они объявлены.

static - статическая переменная. Время жизни - постоянное. Инициализиру­ется один раз при первом выполнении оператора, содержащего определение пе­ременной. В зависимости от расположения оператора описания статические пе­ременные могут быть глобальными и локальными. Глобальные статические переменные видны только в том модуле, в котором они описаны.

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

int a; // 1 глобальная переменная а

int main()

{

int b; // 2 локальная переменная b

extern int x; /* 3 переменная х определена в другом месте */

static int с; /* 4 локальная статическая переменная с */

а = 1; // 5 присваивание глобальной переменной

int a; // 6 локальная переменная а

а = 2; // 7 присваивание локальной переменной

::а = 3; // 8 присваивание глобальной переменной

return 0;

}

int x = 4; // 9 определение и инициализация х

В этом примере глобальная переменная a определена вне всех блоков. Память под нее выделяется в сегменте данных в начале работы программы, областью действия является вся программа. Область видимости - вся программа, кроме строк 6-8, так как в первой из них определяется локальная переменная с тем же именем, область действия которой начинается с точки ее описания и заканчивается при выходе из блока. Переменные b и с - локальные, область их видимо­сти - блок, но время жизни различно: память под b выделяется в стеке при входе в блок и освобождается при выходе из него, а переменная с располагается в сег­менте данных и существует все время, пока работает программа.

Если при определении начальное значение переменных явным образом не зада­ется, компилятор присваивает глобальным и статическим переменным нулевое значение соответствующего типа. Автоматические переменные не инициализи­руются.

Имя переменной должно быть уникальным в своей области действия (например, в одном блоке не может быть двух переменных с одинаковыми именами).

Описание переменной может выполняться в форме объявления или определения. Объявление информирует компилятор о типе переменной и классе памяти, а оп­ределение содержит, кроме этого, указание компилятору выделить память в со­ответствии с типом переменной. В C++ большинство объявлений являются од­новременно и определениями. В приведенном выше примере только описание 3 является объявлением, но не определением.

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

Простые типы данных. Прежде чем использовать в программе на языке C++ какую-либо переменную, ее необходимо описать. Переменные в языке C++ могут быть описаны как в теле функции (между { }), так и вне ее. При описании переменной внутри функции область ее действия ограничена функцией. При описании переменной указать тип переменной и ее имя (идентификатор), для того, чтобы C++ должен зарезервировать достаточное количество памяти для хранения введенной информации. Разные типы данных занимают не одинаковый объем памяти. Не все функции языка C могут работать с данными любого типа.

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

Тип данных определяет:

  • внутреннее представление данных в памяти компьютера;

  • множество значений, которые могут принимать величины тина;

  • операции и функции, которые можно применять к величинам типа.

Рассмотрим наиболее часто употребляемые простые типы языка C++:

  • целые числа со знаком int, long, short,

  • целые беззнаковые константы unsigned,

  • символы, занимающие один байт char и два байта wchar_t,

  • числа с плавающей точкой float, double.

Тип char определяет целочисленные переменные, занимающие один байт, в диапазоне от -128 до 127. Этот тип, как правило, применяется для символьных переменных (числовым значением является код символа).

Тип wchar_t определяет целочисленные переменные, занимающие два байта, в диапазоне от -32768 до 32767. Этот тип, как правило, применяется для символьных переменных в кодировке Unicode (числовым значением является код символа в кодировке Unicode).

Тип short определяет целые переменные, занимающие два байта, в диапазоне от -32768 до 32767. Этот тип используется для небольших целых чисел, в основном для управления циклами.

Тип long определяет целочисленные переменные, занимающие четыре байта, в диапазоне от -2147483647 до 2147483646.

В зависимости от компилятора и операционной системы тип int может быть эквивалентен либо типу short, либо типу long. Для компилятора Borland C++ Builder тип int эквивалентен типу long.

Беззнаковые типы unsigned определяяют беззнаковые целые числа. Это ключевое слово используется с другими типами данных для определения этого типа как беззнакового, т.е. только положительные числа и ноль. К беззнаковым типам относятся unsigned char, unsigned wchar_t, unsigned short, unsigned long, unsigned int. Тип unsigned эквивалентен типу unsigned int.

Тип float определяет переменные, занимающие четыре байта, для чисел с плавающей точкой в диапазоне от до

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

Таблица 1.5 - Диапазоны значений простых типов данных на IBM PC

Тип

Диапазон значений

Размер (байт)

bool

true и false

1

signed char

-128 ... 127

1

unsigned char

0 ... 255

1

signed short int

-32 768 ... 32 767

2

unsigned short int

0 ... 65 535

2

signed long int

-2 147 483 648 ... 2 147 483 647

4

unsigned long int

0 ... 4 294 967 295

4

float

3.4e-38 ... 3.4c+38

4

double

1.7e-308 ... 1.7e+308

8

long double

3.4c-4932 ... 3.4e+4932

10

При описании данных достаточно ввести тип, за которым должен следовать список имен переменных. Например:

int tdw, _sek, g1o; char elen, ogi;

long kid, g2o; char isi ='j';

float z2_c; unsigned rib = 6;

double pi = 3.14159;

Операторы языка С++. Рассмотрим список всех операций, определенных в языке C++, в соответствии с их приоритетами (по убыванию приоритетов, операции с разны­ми приоритетами разделены чертой). В соответствии с количеством операндов, которые используются в операциях, они делятся на унарные (один операнд), бинарные (два операнда) и тернарную (три операнда).

Все приведенные в таблице 1.6 операции, кроме условной «? :», sizeof, селектора членов класса «.», доступа к области видимости «::» и оператора последовательного вычисления «,» могут быть пере­гружены.

Таблица 1.6 - Операции, определенные в С++

Операция

Краткое описание

Унарные операции

::

Доступ к области видимости

.

Селектор членов класса

->

Селектор членов класса

[ ]

Индексация

( )

Вызов функции

++

Постфиксный инкремент

--

Постфиксный декремент

typeid

Идентификация типа

dynamic_cast

Преобразование типа с проверкой на этапе выполнения

static_cast

Преобразование типа с проверкой на этапе компиляции

reinterpret_cast

Преобразование типа без проверки

const_cast

Константное преобразование типа

sizeof

Размер объекта или типа

--

Префиксный декремент

++

Префиксный инкремент

~

Поразрядное отрицание

!

Логическое отрицание

-

Арифметическое отрицание (унарный минус)

+

Унарный плюс

&

Взятие адреса

*

Разадресация

new

Выделение памяти

delete

Освобождение памяти

(<тип>)

Преобразование типа

.*

Селектор членов класса по указателю

->*

Селектор членов класса по указателю

Бинарные и тернарные операции

*

Умножение

/

Деление

%

Остаток от деления

+

Сложение

-

Вычитание

<<

Сдвиг влево

>>

Сдвиг вправо

<

Меньше

<=

Меньше или равно

>

Больше

>=

Больше или равно

==

Равно

!=

Не равно

&

Поразрядная конъюнкция (И)

^

Поразрядное исключающее ИЛИ

|

Поразрядная дизъюнкция (ИЛИ)

&&

Логическое И

| |

Логическое ИЛИ

? :

Условная операция (тернарная)

=

Присваивание

*=

Присваивание с умножением

/=

Деление с присваиванием

%=

Остаток от деления с присваиванием

+=

Сложение с присваиванием

-=

Вычитание с присваиванием

<<=

Сдвиг влево с присваиванием

>>=

Сдвиг вправо с присваиванием

&=

Поразрядное И с присваиванием

|=

Поразрядное ИЛИ с присваиванием

^=

Исключающее ИЛИ с присваиванием

throw

Инициировать исключение

,

Последовательное вычисление

Рассмотрим основные операции подробнее.

Операции увеличения и уменьшения на 1 (++ и --). Эти операции, называемые также инкрементом и декрементом, имеют две формы записи - префиксную, когда операция записывается перед операндом, и постфиксную. В префиксной форме сначала изменяется операнд, а затем его значение становится результи­рующим значением выражения, а в постфиксной форме значением выражения является исходное значение операнда, после чего он изменяется.

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

Например, вместо x = x + dx можно записать x += dx, вместо у = у*х можно записать у *= х а вместо i = i + 1 воспользоваться оператором инкремента и записать i++. Список наиболее часто используемых таких операций приведен в таблице 1.7.

Таблица 1.7 - Арифметические операции с присваиванием в C++

Наименование операции

Выражение

Эквивалентное

выражение

Префиксный и постфиксный инкремент

++x или x++

x = x + 1

Префиксный и постфиксный декремент

--x или x--

x = x - 1

Сложение с присваиванием

x += y

x = x + y

Вычитание с присваиванием

x -= y

x = x - y

Умножение с присваиванием

x *= y

x = x * y

Деление с присваиванием

x /= y

x = x / y

Взятие остатка с присваиванием

x %= y

x = x % y

Операндом операции инкремента в общем случае является так называемое L-значение (L-value). Так обозначается любое выражение, адресующее некоторый уча­сток памяти, в который можно занести значение. Название произошло от опера­ции присваивания, поскольку именно ее левая (Left) часть определяет, в какую область памяти будет занесен результат операции. Переменная является част­ным случаем L-зиачепия.

Операция определения размера sizeof предназначена для вычисления размера объекта или типа в байтах, и имеет две формы:

sizeof выражение

sizeof (тип)

Пример:

#include <iostream.h>

int main()

{

float x = 1;

cout << "sizeof (float) :" << sizeof (float);

cout << "\nsizeof x :" << sizeof x;

cout << "\nsizeof (x + 1.0) :" << sizeof(x + 1.0);

return 0:

}

Результат работы программы:

sizeof (float) : 4

sizeof x : 4

sizeof (x + 1.0) : 8

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

Операции отрицания (-, ! и ~). Арифметическое отрицание (унарный минус -) изменяет знак операнда целого или вещественного типа па противоположный. Логическое отрицание (!) дает в результате значение 0, если операнд есть истина (не нуль), и значение 1, если операнд равен нулю. Операнд должен быть целого или вещественного типа, а может иметь также тип указатель. Поразрядное отри­цание (~), часто называемое побитовым, инвертирует каждый разряд в двоичном представлении целочисленного операнда.

Деление (/) и остаток от деления (%). Операция деления применима к операндам арифметического типа. Если оба операнда целочисленные, результат операции округляется до целого числа, в противном случае тип результата определяется правилами преобразования. Опе­рация остатка от деления применяется только к целочисленным операндам. Знак результата зависит от реализации.

Операции сдвига (<< и >>) применяются к целочисленным операндам. Они сдвигают двоичное представление первого операнда влево или вправо на количе­ство двоичных разрядов, заданное вторым операндом. При сдвиге влево (<<) осво­бодившиеся разряды обнуляются. При сдвиге вправо (>>) освободившиеся биты заполняются нулями, если первый операнд беззнакового типа, и знаковым разря­дом в противном случае. Операции сдвига не учитывают переполнение и потерю значимости.

Операции отношения (<, <=. >, >=, ==. !=) сравнивают первый операнд со вто­рым. Операнды могут быть арифметического типа или указателями. Результатом операции является значение true или false (любое значение, не равное нулю, ин­терпретируется как true). Операции сравнения на равенство и неравенство име­ют меньший приоритет, чем остальные операции сравнения.

Поразрядные операции (&, |, ^) применяются только к целочисленным операн­дам и работают с их двоичными представлениями. При выполнении операций операнды сопоставляются побитово (первый бит первого операнда с первым би­том второго, второй бит первого операнда со вторым битом второго, и т.д.). При поразрядной конъюнкции, или поразрядном И (операция обозначается &) бит результата равен 1 только тогда, когда соответствующие биты обоих операндов равны 1.

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

При поразрядном исключающем ИЛИ (операция обозначается ^) бит результата равен 1 только тогда, когда соответствующий бит только одного из операндов ра­вен 1.

Логические операции (&& и | |). Операнды логических операций И (&&) и ИЛИ (| |) могут иметь арифметический тип или быть указателями, при этом операнды в каждой операции могут быть различных типов. Преобразования типов не производятся, каждый операнд оценивается с точки зрения его эквивалентности нулю операнд, равный нулю, рассматривается как false, не равный нулю - как true). Результатом логической операции является true или false. Результат операции логическое И имеет значение true только если оба операнда имеют значение true. Результат операции логическое ИЛИ имеет значение true, если хотя бы один из операндов имеет значение true. Логические операции выполняются слева направо. Если значения первого операнда достаточно, чтобы определить результат операции, второй операнд не вычисляется.

Операции присваивания (=, +=, -=, *= и т.д.). Операции присваивания могут использоваться в программе как законченные операторы. Формат операции простого присваивания (=):

операнд_1 = операнд_2

Первый операнд должен быть L-значением, второй - выражением. Сначала вы­числяется выражение, стоящее в правой части операции, а потом его результат записывается в область памяти, указанную в левой части (мнемоническое правило: «присваивание - это передача данных "налево"»). То, что ранее хранилось в этой области памяти, естественно, теряется.

В сложных операциях присваивания ( +=, *=, /= и т.п.) при вычислении выражения, стоящего в правой части, используется и L-значение из левой части. Напри­мер, при сложении с присваиванием ко второму операнду прибавляется первый, и результат записывается в первый операнд, то есть выражение, а +=b является более компактной записью выражения a = a + b.

Условная операция (? :). Эта операция тернарная, то есть имеет три операнда. Ее формат:

операнд_1 ? операнд_2 : операнд_3

Первый операнд может иметь арифметический тип или быть указателем. Он оце­нивается с точки зрения его эквивалентности нулю (операнд, равный нулю, рас­сматривается как false, не равный пулю - как true). Если результат вычисления первого операнда равен true, то результатом условной операции будет значение второго операнда, иначе - третьего операнда. Вычисляется всегда либо второй операнд, либо третий. Их тип может различаться. Условная операция является сокращен­ной формой условного оператора if.

#include <stdio.h>

int main()

{

int a = 11, b = 4, max;

max = (b > a)? b : a;

printf(“Наибольшее число: %d”, max);

return 0;

}

Результат работы программы:

Наибольшее число: 11.

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

(а + 0.12) / 6

х && у | | !z

(t * sin(x) - 1.05e4)/((2 * k + 2) * (2 * k + 3))

Операции выполняются в соответствии с приоритетами. Для изменения порядка выполнения операций используются круглые скобки. Если в одном выражении за­писано несколько операций одинакового приоритета, унарные операции, условная операция и операции присваивания выполняются справа налево, остальные - сле­ва направо. Например, а = b = с означает а = (b = с), а а + b + с означает (а + b) + с. Порядок вычисления подвыражений внутри выражений не определен: например, нельзя считать, что в выражении (sin(x + 2) + cos (у + 1)) обращение к синусу бу­дет выполнено раньше, чем к косинусу, и что х + 2 будет вычислено раньше, чем y + 1.

Результат вычисления выражения характеризуется значением и типом. Напри­мер, если а и b - переменные целого типа и описаны так:

int а = 2, b = 5;

то выражение а + b имеет значение 7 и тип int, а выражение а = b имеет значение, равное помещенному в переменную а (в данному случае 5) и тип, совпадающий с типом этой переменной. Таким образом, в C++ допустимы выражения вида а = b = с: сначала вычисляется выражение b = с, а затем его результат становится правым операндом для операции присваивания переменной а.

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

Преобразования бывают двух типов:

  • изменяющие внутреннее представление величин (с потерей точности или без потери точности);

  • изменяющие только интерпретацию внутреннего представления.

К первому типу относится, например, преобразование целого числа в веществен­ное (без потери точности) и наоборот (возможно, с потерей точности), ко второ­му - преобразование знакового целого в беззнаковое.

В любом случае величины типов char, signed char, unsigned char, short int и unsigned short int преобразуются в тип int, если он может представить все значе­ния, или в unsigned int в противном случае.

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

Стандартные математические функции. В языке C для математических вычислений используются стандартные математические функции, декларированные в заголовочном файле math.h (табл. 1.8 и табл. 1.9).

Таблица 1.8- Тригонометрические и гиперболические функции

Тригонометрические функции (угол задается в радианах)

Обратные тригонометрические функции (возвращают угол в радианах)

Гиперболические функции

sin(x) - синус

asin(x) - арксинус

sinh(x) - гиперболический синус

cos(x) - косинус

acos(x) - арккосинус

cosh(x) - гиперболический косинус

tan(x) - тангенс

atan(x) - арктангенс

tanh(x) - гиперболический тангенс

atan2(y, x) - угол в полярных координатах точки (x, y) в диапазоне .

Таблица 1.9 - Другие наиболее часто используемые математические функции

Функция

Действие

hypot(x,y)

вычисляет гипотенузу прямоугольного треугольника с катетами x и y

exp(x)

экспоненциальная функция,

log(x)

натуральный логарифм, ln(x), x > 0

log10(x)

десятичный логарифм, lg(x), x > 0

pow(x, y)

вычисляет . Ошибка области, если x = 0 и y ≤ 0 или

x < 0, y - не целое

pow10(p)

Вычисляет . Результат вычисляется в виде double. Все аргументы считаются допустимыми, p типа int.

sqrt(x)

корень квадратный из x, x ≥ 0

ceil(x)

находит наименьшее целое типа double, не меньшее x

ceil(6.25) = 6.00, ceil(-6.25) = -6.00

floor(x)

находит наибольшее целое типа double не превышающее значение x. floor(6.25) = 6.00, floor(-6.25) = -7.00

fabs(x)

абсолютное значение (модуль) числа с плавающей точкой fabs(-6.25) = 6.25

Пример:

#include "stdafx.h"

#include "math.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

double x, z, s;

const double a=0.5, b=1.08, c=2.1, m=0.7;

z=(sin(x)/sqrt(1+m*m*sin(x*x))-c*m*log10(m*x));

cout<< "z=";

cout<< z;

s=(exp(-a*x)*sqrt(x+1)+exp(-b*x)*sqrt(x+1.5));

cout<< "\ns=";

cout<< s;

getch();

return 0;

}

В этом примере вычисляется функция:

при заданных значениях: х = 1.7; a = 0.5; b =1.08; c = 2.1; m =0.7.

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

К ошибкам, выявляемым на этапе компиляции, относятся, прежде всего, синтак­сические ошибки (нарушения правил языка C++ в исходном тексте программы). Такие ошибки обычно выявляются самой средой программирования. Встретив синтаксическую ошибку в программе, прервет компиляцию и выдаст сообщение об ошибке.

К ошибкам времени выполнения программы относятся такие, которые возникают не в результате нарушения синтаксиса C++, а в результате выполнения програм­мой каких-либо недопустимых действий (например, попытка разделить число на нуль или записать данные на заполненный диск). Некоторые из этих ошибок от­личаются тем, что возникают лишь при определенных условиях, например при заполнении диска или обращении в нуль значения какой-либо переменной. Как правило, при возникновении ошибки времени выполнения программа выдает специальное сообщение об ошибке (и часто ее выполнение на этом завершается), Логические ошибки в программе относятся к самому «труднонаходимому» типу ошибок, поскольку их зачастую невозможно выявить формальными методами. При наличии логических ошибок программа выполняется и компилируется без проблем, но делает не то, что ждет от нее программист. Обнаружить и устранить логические ошибки (а также ошибки времени выполнения) в программе можно с помощью тестирования и отладки.

Сообщение об ошибке содержит указание на имя файла и строку, в которой обнаруже­на ошибка, код ошибки и ее краткое описание. Более подробные сведения об ошибке можно получить в справочной системе. Для этого нужно щелкнуть на стро­ке сообщения об ошибке один раз (при этом строка будет выделена) и нажать кла­вишу F1. Если щелкнуть на строке сообщения об ошибке дважды, в окне редактора исходных текстов будет выделена строка, в которой обнаружена ошибка. Visual C++ выводит сразу все сообщения об ошибках, обнаруженных в программе.

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

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

Аппаратура и материалы. Для выполнения лабораторной работы необходим персональный компьютер со следующими характеристиками: процессор Intel Pentium-совместимый с тактовой частотой 800 МГц и выше, оперативная память - не менее 64 Мбайт, свободное дисковое пространство - не менее 500 Мбайт, устройство для чтения компакт-дисков, монитор типа Super VGA (число цветов от 256) с диагональю не менее 15. Программное обеспечение - операционная система Windows2000/XP и выше, среда разработки приложений Microsoft Visual Studio.

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

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

  1. Оформить программу, указав свою фамилию и инициалы, группу с использованием однострочного и многострочного комментариев.

  2. Объявить и проинициализировать переменные основных типов (int, double, char).

  3. По инструкции cin >> ввести одно из предложенных значений переменных с клавиатуры (int, double).

  4. Оставшиеся значения определить как константы, используя константные переменные.

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

  6. Инструкцией cout << вывести на экран значения исходных данных и результаты вычислений, сопровождая вывод именами выводимых величин на экран. При переводе на новую строку использовать управляющий символ ‘/n’ и манипулятор endl.

  7. Изменить программу таким образом, чтобы значения всех переменных вводились с клавиатуры.

Индивидуальное задание №1. Вариант:

Задание

Задание

при х = 1.426; у = - 1.220;

z = 3.5.

при х = 1.4; a = 0.5; b = 3.1.

при х = 1.825; у = 18.225;

z = - 3.289.

при х = 0.3; a = 0.5; b = 2.9.

при х = 0.335; у = 0.025.

при х = 1.426; у = -0.823;

z = 2.724.

при a = - 0.5; b = 1.7; t = 0.44.

при х = 0.9; m = 1.2; c = 2.4.

при a = - 1.5; b = 15.5;

x = -2.9.

при х = 5.4; у = 1.9; b = 3.5;

m = 0.2.

при a = 16.5; b = 3.4; x = 0.61.

при х = 0.54; a = 1.1; b = - 1.22.

при a = 0.7; b = 0.05; x = 0.5.

при х = 1.82; у = 18.23;

z = 3.44.

при х = 0.2; a = 1.1; b = 0.04.

при a = 1.5; b = 15.6; t = 0.9.

при m = 2; c = -1; t = 1.2;

b = 0.7.

при b = 0.7; c = -1.8; t = 1.2.

при a = 3.2;b = 17.5; x =- 4.8.

при a = 3.44; b = 17.52;

x=- 4.8, z = 5.34.

при a = 10.2; b = 9.2; x = 2.2;

c = 0.5.

при х = 3.23; a = 10.23;

b = 9.84; c = 0.5.

при a = 0.3; b = 0.9; x = 0.61.

при a =0.001; b = 5.8; x = 1.77.

Содержание отчета и его форма. Отчет по лабораторной работе должен состоять из:

  1. Названия лабораторной работы.

  2. Цели и содержания лабораторной работы.

  3. Ответов на контрольные вопросы лабораторной работы.

  4. Формулировки индивидуального задания и порядка его выполнения.

Отчет о выполнении лабораторной работы в письменном виде сдается преподавателю.

Вопросы для защиты работы

  1. Назовите преимущества языка С++.

  2. Какие окна включает в себя рабочий стол Visual C++?

  3. Каковы этапы создания консольного приложения в среде Visual C++?

  4. Какова структура программы, написанной на языке C++?

  5. Какие существуют основные типы данных в языке C++? Дать их назначение.

  6. Каково назначение директивы #include в языке C++?

  7. Каково назначение функций printf() и puts() в языке C++?

  8. Каково назначение функций clrscr(), getch() и cputs() в языке C++?

  9. Каким образом осуществляется потоковый ввод-вывод в языке C++? Каково назначение объектов cin и cout?

  10. Что такое литерал?

  11. Как производится объявление переменной и константной переменной в языке C++? В чем отличие присваивания от инициализации?

  12. Какие спецификаторы используются для задания класса памяти?

  13. Какое существует деление операций в соответствии с количеством операндов, которые в них используются?

  14. Из чего состоят выражения?

  15. Какие существуют математические функции в языке C++?

  16. Каким образом осуществляется диагностирование ошибок компиляции в среде Visual C++?

Пример выполнения лабораторной работы №1:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]