diff --git a/arrays.cpp b/arrays.cpp index a2c541a..47f1617 100644 --- a/arrays.cpp +++ b/arrays.cpp @@ -1,9 +1,6 @@ #include #include -#if 0 -// NOTE: you should move this `if` down as you start solving each task - void task_1() { /* Task 1: find a bug in the following declaration. @@ -12,7 +9,7 @@ void task_1() * pedantic flag here means: strictly as in language standard * for explanation see: * https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html*/ - int n = 10; + const int n = 10; int a[n]; } @@ -20,9 +17,9 @@ void task_1() void task_2() { int a[5] = {0}; - - //assert(!a[4]) or assert(a[4]) -- place here one of these and - // explain your choice in commit msg + assert(!a[4]); + //place here one of these and + //explain your choice in commit msg } // returns zero @@ -31,7 +28,7 @@ int task_3_zero() // Task 3 // Hint 1: fix with initialization (not assignment) // Hint 2: you can use only one zero and not five of them! cf. task 2 - int a[5]; + int a[5] = { 0 }; assert(!a[4]); return a[4]; // don't touch this! @@ -41,7 +38,7 @@ void task_4() { // Task 4: asserts at the end must hold // Hint: fix with initialization (not assignment) - int a[5]; + int a[5]{1, 2, 3, 4, 5}; assert(a[0] == 1); assert(a[1] == 2); @@ -54,15 +51,17 @@ void task_4() // copy arr1 to arr2 void task_5_copy(int * arr1, int * arr2, int size) { - arr2 = arr1; + for (int i = 0; i < size; i++) + { + arr2[i] = arr1[i]; + } } // Task 6 // copy array `arr1` to array `arr2` of the same size -void task_6_poor_copy(int * arr1, int * arr2) +void task_6_poor_copy(int * arr1, int * arr2, int size) { - // Hint: something wrong here; test this from main() - for(int i = 0; i < sizeof(arr2); ++i) + for(int i = 0; i < size; ++i) { arr2[i] = arr1[i]; } @@ -72,11 +71,9 @@ void task_6_poor_copy(int * arr1, int * arr2) // print array `arr` void task_7_print(int * arr, int size, char delim = ' ') { - // Hint: something wrong here; run this from main() - for(int i = 0; i <= size; ++i) + for(int i = 0; i < size; ++i) { - std::cout << a[i] << delim; + std::cout << arr[i] << delim; } -} - -#endif + std::cout << std::endl; +} \ No newline at end of file diff --git a/arrays.h b/arrays.h new file mode 100644 index 0000000..9431f93 --- /dev/null +++ b/arrays.h @@ -0,0 +1,21 @@ +#ifndef _ARRAYS +#define _ARRAYS + +void task_1(); + +void task_2(); + +int task_3_zero(); + +void task_4(); + +// copy arr1 to arr2 +void task_5_copy(int * arr1, int * arr2, int size); + +// copy array `arr1` to array `arr2` of the same size +void task_6_poor_copy(int * arr1, int * arr2, int size); + +// print array `arr` +void task_7_print(int * arr, int size, char delim = ' '); + +#endif \ No newline at end of file diff --git a/count.cpp b/count.cpp index 9534515..91af7b9 100644 --- a/count.cpp +++ b/count.cpp @@ -1,37 +1,46 @@ #include #include +#include using namespace std; -/* count digits, white space, others */ - -/* TODO: (1) fix all errors; - * (2) add code for painting histogram in console, - * cf. picture in https://en.wikipedia.org/wiki/Histogram - * - */ - int main() { string src("12 plus 45 minus 39 is 18\n"); - int i, nwhite, nother; + int nwhite, nother; const int size = 10; - int ndigit[size]; + int ndigit[size]{0}; nwhite = nother = 0; char c; - while ((c = src[i++]) != EOF) - if (c >= '0' && c >= '9') + + for (int j = 0; j < src.length(); j ++) + { + c = src[j]; + + if (c >= '0' && c <= '9') ++ndigit[c - '0']; - else if (c == ' ' && c == '\n' && c == '\t') + else if (c == ' ' || c == '\n' || c == '\t') ++nwhite; else ++nother; + } cout << "source string: " << src << endl << "digits ="; for (int i = 0; i < size; ++i) cout << " " << ndigit[i]; cout << ", white space = " << nwhite - << ", other = " << nother << endl; + << ", other = " << nother << endl << endl; + + cout << "table:\n"; + for (int i = 0; i < size; i++) + { + cout << "symbol " << i << " contains " << ndigit[i] << " times\n"; + } + + cout << "white space" << " contains " << nwhite << " times\n"; + cout << "others" << " contains " << nother << " times\n"; + + system("pause"); } diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..86d5721 --- /dev/null +++ b/main.cpp @@ -0,0 +1,31 @@ +#include +#include +#include "arrays.h" + +using namespace std; + +int main() +{ + task_1(); + task_2(); + task_3_zero(); + task_4(); + + int a[3]{1, 2, 3}; + int b[3]; + int c[3]; + + task_5_copy(a, b, 3); + assert(a[0] == 1); + assert(a[1] == 2); + assert(a[2] == 3); + + task_6_poor_copy(a, c, 3); + assert(c[0] == 1); + assert(c[1] == 2); + assert(c[2] == 3); + + task_7_print(a,3); + + system("pause"); +} \ No newline at end of file diff --git a/quick_sort.cpp b/quick_sort.cpp index 0bbfc07..363df7b 100644 --- a/quick_sort.cpp +++ b/quick_sort.cpp @@ -1,28 +1,58 @@ #include - #include using std::rand; using std::swap; +using std::cout; // pivot - "опорный" элемент // partition - переупорядочивает элементы части массива, // заданной отрезком [left, right), так что в начале // следуют элементы меньшие pivot, а в конце - большие; // возвращает место начала блока элементов, больших pivot; -int * partition(int * left, int * right, int pivot) { +int * partition(int * left, int * right, int pivot) +{ int * store = left; // место для вставки элементов, меньших pivot for (int * p = left; p != right; ++p) - if (*p < pivot) + if (*p <= pivot) swap(*p, *store++); return store; } -void my_qsort(int * arr, int n) { +void my_qsort(int * arr, int n) +{ if (n <= 1) return; // массив в 1 или 0 элементов уже упорядочен int * pivotPtr = arr + rand() % n; // случайный выбор опорного элемента int newPivotIdx = partition(arr, arr + n, *pivotPtr) - arr; - my_qsort(arr, newPivotIdx + 1); - my_qsort(arr + newPivotIdx, n - (newPivotIdx + 1)); + my_qsort(arr, newPivotIdx); + my_qsort(arr + newPivotIdx, n - newPivotIdx); +} + +void println(int *a, int n) +{ + for (int i = 0; i < n; i++) + { + cout << a[i] << " "; + } + cout << "\n"; } + +int main() +{ + const int m = 9; + int a[m]{666, 1, 3, 2, 5, 4, 0, -666, 99}; + println(a, m); + my_qsort(a, m); + println(a, m); + cout << "\n"; + + const int n = 5; + int b[n]{1, 666, -666, 0, 2}; + println(b, n); + my_qsort(b, n); + println(b, n); + cout << "\n"; + + system("pause"); +} \ No newline at end of file