top of page
Anchor 0
Anchor 1
Anchor 2
Anchor 3

Кратка историја на С++

 

Во 1972 година во лабораториите „АT & T Bell Labs“ е дизајниран јазикот С од Денис Ричи (Dennis Ritchie). Во него се вградени неколку особини кои ги немале тогашните програмски јазици, и тоа:

  • Дозволува пристап до ресурси на многу ниско ниво.

  • Погоден e за системско програмирање (програмирање на хардверско ниво),

  • Може да се извршува на различни компјутерски платформи.

  • Работи под различни оперативни системи.

Во 1980 година јазикот С бил надграден за работа со т.н. класи (англ. classes) од Бјорн Строструп (Bjarne Stroustrup) во лабораториите „АT & T Bell Labs“ и таа верзија на С е наречена „С со класи“.

Надградбата на јазикот С ги имала следниве цели:

  • Да се направи јазик за општа намена подобар од C.

  • Да поддржува апстрактни типови податоци (англ. abstract data types).  (Со апстрактните типови податоци се работи во објектно ориентираното програмирање.)

  • Да поддржува објектно ориентирано програмирање (англ. Object-Oriented Programming - OOP).

Во 1983 година јазикот „С со класи“ го добил името С++.

С++ првпат е стандардизиран како интернационален стандард за програмски јазици во 1998 година. Оттогаш до денес, тој е постојано надградуван со нови карактеристики, а најновите надградби се направени во 2011, 2014, 2017 и 2020 година. Тие се познати под имињата С++11, С++14, С++17 и С++20.

Денес, С++ спаѓа меѓу најкористените јазици за изработка на програми од разни области, кои може да варираат од кориснички апликации за општа намена, па сè до системски алатки. Тоа е овозможено со следниве карактеристики на С++:

  • Едоставен и лесен за учење.

  • Независен од хардверот на компјутерот на кој се извршува.

  • Пренослив, што значи дека една апликација напишана во С++ на еден компјутер може да се извршува на друг компјутер.

  • Овозможува програмирање на ниско (хардверско) ниво.

  • Има богата библиотека на програми.

  • Поддржува и структурно и објектно ориентирано програмирање.

  • Овозможува управување со меморијата, т. е. динамичко доделување меморија.

  • Тој е најбрз програмски јазик, скоро како неговиот претходник С.

  • Проширлив, т. е. може да се додаваат нови карактеристики итн.

Мени

Елементи на јазикот С++

 

Јазикот С++ има азбука, која е множеството на дозволени симболи, и тоа:

  • Малите букви од абецедата: a – z.

  • Големите букви од абецедата: A – Z.

  • Цифрите: 0 – 9.

  • Специјалните знаци: ~ ! @ # $ % ^ & * ( ) – + = { } [ ] : ; ' " < > ? /.

Од азбуката на C++ се формираат зборови кои може да бидат:

  • Клучни (англ. keywords) зборови.

  • Бројни, симболички и текстуални (стринг) константи.

  • Имиња (идентификатори).

  • Оператори.

Посебен вид симболи се одделувачите (сепараторите) со кои се одделуваат зборовите еден од друг. Тие се:

  • Празно место (бланко).

  • Нов ред.

  • Табулатор.

Општа форма на програма во С++ е:

int main() {

        naredba;

        ...

        naredba;

}

Мени

Имиња на податоци

 

Имињата (идентификаторите) на податоците во С++ може да бидат:

  • Клучни или резервирани зборови. (Клучните зборови имаат специјално значење во јазикот. Резервираните зборови се резервирани за јазикот и не може да се користат како идентификатори.)

  • Кориснички дефинирани имиња.

Резервираните зборови имаат специфично значење и примена. Такви се: const, double, float, int, struct, unsigned, break,  continue, else, for и други.

Кориснички дефинираните имиња се формираат од корисниците (програмерите) со почитување на следниве правила:

  • Името започнува со буква (A – Z, a – z) или долна црта (_) (англ. underscore).

  • Должината на името е неограничена.

  • Малите и големите букви се разликуваат. На пример, jas и Jas се различни имиња.

  • Името може да содржи и мали и големи букви од абецедата, цифри 0 – 9 и долна  црта.

  • Името не смее да содржи празно место.

  • Името не смее да содржи специјален знак, како: !, @, #, $, ^ итн.

  • Името не смее да биде клучен или резервиран збор.

На пример, правилни имиња на податоци се:

a, A1, iTi, i2j3, _ime, radius, R, broj_120, _char, TiUci.

Неправилни имиња на податоци се:

5_ka                       - Името не може да почне со цифра.

do$lar                    - Името не може да содржи специјален знак.

i 2                             - Не е дозволено празно место во името.

char                        - Не може резервиран збор да биде идентификатор.

Мени

Типови на податоци

Неструктурирани (прости) типови             

                                Интегрални

                                                целоброен                            short, int, long, long long

                                                знаковен                               char

                                                логички                                  bool

                                реален                                                   float, double, long double                 

                                наброив                                                 enum

Структурирани типови

                                низа                                                        array

                                структура                                             struct

                                унија                                                       union

                                класа                                                      class

Адресни типови

                                покажувач                                           pointer

                                референца                                         reference

 

Интегрални типови се оние кои претставуваат една целина, т. е. не се деливи.

Целобројниот тип податоци и знаковниот тип може да бидат и неозначени (англ. unsigned). Unsigned значи дека податоците се само позитивни броеви и бројот 0, т. е. не може да имаат негативни вредности.

unsigned short

unsigned int

unsigned long

unsigned long long

unsigned char

Зборовите short, int, long, char, bool, float, double, enum, signed и unsigned се такана-речени спецификатори на типот.

Мени

Декларирање на константни и на променливи податоци

 

Константите се декларираат со зборот const по кој се наведуваат типот и името, а потоа мора да се додели вредност на константата, со операторот за доделување = :

const тип  име = вредност;

Забелешка: Во општите дефиниции ќе користиме коси букви. Изразите од еден збор ќе ги запишуваме со зборови напишани слеано, додека изразите од повеќе зборови (како листи) ќе ги запишуваме со зборови напишани слеано со долна црта меѓу нив.

За да се разликуваат константите од променливите, во практиката тие се пишуваат со големи букви, а зборовите се разделуваат со долна црта.

Примери на константи се:

const int М = 12;                                                                // Meseci vo godinata

