OOП

 https://www.w3schools.com/cpp/cpp_oop.as

Презентација и квизови изработени од  Калина Јамндиева, Катерина Јамандиева, Петар Стојаноски, Софија Милошеска, Марија Ристеска, Елена Веруш, Илина Николоска 

КЛАСИ     КВИЗ 1    КВИЗ 2

Прашања:

1. Според начинот на пресметување програмските јазици ги делиме на 2 групи. Кои се тие ?
2. Која е разликата помеѓу процедуралните и објектно ориетираните јазици?
3. Кој е првиот јазик кој вовел објекти и класи ?
4. Што е ООП? Кои се предностите на ооп во однос на процедуралното програмирање
5. Објасни го принципот "Don't Repeat Yourself" (DRY)
6. Што е класа, а што објект ? Примери за класа и објекти
7. 


8. Како се дефинира класа?
9. Атрибутите и методите се во основа променливи и функции кои припаѓаат на класата. Тие често се нарекуваат „членови на класата“. Објасни !

Процедурално / Објектно

Процедуралното програмирање користи листа на инструкции за извршување одредена задача чекор по чекор. Се темели на процедури. Познати се и како top-down јазици, односно процедурите се извршуваат редоследно одгоре надолу. Процедуралнои јазици : Fortran, Cobol, C, Basic, Pascal

Првиот ОО јазик  Simula ја воведува идејата за објекти, како збир на информации кои се третираат како единствен елемент. 

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

Основна разлика помеѓу процедурално и OOP програмирање:

🔹 Процедурално програмирање
Се темели на функции/процедури.
Програмата е организирана како низа од чекори (инструкции).
Податоците и функциите се одделени.
Фокусот е на што треба да се изврши.
🔹 Објектно-ориентирано програмирање (OOP)
Се темели на објекти и класи.
Податоците и методите се обединети во објекти.
Фокусот е на кој го извршува однесувањето.
Се базира на: енкапсулација, апстракција, наследување и полиморфизам.
📌 Суштинска разлика:

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

Податоци од тип објект и класа

ООП не е само код, тоа е начин на размислување.
Наместо да размислуваме за кодот како низа од наредби, замислете дека градиме свет со „нешта“ (објекти).

Дискусија: Погледнете околу себе. Секој предмет е Објект. На пример, еден Автомобил.
Што поседува тој? (Боја, модел, брзина) — Ова се Податочни членки.
Што може да прави? (Забрзува, кочи, свири) — Ова се Функции-членки.

Вештачка интелигенција (AI) активност:

Отворете ChatGPT или друг AI четбот и напишете: „Опиши го објектот 'Паметен телефон' преку неговите карактеристики и акции како да си програмер.“ Споредете ги одговорите.

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

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

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

Нека е даден нацрт/план  за автомобилНацртот не може да се вози – тоа значи и класата не може да  се „вози“.   Значи треба да се конструира автомобил за истиот да може да се вози , што значи дека  мора да се креира објект од класата  за да може да се извршуваат функциите на класата.

Што е Класа, а што Објект?

·       Класа:  Нацрт-план или рецепт (пр. Рецепт за торта).

·       Објект: Конкретен пример направен според планот (пр. Самата торта на масата).



Концептот на „Црна кутија“ vs. „Отворена кутија“

Ако имате далечинско за телевизор, дали треба да знаете како се поврзани жиците внатре за да го смените каналот?“
· Дискусија: во програмирањето, класата е кутија.
· Јавен пристап (public): Тоа се копчињата на далечинското кои се достапни за сите. Ако нешто е public, секој може да го види и користи.
· Податочни членки: Тоа се карактеристиките (пр. боја на далечинското).
· Функции-членки: Тоа се акциите (пр. копчето „Power“).

Пристап до елементите  - членки на класа 

За да пристапите до елементите на класа , го користите операторот точка (.).















Дефинирање на функции членки на класа

         a. во дефиницијата на класа - Insid

         b. надвор од  дефиницијата на класа – Outside (со :: - scope resolution operator

class MyClass { // The class

public: // Access specifier
void myMethod() { // Method/function defined inside the class
cout << "Hello World!";  }
};

int main() {
MyClass myObj; // Create an object of MyClass
myObj.myMethod(); // Call the method
return 0;
}
-------------------------------------------------------------------------------
class MyClass { // The class
public: // Access specifier
void myMethod(); // Method/function declaration
};
// Method/function definition outside the class
void MyClass::myMethod() {
cout << "Hello World!";
}

int main() {
MyClass myObj; // Create an object of MyClass
myObj.myMethod(); // Call the method
return 0;
}


Што ќе се прикаже  во следниот сегмент 
 class primer
  {  public:
     int x; 
     int Broj()
     { return 100%10; }
   };

int main()
{ primer obj;
  obj.x=100; cout<<"x="<<obj.Broj()<<endl; 
  return 0;
}
Плоштина и периметар на павоаголник 

#include<iostream>
using namespace std;
class Pravoagolnik {
public:                              // specifikarot na pristap
float plostina (float a, float b) {     //  funkcija
float p=a*b;
 return p;   }
 float perimetar(float a, float b) {   // funkcija
 float l=2*(a+b);
 return l;   }
};
int main()
{
float a, b;
 Pravoagolnik obj;                                // object obj od tipot class 
 cout<<"Vnesi dimenzii na pravoagolnik: ";
 cin>>a>>b;
 cout<<"Plostina: "<<   obj.plostina(a, b) <<endl;  // pristap do f-jata Plostina 
 cout<<"Perimetar: "<<  obj.perimetar(a, b) ;
 return 0;
}


Одговори на прашањата !!!
1. Што дефинираме со „Класа“ во C++?

А) конкретна вредност во меморијата
Б) кориснички дефиниран тип кој служи како „нацрт-план“ за објекти
В) само листа од функции без податоци

2. Кој оператор се користи за пристап до податочните членки и функциите на еден објект?
            А) стрелка (->)
            Б) две точки (::)
            В) точка (.)

3. Што означува клучниот збор public: во дефиницијата на класата?
      А)  членовите се достапни само во внатрешноста на класата
      Б)   членовите се достапни за користење надвор од класата (на пр. во main)
      В)  класата е достапна на интернет

4. Пронајди ја грешката во следниов код:
class Ucilnica {
public:
int brojNaUcenici;

