diff options
feat(Week11): Add solutions
1 files changed, 82 insertions, 0 deletions
| -rw-r--r-- | Week11/Exercise02.cpp | 82 |
diff --git a/Week11/Exercise02.cpp b/Week11/Exercise02.cpp new file mode 100644 index 0000000..9041fab --- /dev/null +++ b/Week11/Exercise02.cpp @@ -0,0 +1,82 @@ +#include <iostream> + +/* Предлагам три решения на тази задача */ + +unsigned countLetters(const char* str) { + unsigned count = 0; + while (*str != '\0') { + count += ('A' <= *str && *str <= 'Z') || + ('a' <= *str && *str <= 'z'); + ++str; + } + return count; +} + +// Избираме си максимален размер за низа +void solution1() { + const unsigned MAX_LENGTH = 1024; + + char sentence[MAX_LENGTH]; + std::cin.getline(sentence, MAX_LENGTH, '.'); + + std::cout << countLetters(sentence) << std::endl; +} + +// Низа може да бъде произволно дълъг +void solution2() { + // Заделяме памет за низа, следим колко букви сме вкарали в низа. + // Ако запълним заделената памет, реоразмеряваме масива (правим + // го по-голям). + + unsigned allocated = 8, size = 0; + char* sentence = new char[allocated]; + + char curr; + std::cin.get(curr); + while (curr != '.') { + sentence[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] = sentence[i]; + + delete[] sentence; + sentence = newSentenceArray; + } + } + sentence[size] = '\0'; + + std::cout << countLetters(sentence) << std::endl; + + delete[] sentence; +} + +// В тази конкретна задача, не е нужно да запазваме +// целия низ и после да гледаме буквите, можем директно +// да анализираме входа буква по буква +void solution3() { + unsigned count = 0; + + char curr; + std::cin.get(curr); + while (curr != '.') { + count += ('A' <= curr && curr <= 'Z') || + ('a' <= curr && curr <= 'z'); + std::cin.get(curr); + } + + std::cout << count << std::endl; +} + +int main() { + // solution1(); + // solution2(); + solution3(); + + return 0; +} |