const float ZEMJINO_ZABRZUVANJE = 9.81;

const string DATUM = “Ponedelnik, 21.06.2036”;

Променливи се оние идентификатори чија вредност (содржина на локацијата во меморијата со која е поврзано нивното име), може да се менува во програмата.

Променливите се декларираат со:

                тип име;              

                или:                       

                тип име = вредност или израз;

Декларација, декларација и иницијализација и дефиниција на дадени променливи може да се направи каде било во програма-та.

short i;                                                      // Deklaracija na celobrojnata promenliva i.

char znak = '+';                                     // Deklaracija i inicijalizacija na znakovnata promenliva znak.

string drzava;                                       // Deklaracija na stringot drzava.

enum godisnoVreme { PROLET, LETO, ESEN, ZIMA }

Мени

Коментар

 

Коментарот во една линија започнува со две коси црти //.

Коментарот од повеќе линии се става помеѓу ознаките /* и  */.

/*            So оvaa programa se izrabotuva najednostavna posetnica, so osnovnite podatoci:

                ‒ ime na firmata

                ‒ telefon

                ‒ e-mail

*/

Пример

Резултатот од извршувањето на програмата е:

Мени

Оператори со податоци

 

Оператори со целобројни податоци:

                +              собирање

                ‒              одземање и негација

                *               множење

                /               целобројно делење ‒ цел дел од количникот на два цели броја

                %            делење по модул ‒ остаток од делењето на два цели броја

Забелешка: Знакот минус (–) пред еден операнд се нарекува унарен оператор,  т. е. унарен минус.

Оператори со реални податоци:

                +              собирање

                ‒              одземање или негација

                *              множење

                /               реално делење (ако е реален барем еден од податоците)

Оператори со логички податоци:

                &&          логичко И (AND)

                ||              логичко ИЛИ (OR)

                !               логичко НЕ (NOT)

Релациските оператори:

                <              помало

                <=           помало или еднакво

                >              поголемо

                >=           поголемо или еднакво

                ==           еднакво

                !=            различно

Оператори со битови:

                &             логичко И за битови                          ~              комплемент

                |               логичко ИЛИ за битови                   <<           поместување во лево

                ^              исклучиво ИЛИ за битови              >>           поместување во десно

Оператори за инкрементирање и за декрементирање

                ++x;        префиксно инкрементирање

                x++;        постфиксно инкрементирање

                --x;          префиксно декрементирање

                x--;          постфиксно декрементирање

Мени

Скратена форма на операторите

 

Скратената форма на операторите за целобројните податоци е:

+=                               ‒=                           *=                           /=                            %=

Скратената форма на операторите за реални податоци е:

+=           -=            *=           /=

                Примери:

prvBroj += cifra;                  е исто со               prvbroj = prvBroj + cifra;

vtorBroj %= cifra;               е исто со               vtorbroj = vtorBroj % cifra;

Мени

Формати за претставување на децималните податоци

 

Децималните податоци во програмските јазици се претставуваат на два начини:

  • Во децимален формат (f-формат, F-формат) познат како неподвижна точка (англ. fixed point).

  • Во експоненцијален формат (e-формат, Е-формат) познат како подвижна точка (англ. floating point).

Буквата f доаѓа од зборот „float“, а буквата е доаѓа од зборот „exponent“.

Примери:

float a = 1234.56f,                a1 = ‒25000.f,       a2 = 0.5432f;

double c = 76.543e3,          c1 = -25.e ‒ 1,       c2 = 2e3;

Мени

Конверзија на типот на податоци

 

Доделување вредност од несоодветен тип на променлива се нарекува имплицитна (автоматска) конверзија или типска принуда.

За да се избегне губењето информации при доделување несоодветен тип на податок, се користи експлицитна типска конверзија позната и како кастирање на типот.

celBroj = int(6.7);

realenBroj = float(5);

Операторот ( ) се нарекува оператор за кастирање.

Мени

Стрингови  

 

Стринговите се податоци составени од знаковни податоци како секвенци од знаци.

"Makedonija e bibliska zemja."

Стринг-константите во C++ може да содржат букви (големи и мали од абецедата), цифри и специјални знаци, како: +, -, *, / и $.

Основните карактеристики на стринг-константите се:

  • Се запишуваат во наводници.

  • Секој знак има индекс, почнувајќи од најлевиот, кој има индекс 0.

  • Должината на текстуалната константа е еднаква на бројот на знаци, вклучувајќи ги и празните места.

  • Максималната должина на една стринг-константа е 2048 бајти.

Декларација:

string moeIme;                                                     // Deklaracija na promenlivata moeIme

string datumDenes = "01.01.2345";             // Deklaracija so inicijalizacija

Мени

Автоматско одредување на типот

 

При декларацијата, типот на променливата може да се одреди според типот на податокот со кој таа се иницијализира или ѝ се доделува вредност. Тоа се прави со клучниот збор auto.

auto ime = "Gjorgji";

auto prezime = "Jovancevski";

auto jasSum = ime + prezime;

Мени

Читање и печатење на податоци

 

Операторите за читање и печатење податоци се:

                >>           влезен оператор,

                <<           излезен оператор.

Операторот << значи „прати на“, a операторот >> значи „преземи од“.

Наредбите за влез и за излез се:

                cin           Наредба за внесување вредности преку тастатурата (за стандарден влез).

                cout        Наредба за печатење вредности на екранот (за стандарден излез).

Неколку специфични карактери кои имаат специјално значење кај наредбата за излез, мора да се отпечатат со користење на излезни (ескејп) секвенци, како што е прикажано во следнава табела:

Излезна секвенца                     Опис

\”                                          Печатење наводници.

\\                                          Печатење спротивна коса црта.

\a                                         Печатење ѕвоно (аларм).

\n                                         Поместување на покажувачот на почетокот на следната линија.

\r                                          Поместување на покажувачот на почетокот на тековната линија.

\t                                          Поместување на покажувачот на следната табуларна позиција.

Пример

Мени

 Форматирано печатење на податоци

 

За форматирано печатење на податоци се користат манипулатори. Повеќето од нив се наоѓаат во библиотеката <iomanip>, која треба да се вклучи на почетокот од програмата:

#include <iomanip>.

Мени

 

Преполнување

Преполнување (англ. overflow) е појава на излегување на вредноста на податокот надвор од опсегот на типот од кој е декларирана променливата.

Пример

Излезот од програмата е:

 

Мени