  5. Поврзи ги поимите со нивното значење:








6. Изврши корекција!
class Avtomobil {
    string marka; // по дифолт е private
    void vozi() { cout << "Vozam!"; }
};

int main() {
    Avtomobil a;
    a.marka = "BMW"; // Грешка?
    a.vozi();        // Грешка?
}
7. Доврши ја main функцијата
Имате класа Krug. 
1.Напишете main функција каде ќе креирате објект, ќе поставите радиус 7 и ќе ја испечатите плоштината.
2.Напишете main функција каде ќе креирате објект, ќе внесете вредност за радиус преку тастатура и ќе ја испечатите плоштината.

class Krug {
public:
double radius;
double presmetajPlostina() {
return 3.14 * radius * radius;
}
};

8. Дополни го кодот за да се креира објект и да се повика функцијата
#include <iostream>
using namespace std;
class Student {
public:
string name;
void printName() {
cout << name;
}
};


int main() {
______ s;
s.______ = "Marko";
s.______();
}
Задача :
Корисникот внесува преку тастатура име на ученик 
Корисникот внесува преку тастатура име и презиме на ученик 

9. Што ќе се прикаже
#include <iostream>
using namespace std;
class Kvadrat {
public:
    double strana; // Јавен атрибут 
    // Метод за пресметување периметар
    double presmetajPerimetar() {
        return 4 * strana;     }
    // Метод за пресметување плоштина
    double presmetajPlostina() {
        return strana * strana;     }
};
int main() {
    double s;
    // Креирање на објект (се користи стандардниот празен конструктор)
    Kvadrat mojKvadrat;
    cout << "Vnesete ja stranata na kvadratot (s>0) :  ";
    cin >> s;
    // Директно доделување вредност на атрибутот на објектот
    mojKvadrat.strana = s;
    cout << "---------------------------" << endl;
    cout << "Rezultati za kvadrat so strana " << mojKvadrat.strana << ":" << endl;
    cout << "Perimetarot e: " << mojKvadrat.presmetajPerimetar() << endl;
    cout << "Plostinata e: " << mojKvadrat.presmetajPlostina() << endl;
    return 0;
}

ИЛИ 
#include <iostream>
using namespace std;

class Kvadrat {
public:
    double a; // Сега страната е јавно достапна
    double presmetajPerimetar() 
    {   return 4 * a;     }
    double presmetajPlostina() 
    {   return a * a;     }
};

int main() {
    Kvadrat Obj; // Креираме објект без параметри
    cout << "Vnesete ja stranata a=: ";
    cin >> Obj.a; // Директно пристапуваме до променливата 'a'
    if (Obj.a <= 0) 
    {  cout << "Greska! Nevalidnavrednost" << endl; } 
    else 
    {   cout << "Perimetar: " << Obj.presmetajPerimetar() << endl;
        cout << "Plostina: " << Obj.presmetajPlostina() << endl;    }
    return 0;
}

Разгледај го примерот (за дома )

#include <iostream>
    using namespace std;
class Student {
private:
    int ocenka; // Приватен податок
public:
    // SETTER - Поставува вредност со контрола
    void setOcenka(int o) {
        if(o >= 1 && o <= 5) {
            ocenka = o;
        } else {
            cout << "Грешка: Невалидна оценка!" << endl;
        }
    }
    // GETTER - Ја чита вредноста
    int getOcenka() {
        return ocenka;
    }
};

int main() {
    // 1. Креирање на објект од класата Student
    Student ucenik1;
    // 2. ОБИД ЗА ДИРЕКТЕН ПРИСТАП (Ова ќе предизвика грешка при компајлирање!)
    // ucenik1.ocenka = 5; 
    cout << "--- Тестирање на сетер со валидна вредност ---" << endl;
    ucenik1.setOcenka(5); // Поставуваме оценkа 5
    cout << "Оцената на ученикот е: " << ucenik1.getOcenka() << endl;
    cout << "\n--- Тестирање на сетер со НЕВАЛИДНА вредност ---" << endl;
    ucenik1.setOcenka(10); // Ова ќе ја активира пораката за грешка во сетерот
        // Вредноста останува старата (5) или почетна, бидејќи 10 е одбиено
    cout << "Тековна оценkа по обидот за грешка: " << ucenik1.getOcenka() << endl;
    return 0;
}

Изврши корекција за да внесот на оценка  е преку тастатура 

int main() {
    Student ucenik1;
    int vnesenaOcenka; // Променлива за чување на вредноста од тастатура
    cout << "Vnesete ocenka na ucenikot  (1-5): ";
    cin >> vnesenaOcenka; // Читање од тастатура
    // Ја повикуваме функцијата и ја праќаме вредноста што ја внел корисникот
    ucenik1.setOcenka(vnesenaOcenka); 
    // Проверка на резултатот
    cout << "Ocenkata na ucenikot e : " << ucenik1.getOcenka() << endl;
    return 0;
}

Објасни го  следниот код 

#include <iostream>
#include <string>
using namespace std;

class Telefon {
private:
    string marka;
    int baterija; // Процент на батерија (0-100)
public:
    // 1. Конструктор: Се повикува автоматски кога креираме нов објект
    Telefon(string m, int b) {
        marka = m;
        baterija = b;      }
    // 2. Гетер: Овозможува читање на приватната променлива
    int getBaterija() {
        return baterija;     }
    // 3. Сетер: Овозможува менување со "заштита"
    void setBaterija(int b) {
        if(b >= 0 && b <= 100) {
            baterija = b;
        } else {
            cout << "Грешка: Батеријата не може да биде над 100 или под 0!" << endl;
        }       }
    // Метод за приказ
    void prikaziStatus() {
        cout << "Telefon: " << marka << " | Baterija: " << baterija << "%" << endl;
    }
};

int main() {
    // Креирање објект
    Telefon mojTelefon("iPhone 15", 80);
     mojTelefon.prikaziStatus(); // Прикажува статус
    // Користиме сетер за промена
    mojTelefon.setBaterija(95); 
    cout << "Nova baterija: " << mojTelefon.getBaterija() << "%" << endl;
    // Обид за внесување невалидна вредност
    mojTelefon.setBaterija(150); 
   return 0;
}

Решение
int main() {
    Student ucenik1;
    cout << "Внесете само име на студентот: ";
    // cin запира кај првото празно место (Space)
    cin >> ucenik1.name; 
    cout << "Внесеното име е: ";
    ucenik1.printName();
    return 0;
}

int main() {
    Student ucenik1;  
    cout << "Внесете го името на студентот: ";
    // Користиме getline за да може да го прочита името и презимето 
    getline(cin, ucenik1.name);
    ucenik1.printName();
    return 0;
}

No comments: