§1 Структура программы. Поток вывода и операция вставки. Потоковый объект cout

Пустая программа

int main() {
	// Это однострочный комментарий
	/* Это 
	многострочный 
	комментарий    */
}

В С++ main() называется главной функцией программы. В ней осуществляется реализация основного алгоритма программы: вызовы функций, обращения к объектам библиотечных и пользовательских классов, инициализация, ввод и вывод данных, взаимодействие с операционной системой. В примере выше в теле основной программы ({ }) — пусто: программа будет выполнена, но видимых результатов в окне консоли мы не увидим. В теле программы только два вида комментариев: «//» — однострочный и «/* */» — многострочный. Комментарии (закомментированные строки) не участвуют в работе программы, они игнорируются транслятором при сборке программы. Но комментарии в программе нужны! Они позволяют разработчикам программ, т. е. программистам, обмениваться информацией о назначении тех или иных программных объектов, объяснять идею реализации алгоритма, собственных структур данных. Тип данных int (целое число) перед именем главной функции (main) означает, что сама программа возвращает в операционную систему числовые коды ошибок (или 0, если таковые отсутствуют). Согласно стандарту языка C++ требуется обязательно указывать тип int перед main.

Вывод строки «Здравствуй, мир!»

Создадим программу печатающую на экране символьную строку «Здравствуй, мир!». Это, традиционно, первая программа которую обучающийся пишет сам на изучаемом языке :-).
Программа 1.1

//============================================================================
// Name        : First.cpp
// Description : На экран будет выведена строка: "Здравствуй, мир!"
//============================================================================

#include <iostream>
using namespace std;

int main() {

	cout << "Здравствуй, мир!" << endl;
	return 0;
}

Для вывода строки нам потребуется подключить библиотечный класс iostream, содержащий функции ввода/вывода. Исторически так сложилось, что библиотечный класс ввода/вывода автоматически не включается в программу. Для вывода символьной строки необходимо использовать объект потока cout и операцию вставки «<<" (два символа "меньше", следующих друг за другом, без пробела). Символьная строка должна быть заключена в двойные кавычки. Завершает вывод данных манипулятор endl (end line - конец строки). Заканчивается программа инструкцией return (возврат значения). Инструкция return является необязательной (поскольку программа, в случае её отсутствия, будет возвращать значения операционной системе не явно). Но мы возьмем за хороший навык всегда использовать эту инструкцию в конце программы. Возвращаемое значение - 0. Обратите внимание, что любая инструкция (предложение языка) в C++ должно заканчиваться точкой с запятой.

Потоки

В программе 1.1 мы впервые столкнулись с понятием потока. Что же такое поток? Поток (stream) — это абстракция, отражающая перемещение данных от источника к приемнику. В большинстве программ требуется получать данные из-вне (например, с клавиатуры или файла), а также отправлять результаты вычислений на стандартное устройство (монитор) или записывать данные в файл.
2
Такое движение данных называется стандартным потоком ввода/вывода. Разумеется, среда C++ реализует потоки не сама по себе, а в непосредственном взаимодействии с операционной системой. Реализация потоков в языке C++ выполнена таким образом, что потоки для различных источников и приемников выглядят единообразно. Синтаксически вывод на языке C++ действительно напоминает поток. Инструкция потока вывода начинается соответствующим объявлением cout (читается "си-аут"). cout является объектом класса библиотеки C++ отвечающей за ввод и вывод - iostream. Данные отправляют (или добавляются) в поток с помощью операции вставки (вывода) <<. Например:

cout << "Ничего я не боюсь, если рядом C++!\n";
cout << "5 + 10 = " << 15 << endl;

Такая строка может быть очень длинной, поэтому, для читабельности кода, эту строку можно (и даже нужно!) оформлять в виде столбца:

cout << "2 x 1 = " << 2 << "\n"
     << "2 x 2 = " << 4 << "\n"
     << "2 x 3 = " << 6 << "\n"
     << "2 x 4 = " << 8 << "\n"
     << "2 x 5 = " << 10 << "\n"
     << "2 x 6 = " << 12 << "\n"
     << "2 x 7 = " << 14 << "\n"
     << "2 x 8 = " << 16 << "\n"
     << "2 x 9 = " << 18 << "\n"
     << "2 x 10 = " << 20 << endl;

Как мы уже сказали ранее, поток завершается манипулятором endl. (Манипуляторы - это инструкции форматирования, которые вставляются непосредственно в поток). Этот манипулятор вставляет завершающий ("нулевой") символ, являющийся признаком конца строки и освобождает буфер вывода. На самом деле, данные не выводятся сразу же на устройство, а накапливаются в специальной области памяти, называемой буфером. Буфер не является чем-то недоступным в программе и в процессе работы, с помощью специальных функций, мы можем получать доступ к элементам буфера непосредственно.
Примечание. Хотя endl и производит переход на новую строку, внутри потока использовать его не следует (но возможно). Для того, чтобы осуществить переход на новую строку используется специальная управляющая последовательность "\n" (как во фрагменте программы выше).

Форматированный вывод

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

*
**
***
** **
**  **
**   **
**    **
**     **
**      **
**       **
**        **
*************
**************

Программа 1.3

//============================================================================
// Name        : Format.cpp
// Description : Форматированный вывод с помощью манипулятора setw
//============================================================================

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
	cout << "*\n"
	     << "**\n"
	     << "***\n"
	     << "**" << setw(3) << "**\n"
	     << "**" << setw(4) << "**\n"
	     << "**" << setw(5) << "**\n"
	     << "**" << setw(6) << "**\n"
	     << "**" << setw(7) << "**\n"
	     << "**" << setw(8) << "**\n"
	     << "**" << setw(9) << "**\n"
	     << "*************\n"
	     << "**************"
	     << endl;
}

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

Практические задания

1. Составить программу, которая выводит в консольном окне ваше имя, образованное символом "*". Символ можно выводить следующим образом:
cout << ... << '*' << ... << endl; (многоточие означает, что часть кода пропущена)
2. Выведите следующие рисунки с помощью любых символов:

1.
*********************
******************
****************
**************
************
**************
****************
******************
*********************
2.
         *****
             *
            **
           ***
          ****
         *****
        ******
       *******
      ********
     *********
    **********
   ***********
*********************
 *******************
  ****************
3.
       *
      ***
    *** ***
   ***   ***
 ***       ***
***         ***
 ***       ***
   ***   ***
    *** ***
      ***
       *
4.
***********
 *********
  *******
   *****
    ***
     *
    ***
   *****
  *******
 *********
***********
Первый урок | Следующий урок ►


Добавить комментарий