Библиотечни функции

Функциите од библиотеките на С++ се нарекуваат и вградени функции (англ. build-in functions). Нивното име се пишува со сите мали букви бидејќи имињата се резервирани зборови. На пример, pow(), sqrt, substring() итн.

Стандардната библиотека С++ содржи повеќе датотеки наречени хедер-датотеки (англ. header files), кои содржат групи од слични функции, како:

<iostream>          Функции за влез и за излез.

<iomanip>           Функции за форматирање и за манипулатори.

<cstdlib>              Општа библиотека: контрола на програмата, случајни броеви, сортирање, барање итн.

<cmath>              Општи математички функции.

<string>                Функции за работа со стрингови.

<random>           Функции за генерирање случајни броеви.

Мени

Математички функции

 

pow(x, y)                               – Експоненцијална функција x^y.

exp(x)                                    – Експоненцијална функција е^х, е = 2.7182.

sqrt(x)                                    – Квардатен корен од х, .

cbrt(x)                                   – Кубен корен од х, .

log(x)                                     – Логаритамска функција ln(x), со основа е = 2.7182.

log10(x)                                – Логаритамска функција log(x), со основа 10.

fabs(x)                                   – Апсолутна вредност од х, |x|.

ceil(x)                                     – Заокружување на х на најмалиот реален број не помал од х.

floor(x)                                   – Заокружување на х на најголемиот реален број не поголем од х.

trunc(x)                                 – Отсекување само на реалниот дел лево од децималната точка.

round(x)                                – Заокружување на најблискиот реален број до х (без децимали).

fmod(x, y)                             – Остаток од количникот х / у како реален број.

modf(x & integralen)       – Разделување на децималниот број х на интегрален и на децимален дел. 

sin(x)                                      – Тригонометриска функција sin(x).

cos(x)                                     – Тригонометриска функција cos(x).

tan(x)                                     – Тригонометриска функција tg(x)

Пример:

y = pow(x, 2);      

Десната страна од наредбата означува повик на функцијата (англ. function call или function invocation) со име pow и со аргументи х и 2.

Забелешка: Бројот е=2.7182 е основа на природните логаритми, а се нарекува Неперов број (John Napier, XVII век, шкотски математичар).

Мени

Функција за генерирање случајни броеви

 

Во С++ постои посебна функција rand(), која генерира случаен број помеѓу 0 и 32767.

Ако сакаме интервалот на случајно генерирани броеви да започнува од одреден број (на пример poceten), тогаш формулата е:

poceten + rand() % (max + 1);

За да се генерира нова низа на случајни броеви при секое повикување на функцијата rand(), се врши рандомизација (англ. randomizing) со задавање различна неозначена целобројна вредност како aргумент на функцијата srand(). Оваа функција треба да се изврши пред повикување на функцијата rand().

На пример:

srand(123);

51 + rand() % 100;

Мени

Функции за работа со знаци

isdigit(z)                 ‒ true, ако z е цифра (0, 1... 9).

isalpha(z)              ‒ true, ако  z е буква.

islower(z)               ‒ true, ако z е мала буква.

isupper(z)              ‒ true, ако z е голема буква.

isblank(z)               ‒ true, ако z е празно место.

isspace(z)              ‒ true, ако z е празен простор.

isalnum(z)              ‒ true, ако z е буква или цифра.

ispunct(z)               ‒ true, ако z е интерпункциски знак: . , ; : ‘ “ ? / ! – ( ) [ ] { } <>... итн

isprint(z)                  ‒ true, ако z е знак што се печати.

tolower(z)              ‒ ако z е голема буква, ја конвертира во мала буква.

toupper(z)              ‒ ако z е мала буква, ја конвертира во голема буква.

Мени

Функции за работа со стрингови

Доделување еден стринг на друг                                                                  assign()

Спојување два стринга                                                                                       append()

Должина на стринг                                                                                                length()

Должина на стринг                                                                                                size()

Максимална можна должина на стринг                                                     max_size()

Споредба на стрингови                                                                                      compare()

Замена на вредностите на два стринга                                                     swap()

Потстринг од стринг                                                                                             substr()

Издвојување знак од стринг                                                                            at()

Барање потстринг или знак во стринг                                                        find()      rfind()

Бришење знаци од некоја позиција до крајот на стринг                   erase()

Замена на потстринг со стринг                                                                      replace()

Вметнување на стринг (или потстринг) во стринг                                 insert()

Проверка дали е празен стрингот                                                                empty()

Мени

Функции за конверзија на стринг во број

stoi(s)                     ‒ конверзија на стрингот ѕ во цел број од типот int,

stol(s)                     ‒ конверзија на стрингот ѕ во цел број од типот long,

stoll(s)                    ‒ конверзија на стрингот ѕ во цел број од типот long long,

stoul(s)                   ‒ конверзија на стрингот ѕ во цел број од типот unsigned  long,

stoull(s)                  ‒ конверзија на стрингот ѕ во цел број од типот unsigned long  long,

stof(s)                     ‒ конверзија на стрингот ѕ во реален број од типот float,

stod(s)                    ‒ конверзија на стрингот ѕ во реален број од типот double,

stold()                     ‒ конверзија на стрингот ѕ во реален број од типот long double

Конверзија на број во стринг

to_string(broj)

Мени

Контролни наредби за избор         

 

Контролна наредба за избор if

 

Со контролната наредбата за избор if се реализира алгоритамската контролна структура за избор од две можности ако‒тогаш, при што едната можност нема наредби.

При извршување на наредбата if, прво се испитува uslov-от. Ако uslov-от е исполнет (има вредност true), се извршува naredba А, а ако не е исполнет (има вредност false), не се извршува naredba А, туку извршувањето на програмата продолжува со следна-та наредба.

Ако треба да се извршат повеќе наредби, тие се ставаат во блок со големи загради {}.

uslov-от може да биде само логички израз. Притоа, тој може да има вредност true или false.

Мени

Контролна наредба за избор if-else

 

Со контролната наредба за избор if-else се реализира алгоритамската контролна структура за избор од две можности ако‒тогаш‒инаку.

При извршување на наредбата if-else, прво се испитува uslov-от. Ако uslov-от е исполнет (има вредност true), се извршува naredba А, а ако не е исполнет (има вредност false), се извршува naredba B.

Ако треба да се извршат повеќе наредби кога uslov-от е исполнет или кога тој не е исполнет, тие наредби се ставаат во блок со големи загради {}.

