1. Увод в С++

** История на езика С++.
* Езикът С се създава и развива заедно с операционната система UNIX. Първата версия е създадена през 1973 г. от Денис Ричи. Езикът се развива интензивно и през 1977 г. UNIX е пренаписана на С. Стандартна версия на езика е установена през 1989 година.
* Езикът С++ е създаден от Бьорн Страуструп 1983 г. като към езика С са добавени нови елементи. Всъщност възниква нов обектно-ориентиран език, който веднага получава много широко разпространение. Стандартизацията на езика завършва през 1998 година, като книгата на Страуструп [6] e всъщност този стандарт.
* 2003 - Стандарти, разработени за нови версии на C++ (The C++ Standards Committee).
* 2011-09-11: Нов C++ стандарт - C++11 !
* 2013-05-24:  CD за новия стандарт.
**  Системи (среди) за програмиране за MS Windows - обикновено се състоят от текстов редактор, компилатор, библиотеки и система за проверка на програмите (debug). За С/С++ по-известните среди за програмиране са:
- MS Visual C++ - продукт на Майкрософт, не поддържа С++ стандарт;
- Dev C++ - поддържа С++ стандарт, няма help за езика и удобен дебъгер;
- Code::Blocks - The open source, cross platform, free C++ IDE.
** Компилатори за Unix ОС (Ubuntu и др.):
- GCC е GNU компилатор, който поддържа най-новите версии (стандарти) на езиците C, C++


  Проста програма - компилиране и грешки.
 
// hello.cpp /*Име на файла, съдържащ текста на програмата*/
#include <iostream> /*Директива на препроцесора*/
using namespace std; /*Стандартно пространство на имена*/


int main() /*Главна функция */
{ cout << "Hello, World!\n"; /*Оператор за потоков изход*/
  return 0; /*Връща на операционната система числото 0*/
}
 Hello, World!

    По-важни характеристики на синтаксиса на езика:
- Азбуката на езика се състои от всички символи от клавиатурата на компютъра.
- Поредица от букви и цифри образува име, разделители между имената са интервал или символ, който не е буква или цифра.
- С++ различава малки от главни букви, напр. имената main и Main са различни.
- Програмата се разполага линейно - по редове (няма горни и долни индекси).
- Програмата се състои от оператори - всеки оператор завършва с точка и запетая ";".
- Един оператор може да се разположи на два и повече реда; няколко оператора може да се разположат на един ред - добрия стил на програмиране изисква един оператор да се пише на един ред (освен ако няма съществена причина за противното).
**  Процесът от написване до изпълнение на програмата се състои от следните стъпки:
    I стъпка: Написване на текста на програмата; използва се текстов редактор, който създава текстов файл - изходен код (source code) [напр. hello.cpp].
    II стъпка: Компилиране на програмата; извършва се от компилатора, който създава файл - обектен код (object code) [напр. hello.o или hello.obj].
    III стъпка:  Свързване на програмата; извършва се от свързваща програма (linker), която създава изпълним файл [напр. hello.exe или hello или a].
    IV стъпка: Изпълнение на програмата; операционната система или програмната система стартира създадения изпълним файл.
** Видове грешки.
* Грешка по време на компилация (синтактична грешка) - неправилно написана конструкция от езика. Компилаторът не може да продължи, дава съобщение за грешка, програмистът трябва да поправи грешката и отново да стартира компилатора.
* Грешка по време на изпълнение (Run-time error) - процесорът не може да изпълни някоя инструкция, напр. делене на 0. Операционната система прекратява изпълнението на програмата.
* Грешка в алгоритъма (логическа грешка) - програмата работи, но дава грешни резултати.


   Вход и изход. 
    Да се намери стойността (в долари) на купчина американски монети. Броят на монетите от всеки вид се въвежда от клавиатурата. 
// coins3.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; 
 cout << "Total value = " << total << "\n"; 
 return 0; 
}

How many pennies do you have? 10 
How many nickels do you have? 3 
How many dimes do you have? 7 
How many quarters do you have? 3 
Total value = 1.70

* Четене на цели и дробни числа (десетични дроби). 
* Грешки при вход - състояния на входния поток: нормално и "грешка". 
* Въвеждане на повече от 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, -a

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

 Поднизове. 
string greeting = "Hello World!\n" 
string sub = greeting.substr(0, 4); 
cout << sub;

 Hell

    Член-функция е функция, свързана с определен тип данни. Тя се извиква с операция точка (.) 

<име на променлива>.<име на функция>(<параметри на функцията>)

За променливи от тип string са дефинирани следните член-функции: 
name.length() - връща дължината на низа; 
greeting.substr(0,4)- връща подниз от позиция 0 до позиция 3 (4 символа). 
Позициите в низа се броят от 0.

 Сливане на низове (конкатенация). 
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; 
}

Please enter your full name (first middle last): Nikolay 
Kirov 
Kirov 
Your initials are NKK

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