diff --git a/01_week/CMakeLists.txt b/01_week/CMakeLists.txt index 5ecaacbc..166189d5 100644 --- a/01_week/CMakeLists.txt +++ b/01_week/CMakeLists.txt @@ -7,7 +7,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) # Гарантирует использов set(EXAMPLES_DIR examples) # Определим переменную с именем директории set(TASKS_DIR tasks) -add_subdirectory(tasks) +#add_subdirectory(tasks) # Создать исполняемый файл для каждого примера if (BUILD_EXAMPLES_01_WEEK) @@ -32,4 +32,4 @@ if (BUILD_EXAMPLES_01_WEEK) add_example(functions_recursive ${EXAMPLES_DIR}/functions_recursive.cpp) add_example(io_streams ${EXAMPLES_DIR}/io_streams.cpp) add_example(main_with_args ${EXAMPLES_DIR}/main_with_args.cpp) -endif() \ No newline at end of file +endif() diff --git a/01_week/tasks/addition/addition.cpp b/01_week/tasks/addition/addition.cpp index 92872802..1290aa2b 100644 --- a/01_week/tasks/addition/addition.cpp +++ b/01_week/tasks/addition/addition.cpp @@ -3,5 +3,7 @@ int64_t Addition(int a, int b) { - throw std::runtime_error{"Not implemented"}; -} \ No newline at end of file +int64_t res = static_cast(a); // Присвоение и приведение типов. +res = res + static_cast(b); // Вычисление суммы и приведение типов. + return res; +} diff --git a/01_week/tasks/char_changer/char_changer.cpp b/01_week/tasks/char_changer/char_changer.cpp index 3a7344d9..a4011b6c 100644 --- a/01_week/tasks/char_changer/char_changer.cpp +++ b/01_week/tasks/char_changer/char_changer.cpp @@ -1,7 +1,58 @@ #include #include +// !!!! ВАЖНО !!!! Изначальное объявление функции изменено в части инициализации передаваемого элемента с «char delimiter = ' '» на «char delimiter». +size_t CharChanger(char array[], size_t size, char delimiter) { -size_t CharChanger(char array[], size_t size, char delimiter = ' ') { - throw std::runtime_error{"Not implemented"}; + char symbol; // Актуальный символ. + char prevSymbol; // Предыдущий символ. + char newSymbol = 0; // Новый символ. + size_t i = 0; // счетчик. + size_t j = 0; // счетчик итераций для индексации элементов обновленного массива. + char numMatch = 0; + prevSymbol = ~array[i]; + + + while(i != size) // Проверка. + { + symbol = array[i]; // Присваиваем значение элемента массива для анализа. + + if(('0' <= symbol) && (symbol <= '9')) newSymbol = '*'; // Если символ - цифра меняем ее на ‘*’. + else if(('a' <= symbol) && (symbol <= 'z')) newSymbol = symbol - ('a' - 'A'); // Если символ – сточная буква, меняем ее на заглавную. + else if(('A' <= symbol) && (symbol <= 'Z')) newSymbol = symbol; // Если символ – заглавная буква – ничего не делаем. + else if(symbol == ' ') newSymbol = delimiter; // Пробел меняем на спец символ. + else newSymbol = '_'; // Все остальные символы заменяем на ‘_’. + + if(symbol != prevSymbol) // Проверка совпадения текущего символа с предыдущим. + { + prevSymbol = symbol; // Запоминаем символ. + + if(numMatch != 0) // Количество совпадений равно 0? + { + if(array[i-1] != ' ') // Проверяем, прядущий проверяемый символ – пробел. Если да то не нужно печатать количество со впавших символов. + { + if(numMatch >= 9) array[j] = '0'; // Если количество совпадении больше 10 (9 т.к. 10-1). Печатаем 0. + else array[j] = '0' + numMatch + 1; // Иначе печатаем количество одинаковых символов подряд. + j++; + } + } + numMatch = 0; // Обнуляем количество совпадений. + array[j] = newSymbol; // Записываем изменений элемент в массив символов. + j++; // Увеличение счетчика итераций для индексации элементов обновленного массива. + + } + else numMatch++; //Символы совпали, увеличиваем счетчик итераций. + + i++; // Счетчик для анализируемых элементов массива. + + if(symbol == '\0') { // Проверка символа окончания строки. + j = j-1; // уменьшаем счетчик для записи символа окончания строки в обновлённый массив. + array[j] = '\0'; // записываем символ окончания строки + return j; // возвращаемое значение - номер последнего элемента обнавленного массива. + } + } + array[j] = '\0'; + + return j; + } diff --git a/01_week/tasks/check_flags/check_flags.cpp b/01_week/tasks/check_flags/check_flags.cpp index 75e7c652..8d065e0b 100644 --- a/01_week/tasks/check_flags/check_flags.cpp +++ b/01_week/tasks/check_flags/check_flags.cpp @@ -1,7 +1,6 @@ #include #include - enum class CheckFlags : uint8_t { NONE = 0, TIME = (1 << 0), @@ -14,5 +13,68 @@ enum class CheckFlags : uint8_t { }; void PrintCheckFlags(CheckFlags flags) { - throw std::runtime_error{"Not implemented"}; + + char buf[40] = {'\0'}; + uint8_t data = static_cast(flags); // приведение типа к uint8_t т.к. CheckFlags типа uint8_t + size_t i = 0; + + buf[0] = '['; + i =1; + // Проверка наличия "лишних флагов", ALL приводим к типу uint8_t + // Если есть лишние флаги, выходим. + if(data > static_cast(CheckFlags::ALL)) return; + if(data != 0) + { + if(data & static_cast(CheckFlags::TIME)){ + if(buf[i-1] != '['){ + buf[i] = ','; + i++; + } + + buf[i++] = 'T'; buf[i++] = 'I'; buf[i++] = 'M'; buf[i++] = 'E'; + } + if(data & static_cast(CheckFlags::DATE)){ + if(buf[i-1] != '['){ + buf[i] = ','; + i++; + } + + buf[i++] = 'D'; buf[i++] = 'A'; buf[i++] = 'T'; buf[i++] = 'E'; + } + if(data & static_cast(CheckFlags::USER)){ + if(buf[i-1] != '['){ + buf[i] = ','; + i++; + } + + buf[i++] = 'U'; buf[i++] = 'S'; buf[i++] = 'E'; buf[i++] = 'R'; + } + if(data & static_cast(CheckFlags::CERT)){ + if(buf[i-1] != '['){ + buf[i] = ','; + i++; + } + + buf[i++] = 'C'; buf[i++] = 'E'; buf[i++] = 'R'; buf[i++] = 'T'; + } + if(data & static_cast(CheckFlags::KEYS)){ + if(buf[i-1] != '['){ + buf[i] = ','; + i++; + } + + buf[i++] = 'K'; buf[i++] = 'E'; buf[i++] = 'Y'; buf[i++] = 'S'; + } + if(data & static_cast(CheckFlags::DEST)){ + if(buf[i-1] != '['){ + buf[i] = ','; + i++; + } + + buf[i++] = 'D'; buf[i++] = 'E'; buf[i++] = 'S'; buf[i++] = 'T'; + } + } + + buf[i] = ']'; + std::cout << buf; } diff --git a/01_week/tasks/length_lit/length_lit.cpp b/01_week/tasks/length_lit/length_lit.cpp index e69de29b..a2956b03 100644 --- a/01_week/tasks/length_lit/length_lit.cpp +++ b/01_week/tasks/length_lit/length_lit.cpp @@ -0,0 +1,62 @@ + +// Константы для преобразования +#define IN_TO_CM 2.54 +#define FT_TO_IN 12.0 +#define M_TO_CM 100.0 + + +constexpr double operator"" _ft_to_m(long double x) { + return static_cast(x / M_TO_CM * FT_TO_IN * IN_TO_CM); // преобразование фт в метры +} + +constexpr double operator"" _ft_to_cm(long double x) { + return static_cast(x * FT_TO_IN * IN_TO_CM); // преобразование фт в см +} + +constexpr double operator"" _ft_to_in(long double x) { + return static_cast( x * FT_TO_IN); // преобразование фт в дюймы +} + + +//Дюймы +constexpr double operator"" _in_to_m(long double x) { + return static_cast(x * IN_TO_CM / M_TO_CM); +} + +constexpr double operator"" _in_to_cm(long double x) { + return static_cast(x * IN_TO_CM); // +} + +constexpr double operator"" _in_to_ft(long double x) { + return static_cast(x / FT_TO_IN); // +} + +//Метры +constexpr double operator"" _m_to_ft(long double x) { + return static_cast(x / IN_TO_CM / FT_TO_IN * M_TO_CM); // +} + +constexpr double operator"" _m_to_cm(long double x) { + return static_cast( x * M_TO_CM); // +} + +constexpr double operator"" _m_to_in(long double x) { + return static_cast(x / IN_TO_CM * M_TO_CM); // +} + + +//см +constexpr double operator"" _cm_to_ft(long double x) { + return static_cast(x / FT_TO_IN / IN_TO_CM); // +} + +constexpr double operator"" _cm_to_m(long double x) { + return static_cast(x / M_TO_CM); // +} + +constexpr double operator"" _cm_to_in(long double x) { + return static_cast(x / IN_TO_CM); // +} + + + diff --git a/01_week/tasks/print_bits/print_bits.cpp b/01_week/tasks/print_bits/print_bits.cpp index a48a43c1..242e6e9f 100644 --- a/01_week/tasks/print_bits/print_bits.cpp +++ b/01_week/tasks/print_bits/print_bits.cpp @@ -3,5 +3,67 @@ void PrintBits(long long value, size_t bytes) { - throw std::runtime_error{"Not implemented"}; + +// Защита от неверного значения размера в байтах. Размер в байтах должен быть от 1 до 8. +if(bytes == 0) return; +if(bytes > 8) return; + +char buf[90] = {'\0'}; // Объявление и инициализация массива '\0'. + +// !!!! Важно!!!!! +// при отладке были проблемы, по ну установленной причине при переводе от 5 до 8 байт некорректно выводилось значение. Связано это было с некорректным смещением 0х01. Даже если 0х01 присваивалось 64 битной переменной при смещении на значение от 32 до 64, результат был не верный, в результате анализа добегу переменная смещалось на 32 и все. +// Поэтом начались танцы с бубном и все переменные сделаны 8 битными. +unsigned long long count = 0; // Счётчик проанализированных бит +unsigned long long temp = 0; +unsigned long long sizeBit = bytes*8; // количество бит для вывода +unsigned long long countFour = 0; +unsigned long long countBuf = 0; // счетчик для элементов массива +unsigned long long countBit = 0; +char res; // +unsigned long long tempBit = 0; + + buf[0] = '0'; // присвоение значения первому элементу массива + buf[1] = 'b'; // присвоение значения второму элементу массива + + countBuf = 2; + + while( count < sizeBit) // Проверка количество проанализированных бит совпала с требуемым? + { // Нет, анализируем. + + //Усложнённая конструкция но без нее работало не корректно. + temp = (sizeBit-1 - count); + countBit = 0; + tempBit = 0x01; + while(temp > countBit) + { + countBit ++; + tempBit = tempBit << 1; + } + //Конец сложной конструкции. ее можно было свирнуть до temp = 0х01 << (sizeBit-1 - count); но так не работало при значении coun< 32. + + temp = tempBit & value; // определение 0 или 1 для конкретного бита. + + if(temp) res = '1'; + else res = '0'; + + buf[countBuf + count] = res; // Запись значения в массив. + + count++; // Увеличиваема счетчик + + if(countFour == 3) // После 4х значении надо вывести символ ''' (номер 39 в таблице ASCII). + { + if(sizeBit != count) + { + buf[countBuf + count] = 39; + countBuf++; + } + countFour = 0; + } + else countFour++; + + } + buf[countBuf+count] = '\n'; // последний элемент массива '\n' + + + std::cout << buf; // Вывод результата. } diff --git a/01_week/tasks/quadratic/quadratic.cpp b/01_week/tasks/quadratic/quadratic.cpp index abf7d632..b00486ae 100644 --- a/01_week/tasks/quadratic/quadratic.cpp +++ b/01_week/tasks/quadratic/quadratic.cpp @@ -1,6 +1,60 @@ #include - +#include +#include void SolveQuadratic(int a, int b, int c) { - throw std::runtime_error{"Not implemented"}; -} \ No newline at end of file + float x1 = 0.0; // Превый корень уравнения + float x2 = 0.0; // Второй корень уравнения. + + float fA = static_cast(a); // Явное приведение типа int к float + float fB = static_cast(b); // Явное приведение типа int к float + float fC = static_cast(c); // Явное приведение типа int к float + float disc = static_cast(c); // Явное приведение типа int к float + float negativeUnit = -1; // Защита для формул при умножении на -1 + + // Если a, b, c равны нулю – решений бесконечно много. + if((a == 0) && (b == 0) && (c == 0)){ + std::cout <<"infinite solutions"; + return; + } + + // Если a, b равны нулю – решений а не равно нулю –решений нет! + if((a == 0) && (b == 0) && (c != 0)) + { + std::cout <<"no solutions"; + return; + } + + // Если x = 0 + if(((a == 0) && (c == 0)) || ((b == 0) && (c == 0))) + { + std::cout <<"0"; + return; + } + + + if(a == 0) // Своего рода ускорение вычисления при a равном нулю + { + x1 = (-fC)/fB; + std::cout << std::setprecision(6) << x1; + } + else // Решение через дискрименант + { + disc = fB * fB - 4 * fA * fC; + + if(disc < 0) + { + std::cout <<"no solutions"; + return; + } + + x1 = (negativeUnit * fB - sqrt(disc))/(2*fA); + x2 = (negativeUnit * fB + sqrt(disc))/(2*fA); + + // определяем вывод в зависимости от X1 и X2 + if (x1 == x2) std::cout << std::setprecision(6) << x1 ; + else if(x1 < x2) std::cout << std::setprecision(6) << x1 << ' ' << x2; + else std::cout << std::setprecision(6) << x2 << ' ' << x1; + + return; + } diff --git a/01_week/tasks/rms/rms.cpp b/01_week/tasks/rms/rms.cpp index 6882f0a9..9df36853 100644 --- a/01_week/tasks/rms/rms.cpp +++ b/01_week/tasks/rms/rms.cpp @@ -1,7 +1,16 @@ -#include +#include #include double CalculateRMS(double values[], size_t size) { - throw std::runtime_error{"Not implemented"}; -} \ No newline at end of file + double sum = 0.0; + + if(0 == size) return 0.0;// + if(&values[0] == nullptr) return 0.0; + + for(size_t i = 0; i < size; i++){ + sum += values[i]*values[i]; + } + + return std::sqrt(sum / size); +} diff --git a/02_week/CMakeLists.txt b/02_week/CMakeLists.txt index 625e6fbe..856d2248 100644 --- a/02_week/CMakeLists.txt +++ b/02_week/CMakeLists.txt @@ -7,7 +7,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) # Гарантирует использов set(EXAMPLES_DIR examples) # Определим переменную с именем директории set(TASKS_DIR tasks) -add_subdirectory(tasks) +#add_subdirectory(tasks) # Создать исполняемый файл для каждого примера if (BUILD_EXAMPLES_02_WEEK) @@ -17,4 +17,4 @@ if (BUILD_EXAMPLES_02_WEEK) add_example(ptr_access ${EXAMPLES_DIR}/ptr_access.cpp) add_example(ptr_arithmetic ${EXAMPLES_DIR}/ptr_arithmetic.cpp) add_example(reinterpret ${EXAMPLES_DIR}/reinterpret.cpp) -endif() \ No newline at end of file +endif() diff --git a/03_week/CMakeLists.txt b/03_week/CMakeLists.txt index e5df5bac..fb663b00 100644 --- a/03_week/CMakeLists.txt +++ b/03_week/CMakeLists.txt @@ -7,11 +7,11 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON) # Гарантирует использов set(EXAMPLES_DIR examples) # Определим переменную с именем директории set(TASKS_DIR tasks) -add_subdirectory(tasks) + #add_subdirectory(tasks) # Создать исполняемый файл для каждого примера if (BUILD_EXAMPLES_03_WEEK) add_example(struct_examples ${EXAMPLES_DIR}/struct_examples.cpp) add_example(union_examples ${EXAMPLES_DIR}/union_examples.cpp) add_example(vector_examples ${EXAMPLES_DIR}/vector_examples.cpp) -endif() \ No newline at end of file +endif() diff --git a/04_week/tasks/CMakeLists.txt b/04_week/tasks/CMakeLists.txt index 6ddf92b4..b42c26a7 100644 --- a/04_week/tasks/CMakeLists.txt +++ b/04_week/tasks/CMakeLists.txt @@ -1,4 +1,3 @@ add_subdirectory(stack) -add_subdirectory(queue) + add_subdirectory(ring_buffer) -add_subdirectory(phasor) \ No newline at end of file diff --git a/04_week/tasks/phasor/phasor.cpp b/04_week/tasks/phasor/phasor.cpp index 3ec1b9ad..fa99de69 100644 --- a/04_week/tasks/phasor/phasor.cpp +++ b/04_week/tasks/phasor/phasor.cpp @@ -6,5 +6,5 @@ struct AlgTag {}; class Phasor { - + }; diff --git a/04_week/tasks/ring_buffer/ring_buffer.cpp b/04_week/tasks/ring_buffer/ring_buffer.cpp index e2b57ba2..ae43a220 100644 --- a/04_week/tasks/ring_buffer/ring_buffer.cpp +++ b/04_week/tasks/ring_buffer/ring_buffer.cpp @@ -1,6 +1,194 @@ #include + class RingBuffer { +public: + + // ---- Конструкторы ----- + explicit RingBuffer(size_t capacity); // Конструктор от емкости + RingBuffer(size_t capacity, int initialValue); // Конструткор от емкасти и начального значения + RingBuffer(std::initializer_list init); // конструктор по размеру контейнера + + // ---- Методы ----- + void Push(int value); + bool TryPush(int value); + + bool Pop(); + bool TryPop(int& value); + + int& Front(); + const int& Front() const; + int& Back(); + const int& Back() const; + + bool Empty() const {return countElem == 0;} + bool Full() const {return countElem == buf.capacity();} + size_t Size() const{return countElem;} + size_t Capacity() const{return buf.capacity();} + + void Clear() {prevElem = nextElem = countElem = 0;} + void Resize(size_t newCapacity); + + std::vector Vector() const; + + bool operator==(const RingBuffer& other) const; + bool operator!=(const RingBuffer& other) const; + int& operator[](size_t index); + const int& operator[](size_t index) const; + +private: + std::vector buf; + size_t prevElem = 0; + size_t nextElem = 0; + size_t countElem = 0; // счетчик текущего элемента + + + size_t NextIndex(size_t i) const { + if((i + 1) >= buf.capacity()) return 0; + return i+1; + } + }; + +RingBuffer::RingBuffer(size_t capacity) { + if(capacity == 0) capacity = 1; // Емкость 0 не должна быть + buf.reserve(capacity); + buf.resize(capacity); + prevElem = 0; + nextElem = 0; + countElem = 0; +} + +RingBuffer::RingBuffer(size_t capacity, int initialValue) { + + if(capacity == 0) capacity = 1; // Емкость 0 не должна быть + buf.reserve(capacity); + buf.resize(capacity); + prevElem = 0; + nextElem = 0; + countElem = 0; + for (size_t i = 0; i < capacity; ++i) Push(initialValue); + +} + +RingBuffer::RingBuffer(std::initializer_list init) { + + size_t capacity = init.size(); + if(capacity == 0) capacity = 1; // Емкость 0 не должна быть + + buf.reserve(capacity); + buf.resize(capacity); + prevElem = 0; + nextElem = 0; + countElem = 0; + + for (int value : init) Push(value); +} + +void RingBuffer::Push(int value) { + if (Full()) { + buf[nextElem] = value; + prevElem = NextIndex(prevElem); + nextElem = NextIndex(nextElem); + } else { + buf[nextElem] = value; + nextElem = NextIndex(nextElem); + ++countElem; + } +} + +bool RingBuffer::TryPush(int value) { + if (Full()) return false; + buf[nextElem] = value; + nextElem = NextIndex(nextElem); + ++countElem; + return true; +} + +bool RingBuffer::Pop() { + if (Empty()) return false; + prevElem = NextIndex(prevElem); + --countElem; + return true; +} + +bool RingBuffer::TryPop(int& value) { + if (Empty()) return false; + value = buf[prevElem]; + Pop(); + return true; +} + +int& RingBuffer::operator[](size_t i) { + if(i >= countElem) return buf[countElem]; + return buf[((i + prevElem)%buf.capacity())]; + +} + +const int& RingBuffer::operator[](size_t i) const { + if(i >= countElem) return buf[countElem]; + return buf[((i + prevElem)%buf.capacity())]; +} + +int& RingBuffer::Front() { + if(nextElem == 0) return buf[buf.capacity() - 1]; + return buf[nextElem - 1]; +} + +const int& RingBuffer::Front() const { + if(nextElem == 0) return buf[buf.capacity() - 1]; + return buf[nextElem - 1]; +} + +int& RingBuffer::Back() { + return buf[prevElem]; +} + +const int& RingBuffer::Back() const { + return buf[prevElem]; +} + + + + + + +void RingBuffer::Resize(size_t newCapacity) { + newCapacity = newCapacity ? newCapacity : 1; + if (newCapacity == buf.capacity()) return; + + size_t newCount = countElem < newCapacity ? countElem : newCapacity; + std::vector newBuffer = {}; + newBuffer.reserve(newCapacity); + newBuffer.resize(newCapacity); + + for (size_t i = 0; i < newCount; ++i) { + newBuffer[i] = (*this)[countElem - newCount + i]; + } + + buf = std::move(newBuffer); + prevElem = 0; + nextElem = newCount % newCapacity; + countElem = newCount; +} + +std::vector RingBuffer::Vector() const { + std::vector result; + result.reserve(countElem); + for (size_t i = 0; i < countElem; ++i) result.push_back((*this)[i]); + return result; +} + +bool RingBuffer::operator==(const RingBuffer& other) const { + if (countElem != other.countElem || buf.capacity() != other.buf.capacity()) + return false; + for (size_t i = 0; i < countElem; ++i) + if ((*this)[i] != other[i]) return false; + return true; +} + +bool RingBuffer::operator!=(const RingBuffer& other) const { + return !(*this == other); +} diff --git a/04_week/tasks/stack/stack.cpp b/04_week/tasks/stack/stack.cpp index 222e4ffc..04841d83 100644 --- a/04_week/tasks/stack/stack.cpp +++ b/04_week/tasks/stack/stack.cpp @@ -2,5 +2,71 @@ class Stack { + public: + // методы: + + void Push(int newData); // Добавление нэлемента в стек + + bool Pop(void); // удаление элемента с верхушки стека + + int& Top(); // Доступ к элементу на вершине стека + + const int& Top() const; // Доступ к элементу на вершине стека + + bool Empty() const; // Проверка отсутсвия элементов на вершине + + size_t Size() const; // Размер стека + + void Clear(); // Очистка стека + + void Swap(Stack& other); // меняем местами элементы + + // определение для == + bool operator==(const Stack& x) const {return data == x.data;} + + // определение для != + bool operator!=(const Stack& x) const {return !(data == x.data);} + + private: + std::vector data; // данные }; + + + +// в Методах для Stack используем методы для vector + +void Stack::Push(int newData){ + data.push_back(newData); +} + +bool Stack::Pop(void){ + if(data.empty()) return false; + data.pop_back(); + return true; +} + +int& Stack::Top(){ + return data.back(); +} + +const int& Stack::Top() const{ + return data.back(); +} + +bool Stack::Empty() const{ + return data.empty(); +} + +size_t Stack::Size() const{ + return data.size(); +} + +void Stack::Clear() { + data.clear(); +} + +void Stack::Swap(Stack& other){ + data.swap(other.data); +} +