Мени

Условен оператор               ?:

Условниот оператор се користи за претставување на едноставни наредби if-else.  Неговата синтакса е:

uslov? izraz1 : izraz2;

На пример, следнава if-else наредба:

if (m > n)

                max = m;

else

                max = n;

може да се запише:

max = (m > n) ? m : n;

Мени

Контролна наредба за избор switch

 

Со контролната наредба switch се реализира алгоритамската контролна структура за избор од повеќе можности случај, а нејзината синтакса е:

Изразот во заграда (izraz) може да биде кој било израз чии вредности се од целоброен, знаковен, логички или наброив тип. Ознаките a, b... k се константи од целоброен, знаковен, логички или наброив тип. За секој случај (case), се извршуваат сите наредби сè до првата контролна наредба break, чие дејство е скок (излез) на крајот на контролната наредба switch. Затоа, мора да се користи контролната наредба break по секој case. Ако не се наведе контролната наредба break, извршувањето продол-жува со следниот case. По naredba Х не се става наредбата break.

Ако izraz не добие ниту една вредност од наведените константи по зборот case, тогаш се извршуваат наредбите по зборот default. Одделот default е опционален, значи не мора да се наведе. Ако не постои, по извршување на која било гранка case, се скока на следната наредба по контролната наредба switch.

Мени

Контролни наредби за повторување

 

Контролна наредба while  

 

Оваа контролна наредба се користи за реализација на алгоритамската контролна структура додека–извршувај.

Телото на контролната наредба while се состои од naredba A, naredba B, …, naredba H. Едно извршување на овие наредби е еден циклус. Пред почетокот на секој циклус се испитува дали е исполнет uslov-от, кој претставува логички израз со две вред­ности: true  или false. Додека е ис­пол­нет uslov-от, се извршуваат наредбите од циклусот и дејството се враќа на почетокот од циклусот. Кога во не­кое испитување на uslov-от ќе се констатира дека тој не е испол­нет, се прескокнува контролната наредба while и дејството продолжува со следната контролна наредба.

Бидејќи uslov-от се испитува пред почетокот на секој циклус, може да се случи тој да не е исполнет уште при првото испитување, и притоа е можно да не се изврши ниту еден циклус.

Мени

Контролна наредба do-while

 

Оваа контролна наредба се користи за реализација на алгоритамската контролна структура извршувај–додека.

Наредбата do-while се користи кога некоја секвенца од наредби треба да се изврши барем еднаш, а нејзиното повторно извршување зависи од некој uslov. Овој uslov  се испитува на крајот на секој циклус. Ако uslov-от е исполнет т.е. uslov има вредност true, дејството се враќа на почетокот и се извршува следниот циклус. Кога во не­кое испитување на uslov-от ќе се констатира дека тој не е испол­нет т.е. uslov има вредност false, дејството продолжува со следната контролна наредба.

Мени

Контролна наредба for  

 

За реализација на алгоритамската контролнаа структура за–зголемувај–до во С++ се користи контролната наредба for.

Општиот облик на контролната наредба for е.

Со контролната наредба for се извршува иста група наредби повеќепати, т. е. во повеќе циклуси.

Иницијализација е дел во кој се задаваат почетни вредности на променливите кои се користат во телото на контролната наредба. Овој дел се извршува еднаш пред да започне повторувањето на циклусите.

Услов е делот за испитување на условот пред повторно да се изврши следниот циклус. Тој е логички израз. Ако услов има вредност true, тогаш циклусот повторно ќе се изврши, а ако има вредност false, тогаш циклусот не се извршува, туку дејството продолжува со следната наредба по for. Бидејќи услов-от може да не биде исполнет и пред започнување на првиот циклус, наредбата for може да не се изврши ниту еднаш.

Делот за ажурирање на контролната наредба for се извршува по извршување на секој циклус. Во него се ажурираат променливите кои се користат во телото на наредбата.

Формата на контролната наредба for со една променлива brojac е:

Во делот за иницијализација, променливата brojac се иницијализира на pocetna вредност. Тој дел се извршува само еднаш. Испитувањето на условот дали вредноста на brojac е помала од krajna (крајната) вредност (brojac < krajna) е вградено во самата наредба. Условот brojac < krajna е логички израз кој се испитува пред почетокот на секој циклус и ако има вредност true, циклусот се извршува, а ако има вредност false, циклусот не се извршува.

Изразот brojac = brojac + iznos се пресметува по извршувањето на секој циклус. Кога е pocetna < krajna, тогаш iznos мора да е позитивен, а кога е pocetna > krajna, тогаш iznos мора да е негативен.

Мени

Оператори за инкрементирање и за декрементирање  ++ , – –

 

Во С++ се воведени посебни оператори за зголемување и за намалување на вредноста на некој податок за 1. Тие се наречени оператор за инкрементирање (англ. increment operator) и оператор за декрементирање (англ. decrement operator). Операторот за инкрементирање е ++, а за декрементирање е ––. Инкрементирањето или декрементирањето на вредноста на податокот х може да се врши во префиксна (++х или ––х) или постфиксна (х++ или х––) форма. Во првиот случај, инкрементирањето или декрементирањето се извршува пред пресметување на изразот (прединкремент) во кој учествува податокот х, а во вториот случај по пресметување на изразот (постинкремент).

Мени

 Контролни наредби за скок

 

 

 Мени

Функции

 Мени

Кориснички функции со повратна вредност

 

Подалгоритмите кои се кодираат во програмските јазици се нарекуваат потпрограми (англ. subprograms).

Суштината на потпрограмите е во тоа што тие може да се користат во различни програми, а и на повеќе места во иста програма. Тоа е овозможено преку механизмот на формални аргументи (англ. formal arguments) и вистин­ски аргументи (англ. actual arguments). Во литературата, формалните аргументи често се нарекуваат параметри (англ. parameters), а вистинските аргументи само аргументи. Ние ќе ги користиме последните два термини.

Параметрите се користат при дефинирање на потпрограмите, додека аргументите се користат при повик на потпрограмите.

Реализацијата на подалгоритмите во С++ се врши со функциски потпрограми наречени само функции (англ. functions).

Функциите (функциските потпрограми) во С++ може да бидат:

  • Библиотечни функции.

  • Кориснички дефинирани функции.

Библиотечните функции во С++ се наоѓаат во Стандардната библиотека на С++ (англ. C++ Standard Library).

