3. Низове и обекти

План:
Низове
Конструиране на обекти
Използване на обекти
Обекти от реалния свят
Оператор if


** Низове

Пример: Да се изведат инициалите на името и презимето, зададени на входа.

// initials.cpp
#include
<iostream>
#include <string>
using namespace std;

int main()
{ cout << "Please enter your full name (first middle last): ";
string first;
string middle;
string last;
cin >> first >> middle >> last;
string initials = first.substr(0, 1) + middle.substr(0, 1)
+ last.substr(0, 1);
cout << "Your initials are " << initials << "\n";

return 0;
}
Enter your full name (first middle last): Nikolay Kirov
Kirov
Your initials are NKK

* Низ (string) е редица от символи - букви, цифри, специални символи.

Низ е редица от символи  "Hello"
Дефиниция на променлива от тип string
 string name = "John";
Заглавен файл  #include <string>
Оператор за присвояване  name = "Carl";
Извеждане на низове  cout << name;
Вход на низ
 cin >> name;
Вход на цял ред  getline(cin, name);
Дължина на низ  int n = name.length();
Празен низ  ""
Автоматична инициализация  string response; 

* Функция за вход - getline(cin,name) - подобна на аритметичната функция pow(x,y).  Параметри (аргументи) на функция.

* Член-функция е функция, свързана с определен тип данни. Тя се извиква с операция точка (.).
 
Пример:
name.length() - връща дължината на низа (цяло неотрицателно число!)

* За променливи от тип string е дефинирана и член-функция substr - подниз (substring)

Пример:
string greeting = "Hello World!\n";
string sub = greeting.substr(0, 4); 

greeting.substr(0,4)- връща подниз от позиция 0 до позиция 3 (4 символа). 
Позициите в низа се броят от 0.

"Hello, World!"

H
e
l
l
o
,

W
o
r
l
d
!
\n
0
1
2
3
4
5
6
7
8
9
10
11
12
13

greeting.substr(7,5)- връща подниз от позиция 7 до позиция 11 (5 символа).

H
e
l
l
o
,

W
o
r
l
d
!
\n
0
1
2
3
4
5
6
7
8
9
10
11
12
13

* Сливане на низове (конкатенация).
Предефиниране на операция + (събиране)
string fname = "Nikolay"; 
string lname = "Kirov"; 
string name = fname + lname; 
"NikolayKirov"

string name = fname + " " + lname; 
"Nikolay Kirov"

* Поне един от аргументите на сливането трябва да е променлива!

string name = "Nikolay" + "Kirov"; // ERROR!    


 ** Конструиране на обекти

Обектът е стойност, която може да се създава, запазва и обработва със средствата на езика за програмиране.
Обект = променлива или константа, като понятието обект се използва за "по-големи" променливи или константи (напр. низове).
Пример:
 int k = 1;               /* k е обект, по-добре променлива */
 string greeting = "Hello"; /* greeting и "Hello" са обекти */

* Тип данни клас.
Класовете могат да се дефинират от програмиста.
Класът Time е дефиниран от К. Хорстман и задава нов тип данни.
Обект от този клас съхранява момент от времето - час, минути, секунди (три цели числа).
Конструиране на обект. Time(23,59,59) означава 23 часа, 59 минути и 59 секунди.
Това е обект-константа, аналогичен на числовите константи (числата) и низовете.
Пример:
   6 е константа от тип int;
   2.3,  е константа от тип double;
   "Hello" е константа от тип string;
  Time(23,59,59) е константа (обект-константа) от тип Time.
Включване на файл с дефиниция на класа:
    #include "ccc_time.h"
Дефиниране на обект-променлива от тип Time:
        Time day_end = Time(23,59,59);
или по-кратко (съкратен запис):
    Time day_end(23,59,59);
Често вместо "обект-променлива" ще използваме само "променлива" или само "обект".
Името на променливата е day_end, типът на променливата е Time и началната стойност на променливата е Time(23,59,59).

* Конструктор и параметри на конструктора.
За създаване на обекти от клас се използва функция, наречена конструктор на класа:
-- името на конструктора съвпада с името на класа;
-- параметрите на конструктора са зададени в дефиницията на класа.
Конструиране по подразбиране - задава текущото време по компютърния часовник (в момента на изпълнение на програмата):
       Time now = Time();
или съкратено:
   Time now;


** Използване на обекти

Член функции на клас за класа string - параметри на функция, върната стойност.
Пример:
    string greeting = "Hello";
    cout << greeting.length() << endl;    // 5
    cout << greeting.substr(0,1) << endl; // "H"

