SITNA CREVCA<>
122016<><>

Kako postati programer (3): Prve linije kôda

Vežite se, polećemo

IDE automatizuje mnoge korake i tako vam pomaže da se skoncentrišete na pisanje programa.

Na internetu ste pronašli primer nekog programskog kôda? Želite da sami prepišete taj kôd na svoj kompjuter i pokrenete ga? Za to postoje „programi koji služe da u njima pišete programski kôd”, i kao primere takvih programa u prvom delu ovog serijala naveli smo NetBeans i Visual Studio. Izbor je u praksi mnogo širi i ove programe ćemo od sada zvati pravim imenom: IDE – Integrated Development Environment.

Nemojte se zaprepastiti, ali kôd možete da napišete i u najobičnijem Notepadu koji dolazi uz Windows. Nekako je tradicija da prvi kontakt sa programskim jezikom bude zadatak ispisivanja poruke „Hello, World!” na ekran kompjutera, kao da ste udahnuli život vašem programu koji prvi put pozdravlja svet oko sebe. Otvorite Notepad i upišite:

---------------------- Java ----------------------

class HelloWorld {

public static void main(String[] args) {

System.out.println("Hello World!");

}

}

-------------------- JavaScript -------------------

console.log("Hello, World!")

----------------------- C++ -----------------------

#include <iostream>

int main() {

std::cout << "Hello World!";

}

--------------------- Python ----------------------

print("Hello, World!")

input()

---------------------------------------------------

Ukoliko ste pisali kôd za Java jezik, tekst snimite u fajl sa ekstenzijom „.Java”, na primer „HelloWorld.Java” („.js”, „.cpp” i „.py” za ostale primere). Takav fajl se zove izvorni fajl. Ako zanemarimo liniju kôda koji ispisuje poruku na ekran, svaki Java program mora da sadrži ovakav „kostur”. Drugim rečima, ovo je „najmanji” Java program koji postoji. Isto to važi i za primere u ostalim jezicima. Mogli smo da izostavimo ispisivanje poruke i program bi se uspešno pokrenuo, doduše ne bi radio ništa.

Napisani program nije moguće pokrenuti iz Notepada, naravno. U Windowsu otvorite folder gde je snimljen izvorni fajl, pritisnite ’Shift’ i desni klik, i izaberite Open command prompt here. Otkucajte sledeće dve komande:

javac HelloWorld.java

java HelloWorld

Program je konačno pokrenut i na ekranu se ispisuje poruka „HelloWorld”. Primetite da je jedna komanda koju smo koristili „javac” sa „c” (što je skraćeno od kompajler), a druga je samo „java”. Ako pogledate sadržaj foldera, videćete da je kompajler napravio novi fajl koji se zove HelloWorld.class, koji smo pokrenuli drugom komandom.

Probaćemo da saznanje o pokretanju programa povežemo sa prethodnim delovima serijala. Odakle javac.exe i java.exe komande na vašem računaru? Pisali smo da za pravljenje Java programa morate instalirati JDE, i upravo sa njim dolaze ova dva fajla (nalaze se u instalacionom folderu). Ukoliko dobijete poruku o grešci kada otkucate „javac”, znači da sistem „ne vidi” gde se instalirao JDE, pa morate da u Windowsu podesite putanju do njegovog instalacionog foldera. Potegnite za desnim klikom na My Computer (ne na prečicu), ili desni klik na Start menu -> System, pa na Advanced system settings -> Environment Variables. Zatim u promenljivu koja se zove Path dodajte putanju do JDE instalacionog foldera, tj. njegovog „bin” podfoldera, koji može izgledati ovako: C:\Program Files\Java\jdk1.7.0_80\bin (pazite da ne obrišete neku od već unetih vrednosti).

Kako poslati program budućem korisniku? Pošto on nije programer i neće da piše programski kôd, njega ne treba da interesuje ništa osim da od vas dobije .class fajl. On mora da ima instaliranu Javu (JRE). Uz nju dobija java.exe fajl kojim može da pokrene program na isti način kao i mi (java HelloWorld).

 
Pitanje koje možda imate je zašto morate da pokrećete kôd iz komandne linije, kada se obično Java programi pokreću na dvoklik iz Windowsa? Pa, obično se Java programi sastoje iz više od jednog fajla, i praksa je da se oni ubacuju i kompresuju pod jedan jedini fajl sa ektenzijom „jar”. Java instalacija je tako podešena da Windows prepozna da pokrene „jar” fajl. Na sreću, dodatnim korakom možete pretvoriti „class” fajl u „jar” ako u komand promptu otkucate

