Как писать программы на С++
Положим, нам нужно написать простую программу, отправляющую сообщение на терминал пользователя, которое просит ввести имя. Мы прочитываем введенное имя, сохраняем, чтобы использовать в дальнейшем, и, наконец, приветствуем пользователя по имени.
Прекрасно, откуда начнем? Начнем там, откуда начинаются все программы на С++ - с функции, называемой main () . main (). Внедряемая пользователем функция в следующей основной форме:
Int main(){
// код нашей программы далее}
Где int - это ключевое слово языка С++. Ключевые слова - предопределенные имена, имеющие особое значение в языке. int представляет встроенный целый тип данных.
Функция - независимая последовательность кодов, производящих некие выкладки. Она состоит из частей: возвращаемого типа, имени функции, списка параметров и тела функции. Рассмотрим каждую из нихх по очереди.
Возвращаемый тип функции обычно представляет результат вычислений (выкладок), main () имеет целый возвращаемый тип. Значение, возвращаемое main (), показывает, было ли выполнение нашей программы успешным. По соглашению main () возвращает «О» при удачном выполнении. Ненулевое значение показывает, что что-то идет не так.
Имя функции выбирается программистом из соображений наилучшим образом определить, что функция будет делать. min () и sort (), например, - хорошие имена функций, f () и g () не так хороши. Почему? Они менее информативны в отношении назначения функции.
Main - не ключевое слово. Система компиляции, выполняющая нашу программу С++, предполагает, что функция main () предопределена. Если мы забудем включить ее, программа не будет работать.
Список параметров функции заключен в круглые скобки и размещен за именем функции. Пустой список параметров, как у main (), обозначает, что параметры функции не переда ются.
Список параметров, - обычно разделяемый запятой пере чень типов данных, которые пользователь может передать функции при ее выполнении. (Мы говорим, что пользователь вызывает или активизирует функцию). Например, если мы напишем функцию min (), возвращающую наименьшее из двух значений, ее список параметров должен определить типы двух значений, которые мы сравниваем. Функция min () для сравнения двух целых чисел может быть определена следующим образом:
Int min(int vail, int val2){ // код программы следует здесь...}
Тело программы заключено в фигурные скобки {}. Оно содержит последовательность кодов, которая осуществляет все действия функции. Двойная прямая косая черта / / означает пояснения, заметки программиста по каким-то аспектам кодов. Они предназначены для читающих исходный текст программы и выбрасываются при компиляции. Все, следующее за прямой двойной косой чертой до конца линии, относится к комментарию.
Наша первая задача - написать вывод сообщения на терминал пользователя. Ввод и вывод в языке С++ не предопределены. Вернее, они поддерживаются объектно-ориентированным классом иерархии, встроенным в С++ как часть стандартной библиотеки языка.
Класс - тип данных, определяемых пользователем. Механизм работы классов - метод добавления типа данных, распознаваемого нашей программой. Объектно-ориентированная иерархия классов определяет семейство относительных типов класса, например терминала и файлового ввода, тер минала и файлового вывода и т. д.
С++ предопределяет небольшое множество основных типов данных: булевы, символьные, целые и с плавающей точкой. Хотя они служат основой для всего программирования, мы не будем сосредотачивать на них внимание. Кинокамера, например, должна иметь положение в пространстве, обычно представляемое тремя числами в формате с плавающей точкой. Камера должна, кроме того, иметь ориентацию в пространстве, описываемую еще тремя числами с плавающей точкой. Есть еще одно отношение, описывающее отношение расстояния до камеры к высоте предмета. Оно представлено единственным числом с плавающей точкой.
На очень примитивном уровне можно сказать, что камера представлена семью числами с плавающей точкой, шесть из которых образуют две группы координат х, у, z. Программирование на этом низком уровне требует, чтобы мы направляли нашу мысль то назад, то вперед - от манипуляций с абстрактной камерой к манипуляции с семью числами с плавающей точкой, представляющими камеру в программе.
Механизм классов позволяет нам добавить в программу уровни абстракции типов. Например, мы можем определить класс трехмерных точек для представления локализации и ориентации в пространстве или класс Камер, состоящий из двух объектов класса трехмерных точек и числа с плавающей точкой. Мы все еще представляем камеру семью числами с плавающей точкой. Но разница в том, что в нашей программе мы теперь можем напрямую манипулировать с классом Камер, а не с семью числами с плавающей точкой.
Определение класса обычно разбивается на две части, каждая из которых представлена своим файлом: файлом заголовка, производящим объявление операций, поддерживаемых классом, и файлом текста программы, который содержит реализацию этих операций.
Для использования класса мы включаем в программу файл заголовка. Файл заголовка делает класс узнаваемым программой. Стандартные библиотеки ввода/вывода в С++ вызываются из библиотеки iostream. Она содержит подборку связанных классов, поддерживающих ввод и вывод на пользовательский терминал и в файлы. Чтобы использовать библиотеку класса iostream, мы должны включить ассоциированный с ней файл заголовка:
#include <iostream>
Для обращения к терминалу пользователя мы используем предопределенный объект класса, названный с out (произносится «си аут»). Мы направляем данные, которые хотим, чтобы cout написал, пользуясь оператором вывода (« ), следующим образом:
Cout « "Please enter your first name: "?
Это представлено выражением программы С++, маленьким независимым кусочком программы на С++. Это аналог предложения в обычном языке. Выражение завершается точкой с запятой. Наше выражение пишет строчку символов (отмеченных кавычками) на терминале пользователя. Кавычки идентифицируют строку, они не отображаются на терминале. Пользователь видит:
Please enter your first name:
Наша следующая задача - прочитать ввод пользователя. Прежде чем мы сможем прочитать имя, напечатанное пользователем, мы должны определить объект, в котором сохраним информацию. Мы определим объект, обозначив тип данных объекта и дав ему имя. Мы уже видели один тип данных int. Но трудновато использовать его для хранения чьего-либо имени. Больше подходит тип данных из стандартной библиотеки строкового класса:
String user_name;
Это определяет user_name, как объект строкового класса. Определение названо заявительным предложением. Это предложение не будет приниматься до тех пор, пока мы не сделаем строковый класс известным программе. Мы осуществляем это включением файла заголовка строкового класса:
#include <string>
Для чтения ввода с терминала пользователя, мы используем предопределенный объект класса, называемый сіп (произносится «си ин»). Мы используем оператор ввода ( » ) для направления сіп на чтение данных с терминала пользователя в объект подходящего типа:
Cin » user_name;
Последовательности вывода и ввода появятся на терминале пользователя следующим образом (ввод пользователя отмечен жирным шрифтом):
Please enter your first name: anna
Все, что нам остается сделать, - поприветствовать пользователя по имени. Мы хотим, чтобы вывод выглядел так:
Hello, anna... and goodbye!
Понимаю, это не верх совершенства. Но терпение - мы только начали. Позже мы научимся более изящным вещам.
Первый шаг для вывода приветствия - перенаправить его на следующую строку. Мы сделаем это, написав символ новой строки в cout:
Cout « ' n';
Символы обозначаются двумя апострофами. Существует две разновидности символов: печатные символы: буквы (' а', 'А' и т. д.), числа и знаки препинания ('; ', ' -' и т. д.), и непечатные символы: символ перевода строки (' п•) или табуляция ('t'). Поскольку нет символьного представления непечатных символов, самый общий пример - символ перевода строки и табуляция, они представляются специальной последовательностью из двух символов.
Теперь, перейдя на новую строку, мы хотим воспроизвести Hello:
Cout « "Hello, ";
Дальше нам нужно вывести имя пользователя. Оно сохранено в строковом объекте user_name. Как мы сделаем это? Так же, как и с другими типами:
Cout « user_name;
Наконец, мы завершаем приветствие, сказав «прощай» (обратите внимание, что строка символов может содержать оба вида: как печатные, так и непечатные символы):
Cout « " ... and goodbye!n";
В основном, все встроенные типы выводятся тем же путем - помещаем значение справа от оператора вывода. Например,
Cout « "3 + 4 = "; cout « 3 + 4;
Cout « "n";
Дает следующий вывод:
3 + 4 = 7
Так же, как мы определили новые типы класса для использования в приложении, проводим привязку оператора вывода для каждого класса. Это позволяет пользователям класса выводить его отдельные объекты совершенно одинаковым образом со встроенными типами данных.
Вместо написания отдельных выводов каждый на своей строке мы можем объединить их в одно предложение:
Cout « "п" « "Hello, " « user_name
« " ... and goodbye!n";
В завершении мы можем завершить main (), используя выражение return (возврат):
Return 0;
Return - ключевое слово С++. Выражение, следующее за ним, в данном случае «0», представляет результат выполнения функции. Напомню, что возвращаемое функцией значение «0» говорит об успешном завершении работы.
Соберем кусочки вместе - получим нашу первую завершенную программу на С++:
#include <iostream> tiinclude <string>
Using namespace std; // пока не объясняю этого —
Int main(){ string user_name;
Cout « "Please enter your first name: ";
Cin » user_name; cout « "n" « "Hello, " « user_name
« " ... and goodbye!n"; return 0;}
После компиляции при выполнении этот код произведет следующее (мой ввод подсвечен жирным шрифтом):
Please enter your first name: anna Hello, anna... and goodbye!
Одно выражение я не пояснил:
Using namespace std;
Посмотрим, смогу ли я объяснить это, не напугав вас. (Сделайте глубокий вдох!), using и namespace - ключевые слова С++, std - имя стандартной библиотеки namespace. Все, выбираемое из стандартной библиотеки (как объекты строкового класса, класса iostream - cout и сіп) заключено внутри, std namespace. Конечно, ваш следующий вопрос: а что такое namespace?
Namespace - метод упаковки библиотечных имен, при котором они могут быть использованы в окружении пользовательской программы без появления коллизий. (Коллизия имен обнаруживается, когда есть два использования одного и того же имени в приложении, так что программа не может различить их. Когда такое случается, программа не может продолжать работу, пока не разрешится конфликт имен). Namespaces - способ, ограждающий видимость имен.
Для использования объектов строкового класса и класса iostream - сіп и cout - внутри нашей программы мы должны не только включить файлы заголовков string и iostream, но так же сделать имена видимыми с std namespace. Использование директивы:
Using namespace std;
Простейший метод сделать имена внутри namespace (пространство имен) видимыми.