06 - Vežbe
Vežbe
  • Javne i privatne članice klase (9 min)
  • Podrazumevani i konstruktor sa parametrima (9 min)
  • Konstruktor i destruktor (9 min)
  • Upotreba klase string (9 min)
  • Upotreba metoda za manipulisanje tekstom (9 min)
06
Javne i privatne članice klase (9 min)
Kreirati klasu Fakultet koja sadrži podatke: adresa, broj zaposlenih, zarada (private) i funkcije članice info() i infoz() tipa void. Napisati glavni program u cilju testiranja funkcionalnosti klase

U primeru je deklarisana klasa Fakultet koja sadrži podatke: adresa, broj zaposlenih, zarada i funkcije članice info() i infoz() tipa void. Promenljivoj zarada se ne može direktno pristupiti iz programa, već samo uz pomoć javne (public) funkcije članice klase. Tako je u primeru pridodata funkcija infoz(), članica klase Fakultet, koja nam daje vrednost zaštićene promenljive.

class Fakultet
{
public:
    char adresa[30];
    int br_zaposlenih;
    void info(void);
    float infoz(void);
private:
    float zarada;
};

Da bi se iz programa (iz funkcije main) dodelila vrednost promenljivoj zarada, morala bi se, za tu svrhu, dodati posebna funkcija članica klase. U nastavku je definicija funkcija info() i infoz() klase Fakultet kao i glavni main program.

Zadatak za samostalni rad: Napisati funkciju klase Fakultet koja može da menja vrednost promenljive zarada.

#include <stdio.h>
#include <string.h>

void Fakultet::info(void)
{
    printf("adresa:  %s\n",adresa);
    printf("broj zaposlenih: %d\n",br_zaposlenih);
}
float Fakultet::infoz(void)
{
    return zarada;
}
void main(void)
{
    Fakultet fit;

    fit.br_zaposlenih=150;
    strcpy(fit.adresa,"Sestre Janjic br. 6");

    fit.info();

    // privatnoj promenljivoj ne moze se direktno 
    // pristupiti: fit.zarada=100000.;
    // javna funkcija klase moze da se upotrebi za to
    printf("zarada:  %f\n",fit.infoz());
}
Podrazumevani i konstruktor sa parametrima (9 min)
Kreirati podrazumevani i konstruktor sa parametrima za klasu Rectangle, kao i metodu koja računa površinu odgovarajućeg geometrijskog tela (pravougaonika)

U nastavku je dat primer konstruktora klase koja služi za manipulacijom nad pravougaonikom kao geometrijskim objektom:

#include <iostream>
using namespace std;

class Rectangle 
{
    int width, height;
  public:
    Rectangle ();
    Rectangle (int,int);
    int area (void) {return (width*height);}
};

Rectangle::Rectangle () 
{
  width = 5;
  height = 5;
}

Rectangle::Rectangle (int a, int b) 
{
  width = a;
  height = b;
}

U primeru možemo primetiti da su kreirana dva konstruktora: podrazumevani konstruktor i konstruktor sa parametrima

U cilju testiranja kreiranih konstruktora napisaćemo sledeći program:

int main () 
{
    Rectangle rect (3,4);
    Rectangle rectb;
    cout << "povrsina od rect: " << rect.area() << endl;
    cout << "povrsina od rectb: " << rectb.area() << endl;
    return 0;
}

Konstruktor sa parametrima za ovu klasu može biti definisan, kao i obično, na sledeći način:

Rectangle::Rectangle (int x, int y) { width=x; height=y; }

Ali može biti definisan pomoću liste za inicijalizaciju:

Rectangle::Rectangle (int x, int y) : width(x) { height=y; }

Ili čak i na sledeći način:

Rectangle::Rectangle (int x, int y) 
 : width(x), height(y) { }

Zadatak za samostalni rad: Dodati funkciju koja računa obim pravougaonika, kao i podatke članice koji se odnose na centar pravougaonika u 2D prostoru (centerX, centerY).