jar cfe nekoime.jar HelloWorld HelloWorld.class

gde je „HelloWorld” ime klase iz kôda (za Javu je potrebno da se ime fajla i klase poklapaju). Pogledajte opet sadržaj foldera i videćete da ste dobili „jar” fajl, koji možete poslati korisniku te da ga ovaj pokrene na dvoklik. Ovaj postupak je znatno složeniji ukoliko se Java kôd sastoji iz više od jednog izvornog fajla.

U programiranju uvek ima sitnica zbog kojih je ono toliko nezgodno, pa iako sada možete da pokrenete program dvoklikom iz Windowsa, nećete videti poruku „hello world” kao malopre. Razlog je što je Windows podešen da pokreće Java programe bez konzole (na koju mi ispisujemo poruku). Da biste pokrenuli JAR sa konzolom morate promeniti podrazumevanu aplikaciju za pokretanje Java programa u Windowsu (java umesto javaw), kao da u komand promptu upišete:

java -jar nekoime.jar

Ako podesite otvaranje na dvoklik, da se konzola ne bi odmah zatvorila, ispod linije „System.out”... dodajte red:

new java.util.Scanner(System.in).nextLine();

i ponovite proceduru dobijanja JAR fajla.

Kompajler vs interpreter

Možda još nije jasno zašto smo pisali Java fajl umesto da odmah pišemo class fajl? Pa zato što je class fajl zapisan u jeziku približnijem mašinskom. To nije više Java jezik, već je to kompajlirani Java jezik, i bilo bi vrlo teško pisati kôd direktno na taj način. Baš su zato i nastali programski jezici „višeg reda” o kojima sve vreme govorimo.

Zato se JDE, koji nam omogućava da kompajliramo izvorni kôd, i JRE, koji služi da se kompajlirani kôd pokrene, odvojeno instaliraju. Krajnji korisnik instalira samo JRE, smanjuje ukupnu instalaciju i nema dodirnih tačaka sa izvornim kôdom.

Ako želite da pokrenete JavaScript fajl, za sada kôd prekopirajte direktno u vaš web pretraživač. Uđite u Chrome (koji preporučujemo za testiranje kôda), otvorite Developer tools (’F12’), i izaberite konzolu. Ako je konzola popunjena nekim porukama pritisnite znak koji podseća na zabranjeno parkiranje da je očistite, upišite kôd i „lupite” ’Enter’.

U slučaju skript jezika, programer i korisnik instaliraju istu stvar, interpreter jezika. Skript jezici se ne kompajliraju pa pokreću, već interpreter ide kroz fajl i izvršava liniju po liniju kôda kako je prevodi.

To zvuči sjajno, jer nemamo korak kompajliranja. Ali u praksi su zato skript jezici sporiji. Zamislite da slušate nekog stranca i da morate da prevodite svaku njegovu rečenicu dok je izgovara. I tako svaki put ispočetka. Bilo bi lakše da u startu dobijete ceo preveden govor i da ga onda čitate na jeziku koji razumete. Osim ove analogije sa usmenim prevođenjem, kompajler radi još jednu stvar. Budući da on prolazi kroz ceo kôd pre prevođenja, u stanju je da ga na najbolji mogući način optimizuje i prepakuje na mašinski jezik.

U praksi nećete ručno kompajlirati izvorne Java fajlove. Kada je vaš kôd iole složeniji i ima više od jednog fajla, na scenu stupa posebna vrsta programa koji se nazivaju bilderi (builders). Proces dobijanja krajnjeg fajla koji možete pokrenuti ili distribuirati nastaje nakon procesa „bildovanja”. Ovaj proces obuhvata kompajliranje, sklapanje u JAR fajl, i može da obuhvati druge korake zavisno od jezika.

Izvorni fajl u jeziku C++ obično ima ekstenziju „.cpp”. Prilikom bildovanja vrši se kompajliranje čime se dobijaju „.o” fajlovi. Oni se zatim povezuju preko koraka koji se naziva linkovanje. Krajnji rezultat bildovanja C++ izvornog kôda je EXE fajl.