Кориснички дефинираните функции (англ. user-defined functions) или само кориснички функции (англ. user functions) се функции напишани од програмерите.

Библиотечните функции и корисничките функции (со кои се кодира функциски подалгоритам) кои даваат (враќаат) само еден резултат, т. е. само една вредност се нарекуваат функции со повратна вредност.

Општата форма на дефиницијата на корисничка функција со повратна вредност во С++ е:

тип име (листа_на_параметри){                               <----- Наслов на функцијата

                тело на функцијата (наредби)

                return израз;

}

тип                                                        – типот на вредноста која ја враќа функцијата,

име                                                         – името на функцијата,

листа_на_параметри               – ги содржи имињата на параметрите и нивните типови одделени со запирки.

Забелешки:

  • Насловот на функцијата не завршува со (;).

  • Листата на параметрите мора да ги содржи и имињата и типовите на параметрите.

  • израз е резултатот од функцијата (повратна вредност) кој може да биде израз (од променливи и/или константи и/или функции) или една променлива и која мора да е од ист тип со тип-от на функцијата.

Декларација на корисничка функција со повратна вредност во С++ се врши со наредбата со форма:

тип име (листа_на_параметри);

Забелешки:

  • Ако не се наведе тип-от на функцијата, се подразбира типот int.

  • Името (име) на функцијата (по конвенција) ќе го пишуваме како и променливите, т. е. со мала почетна буква. Ако името се состои од повеќе збора, секој следен збор ќе го пишуваме со голема буква.

  • Листата на параметрите (листа_на_параметри) мора да ги содржи типовите на параметрите, но не мора да ги содржи имињата.

  • Декларацијата на функцијата завршува со знакот точка и запирка (;).

Декларацијата на функција се нарекува функциски прототип (англ. function prototype).

Со функцискиот прототип се опишува интерфејсот на функцијата, односно се добиваат информации за бројот, редоследот и типот на параметрите кои треба да бидат познати пред да се повика функцијата, како и за типот на резултатот.

Ќе наведеме неколку примери на функциски прототипи на кориснички функци:

int mnozi(int m, int n);                                        - име: mnozi

                                                                                   - параметри: m и n

                                                                                   - типот  на резултатот е: int

float pomal(float, float);                                   - листа без имиња на параметрите

double g();                                                             - функција со празна листа, т. е. без параметри

int f(int a, b);                                                          - неисправно, треба: int f(int a, int b);

Делот од функцискиот прототип, кој ги содржи името и листата на параметрите се нарекува функциски потпис (англ. function signature).

На пример, функциски потписи се:

mnozi(int m, int n);            

pomal(float, float);

plostina(long, long);           

Функција со повратна вредност се повикува со наредба за доделување:

променлива = име(листа_на_аргументи);

Листата на аргументи (листа_на_аргументи) и листата на параметри (листа_на_параметри) на функцијата име мора да имаат:

  • ист број на аргументи и параметри,

  • ист редослед на аргументите и параметрите,

  • ист или конвертибилен тип на соодветните аргументи и параметри.

Ќе наведеме примери за повик на функции:

proizvod = mnozi(a, b);     

kvKoren = koren(12.345);                

n = pomal(c, p);

При повик на функција со повратна вредност, вредностите на аргументите (кои претходно мора да се дефинирани – имаат вредност) се пренесуваат (копираат) во соодветните параметри.

Функциите кои се дефинирани по главната функција main(), се декларираат (со наведување на нивниот прототип) пред главната функција, за да може да се повикуваат во главната функција, односно за да знае преведувачот кога ја преведува главната функција што претставуваат тие имиња.

Во дефиницијата на функција со повратна вредност мора да се наведе што се враќа како резултат при нејзиното извршување, било да се повикува од главната функција main() или од друга функција.

Една функција може само еднаш да се дефинира во истата програма.

Мени

Кориснички функции без повратна вредност

 

Процедуралните подалгоритми во С++ се реализираат со функции без повратна вредност. Нивниот тип е void. Затоа, се нарекуваат и функции void.

На пример, дефиницијата на функцијата без повратна вредност pecatenje() може да биде:

void pecatenje( string poraka, float rezultat ){

                cout << poraka << rezultat << endl;

                // poraka ‒ e string

                // rezultat – е резултат од пресметките

}

Повикот на оваа функција може да биде од функцијата main() или од друга функција. Повикот на функција без повратна вредност се разликува од повикот на функција со повратна вредност, бидејќи функција без повратна вредност се повикува само со своето име и листата на аргументите и не може да се повика во друга наредба како што може да се повика функција со повратна вредност.

На пример:

pecatenje("\nRezultatot e : ", x );

Функција без повратна вредност може да биде и без параметри.

На пример:

void  vlez() {

                cout << "Vnesuvanje na vlezni podatoci\n";

}

или        

void izlez(void) {                                 // So parametarot void e isto kako i bez nego

                cout << "Pecatenje na izleznite podatoci\n";

}

Повикот на овие функци без повратна вредност може да биде:

vlez();                     vlez(void);                             izlez();                    izlez(void);

Од функција без повратна вредност т. е. од функција од типot void се излегува без наредбата return (како во функција со повратна вредност), автоматски по нејзиното извршување. Но, може да се излезе и од кое било место во телото на функција без повратна вредност со наредбата return без параметар.

На пример:

void kvadratenKoren(double broj ) {

                if(broj < 0) {

                                cout << "Brojot e negativen i nema kvadraten koren." << endl;

                                return;

                }

                else

                                cout << "Kvadraten koren od "<< broj << "e " << sqrt(broj )      << endl;

                cout << "Kraj na funkcijata." << endl;

}

Мени

Референтни параметри

 

Референцирање (англ. referencing), кажано кратко, е доделување друго име на иста променлива. На пример:

int b = 3;

int &r = b;

Со втората наредба се декларира референцата r, која упатува на променливата b.

Знакот & (амперсанд) се чита „референца“. Променливата r е референтна променлива (англ. reference variable) или кратко референца (англ. reference).

Втората наредба се чита: „r е целобројна референца иницијализирана на b“ или „r е целобројна референца која упатува на b“.

При декларирање на референца, таа мора да се иницијализира така што ѝ се доделува адресата на променливата на која упатува. По декларирање и иницијализирање на дадена референца, таа не може да се промени да упатува на друга променлива. Но, може да се декларираат повеќе референци кои упатуваат на иста променлива.

Исто така, типот на референцата мора да е ист со типот на променливата на која упатува.

На следнава скица е илустрирана референцата r која упатува на променливата b во меморијата. Бидејќи и b и r се променливи кои зафаќаат простор во меморијата (се наоѓаат на некои адреси), упатувањето се врши така што референцата r ја содржи адресата на променливата b:

Пример

void zamena(int &prv, int &vtor ) {

                int pom;

                pom = prv;

                prv = vtor;

                vtor = pom;

                cout << "a = " << prv << "i b = " << vtor << endl;

}

Знакот & може да се стави каде било помеѓу типот и името на параметарот:

int& prv                 int & prv                int &prv

                Овој механизам на пренесување вредности од повикувачот во функцијата и спротивно е наречен пренесување по референци  (англ. pass-by-references), додека аргументите се нарекуваат аргументи пренесени по референца (англ. pass-by-reference arguments).

Мени

Глобални, локални  и статички променливи

 

Променливите кои се креирани во програмите и во потпрограмите имаат одредено подрачје на видливост (англ. scope of visibi-lity) наречено и подрачје на пристап (англ. scope of access). Подрачје на видливост на некоја променлива се смета она подрачје во кое има пристап до променливата т. е. со неа  може да се вршат операции.

Некои променливи може да се користат во целата апликација, некои во целата  функција, а некои само во делови од функцијата.

Според подрачјето на видливост променливите може да бидат:

  • Глобални променливи.

  • Локални променливи.

Подрачјето на видливост на глобалните променливи, односно пристапот до нив,  е целата апликација т. е. главната функција и сите кориснички дефинирани функции во истата датотека во која е главната функција.

Имињата на кориснички дефинираните функции во една апликација се третираат како глобални променливи и затоа, една функција може да се повика во која било друга функција во апликацијата.

Функција во С++ не може да се дефинира во телото на друга функција.

Подрачјето на видливост на локалните променливи, односно пристапот до нив е само телото на функцијата во која се декларирани, само насловот на функцијата или само блокот помеѓу две загради {}. Видливоста започнува со декларацијата на локалната променлива.

Параметрите на една функција се третираат како локални променливи во целата функција. Исто така, локалните променливи во една функција се видливи во сите вгнездени наредби, додека локалните променливи декларирани во телото на некоја на-редба, не се видливи надвор од нејзиното тело.

За една променлива велиме дека е скриена (прекриена со друга променлива) во некој блок или во цела функција ако не е видлива (не може да се користи) во тој блок или во таа функција.

Глобалните променливи живеат цело време додека се извршува апликацијата.

Локалните променливи живеат од моментот на креирањето до крајот на подрачјето на видливост.

Променливите може да бидат и статички (англ. static). Тие се декларираат со зборот static.

На пример:

static int broj = 7;

Глобалните променливи и локалните статички променливи почнуваат да живеат со првото извршување на нивната дефини-ција.

Мени

Вградени функции

 

При извршување на една апликација, за сите функции се прави по една копија во меморијата. Познато е дека извршувањето на секоја апликација започнува со функцијата main(). Ако се повикува друга функција во неа, тогаш дејството прекинува на местото на повикот и се скока на локацијата во меморијата каде што се наоѓа повиканата функција. По нејзиното извршување, дејството се враќа во main() и продолжува со следната наредба по наредбата за повик на функција.

Овој механизам за повик на една функција и враќање во повикувачот (кој може да биде и друга функција освен main()), бара одредено време за извршување. Во случај кога е мала повиканата функција, може да се случи времето за повик на функцијата и враќањето од неа да биде поголемо од времето на самото извршување на функцијата. Изгубеното  време е поизразено ако функцијата се повикува почесто, на пример, во наредбата за повторување.

Во таквите случаи, попрактично е функцијата да се вгради во кодот на повикувачот (на пример, во main()) при неговото преведување.

За таа цел, во С++ се користи квалификаторот inline, кој се става пред дефиницијата на функцијата.

На пример:

inline int igraBonus(string imeIPrezime)

Мени

Подразбирливи аргументи

 

Често некој аргумент при повик на некоја функција е ист при секој нејзин повик. За да не се пренесува таквиот аргумент во секој повик, функцијата може да се дефинира со истиот параметар како подразбирлив аргумент (англ. default argument). 

На пример:

void spisokNaUcenici(string imeIPrezime, string uciliste = "Goce Delcev")

Мени

Преоптоварување на функции

 

Една од добрите особини на С++ е преоптоварување на функции (англ. function overloading). Тоа се функции со исто име кои имаат различен број и тип на параметри, односно функции кои се разликуваат по потписите. Сè додека некоја преоптоварена (англ. overloaded) функција може да се препознае врз основа на нејзиниот потпис, не доаѓа до конфликти со другите функции.

За две функции велиме дека се преоптоварени ако:

  • имаат исто име,

  • имаат различни листи на параметри,

  • се декларирани во истo подрачје на видливост.

На пример, следниве функции се преоптоварени:

int max(int, int);

int max(const int = 5, double &);

int max(float, float);

Разрешување на преоптоварени функции (англ. function overload resolution) е постапка со која повикот на функцијата се насочува кон една од преоптоварените функции, односно од сите функции со исто име се избира најсоодветната.

Мени

Функциски шаблони

 

Дефиницијата на функциски шаблон е стандардна, како кај секоја функција, само што типот на податоците е името што е наведено во листата на параметри.

template <листа_на_параметри>

Листата на параметрите содржи тип на параметарот пред кој се наведува резервираниот збор typename.

На пример:

template <typename T>

template <typename T1, typename T2>

template <typename ucenik, typename student>

При повикот на функциски шаблон, се врши замена на параметрите на шаблонот со соодветните аргументи од повикот, а истовремено се врши и замена на типот на параметрите со соодветниот тип на аргументите. Притоа, се генерира посебна функција со изворен код и со соодветниот тип од повикот, која се нарекува специјализација на функцискиот шаблон (англ. functiоn-template specialization).

Мени

Рекурзивни функции

 

Рекурентни релации     

                               

Релациите со кои следниот елемент се пресметува од еден или повеќе претходно зададени или пресметани елементи се нарекуваат рекурентни релации (англ. recurrence relations).

