1. Увод

Учебник: 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 - пета)
Supercomputer
2020, Fujitsu Fugaku, 415 petaflops
2022, Cray/HPE Frontier, 1102 petaflops
Разпределени изчисления, облаци, персонални компютри

Пример:
https://www.apple.com/macbook-air/

Лаптоп APPLE MacBook Air 13 (2020) Retina, 13.3", Intel® Core™ i3, RAM 8GB, SSD 256GB, Intel® Iris Plus Graphics, Mac OS, Gold, Intl. kbd

Intel® Core™ i3-1115G4 Processor
6 MB Chache
4.10 GHz Max Turbo Frequency
2 Cores
4 Threads
G - includes discrete graphics fn package


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


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


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

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

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

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


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

* Специална компютърна програма, наречена компилатор, превежда от програмен език на високо ниво в машинни инструкции за конкретен процесор (машинен език).
* Компилаторите следват строги конвенции (правила) по отношение на използването на езика за програмиране.
* Когато компилатор чете инструкции за програмиране (изрази, операции и оператори) на език за програмиране, той ще ги трансформира в машинен код, само ако входът следва езиковите конвенции точно.
* Строгите правила предотвратяват по-катастрофални грешки, които биха могли да възникнат, ако компилаторът трябва "да гадае".
* Има много (стотици) езици за програмиране (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.
* 2017-03-21: Working Draft, Standard for Programming Language C++
*2022-03-17: Working Draft, Standard for Programming Language C++


** Компилатори и среди за програмиране на С и С++
* 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.
- idone - an online compiler and debugging tool which allows you to compile source code and execute it online.


** Проста програма - компилиране и грешки
 
// 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).

* Преди да започнете програмиране, трябва да се уверите, че съществува алгоритъм, и че ясно сте разбрали всяка стъпка на алгоритъма.