C++ tutorijali... zaključana tema

poruka: 148
|
čitano: 118.101
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
17 godina
neaktivan
offline
C++ tutorijali...

Naxeem, stavljaj Sicky i izbriši nepotrebne komentare.


Windows XP is a 32-bit shell for a 16-bit extension to an 8-bit operating system designed for a 4-bit microprocessor by a 2-bit company that can't
stand one bit of competition
 
0 0 hvala 0
17 godina
neaktivan
offline
RE: C++ tutorijali...

OBRADA TEKSTA DRUGI DIO


Dijelim ovako jer budu dugački postivi pa se jako puno scrola.......
Sad malo započinjemo s naprednijom obradom teksta iako će se u pčetku činiti
da baš i nije,ali postaviti ću par programa ,neću ih odmah objasniti nego sutra  ili prekosutra
s opet novim programima a vi ih vježbajte i sami pokušajte shvatiti logiku.

/*EVO JEDAN PROGRAM KOJI UNOSI RIJECI*/
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string ime;
    cout<<"Unesite vase ime : "<<endl;
getline(cin, ime);
 cout<<"Dobar dan  "<<ime<<" !"<<endl;  
//SAD TO SVE STAVLJAMO U OKVIR!!!!
string pozdrav = "Dobar dan "  + ime + "!";//pravimo pozdravnu poruku koju ćemo uokviriti

string praznine(pozdrav.size(),' ');//pravimo praznine ispod i iznad pozdrava
string praznine_2 ="#" + praznine + "#";
//sad pravimo prvi i zadnji okvir
string prvi_zadnji (praznine_2.size(),'#');
//SAD DOLAZI ISPIS!!!!!
//**********************************************
cout<<endl;
cout<<prvi_zadnji<<endl;
cout<<praznine_2<<endl;
cout<<"#"<<pozdrav<<"#"<<endl;
cout<<praznine_2<<endl;
cout<<prvi_zadnji<<endl;
cout<<endl;
//*********************************************
system("PAUSE");
    return 0;
}


U slijedećem programu malo se igramo s ispisima riječi a opet povezano s goenjim programom :

#include<string>
#include<iostream>
using namespace std;
int main()
{
    string rijec_1 = "Evo nas u obradi rijeci!   ";
    string rijec_2 = "Evo nas u obradi rijeci drugi put!";
    string rijec_3;
    rijec_3 = rijec_1 + rijec_2;
    cout<<rijec_3<<endl;
    system ( "pause");
    return 0;
}


U slijedećem opet je povezano sve s gornjim programima i naredbom size()  :

#include<string>
#include<iostream>
using namespace std;
int main()
{
    string rijec;
    cout<<"Unesite neku rijec : "<<endl;
    getline(cin,rijec);
    cout<<endl;
    cout<<"Rijec sadrzi "<<rijec.size() <<" slova ili znakova!"<<endl;
    cout<<endl;
  system ( "pause");
    return 0;
}


Sad imate malo materijala dok ih detaljnije ne objasnim.
Evo još par programa obrade teksta u ovom programu usporedjujemo rijeci  :

#include<string>
#include<iostream>
using namespace std;
int main()
{
    string rijec;
    string rijec_2;
    cout<<"Unesite neku rijec : "<<endl;
    getline(cin,rijec);
    cout<<endl;
    cout<<"Unesite drugu : "<<endl;
    getline(cin,rijec_2);
    cout<<endl<<endl;
    if(rijec==rijec_2)
    cout<<"Rijeci su jednake ."<<endl;
    else
    cout<<"Rijeci nisu jednake ."<<endl;
    cout<<endl<<endl;  
    cout<<"Rijec prva sadrzi "<<rijec.size() <<" slova ili znakova!"<<endl;
    cout<<endl;
  system ( "pause");
    return 0;
}

Neću raditi usporedbu koja je veća ili manja jer npr. u c++-u aaaaaa i AAAAAA javiti će da je AAAAAA manje od aaaaaaaaaaaa.
Za to postoje posebne funkcije a o tome ćemo kad bude,zasad jednostavna obrada teksta.
Evo programa s novom naredbom koja je unutar koda objašnjena pa proučite i vježbajte!

 #include<string>
#include<iostream>
using namespace std;
int main()
{
    string rijec;
    string pronadji;
    int polozaj;
    cout<<"Unesite rijec : "<<endl;
    getline(cin,rijec);
    cout<<endl;
   cout<<"Sad pisemo sto trazimo?"<<endl;
   getline(cin,pronadji );
   cout<<endl;
   //sad uvodimo naredbu za traženje find() i to spremamo u varijablu polozaj
   polozaj = rijec.find(pronadji);
   if(polozaj !=string::npos)
   cout<<"Trazena rijec je na "<<polozaj  <<" ....toj poziciji,tu pocinje"<<endl;
   else
   cout<<"Nije nadjena !"<<endl;
   cout<<endl;   
    system ( "pause");
    return 0;
}
/*if(polozaj !=string::npos)    :   u ovoj naredbi i uvjetu obratite pažnju
na to da je varijjabla položaj int tipa,zatim imamo (!=) negaciju, i zatim string::npos
opet negacija,znaci negacija negacije . Tj. u uvjetu je ovo,ako obavijest o traženoj rijeci
koju nismo našli nije tocna tad je ta rijec nadjena i spremi je u varijablu položaj
...nadam se da ste shvatili,ako tražena rijec koju tražimo je točna da je nismo našli
tad ide else.*/
/*druga naredba je find() koja obradjuje objekt rijec!!!!!
oblik je rijec.find(upisujemo ono što tražimo);
Točka razdvaja akciju nad objektom a u zagradama stavljamo funkciji find() što da radi
tj.što da traži i sve to sprema u objekt položaj jer find() vraća int tip.*/




U ovom programu sve je isto ali ako tražite dvije iste riječ,npr. napišite "Pišem li pišem  ovaj tekst" i pogledajte što se zbiva.
To i u gornjem programu napišite i sad usporedite i shvatite.

#include<string>
#include<iostream>
using namespace std;
int main()
{
    string rijec;
    string pronadji;
    int polozaj;
    cout<<"Unesite rijec : "<<endl;
    getline(cin,rijec);
    cout<<endl;
   cout<<"Sad pišemo što trazimo?"<<endl;
   getline(cin,pronadji );
   cout<<endl;
   //sad uvodimo naredbu za traženje rfind() i to spremamo u varijablu polozaj
   polozaj = rijec.rfind(pronadji);
   if(polozaj !=string::npos)
   cout<<"Trazena rijec je na "<<polozaj  <<"  toj poziciji,tu pocinje"<<endl;
   else
   cout<<"Nije nadjena !"<<endl;
   cout<<endl;   
    system ( "pause");
    return 0;
}
/*u ovom programu sve ide od kraja i na taj nacin preskace prvu rijec ako ih ima vise istih
*/




U ovom programu smo upotrijebili novi oblik find() naredbe i ona traži sad od položaja sedam i nađe drugo
pojavljivanje ine naše rečenice koju sam savjetovao da ispišete,vježbajte sad s ovim programima .

#include<string>
#include<iostream>
using namespace std;
int main()
{
    string rijec;
    string pronadji;
    int polozaj;
    cout<<"Unesite rijec : "<<endl;
    getline(cin,rijec);
    cout<<endl;
   cout<<"Sad pisemo sto trazimo?"<<endl;
   getline(cin,pronadji );
   cout<<endl;
   //sad uvodimo naredbu za traženje find() i to spremamo u varijablu polozaj
   polozaj = rijec.find(pronadji,7);
   if(polozaj !=string::npos)
   cout<<"Trazena rijec je na "<<polozaj  <<" ....toj poziciji,tu pocinje"<<endl;
   else
   cout<<"Nije nadjena !"<<endl;
   cout<<endl;   
    system ( "pause");
    return 0;
}

//polozaj = rijec.find(pronadji,7);    ovdje imamo isto find() funkciju
//ali sad naredjujemo da krene od polozaja broj sedam!!!


Sad se vraćam na prvi program jer njega ću malo detaljnije objasniti.

 

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string ime;
    cout<<"Unesite vase ime : "<<endl;
getline(cin, ime);

Ovaj dio koda vam je poznat.delariramo varijablu(objekt) tipa (klase) string i imena -ime.
Slijedi unos.

 cout<<"Dobar dan  "<<ime<<" !"<<endl;  


Ovdje vršimo ispis i pozdrav s naredbom cout<<.
Sad ide zanimljiv dio programa .unos imena i pozdravne poruke želimo staviti u
okvir.Prvo ćemo deklarirati i definirati varijablu pozdrav koja uključuje naše ime,varijabli pozdrav možete dodijeliti znači naše ime i znakovima zbrajanja
sve spojiti .To je naša pozdravna poruka.Sad još treba napraviti okvir.Okvir mora imati znači praznine ispod i iznad pozdrava i kao prvi red i zadnji red
mora biti okvir,znači pet redova.

//SAD TO SVE STAVLJAMO U OKVIR!!!!
string pozdrav = "Dobar dan "  + ime + "!";//pravimo pozdravnu poruku koju ćemo uokviriti



Taj okvir radimo s novim deklaracijama strig varijabli koje ćemo samo poslagati kako treba :

string praznine(pozdrav.size(),' ');//pravimo praznine ispod i iznad pozdrava

Prvo naravno moramo uzeti dužinu našeg string pozdrav i tu cijelu dužinu posaviti da budu praznine i sve to
spremiti u varijablu praznine.
Sad tu varijablu praznine da bi dobila konačni oblik koji možemo umetnuti iznad i ispod
pozdrava moramio oblikovati da se uklopi u okvir ,a to radi ova deklaracija i definicija varijable :

string praznine_2 ="#" + praznine + "#";

To je konačna varijabla koja nam trba za našu malu slagalicu iznad i ispod pozdrava.
Sad nam treba još samo okvir.

string prvi_zadnji (praznine_2.size(),'#');

Kao mjeru uzimamo cijelu dužinu praznine_2.size() i na njihovo mjesto stavljamo ljestve i sve to sprememo u varijablu
prvi_zadnji kao prvi i zadnji dio okvira koji ćemo sad samo posložiti:

cout<<prvi_zadnji<<endl;
cout<<praznine_2<<endl;
cout<<"#"<<pozdrav<<"#"<<endl;
cout<<praznine_2<<endl;
cout<<prvi_zadnji<<endl;


Vidite kako smo ih složili po redu i tako "nacrtali "okvir .
Znači pomoću + znaka mi možemo znači nadovezati znakovni niz i sve spremiti u novu varijablu.Plus znak znači ima drugačiju
funkciju u ovom programu(zbrajanje znakovnih nizova),za razliku

od zbrajanja brojeva i to je preklapanje operatora(ponovite definiciju preklapanje funkcije)
Sad nam ostaje da objasnimo
string ime_varijable.size()

Taj oblik  gdje točkom razdvajamo varijablu ili objekt(radi se o objektu) od funkcije size() govori prevodiocu da nam mora dostaviti dužinu
traženog objekta,znači izvršili smo akciju nad njime,slijedeće je da u te praznine stavi znakove  i to je naša nova varijabla koju na taj način dobijemo:

string prvi_zadnji (praznine_2.size(),'#');

Doslovno : stavi u dužinu varijable (ispuni je čitavom njenom dužinom) s znakovima # .
Samo kratak primjer što to točno znači  :
#include<string>
#include<iostream>
using namespace std;
int main()
{
string plusevi(19,'+');
cout<<plusevi;
cout<<endl;

  system ( "pause");
    return 0;
}


Evo izvršite ovaj program i vidite da smo definirali naš objekt plusevi tako da smo je dužinom od 19 ispunili s plusevima.
Samo vježbanjem programa još bolje možete shvatiti program.
Dalje nam slijedi još obrade teksta i programi u kojima ćete još bolje shvatiti akcije koje se vrše nad našim objektima string tipa.


U ovom slijedecem programu ćemo pronaći više pojavljivanja jedne riječi koju tražimo,vi izvršite ovaj program
a rečenicu koju napišete napišite tako da vam se ponavlja neka riječ ,recimo :
Nosim tako ja i nosim poklon tebi,nosim tebi draga !
I vi napišete da pronadje tebi i pogledajte što se zbiva.

#include<string>
#include<iostream>
using namespace std;
int main()
{
    string rijec;
    string pronadji;
    int duzina;
    int polozaj;
    int brojac=0;
    cout<<"Unesite rijec : "<<endl;
    getline(cin,rijec);
    cout<<endl;
    cout<<"Pronadji : "<<endl;
    getline(cin,pronadji);
    cout<<endl;
    duzina = rijec.size();                   //u varijablu duljina spremamo duzinu nase recenice(int tip!)
    while(brojac < (duzina + 1))             //ispitivanje traje cijelom duzinom recenice
    {
        polozaj = rijec.find(pronadji ,brojac);//u varijalu polozaj spremimo pronadjenu rijec
        if(polozaj !=string::npos)
        {
             cout<<"Rijec trazena je na "<<polozaj<<" poziciji!"<<endl;
             brojac= polozaj +1;           //ovdje pamtimo svako pojavljivanje
        }
        else
        {
            brojac = duzina + 1;           // ovdje se pomjeramo kroz recenicu
        }
 }
        cout<<endl;  
 system ( "pause");
    return 0;
}
/*U ovom programu smo nasli visestruko pojavljivanje jedne rijeci
koju zelimo naci,*/


Shvatite sami da smo sva naša brojanja i pamćenja mjesta uglavnom u int tip spremili a pretražujemo slova tj. rečenice.
U biti dosad bi vi trebali već shvatiti značenje brojača i kako on radi i gdje i zašto ga upotrebaljavamo,svaki dio ovog programa
možete i sami proanalizirati koristeći se dosadašnjim znanjem iz tutorijala i zato ako vam treba ovaj program detaljnije
objasniti vi samo recite,a ja nastavljam s obradom teksta.U slijedecim programima upoznati ćemo se s naredbama
insert(),erase(),replace().....samo da znate što je sljedeće.

Evo programa s tim naredbama ,objašnjenja ali kratka će slijediti
jer programi su kratki i ako budete uporno vježbali vidjeti ćete da nije uopće teško
shvatiti logiku.
Ovdje brišemo od mjesta broj šest(računaju se i praznine,) osam slova i praznina:

#include<string>
#include<iostream>
using namespace std;
int main()
{
   
  string b = "Ucimo zajedno na BUG forumu !";
  b.erase(6,8);
  cout<<b<<endl;
  cout<<endl;
  system ( "pause");
    return 0;
}


Ovdje vršimo zamjenu s stringom a,dimenzije su prije a navedene kao i u gornjem programu.

#include<string>
#include<iostream>
using namespace std;
int main()
{
   
  string b = "Ucimo zajedno na BUG forumu !";
  string a = "uporno";
  b.replace(6,7,a);
  cout<<b<<endl;
  cout<<endl;
  system ( "pause");
    return 0;
}


Ovdje umećemo rijeć na jedan način :

#include<string>
#include<iostream>
using namespace std;
int main()
{
   
  string b = "Ucimo zajedno na BUG forumu !";
  string a = "uporno i ";
  b.insert(6,a);
  cout<<b<<endl;
  cout<<endl;
  system ( "pause");
    return 0;
}


A ovdje na drugi način pa usporedite :

#include<string>
#include<iostream>
using namespace std;
int main()
{
   
  string b = "Ucimo zajedno na BUG forumu !";
 
  b.insert(6,"uporno i ");
  cout<<b<<endl;
  cout<<endl;
  system ( "pause");
    return 0;
}



Ove kratke programe ću vrlo malo iskomentirati jer ja mislim da kad ih izvršite više puta i
na taj način vježbate,sami ćete sve lijepo posložiti.U biti suvišno ih je komentirati jer svaki program
pokazuje što koja naredba radi,ako vam nije jasno vi pitajte.Ali vježbajući i mijenjajući sami izgled i ubacivanje
riječi sami ćete shvatiti sve!

Sad u ovom slijedećem programu mi iz znakovnog niza tipa char pretvaramo u string tip ali prvo vršimo
provjeru da li smo unijeli broj...jer ako jesmo program će nas ponovo pitati unos ,taj dio je i najvažniji dio
programa i stavili smo ga u do-while petlju a unutar nje je while i if uvijet koji se vrte za svako slovo
i vrši se provjera,tek na kraju sve spremamo u string objekt i izvodimo operacije nad tim objektom
da bismo vidili dužinu rijeci a ta naredba size() radi samo s string objektima a ne s nizovima char tipa,
a ispitivanje isdigit() se može vršiti samo s nizovima char tipa i na taj način smo spojili oba tipa u jedan program.


/*U OVAJ PROGRAM JE NEMOGUĆE UNIJETI BROJEVE JER SMO SVE PROVJERILI
U DO-WHILE PETLJI ,UPOTRIJEBILI SMO CHAR POLJE ZNAKOVA KOJE SMO
ISPITALI SLOVO PO SLOVO I ZATIM SVE PREBACILI U STRING TIP
I NAKON TOGA PRIMJENILI NAREDBU SIZE(),NAREDBA SIZE RADI SAMO S OBJEKTIMA TIPA
STRING,NE MOŽETE NAPISATI RIJEC.SIZE() JER JE TO POLJE TIPA CHAR
A NAREDBA ISDIGIT NE RADI S OBJEKTIMA TIPA STRING NEGO SAMO S POLJIMA TIPA CHAR
I NA TAJ NAČIN MI SMO POVEZALI NIZ SLOVA(ZNAKOVA) I STRING TIP DA BI
ONEMOGUĆILI UNOS BROJEVA.*/
#include<string>
#include<iostream>
using namespace std;
int main()
{
    char rijec[255];
    string rijec_pretvorena;
    rijec_pretvorena.reserve(256);
    int a;
    int b;
    do
    {
        cout<<"Unesite vase ime i prezime ? "<<endl;
        cin.getline(rijec,255);
        a = 0;
        b = 1;
        while(rijec[a] !='\0')
        {
             if(isdigit(rijec[a]))
             {
               b = 0;
             }
             a++;
        }
   }
   while(b==0);
   cout<<endl;
                              //sad kad smo svako slovo ispitali možemo sve pretvoriti u string
   rijec_pretvorena = rijec;
   cout<<endl;
   cout<<"Vase ime i prezime "<<rijec_pretvorena<<" ima "<<rijec_pretvorena.size()<<" slova i praznina ."<<endl;
   cout<<endl;                                  
       
   

 system ( "pause");
    return 0;
}


Sad jedan rezime string tipa i kakav je unos dozvoljen a kakav nije.....ovaj program
koji ću sad staviti služi samo da vidite razliku unosa string objekta i zašto navodnici imaju tu glavnu
ulogu i kad se koriste znakovi koji se koriste pri unosu char tipa :

