[1] Uvod u C++

1

[1] Uvod u C++

offline
  • Fil  Male
  • Legendarni građanin
  • Pridružio: 11 Jun 2009
  • Poruke: 16586

==========================================
Za 4000-ti post i 3 godine sa vama --> novi članak Smile
==========================================




Philosophy:
- "Write once, compile everywhere"
- "Reuse, don't recreate"



Ovaj članak je namenjen za upoznavanje sa osnovama programskog jezika C++. Primeri i kodovi, koji će biti predstavljeni u tekstu su rađeni na operativnom sistemu Linux.

U ovoj seriji članaka neće biti detaljno objašnjeni neki slični koncepti koji su već objašnjeni u seriji članaka za C#. Članci se nalaze u ovom potforumu i izdvojeni su sa desne strane potforuma.

Takođe, valjalo bi se podsetiti i osnovnih koncepata u programskom jeziku C, kroz OVAJ Nikolin članak.

Konkretno, ovde će se, po mojoj preferenciji, obratiti pažnja na integer tipove, metode, promenljive (varijable), zaključno sa ponavljanjem naredbe if i petlji.

Za sledeći članak je planirano da se objasne klase, objekti, pokazivači i reference.


C++ je moderan i objektno-orijentisan programski jezik pomoću koga se mogu izraditi aplikacije visokih performansi. Bjarne Stroustrup je autor ovog programskog jezika, koji je zasnovan na programskom jeziku C. Pošto u programskom jeziku C operator "++" označava inkrementaciju, sa C++ Bjarne je hteo da ukaže da je ovaj programski jezik inkrementalno proširenje programskog jezika C (a ne potpuno nov jezik).


Da ne bi mnogo mudrovali, odmah krećemo u akciju Smile Napravićemo jednostavnu aplikaciju sa kojom su počeli i mnogi eksperti iz ove oblasti: Hello World! Smile

Za početak, otvorite neki text editor ( Idea nikako ne koristiti Word Processore, jer oni mogu ubaciti specijalne karaktere i javiti greške pri kompajliranju), na primer: Kate i ukucajte kod kao na sledećoj slici:



Slika 1: izvorni kod (source code) vaše prve aplikacije


... i sačuvajte datoteku kao Hello.cxx.

Idea Za sada ne morate ništa da ukapirate, sve će biti objašnjeno na kraju postupka i "u svoje vreme". Smile

Otvorite terminal i locirajte folder u kome se nalazi ova datoteka.



Slika 2: izvorni kod i generisana izvršna datoteka, i komande u terminalu


Ukucajte dve komande, kao sa slike 2. Prva komanda će na osnovu izvornog koda generisati izvršnu datoteku, tj. iskompajliraće kod, a druga će pokrenuti tu datoteku. Sa slike se vidi i rezultat: ispisano je Hello Word.

Idea Na kraju članka se nalazi deo o nepoznatoj terminologiji i napomenama/zanimljivostima.

Idea U članku su korišteni GNU kompajleri (gcc), koji postoje za više platformi. Naravno, neki od kompajlera mora biti instaliran, kako bi se kompajlirao kod.

Neki često korišteni kompajleri:

Citat:GCC (multiplatformski)
http://gcc.gnu.org/

Intel C++ Compiler (Linux, Windows, OS X)
http://www.intel.com/cd/software/products/asmo-na/eng/compilers/284132.htm

MS Visual C++ Compiler (Windows)
http://www.microsoft.com/express/vc/

MingW (Windows)
http://www.mingw.org/

Borland C++ Compiler (Windows)
http://www.borland.com




Exclamation Objašnjenje:

Arrow Ekstenzije:

- za izvorne datoteke su obično: .cpp, .cxx, .c++, .cp, ili .c.
U zavisnosti od kompajlera, ekstenzija datoteke može da igra veću ili manju ulogu. Za to treba pogledati dokumentaciju kompajlera (na primer, neki kompajleri ce .c datoteke tretirati isključivo kao kod pisan u programskom jeziku C).


- za objektne datoteke: .o
Nakon kompajliranja, stvara se objektna datoteka. Na Windowsu je ova ekstenzija .obj
Ova datoteka nije izvršna, a za to je zadužen linker. Ovaj međukorak ne vidimo, jer ga GCC sam odradi (ukoliko koristimo switcheve kao na slici 2).



