1. Увод
"A little inaccuracy sometimes saves
tons
of explanation."
Saki (H. H. Munroe)
Компютри и програмиране.
Всяка програма "казва" на компютъра редицата
от стъпки, необходими за да се изпълни дадена задача. Процесът на проектиране
и реализиране на програмите се нарича компютърно програмиране. Дейността
програмиране е централна в компютърната наука.
За да работи един човек с компютър не е необходимо
да бъде програ- мист. Той може да използва (като потребител) написани вече
програми и програмни системи. Повечето хора, работещи с компютър, правят
именно това. Знанията по програмиране за потребителя на готови програми
му помагат по-пълно да използва възможностите им и да увеличи ефективността
на своята работа.
Езици за програмиране и транслатори.
** Езици за програмиране от ниско ниво.
На най-ниско ниво инструкциите към компютъра са
изключително прости. Процесорът изпълнява така наречените машинни инструкции.
Пример:
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 (move) означава премести; SUB
(subtract) - извади; JG (jump if greater than)
- ако резултатът е по-голям от 0, премини към ... Използването на буквени
имена вместо адреси от паметта прави програмата по-лесна за четене:
MOV AX, [INT_RATE]
SUB AX, 100
JG INT_ERROR
Езиците от ниско ниво зависят от процесора. Например
има разлики в езика Асемблер за процесор Intel 80386 и процесор Motorola
68000.
** Езици за програмиране от високо ниво.
При тези езици програмистът описва схематично основните
стъпки (алгоритъма), които трябва да се изпълнят за решаване на дадена
задача, а специална програма, наречена транслатор (преводач), превежда
това описание в машинни инструкции за конкретен процесор. Транслаторите
са два вида - компилатори, които създават файл с кода на програмата на
машинен език и интерпретатори, които направо подават на процесора (за изпълнение)
поредицата от машинни команди.
Същият пример би изглеждал така на C++:
if (int_rate > 100) message_box("Interest
rate error");
и на Паскал:
if int_rate > 100 then writeln('Interest
rate error');
Съвременните програмни езици не се отличават по
функционалност - по принцип всеки алгоритъм може да се програмира на всеки
език за програмиране - разликата е в усилията на програмиста и в ефективността
на получената програма. Днес съществуват много програмни езици с различно
предназначение. Ето по-известните от тях:
- FORTRAN - главно за реализиране на числени алгоритми (счита се за
остарял език);
- Algol 60 - главно за описание на алгоритми;
- ADA - разработен и използван в американската армия;
- Pascal - подходящ за обучение по програмиране;
- Modula 3 - обектно-ориентиран език (модулно програмиране);
- Delphi - обектно-ориентиран език, разширение на езика Pascal;
- Simula - обектно-ориентиран език за симулационно моделиране;
- C - универсален език, свързан с операционна система Unix;
- С++ - обектно-ориентиран език, разширение на езика С;
- Lisp, Prolog - езици за функционално програмиране;
- Basic - език, създаден за първите персонални компютри;
- Java - съвременен обектно-ориентиран език главно за мрежово програмиране.
Съществуват и по-специализирани езици, създанени
с точно определена цел. Например:
- PHP, ASP - езици за създаване на WEB страници;
- SQL - език за работа с бази данни;
- Perl - скриптов език - за управление на операционни системи.
"Планираните" езици (Pascal, ADA, Modula 3) са създадени
от един човек или от група хора с определена цел - отделните им компоненти
са логически свързани и могат лесно да бъдат комбинирани.
"Разрасналите се" езици (C/C++, Basic) се развиват
във времето, като различни хора добавят нови елементи в езика и същевременно
запазват всички стари конструкции, за да могат написани вече програми на
старите версии на езика да се транслират и с новите компилатори, създадени
за новите версии на езика.
** История на езика С++.
* Езикът С се създава и развива заедно с операционната система UNIX.
Първата версия е създадена през 1973 г. от Денис Ричи. Езикът се развива
интензивно и през 1977 г. UNIX е пренаписана на С. Стандартна версия на
езика е установена през 1989 година.
* Езикът С++ е създаден от Бьорн Страуструп 1983 г. като към езика
С са добавени нови елементи. Всъщност възниква нов обектно-ориентиран език,
който веднага получава много широко разпространение. Стандартизацията на
езика завършва през 1998 година, като книгата на Страуструп [6] e всъщност
този стандарт.
** Системи (среди) за програмиране - обикновено се състоят от
текстов редактор, компилатор, библиотеки и система за проверка на програмите
(debug). За С/С++ по-известните среди за програмиране са:
- Turbo
C/C++ (Borland C++ 3.5, 4.5, 5)- удобен за начинаещи програмисти, има
help за езика и добър дебъгер; с библиотеките на К. Хорсман могат да се
компилират всички примери от книгата и този сборник;
- Borland C/C++
Builder - поддържа С++ стандарт, удобен за по-напреднали програмисти;
- MS Visual C++ -
продукт на Майкрософт, поддържа С++ стандарт;
- Dev C++ - поддържа С++ стандарт,
няма help за езика и удобен дебъгер;
- DJGPP е среда за 32-битови
програми под DOS. Чрез нея могат да се стартират почти всички програми
за операционната система Линукс, които не използват многозадачните, многопотребителските
и графичните му възможности.
** Отделни компилатори:
- Borland C++ Compiler 5.5 (BCC) - бърз 32-битов оптимизиран компилатор;
поддържа С++ стандарт;
- GCC е GNU компилатор, който поддържа
най-новите версии (стандарти) на езиците C, C++, Objective-C, Fortran,
Java и Ada, също така и библиотеките за тези езици (libstdc++, libgcj,...).
Проста програма - компилиране
и грешки.
// hello.cpp |
/*Име на файла, съдържащ текста на програмата*/ |
#include <iostream> |
/*Директива на препроцесора*/ |
using namespace std; |
/*Стандартно пространство на имена*/ |
|
|
int main() |
/*Главна функция */ |
{ cout << "Hello,
World!\n"; |
/*Оператор за потоков изход*/ |
return 0; |
/*Връща на операционната система числото
0*/ |
} |
|
По-важни характеристики на синтаксиса на езика:
- Азбуката на езика се състои от всички символи от клавиатурата на
компютъра.
- Поредица от букви и цифри образува име, разделители между имената
са интервал или символ, който не е буква или цифра.
- С++ различава малки от главни букви, напр. имената 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. Операционната система прекратява
изпълнението на програмата.
* Грешка в алгоритъма (логическа грешка) - програмата работи, но дава
грешни резултати.
Алгоритми.
Да разгледаме следния пример: Внасяме в банка 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. Започнете с таблицата:
2. Повтаряйте стъпки 2а-2в докато съдържанието на сметката е под 20000
лева.
2а. Добавете нов ред към таблицата.
2б. В първата колона на този ред поставете число, с 1 по-голямо от
това на горния ред.
2в. Във втората колона на същия ред поставете числото от горния ред
(същата колона), умножено с 1.005.
3. Разделете последното число от първата колона на 12.
Алгоритъм е описание на стъпките, необходими за
решаването на някаква задача, което е еднозначно, изпълнимо
и винаги
завършва.
Описанието може да бъде текст,
блок-схема или програма на език за програмиране от високо ниво.
Бройни системи.
Най-често използваните бройни системи са:
* Десетична бройна система - цифри: 0,1,2,3,4,5,6,7,8,9
15210 = 2.100 + 5.101
+
1.102 =152
* Двоична бройна система - цифри: 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
Примерите показват превръщане ва числата от двоична или
шестнадесетична бройна система в десетична бройна система. Обратното превръщане
става, като се дели многократно числото на основата на бройната система.
Остатъка при всяко деление представлява една цифра на числото в бройната
система.
Например:
частно |
остатък |
цифра |
23 |
1 |
1 |
11 |
1 |
1 |
5 |
1 |
1 |
2 |
0 |
0 |
1 |
1 |
1 |
|
частно |
остатък |
цифра |
1953 |
1 |
1 |
122 |
10 |
A |
7 |
7 |
7 |
|
Превъщането от двоична в шестнадесетична бройна система и
обратно става много лесно, защото 16 = 24. Просто
4 двоични цифри образуват една шестнадесетична цифра. Например:
За 11110101000101102 имаме 1111
| 0101 | 0001 | 0110 и получаваме
11112 = 1510 = F16, 01012
=
610 = 616, 00012 = 110 = 116,
01112 = 710 = 716, което е F61716.