#include<string>
#include<iostream>
using namespace std;
int main()
{
string tekst("pozdrav");
string tekst_2(7,'x');
string ime="AnaMarija";
cout<<tekst<<endl;
cout<<tekst_2<<endl;
cout<<ime<<endl;

string a;
cout<<"Mozete unijeti vise rijeci."<<endl;
getline(cin,a);
cout<<a<<endl;
cout<<endl;
string b;
cout<<"Unesite nesto ."<<endl;
cin>>b;
cout<<b<<endl;
//********************************************************
//sad nedozvoljeni oblici
/*string ='r';
string g('t');
string d =22;
string h(9);*/
/*ako ovo izvršite to prevodilac javlja kao grešku
i vidite kakav je pravilan unos u string objekt a koji je
nepravilan  unos,ja sam to stavio kao komentar sve jer je
taj program nemoguće izvršiti*/
string n = "r";
cout<<n<<endl;
//to je moguće jer je string tip unos izmedju navodnika!!!!
 system ( "pause");
    return 0;
}


Izvršite ovaj program i dio po dio ga obradite i shvatite.
Još ono što ću staviti u ovaj post su dvije naredbe od kojih ću jednu sad u programu prikazati
a drugu možda sutra......radi se o naredbi ,u biti mi govorimo o funkcijskim članicama klase string ali pošto još
nismo obradili klase ja govorim o tome kao o naredbama.Naredba (funkcijska članica koja izdvaja samo jednu riječ ili
dio rečenice a mi samo navodimo u zagradama koji dio.Radi se o substr() naredbi gdje mi u zagrade stavljamo ono
što želmo izdvojiti iz neke rečenice.Kako?
Tako da u zagrade na prvo mjesto stavimo od kojeg mjesta ide "rez" a iza zareza  ide broj slova ili praznina i slova koje
želimo izdvojiti!
Sad proučite program i ovo što sam napisao je u tom programu i prikazano :

#include<string>
#include<iostream>
using namespace std;
int main()
{
    string rijec("Mi smo naucili barem malo o ovoj temi!");
    cout<<rijec.substr(7,7)<<endl;

 

 system ( "pause");
    return 0;
}


Evo izvršite ga i sve će vam biti jasno.
Slijedeći program će nam prikazati naredbu(funkciju) koja zamjenjuje dvije rijeci : swap() funkcija(naredba).
Ali o tome kasnije.
Mislim da što se tiče nekih osnova obrade teksta imate dovoljno na ovim tutorijalima,jer slijedeće što bih u postovima započeo su klase i objekti
Naravno vratiti ću se i na obradu teksta i na funkcije ,ali još bih vas htio upoznati s osnovanma objektnog dijela c++-a,i tad bi lakše
svladali spremanje programa u više datoteka ,i same funkcije će onda "bolje leći"....a vratiti ću se i na spremanje brojeva u datoteke.
Stoga još vam znači pokažem swap() funkciju koja zamjeni dvije riječi.
Zatim ide novi post ,o klasama.Netko će reći možda prebrzo,ali mislim da ste dovoljno zreli za njihovo upoznavanje i razumijevanje
ako ste sve dosad prošli.Namjerno preskačem strukture i unije koje ću nakon klasa ukratko objasniti jer imaju sličnosti u mnogo čemu.

Evo i swap() funkcije :

#include<string>
#include<iostream>
using namespace std;
int main()
{
    string prva("prvi");
    string druga("drugi");
    cout<<"Prije nase zamjene"<<endl;
    cout<<" prva: "<<prva<<endl;
   
    cout<<"druga : "<<druga<<endl;
    cout<<endl<<endl;
    prva.swap(druga);//sad vršimo zamjenu
    cout<<"Poslije zamjene :"<<endl;
    cout<<"  prva : "<<prva<<endl;
    cout<<"druga : " <<druga<<endl;
    system ( "pause");
    return 0;
}

Program je u prvoj verziji bio napisan s manipulatorom "bakslah i slovo n "ali forum takav oblik ne prihvaća i stoga tabulatore i takav način pisanja koda mi je nemoguće prikazati
i stoga takav način koda ne mogu objasniti i jedino ste tu uskraćeni.
Malo i sami vježbajte i proučavajte iz ovog programa što funkcija i kako radi swap() zamjenu,u zagradu stavljamo ono što hoćemo zamjeniti
s našom prvom riječju a prije točke stavljamo gdje ta riječ tj. u koji objekt tipa string će funkcija swap izvršiti zamjenu.

Eto to bi bilo toliko u obradi teksta zasad,jer to je jedno upoznavanje ,jer i namjera mi je samo vas upoznati s c++-om
i načinom kako radi program i kako se piše kod,bar približiti razumijevanje koda i logike programa.
Zato slijedeći post posvetiti ću počecima klasa!
Možda prebrzo ali možda i nije ako ste ovo dosad dobro svladali,spremni ste za razumjevanje klasa.

v_maxcpp
Poruka je uređivana zadnji put sub 19.4.2008 20:57 (v_maxcpp).
17 godina
protjeran
offline
RE: C++ tutorijali...

Solidno opisano , samo zašto sam ja prije kada sam se više bavio računalima cijenio "kućne hackere" od školovanih ljudi na faksovima i raznim tečajevima koji se bave programiranjem...

Zato što su znali daleko jednostavnije objasniti neke stvari bez upotrebe stručnih riječi...

Pa ako već običnim neznalcima pokušavate pomoći što manje stručnih riječi koristite, što jednostavnije pišite i ljudi će puno lakše naučiti programirati i zavoliti ga...

Poruka je uređivana zadnji put pet 18.4.2008 16:25 (Busola).
17 godina
neaktivan
offline
RE: C++ tutorijali...
Busola kaže...

Solidno opisano , samo zašto sam ja prije kada sam se više bavio računalima cijenio "kućne hackere" od školovanih ljudi na faksovima i raznim tečajevima koji se bave programiranjem...

Zato što su znali daleko jednostavnije objasniti neke stvari bez upotrebe stručnih riječi...

Pa ako već običnim neznalcima pokušavate pomoći što manje stručnih riječi koristite, što jednostavnije pišite i ljudi će puno lakše naučiti programirati i zavoliti ga...

 Zato sam  napomenuo da su svi autori i ono što ja ne objasnim dobro ili nedovoljno uvijek može netko nadopuniti svojim objašnjenjem
,nikako ne želim da ovaj tut ispadne neki monopol i jedno viđenje c++-a,ako netko želi bolje objasniti pojedini dio ili sve nitko veseliji od mene,ja pokušavam što
bolje i onako kako znam ,naravno ,svi mi griješimo u ponekim pristupima i zato je ovdje sve otvoreno i ako netko misli da mu nisu jasni pojedini dijelovi,slobodno neka kaže koji i ja ću detaljnije i s više komentara objasniti,više primjera ako to žele.Pozdrav svima koji uče!

v_maxcpp
17 godina
neaktivan
offline
RE: C++ tutorijali...

KLASE........OSNOVNO O OOP.



Evo ,započinjem s klasama , osvrt na njih neće biti takav da se svi izgubimo,nego samo ono osnovno.
Takvi će biti i programi,ako tko poželi nešto i dodati,naravno da može!

Klasa je osnova objektnog orijentiranog programiranja(oop).Mi imamo standardne tipove u c++-u kao što
su int,char,float,......ali također imamo i izvedene tipove(koji sami možemo definirati) a tu spada
klasa kao definicija tipa class koja je i ujedno jedna od ključnih riječi c++-a.
Klasa je skup objekata istih svojstava.Klasa je dakle izvedeni tip ,a objekt je primjerak,izvedenica,instanca
klase.Klasa je znači apstrakcija s pomoću koje programer može izvesti svoj vlastiti tip koji se naziva korisničkim tipom!
Za razliku od prije već spomenutih ugrađenih tipova c++-a.
Klasu opisujemo njezinim atributima(sadržajem), i operacijama(ponašanjem) koje se vrše nad objektima te klase.
Podaci unutar definicije klase su atributi a operacije nad objektima su obično funkcije.
Zašto nam klase služe?
Jednostavnije je program koji je ogroman i broji nekoliko tisuća redaka koda podijeliti i na taj način svaki dio za sebe
možemo provjeravati a kad nam zatreba spojimo sve u jednu cjelinu.Ti dijelovi mogu biti klase i na taj način na
jednom projektu može raditi i više programera ,svaki za sebe može pisati i na kraju sve to spojiti.Tako je puno lakše i brže
napisati recimo jednu igru.Svatko radi svoj dio (klasu i objekte) za određenu fazu igre i za to je odgovoran
i kasnije se sve samo spoji.Jako sam to pojednostavio ali kostur je takav.
Manji dio programa koji se koristi na jako puno mjesta možemo staviti u klasu i nataj način je pozivati
kad god hoćemo u programu,prednosti su ogromne.
Naravno pri malim programima od par redaka koda je besmisleno raditi klase ali mi ćemo upravo to raditi
jer iih je tako najbolje razumjeti.
Način na koji ću ja raditi je od jednostavnih primjera(od nekoliko redaka) ka sve kompliciranijim ali ne
isuviše kompliiranim primjerima.Kroz te primjere ćemo se upoznavati s definicijom i deklaracijom klase
,i pojmovima koje sad neću spominjati nego kad e u programu napišu tad ću ih i objasniti.
Zasad toliko dok se ne prihvatim programa.

Evo prvi program koji nam pokazuje kako možemo napraviti jednu jednostavnu klasu :


#include<iostream >
using namespace std ;

 class recenica
   {//ovdje započinjemo klasu
     public:
       void rijec()
         {
           cout << "Ovo je nasa klasa recenica"<< endl;
         }
  };//uvijek ovako zavrsavamo klasu
//*********************************

int main()
{
recenica objekt;//formiramo objekt
objekt.rijec();//pozivamo funkciju tipa void rijec()
cout<<endl;
system ("PAUSE");
return 0;
}


Taj isti program možemo napisati i bez uporabe klase,samo s naredbom cout<<  napravimo ispis,ali
ovako vam jednostavno mogu pokazati kako se klase stavraju.
Definicija a i deklaracija cijele naše klase je narno izvan main funkcije jer je u main funkciji pozivamo.
Započinje naravno s ključnom riječju class i zatim dajemo ime našoj klasi(neko lagano i logično) kao što ih
dajete i varijablama ...zatim otvaramo naš blok u kojem ćemo imati public dio u ovom slučaju,o drugim dijelovima
ćemo kasnije.
U public :
dijelu koji se tako piše----public :    -----dvotočka obična.
Tamo se nalazi samo jedna funkcija tipa void koja ispisuje tekst.
Nalazi se u svom bloku jer se odmah po pozivu i izvršava ,nema return tip jer je void().
Na kraju klasu završavamo s vitičastom zagradom i obvezno s točka zarez!!!!!

Sad otvaramo main () dio glavnio program i da bismo došli do
naše funkcije moramo stvoriti neki put do nje(instancu)...taj put mora biti istog tipa
i zato je naša klasa ujedno i tip ,tako stvaramo objekt pa naše klase,usporedite to  isto kao
kad deklarirate običan tip i običnu varijablu,imena se biraju na isti način,samo ovdje se radi o korisničkom tipu
koji smo mi stvorilli a to je ime naše klase  recenica.
Znači sad kad je stvoren objekt,pomoću njega možemo doći do funkcije  void rijec().
Pristup funkciji ili metodi u našem slučaju jer se funkcije koje se pri pozivu same izvršavaju su metode,
pristup je preko objekta objekt pa točka i zatim naziv funkcije : objekt.rijec();
....naravno obvezno se završava s točkom zarez!
Točka je obvezna!Razdvaja objekt od funkcije koja se vrši nad objektom.
Ovaj oblik deklaracije recenica objekt;
je
usporediv s recimo int objekt;  ili char objekt;    ali ovdje se radi znači o ugrađenim tipovima
a mi smo sami (korisnički) stvorili svoj tip.
I sad tim objektom (instancom) pristupamo funkciji.
Na isti način kako možemo formirati više varijabli istog tipa tako možemo i formirati
više objekata našeg korisničkog tipa od naše klase i pozivati funkciju s svakim objektom.
Više različitih objekata(imena)ali isti tip(naša klasa) :

#include<iostream >
using namespace std ;
class recenica
  {
    public:
     void rijec()
        {
         cout << "Ovo je nasa klasa recenica"
         " ali u funkciji void"<< endl;
        }
//mozete i ovako pisati tekst!!!
  };
int main()
{
recenica objektprvi;
recenica objektdrugi;
recenica objekttreci;

objektprvi.rijec();
objektdrugi.rijec();
objekttreci.rijec();
cout<< endl;
system ("PAUSE");
return 0;
}


Također mi možemo mijenjati i ime naše klase kako hoćemo ali logika pri tome mora biti stvar izbora
iako možemo bilo što staviti :

#include<iostream >
using namespace std ;
class bezveze
  {
    public:
     void rijec()
        {
         cout << "Ovo je nasa klasa recenica"
         " ali u funkciji void"<< endl;
        }
//mozete i ovako pisati tekst!!!
  };
int main()
{
bezveze objektprvi;
bezveze objektdrugi;
bezveze objekttreci;

objektprvi.rijec();
objektdrugi.rijec();
objekttreci.rijec();
cout<< endl;
system ("PAUSE");
return 0;
}


Naravno mi možemo samo s jednim objektom tipa naše klase pozivati više funkcija
unutar naše jedne klase...ovaj program to pokazuje.
Primjetite da su i funkcije drugog imena ali objekt je jedan i pomoću njega pozivamo svaku funkciju,vidite da točka
koja razdvaja objekt od funkcije ima svrhu pozivanja funkcije koja će se vršiti nad objektom tipa naše klase,ta točka
je način pristupa članovima klase,u našem slučaju klasa ima zasad samo public ili javni dio,dio koji je svima vidljiv,da se tako izrazim.
O tome će još biti riječi.

#include<iostream >
using namespace std ;
 class rijec                 //formiramo klasu rijec
   {
     public:                 //koja ima public naredbu(dio)
       void prva()          //funkcija tipa void sa naredbom cout
        {
          cout << "Ovo je prva funkcija"<< endl;
        }
        void druga()         //druga funkcija unutar iste klase
        {
          cout << "Ovo je druga funkcija"<< endl;
        }
       void treca()          //treca funkcija
         {
          cout << "Ovo je treca funkcija"<< endl;
         }
   };                          //zavrsetak nase klase
int main()
{
rijec objekt_a;               //formiramo objekt samo jednom
objekt_a.prva();              //koristimo ga za poziv nasih funkcija
objekt_a.druga();
objekt_a.treca();
cout<< endl;
system ("PAUSE");
return 0;
}


Također s jednom formiranim objektom možemo pozivati i više puta jednu funkciju unutar klase:

#include<iostream >
using namespace std ;
class recenica_prva
{
  public:
    void evo()
       {
         cout << "Evo ga!"<< endl;
       }
};
int main()
{
cout<<"Objekt koristimo prvi put!"<<endl;
recenica_prva ob; // samo jednom formiramo objekt!!!
cout<<endl;
ob.evo() ;// koristimo ga prvi put
cout<<endl;
cout<<"Objekt koristimo drugi put!"<<endl;
ob.evo(); //koristimo ga drugi put
cout<<endl;
cout<< endl;
system ("PAUSE");
return 0;
}


Malo vježbajte ,mijenjajte program u smislu da sami mijenjate imena i koliko puta je pozivate,igrajte se s pisanjem
jer tako vam ulazi u naviku pisanje i oblik kako se pišu klase ili bilo što u kodu.

U programu je moguće imati i više klasa ,naravnoi više objekata koji su instance tih naših klasa.
Program to prikazuje a i ono što je u komentarima ,tako javlja grešku,objašnjeno u komentaru :

#include <iostream>
using namespace std;
class prva
{
      public:
             void funk_1()
             {
                  cout<<"Ovo je nasa prva klasa!"<<endl;
             }
};
class druga
{
      public:
             void funk_2()
             {
                  cout<<"Ovo je nasa druga klasa."<<endl;
             }
 };               
int main()
{
    prva objekt_1;
    objekt_1.funk_1();
    cout<<endl;
    druga objekt_2;
    objekt_2.funk_2();
    cout<<endl;
   //objekt_1.funk_2();
   //ovakav poziv ne možete napraviti jer
   //28 C:\Radni\klase_bug\klasebug.cpp 'class prva' has no member named 'funk_2'
   //sto znaci da klasa prva nema članicu funk_2
   //sad vidite da sve mora biti istog tipa ili imati istu pripadnost
    system("PAUSE");
    return 0;
}

Također mi možemo imati isto ime za funkciju a dvije klase i preklapanje imena funkcije :

#include <iostream>
using namespace std;
class prva
{
      public:
             void funk_1()
             {
                  cout<<"Ovo je nasa prva klasa!"<<endl;
             }
};
class druga
{
      public:
             void funk_1()
             {
                  cout<<"Ovo je nasa druga klasa."<<endl;
             }
 };               
int main()
{
    prva objekt_1;
    objekt_1.funk_1();
    cout<<endl;
    druga objekt_2;
    objekt_2.funk_1();   //ovdje vidite isto me ali različit objekt
    cout<<endl;
   
    system("PAUSE");
    return 0;
}

.....ali je zovemo s drugim objektom koji pripada pravoj klassi za tu funkciju.
Vidite kako se igramo s jednostavnim primjerima klasa ali sad ćemo malo po malo
komplicirati i uvoditi i druge pojmove koji su specifični za OOP.

Sad ćemo napisati dva programa u kojima imamo članove klase u private i public dijelu jedne klase.
U private dijelu se nalazi varijabla a u public dijelu su dvije funkcije,u prvom programu je jedana funkcija
void tip a druga int tipa,a u drugom dijelu su obe void tipa.Član u private dijelu je dohvatljiv samo članovima iste klase
ali ne izvan te klase,naravno sve to objasnim još podrobnije ali sad evo programa i proučavajte
ih dok ih ne objasnim ,a i međusobnu komunikaciju private i public dijela kao i komunikaciju kls glavnim programom.

#include<iostream >
using namespace std ;
class g_oblik
{
      private:
              int x;
                  public:
                         void ime()
                         {
                              cout<<"Povrsina : "<<endl;
                         }
                         int povrsina(int a,int b)
                         {
                             x = a*b;
                             return(x);
                         }   

};
int main()
{
    g_oblik pr;
    pr.ime();
    //pr.povrsina(4,7);  //ovako ne može jer nije void()
    cout<<pr.povrsina(4,7);//ovako može jer sad imamo ispis jer se radi o return tipu
    cout<<endl;
system ("PAUSE");
return 0;
}

Sad isti taj program ali void tip obe funkcije,proučite sad malo i to ,a private dio posebno objasnim.

#include<iostream >
using namespace std ;
class g_oblik
{
      private:
              int x;
                  public:
                         void ime()
                         {
                              cout<<"Povrsina : "<<endl;
                         }
                         void povrsina(int a,int b)
                         {
                             x = a*b;
                            cout<<x;
                            cout<<endl;
                         }   

};
int main()
{
    g_oblik pr;
    pr.ime();
    pr.povrsina(4,7);  //ovako  može jer je void()
    //cout<<pr.povrsina(4,7);//ovako ne može   jer se radi o return tipu
    cout<<endl;
system ("PAUSE");
return 0;
}


Malo proučavajte.
Sad prije još programa i objašnjenja istih malo i teorije.
Privatan(private:) - znači da te članove klase unutar private dijela može koristiti samo članovi iste klase,nitko izvana!
Public(public:) - Znači može je koristiti i imati pristup tim članovima klase i druge klase ,ona je vidljivi dio klase.
protected:    taj dio posebno objasnim jer se protected unutar klase koristi kad se radi o naslijeđivanju između klasa ako želimo da private dio jedene
klase bude i dio druge klase tad stavljamo te podatke ili objekte u protected dio,public dio jedne klase naslijeđuju sve klase koje žele taj dio naslijediti
a private ostaje samo klasi u kojoj je primarno i definiran.

Zasad toliko ali kroz programe se najlakše može o tome naučiti ,tako ćemo i napraviti.
To sve spada u kontrolu prava pristupa unutar samih klasa,jer programer može odlučiti dio sakriti za javnost a dio pokazati.

Sve ovo će biti jasnije kroz programiranje ,tako da ću kroz programe bolje to objasniti.

Dosad smo samo u glavnom programu pozivali neku članicu ili funkciju a kad bismo htjeli iz main
programa pristupiti zaštićenom privte dijelu i rezultatu direktno preko objekta te iste klase vidjet ćete da je to
nemoguće.Naprimjer : pr.x;      i vidjet ćete da je to nemoguće,prevodilac javlja grešku.Zato mi moramo ostvariti
pravilo, da članovi unutar iste klase mogu koristiti ono što je u private dijelu a varijable i objekti izvan te klase to ne mogu.
Zato je to private(zaštićen) dio.
Naravno sve su to svojstva OOP u c++-u ali tek kad to svladamo nešto ću reći i o tim svojstvima koja
imaju i svoje ime(enkapsulacija,polimorfizam,naslijeđivanje) ali o tome malo kasnije.
Da bismo pristupili varijabli x u private dijelu moramo napraviti tj.deklarirati varjablu u public dijeli iste klase
i sad pomoću nje pristupiti x varijabli i tad možemo preko objekta iz vanjskog dijela(main) funkcije posredstvom
varijable pristup doći do x varijable i rezultata koji je u nju sprmljen!!!!
Sve ovo što sam napričao vam se nalazi u programu :
#include<iostream >
using namespace std ;
class g_oblik
{
      private:
              int x;
                  public:
                         int pristup;//ovdje deklariramo varijablu za komunikaciju s private dijelom
                         void ime()
                         {
                              cout<<"Povrsina : "<<endl;
                         }
                         int povrsina(int a,int b)
                         {
                             x = a*b;
                             pristup = x;
                            return (x);
                            cout<<endl;
                         }   

};
int main()
{
    g_oblik pr;
    pr.ime();
    cout<<pr.povrsina(4,7);
    cout<<endl; 
    cout<<pr.pristup;                //pomocu varijable pristup smo mogli
                                    // unutar klase prici privatnom dijelu same klase
                  //cout<<pr.x;//ovakav direktan pristup ne ide jer iz glavnog programa
                               //ne možemo pristupiti privatnom (nevidljivom dijelu) i zato
                               //to radimo iz public dijela preko varijable pristup....tako možemo
    cout<<endl;
system ("PAUSE");
return 0;
}


Evo proučite program i pogledajte kako smo riješili komunikaciju s private dijelom ali samo unutar klase.

Naravno ,kad pozivamo void funkciju mi samo navedemo njeno ime i ona se izvršava jer nije return tipa i ništa ne vraća
 a int tip je funkcija koja nešto vraća,e sad da bi vam to pokazao naravno proučičete program i  kako
to return tip funkcije nešto vraća.

#include<iostream>
using namespace std ;
class vjezba
{
   private:
     int c;
      public:
       int funkcija1(int a,int b)
          {
            c = a* b;
            return(c);
          }
       int funkcija2(int a,int b)
          {
            c = a* b;
            return(a);
          }
       int funkcija3(int a,int b)
          {
            c = a* b;
            return(b);
          }
};
int main()
{
vjezba r;
cout<< "return c daje :"<< r.funkcija1(3,4)<<endl;
cout<< "return a daje :"<< r.funkcija2(3,4)<<endl;
cout<< "return b daje :"<< r.funkcija3(3,4)<<endl;
cout<< endl;
system ("PAUSE");
return 0;
}


Sad ga malo proučavajte i nije teško vidjeti da ono što napišemo s return naredbom to nam se i vrati.
Za razumijevanje klasa je bitno poznavanje funkcija i njihovih deklaracija i definicija a također prije u tutorijalu(tamo gdje su funkcije) sam objasnio što je to preopterećenje operatora i prijenos argumenata i parametara u
funkcijama a i kolega je sad sve to malo i ponovio.Stoga  ja sad funkcije ne objašnjavam u klasama,samo ih upotrbaljavam kao dio klasa koje mi sami stvaramo.
Naravno koristimo funkcije povratnog tipa i tipa void() koji ništa ne vraća. U ovom gornjem primjeru zorno se prikazuje
što radi funkcija return tipa i na koji način mi stavljamo i poštivamo parametre stavljajući brojeve u zagrade zA RAZLIKU od void funkcije koju samo pozivamo
i ona se sama izvršava pa je to jedan oblik metode!

U ovom slijedećem programu prikazano je pozivanje void funkcije ,na koji načn smo je pozvali,u oba programa mi moramo definirati objekt tipa naše klase(u main dijelu) da bismo pristupili tim funkcijama i tad funkcije vrše radnju nad objektom a razdvaja ih točka koja je način na koji pristupamo članicama klase!!!

#include<iostream >
using namespace std ;
class vjezba
{
  private:
    int c;
    int a;
    int b;
        public:
        void unos()  //vidite da sve radnje od početka do kraja izvršavamo unutar void funkcije
            {
              cout<<"Unesite vrijednost a :"<<endl;
              cin>>a;
              cout<<"Unesite vrijednost b :"<<endl;
              cin>>b;
            }
        void funkcija()
            {
              c=a * b;
               cout<<"Povrsina je :"<< c<< endl;
            }
};
int main()
{
vjezba pr;    //obvezatno stavramo objekt
pr.unos();     //poziv void() funkcije uvijek u ovom obliku
pr.funkcija();  //sad ih samo po redu pozivamo i igramo se s njima!!!
cout<< endl;
system ("PAUSE");
return 0;
}


Znači sad nije moguće pr.unos(2,4);    ..........   jer je funkcija void tipa!!!!!!!!!!
...nego prazne zagrade jer ništa ne vraća!!!
Naravno nije moguće ni cout<<pr.funkcija(); ................... jer se ispis vrši već unutar funkcije koju smo stvorili ,vidite razliku između
void i int tipa.....ta dva programa koja su iznad vam pokazuju razliku void() funkcije i int tipa funkcije unutar klasa!!!


U ovom slijedećem programu smo napravili kombinaciju void i int funkcije,komunikaciju public i private dijela i u glavnom
programu to sve koristimo za još jedan izračun :

#include<iostream>
using namespace std;
class vjezba
{
  private://  ovdje imamo samo varijable iako u private dijelu mogu biti i funkcije!!!!
  int c;
   int a;
 int b;
     public:        //public dio korist private varijable i to je samo njemu dozvoljeno
      void unos()   //u public dijelu imamo dvie funkcije(void i int tipa)
        {
          cout<<"Unesite vrijednost a :"<<endl;
          cin>>a;
          cout<<"Unesite vrijednost b :"<<endl;
          cin>>b;
         }
      int funkcija()
         {
           c=a * b;
           return(c);
         }
};
int main()
{
int c;     //zbog toga što je c u private dijelu mi u glavnom programu možemo to napraviti!!!!
int g;
vjezba objt;
objt.unos();
cout<<"Unesite varijablu c :"<<endl;
cin>>c;
g=c * objt.funkcija();   //taj c koristimo za još jedan izračun.
cout<<"Ukupni rezultat je :"<<endl;
cout<<g<<endl;
cout<< endl;
system ("PAUSE");
return 0;
}


Malo ga proučite prije nago još par rečenica njemu posvetim,ali kad razmislim napisao sam objašnjenja u komentarima iznad.
Vježbanjem i pisanjem ovih kodova ćete naučiti,to nitko umjesto vas ne može!!!


Evo primjer s dvije void() funkcije u kojima se sve odigrava ,a mi ih u glavnom programu samo pozivamo
s objektima tipa naše klase!!!!

#include<iostream >
using namespace std ;
class vjezba
{
   private:
    int c;
    int a;
    int b;
    int g;
    int h;
         public:
         void unos()
         {
           cout<<"Unesite vrijednost a :"<<endl;
           cin>>a;
            cout<<"Unesite vrijednost b :"<<endl;
           cin>>b;
           cout<<"Unesite vrijednost c :"<<endl;
           cin>>c;
         }
         void funkcija()
         {
           g=a * b;
           cout<<"Rezultat umnoska a*b je :"<<g<<endl;
           h= g*c;
           cout<<"Sad umnozak g i c je :"<< h << endl;
         }
};
int main()
{
vjezba pr;
pr.unos();
pr.funkcija();
cout<< endl;
system ("PAUSE");
return 0;
}


Ovdje kad sve napravimo unutar naše klase ,u glavnom programu ih samo po redu pozivamo!!!

Sve funkcije koje su bile int tipa također mogu biti i float ili double tipa(povratne vrijednosti) tako da ih sami sastavite ako ćete
raditi s decimalama!

#include<iostream >
using namespace std ;
class g_oblik
{
  private:
    float c;
      public:
        void ime()
            {
                cout << "Povrsina "<< endl;
                cout<<endl;
            }
           float povrsina(float a,float b)
              {
                c = a* b;
                return(c);
              }
};
int main()
{               
float a1;
float b1;
g_oblik pr;
pr.ime();     //nas naslov  
cout<<"Unesite a1 :"<<endl;
cin>>a1;
cout<<"Unesite b1 :"<< endl;
cin>> b1;
cout<<"Rezultat je : "<<endl;
cout<<pr.povrsina(a1,b1);     //return je tipa pa možemo unositi!!!!

cout<<endl;
cout<< endl;
system ("PAUSE");
return 0;
}


Evo kombinacija void() i float tipa!!!!!
Vjerujte nije teško ako više puta ispišete programe koji su ovdje napisani da uđete bar u "štos" i razumijevanje klasa i funkcija
i njihovih kombinacija.


Dobro proučite sve dosad što smo prikazali jer sad idemo malo kompliciranije ali to ne danas.

DEKLARACIJA I DEFINICIJA


Ali ipak malo ponovite funkcije i njihovo razdvajanje deklaracije i definicije jer  je to sličo i s klasama
kao što čete vidjeti iz ovog primjera pa ga proučavajte dok se ne vratim.

#include<iostream >
using namespace std ;
//************************************
//DEKLARACIJA(OBJAVA SVEGA STO CEMO UPOTRIJEBITI)
class racun
{
   private:
    int c;
      public:
       int funkcija(int a,int b);
};
//*************************************
//**************************************
//DEFINICIJA FUNKCIJE KOJU SMO DEKLARIRALI!!!
int racun::funkcija(int a,int b)
{
c= a*b;
return(c);
};
//*************************************
int main()
{
cout<<"Naslov"<< endl;
racun pr;
cout<<"Rezultat je : "<<endl;
cout<<pr.funkcija(4,5)<< endl;
cout<< endl;
system ("PAUSE");
return 0;
}


Mi smo dosad u svim programima unutar klasa koje smo stvarali deklarirali i

definirali varijable i funkcije.
Mi to možemo i odvojiti,na način da se deklaracija nalazi na jednom mjestu a

definicija na drugom mjestu.
Sve smo znači radili u okviru ovog bloka :
class ime_klase
     {
           // ovdje javni i privatni dijelovi
           //kao i njihove varijable ali i definicije i deklaracije funkcije
    };    //ovdje sve završimo..

Ali,mi to možemo i razdvojiti :

class ime_klase
    {
       private:
        int varijable;
       public:
        int varijable;
        int funkcija(parametri);   //ovdje je samo deklaracija funkcije(objava)
    };  //završetak naše deklaracije varijabla i funkcija unutar klase

Sad tek dolazi definicija :
 

  int ime_klase::ime_funkcije(parametri)
        {
               //sad ovdje naš kompletan sadržaj što funkcija radi!
         }; // završetak definicije

Sad tek dolazi glavni program.

int main()

{

}


......naravno mi smo sad razdvojili definiciju i deklaraciju koja vama u ovako malom

programu besmisleno izgleda što je i istina .To razdvajanje nam služi u velikim
programima kad imamo mnoštvo deklaracija a prilično velike definicije ,tad se to

još dijeli i u posebene datoteke.....definicije u jedne a deklaracije u druge i sve to
povežemo i uklučimo u glavni program.Sve to će vam biti jasnije kad se napišem

jedan takav program što ču i učiniti na kraju izlaganja o klasama i na taj način čete
bar približno vidjeti kako se to radi.

Duple dvotočke su obvezne pri razdvajanju imena klase i imena funkcije!
s lijeve strane je ime klase a s desne strane ime i parametri funkcije.
Naravno na početku pišemo o kojem tipu funkcije se radi ,int ili float ili void!
Deklaracija uvijek završava s točkom zarez,a definicija naravno ima svoj blok
u kojem je sadržaj funkcije!!!!
 Sad ste znači i to naučili...kako razdvojiti definiciju i deklaraciju.
Slijedeće o čemu čemo pričati a možda i naučiti su konstruktori.

KONSTRUKTORI (u klasama)

Konstruktor je funkcija ili metoda koja se izvršava čim formiramo objekt.
Konstruktor ima isto ime kao i klasa.
Konstruktor može imati i parametre što ga stavlja u rang s funkcijama.
Konstruktor nema tip.
Ne može biti ni void tip čak.
Konstruktor može biti u  private i public dio.
Može ih biti i više unutar jedne klase.
Konstruktor podliježe pravilima preklapanja imena kao i kod funkcija.
Konstruktor nema tip ali njegovi parametri mogu imati tip int ili float ili sam konstruktor
može imati kao ulaz void tip  npr ime_konstruktora(void).
Što je isto kao i funkcija tipa void ali ovo je konstruktor a ne funkcija.
_____________________________________________________________________________________
Da bi samo dio pravila o konstruktorima koje smo dosad napisali usvojili ,slijedi program i programi koji sve to
lijepo nama pokazuju ,naravno sve su to mali programi da bi što bolje shvatili konstruktor :

#include<iostream >
using namespace std ;
class izracun
{
    private:
      int a;
       int b;
          public:
           izracun()             //OVDJE FORMIRAMO KONSTRUKTOR
             {
               cout << "Stranica a :"<< endl;
               cin>> a;
               cout << "Stranica b :"<< endl;
               cin>> b;
             }
          int povrsina()
             {
               return(a*b);
             }
};
int main()
{
izracun t;     //čim smo naveli ime klase i ime objekta pozvali smo konstruktor i on se izvršio automatski
cout<< "Povrsina je : " << t.povrsina() << endl;    //ovdje pozivamo našu funkciju tipa int
cout<<endl;
system ("PAUSE");
return 0;
}


Sad malo proučite program prije nego dio po dio objasnim.Konstruktori su idealni pri pozivanju nekih oblika ili
kretanja kad se rade igre jer se izvršavaju odmah samo pri stavranju objekta.Recimo napravite funkciju koja
nam simulira pucanje i klasa se zove pucanje i vi samo navedete pucanje.sad ....i to je to.
(sad je objekt a pucanje konstruktor).Mogućnsti su velike.

izracun()             //OVDJE FORMIRAMO KONSTRUKTOR


U public dijelu smo vidjeli kako se formira konstriktor,kao i funkcija
ali nema tipa ,imena je klase,u prazne zagrade možete staviti i void jer se u biti radi o konstruktoru koji ima
izvršenje unutar sebe,nemamo return.

izracun t;     //čim smo naveli ime klase i ime objekta pozvali smo konstruktor i on se izvršio automatski


Unutar main() dijela znači konstruktor se izvršava čim smo oformili objekt ,u našem slučaju imena t.
Sad samo pozivamo funkciju tipa int da završi naš program jer se argumenti iz izvršenja konstruktora proslijeđuju parametrima
naše int funkcijie.I to je to.
Sad će slijediti program s više konstruktora:

#include<iostream >
using namespace std ;
class izracun  {
   private:
     int a;
     int b;
       public:
         izracun() //OVDJE FORMIRAMO KONSTRUKTOR
            {
               cout << "Stranica a :"<< endl;
               cin>> a;
                cout << "Stranica b :"<< endl;
                cin>> b;
            }
         izracun(int x,int y)// i ovdje je konstruktor
            {
                 a=x;
                b=y;
              }
         int povrsina() { return(a*b);}
};
int main()
{
izracun t;
cout<< "Povrsina je : " << t.povrsina() << endl;
cout<<endl;
izracun t2(4,3);
cout<<"Za t2(4,3) povrsinaje :"<< t2.povrsina() << endl;
system ("PAUSE");
return 0;}

Sad malo sami proučavajte što se radi u ovom programu jer ako ste dobro sve dosad svaladali ovo vam treba biti
"mačiji kašalj"  sad! Iako ču opet nekoliko riječi reći i o ovom programu,ali ne trenutno.
U ovom programu s dva konstruktora vidimo da smo jedan konstruktor posatvili s dva parametra koja se
"hrane" s dva argumenta unesena iz prvog konstruktora i na kraju pozivamo funkciju t2.površina;
....eto probajte sami sad već shvatiti kako konstruktori rade bar u ovim jednostavnim primjerima jer ako i njh dobro
svladate mislim da vam svladavanje kompliciranijih primjera više neće biti teško.

NASLIJEĐIVANJE

Priznajte da je lijep naslov ,kao da se radi o medicini i prijenosu gena ,vjerujte ima sličnosti.
Naravno u ovom dijelu prvo ćemo napisati program a tek onda objasniti o čemu se radi.
Primjetite samo da se radi o klasi koja želi nešto naslijediti ona mora biti prijatelj te klase a originalna klasa
da bi dopustila svoje naslijeđe prijateljskoj klasi ne smije tj.mora imati dio koji se može naslijediti ,naravno to je public dio
ali i potected dio koje koriste obe klase,što znači da se protected dio ponaša kao i private samo što njega ,za razliku od private
dijela, može koristiti i prijateljska klasa!Znači najednostavnije vam je zasad shvatiti ovako : ako neku klasu želimo
koristiti unutar druge klase(bar neku njenu funkciju) tad umjesto private dijela u tu klasu stavite protected dio.Na taj način ono
što je u protected dijelu mogu koristiti prijateljske klase.
Ja sam ovo pojednostavio da bolje shvatite odnose public,private,protected jer mislim da je tako bolje nego da ulazim
u neke definicije u kojima se gubimo.
Evo program :
#include <iostream>
using namespace std;
class zbrajanje
{
      protected:    //varijablu moramo staviti u protected dio da bi mogli primjeniti naslijedjivanje
                int x;
      public:
             void unesite()
             {
                  cout<<"Unesite jedan broj :"<<endl;
                  cin>>x;
             }
             int zbroj()
             {
                 return (x+x);
             }
};  // ovdje zavrsavamo nasu klasu zbrajanje broja koji smo unijeli

class zbrajanje_2 : public zbrajanje
{
      public:
             int izracun()
             {
                 return (x+x+x);
             }
};  //zavrsetak klase koja naslijedjuje klasu zbrajanje i njenu funkciju                           

int main()
{
    zbrajanje zbroj_1;
    zbroj_1.unesite();
    cout<<"Zbroj nasa dva unesena broja je : "<<zbroj_1.zbroj()<<endl;
    cout<<endl<<endl;
   
    zbrajanje_2 zbroj_2;
    zbroj_2.unesite();
    cout<<"Sad zbroj iz prve klase mnozimo s našim brojem koji unesemo : "<<zbroj_2.izracun()<<endl;
    cout<<endl;
     system("PAUSE");
    return 0;
}

U ovom dijelu se vrši naredba za naslijeđivanje koja naslijeđuje public dio
naše prve klase,ali imamo pozivanje vlastite funkcije druge klase u main dijelu,znači iskoristili smo jednu funkciju unesite ()  iz
prve klase a iz druge novu funkciju ,vlastitu funkciju druge klase.

class zbrajanje_2 : public zbrajanje


Vidite stvaramo objekt za našu drugu klasu i pošto je ta klasa naslijedila funkciju iz public dijela prve klase mi je možemo
koristiti tako da je pozovemo :
zbrajanje_2 zbroj_2;
    zbroj_2.unesite();



A ovdje koristimo funkciju iiz naše druge klase  :  cout<<"Sad zbroj iz prve klase mnozimo s našim brojem koji unesemo : "<<zbroj_2.izracun()<<endl;

Vidite kako se možemo nadograđivati i ne pisati stalno jedno te isto kad nam nešto zatreba iz nekih drugih klasa,tad samo
tu klasu postavimo kao prijatelja i omogućimo pristup pomoću protected dijela jer u tom dijelu se nalazi varijabla koja se koristi u public dijelu
ali sad je može koristiti i prijateljska klasa jer joj tako omogućavamo pristup.
Da ste ovaj dio :
protected:    //varijablu moramo staviti u protected dio da bi mogli primjeniti naslijedjivanje
                int x;
Stavili u private dio ,ne bi se ništa moglo naslijediti iz tog private dijela jer private omogućava
pristup samo toj klasi u kojoj se nalazi.

Upamtite samo puno vježbanja jednih te istih izraza i naredbi doprinosi da sve shvatite!!!!
Evo s ovim kratkim osnovnim pregledom klasa i pogledom koji je jednostavan završavam s ovim postom o klasama
jer dalje će biti malo teži program i veći,također će se raditi o klasama i spremanje u datoteke,tj. deklaraciju u jednu datoteku ,definiciju u
drugu ,a sve to uključujemo u glavni program,znači napraviti ćemo jedan program i razdvojiti ga u više datoteka(cpp,.h.i main.cpp).
Sve to slijedećem postu.To će biti još bolje upoznavanje s objektnim pristupom u c++-u!
Možda prije toga se u kratkom postu osvrnem na spremanje u datoteke brojeva i slova,vidjet ću što mi
dođe prije.Eto ,to vas čeka od mene u slijedećim postovima.


Znači korisničke tipove i njihova imena mi biramo!!!
To je znači izvedeni tip u c++-u!
To bi bilo zasad sve.

v_maxcpp
Poruka je uređivana zadnji put čet 24.4.2008 20:54 (v_maxcpp).
17 godina
neaktivan
offline
C++ tutorijali...

Svaka čast čovjeće.... koliko si toga već napisao..... ali da se i ja priključim:


OPTEREČENE FUNKCIJE I TEMPLATE-SI


Ponekad jednu funkciju možemo trebati u raznim uvjetima, bilo to drukčiji tipovi podataka, drukčija lista parametra, ili čak i drukčija sama funkcija...
Preopterečene funkcije, da bi se tako zvale, jedino moraju imati isto ime i biti u istom Scop-u (U istoj klasi, namespace-u i sl.)...

Tako, na primjer, funkciju koja vraća manji od dva podatka može biti potrebna za više podataka:


inline int min (int a, int b) {
    return (a < b) ? a : b;
}


Problem je ako vam treba ista funkcija, ali za recimo, float podatke... to se može rješiti ovako:

inline int min (int a, int b) {
    return (a < b) ? a : b;
}


inline double min (double a, double b) {
    return (a < b) ? a : b;
}



inline float min (float a, float b) {
    return (a < b) ? a : b;
}


//ali za znakovni niz (char *) koristimo funkciju strcmp
inline char * min (char * a, char * b) {
    return (strcmp (a, b) < 0) ? a : b;
}



Ovo su sve preopterečene funkcije.... vidi se da su sve ustvari iste (osim za char * tip podataka). Uređivanje može biti nezgodno, jer moramo mjenjati svaku funkciju posebno, a i takve funkcije čine vaš kod neurednim.... rješenje za to su template-si.


Templatei se mogu iskoristiti jer mogu zamjeniti jedan tip podataka pri definiciji funkcije (koji, ili compiler shvati automatski, ili vi kažete koji).... ustvari  da ne otežavam, evo primjera:

template <class tip>
inline tip min (tip a, tip b) {
    return (a < b) ? a : b;
}

int main (int argc, char **argv) {
    float a, b;
    cin >> a >> b;
    cout << min (a, b);

    return 0;
}

 

Sada... kako rade templatei.... prvo se definira privremeni tip ili tipovi (definiran(i) u <> zagradama kod template-a).  U ovom slućaju tip koji se šalje je float, te se "tip" u gornjoj funkciji mjenja sa float...

Template-i mogu imati i više članova.... tako npr. možemo uspoređivati 2 tipa:


template <class tip, class prvi, class drugi>
inline tip min (prvi a, drugi b) {
    return (a < b) ? a : b;
}

int main (int argc, char **argv) {
    int a;
    float b;
   
    cin >> a >> b;
    char c = min (a, b); // rezultat se sprema u char, varijablu.

    cout << c;
    cout << min <char> (a, b) //ima isti učinak kao i ovo gore.... ovaj puta se rezltat ne sprema u varijablu,
                              //pa se mora manualno navesti koji tip želite (kako će drugačije prevoditelj znati?)
                              //ostala 2 se automatski jer se zna tipovi parametra
    return 0; 
}



Evo to bi bilo to ukratko.... ali postoje situacije kada se treba preopteretiti i template.... npr. probajte sa postojećom funkcijom uspoređivati podatke char  *.   Javiti  će vam grešku da operator  <  nije definiran za char * tip podataka.... znaći za char * ide posebna funkcija...


template <class tip>
inline tip min (tip a, tip b) {
    return (a < b) ? a : b;
}


template <>    //  ova je linija potrebna za gcc / g++ kompajlere verzije 4 ili više.
inline char * min (char * a, char * b) {
    return (strcmp (a, b) < 0) ? a : b;
}





KLASE I TEMPLATE-SI

Templati se mogu koristiti i za klase.... ustvari, sve je isto kao i sa običnim templatima.... evo primjer (klasa koja služi za operacije sa nizovima):

template <class tip>
class superniz {
    tip *a;
    int n;

public:
    superniz (int N, tip v = 0) {

        n = N;
        a = new tip[n];
        for ( int i = 0; i < n; i++)
             a[i] = v;
    }

    ~superniz () { delete [] a; }
   
     int trazi (tip x) {
       bool b = 0;
       for (int i = 0; i < n && !b; i++)
          if (a[i] == x) b =1;
       return i-1;
    }

    void izbrisi (int x) {
       for (int i  = x+1;  i < n;  i++)
            a[i-1] = a[i];
       
        n--;
    }

    void dodaj (tip x) {
        a[++n] = x;
    }

    void set (tip v, int i) { a[i] = v; }

    void sort () { stl::qsort (a, a+n-1); }

    tip operator[] (int i) {
        return a[i];
    }
};


int main ( int argc, char **argv) {
    superniz<char> a (10, 'a'); // postavlja 10 elemenata tipa char na 'a';
    a.set(2, 'z');
    a.dodaj ('s');

    a.dodaj ('c');
    a.sort ();
    a.izbrisi(9);
   
    for (int i = 0; i < 10; i++)
       cout << a[i] << "\t"; // ispisuje: a a a a a a a a a s z
 
    return 0;
}

//nadam se da nisam nigdje pogrješio...

Poruka je uređivana zadnji put uto 22.4.2008 15:38 (Jazzfan).
 
0 0 hvala 0
17 godina
neaktivan
offline
C++ tutorijali...

svaka vam čast ljudi kakva to treba biti volja da to ideš pisat, mislim da bi vam Bugovci trebali poslat majce


http://www.freewebs.com/horagio/
Moj PC  
0 0 hvala 0
17 godina
neaktivan
offline
RE: C++ tutorijali...

I tebi pohvale velike jer veselim se svima koji na taj način žele prenijeti nešto od sebe!
Hvala na trudu kojeg iznimno cijenim 
Jazzfan

Hvala svima na eto podršci,nadam se da nešto  netko i nauči iz ovih tuta.

v_maxcpp
Poruka je uređivana zadnji put pon 21.4.2008 16:49 (v_maxcpp).
17 godina
neaktivan
offline
C++ tutorijali...

najbolje je dok sam svom prijatelju rekao da ovdje ima tutorijale jer je htio nešti u C++ naučit, a on meni danas veli da mu je to preveć za čitati da nema tolko volje


http://www.freewebs.com/horagio/
Moj PC  
0 0 hvala 0
17 godina
neaktivan
offline
C++ tutorijali...

Ma nije problem........ ako cemo pravo, sve sta ja znam je doslo iz tutoriala, pa bi bilo posteno da i ja napisem koji, jelda? :D


Primjetih da nema niš o:

CIN FUNKCIJE, FORMATIRANI ISPIS/UPIS, ČITANJE/PISANJE FILE-a I ZNAKOVNOG NIZA

 

Standardni c++ ulaz, osim u najjednostavnijoj primjedbi, koristeći operatore umetanja (>>), koji razdvaja  ' ', '\t', ' ,' ' znakove (nova linija, tab, return, razmak), može se koristiti još na 4 načina:

cin.get ( char& target ); //upisuje 1 znak u target
cin.get ( char* string, int n ); //upisuje n znakova u string.
cin.get ( char* string, int n, char delimer ); //upisuje u niz sve dok ne naiđe na delimer, ali maksimalno n znaka.

cin.getline (char* string, int n, char delim = ' ' ); //isto kao i gornja funkcija, ali ne ubacuje delimer u niz
//(a ako se delimer ne navede, koristi ' ' -> novu liniju)

 


Primjeri govore bolje od rječi :)