Arrow Kratko objašnjenje izvornog koda: u include sekciji naznačavamo koje biblioteke ćemo koristiti za potrebe programa (konkretno, cout i endl). Using direktiva određuje konkretan namespace. Program se može napisati i bez ove direktive, ovako:



Slika 3: prikaz izvornog koda u razvojnom okruženju (IDE) Anjuta

Metoda main je metoda od koje počinje izvršavanje programa. Vitičastim zagradama je određen blok linija koda koji njoj pripada. Cout služi za štampanje teksta (uočiti specifičnu sintaksu), a sa endl prelazimo u novi red. Svaka main metoda, po pravilu vraća povratnu vrednost integer i na kraju main metode stoji "return 0".


Arrow za listu switcheva kompajlera, pogledajte man stranice; ukucajte u terminalu: "man g++". Takođe, saznajte više o GNU Linkeru, sa "man ld". Na kraju, proverite i info stranice: "info gcc".


Na sledećem primeru se može videti upotreba metoda (funkcija):



Slika 4: prikaz metode koja sabira dva broja u IDE Code Blocks


U primeru je deklarisana metoda "Zbir", koja se (kao i svaka druga metoda) sastoji iz zaglavlja (header) i tela (body).

- U zaglavlju metode naznačujemo koji je povratni tip metode (ovde: int), ime metode i parametre. U ovom primeru, ulazni paramteri su dva broja tipa int, koji treba da se saberu.

- U telu metode se nalaze naredbe, kojima se na odgovarajući način manipuliše sa parametrima. Svaka metoda vraća neku vrednost preko return direktive. Ukoliko izostavimo ovu direktivu podrazumevano se vraća void (povratna vrednost metode mora biti onog tipa definisanog u zaglavlju).

Main je specijalna metoda koja, po konvenciji, vraća 0 kako bi naznačila da je program normalno završio sa radom. U Linuxu (bash ili pdksh shell), preko sistemske varijable $? možemo pročitati povratnu vrednost main metode (kako bi utvrdili da li se program abnormalno završio. IZVOR).

Dalje, pored objekta cout, ovde se vidi i upotreba objekta cin. Dok se cout koristi za prosleđivanje neke poruke na ekran, cin se koristi za pribavljanje podataka prosleđenih sa tastature.

Obratiti pažnju i na pripadajuće simbole "<< " i ">>" (redirection symbols) koji se koriste uz cout i cin.


Preko "int a, b, c; " deklarisane su 3 varijable (promenljive) koje su tipa int.
Pošto je programima neophodan neki način da sačuvaju podatke, ovde varijable ulaze u igru.
--> Dakle, one predstavljaju izvesne podatke u memoriji i omogućavaju laku manipulaciju sa tim podacima. U ovom primeru je tip podatka int.

Što se tiče integera, svi integeri dolaze u dve varijante:

a) signed integer - ovi integeri mogu imati negativne vrednosti (minuse)
b) unsigned integer - ovi integeri nemaju negativne vrednosti (nema minusa)

Idea Ukoliko se ne naglasi ovaj parametar, podrazumeva se da je integer signed.

Zašto bi neko koristio pozitivne vrednosti brojeva?
Arrow budući da i signed i unsigned integer zauzimaju isti memorijski prostor - iz ovoga sledi da unsigned integer može da ima duplo više pozitivnih brojeva Smile
Na primer:
- ako signed short ima opseg: [-32768 , 32767],
- unsigned short će imati opseg [0 , 65535]

Exclamation Ukoliko dodelimo unsigned varijabli negativnu vrednost, javiće se compile time error.

Pošto tip definiše i alokaciju prostora u memoriji, na sledećem primeru se može proveriti koliko pojedini tipovi zahtevaju memorije na računaru:



Slika 5: prikaz zauzeća memorije kod raznih tipova u IDE NetBeans


