Programowanie Procedurale Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 6 Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 1 / 27
Zbiór ctime zawiera deklarcję funkcji clock() i typu clock_t Funkcja clock() zwraca czas systemowy, który upłyna od chwili uruchomienia programu. Uwaga!!! clock() niekoniecznie musi zwracać czas w sekundach. Wartość funkcji może być albo typu long albo unsigned long, albo jeszcze innym. Rozwiazaniem powyższych problemów jest stała CLOCKS_PER_SEC zdefiniowana w ctime. Jej wartościa jest liczba systemowych jednostek czasu na sekundę. Zatem dzielac czas systemowy przez tę stała, otrzymujemy liczbe sekund. Można też pomnożyć sekundy przez tę stała, aby uzyskać czas w jednostkach systemowych. Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 2 / 27
waiting.cpp #include <iostream> #include <ctime> int main(){ using namespace std; cout << "Podaj czas opóźnienia w sekundach: "; float secs; cin >> secs; // konwersja na jednostki zegara clock_t delay = secs * CLOCKS_PER_SEC; cout << "zaczynamy\a\n"; clock_t start = clock(); while (clock() - start < delay ); cout << "gotowe \a\n"; return 0; Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 3 / 27
Sortowanie babelkowe. Mierzenie czasu wykonania programu. #include <iostream> #include <ctime> #include <cstdlib> using namespace std; void swap(long a[], int i, int j); void showarr(long const a[], int n); void fillarr(long a[], int n, long maxvalue); void bubblesort(long a[], int n); Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 4 / 27
Sortowanie babelkowe. Mierzenie czasu wykonania programu. int main(){ cout <<"Podaj rozmiar tablicy: "; int n; cin >> n; long* a = new long[n]; if (a == 0) { cout << "Brak pamieci\n"; return 1; fillarr(a, n, 100); cout <<"\ntablica po wypelnieniu pseudolosowymi wartosciami\n"; showarr(a, n); clock_t start = clock(); bubblesort(a, n); clock_t koniec = clock(); clock_t czas_w_sek =(koniec-start) / CLOCKS_PER_SEC; cout <<"Tablica po posortowaniu\n"; showarr(a, n); cout <<"\n Sortowanie zajęło: " << czas_w_sek << endl; delete [] a; return 0; Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 5 / 27
Sortowanie babelkowe. Mierzenie czasu wykonania programu. void swap(long a[], int i, int j) { long tmp = a[i]; a[i] = a[j]; a[j] = tmp; void bubblesort(long a[], int n) { for (int i = n - 1; i > 1; --i) { for (int j = 0; j < i; ++j) { if (a[j] > a[j + 1]) { swap(a, j, j + 1); // bubblesort() Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 6 / 27
Sortowanie babelkowe. Mierzenie czasu wykonania programu. void showarr(long const a[], int n) { for (int k = 0; k < n; k++) { cout << a[k] << "\t"; cout << endl; void fillarr(long a[], int n, long maxvalue) { srand(time(0)); for (int k = 0; k < n; ++k) { a[k] = rand() % maxvalue + 1; Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 7 / 27
Deklaracja statycznych tablic dwuwymiarowych: int A[10][5]; double B[2][4]; char C[4][6]; Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 8 / 27
Inicjalizacje: A[0][0] = 10; B[1][2] = 3.2; C[3][3] = a ; Deklaracja poła czona z inicjalizacja int A[3][2]={ {1,2, {3,4, {5,6 ; double B[2][3]={ {1.2,1.2,1.2,{3.4,3.4,3.4; double C[2][4]={ {1.2, {3.4 ; double D[2][4]={ {1.2 ; Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 9 / 27
Przykład - w3-00.cpp #include <iostream> #include <cstdlib> using namespace std; void read (int [100][100], int, int); void write (int [][100], int, int); int main (){ int A[100][100]; read(a,6,6); write(a,6,6); return 0; Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 10 / 27
Przykład - w3-00.cpp void read (int A[100][100], int w, int k) { srand(time(0)); for(int i=0; i<w; i++) for(int j=0; j<k; j++) A[i][j]=rand()%10; void write (int A[][100], int w, int k) { for(int i=0; i<w; i++){ for(int j=0; j<k; j++){ cout << "[" << i << "][" << j << "] = " << A[i][j] << " "; cout << endl; Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 11 / 27
Efekt wykonania w3-00.cpp [0][0] = 9 [0][1] = 5 [0][2] = 5 [0][3] = 1 [0][4] = 2 [0][5] = 0 [1][0] = 7 [1][1] = 7 [1][2] = 7 [1][3] = 2 [1][4] = 2 [1][5] = 0 [2][0] = 1 [2][1] = 5 [2][2] = 3 [2][3] = 8 [2][4] = 1 [2][5] = 5 [3][0] = 7 [3][1] = 3 [3][2] = 4 [3][3] = 5 [3][4] = 4 [3][5] = 6 [4][0] = 7 [4][1] = 3 [4][2] = 8 [4][3] = 6 [4][4] = 5 [4][5] = 5 [5][0] = 4 [5][1] = 5 [5][2] = 0 [5][3] = 0 [5][4] = 8 [5][5] = 2 Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 12 / 27
Przykład - w3-01.cpp #include <iostream> #include <cstdlib> using namespace std; //definicje jak w w3-00.cpp void read (int [100][100], int, int); void write (int [][100], int, int); int main (){ int A[10][10]; read(a,10,10); write(a,10,10); return 0; Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 13 / 27
Efekt wykonania w3-01.cpp w3-01.cpp: In function int main() : w3-01.cpp:10:15: error: invalid conversion from int (*)[10] to int [-fpermissive] /usr/include/unistd.h:357:16: error: initializing argument 1 of ssize_t read(int, void*, size_t) [-fpermissive] w3-01.cpp:10:15: error: invalid conversion from int to void* [-fpermissive] /usr/include/unistd.h:357:16: error: initializing argument 2 of ssize_t read(int, void*, size_t) [-fpermissive] w3-01.cpp:11:16: error: invalid conversion from int (*)[10] to int [-fpermissive] /usr/include/unistd.h:363:16: error: initializing argument 1 of ssize_t write(int, const void*, size_t) [-fpermissive] w3-01.cpp:11:16: error: invalid conversion from int to const void* [-fpermissive] /usr/include/unistd.h:363:16: error: initializing argument 2 of ssize_t write(int, const void*, size_t) [-fpermissive] Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 14 / 27
typedef long T; T* a[100]; // a jest tablica 100 wskaźników do T double* b[100]; // b jest tablica 100 wskaźników do double char* weekdays[] = { niedziela, poniedziałek, wtorek, środa, czwartek, piątek, sobota ; /* weekdays jest tablica wskaźników do char zainicjalizowana wskaznikami do podanych napisów */ Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 15 / 27
Następuja ce deklaracje funkcji sa równoważne void func(t* a[], int n); void func(t** a, int n); Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 16 / 27
Przykład - w3-02.cpp #include <iostream> #include <cstdlib> using namespace std; void read (int* [], int, int); void write (int* [], int, int); int main (){ int* B[5]; for(int i=0; i < 5; i++) B[i]= new int[5]; read(b,5,5); write(b,5,5); for(int i=0; i < 5; i++) delete [] B[i]; return 0; Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 17 / 27
Przykład - w3-02.cpp void read (int* A[], int w, int k) { srand(time(0)); for(int i=0; i<w; i++) for(int j=0; j<k; j++) A[i][j]=rand()%10; void write (int* A[], int w, int k) { for(int i=0; i<w; i++){ for(int j=0; j<k; j++){ cout << "[" << i << "][" << j << "] = " << A[i][j] << " "; printf("\n"); Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 18 / 27
Efekt wykonania w3-02.cpp [0][0] = 3 [0][1] = 6 [0][2] = 8 [0][3] = 1 [0][4] = 2 [1][0] = 4 [1][1] = 7 [1][2] = 1 [1][3] = 6 [1][4] = 1 [2][0] = 4 [2][1] = 6 [2][2] = 0 [2][3] = 3 [2][4] = 1 [3][0] = 6 [3][1] = 7 [3][2] = 4 [3][3] = 2 [3][4] = 8 [4][0] = 3 [4][1] = 7 [4][2] = 4 [4][3] = 3 [4][4] = 3 Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 19 / 27
Przykład - w3-03.cpp #include <iostream> int main() { using namespace std; cout<< "Podaj rozmiar tablicy: "; int n; cin>>n; double **a = new double* [n]; for(int i=0; i<n; i++) a[i] = new double [n]; for(int i=0; i<n; i++) for(int j=0; j<n; j++) a[i][j] = i+j; for(int i=0; i<n; i++){ for(int j=0; j<n; j++) cout<< a[i][j] <<"\t"; cout<<endl; cout<<endl; for(int i=0; i<n; i++) delete [] a[i]; delete [] a; return 0; Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 20 / 27
Przykład - w3-04.cpp #include <iostream> #include <cstdlib> #include <iomanip> using namespace std; typedef long long T; T** creatematrix(int raws, int cols); void destroymatrix(t**, int raws); void initmatrix(t**, int raws, int cols, T maxvalue); void showmatrix(t**, int raws, int cols); int main() { cout<< "Podaj rozmiar tablicy: "; int n; cin>>n; T **a = creatematrix(n,n); initmatrix(a,n,n,20); showmatrix(a,n,n); destroymatrix(a,n); return 0; Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 21 / 27
Przykład - w3-04.cpp T** creatematrix(int raws, int cols) { T** a = new T*[raws]; if (a == 0) { return NULL; for (int i = 0; i < raws; ++i) { a[i] = new T[cols]; if (a[i]==0) { return NULL; return a; void destroymatrix(t** a, int raws) { for (int i = 0; i < raws; ++i) { delete [] a[i]; delete [] a; Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 22 / 27
Przykład - w3-04.cpp void initmatrix(t** a, int raws, int cols, T maxvalue) { srand(time(0)); for (int i = 0; i < raws; ++i) { for (int j = 0; j < cols; ++j) { a[i][j] = rand() % maxvalue; void showmatrix(t** a, int raws, int cols) { for (int i = 0; i < raws; ++i) { for (int j = 0; j < cols; ++j) { cout << setw(4) << a[i][j] << " "; cout << endl; Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 23 / 27
Efekt wykonania w3-04.cpp Podaj rozmiar tablicy: 5 6 15 16 7 18 3 11 2 8 1 9 2 5 12 8 8 3 3 10 14 7 15 8 18 16 Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 24 / 27
Referencja to alternatywna nazwa uprzednio zdefiniowanej zmiennej. Zmienna referencyjna musi zostać zainicjalizowana. #include <iostream> #include <iomanip> using namespace std; int main(void) { int wysokosc = 10; int &h = wysokosc; h += 10; cout << "h = " << h << ", wysokosc = " << wysokosc << endl; cout << "adres h: " << &h << ", adres wys.: "<< &wysokosc << endl; int *wsk = &h; cout << "*wsk = " << *wsk << ", wsk: " << wsk << endl; return 0; Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 25 / 27
rats = 101, rodents = 101 adres rats = 0x7fffc20ced4c, adres rodents = 0x7fffc20ced4c bunnies = 50, rats = 50, rodents = 50 adres bunnies = 0x7fffc20ced48, adres rodents = 0x7fffc20ced4c Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 26 / 27
#include <iostream> void swapr(int & a, int & b); // a, b to aliasy wartosci int void swapp(int * p, int * q); // p, q to adresy wartosci int void swapv(int a, int b); // a, b to nowe zmienne int main() { using namespace std; int w1 = 300, w2 = 350; cout << "w1 = $" << w1 << " w2 = $" << w2 << endl; cout << "Zamiana wartosci za pomoca referencji:\n"; swapr(w1, w2); // przekaz zmienne cout << "w1 = $" << w1 << " w2 = $" << w2 << endl; cout << "Zamiana wartosci za pomoca wskazników:\n"; swapp(&w1, &w2); // przekaz adresy zmiennych cout << "w1 = $" << w1 << " w2 = $" << w2 << endl; cout << "Proba zamiany przy przekazywaniu przez wartosc:\n"; swapv(w1, w2); // przekazanie wartosci zmiennych cout << "w1 = $" << w1 << " w2 = $" << w2 << endl; return 0; void swapr(int & a, int & b){int temp=a; a=b; b=temp; void swapp(int * p, int * q){int temp=*p; *p=*q; *q=temp; void swapv(int a, int b){int temp=a; a=b; b=temp; Bożena Woźna-Szcześniak (AJD) Programowanie Procedurale Wykład 6 27 / 27