Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje > Pravljenje igara

Pravljenje igara Programski jezici, tehnike, alatke u službi pravljenja igara...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 15.8.2006, 2:11   #181
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Ajde da budem ponovo malo od koristi

Sa ove adrese možete da skinete najčešće postavljena pitanja u vezi knjige "Teach yourself C++ in 21 days" koju izdaje SAMS.

http://www.libertyassociates.com/pages/faqbook_edit.htm

Na sledećoj adresi možete da pronađete spisak grešaka za pomenutu knjigu. Ova lista grešaka važi za prvo i drugo izdanje koja su najviše rasprostranjena kod nas.

http://www.libertyassociates.com/pages/e21book_edit.htm
holodoc je offline   Odgovor sa citatom ove poruke
Stara 15.8.2006, 11:45   #182
priest (of_the_moon)
Član
 
Član od: 4.3.2006.
Lokacija: grad u oblacima
Poruke: 288
Zahvalnice: 1
Zahvaljeno 5 puta na 4 poruka
Određen forumom Re: objasnjenja pocetniku

Citat:
holodoc kaže:
Jedna mala napomena kod tvog koda. Nije dobra praksa da funkcija "main" vraća "void" tip podataka, tj. ne vraća nikakvu vrednost, a pojedini kompajleri (recimo onaj koji većina ovde koristi, DevC++) ne dozvoljava "void" kao povratnu vrednost već isključivo "int".
Navika, a nisam ga ni isprobao.
priest (of_the_moon) je offline   Odgovor sa citatom ove poruke
Stara 15.8.2006, 11:54   #183
priest (of_the_moon)
Član
 
Član od: 4.3.2006.
Lokacija: grad u oblacima
Poruke: 288
Zahvalnice: 1
Zahvaljeno 5 puta na 4 poruka
Određen forumom Re: objasnjenja pocetniku

Pišem ovo od justros, i ne izgleda loše, barem je bolje od glupih rasprava...
Osnovne stvari, korak po korak.
Priloženi fajlovi
Tip fajla: zip Lekcija 1.zip (3,5 KB, 61 puta viđeno)

Poslednja ispravka: priest (of_the_moon) (15.8.2006 u 12:15) Razlog: update tutorijala
priest (of_the_moon) je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku priest (of_the_moon) na korisnoj poruci:
masteri (29.5.2008)
Stara 15.8.2006, 12:36   #184
Andross
Kekule Mekule
 
Avatar korisnika Andross
 
Član od: 8.12.2005.
Lokacija: Beograd
Poruke: 3.612
Zahvalnice: 549
Zahvaljeno 964 puta na 514 poruka
Slanje poruke preko Skypea korisniku Andross
Određen forumom Re: objasnjenja pocetniku

Da to za winMain sam i ja video.Btw. ako kompajlirate pomocu Dev-C++-a a nemate projekat za Win32 GUI tj. samo source kompajlirate pojavljivace se konzola(uvek ali uvek).Konacno predjoh prvi tutor za OpenGL sa nehe.gamedev.net .Damn it's hard!
Evo neki mali program za pocetnike:
Kod:
#include <iostream>
int main()
{
    int temperatura;     // varijabla cuva vrednost temperature jela
    std::cout << "Kolika je temperatura jela?" << std::endl;
    std::cin >> temperatura;
    if(temperatura < 50)   // ako je temperatura manja od 50
    { 
       std::cout << "Kuvaj jos malo." << std::endl;
    }
    else
    {
       std::cout << "Jelo je spremljeno." << std::endl;
    }
    system("pause");
    return 0;
}
Evo koda sa if/else iskazom.Ove viticaste zagrade u ovom slucaju ne moraju al' sam ih dodao zbog preglednosti i citljivosti.
Note #1: Ako u if/else iskazu imate veci kod(ne samo jedan izraz), viticaste zagrade su neophodne.
Note #2: U slucaju vecih ugnjezdenih if/else iskaza koristite switch
Note #3: system("pause") meni da Dev-C++ radi odlicno bez dodatnih headera.
Andross je offline   Odgovor sa citatom ove poruke
Stara 15.8.2006, 13:08   #185
EclipsE
Starosedelac
 
Član od: 16.4.2006.
Lokacija: Scary Movie Reputacija: ■■□
Poruke: 1.337
Zahvalnice: 378
Zahvaljeno 278 puta na 195 poruka
Slanje poruke preko Skypea korisniku EclipsE
Određen forumom Re: objasnjenja pocetniku

