offline
- Fil
- Legendarni građanin
- Pridružio: 11 Jun 2009
- Poruke: 16586
|
- 25Ovo se svidja korisnicima: Sass Drake, Springfield, NIx Car, Aleksandr1996, mcrule, daniel83, TwinHeadedEagle, ivance95, bluewortex, nikola9896, morando, p2all, Srki_82, Gedza98, DenisUA98, mpman, gsb, ACA 1997, vasa.93, acikabig, daxytt, Srki94, KlinkaPalacinka, E.L.I.T.E., Sale.S
Registruj se da bi pohvalio/la poruku!
==========================================
Za 4000-ti post i 3 godine sa vama --> novi članak
==========================================
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 Napravićemo jednostavnu aplikaciju sa kojom su počeli i mnogi eksperti iz ove oblasti: Hello World!
Za početak, otvorite neki text editor ( 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.
Za sada ne morate ništa da ukapirate, sve će biti objašnjeno na kraju postupka i "u svoje vreme".
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.
Na kraju članka se nalazi deo o nepoznatoj terminologiji i napomenama/zanimljivostima.
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
Objašnjenje:
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).
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".
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)
Ukoliko se ne naglasi ovaj parametar, podrazumeva se da je integer signed.
Zašto bi neko koristio pozitivne vrednosti brojeva?
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
Na primer:
- ako signed short ima opseg: [-32768 , 32767],
- unsigned short će imati opseg [0 , 65535]
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
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 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.
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.
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.
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!
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.
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
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;
}
Č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
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)
|