Анализа на првата програма

Во претходното предавање "Креирање на вашата прва програма", ја креиравте и извршивте вашата прва C++ програма:

Програма 5.1

#include <iostream>
using namespace std;

int main()
{
      cout << "Hello world!" << endl;
      
      return 0;
}

Гледано глобално, hello world програмата е составена од два позначајни дела:

Првиот дел ги опфаќа линиите 1 и 2. Првата линија (линија 1) испраќа информации до системот дека ни се потребни алатки за читање од тастатура и печатење на екран (input/output stream -> iostream). Системот ја чита првата линија (во овој случај "#include <iostream>"), и нејзе ја заменува со сите дефиниции кои се наоѓаат во iostream датотеката (алатките за читање и печатење). Доколку во програмата би извршувале сложени математички операции, потребно е да испратиме порака до системот дека ни се потребни алатки за извршување математички функции ("#include <cmath>"), доколку работиме со текстуални податоци потребно е да испратиме порака дека ни се потребни алатки за работа со текстуални податоци ("#include <string>"), итн. Во текот на овој курс, ќе се запознаеме со најзначајните алатки - сега засега е доволно да знаете дека во сите програми со кои што ќе работиме ќе ни биде потребно да читаме и/или печатиме податоци, па линијата "#include <iostream>" ќе се наоѓа во сите наши програми.

Втората линија (линија 2) означува дека ќе користиме наредби и/или променливи од стандардниот простор на имиња (std namespace). Доколку не ја внесевме втората линија, наместо cout требаше да пишуваме std::cout (бидејќи cout е дефиниран во стандардниот простор на имиња) и наместо endl требаше да пишуваме std::endl:

Програма 5.2

#include <iostream>

int main()
{
      std::cout << "Hello world!" << std::endl;
      
      return 0;
}

Оваа линија "using namespace std;" ќе се наоѓа во сите програми со кои ќе работиме, и таа секогаш ќе ја пишуваме под групата #include наредби. Во поголеми проекти (составени од илјадници функции), можно е да се дефинирани повеќе простори на имиња.

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

Извадок 5.1

int main()
{
      наредби;
      
      return 0;
}

Основна функција - main()

main() е првата функција која се повикува од страна на системот при извршување на една C++ програма. Во програмскиот јазик C++, сите функции се ограничени со знаците '{' (означува почеток) и '}' (означува крај). По правило, main() завршува со наредба за враќање на резултат 0 (му испраќа информација на оперативниот систем дека програмата завршила успешно). Програмите кои што не можат да се извршат како што треба (на пример, не успеале да извршат делење бидејќи именителот е 0 - а, нели, со нула не се дели), по правило враќаат излезен код различен од 0. Сите наши програми ќе содржат main() функција. На крајот на секоја main() функција ќе додаваме наредба "return 0;".

Сигурно забележавте дека, во линијата во која се дефинира името на функцијата, постои делче ("int") кое се наоѓа пред името на функцијата. Ова делче всушност означува дека функцијата враќа вредност цел број – main() функцијата секогаш ќе ја дефинираме на овој начин – "int main()". Исто така, сигурно забележавте дека постојат две загради "()" по името main. Овие две загради означуваат дека main() e всушност функција (сите функции по нивното име ќе содржат вакви загради). Опционално, помеѓу овие загради е можно да се дефинираат параметри кои, функцијата, евентуално би ги очекувала. На пример, можно е да имаме функција за собирање на два броја "int add(int a, int b)" – која го враќа збирот на броевите a и b:

Програма 5.3

#include <iostream>
using namespace std;

int add(int a, int b)
{
      return (a+b);
}

int main()
{
      cout << "2+5=" << add(2,5) << endl;
      
      return 0;
}

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

Печатење на текст

Извршувањето на hello world програмата (програмата дадена на почетокот на ова предавање) резултира со печатење на текстот "Hello world!" на компјутерскиот екран. Во C++, печатење на текст се прави со "вметнување" на текст (cout << "Hello world!" << endl;) во стандардниот cout поток. cout го означува излезниот поток на тековната конзола (конзолата во која се извршува нашата програма). cout e декларирано во iostream датотеката - во стандардниот простор на имиња (std namespace).

Покрај "Hello world!", во стандардниот поток вметнуваме и знак за нова линија endl (end line), што и нема некој посериозен ефект во нашата програма бидејќи печатиме текст од само една линија. Но, доколку сакаме да испечатиме текст од повеќе линии, потребно е, на соодветните локации, да го вметнеме овој знак. На пример, следнава програма печати две линии - првата линија го содржи текстот "Hello world!", додека втората линија содржи "Ova e mojata prva programa.". Притоа, "Hello world!" ќе го испечатиме со две наредби.

Програма 5.4

#include <iostream>
using namespace std;