/*ULAZ= test.podaci u ovom primjeru    će vam bolje
objasniti ove funkcije....*/

char c;
char *x[100];

while (cin >> c) cout << c;
//ispisuje  test.podaciuovomprijmerućevamboljeobjasnitiovefunkcije

while (cin.get(c)) cout << c;
//ispisuje isti ulaz...

cin.get (x, 10);
cout << x;
//ispisuje  test.podac

cin.get (x, 100, '.');
cout << x;
//ispisuje: test.
//SA TOČKOM

cin.getline (x, 100, '.');
cout << x;
//ispisuje test
// BEZ TOČKE

cin.getline (x, 100);
cout << x;
//ispisuje test.podaci u ovom primjeru    će vam bolje



FORMATIRANI ISPIS

Formatirani upis i ispis u C jeziku (a tako i u C++-u) se obavlja kroz ove funkcije:

scanf (const char * format, ...) // formatirano čitanje sa stdin-a
printf (const char * format, ...) // formatirano pisanje na stdout.

sscanf (char * source, const char * format, ...) // formatirano čitanje sa znakovnog niza source.
sprintf (char * source, const char * format, ...) // formatirano pisanje u znakovni niz source,

fscanf (FILE * source, const char* format, ...) // formatirano čitanje iz fajla source
fprintf (FILE * source, const char* format, ...) //formatirtano pisanje u fajl source.


  FORMAT U PRINTF

