Uvod u programiranje II 8 i 9 C++ za program ere poslovnih aplikacija

Preview:

DESCRIPTION

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. - PowerPoint PPT Presentation

Citation preview

1/30

Uvod u programiranje II8 i 9

C++ za programere poslovnih aplikacija

C++ for Business Programmers

John C. Molluzzo -  Pace University, New York

Prentice Hall, August 02, 2005

Fakultet za poslovnu informatiku

2/30

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

3/30

• 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

Pointeri i reference

4/30

// 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.

Dem08-2

5/30

Primer poziva po adresi

// 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;

}

Program Output

Before swapping: i = 3, j = 5

After swapping: i = 5, j = 3

Zamena vrednosti promenljivih

6/30

– 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

Poziv po referenci

7/30

// 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;

}

Program Output

i = -4

// 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

Before swapping: i = 3, j = 5

After swapping: i = 5, j = 3

dem08

8/30

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

9/30

• 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.

Nizovi i funkcije

10/30

• 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

Prosleđivanje niza

11/30

// dem08-4.cpp

// This program shows how to find the average of the elements

// in an array. It finds the average by passing the array to 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() 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()

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

dem08

12/30

• 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.

Sortiranje niza

13/30

– Stringovi i funkcije • Kako je C-string ekvivalentan karakter pointeru, prosleđivanje stringa

funkciji je ekvivalentno prosleđivanju pointera funkciji.

Stringovi i funkcije

14/30

• Korišćenje funkcije za brojanje karaktera u stringu

Brojanje karaktera

15/30

• Korišćenje funkcije za Reverse a String in Place

Primer

16/30

Funkcija koja vraća pointer

17/30

• Standardna biblioteka funkcija koje rade sa stringovima#include <cstring>

– Dužina stringa – funkcija strlen()

int length;

char greeting[6] = "Hello";

length = strlen(greeting);

cstring

18/30

• 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.

strcpy()

19/30

Poređenje stringova – funkcija strcmp()

strcmp(string1, string2)

strcmp()

20/30

• Pasting Strings Together - The Function strcat()

char string1[27] = "abcdef";

char string2[27] = "ghij";

strcat(target-string, source-string)

Funkcija dodaje-lepi source string na kraj target stringa

strcat()

21/30

• Klasifikacija funkcija i konverzija funkcija u odnosu na karakter-znak

toupper(ch)

tolower(ch)

Oba prototipa funkcije se nalaze u cctype.

Klasifikacija funkcija

22/30

Primer: palindrom

23/30

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);

Funkcije za numeričku konverziju

24/30

• Heap memorija– C++ operator new alocira heap memoriju, a operator 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;

Dinamička alokacija memorije

25/30

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:

double value,

amount;

typedef double MONEY_AMOUNT;

MONEY_AMOUNT value,

amount;

typedef char* CSTRING;

CSTRING street_names [4] = {"Wall", "Spruce", "Cedar", "Pine"};

26/30

• 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};

enum

27/30

-Record-zapis, struktura

-članovi strukture

struct PART_STRUCT

{

char part_no[8];

int quantity_on_hand;

double unit_price;

};

To declare a variable that is of the PART_STRUCT type, we can code the following.

PART_STRUCT part;

part.quantity_on_hand = 62;

PART_STRUCT old_part = {"XY98765", 17, 99.99};

str_ptr -> member je ekvivalentno (*str_ptr).member

Strukture

28/30

Složene strukture

29/30

• 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}

};

Tabele

30/30

• Strukture, funkcije i pointeri– Funkcije i strukture– Pointeri na strukture– Reference na strukture

Strukture i funkcije, pointeri i reference