int main()
{
      cout << "Hello ";
      cout << "world!" << endl;
      cout << "Ova e mojata prva programa.";
      
      return 0;
}

Забележете дека наредбите за печатење на текст (cout << "Hello world!" << endl;) и наредбата за враќање на резултат 0 од main() функцијата (return 0;) завршуваат со ';' (точка запирка). Овој знак се користи за да означи крај на една наредба и, истиот е задолжителен.

Структурирање на кодот

Во ова предавање анализиравме програма која содржи дефиниција на една функција (наречена main()), пораки до т.н. предпроцесор (линии кои започнуваат со знакот #) и наредби (линии кои завршуваат со знакот ';'). Наредбите во една функција се сместуваат помеѓу знаците '{' и '}' - тоа се знаците кои го означуваат почетокот и крајот на функцијата. Функциите се дефинираат (int main() { ... }) така што го пишуваме типот на податок кој тие го враќаат (int), нивното име и листата на аргументи.

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

Програма 5.5

#include <iostream>
using namespace std; int main() { cout << "Hello world!" << endl; return 0; }

Програма 5.6

#include <iostream>
using namespace std;
int
main() {
      cout <<
           "Hello world!"
         <<     endl     ;
                             return
      0;
}

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

Коментари

Во кодот може да додаваме и коментари - делови од кодот кои се игнорираат од страна на компајлерот. Коментарите немаат никаков ефект врз програмата, но тие му овозможуваат на програмерот да внесува објаснувања или забелешки во кодот - делови кои би му користеле нему или на некој друг програмер кој евентуално би работел на програмата.

C++ овозможува два начини на додавање на коментари:

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

Во следната програма постојат 3 еднолиниски коментари и 3 блок коментари:

Програма 5.7

//prv komentar: ova e hello world programa

#include <iostream>
using namespace std;

/* ova e blok komentar */

int main( /* nema argumenti */ )
{
      cout << "Hello world!" << endl;         //ispechati Hello world!
      
      /* blok komentar
      mozhe da se prostira
      vo povekje linii */
      
      return 0;                               //vrati 0
}

Примери

Предавањето ќе го завршиме со дискусија на две програми. Првата програма е едноставна варијација на hello world програмата и прикажува како може да се пресмета збир на два цели броја (во случајов 150 и 200):

Програма 5.8

#include <iostream>
using namespace std;

int main()
{
      cout << (150+200) << endl;
      
      return 0;
}

Втората програма е малку покомплицирана: програмата чита два цели броја a и b и го печати нивниот збир на екран. Програмата е составена од две функции – main() и add(int a, int b). Иако сеуште ги немаме изучено темите за читање на броеви од тастатура, дефинирање на променливи (места во меморијата каде што се чуваат вредности) или дефинирање и повикување на функции, сепак следнава програма е добар пример за тоа што се ќе можете да направите по изучувањето на следните неколку предавања. Впрочем, како мотивација, интересно е да се читаат и програми кои не можеме веднаш да ги разбереме.

Програма 5.9

#include <iostream>
using namespace std;

int add(int a, int b)
{
      return (a+b);
}

int main()
{
      int a, b;                          //deklariraj dve promenlivi
      cout << "Vnesi dva broja: ";       //pobaraj od korisnikot da vnese dva broja
      cin >> a >> b;                     //smesti go prviot vo a, a vtoriot vo b
      
      int rezultat;                      //nova promenliva
      rezultat = add(a, b);              //smesti go rezultatot vo 'rezultat'
      
      cout << rezultat << endl;          //otpechati go rezultatot
      
      return 0;
}

Доколку го разбравте погорниот код, сигурно се прашувате зошто наместо "rezultat = add(a, b);", не напишавме веднаш "rezultat = a+b;". Во право сте - многу подобро ќе беше да го направиме тоа и, во тој случај, ќе немаше никаква потреба од дефинирање на функцијата add(). Сепак, целта на ова предавање е да научиме како може да изгледа една програма, а не најкраткиот начин на пишување на програми. Дали ќе дефинирате функција за решавање на одреден проблем или сите пресметки ќе ги ставите во main() функцијата ќе зависи од тоа колку е сложен проблемот кој сакате да го решите - ако е тоа собирање на два броја навистина нема потреба од пишување на нова функција, но, доколку задачата опфаќа решавање на некоја сложен проблем за кој ви се потребни повеќе наредби, веројатно е потребно да се дефинираат неколку помошни функции. Исто така, функции се пишуваат и за решавање на проблеми кои се појавуваат повеќе пати - на пример, во програмата треба да решиме повеќе од една квадратна равенка.

За крај, обидете се самите да ја промените програмата дадена погоре - избришете ја дефиницијата на функцијата add() и променете ја линијата "rezultat = add(a, b);" во "rezultat = a+b;". Извршете ја програмата.

Дозвола за користење: CC BY-NC 2.5 ©