Ako želite da pokrenete fajl pisan u Pythonu, pre svega instalirajte Python (interpreter) sa njegovog sajta. Napišite „Hello World” program u Notepadu i možete da ga pokrenete bilo iz komand prompta, bilo dvoklikom u Windowsu (u tom slučaju dodajte liniju „input()” inače će se prozor odmah zatvoriti). Primer kôda je za Python 3, koji se donekle razlikuje od prethodne verzije koja je i dalje u širokoj upotrebi.

IDE vs editor teksta

Sve korake oko bildovanja i pokretanja vašeg programa na sreću preuzeće IDE (automatski koristi build alate). Zamislite koliko je mučno ako imate više fajlova koje morate ručno da kompajlirate svaki put kada promenite parče kôda. Osim znatno olakšane procedure kompajliranja i pokretanja fajlova, svedenim praktično na jedno dugme, svaki IDE programeru pomaže na sijaset drugih načina. A i poruka konzolne aplikacije će biti ispisana u okviru IDE-a.

Editor koji dolazi uz IDE je neuporedivo bolji od Notepada. On će svaki specifičan deo kôda obojiti drugom bojom i automatski će formatirati tekst kako lupate enter. IDE ima auto-completition (IntelliSense u slučaju Visual Studia), koji će doslovno dopunjavati vaš kôd posle ukucanih par slova. Zato ne morate napamet da učite sve komande jezika, ili da se podsećate kako ono beše ime promenljive koju ste napisali.

IDE pregledno prikazuje sve fajlove koji čine vaš program u vidu stabla fajlova, omogućava vrlo važan proces debagovanja programa, upozoriće vas na greške u kôdu, sve poruke kompajlera prikazuje na pregledan način, i još mnogo toga što ćemo naglasiti u narednim tekstovima.

Sa druge strane, postoje tekst editori koji su na mnogo višem nivou od Notepada. Oni uglavnom omogućavaju otvaranje više fajlova odjednom, prepoznaju različite programske jezike i kôd označavaju u više boja radi preglednosti, slično editorima koji dolaze uz IDE. I, to je to. Zašto bi onda neko koristio tekst editor umesto IDE-a? Pa, pre svega neke kratke programe i skripte je mnogo brže napisati u tekst editoru, koji se brže pokreće i nije natrpan opcijama. Tekst editori su prilično podesivi, pa je moguće raznim skriptama i ekstenzijama proširiti njihovo polje delovanja. Programeri često na taj način proširuju editor tako da iz njega mogu da kompajliraju kôd, vrše debagovanje i tako dalje. Naravno, tada on sve više počinje da liči na jedan IDE.

Za sada preporučujemo da se držite IDE-a. Postoji veliki broj njih koji podržavaju veliki broj jezika. Ako ste uspeli da izaberete programski jezik u kojem ćete da radite, izbor IDE-a je mnogo lakši.

Kao razvojna okruženja sa podrškom za veliki broj jezika izdvajamo Eclipse i NetBeans, koji su uz to i besplatni. JetBrains ima fantastičnu ponudu komercijalnih, torentabilnih, radnih okruženja, pa tako imamo IntelliJ Idea za Javu, Android Studio za Android ili WebStorm za web jezike. Microsoftov Visual Studio je fenomenalan za C#, Xamarin i ostale Microsoft tehnologije. Instalacijom Pythona dobijate razvojno okruženje IDLE, ali je preporučljivo uzeti neki drugi IDE kao što je PyCharm, ili besplatni Pydev koji se instalira kao dodatak Eclipseu. XCode je standardno okruženje za Appleov Swift. Svaki IDE se može proširiti sa plugin-ovima, tako da oni često imaju podršku i za razne frameworke programskih jezika. Informišite se koji IDE postoji za više operativnih sistema ukoliko vam je to bitno.

Od tekst editora popularni su Notepad++, Atom, Sublime text, Brackets, možda pre svega Vim i drugi. Nije loše da na našem sajtu pogledate tekstove Igora Ružića o tekst editorima ili Xojou. Kolege Ružić i Miša Brežanac pisali su o programerskim temama, pa nije loše da potražite njihove tekstove.

Programiranje