Idea Već smo par puta na slikama pomenuli IDE - Integrated Development Environment. Za razliku od tekst editora, razvojna okruženja integrišu mogućnosti unosa i izmene koda, kompajliranje i razne druge mogućnosti, dakle, unutar samog okruženja. U ovoj temi je napravljen pregled razvojnih okruženja u Linuksu, sa linkovima za preuzimanje. Pojedina rešenja imaju i Windows varijante.

Kao što se može videti na slici 5, tip char zauzima 1 bajt (dakle može da sadrži 2^8 vrednosti, tj. 256 vrednosti), što je dovoljno za ASCII set karaktera (slova, brojevi i interpunkcijski znaci).

Na sledećem primeru se može videti povezanost karaktera i integera, tj. svakom karakteru odgovara neka brojčana vrednost:



Slika 6: rezultat kastovanja int vrednosti kao karaktera u Eclipse IDE-u


Ovaj jednostavan program ispisuje vrednosti karaktera za integere koji se kreću od 32 do 127.


Na sledećem primeru ćemo videti kako se vrši kontrola toka uz pomoć naredbe if:



Slika 7: primer pokazuje i upotrebu ternarnog operatora koji nekad može zameniti naredbu if


Primer je jednostavan: korisnik unosi dva broja, program ih poredi i vraća veći.

Takođe, sa slike se može videti i upotreba ternarnog operatora Smile Iz izlaza vidimo da vraća isti rezultat kao naredba if.

Dalje, u ovom primeru možemo videti kako izgleda jedan od načina komentarisanja u C++ . Kompajler će da ignoriše sve što je iza "//" (tzv. double slash) karaktera .

Gore navedeni komentar se odnosi samo na tekuću liniju koda.
Idea Ukoliko želimo da neki blok koda stavimo po komentar, upotrebićemo drugi tip komentarisanja, tzv. slash-star (/*) komentar. Kompajler će ignorisati sve linije, sve dok ne dođe na star-slash (*/) komentar.

Exclamation Dok se double slash ne zatvara, slash-star mora imati svog zatvarajućeg para star-slash.

Bitna stvar kod pravilne upotrebe metoda u C++ je da napravimo razliku između deklarisanja neke metode (tj. naznačavanje prototipa metode) i definisanja te metode.

--> Prototip metode (tj. njena deklaracija) kompajleru obezbeđuje uvid u ime, povratnu vrednost i parametre metode. Prototipi metoda se obično nalaze iznad metode main.

--> Definicija metode kompajleru naznačava šta ta metoda zapravi radi.

U OVOM (Anjuta), OVOM (DevCpp) i OVOM (SlickEdit) primeru možete videti deklaracije i definicije metoda.

Obratiti pažnju na komentare.

Idea Napomena: postoji slučaj kada prototip metode nije potrebno navoditi, i tada zapravo definicija metode obuhvata i njen prototip!
--> U ovom slučaju metoda se mora definisati pre nego što je neka druga metoda pozove!

Exclamation Ovo nije dobra praksa! Loša je konstantno voditi računa o redosledu metoda, dakle, o tome gde se koja metoda nalazi u kodu (takav kod se i teže održava).
Takođe, treba programirati "defanzivno" (defensive programming), odnosno, programirati na takav način da se potencijalne greške izbegnu što je više moguće.

Kao što se vidi iz primera, za prototip metode nije bitan konkretan parametar, već samo tip parametra (tako da nije greška ako se izostave sami parametri).

U primeru sa Anjutom, vidi se i opseg važenja neke varijable (scope).
--> varijable koje nisu definisane ni u jednoj metodi imaju globalni opseg i dostupne su za sve metode.
--> varijable koje se nalaze unutar metoda (bilo kao parametar, bilo u telu metode) imaju lokalni opseg.
--> ukoliko lokalna varijabla ima isti naziv kao globalna varijabla, radi se sa lokalnom varijablom (globalna se privrmeno "prikriva").
* iz primera se vidi da se može formirati i nezavisni blok komandi, i opseg varijable je vezan za taj blok.

Idea Da bi se izbegle eventualne greške, preporučuje se da se nazivi lokalnih i globalnij varijabli ne podudaraju.


U primeru sa DevCpp se vidi princip prenosa po vrednosti, odnosno promene nad argumentima neke funkcije B, ne menja vrednosti promenljivih pozivajuće funkcije A.

