From de9bd7ed8d86c4f09e51532be95e25a0afea1db9 Mon Sep 17 00:00:00 2001 From: adjoly Date: Tue, 3 Jun 2025 11:41:31 +0200 Subject: [PATCH] =?UTF-8?q?=E3=80=8C=E2=9C=A8=E3=80=8D=20feat:=20finished?= =?UTF-8?q?=20ex00?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ex00/BitcoinExchange.cpp | 134 +++++++++++++++++++++++++++++++++++++-- ex00/BitcoinExchange.hpp | 25 +++++++- ex00/btc | Bin 55256 -> 81872 bytes ex00/main.cpp | 13 ++-- flake.lock | 12 ++-- 5 files changed, 166 insertions(+), 18 deletions(-) diff --git a/ex00/BitcoinExchange.cpp b/ex00/BitcoinExchange.cpp index 5c07c3a..7b32a0e 100644 --- a/ex00/BitcoinExchange.cpp +++ b/ex00/BitcoinExchange.cpp @@ -6,14 +6,19 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/21 10:39:45 by adjoly #+# #+# */ -/* Updated: 2025/05/30 13:29:18 by adjoly ### ########.fr */ +/* Updated: 2025/06/03 11:40:22 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include +#include +#include #include #include #include +#include +#include +#include #include #include #include @@ -69,7 +74,7 @@ Date::Date(std::string date) { } } } - throw std::runtime_error("Error: bad input => " + date); + throw std::runtime_error("bad input => " + date); } Date::Date(const Date &cpy) @@ -126,7 +131,18 @@ bool Date::operator>=(const Date &other) const { } std::ostream &operator<<(std::ostream &os, const Date &date) { - os << date.getYear() << "-" << date.getMonth() << "-" << date.getDay(); + std::stringstream month; + std::stringstream day; + if (date.getMonth() < 10) + month << "0" << date.getMonth(); + else + month << date.getMonth(); + if (date.getDay() < 10) + day << "0" << date.getDay(); + else + day << date.getDay(); + + os << date.getYear() << "-" << month.str() << "-" << day.str(); return os; } @@ -161,9 +177,11 @@ CsvParser::CsvParser(void) : _is("data.csv") { } } -CsvParser::CsvParser(const CsvParser &cpy) { +CsvParser::CsvParser(const CsvParser &cpy) : _is(cpy._filename.c_str()) { _log("➕", "CsvParser", "", "copy constructor called"); if (&cpy != this) { + _filename = cpy._filename; + _csv = cpy._csv; } } @@ -172,8 +190,116 @@ CsvParser::~CsvParser(void) { _log("➖", "CsvParser", "", "destructor called"); CsvParser &CsvParser::operator=(const CsvParser &cpy) { _log("➕", "CsvParser", "", "copy assignement constructor called"); if (&cpy != this) { + _csv = cpy._csv; + _filename = cpy._filename; } return *this; } std::map CsvParser::getCsv(void) const { return _csv; } + +BitcoinExchange::BitcoinExchange(void) + : _is("input.txt"), _filename("input.txt") { + _log("➕", "BitcoinExchange", "", "default constructor called"); + if (!_is.is_open()) + throw std::runtime_error("could not open file - " + _filename); +} + +BitcoinExchange::BitcoinExchange(char *av) : _is(av), _filename(av) { + _log("➕", "BitcoinExchange", "", "file name constructor called"); + try { + _csv = new CsvParser(); + } catch (std::exception &e) { + throw e; + } + + if (!_is.is_open()) + throw std::runtime_error("could not open file - " + _filename); + + std::string buf; + + std::getline(_is, buf); + if (buf != "date | value") + throw std::runtime_error("file has not the good format - " + buf); +} + +BitcoinExchange::BitcoinExchange(const BitcoinExchange &) { + _log("➕", "BitcoinExchange", "", "copy constructor called"); +} + +BitcoinExchange &BitcoinExchange::operator=(const BitcoinExchange &) { + _log("➕", "BitcoinExchange", "", "copy assignement constructor called"); + + return *this; +} + +BitcoinExchange::~BitcoinExchange(void) { + _log("➖", "BitcoinExchange", "", "destructor called"); + delete _csv; +} + +void BitcoinExchange::print(void) { + std::pair pair; + std::getline(_is, _line); + while (!_line.empty()) { + try { + pair = _parseLine(); + } catch (std::exception &e) { + std::cerr << "Error: " << e.what() << std::endl; + std::getline(_is, _line); + continue; + } + _printPair(pair); + std::getline(_is, _line); + } +} + +std::pair BitcoinExchange::_parseLine(void) { + std::pair pair; + std::string buf; + size_t i; + + for (i = 0; + i < _line.length() && (std::isdigit(_line[i]) || _line[i] == '-'); + i++) { + buf.push_back(_line[i]); + } + try { + pair.first = Date(buf); + } catch (std::exception &e) { + throw std::runtime_error("bad input => " + _line); + } + if (_line[i] != ' ' || _line[i + 1] != '|' || _line[i + 2] != ' ') { + throw std::runtime_error("bad input => " + _line); + } + if (_line.substr(i + 3) == "0") { + pair.second = 0; + } else { + float f = std::atof(_line.substr(i + 3).c_str()); + if (f == 0) { + throw std::runtime_error("bad input => " + _line); + } else if (f > 1000) + throw std::runtime_error("too large number."); + else if (f < 0) + throw std::runtime_error("not a positive number."); + pair.second = f; + } + + return pair; +} + +void BitcoinExchange::_printPair(std::pair pair) { + auto map = _csv->getCsv(); + auto it = std::find_if(map.begin(), map.end(), CompareDate(pair.first)); + if (it == map.end()) + throw std::out_of_range("out of range"); + + float i = it->second * pair.second; + std::cout << pair.first << " => " << pair.second << " = " << i << std::endl; +} + +CompareDate::CompareDate(Date date) : _date(date) {} + +bool CompareDate::operator()(const std::pair &pair) const { + return pair.first >= _date; +} diff --git a/ex00/BitcoinExchange.hpp b/ex00/BitcoinExchange.hpp index 124fc4f..ba27363 100644 --- a/ex00/BitcoinExchange.hpp +++ b/ex00/BitcoinExchange.hpp @@ -6,7 +6,7 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/21 10:38:49 by adjoly #+# #+# */ -/* Updated: 2025/05/30 20:31:26 by adjoly ### ########.fr */ +/* Updated: 2025/06/03 11:22:28 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,6 +16,7 @@ #include #include #include +#include #define range(x) \ x.begin(); \ @@ -89,13 +90,31 @@ class CsvParser { class BitcoinExchange { public: BitcoinExchange(void); + BitcoinExchange(char *av); BitcoinExchange(const BitcoinExchange &); ~BitcoinExchange(void); BitcoinExchange &operator=(const BitcoinExchange &); + void print(void); + protected: private: - void _nextToken(void); - std::string _peekToken(void) const; + std::ifstream _is; + std::string _filename; + std::string _line; + CsvParser *_csv; + + std::pair _parseLine(void); + void _printPair(std::pair); +}; + +class CompareDate { + public: + CompareDate(Date); + + bool operator()(const std::pair &pair) const; + + private: + Date _date; }; diff --git a/ex00/btc b/ex00/btc index 7566286cb03af1adb1e5a3a1e385c0885c0e94d6..e18141ba38280a9392f9a508843adf40c465cb3b 100755 GIT binary patch literal 81872 zcmeFad3=;b@;}~_NkRg_OaK*icNrBG4=^DCg6D8V2PGIel=VtNNFWMH42ec}af2bs zFpfq9#XH_{J;*9(+%*ssA>PqNjjpcoe#S+Oh#1#nzVE8;ex_$KgU9##`TTx=_`F^- z^>lT0b#--hb$9hM&-^8C`bh~6htOAoI6+X#ljC8O{1&2XLYT%Qa>Zcb5pFR;B!emu zA5G^`cN%slAQP8{DKaUXfK+Zc-7xe-z*(FULPK3UK`Ix%JnB}$qJw2pL*bHXDwjmJ znKCUhJ@Q7uXa6FT8k*&}zE)MPRh3h)d8EW^XqF@0xZaWZuFqsS4O3VcAr=mh`MMmb zi^{dAaxJQyhHj-#4YfW=M*0+O#}`9S1axyspwHwLU9Mi0tKaTn0u9}g+%Ctu0B+Vt zHS>Q>eFdtV=Ml-+^N5FUG`vMsprNksbd)2#{M<`*yO^o!i`NgmN}n2%ozQi3MS0!P zOKK{sOOGyDFmcJa@ne@1XJ=n9A$Rfk?27ZtDzd6C&Y3X3YT~7t<)arYDxX&}dhD2- z%+ce=AC1J(i{_7BR9;bAH@Yr&{OIvHW0q8o87uit0ho@@NPLcxC^1gK69EswX97N1 z_?(Q-G<@_m5I2+Y`8__w?hp9vjnAR@9E8t!eCV1af&D!QcOHCF@uBwp4j+A;fScp- z8HEq&Yz#ix_|SDAK8N9RI3;im#^-3h6XGNVk5TYA1#=WU0+5EbSEUI|#OD;19s#&N zK5mu%r64U%0X3}b+#$HrHe@5!O*$ai)L!@~GvJ(k_*;k!1vNN8-zYdt!6N~Os{4Hb zX-F$K#8~R{(R?SrP6fy{(!+6otdZVN-Dd($Rrh+l=BYI4)`JhpP4y+FwI&`SQj zFi|f=u?IM+muzU@vZlh3i_@k&`gZnf?jLrg4twRL1GdjV_bs)9C9VAY$R4g>bR(Q_z4|_|MRRvGB8Dys_}N#;JF1 z96sCP)O%qZ`aT#)ta=;b$TJ*<8H@geIQVP~&RFzk#HqI}PJ0K#ImF`gI*dOS{_8mO zPr;yK(eH{Q=N)h;vFJy}Y4164>YWhBP7aGB|M79^9UrIOyW;fkU*q66$LZg1?kEqw{R>kl}v@1g#Ad0^7Fvdj{;%We%=$jNh&1rOftMum1@^D&z z-3vc(kVq3%S4sRfm2rpach6Xf*YwS*zg%ixqVZSZhU#^zdPk{@Tfm>>^z8I7M$4J5 z^wt~2|0-2)eYT`mY{bdnL;Q=P+9e7L7c8!Idl*DRS zREyE#%E%T^D4cm}d?9D$6wVq~I6JE_FONm4T(l&w%)XP2CmgjsK9?9`OR;R(b4n}b zFZ!vzijsUh+X!`Kb!|mW`Qp;T((3BUYVh1si{i>68~BS2ZbEhGlG5snN_C&v2AgXd zZ2bOv=8O^Mku@eht&cmoEEiEjsfMhj=#TD}lt4rq!R5SBb=}98=U0zXAUAnlmq9#r^$YJ!e#{GoyC54sHx{{JcVZli= zXI0KBgeAji78lkmtggJ6jUo$8;1qN)U#b~CjEUxzE-0@kgw{(If|UGM)OcbBIVBid zxSPMIfSsS&#lOhVv&mGYbDn@M$DY14*0AsAwW9nqyjFZOh;UlmNM%^?5D^}IY*sl; zm(0HqF^1~m>Ps+Y%4+!ou0m5WP{E}nmW z<)TZDzPPgbf+bbOC8bB_j6HfvK|x`D<^0-3rG=RjkA}5X)z&N_ND=U3{;%TaX6Xqf znHObVFt56Le#zL93m23xDW8yg{`?E;DkfxCWangNjfSE|XXT6;J0@$)*vzrxGPB2y zMerRl_(&Ixl%snkWel#GMl{dr3j} zl#-CXsZM!0fIkm01d6}7@hLd;66}}bNDJmAe`bw zmA;Va6U3WH)7ANfharR#I(9&aE(1^J6#CNpeN@6RZjIObbi$vik%0AT|4w+1f!Fa0 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

