Posto ima sve vise uvodnih tutorijala u razne programske jezike, koji bi pocetnicima mogli znatno pomoc, odlucio sam i ja dat svoj doprinos tome svemu.
Vidio sam da ima raznih tutorijala, ali nijednog koji bi mogao pocetnike uvest u svijet C-a, kojeg smatram dobrim programskim jezikom za ulaz u svijet programiranja.
Dosta je jednostavan, al opet dosta mocan. Moc C-a jedino ogranicava masta programera, tak se barem kaze
Zamolio bi odmah u pocetku da se tema ne napunjava komentarima, kao sto su: "Nepotrebno je", "bezveze" odnosno "hvala", "dobro uradjeno i sl" ukoliko vam se svidi ono sto sam uradio.
Tema ce bit konstantno update-ovana, koliko mi vrijeme dopusti, al trudit cu se da sto cesce stavljam neki novi update.
Feedback je uvijek pozeljan, pa makar i on sadrzo napomenu o nekom tipfeleru.
I jos nesto, nemojte mi zamjerit, ako bude koja "cudna" hrvatska rijec, jer sam se malo izfuro s hrvatskim jezikom boravkom u Austriji.
PA POCNIMO
--Zasto uopce C?
Iako star programski jezik C se danas jos dosta koristi, mocan je i s njime se more gotovo sve realizirati, kako sam vec rekao, problem je jedino u masti programera. Nudi dobar uvod u svijet programiranja, a i dobru odskocnu dasku za prijelaz na objektno orijentirano programiranje u C++
Tako da, pocetnici, nemojte bit zabrinuti, sto pocinjete s C-om, nego s C++, cak je mozda i bolje, jer je C podskupina, a naucit cete se kvalitetnije koristit neke alate prije nego sto predjete na C++.
--Prije pocetka
Prije nego sto se bacite na surovo programiranje, morate imati uredenje u kojem morete programirati, odnosno dva osnovna alata, a to su:
1. Text editor - Program u kojem pisete kôd, preporucuje se editor koji text kodira u ASCII format, da je kôd portabilan. Izbor editora ostavljam vama, morete cak koristiti notepad u sklopu windows-a, ali ga osobno nebi preporucio, ima brojnih editora koji koji su posebno napravljeni samo za pisanje programskog kôda, kod kojeg morete i jezik odabrat u kojem programirate, te ce vam editor posebne sintakticke dijelove, kao rezervirane rijeci posebnim bojama oznacit. Neki od editora su npr. Notepad++ i CodeBlocks, koji su besplatni ili UltraEdit (koji osobno koristim), al koji se mora platiti. Za pocetak bi preporucio jedan besplatni.
2. Compiler - Posto kompjuter nemore razumit izvorni kôd koji pisete, potreban mu je compiler, odnosno prevodilac, koji ce izvorni kôd prevest u masinski jezik.
Za compiler bih preporucio gnu-c compiler, te da skinete cygwin, sto predstavlja linux okruzenje za windows.
evo linkovi za skidanje Cygwin-a, te malog prirucnika sa slikama kako cete ga instalirati kako treba
Cygwin
Upute
Napomena: Nemam nista od toga ako skidate s RS-a zato sto je datoteka manja od 5MB, odnosno manja je cak od 0,5 MB,
pa da netko nemisli da dobivam bodove na vama :)
-Sto radi compiler tocno?
Compiler preuzima vas izvorni kôd i pravi datoteku sa naredbama u masinskom jeziku, koje odgovaraje naredbama iz vaseg izbornog kôda. Datoteka koju compiler napravi sa masinskim naredbama se zove objectcode, ili objektna datoteka. Svakom compileru treba odredjena naredba da stvori objectcode. Prije nego sto program moremo izvest potreban je jos jedan korak. Treba se objectcode linkat, sto predstavlja povezivanje objektne datoteke sa objectcode-om biblioteka funkcija, da bi se dobio krajni program.
Ovaj compiler koji cemo ovdje koristit obavlja compiliranje i linkanje u jednom koraku, tako da necete morati izvodit dvije naredbe. Bit ce jos objasnjeno kako se dolazi i do objektne datoteke, odnosno objectcode-a.
--Kratak uvod
Kada pravimo program, onda cesto idemo istim putem, odnosno, radimo u fazama, a one bi mogle izgledati ovako:
1. Odrediti cilj programa (ako nemamo cilja, nemamo zasto pisati program)
2. Odrediti metode koje cete koristiti u programu (nacin na koji cemo radit)
3. Pisete program za rjesavanje problema
4. Izvedete program i testirate na greske.
Ukoliko dodje do gresaka, desit ce se da ce te sva 4 postupka morat ponovno proc, odnosno, dali je bio problem u cilju, probat nac druge metode i drugacije, implementirat program.
--Krenimo, vas prvi program
Vas prvi program nece obavaljat neku posebnu funkciju, ali ce predocit, kako se program pise, compilira i izvodi.
Kako je tradicija u C-u, vas prvi program ce na ekran ispisati text "Hello_World!".
Otvorite vas editor u kojem ste se odlucili pisati i pocnimo
Izvorni kôd za program hello_world.c
#include<stdio.h>
int main()
{
printf("Hello_World!\n");
return 0;
}
snimite vas napisani program pod nazivom hello_world.c u mapu koja se nalazi u C:\cygwin\home\USER NAME (USER NAME, ime user-a koji koristi kompjuter. U home cete imati jednu mapu u koju udjete i tu snimite)
da biste kompilirali vas napisani program, otvorite Cygwin, te upisete:
gcc -Wall -o hello_world hello_world.c
naredba gcc poziva gnu-c compiler da kompilira datoteku
s naredbom -Wall dobivate sve Warninge koji mogu dovest do smetanja, pri radu programa
s naredbom -o ... dajete naziv kompiliranoj datoteki, jer bi po defaultu ona bez -o bila a.exe. tri tocke znace neko ime
i na kraju naziv datoteke koja treba da se kompilira u ovom slucaju hello_world.c
kad stisnete <enter> nebi trebalo doc do nikakvi gresaka i program bi trebo bit kompiliran.
Sad morete pozvat vas napisani program s naredbom:
./hello_world
trebali biste dobit ovakav output
Hello_World!
Sad da pojasnimo greske na koje bi mogao compiler upozorit. Kada bismo izostavili jedan semikolon, odnosno ; doslo bi do greske, kao sto pokazuje slijedeci primjer
#include<stdio.h>
int main()
{
printf("Hello_World!\n")
return 0;
}
kada bismo sad to snimili i pokusali kompilirat, compiler bi nam izbacio slijedecu gresku:
hello_world.c: In function `main':
hello_world.c:6: error: parse error before "return"
Prvi red nam govori naziv programa, te u kojoj funkciji se nalazi greska, u ovom slucaju to je main funkcija
U drugom redu opet prvo pise naziv programa, 6 oznacava u kojem redu compiler smatra gresku, te kakva je, u ovom slucaju kaze da nedostaje ; prije return-a
--Dijelovi programa
Da bismo mogli opisat sve osnovne dijelove nekog programa, trebat ce nam ipak nesto slozenije nego samo ispis teksta
Neki vam dijelovi nece sad bit jasni, al sve ce biti kasnije objasnjeno.
Nemojte prepisivat brojeve i dvotocke uz kod, one sluze samo za orijentaciju
Program mnozitelj.c mnozi dva cijela broja
1: //Izracunava umnozak dva cijela broja
2: #include<stdio.h>
3:
4: int product(int x, int y);
5:
6: int main()
7: {
8: int a, b, c;
9:
10: //Ucitavanje prvog broja
11: printf("Unesite broj izmedju 1 i 100: ");
12: scanf("%d", &a);
13:
14: //Ucitavanje drugog broja
15: printf("Unesite jos jedan broj izmedju 1 i 100: ");
16: scanf("%d", &b);
17:
18: //Izracunavanje umnoska i prikazivanje na ekranu
19: c = product(a, b);
20: printf("\n%d puta %d = %d\n", a, b, c);
21:
22: return 0;
23: }
24:
25: //Funkcija vrace umnozak dvaju pridanih brojeva
26: int product(int x, int y)
27: {
28: return(x*y);
29: }
30:
Spremite program, kompilirajte ga i isprobajte.
Ako ste ispravno prepisali trebalo bi biti ovako:
Unesite broj izmedju 1 i 100: 5
Unesite jos jedan broj izmedju 1 i 100: 4
5 puta 4 = 20
a sad na dijelove.
-Komentari (redovi 1, 10, 14, 18 i 25)
Komentari ispunjavaje jednu veoma vaznu funkciju u pisanju programa, omogucavaje lakse snalazenje prilikom kasnijeg obradjivanja tog istog programa.
Cesto ce se desit kasnije, kada budete pisali neki veci i slozeniji program, da ce te izgubit preglednost kada ga htjedne nadogradit il nesto promjenit u njemu, tesko je nadgledat sto sta odradjuje.
Slobodno dosta komentirajte sadrzaj vaseg programa, al nemorate ubacivati suvisne komentare, koji u biti i nemaje nekakvog smisla.
Komentari se pisu na dva nacina, ovaj nacin gore se koristi za pisanje komentara u jedno redu, prvo se napisu dvije kose crte i onda slijedi komentar:
//ovo je nekakav komentar
//ovo je jos jedan komentar
//i jos jedan
Drugi nacin na koji morete pisat komentare jest, da ih pocnete sa jednom kosom crtom i zvjezdicom i zavrsite suprotno, time omogucujete pisanje komentare preko vise redova, ali pazite, ako otvorite sa komentar sa "/*" morate ga i zatvorit kad zavrsi sa "*/" sto kod dvije kose crte nemorate, al vam ovo omogucava komentiranje preko vise redova
/* Ovo je jedan komentar
koji se pruza preko vise
redova i evo jos neki tekst */
to je sto se tice komentara
-Include direktiva (red 2)
Include direktiva napominje C-compiler da sadrzaj tzv include datoteke za vrijeme kompiliranja uveze u program. Include datoteka je posebna datoteka s informacijama potrebnim za program ili compiler. Takodjer se jos te include datoteke zovu i header datotekama, one imaje ekstenziju .h.
#include<stdio.h> znaci, dodaj sadrzaj datoteke stdio.h u program. U vecini C programa je potrebno nekoliko tih header datoteka.
-Funkcija main (redovi 6-23)
Uz jednu C-funkciju idu i zagrade nakon naziva funkcije, iako se nepredaju nikakvi argumenti funkciji.
Jedina komponenta koja se mora nalaziti u svakom C programu jest funkcija main. U njenom najjednostavnijem obliku ona sadrzi samo naziv main kojeg slijedi prazni pâr zagrada. Nakon tih zagrada nalaze se naredbe u pâru viticastih zagrada koje cine glavno tijelo funkcije.
Pod normalnim uvjetima svaki program pocinje s funkcijom main i zavrsava s njome.
-Definicija variabli (red 8)
Variabla je ime koje se odnosi na odredjeno mjesto u memoriji za podatke. Program koristi variable za spremanje odredjenih podataka za vrijeme izvodjenja programa.
Definicija Variable obavjestava compiler o imenu variable i tipu podataka, koje more variabla spremit.
-Prototip funkcije (red 4)
Prototip funkcije daje compileru ime i argumente funkcija koje se nalaze u programu.
Prototip funkcije se mora pojavit prije, nego sto se funkcija pozove
On nije za zamjenit sa definicijom funkcije
-Naredbe programa (redovi 11, 12, 15, 16, 19, 20, 22 i 28)
Naredbe zapravo cine tok programa, pomocu njih moremo ispisivati tekst, unositi razne naredbe i sl.
U sklopu tutorijala cu pretezito objasnjavat kako se kojim naredbama koristit, da bi ste mogli upravljati tôkom programa, te da vas program izvodi ono sto hocete.
Pojasnjenje neki naredbi koje se nalaze u programu mnozitelj.c
naredba printf - je funkcija koja omogucuje ispis teksta na ekran, kako vidite u redovima 11 i 15 funkcija printf more ispisati obican tekst, il iznose kao u redu 20.
naredba scanf - je funkcija koja omogucuje da se podatci uneseni preko tipkovnice spreme u neku variablu
naredba u redu 19 poziva funkciju product, kojoj se predaju dva cijela broja i koja vrace njihov umnozak nazad
naredba return - redovi 22 i 28 sadrze return naredbe, naredba return u redu 28 pripada funkciji product i vrace umnozak od x i y nzad funkciji main. Malo prije kraja programa naredba return u funkciji main u redu 22 vraca OS-u 0 nazad,
-Definicija funkcije
Funkcija je neovisni i samostalni dio koda, koji ispunjava odredjeni zadatak. Da bi se izveo kôd koji je zapisan u nekoj funkciji, mora se unijeti ime funkcije u nekoj programskoj naredbi.
Funkcija product je funckija napravita od strane korisnika, koja mnozi samo dva broja. Inace se nekoriste funkcije za ovako jednostavne zadatke, ali je u ovom slucaju bila dobar primjer kako se koriste.
UPDATE 17.09.2009.
--Variable
Sto je to variabla? Variabla je imenovano mjesto u memoriji za podatke. Kada se koristi ime variable, odnosi se uvijek na podatke koji se nalaze iza toga imena.
-Imenovanje variabli
Varijablama se najcesce daju onakva imena, kakva opisuju njihovu funkciju, odnosno za spremanje kakvih podataka sluze.
Da biste pravili variable i koristili se njima u C-progamu, morate znati kako se imena slazu.
-ime variable more sadrzati slova, brojeve i donju crtu "_".
-prvi znak variable mora biti slovo. Dozvoljeno je koristiti i donju crtu "_", ali bi se to trebalo izbjegavat.
-C pazi na velika i mala slova kod imena variabli, tako da su "broj1" i "Broj1" dva potpuno razlicita imena za varible.
-kljucne rijeci u C-u nisu dozvoljene kao imena variabli, npr.: printf, scanf...
primjeri za dozvoljena i nedozvoljena imena za variable
Broj dozvoljeno
b4u4_f93 dozvoljeno
neko_ime dozvoljeno
_godina dozvoljeno, ali se nepreporucuje
br#tablice nije dozvoljeno, sadrzi znak #
double nije dozvoljeno, double je kljucna rijec
9nesto nije dozvoljeno, prvi znak je broj
Posto su u C-u broj, BROJ i Broj tri razlicita imena za variable, vecina programera koristi samo mala slova za pisanje variable, dok se sa velikim slovima oznacavaje konstant (bit ce kasnije objasnjeno)
Ako trebate dati variabli ime, koje sadrzi vise od jedne rijeci, onda ih spojite s donjom crtom, npr.: ime_kupca, ime_prodavaca, kolicina_robe...
-Tipovi variabli
Osnovna razlika u tipovima variabli jest ta, koliko mogu podataka spremiti, odnosno koju kolicinu memorije zauzimaje. Sad bismo mogli uvijek koristiti najveci tip, koji more najvece brojeve sadrzat, ali se to nepreporucuje, jer cete cesto imati nekakve podatke koji nece moc iskoristit svu velicinu toga tipa, pa cete imat neiskoristenog prostora koji ce vam trosit memoriju, stoga uvijek razmislite za sto vam treba neka variabla, pa joj odredite tip.
Variable se opet mogu podijeliti na variable sa predznakom (signed) i one bez predznaka (unsigned).
Variable sa predznakom sadrze i negativne brojeve, a one bez, samo pozitivne. Posto variable bez predznaka nemogu prikazivati negativne brojeve, mogu prikazati vece pozitivne brojeve.
U narednoj tabeli morete vidjeti koje tipove varibli imamo, njihov naziv, kljucnu rijec, koliko memorije trose i koje brojevne vrijednosti mogu sadrzati.
+---------------------------------------------------------------------------------------------+
|Tip variable kljucna potrebni brojevna |
| rijec byte-ovi vrijednost |
+---------------------------------------------------------------------------------------------+
|Znak char 1 -128 do 127 |
+---------------------------------------------------------------------------------------------+
|Cijeli broj int 4 -2147483648 do 2147483647 |
+---------------------------------------------------------------------------------------------+
|Kratki cijeli broj short 2 -32768 do 32767 |
+---------------------------------------------------------------------------------------------+
|Dugi cijeli broj long 4 -2147483648 do 2147483647 |
+---------------------------------------------------------------------------------------------+
|Znak bez predznaka unsigned char 1 0 do 255 |
+---------------------------------------------------------------------------------------------+
|Cijeli broj bez unsigned int 4 0 do 4294967295 |
|predznaka |
+---------------------------------------------------------------------------------------------+
|Kratki cijeli broj unsigned short 2 0 do 65535 |
|bez predznaka |
+---------------------------------------------------------------------------------------------+
|Dugi cijeli broj unsigned long 4 0 do 4294967295 |
|bez predznaka |
+---------------------------------------------------------------------------------------------+
|Broj s pomicnim float 4 ca. -3.4E38 do -1.2E-38 |
|zarezom obicne i 1.2E-38 do 3.4E38 |
|preciznosti (preciznost 7 decimalni mjesta) |
+---------------------------------------------------------------------------------------------+
|Broj s pomicnim double 8 ca. -1.8E308 do -4.9E-324 |
|zarezom duple i 4.9E-308 do 1.8E308 |
|preciznost (preciznost 19 decimalni mjesta) |
+---------------------------------------------------------------------------------------------+
Ove navedene vrijednosti za float i double ovise o inernom prikazu, znaci binarnom kodiranju.
Cesto kod prebacivanja brojeva sa zarezom iz binarni u decimalne brojeve zna doci do problema sa zaokruzivanjem.
najlakse vam je provjerit velicinu tipova na vasem kompjuteru sa sizeof operatorom
primjer:
#include<stdio.h>
int main()
{
printf("Velicina u byte-ovima za char: %d\n", sizeof(char));
printf("Velicina u byte-ovima za short: %d\n", sizeof(short));
printf("Velicina u byte-ovima za int: %d\n", sizeof(int));
printf("Velicina u byte-ovima za long: %d\n", sizeof(long));
printf("Velicina u byte-ovima za float: %d\n", sizeof(float));
printf("Velicina u byte-ovima za double: %d\n", sizeof(double));
return 0;
}
-deklariranje i inicijaliziranje variabli
Variable morete na razlicite nacine deklarirat, mozete navest tip, pa redom sve varible, il u svaki red posebno tip i ime variable. Takodjer ih morete i odmah inicijalizirati. Nemojte zaboravit ; na kraju reda.
Variable koje niste na pocetku inicijalizirali imaje bilo kakvu vrijednost, samo sto se cesto desi da ta vrijednost zna bit nula, al nemojte se oslanjat na to, bolje vam ih je odmah na pocetku inicijalizirati, sto znaci dat im oderdjenu vrijednost.
Prilikom davanja vrijednosti variblama s pomicnim zarezom morate koristiti tocku umjesto zareza za odvajanje. Znaci 3.14 je ispravno, dok 3,14 nije.
primjeri:
int broj1, broj2, umnozak;
int broj1;
int broj2;
int umnozak;
int broj1 = 1, broj2 = 3;
char = 'h';
float = 3.14;
-Konstante
Konstante su vrijednosti kojima na pocetku programa dadnete vrijednost i koje se tokom cijelog programa mogu koristiti, one se uvijek pisu velikim slovima.
primjer za konstantu, definicija i davanje vrijednosti.
#define PI 3.14159
#define OUT_OF_MEM -1
Kad god sada u programskom kôdu napisemo PI ili OUT_OF_MEM, na tom mjestu zapravo stoji njihova vrijednost. Izuzetak je ako je napisanu u paru duplih navodnika, tada oznacava samo dio teksta.
UPDATE 23.09.2009.
--Funkcija printf
Funkcija printf je dio standardne C-bibliteke i daje vjerojatno najfleksibilniju mogucnost za ispis podataka na ekran.
Ispis teksta pomocu funkcije printf je jako jednostavna. Pozovite funkciju printf i u paru duplih navodnika napisite tekst koji zelite da se ispise na ekranu
printf("Nekakav tekst za ispis");
Cesto necete morat samo ispisati tekst vec i sadrzaj nekakvi varijabli. Ukoliko zelite ispisat u novom redu vrijednost variable x uz opisni tekst, ucinit cete to na ovaj nacin
printf("\nVrijednost varijable x je: %d", x);
Ukoliko x ima vrijednost 12, na ekranu ce pisat:
Vrijednost varijable x je: 12
Na ovaj nacin predajemo funkciji printf 2 argumenta. Prvi argument je tzv formatstring koji se nalazi u paru duplih navodnika. Drugi argument je ime variable (x), koji sadrzi vrijednost koju zelimo prikazat.
U funkciji printf dajete formatstring, s kojim kazete kako ce ispis izgledati, a on se sastoji od:
-Literalnog teksta koji se ispisuje bas onako kako ga vi upisete. U gornjem primjeru se literalni string proteze od V (prvo slovo u rijeci vrijednost) do znaka za razmak prije %.
-Escape-sequence (neznam hrvatski izraz) daju posebne mogucnosti pri formatiranju. Escpae-sequence se sastoji od jednog backslasha (\) kojeg slijedi jedan znak. U proslom primjeru \n je bila escape-sequence koja predsatvlja znak za novi red. Escape-sequence se koristi takodjer za predstvaljanje posebeni znakova koji su opet escape-sequence.
-Specifikatori pretvorbe se sastoje od znaka za postotak % kojeg slijedi neki drugi znak. Specifikator pretvorbe govori funkciji printf format od varijable koja se ispisuje.
Tabela za escape-sequences
+--------------------------------------+
| Sequence | Znacenje |
+======================================+
| \a | Akusticni signal |
+--------------------------------------+
| \b | Backspace |
+--------------------------------------+
| \n | Novi red |
+--------------------------------------+
| \t | Horizontalni tabulator |
+--------------------------------------+
| \\ | Backslash |
+--------------------------------------+
| \? | Upitnik |
+--------------------------------------+
| \' | Obicni znak za navod |
+--------------------------------------+
| \" | Dupli znak za navod |
+--------------------------------------+
Tabela za specifikatore pretvorbe
+--------------+-------------------------------------+---------------------+
| Specifikator | Znacenje | konvertirani tipovi |
+==========================================================================+
| %c | obicni znak | char |
+--------------+-------------------------------------+---------------------+
| %d | decimalni broj s predznakom | int, short |
+--------------+-------------------------------------+---------------------+
| %ld | veliki decimalni broj s predznakom | long |
+--------------+-------------------------------------+---------------------+
| %f | broj s pomicnim zarezom | float, double |
+--------------+-------------------------------------+---------------------+
| %s | znakovni string | char-Arrays |
+--------------+-------------------------------------+---------------------+
| %u | decimalni broj bez predznaka | unsigned int, short |
+--------------+-------------------------------------+---------------------+
| %lu | veliki decimalni broj bez predznaka | unsigned long |
+--------------+-------------------------------------+---------------------+
Primjer:
#include<stdio.h>
int main()
{
char c = 'h';
int i = -20;
float f = 3.14;
unsigned int ui = 420000000;
printf("znak = %c, decimalni broj s predznakom = %d\n", c, i);
printf("broj s pomicnim zarezom = %f, decimalni broj bez predznaka = %u", f, ui);
return 0;
}
Sa printf nemorete ispisivati samo vrijednosti varijabli. Mozete koristiti svaki valjani C-izraz. kao npr.:
int x = 5;
int y = 3;
printf("%d", x + y);
jos jednom, konstruktivan feedback je uvijek pozeljan, svejedno dal pozitivan ili negativan