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

Программирование на С/С++. Глава 1. Авторы: Кашаев С.М., Шерстнева Л.В.

Программирование на языках C/С++ в среде Visual C++.

Учебное пособие.

Авторы: Кашаев С.М., Шерстнева Л.В.

Глава 1. Знакомство с языком C/С++. Линейные алгоритмы.

Из языков программирования наибольшей популярностью пользуется С++. Базовой составляющей этого языка является язык С, который впоследствии трансформировался в С++. При этом в качестве среды программирования чаще всего используется система VisualC++, которая была разработана фирмойMicrosoftи на протяжении последних двух десятков лет она остается одним из наиболее удобных средств для программирования. Все рассмотренные в учебном пособии теоретические разделы и примеры программирования алгоритмов приводятся именно для использования в этой среде.

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

VisualC++ представляет собой технологическое средство для разработки программ, при этом каждая программа реализует тот или иной алгоритм. Понятие алгоритма занимает ключевое место в процессе программирования.Алгоритмпредставляет собой строгую систему правил, определяющую последовательность действий для решения конкретной задачи. Следуя такой системе, в разных ситуациях нужно действовать совершенно одинаково (по единой схеме). Можно сказать, что алгоритмом является такая последовательность арифметических и логических действий, которая позволяет решить поставленную задачу за конечное число шагов. В качестве решаемой задачи может быть, например, нахождение решения уравнения или поиск необходимой информации в файле с данными. Этапы разработки вычислительной программы выглядят следующим образом:

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

  2. Анализ задачи и моделирование, которые приводят к построению (или выбору) математической модели. Этот этап очень важен, т. к. в ряде случаев анализ показывает, что поставленную задачу можно решить аналитическими методами.

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

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

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

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

Среда VisualC++ 2010

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

Чтобы создать программу на языке С/С++ воспользуемся средой VisualC++ 2010, которая содержит в себе средства создания программы, ее компиляции, отладки и запуска на выполнение. Поэтому для начала рассмотрим интерфейс данной среды программирования.

После установки на своем компьютере среды VisualC++ 2010, вы можете ее запустить с помощью менюПуск. Общий вид окна данной программы после ее запуска показан на рис. 1.1.

Рис. 1.1.

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

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

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

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

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

Создание 1-й программы на языке С/C++

В среде VisualC++ (рис. 1.1) выполним команду из менюФайл:Создать –Проект. В результате на экране откроется окно, показанное на рис. 1.2. В левой части этого окна из установленных шаблонов выберем тип проектаWin32, а в центральной укажемКонсольное приложение Win32.

Рис. 1.2.

В поле Имянеобходимо указать имя проекта. Так, в качестве имени определим –Prog1. Также в разделеРасположениеследует выбрать месторасположение данного проекта (указать папку на компьютере, где он будет размещаться). ПолеИмя решенияможно не заполнять – в этом случае оно будет заполнено автоматически. После этого щелкните по кнопкеОК. В результате на экране Вы увидите новое окно, показанное на рис. 1.3. Это диалоговое окномастера создания приложений. Здесь щелкнем по кнопкеДалее, что приведет к открытию окна настройки параметров приложения (рис. 1.4). В этом окне установим флажок –Пустой проект, после чего щелкнем по кнопкеГотово.

Рис. 1.3.

Рис. 1.4.

В результате необходимые установки выполнены и на экране появится окно проекта (рис. 1.5).

Рис. 1.5.

Сделаем далее важную установку в свойствах проекта. Для этого в меню Проектвыберите пунктСвойства. В свойствах конфигурации выделите пунктОбщиеи далее следует обратиться к разделуНабор символов. Здесь необходимо в качестве значения указатьНе задано и щелкнуть по кнопке ОК (рис. 1.6). В дальнейшем это следует сделать для всех приводимых примеров консольных программ.

Рис. 1.6.

Теперь нам надо добавить в созданный проект программу (или по-другому файл исходного кода). Для этого щелкните правой кнопкой мыши в разделе Обозреватель решенийна пунктеФайлы исходного кода. После этого в контекстном меню выберитеДобавить -> Создать элемент. В открывшимся окне укажите слеваКод, а в центреФайл С++ (рис. 1.7). В качестве имени файла определимpr1.

Рис. 1.7.

В результате будет добавлен файл, правда пока пустой, но именно в нем мы и создадим нашу первую программу. Ее текст приведен на листинге 1.1.

Листинг 1.1. Пример программы вывода сообщения

#include <stdio.h>

#include <conio.h>

void main()

{

printf("Hello\n");

_getch();

}

Теперь ее следует запустить на выполнение. Для этого следует обратиться к меню Отладка – Начать отладку. В результате на экране появится окно информирующее о построении проекта и далее окно откроется вывода (черного цвета), в будет напечатан результат –Hello. Теперь если нажать на клавиатуре любую клавишу, то это окно будет закрыто и мы опять вернемся в среду разработки.

Таким образом, на этом примере мы рассмотрели технологию создания программы на языке С/C++ и ее запуска в средеVisualC++. Данный проект можно закрыть (в менюФайлпунктЗакрыть решение). Если Вы впоследствии захотите продолжить работу с данным проектом, то следует в менюФайлвыбрать разделОткрыть - Проект или решение. В результате перед Вами откроется окно выбора файла (рис. 1.8), где нужно указать имя созданного нами файла проектаProg1. Проделайте сейчас эти действия для закрепления навыка.

Рис. 1.8.

Поясним теперь суть нашей программы (листинг 1.1). Любая программа на С/С++ строится из множества элементов, называемых функциями. Это блоки программного кода, выполняющие определенные действия. Имена этих блоков, построенных по специальным правилам, задает сам программист. Либо эти имена уже заданы, если функции расположены в стандартной библиотеке стандартных функций. Имя главной функции, с которой начинается выполнение приложения, задано в среде программирования. Это имя – main(). Ключевое словоvoidговорит о том, что функция ничего не возвращает (как правило, функции возвращают значения в процессе своей работы).

В процессе выполнения программы сама функция main()обменивается данными с другими функциями и пользуется их результатами. Обмен данными между функциями происходит через параметры функций, которые указываются в круглых скобках, расположенных вслед за именем функции. Функция может и не иметь параметров, но круглые скобки после имени всегда должны присутствовать. В рассматриваемом выше примере в главной функцииmain()используются вызовы двух стандартных (библиотечных) функций:printf() и_getch().

Полезно пояснить процесс компиляциитекста программы (написанной на языке С/С++ или на каком-либо другом языке программирования).

Исходный текст программы на С/С++ не может непосредственно исполняться компьютером — вычислительная система не понимает синтаксических конструкций языка программирования. Для получения выполняемой программы исходный текст требуется обязательно откомпилировать, т. е. перевести в машинный код.Машинный код— это последовательность команд микропроцессора, состоящая из нулей и единиц. Так, первая команда представляет собой один набор двоичных разрядов, следующая команда — другой набор и т. д. Важно заметить, что каждый такой набор нулей и единиц вычислительная система однозначно понимает (в принципе, онатолько этои понимает).

Работу по переводу текста на языке С/С++ в машинный код выполняет специальная программа, называемая компилятором. Если компилятор не обнаружит ошибок, то на экране появится окно с сообщением о том, что компиляция прошла успешно. Если обнаружена ошибка, то выдается сообщение об ошибке.

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

  • синтаксические(ошибки в правилах языка, которые обнаруживает компилятор);

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

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

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

Каждый оператор (логически завершенная конструкция программы) в С/С++ должен завершаться точкой с запятой. Это фактически является символом отделения одного оператора от другого. И поэтому операторы можно записывать в одной строке (один оператор может следовать за другим через точку с запятой), что делает текст программы существенно компактнее.

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

В начале программы (до функции main) необходимо разместить описания тех функций, которые далее будут использоваться. Так, следует подключить стандартный заголовочный файлstdio.h, который содержит описание функцииprintf(). Также следует подключить стандартный заголовочный файлconio.h, который содержит описание функции_getch (). Эта функция используется для того, чтобы после вывода сообщения на экран задержать выполнение программы до тех, пор пока не будет нажата любая клавиша на клавиатуре.

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