Примери:

  1. Непарни броеви.

         xn + 1 = xn + 2, n >= 1, x1 = 1.

  1. Факториел на природен број.

         n! = n(n ‒ 1)!, n >= 1, 0! = 1.

  1. Фибоначиеви броеви.

         Fn = Fn ‒ 1 + Fn ‒ 2 , за n = 2, 3... и почетни F0 = 1, F1 = 1.

Рекурзивни функции

 

Рекурзивните подалгоритми во С++ се реализираат со рекурзивни функции.

Пример

Да се напише рекурзивна функција која го пресметува збирот на првите n природни броеви.

long zbir(int n) {

                if (n == 0)

                                return 0;

                else

                                return n + zbir(n ‒ 1);

}

Мени

Низи

 

Еднодимензионални низи

 

Да се потсетиме за аритметичките и геометриските низи. Низата а1, а2... аn се нарекува аритметичка ако разликата на кои било два соседни елементи е иста, додека кај геометриската низа количникот на кои било два соседни елементи е ист. Исто така, гледаме дека сите елементи имаат исто име, а индексите им се 1, 2, 3... n.

Индексите може да се означат како точки на бројна оска, т. е. во еден правец, една димензија. Должината е една димензија. Површината (правоаголник) има должина и ширина, значи има две димензии. Просторот (зградата) има три димензии: должина, ширина и висина.

Затоа, низите со еден индекс (една димензија) се нарекуваат еднодимензионални низи (англ. one dimensional arrays).

Ако знаеме дека низата има n елементи, тогаш се запишува со: а1, а2... аn. Или, пократко, со a[i]n или само a[]n, што значи дека индексот i има вредности од 1 до n. Се користи и следната ознака [а]n, при што со n се означува дека низата е еднодимензионална и дека индексите се од 1 до n. Во литературата се користи и ознаката a[1..n]. Последнава ознака ќе ја користиме во алгоритмите.

Во програмските јазици, променливите што добиваат вредности на податоците од едно­ди­мензионалната низа се запишуваат на тој начин што индексот се става во средни загради: a[1],  a[2]... a[n] или ocenka[1],  ocenka[2]… ocenka[n]. Иако името на сите елементи им е исто, тие се различни променливи кои се разликуваат по индексот.

Во многу програмски јазици индексите се од 0 до n ‒ 1. За низа од n елементи, индексите се 0, 1, 2, 3... n ‒ 1. На пример, за низа од n елементи ознаката е a[]n, а елементите се: a[0], a[1]... a[n‒1].

Низите во С++ се означуваат на истиот начин, при што индексите се ненегативни цели броеви, а првиот индекс секогаш е 0.

Еднодимензионалните низи во С++ се декларира­ат на след­ниов начин:

тип  име[број];

тип        ‒ е типот на елементите на низата (short, int, long, long long, float, double, char, boolean, string итн.).

име         ‒ е името на низата.

број        ‒ е бројот на елементите на низата и тој мора да биде литерал или именувана константа поголема од 0.

Пример:

int a[5];                 

Низата a[5] има 5 елементи, и тоа: a[0], a[1], a[2], a[3] и a[4]. Типот на елементите на низата е int и на нив може да им се доделуваат само целобројни вредности. 

На елементите на една низа може да им се доделуваат вредности со наредбата за доделување или при иницијализација.

Мени

Наредбата for базирана на опсег

 

Има многу проблеми во кои се извршува некоја операција врз елементите на една низа, независно од нивниот редослед. На пример, ако треба да се соберат 5 броеви, не е важен нивниот редослед при собирањето.

За решавање вакви проблеми во С++ се користи т.н. наредба for базирана на опсег (англ. range-based for).

for (променлива : низа) {

                наредба А;

                наредба Б;

                ...

                наредба К;

}

во која:

  • променлива е променливата од типот на низа.

  • низа е името на низата.

Во телото на наредбата не може да има и наредби за ознаки или операции со индексите.

Мени

Дводимензионални низи

 

Има примери во математиката и во други области, каде што за запишување на некои податоци со променливи мора да се користат 2, 3... и повеќе индекси.

Таквите податоци може да се запишат како дводимензионална низа (англ. two-dimensional array).

На пример, ако знаеме дека има m ученици и n предмети, тогаш низата (математички) се запишува со: o1,1, o1,2... o1,n, o2,1, o2,2... o2,n, o3,1... om,1, om,2... om,n.

Или, попрегледно,

 

Дводимензионалната низа се означува со o[i, j]m,n, што значи дека индексот i има вредности од 1 до m, а индексот ј има вредности од 1 до n. Пократко, низата се означува со o[]m,n, при што m и n покажуваат дека низата е дводимензионална и се знае дека првиот индекс е од 1 до m, а вториот од 1 до n.

Во литературата се користи и заознаката o[1..m][1..n].

Општиот елемент се означува со oi,j.

Дводимензионалните низи во математиката се нарекуваат матрици.

Ваквите дводимензионални низи во програмские јазици, па и во С++, се запишуваат со o[m][n], а општиот елемент е со два индекса во загради, о[i][j]. На пример, o[2][7] = 5, o[3][10] = 2 итн. Погрешно е претставувањето со o[2, 7].

Декларацијата на дводимензионална низа е слична со декларацијата на еднодимензионалната низа:

тип  име[број1] [број2];

во која:

тип        ‒ е типот на елементите на низата (short, int, long, float, double, char, boolean, string итн.).

име         ‒ е името на низата.

број1 и број2     ‒ се бројот на елементи на низата и тој мора да биде литерал или именувана константа поголема од 0.

Мени

Текстуални низи

 

Во јазикот С (кој бил претходник на С++) биле дефинирани низи од знаци – стрингови наречени текстуални низи како посебен тип. Затоа, се наречени и С-стрингови. Постојат многу функции за работа со овие низи наследени од јазикот С. Тие се користат и во С++, посебно за апликации во кои се обработуваат текстови.

Текстуалните низи се разликуваат од стринговите по тоа што завршуваат со т.н. нулти знак (англ. null-character) ‘\0’. Затоа, се наречени и текстуални низи кои завршуваат со нула (англ. null-terminated character sequences).

Друга битна разлика меѓу стринговите и текстуалните низи е што стринговите немаат зададена должина (може да ја содржат која било стринг-константа), додека должината на текстуалните низи им се задава при декларирањето.

Примери

Стрингот "Denes e 123-ot den vo godinata" има должина 30. Првиот знак 'D' има индекс 0, вториот знак 'e' има индекс 1, последниот знак 'a' има индекс 29.

