Вход и изход

В тази лекция ще се разгледаме основните оператори за вход и изход, както и тяхното приложение в един елементарен клас и два обекта от неговия тип.

1. cout. Произнася се "си аут" и това е обект от стандартната стрийм библиотека на C++, който предизвиква появата на текстов ред на екрана. Например този програмен ред  (statement)

  1. cout << "This text will appear on the screen.";

ще даде текста, заграден в кавички на екрана. Операторът << се нарича "put to" оператор и всичко, което е отдясно на него се изпраща към това, което е отляво на него: т.е. в горния програмен ред текстът в кавичките се изпраща към cout. И операторът << принадлежи на стандартната стрийм-библиотека на C++ (standard stream library) и единственото, което е необходимо да направите, е да добавите един хедър файл, с дефиницията #include <iostream.h>, в началото на вашия праграмен файл.

2. Стрингови константи (string constants). В горния програмен ред бе използвана една такава - изразът, който започва от лявата кавичка и свършва с дясната, включително кавичките. Обърнете внимание, че символните константи, за разлика от стринговите, бяха заградени с апостроф, а не с кавички.

Със cout  може да се изкарват на екрана разнообразни по тип данни, например следните програмни редове са съвсем законни в C++.

  1. cout << 23;

дава на екрана  (с червен цвят ще показваме изхода на екрана)

23

както и

  1. float height = 1.73;
  2. cout << "He is ” << height << " meters tall.";

дава на екрана

He is 1.73 meters tall.

В последния ред се вижда, че няколко << оператора са "навързани" към cout , което на практика е равнозначно на

  1. cout << "He is ";
  2. cout << height ;
  3. cout << " meters tall.";

но което е по-дълго и по-тромаво като запис. Обикновенно се пише един ред с един оператор cout, но много често програмистите го представят по-прегледно на няколко реда като израза по-долу.

  1. cout << "He is "
  2.      << height
  3.      << " meters tall.";

3. Форматиране на изхода. Прегледно представената на екрана информация се обработва винаги по-бързо и по-безгрешно от използващия я, затова в C++ са предвидили начини за форматиране на изхода на екрана (или към файла, както ще видим в следващите лекции).

Нов ред. За разлика от BASIC, където оператор на нов ред винаги води до разпечатване на екрана на нов ред (ако изкарва информация на екрана) в C++ това не е така по подразбиране. Например тези оператори

  1. float his_height = 1.73;
  2. cout << "He is " << his_height << " meters tall.";
  3. float her_height = 1.69;
  4. cout << "She is " << her_height << " meters tall.";

ще дадат следните символи на екрана:

He is 12.76 meters tall.She is 1.69 meters tall.

Единият начин е да използваме един от споменатите във трета лекция, таблица 2, специални символи (escape sequence), по-точно ` `.

  1. float his_height = 1.73;
  2. cout << "He is " << his_height << " meters tall.";
  3. float her_height = 1.69;
  4. cout << " She is " << her_height << " meters tall.";
 

Което ще даде на екрана:

He is 12.76 meters tall.
She is 1.69 meters tall.

Обърнете внимание, че е вече в стрингова константа (двойни кавички), а не като отделен символ - но върши същата работа.

По същия начин може да се изпише с помощта на и таблица на екрана с някакви имена, например

  1. cout << " Hellen John Joan"
  2.      << " Sean Tobby Boris";

Което дава на екрана

Hellen  John    Joan
Sean    Tobby   Boris

По-прегледният начин за вкарване на нов ред в някаква символна поредица на екрана е с използването на така наречения манипулатор за край на ред (endl manipulator). Манипулаторите са обекти, които могат да се вкарват в потока (stream) и да променят неговото форматиране. Най-често използваният е endl, което е съкращение от end line. Видимо този манипулатор има същата роля като , но endl допълнително изпразва и буфера, т.е. предизвиква всички символи разпечатани преди него да се появят на екрана: иначе компютъра оптимизира своята дейност и не винаги изкарва всичко на екрана мигновенно. Ето горните редове, но този път с използване на endl.

  1. float his_height = 1.73;
  2. cout << "He is " << his_height << " meters tall." << endl;
  3. float her_height = 1.69;
  4. cout << "She is " << her_height << " meters tall.";