Ввод-вывод в программе

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

  • cin– ввод с клавиатуры;

  • cout– вывод на экран.

На листинге 1.2 приведена программа, в которой с клавиатуры производится считывание значения переменной целого типа. Затем введенное значение выводится на экран.

Листинг 1.2. Ввод значения переменой с клавиатуры и вывод его на экран

#include <iostream>

using namespace std;

#include <conio.h>

void main()

{int x;

cin >> x;

cout << x;

_getch();

}

Важно обратить внимание на присутствие новой строки:

using namespace std;

Для начала переведем на человеческий язык, что же значит using namespace std. А означает это "использовать пространство имен std".

Что такое пространство имен? Простыми словами - это группировка определенных функций, классов и т.п. Если какой-либо разработчик напишет свою библиотеку функций и в ней окажутся функции с теми же названиями, что и функции в другой библиотеке, то разработчику следует объявить уникальное пространство имен для своих функций и классов. Тогда программист, использующий такую библиотеку, сможет либо при вызове определенных функций использовать префикс пространства имен, либо объявить, что все функции по умолчанию будут вызываться из определенного пространства имен. Практически все стандартные библиотеки C++ (в том числе и STL - библиотека стандартных шаблонов) используют пространство имен std, именно поэтому практически всегда нужно писатьusing namespace std, либо вам придется каждый вызов функции из этих библиотек предворять префиксом пространства именstd::.

Обратим внимание на то, что мы в данной программе ввели переменную x целого типа (int).

Здесь нам встретилась новая строка подключения файла: #include <iostream>.В библиотекеiostream определены средства для базовых действий по вводу-выводу.

Вычисления в программе

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

Блок-схема— это графическое изображение алгоритма в виде плоских фигур, соединенных линиями. Блок-схема представляет собой стандартный способ записи алгоритма и существует государственный стандарт (ГОСТ), содержащий перечень правил построения блок-схем.

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

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

#include <iostream>

using namespace std;

#include <conio.h>

void main()

{int x,z;

cin >> x;

z=x*x;

cout << z;

_getch();

}

В тексте данной программы нам также встретилось присваивание (обозначается знаком равенства). Это наиболее часто используемая конструкция, который работает следующим образом: сначала вычисляется выражение, стоящее справаот обозначения присваивания (знака=), а затем результат записывается в переменную, стоящуюслеваот данного знака. Например, после выполнения оператора

K=K+2;

текущее значение переменной Kувеличится на2.

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

Продолжим рассмотрение содержания листинга 1.3. После начала программы располагается строка, где определяется переменная x (а также переменная z). Дело в том, что данные, с которыми мы работаем, необходимо где-то хранить. И для этого предназначается основная (оперативная) память компьютера. Такая память состоит из набора однотипных ячеек, при этом каждая ячейка имеет свой номер, который называетсяадресом. Чтобы не работать с адресами ячеек напрямую (не запоминать длинные числовые адреса ячеек) предусмотрена возможность присвоения ячейкам символического имени (идентификатора).

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

Без дополнительной информации о типеданных, хранящихся в некоторой ячейке памяти, компьютеру было бы невозможно решить, что именно представляют собой эти данные. Например, 65 может просто числом в десятичной системе счисления, а может являться кодом буквы английского алфавита 'A' — все символы в компьютере представленыASCII-кодами(AmericanStandardCodeforInformationInterchange, американский стандартный код обмена информацией).

Имена (идентификаторы) переменных следует выбирать самостоятельно, и в рассматриваемой программе мы выбрали в качестве имени переменной идентификатор x. Любые имена переменных в языке С/С++ строятся по следующим правилам:

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

  • имя состоит из одного слова, а если требуется пробел в имени, то он заменяется на подчеркивание (St_1будет правильным вариантом для имени, аSt 1приведет к ошибке на этапе компиляции текста программы);

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

  • между двумя именами должен располагаться, как минимум, один пробел;

  • прописные и строчные буквы в именах различаются компилятором языка (Z1иz1— это разные имена);

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

