Програмен език C++
(съдържание)

Част 4. Вход и изход

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

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

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

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

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

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

cout << 23;

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

23

както и

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

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

He is 1.73 meters tall.

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

cout << "He is ";
cout << height ;
cout << " meters tall.";

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

cout << "He is "
     << height
     << " meters tall.";

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

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

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

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

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

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

float his_height = 1.73;
cout << "He is " << his_height << " meters tall.";
float her_height = 1.69;
cout << "\nShe is " << her_height << " meters tall.";
 

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

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

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

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

cout << "\nHellen\tJohn\tJoan"
     << "\nSean\tTobby\tBoris";

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

Hellen  John    Joan
Sean    Tobby   Boris

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

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

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

float her_height;
cout << endl << "Enter his height (m): ";
cin >> her_height;
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. След това се инициализират количествата в двата щанда, извършват се две продажби от първия и три от втория, и накрая се показва на екрана текущото състояние на щандовете.

// hot-dog stand inventory database program

#include <iostream.h>            // for cout, cin, etc.
#include <conio.h>               //for getche()

class HotDogStand                // class specification
{
  private:
    int HotDogsOnHand;         // hot dogs on hand
    int BunsOnHand;            // buns on hand
  public:
    void displayData()         // display hot dogs and buns
    {
      cout << "\n   Hot dogs = " << HotDogsOnHand;
      cout << "\n   Buns = " << BunsOnHand;
    }
    void SoldOneDog()          // record sale of one dog
    {
      --HotDogsOnHand;
      --BunsOnHand;
    }
    void initData()            // set initial quantities
    {
      cout << "\n   Enter hot dogs on hand: ";
      cin >> HotDogsOnHand;
      cout << "   Enter buns on hand: ";
      cin >> BunsOnHand;
    }
 };  // end of HotDogStand class

 /////////////////////////////////////////////////////////////
 void main()
 {
   // create two hot-dog stand objects
   HotDogStand stand1;
   HotDogStand stand2;

   // set initial data
   cout << "\nInitialize data for stand 1";
   stand1.initData();
   cout << "\nInitialize data for stand 2";
   stand2.initData();

   // record some sales
   cout << "\nSelling 2 dogs from stand1";
   stand1.SoldOneDog();
   stand1.SoldOneDog();
   cout << "\nSelling 3 dogs from stand2";
   stand2.SoldOneDog();
   stand2.SoldOneDog();
   stand2.SoldOneDog();
   cout << endl;

   // display current data
   cout << "\nSupplies on hand, stand1";
   stand1.displayData();
   cout << "\nSupplies on hand, stand2";
   stand2.displayData();

   // stop the flow on the monitor
   getch();

}  //end main

(съдържание)

Литература

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

Автор: Проф. Процесор Аритметиков

-
[ това е материал от брой 12 от октомври 2007 г. на списание "Коснос" www.kosnos.com ]


Keywords: С++,  OOP programming , C++ , Classes , Inheritance , Reusability , Creating New Data Types , Polymorphism and Overloading
Ключови думи: клас , обект, обектно ориентирано програмиране , полиморфизъм