Член-функции на класа Time - функции за достъп:
Пример:
        Time lecture_end(9, 30, 0);
        cout << lecture_end.get_hours() << ":";     // 9
        cout << lecture_end.get_minutes() << ":";   // 30
        cout << lecture_end.get_seconds() << endl;  // 0

Член-функции на класа Time - функции за промяна на обекта:
Пример:
   Time wake_up(7,0,0);       /* 7:00:00 */
   wake_up.add_seconds(1000); /* 7:16:40 */
Добавя 1000 секунди към момента от време, записан в обекта wake_up.
Пример:
// time1.cpp
#include
<iostream> using namespace std;

#include "ccc_time.h" int main() { Time wake_up(8, 0, 0); wake_up.add_seconds(1000); /* a thousand seconds later */ cout << wake_up.get_hours() << ":" << wake_up.get_minutes() << ":" << wake_up.get_seconds() << "\n"; return 0;
}

nkirov@CITB107 % c++ time1.cpp ccc_time.cpp
nkirov@CITB107 % ./a.out
9:16:40


Член-функции на класа Time:
 Име  Действие
Time() Конструира обект, показващ текущото време Конструктор
Time(h,m,s) Конструира обект, показващ h часа, m минути и s секунди Конструктор
t.get_seconds() Връща броя на секундите в t. Член-функция за достъп
t.get_minutes() Връща броя на минутите в t. Член-функция за достъп
t.get_hours() Връща броя на часовете в t. Член-функция за достъп
t.add_seconds(n) Премества момента t с n секунди напред. Член-функция за промяна
t.seconds_from(t2)  Пресмята броя на секундите между t  и t2. Член-функция за достъп

Пример: Колко секунди остават до края на деня?

// time2.cpp
#include
<iostream> using namespace std; #include "ccc_time.h" int main() { Time now; Time day_end(23, 59, 59); long seconds_left = day_end.seconds_from(now); cout << "There are " << seconds_left
<< " seconds left in this day.\n"; return 0; }
nkirov@CITB107 % c++ time2.cpp ccc_time.cpp
nkirov@CITB107 % ./a.out

There are 10660 seconds left in this day.

Тъй като денонощието съдържа 24x3600 = 86400 секунди, член-функцията seconds_from връща стойност от тип long.


** Обекти от реалния свят

Пример:
  Обект от тип Employee (служител) съхранява име на служител и неговата (годишна) заплата. Създава се обект harry с начална заплата 45000 и след това му се повишава заплатата с още 3000.
// employee.cpp
#include
<iostream> using namespace std; #include "ccc_empl.h"

int main() { Employee harry("Hacker, Harry", 45000.00); double new_salary = harry.get_salary() + 3000; harry.set_salary(new_salary); cout << "Name: " << harry.get_name() << "\n"; cout << "Salary: " << harry.get_salary() << "\n"; return 0; }
 
nkirov@CITB107 % c++ employee.cpp ccc_empl.cpp
nkirov@CITB107 % ./a.out
Name: Hacker, Harry

Salary: 48000

Член-функции, дефинирани в класа Employee:
Име Действие
Employee(n,s) Конструира обект, представящ служител с име n и заплата s. Конструктор
e.get_name() Връща името на e. Член-функция за достъп
e.get_salary() Връща заплатата на e. Член-функция за достъп
e.set_salary(s)  Дава нова стойност s на заплатата на e. Член-функция за промяна

** Оператор if (условен оператор)

Операторът if се състои от 2 части - условие и тяло. if е съставен оператор.
Пример:

if (area < 0) // условие
   cout << "Error: Negative area.\n"; // тяло

[блок-схема]

Когато условието е вярно, се изпълнява тялото на оператора.
Ако условието е нарушено (не е вярно), се изпълнява следващия оператор (след оператора if).
Тялото на if може да бъде друг оператор или блок.
Блок е група от оператори, оградени с къдрави (големи) скоби {}.
Пример:

if (area < 0)

cout << "Error: Negative area.\n";
   return 1;
}

Блокът замества (се разглежда като) един оператор.
Пример: Страна на квадрат.

// area1.cpp
#include
<iostream>
#include <cmath>
using namespace std;

int main()
{  double area;
   cout << "Please enter the area of a square: ";
   cin >> area;
   if (area < 0)
   {  cout << "Error: Negative area.\n";
      return 1;
   }
   /* now we know that area is >= 0  */
   double length = sqrt(area);
   cout << "The side length of the square is " 
        << length << "\n";
   return 0;
}
nkirov@CITB107 % c++ -o area area1.cpp
nkirov@CITB107 % ./area
Please enter the area of a square: 25
The side length of the square is 5
nkirov@CITB107 % ./area
Please enter the area of a square: -100
Error: Negative area.