Summary Files Commits Branches @commit @diff @stats
path: root / Year 1 / Programming introduction / Practice-17.01.22.cpp
diff options
context:
space:
mode:
Commitfbd220b88af63ad0a94e83fd9264241b52c2e85e (patch)
Author
 Syndamia <kamen.d.mladenov@protonmail.com>
2022-01-17 14:04:44 +0200
Committer
 Syndamia <kamen.d.mladenov@protonmail.com>
2022-01-17 14:04:44 +0200
Files5ea93ad18d7de07f120446096523f225d9cb12a7 /Year 1/Programming introduction/Practice-17.01.22.cpp
uni-projects-fbd220b88af63ad0a94e83fd9264241b52c2e85e.tar
uni-projects-fbd220b88af63ad0a94e83fd9264241b52c2e85e.tar.gz
uni-projects-fbd220b88af63ad0a94e83fd9264241b52c2e85e.zip
Parent617581d0b938bbf02e91f67de90c5be8e9c49962 (diff)
Added today's practice work
1 files changed, 187 insertions, 0 deletions
-rw-r--r--Year 1/Programming introduction/Practice-17.01.22.cpp187
diff --git a/Year 1/Programming introduction/Practice-17.01.22.cpp b/Year 1/Programming introduction/Practice-17.01.22.cpp
new file mode 100644
index 0000000..e6dadd8
--- /dev/null
+++ b/Year 1/Programming introduction/Practice-17.01.22.cpp
@@ -0,0 +1,187 @@
+#include <iostream>
+
+// Задача първа:
+// Напишете функция filter, която приема масив от цели числа, дължината му и
+// булева функция с един аргумент цяло число. В масива, елементите които не
+// изпълняват условието на булевата функция променят стойността си на -1.
+// Пример:
+//
+// #include <iostream>
+// bool isEven(int n) {
+// return (n % 2) == 0;
+// }
+// void filter(array, length, predicate) {
+// ...
+// }
+// int main() {
+// int arr[] = {1, 2, 3, 4, 5};
+// filter(arr, 5, isEven);
+// for(int i = 0; i < 5; i++){
+// std::cout << arr[i] << " ";
+// }
+// }
+// Изход: -1 2 -1 4 -1
+
+bool isEven(int n) {
+ return (n % 2) == 0;
+}
+
+void filter(int *array, int length, bool (predicate)(int)) {
+ if (length == 0) return;
+
+ if(!predicate(array[0]))
+ array[0] = -1;
+ filter(array + 1, length - 1, predicate);
+}
+
+void ex1() {
+ int arr[] = {1, 2, 3, 4, 5};
+ filter(arr, 5, isEven);
+ for(int i = 0; i < 5; i++){
+ std::cout << arr[i] << " ";
+ }
+}
+
+// Задача втора:
+// Напишете функция map, която приема масив от цели числа, дължината му и
+// функция, която приема число по референция, и приложете функцията върху всеки
+// елемент на масива.
+// Пример:
+// #include <iostream>
+// int plusFive(int& n){
+// n += 5;
+// }
+// void map(array, length, func) {
+// ...
+// }
+// int main() {
+// int arr[] = {1, 2, 3, 4, 5};
+// map(arr, 5, plusFive);
+// for(int i = 0; i < 5; i++){
+// std::cout << arr[i] << " ";
+// }
+// }
+// Изход: 6 7 8 9 10
+
+void plusFive(int& n){
+ n += 5;
+}
+
+void map(int *array, int length, void (func)(int&)) {
+ if (length == 0) return;
+
+ func(array[0]);
+ map(array + 1, length - 1, func);
+}
+
+void ex2() {
+ int arr[] = {1, 2, 3, 4, 5};
+ map(arr, 5, plusFive);
+ for(int i = 0; i < 5; i++){
+ std::cout << arr[i] << " ";
+ }
+}
+
+// Задача трета:
+// Да се дефинира рекурсивна функция, която заменя всяко срещане на цифрата 5 в
+// дадено неотрицателно цяло число с 8.
+
+int replFives(int n) {
+ return (n == 5) ? 8 : n;
+}
+
+int modifyNum(int n, int (modifier)(int)) {
+ int curr = modifier(n % 10);
+ if (n == 0) return 0;
+
+ return modifyNum(n / 10, modifier) * 10 + curr;
+}
+
+void ex3() {
+ int n = 52553847;
+ std::cout << modifyNum(n, replFives) << std::endl;
+}
+
+// Задача четвърта:
+// Да се напише рекурсивна функция, която извършва двоично търсене в
+// предварително сортиран масив от цели числа.
+
+int binarySearch(int *arr, int len, int elem) {
+ if (len == 0) return -1;
+
+ if (arr[len / 2] == elem)
+ return len / 2;
+ else if (arr[len / 2] < elem)
+ return binarySearch(arr + (len / 2 + 1), len / 2, elem) + (len / 2 + 1);
+ else
+ return binarySearch(arr, len / 2, elem);
+}
+
+void ex4() {
+ int nums[] = { 2, 5, 8, 12, 16, 23, 38, 56, 72, 91, 101 };
+ std::cout << binarySearch(nums, 11, 16) << std::endl;
+}
+
+// Задача пета:
+// Имаме лабиринт, с размери nхm, в който проходимите клетки се бележат с 0 а
+// непроходимите с 1. Да се напише програма, която проверява дали съществува път
+// от подадени като аргументи начална и крайна точка.
+
+bool insideBoundaries(int x, int y, int n, int m) {
+ return x >= 0 && y >= 0 && x < n && y < m;
+}
+
+bool pathExists(int lab[][4], int n, int m, int stX, int stY, int endX, int endY) {
+ if (stX == endX && stY == endY)
+ return true;
+
+ bool res = false;
+ if (insideBoundaries(stX + 1, stY, n, m) && lab[stX + 1][stY] == 0) {
+ lab[stX][stY] = 2;
+ res = pathExists(lab, n, m, stX + 1, stY, endX, endY);
+ lab[stX][stY] = 0;
+ }
+ if (res) return true;
+
+ if (insideBoundaries(stX, stY + 1, n, m) && lab[stX][stY + 1] == 0) {
+ lab[stX][stY] = 2;
+ res = pathExists(lab, n, m, stX, stY + 1, endX, endY);
+ lab[stX][stY] = 0;
+ }
+ if (res) return true;
+
+ if (insideBoundaries(stX - 1, stY, n, m) && lab[stX - 1][stY] == 0) {
+ lab[stX][stY] = 2;
+ res = pathExists(lab, n, m, stX - 1, stY, endX, endY);
+ lab[stX][stY] = 0;
+ }
+ if (res) return true;
+
+ if (insideBoundaries(stX, stY - 1, n, m) && lab[stX][stY - 1] == 0) {
+ lab[stX][stY] = 2;
+ res = pathExists(lab, n, m, stX, stY - 1, endX, endY);
+ lab[stX][stY] = 0;
+ }
+
+ return res;
+}
+
+void ex5() {
+ int lab[][4] = {
+ { 0, 1, 1, 1 },
+ { 0, 1, 0, 1 },
+ { 0, 0, 0, 1 },
+ { 1, 1, 0, 1 },
+ { 0, 0, 0, 1 }
+ };
+ std::cout << pathExists(lab, 5, 4, 0, 0, 4, 0) << std::endl;
+}
+
+// Задача шеста:
+// Дадена е квадратна матрица с размери n x m от цели числа. Да се намери пътят от
+// горния ляв ъгъл до долния десен ъгъл с най - голяма сума от елементите, като
+// имаме право да се движим само надолу и надясно.
+
+int main() {
+ ex5();
+}