4. Вход от клавиатурата с обекта cin. Аналогично на cout имаме и обект cin (чете се "си ин"), който прехваща написаното от клавиатурата и с помощта на get in оператора  >> го изпраща към дадена променлива. Ето един пример:

  1. float her_height;
  2. cout << endl << "Enter his height (m): ";
  3. cin >> her_height;
  4. cout << endl << "She is " << her_height << " meters tall." << endl;

До тук се запознахме с някои от обектите на техниката стрийм вход-изход (stream I/O). Стриймът (потокът) е общо название на поток от данни (flow of data). За да използвате вход-изход стрийма трябва да включите файла IOSTREAM.H, който се нарича заглавен или хедър файл (header or include file). В заключение ще споменем, че C++ поддържа и функциите за вход и изход от старото C, като printf() и scanf(). Но тяхната употреба не се препоръчва и една от причините е, че те са ужасно сложни за употреба и лесно се допускат грешки, които трудно се забелязват - например написване в тях на %d вместо на %f.

Ето три тестови програми, които включват материала по-горе:  cout_tst.cpp, endl_tst.cpp  и  cin_tst.cpp.

А ето и примерна програма с един клас, която програма е дадена в превъзходния курс на Роберт Лафоор [1]. Има един специфициран клас, HotDogStand, който има две целочислени променливи HotDogsOnHand и BunsOnHand, които отчитат броя на хот-доците и броя на хлебчетата в наличие. Класът има и три функции - displayData(), SoldOneDog() и initData(). Първата функция показва на екрана наличието на броя хот-доци и броя хлебчета, втората функция намалява с едно съответните количества при продажба на един хот-док (използва се операторът --), а третата функция служи за инициализация на количеството хот-доци и хлебчета на щанда. В тялото на главната функция (main()) се създават два обекта от класа HotDogStand (които представляват двата щанда) - stand1 и stand2. След това се инициализират количествата в двата щанда, извършват се две продажби от първия и три от втория, и накрая се показва на екрана текущото състояние на щандовете.

  1. // hot-dog stand inventory database program
  2. #include <iostream.h>            // for cout, cin, etc.
  3. #include <conio.h>               //for getche()
  4. class HotDogStand                // class specification
  5. {
  6.   private:
  7.     int HotDogsOnHand;         // hot dogs on hand
  8.     int BunsOnHand;            // buns on hand
  9.   public:
  10.     void displayData()         // display hot dogs and buns
  11.     {
  12.       cout << "    Hot dogs = " << HotDogsOnHand;
  13.       cout << "    Buns = " << BunsOnHand;
  14.     }
  15.     void SoldOneDog()          // record sale of one dog
  16.     {
  17.       --HotDogsOnHand;
  18.       --BunsOnHand;
  19.     }
  20.     void initData()            // set initial quantities
  21.     {
  22.       cout << "    Enter hot dogs on hand: ";
  23.       cin >> HotDogsOnHand;
  24.       cout << "   Enter buns on hand: ";
  25.       cin >> BunsOnHand;
  26.     }
  27.  }// end of HotDogStand class
  28.  /////////////////////////////////////////////////////////////
  29.  void main()
  30.  {
  31.    // create two hot-dog stand objects
  32.    HotDogStand stand1;
  33.    HotDogStand stand2;
  34.    // set initial data
  35.    cout << " Initialize data for stand 1";
  36.    stand1.initData();
  37.    cout << " Initialize data for stand 2";
  38.    stand2.initData();
  39.    // record some sales
  40.    cout << " Selling 2 dogs from stand1";
  41.    stand1.SoldOneDog();
  42.    stand1.SoldOneDog();
  43.    cout << " Selling 3 dogs from stand2";
  44.    stand2.SoldOneDog();
  45.    stand2.SoldOneDog();
  46.    stand2.SoldOneDog();
  47.    cout << endl;
  48.    // display current data
  49.    cout << " Supplies on hand, stand1";
  50.    stand1.displayData();
  51.    cout << " Supplies on hand, stand2";
  52.    stand2.displayData();
  53.    // stop the flow on the monitor
  54.    getch();
  55. }  //end main

Литература

[1] Robert Lafore; C++ Interactive Course. Waite Group Press, Macmillan Computer Publishing, 1996.

Проф. Процесор Аритметиков, Програмен език C++. [Част 04], Списание "Коснос", брой 12, 2007 г