Програмни езици С и С++. Алгоритми

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

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

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

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


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

* Специална компютърна програма, наречена компилатор, превежда описанието на по-високо ниво (език за програмиране) в машинни инструкции за конкретен процесор (машинен език).
* Компилаторите следват строги конвенции (правила) по отношение на използването на езика за програмиране. Когато компилатор чете инструкции за програмиране (изрази, операции и оператори) на език за програмиране, той ще ги преведе в машинен код, само ако входът следва езиковите конвенции точно.
* Строгите правила предотвратяват по-катастрофални грешки, които биха могли да възникнат, ако компилаторът трябва "да гадае".
* Има много (стотици) езици за програмиране (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.


** Видове грешки.
* Грешка по време на компилация (синтактична грешка) - неправилно написана конструкция от езика. Компилаторът не може да продължи, дава съобщение за грешка, програмистът трябва да поправи грешката и отново да стартира компилатора.
* Грешка по време на изпълнение (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).
* Преди да започнете програмиране, трябва да се уверите, че съществува алгоритъм, и че ясно сте разбрали всяка стъпка на алгоритъма.

** Числени типове данни
Пример:
Да се намери стойността (в долари) на купчина американски монети.  (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) задава цели числа без дробна част. Включва нулaта и отрицателни числа. Използва се за съхранение на стойности на цели числа (например брой монети)
* Числата от тип "плаваща запетая" (double) имат десетичната точка (в стандарта на US).
* Записване на числа с плаваща запетая: 1.2; 0.001; -0.12; 1E-2; 13.01E2; -2.9e-2; и т.н.

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