Вернемся к листингу 1.3, где после описания переменных располагаются три оператора. Первый из них представляет собой стандартную команду ввода данных с клавиатуры. После этого располагается оператор, в котором реализуется умножение — значение переменной умножается на само себя. Фактически это является возведением исходного значения в квадрат. Результат перемножения заносится в другую переменную z (в ячейку памяти, которую мы отвели для данной переменной).

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

После выполнения умножения в программе располагается команда вывода информации на экран.

Основные операции

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

Таблица 1.1.

Операция

Действие

Вид

+

Сложение

Бинарная

-

Вычитание

Бинарная

*

Умножение

Бинарная

/

Деление

Бинарная

%

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

Бинарная

&

Поразрядное "И"

Бинарная

|

Поразрядное "ИЛИ"

Бинарная

!

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

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

^

Сложение по модулю 2

Бинарная

++

Увеличение на единицу

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

--

Уменьшение на единицу

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

||

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

Бинарная

&&

Логическое И

Бинарная

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

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

Поразрядное "И" производит логическое побитовое умножение операндов в соответствии со следующими правилами:

  • 1 & 1 = 1;

  • 1 & 0 = 0;

  • 0 & 1 = 0;

  • 0 & 0 = 0.

Здесь определены действия над каждой парой соответствующих битов операндов. Например, если мы собираемся вычислить выражение с числами в десятичной системе счисления (5 & 11), то на уровне компьютерных вычислений это выглядит так:

0000 0101 & 0000 1011 = 0000 0001.

Здесь исходные числа (5 и 11) записаны в десятичной системе счисления, но в компьютере они хранятся в двоичной системе. И над каждой парой соответствующих битов чисел производится операция поразрядного "И". В результате вычисления получим ответ:

5 & 11 = 1.

На листинге 1.4 приведена программа, где данные вычисления производятся с помощью программы.

Листинг 1.4. Выполнение поразрядного "И"

#include <iostream>

using namespace std;

#include <conio.h>

void main()

{int z;

z=5 & 11;

cout << z;

_getch();

}

Поразрядное "ИЛИ" (|) производит логическое побитовое сложение операндов в соответствии со следующими правилами:

  • 1 | 1 = 1;

  • 1 | 0 = 1;

  • 0 | 1 = 1;

  • 0 | 0 = 0.

Например, если мы собираемся вычислить выражение: 17 | 3, то на уровне компьютерных вычислений это выглядит так:

0001 0001 | 0000 0011 = 0001 0011.

В результате получим:

17 |3 = 19.

На листинге 1.5 приведена программа, где данные вычисления производятся с помощью программы.

Листинг 1.5. Выполнение поразрядного "ИЛИ"

#include <iostream>

using namespace std;

#include <conio.h>

void main()

{int z;

z=17 | 3;

cout << z;

_getch();

}

Операции отношения

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

  • <— меньше;

  • >— больше;

  • = =— равно;

  • >=— больше или равно;

  • <=— меньше или равно;

  • !=— не равно.

Результат каждого логического выражения с использованием одной из перечисленных операций отношения может принимать одно из двух значений: falseиtrue. Операции отношения определены над числовыми переменными, над символьными переменными и строками. Приведем несколько примеров использования операций отношения:

  • 6 >= 3, результат которой равенtrue;

  • 2.25 > 7.9, с результатомfalse;

  • ‘Pete’ = = ‘Pets’, что дает результат false.

Используя знаки логическихопераций (табл. 1.2) можно получать более сложные логические выражения. Здесь рассматривается построение логических выражений над булевыми данными, которые условно обозначеныX1иX2.

Таблица 1.2.Логические операции

X1

X2

!X1

X1 && X2

X1 || X2

true

true

false

true

true

true

false

false

false

true

false

true

true

false

true

false

false

true

false

false

Соседние файлы в папке файлы по информатике