Vreme je da pokažemo osnovne pojmove i komande u programskim jezicima, koje ćete stalno koristiti, bez obzira na to kakvu aplikaciju pravite. Zbog prostora i jednostavnosti, za sada sve prikazujemo preko konzole. Koristićemo NetBeans, i ukoliko želite da probate i C++ kôd, sa sajta IDE-a pogledajte uputstvo potrebno za podršku ovom jeziku. JavaScipt za sada možete pokretati u konzoli Chromea. Kada napravite novu aplikaciju ignorišite ili obrišite „višak” kôda koji je on generisao u odnosu na naš primer koji sledi. Java projekat nazovite „JavaPrimer”. Za sada pratite kôd unutar funkcije „main”, drugi put ćemo objasniti zapis van nje. NetBeans će automatski napraviti nekoliko foldera, jer on tako organizuje strukturu vašeg programa. Fajl u kojem je potrebno da pišete kôd biće automatski otvoren.

Promenljive, komentari

---------------------- Java ----------------------

package javaprimer;

public class JavaPrimer {

public static void main(String[] args) {

String ime = "Svet kompjutera";

int tiraz = 100000;

boolean najboljiCasopis = true;

int[] ocene = {88, 83, 40, 74, 91};

double pi = 3.14;

System.out.println("pi: " + pi);

System.out.println("prva ocena: " + ocene[0]);

}

}

------------------- JavaScript -------------------

var ime = "Svet kompjutera";

var tiraz = 100000;

var najboljiCasopis = true;

var ocene = [88,83,40,74,91];

var pi = 3.14;

console.log("pi: " + pi);

console.log("prva ocena: " + ocene[0]);

----------------------- C++ ----------------------

#include <string> //dodali zbog stringa

#include <iostream> //dodali zbog cout

using namespace std;

int main(int argc, char** argv) {

string ime = "Svet kompjutera";

int tiraz = 100000;

bool najboljiCasopis = true;

int ocene[5] = {88, 83, 40, 74, 91};

double pi = 3.14;

cout << "pi: " << pi << endl;

cout << "prva ocena: " << ocene[0] << endl;

return 0;

}

--------------------------------------------------

Rezultat programa je ispisivanje na ekran: pi = 3.14, prva ocena = 88

Promenljive su osnovni gradivni elementi vašeg programa. Možete da vidite kako promenljivima dajete naziv, tip i vrednost. Imamo promenljive koje su tipa ceo broj (int, skraćeno od integer), string (niz slova iliti karaktera), bool (vrednost tačno ili netačno), decimalni broj (da, moramo razlikovati decimalni broj od celog).

U primer smo ubacili promenljivu koja je u stvari niz vrednosti i nju označavamo uglastim zagradama. Taj niz vrednosti mora da ima ime i da bude nekog tipa, tj. da li će u nizu biti brojevi ili npr. stringovi. Niz smo odmah i popunili nekim vrednostima. Oni su zgodni jer ne moramo da pišemo veliki broj promenljivih za svaku vrednost i da im dajemo imena. Možemo i da lako „prođemo” kroz vrednosti niza preko komandi programskog jezika. Elementi u nizu počinju od pozicije nula.

Primetite da je JavaScript malo drugačiji i da u njemu ne morate da zadajete tip promenljive. JavaScript će sam da shvati o kom tipu promenljive govorite. Dovoljno je da je označite tako što stavite ključnu reč var ispred njenog imena i dodelite joj vrednost.

U ovim jezicima sav tekst u nekom redu koji je iza dve kose crte je u potpunosti ignorisan. Taj „zakomentarisan” tekst je način da rečima objasnite neki deo kôda, bilo kao podsetnik vama, bilo da olakšate nekom drugom programeru uvid u to šta ste radili.

Petlje, Operatori

---------------------- Java ----------------------

for (int i = 0; i < ocene.length; i++) {

if (ocene[i] > 80) {

System.out.println("Imamo ocenu vecu od 80");

}

}

------------------- JavaScript -------------------

for (var i = 0; i < ocene.length; i++) {

if (ocene[i] > 80) {

console.log("Imamo ocenu vecu od 80");

}

}

----------------------- C++ ----------------------

for (int i = 0; i < 5; i++) {

if (oceneIgara[i] > 80) {

cout << "Imamo ocenu vecu od 80\n";

}

}

--------------------------------------------------

Produžite kôd ispod poslednje komande za ispis teksta. Rezultat ovog dela programa je tri puta ispisan tekst: „Imamo ocenu veću od 80”.

Pisanje For petlje je rutinski korak u programiranju. Bilo koji kôd koji se nalazi unutar petlje će se ponavljati sve dok se petlja ne prekine. Početnicima u programiranju na osmobitnim računarima glavna zanimacija je bila da naprave beskonačnu petlju koja bi ispisivala „Ogi car”, ili ime toga ko je već pisao kôd.