u6L!voRBFm3ygUiM_(vd#N^1SQ&5VuEL=r6|whH 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%0D1VlZIA1t%Qlj~#}`y9Sp*gMk2i+aEmP6q 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 F9|8UOKfM3| literal 55256 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 J3zM?O{|8}cALal6 diff --git a/ex00/main.cpp b/ex00/main.cpp index 595307e..711a82c 100644 --- a/ex00/main.cpp +++ b/ex00/main.cpp @@ -6,23 +6,26 @@ /* By: adjoly +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/05/21 10:34:50 by adjoly #+# #+# */ -/* Updated: 2025/05/30 20:30:28 by adjoly ### ########.fr */ +/* Updated: 2025/06/03 11:31:50 by adjoly ### ########.fr */ /* */ /* ************************************************************************** */ #include #include #include +#include int main(int ac, char **av) { (void)av; if (ac > 1) { - CsvParser *parser; + BitcoinExchange *btc; try { - parser = new CsvParser(); - } catch (std::exception &e) { - std::cerr << "Error: " << e.what() << std::endl; + btc = new BitcoinExchange(av[1]); + btc->print(); + } catch (std::runtime_error &e) { + std::cout << e.what() << std::endl; } + delete btc; } else { std::cout << "Error: could not open file." << std::endl; } diff --git a/flake.lock b/flake.lock index 7e193d4..7ffe0df 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1747744144, - "narHash": "sha256-W7lqHp0qZiENCDwUZ5EX/lNhxjMdNapFnbErcbnP11Q=", + "lastModified": 1748693115, + "narHash": "sha256-StSrWhklmDuXT93yc3GrTlb0cKSS0agTAxMGjLKAsY8=", "owner": "nixos", "repo": "nixpkgs", - "rev": "2795c506fe8fb7b03c36ccb51f75b6df0ab2553f", + "rev": "910796cabe436259a29a72e8d3f5e180fc6dfacc", "type": "github" }, "original": { @@ -54,11 +54,11 @@ ] }, "locked": { - "lastModified": 1745683407, - "narHash": "sha256-KBxdhcU39pctJx1yVSxiWVRNazzBRtwch7NYjwstf5s=", + "lastModified": 1748259577, + "narHash": "sha256-U2VwP0orjL10tyBhqVWOne+jySF7Chv2q8qkdtNU6jI=", "owner": "y-syo", "repo": "pogit", - "rev": "16adbe5cc1f39314761ec53d348cb86b60c901af", + "rev": "a6789248e58aabfb94d49319646bbb06dfe2bfae", "type": "github" }, "original": {