Sadržaj: Sadržaj learnig C in 21 GooRoo. Sadržaj learnig C in 21 GooRoo - PDF

Description
Sadržaj learnig C in 21 GooRoo a Sadržaj: Uvod Kratki istorijski razvoj: POJEDINAČNO O JEZICIMA Uvod II LEKCIJA 1,2& Getting Started with C, The Components of a C Program, Storing Data: Variables

Please download to get full document.

View again

of 176
All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
Information
Category:

Automobiles

Publish on:

Views: 16 | Pages: 176

Extension: PDF | Download: 0

Share
Transcript
Sadržaj learnig C in 21 GooRoo a Sadržaj: Uvod Kratki istorijski razvoj: POJEDINAČNO O JEZICIMA Uvod II LEKCIJA 1,2& Getting Started with C, The Components of a C Program, Storing Data: Variables and Constants Izgled C Programa: Funkcija Varijabla Prototip funkcije Printf() Scanf() return: Typedef #define const literal LEKCIJA Statements, Expressions, and Operators izraz (expression) C operatori Operator pridruživanja C-ovi unarni matematički operatori: C-ovi binarni matematički operatori: Prethođenje (prednjačenje) C-ovih matematičkih operatora. C-ovi relacioni operatori If iskaz (statement) Redosljed prethođenja C relacionih operatora. 3 C-ova logička operatora Upotreba C-ovih logičkih operatora: Stvarni primjeri u koodu za C-ove logičke operatore: Primjeri složenih operatora pridruživanja: Prioritet operatora: LEKCIJA Functions: The Basics Definisanje funkcije Ilustracija funkcije: Kako funkcije rade: Prototip funkcije: Definisanje funkcije (Function Definition): Primjeri prototipa funkcije (Function Prototype Examples): Primjeri definicije funkcije (Function Definition Examples): Prednosti strukturalnog programiranja Planiranje struktuiranog programa: Pisanje funkcije Zaglavlje funkcije: Povratni tip funkcije (The Function Return Type): Ime funkcije: Lista parametara: Zaglavlje funkcije: Parametar Argument Svaki put kada se funkcija zove, argumenti su proslijeđeni funkcijskim parametrima!!!! Tijelo funkcije: Lokalne varijable: Tri pravila upravljaju upotrebu varijabli u funkciji: Funkcijski iskazi (statements) Vraćanje vrijednosti (return) Prototip funkcije: Prosljeđivanje argumenta funkciji: Pozivanje funkcije: Rekurzija: LEKCIJA Basic Program Control Nizovi (Arrays): osnove FOR iskaz Gnijezđenje for iskaza While iskaz do...while petlja Ugnijezđene petlje LEKCIJA Osnove Input-a i Output-a Prikazivanje informacija na ekranu (on-screen) Printf() funkcija printf() Format Strings Najčešće korišteni escape sequences (izlazne sekvence): printf() Escape Sequences printf() konverzioni specifikatori printf() Funkcija Prikazivanje poruka sa puts() puts() Funkcija Unošenje numeričkih vrijednosti sa scanf() scanf() Funkcija LEKCIJA Using Numeric Arrays Multidimenzionalni nizovi Imenovanje i deklaracija nizova Inicijalizacija nizova Inicijalizacija multidimenzionalnih nizova Maximalna veličina niza LEKCIJA Razumijevanje pointera Memorija vašeg kompjutera Kreiranje pointer-a Pointeri i jednostavne varijable Deklaracija pointera Inicijalizacija pointera KoriŠtenje pointera Pointer tipovi varijabli Pointeri i nizovi Ime niza kao pointer Smještanje elemenata niza Pointer Arithmetic Inkrementiranje pointera Dekrementiranje pointera Ostale manipulacije pointerima Oprez s pointerima (Pointer Cautions) Notacija indexa niza i pointera Prosljeđivanje niza funkcijama LEKCIJA Characters and Strings char tip podataka Upotreba Character varijabli Korištenje (upotreba) stringova Nizovi karaktera Inicijalizacija karakternog niiza Stringovi i pointeri Stringovi bez nizova Alokacija string prostora pri kompilaciji malloc() Funkcija Korištenje malloc() Funkcije Prikazivanje stringova i karaktera puts() Funkcija printf() Funkcija Čitanje string-ova sa tastature Unošenje string-ova koristeći gets() funkciju gets() Funkcija Unošenje string-a korištenjem scanf() funkcije LEKCIJA Structures Jednostavne strukture Definisanje i deklaracija struktura Postoje dva načina da se deklariše struktura: Pristupanje članovima struktura struct Ključna riječ Više Komplexne strukture Strukture koje sadrže strukture Strukture koje sadrže niizove Niizovi struktura strcpy() bibliotečna funkcija kopira jedan string u drugi string. Inicijaliziranje struktura Strukture i Pointeri Pointeri kao članovi strukture Pointeri na Strukture Pointeri i nizovi struktura Prosljeđujući strukture kao argumente funkciji Unije Definisanje, deklarisanje i inicijalizacija Unija Pristupanje članovima unije union Ključna riječ typedef i Strukture Sadržaj learnig C in 21 GooRoo GuruGru production Learning C use it GooRoo 249 LEKCIJA 18: Getting More from Functions Kao što znate do sada, funkcije su centralne za C programiranje. Danas ćete naučiti još neke načine kako da koristite funkcije u vašim programima, uključujući: Upotreba pointera kao argumenata na funkcije Prosljeđivanje pointera tipa void funkcijama Korištenje funkcija sa varijabilnim brojem argumenata Vraćanje pointera od funkcije Prosljeđivanje pointera funkcijama Default-ni metod za prosljeđivanje argumenta funkciji je po vrijednosti. Prosljeđivanje po vrijednosti (passing by value) znači da je funkciji prosljeđena kopija vrijednosti argumenta. Ovaj metod ima tri koraka: 1. Procjenjuje se izraz argumenta. 2. Rezultat je kopiran na stack, privremeni smještajni prostor u memoriji. 3. Funkcija vraća argumentovu vrijednost sa stack-a. Kada je varijabla prosljeđena funkciji po vrijednosti, funkcija ima pristup vrijednosti varijabli, ali ne i oreginalnoj kopiji varijable. Kao rezultat, kood u funkciji ne može promijeniti (modifikovati) oreginalnu varijablu. Ovo je glavni razlog zašto je prosljeđivanje po vrijednosti default-ni metod prosljeđivanja argumenata: Podaci izvan funkcije su zaštićeni od nepažljive (inadvertent) modifikacije. Prosljeđivanje argumenata po vrijednosti je moguće sa osnovnim tipovima podataka (char, int, long, float, i double) i structurama. Postoji još jedan način prosljeđivanja argumenta funkciji, ipak: prosljeđivajući pointer varijabli argumenta, radije nego vrijednost same varijable. Ovaj metod prosljeđivanja argumenta se naziva prosljeđivanje po referenci (passing by reference). Kao što ste naučili Dana 9, ( Understanding Pointers ), prosljeđivanje po referenci je jedini način da prosljedite niz ka funkciji; prosljeđivanje niza po vrijednosti nije moguće. Sa ostalim tipovima podataka, ipak vi možete koristiti bilo koji metod. Ako vaš program koristi velike strukture, njihovo prosljeđivanje po vrijednosti može prouzrokovati da nestane prostora na stack-u. Pored ove opaske, prosljeđivanje argumenta po referenci, umjesto po vrijednosti, obezbjeđuje kako prednosti tako i nedostatke: Prednost prosljeđivanja po referenci je da funkcija može modifikovati (mijenjati) vrijednost varijablu argumenta. Nedostatak prosljeđivanja po referenci je da funkcija može modifikovati (mijenjati) vrijednost varijablu argumenta. Ša ba?, možda se pitate. Prednost koja je ujedno i nedostatak?? DA. Sve zavisi od situacije. Ako je vašem programu potrebno da funkcija modifikuje varijablu argumenta, prosljeđivanje po referenci je prednost. Ako ne postoji takva potreba, ona je nedostatak zbog mogućnosti nepažljive modifikacije. Možda se pitate zašto ne koristite povratnu vrijednost funkcije za modifikovanje varijable argumenta. Vi možete uraditi to, naravno, kako je pokazano u sljedećem primjeru: x = half(x); int half(int y) { return y/2; } GuruGru production Learning C use it GooRoo 250 Ipak zapamtite, da funkcija može vratiti samo jednu vrijednost. Prosljeđivajući jedan ili više argumenata po referenci, vi dozvoljavate funkciji da vrati više od jedne vrijednosti pozivajućem programu. Prosljeđivanje po referenci dozvoljava funkciji da modifikuje oreginalnu varijablu argumenta. Kada vi prosljeđujete po referenci, vi morate osigurati da defeinicija funkcije i prototip reflektuju činjenicu da je argument koji je prosljeđen funkciji, pointer. Unutar tijela funkcije, vi takođe morate koristiti indirektni operator da pristupite varijabli(ama) prosljeđenim po referenci. Listing 18.1 demonstrira prosljeđivanje po referenci i default-no prosljeđivanje po vrijednosti. Njen izlaz jasno pokazuje da, varijabla prosljeđena po vrijednosti, ne može biti promjenjena od strane funkcije, dok varijabla prosljeđena po referenci može biti promijenjena. Naravno, funkcija ne mora da modifikuje varijablu prosljeđenu po referenci. U takvom slučaju, nema potrebe da prosljeđujete po referenci. Listing Prosljeđivanje po vrijednosti i prosljeđivanje po referenci. 1: /* Prosljedjivanje argumenata po vrijednosti i po referenci. */ 2: 3: #include stdio.h 4: 5: void by_value(int a, int b, int c); 6: void by_ref(int *a, int *b, int *c); 7: 8: main() 9: { 10: int x = 2, y = 4, z = 6; 11: 12: printf( \nbefore calling by_value(), x = %d, y = %d, z = %d. , 13: x, y, z); 14: 15: by_value(x, y, z); 16: 17: printf( \nafter calling by_value(), x = %d, y = %d, z = %d. , 18: x, y, z); 19: 20: by_ref(&x, &y, &z); 21: printf( \nafter calling by_ref(), x = %d, y = %d, z = %d.\n , 22: x, y, z); 23: return(0); 24: } 25: 26: void by_value(int a, int b, int c) 27: { 28: a = 0; 29: b = 0; 30: c = 0; 31: } 32: 33: void by_ref(int *a, int *b, int *c) 34: { 35: *a = 0; 36: *b = 0; 37: *c = 0; 38: } Before calling by_value(), x = 2, y = 4, z = 6. After calling by_value(), x = 2, y = 4, z = 6. After calling by_ref(), x = 0, y = 0, z = 0. GuruGru production Learning C use it GooRoo 251 ANALIZA: Ovaj program demonstrira razliku između prosljeđivanja varijabli po vrijednosti i njihovo prosljeđivanje po referenci. Linije 5 i 6 sadrže prototipe za dvije funkcije koje su pozivane u ovom programu. Primjetite da linija 5 opisuje tri argumenta tipa int za by_value() funkciju, ali se by_ref() razlikuje u liniji 6 zato što zahtjeva tri pointera na varijable tipa int kao argumente. Zaglavlja funkcija, za ove dvije funkcije u linijama 26 i 33 slijede isto format kao i prototipi. Tijela dviju funkcija su slična, ali ne i ista. Obje funkcije pridružuju 0 na tri varijable koje su prosljeđene njima. U by_value() funkciji, 0 se pridružuje direktno na varijable. U by_ref() funkciji, korišteni su pointeri, tako da varijable moraju biti dereferencirane (razvezane (odvojene)). Svaka funkcija se poziva jednom od main()-a. Prvo, trima varijablama, koje se prosljeđuju, su pridružene vrijednosti različite od 0 u liniji 10. Linija 12 printa tri vrijednosti na-ekran. Linija 15 poziva prvu od dvije funkcije, by_value(). Linija 17 printa ponovo tri varijable. Primjetite da se one nisu promjenile. by_value() je primila varijable po vrijednosti, tako da nije mogla promjeniti njihov oreginalan sadržaj. Linija 20 poziva by_ref(), i linija 22 printa vrijednosti ponovo. Ovaj put, sve vrijednosti su promijenjene na 0. Prosljeđivanje varijabli po referenci je dalo by_ref() pristup na stvarni sadržaj u varijablama. Vi možete napisati funkciju koja prima (prihvata) neke argumente po referenci i ostale po vrijednosti. Samo zapamtite da ih držite pravo unutar funkcije, koristeći indirektni operator(*) (operator indirekcije) da razdvojite argumente prosljeđene po referenci. NE prosljeđujte velike količine podataka po vrijednosti ako nije neophodno. Može vam nestati prostora na stack-u. PROSLJEĐUJTE varijable po vrijednosti ako ne želite da se oreginalna vrijednost promjeni. NE zaboravite da varijabla prosljeđena po referenci treba biti pointer. Takođe, koristite indirektni operator da razdvojite (dereferencirate) varijable u funkciji. Pointeri Tipa void Vidjeli ste da je ključna riječ void korištena da navede ili da funkcija ne uzima argumente ili da ne vraća vrijednost. Ključna riječ void takođe može biti korištena za kreiranje svojstvenog (generic) pointera pointer koji može pokazivati na objekat bilo kojeg tipa podataka. Na primjer, iskaz: void *x; deklariše x kao svojstveni (generic) pointer. x pokazuje na nešto; samo još niste naveli na šta. Najčešća upotreba pointeera tipa void je u deklaraciji parametara funkcije. Vi možda želite da kreirate funkciju koja može raditi sa različitim tipovima argumenata. Vi ga možete proslijediti jednom kao tip int, sljedeći put tip float, itd. Deklarišući da funkcija uzima void pointer kao argument, vi se ne ograničavate na prihvatanje samo jednog tipa podataka. Ako deklarišete funkciju da uzima void pointer kao argument, vi možete proslijediti funkciji pointer na bilo šta. GuruGru production Learning C use it GooRoo 252 Evo jednostavnog primjera: Vi želite funkciju koja prihvata numeričku varijablu kao argument i dijeli je sa 2, vraćajući odgovor u varijabli argumenta. Tako da, ako varijabla x drži vrijednost 4, nakon poziva do half(x), varijabla x je jednaka sa 2. Zato što želite da modifikujete argument, vi ga prosljeđujete po referenci. Zato što želite da koristite funkciju sa bilo kojim od C-ovih numeričkih tipova podataka, vi deklarišete funkciju da uzima void pointer: void half(void *x); Sad možete pozvati funkciju, prosljeđujući joj bilo koji pointer kao argument. Ipak, postoji još jedna stvar koju trebate. Iako možete proslijediti void pointer bez da znate na koji tip podataka on pokazuje, vi ne možete razdvajati (dereferencirati) pointer. Prije nego što kood u funkciji može uraditi nešto sa pointerom, on mora da zna njegov tip podataka. Ovo radite sa typecast, što nije ništa više nego način kako da kažete programu da tretira ovaj void pointer kao pointer na type. Ako je x void pointer, vi typecast kako slijedi: (type *)x Ovdje, type je odgovarajući tip podataka. Da kažete programu da je x pointer na tip int, napišite: (int *)x Da radvojite pointer tj. da pristupite int-u na koji pokazuje x napišite: *(int *)x typecasts se detaljnije rade Dana 20. Vraćajući se na oreginalnu temu (prosljeđivanje void pointera funkciji), možete vidjeti da, da koristite pointer, funkcija mora da zna tip podataka na koji on pokazuje. U slučaju funkcije koju vi pišete da podijelite njen argument sa dva, postoje četiri mogućnosti za type: int, long, float i double. S dodatkom na void pointer na varijablu koja se dijeli sa dva, vi morate reći funkciji tip varijable na koju pokazuje void pointer. Možete modifikovati definiciju funkcije kako slijedi: void half(void *x, char type); Na osnovu tipa argumenta, funkcija prebacuje void pointer x na odgovarajući tip. Onda pointer može biti razdvojen (dereferenciran), i vrijednost varijable na koju pokazuje može biti korištena. Konačna (finalna) verzija funkcije je pokazana u Listingu Listing Korištenje void pointera da se proslijede različiti tipovi podataka funkciji. 1: /* Upotreba pointera tipa void. */ 2: 3: #include stdio.h 4: 5: void half(void *x, char type); 6: 7: main() 8: { 9: /* Inicijaliziraj jednu varijablu od svakog tipa. */ 10: 11: int i = 20; 12: long l = ; 13: float f = ; 14: double d = ; 15: 16: /* Prikazi njihove inicijalne vrijednosti. */ 17: 18: printf( \n%d , i); 19: printf( \n%ld , l); 20: printf( \n%f , f); GuruGru production Learning C use it GooRoo : printf( \n%lf\n\n , d); 22: 23: /* Pozovi half() za svaku varijablu. */ 24: 25: half(&i, `i'); 26: half(&l, `l'); 27: half(&d, `d'); 28: half(&f, `f'); 29: 30: /* Prikazi njihove nove vrijednosti. */ 31: printf( \n%d , i); 32: printf( \n%ld , l); 33: printf( \n%f , f); 34: printf( \n%lf\n , d); 35: return(0); 36: } 37: 38: void half(void *x, char type) 39: { 40: /* Zavisno od vrijednosti tipa, prebaci */ 41: /* pointer x prigodno (appropriately) i podijeli sa 2. */ 42: 43: switch (type) 44: { 45: case `i': 46: { 47: *((int *)x) /= 2; 48: break; 49: } 50: case `l': 51: { 52: *((long *)x) /= 2; 53: break; 54: } 55: case `f': 56: { 57: *((float *)x) /= 2; 58: break; 59: } 60: case `d': 61: { 62: *((double *)x) /= 2; 63: break; 64: } 65: } 66: } ANALIZA: Po implementaciji, funkcija half() u linijama 38 do 66 ne uključuje provjere grešaka (na primjer, ako je prosljeđen nepravilan tip argumenta). Ovo je zato što vi u realnim programima ne biste koristili funkciju da obavlja jednostavan zadatak kao što je djeljenje vrijednosti sa 2. Ovo je samo ilustrativan primjer. GuruGru production Learning C use it GooRoo 254 Možda mislite da bi potreba za prosljeđivanjem varijable na koju pokazuje (pointed-to variable) mogla funkciju učiniti manje flexibilnom. Funkcija bi bila uopštenija kada ne bi morala znati tip podataka objekta na koji se pokazuje (pointed-to data object), ali tako ne radi C. Vi uvijek morate prebaciti (cast) void pointer na navedeni tip prije nego što razdvojite (dereferencirate). Uzimajući ovaj pristup, vi pišete samo jednu funkciju. Ako ne koristite void pointer, morali biste napisati četiri posebne funkcije po jednu za svaki tip podataka. Kada trebate funkciju koja može da radi sa različitim tipovima podataka, vi često možete napisati makro umjesto funkcije. Primjer koji je upravo predstavljen u kojem je posao koji je odradila funkcija relativno jednostavan bi bio dobar kandidat za makro. (Dan 21 pokriva makroe). PREBACITE (cast) void pointer kada koristite vrijednost na koju on pokazuje. NE pokušavajte da inkrementirate ili dekrementirate void pointer. Funkcije koje imaju varijabilan broj argumenata Vi ste koristili nekoliko bibliotečnih funkcija, kao što su printf() i scanf(), koje uzimaju varijabilan broj argumenata. Vi možete pisati vlastite funkcije koje uzimaju varijabilnu listu argumenata. Programi koji imaju funkcije sa varijabilnim argumentnim listama moraju uključivati file zaglavlja STDARG.H. Kada deklarišete funkciju koja uzima varijabilnu listu argumenata, vi prvo listate fixne parametre one koji su uvijek prisutni (mora postojati bar jedan fixni parametar). Onda uključite (include) ellipsis ( ) na kraju liste parametara da indicirate da se nula ili više dodatnih argumenata prosljeđuje funkciji. Tokom ove diskusije, sjetite se razlike između parametara i argumenta, kao što je objašnjeno Dana 5, Functions: The Basics. Kako funkcija zna koliko joj je argumenata prosljeđeno na navedeni poziv (specific call)??? VI JOJ KAŽETE. Jedan od fixnih parametara obavještava funkciji ukupni broj argumenata. Na primjer, kada koristite printf() funkciju, broj konverzionih specifikatora u format stringu govori funkciji koliko dodatnih argumenata da očekuje. Preciznije, jedan od funkcijskih fixnih argumenata može biti broj dodatnih argumenata. Primjer kojeg ćete vidjeti uskoro koristi ovaj pristup, ali prvo treba da pogledate alate koje C obezbjeđuje za rad sa varijabilnom listom argumenata. Funkcija takođe mora znati tip od svakog argumenta u varijabilnoj listi. U slučaju za printf(), konverzioni specifikatori indiciraju tip svakog argumenta. U ostalim slučajevima, kao što je sljedeći primjer, svi argumenti u varijabilnoj listi su istog tipa, tako da nema problema. Da kreirate funkciju koja prihvata različite tipove u varijabilnoj listi argumenata, vi morate smisliti (razviti (devise)) metod prosljeđivanja informacija o tipovima argumenata. Na primjer, vi možete koristiti karakterni kood, kao što je bilo urađeno za funkciju half() u Listingu Alati za korištenje varijabilne liste argumenata su definisani u STDARG.H. Ovi alati su koriste unutar funkcije da dobiju (retrieve) argumente u varijabinoj listi. Oni su kako slijedi: va_list Pointer tipa podataka (A pointer data type). va_start() Makro korišten za inicijalizaciju argumentne liste. va_arg() Makro korišten da dobije (retrieve) svaki argument, u povratku, iz varijabilne liste. va_end() Makro korišten za čisćenje kada su dobijeni (retrieved ) svi argumenti. GuruGru production Learning C use it GooRoo 255 Posebno je navedeno kako se ovi makroi koriste u funkciji, i onda sam uključio i primjer. Kada je funkcija pozvana, kood u funkciji mora slijediti ove korake da pristupi svojim argumentima: 1. Deklariši pointer varijablu tipa va_list. Ovaj pointer se koristi za pristup pojedinačnim argumentima. Česta je praxa, iako sigurno ne neophodna, da se poziva ova varijabla arg_ptr. 2. Pozovi makro va_start, prosljeđujući mu pointer arg_ptr kao i ime zadnjeg fixnog argumenta. Makro va_start nema povratnu vrijednost; on inicijalizira pointer arg_ptr da pokazuje na prvi argument u varijabilnoj listi. 3. Da dobijete (retrieve) svaki argument, pozovi va_arg(), prosljeđujući joj pointer arg_ptr i tip podataka sljedećeg argumenta. Povratna vrijednost od va_arg(
Related Search
We Need Your Support
Thank you for visiting our website and your interest in our free products and services. We are nonprofit website to share and download documents. To the running of this website, we need your help to support us.

Thanks to everyone for your continued support.

No, Thanks