Tutorijali.Net forum

Full Version: Nizovi i funkcije u c++
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Tema premjestena iz C++ Primjeri

Pozdrav kolege. Vidim daje tema c++ pa da postam ovde. Vec 3 mjeseca ucim c++ , radim konzolne aplikacije (jos nemam znanja da radim druge He he). Moje pitanje je mozeli mi iko objasniti malo funkcije i nizove, to nekontam. Znam da se programi pogotovo oni sa kodom od nekolko stotina i vise tisuca linija pisu tako sto se njihovi djelovi postave u funkcije, radi lakseg pronalazenja i ispravljanja greski, mjenjanja nekih djelova itd. no ja imam osjecaj da mi je lakse napravit program sa jednom funkcijom tj glavnom main (sve u nju strpat), nego da pisem kod podjeljen u funkcijama (najvjerojatnije zato sto ih ne kontam).
A stose tice nizova, cuo sam da c++ podrzaje oko 15-16 dimenzija. mene zanima samo jenodimenzionalni i dvodimenzionalni niz kako funkcionira (npr kako se dvodimenzionalni niz moze koristit za x/o igru i slicno) , znaci zelim skontat bit svega toga.
Tema C++ Primjeri bi trebala da bude mjesto gdje se mogu naći praktični primjeru u c++, ali mnogi su fulili izgleda. Nego, da pređemo na stvar...

Prvo da kažem samo da c++ ne podrzava 15-16 dimenzija kada su u pitanju nizovi. To vjerovatno zavisi od kompajlera i njegovih postavki a više je moguće da zavisi od dostupne radne memorije. Tako da to varira od kompa do kompa, ali u stvarnosti trebaju ti jednodimenzionalni, dvodimenzionalni i vrlo rijetko trodimenzionalni nizovi.

Pročitaj ova dva tutorijala:
Moram sada da idem pa kada se vratim, malo ćemo pričati o njima a i o funkcijama.
Nizovi

Nizovi su najjednostavniji i najčešće korišteni tipovi struktuiranih podataka koji sadrže grupu podataka istog tipa. Naravno, tim podacima pristupamo preko indeksa. Eh što se tiče njihove primjene to ćeš vjerovatno sam vidjeti kako budeš radio različitije programe sa raznim namjenama :) Ako recimo imaš neki program koji vrši evidenciju bodova neke grupe takmičara, onda ne možeš znati koliko će takmičara biti, prema tome ne možeš deklarisati jednu, dvije, tri varijable ili više, zavisno od broja takmičara za koje ćeš držati bodove, nego moraš koristiti niz da bi mogao držati bodove a i po potrebi vratiti broj bodova za određenog takmičara.

