Uvod u programiranje II 8 i 9 C++ za program ere poslovnih aplikacija
description
Transcript of Uvod u programiranje II 8 i 9 C++ za program ere poslovnih aplikacija
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