300 likes | 542 Views
Fakultet za poslovnu informatiku. Uvod u programiranje II 8 i 9 C++ za program ere poslovnih aplikacija. C++ for Business Programmers John C. Molluzzo - Pace University, New York Prentice Hall , August 02, 2005. Poglavlje 8. Pointeri, ni zovi i funkcije.
E N D
Fakultet za poslovnu informatiku Uvod u programiranje II8 i 9C++ za programere poslovnih aplikacija C++ for Business Programmers John C. Molluzzo - Pace University, New York Prentice Hall, August 02, 2005
Poglavlje 8. Pointeri, nizovi i funkcije • Pointeri, reference i funkcije • Nizovi i funkcije • Stringovi i funkcije • Standardna biblioteka string funkcija • Klasifikacija funkcija funkcije konverzije u odnosu na karakter-znak • Dimnamička alokacija memorije
Pointeri i reference • Pointeri, reference na promenljive i funkcije • Poziv po adresi – pointeri kao argumenti funkcije • Argumenti u C++ funkcijama se prosleđuju po vrednosti. Ovo znači da se vrednost argumenta, ne sam argument, prosleđuje funkciji. // dem08-1.cpp // This program demonstrates passing an argument by value. #include <iostream> using namespace std; int Neg_By_Value(int); int main() { int i = 4; i = Neg_By_Value(i); cout << "i = " << i << endl; return 0; } int Neg_By_Value(int a) { return -a; } Program Output i = -4
Dem08-2 // dem08-2.cpp // This program demonstrates passing an argument by address. #include <iostream> using namespace std; void Neg_By_Address(int*); int main() { int i = 4; Neg_By_Address(&i); cout << "i = " << i << endl; return 0; } void Neg_By_Address(int* a_ptr) { *a_ptr = -(*a_ptr); } Program Output i = -4 Prosleđivanje adrese promenljive funkciji se označava kao poziv (prenos) po adresi - call by address.
Zamena vrednosti promenljivih // dem08-3.cpp #include <iostream> using namespace std; void Swap_Int(int*, int*); int main() { int i = 3, j = 5; cout << "Before swapping: i = " << i<< " j = " << j << endl; Swap_Int(&i, &j); cout << "After swapping: i = " << i<< " j = " << j << endl; return 0; } void Swap_Int(int* a_ptr, int* b_ptr) { int temp; temp = *a_ptr; *a_ptr = *b_ptr; *b_ptr = temp; } Primer poziva po adresi Program Output Before swapping: i = 3, j = 5 After swapping: i = 5, j = 3
Poziv po referenci • Reference na promenljive i poziv po referenci - Call by Reference Reference na promenljive i argumente su alternativa pointerima. Referenca je drugo ime za postojeću promenljivu. Pretpostavimo da imamo sledeće deklaracije. int i = 7; double d = 1.2; Možemo da deklarišemo reference na varijable i i d int& r = i; double& s = d; Procitati & u ovoj deklaraciji kao "referenca“. Ako o imenu promenljive razmišljamo kao o oznaci pridruženoj lokaciji promenljive u memoriji, onda je referenca druga oznaka pridružena toj memorijskoj lokaciji. double & s = d; //Legal reference declaration int &r = i; //Legal reference declaration
dem08 // dem08-2R.cpp // This program demonstrates passing an argument by reference #include <iostream> using namespace std; void Neg_By_Reference(int&); int main() { int i = 4; Neg_By_Reference(i); cout << "i = " << i << endl; return 0; } void Neg_By_Reference(int& a) { a = -a; } // dem08-3R.cpp //This program illustrates passing arguments by reference. #include <iostream> using namespace std; void Swap_Int(int&, int&); int main() { int i = 3, j = 5; cout << "Before swapping: i = " << i<< " j = " << j << endl; Swap_Int(i, j); cout << "After swapping: i = " << i<< " j = " << j << endl; return 0; } void Swap_Int(int& a, int& b) { int temp; temp = a; a = b; b = temp; } Program Output i = -4 Program Output Before swapping: i = 3, j = 5 After swapping: i = 5, j = 3
Pokazivači i reference na objekte • Sličnosti • pristup do objekta i preko pokazivača i preko reference je posredan • mnoga pravila, a naročito pravila konverzije, važe i za pokazivače i za reference • Razlike • pokazivač se može preusmeriti tako da ukazuje na drugi objekat, dok je referenca od trenutka svog nastanka, tj. od inicijalizacije, trajno vezana za isti objekat • pokazivač može da pokazuje ni na šta (vrednost 0), dok referenca uvek, od početka do kraja svog životnog veka, upućuje na jedan (isti) objekat • pristup do objekta preko pokazivača vrši se preko operatora *, dok je pristup do objekta preko reference neposredan – upotreba reference u izrazu odnosi se na referencirani objekat • Ne postoje nizovi refrenci, pokazivači na reference, ni reference na reference
Nizovi i funkcije • Nizovi i funkcije • C-string je karakter pointer, pa je prosleđivanje niza ili C-stringa funkciji ekvivalentno prosleđivanju pointera. • Ime niza je pointer na prvi član niza, sledi ime niza se može iskoristiti na isti način kao što se koristi pointer kao argument funkcije, vodeći računa da je broj elemenata niza fiksan.
Prosleđivanje niza • Prosleđivanje niza funkciji • Kada se niz prosleđuje funkciji, takođe se prosleđuje i veličina niza funkciji. • double Avg(int [], int); // prototip funkcije • double Avg(int arr[], int size) // heder definicije funkcije
// dem08-4.cpp // This program shows how to find the average of the elements // in an array. It finds the average by passing the arrayto a function that computes the average. #include <iostream> #include <iomanip> using namespace std; double Avg(int [], int); int main() { const int NUM_QUIZZES = 10; int grade[NUM_QUIZZES]; // The array to store the quiz grades int quiz; // The array subscript double grade_avg; cout << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(1); cout << "Please enter " << NUM_QUIZZES << " integer quiz grades." << endl << endl; for (quiz = 0; quiz < NUM_QUIZZES; ++quiz) { cout << "\nEnter grade for quiz " << quiz + 1 << ": "; cin >> grade[quiz]; } grade_avg = Avg(grade, NUM_QUIZZES); cout << endl; cout << "The average quiz grade is " << grade_avg << endl; return 0; } // End of main() dem08 Program Output Please enter 10 integer quiz grades. Enter grade for quiz 1: 67 Enter grade for quiz 2: 55 Enter grade for quiz 3: 83 Enter grade for quiz 4: 75 Enter grade for quiz 5: 57 Enter grade for quiz 6: 86 Enter grade for quiz 7: 58 Enter grade for quiz 8: 100 Enter grade for quiz 9: 86 Enter grade for quiz 10: 96 The average quiz grade is 76.3 double Avg(int arr[], int size) { int i, // The array subscript sum = 0; // The accumulator double avg; // The array average for (i = 0; i < size; ++i) sum += arr[i]; avg = double(sum) / size; return avg; } // End of Avg()
Sortiranje niza • Sortiranje niza • Prosleđivanjem niza funkciji koristeći ime niza kao argument, prosleđuje se adresa niza funkciji. Zbog toga, bilo koja promena koju načini funkcija na parametrima niza menja niz u pozivajućoj funkciji.
Stringovi i funkcije • Stringovi i funkcije • Kako je C-string ekvivalentan karakter pointeru, prosleđivanje stringa funkciji je ekvivalentno prosleđivanju pointera funkciji.
Brojanje karaktera • Korišćenje funkcije za brojanje karaktera u stringu
Primer • Korišćenje funkcije za Reverse a String in Place
cstring • Standardna biblioteka funkcija koje rade sa stringovima #include <cstring> • Dužina stringa – funkcija strlen() int length; char greeting[6] = "Hello"; length = strlen(greeting);
strcpy() • String Assignment– funkcija strcpy() strcpy(target-string-name, source-string-name) Target string mora da bude dovoljno velik, da ne bi došlo do prepisivanja preko varijabli.
strcmp() Poređenje stringova – funkcija strcmp() strcmp(string1, string2)
strcat() • Pasting Strings Together-The Function strcat() Funkcija dodaje-lepi source string na kraj target stringa char string1[27] = "abcdef"; char string2[27] = "ghij"; strcat(target-string, source-string)
Klasifikacija funkcija • Klasifikacija funkcija i konverzija funkcija u odnosu na karakter-znak toupper(ch) tolower(ch) Oba prototipa funkcije se nalaze u cctype.
Funkcije za numeričku konverziju atoi() konvertuje numerički string u integer. atol() konvertuje numerički string u long. atof() konvertuje numerički string u double. char char_int[] = "123"; char char_long[] = "50000"; char char_double[] = "67.89"; int i; long long_i; double db; i = atoi(char_int); long_i = atol(char_long); db = atof(char_double);
Dinamička alokacija memorije • Heap memorija • C++ operator new alocira heap memoriju, aoperator delete dealocira heap memoriju Program Output Enter 5 names. Name: Maria Ann Name: Charles Anthony Thomas Name: John Charles Name: Amanda Name: Jaqueline Following are the names you entered. Maria Ann Charles Anthony Thomas John Charles Amanda Jaquiline int* arr_ptr; arr_ptr = new int [20]; ..... delete [] arr_ptr;
Poglavlje 9 – Korisnički definisani tipovi podataka i tabele • typedef naredba • dozvoljava definisanje sinonima za postojeći tip podatka, tj. typedef ne definiše novi tip podatka već drugi naziv za postojeći tip. • typedef old_type new_type; • Primeri: typedef char* CSTRING; CSTRING street_names [4] = {"Wall", "Spruce", "Cedar", "Pine"}; double value, amount; typedef double MONEY_AMOUNT; MONEY_AMOUNT value, amount;
enum • enum naredba • enumerated type –predstavljena službenom reči enum, definiše skup integer konstanti predstavljenih identifikatorima. • enum enumerated-type-name {identifier list} • Primeri: enum RESPONSE {cancel, ok}; enum COLOR {red = 3, green, blue, white = 8, black};
Strukture -Record-zapis, struktura -članovi strukture struct PART_STRUCT { char part_no[8]; int quantity_on_hand; double unit_price; }; part.quantity_on_hand = 62; str_ptr -> member je ekvivalentno (*str_ptr).member To declare a variable that is of the PART_STRUCT type, we can code the following. PART_STRUCT part; PART_STRUCT old_part = {"XY98765", 17, 99.99};
Tabele • Nizovi struktura: Tabele • Tabele su podaci organizovani u redove i kolone • ključ tabele • ključ pretraživanja • sekvencijalno pretraživanje • binarno pretraživanje (>50 redova) • sortiranje PART_STRUCT partial_part_table[4] = { {"A123456", 123, 12.99}, {"A987654", 53, 52.95}, {"D001234", 93, 22.95}, {"B109897", 44, 13.95} };
Strukture i funkcije, pointeri i reference • Strukture, funkcije i pointeri • Funkcije i strukture • Pointeri na strukture • Reference na strukture