Evo recimo kako bi mogao koristiti dvodimenzionalni niz za iks-oks (kod sam napisao tek' tako u editoru, nemoj uzeti sve zdravo za gotovo, to je samo da otprilike vidis kako bi to islo):
Code:
#include <iostream>

using namespace std;

int g_polja[3][3]; // iks oks matrica


    (ostale funkcije)
          ...
          
int provjeriPobjednika()
{
  if (g_polja[0][0] == g_polja[0][1] && g_polja[0][1] == g_polja[0][2])
    return g_polja[0][0]; // tri uzastopne iste vrijednosti, vrati vrijednost
    
  if (g_polja[1][0] == g_polja[1][1] && g_polja[1][1] == g_polja[1][2])
    return g_polja[1][0]; // tri uzastopne iste vrijednosti, vrati vrijednost
    
    (ostale provjere)
          ...
    
  return 0; // nemamo tri uzastopne vrijednosti
}

int main(int argc, char** agrv)
{  
    int pobjednik = 0;
    int brojPoteza = 0;
    while(pobjednik == 0 && brojPoteza < 9)
    {
      nacrtajTabelu();
      napraviPotez();
      brojPoteza++;
      pobjednik = provjeriPobjednika();
    }
    
    if (pobjednik == 1)
    {
      cout << "Pobjednik je iks!\n";
    }
    else if(pobjednik == 2)
    {
      cout << "Pobjednik je oks!\n";
    }
    else
    {
      cout << "Partija je nerijesena.\n";
    }
    
      (ostatak programa)
            ...
}

Znači, imaš jednostavnu matricu koja ti predstavlja iks oks polja, imaš tri reda i tri kolone. Tako ti je naprimjer g_polja[1][1] centralno polje, odnosno drugi red, druga kolona. Prvi indeks je broj reda, a drugi broj kolone. Naravno indeksiranje počinje od nule Namigivanje

Funkcije

Funkcije se koriste iz više razloga. Gospodin Steven C. McConnell ima dosta kompletnu listu tih razloga:
  • Smanjivanje kompleksnosti
  • Kada hoćemo da dio koda napravimo čitljivim
  • Izbjegavanje pisanja duplog koda
  • Sakrivanje toka izvođenja programa (opet u cilju smanjenja kompleksnosti)
  • Sakrivanje operacija sa pokazivačima
  • Povećanje portabilnosti koda
  • Pojednostavljenje komplikovanih boolean testova
  • Unaprijeđenje perfomansi
  • Izoliranje kompleksnosti
  • Sakrivanje detalja implementacije
  • Ograničavanje efekta izmjena
  • Sakrivanje globalnih podataka
  • Pravljenje centralnih tački kontrole
  • Pisanje ponovo iskoristivog koda
  • Da bi se poboljšao kvalitet samog koda

Možda su ti neki od ovih razloga sada mutni, ali vremenom ćeš ih sve razumiti. Uglavnom, funkcije se pišu iz razloga da bi se povečao kvalitet koda, njegova čitljivost, izbjeglo duplo pisanje koda i omogučilo lakše izmjenjivanje koda. Ako čitav program možeš zamisliti "u glavi" ako ne moraš o njemu misliti u komadima, dijelovima, onda i ne moraš koristiti funkcije jer se vjerovatno radi o nekom trivijalnom programu. Također, imaj na umu da se kod čita mnogo više puta nego što se piše.

Recimo da imaš po čitavom programu rasut kod koji izračunava neku udaljenost koja se dalje koristi da bi tvoja neka mašina izrezala komad daske:
Code:
udaljenost = brojNekihJedinica / NEKA_KONSTANTA

Onda se izmijeni dizajn mašine i sada imaš neke graničnike čiju širinu moraš uzeti u obzir. Šta radiš u tom slučaju? Promijeniš kod na 1001 mjestu na kojem si ga pisao? U tom slučaju trebao si tu jednu liniju postaviti u posebnu funkciju i onda samo na tom mjestu napraviti izmjenu npr:
Code:
double izracunajUdaljenost(int brojNekihJedinica)
{
    return (brojNekihJedinica / NEKA_KONSTANTA) + uzmiSirinuGranicnika();
}

Nije bitno što je čitava funkcija samo jedna linija koda. Na ovaj način si sebi olakšao muke pri debuggiranju, izmjenama dokumentacije i sl.

Eh sada, jel' treba objasniti i parametre funkcija, kakvi mogu biti, kako se trebaju koristit i sl?
za funkcije, zamisli si da imaš dio koda koji radi neki ispis nekamo...
a za taj ispis potrebno je napisati par stotina linija koda, a taj ispis pozivaš 20-tak puta u programu, dal će ti lakše biti tih par sto linija koda kopirat, ili samo pozvat funkciju u kojoj je taj kod? naravno nije neki problem kopirat, a sad zamisli ovo, taj kod treba malo izmijeniti, dal ćeš onda ići po svih 20 blokova koda nalazit u programu i mjenjat, ili ti ej lakše funkciju na jednom mjestu izmijenit?
Upravo ono što i ja govorim, ali kao što se da vidjeti iz priloženog, sempron je zadnji put posjetio forum kada je postavio temu. Ali nebitno, može poslužiti drugima Namigivanje
Svaka čast momcima na ovom obrazloženju funkcija i polja a pogotovo schmrz na detaljnom objašnjenju sorry što sam offtopic ali ovakav odgovor nisam mogao dobiti ni od profesora na fax-u Hvala puno ste pomogli Happy
Reference URL's