From f7b79e9a7c83184406d6e81a14c43ea63522ad3c Mon Sep 17 00:00:00 2001 From: TToJlkoBHuK <28arhalex@gmail.com> Date: Mon, 31 Mar 2025 21:20:17 +0300 Subject: [PATCH 01/11] quadratic equation class, .h --- QuadraticEquation.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 QuadraticEquation.h diff --git a/QuadraticEquation.h b/QuadraticEquation.h new file mode 100644 index 0000000..833dfbb --- /dev/null +++ b/QuadraticEquation.h @@ -0,0 +1,14 @@ +#ifndef QUADRATIC_EQUATION_H +#define QUADRATIC_EQUATION_H + +#include + +class QuadraticEquation { +private: + double a, b, c; +public: + QuadraticEquation(double a, double b, double c); + std::vector solve() const; +}; + +#endif \ No newline at end of file From 773876dce1951cd25736b694db246373797cbb9b Mon Sep 17 00:00:00 2001 From: TToJlkoBHuK <28arhalex@gmail.com> Date: Mon, 31 Mar 2025 21:21:17 +0300 Subject: [PATCH 02/11] quadratic equation class, implementation --- QuadraticEquation.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 QuadraticEquation.cpp diff --git a/QuadraticEquation.cpp b/QuadraticEquation.cpp new file mode 100644 index 0000000..1a663cd --- /dev/null +++ b/QuadraticEquation.cpp @@ -0,0 +1,25 @@ +#include "QuadraticEquation.h" +#include +#include + +QuadraticEquation::QuadraticEquation(double a, double b, double c) : a(a), b(b), c(c) {} + +std::vector QuadraticEquation::solve() const { + std::vector roots; + if (a == 0) { + if (b == 0) return roots; + roots.push_back(-c / b); + return roots; + } + double discriminant = b * b - 4 * a * c; + if (discriminant > 0) { + double sqrtD = std::sqrt(discriminant); + roots.push_back((-b + sqrtD) / (2 * a)); + roots.push_back((-b - sqrtD) / (2 * a)); + std::sort(roots.begin(), roots.end()); + } + else if (discriminant == 0) { + roots.push_back(-b / (2 * a)); + } + return roots; +} \ No newline at end of file From 1af9963a88483c1ad1de6d257a42a84201f23f6e Mon Sep 17 00:00:00 2001 From: TToJlkoBHuK <28arhalex@gmail.com> Date: Mon, 31 Mar 2025 21:22:36 +0300 Subject: [PATCH 03/11] class student, .h, bad/average/good --- Student.h | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 Student.h diff --git a/Student.h b/Student.h new file mode 100644 index 0000000..1f48410 --- /dev/null +++ b/Student.h @@ -0,0 +1,38 @@ +#ifndef STUDENT_H +#define STUDENT_H + +#include "QuadraticEquation.h" +#include +#include + +class Student { +protected: + std::string name; +public: + Student(const std::string& name) : name(name) {} + virtual std::vector solve(const QuadraticEquation& eq) const = 0; + std::string getName() const { return name; } + virtual ~Student() = default; +}; + +class GoodStudent : public Student { +public: + GoodStudent(const std::string& name) : Student(name) {} + std::vector solve(const QuadraticEquation& eq) const override; +}; + +class AverageStudent : public Student { +private: + double probability; +public: + AverageStudent(const std::string& name, double prob) : Student(name), probability(prob) {} + std::vector solve(const QuadraticEquation& eq) const override; +}; + +class BadStudent : public Student { +public: + BadStudent(const std::string& name) : Student(name) {} + std::vector solve(const QuadraticEquation& eq) const override; +}; + +#endif \ No newline at end of file From 522bc834b2983f3af89443bd7059c25d3c0bcdb3 Mon Sep 17 00:00:00 2001 From: TToJlkoBHuK <28arhalex@gmail.com> Date: Mon, 31 Mar 2025 21:23:16 +0300 Subject: [PATCH 04/11] Student class, implementation --- Student.cpp | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 Student.cpp diff --git a/Student.cpp b/Student.cpp new file mode 100644 index 0000000..567e4d4 --- /dev/null +++ b/Student.cpp @@ -0,0 +1,30 @@ +#include "Student.h" +#include +#include +#include + +std::vector GoodStudent::solve(const QuadraticEquation& eq) const { + return eq.solve(); +} + +std::vector AverageStudent::solve(const QuadraticEquation& eq) const { + if (static_cast(rand()) / RAND_MAX < probability) { + return eq.solve(); + } + else { + std::vector wrong = eq.solve(); + if (!wrong.empty()) { + for (double& root : wrong) { + root += (static_cast(rand()) / RAND_MAX - 0.5) * 2; + } + } + else { + wrong.push_back(0); + } + return wrong; + } +} + +std::vector BadStudent::solve(const QuadraticEquation& eq) const { + return { 0 }; +} \ No newline at end of file From 0b7189170c450ec44ceea61635c624cbaa66b3a8 Mon Sep 17 00:00:00 2001 From: TToJlkoBHuK <28arhalex@gmail.com> Date: Mon, 31 Mar 2025 21:25:36 +0300 Subject: [PATCH 05/11] mail/email management class, .h --- EmailQueue.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 EmailQueue.h diff --git a/EmailQueue.h b/EmailQueue.h new file mode 100644 index 0000000..e658540 --- /dev/null +++ b/EmailQueue.h @@ -0,0 +1,17 @@ +#ifndef EMAIL_QUEUE_H +#define EMAIL_QUEUE_H + +#include "QuadraticEquation.h" +#include +#include +#include + +class EmailQueue { +private: + std::queue, std::string>> emails; +public: + void addEmail(const QuadraticEquation& eq, const std::vector& solution, const std::string& studentName); + std::queue, std::string>> getEmails() const; +}; + +#endif \ No newline at end of file From f661c2e5bca8ff080cb7dd449bda9910fb672e2b Mon Sep 17 00:00:00 2001 From: TToJlkoBHuK <28arhalex@gmail.com> Date: Mon, 31 Mar 2025 21:26:06 +0300 Subject: [PATCH 06/11] mail class/email management, implementation --- EmailQueue.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 EmailQueue.cpp diff --git a/EmailQueue.cpp b/EmailQueue.cpp new file mode 100644 index 0000000..c31ae9b --- /dev/null +++ b/EmailQueue.cpp @@ -0,0 +1,9 @@ +#include "EmailQueue.h" + +void EmailQueue::addEmail(const QuadraticEquation& eq, const std::vector& solution, const std::string& studentName) { + emails.push(std::make_tuple(eq, solution, studentName)); +} + +std::queue, std::string>> EmailQueue::getEmails() const { + return emails; +} \ No newline at end of file From 07067b3ec0e26dac2688136c5b7f48d4a852033f Mon Sep 17 00:00:00 2001 From: TToJlkoBHuK <28arhalex@gmail.com> Date: Mon, 31 Mar 2025 21:26:59 +0300 Subject: [PATCH 07/11] class teacher/academic record, .h --- Instructor.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Instructor.h diff --git a/Instructor.h b/Instructor.h new file mode 100644 index 0000000..5c97ec3 --- /dev/null +++ b/Instructor.h @@ -0,0 +1,21 @@ +#ifndef INSTRUCTOR_H +#define INSTRUCTOR_H + +#include "EmailQueue.h" +#include +#include +#include + +class Instructor { +private: + std::map results; + std::set allStudents; + + void initializeStudents(const EmailQueue& queue); + +public: + void checkEmails(const EmailQueue& queue); + void publishResults(const std::string& filename = "") const; +}; + +#endif \ No newline at end of file From c202e90a18e5b7e1cd24431b7cf0d561b06ee0e6 Mon Sep 17 00:00:00 2001 From: TToJlkoBHuK <28arhalex@gmail.com> Date: Mon, 31 Mar 2025 21:27:37 +0300 Subject: [PATCH 08/11] class teacher/academic performance accounting, implementation --- Instructor.cpp | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 Instructor.cpp diff --git a/Instructor.cpp b/Instructor.cpp new file mode 100644 index 0000000..bced656 --- /dev/null +++ b/Instructor.cpp @@ -0,0 +1,81 @@ +#include "Instructor.h" +#include +#include +#include +#include +#include +#include + + +void Instructor::initializeStudents(const EmailQueue& queue) { + auto emails = queue.getEmails(); + while (!emails.empty()) { + const auto& email = emails.front(); + const std::string& studentName = std::get<2>(email); + allStudents.insert(studentName); + emails.pop(); + } + for (const auto& name : allStudents) { + results[name] = 0; + } +} + +bool compareSolutions(const std::vector& correct, const std::vector& student) { + if (correct.size() != student.size()) return false; + for (size_t i = 0; i < correct.size(); ++i) { + if (std::abs(correct[i] - student[i]) > 1e-6) return false; + } + return true; +} + +void Instructor::checkEmails(const EmailQueue& queue) { + initializeStudents(queue); + + auto emails = queue.getEmails(); + while (!emails.empty()) { + const auto& email = emails.front(); + const QuadraticEquation& eq = std::get<0>(email); + const std::vector& studentSolution = std::get<1>(email); + const std::string& studentName = std::get<2>(email); + + auto correctSolution = eq.solve(); + if (compareSolutions(correctSolution, studentSolution)) { + results[studentName]++; + } + emails.pop(); + } +} + +void Instructor::publishResults(const std::string& filename) const { + if (results.empty()) { + std::cout << "No results to publish.\n"; + return; + } + + std::vector> sortedResults(results.begin(), results.end()); + std::sort(sortedResults.begin(), sortedResults.end(), + [](const auto& a, const auto& b) { return a.second > b.second; }); + + auto printTable = [&](std::ostream& os) { + os << std::setw(20) << "Student Name" << " | " << std::setw(6) << "Correct" << "\n"; + os << "----------------------+--------\n"; + for (const auto& pair : sortedResults) { + os << std::setw(20) << pair.first << " | " << std::setw(6) << pair.second << "\n"; + } + }; + + if (!filename.empty()) { + std::ofstream file(filename); + if (file.is_open()) { + printTable(file); + file.close(); + std::cout << "Results saved to " << filename << std::endl; + } + else { + std::cerr << "Error: Unable to open file for writing." << std::endl; + } + } + else { + printTable(std::cout); + } +} \ No newline at end of file From 9ba5dfa0eb97e75621a21f7b34026a62f73bb1d3 Mon Sep 17 00:00:00 2001 From: TToJlkoBHuK <28arhalex@gmail.com> Date: Mon, 31 Mar 2025 21:30:09 +0300 Subject: [PATCH 09/11] create main --- main.cpp | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 main.cpp diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..71e4b30 --- /dev/null +++ b/main.cpp @@ -0,0 +1,47 @@ +#include "QuadraticEquation.h" +#include "Student.h" +#include "EmailQueue.h" +#include "Instructor.h" +#include +#include +#include +#include +#include + +std::vector readEquations(const std::string& filename) { + std::vector equations; + std::ifstream file(filename); + std::string line; + while (std::getline(file, line)) { + std::istringstream iss(line); + double a, b, c; + if (iss >> a >> b >> c) { + equations.emplace_back(a, b, c); + } + } + return equations; +} + +int main() { + srand(42); + + auto equations = readEquations("equations.txt"); + + GoodStudent good("Alice"); + AverageStudent average("Bob", 0.5); + BadStudent bad("Charlie"); + + EmailQueue queue; + + for (const auto& eq : equations) { + queue.addEmail(eq, good.solve(eq), good.getName()); + queue.addEmail(eq, average.solve(eq), average.getName()); + queue.addEmail(eq, bad.solve(eq), bad.getName()); + } + + Instructor instructor; + instructor.checkEmails(queue); + instructor.publishResults(); + + return 0; +} \ No newline at end of file From d5d27000b6f58653c50af85233c23bc6fcd1de56 Mon Sep 17 00:00:00 2001 From: TToJlkoBHuK <28arhalex@gmail.com> Date: Mon, 31 Mar 2025 21:31:06 +0300 Subject: [PATCH 10/11] examples .txt --- equations.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 equations.txt diff --git a/equations.txt b/equations.txt new file mode 100644 index 0000000..1602496 --- /dev/null +++ b/equations.txt @@ -0,0 +1,4 @@ +1 0 -4 +0 2 -8 +1 2 1 +1 1 1 \ No newline at end of file From f41ee5dc1ac2e88a2590424d39cf9ac5f58c3508 Mon Sep 17 00:00:00 2001 From: TToJlkoBHuK <28arhalex@gmail.com> Date: Mon, 31 Mar 2025 21:34:53 +0300 Subject: [PATCH 11/11] CMake file --- CMakeLists.txt | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..77263e2 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,86 @@ +cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR) + +set(CMAKE_SYSTEM_VERSION 10.0 CACHE STRING "" FORCE) + +project(avto_kvadrat CXX) + +################################################################################ +# Set target arch type if empty. Visual studio solution generator provides it. +################################################################################ +if(NOT CMAKE_VS_PLATFORM_NAME) + set(CMAKE_VS_PLATFORM_NAME "x64") +endif() +message("${CMAKE_VS_PLATFORM_NAME} architecture in use") + +if(NOT ("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64" + OR "${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x86")) + message(FATAL_ERROR "${CMAKE_VS_PLATFORM_NAME} arch is not supported!") +endif() + +################################################################################ +# Global configuration types +################################################################################ +set(CMAKE_CONFIGURATION_TYPES + "Debug" + "Release" + CACHE STRING "" FORCE +) + +################################################################################ +# Global compiler options +################################################################################ +if(MSVC) + # remove default flags provided with CMake for MSVC + set(CMAKE_CXX_FLAGS "") + set(CMAKE_CXX_FLAGS_DEBUG "") + set(CMAKE_CXX_FLAGS_RELEASE "") +endif() + +################################################################################ +# Global linker options +################################################################################ +if(MSVC) + # remove default flags provided with CMake for MSVC + set(CMAKE_EXE_LINKER_FLAGS "") + set(CMAKE_MODULE_LINKER_FLAGS "") + set(CMAKE_SHARED_LINKER_FLAGS "") + set(CMAKE_STATIC_LINKER_FLAGS "") + set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS}") + set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS}") + set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS}") + set(CMAKE_STATIC_LINKER_FLAGS_DEBUG "${CMAKE_STATIC_LINKER_FLAGS}") + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS}") + set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS}") + set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS}") + set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS}") +endif() + +################################################################################ +# Nuget packages function stub. +################################################################################ +function(use_package TARGET PACKAGE VERSION) + message(WARNING "No implementation of use_package. Create yours. " + "Package \"${PACKAGE}\" with version \"${VERSION}\" " + "for target \"${TARGET}\" is ignored!") +endfunction() + +################################################################################ +# Common utils +################################################################################ +include(CMake/Utils.cmake) + +################################################################################ +# Additional Global Settings(add specific info there) +################################################################################ +include(CMake/GlobalSettingsInclude.cmake OPTIONAL) + +################################################################################ +# Use solution folders feature +################################################################################ +set_property(GLOBAL PROPERTY USE_FOLDERS ON) + +################################################################################ +# Sub-projects +################################################################################ +add_subdirectory(avto_kvadrat) +