Website Summary Files Commits Branches @commit @diff @stats
path: root / Week12 / Exercise03.cpp
diff options
context:
space:
mode:
1 files changed, 81 insertions, 0 deletions
-rw-r--r--Week12/Exercise03.cpp81
diff --git a/Week12/Exercise03.cpp b/Week12/Exercise03.cpp
new file mode 100644
index 0000000..59228fc
--- /dev/null
+++ b/Week12/Exercise03.cpp
@@ -0,0 +1,81 @@
+#include <iostream>
+
+void printRepeat(char x, unsigned int repeat) {
+ while (repeat-- > 0)
+ std::cout << x;
+}
+
+char* getField(unsigned &allocated, unsigned &size);
+
+int main() {
+ unsigned int allocated1, size1;
+ char* field1 = getField(allocated1, size1);
+
+ unsigned int allocated2, size2;
+ char* field2 = getField(allocated2, size2);
+
+ int columns;
+ std::cin >> columns;
+
+ columns = columns - size1 - size2;
+
+ if (columns <= 0) {
+ std::cout << field1 << field2 << std::endl;
+ }
+ else {
+ unsigned int sideSpaces = columns / 3, middleSpaces = columns / 3;
+ if (columns % 3 == 1)
+ middleSpaces++;
+ else if (columns % 3 == 2)
+ sideSpaces++;
+
+ // Алтернативно може да създадем низ с дадения брой шпации и
+ // да изкараме него, вместо да принтираме шпациите директно.
+
+ printRepeat(' ', sideSpaces);
+ std::cout << field1;
+ printRepeat(' ', middleSpaces);
+ std::cout << field2;
+ printRepeat(' ', sideSpaces);
+ std::cout << std::endl;
+ }
+
+ delete[] field1;
+ delete[] field2;
+
+ return 0;
+}
+
+// Тази функция е почти същата като getLine от задача 2, само че
+// разделителя (разделителите) между малко се различава.
+// По-точно, позволява да имаме произволен брой шпации между полетата
+// във входа, без това да влияе върху резултата.
+char* getField(unsigned &allocated, unsigned &size) {
+ allocated = 8;
+ size = 0;
+
+ char* input = new char[allocated];
+
+ char curr;
+ std::cin.get(curr);
+ while ((curr != ' ' || size == 0) && curr != '\n') {
+ if (curr != ' ')
+ input[size++] = curr;
+ std::cin.get(curr);
+
+ // Реоразмеряване
+ if (size >= allocated) {
+ allocated *= 2;
+ char* newSentenceArray = new char[allocated];
+
+ for (unsigned i = 0; i < size; i++)
+ newSentenceArray[i] = input[i];
+
+ delete[] input;
+ input = newSentenceArray;
+ }
+ }
+ input[size] = '\0';
+
+ return input;
+}