Petlja For se uglavnom sastoji iz tri dela odvojenim znakom ' ; '. U prvom delu deklarišete promenljivu i dajete joj vrednost. Drugo polje u for petlji je uslov koji označava dokle će se petlja ponavljati i često zavisi od pomenute promenljive. Treće polje menja promenljivu posle jednog izvršenja petlje. Na ovaj način ste u potpunosti odredili ponašanje petlje, koja će se u našem slučaju ponoviti pet puta.

Šta se događa u petlji? U prvom krugu vrednost promenljive i je 0 (nula). U sledećem krugu ona će biti jednaka 1, i tako sve dok ne dobije vrednost pet. Zbog uslova, petlja se tada prekida i naš program nastavlja sa radom, tj. pošto dalje nema više kôda, završava se. U svakom krugu petlje izvršiće se kôd između vitičastih zagrada. To je kôd sa naredbom if, koju je intuitivno lako protumačiti. Ona proverava da li je član niza na poziciji i veći od broja 80. Ako pogledamo naš ceo niz, vidimo da imamo tri takva broja. Kada i bude jednako nula, jedan i četiri, uslov iz if naredbe će biti ispunjen i ući ćemo u kôd koji ispisuje tekst.

U ovom primeru smo uveli mnoge važne elemente u programiranju. To je povećavanje promenljive operatorom '++'. Zatim, tu je uslovni iskaz sa operatorom ''<' koji može biti tačan ili netačan. Videli smo da Java i JavaScript mogu da, na za sada čudan način, dodavanjem tačke i vrednosti 'length', znaju koliko elemenata ima u nizu. U slučaju jezika C++ morali smo da ručno napišemo broj pet. To je loše, jer u slučaju naknadne promene broja elemenata moramo da ručno promenimo taj broj 5 kako bi odgovarao novoj dužini niza. Naravno, C++ ima druge tehnike koje rešavaju ovaj problem.

Takođe smo za C++ u okviru stringa dodali sekvencu '\n' koja služi za prebacivanje teksta u novi red, što je lakše nego da pišemo endl na kraju. Ova dva karaktera spadaju u tzv. escape sequence i funkcionišu u stringovima skoro svih programskih jezika (ima i drugih sekvenci koje proizvode druge efekte).

Operatori su uglavnom simboli koji vrše standardne operacije kao što su sabiranje i oduzimanje. Ukoliko saberete dva stringa, oni će se nadovezati. Ukoliko saberete dva broja, dobićete rezultat sabiranja. Pristupanju vrednosti niza na nekom mestu vršimo uz pomoć srednjih zagrada koje se zovu operator niza. Operator dodele je znak jednakosti, pa možemo kombinovati operator niza i operator dodele da promenimo vrednost elementa niza. Na primer:

nekeOcene[2] = 99.

Ako malo analiziramo kôd, možemo da vidimo koliko nam je For petlja pomogla u skraćivanju zapisa. Zamislite da smo sa If naredbom proveravali da li je prvi element niza veći od 80, pa onda u sledećem redu pisali If naredbu za drugi element niza i tako za svih pet elemenata. A šta da smo imali par hiljada elemenata, ako bi niz predstavljao arhivu ocena svih igara ikada ocenjenih u „Svetu kompjutera”?

Kondicionali, igra

---------------------- Java ----------------------

package javaprimer;

import java.io.Console;

import static java.lang.Math.abs;//za aps. vrednost

import java.util.Random; //za slucajni broj

import java.util.Scanner; //za unos podataka

public class JavaPrimer {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

System.out.println("Broj igraca 1");

int broj1 = sc.nextInt();

System.out.println("Broj igraca 2");

int broj2 = sc.nextInt();

Random r = new Random();

int trazeniBroj = r.nextInt(10) + 1;

System.out.println("Trazeni broj je " + trazeniBroj);

int greska1 = abs(broj1 - trazeniBroj);

int greska2 = abs(broj2 - trazeniBroj);

if (greska1 < greska2) {

System.out.println("blizi je bio igrac 1");

} else if (greska1 > greska2) {

System.out.println("blizi je bio igrac 2");

} else if (greska1 == greska2) {

System.out.print("nema pobednika");

}

}

}

------------------- JavaScript -------------------

var broj1, broj2, trazeniBroj;

var broj1 = prompt("Broj igraca 1");

