Основни типове данни

** Числени типове данни

* Тип "цели числа" (int) се използва за съхранение на цели числа. Напр. 9; 1202; -1; 0; -32.
* Тип "плаваща запетая" (double) са числа с десетичната точка (в стандарта на US), напр. 1.2; 0.0013; -0.52; 12E-2; 13.01E2; -2.9e-2.

* Променливите са места в паметта, които съхраняват стойности от даден тип.
* Правила за имена на променливи (символични имена, идентификатори):
        - Имената започват с буква.
        - Оставащи символи са букви, цифри или долна черта (underscore, _), не съдържат интервали или специални символи.
        - Не се използват запазените думи от езика (като int, return и др.).
        - В имената на променливите се отличават малки и главни букви (case-sensitive), напр. Area  и area са различни имена.
        - Имената на променливите се пишат само с малки букви (добър стил на програмиране).
* Всяка променлива има:
         - Тип, напр. int или double.
         - Име, напр. dimes.
         - Стойност, напр. 4.
* Неопределена стойност на променлива, когато променливата се дефинира без начална стойност (инициализация).

* Оператор за изход, обекта "екран" (cout):
  cout << "Total value = ";            /* извежда низ */
  cout << total;     /* извежда стойност на променлива */
  cout << "\n";     /* специален символ за край на ред */

* Изход на низове на български език - неопределени, да се избягват.

** Вход и изход
Пример:
Програмата пита колко монети има от някой вид и след това да се изчисли общата сума.
// coins2.cpp
#include
<iostream> using namespace std; int main() { cout << "How many pennies do you have? "; int pennies; cin >> pennies; cout << "How many nickels do you have? "; int nickels; cin >> nickels;
cout << "How many dimes do you have? "; int dimes; cin >> dimes; cout << "How many quarters do you have? "; int quarters; cin >> quarters; double total = pennies * 0.01 + nickels * 0.05 + dimes * 0.10 + quarters * 0.25; /* total value of the coins */ cout << "Total value = " << total << "\n"; return 0; }

* Четене на цели и дробни числа (десетични дроби). 

* Грешки при вход - състояния на входния поток: нормално и "грешка". 
* Въвеждане на повече от 1 число с един оператор за вход. 
cin >> pennies >> nickels >> dimes >> quarters; 
(един оператор за печат, състоящ се от 4 операции за изходен поток)

10 3 7 3
10 3 7 3
* Буфериран вход: разделител между въвежданите стойности се нарича "бяло поле" и то е интервал, табулация или нов ред (Enter), като входът се обработва при натискане на клавиша Enter.

Терминология:
-- оператор (statement): Програмата се състои от оператори - всеки оператор завършва с точка и запетая ";"
-- операция (operator): Действие с 1 или 2 аргумента, напр. (унарна операция), a + b, cin >> a, (бинарни операции)

** Операция присвояване
Пример: Да се изчисли стойността на монетите, като се пресмята стойността до момента (текуща стойност).
// coins3.cpp
#include
<iostream>
using namespace std;

