Увод

Учебник: Cay Horstmann, Computing Concepts with C++ Essentials, Third Edition, John Wiley & Sons, 2003.                        
                      Cay S. Horstmann, Timothy A. Budd, Big C++, 2nd Edition, Wiley, January 2009. 

Textbook   

Какво е компютър?

Няма дефиниция, понятието се променя с времето.
Компютрите могат да се справят с повтарящи се задачи.
Компютърът може да се програмира, за да се справи с различни задачи:

Компютърни действия са съставени от огромен брой примитивни операции. Примери за такива операции:

Компютърът дава илюзията за плавно изпълнение, защото той изпълнява тези операции с голяма скорост (каква?).
Компютрите са гъвкави: те могат да се справят с широк спектър от задачи, тъй като те изпълняват различни програми, всяка от които прави компютърът да работи по конкретна задача.

Джон Атанасов - история на компютрите.
От микрокомпютър до суперкомпютър. Многопроцесорни компютри, квантови компютри.
Херц, гигахерц; байт, гигабйт; флопс (FLOPS), гигафлопс, екзафлопс (EFLOPS = 1000 petaFLOPS)
(103 - кило, 106 - мега, 109 - гига, 1012 - тера, 1015 - пета)
2013, Tianhe-2, рекорд от 33.86 petaFLOPS, разпределени изчисления, облаци
Пример:
MacBook Pro 13" Dual-Core i5
Анонсиран: June 2012
2.5GHz / 4GB / 500GB / Intel HD Graphics 4000 / с international клавиатура

Какво е програмиране?

Анатомия на компютъра


** Транслиране на програма до машинен код

* Процесорът изпълнява машинни инструкции, които са:

* Асемблер - език от ниско ниво:

* Програмни езици от високо ниво:


** Езици за програмиране

* Специална компютърна програма, наречена компилатор, превежда описанието на по-високо ниво (език за програмиране) в машинни инструкции за конкретен процесор (машинен език).
* Компилаторите следват строги конвенции (правила) по отношение на използването на езика за програмиране. Когато компилатор чете инструкции за програмиране (изрази, операции и оператори) на език за програмиране, той ще ги преведе в машинен код, само ако входът следва езиковите конвенции точно.
* Строгите правила предотвратяват по-катастрофални грешки, които биха могли да възникнат, ако компилаторът трябва "да гадае".
* Има много (стотици) езици за програмиране (List of programming languages).
* Различията в езиците за програмиране понякога са незначителни, но в други случаи са съществени.

* Видове езици за програмиране (List of programming languages by type).
* Hello world на различни езици за програмиране.

** История на езика С++. 

* Езикът С се създава и развива заедно с операционната система UNIX. Първата версия е създадена през 1973 г. от Денис Ричи. Езикът се развива интензивно и през 1977 г. UNIX е пренаписана на С. Стандартна версия на езика е установена през 1989 година.
* Езикът С++ е създаден от Бьорн Страуструп 1983 г., като към езика С са добавени нови елементи. Всъщност възниква нов обектно-ориентиран език, който веднага получава много широко разпространение. Стандартизацията на езика завършва през 1998 година, като книгата на Страуструп e всъщност този стандарт.
* 2003 - Стандарти, разработени за нови версии на C++ (The C++ Standards Committee).
* 2011-09-11: Нов C++ стандарт - C++11,  2013-05-24:  CD за новия стандарт.
* 2013-05-24: The CD for the new C++14 standard is released.


** Компилатори и среди за програмиране на С и С++
* Unix ОС (Ubuntu и др.), Мас:
- GCC е GNU компилатор, който поддържа най-новите версии (стандарти) на езиците C, C++;
- текстов редактор

*  Системи (среди) за програмиране за MS Windows - обикновено се състоят от текстов редактор, компилатор, библиотеки и система за проверка на програмите (debug). За С/С++ по-известните среди за програмиране са:
- MS Visual C++ - продукт на Майкрософт, не поддържа С++ стандарт;
- Dev C++ - поддържа С++ стандарт, няма help за езика и удобен дебъгер;
- Code::Blocks - The open source, cross platform, free C++ IDE.


** Проста програма - компилиране и грешки.
 
// 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.out].
    IV стъпка: Изпълнение на програмата; операционната система или програмната система стартира създадения изпълним (executable) файл.


* Цикъл: Edit -> Compile -> Debug

** Видове грешки.
* Грешка по време на компилация (синтактична грешка) - неправилно написана конструкция от езика. Компилаторът не може да продължи, дава съобщение за грешка, програмистът трябва да поправи грешката и отново да стартира компилатора.
* Грешка по време на изпълнение (Run-time error) - процесорът не може да изпълни някоя инструкция, напр. делене на 0. Операционната система прекратява изпълнението на програмата.
* Грешка в алгоритъма (логическа грешка) - програмата работи, но дава грешни резултати.


**Алгоритми
* Процесът на планиране трябва да предхожда писането (имплементацията) на компютърна програма за решаване на определена задача.
* Компютърът се нуждае от систематичен подход за намирането на решения: поредица от стъпки, които не включват предположения.
* Алгоритъм е начин за решение (описание на стъпките), който е недвусмислен, изпълним и краен.
 - Недвусмислен - няма място за догадки или творчество; точни инструкции за това какво да се прави.
 - Изпълним - всяка стъпка може да се осъществи на практика (от точно определен изпълнител).
 - Краен - процесът в крайна сметка ще завърши.
Пример:
Слагаме $10,000  в банкова сметка с 5% лихва годишно. Колко години са необходими, за да се удвои началната сума?
Стъпка 1: Започваме с таблицата:
След година
Сума (баланс)
0
$10,000.00
1
$10,500.00
2
$11,025.00
3


Стъпка 2: Повторете стъпки 2а-2в докато балансът е по-малък от 20,000
    Стъпка 2а. Добавете нов ред в таблицата.
    Стъпка 2б. В колона 1 на новия ред, сложете число с едно повече от предходния ред.
    Стъпка 2в. В колона 2, поставете стойност, равна на стойността на предходния баланс, умножена по 1.05.
Стъпка 3: Решението е последното число в колоната година като броя на годините, необходими за удвояване на инвестицията.
Забележка. Десетичен знак в US е "." (точка). BG десетичен знак е "," (запетайка), а в US запетайка е разделител на хиляди (3-цифрена  група). В компютрите и програмирането за десетичен знак се използва точка (виж Decimal mark).
* Преди да започнете програмиране, трябва да се уверите, че съществува алгоритъм, и че ясно сте разбрали всяка стъпка на алгоритъма.