U primeru SlickEdit se vidi preopterećenje metoda (polimorfizam). U zavisnosti od tipa prosleđenog argumenta, pozvaće se odgovarajuća metoda Smile


SWITCH

U slučaju da program ima dosta uslovnih grananja, da ne bi pisali gomilu naredbi if, racionalnije je koristiti naredbu switch.

switch (izraz) {          case vrednost1: izraz; break;          case vrednost2: izraz; break;          case vrednost3: izraz; break;          case vrednostN: izraz; break;          default: izraz; }


Exclamation Članak ćemo zaključiti sa direktivom goto i pregledom petlji. Kako je ovo već objašnjeno u jednom o C# članaka, biće dati samo primeri upotrebe.


GOTO



Slika 8: primer sa direktivom goto. Izbegavati njenu upotrebu!


FOR



Slika 9: primer for petlje


Idea Rekurzija

Postavljeni problem se mogao rešiti i pomoću rekurzije. Obratite pažnju na kod:



Slika 10: rešavanje problema rekurzijom


Rekurzija se sastoji u konceptu da funkcija može da poziva samu sebe (unutar tela metode, poziva se ta ista metoda, koja opet može pozvati samu sebe). Nizom sukcesivnih povratnih vrednosti (budući da svaka pozvana metoda vraća neku vrednost) dobija se rešenje početnog problema.


WHILE i DO WHILE



Slika 10: primer upotrebe while do i while petlje



Pregled nekih korištenih termina



Interpreter - prevodi kod programa i programske instrukcije direktno u akcije.

Compiler - prevodi izvorni kod u prelaznu "međuformu". Ovaj proces prevođenja se naziva kompajliranje, a rezltat kompajiranja je object file.

Linker - nakon kompajliranja, kompajler poziva Linker, koji prevodi objektnu datoteku u izvršni program.

Encapsulation - tri su stuba objektno-orijentisanog programiranja: enkaspulacija, nasleđivanje (inheritance) i polimorfizam. Enkapsulacijom sakrivamo nebitne detalje i težiste bacamo na funkcionalnost (da bi vozili automobil ili biciklo, ne moramo znati na koji način su oni projektovani i implementirani).
Enkapsulacija je podržana kroz kreiranje korisnički-definisanih tipova - tj. klasa.
Dakle, možemo manipulisati sa objektom neke klase, a da ne znamo njegove promenljive (može se kontrolisati vidljivost članica klase).

Inheritance - odnosi se na kreiranje nove klase, koja predstavlja proširenje neke postojeće klase. Na primer, ukoliko imamo klasu "prevozno sredstsvo", možemo iz nje izvesti podklase (derived classes) "Automobil", "Motorcikl" i druge. Svaka od podklasa je specijalizovana na neki način, sa dodatnim promenljivim i/ili metodama (dok je nadklasa opštija).

Polymorphism - se zasniva na ideji na objekti različitih klasa mogu uraditi "pravu stvar". Na primer, metodom "nagaziDoDaske", naglo će ubrzati i objekat klase Kamion i objekat klase Automobil.

Library - programi se, tipično, kreiraju tako što se jedan ili više objektnih datoteka povezuju sa bibliotekama. Biblioteke mogu biti standardne (koje dolaze uz kompajler), korisnički napravljene i predstavljaju skup klasa ili metoda, koje ce biti uključene u neki program.

Parametar vs argument: parametar predstavlja deklaraciju tipa vrednosti koji će primiti neka metoda. Argument predstavlja konkretnu vrednost koja se prosleđuje metodi. Mnogo programeri, ova dva termina posmatraju kao sinonime (mada postoji jasna tehnička razlika).



Trivia/Napomene



* Kompajliran i interpretiran kod:

- kompajliran program je brži od interpretiranog (budući da je program preveden u mašinski jezik)
- kompajliran program se može pokretati i bez prisustva kompajlera, dok je kod interpretiranih programa neophodno prisustvo interpretera na računaru.
- neki programski jezici imaju tzv. Runtime Interpreter (na primer Java Virtual Machine)

* Operativni sistem Symbian je rađen u C++

* neki kompajleri zahtevaju i prototip za metodu (tj. funkciju) main. Tada se neposredno pre definisanja main metode treba dodati: "int main();"


* starije include direktive su imale ovakvu sintaksu: #include <iostream.h>

Moderne verzije kompajlera koriste sledeću sintaksu:

#include <iostream> using namespace std;
// dakle, mora se referencirati i odgovarajući namespace.


* defaults (podrazumevane vrednosti)
- ukoliko u metodi ne navedemo direktivu return, automatski će se vratiti void (nema vrednosti).
- ukoliko ne navedemo koji tip povratne vrednosti vraća neka metoda, default je int.


* escape character: \
"\" je specijalni karakter koji menja značenje karaktera koji se nalazi neposredno iza njega. U primerima se često koristi kombinacija \n sa prelazak u novi red i \t za umetanje taba (razmaka). Evo nekih kombinacija:




* kastovanje: (pretpostavimo da je x tipa int)

Citat://stari stil
float a = (float)x;

// noviji stil kastovanja
float b = static_cast<float>(y);



* Kada se dostigne maksimalna vrednost integera:
--> kreće se sa brojanjem ispočetka! Unsigned integer brojanje otpočinje od nule, a signed počinje od najmanje negativne vrednosti (npr. :-32768).

* naredba if:
if (x) je isto što i: if(x!=0)



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 12 Okt 2010
  • Poruke: 10904

jedno pitanje, koja je razlika između cout << endl i cout << "/n" ?



offline
  • Pridružio: 26 Avg 2010
  • Poruke: 10622
  • Gde živiš: Hypnos Control Room, Tokyo Metropolitan Government Building

mpman ::jedno pitanje, koja je razlika između cout << endl i cout << "/n" ?

Razlika je u tome šta više voliš. Smile

offline
  • Pridružio: 04 Jul 2011
  • Poruke: 5424

Nikakva, osim što je "\n" više u C žargonu. Smile

EDIT. Pisali smo u isto vrme... Smile

offline
  • Pridružio: 12 Okt 2010
  • Poruke: 10904

Hvala Ziveli

offline
  • Pridružio: 04 Jan 2012
  • Poruke: 2104

Koje sve vrste biblioteka postoje koje idu sa #include <> ?
Da li me razumete, na primer #include <iostream>, <windows.h>, <string> itd?Koliko ih još postoji?

offline
  • Més que un club
  • Glavni vokal @ Harpun
  • Pridružio: 27 Feb 2009
  • Poruke: 3898
  • Gde živiš: Novi Sad,Klisa

Imas ih gomilu,zavisi od kompajlera...mozes ti i sam napraviti svoju biblioteku Wink

offline
  • Fil  Male
  • Legendarni građanin
  • Pridružio: 11 Jun 2009
  • Poruke: 16586

Teoretski neogranicen broj,buduci da mozes da ukljucis i biblioteke koje sam/neko drugi napravi(s).

offline
  • Pridružio: 04 Jan 2012
  • Poruke: 2104

Koje biblioteke se najvise koriste, koje su najbitnije? Jel znate neki link o njima?

offline
  • Fil  Male
  • Legendarni građanin
  • Pridružio: 11 Jun 2009
  • Poruke: 16586

Zavisi od projekta do projekta. Kada skontas sta zelis da radis, izguglas i neophodne biblioteke ili napravis svoju.

Nakon toga gledas dokumentaciju za funkcije.
Potrebno je malo i googlati.

Evo standardne biblioteke, ona se koristi cesto:
http://en.wikipedia.org/wiki/C%2B%2B_Standard_Library

Ko je trenutno na forumu
 

Ukupno su 1355 korisnika na forumu :: 37 registrovanih, 10 sakrivenih i 1308 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., aleksmajstor, Alibaba1981, bladesu, Bobrock1, bojank, bojankrstc, ccoogg123, cemix, Dimitrise93, Dorcolac, dragoljub11987, FileFinder, GenZee, havoc995, ILGromovnik, JOntra, kovinacc, Kubovac, kuntalo, kybonacci, ljuba, madza, maiden6657, Mercury, Mihajlo, mile23, Misirac, opt1, pein, Seeker, shone34, Valter071, Zandar, zillbg, zzapNDjuric99, Čivi