Ако овој стринг се декларира како текстуална низа, на крајот автоматски му се додава нултиот знак.

Текстуалните низи се декларираат со резервираниот збор char.

Со следнава декларација и иницијализација:

char ime[11] = "MAKEDONIJA";

текстуалната променлива ime, иако има 10 знаци, во меморијата ќе зафаќа 11 бајти.

Мени

Функции за работа со текстуални низи

 

Нека се s1 и s2 текстуални низи, декларирани со доволна големина.

Функции за работа со текстуални низи се:

strlen(s1);                                – Функција за должината на низата (број знаци без нултиот знак).

strcpy(s1, s2);                        – Функција од типот void за копирање на s2 во s1.

strncpy(s1, s2, n);                – Функција од типот void за копирање на првите n знаци од s2 во s1.

strcat(s1, s2);                        – Функција од типот void за спојување на s1 и s2.

strncat(s1,s2,n)                    – Функција од типот void за спојување на s1 и првите n знаци од s2.

strcmp(s1,s2);                       – Функција за споредување на s1 и s2.

strncmp(s1,s2,n);                 – Функција за споредување на првите n знаци од s1 и s2.

Мени

Датотеки

 

Терминот датотека (англ. file) го означува секое множество податоци зачувани на надворешни мемории под едно име. Тие може да содржат различни податоци, како: текст, броеви, слики (видео), звук итн.

Датотеките може да се поделат на:

  • влезни датотеки                                – оние од кои може само да се чита.

  • излезни  датотеки                            – оние во кои може само да се запишува.

  • влезно-излезни  датотеки           – оние од кои може и да се чита и во кои може да се запишува.

Датотеките кои се чуваат на надворешни мемории се нарекуваат физички датотеки.

Датотеките може да бидат текстуални датотеки (англ. text files) или бинарни датотеки (англ. binary files).

Бидејќи во текстуалните датотеки и во бинарните датотеки се запишува редно, т. е. секвенцијално (знак по знак или бајт по бајт), овие датотеки се нарекуваат секвенцијални датотеки (англ. sequential files).

Операциите (читање, запишување и модификација) со текстуалните датотеки може да се вршат и со текст уредувач, додека операциите со бинарните датотеки мора да се вршат со програми.

При обработката на податоци прочитани од датотеки, апликациите користат посебни типови променливи, со кои се симулираат физичките датотеки. Овие променливи се наречени променливи за логички датотеки или само логички датотеки. На пример, ако физичката датотека има име studenti.dat, во програмата може да ја наречеме со некое логичко име, на пример, tekst, vlez, izlez и сл.

Функциите за операции со влезните и со излезните датотеки се наоѓаат во библиотеката <iostream> и затоа, таа се вклучува во секоја апликација која обработува податоци од датотеки. Во неа се дефинирани и два посебни типа променливи, променливи за влез – istream и променливи за излез – ostream. Стандардните променливи cin и cout се променливи декларирани од овие типови:

istream cin;

ostream cout;

Слично како што се читаат податоци од тастатурата и се печатат на екранот на мониторот така се читаат и печатат податоци во датотеките. Променливите cin и cout оперативниот систем ги гледа како влезна и излезна логичка датотека.

Функциите за операции со корисничките датотеки во C++ се наоѓаат во посебни библиотеки, и тоа: <fstream>, <ifstream> и <ofstream>. Имињата се кратенки од: file stream – fstream, input file stream – ifstream и output file stream – ofstream. За да може да се користат функциите од овие библиотеки, тие треба да бидат вклучени во апликациите со директивата #include.

На пример:

#include <fstream>

#include <ifstream>

#include <ofstream>

Влезни датотеки

 

Декларирање на променлива за влезна датотека (име на логичка датотека) се врши со:

ifstream именапроменлива;                             // ime na logicka datoteka za citanje

На пример:

ifstream vlezna;

За да може да се читаат податоци од влезната (физичката) датотека, нејзе мора да ѝ се придружи променлива од типот ifstream.

Со:

vlezna.open("Podatoci.dat");

се поврзува променливата за влезната датотека vlezna со физичката датотека "Podatoci.dat", односно се отвора физичката датотека "Podatoci.dat" за читање податоци од неа. 

 

Излезни датотеки

 

Декларирање на променлива за излезна датотека (име на логичка датотека) се врши со:

ofstream именапроменлива;       // ime na logicka datoteka za zapisuvanje

На пример:

ofstream izlezna;

За да може да се запишат податоци во излезната (физичката) датотека, нејзе мора да ѝ се придружи променлива од типот оfstream.

Со:

izlezna.open("IzleznaDatoteka.dat");

се поврзува променливата за излезната датотека izlezna со физичката датотека  IzleznaDatoteka.dat, односно се отвора физичката датотека за запишување податоци во неа. 

 

Влезно-излезни датотеки

 

За да може да се чита од некоја датотеката и во неа да се запишува, треба да се  декларира променлива за влезно-излезната датотека (име на логичка датотека) од типот fstream.

На пример:

fstream datoteka;

Поврзување на променливата за влезно-излезната датотека со физичката датотека се врши на истиот начин како и кај влезните или излезните датотеки. Меѓутоа, овде мора да се нагласи за што се отвора датотеката: за читање, за запишување или за допишување (додавање) податоци во неа. Начинот (модот) на кој се отвора датотеката за наведените операции се задава со посебен параметар:  

Датотека се затвора со функцијата close().

На пример:

vlezna.close();

izlezna.close();

Мени

Anchor 4
Anchor 6
Anchor 5
Anchor 7
Anchor 8
Anchor 9
Anchor 10
Anchor 11
Anchor 12
Anchor 13
Anchor 14
Anchor 15
Anchor 16
Anchor 17
Anchor 18
Anchor 19
Anchor 20
Anchor 21
Anchor 22
Anchor 25
Anchor 26
Anchor 27
Anchor 29
Anchor 31
Anchor 23
Anchor 24
Anchor 28
Anchor 30
Anchor 32
Anchor 33
Anchor 34
Anchor 35
Anchor 36
Anchor 37
Anchor 38
Anchor 39
Anchor 40
Anchor 41
Anchor 42
Anchor 43
Anchor 44
Anchor 45
Anchor 46
Anchor 47
Anchor 48
Anchor 49

2023 проф. д-р Ѓорѓи Јованчевски

bottom of page