Format je niz znakova koje želimo poslati van..... tako naprimjer
printf ("bok\n");piše na standardni output bok i novi red (\n).

Unutar formatiranog niza mogu se "umetnuti" varijable. Unutar znakovnog niza, kompajleru govorimo da ide varijabla znakom % i jednim slovom koja označava kojeg je tipa varijabla.... naprimjer ua integer je slovo d....

Za svaki znak % (osim ako ga escapeate "\%") mora ici i jedan argument u funkciji..... vrjednost te varijable.... evo primjera:

int a = 125;
int b = -25;

printf("bok, moj broj je %d", a); //ispisuje bok, moj broj je 125

//može imati i više argumenata
printf ("zbroj %d i %d je jednak %d ", a, b, a+b); // ispisuje zbroj 125 i -25 je jednak 100

Eto, nadam se da sada kužite kako stvar radi....


pogledajte sliku -> http://upload.wikimedia.org/wikipedia/commons/thumb/2/2c/Printf.svg/755px-Printf.svg.png

Osim d za integer, ima još mnogo toga:

c          -> Znak (char)
d ili i    -> Integer (int)
e          -> Znanstvena notacija, npr. 3.9265e+2 (int)
E          -> Unanstvena notacija sa veliko E, npr 3.9265E+2 (int)
f          -> Decimalni broj (float)
o          -> Printa broj u oktalnoj bazi (int)
s          -> String, niz znakova (char *)
u          -> Pozitivni integeri (unsigned int)
x          -> Printa broj u heksadecimalnoj bazi (unsigned int)
X          -> Printa broj u heksadecimalnoj bazi, velikim slovima (unsigned int)
p          -> Printa adresu pointera

ako želite long stavite l ispred znaka (ld -> long integer, lf -> long float = double), ako želite short stavite h (sd -> short integer).

Ispred indetifikatora tipova može ići i takozvane zastavice. One određuju na koliko se decimala broj ispisuje, i koliko se znakova ispisuje. Npr, ispred indetifikatora se stavlja .2 da bi se ispisalo na 2 decimale.... a da bi se ispis zauzimao da mjesta stavlja se 10 ispred indetifikatora.... Možete to dvoje i kombinirat, npr 10.2 pa će se broj ispisat na 2 decimale i zauzimati ce 10 mjesta. Evo, sada primjer:

int a = 69;
float b = 123.4;
int c = 14;
char d[] = "pozdrav";
char e = 'a';
double f = 1.2345687984;

double g = 0.001378621;