int main()
{ cout << "How many pennies do you have? ";
int count;
cin >> count;
double total = count * 0.01; // дефиниция на променливата total

cout << "How many nickels do you have? ";
cin >> count;
total = count * 0.05 + total; // оператор за присвояване
// промяна на стойността на променливата total cout << "How many dimes do you have? ";
cin >> count;
total = count * 0.10 + total; // оператор за присвояване
cout << "How many quarters do you have? ";
cin >> count;
total = count * 0.25 + total; // оператор за присвояване cout << "Total value = " << total << "\n"; return 0; }
* Операторът присвоява стойността на израза отдясно на променливата от лявата страна:
total = count * 0.05 + total;


* Текуща стойност на променлива. Във всеки момент от изпълнението на програмата променливата count има някаква стойност - текуща стойност на променливата.
* Дефиниция на променлива - единствена !
- с инициализация (със задаване на начална стойност):
double total = count * 0.01; // оператор за дефиниране на променлива
- без инициализация (без задаване на начална стойност):
int count; // оператор за дефиниране на променлива
* Операция присвояване - отбелязва се със знака за равенство.
* Има съществена разлика в употребата на знака за равенство в математиката и в С++ (x = x + 1).
* В С++ знакът = се употребява за задаване на начална стойност на променлива и за операция присвояване.

* Съкращение за операциите добавяне (изваждане) на 1 и присвояване:
 month = month + 1, съкратено   month++
 month = month - 1, съкратено   month--



** Аритметика
Дефинирани са 4-те аритметични операции и операция остатък от целочислено деление.
Операция символ
тип на аргументите математика
събиране + a+b int, double a + b
изваждане - a-b int, double a - b
умножение * a*b int, double ab
деление / a/b int, double, b не е 0 a/b
остатък от деление % a%b int, b не е 0 a mod b

* Приоритети - както в математиката (най-напред се извършват действия *, / и % и след тях + и -)
* Използване на скоби за промяна на реда на изпълнение на аритметичните операции
Пример:
(a+b)/2 сборът на числата a и b се дели на 2;
 a+b/2 числото a се събира с половинката на числото b.
* Аргументна зависимост - действието на операцията зависи от типа на аргументите.
- Двата аргумента на аритметичните операции трябва да са от един и същи числов тип данни; резултатът е от същия тип.
- Разрешено е единият от аргументите да е от тип double, а другият - от тип int; тогава аргументът от тип int се преобразува (автоматично) на тип double и след това се извършва аритметичната операция - с аргументи тип double.
- Примери:

операция
+
резултат
1.25 + 2.0  3.25
1.25 + 2 3.25
1 + 2 3
операция
/
резултат
4.1 / 2.0 2.05
5.0 / 2 2.5
5/2 2
операция
%
резултат
5%2 1
34 % 2 0
5.1%2 грешка

Пример:
Да се изчисли стойността на монетите в долари и цента.
// coins4.cpp
#include
<iostream> using namespace std; int main() { cout << "How many pennies do you have? "; int pennies; cin >> pennies; cout << "How many nickels do you have? "; int nickels; cin >> nickels;
cout << "How many dimes do you have? "; int dimes; cin >> dimes; cout << "How many quarters do you have? "; int quarters; cin >> quarters; int value = pennies + 5 * nickels + 10 * dimes + 25 * quarters; int dollar = value / 100; // целочислено деление int cents = value % 100; // остатък от целочислено деление cout << "Total value = " << dollar << " dollar and " << cents << " cents\n"; return 0; }
* Аритметични функции.
За да се използват тези функции, трябва да се включи заглавния файл cmath.h с аритметични функции в С++. Това става като се напише #include <cmath>
Функция - както в математиката: име и списък от аргументи в кръгли скоби.
Функция
Описание
Пример
Стойност
sqrt(x)
корен квадратен от x
sqrt(64) 8.0
pow(x, y)
xy
pow(3, 2) 9.0
sin(x)
синус от x (в радиани)
sin(0) 0.0
cos(x)
косинус от x (в радиани)
cos(0) 1.0
tan(x)
тангес от x (в радиани)
tan(0) 0.0
exp(x)
ex
exp(0) 1.0
log(x)
(натурален логаритъм) ln(x), x > 0
log(1) 0.0
log10(x)
(десетичен логаритъм) lg(x), x > 0
log10(100) 2.0
ceil(x)
най-малкото цяло число >= x
ceil(10.1) 11.0
floor(x)
най-голямото цяло число <= x
floor(10.8) 10.0
fabs(x)
абсолютна стойност (модул) |x|
fabs(-3.5) 3.5

** Константи
Пример: В един хладилник има бира - в бутилки и в кутийки. Една бутилка съдържа 2 литра, а една кутийка - 12 унции (oz, 1 oz = 29.586 ml). Да се намери количеството на бирата, ако броят на бутилките и кутийките се задава от клавиатурата.
// volume1.cpp
#include
<iostream> using namespace std;

int main() {
double bottles; cout << "How many 2-liter bottles do you have? "; cin >> bottles;
double
cans; cout << "How many cans do you have? ";
cin >> cans;

double total = bottles * 2 + cans * 0.355; cout << "The total volume is " << total << " liter.\n"; return 0;

}
Какво е значението на числото 0.355? - 1 кутия съдържа 12 унции = 0.355 литра.
Вместимостта на 1 бутилка и на 1 кутийка (2 и 0.335 - "магически числа") се зададат в програмата като именувани константи (константи, които имат имена). Имената на константите се пишат с главни букви!
// volume2.cpp
#include
<iostream>
using namespace std;

int main()
{
const double BOTTLE_VOLUME = 2.0;
const double CAN_VOLUME = 0.355;


double
bottles;
cout << "How many" <<
BOTTLE_VOLUME << "-liter bottles do you have? "; cin >> bottles; double cans; cout << "How many cans do you have? "; cin >> cans; double total = bottles * BOTTLE_VOLUME + cans * CAN_VOLUME; cout << "The total volume is " << total << " liter.\n"; return 0; }

** Низове
* Низ (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.

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 
* Поне един от аргументите на сливането трябва да е променлива!

// 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;
}

** Форматиране на изхода.
* Когато просто се отпечатват стойностите на променливите, не се получава подредена таблица (form1.cpp). 
cout << pennies << " " << pennies * 0.01 << "\n"; 
cout << nickels  << " " << nickels * 0.05 << "\n"; 
cout << dimes << " " << dimes * 0.10 << "\n"; 
cout << quarters << " " << quarters * 0.25 << "\n"; 

1 0.01 
12 0.6 
4 0.4 
120 30

* Използване на манипулатори: 
- setw задава ширината на следващото изходно поле; 
  cout << setw(8); 
- setprecision задава (максимален) брой на цифрите след десетичната точка; 
  cout << setprecision(2); 
- fixed фиксира броя на цифрите след десетичната точка. 
  cout << fixed; 
* Манипулаторите са дефинирани в заглавния файл iomanip.h, т.е. за да ги използваме, трябва да имаме #include <iomanip>.
Така изглежда частта от програмата, която отпечатва подредена таблица (form2.cpp): 
cout << fixed << setprecision(2); 
cout <<setw(8)<< pennies <<" "<< pennies*0.01 << "\n"; 
cout <<setw(8)<< nickels <<" "<< nickels*0.05 << "\n"; 
cout <<setw(8)<< dimes <<" "<< dimes*0.10 << "\n"; 
cout <<setw(8)<< quarters <<" "<< quarters*0.25 << "\n"; 

       1    0.01 
      12    0.60 
       4    0.40 
     120   30.00