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

План:
Числени типове данни
 Вход и изход
Операция присвояване
Аритметика
Константи
Форматиране на изхода


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

Пример: Да се намери стойността (в долари) на купчина американски монети.  (1 penny = 1 цент, 1 dime = 10 цента, 1 quarter = 25 цента). Купчината съдържа 8 монети от 1 цент, 4 монети от 10 цента и 3 монети от 25 цента. 
// coins1.cpp
#include
<iostream> using namespace std; int main() { int pennies = 8; int dimes = 4; /* променлива dimes, константа 4 */ int quarters = 3; double total = pennies * 0.01 + dimes * 0.10 + quarters * 0.25; /* обща стойност на монетите */ cout << "Total value = " << total << "\n"; return 0; }

* Типът "цяло число" (int) задава цели числа без дробна част.

* Числата от тип "плаваща запетая" (double) имат десетичната точка (Decimal separator).
* Записване на числа с плаваща запетая: 1.2; 0.001; -0.12; 1E-2; 13.01E2; -2.9e-2; и т.н.

* Променливите са места в паметта, която могат съхраняват стойности от даден тип.

* Правила за именуване (символични имена, идентификатори):

* Всяка променлива има:

* В оператора за дефиниране на променлива
  int dimes = 4;
типът на променливата е int, името е 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;
// дефиниция на променливата 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.

* Аргументна зависимост - действието на операцията зависи от типа на аргументите.

Примери:

операция
+
резултат
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; }
* Аритметични функции.
Функция
Описание
Пример
Стойност
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; }

** Форматиране на изхода.
 
Пример: Отпечатване на брой монети от дадения вид и тяхната стойност.
* Когато просто се отпечатват стойностите на променливите, не се получава подредена таблица (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