Konstruktor i destruktor (9 min)
Kreirati klasu Krug koja ima dinamički tekstualni podatak o boji kruga. Kreirati odgovarajući konstruktor i destruktor koji zauzima/oslobađa dinamički deo memorije za boju kruga

Neka je klasa Krug deklarisana na sledeći način:

class Krug
{
public:
 int x,y,r;
 char *boja;
 Krug(void);    // konstruktor
 ~Krug(void);   // destruktor
};

Konstruktor klase definišemo kao:

Krug::Krug(void)
{
 printf("konstruktocija kruga\n");
 x=10;
 y=10;
 r=5;
 boja=(char *) malloc(10);
 strcpy(boja,"bela");
}

a destruktor kao:

Krug::~Krug(void)
{
 printf("(destruktor) oslobadjanje memorije\n");
 free(boja);
}

U cilju testiranja prethodne klase napisaćemo sledeći glavni program:

void main(void)
{
 Krug A;

 printf("\nKrug\n x=%d\n y=%d\n r=%d\n boja=%s\n\n",
  A.x, A.y, A.r, A.boja);

 printf("objekat je unisten\n");
}

Da bi obezbedili neophodnu funkcionalnost programu moramo uključiti u naš projekat sledeće standardne bibliotečne fajlove:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

Zadaci za samostalni rad

  • Napisati funkcije članice koje računaju obim i površinu kruga.
  • Dodati konstruktor sa parametrima i konstruktor koji koristi listu za inicijalizaciju.
  • Umesto malloc / free koristiti funkcije new / delete za dinamičko alociranje / oslobađanje memorije u C++-u.
Upotreba klase string (9 min)
U okviru standardne C++ biblioteke postoji gotova string klasa za rad sa tekstualnim podacima

U listingu koji sledi u nastavku je dat jedan prost primer korišćenja promenljivih klase string.

#include <iostream>
#include <string>

using namespace std;

int main ()
{
   string str1 = "Zdravo";
   string str2 = "Svete";
   string str3;
   int  len ;

   str3 = str1;
   cout << "str3 : " << str3 << endl;

   str3 = str1 + str2;
   cout << "str1 + str2 : " << str3 << endl;

   len = str3.size();
   cout << "str3.size() :  " << len << endl;

   return 0;
}

Kao rezultat programa dobija se:

str3 : Zdravo
str1 + str2 : ZdravoSvete
str3.size() :  10

Kao što možemo videti, inicijalizacija promenljive str1 i dodeljivanje vrednosti „Hello“ se obavlja na sledeći način:

string str1 = "Zdravo";

Klasa string podržava operator sabiranja+ u cilju spajanja dva stringa. U cilju određivanja dužine stringa moguće je koristiti metodu size().

Upotreba metoda za manipulisanje tekstom (9 min)
Da bi se koristile metode C++ string klase treba samo dodati ime metode posle imena string promenljive i operatora tačka (npr. string.size())

U sledećem programu je dat primer korišćenja nekih od metoda:

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

int main()
{
    string str = "C++ je interesantan jezik";
    cout << str << endl;
    cout << str.size() << endl;
    str = " ";
    cout << str.size() << endl;
    string name1;
    while (name1.empty())
    { 
        getline(cin, name1);
    }
    cout << name1 << endl;
    return 0;
}

Dve tekstualne promenljive se mogu porediti pomoću metode compare(). Takođe, neka string promenljiva može da se kopira u neku drugu string promenljivu primenom metode assign(). U nastavku je primer poređenja stringova, i kopiranja jednog stringa u drugi:

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

int main()
{
    string str1, str2, str3, sum = "strings";
    cout << "unesi string";
    getline(cin, str1);
    cout << "unesi jos jedan string";
    getline(cin, str2);
    sum += (str1 == str2) ? "identicni" : "razliciti";
    if (str1.compare(str2) == 0) 
    {
        cout << "the same" << endl;
    }
    str3.assign(str1);
    return 0;
}