Vidim samo c++, c++ i c++... Znaci moracu da otvorim novu temu i da pokazujem drugima kako je VB laksi...
EclipsE je offline   Odgovor sa citatom ove poruke
Stara 15.8.2006, 18:21   #186
Andross
Kekule Mekule
 
Avatar korisnika Andross
 
Član od: 8.12.2005.
Lokacija: Beograd
Poruke: 3.612
Zahvalnice: 549
Zahvaljeno 964 puta na 514 poruka
Slanje poruke preko Skypea korisniku Andross
Određen forumom Re: objasnjenja pocetniku

I kako je za igre slabiji od C++-a
Andross je offline   Odgovor sa citatom ove poruke
Stara 16.8.2006, 1:28   #187
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Ajde da ja ponovo umešam prste malo pošto vidim da se niko ne žali na probleme u učenju

Prvo mali komentar na tutorijal (Lekcija1) od priest_of_the_moon-a. Čoveče promeni ime ubih se pokušavajući da ga „ubodem“

Odmah na početku jedan mali komentar po pitanju pisanja komentara Iako je u ovom konkretnom slučaju priest_of_the_moon bogato komentarisao sam kod, što je ajde da kažemo u ovoj situaciji sasvim ok, u praksi nikada ne treba baš ovoliko koristiti komentare. Komentari treba da budu kratki i precizni i da daju sasvim jasne informacije o tome šta konkretni deo programa radi.

Odmah na početku ne bi bilo zgoreg pokazati kako treba da izgleda jedno profesionalno zaglavlje na koje ćete naleteti u skoro svim ozbiljnijim projektima. Pisanje ovog zaglavlja treba da postane navika još od samog početka jer će često to zaglavlje pomoći autoru koda da se bolje orijentiše šta je u konkretnom primeru rađeno.

Primer jednog standardnog zaglavlja (naravno u engleskoj verziji) dato je u sledećem kodu.

Kod:
/************************************************************

Program:      Naziv programa (recimo “Hello world”)

File:         Naziv fajla (recimo “HelloWorld.cpp”)

Function:     Ukoliko je reč o fajlu koji se koristi kao header u glavnom C++ fajlu onda se ovde daje pun naziv headera i funkcija koje su u njemu sadržane.

Description:  Kratak opis toga šta konkretni program treba da uradi. Recimo „Ispis reči Hello World na ekranu“.

Author:       Ovde ide naziv autora punim imenom i prezimenom.

Environment:  Ova stavka se koristi da bi se okarakterisalo okruženje (hardversko i softversko) na kome je kod razvijan.
Primera radi: “Microsoft Visual C++ ver. 6, Windows XP Professional, AMD Athlon 64 3000+, 2GB RAM)

Notes:        Beleške autora o kodu.

Revisions:    Ovde se upisuje spisak svih verzija i njenih revizija. Obično se navede tačan naziv verzije i revizije, na šta se doda datum objave, ime autora i par reči o vrsti ispravke.
Primera radi:
	      “1.00  10/1/94 (jl) First release”
              “1.01  10/2/94 (jl) Capitalized "World"”

************************************************************/
holodoc je offline   Odgovor sa citatom ove poruke
Stara 16.8.2006, 1:30   #188
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Sada sledi jedna napomena u vezi pomenutog korišćenja „if...else if....else ... end if“ i „switch“ komande za kontrolu toka programa.

