490 likes | 982 Views
Programski jezik C. C je mali jezik (kao i Pascal) i mo ž e jednostavno da se implementira na malim ma š inama. Potiče od jezika BCPL i B, koji su korišćeni za pisanje operativnih sistema i jezi č kih procesora.
E N D
C jemali jezik (kao i Pascal) i može jednostavno da se implementirana malim mašinama. • Potiče od jezika BCPL i B, koji su korišćeni za pisanje operativnih sistema i jezičkih procesora. • Ovi jezici obezbeđuju efikasan interfejsprema hardveru, nisu tipizirani i omogućuju različiteinterpretacije jednog podatka.
Programskijezik C implementiran je 1972. godine (Dennis Ritchie), kaojezikzaprogramiranjeaplikacija pod UNIX operativnimsistemomna DEC PDP serijiračunara. • Godine 1977. izgrađena je verzijaprogramskogjezika C (Portable Ccompiler) nezavisnaodvrsteračunara, koja je omogućilaprenosivostprogramanapisanih u C-u. • S obzirom na svoju filozofiju i namenu, programski jezik C blizak je operacijama mašinskognivoa, omogućujeradsapojedinačnimbitovimaimemorijskimadresama -fleksibilan je.
Ključne reči iz ISO/ANSI C-a auto enum restrict unsigned break extern return void case float short volatile char for signed while const goto sizeof _Bool continue if static _Complex default inline struct _Imaginary do int switch double long typedef else register union Podebljanim slovima su označene ključne reči uklučene u standar C90. Obojene (braon) su ključne reči uključene sa standardom C99.
Strogatipiziranost se karakteriše sledećimprincipima: • Svaki objekat u jeziku pripada tačno jednom tipu. • Konverzijatipova se odvijakonvertovanjemvrednostiizjednogtipa u drugi,tj. transformacijom. • Programskijezik C, mada je tipiziran (imatipove), nijestrogotipiziranjezik. • Programskijezik Cpruža programerusloboduinterpretacijeistereprezentacije.
Struktura programa • Program se može sastojati od većeg broja potprograma koje senalaze u većem broju izvornih datoteka. • Jedna izvorna datoteka sastoji se od spoljašnjih (external) objekata – podatakai funkcija (to su podaci koji su definisani izvan funkcija a sve funkcije su spoljašnje) i koji mogu biti deklarisani kao lokalni za tu datoteku (to su statički –”static” objekti) ili globalni za sve datoteke tog programa.
Svi izvršni iskazi sadržani su u blokovima koji mogu da budu ugnježdenido proizvoljne dubine. • Svaki iskaz završava se tačakazapetom(;), a blokovi su uokvireni zagradama ({,}) promenljive se uvode samo napočetku rutine odnosno programa. • Promenljive mogu da budu deklarisane na početkubilo kog bloka (i vide se samo u tom bloku).
Većina izvornih datoteka C-programa počinje uvodnim delom sa tzv. preprocesorskiminstrukcijama.Preprocesorska instrukcija počinje znakom #. • Po konvenciji, svaki program imafunkcijumain kojompočinjeizvršavanje. • Sve C-ovskerutine (potprogrami) sufunkcije. Svakafunkcija može davraćavrednost, koja može bitibilokogtipaosimnizovskog C-ovskerutinenavode se jednazadrugomunutarjedneizvornedatoteke, dok u Pascal-u mogubitiugnježdene. Zato C nijeblokovskijezik u punomsmisludok Pascaljeste.
Parametri funkcija prenose se po vrednosti, osim za nizove. Vrednost nizovskogparametra je adresa prvog elementa niza. • Izvršavanje funkcije završava se posle izvršenja poslednjeg iskaza funkcije,ili posle izvršenja return iskaza. Funkcija ne mora da izračunava (i vraća)vrednost, a ako to čini, onda se iskaz return koristi i za vraćanje vrednostifunkcije. • Komentari se pišu između para oznaka ”/*”, ”*/”
/* preprocesorske direktive */ /* globalne declaracije */ main() { /* localne pronmenljive funkcije main */ /* naredbe (iskazi) funkcije main */ } funkcija1(…) { /* lokalne promenljive funkcije 1*/ /* nardbe funkcije 1 */ } funkcija2(…) { /* lokalne promenljive funkcije 2 */ /* naredbe funkcije 2 */ }
include <stdio.h> main() { printf("hello, world\n"); }
Deklaracija promenljivih u C-u vrsta tip lista-promenljivih • Gde je vrsta – oznaka memorijskog prostora i trajnosti promenljivih (auto, static,extern, register, typedef), • Tip – identifikator tipa (predefinisanog, korisnički definisanog ili strukturnog – strukture ili unije).
int a; • char c, ch, b = ‘B’; • int niz[100]; • float rbm = 9.23; • long double ld = 1.23456;
Oblast važenja promenljive zavisi od toga gde je deklarisana i koje je vrste,i može biti blok, funkcija, izvorna datoteka, ili sve izvorne datoteke. • Trajanjepromenljive je nezavisno od njene oblasti važenja, zavisi od njene vrste, i može bititrajanje izvršavanja bloka, funkcije ili programa.
void main() { { int i=3; { int i=1; printf("%d\n", i); } printf("%d\n",i); } printf("%d\n",i); }
Pokazivači • Pokazivač u C-u pokazuje na objekat nekog specifičnog tipa, tj. predstavlja memorijsku adresu tog objekta. char *vrednost; struct slog *sp; definiše vrednost kao pokazivača na objekte tipa karakter a sp kao pokazivač naobjekte tipa slog. • Operator * (tzv. operator dereferenciranja) daje kao rezultatpromenljivu na koju pokazuje pokazivač – argument ovog operatora, tj. promenljivu čija je adresa – argument ovog operatora. • Vrednost i sp su adrese, *vrednost je karakter, a (*sp).kljuc (sp -> kljuc) je ceo broj. • Operator & (tzv.operator referenciranja) inverzan je operatoru * i daje rezultat – adresu objekta. Tako sp može da bude inicijalizovano sasp = &primerak sloga;
Nad adresama (pokazivačima) definisani su operatori poređenja, dodavanja ioduzimanja celih brojeva. Račun nad adresama izvodi se u jedinicama veličinememorije potrebne za smeštanje vrednosti baznog tipa za pokazivač. • Pokazivači i nizovi su tesno povezani u C-u. Ime niza je pokazivač na prvi element niza. • Ako je A niz, njegovom prvom elementu može se pristupiti bilosa A[0] ili *A.
Izrazi • Izrazi se grade od konstanti, promenljivih, poziva funkcija, i operacija. Programskijezik C uključuje sledeće skupove operacija:
Iskazi • U programskom jeziku C, svaki izraz može biti ”pretvoren” u iskaz ako mu se na kraj doda tačka-zapeta (”;”); izraz se tada ”izvršava” da bi se izvršili njegovi bočniefekti, a vrednost koju izračunava – zanemaruje se. • Iskaz dodele: • a = 22; • A = b = xt = 0;
Selekcija Uslov je izrazčija je istinitosnavrednostnetačno ako je 0, a inače je tačno. if(uslov) iskaz1; if(uslov) iskaz1; else iskaz2;
if(a > b) max = a; else max = b; Umesto if-naredbe može se upotebiti operator ? : (uslov) ? then-grana : else-grana Primer: max = (x>y) ? x : y;
switch (izraz) { case konstantni izraz1: lista iskaza1; case konstantni izraz2: lista iskaza2; ... default: podrazumevana lista iskaza; ... }
switch (x) { case 'a': case 'e':case 'i': case 'o': case 'u': printf(" x je samoglasnik"); break; case 'r': printf(" x je r"); break; default: printf(" x je suglasnik"); } }
#include<stdio.h> int main() { int n; printf("Unesi paran broj manji od 10\n"); scanf("%d",&n);
switch(n) { case 0: printf("Uneli ste nulu\n"); break; case 2: printf("Uneli ste dvojku\n"); break; case 4: printf("Uneli ste cetvorku\n"); break; case 6: printf("Uneli ste sesticu\n"); break; case 8: printf("Uneli ste osmicu\n"); break; defalut: printf("Uneli ste nesto sto nije paran broj\n"); } return 0; }
U T Naredba Iteracija while (uslov) iskaz; do iskaz; while (uslov) Naredba U T
while(n>0) { printf(“%d\t”, n); n--; } do { s[i++] = n % 10 + '0'; /* get next digit */ } while ((n /= 10) > 0);
For petlja inicijalizacija petlje; while (uslov) { iskaz; reinicijalizacija petlje; } for(inicijalizacija petlje; uslov; reinicijalizacija petlje) iskaz;
#include <stdio.h> int power(int m, int n); main() { inti; for (i = 0; i < 10; ++i) printf("%d %d %d\n", i, power(2,i), power(-3,i)); return 0; } int power(int base, int n) { inti, p; p = 1; for (i = 1; i <= n; ++i) p = p * base; return p; }
Bezuslovni prenos kontrole. U C-u postoje tri iskaza bezuslovnog prenosakontrole upravljanja: break, continue i goto. • Break izlazi iz unutrašnje petlje iliswitch iskaza. • Continue prelazi na sledeću iteraciju unutrašnje petlje. • gotoprenosi upravljanje na obeležje (koje ima oblik identifikatora). Prenos je moguć između blokova i upravljačkih struktura, ali ne između funkcija.
Ulaz - izlaz • Operacije ulaza i izlaza nisu deo programskog jezika C, već se realizuju funkcijama iz standardne C biblioteke (pripadaju tzv. okruženju C-jezika). • Standardno zaglavljestdio.h uključuje rutine za čitanje i pisanje podataka u blokovima proizvoljnedužine, i za čitanje i ispis formatiranog teksta.
Najjednostavniji mehanizam za unošenje jeste čitanje jednog po jednog karaktera sastandardnogulaza, celobrojnomfunkcijomgetcharbezargumenata: intgetchar(void) kojavraća sledeći učitanikarakterili EOF kadanaiđe nakrajdatoteke. intputchar(int) koristi se zaizdavanje: putchar(c) izdajekarakter c nastandardniizlaz, običnoekran.
#include <stdio.h> main() { int c; c = getchar(); while (c != EOF) { putchar(c); c = getchar(); } }
Funkcija izlaza, printf, prevodi interne vrednosti (iz memorije) u niske karaktera(stringove). • Oblik njenog zaglavlja je: int printf(char *format, arg1, arg2, . . . ) • Funkcija vraća broj izdatih karaktera.
Pored običnihkarakterakoji se izdajukakosunapisani, formatuključujeiobjektezaspecifikacijukonverzije, tj. objektekojigovorekojimtipominterpretiratii u kojioblikkonvertovatisvakiodargumenata. • Formatmoradaimatačno onolikoobjekatazaspecifikacijukonverzijekolikoargumenataimaprintf. • Ovi objekti počinju znakom % i uključuju (pored ostalog) neki od karaktera ”d”, ”i” (za izdavanje celog broja), ”c” za izdavanje jednog karaktera, ”s” za izdavanje stringa (niskekaraktera), ”f” zaizdavanjerealnogbroja, itd.
printf("%d\n", n); • printf(“ Zbir: %d + %d = %d\n", a, b, a+b);
scanf Ova funkcijauzima nisku karaktera sa standardnog ulaza, pronalazi (prepoznaje) podniske čija sintaksa odgovara tipovima (objektima specifikacije konverzije) iz formata, konvertujete podniske karaktera u odgovarajuće tipove (npr. cele, realne brojeve) i dodeljuje ih promenljivim – svojim argumentima arg1, arg2, . . . . Svi argumenti funkcije scanf osim prvog (formata) moraju da budu pokazivači.
Na primer, poziv funkcije scanf(”%d”, &x); učitava nisku karaktera (koja se sastoji od dekadnih cifara), konvertujeje u ceo broj i vrednost tog celog broja dodeljuje celobrojnoj promenljivojx. Funkcija scanf vraća broj uspešno prepoznatih i dodeljenih vrednosti.