Част 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.
Автор: Проф. Процесор Аритметиков
Keywords: С++,
OOP programming , C++ , Classes , Inheritance , Reusability , Creating
New Data Types , Polymorphism and Overloading
Ключови думи: клас
, обект, обектно ориентирано програмиране , полиморфизъм