var broj2 = prompt("Broj igraca 2");

var trazeniBroj = Math.floor(Math.random()*10) + 1;

console.log("trazeni broj je " + trazeniBroj);

var greska1 = Math.abs(trazeniBroj - broj1);

var greska2 = Math.abs(trazeniBroj - broj2);

if (greska1 < greska2) {

console.log("blizi je bio igrac 1");

} else if (greska1 > greska2) {

console.log("blizi je bio igrac 2");

} else if (greska1 == greska2) {

console.log("nema pobednika");

}

----------------------- C++ ----------------------

#include <string> //dodali zbog stringa

#include <iostream> //dodali zbog cout

#include <cstdlib> //dodali zbog rand

#include <cmath> //dodali zbog abs

using namespace std;

int main(int argc, char** argv) {

int broj1, broj2, trazeniBroj;

cout << "Broj igraca 1 \n";

cin >> broj1;

cout << "Broj igraca 2 \n";

cin >> broj2;

trazeniBroj = rand() % 10 + 1;

cout << "trazeni broj: " << trazeniBroj << endl;

int greska1 = abs(trazeniBroj - broj1);

int greska2 = abs(trazeniBroj - broj2);

if (greska1 > greska2) {

cout << "blizi je bio igrac 1";

} else if (greska1 < greska2) {

cout << "blizi je bio igrac 2";

} else if (greska1 == greska2) {

cout << "nema pobednika";

}

}

--------------------------------------------------

Napravite novi projekat sa ovim kôdom.

Do sada smo u našim primerima koristili neke predefinisane vrednosti promenljivih. Pogledajte kako da sa konzole prihvatite promenljivu koju je uneo korisnik, i kako da napravite prostu igru u kojoj dva igrača treba da unesu broj između jedan i deset. Pobednik je onaj koji je bliži nasumično izabranom broju u tom rasponu.

 
Kondicionale smo već pokazali u primeru for petlje. Kondicional je grananje kôda u zavisnosti od toga da li je neki uslov tačan ili netačan. Naredba if prelazi na kôd između vitičastih zagrada ako je uslov ispunjen, a ukoliko nije, izvršiće se kôd između vitičastih zagrada else bloka. Moguće je ugnezditi uslove konstrukcijom if, else if... else blokova. Primetite i novi operator '==' kojim se vrši provera jednakosti sa obe strane operatora, mada smo u tom redu mogli da ostavimo samo else, bez uslova, jer je jednakost promenljivih greska1 i greska2 jedini mogući preostali slučaj.

Ukoliko u C++ programu ne možete da unesete broj, kliknite na ime vašeg programa na levoj strani ekrana, izaberite Properties -> Run i promenite vrstu konzole. Takođe, ako unesete tekst umesto broja, program će da „pukne”, ili neće pravilno određivati pobednika u slučaju JavaScripta.

Razlike u ovim primerima su pre svega u načinu unošenja broja igrača u program i u funkciji za generisanje slučajnog broja.

• • •

U sledećem broju ćemo razjasniti ono što nismo stigli u ovom.

Ognjen POPOVIĆ

 
 TRŽIŠTE
Promene u svetu finansija

 PRIMENA
„Ozbiljna” upotreba VR i AR

 NA LICU MESTA
Epson prezentacija
Samsung donacija
Mimaki prezentacija
Web Summit 2016
Huawei i Telekom Srbija
Voxxed Days Belgrade 2016

 KOMPJUTERI I FILM
Rogue One: A Star Wars Story
Sing
Assassin’s Creed
Underworld: Blood Wars
Filmovi, ukratko

 SITNA CREVCA
Kako postati programer (3): Prve linije kôda
Šta mislite o ovom tekstu?

 VREMENSKA MAŠINA
Euro PC II, Udaj Husein i Nokia 7600

 PRST NA ČELO
Obraz IT obrazovanja
Home / Novi brojArhiva • Opšte temeInternetTest driveTest runPD kutakCeDetekaWWW vodič • Svet igara
Svet kompjutera Copyright © 1984-2018. Politika a.d. • RedakcijaKontaktSaradnjaOglasiPretplata • Help • English
SKWeb 3.22
Opšte teme
Internet
Test Drive
Test Run
PD kutak
CeDeteka
WWW vodič
Svet igara



Naslovna stranaPrethodni brojeviOpšte informacijeKontaktOglašavanjePomoćInfo in English

Svet kompjutera