Програмиране и използване на компютрите I

доц. Николай Киров,
nkirov@math.bas.bg
http://www.math.bas.bg/~nkirov
http://www.nkirov.com/

 Кай Хорстман, Принципи на програмирането със С++, ИК Софтех, София, 2000.

http://www.math.bas.bg/~nkirov/bfu/pec1_bg.html



1. Устройство, принципи и работа на компютрите (2)
Какво е компютър?

Принципи на работа на компютъра
Управляващо устройство (УУ), аритметично устройство (АУ) и оперативна памет (ОП).

Анатомия на компютъра (hardware)
* Централен процесор (CPU),
* Оперативна памет (RAM, ROM, Cache)
* Външна памет (HDD, FDD, CD)
* Карти (графична, звукова, мрежова)
* Портове (LPT, COM, Keyboard, USB)

Операционни системи (software)
Unix, DOS, Windows

DOS - запознаване и основни команди

Алгоритми и блок-схеми
Внасяме в банка 10000 лева с 6% годищна лихва. Влогът се олихвява месечно. След колко години сумата по сметката ще стане двойно по-голяма?
 

Месец Сума
0 10000.00
1 10050.00 =10000.00*1.005
2 10100.25 =10050.00*1.005
3 10150.75 =10100.25*1.005
4 10201.51 =10150.75*1.005
1. Започнете с таблицата:
Месец Сума
0 10000
2. Повтаряйте стъпки 2а-2в докато съдържанието на сметката е под 20000 лева.
2а. Добавете нов ред към таблицата.
2б. В първия ред на таблицата поставете число, с 1 по-голямо от това на горния ред.
2в. Във втората колона на новия ред поставете числото от горния ред, умножено по 1.005.
3. Разделете последното число от първата колона на 12.
Алгоритъм е описание но стъпките, необходими за решаването на някаква задача, което е еднозначно, изпълнимо и винаги завършва.

Бройни системи
* Десетична бройна система
  цифри: 0,1,2,3,4,5,6,7,8,9
   152=2.100+5.101+1.102
* Двоична бройна система
 цифри: 0,1
  101112=1.20+1.21+1.22+0.23+1.24=1+2+4+16=23
*Шестнадесетична бройна система
цифри: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
7A116=1.160+10.161+7.162 =1+160+1792=1953



2. Програмиране на С++ (2)
Какво е програмиране?
* потребители и програмисти
* алгоритми + структури от данни = програми

Транслиране на програмите
* машинни инструкции
 1. Премести съдържанието на клетка 40000 от паметта в регистъра AX.
 2. Извади 100 от регистъра AX.
 3. Ако разултатът е положителен, премини към инструкцията, намираща се в клетка 11280 от паметта.
          Intel 80386:     161 40000 45 100 127 11280
* Асемблер
     MOV AX, [40000]
  SUB AX, 100
  JG 11280
---
  MOV AX, [INT_RATE]
  SUB AX, 100
  JG INT_ERROR

Езици за програмиране
* C++
if (int_rate > 100) message_box("Interest rate error");
* Паскал
if int_rate > 100 then writeln('Interest rate error');

История на езиците за програмиране

Системи за програмиране
-- С/С++: Borland C/C++ (DOS), Borland C/C++ Builder (Win), MS Visual C++ (Win), gcc (Unix, Linux)
-- Pascal: Turbo Pascal (DOS), Borland DELPHI (Win)
-- Софтуерни системи с програмен език: MATLAB, Word, ...

Компилиране на проста програма
#include <iostream>
using namespace std;
int main()
{  cout << "Hello, World!\n";
   return 0;
}
Hello, World!

Процесът на компилиране и изпълнение на програмата
* Написване на текста на програмата:
 текстов редактор (изходен код, source code) [hello.cpp]
* Компилиране на програмата:
компилатор (обектен код, object code) [hello.o или hello.obj]
* Свързване на програмата:
свързващ редактор, linker (изпълним файл) [hello.exe или hello или a]
* Изпълнение на програмата:
операционна система, програмна система, debug
Цикъл:  редактиране - компилиране - настройка

Видове грешки
* "Грешка" при писане на програмата [текстов редактор]
* Грешка по време на компилация (синтактична грешка) [компилатор]
* Грешка по време на изпълнение (Run-time error) [дебъгер]
* Грешка в алгоритъма (логическа грешка) [??]


3. Основни типове данни  (2)
Числени типове - цели числа и числа с плаваща точка
#include <iostream>
using namespace std;
int main()
{
 int pennies = 8;
 int dimes = 4;
 int quarters = 3;
 double total = pennies*0.01 + dimes*0.10 + quarters*0.25;
  /* total value of the coins */
 cout << "Total value = " << total << "\n";
 return 0;
}
* Цели числа (integer numbers):           8, -54, 1289
* Десетични дроби (flaoting point numbers): 0.01, 12.5, 73.0, 21.0E2, 5.34E-3, -22.0E4
* Оператор за изход
  cout << "Total value = ";
  cout << total;
  cout << "\n";
* Коментар: /*   */
* Символични имена (идентификатори): 
   -- редица от букви, цифри и знака _, като първият символ е буква
   -- отличава малки от главни букви
  -- запазени думи: main. return, int, double, ...
  -- променливи

Вход и изход
#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;
}

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 число
 * извеждане на числа и низове

Оператор за присвояване
#include <iostream>
using namespace std;
int main()
{  cout << "How many pennies do you have? ";
 int count;
 cin >> count;
 double total = count * 0.01;

 cout << "How many nickels do you have? ";
 cin >> count;
 total = count * 0.05 + 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;
}
* текуща стойност на променлива
* дефиниция на променлива (единствена !)
double total = count * 0.01;
* оператор за присвояване
total = count * 0.05 + total;
* знакът за равенство в математиката и в С++
* съкращение за оператора добавяне на 1 и изваждане на 1
 month=month+1   month++
 month=month-1   month--

Константи
#include <iostream>
using namespace std;
int main()
{
 double bottles;
 cout << "How many 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 << "\n";
 return 0;
}
How many bottles do you have? 5
How many cans do you have? 4
Total volume is 11.42

Kакво е значението но числото 0.355?
1 кутия съдържа 12 унции = 0.355 литра
#include <iostream>
using namespace std;
int main()
{
 double bottles;
 cout << "How many bottles do you have? ";
 cin >> bottles;

 double cans;
 cout << "How many cans do you have? ";
 cin >> cans;

 const double BOTTLE_VOLUME = 2.0;
 const double CAN_VOLUME = 0.355;
 double total = bottles*BOTTLE_VOLUME + cans*CAN_VOLUME;

 cout << "The total volume is " << total << " liter.\n";
 return 0;
}

Аритметика
* събиране    +      a+b
* изваждане  -      a-b
* умножение *      a*b
* деление     /       a/b
* остатък от деление % a%b
* скоби (a+b)/2, а не a+b/2
* приоритети
* аргументна зависимост:
1.25+2.0 резултат 3.25; 1.25+2 резултат 3.25; 3+2 резултат 5;
4.2/2.0 резултат 2.1;      5.0/2 резултат 2.5;      4/2 резултат 2;   5/2 резултат 2;
5%2 резултат 1;            34%2 резултат 0;         5.1%3 - грешка;
* аритметични функции:
(-b+sqrt(b*b-4*a*c))/(2*a)