printf ("%d", a); //69
printf (%10d, a); //        69
printf ("%.3f, b); //123.400
printf ("%X", c); //E
printf ("%s", d); //pozdrav
printf ("%d",e); //69         -> jer je 69 ascii kod slova a
printf ("%.4lf", f); //1.2346      -> zaokružuje
printf ("%E", f); //1.3786E-3   -> znanstveni oblik

printf("Moj prijatelj "%d" platio je %.2d   kuna,te je     %s       svoj%xga prijatelja "%d", koji mu je dao     %E    posto svoje plaće ",a,b,d,c,e,f);
//      Moj prijetelj "69" platio je 123.40 kuna,te je pozdravio    svoje ga prijatelja "69", koji mu je dao 1.3786E-3 posto svoje plaće


SCANF

scanf je funkcija jako slična printf funkciji. Čita stdin, te ubacuje podatke (ovisne o formatu) u adresu varijabla specifiratih u argumentima..... Evo primjer:


//ULAZ=http://forum.bug.hr/test.php?editid=333&return=444
char domena[100];
scanf ("http://%s/", &domena); //šalje se adresa, zbog toga & znak

printf ("%s", domena); //printa forum.bug.hr
printf ("http://%s/, domena); // printa http://forum.bug.hr/

eto.... to je to..... može sada teži primjer:


char protokol[6], subdomena[100], domena[100], drzava[10], fajl[100], podatak1[100], podatak2[100];
int port, vrijednost1, vrijednost 2;

//ULAZ=http://forum.bug.hr:8080/test.php?editid=333&return=444
scanf ( "%s://  %s .%s .%s: %d /    %s  ?   %s = %d&   %s  =%d", &protokol, &subdomena, &domena, &drzava, &port, &fajl, &podatak1, &vrijednost1, &podatak2, &vrijednost2);


/*
protokol = "http";
subdomena = "forum";
domena = "bug";
drzava = "hr";
port = 8080;
fajl = "test.php";
podatak1 = "editid";
vrijednost1 = 333;
podatak2= "return";
vrijednost2 = 444;
*/


FILEOVI VIA C

Fileovi se u C jeziku otvaraju pomoću FILE tipa podataka i funkcije fopen (definiranim u <stdio.h>)...... funkcija fopen ima 2 argumenta, ime fajla (char *) i mod (char *). Mod može biti: readonly (r), writeonly (w), appendonly (a) -> piše na kraj file-a, read&write (w+), read&append (a+).

FILE tip podataka se čita funkcijom fscanf, a piše sa fprintf...  to su funkcije indenticne scanfu i printfu, samo sta imaju jos jedan afrument.... pointer na file...
Još je koristno znati i funkciju feof koja vraća 1 ako je doslo do kraja fajla.

#include <stdio.h>
(...)
FILE *file;
file = fopen ("datoteka.txt", "a+");

char sadrzaj[100000];
for (int i = 0; !feof (file); i++)  fscanf (file, "%c", &sadrzaj[i]); //cita znak po znak....
sadrzaj[i] = '\0';  //dodaje nul znak na kraju niza....

fprintf (file, "Otvoreno %d ", asctime(time(NULL))); //piše datum na kraj file-a
 

FILEOVI VIA C++

U C++-u fajlovi se čitaju koristeći ifstream klasu, a pišu se koristeći ofstream klasu (deklarirane u <fstream>).
Nakon šta se objekt postavi, koristite ga kao i cin / cout.... Fajlovi se mogu otvarati u sljedećim modovima: append (app) -> piše na kraj file-a, binary -> piše/čitau binarnom obliku. Defaultni mod je pisanje, odnosno čitanje od početka.... Ti su modovi deklarirani u ios_base namespace-u, tako da morate staviti ios_base:: ispred moda.

#include <fstream>
(...)
ifstream fin ("datoteka.txt"); //otvara za čitanje
ofstream fout  ("datoteka.txt", ios_base::app); //otvara za pisanje na kraj file-a

char sadrzaj[100000];
for (int i = 0; fin.get(sadrzaj[i]); i++); //cita znak po znak
sadrzaj[i] = '\0'; //dodaje nul-znak na kraj niza...

fout << "Otvoreno " << asctime(time(NULL)) << endl; // piše datum na kraj fajla


SSCANF i SPRINTF


Dosada smo upoznali čitanje iz file-a, pisanje iz file-a, čitanje iz stdin-a, pisanje u stdout..... a sada ćemo upoznati čitanje i pisanje u znakovni niz (char *)...

char x[100];
int a = 200;

printf ("%d", a) -> piše u stdout, ekran
sprintf (x, "%d", a) -> piše u znakovni niz x

x = "123.565";
sscanf ("%f", &a) -> čita sa stdin-a u varijablu a
sprintf (x, "%f", &a) -> čita sa znakovnog niza x u varijablu a

Eto.... ovo je odličan način za pretvaranje iz npr broja u znakovni niz i obrnuto....

printf opis printf opis
Poruka je uređivana zadnji put pon 26.5.2008 11:51 (Jazzfan).
 
0 0 hvala 0
17 godina
neaktivan
offline
C++ tutorijali...

Kako se stavljaju slike ovdje? Je to uopce moguce?

 
0 0 hvala 0
17 godina
neaktivan
offline
RE: C++ tutorijali...
Jazzfan kaže...

Kako se stavljaju slike ovdje? Je to uopce moguce?

 Zasad ja mislim da nije moguće,ali neka ti admini odgovore na to,sliku na neki host pa link,tako zasad.Inače pohvale za tvoj doprinos!!!

v_maxcpp
17 godina
neaktivan
offline
RE: C++ tutorijali...

PROGRAM U VIŠE DATOTEKA

UVOD(kratki)

Spremanje nekog velikog programa u datoteke ćemo objasniti
koristeći Dev okruženje ,tako da znate o čemu se radi kad budem opisivao,ali

princip je svugdje isti.
Mi moramo imati razdvojene deklaracije i definicije programa i dakako
main.cpp dio programa u kojem sve to i pozivamo .
U ime programa koje mi hoćemo spremamo deklaracije u ime_programa.h
U ime_programa.cpp spremamo definicije programa s time da u tu datoteku
uključujemo
#include "ime_programa.h"
našu header datoteku koja je pod navodnicima što je  to opet znak pretprocesoru

da
tu datoteku  prvo potraži u našim vlastitim datotekama programa koji mi pišemo.
Na kraju u glavnom programu također moramo uključiti
#include "ime_programa.h"
Ovo je samo jako kratki osvrt na ono što želim prikazati u ovom postu.
Vrlo su bitni nastavci .cpp i .h kao i imena prije njih jer njima upoznajete
kompajler na što mora obrtaiti pažnju i što s čime spojiti.
Naravno ovo vam sad sve djeluje apstraktno ali kad sve to pokažemo u programu
biti će vam puno jasnije.
Program i objašnjenja će malo čekati jer nisam izdržao napisati bar ovaj uvod
i stoga mi ne zamjerite što ćete možda malo i čekati.

Znači datoteke koje korisnik(programer) radi ,znači deklaracije funkcija ili metoda

stavlja u header datoteke(datoteke zaglavlja ) ali njih se stavlja između navodnika

,za razliku od standardnih zaglavla između <> tih znakova.Procesor tj.prevoditelj

(kompajler) prvo gleda u "domaće" uratke zaglavlja koje uključuje u program

(main),naravno ,uključuje i standardna jer bez njih ne bi mogao raditi.
Često u programima koje se rade imamo puno zaglavlja u koja su uključena druga

zaglavlja i tako jako puno.Da bismo izbjegli ponavljanje određenih zaglavlja

tj.deklaracija koje nam trebaju(naših korisničkih zaglavlja pod navodnicima) ,više

puta u jednom programu koristimo tehniku
spremanja na taj način da pretprocesoru dajemo do znanja ako neka deklaracija

nije definirana niti jednom ,onda se ona samo jednom definira i na taj način je

poznata za sve slijedeće susrete s njom u daljnjem prevođenju,znači izbjegnuta je

višestruka deklaracija.Jednom je dovoljno.To se postiže s naredbama:

#ifndef      //direktiva za uslovno prevođenje ako nije niti jednom još definirano      

          //(korišteno zaglavlje)
#define    // zatim definira to zaglavlje
.....
......//sadržaj (deklaracija)
......
#endif   //naravno kraj

Naprimjer tako je izbjegnuto da se ponavlja stalno:

#include "ime_isto.h"
#include "ime_isto.h"
S ifndef i define ,naravno na kraju mora doći endif,sve se to izbjegava i nema ponavljanja.
Ovo je sve bila teorija ,slijede i programi i zajedno ćete sve lijepo naučiti i shvatiti
jer vam sad ovo djeluje jako čudno.Kao što rekoh malo strpljenja bih zamolio.

Prije jednog malo većeg programa pokazati ću vam na vrlo malom programu kako se radi
spremanje u datoteke i njihovo uklučivanje.Radi se o Dev okruženju gdje kad pokrenete program i kad vam se otvore
projekti vi morate osim main.cpp koju smo mi u ovom programu nazvali drugačije,morate na desni klik i otvoriti još
dvije nove datoteke koje ćete nazvati kako hoćete,u našem programu oblik.h i oblik.cpp !
Sjećate se prije kad sam spomenuo razdvajanje deklaracije i definicije ,sad to i primjenjujemo!
U header oblik.h datoteku idu deklaracije naše klase i što se sve nalazi u toj klasi....znači samo objava!!!!
Naravno ,velika slova na ovaj način koji ja predstavljam u definiranju ifndef i define su obvezna i taj oblik.
Naprimjer mogli smo dati ime blabla.h   i tad bi to ovako izgledalo : #ifndef  BLABLA_H
#define  BLABLA_H

Shvatite to kao pravilo zasad.

Datoteka oblik.h :

#ifndef OBLIK_H
#define OBLIK_H
#include <iostream>
using namespace std;
class g_oblik
{
   private:
   int c;
     public:
       void ime();
       
       int povrsina(int a,int b);
      
};
#endif


Primjetite da nema nniti jedne definicije nego samo što nam treba,objava!
Ako se vratite malo unazad po postovima ,vidjet ćete ovaj program pisan u samo jednoj datoteci a sad ga ja
namjerno razdvajam da vam pokažem kako to razdvajanje u više datoteka ide.
Na malim programima je to besmisleno ali tako se može bolje objasniti.
 
Sad idu definicije svega u klasama.......ponovite post o razdvajanju deklaracije i definicije.

Datoteka oblik.cpp :

#include<iostream >
#include "oblik.h"   //ovdje znači obvezno uključujemo našu header dat!!!!!
using namespace std ;  
        int c;   
        void g_oblik:: ime()
         {
          cout << "Povrsina "<< endl;
          cout<<endl;
         }
       int g_oblik:: povrsina(int a,int b)
         {
          c = a* b;
          return(c);
         }

/*u programu su samo definicije i varijable koje nam trebaju*/


Sad kad smo to sve razdvojili i napravili možemo i napisati glavni program i u tom
glavnom programu također uključujemo našu korisničku datoteku koju smo mi napravili
jer program ne bi radio bez nje(probajte-pogledajte koju grešku javlja)
Naš program main.cpp smo nazvali klase5.cpp a vi ste ga mogli ostaviti i main.cpp da znate da je glavni :


#include<iostream >
#include "oblik.h"        //korisnička header dat.
using namespace std ;

int main()
{
g_oblik pr;
pr.ime();                      //poziv funkcije ime()
cout<<"Rezultat je : "<<endl;
cout<<pr.povrsina(3,4);        //poziv funkcije povrsina()
cout<<endl;
cout<< endl;
system ("PAUSE");
return 0;
}

Vidite da je glavni program isti kao i u jednoj datoteci ali smo uključili našu
oblik.h i preko nje sve drugo pozivamo u programu jer je pretproces pogledao u nju i shvatio što sve po redu
trba izvršiti,i tako imamo program koji je mali u tri umjesto u jednoj datoteci.....
Zamislite sad veliki program i puno deklaracija i definicija a vi sve to možete staviti u par datoteka
i podijeliti zadatke programerima da svatko radi svoju datoteku i vodi računa o njoj
i vidite da je tako lakše sve obavljati kad se radi o velikom programu nego sve pisati odjednom i sam
....tad je mogučnost pogreške veća neko kad više umova i očiju rade veliki program.
Znači na desnoj strani u Dev -u pri otvorenom projektu morate imati  ovakav raspored  :

-projekt(ime koje ste vi izabrali)
    -klase5.cpp
    -oblik.cpp
    -oblik.h

Sad se malo igrajte s ovim programom i nadam se da ću opet brzo naći vremena za dalje.
Nadam se da dovoljno dobro objašnjavam jer nije mi namjera komplicirati i unaprijed se ispričavam
na gramatičkim greškama jer dosad je puno toga napisano pa se jednostavno nemam vrenmena vraćati i
pregledati.

 
Nadam se da ste dosad bar shvatili principe klasa i naslijeđivanja jer sad ide malo teži i kompliciraniji program koji
obuhvaća poznavanje cijelog dosadašnjeg tutorijala ,bar funkcije i klase!
Prvo ću vam program staviti a vi ga malo proučavajte i naravno objasnim ga kako i zašto je sve tako posatvljeno :

datoteka Zaposlenici.h

#ifndef ZAPOSLENICI_H
#define ZAPOSLENICI_H
#include <string>
using namespace std;
class  zaposlenici
{
      public:
             zaposlenici(const string & ,const string &,const string &,
                                 double =0.0,double = 0.0);
             void setIme(const string&);//void setIme
             string getIme() const;     //string getIme
            
             void setPrezime(const string&);//void setPrezime
               string getPrezime() const;   //string getPrezime                
           
              void setJmbg(const string&); // void setJmbg
              string getJmbg() const;   //string getJmbg
             
              void setVeleProdaja(double); //void  setVeleProdaja
              double getVeleProdaja() const;  //double getVeleProdaja
             
               void setDobit(double);  //void setDobit
               double getDobit() const;  //double getDobit
              
               double zarada() const;   // double zarada
               void ispis() const;       //void ispis
              
     protected:
               string ime;   //ime
               string prezime;    //prezime
               string jmbg;  //jmbg
               double veleprodaja;    //  veleprodaja
               double dobit;  // dobit
              
};
#endif
         


....naravno iza te datoteke ide i Zaposlenici.cpp :

#include <iostream>
#include "Zaposlenici.h"
using namespace std;

//konstruktor   zaposlenici::zaposlenici(prvi,zadnji,sjmbg,prodaja,rata)
zaposlenici::zaposlenici(const string &prvi,const string &zadnji,const string &sjmbg,double prodaja, double rata)

    {
              ime =prvi;   //ime = prvi
              prezime= zadnji;   //prezime = zadnji
              jmbg = sjmbg;  //jmbg = sjmbg
              setVeleProdaja(prodaja)  ;      //setVeleProdaja(prodaja)
              setDobit (rata)  ;    //setDobit (rate)
    }
   
 //prvo ime
 void zaposlenici::setIme(const string &prvi)
    {
          ime = prvi;
    }
   
 string zaposlenici::getIme() const
    {
        return ime;
    }
 //________________________________________________________________________  
     void zaposlenici::setPrezime(const string &zadnji)//setPrezime
    {
          prezime = zadnji;
    }
   
 string  zaposlenici::getPrezime() const//getPrezime
    {
         return prezime;
    }
 //**********************************************************
    void zaposlenici::setJmbg(const string &sjmbg)// setJmbg
    {
         jmbg= sjmbg;
    }
   
 string  zaposlenici::getJmbg() const   //getJmbg
    {
         return jmbg;
    }
   
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void zaposlenici::setVeleProdaja(double prodaja)  //setVeleProdaja
{
     veleprodaja = (prodaja<0.0)?0.0:prodaja;
}
double zaposlenici::getVeleProdaja() const   //getVeleProdaja
{
    return veleprodaja;
}
//##########################################################

void zaposlenici::setDobit(double rata)
{
      dobit=(rata>0.0 && rata<1.0)?rata : 0.0;
}
 double zaposlenici::getDobit() const
{
    return dobit;
}
//*========================================================
double zaposlenici::zarada() const
{
          return dobit * veleprodaja;
}
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  void zaposlenici::ispis() const
 {
      cout<<"Ime Zaposlenika : "<<ime<<' '<<prezime<<endl;
      cout<<"JMBG : "<<jmbg<<endl;
      cout<<"Ukupna prodaja :"<<veleprodaja<<endl;
      cout<<"Zarada po prodanom : "<<dobit<<endl;
 }
                                                                

                                                         
.....sad ide datoteka koja tu klasu naslijeđuje i koristi protected dio i ima svoj vlastiti ispis :
....datoteka Bzaposlenici.h:

#ifndef BZAPOSLENICI_H
#define BZAPOSLENICI_H
#include <string>
#include "zaposlenici.h"  // "zaposlenici.h"
using namespace std;
class Bzaposlenici : public zaposlenici  //naslijeđuje class zaposlenici
{
      public:
            Bzaposlenici(const string &,const string &,const string &,double = 0.0,
                                        double = 0.0,double = 0.0);
                                       
             void setBProdaja(double);   //void  setBProdaja
             double getBProdaja() const;  //double getBProdaja
            
             double zarada() const;
            void ispis() const;
            
             private:
                     double bprodaja;
};
#endif                                             


...naravno ide i Bzaposlenici.cpp :

#include <iostream>
#include "Bzaposlenici.h"
using namespace std;
//konstruktor       (&prvi,&zadnji,&sjmbg,&prodaja,&rata,&placa):zaposlenici(prvi,zadnji,sjmbg,prodaja,rata)
Bzaposlenici::Bzaposlenici(const string &prvi,const string &zadnji,const string &sjmbg,
                                               double prodaja,double rata,double placa):
                                                      zaposlenici(prvi,zadnji,sjmbg,prodaja,rata)
    {
                                   setBProdaja(placa);
    }
   
    //**************************************************************
   void Bzaposlenici::setBProdaja(double placa)
    {
         bprodaja =(placa<0.0)?0.0:placa;
    }
    //************************************************                                                                                                                                                                                
  double Bzaposlenici::getBProdaja() const
   {
         return bprodaja;
   }
   //***************************************************************
    double Bzaposlenici::zarada() const
    {
             return bprodaja +(dobit * veleprodaja);
    }
   
//****************************************************************
    void Bzaposlenici::ispis() const  //vlastiti ispis Bzaposlenici i koristimo varijable iz class zaposlenici
{
     //sad možemo pristupiti protected dijelu
     cout<<"Ime i prezime  :"<<ime<<' '<<prezime<<endl;
     cout<<"JMBG :"<<jmbg<<endl;
     cout<<"Ukupna prodaja :"<<veleprodaja<<endl;
     cout<<"Zarada po komadu : "<<dobit<<endl;
     cout<<"Osnova place :"<<bprodaja
     <<endl;
}



....sve to u glavnom programu koji sam nazvao klasebug.cpp spajamo  :

#include <iostream>
#include <iomanip>
#include "Bzaposlenici.h"

using namespace std;

int main()
{
    Bzaposlenici
          radnici("Bug","Bugic","456-78-3789",10000,.04,300);
         
          cout<<fixed<<setprecision(2);
         
          cout<<"Informacije o zaposlenicima s get  funkcijom : "<<endl;
          cout<<"Prvo ime je : "<<radnici.getIme()<<endl;
           cout<<"prezime je : "<<radnici.getPrezime()<<endl;
           cout<<"JMBG je :"<<endl;
           cout<<radnici.getJmbg()<<endl;
           cout<<"Ukupna prodaja : "<<radnici.getVeleProdaja()<<endl;
             cout<<"Dobit po prodanom je : "<<radnici.getDobit()<<endl;
             cout<<"Pojedinacna prodaja : "<<radnici.getBProdaja()<<endl;
             cout<<endl;
             radnici.setBProdaja(1000);
             cout<<"Print funkcija ali od Bzaposlenici klase : "<<endl;
             radnici.ispis();
             cout<<"Zarada zaposlenika : "<<endl;
             cout<<radnici.zarada()<<endl;
   
   
    system("PAUSE");
    return 0;
}


....sad kompajl!

U desnom dijelu Dev-a gdje se nalazi vaš "solution explorer" da ga tako nazovemo mora ovako izgledati(kod mene) :

-klasebug(ime koje sam ja dao za projekt)
     -Bzaposlenici.cpp
     -Bzaposlenici.h
     -klasebug.cpp
    - Zaposlenici.cpp
    -Zaposlenici.h
Evo sad imate dosta vježbe dok sve malo bolje ne objasnim.
A poslije toga taj isti program ćemo napisati tako ali bez protected dijela i tako da shvatite malo
razliku naslijeđivanja i stavljanja jedna klase u drugu i razliku .Malo vježbajte s ovim ispisima jer samo tako se uči.

v_maxcpp

 

 

Poruka je uređivana zadnji put ned 27.4.2008 23:45 (v_maxcpp).
17 godina
neaktivan
offline
RE: C++ tutorijali...

PROGRAM U VIŠE DATOTEKA......(nastavak)


Kako
vidite ovo je u biti nastavak programa klasebug.cpp koji ću ovdje detaljnije objasniti jer mi je nekako nemoguće
na prvom postu o datotekama pristupiti uređivanju,stoga sam morao otvoriti nastavak,u pitanju je IE a na Mozzili uređivanje šljaka
,ali kad sam već otvorio post ovajnna njemu ću i nastaviti jer više koristim IE.
Naravno , nastavak slijedi ali ne danas jer dobre volje sam to htio na starom postu ali malo sam vremena u tome izgubio
i stoga ovih dana slijedi objašnjenje.


_____________________________________________________________________________

Možemo i sami početak objasniti :
Desni klik na Projects(klasebug:u mom slučaju) i klik na novo : i upišite Zaposlenici.h->ok
Zatim,opet desni klik i sve isto pa upišite Zaposlenici.cpp->ok
Ponovite postupakm  za Bzaposlenici.h i Bzaposlenici.cpp i na kraju klasebug.cpp umjesto main.cpp ako već niste i to
desni klik na main.cpp i rename i samo promjenite ime i ok.
_______________________________________________________________________
Sad kad imate sve datoteke u koje ćemo stavljati deklaracije i definicije kao i glavni program ....
klik na Zaposlenici.h i u editor koda prepišite kod iz tog files-a ili copy-paste.
Kao što sam i prije rekao u toj datoteci se nalazi samo deklaracija klase zaposlenici i taj files je naš header files koji
ćemo uključiti i Zaposlenici.cpp kao naše korisničko zaglavlje jer da bi definicije u Zaposlenici.cpp mogle raditi moraju se
upoznati s svojim deklaracijama.
U deklaraciji navno imamo public dio i ovdje je protected dio u kojem stavljamo sve ono što želimo da
klasa koja će biti izvedena iz ove klasezaposlenici ,nasliijedi.
Na početku public dijela nam je deklaracija svega što ćemo stavljati u konstruktor i što ćemo proslijediti u njega,znači objavimo kako će izgledati
konstruktor:
zaposlenici(const string & ,const string &,const string &,
                                 double =0.0,double = 0.0);



     Sad ide deklaracije funkcija koje će nam trebati ,sve se mora deklarirati i u cpp datoteci sve lijepo ipri definiranju poštivati :
       void setIme(const string&);//void setIme
             string getIme() const;     //string getIme
            
             void setPrezime(const string&);//void setPrezime
               string getPrezime() const;   //string getPrezime                
           
              void setJmbg(const string&); // void setJmbg
              string getJmbg() const;   //string getJmbg
             
              void setVeleProdaja(double); //void  setVeleProdaja
              double getVeleProdaja() const;  //double getVeleProdaja
             
               void setDobit(double);  //void setDobit
               double getDobit() const;  //double getDobit
              
               double zarada() const;   // double zarada
               void ispis() const;       //void ispis
              


Naravno sad ide i protected dio koji nam je bitan radi naslijeđivanja (da taj dio stavite u private ---bilo bi nemoguće izvršiti program):

 protected:
               string ime;   //ime
               string prezime;    //prezime
               string jmbg;  //jmbg
               double veleprodaja;    //  veleprodaja
               double dobit;  // dobit

              
Primjetite da poštivamo sve kako smo nabajali u zagradama konstruktora.
Pri ovim objašnjenjima header datoteke nisam namjerno napominjao #ifndef,#define,#endif kao okvir u koij stavljate header datoteku
jer mislim da ste to već svladali i naravno eklaracija klase završvava s vitićasta zagrad točka zarez,dovoljno je samo mala greška
pri pisanju programa (probaje izostaviti točka zarez ,) i nema izvršenja.Naravno na početku smo napravili

#include <string>
using namespace std;

...jer  nam to zaglavlje treba jer se koristimo string tipom i u vašim budućim samostalnim radovima morate uvijek uklučiti zaglavlja
koja su vam potrbna pri stvaranju headera i namespace std također.

Sad idemo na zaposlenici.cpp koja koja naravno mora uključiti našu header datoteku i sva zaglavlja koja nam trebaju i namespaces std;
Ova datoteka sad sadrž znači samo definicije svega što smo deklarirali i naravno njihovu uporabu,primjetite da se sve poštiva onako kako
je i napisano u deklaraciji!!!!
Vidite na početku sve što nam treba moramo uključiti,nakon toga smo prvo prišli definiranju našeg konstruktora

i koristili podatke iz protected dijela i naravno sve poštivali kako smo deklarirali u zaposlenici.h :

#include <iostream>
#include "Zaposlenici.h"
using namespace std;

//konstruktor   zaposlenici::zaposlenici(prvi,zadnji,sjmbg,prodaja,rata)
zaposlenici::zaposlenici(const string &prvi,const string &zadnji,const string &sjmbg,double prodaja, double rata)

    {
              ime =prvi;   //ime = prvi
              prezime= zadnji;   //prezime = zadnji
              jmbg = sjmbg;  //jmbg = sjmbg
              setVeleProdaja(prodaja)  ;      //setVeleProdaja(prodaja)
              setDobit (rata)  ;    //setDobit (rate)
    }


zdvajam ovaj dio jer kako sam i prije rekao da konstruktori nemaju tip(ime klase je i tip-tako čitajte) i sam konstruktor se po pozivu
odmah i izvršava!

zaposlenici::zaposlenici(const string &prvi,const string &zadnji,const string &sjmbg,double prodaja, double rata)


Znači ovaj dio(gore)koda  se poklapa (dolje)s deklaracijom i sve poštivamo samo što dajemo imena našim tipovima
i naredbom const postavljamo da se to neće mijenjati
 :

 zaposlenici(const string & ,const string &,const string &,
                                 double =0.0,double = 0.0);


Sad samo ono što je u protected dijelu prebacimo na naša imena u konstrutoru da bismo s njima manipuliralli kako hoćemo.

{
              ime =prvi;   //ime = prvi
              prezime= zadnji;   //prezime = zadnji
              jmbg = sjmbg;  //jmbg = sjmbg
              setVeleProdaja(prodaja)  ;      //setVeleProdaja(prodaja)
              setDobit (rata)  ;    //setDobit (rate)
    }


Što se tiče funkcija objasnim prvu i zadnju tj.funkciju ispis,ako ste naučili deklaracije iz prijašnjih postova ne bi
vam bilo teško i sami sve posložiti :

 void zaposlenici::setIme(const string &prvi)
    {
          ime = prvi;
    }


Znači tip funkcije je tip void(ništa ne vraća) a ime funkcije je setIme i povezujemo ga s stringom prvi kad se pozove funkcija
i automatski se izvršava tako da u varijablu ime sprema string prvi.

Način na koji je to napisano je objašnjeno  postovima prije a još ranije (namespace) je objašnjena dupla dvotočka
kao omogučavanje pristupa i čemu se pristupa.Uglavnom se znači navodi prvo tip funkcije,ime klase,pa duple dvotočke i
zatim funkcijs članica i njeno ime i naravno parametri ako ih ima a to je u ovom slučaju string parametar ,na kraju naravno
tijelo funkcije!

void zaposlenici::ispis() const
 {
      cout<<"Ime Zaposlenika : "<<ime<<' '<<prezime<<endl;
      cout<<"JMBG : "<<jmbg<<endl;
      cout<<"Ukupna prodaja :"<<veleprodaja<<endl;
      cout<<"Zarada po prodanom : "<<dobit<<endl;
 }

                                                       
Ovdje u definiciji funkcije ispis naveli smo samo što ona radii tipa je void(izvršava se po pozivu cijela)
i postavili smo je kao konstantu(ne mijenja se).

Objasnio sam kratko samo void funkcije a omate u programu i funkcije tipa double znači return tip.
Probajte sad sami vidjeti da sve što navedemo u deklaraciji poštivamo u definiciji!

Sad tek dolazi dio u kojem mi radimo naslijeđivanje....stavranje nove klase koja će naslijediti sve što ima
klasa zaposlenici i dodamo još vlastite funkcijske članice izvedene klase i naravno još ima i private(samo njen dio).
Vidite sad prednosti naslijeđivanja ,iz osnovne klase mi naslijedimo se njene funkcije i još k tome u izvedenoj klasi mi
dodamo nešto novo!Vidite kao da je otac prenio nešto svom djetetu što može samo on a dijete još razvilo neke nove
osobine!Vi tako možete iz jedne klase izvesti još klasa a iiz izvedenih klasa još izvedenih klasa.Vidite sad kako
je to u biti jednostavno.

class Bzaposlenici : public zaposlenici


Znači klasa Bzaposlenici naslijeđuje sve od klase zaposlenici.Public u ovoj definiciji znači da je režim pristupa klasi zaposlenici
javan (podrazumijevani je pristup private).
Zatim idu deklaracije četiri funkcije i jedne private članice(varijable) a u definicijama sve to i definiramo risteći protected varijable
koje smo naslijedili ,a u funkciji ispis možemo koristiti varijablu uzvedene klase i imamo vlastitu funkciju ispis za klasu Bzaposlenici.
Vidite sad kako se sve može kombinirati kad se naslijedi class zaposlenici i mi još nešto dodamo i imamo novu klasu koja je
izvedena izte klase ali ima vlastiti cilj jer joj možemo dodati nove funkcijske članice i varijable.

Nisam posebno objašnjavao dio po dio ali nadam se da je jsno samo po sebi kad malo bolje sve "proučite" jer stalnim gledanjem i pisanjem koda
vi ćete sve ovo dobro razumjeti!

Bzaposlenici
          radnici("Bug","Bugic","333-33-3333",5000,.04,300);

Naravno vi u glavnom programu sve morate pozivati preko objekta radnici tipa class Bzaposlenici.
Znači radnici je instanca pomoću koje sve pozivamo!
Ako ste sve o klasama dosad u ovim tutorijalima naučili i vježbali tad vam i ovakvo moje objašnjavanje mora biti dovoljno.
Ako ima nejasnoća vi uvijek možete pitati i ja se vratim na nejasni dio.
Prije nego još krenemo s jednim programom o klasama koji je isti ovaj koji smo dosad objasnili ,pokušati ću
napisati još jedan program koji će imati klasu koja će špomoću poziva u programu sortirati polja,u biti mi ćemo
sortiranje polja staviti u klasu.To se radi s svim korisnim programima....stavite ih u klase i na taj način vi ih ne morate
iznova i opet iznova pisati ,nego jednom stavite u klasu i samo pozovemo kad nam treba.O svemu ovome malo kasnije.

Evo odmah idemo dalje.
Nadam se da se sjećate malo ranije na ovim stranicama o sortiranju brojeva po veličini i koda koji to radi.
Kod ima i svoje ime i to je jedan od "bublle sort" načina sortiranja brojeva po veličini.
Program se može koristiti često pri sortiranju polja i zato ga mi možemo staviti kao klasu što ćemo sad i napraviti.
Naravno ovo je samo za vašu vježbu i da sami vježbate kako se to radi ,klase,deklaracije definicije i zaglavlja,da vam uđe u naviku.
Što više primjera vas može i naučiti više.

Prvo radimo deklaracije u datoteci sortiranje.h :


#ifndef SORTIRANJE_H
#define SORTIRANJE_H

class sortiranje
{
private:
int zamjena;
int x;
int privremeni;
int p[5];

public:
void buble();
};
#endif


Znači imamo private i public dio.U private smo stavili varijable koje nam trebaju a u public smo stavili funkciju.
Zašto? Zato što privatnim članovima pristupa sama klasa tj.public dio.A mi izvana u glavnom programu pristupamo samo
public dijelu.

Sad ide sortiranje.cpp datoteka u kojoj su definicije svega što smo naveli u deklaraciji tj.mi samo moramo definirati funkciju
buble() u kojoj koristimo sve naše varijable iz private dijela.Naravno ,tako smo stvorili funkciju koja radi sortiranje i samo je pozovemo pomoću
objekta u glavnom programu i program se izvršava.

#include<iostream>
#include "sortiranje.h" //ukljucujemo nasu datoteku zaglavlja!!!
using namespace std;//naravno ukljucujemo i nase naredbe standardne
//SAD PISEMO NASU DEFINICIJU!!!!
void sortiranje::buble()
/*sjecate se razdvajanja deklaracije i def(ponovite)*/{
cout<<"Unos polja :" <<endl;
  for(x=0;x<5;x=x+1)
    {
       cin>>p[x];
     }
      do
         {
           zamjena = 0;
         for(x=0;x<4;x=x+1)
           {
              if(p[x]<p[x+1])
               {
                  privremeni=p[x];
                  p[x]=p[x+1];
                  p[x+1]=privremeni;
                    zamjena = 1;
                }
            }
         }
while(zamjena==1);
cout<<"Sortirano polje :"<<endl;
for(x=0;x<5;x=x+1)
{
cout<<p[x]<<endl;
}
};


.....sad naravno glavni main program koji kod mene ima drugačije ime :

#include<iostream >
#include "sortiranje.h"
using namespace std ;
int main()
{
sortiranje sort;
sort.buble();
system ("PAUSE");
return 0;
}


Vidite kako je sad program u main dijelu mali i elegantan ...tako možete sve funkcije koje rade važnije stvari
u nekom velikom programu razdvojiti u datoteke i klase i samo ih pozivati u gavnom programu kad zatrebate.
To su sve principi objektnog programiranja i naravno da sad ste spremni za dalje a i tek sad u daljnjem
tekstu ću objasniti pojmove  enkapsulacija,polimorfizam...i slično što se tiče objektne orijentiranosti c++-a.
Malo i sami vježbajte i proučavajte ove sve kodove i programe jer u tome je tajna učenja i napretka...malo i sami
pokušajte pronaći logiku programa .......
Vidimo se.....eto brzo.

Sad isti program s klasama zaposlenici i Bzaposlenici ćemo napraviti bez protected dijela što znači da
će klasa Bzaposlenici koristiti funkcijske članice zaposlenici preko operatora razriješenja :: duple dvotočke
a to opet znači da private članovi ostaju nenaslijeđeni u klasi Bzaposlenici...ja ću sad postaviti progarm
a vi ga malo proučavajte dok ga ja ne objasnim i glavne razlike koje su primjetne kad se radi o
protected i private dijelu.


Zaposlenici.h :

#ifndef ZAPOSLENICI_H
#define ZAPOSLENICI_H
#include <string>
using namespace std;
class  zaposlenici
{
      public:
             zaposlenici(const string & ,const string &,const string &,
                                 double =0.0,double = 0.0);
             void setIme(const string&);//void setIme
             string getIme() const;     //string getIme
            
             void setPrezime(const string&);//void setPrezime
               string getPrezime() const;   //string getPrezime                
           
              void setJmbg(const string&); // void setJmbg
              string getJmbg() const;   //string getJmbg
             
              void setVeleProdaja(double); //void  setVeleProdaja
              double getVeleProdaja() const;  //double getVeleProdaja
             
               void setDobit(double);  //void setDobit
               double getDobit() const;  //double getDobit
              
               double zarada() const;   // double zarada
               void ispis() const;       //void ispis
              
    private:
               string ime;   //ime
               string prezime;    //prezime
               string jmbg;  //jmbg
               double veleprodaja;    //  veleprodaja
               double dobit;  // dobit
              
};
#endif



Zaposlenici.cpp :

#include <iostream>
#include "Zaposlenici.h"
using namespace std;


zaposlenici::zaposlenici(const string &prvi,const string &zadnji,const string &sjmbg,double prodaja, double rata)
:ime(prvi),prezime(zadnji),jmbg(sjmbg)

/*{
              ime =prvi;   //ime = prvi
              prezime= zadnji;   //prezime = zadnji
              jmbg = sjmbg;  //jmbg = sjmbg
              setVeleProdaja(prodaja)  ;      //setVeleProdaja(prodaja)
              setDobit (rata)  ;    //setDobit (rate)
    } */
{
    setVeleProdaja(prodaja);
    setDobit(rata);
}

  
   
 //prvo ime
 void zaposlenici::setIme(const string &prvi)
    {
          ime = prvi;
    }
   
 string zaposlenici::getIme() const
    {
        return ime;
    }
 //________________________________________________________________________  
     void zaposlenici::setPrezime(const string &zadnji)//setPrezime
    {
          prezime = zadnji;
    }
   
 string  zaposlenici::getPrezime() const//getPrezime
    {
         return prezime;
    }
 //**********************************************************
    void zaposlenici::setJmbg(const string &sjmbg)// setJmbg
    {
         jmbg= sjmbg;
    }
   
 string  zaposlenici::getJmbg() const   //getJmbg
    {
         return jmbg;
    }
   
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void zaposlenici::setVeleProdaja(double prodaja)  //setVeleProdaja
{
     veleprodaja = (prodaja<0.0)?0.0:prodaja;
}
double zaposlenici::getVeleProdaja() const   //getVeleProdaja
{
    return veleprodaja;
}
//##########################################################

void zaposlenici::setDobit(double rata)
{
      dobit=(rata>0.0 && rata<1.0)?rata : 0.0;
}
 double zaposlenici::getDobit() const
{
    return dobit;
}
//*========================================================
double zaposlenici::zarada() const
{
          return dobit * veleprodaja;
}
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  void zaposlenici::ispis() const
 {
      cout<<"Ime Zaposlenika : "<<ime<<' '<<prezime<<endl;
      cout<<"JMBG : "<<jmbg<<endl;
      cout<<"Ukupna prodaja :"<<veleprodaja<<endl;
      cout<<"Zarada po prodanom : "<<dobit<<endl;
 }

                                                           
Bzaposlenici.h :

#ifndef BZAPOSLENICI_H
#define BZAPOSLENICI_H
#include <string>
#include "zaposlenici.h"  // "zaposlenici.h"
using namespace std;
class Bzaposlenici : public zaposlenici
{
      public:
            Bzaposlenici(const string &,const string &,const string &,double = 0.0,
                                        double = 0.0,double = 0.0);
                                       
             void setBProdaja(double);   //void  setBProdaja
             double getBProdaja() const;  //double getBProdaja
            
             double zarada() const;
            void ispis() const;
            
             private:
                     double bprodaja;
};
#endif                                             


Bzaposlenici.cpp :

#include <iostream>
#include "Bzaposlenici.h"
using namespace std;
//konstruktor       (&prvi,&zadnji,&sjmbg,&prodaja,&rata,&placa):zaposlenici(prvi,zadnji,sjmbg,prodaja,rata)
Bzaposlenici::Bzaposlenici(const string &prvi,const string &zadnji,const string &sjmbg,
                                               double prodaja,double rata,double placa):
                                                      zaposlenici(prvi,zadnji,sjmbg,prodaja,rata)
    {
                                   setBProdaja(placa);
    }
   
    //**************************************************************
   void Bzaposlenici::setBProdaja(double placa)
    {
         bprodaja =(placa<0.0)?0.0:placa;
    }
    //************************************************                                                                                                                                                                                
  double Bzaposlenici::getBProdaja() const
   {
         return bprodaja;
   }
   //***************************************************************
    double Bzaposlenici::zarada() const
    {
             return getBProdaja() + zaposlenici::zarada();//koristimo dakle klasu zaposlenici
    }
   
//****************************************************************
    void Bzaposlenici::ispis() const
{
   /*  //sad možemo pristupiti protected dijelu
     cout<<"Ime i prezime  :"<<ime<<' '<<prezime<<endl;
     cout<<"JMBG :"<<jmbg<<endl;
     cout<<"Ukupna prodaja :"<<veleprodaja<<endl;
     cout<<"Zarada po komadu : "<<dobit<<endl;
     cout<<"Osnova place :"<<bprodaja
     <<endl;*/
    cout<<"Osnovica place : "<<endl;
    zaposlenici::ispis();//pozivamo funkciju ispis iz klase zaposlenici jer
    //sad naša klasa Bzaposlenici ne raspolaže s svojim ispisom.
    cout<<"Placa : "<<endl;
    cout<<getBProdaja();
    cout<<endl;
    
    
}

 



klasebug.cpp :

#include <iostream>
#include <iomanip>
#include "Bzaposlenici.h"

using namespace std;

int main()
{
    Bzaposlenici
          radnici("Bug","Bugic","234-56-1234",10000,.04,200);
         
          cout<<fixed<<setprecision(2);
         
          cout<<"Informacije o zaposlenicima s get  funkcijom : "<<endl;
          cout<<"Prvo ime je : "<<radnici.getIme()<<endl;
           cout<<"prezime je : "<<radnici.getPrezime()<<endl;
           cout<<"JMBG je :"<<endl;
           cout<<radnici.getJmbg()<<endl;
           cout<<"Ukupna prodaja : "<<radnici.getVeleProdaja()<<endl;
             cout<<"Dobit po prodanom je : "<<radnici.getDobit()<<endl;
             cout<<"Pojedinacna prodaja : "<<radnici.getBProdaja()<<endl;
             cout<<endl;
             radnici.setBProdaja(1000);
             cout<<"Print funkcija ali od Bzaposlenici klase : "<<endl;
             radnici.ispis();
             cout<<"Zarada zaposlenika : "<<endl;
             cout<<radnici.zarada()<<endl;
   
   
    system("PAUSE");
    return 0;
}



Evo ,sad malo proučavajte ,a kad budem imao više vremena, razlike objasnim i naravno napišem
zaključak o klasama jer mislim da neke osnove o OPP-u se mogu ovdje svladati tako da se nakon ovih
tutorijala možete baciti na kompliciranije tematike i djelove c++-a jer ste za to spremni!!!
Ali nakon što s ovih stranica sve dobro uvježbate. Naravno ,nakon ovih tuta ste spremni prijeći možda na C#
koji je možda "jednostavniji "ali ga nakon ovih tuta možete sigurno bolje razumjeti i naučiti.
Ovi tutovi vam mogu poslužiti kao početak za puno toga što se tiče programiranja.
Nisam još obradio grafiku,ispitivanje tipki,crtanje,i nešto malo o funkcijama i spremanje u datoteke brojeva i slova.....
To vas čeka tek nakon malo veće pauze koju sam prisiljen napraviti u nedostaku vremena...naravno kad završim s klasama.
To što kažem "završim" samo je slikovito jer nakon ovoga učenje tek počinje.Ono što mogu sad zaključiti je da sam
na tutorijale stavio približno 80% onoga što sam ja želio staviti,onih dvadeset posto do jeseni će biti također stavljeno
ali  i drugi autori su slobodni staviti sve što misle da treba dopuniti ili novo staviti!















v_maxcpp
Poruka je uređivana zadnji put sri 30.4.2008 11:12 (v_maxcpp).
17 godina
neaktivan
offline
C++ tutorijali...

KLASE (treći dio)

Nažalost moram ovako razdvajati jer postaje teško editirati postove koristeći IE.

O samoj definiciji što je to klasa i otprilike čemu služe ste kroz tut o klsama već
malo i skužili.Jedna od važnijih karakteristika je enkapsulacija .To je jasno

razdvajanje public dijela od unutrašnjosti same klase(koristeći private i protected dijelove).
Na taj način možemounutrašnjost klase napisati a ne rušeći koncepciju cijelog programa,
 a krajnjem korisniku ponuditi funkcionalnost i rad motora i njegovih dijelova(objekata)
,a on ne mora znati kako i od čega je motor sastavljen nego samo da radi!Klasa je

korisnički tip a objekti su nešto tog tipa.Možete napraviti koliko hoćete objekata tip

a te klase.Proces pravljenja objekata određene klase se zove instanciranje.Znači

OPP smo već spominjali a glavne su mu karakteristike već gore

navedene,enkapsulacija,nasljeđivanje i ostaje još polimorfizam....kao treći

najvažniji aspekt OPP-a .Polimorfizam je svojstvo da se objekt koji potiče iz iz

izvedene klase izvršava operaciju svojstvenu izvedenoj klasi a pristupa mu se kao

osnovnoj klasi.Naprimjer u osnovnoj klasi imamo objekt koji kad ga pozovemo

izvršava funkciju piši() i sad mi izvedemo par klasa iz osnovne  klase i u svakoj toj

izvedenoj klasi možemo pozvati funkciju piši a ona izvršava ono što i treba-ispis a

ne mora znati što će ispisati ni što to znači...na taj način mi neki objekt koji je

davno stvoren možemo više puta koristiti na sasvim novim klasma ,a te klase

recimo ispisuju različite riječi....to je polimorfizam.
Taj objekt..funkcija izvršava

radnju u izvedenoj (novoj klasi) ali pristup je kao u osnovnoj klasi.Sad vidite

prednost ..možemo neki proizvod samo nadograđivati a ne moramo se odricati

staroga,samo dodajemo mijenjajući oblik ali osnovne funkcije zadržavamo.Znači tri

glavne karakteristike OPP-a su : naslijeđivanje,enkapsulacija

(sakrivanje),polimorfizam.Naravno to je samo okosnica ,a sve detalje u klasama i

objekte ,njihovo korištenje i rad s klasama samim time stavra sliku objektne

orijentiranosti.

Ovo je samo dio i osnova o čemu ja pišem jer se o tome može

napisati jako puno.U programu koji sam uzimao za primjer protected naslijeđivanja

i bez protected naslijeđivanja ,to  je samo da vidite razliku,s protected zonom koju

klasa Bzaposlenici naslijeđuje je elegantnije napisana,a druga bez protected zone
je malo robusnija ali u oba slučaja se radi o nalijeđivanju,samo što u jednom

slučaju klasa koja naslijeđuje naslijedi i private članove osnovne klase a u drugom

slučaju ne!O programeru ovisi koji kod će mu bolje koristiti a koji ne.Oba imaju

svoje nedostatke i prednosti.

Samo mala digresija od tema klasa iako je i povezano s tom temom .

Nedavno sam imao pitanje zašto nisam nešto i o strukturama rekao i pristupu članovima struktura.
Zasad neću otvarati poseban post o strukturama i unijama ali mislim i njih obraditi ,osim ako me neki autor ne pretekne.
Zasad samo krati program kako se pišu strukture i kako se pristupa njezinim članovima.
Više onjima će svakako biti kao što rekoh do jeseni,ali zasad proučite na koji način smo pristupili članovima strukture
i kako je sve to posloženo,naravno vježbajte,a pristup npr.članovima unije i poljima je sličan ovom pristupu.
Zasad samo to proučite,nisam ništa posebno objasnio jer će biti i poseban post,ako netko želi od drugih autora
objasniti neka objasni.Osnovna razlika između struktura i klasa je naravno u ključnoj riječi(pogodite kojoj) i naravno
svi članovi u strukturama su po defaultu javni(public) a u klasama ako ne navedete ništa oni su zaštičeni(private).
Evo koda pa proučavajte :
#include<iostream>
#include<string>
using namespace std;
struct BOOK
{
 char Naslov[80];
 char Author[80];
 char Izdavac[80];
 int   Godina;
};
BOOK Novel =
{
 "Naslov knjige",
 "Ime i prezime",
 "Izdavac",
 1984
};

int main()
{
 BOOK* p=NULL;
 p=&Novel;
 cout<<Novel.Author<<endl;
 cout<<Novel.Izdavac<<endl;
 cout<<Novel.Naslov<<endl;
 cout<<Novel.Godina<<endl;
   cout<< p->Author<<endl;
   cout<<p->Izdavac<<endl;
   cout<<(*p).Godina<<endl;//znaci isto sto i p->Godina
 cout<<endl;
 system ("pause");
 return 0;
}
 /*U OVOM PROGRAMSKOM KODU BAVIMO SE STRUKTUROM.
// SLICNE SU KLASAMA ALI OVAJ PRIMJER NAM SAD SLUZI SAMO DA
// PRIKAZEM KAKO SE MOZE PRISTUPITI CLANU STRUKTURE.
// PREKO TOCKE (TKZ.MEMBER ACCES OPERATOR)---OBLIK DIREKTNOG
// PRISTUPA POJEDINIM CLANOVIMA STRUKTURE.
// I NARAVNO POSREDNI PRISTUP PREKO POKAZIVACA KOJI NARAVNO
// MORAMO NA POCETKU DEKLARIRATI KAO PRIPADNIKA STRUKTURE
// I TEK ONDA PREUSMJERIMO NA STO CE POKAZIVATI I ETO VAM
// OBJASNJENJA OPERATORA ->   
// NARAVNO TO JE ISTO STO I p->Godina */

Naravno ,vidim da ima pitanja i o destruktorima...e to ćemo prije jeseni još obraditi(bar ja).
Do slijedećeg nastavka.

v_maxcpp
Poruka je uređivana zadnji put čet 1.5.2008 17:12 (v_maxcpp).
 
0 0 hvala 0
17 godina
neaktivan
offline
RE: C++ tutorijali...

Ima na www.tutorijali.net sve o c++ programiranju,pascal,o HTML-u svemu i svačemu!


posjetite moj blog,tek sam ga napravio...komentirajte,glasujte,pisite sta da stavljam,...

http://technotaz.blog.hr
17 godina
neaktivan
offline
C++ tutorijali...

Nasao sam zadatke i prvog odmah nisam znao rijesiti a tu nisam nigdje nasao rjesenje problema

Ovako zadatak glasi

Napravi C++ program koji ce zbrojiti sve dvoznamenkaste brojeve.

Ja sam sve napravio osim zbroja jer jednostavno nemam ideje kako to napraviti

Ako netko moze pomoci unaprijed zahvaljujem

 
0 0 hvala 0
17 godina
neaktivan
offline
C++ tutorijali...

 

#include<iostream>

using namespace std;

int main()

{

                     int broj,zbroj;

                     zbroj=0;

for (broj=10;broj<100;broj++)

{

                        zbroj=zbroj+broj;

}

                     cout<<"Zbroj svih prirodnih dvoznamenkastih brojeva je :"<<zbroj<<endl;

                     return 0;

}

 

 

 

Ovo bi ti trebalo to biti...

Dakle napocetku ispraznis varijablu zbroj

 

petlja for pocinje sa brojem 10 dakle prvim dvoznamenkasti a odvija se sve dok je broj manji od 100 dakle dok je jos dvoznamenkast.

porast je za 1 broj.

 

zbroj=zbroj+broj
 - ovdje program pribrojava svaki broj dosadasnjem zbroju...

nakon toga se vraca natrag u petlju i poveca varijablu broj za jedan te ga opet pribrojava zbroj i tako sve dok je broj manji od 100

 

 

E4600@3300MHz,8600GTS,2GB DDR2@825MHz
Poruka je uređivana zadnji put ned 3.8.2008 11:59 (Bruno).
 
0 0 hvala 0
17 godina
neaktivan
offline
RE: C++ tutorijali...

Kad radite programe u VS-u ili VS Express izdanju tad ako ne radite Empty project a kliknete finish na Wizardu ,ne dodajete nikakav
cpp.file(ako radite jednostavne programe console) nego sve pišete unutar stvorene tmain() funkcije samo dodate potrebne headere.
Evo slike i jednostavnog programa da vidite o čemu pričam:
edit:@unknown
što ispočetka?
post prije?ili ovo u svezi VS-a?
ok,početak je na file->new project->izaberete kao jezik c++ i na Win32 klik i ->klik na win32 console app->imenujete projekt i to je to.
slika koja ide prije svih onih slika dolje je ova zadnja(zbog uređivanja posta),pa sami posložite,ako još ima nejasnoća oko empty i console app
u odabiru pri pokretanju VS-a pitajte.

..na čarobnjaku dodaj samo finish.... ..na čarobnjaku dodaj samo finish....
...dodan je kod u već postojeću funkciju.... ...dodan je kod u već postojeću funkciju....
..i start without debbuging... ..i start without debbuging...
nakon new project i odabira c++-a i win32... nakon new project i odabira c++-a i win32...
Poruka je uređivana zadnji put ned 15.6.2008 11:51 (v_maxcpp).
17 godina
offline
RE: C++ tutorijali...
Jer bi mi netko mogao otpočetka objasnit :P
jer nisi baš nekako bjasnio početak.Ja sam ipak rookie koji radi tek
HTML
TITLE
BODY
HEAD
HTML
:p
92% tinejđera sluša turbo folk. Ako si ti među onih 8% koji još uvijek slušaju pravu glazbu kopiraj si ovo u potpis.
17 godina
neaktivan
offline
C++ tutorijali...

nisam citao topic od pocetka, pa ne znam jel sppomenuto al ovo je meni pomoglo dok nisam bas nista kuzio (nisam ni sad nesto bolji, but still...):

http://www.3dbuzz.com   -- za pocetnike ima nekoliko video tutorijala o C i C++-u izmedju ostalog, samo se registrirajte da bi dobili pristup   -- fora je nacin na koji   prezentiraju i zezaju se stalno; mnostvo ostalih tutoriala za one koji se misle bavit 3d-om, igrama i sl.

Poruka je uređivana zadnji put ned 15.6.2008 14:52 (DhulKarnain).
 
0 0 hvala 0
17 godina
offline
RE: C++ tutorijali...
Hvala stari nisu loši tutorijali.A jer imaš nekaj za apascal.
92% tinejđera sluša turbo folk. Ako si ti među onih 8% koji još uvijek slušaju pravu glazbu kopiraj si ovo u potpis.
17 godina
neaktivan
offline
C++ tutorijali...

Svaka čast, nemam riječi, klanjam ti se  Smijeh BIG RESPECT za ovaj tutorijal.

 

Sad jedna zamolba za bugovce. Da ovaj tutorijal izvezu u .pdf da to mogu komotno isprintati, zamorno je ovak iz browsera to čitati...

 

 

 

 
0 0 hvala 0
17 godina
neaktivan
offline
RE: C++ tutorijali...
M4r10 kaže...

Svaka čast, nemam riječi, klanjam ti se  Smijeh BIG RESPECT za ovaj tutorijal.

 

Sad jedna zamolba za bugovce. Da ovaj tutorijal izvezu u .pdf da to mogu komotno isprintati, zamorno je ovak iz browsera to čitati...

 

 

 

 Hvala za pohvalu.......što se tiče da sve ide u pdf nemam ništa protiv,samo netko da izvrši "lektoriranje" i dotjerivanje...mogu i pripomoći kad se odluče i ako
se odluče na to.Mogu staviti i na BUG dvd ako bugovci tako žele,ma sve u cilju napretka c++-a.A meni..."bug-majca"-ja zadovoljan.(šalim se bugovci)
Hvala još jednom na pohvali, iako još ponešto trebam dodati(strukture...destruktori...DLL) ali i ovo je dovoljno za one koji počinju(bar se nadam).
Pozdrav svima!!!
v_maxcpp
Poruka je uređivana zadnji put pon 16.6.2008 19:10 (v_maxcpp).
17 godina
neaktivan
offline
C++ tutorijali...

Svaka čast v_maxcpp i ostalima koji su sudjelovali, registrirao sam se samo davam se zahvalim na odličnom tutorijalu. Mislim da će mi puno pomoći u svladavanju c++.

 

Puno hvala i ljiep pozdrav

 
0 0 hvala 0
17 godina
neaktivan
offline
C++ tutorijali...

Odlična tema.Jako pregledno i detaljno.Svak čast naxeem i ostalima koji su doprineli.

 

Imam jedno pitanje u vezi switch i string funkcija.

Dali se može koristit jedno sa drugim?

 

Primjer:

 

#include<iostream>

#include<string>

 

using namespace;

 

int main ()

{

string ime ;

 

cout << "Kako se zovete:";

cin >> ime;

 

switch(ime)

{

case "ja":

cout << "Pozdrav" << ime;

break;

 

case "on":

cout << "Pozdrav" << ime;

break;

 

}

 

system ("PAUSE");

return 0;

}

 

Ovo je jednostavan primjer samo da pokažem kako sam ja radio,ali takav način ne radi.Koristio sam iste korake kao i kod char tipa osim dodavanja include<string> i stavljanja slučaja(case) u navodnike za string.

 

Moj PC  
0 0 hvala 0
17 godina
neaktivan
offline
RE: C++ tutorijali...

Iskaz switch() se ne može primjenjvati na znakovne nizove ili objekte jer nisu cjelobrojne vrijednosti(int).Da bi to funkcioniralo moraš ubacivati if else naprimjer.
U zagradi swicth(int tip) mora uvijek biti cjelobrojna vrijednost ili zamjena za nju koja je isto u biti int tip jer se u swicth() uvjetima radi o
biranju int odluke koja onda pokazuje znakovne odgovore i slično.

 

#include <iostream>
#include<string>

using namespace std;

int main()
{
   
   
 string  ime ;
 string  pozdrav = "Pozdrav ,";
 int izbor = 0;
 

cout << "Kako se zovete:";

cin >> ime;
cout<<"Pritisnite jedan!"<<endl;
cin>>izbor;

 
    switch(izbor)

    {

    case  1:
    cout<<pozdrav<<ime<<"!"<<endl;


     break;

 

        default:
        cout<<"Niste nista unijeli"<<endl;
    }
    
    
    system("PAUSE");
    return 0;
}
No,ovo je samo na brzinu napisano ali uvijek u switch() uvjetu mora biti int vrijednost.

Evo još jedan primjer i dokaz da u switch() iskazu mora biti integrer,a možeš sam kombinitrati i s stringovima  i char poljima :

#include <iostream>
using namespace std;
int main()
{
    char slovo =false;                       //ovdje mozes staviti i nulu jer je ona u biti false(a oba su int tip!!! char slovo =0;
    cout<<"unesite malo slovo : "<<endl;
    cin>>slovo;
    cout<<endl;
    switch(slovo*(slovo >= 'a' && slovo <='z'))
    {
          case 'a':
               case 'e':
                    case 'i':
                         case 'o':
                              case 'u':
                                   cout<<"Unijeli ste samoglasnik!"<<endl;
                                   break;
                                   case 0:
                                        cout<<"To nije malo slovo!"<<endl;
                                        break;
                                        default:
                                                cout<<"Unijeli ste suglasnik!"<<endl;
    }
    system ("pause");
    return 0;
}
                                          

Nadam se da je malo jasnije.

v_maxcpp
Poruka je uređivana zadnji put pon 23.6.2008 12:57 (v_maxcpp).
17 godina
neaktivan
offline
C++ tutorijali...

Puno jasnije,hvala i samo tako nastavite,jer neko vrijeme nije bilo aktivnosti,naravno i vi imate obaveze,ali ima nas koji 'pratimo temu i čekamo nastavak.Usput ovo je najkompletniji i najjasnij tutorijal o cpp koji sam vidio(a vidio sam ih dosta).

Moj PC  
0 0 hvala 0
17 godina
neaktivan
offline
RE: C++ tutorijali...


KONSTRUKTORI I DESTRUKTORI(KLASE)

 

Ne znam da li sam nešto rekao o konstruktorima ali od ponavljanja i viška sigurno ne boli glava.
Konstruktor je specijalna funkcija koja se odmah izvršava u glavnom programu
čim oformimo objekt(instancu dotične klase).
Znači odmah se izvršva čim navedemo ime objekta.
Zašto je tako ima i kratko objašnjenje.
Kad ste objekt definirali unutar jedne funkcije i on je lokalan unutar nje,on se i uništi
čim ta funkcija završi i na taj način se oslobađa memorija.Ali,kod globalnih objekata
on se uništava tek na kraju cijelog programa i zato postoje npr. konstruktori i destruktori.
općenito oznake su :

ime konstruktora je klasa
ime destruktora je ~klasa

 

Nemaju povratni tip.
Sad ću samo pokazati kako se piše kod bez izvršavanja:

     class  CKlasa

           {
                 char* pok;

                 int duzina;

               
              public:

                 CKlasa();      //konstruktor
                ~CKlasa()     //destruktor
                 //sad ovdje pišemo ostatak programa
          };   //završetak naše klase tj .  deklaracija u fajlu cpp.

Sad definicije naših konstruktora i destruktora u .h datoteci idu ovako:

CKlasa::CKlasa()             //u imenu je samo naziv nase klase i na taj način čim u glavnom programu
                                      //oformimo objekt tad se i stvori i izvrši konstruktor

  {
       pok = new char[1];
       *pok = '\0';
       duzina = 0;
  }

                                      //naravno čim nam više ne treba konstruktor tj. objekt  aktivira se destruktor
    CKlasa::~CKlasa()

        {

              delete [] pok
        }
                                     //znači da bi sad razumjeli ovaj početak u svezi konstruktora i destruktora
                                    //ponovite dinamičku alokaciju memorije i new i delete povezanost!!!
                                   //to sam već u tutorijalu objasnio pa da se ne vraćamo na to.

Taj ~ znak dobijete AltGr + broj 1.

Naravno sad slijede primjeri u obliku programa gdje će vam ovo sve biti
puno jasnije .Naravno ,strpite se.

Jednostavni primjer konstruktora i destruktora (napisano u VS-u) :

 

 

#include <iostream>
using namespace std;
//definicija klase u globalnom dijelu programa

class CKutija           //uobicajeni naziv(i klasa) kad se pisu knjige o c++-u
{
private:
    double visina;
    double duzina;
    double sirina;
public:

    CKutija(double v,double s,double d)//definicija konstruktora
    {
        cout<<"Pozvani konstruktor"<<endl;
        duzina=d;
        visina = v;
        sirina = s;
    }
    ~CKutija()
    {
        cout<<"Destruktor smo pozvali"<<endl;
    }

    //sad ide funkcija koja izracunava volumen nase kutije
    double volumen()
    {
        return duzina * visina * sirina;
    }
};
int main()
{
    CKutija kutija_1(23.4,34.5,45.6);    //deklaracija kutije_1 ali odmah i izvrsavanje

    CKutija kutija_2(12.3,34.4,56.6);    //jer je konstruktor pozvan
    double volumen_kutije =0.0; //deklaracija varijable u koju cemo spremiti izracun
        volumen_kutije = kutija_1.volumen();
    cout<<"Volumen prve kutije je : "<<volumen_kutije<<endl;
    cout<<"Volumen druge kutije je : "<<kutija_2.volumen()<<endl;
    cout<<endl;


    return 0;
}

//kad izvrsite program primjetite da se konstruktor i destruktor pojavljuju
//onoliko puta koliko smo objekata stvorili ,destruktor uvijek ide iza konstruktora

Dolje niže možete vidjeti sliku izvršenog programa!Pod nazivom CKutija_exe.
Detaljnije objašnjenje slijedi ali malo kasnije kad stignem.
Prije tog objašnjenja napraviti ću malu digresiju i samo konstruktor malo detaljnije objasniti
jer on ima veće značenje nego sam destruktor koji samo oslobađa memoriju(što je također važno).
Slijedi program koji možete u DEV-u napraviti :

#include<iostream>

using namespace std;


class P
   {
        private:
          int a;
         int b;
          public:
                            
//sad dolazi definicija konstruktora
             P()
               {
                    cout<<"Unesite a: "<<endl;
                    cin>>a;
                    cout<<"Unesite b: "<<endl;
                     cin>>b;
                }
            //sad funkcija s povratnim tipom ali se unutar sebe izvrsava
           int izracun(void)       //ali je void sto se tice parametara!!!!
                {
                     return(a*b);

                  }
   };//zavrsetak nase klase P

int main ()
   {
      P p ;      //cim smo dozvali klasu i deklarirali objekt odmah se i izvrsio nas konstruktor!!!!
      cout<<"Povrsina je " << p.izracun()<<"."<<endl;
     system("pause");
     return 0;
   }
 

    Znaci konstruktor je funkcija ilin metoda koja se izvrsava u trnutku formiranja objekta!!!!
 Uocite razliku izmedju funkcije int ali void parametara    i konstruktora.
Konstruktor tj . njegovo ime je ime klase.
I naravno primjetite kad se konstruktor izvršava!!!

Prije nego objasnim kod s klasom kutija ,samo da se vratim na prvi primjer koji sad napišite i
izvršite u Dev-u:

#include <iostream>
using namespace std;
class CKlas
 {
      private:
              char* p;
              int duzina;
              public:
                     CKlas()
                     {
                            cout<<"konstruktor"<<endl;
                            p = new char[1];
                            *p = '\0';
                            duzina = 0;
                     }
                     ~CKlas()
                     {
                             cout<<"Destruktor"<<endl;
                         delete [] p;
                     }
                     
   };
   int main()
   {
       CKlas ();
       
       system("pause");
       return 0;
       }
      

Inače programi se pišu bez da kažete unutar programa što se
izvršava kao što sam ja napisao,to je samo da vidite kad je naredu konstruktor a kad destruktor.
Eto ,dovoljno je samo navesti ime klase i pozivate konstruktor i njegov destruktor.
Naravno ,naredbe new i delete su međusobno povezane i one se koriste pri stavranju konstruktora i destruktora.

Sad možemo na objašnjenje drugog programa gdje sam također stavio da se pokaže
kad je naredu konstruktor a kad destruktor i naravno vi to u komercijalnim programima nećete stavljati,to je samo
za potrebe učenja.

CKutija(double v,double s,double d)//definicija konstruktor

Znači ,naš konstruktor ima parametre tipa double
Pomoću njh dolazimo do private članova tako da ih iniciijaliziramo s njima.

 

        duzina=d;
        visina = v;
        sirina = s;


Sad kad je to napravljeno ,odmah pri pozivu konstruktora se vrijednosti smještaju na svoja mjesta.

 

 CKutija kutija_1(23.4,34.5,45.6); //ovo je u biti taj oblik CKutija(double,double,double)

Vidite samo poštivamo poredak i proslijeđujemo argumente parametrima i konstruirali smo objekt i na njemu
odmah možemo vršiti radnju(funkciju).

kutija_1.volumen();//jer svi parametri su pomoću konstruktora unutra.

 

I sad kad je program gotov i da se ne bi memorija gušila podacima odmah slijedi destruktor i
čisti sve za nama!
U programu može biti i više konstruktora a ne samo jedan.
Nadam se da ste osnovni koncept postojanja i stavranja konstruktora shvatili .
Nije mi bio cilj zakomplicirati nego samo osnovna pravila o konstruktorima i njihovim destruktorima
objasniti.
Još će biti riječi o njima ali zasad toliko.
________________________________________________________________________________


Sad kad bi kod izmjenili tj.dodali deklaraciju treće kutije ali bez parametara:

#include <iostream>
using namespace std;
//definicija klase u globalnom dijelu programa

class CKutija           //uobicajeni naziv(i klasa) kad se pisu knjige o c++-u
{
private:
    double visina;
    double duzina;
    double sirina;
public:

    CKutija(double v,double s,double d)//definicija konstruktora
    {
        cout<<"Pozvani konstruktor"<<endl;
        duzina=d;
        visina = v;
        sirina = s;
    }
    ~CKutija()
    {
        cout<<"Destruktor smo pozvali"<<endl;
    }

    //sad ide funkcija koja izracunava volumen nase kutije
    double volumen()
    {
        return duzina * visina * sirina;
    }
};
int main()
{
    CKutija kutija_1(23.4,34.5,45.6);    //deklaracija kutije_1 ali odmah i izvrsavanje

    CKutija kutija_2(12.3,34.4,56.6);  
    CKutija kutija_3;                       //ovdje je deklaracija trece kutije i kad kompajlate doci ce do pogreške      
                                                  //jer je konstruktor pozvan
    double volumen_kutije =0.0; //deklaracija varijable u koju cemo spremiti izracun
        volumen_kutije = kutija_1.volumen();
    cout<<"Volumen prve kutije je : "<<volumen_kutije<<endl;
    cout<<"Volumen druge kutije je : "<<kutija_2.volumen()<<endl;
    cout<<endl;


    return 0;
}

//kad izvrsite program primjetite da se konstruktor i destruktor pojavljuju
//onoliko puta koliko smo objekata stvorili ,destruktor uvijek ide iza konstruktora


Došlo je do greške jer :
CKutija kutija_3;

kao takva deklaracioja traži defaultni konstruktor da bi se mogla izvršiti!!!
DEFAULTNI KONSTRUKTOR  je u biti konstruktor bez parametara ili argumenata.
Njega moramo dodati u public dio da bi program pravilno radio jer  deklaracija treće kutije traži baš takav
konstruktor a njegov naziv je gore spomenut i objašnjen.Znači ,defaultni konstruktor je bez argumeneta i
sad ćemo cijeli kod preurediti:

#include <iostream>
using namespace std;
//definicija klase u globalnom dijelu programa

class CKutija           //uobicajeni naziv(i klasa) kad se pisu knjige o c++-u
{
private:
    double visina;
    double duzina;
    double sirina;
public:

    CKutija(double v,double s,double d)//definicija konstruktora
    {
        cout<<"Pozvani konstruktor"<<endl;
        duzina=d;
        visina = v;
        sirina = s;
    }
    ~CKutija()
    {
        cout<<"Destruktor smo pozvali"<<endl;
    }
    CKutija()
    {    //ovdje je definicija i deklaracija naseg defaultnog konstruktora!!!!
        cout<<"Defaultni konstruktor je pozvan!!!"<<endl;
    }

    //sad ide funkcija koja izracunava volumen nase kutije
    double volumen()
    {
        return duzina * visina * sirina;
    }
};
int main()
{
    CKutija kutija_1(23.4,34.5,45.6);    //deklaracija kutije_1 ali odmah i izvrsavanje

    CKutija kutija_2(12.3,34.4,56.6);  
    CKutija kutija_3;      //bez argumenata pozivamo defaultni konstruktor
    //jer je konstruktor pozvan
    double volumen_kutije =0.0; //deklaracija varijable u koju cemo spremiti izracun
        volumen_kutije = kutija_1.volumen();
    cout<<"Volumen prve kutije je : "<<volumen_kutije<<endl;
    cout<<"Volumen druge kutije je : "<<kutija_2.volumen()<<endl;
    cout<<endl;


    return 0;
}

//kad izvrsite program primjetite da se konstruktor i destruktor pojavljuju
//onoliko puta koliko smo objekata stvorili ,destruktor uvijek ide iza konstruktora
//naravno i za defaultni konstruktor ide isti destruktor!!!!


Evo proučite dobro ove kodove i shvatiti čete zašto je default konstruktor u programu.
U slijedećem programu ćemo postavljati defaultne vrijednosti za naše parametre unutar konstruktora!
Mislim da sam negdje objasnio tamo pri prijenosu po vrijednosti defaultne argumente u funkciji i što
se dešava pri njihovom pozivu,naravno i ovo je sličan princip pa bi bilo dobro da ponovite funkcije,biti
će vam jasnije sve ovo dalje.
Naravno nastavljamo kad nađem vremena.
_________________________________________________________________________________

Još uvijek smo u defaultnim konstruktorima samo što u ovom slijedećem programu
smo parametrima  konstruktora proslijedili defaultne vrijednosti .Kad sad u glavnom programu zatražimo
konstruktor kutije_3 bez parametara,tad se defaultni konstruktor pojavljuje ali sad
sami obratite pažnju gdje sam izvršio izmjene i što sam izbrisao od prošlog programa gore iznad?
_________________________________________________________________________________

 

 

#include <iostream>
using namespace std;
//definicija klase u globalnom dijelu programa

class CKutija           //uobicajeni naziv(i klasa) kad se pisu knjige o c++-u
{
private:
    double visina;
    double duzina;
    double sirina;
public:
//sad nam je ovdje defaultni konstruktor ali i obicni "konstruktor"
    CKutija(double v=1.0,double s=1.0,double d=1.0)//definicija konstruktora
    {
        cout<<"Pozvani konstruktor"<<endl;
        duzina=d;
        visina = v;
        sirina = s;
    }
    ~CKutija()
    {
        cout<<"Destruktor smo pozvali"<<endl;
    }
    

    //sad ide funkcija koja izracunava volumen nase kutije
    double volumen()
    {
        return duzina * visina * sirina;
    }
};
int main()
{
    CKutija kutija_1(23.4,34.5,45.6);    //deklaracija kutije_1 ali odmah i izvrsavanje

    CKutija kutija_2(12.3,34.4,56.6);  
    CKutija kutija_3;      //bez argumenata pozivamo defaultni konstruktor
    //jer je konstruktor pozvan
    double volumen_kutije =0.0; //deklaracija varijable u koju cemo spremiti izracun
        volumen_kutije = kutija_1.volumen();
    cout<<"Volumen prve kutije je : "<<volumen_kutije<<endl;
    cout<<"Volumen druge kutije je : "<<kutija_2.volumen()<<endl;
    cout<<"Volumen trece kutije ali po defaultu(konstruktoru) je : "<<kutija_3.volumen()<<endl;
    cout<<endl;


    return 0;
}

//kad izvrsite program primjetite da se konstruktor i destruktor pojavljuju
//onoliko puta koliko smo objekata stvorili ,destruktor uvijek ide iza konstruktora
//naravno i za defaultni konstruktor ide isti destruktor!!!! U ovom programu smo
//konstruktoru dodijelili defaultne vrijednosti ako se u glavnom  programu
//zatrazi volumen kutije_3.......

Nadam se da sami vidite razliku i kako smo napravili defaultni konstruktor i na koji način se on poziva u programu.
Ovi kodovi su pisani u VS-u i tamo izvršavani.Ako ove kodove pišete u Dev-u ,neke linije u cmd-u vam se neće pokazati.
Razlika je naravno u veličini VS-a i njegovim headerima ,Dev je mali IDE ali posve funkcionalan za učenje.
Kratko objašnjenje ovog programa iznad možda uslijedi kasnije jer možete i sami dio po dio koda pisati i
vjerujem da vam nakon par ponavljanja neće biti teško sve povezati!!!
Samo upornim vježbanjem možete naučiti(osnove) ili bar shvatiti c++.
Nikako tek nakon čitanja ili pisanja par programa ne možete reći da sve znate....za tako nešto
minimalnoo tisuće i tisuće linija koda morate ispisati!
_______________________________________________________________________________________________

U isti program koji sam dosad objasnio unijeti ću male promjene tako da ima i poseban naziv:
INICIJALIZACIJSKA LISTA
Za usporedbu sam i ostavio "stari program" tako da uočite razliku:

/*#include <iostream>
using namespace std;
//definicija klase u globalnom dijelu programa

class CKutija           //uobicajeni naziv(i klasa) kad se pisu knjige o c++-u
{
private:
    double visina;
    double duzina;
    double sirina;
public:
//sad nam je ovdje defaultni konstruktor ali i obicni "konstruktor"
    CKutija(double v=1.0,double s=1.0,double d=1.0)//definicija konstruktora
    {
        cout<<"Pozvani konstruktor"<<endl;
        duzina=d;
        visina = v;
        sirina = s;
    }
    ~CKutija()
    {
        cout<<"Destruktor smo pozvali"<<endl;
    }
    

    //sad ide funkcija koja izracunava volumen nase kutije
    double volumen()
    {
        return duzina * visina * sirina;
    }
};
int main()
{
    CKutija kutija_1(23.4,34.5,45.6);    //deklaracija kutije_1 ali odmah i izvrsavanje

    CKutija kutija_2(12.3,34.4,56.6);  
    CKutija kutija_3;      //bez argumenata pozivamo defaultni konstruktor
    //jer je konstruktor pozvan
    double volumen_kutije =0.0; //deklaracija varijable u koju cemo spremiti izracun
        volumen_kutije = kutija_1.volumen();
    cout<<"Volumen prve kutije je : "<<volumen_kutije<<endl;
    cout<<"Volumen druge kutije je : "<<kutija_2.volumen()<<endl;
    cout<<"Volumen trece kutije ali po defaultu(konstruktoru) je : "<<kutija_3.volumen()<<endl;
    cout<<endl;


    return 0;
}

//kad izvrsite program primjetite da se konstruktor i destruktor pojavljuju
//onoliko puta koliko smo objekata stvorili ,destruktor uvijek ide iza konstruktora
//naravno i za defaultni konstruktor ide isti destruktor!!!! U ovom programu smo
//konstruktoru dodijelili defaultne vrijednosti ako se u glavnom  programu
//zatrazi volumen kutije_3.......
*/

#include <iostream>
using namespace std;
//definicija klase u globalnom dijelu programa

class CKutija           //uobicajeni naziv(i klasa) kad se pisu knjige o c++-u
{
private:
    double visina;
    double duzina;
    double sirina;
public:
//sad nam je ovdje defaultni konstruktor ali i obicni "konstruktor"
    CKutija(double v=1.0,double s=1.0,double d=1.0):duzina(d),visina(v),sirina(s)//definicija konstruktora kao inicijalizacijska lista

    {
        cout<<"Pozvani konstruktor"<<endl;
        
    }
    ~CKutija()
    {
        cout<<"Destruktor smo pozvali"<<endl;
    }
    

    //sad ide funkcija koja izracunava volumen nase kutije
    double volumen()
    {
        return duzina * visina * sirina;
    }
};
int main()
{
    CKutija kutija_1(23.4,34.5,45.6);    //deklaracija kutije_1 ali odmah i izvrsavanje

    CKutija kutija_2(12.3,34.4,56.6);  
    CKutija kutija_3;      //bez argumenata pozivamo defaultni konstruktor
    //jer je konstruktor pozvan
    double volumen_kutije =0.0; //deklaracija varijable u koju cemo spremiti izracun
        volumen_kutije = kutija_1.volumen();
    cout<<"Volumen prve kutije je : "<<volumen_kutije<<endl;
    cout<<"Volumen druge kutije je : "<<kutija_2.volumen()<<endl;
    cout<<"Volumen trece kutije ali po defaultu(konstruktoru) je : "<<kutija_3.volumen()<<endl;
    cout<<endl;


    return 0;
}

//kad izvrsite program primjetite da se konstruktor i destruktor pojavljuju
//onoliko puta koliko smo objekata stvorili ,destruktor uvijek ide iza konstruktora
//naravno i za defaultni konstruktor ide isti destruktor!!!! U ovom programu smo
//konstruktoru dodijelili defaultne vrijednosti ako se u glavnom  programu
//zatrazi volumen kutije_3.......

 

U ovom dijelu programa sam uveo tu promjenu u samu deklaraciju dok je tijelo između vitičastih zagrada ostavljeno za
ispis cout.

 CKutija(double v=1.0,double s=1.0,double d=1.0): duzina(d),visina(v),sirina(s)
//definicija konstruktora kao inicijalizacijska lista,primjetite dvotocku i kako se pridruzuju varijable!!!!


    {
        cout<<"Pozvani konstruktor"<<endl;      //u "tijelu " konstruktora nam je ostao samo ispis
        
    }

Primjetite i usporedite s prijašnjim programom i uočite kako se piše inicjializacijska lista!
Ovakav oblik postavljanja podataka često se koristi pa je bilo poželjno da o njemu nešto i kažem.
________________________________________________________________________________

 

 

 

 

 

CKutija_exe CKutija_exe
v_maxcpp
Poruka je uređivana zadnji put čet 26.6.2008 19:49 (v_maxcpp).
17 godina
neaktivan
offline
C++ tutorijali...

Još jedno pitanje o switch-string funkciji.

Shvatio sam da ona mora imat int u sebi,ali dali postoji način na koji bi se "zaobišlo" upisivanje broja.

 

npr:

 

#include<iostream>

#include<string>

 

using namespace std;

 

int main ()

{

string ime="ja";

int broj=1;

 

cout << "Unesite ime: ";

cin >> ime;

 

switch (broj)

{

case 1:

cout << "Ulogirani ste!";

break;

default:

cout << "Pogresno ime!";

}

system("PAUSE");

return 0;

}

 

 

Nelogično mi je da posle lozinke(ili bilo čega drugog) moram upisivat i broj(koji nema veza a unosom),dali postoji način da se taj broj poveže u inicijalizaciji sa stringom tako da kad se unese određeni string da se on(string) odmah poveže sa brojem(case 1,2...)?

Znam da se ovaj primjer može lakše napravit pomoću if-else funkcije,ali da li može i sa switchom?

Poruka je uređivana zadnji put pet 27.6.2008 20:50 (Quark).
Moj PC  
0 0 hvala 0
Nova poruka
E-mail:
Lozinka:
 
vrh stranice