Treba zapamtiti da „switch“ (o kome će biti više reči u jednom malom tutorijalu koji spremam za sutra pa se zato spremite za malu interesantnu avanturu ) ne može u nekim slučajevima da zameni „if“ a razlog je taj da „switch“ može da ispituje samo jedan uslov na svom početku nakon čega izvršava deo koda koji ispunjava dati slučaj. Zbog toga je „switch“ recimo korisno iskoristiti u slučajevima kada je potrebno na osnovu nekog povratnog rezultata funkcije izvršiti određeni deo koda. Recimo, imate neku funkciju „ispisi_warp_brzinu“ (mali uvod u sutrašnji program ) koja vraća celobrojni broj funkciji koja ga je pozvala (pričali smo o tome kada smo spominjali „return“ na kraju funkcije. Ta povratna vrednost se vraća funkciji koja je pozvala „ispisi_warp_brzinu“, u konkretnom slučaju recimo sama „main“ funkcija, pa bi recimo „switch“ mogao da se iskoristi da bi se odredilo kako da glavni program reaguje na osnovu različitih povratnih rezultata funkcije. U tom slučaju bi „switch“ bio idealan.

Međutim, ponekad „switch“ nije dovoljan jer je potrebno usput proveriti još neki uslov. Tada se koristi „if... else if ...else...end if“ kontrola toka.

Znam da sve ovo što sam naveo možda trenutno deluje konfuzno ali nije mi ni bio krajnji cilj da zalazim dublje u temu već čisto informativno da se razgraniči da „switch“ nije svemoćan. O svemu ovome se priča prilikom obrade poglavlja „Kontrola toka“ u bilo kojoj C++-knjizi.

Još jedna stvarčica koju bih želeo da napomenem je vezana za tzv. „entry point“ koji je pomenut. Naime, treba shvatiti šta „entry point“ u stvari znači. Dakle, svaki kompajler će prilikom kompajliranja koda prvo potražiti funkciju koja se zove „main“ (zbog toga jedna jedina funkcija kojoj morati dati ime koje zahteva kompajler je „main“ i ona mora postojati u vašem kodu). Znači, bez obzira da li se ispred (bliže vrhu) nalazilo još dvadeset funkcija, izvršavanje krajnjeg programa uvek počinje od funkcije „main“. Evo primera:

Kod:
#include <iostream>

void ispisi_warp_brzinu(){
...

}

boolean brod_u_warpu(){
...
return true;
}

int main(){
.....
}
Napomena: nemojte da probate da kompajlirate ovaj kod jer neće da radi sigurno

U ovom konkretnom slučaju izvršavanje će početi od funkcije main bez obzira što se „ispred“ nje nalazi par funkcija. Pomenute funkcije se pozivaju iz same „main“ (ili uopšte neke druge) funkcije. No, kako su funkcije takođe malo naprednija tema neću o njima sada.

Mislim da je za večeras bilo dosta a nadam se da ću sutra stići da pripremim nešto malo interesantnije
holodoc je offline   Odgovor sa citatom ove poruke
Stara 16.8.2006, 20:00   #189
Andross
Kekule Mekule
 
Avatar korisnika Andross
 
Član od: 8.12.2005.
Lokacija: Beograd
Poruke: 3.612
Zahvalnice: 549
Zahvaljeno 964 puta na 514 poruka
Slanje poruke preko Skypea korisniku Andross
Određen forumom Re: objasnjenja pocetniku

Ajmo sada kratak uvod u funkcije:
Kod:
#include <iostream>

int izracunajPovrsinu(int, duz, int sir)    // nasa funkcija prima dva parametra    
{
    return (duz * sir);
}

int main()
{
    int povr, duzi, siri;
    std::cout << "Unesite duzinu: ";
    std::cin >> duzi;
    std::cout << "\nUnesite sirinu: ";
    std::cin >> siri;
    povr = izracunajPovrsinu(duzi, siri);
    std::cout << "Povrsina je: " << povr << std::endl;
    system("pause");
    return 0;
}
Evo ovde imamo funckiju povratnog tipa int.Njeg zadatak je da izracuna povrsinu(jednostavno vrati duzinu * sirinu).Sada funkcija je pre main jer ako bi je stavili posle ona ne bi znala gde da je nadje.U tom slucaju pravimo prototip(tj. deklarisemo)funcije.Kako se to radi?Lepo samo napisemo pre main:
Kod:
int izracunajPovrsinu(int, int);
Sada ovde sam izostavio nazive parametara.To nije bitno mozete dodeliti naziv a i nemorate(ali u implementaciji mora!!!).Sada red:
Kod:
povr = izracunajPovrsinu(duzi, siri);
oznacava pozivanje nase funcije.Sada zasto povr = ?Pa da smo samo pozvali funciju vratila bi vrednost u prazno i nista ne bismo uradili.Ovako je dodeljuje varijabli.Nadam se da sam bio dovoljno jasan!Ako nesto nije jasno pitajte ovde ili me cimnite na shadowfilip@hotmail.com .U sledecem tutorijalu krecemo sa petljama!Pozz.
Andross je offline   Odgovor sa citatom ove poruke
Stara 16.8.2006, 20:06   #190
bobi
Deo inventara foruma
 
Član od: 6.11.2005.
Lokacija: Iznad reke, ispod drveća.
Poruke: 3.218
Zahvalnice: 58
Zahvaljeno 329 puta na 180 poruka
Određen forumom Re: objasnjenja pocetniku

I na kraju shvatis - ipak je najbolje prodavati semenke pokraj stadiona.
(Androsse, ipak ima i treci nacin )
bobi je offline   Odgovor sa citatom ove poruke
Stara 16.8.2006, 20:10   #191
Andross
Kekule Mekule
 
Avatar korisnika Andross
 
Član od: 8.12.2005.
Lokacija: Beograd
Poruke: 3.612
Zahvalnice: 549
Zahvaljeno 964 puta na 514 poruka
Slanje poruke preko Skypea korisniku Andross
Određen forumom Re: objasnjenja pocetniku

Da, da. Ako mislis na funciju moze ona i ovako:
Kod:
int izracunajPovrsinu(int duz, int sir)   // ne, ne jedemo sir :)
{
    int povrsina = duz * sir;
    return povrsina;
}
Ovde samo deklarisemo lokalnu promenljivu kojoj dodeljujemo vrednost duz * sir pa je vracamo.Uostalom povrsina se gubi cim se funcija zavrsi.
Andross je offline   Odgovor sa citatom ove poruke
Stara 16.8.2006, 20:19   #192
bobi
Deo inventara foruma
 
Član od: 6.11.2005.
Lokacija: Iznad reke, ispod drveća.
Poruke: 3.218
Zahvalnice: 58
Zahvaljeno 329 puta na 180 poruka
Određen forumom Re: objasnjenja pocetniku

Citat:
ANDROSS kaže:
Da, da. Ako mislis na funciju moze ona i ovako:
Kod:
int izracunajPovrsinu(int duz, int sir)   // ne, ne jedemo sir :)
{
    int povrsina = duz * sir;
    return povrsina;
}
Ovde samo deklarisemo lokalnu promenljivu kojoj dodeljujemo vrednost duz * sir pa je vracamo.Uostalom povrsina se gubi cim se funcija zavrsi.
Da, samo si pogresno ime dao promenljivama.
treba dodati...
integer povrsina = tepsija
int duz = semenka
int sir = so
Tako da dolazimo do formule:
if tepsija < semenka and so then tepsija * 2

salim se naravo (ovo je neka kombinacija komodoreovog basica i c++a, hihihihihi ...)

Vidis, i ja nesto naucih.
bobi je offline   Odgovor sa citatom ove poruke
Stara 16.8.2006, 20:26   #193
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

ANDROSS-e imaš jednu veliku logičku grešku u tvom programu koja je više praktične prirode

Tvoja funkcija za izračunavanje površine prima celobrojne vrednosti kao argumente i isto tako vraća celobrojne vrednosti kao rezultat što je veoma redak slučaj

U gotovo svim vrstama izračunavanja (a posebno u game dev-u) koristiće se „double“ tip podataka. Znači logičnije bi bilo da umesto celobrojnih vrednosti (int) kao argumente i povratne vrednosti koristiš brojeve u pokretnom zarezu dvostruke preciznosti (double).

A i mislim da je za funkcije još uvek prerano. Pa još niko nije dotakao ozbiljnije delove o kontroli toka, operatorima i sl. Ako stignem večeras postovaću par primera
holodoc je offline   Odgovor sa citatom ove poruke
Stara 17.8.2006, 0:36   #194
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Pošto vidim da ste se malo bacili na „neozbiljan“ pristup programiranju i da je tu već počelo čašćavanje gibanicom i kiselim mlekom ajde da vam ovog puta malo zadam nešto interesantnije što će vas nadam se malo uozbiljiti

Kao prvo evo koda koji treba da demonstrira neke veoma interesantne (i pre svega korisne) stvari u C++-programima. Zarad ozbiljnosti ovo je primer kako bi jedan pravi pravcati kod trebao da izgleda. Kod sadrži jedno zaglavlje u skraćenoj varijanti jer ovo je ipak školski primer koji treba samo da služi za demonstraciju.

Kod:
/*********************************************
Ovo je skarceni oblik zaglavlja :)

Naziv: WarpBrzina

File: WarpBrzina.cpp

Author: holodoc

Date: 16.08.2006.

Opis: Porgram sluzi za demonstraciju nekih jako korisnih stvari u C++-u. Program 
ispisuje vrednost odgovarajuceg warp faktora i odnos brzine date warp faktorom i 
brzine svetlosti.

************************************************/
#include <iostream> // otvaranje standardnog "stream" ulaza-izlaza
#include <cmath> // ovo nam treba za pow() funkciju
#define BROJ_LINIJA 20 //definisanje broja linija za ispis po ekranu

using namespace std; // ovaj put zbog preglednosti koda koristim ovu deklaraciju

int main()
{
    double warp,korak; // deklaracija promenjljivih warp i korak
    int brojac_linija; // deklaracija promenjljive brojac_linija
    brojac_linija = 0;
    //sledi ispis zaglavlja koji pocinje ovde
    cout << "****************************************************" << endl;
    cout << "**** Star Trek Warp factor comparator v0.1alpha ****" << endl;
    cout << "****************************************************\n" << endl;
    // a zavrsava se ovde
    cout << "Lt. LaForge: \"Koji korak ispisa zelite kapetane?:\"\n"; // korak?
    cout << "Capt. Picard: \"Neka korak bude ";
    cin >> korak; //unos koraka
    cout << "\n\nWarp faktor\tBrzina svetlosti\n"; //prikaz malog zaglavlja
        for(warp = 0.0;warp < (10 - korak);warp+=korak){ //ovde pocinje kompletan posao
            cout << warp << "\t ->\t" << pow(warp,3.333333) << "x\n"; //ispis warp faktora
            brojac_linija++; //inkrementiranje brojaca
            if(brojac_linija == BROJ_LINIJA){ //ukoliko je ispisan granicni broj linija
                cout << "Lt. LaForge: \"Kapetane dajte komandu za nastavak ispisa...\""; //ispisi tekst
                fflush(stdin); //obrisi bufferovane ENTER-e
                cin.get(); //cekaj ENTER za nastavak
                cout << "Capt. Picard: \"Make it so!\"\n\n";
                brojac_linija = 0; //resetuj brojac linija
            }    
        }
    cout << "Lt. Comm. Data: \"Zalim ali warp faktor 10 nije moguce dostici kapetane!\"\n";
    cout << "Capt. Picard: \"Pa naravno da sam znao za to :)\"\n\n";
    cout << "Lt. Comm. \"Data: Pritisnite ENTER kapetane!\"";
    fflush(stdin); //obrisi bufferovane ENTER-e
    cin.get(); //cekaj ENTER za izlazak iz programa
    return 0;
}

Poslednja ispravka: holodoc (17.8.2006 u 1:14)
holodoc je offline   Odgovor sa citatom ove poruke
Stara 17.8.2006, 0:37   #195
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Generalno o čemu se radi u ovom programu. Svi koji su upoznati sa Star Trek-om znaju da se za merenje brzine kretanja objekata koji koriste FTL (Faster Than Light) tehnologiju koristi jedinica „warp“. U principu FTL tehnologija znači da se objekti kreću brzinama većim od brzine svetlosti a da ne bi zalazili u dubinu toga da li je ovo izvodljivo ili ne (zahvaljujući Ajnštajnu ) ograničićemo se za sada na pretpostavku da je to moguće. Program jednostavno ispisuje odgovarajuću vrednost warp faktora i za tu vrednost prikazuje koliko je taj warp faktor „brži“ od brzine svetlosti. Recimo, warp faktor 1 je ekvivalentan brzini svetlosti 3*10 E+08 metara u sekundiili u prevodu 300 000 000 m/s. No sve ovo nije bitno već je važno da se napomene da se relacija između udela brzine svetlosti i warp faktora iskazuje veoma jednostavnom formulom koja glasi:

Udeo brzine svetlosti = warp faktor ^ 3.333333......

U suštini prava formula glasi „warp faktor na treći koren iz deset“.

Još jedna napomena a to je da ova empirijska formula ne važi na brzinama približnim warp faktoru 10 jer je ovaj faktor teorijski nemoguće dostići zbog tzv. „relativističkog cepanja vremena“, bla, bla, bla,..... Koga ovo više interesuje neka sam potraži „Faster Than Light“ na internetu ili neka me cimne na private da mu pošaljem neke interesantne tekstove i knjige na ovu temu. Za sada je ovo bilo dovoljno za upoznavanje sa time šta program treba da uradi.

Krećemo sa analizom koda.

Prvih par linija:

Kod:
#include <iostream> // otvaranje standardnog "stream" ulaza-izlaza
#include <cmath> // ovo nam treba za pow() funkciju
#define BROJ_LINIJA 20 //definisanje broja linija za ispis po ekranu
ne bi trebalo da predstavljaju neki problem osim ove poslednje linije. O čemu se ovde uopšte radi. „#define“ se zove pretprocesorska direktiva i služi za direktno prosleđivanje podataka kompajleru u toku prve faze prolaska kroz kod. Naime, pre nego što počne sa tumačenjem koda kompajler pravi tzv. „prvi prolaz“ pri čemu vrši rezervisanje memorije za promenjljive, nizove, sortiranje tabele podataka itd. Pored svega toga kompajler proverava da li postoje pretprocesorske direktive i ako da (u ovom slučaju „#define“) u tom slučaju ih izvršava. Konkretno „#define“ služi da se kompajleru kaže da „promenjljiva“ koja se naziva „BROJ_LINIJA“ sadrži vrednost 20. Zašto sam stavio reč „promenjljiva“ pod navodnike? Iz jednostavnog razloga što vrednosti definisane „#define“ pretprocesorskom direktivom nije baš moguće svrstati pod kategoriju konstanti zbog nekih svojih specifičnosti.
holodoc je offline   Odgovor sa citatom ove poruke
Stara 17.8.2006, 0:38   #196
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Postavlja se naravno i pitanje zašto nismo jednostavno negde na početku koda deklarisali jednu promenjljivu tipa int i definisali njenu vrednost na 20. E pa „#define“ ima za cilj da programeru omogući da veoma lako i jednostavno odmah na početku koda ima pristup nekim od najvažnijih vrednosti u programu. Ovakav način rada je veoma brz i efikasan pa bi trebao da postane praksa prilikom pisanja koda. Inače, sve promenjljive definisane „#define-om “ se po dogovoru pišu velikim slovom i bez prekida. Osim „#define“ direktive postoji još mnogo njih ali za sada je ovo dovoljno.

Inače, zaglavlje „#include<cmath>“ sadrži neke od veoma važnih matematičkih funkcija u C++-u pa pošto ćemo ovde koristiti funckiju pow() potrebno je „include-ovati“ ovo zaglavlje.

Oko „using namespace std;“ se nećemo više raspravljati jer je stvarno bilo priče o ovome mnogo puta u okviru ove teme.

Sledi deo u kome definišemo neke važne promenjljive.

Kod:
double warp,korak; // deklaracija promenjljivih warp i korak
int brojac_linija; // deklaracija promenjljive brojac_linija
brojac_linija = 0;
Prva promenjljiva „warp“ treba da sadrži trenutnu vrednost warp faktora koji se obrađuje, „korak“ sadrži vrednost na osnovu koje će se warp povećavati (inkrementirati) u svakom koraku dok „brojac_linija“ služi kao brojač ispisanih linija na ekranu na osnovu koga se zaustavlja ispis teksta kada ova promenljiva dostigne određenu vrednost. Ovde treba voditi računa o jednoj jako bitnoj stvarčici a to je da je sve vrednosti promenljivih posle njihove deklaracije potrebno i definisati, odnosno postaviti na njihove početne vrednosti. Razlog za to leži u tome što ako je neko primetio stalno u ovoj priči pominjem reči „deklaracija“ i „definicija“. Te dve stvari treba obavezno razlikovati! Dok „defincija“ promenjljive samo znači da se „objavljuje“ njeno postojanje kompajleru, „definicija“ znači da joj se dodeljuje memorijski prostor i usput možda i početna vrednost. Definicija bi u gornjem slučaju bio red „int brojac_linija;“ dok bi deklaracija sa inicijalizacijom (postavljanjem početne vrednosti) bio red „brojac_linija = 0“. Neko bi pitao zašto je sada toliko važno da se početna vrednost neke promenjljive postavi na početnu vrednost pre upotrebe. Iz jednostavnog razloga što ako se promenjljiva samo „definiše“ interno joj se dodeljuje vrednost sadržaja neke memorijske lokacije tako da je prilikom definicije promenjljive „brojac_linija“ ova najverovatnije dobila neku vrednost tipa „154515343584“ itd. Jasno je zašto bi ovo bilo pogubno prilikom upotrebe brojača u for-next petlji. Eksplicitnu dodela vrednosti ostalim dvema promenljivama „warp“ i „korak“ nije neophodna jer se prva inicijalizuje na početku for-next petlje a druga se odmah na početku programa zamenjuje unosom korisnika. Znači, pod obavezno staviti da se sve „definisane“ promenljive moraju eksplicitno „deklarisati“ odnosno postaviti na početnu vrednost
holodoc je offline   Odgovor sa citatom ove poruke
Stara 17.8.2006, 0:40   #197
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Sledi ispis nekog standardnog zaglavlja da ne bi bilo ono „iz neba pa u rebra“ jer korisnik često ne može da vidi sve one male korisne komentare koje vidi programer.

Kod:
cout << "****************************************************" << endl;
cout << "**** Star Trek Warp factor comparator v0.1alpha ****" << endl;
cout << "****************************************************\n" << endl;
Ovde treba obratiti pažnju na „endl;“ kao alternativni način da se prosledi ekranu novi red. Takođe, u trećem redu se vidi da se mogu koristiti i specijalni znaci („\n“) u kombinaciji sa „endl;“. Ovde bi bilo važno da se shvati šta je konkretno taj „stream“ za čiju se kontrolu prevashodno koristi zaglavlje „iostream“ i još nekoliko dodatnih, za sada manje važnih.

„Stream“ treba shvatiti kao kanal kroz koji prolaze podaci. Postoji dva tipa: ulazni (stdin) i izlazni(stdout) i razlika je samo što se „stdin“ koristi za primanje podataka a stdout za njihovo ispisivanje (najčešće na ekran). Znači, kada se stream jednom „otvori“ (komandom „cout“) on prihvata redno svaki podatak koji mu se prosledi. Oni podaci koji se iskoriste u toku obrade „izlaze“ iz „stream-a“ dok oni koji ne prođu obradu ostaju „bufferovani“ u memoriji. Upravo u tome je problem kada sam pričao o „prebrzom“ ENTER-u kod unosa podataka. O tome kasnije.

Sledeći deo bi takođe trebao da bude jasan. Čisto teatralnosti radi uklopio sam sve u scenu iz Star Trek-a
Kod:
cout << "Lt. LaForge: \"Koji korak ispisa zelite kapetane?:\"\n"; // korak?
cout << "Capt. Picard: \"Neka korak bude ";
cin >> korak; //unos koraka
cout << "\n\nWarp faktor\tBrzina svetlosti\n"; //prikaz malog zaglavlja
Ovde se vidi primena „\n“ na početku ispisa „streama“. Treba se malo zadržati na isporbavanju različitih kombinacija postavljanja specijalnih karaktera pri ispisu.

Sad tek počinje zabava

Kod:
for(warp = 0.0;warp < 10;warp+=korak){ //ovde pocinje kompletan posao
            cout << warp << "\t ->\t" << pow(warp,3.333333) << "x\n"; //ispis warp faktora
            brojac_linija++; //inkrementiranje brojaca
            if(brojac_linija == BROJ_LINIJA){ //ukoliko je ispisan granicni broj linija
                cout << "Lt. LaForge: \"Kapetane dajte komandu za nastavak ispisa...\""; //ispisi tekst
                fflush(stdin); //obrisi bufferovane ENTER-e
                cin.get(); //cekaj ENTER za nastavak
                cout << "Capt. Picard: \"Make it so!\"\n\n";
                brojac_linija = 0; //resetuj brojac linija
            }    
        }
holodoc je offline   Odgovor sa citatom ove poruke
Stara 17.8.2006, 0:41   #198
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Ovde se demostrira upotreba for-next petlje u ulozi brojača. For-next petlja u zagradama sadrži tri podatka odvojena sa „;“ pri čemu je samo srednji obavezno navesti dok su druga dva opciona. U okviru ove konkretne petlje prva stavka „warp=0.0“ služi za postavljanje početne vrednosti brojanja. Mala napomena. Za potrebe brojanja ovde nam je potrebna promenjljiva koja može da smešta brojeve sa zarezom. To je promenjljiva „warp“. Dobra je praksa da se prilikom postavljanja početne vrednosti promenjljive tipa „double“ umesto vrednosti „0“ stavi vrednost „0.0“ da bi se znalo da se broji decimalnim brojem. Postaviti „0“ na početku nije greška ali je preporučeni način korišćenje vrednosti „0.0“.
Središnji deo for petlje predstavlja uslov koji treba biti izvršen da bi se izašlo iz nje. U ovom konkretnom slučaju uslov je da promenjljiva „warp“ treba da dostigne vrednost jednaku ili veću od broja „10“. U svim ostalim slučajevima nastavlja se sa brojanjem. Treći deo služi za definisanje vrste obrade nad samom promenjljivom koja se posmatra kao uslov u drugom delu. Najčešće se ovde vrši inkrementiranje ili dekrementiranje. U konkretnom slučaju iskorišćen je izraz „warp+=korak“. Ovo treba čitati kao „warp=warp+korak“. Znači, svakim izvršavanjem for-next petlje vrši se inkrementacija promenjljive „warp“ za vrednost „korak-a“.

Sledeći red služi za konkretnu obradu podataka. Ispisuje se vrednost koju sadrži promenjljiva „warp“ i obrađena vrednost warpa predstavljenog brzinom svetlosti. Za „dizanje na stepen“ se koristi funkcija „pow() „koja je sastavni deo zaglavlja „cmath“. U isto vreme se inkrementira vrednost brojača linije jer je upravo ispisan jedan red.

Kod:
cout << warp << "\t ->\t" << pow(warp,3.333333) << "x\n"; //ispis warp faktora
            brojac_linija++; //inkrementiranje brojaca
Sledećih par linija sadrže još par interesantnih koncepata. Naime, u okviru for-next petlje postavlja se jedan „if“ čiji je zadatak da ispita da li je promenljiva „brojac_linija“ dostigao vrednost koju sadrži „BROJ_LINIJA „ koji je definisan na početku programa. Kao što se videlo u prethodnom delu koda promenjljiva „brojac_linija“ se poveća za jedan svaki put kada se ispiše linija teksta u okviru for-next petlje. Na ovom konkretnom mestu „if“ proverava već pomenuti uslov i ako da u tom slučaju treba da na trenutak pauzira izvršavanje programa sve dok „kapetan“ ne pritisne taster ENTER za nastavak ispisa. Naravno da je ovo od izuzetne važnosti ako korisnik unese korak od recimo „0.01“ pa će biti negde oko 1000 linija za ispis.
holodoc je offline   Odgovor sa citatom ove poruke
Stara 17.8.2006, 0:42   #199
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Kao što je već naglašeno, ovde nastaje jedan problem a to je da smo već unosli vrednost preko tastature i da smo na kraju unosa koristili pritisak na ENTER. Posledica toga je da zbog brzine programa par ENTER-a sigurno „procurelo“ u već pomenuti ulazni „stream“ pa će program pri prvih par nailazaka na ovaj deo koda jednostavno iskoristiti te buffer-ovane ENTER-e a korisnik će ostati „kratak“ za par desetina linija ispisa. U par prethodnih primera koristili smo poziv funkcije „system“ koja je pauzirala izvršenje sve do novog pritiska ENTER-a. Ovde to baš i ne bi bilo elegantno rešenje jer bi smo stalno vukli onaj tekst „Press a key to continue....“ a s obzirom da smo ovde napravili jednu malu „scenu“ bilo bi lepo da možemo da napišemo nešto srpski. E za tu potrebu koristimo funkciju „fflush“

Kod:
if(brojac_linija == BROJ_LINIJA){ //ukoliko je ispisan granicni broj linija
                cout << "Lt. LaForge: \"Kapetane dajte komandu za nastavak ispisa...\""; //ispisi tekst
                fflush(stdin); //obrisi bufferovane ENTER-e
                cin.get(); //cekaj ENTER za nastavak
                cout << "Capt. Picard: \"Make it so!\"\n\n";
                brojac_linija = 0; //resetuj brojac linija
            }

Praktično deo koji odrađuje celu „hold&wait“ operaciju smešten je u sledećih par redova.

Kod:
cout << "Lt. LaForge: \"Kapetane dajte komandu za nastavak ispisa...\""; //ispisi tekst
fflush(stdin); //obrisi bufferovane ENTER-e
cin.get(); //cekaj ENTER za nastavak
Prvi red jednostavnu ispisuje srpsku verziju „Press a key to continue....“. Drugi red poziva funkciju „fflush()“ koja ima zadatak da obriše sve buffer-ovane podatke (višak onih ENTER-a) iz odgovarajućeg „stream-a“. U konkretnom slučaju treba nam „stdin“ pošto on sadrži sve unete podatke sa tastature. Posle ove komande jednostavno nema više buffer-ovanih podataka i komanda „cin.get();“ neće biti preskočena par puta. Veoma jednostavno i elegantno
holodoc je offline   Odgovor sa citatom ove poruke
Stara 17.8.2006, 0:43   #200
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Ostatak koda je poprilično jasan osim možda zašto je sledeći kod ostavljen van for-next petlje.

Kod:
cout << "Lt. Comm. Data: \"Zalim ali warp faktor 10 nije moguce dostici kapetane!\"\n";
Već je rečeno da warp faktor 10 nije moguće koristiti u kombinaciji sa formulom koja je navedena pa je shodno uslovu for-next petlje na kraju obrade svih vrednosti jednostavno ispisano da taj faktor nije moguće izračunati.

I pre nego što završim još jedno mlo uputstvo stilske prirode. Uvek kada pišete kod gledajte da celine u obradi odvojite odnosno da recimo odvojite jednim redom deo koji se koristi za unos informacija i deo koji se koristi za njihovu obradu. Takođe, svaki put kada započnete novi blok koristite tabulator da bi ste uvukli taj deo. Ovo UŽASNO poboljšava čitjivost teksta.

I sad na kraju samo treba reći da je ovaj primer relativno lak iako itgleda poprilično drugačije od svega navedenog do sada. Ovim kodom sam u stvari hteo da demonstriram par izuzetno korisnih stvari koje će pomoći svakom početniku da eventualno određene delove improvizuje ili bar eleiminiše greške koje se javljaju u radu.

Toliko za sada
holodoc je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi

Tagovi
programiranje, tutoriali

Alatke vezane za temu
Vrste prikaza

Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno



Sva vremena su po Griniču +2 h. Sada je 22:29.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2020, vBulletin Solutions, Inc.
Hosted by Beograd.com