diff options
Merge branch 'main' of https://github.com/Angeld55/Introduction_to_programming_FMI
2 files changed, 100 insertions, 1 deletions
| -rw-r--r-- | Sem. 10/README.md | 16 | ||||
| -rw-r--r-- | Sem. 10/example4.cpp | 85 |
diff --git a/Sem. 10/README.md b/Sem. 10/README.md index 213fb84..7a0b14e 100644 --- a/Sem. 10/README.md +++ b/Sem. 10/README.md @@ -89,6 +89,20 @@ void f() - Да се напише функция, която приема такъв стринг и връща нов стринг с ТОЧНА ГОЛЕМИНА, в който всички цифри са цензурирани. (Всяко число е заменено с '*') - Да се напише функция, която приема стринг и връща два стринга с ТОЧНА големина. Първият да бъде съставен само от малките букви, а другият да бъде съставен само от главните букви. - Да се напише функция, която приема два сортирани масива от цели числа и поставя в първия масив елементите от двата масива, но в сортиран вид (приемаме, че в първия има достатъчно място). - + - Напишете програма, която приема от стандартния вход число N. След това се прочитат N реда и всеки ред започва с число M, което е дължината на реда. Да се напие функция, която обработва подадената матрица по следния начин: +Връща се нова матрица, за което е заделена точна големина. Първият ред е конкатенацията на последния ред с първия ред на подадената матрица. Вторият ред е конкатенацията на предпоследния ред с втория ред на подадената матрица и тн. <h3>Задачи</h3> + +**Задача 1:** Решете 4-та задача от примерните, но приемете, че числата в масивите са в интервала [-100, 100]. + +**Задача 2:** Напишете функция, която приема масив от цели числа и цяло число и елемент на масива. Функцията да преподрежда елементите, така че всички по-малки елементи от подадения да са в ляво от него, а всички по-големи - в дясно. (Забележка: Задачата да се реши с помощта на допълнителен масив - същестува и решение без допълнителна памет (Hoare's partition, Lomuto partition и други), но то не се изисква) + +*Вход: [1, 5, 6, 3, 0, -1, 2, 9, 7] ,3* *Изход: [1, 0, 2, ,-1, 3, 6, 5, 9, 7]* + + +**Задача 3:** Напишете функция, която приема масив и връща масив от масиви, на който елементите му са всички непразни подмасиви на дадения. + +*Вход: [1, 2, 3]* + +*Изход: [1], [2], [3], [1, 2], [2, 3], [1, 3], [1, 2, 3]* diff --git a/Sem. 10/example4.cpp b/Sem. 10/example4.cpp new file mode 100644 index 0000000..8d2105e --- /dev/null +++ b/Sem. 10/example4.cpp @@ -0,0 +1,85 @@ +#include <iostream> +using namespace std; + + +unsigned input(int**& matrix, int*& sizes) +{ + unsigned N; + cin >> N; + + matrix = new int*[N]; + sizes = new int[N]; + + for (unsigned i = 0; i < N; i++) + { + unsigned currentRowSize; + cin >> currentRowSize; + + matrix[i] = new int[currentRowSize]; + sizes[i] = currentRowSize; + + for (unsigned j = 0; j < currentRowSize; j++) + cin >> matrix[i][j]; + } + + return N; +} + + +int* concat(const int* row1, unsigned row1Size, const int* row2, unsigned row2Size) +{ + int* result = new int[row1Size + row2Size]; + + for (unsigned i = 0; i < row2Size; i++) + result[i] = row2[i]; + + for (unsigned i = 0; i < row1Size; i++) + result[row2Size + i] = row1[i]; + + return result; +} + +void freeMatrix(int** matrix, unsigned rowsSize) +{ + for (int i = 0; i < rowsSize; i++) + delete[] matrix[i]; + delete[] matrix; +} + +void task(int** matrix, unsigned N, int* sizes) +{ + unsigned resultRowsCount = (N + 1) / 2; + int** resultMatrix = new int*[resultRowsCount]; + + int* resultSizes = new int[resultRowsCount]; + + for (unsigned i = 0; i < resultRowsCount; i++) + { + resultSizes[i] = sizes[i] + sizes[N - i - 1]; + resultMatrix[i] = concat(matrix[i], sizes[i], matrix[N - i - 1], sizes[N - i - 1]); + } + + //print + for (unsigned i = 0; i < resultRowsCount; i++) + { + for (unsigned j = 0; j < resultSizes[i]; j++) + cout << resultMatrix[i][j] << " "; + cout << endl; + } + + delete[] resultSizes; + freeMatrix(resultMatrix, resultRowsCount); + + delete[] sizes; + freeMatrix(matrix, N); +} + +int main() +{ + int** matrix; + int* sizes; + + unsigned N = input(matrix, sizes); //not sure if I need this func + + task(matrix, N, sizes); +} |
