offline
- N1k0l4

- Prijatelj foruma
- Pridružio: 06 Sep 2005
- Poruke: 3800
- Gde živiš: Beograd
|
- 14Ovo se svidja korisnicima: dr_Bora, bocke, CyberSrbin032, Srki94, mcrule, ThePhilosopher, ivance95, Mila_90, TwinHeadedEagle, Srki_82, NIx Car, magna86, vasa.93, Sale.S
Registruj se da bi pohvalio/la poruku!
Uvod, istorija racunarstva , osnovni pojmovi
Korisceni alati u tutorijalu
Osnovni pojmovi u C-u(preprocesorkse direktive, kljucne reci...)
Tipovi podataka
Nizovi i baratanje sa nizovima
Naredbe, struktura programa i blokovi
Promenljive ( tipovi, dodela, inkrementalni operatori i slicno)
Kontrola toka
Funkcije
Strukture
Pokazivaci
Datoteke
Domaći zadatak
1. Uvod, istorija racunarstva , osnovni pojmovi
Još u 19.veku, 1820.godine, Čarls Bebidž napravio je mašinu za računanje koja se smatra pretečom današnjeg računara. Njen cilj je bio nalaženje rešenja bilo kog matematičkog izraza za koji znamo redosled operacija. Ta mašina je bila teška oko 3 tone, dimenzija 2x4m i imala je oko 4000 delova.
Početkom 20. veka javlja se ime Alen Tjuring. On je 1943 godine bio angažovan za dešifrovanje nemačkih tajnih poruka. Njegova ideja je bila da pronađe mašinu koja će biti u stanju da svaki problem reši nizom elementarnih operacija.
1945-1947 godine, Džon Von Nojman dao je princip arhitekture današnjeg računara.
1949. EDSAC M. Wikes realizacija programabilnog racunara
1949. UNIVAC Eckert, Mauchly projekat komercijalnog racunara
Istorija računarstva prolazi kroz nekoliko generacija. Prva, 1951-1958 , odlikuje se elektronskim cevima, bušenim karticama, mašinski jezik... Druga, 1959 - 1963 Poluprovodnici za tranzistore, magnetni diskovi i trake, nastanak fortrana, Lisp-a, COBOL-a... Treću generaciju, 1964-1979 odlikuju integrisana kola, MOS memorija, operativni sistemi... I u četvrtoj generaciji koja traje i dan danas odlike su mikroprocesor, personalni računari, internet, jezici specijalne namene....
Istoriju razvoja programskih jezik amožete pogledati na sledećoj slici:
2. Korišćeni alati u tutorijalu
Ovaj tutorijal je zamišljen da početnicima pomogne da savlada osnove programiranja kroz programski jezik C. Za ove potrebe, dovoljno će biti da se da se preuzme DevC++ u kojem možete kompajlirati i pokretati vaše primere. Možete ga preuzeti sa adrese: [Link mogu videti samo ulogovani korisnici]
Screenshot :
Kompajliranje koda vršite klikom na execute-> compile a ukoliko želite i da ga pokrenete odmah nakon kompajliranja, iz istog menija izaberite opciju compile & run
Za linux možete koristiti gcc i neki editor koji Vam odgovara. Kompajliranje vršite na komandom gcc imefajla.c , koji će generisati a.out koji treba pokrenuti.
3. Osnovni pojmovi u C-u(preprocesorkse direktive, kljucne reci...)
Sad bi smo mogli da počnemo malo da programiramo, zar ne? Ajd, sačekaćemo još malo, da se upoznamo prvo sa osnovnim pojmovima u C programskom jeziku.
Često (da ne kažem uvek) ćete viđati na početku .c fajla znak #. On predstavlja preprocesorsku direktivu.
Način korišćenja je sledeći:
#include<stdio>
i taj deo koda zapravo govori da se sadržaj datoteke stdio.h "nalepi" na mesto vašeg fajla u kojem ste to uneli.
Ukoliko se navede baš tako, u uglastim zagradama, tada će fajl stdio.h biti pronađen u podrazumevanom direktorijumu sa zaglavljima(header fajlovima). Ukoliko želite da ubacite fajl iz vašeg direktorijuma gde je i projekat smešten stavljate ga pod navodnicima:
#include "imefajla.h"
Pored ove direktive, često korišćena direktiva je DEFINE
#DEFINE MAX 100
Uloga ove direktive je da sva pojavljivanja MAX u kodu prilikom kompajliranja zameni sa 100.
Mogu se koristiti i složeniji izrazi oblika:
#define MAX(A, B) ((A)>(B) ? (A) : (B))
koji nalazi maksimum dva broja, a sintaksu ćemo kasnije objasniti, tako da vas ne plaši što ne razumete baš najbolje šta je tu gore napisano i zašto baš tako.
Ključne reči u programskom jeziku su niske karaktera koje se ne mogu koristiti kao imena promenljivih. Te ključne reči su sastavni deo jezika i imaju fiksno značenje.Neke od njih su if, else, for, while, printf... Biće kasnije objašnjeno njihovo značenje.
4. Tipovi podataka
Promenljive i konstante su oblik podataka sa kojima se radi u programu
Deklaracija predstavlja spisak promenljivih koje će se koristiti u programu
Tip određuje skup vrednosti koje ta promenljiva može da uzme.
U C-u postoji više tipova podataka
int - ceo broj
long - dug ceo broj
char - znak, karakter
float - realan broj
double - realan broj dvostruke tačnosti
Primer deklaracije promenljive:
int x;
Primer deklaracije sa inicijalizacijom(dodeljivanje vrednosti prilikom kreiranja te promenljive)
int x=58;
Imena promenljivih mogu da sadrže slova, cifre i znak _
Razlikuju se mala i velika slova. Tako da
int x;
nije isto što i int X;
5. Nizovi i baratanje sa nizovima
Sama reč niz bi trebala da bude dovoljno jasna šta znači. Moguće je napraviti promenljivu koja će da sadrži niz vrednosti nekog tipa. Na primer, želimo da imamo promenljivu koja će da čuva podatke o 7 izvučenih loto brojeva. Ti brojevi su oblika int. Deklarišemo promenljivu na sledeći način
int lotoBrojevi[7];
Time smo omogućili da se u promenljivu lotoBrojevi redom na pozicijama 0,1,2...6 upiše sedam podataka oblika int odnosno ceo broj.
Svakom od tih brojeva pristupamo preko indeksa. Treba naglasiti da u C-u indeksi kreću od nule. Tako da će se na poziciji lotobrojevi[0] nalaziti prvi broj, a na poziciji lotoBrojevi[6] nalaziti poslednji broj.
Ukoliko želimo , možemo i da inicijalizujemo taj niz prilikom deklaracije:
int nizBrojeva[4] = {1,2,3,4};
ili
int nizBrojeva[] = {1,2,3};
Primetimo da je u drugom primeru izostavljen broj u uglastoj zagradi koliko podataka će promenljiva da sadrži. Komapjler će to sam da odredi na osnovu podataka koji su dati za inicijalizaciju, tako da je moguće u tom slučaju izostaviti.
Kod inicijalizacije niza oblika char razlikujemo dva slučaja:
char primer1 ={'m','y','c','i','t','y'}
i
char primer2="mycity";
U primer1 biće rezervisano u memoriji prostora za 6 znakova. U primer2 biće rezervisano 7 zato što se automatski na kraju dodaje i terminirajuća nula koja označava kraj niske.
6. Naredbe, struktura programa i blokovi
Program napisan u c-u mora da ima tzv.main funkciju od koje počinje izvršavanje programa.
Dakle, u ovom delu prvi put pokrećemo jedan programčić koji ništa pametno ne radi već samo dodeljuje vrednost jednoj promenljivoj i štampa je.
kod je sledeći:
#include<stdio>
int main(int argc, char *argv[])
{
int x;
x=15;
printf("\n Broj x=%d \n",x);
system("pause");
return 0;
}
Ovde imamo najpre direktivu include koja uključuje stdio.h koji predstavlja STANDARD INPUT OUTPUT zaglavlje.
sledeće je int main(int argc, char *argv[]) što predstavlja glavnu funkciju u programu. Funkcije u programskom jeziku C će biti obrađene u jednom od sledećih delova tutorijala.
U daljim koracima, deklarišemo promenljivu x koja je tipa int. Dodeljujemo joj vrednost 15 i štampamo je korišćenjem funkcije printf.
Funkcija printf sadrži \n - stampanje novog reda, zatim string Broj x =%d. Ovo %d govori da će se odštampati ceo broj. Nakon toga se ponovo štampa novi red. Pošto smo rekli da %d štampa ceo broj, moramo i da kažemo iz koje promenljive vadi taj broj. To navodimo nakon zareza , u ovom slučaju to je promenljiva x.
Mogli smo da imamo više štampanja, naveli bi smo više puta %d za ceo broj a iza zareza naveli promenljive koje se štampaju.
Osim celog broja , može da se štampa i :
%f - realan broj
%c - karakter
%s - string
Sledeće što je stavljeno system("pause") , postavljeno je da se prozor koji se otvori pri pokretanju programa ne bi zatvorio odmah nakon štampanja rezultata nego se čeka komanda korsnika pa tek onda nestaje.
return 0 : Naredbom return dajemo povratnu vrednost funkcije. To će biti detaljnije obradjeno u delu o funkcijama. Ovde, ukratko, 0 označava da se program izvršio uspešno.
Nakon pokretanja,, trebalo bi da dobijete sledeći prozor:
Možemo primetiti da smo kod koji se izvršava uneli između vitičastih zagrada. Te vitičaste zagrade označavaju jedan blok u programu.
Čestitam, upravo ste pokrenuli vaš prvi C program.
7. Promenljive ( tipovi, dodela, inkrementalni operatori)
U prethodnih 6 delova tutorijala već su pominjane promenljive. Ovde će biti malo više reči o njima.
Promenljivom se smatra objekat koji može da menja svoju vrednost.
Tipove promenljivih sam već napisao, ali ponoviću ponovo osnovne:
int - ceo broj
long - dug ceo broj
char - znak, karakter
float - realan broj
double - realan broj dvostruke tačnosti
Kada deklarišemo neku prmenljivu, rezerviše se prostor u memoriji za nju ali vrednost joj se ne dodeljuje ukoliko nije inicijalizvana. Tu se mora voditi računa da se takva promenljiva ne poredi kasnije sa nekim drugim promenljivama ukoliko joj nije dodeljena vrednost, jer , može se desiti da je baš u tom delu memorije već sačuvan neki broj i ko zna šta možemo dobiti kao rezultat.
Ukoliko imamo promenljivu koja je celobrojna, dodelu vršimo znakom jednakosti
int promenljiva;
promenljiva = 23;
Ukoliko želimo sa standardnog ulaza da učitamo neki broj i da ga štampamo, unećemo sledeći kod:
#include<stdio>
int main(int argc, char *argv[])
{
int x;
printf("\nUnesite ceo broj x=");
scanf("%d",&x);
printf("\n Broj x=%d \n",x);
system("pause");
return 0;
}
Ovde se susrećemo sa novom funkcijom scanf koja ima ulogu da u promenljivu x učita neku vrednost.Prvi argument ove funkcije govori o kom tipu promenljive je reč, u ovom slučaju %d označava da je u pitanju ceo broj. Znak & je referenca, odnosno , daje lokaciju u memoriji gde je smeštena promenljiva x. Bez njega, ne bi bilo moguće upisati vrednost u prmenljivu x i program bi najverovatnije javio grešku pri izvršavanju.
Mi možemo promenljivu x da menjamo, da je uvećavamo , smanjujemo, poredimo sa drugim promenljivama
KOD:
#include<stdio>
int main(int argc, char *argv[])
{
int x;
printf("\nUnesite ceo broj x=");
scanf("%d",&x);
printf("\n Broj x=%d \n",x);
if(x==15)
printf("\npromenljiva x je jednaka sa brojem 15");
else
printf("\npromenljiva x nije jednaka sa brojem 15");
x++;
printf("\nsada je promenljiva x = %d",x);
system("pause");
return 0;
}
U prethodnom kodu postoje nove stvari. Najpre, nakon štampanja promenljive x vrši se poređenje korišćenjem dvostruke jednakosti ==.
Kasnije će biti objašnjena ključna reč if
Operator ++ primenjen na promenljivu x , uvećava promenljivu za 1, a zatim sledi njeno štampanje. Taj operator je isto kao i da smo napisali x=x+1
8. Kontrola toka
if-else naredba
Sintaksa je oblika:
if(uslov)
iskaz1
else
iskaz2
Ova naredba proverava uslov naveden u zagradi. Ukoliko je ispunjen izvršava se iskaz1. Ukoliko nije, izvršava se iskaz2.
Iskaz koji se izvršava ne mora da bude jedna naredba. Može biti blok naredbi i u tom slučaju se navode između vitičastih zagrada. Videti primer na kraju ovog dela.
while petlja
Ima ulogu da se izvršava potencijalno i beskonačno mnogo puta ako treba sve dok se neki uslov ne zadovolji. Sintaksa je oblika while(uslov)
iskaz
Opet, iskaz može biti blok naredbi koje su između vitičastih zagrada.
for petlja
SIntaksa:
for(exp1;exp2;exp3)
iskaz
Petlja koja počinje od exp1, izvršava se sve dok je ispunjen uslov exp2, a menja se po exp3.
Primer, ukoliko želimo da prođemo kroz neki niz, kao onaj gore u primeru lotoBrojevi uradićemo sledeće:
for(i=0 ; i<=6 ; i++)
printf("%d ",lotobrojevi[i]);
do-while petlja
Sintaksa
do
izraz
while(uslov)
Naredba se izvršava i onda se izračunava uslov. Ako je on tačan, naredba se ponovo izvršava i sve tako.
break i continue
Ove dve funkcije nam pomažu da prekinemo izvršavanje petlje ili da preskočimo dalje izvršavanje.
Hoćemo na primer da u nizu koji ima milion brojeva da proverimo da li se nalazi broj 754. Mi možemo to da uradimo tako što ga propustimo kroz for petlju, jedan po jedan, i proveravamo da li ima 754. Ali, šta ako je taj broj na 1000-toj poziciji? Zašto onda da idemo do milion kad smo ga već našli. Tu recimo može pametno da se iskoristi break naredba i da se prekine izvršavanje petlje.
Ukoliko recimo želimo nekom nizu da dodamo 5 na pozitivne elemente, možemo da koristimo continue kada naiđemo na negativan, da sa njim ništa ne uradi...
Primer koda gde sam objedinio neke od ovih stvari gore opisanih:
Program učitava 10 brojeva. Zatim učitava još jedan broj , ukoliko se taj broj nalazi u tih 10 štampa se obaveštenje.
#include<stdio>
int main(int argc, char *argv[])
{
int x[10];
int i;
int zaPretragu;
for(i=0; i <10 ; i++)
{
printf("\nUnesi broj x_%d ",i);
scanf("%d",&x[i]);
}
printf("\n\nUnesi broj koji trazis: ");
scanf("%d",&zaPretragu);
for(i=0;i<10;i++)
{
if(x[i] == zaPretragu)
{
printf("\nPronadjen je trazeni broj");
break;
}
}
system("pause");
return 0;
}
Vi sad uradite isto preko ostalih petlji.
9. Funkcije
Funkcija u programskom jeziku ima ulogu da obradi neki dobijen podatak i da vrati povratnu vrednost odnosno rezultat ukoliko je to potrebno.
Sintaksa funkcije izgleda ovako:
povratna_vrednost imeFunkcije(argument1,argument2...)
{
kod koji obradjuje funkcija
}
Najbolje da se pojasni kroz jednostavan primer.
Recimo da nam je potrebno da odredimo koji je veci od dva broja. Napisacemo funkciju koja nam to odredjuje i vraca rezultat.
Funkcija treba da vrati rezltat koji je ceo broj(onaj broj koji je veci). Dakle , njen povratni tip ce biti tipa int
Ime funkcije cemo da nazovemo MaxDvaBroja, a u argumentima cemo da imamo broj1 i broj2 koji su takodje tipa int
Program izgleda ovako:
#include<stdio>
int MaxDvaBroja(int broj1, int broj2)
{
if(broj1>broj2)
{
printf("\nBroj1 je veci od broja2");
return broj1;
}
else if(broj1 < broj2)
{
printf("\nBroj2 je veci od broja1");
return broj2;
}
else
{
printf("\nBrojevi su jednaki");
return broj1;
}
}
int main(int argc, char *argv[])
{
int broj1;
int broj2;
printf("\nUnesite broj1 = ");
scanf("%d",&broj1);
printf("\nUnesite broj2 = ");
scanf("%d",&broj2);
int veciBroj;
veciBroj = MaxDvaBroja(broj1,broj2);
printf("\n\nRezultat koji je vratila funkcija je %d\n",veciBroj);
system("pause");
return 0;
}
Kao sto vidite, funkcija nasa je iznad main programa. To mora da bude tako, jer prilikom prevodjenja programa kada se dodje do funkcije koja se koristi a nije deklarisana nastace problem.
Moguce je samo ubaciti definiciju funkcije u zaglavlje, bez implementacije , a ispod main programa staviti implementaciju i proci ce i to.
Treba napomenuti jednu vaznu stvar u vezi funkcija. Parametri se prenose po vrednsoti. To znaci, da kad prosledimo brojeve iz main bloka u funkciju, funkcija nece baratati sa tim brojevima nego sa njenim kopijama. Kreira se novi stek frejm koji iskopira te vrednosti i sa njima radi. Tako da, ukoliko bi ste trebali da im zamenite mesta ili vrednost ili nešto slično tome, ne bi ste to mogli da uradite jer ćete promeniti lokalnu kopiju te promenljive. Za mogućnost menjanja promenljive, one se moraju slati funkciji uz pomoć referenci, odnosno, davanje adrese memorije gde je ta promenljiva smeštena. No, u ovom , početničkom tutorijalu za sada neće biti reči o tome....
Par slika kako program treba da izgleda koji je gore implementiran:
10. Strukture
Kako shvatiti strukturu? Recimo ovako, na primeru:
Zamislimo da imamo učenika kojeg opisuje
-ime
-prezime
-ocena iz vladanja
Malo je veštački primer ali tu je samo da pokaže šta je struktura:
Dakle, potrebno nam je da napravimo jednu promenljivu koja će da sadrži ta tri podatka.
Način na koji ćemo ovo da uradimo je sledeći:
#include<stdio>
struct ucenik
{
char ime[20];
char prezime[20];
int ocena;
};
int main(int argc, char *argv[])
{
struct ucenik skolarac;
strcpy(skolarac.ime,"nikola");
strcpy(skolarac.prezime,"mycity");
skolarac.ocena = 5;
printf("\nUneli ste ime %s , prezime %s, ocena: %d\n",skolarac.ime, skolarac.prezime, skolarac.ocena);
system("pause");
return 0;
}
Najpre, navodimo ključnu reč struct a zatim ime strukture.
Unutar vitičastih zagrada navodimo šta sve opisuje tu strukturu.
Dalje smo u kodu napravili jednu promenljivu koja je tog tipa, struktura tipa ucenik. Onda smo joj uz pomoc funkcije strcpy dodelili vrednosti za ime i prezime a zatim klasicnom dodelom dali i ocenu. Na kraju smo samo štampali taj rezultat.
Dakle, članicama nekog objekta strukture pristupamo uz pomoć nazivObjekta.polje , odnosno korišćenjem tačke pa navođenjem polja koji je potreban.
11. Pokazivači
Pokazivač predstavlja promenljivu koja pokazuje na neku vrednost u memoriji. Dakle, prilikom deklaracije neke promenljive, za tu promenljivu se rezerviše u memoriji određeni prostor koji će da čuva neku vrednost. Pokazivač može da pokazuje na deo memorije u koju je smeštena ta ili neka druga vrednost.
Operator & daje adresu neke promenljive, pa će naredba:pok = &a; dodeliti adresu promenljive "a" promenljivoj pok, pa kažemo da promenljiva pok pokazuje na a. Operator & daje referencu a operator * je operator dereferenciranja
Najbolje da se objasni kroz primer:
#include <stdio.h>
#include <stdlib.h>
main(){
int x, *p; // imamo promenljivu x i pokazivač koji je oblika x
p = &x; /* inicijalizacija pokazivača*/
*p = 0; /* postavlja x na 0*/
printf("x is %d\n", x); // ukoliko želite da vidite vrednost
printf("*p is %d\n", *p); // ukoliko želite da vidite vrednost
*p += 1; /* povećava to na šta pokazuje p */
printf("x is %d\n", x);
system("pause");
}
Pokazivači se mogu koristiti i u funkcijama, kao argumenti, ali o tome ne bih sada pisao u ovom tutorijalu jer su ovde predstavljeni uglavnom osnovni koncepti...
12. Datoteke
U ovom odeljku će biti prikazan rad sa datotekama, upis i čitanje iz istih.
Da bi se koristila datoteka moramo najpre da deklarišemo promenljivu koja će biti pokazivač na neku datoteku. Primer FILE *fp;
Da bi smo mogli da koristimo, moramo da je otvorimo. Možemo i nakon deklaracije a možemo i odmah da je inicijalizujemo: FILE* f = fopen("podaci.txt", "w");
U ovom slučaju, prvi argument funkcije fopen predstavlja naziv datoteke, a drugi argument mod u kojem se radi. Osnovni modovi su sledeći
w - otvara datoteku za pisanje. Sve što se do tada nalazilo u datoteci nestaće.
r - otvara datoteku za čitanje
a - otvara datoteku za dodavanje sadržaja na kraj iste.
Ukoliko fajl nije uspešno otvoren funkcija vraća NULL , tako da se korišćenjem jednsotavnog if upita može proveriti da li je uspešno otvoren fajl ili nije.
Funkacija fscanf čita iz fajla f tip podatka d u promenljivu a(i): fscanf(f, "%d", &a[i]);
Funkcije koje se još koriste za rad sa datotekama :
int getc(FILE *fp) - uzima naredni znak iz fajla
fprintf(FILE *fp, "format", vrednost) - upisuje u fajl fp, vrednost oblika "format". Slično kao i printf samo što zahteva i pokazivač na fajl u koji se upisuje.
fclose(FILE *fp) - zatvara fajl i čuva izmene nad istim.
Domaći zadatak
Ajde da procenite koliko ste naučili. Objedinite svoje znanje:
Zadatak: Napravite c program koji treba da čita podatke o korisnicima MyCity foruma. Podaci se nalaze u fajlu "podaci.txt" i oblika su:
Citat:Ime prezime brojPoruka
Dakle, nešto ovog tipa:
Citat:Pera Peric 201
Nikola Nikolic 312
Bojan Bojanic 321
Milena Milenic 432
Podaci se učitavaju u strkturu koja sadrži ta polja a zatim se iz tih struktura štampa na monitor korisnika. Prilikom štampanja, ukoliko korisnik ima 0 poruka, umesto 0 štampati "Korisnik nema poruka"
Dakle, koristićete strukture, fajlove, barataćete sa nizovima, različitim tipovima promenljivih..... Ukoliko negde naiđete na problem, slobodno napišite pa da rešimo
U zdravlje
|