From 7813b2b19bb767df547f6b2eebe6e591baa23844 Mon Sep 17 00:00:00 2001 From: Vadym Drozd Date: Fri, 7 Feb 2014 21:39:16 +0200 Subject: [PATCH 01/12] First --- 1.cpp | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/1.cpp b/1.cpp index 6d4731a..c4ae264 100644 --- a/1.cpp +++ b/1.cpp @@ -1,9 +1,30 @@ -// . reverse_string . +#include +#include + +static const char* str = "The string!"; + +void strreverse(char * aStr); + +#define swap_char(left, right) \ + do { \ + left = left ^ right; \ + right = left ^ right; \ + left = left ^ right; \ + } while (0) -char* string = The string!; int main() { - char* reverse_string; - + char* reverse_string = strdup(str); + printf("%s\n", str); + strreverse(reverse_string); + printf("%s\n", reverse_string); return 0; -} \ No newline at end of file +} + +void strreverse(char * p) +{ + char *q = p; + q += strlen(p); + for(--q; p < q; ++p, --q) + swap_char(*p, *q); +} From 0e87fca19694ab274d265eda67e239c483bd6e65 Mon Sep 17 00:00:00 2001 From: Vadym Drozd Date: Fri, 7 Feb 2014 22:00:28 +0200 Subject: [PATCH 02/12] Third --- 2.cpp | 6 +++++- 3.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/2.cpp b/2.cpp index d73a0de..cb1c2a0 100644 --- a/2.cpp +++ b/2.cpp @@ -1,4 +1,8 @@ -// . min_from_top_sector(), , , , . +// Квадратная матрица разделена диагоналями на четыре сектора. +// Напишите функцию min_from_top_sector(), которая будет находить +//значение ячейки, минимальное для всех ячеек верхнего сектора, +// включая отрезки диагоналей, составляющие этот сектор. + #include const int c_kM = 5; diff --git a/3.cpp b/3.cpp index b81e266..70a0fd4 100644 --- a/3.cpp +++ b/3.cpp @@ -1,4 +1,9 @@ -// Add(), List, value l, . main() , value : 1, 2, 3, 4 5. +// Напишите функцию Add(), которая создает новый объект List, инициализирует +// его входным значением value и добавляет его в конец списка l, полученного на вход. +// В функции main() создайте проинициализированный список, со значениями value равными: 1, 2, 3, 4 и 5. + +#include +#include struct List { @@ -10,10 +15,47 @@ struct List // It should return pointer to the added List object. List* Add(List* l, int value) { + List *newElem, *curElem; + + newElem = (List *) calloc(1, sizeof(List)); + newElem->value = value; + + if(NULL == l) { + l = newElem; + } + else { + curElem = l; + while(curElem->next != NULL) + curElem = curElem->next; + curElem->next = newElem; + } + + return l; } +void printList(List *l); + int main(int argc, char* argv[]) { -return 0; + List *l = NULL; + + l = Add(l, 1); + l = Add(l, 2); + l = Add(l, 3); + l = Add(l, 4); + l = Add(l, 5); + + printList(l); + + return 0; +} +void printList(List *l) +{ + printf("The list is: "); + while (l) { + printf("%d ", l->value); + l = l->next; + } + printf("\n"); } \ No newline at end of file From 540fbff03fcbb8cab5635aff47307798e8e8e82f Mon Sep 17 00:00:00 2001 From: Vadym Drozd Date: Fri, 7 Feb 2014 22:08:19 +0200 Subject: [PATCH 03/12] Second --- 2.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/2.cpp b/2.cpp index cb1c2a0..189709a 100644 --- a/2.cpp +++ b/2.cpp @@ -10,7 +10,13 @@ typedef int Matrix[c_kM][c_kM]; int min_from_top_sector(Matrix& m) { - + int min = m[0][0]; + for(size_t i = 0; i < c_kM / 2; i++) { + for(size_t j = i; j < c_kM - i ; j++) { + if (m[i][j] < min) + min = m[i][j]; + } + } } int _tmain(int argc, _TCHAR* argv[]) From f711f88989ecda82155ddb652bfc39602b7a4f78 Mon Sep 17 00:00:00 2001 From: Vadym Drozd Date: Fri, 7 Feb 2014 22:39:34 +0200 Subject: [PATCH 04/12] Fix second --- 2.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/2.cpp b/2.cpp index 189709a..362f482 100644 --- a/2.cpp +++ b/2.cpp @@ -11,8 +11,8 @@ typedef int Matrix[c_kM][c_kM]; int min_from_top_sector(Matrix& m) { int min = m[0][0]; - for(size_t i = 0; i < c_kM / 2; i++) { - for(size_t j = i; j < c_kM - i ; j++) { + for(size_t i = 0; i < (c_kM + 1) / 2; i++) { + for(size_t j = i; j < c_kM - i; j++) { if (m[i][j] < min) min = m[i][j]; } From f249d7ea22c152a49bf35743b95e2fa3fa46ed39 Mon Sep 17 00:00:00 2001 From: Vadym Drozd Date: Fri, 7 Feb 2014 22:52:39 +0200 Subject: [PATCH 05/12] Third fixed --- 3.cpp | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/3.cpp b/3.cpp index 70a0fd4..c232d47 100644 --- a/3.cpp +++ b/3.cpp @@ -2,34 +2,37 @@ // его входным значением value и добавляет его в конец списка l, полученного на вход. // В функции main() создайте проинициализированный список, со значениями value равными: 1, 2, 3, 4 и 5. -#include -#include +#include +using namespace std; struct List { - int value; - List* next; + int value; + List* next; }; // Add should create new List object, initialize it by value and add it to the end of the list. // It should return pointer to the added List object. List* Add(List* l, int value) { - List *newElem, *curElem; + List *newElem; - newElem = (List *) calloc(1, sizeof(List)); + newElem = new List; newElem->value = value; + newElem->next = NULL; - if(NULL == l) { - l = newElem; - } - else { - curElem = l; - while(curElem->next != NULL) - curElem = curElem->next; - curElem->next = newElem; + if (!l) { + return newElem; + /*NOTREACHED*/ } + List *curElem = l; + + while (curElem->next) + curElem = curElem->next; + + curElem->next = newElem; + return l; } @@ -41,10 +44,8 @@ int main(int argc, char* argv[]) List *l = NULL; l = Add(l, 1); - l = Add(l, 2); - l = Add(l, 3); - l = Add(l, 4); - l = Add(l, 5); + for (size_t i = 2; i < 6; i++) + Add(l, i); printList(l); @@ -52,10 +53,10 @@ int main(int argc, char* argv[]) } void printList(List *l) { - printf("The list is: "); + cout << "The list is: "; while (l) { - printf("%d ", l->value); + cout << l->value << " "; l = l->next; } - printf("\n"); + cout << endl; } \ No newline at end of file From 7301ddfc330fb2912861780591327096fd33bb66 Mon Sep 17 00:00:00 2001 From: Vadym Date: Sat, 8 Feb 2014 11:17:04 +0200 Subject: [PATCH 06/12] fix _MSC_VER --- 1.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/1.cpp b/1.cpp index c4ae264..6e3d7ac 100644 --- a/1.cpp +++ b/1.cpp @@ -11,10 +11,14 @@ void strreverse(char * aStr); right = left ^ right; \ left = left ^ right; \ } while (0) + +#ifdef _MSC_VER +# define strdup _strdup +#endif int main() { - char* reverse_string = strdup(str); + char* reverse_string = strdup(str); //strlen + alloc + memcpy printf("%s\n", str); strreverse(reverse_string); printf("%s\n", reverse_string); From 665ad98534485c3e5ff544f09ad649fbb732d31c Mon Sep 17 00:00:00 2001 From: Vadym Date: Sat, 8 Feb 2014 11:57:05 +0200 Subject: [PATCH 07/12] fix due to task Now function return pointer to added value. And adding of new value is more efficiently --- 3.cpp | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/3.cpp b/3.cpp index c232d47..f7da5ae 100644 --- a/3.cpp +++ b/3.cpp @@ -15,37 +15,30 @@ struct List // It should return pointer to the added List object. List* Add(List* l, int value) { - List *newElem; - - newElem = new List; + List *newElem = new List; newElem->value = value; newElem->next = NULL; - if (!l) { - return newElem; - /*NOTREACHED*/ + if (l) { + while (l->next) + l = l->next; + + l->next = newElem; } - - List *curElem = l; - - while (curElem->next) - curElem = curElem->next; - - curElem->next = newElem; - - return l; - + + return newElem; } void printList(List *l); int main(int argc, char* argv[]) { - List *l = NULL; - - l = Add(l, 1); - for (size_t i = 2; i < 6; i++) - Add(l, i); + List *l, *tmpList; + size_t i; + + l = Add(NULL, 1); + for (i = 2, tmpList = l; i < 6; i++) + tmpList = Add(tmpList, i); printList(l); @@ -59,4 +52,4 @@ void printList(List *l) l = l->next; } cout << endl; -} \ No newline at end of file +} From 393645f2928a1923449fbc9cd7e218d423b59070 Mon Sep 17 00:00:00 2001 From: Vadym Drozd Date: Sat, 8 Feb 2014 20:12:25 +0200 Subject: [PATCH 08/12] Add destructor --- 1.cpp | 2 +- 3.cpp | 60 +++++++++++++++++++++++++++++------------------------------ 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/1.cpp b/1.cpp index c4ae264..0d5c8a6 100644 --- a/1.cpp +++ b/1.cpp @@ -3,7 +3,7 @@ static const char* str = "The string!"; -void strreverse(char * aStr); +void strreverse_inplace(char * aStr); #define swap_char(left, right) \ do { \ diff --git a/3.cpp b/3.cpp index c232d47..783614f 100644 --- a/3.cpp +++ b/3.cpp @@ -3,60 +3,60 @@ // В функции main() создайте проинициализированный список, со значениями value равными: 1, 2, 3, 4 и 5. #include -using namespace std; struct List { int value; List* next; + + ~List(); + + void printList() const; }; // Add should create new List object, initialize it by value and add it to the end of the list. // It should return pointer to the added List object. List* Add(List* l, int value) { - List *newElem; - - newElem = new List; + List *newElem = new List; newElem->value = value; newElem->next = NULL; - if (!l) { - return newElem; - /*NOTREACHED*/ - } - - List *curElem = l; + if (l) { + while (l->next) + l = l->next; - while (curElem->next) - curElem = curElem->next; - - curElem->next = newElem; - - return l; + l->next = newElem; + } + return newElem; } -void printList(List *l); - int main(int argc, char* argv[]) { - List *l = NULL; + List *l, *tmpList; + size_t i; + + l = Add(NULL, 1); + for (i = 2, tmpList = l; i < 6; i++) + tmpList = Add(tmpList, i); - l = Add(l, 1); - for (size_t i = 2; i < 6; i++) - Add(l, i); + l->printList(); - printList(l); + delete l; return 0; } -void printList(List *l) + +List::~List() { - cout << "The list is: "; - while (l) { - cout << l->value << " "; - l = l->next; - } - cout << endl; + delete next; +} + +void List::printList() const +{ + std::cout << "The list is:"; + for (const List *iter = this; iter; iter = iter->next) + std::cout << " " << iter->value; + std::cout << std::endl; } \ No newline at end of file From 08f0f913632ab0c8de0a70b6877c69641fe7a6a9 Mon Sep 17 00:00:00 2001 From: Vadym Drozd Date: Sat, 8 Feb 2014 20:14:40 +0200 Subject: [PATCH 09/12] Cosmetic --- 1.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/1.cpp b/1.cpp index 0d5c8a6..a244f35 100644 --- a/1.cpp +++ b/1.cpp @@ -3,7 +3,7 @@ static const char* str = "The string!"; -void strreverse_inplace(char * aStr); +void strreverse(char * aStr); #define swap_char(left, right) \ do { \ @@ -23,8 +23,7 @@ int main() void strreverse(char * p) { - char *q = p; - q += strlen(p); + char *q = p + strlen(p); for(--q; p < q; ++p, --q) swap_char(*p, *q); } From 23edf8d8b96c982dc662141c7ac88a65b5546a94 Mon Sep 17 00:00:00 2001 From: Vadym Drozd Date: Sat, 8 Feb 2014 20:20:47 +0200 Subject: [PATCH 10/12] add free --- 1.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/1.cpp b/1.cpp index ebbd1f0..a404bad 100644 --- a/1.cpp +++ b/1.cpp @@ -1,5 +1,6 @@ #include #include +#include static const char* str = "The string!"; @@ -22,6 +23,9 @@ int main() printf("%s\n", str); strreverse(reverse_string); printf("%s\n", reverse_string); + + free(reverse_string); + return 0; } From 81b767836d4323ce7eb71369bff3161a7c9a8c60 Mon Sep 17 00:00:00 2001 From: Vadym Date: Sat, 8 Feb 2014 20:25:42 +0200 Subject: [PATCH 11/12] added original comment --- 1.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/1.cpp b/1.cpp index a404bad..ec903fd 100644 --- a/1.cpp +++ b/1.cpp @@ -1,3 +1,6 @@ +// Разверните строку. Указатель reverse_string должен +// указывать на развернутую строку. + #include #include #include From 8fe41ac99c3259c5d33d51b955565f5baaf174a9 Mon Sep 17 00:00:00 2001 From: Vadym Drozd Date: Sun, 9 Feb 2014 02:41:22 +0200 Subject: [PATCH 12/12] Added second implementation of first task --- 1.cpp | 53 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/1.cpp b/1.cpp index a404bad..76bfffa 100644 --- a/1.cpp +++ b/1.cpp @@ -1,29 +1,30 @@ -#include -#include -#include +#define USE_VERSION 2 static const char* str = "The string!"; +#if (USE_VERSION == 1) + +# include +# include +# include + void strreverse(char * aStr); -#define swap_char(left, right) \ - do { \ - left = left ^ right; \ - right = left ^ right; \ - left = left ^ right; \ - } while (0) +# define swap_char(left, right) { char _t = left; left = right; right = _t; } -#ifdef _MSC_VER -# define strdup _strdup -#endif +# ifdef _MSC_VER +# define strdup _strdup +# endif int main() { char* reverse_string = strdup(str); //strlen + alloc + memcpy - printf("%s\n", str); + strreverse(reverse_string); - printf("%s\n", reverse_string); + printf("%s\n", str); + printf("%s\n", reverse_string); + free(reverse_string); return 0; @@ -35,3 +36,27 @@ void strreverse(char * p) for(--q; p < q; ++p, --q) swap_char(*p, *q); } + +#endif + +#if (USE_VERSION == 2) + +# include +# include + // std::reverse +# include + +int main () { + std::string result(str); + + std::reverse(result.begin(), result.end()); + + char* reverse_string = &result[0]; + + std::cout << "Original: " << str << std::endl; + std::cout << "Reversed: " << reverse_string << std::endl; + + return 0; +} + +#endif \ No newline at end of file