Website Summary Files Commits Branches @commit @diff @stats
path: root / Week11 / Exercise08.cpp
diff options
context:
space:
mode:
Commit6bb7b68394ebebbc69e76bee59e9351386115453 (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-12-14 21:56:30 +0200
Committer
 Syndamia <kamen@syndamia.com>
2025-12-14 21:56:30 +0200
Filesc31eb47780b5bfe4d038b6d6b8f32a385d717b96 /Week11/Exercise08.cpp
upp-2025-solutions-6bb7b68394ebebbc69e76bee59e9351386115453.tar
upp-2025-solutions-6bb7b68394ebebbc69e76bee59e9351386115453.tar.gz
upp-2025-solutions-6bb7b68394ebebbc69e76bee59e9351386115453.zip
Parent5ce214686e668bf185222b518b78d7f47a20b4fd (diff)
feat(Week11): Add solutions
1 files changed, 77 insertions, 0 deletions
-rw-r--r--Week11/Exercise08.cpp77
diff --git a/Week11/Exercise08.cpp b/Week11/Exercise08.cpp
new file mode 100644
index 0000000..7807913
--- /dev/null
+++ b/Week11/Exercise08.cpp
@@ -0,0 +1,77 @@
+#include <iostream>
+
+bool strneq(const char* str1, const char* str2, unsigned n) {
+ // Грозно е, но е добро упражнение за реда на операции
+ while (*str1 != '\0' && *str2 != '\0' && n-- > 0) {
+ if (*str1++ != *str2++)
+ return false;
+ }
+ return true;
+}
+
+void printField(const char* str) {
+ while (*str != ' ' && *str != '\0') {
+ std::cout << *str++;
+ }
+}
+
+int main() {
+ // Кодът е написан, допускайки че "end" е единствената
+ // възможна дума, обозначаваща край.
+ // Как може да се пренапише, така че да можем да си
+ // изберем произволен низ, обозначаващ край?
+
+ unsigned allocated = 8, size = 0;
+ char* text = new char[allocated];
+
+ std::cin.get(text[size++]);
+ std::cin.get(text[size++]);
+ std::cin.get(text[size++]);
+
+ char curr;
+ while (!strneq(text + size - 3, "end", 3)) {
+ std::cin.get(curr);
+ text[size++] = curr;
+
+ // Реоразмеряване
+ if (size >= allocated) {
+ allocated *= 2;
+ char* newSentenceArray = new char[allocated];
+
+ for (unsigned i = 0; i < size; i++)
+ newSentenceArray[i] = text[i];
+
+ delete[] text;
+ text = newSentenceArray;
+ }
+ }
+ text[size] = '\0';
+
+ // Обикаляме отзад-напред. В момента в който стигнем началото на поле
+ // (а именно, не-шпация преди която имаме шпация), тогава изкарваме
+ // полето. Тоест започваме временно да се движим напред, докато не
+ // сме изразходили буквите, съставящи полето.
+ //
+ // Тази схема очевидно оставя полето от първата буква непринтирано.
+
+ bool prevNonSpace = false;
+ for (int i = size - 1; i >= 0; i--) {
+ if (text[i] != ' ') {
+ prevNonSpace = true;
+ continue;
+ }
+
+ if (prevNonSpace) {
+ printField(text + i + 1);
+ prevNonSpace = false;
+ }
+
+ std::cout << text[i];
+ }
+ printField(text);
+ std::cout << std::endl;
+
+ delete[] text;
+
+ return 0;
+}