Upload
others
View
4
Download
1
Embed Size (px)
Citation preview
Programski jezik C
(glave 5 i 6 iz udžbenika)
PJ C: opšte karakteristike
C: programski jezik opšte namene, imperativan i proceduralan
Razvijen 1972.g, Denis Riči, programiranje aplikacija pod UNIX-om na DEC PDP-11
Neformalna specifikacija: Brajan Kernigen i Denis Riči "The C Programming Language", 1978.
1977. – prenosiva verzija C-a Standardi: 1989 (ANSI), 1990, 1999, 2011 (ISO)
2/53
PJ C: opšte karakteristike
Prethodnici BCPL i B – jezici za pisanje operativnih sistema i jezičkih procesora
Efikasno korišćenje tehničkih svojstava računara Blizak operacijama mašinskog nivoa Rad sa pojedinačnim bitovima i memorijskim
adresama Fleksibilan, bez restrikcija
3/53
Primer programa-1
#include
int main()
{
printf("Ovo je moj prvi program\n");
return 0;
}
4/53
Primer programa-2
/* Program izracunava i stampa kvadrat unetog broja */
#include
int main() {
int a;
printf("Unesite ceo broj: ");
scanf("%i", &a);
printf("Kvadrat unetog broja je: %i", a*a);
return 0;
}
5/53
Primer programa-3
/* Program utvrdjuje da li je uneti broj paran*/
#include
int main() {
int a;
printf("Unesi broj: ");
scanf("%d", &a);
if (a % 2 == 0)
printf("Broj %d je paran\n", a);
else
printf("Broj %d je neparan\n", a);
return 0;
}6/53
Primer programa-4
/* Program izracunava i stampa kvadrate i korene prvih 100 prirodnih brojeva*/
#include
#include
#define N 100
int main() {
int i;
for (i = 1; i
Primer programa-5
/* Program izracunava i stampa najmanji broj i takav da je zbir prvih i prirodnih brojeva jednak ili veci od 100*/
#include
#define N 100
int main() {
int i = 1;
int s = 1;
while(s
Primer programa-6
/* Program prebacuje mala slova u velika*/
#include
#include
int main() {
int c;
printf("Otkucaj recenicu (zavrsi je znakom .): ");
do {
c = getchar();
putchar(toupper(c));
} while (c != ’.’);
putchar(’\n’);
return 0;
} 9/53
Izračunavanje: promenljive, tipovi; konstante; operacije, izrazi
Promenljiva se deklariše pre korišćenja
Promenljiva je objekat koji ima ime
tip
prostor u memoriji (veličina zavisi od tipa)
Vrednost (opseg zavisi od veličine prostora tj. od tipa)
10/53
Izračunavanje: promenljive
Ime
identifikator; slova, cifre, simbol _, ne počinje cifrom
na primer a, A, broj_studenata, brojStudenata
Tip: tip lista-promenljivih
pimeri: int broj; /* deklaracija celog broja */
int a, b; /* deklaracija vise celih brojeva */
ne podrazumeva inicijalizaciju
Inicijalizacija: int a = 5; ili
int a = 5, b;
nepromenljiva inicijalizacija: const double PI = 3.14;
11/53
Izračunavanje: tipovi
Tip: vrsta podataka koje opisuje,
način reprezentacije,
skup operacija koje se mogu primeniti nad podacima tog tipa,
broj bitova koji se koriste za reprezentaciju
Prosti tipovi: int, char, double, boolean, i varijante
12/53
Izračunavanje: tipovi
Tip int (integer): Označene vrednosti
Potpuni komplement
Aritmetičke operacije (+, -, *, /), relacijske operacije (, ==, ...)
Broj bita zavisi od računara (min 16, obično 32 ili 64)
funkcija sizeof( tip ) vraća koliko je bajtova potrebno za skladištenje tipa. Na primer sizeof( char ) je 1 sizeof( int ) je 2 4 ili 8
13/53
Izračunavanje: tipovi
Kvalifikatori short, long, long long
signed i unsigned
opseg: npr. 32 bita signed: -2 147 483 648 do 2 147 483 647
unsigned: 0 do 4 294 967 295
Specifikatori za upis i ispis: %i --- ceo broj
%d --- ceo dekadni broj
%u --- neoznacen dekadni broj
%o --- neoznacen oktalni broj
%x, %X --- neoznacen heksadekadni broj14/53
Izračunavanje: tipovi
#include
int main(){
int dec, hex, okt;
scanf("%i",&hex); //npr. hex = 0x27
scanf("%d",&dec); //npr. dec = 27
scanf("%i",&okt); //npr. okt = 027
printf("Hex: %d\nDec: %d\nOkt:%d\n",hex,dec,okt);
// outputs: Hex = 39, Dec = 27, Okt = 23
printf("Hex: %i\nDec: %i\nOkt:%i\n",hex,dec,okt);
// outputs: Hex = 39, Dec = 27, Okt = 23
}
15/53
Izračunavanje: tipovi
Primeri:
1234 – int
1234l, 1234L, – long int
123456 – (?long int)
65000u, 65000U – unsigned int
4000000000ul, 4000000000UL– unsigned long int
16/53
Izračunavanje: tipovi
Tip char (character):
jedan bajt
mali celi brojevi
aritmetičke operacije i relacijske operacije
označen / neoznačen
unsigned char c /* vrednost od 0 do 255 */
signed char c /*vrednost -128 do +127 */
char: unsigned ili signed (zavisno od implementacije)
primeri: 11111111, 00000000, 10000001, 10000000
kodovi karaktera (ASCII)
ispis i učitavanje %c
funkcije za rad sa karakterskim tipom u datoteci zaglavlja
primer isalpha, isdigit, toupper, tolower 17/53
Izračunavanje: tipovi
Tip float (double, long double):
Brojevi u pokretnom zarezu:
float (osnovna tačnost)
double (dvostruka tačnost)
long double (proširena tačnost)
Nije propisano standardom koliko ovi tipovi zauzimaju bitova
Opseg i detalji:
18/53
Izračunavanje: tipovi
Tip float (double, long double):
Uobičajene aritmetičke operacije (osim %) i relacijske operacije
IEEE 754 (1985.g.) standard, ∞, - ∞, NaN (Not a Number) -0.0/0.0, koren iz negativnog broja i sl.
1/ ∞ je 0, 1/0 je ∞
C99: INFINITY, -INFINITY, NAN
Matematičke funkcije
Ispis i upis %f, %e, %g, (%lf, %le, %lg za upis double ...)
19/53
Izračunavanje: tipovi
float f=12.5;
printf("%f\n",f);
printf("%e\n",f);
printf("%g\n",f);
12.500000
1.250000e+001
12.5
double d;
scanf("%lf", &d);
printf("%f", d);
20/53
Izračunavanje: tipovi
Tip bool (boolean, od standarda C99)
false, true
inače: 0 /≠0
logičke operacije i, ili, ne
21/53
Ključne reči
int, float, char, void, long, ...
struct, union, enum, ...
while, if, for, break, continue, ...
switch, default, goto, ...
register, static, extern, ...
NE MOGU da se koriste kao identifikatori
22/53
Izrazi: konstante
Konstante su fiksne vrednosti
Primeri: 0, 2, 2007, 4000000000 – tip prema vrednosti
3.5, 1.4e2, ’a’
Tip se izvodi (prepoznaje) iz samog zapisa
Tip int: unsigned / long (u, U, l, L, ul, UL) npr. 12345L
oktalni (počinje cifrom 0) i heksadekadni (počinje simbolima 0x ili 0X)
pimer: 037 (oktalni zapis), 0x1f (heksadekadni zapis)
konstante su pozitivne; -123 je izraz!
23/53
Izrazi: konstante
Tipovi u pokretnom zarezu: Konstantni brojevi u pokretnom zarezu sadrže tačku ili
eksponent, ili i jedno i drugo
123.4 ili 1e-2 ili .4 ili 5. ili -123. ili -123.2e10
Tipovi ovih konstanti su double, osim ukoliko se za float navede kvalifikator f ili F, npr 1.23f ili l/L što označava tiplong double
24/53
Izrazi: konstante
Tip char: Iako se tip char koristi i za predstavljanje malih celih
brojeva, on se prevashodno koristi za predstavljanje kodova karaktera (najčešće ASCII kodova)
Direktno specifikovanje karaktera korišćenjem numeričkihkodova nije preporučljivo
Umesto toga, preporučuje se korišćenje karakterskih konstanti
Karakterske konstante u programskom jeziku C se navodeizmeđu ’ ’ navodnika
Vrednost date konstante je numerička vrednost datogkaraktera u korišćenoj karakterskoj tabeli (na primer, ASCII)
25/53
Izrazi: konstante
Konstanta znakovnog tipa – broj, zapisan ‘x’ Npr, ‘0’ je 48,
Neki karakteri – kodna sekvenca: \n, \t, \b, \\ - izgledaju kaodva, ali predstavljaju 1 karakter
‘\0’ – karakter sa vrednošću 0, 0-karakter
U obliku oktalnog broja, npr. ‘\011’, ‘\061’
U obliku heksadekadnog broja, npr. ‘\x41’, ‘\x31’
26/53
Izrazi: konstante
Imenovanje znakovne konstante, npr.
#define GRANICNIK ’$’
Niska karaktera, literal, string:
0 ili >0 karaktera, između dvostrukih navodnika,
Npr. “Ovo je string”
Nula-karakter na kraju
- standardno zaglavlje
Funkcija strlen(s) – bez nula-karaktera
27/53
Izrazi: konstante
int main() {
char a, b;
a = 'A'; b = 65;
printf(" %ch! %ch! \n", a, b );
printf(" %c %d\n", a, a );
return 0;
}
rezultat: Ah! Ah!
A 65
28/53
Izrazi: konstante – specijalni karakteri - primeri
\a alert (bell) character
\b backspace
\n newline
\r carriage return
\t horizontal tab
\\ backslash
\’ single quote
\" double quote
\0oo (npr. \012) octal number
\xhh (npr. \x12) hexadecimal number
29/53
Operatori i izrazi
Unarni (prefiksni i postfiksni)
Binarni (infiksni)
Ternarni operatori ? :
Prioriteti, zagrade; primeri
Asocijativnost (pretežno leva)
30/53
Operatori dodele
Vrednost izraza dodele; x=50;
(npr. (x=sledeci())! =KRAJ)
Tip izraza dodele
Sporedni efekat izraza dodele
l-vrednost
Višestruka dodela (desna asocijativnost!)
Primer: x=y=z=0;
Primeri:
x=2 (vrednost x, vrednost izraza postaje 2)
x=0; if( x = 1 ) printf("A"); else printf("B");
31/53
Aritmetički operatori
+ (binarni)
- (binarni)
*
/ (nad celim brojevima daje celobrojni deo količnika)
% (ostatak; samo na cele brojeve);
- (unarni, promena znaka )
+ (unarni)
svi levo asocijativni
32/53
Aritmetički operatori - prioriteti
+, - su istog prioriteta, (primena sleva na desno, levo asocijativni)
Primer: a-b+c = (a-b)+c, a ne a-(b+c)
*, /, % su istog prioriteta, koji je veći od prioriteta +, -(primena sleva na desno, levo asocijativni)
Unarni operatori imaju veći prioritet od binarnih
Zagradama se prioriteti menjaju
Primer: C = (F-32) /9*5 ;
(F-32) /9*5 = ((F-32)/9)*5 a ne (F-32)/(9*5)
33/53
Aritmetički operatori uvećanja i umanjenja za 1
++, --
Prefiksni i postfiksni
x = n++;
x = ++n;
int a = 3, x = a++, y = a++;
int b = 3, z = b++ + b++;
printf("a = %d, x = %d, y = %d,\n", a, x, y);
printf("b = %d, z = %d\n", b, z);
34/53
Relacijski operatori
==
! =
<
>=
Prioritet: ==, != manji od ostalih
Levo asocijativni
35/53
Relacijski operatori - primeri
x < y dobija vrednost 0 ili 1 (i drugi rel. op.)
3 > 5 - vrednost 0
7 < 5 != 1 - vrednost 1
Ako promenljiva x ima vrednost 2,
3 < x < 5 - vrednost 1
== i = sasvim različiti
Primeri: x=2 (vrednost x, vrednost izraza postaje 2)
x=0; if( x = 1 ) printf("A"); else printf("B");
x=1; if( x != 1 ) printf("A"); else printf("B");
x=0; if( x == 1 ) printf("A"); else printf("B");
36/53
Operator kombinovanja izraza (,) i sizeof
Operator , je najnižeg prioriteta
Izračunavaju se oba operanda
Vrednost izraza je vrednost desnog operanda
Primer: x = 0, y = 1; (vrednost 1)
Sizeof – veličina tipa u bajtovima
Na primer sizeof(int) – najčešće 4
37/53
Logički operatori
Logička negacija !
Logička konjunkcija &&
Logička disjunkcija ||
Rezultat tipa int
Brojevna vrednost 0 – logička vrednost 0 (netačno)
Brojevna vrednost ≠0 – logička vrednost 1 (tačno)
p && q dobija vrednost 1 ako su i p i q ≠ 0, inače 0 na primer: 0.25 && (2
"Lenjo" izračunavanje
Ako je p ≠ 0 (tačno), onda je p || q ≠ 0, pa se q ne izračunava;
Ako je p =0 (netačno), onda je p && q =0, pa se q ne izračunava
Primer:
main() {
int x, z, a = 1, b = 2, c = 3;
/* Lenjo izracunavanje logickog izraza */
x = a
Operatori ++, -- primeri “bočnog” efekta (lenjo izračunavanje)
int main() {
int i = 0, j = 0;
/* Bocni efekti */
z = i++ && j ++; // i = 1 j = 0
printf( " %d %d %d\n", i, j, z ); // z = 0
i = 0; j = 0;
z = j++ && i ++; // i = 0 j = 1
printf( " %d %d %d\n", i, j, z ); // z = 0
z = j++ && i ++; // i = 1 j = 2
printf( " %d %d %d\n", i, j, z ); // z = 0
z = j++ && i ++; // i = 2 j = 3
printf( " %d %d %d\n", i, j, z ); // z = 1
} 40/53
Složeni operatori dodele
i += 2; isto što i i = i + 2;
x *= y+1; isto što i x = x * (y+1);
Složeni operatori dodele: +=, -=, *=, /=, %=, &=, |=, itd.
Niži prioritet od svih ostalih operatora (osim ,)
Desno asocijativni
41/53
Uslovni operator ?:
p ? x : y; /* ako je p tačno, vrednost izraza je x, inače je vrednost izraza y */
desno asocijativan:
x > y ? x > z ? x : z : y > z ? y : z isto kao
x > y ? (x > z ? x : z) : (y > z ? y : z); a ne kao
(x > y ? (x > z ? x : z) : y > z) ? y : z;
Na primer, maksimum tri broja
max = x > y ? x > z ? x : z : y > z ? y : z;
42/53
Operatori, prioritet i asocijativnost
43/53
Izrazi
Izraz kombinuje promenljive, konstante i operacije i tako proizvodi novi objekat sa novom vrednošću i pripadnim tipom.
Izračunavanje:
pravila o prioritetu i asocijativnosti operatora
pravila koja definišu tip podizraza i izraza
Primer. x=15; y = x/2;
Ako su x, y int, y = 7;
Ako su x,y float, y = 7.5
44/53
Aritmetički izrazi – tip
Primer:
int i, j:
float x, y;
i - j je tipa int
x * y je tipa float
'2' < 'A' je neki ceo broj (1, tačno)
45/53
Operatori i prioriteti - primeri
x = y==z je x = (y==z)
-a*b+c je ((-a)*b)+c
a=b=c=d je a=(b=(c=d))
Poređati prema opadajućem prioritetu operatore: && ++ * + (sabiranje)
A == + (unarno) != % ?
46/53
Konverzija tipa
Pretvaranje vrednosti jednog tipa u vrednost drugog tipa
Vrste konverzija: eksplicitne i implicitne
konverzije bez gubitka informacija /konverzija sa gubitkom informacije
C fleksibilan - elementarni tipovi (celobrojni, realni, karakterski) su saglasni
U izrazu mogu da se nađu argumenti raznih tipova, bez eksplicitne naznake konverzije
47/53
Konverzije tipova - 1
1. +, -, *, /, %: operandi različitih tipova, bez unsigned - konverzija u “širi” tip, promocija (nema gubljenja informacije), primer:
long double x;
double y;
float z;
long int u;
int i, j;
short w;
char c;
x + z je tipa long double
y + c je tipa double
z + i, i*z su tipa float
u + j je tipa long int
i + c je tipa int - aritmetika bar na tipu int
w + c je tipa int
48/53
Konverzije tipova –1- primeri
int x = 1; x ='1'+1; printf("%d", x );
int x = 32; x ='A'+x; printf("%c", x );
int x = 65; x =x+1; printf("%c", x );
Konverzija unsigned tipova je kompleksnija
49/53
Konverzije tipova - 22. Konverzuja tipa izraza kojom se gubi informacija –
democija, primer: char c; long l;
c = l; /* l se konvertuje u char i dodeljuje promenljivoj c */
Primer promocija / democijac = c * l; c = 2.5 * l;
U prvoj dodeli, c se konvertuje u long, a rezultat c*l se konvertuje u char i dodeljuje promenljivoj c.
U drugoj dodeli, l se konvertuje u float u izračunavanju 2.5*l, a rezultat se konvertuje u char i dodeljuje promenljivoj c.
50/53
Eksplicitna konverzija tipova
Unarni operator podešavanja (cast)
(ime-tipa) izraz
Primeri:
int i, j, n;
float x;
sqrt((double) n) (kvadratni koren celog broja
x=(float) i /j; (razlomljeni količnik celih brojeva)
51/53
Implicitna konverzija tipova
Ako je bar jedan od operanada tipa long double, onda se drugi konvertuje u long double;
inače, ako je jedan od operanada tipa double, onda se drugikonvertuje u double;
inače, ako je jedan od operanada tipa float, onda se drugikonvertuje u float;
inače, svi operandi tipa char i short promovišu se u int.
Ako je jedan od operanada tipa long long, onda se drugikonvertuje u long long;
inače, ako je jedan od operanada tipa long, onda se drugikonvertuje u long.
52/53
Označeni i neoznačeni brojevi
U slučaju mešanja označenih i neoznačenih operanada, pravila konverzije su nešto komplikovanija
Ako je neki tip širi, onda se konverzija vrši u širi tip
Ako su oba tipa iste širine, onda se konverzija vrši u neoznačeni tip
Problemi pri poređenju označenih i neoznačanih tipova Primer: ne važi da je -1l < 1ul
53/53