Advertisement
Guest User

Untitled

a guest
Jul 17th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.77 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <optional>
  4. #include <string>
  5. #include <sstream>
  6. #include <string_view>
  7. #include <vector>
  8. #include <ctime>
  9. #include <iomanip>
  10. #include <unordered_map>
  11. #include <array>
  12.  
  13. #include "test_runner.h"
  14.  
  15. using namespace std;
  16.  
  17. class Date {
  18.  
  19. public:
  20.     Date() = default;
  21.  
  22.     Date(int year, int month, int day)
  23.         :year_(year),
  24.         month_(month),
  25.         day_(day) {};
  26.  
  27.     time_t AsTimestamp() const {
  28.         tm t;
  29.         t.tm_sec = 0;
  30.         t.tm_min = 0;
  31.         t.tm_hour = 0;
  32.         t.tm_mday = day_;
  33.         t.tm_mon = month_ - 1;
  34.         t.tm_year = year_ - 1900;
  35.         t.tm_isdst = 0;
  36.         return mktime(&t);
  37.     };
  38.  
  39.     int getYear() const {
  40.         return year_;
  41.     };
  42.     int getMonth()const {
  43.         return month_;
  44.     };
  45.     int getDay() const {
  46.         return day_;
  47.     };
  48.  
  49. private:
  50.     int year_;
  51.     int month_;
  52.     int day_;
  53. };
  54.  
  55. static const Date START_DATE = Date(2000, 01, 01);
  56. static const Date END_DATE = Date(2100, 01, 01);
  57.  
  58. int ComputeDaysDiff(const Date& date_from, const Date& date_to) {
  59.     const time_t timestamp_to = date_to.AsTimestamp();
  60.     const time_t timestamp_from = date_from.AsTimestamp();
  61.     static const int SECONDS_IN_DAY = 60 * 60 * 24;
  62.     return ((timestamp_to - timestamp_from) / SECONDS_IN_DAY);
  63. }
  64.  
  65. size_t ComputeDayIndex(const Date& date) {
  66.     return ComputeDaysDiff(START_DATE, date);
  67. }
  68.  
  69. istream & operator>>(istream & is, Date & date) {
  70.     string year_, month_, day_;
  71.  
  72.     string string_date;
  73.     is >> string_date;
  74.  
  75.     istringstream date_stream(string_date);
  76.  
  77.     getline(date_stream, year_, '-');
  78.     getline(date_stream, month_, '-');
  79.     getline(date_stream, day_, ' ');
  80.  
  81.     date = Date(stoi(year_),
  82.         stoi(month_),
  83.         stoi(day_));
  84.     return is;
  85. }
  86.  
  87. class PersonalBudgetManager {
  88. public:
  89.     PersonalBudgetManager() {
  90.         earn_.assign(36'600,0);
  91.         spend_.assign(36'600,0);
  92.     };
  93.  
  94.     double ComputeIncome(Date from, Date to) {
  95.         double result = 0;
  96.  
  97.         size_t FROM = ComputeDayIndex(from);
  98.         size_t TO = ComputeDayIndex(to) + 1;
  99.  
  100.         for (size_t i = FROM; i < TO; ++i) {
  101.             result += earn_[i];
  102.             result -= spend_[i];
  103.         }
  104.  
  105.         return result;
  106.     };
  107.  
  108.     void Earn(Date from, Date to, double value) {
  109.         double per_day = value / (ComputeDaysDiff(from, to) + 1);
  110.  
  111.         size_t FROM = ComputeDayIndex(from);
  112.         size_t TO = ComputeDayIndex(to) + 1;
  113.  
  114.         for (size_t i = FROM; i < TO; ++i) {
  115.             earn_[i] += per_day;
  116.         }
  117.  
  118.     };
  119.  
  120.     void Spend(Date from, Date to, double value) {
  121.         double per_day = value / (ComputeDaysDiff(from, to) + 1);
  122.  
  123.         size_t FROM = ComputeDayIndex(from);
  124.         size_t TO = ComputeDayIndex(to) + 1;
  125.  
  126.         for (size_t i = FROM; i < TO; ++i) {
  127.             spend_[i] += per_day;
  128.         }
  129.  
  130.     };
  131.  
  132.     void PayTax(Date from, Date to, int percentage) {
  133.         size_t FROM = ComputeDayIndex(from);
  134.         size_t TO = ComputeDayIndex(to) + 1;
  135.  
  136.         for (size_t i = FROM; i < TO; ++i) {
  137.             earn_[i] *= ((100 - static_cast<double>(percentage)) / 100);
  138.         }
  139.     };
  140.  
  141. private:
  142.     vector<double> earn_;
  143.     vector<double> spend_;
  144. };
  145.  
  146. int main() {
  147.  
  148.     //cout << ComputeDayIndex(START_DATE) << endl;
  149.     //cout << ComputeDayIndex(END_DATE) << endl;
  150.  
  151.     PersonalBudgetManager pbm;
  152.  
  153.     //pbm.Earn(START_DATE, Date(2000, 01, 02),10);
  154.     //cout << pbm.ComputeIncome(START_DATE, START_DATE) << endl;
  155.  
  156.     int k = 0;
  157.     cin >> k;
  158.  
  159.     for (int i = 0; i < k; ++i) {
  160.         string query;
  161.         cin >> query;
  162.  
  163.         Date from, to;
  164.         cin >> from >> to;
  165.  
  166.         if (query == "Earn") {
  167.             double value = 0;
  168.             cin >> value;
  169.             pbm.Earn(from, to, value);
  170.         }
  171.         else if (query == "Spend") {
  172.             double value = 0;
  173.             cin >> value;
  174.             pbm.Spend(from, to, value);
  175.         }
  176.         else if (query == "ComputeIncome") {
  177.             cout.precision(25);
  178.             cout << pbm.ComputeIncome(from, to) << endl;
  179.         }
  180.         else if (query == "PayTax") {
  181.             int percentage = 0;
  182.             cin >> percentage;
  183.             pbm.PayTax(from, to, percentage);
  184.         }
  185.         else {
  186.             throw invalid_argument("");
  187.         }
  188.     }
  189.  
  190.     return 0;
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement