Osnove Programskog Jezika C
Tutorial by Streetboy
1. Programski jezici
- Veliki broj problema koji se pojavljuje u praksi može se razložiti na jednostavnije
probleme-korake, koji predstavljaju postepeni, usmjereni tok rješavanja problema Takva
struktura se može opisati algoritmom, tj.
algoritam predstavlja niz koraka kojim se
rjeÅ¡ava odreÄ'eni problem.
-
Programer â€" pisac programa koji se može smatrati kao prevodioc sa jezika algoritma
(procedure), blizak ljudima, na programski jezik, blizak raÄunaru.
-
Programski jezik se na nekom niou apstrakcije može posmatrati kao bilo koji vjeÅ¡taÄki
jezik sa svojim pravilima, pojmovima, semantikom i sintaksom.
- Program bi trebao da se sastoji od
strukturnih cjelina (modula, potprograma, objekata,
klasa). Svaki dio programa trebao bi da se može podijeliti na manje djelove. Jedan dio
programa rješava jedan jasno koncipirani problem. Dobro napisani dio programa može
se sa malo ili bez prepravljanja koristiti u drugim programima.
- Pod editovanjem podrazumijevamo sastavljanje, testiranje i ispravljanje koda.
2. Istorijat programskih jezika
- Istorija programskih jezika poÄinje sa zavrÅ¡etkom II svjetskog rata.
Mogu se izdvojiti IV faze:
Citat
I faza koja obuhvata pedesete godine XX vijeka i koju obilježava razvoj
prvih programskih jezika i prva iskustva u programiranju.
II faza obuhvata šezdesete. Obilježava je razvoj teorije, razvoj prvih
kvalitetnih programskih jezika, te poÄetak programerske edukacije.
Brojni programski jezici razvijeni u ovoj fazi bili su prekomplikovani.
III faza obuhvata sedamdesete godine. Na osnovu iskustava iz
prethodnih perioda kreirani su jednostavni i moćni programski jezici.
Naime, težnja je kreirati programske module: funkcije, rutine,
potprograme, koje je moguće koristiti u brojnim drugim programima.
Svaki program se sastoji iz poziva modula, pri Äemu i moduli mogu
pozivati druge module.
IV fazu razvoja programskih jezika obilježava poÄetak
pojednostavljivanja razvoje velikih programskih paketa zasnovanih na
novim objektno-orjentisanim programskim jezicima. TakoÄ'e razvoj
multiprocesorskih raÄunara je zahtijevao razvoj prvih programskih
jezika za paraleleno programiranje.Ova faza obuhvata period od
poÄetka osamdesetih do sredine devedesetih.
- Prvi programski jezik razvio je
Konrad Zuse 1946 god u NjemaÄkoj.
Naziv ovog programskog jezika bio je
Plankalkul. Tri godine kasnije
razvijen je
Short Code, prvi programski jezik implementiran na
elektronskim raÄunarima.
- Prvi poznati programski prevodioci bili su
MATH-MATHIC i
Autocode.
- 1962. godine razvijena je prva kompjuterska igra, Space Wars, na MIT-u.
- Krupni korak u razvoju sistemskog softvera uÄinio je programski jezik C. Prvu
verziju ovog programskog jezika razvio je
Dennis Ritchie 1972 god.
* Softverska kriza *- PoÄetkom 80-tih doÅ¡lo je do
softverske krize. Koraci koji su joj prethodili:
* programeri su otkrili korisnicima raÄunara mogućnosti sistema
* zahtjevi korisnika raÄunara postali su veći
* zahtjevani obim posla koji je povjeravan raÄunarima postao je veći
- Osnovni problemi su postali:
* složenost pojedinih funkcija i nemogićnost jednostavnog ispravljanja istih
* veze funkcija sa ostalim modulima su bile veoma složene
* testiranje novog sistema
* otklanjanje brojnih grešaka kao posledica mijenjanja nekih modula
* Odgovor na softversku krizu *- Odgovor je predstavljalo
objekto-orjentisano programiranje. Kao koncept
pojavio se znatno prije, ali tek nakon krize uoÄena je njegova neophodnost.
- AmeriÄka komunikaciona kompanija AT&T (American Telephone and
Telegraph) je trebala poÄetkom 80-tih da rijeÅ¡i odreÄ'eni projekat. UoÄeno je da
projekat ne može biti realizovan upotrebom postojećih softverskih rješenja.
Stoga je kreirana objektno-orjentisana verzija C programa. Taj programski
jezik je dobio naziv ’’C sa klasama’’ (kasnije
C++).
- Za kreatora C jezika se smatra Bjarne Stroustrup.
- Danas su u širokoj upotrebi sledeći programski jezici: Ada, APT, C, C++, COBOL,
Common LISP, FORTRAN, Java, Pascal, Prolog, Visual Basic, Perl...
3. Podaci
- Podaci = objekti koji se obradjuju.
- Podaci koje koristi programski jezik možemo podijeliti u elementarne (osnovne)
ili složene.
- Osnovni prosti tipovi podataka su cijeli brojevi INT i FLOAT, koji se realizuju
hardverski, tj. njihova vrijednost se odreÄ'uje direktno na osnovu njihove binarne
reprezentacije. Drugi prosti podaci, tipa CHAR, izvedeni su iz njih.
- NajÄešće upotrebljavani tip složene promjenljive je niz (vektor). Napr. u
programskom jeziku C naredba int v[40] uvodi u program složenu promjenljivu
koja se sastoji od 40 cijelih brojeva.
- Životni vijek objekta koji pripada nekom od mogućih tipova
podataka poÄinje trenutkom alociranja (stvaranja) a zavrÅ¡ava se
trenutkom dealociranja (brisanja) iz memorije.
- Drugi primjeri složenih promjenljivih su višedimenzioni nizovi
(matrice), zapis (struktura), string (niz karaktera, recimo slova), itd.
- Konstante: podaci uneseni u programu kao fiksna, nepromjenljiva vrijednost.
- Promjenljive: podaci uneseni tokom izvrÅ¡avanja programa i koji se Äuvaju u posebnim smjeÅ¡tajnim
jedinicama.
- Ime promjenljive se sastoji od slova i brojeva. PoÄinje obaveno slovom i ne može imati razmak (osim
donje crte, tj. _) ili druge znakove (!#$%&...). Jako je bitno voditi raÄuna o malim i velikim slovima jer
promjenljive Skola i skola nisu iste â€" Å¡taviÅ¡e, obije paralelno mogu da postoje u programu.
- Osnovni tipovi podataka u programskomjeziku C su:
* Char â€" jedno slovo, cifra ili znak
* Int â€" cijeli (pozitivni ili negativni broj)
* Float â€" realan broj (napr. 3.1415)
* Double â€" kao float ali dvostruke preciznosti
- Kada u programu napišemo int visina, time programu saopštavamo da je visina promjenljiva i da će u
vrijeme izvršavanja sadržati neki cijeli broj (engl. integer). Time smo deklarisali promjenljivu. Sve
naredbe, pa i deklaracije, moraju da se zavrÅ¡e znakom taÄka i zarez (;).
- U programiranju je veoma bitno pisanje komentara. Komentari se u programskom jeziku C piÅ¡u izmeÄ'u
znakova /* i */, i mogu sadržati viÅ¡e redova teksta. ÄŒesto se koristi jednoredni komentar koji poÄinje sa
// a završava se na kraju reda.
4. Znakovi i tekst
- Prije svega moramo da usvojimo da 1 i ‘1’ nije isto. Čak i kad bismo ih sabrali ne bi dobili 2, već 50.
Zašto ? Broj 1 je takozvana brojevna konstanta dok je ‘1’ znak ili znakovna konstanta. Vrijednost znaka
je redni broj u tabeli znakova (ASCII tabela), tako da ‘1’ ima vrijednost 49 što daje odgovarajući rezultat
pri sabiranju. Tu se i krije odgovor kako raÄunar koji može da razumije samo brojeve može da radi sa
slovima i znakovima.
- ’’Podgorica’’, ’’Danas je lijep dan’’, ’’1+1 je 7’’...
Navedeni primjeri su tekstualne konstante, tj. string konstante i najviše služe za poruke koje korisniku
programa raÄunar ispisuje na ekranu. Primjer: ’’unesi udaljenost u kilometrima’’. Iako su stringovi
sastavljeni od znakova, ’’1’’ nije isto što i ‘1’.
5. Ulaz i izlaz
- Osnovna naredba je naredba dodjele i izvršava se pomoću operatora jednako (tj. =), napr.
A=A+B. To znaÄi da lijeva strana postaje jednaka desnoj nakon izvrÅ¡enja date naredbe i ne
mora da znaÄi da su bile jednake prije toga. Rezultat te naredbe je sledeći: promjenljiva A
dobija trenutnu vrijednosti promjenljive B uvećanu za 2, tj. dobija vrijednost izraza B+2.
- Sa lijeve strane operatora dodjele mora da bude mora da bude iskljuÄivo promjenljiva, tj. ne
mogu biti konstanta ili izraz.
- Moramo voditi raÄuna o tome da se u primjeru A=2.53; odsijeca decimalan dio broja ukoliko je
A deklarisano sa int A; jer .53 nema gde da stane u cjelobrojnu promjenljivu. Ako želimo da
saÄuvamo i decimale, moramo da deklariÅ¡emo A sa float A; ili double A;.
- Kada se pozove funkcija printf("%d", visina); na korisnikovom ekranu se ispisuje trenutna
vrijednost promjenljive visina. Pomoću znakova "%d", raÄunaru se saopÅ¡tava da visinu
mora da ispiše kao cio broj.
* FORMATIRANJE ISPISA *- Prikaz upotrebe kontrolnih znakova % i / za formatiranje pri korišćenju funkcije printf:
%d ili %i - za unos/ispis cijeliog broja
%f - za unos/ispis realnog broja
%c - za za unos/ispis znaka
%s - za unos/ispis teksta (stringova)
\n - novi red
\t - tabulator
\\ - znak \
\% - znak %
6. Pretprocesorske direktive
- Da bismo mogli koristiti funkcije printf i scanf, moramo da
napiÅ¡emo #include<stdio.h> na poÄetku programa. To je pretprocesorska direktiva koja ukljuÄuje
biblioteku stdio.h u naÅ¡ program â€" omogućava nam da koristimo
njene funkcije.
- Ako bismo želeli da umesto konstante 3.1415 u programu
koristimo PI, to možemo uÄiniti pomoću direktive #define na
sledeći naÄin: #define PI 3.1415.
Pretprocesorske direktive nemaju taÄku i zapetu ( ; ) na kraju
reda!
7. Funkcije i operatori
- Sasvim je logiÄno da u okviru izraza koristimo uobiÄajene matematiÄke operatore:
+, -, *, /, ali moramo voditi raÄuna o tome da se pri dijeljenju dva cijela broja
uvijek odsijeca decimalan dio! Ako želimo da to izbjegnemo, moramo napisati
ovako: A=(double)B/C. Tako eksplicitno konvertujemo B u realan broj (konkretno,
double), pa se pri dijeljenju neće odsjeći cijeli dio broja.
- Ostatak pri dijeljenju možemo dobiti pomoću operatora %.
Primjer:
5%2 je 1, tj. najbliži djeljiv broj je 4 a razlika do 5 je 1, i to je dio broja 5 koji se ne
može podijeliti sa 2.
Postoje i operatori koji skraćuju zapis nekih dužih izraza i oni se Äesto koriste u
programskom jeziku C. Takvi operatori mogu biti skup ili kombinacija dva ili više
osnovnih operatora kao što su to: +,-,*,/ itd...
A++ ili ++A = A=A+1
Aâ€" ili â€"A = A=A-1
A+=2 = A=A+2
A-=2 = A=A-2
A*=2 = A=A*2
A/=2 = A=A/2
-Postoji veliki broj ugraÄ'enih matematiÄkih funkcija u biblioteci math.h, a
možemo da ih upotrijebimo ako napiÅ¡emo #include <math.h> na poÄetku
programa. Sve funkcije u math.h vraćaju rezultat tipa double, a apsolutna
vrijednost cijelih brojeva nalazi se u stdlib.h.
fabs(x) = apsolutna vrijednost
sqrt(x) = kvadratni korijen od x
sin(x), cos(x) = sinus, kosinus, x u rad
pow(a,n) = stepenovanje a na n
log(x) = prirodni logaritam, lnx
ceil(x) = zaokruživanje na veći broj
floor(x) = zaokruživanje na manji broj
- Da bismo dobili neku nasumiÄno odabranu vrijednost, potrebno je da ukljuÄimo
biblioteke stdlib.h (zbog funkcija rand i srand) i time.h (zbog funkcije time). Funkcija
srand služi da inicijalizuje generator pseudosluÄajnih brojeva (tj. da mu dodijeli
poÄetnu vrijednost) i bitno je da ta vrijednost uvijek bude drugaÄija (tu pomaže
funkcija time). Funkcija rand daje nasumiÄno odabran cio broj. Kada napiÅ¡emo izraz
rand()%10, dobićemo broj u intervalu od 0 do 9.
PRIMJERI(ZADACI)
1.Napisati program koji na standardni izlaz ispisuje poruku: Zdravo, clanovi Balkan Samp-a!.
#include <stdio.h>
int main() {
printf("Zdravo, clanovi Balkan Samp-a!\n");
return 0;
}
2.Napisati program koji prevodi dužinu datu u stopama u centimetre (1 stopa =30.48
cm).
#include <stdio.h>
#define STOPA 30.48
int main() {
float st;
printf("Unesite duzinu u stopama :");
scanf("%f",&st);
printf("%f stopa u cm iznosi : %f \n",st,st*STOPA);
return 0;
}
3.Napisati program koji na standardni izlaz ispisuje veliko slovo A u polju Å¡irine Äetiri,
a u novom redu malo slovo A u polju širine šest.
#include <stdio.h>
int main() {
printf("Slova:\n%4c\n%6c\n", 'A' , 'a');
return 0;
}
4.Napisati program koji vremenski interval dat u minutima izražava u satima i
minutima.
#include <stdio.h>
int main() {
int min;
printf("Uneti vremenski interval u minutima :");
scanf("%d",&min);
printf("Interval %d minuta ima %d sati i %d minuta\n",
min,min/60,min%60);
return 0;
}
5.Napisati program koji generiÅ¡e sluÄajan cijeli broj iz intervala [1,10].
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
srand(time(0));
printf("Broj : %d" ,rand()%10+1);
return 0;
}
6.Napisati program koji za dvije zadate cjelobrojne promjenljive na standardni izlaz
ispisuje redom njihov zbir, razliku, proizvod, koliÄnik i kvadratni korjen.
#include <stdio.h>
#include <math.h> //Koristi se zbog ugradjene funkcije sqrt
int main(){
int a,b;
printf("Unesi brojeve :");
scanf("%d%d",&a,&b);
printf("Zbir: %d\n",a+b);
printf("Razlika: %d\n",a-b);
printf("Proizvod: %d\n",a*b);
printf("Kolicnik: %f\n",(double)a/b);
printf("Kvadratni korjen od broja %d je %f\n",a,sqrt(a));
printf("Kvadratni korjen od broja %d je %f\n",b,sqrt(b));
return 0;
}
7.Napisati program koji izraÄunava proizvod cifara datog Äetvorocifrenog cijelog broja br.
#include <stdio.h>
intmain() {
int br;
int cf1,cf2,cf3,cf4;
printf("Unijeti cetvorocifreni broj: ");
scanf("%d",&br);
cf1=(br/1000);
cf2=(br/100)%10;
cf3=(br/10)%10;
cf4=br%10;
printf("Proizvod cifara broja %d je %d\n", br, cf1*cf2*cf3*cf4);
return 0;
}