From 00ae951bd788953b63c39f0bb5446ba39e226860 Mon Sep 17 00:00:00 2001 From: Coder Date: Wed, 6 Nov 2019 00:59:17 +0000 Subject: [PATCH] Upload files to '' --- CSCI251-A3 - Spring 2019.pdf | Bin 0 -> 89387 bytes auxiliary.cpp | 168 +++++++++++++ auxiliary.h | 41 ++++ cfc.cpp | 153 ++++++++++++ cfc.h | 457 +++++++++++++++++++++++++++++++++++ driver.cpp | 15 ++ general_functions.cpp | 207 ++++++++++++++++ general_functions.h | 82 +++++++ makefile | 28 +++ readme.txt | 27 +++ 10 files changed, 1178 insertions(+) create mode 100644 CSCI251-A3 - Spring 2019.pdf create mode 100644 auxiliary.cpp create mode 100644 auxiliary.h create mode 100644 cfc.cpp create mode 100644 cfc.h create mode 100644 driver.cpp create mode 100644 general_functions.cpp create mode 100644 general_functions.h create mode 100644 makefile create mode 100644 readme.txt diff --git a/CSCI251-A3 - Spring 2019.pdf b/CSCI251-A3 - Spring 2019.pdf new file mode 100644 index 0000000000000000000000000000000000000000..739a0402a2c5a54accb93c0cb0bbaf5f9abfe6bf GIT binary patch literal 89387 zcmeFXby!|YvoDCdJHcMu9bVjB0t6=ncY*~E?gV#t4{pKTHArxGcXt>__C9;xxo7Tt z=kFPwXEn9Dx~iqB`&X;_C07s?r)Oqhha(@G?3smQ1uy}u_08dUdEppkjjT-UO##g8 zT_lgPWka&;{%+bJL~(Sqp_5Zl*3c$@Sy}*GvFp;O|gU#uzEVzQt=9ePVQwycfh=fEDpg{22@kwr_-Ls?x0 zbcmFKV`4)rvqpkuBB3e{UVNv_ZqK4kW5R2~(8kXMVzYLfA$=2WyaDR7UxsqnTgE4N z83q?S0H2%(a!d5+)jve)^o_fKqRfuhEblt3UJF7zMB;?H^y+nO^~zdE!7Gr~)4>RT z{dtb>@TA|a^4^S79lDdDd!aZY3p7Bo3jZDsIpuJdBU~IP6488Qp3Q0o%AJF}j?W2DcHsA{_WTdz%6LLO;=IU~#PX(HmM4gbltdfZUR}?#j`kQu93|FQOaut1)aj@G zX9#F5EjEm*ZkaV*o4sF&L||gkjdj6sH_#tj!;A&Jz(YH(F+<@sL~t2FMmn+tLaki7 z7S)_!FW_j96uu>NlCbu$st8tsxEJpiS(AWz+bWI zBFc$ZbI`}rkUbiRhm?$gM)~O#1(To7`mSz%mtbjM=3V0pgl^6m+~1r4`UmgG#0DKE zL!|oP9bGM(?7;BuDnSdfafKZ4CdsVbpkk7Uv!#8yn0Vfj@u*zy>Q{gv{5tMhz9zVp zPjJ1&OU$pDOysjhS`*hoK%9%zsd;7y3ZxSHw4=;=u9C*9A&4u8^$3;hi^zZGFgBRO z&Yz(i*R*o}W;(=Y(i1)#4Y>*=F-C$a$O78gYx<7( zD0?{C(BqWFVd3WnE|rMpCTyaZSR`CTd0H0>MOrcyezf@u-#fH`sl{4l6Dg2zes!OC zdk{mHyCuw^`OsC&Sa_|~nHpI2XoaedBqyPn59SrE?Wrq4Lp}4`R>TDJ+nHV=J!Z2LKFaj-}2Fi)4 z%lc$TONoM(R#I4nr*Mc6$_<>Ud}C@+pP=ZB9Cf#pjhX3X_oj_vHTBTxGw;Tc!@?66 zJ8P1sAatcmFyn#KKGQ1~9t$3f;^=(ZP!-H5C4b`j4B0?xbmXQHG;;vtJN+N^zjP25 zbz^8n?p2B1X$2l0PBvIZzWx&0z&Yk%OL4`Tkpof7K1(<$c9BW=;UxTf;Y!3&8$2$qWGgMY6B~IDV6_niv&q ztqqin>;amugA^49Fe)24+XJ-Tkn!(M{@u%8xXQxB4*XAXwMJbgVzVBxb+nx7&`2wh zK>~T93VU{lqPiVIlEDlRD2sGVe5KsGIv?|2izqtY$a%Bt8WzPt2fc2mCFTJ_)yG-GQ{z4<7PJQnj|Ch~MP zwo5ngsqN$it}!?*_DfX0T*53tY_O5BkL&8e{Jk;2D7abM`N`}V z*6HvhorbW4<56RewZwy=E1I8D;Fn*jm6?nSlvcqNC~4$67A&LsX$2k$*vUCtZb<4Z zh=ezV-A7?sSuqtQ;LgS;+K>Zd@4W+jtfOT<#YIA`{LB{-iek57Kb+pl~M-VsME zOvMA8G6{%)7cnvE*|oPU1LxKp+_jStF;GFyjmO_lX56(31v$KhX|KH)SHrJypNON| za?sts(mRy#8vjz#6fclz=EUg)O!Tb5#?+qKu`t3�L^Z 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≤1J~+{e1jj}0RHN^e;Mqk??eLr*03fPE7> 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 literal 0 HcmV?d00001 diff --git a/auxiliary.cpp b/auxiliary.cpp new file mode 100644 index 0000000..69c355e --- /dev/null +++ b/auxiliary.cpp @@ -0,0 +1,168 @@ +// License: AGPLv3 or later. https://www.gnu.org/licenses/licenses.html + +#include +#include + +#include "auxiliary.h" +#include "general_functions.h" + +using namespace std; + +processArguments::processArguments( + int theArgc, const char* const theArgv[]): + argc(theArgc), argv(theArgv) +{ + checkIfArgcWithinRange(); + checkIfArg2Is0Or1OnlyAndSetMintOrMelt(); + checkIfCorrectNumberOfArgumentsForMintOrMelt(); + checkIf3rdOnwardArgsAreNotPositveInt(); + setRemainingDataMemberValues(); + printProcessedArguments(); +} + +void processArguments::checkIfArgcWithinRange() +{ + if (argc < 5 or argc > 6) + { + cerr + << "For Mint, no. of arguments must be 6 and for Melt no." + << " of arguments must be 5 but recived " << argc + << " argument(s).\n"; + exit(1); + } +} + +void processArguments::checkIfArg2Is0Or1OnlyAndSetMintOrMelt() +{ + string secondArgumentIncorrect = + string("Second argument can be only 0 for Mint and 1 for Melt") + + ". But it is '" + argv[1] + "'.\n"; + if (is_whole_number(argv[1])) + { + mintOrMelt = stoi(argv[1]); + if (mintOrMelt > 1 or mintOrMelt < 0) + { + cerr << secondArgumentIncorrect; + exit(1); + } + } + else + { + cerr << secondArgumentIncorrect; + exit(1); + } +} + +void processArguments::checkIfCorrectNumberOfArgumentsForMintOrMelt() +{ + if (mintOrMelt == mint and argc != 6) + { + cerr + << "For Mint, no. of arguments can be excatly 6 only. But " + << "recived " << argc << ".\n"; + exit(1); + } + else if (mintOrMelt == melt and argc != 5) + { + cerr + << "For Melt, no. of arguments can be excatly 5 only. But " + << "recived " << argc << ".\n"; + exit(1); + } +} + +void processArguments::checkIf3rdOnwardArgsAreNotPositveInt() +{ + checkIfArgumentIsNotPositiveInt(argv[2], "3rd"); + checkIfArgumentIsNotPositiveInt(argv[3], "4th"); + checkIfArgumentIsNotPositiveInt(argv[4], "5th"); + if (mintOrMelt == mint) + { + checkIfArgumentIsNotPositiveInt(argv[5], "6th"); + } +} + +void processArguments::checkIfArgumentIsNotPositiveInt ( + const char* argument, string itsIndex) +{ + if (! is_natural_number(argument)) + { + cerr + << "All arguments from 3rd onward must be positive " + << "integer but " << itsIndex << " i.e. '" << argument + << "' is not.\n"; + exit(1); + } +} + +void processArguments::setRemainingDataMemberValues() +{ + seed = stoi(argv[2]); + length= stoi(argv[3]); + size= stoi(argv[4]); + if (mintOrMelt == mint) + { + mod= stoi(argv[5]); + } +} + + +string processArguments::codewordType() const +{ + if (mintOrMelt == mint) + { + return "mint"; + } + else if (mintOrMelt == melt) + { + return "melt"; + } + else + { + cerr_and_exit( + 2, + "Unexpected Internal", + __FILE__, + __func__, + __LINE__); + } +} + +short processArguments::codewordInt() const +{ + return mintOrMelt; +} + +int processArguments::randomGeneratorSeed() const +{ + return seed; +} + +int processArguments::codewordLength() const +{ + return length; +} + +int processArguments::codebookSize() const +{ + return size; +} + +int processArguments::modulus() const +{ + return mod; +} + +void processArguments::printProcessedArguments() const +{ + cout + << "Mode: " << codewordType() << " " + << "Seed: " << seed << " " + << "Codeword Length: " << length << " " + << "Codebook size: " << size; + if (mintOrMelt == mint) + { + cout << " Modulus: " << mod; + } + cout << endl; +} diff --git a/auxiliary.h b/auxiliary.h new file mode 100644 index 0000000..4df351f --- /dev/null +++ b/auxiliary.h @@ -0,0 +1,41 @@ +// License: AGPLv3 or later. https://www.gnu.org/licenses/licenses.html + +#ifndef _AUXILIARY_H_ +#define _AUXILIARY_H_ + +#include + +class processArguments +{ + public: + processArguments(int theArgc, const char* const theArgv[]); + std::string codewordType() const; + short codewordInt() const; + int randomGeneratorSeed() const; + int codewordLength() const; + int codebookSize() const; + int modulus() const; + private: + short mint = 0; + short melt = 1; + short mintOrMelt; + int seed; + int length; + int size; + int mod; + int argc; + const char* const *argv; + // if any of the checks fail, program exits immediately w/ + // error code 1 + void checkIfArgcWithinRange(); + void checkIfArg2Is0Or1Only(); + void checkIfArg2Is0Or1OnlyAndSetMintOrMelt(); + void checkIfCorrectNumberOfArgumentsForMintOrMelt(); + void checkIf3rdOnwardArgsAreNotPositveInt(); + void checkIfArgumentIsNotPositiveInt( + const char* argument, std::string itsIndex); + void setRemainingDataMemberValues(); + void printProcessedArguments() const; +}; + +#endif diff --git a/cfc.cpp b/cfc.cpp new file mode 100644 index 0000000..99710be --- /dev/null +++ b/cfc.cpp @@ -0,0 +1,153 @@ +// License: AGPLv3 or later. https://www.gnu.org/licenses/licenses.html + +#include +#include +#include + +#include "cfc.h" +#include "generateValue.h" + +using namespace std; + +driver::driver(processArguments &theProgArgs): +ProgramArguments(theProgArgs) +{ + if (ProgramArguments.codewordType() == "mint") + { + Mint aMint(Mint::zeroSymbol, ProgramArguments.modulus()); + processMintOrMelt(aMint); + } + else if (ProgramArguments.codewordType() == "melt") + { + Melt aMelt(Melt::zeroSymbol); + processMintOrMelt(aMelt); + } + else + { + cerr_and_exit( + 2, + "unexpected", + __FILE__, + __func__, + __LINE__, + "ProgArgs.codewordType() is neither mint nor melt. Its " + + ProgramArguments.codewordType() +'.' + ); + } +} + +void driver::processMint(Codebook> &theCodebook) +{ + // adding rest of the randomly generated codewords + for (int i=1; i < ProgramArguments.codebookSize(); i++) + { + Codeword aCodeword; + for (int j=0; j < ProgramArguments.codewordLength(); j++) + { + int randomNumber = generateMint( + ProgramArguments.randomGeneratorSeed(), + ProgramArguments.modulus() + ); + Mint aMint(randomNumber, ProgramArguments.modulus()); + aCodeword.push_back(aMint); + } + theCodebook.push_back(aCodeword); + } + theCodebook.Display(); +} + +void driver::processMelt(Codebook> &theCodebook) +{ + // adding rest of the randomly generated codewords + for (int i=1; i < ProgramArguments.codebookSize(); i++) + { + Codeword aCodeword; + for (int j=0; j < ProgramArguments.codewordLength(); j++) + { + char randomCharacter = generateMelt( + ProgramArguments.randomGeneratorSeed() + ); + Melt aMelt(randomCharacter); + aCodeword.push_back(aMelt); + } + theCodebook.push_back(aCodeword); + } + theCodebook.Display(); +} + +void driver::processMint(Codebook> &theCodebook) +{ + cerr_and_exit( + 2, + "unexpected", + __FILE__, + __func__, + __LINE__, + "function called for processing Melt cases." + ); +} + +void driver::processMelt(Codebook> &theCodebook) +{ + cerr_and_exit( + 2, + "unexpected", + __FILE__, + __func__, + __LINE__, + "function called for processing Mint cases." + ); +} + + Mint::Mint(int Number, int Modulus) : modulus(Modulus) + { + if (Number < modulus and Number >= 0) + { + number = Number; + } + else if (Number > modulus) + { + number = Number%modulus; + } + else if (Number < 0) + { + + } + } + + int Mint::getNumber() const + { + return number; + } + + int Mint::getSymbol() const + { + return getNumber(); + } + + int Mint::operator-(const Mint mint2) const + { + int beforeModulating = number - mint2.getNumber(); + int afterModulating = modulate(beforeModulating, modulus); + return afterModulating; + } + + Melt::Melt(char Character) + { + character = tolower(Character); + } + + char Melt::getCharacter() const + { + return character; + } + + char Melt::getSymbol() const + { + return getCharacter(); + } + +int Melt::operator-(const Melt melt2) const +{ + return (character != melt2.getCharacter()); +} diff --git a/cfc.h b/cfc.h new file mode 100644 index 0000000..1b8a4df --- /dev/null +++ b/cfc.h @@ -0,0 +1,457 @@ +// License: AGPLv3 or later. https://www.gnu.org/licenses/licenses.html + +#ifndef _CFC_H_ +#define _CFC_H_ + +#include + +#include "auxiliary.h" +#include "general_functions.h" + +class Mint +{ + public: + Mint() {}; + Mint(int Number, int Modulus); + int getNumber() const; + // standard function to be used for template codeword. + // it just 'return getNumber();' + int getSymbol() const; + int operator-(const Mint mint2) const; + static const int zeroSymbol = 0; + private: + int number; + int modulus; +}; + +class Melt +{ + public: + Melt() {}; + Melt(char Character); + char getCharacter() const; + // standard function to be used for template codeword. + // it just 'return getCharacter();' + char getSymbol() const; + int operator-(const Melt melt2) const; + static const char zeroSymbol = 'a'; + private: + char character; +}; + +template +class Codeword +{ + public: + Codeword(); + Codeword(std::vector &aTVector); + Codeword(const Codeword &aCodeword); + void push_back(T symbol); + std::vector getCodeword() const; + int getWeight() const; + // return -1 if encounters error i.e.: + // If size of own codeword and codeword passed as argument + // mismatch However It Will Not Happen Within Runtime Of This + // Program. This is just defensive programming. + int Distance(const Codeword &aCodeword) const; + void Display() const; + int size() const; + T getSymbolByIndex(int index) const; + //bool isZeroCodeword() const; + private: + void Weight(); + void incrementalWeight(); + //void calculateIfZeroCodeword(); + std::vector codeword; + int weight = 0; + //bool isZerocodeword; +}; + +template +class Codebook +{ + public: + Codebook(); + Codebook(std::vector &aTVector); + Codebook(const Codebook &aCodebook); + void push_back(T codeword); + std::vector getCodebook() const; + void Display() const; + int getMinimumWeight() const; + std::vector> getDistance() const; + int getMinimumDistance() const; + private: + // this function simply calls other three private functions + void doCalculations(); + void minimumWeight(); + void calcDistance(); + void minimumDistance(); + void doIncrementalCalculations(); + void minimumIncrementalWeight(); + void calcIncrementalDistance(); + void minimumIncrementalDistance(); + int minWeight = 0; + std::vector> distance; + int minDistance = 0; + std::vector codebook; + inline void updateIfNewMinimumDistance(int aDistance); +}; + +class driver +{ + public: + driver(processArguments &ProgArgs); + private: + template + void processMintOrMelt(U aMintOrMelt); + void processMint(Codebook> &theCodebook); + void processMelt(Codebook> &theCodebook); + // placeholder functions which are never called and + // will print error and quit if called + void processMint(Codebook> &theCodebook); + void processMelt(Codebook> &theCodebook); + processArguments &ProgramArguments; +}; + + +/******TEMPLATE CLASES AND FUNCTIONS DEFINITION STARTS FROM HERE******/ + + +template +void driver::processMintOrMelt(U aMintOrMelt) +{ + Codebook> theCodebook; + Codeword aCodeword; + for (int i=0; i < 1 &&i < ProgramArguments.codebookSize(); i++) + { + for (int j=0; j < ProgramArguments.codewordLength(); j++) + { + aCodeword.push_back(aMintOrMelt); + } + theCodebook.push_back(aCodeword); + } + if (typeid(U) == typeid(Mint)) + { + processMint(theCodebook); + } + else if (typeid(U) == typeid(Melt)) + { + processMelt(theCodebook); + } +} + +template +Codeword::Codeword() +{ +} + +template +Codeword::Codeword(std::vector &aTVector) +{ + for (T symbol: aTVector) + { + codeword.push_back(symbol); + } + Weight(); +} + +template +Codeword::Codeword(const Codeword &aCodeword) +{ + codeword = aCodeword.getCodeword(); + weight = aCodeword.getWeight(); +} + +template +void Codeword::push_back(T symbol) +{ + codeword.push_back(symbol); + incrementalWeight(); +} + +template +std::vector Codeword::getCodeword() const +{ + return codeword; +} + +template +int Codeword::getWeight() const +{ + return weight; +} + +template +int Codeword::Distance(const Codeword &aCodeword) const +{ + int distance = 0; + if (codeword.size() != aCodeword.size()) + { + cerr_only( + "Internal", + __FILE__, + __func__, + __LINE__, + "For calculating Codeword Distance, no. of symbols in own" + " codeword and codeword passed as argument mismatch. " + "Though technically a possiblity, it should not happen " + "within the run of this program." + ); + distance = -1; + } + else + { + for (int i=0; i < size(); i++) + { + distance += codeword[i] - aCodeword.getSymbolByIndex(i); + } + } + return distance; +} + +template +void Codeword::Display() const +{ + for(T symbol: codeword) + { + std::cout << symbol.getSymbol() << " "; + } + std::cout << " Weight: " << weight << std::endl; +} + +template +int Codeword::size() const +{ + return codeword.size(); +} + +template +T Codeword::getSymbolByIndex(int index) const +{ + if (codeword.size() > index) + { + return codeword[index]; + } + else + { + cerr_only( + "internal", + __FILE__, + __func__, + __LINE__, + "Index symbol requqested is greater than cointainer size " + "An empty symbol of same type will be returned but this " + "will therefore give garbage result." + ); + T emptySymbol; + return emptySymbol; + } +} + +template +void Codeword::Weight() +{ + weight = 0; + for (T symbol: codeword) + { + if (symbol.getSymbol() != symbol.zeroSymbol) + { + weight++; + } + } +} + +template +void Codeword::incrementalWeight() +{ + if (codeword[codeword.size()-1].getSymbol() + != codeword[0].zeroSymbol) + { + weight++; + } +} + +template +Codebook::Codebook() +{ +} + +template +Codebook::Codebook(std::vector &aTVector) +{ + for (T codeword: aTVector) + { + codebook.push_back(codeword); + } + doCalculations(); +} + +template +Codebook::Codebook(const Codebook &aCodebook) +{ + minWeight = aCodebook.getMinimumWeight(); + distance = aCodebook.getDistance(); + minDistance = aCodebook.getMinimumDistance(); + codebook = aCodebook.getCodebook(); +} + +template +void Codebook::push_back(T codeword) +{ + codebook.push_back(codeword); + doIncrementalCalculations(); +} + +template +std::vector Codebook::getCodebook() const +{ + return codebook; +} + +template +void Codebook::Display() const +{ + for (T codeword: codebook) + { + codeword.Display(); + } + std::cout + << "Minimum Weight: " << minWeight << '\n' + << "Minimum Distance: " << minDistance << '\n' + << "Distances Table:" << std::endl; + for (auto row: distance) + { + for (int eachDistance: row) + { + std::cout << eachDistance << " "; + } + std::cout << "\b\n"; + } + std::cout << std::flush; +} + +template +int Codebook::getMinimumWeight() const +{ + return minWeight; +} + +template +std::vector> Codebook::getDistance() const +{ + return distance; +} + +template +int Codebook::getMinimumDistance() const +{ + return minDistance; +} + +template +void Codebook::doCalculations() +{ + minimumWeight(); + calcDistance(); + minimumDistance(); +} + +template +void Codebook::minimumWeight() +{ + for (T codeword: codebook) + { + int weight = codeword.getWeight(); + if (weight < minWeight or minWeight == 0) + { + minWeight = weight; + } + } +} + +template +void Codebook::calcDistance() +{ + int i = 0; + for (T codeword: codebook) + { + distance.emplace_back(); + for(T otherCodeword: codebook) + { + int aDistance = codeword.Distance(otherCodeword); + distance[i].push_back(aDistance); + } + } +} + +template +void Codebook::minimumDistance() +{ + for (std::vector distanceVector: distance) + { + for (int aDistance: distanceVector) + { + if ((aDistance < minDistance + and aDistance != 0) + or minDistance == 0) + { + minDistance = aDistance; + } + } + } +} + +template +void Codebook::doIncrementalCalculations() +{ + minimumIncrementalWeight(); + calcIncrementalDistance(); + minimumDistance(); +} + +template +void Codebook::minimumIncrementalWeight() +{ + int weight = codebook[codebook.size()-1].getWeight(); + if (weight < minWeight or minWeight == 0) + { + minWeight = weight; + } +} + +template +void Codebook::calcIncrementalDistance() +{ + int lastCodeword = codebook.size()-1; + + // Adding new column to table + // previous codewords - new codeowrd + for (int i=0; i < distance.size(); i++) + { + int aDistance = codebook[i].Distance(codebook[lastCodeword]); + distance[i].push_back(aDistance); + } + + // Adding new row to table + // new codeword - all Codewords + distance.emplace_back(); + for(T aCodeword: codebook) + { + int aDistance = codebook[lastCodeword].Distance(aCodeword); + distance[distance.size()-1].push_back(aDistance); + } +} + +template +void Codebook::minimumIncrementalDistance() +{ + for (int aDistance: distance[distance.size()-1]) + { + if (aDistance < minDistance or minDistance == 0) + { + minDistance = aDistance; + } + } +} + +#endif diff --git a/driver.cpp b/driver.cpp new file mode 100644 index 0000000..2eca9c5 --- /dev/null +++ b/driver.cpp @@ -0,0 +1,15 @@ +// License: AGPLv3 or later. https://www.gnu.org/licenses/licenses.html + +#include + +#include "auxiliary.h" +#include "cfc.h" + +using namespace std; + +int main (const int argc, const char* const argv[]) +{ + processArguments progArgs(argc, argv); + driver runProgram(progArgs); + return 0; +} diff --git a/general_functions.cpp b/general_functions.cpp new file mode 100644 index 0000000..e3f840d --- /dev/null +++ b/general_functions.cpp @@ -0,0 +1,207 @@ +// License: AGPLv3 or later. https://www.gnu.org/licenses/licenses.html + +#include +#include +#include +#include +#include +#include +#include + +#include "general_functions.h" + +using namespace std; + +bool is_natural_number(const char* c_str) +{ + bool answer = false; + if (is_whole_number(c_str)) + { + if (stoi(c_str) > 0) + { + answer = true; + } + } + return answer; +} + +bool is_whole_number(const char* c_str) +{ + bool answer = false; + int c_str_length = strlen(c_str); + if (c_str_length < 1) + { + // nothing needs to be done + } + else if (! isdigit(c_str[0])) + { + // nothing needs to be done + } + else + { + answer = true; + // c_str[0] is checked in else if statement. + for (int i=1; i < (c_str_length-1); i++) + if (! isdigit(c_str[i])) + { + answer = false; + } + } + return answer; +} + +void get_textfile_lines(string filename, vector &file_lines) +{ + ifstream file(filename); + + if (! file.good()) + { + cerr << "Failed to open/read file: " << filename\ + << ". Non-exhaustive list of possible reasons:\n"\ + << "1. File does not exist.\n"\ + << "2. Unable to read file due to:\n"\ + << "2.1 Don't have read access to file\n"\ + << "2.2 File is opened elsewhere and some program have a "\ + << "lock on file.\n"; + exit(2); + } + +// cout << "Reading file: " << filename << endl; + + int i=0; + while (file.good()) + { + file_lines.push_back(""); + getline(file, file_lines[i]); + i++; + } + + file.close(); +} + +int random_int(int minimum, int maximum) +{ + static random_device seed; + static mt19937 random_number_generator(seed()); + uniform_int_distribution range( + minimum, maximum); + return range(random_number_generator); +} + +// SOURCE: cppreference.com +float random_float(float minimum, float maximum) +{ + static random_device seed; + static mt19937 random_number_generator(seed()); + uniform_real_distribution<> range( + minimum, maximum); + return range(random_number_generator); +} + +void string_to_vector( + string &a_string, + vector &str_vector, + char delimeter) +{ + stringstream str_stream(a_string); + string str = ""; + while(getline(str_stream, str, delimeter)) + { + if (str.length() > 1 and str != "\n") + { + str_vector.push_back(str); + } + } +} + +void pick_random_string( + string &str, const vector &str_vector) +{ + int vector_size = str_vector.size(); + if (vector_size < 1) + { + str = ""; + } + else + { + int i = random_int(0, vector_size-1); + str = str_vector[i]; + } +} + +int modulate(int number, int modulus) +{ + int after_modulation; + if (number >= 0) + { + after_modulation = number % modulus; + } + else if (number < 0) + { + after_modulation = ( + modulus - (absolute_number(number)%modulus)); + } + else + { + // OK, I know this is too much + cerr_and_exit( + 2, + "internal", + __FILE__, + __func__, + __LINE__, + "argument 1 'number' is neither >=0 nor < 0. " + "NOTE: this is just hypothetical situation following " + "defensive programming and should never happen in practice" + ); + } + return after_modulation; +} + + +void cerr_and_exit( + int exit_code, + string error_name, + string file_name, + string function_name, + int line_number, + string additional_message) +{ + cerr_only( + error_name, + file_name, + function_name, + line_number, + additional_message); + exit(exit_code); +} + +void cerr_only( + string error_name, + string file_name, + string function_name, + int line_number, + string additional_message) +{ + if (error_name.size() > 0) + { + error_name[0] = toupper(error_name[0]); + if (error_name[-1] != ' ') + { + error_name += ' '; + } + } + cerr + << error_name << "error occured at:\n" + << "Source code file name: " << file_name << "\n" + << "Function name: " << function_name << "\n" + << "Line number: " << line_number << "\n" + << additional_message; + if (additional_message != "") + { + if (additional_message[-1] != '\n') + { + cerr << '\n'; + } + } +} diff --git a/general_functions.h b/general_functions.h new file mode 100644 index 0000000..ea6bdf3 --- /dev/null +++ b/general_functions.h @@ -0,0 +1,82 @@ +// License: AGPLv3 or later. https://www.gnu.org/licenses/licenses.html + +#ifndef _GENERAL_FUNCTIONS_H_ +#define _GENERAL_FUNCTIONS_H_ + +#include +#include + +bool is_natural_number(const char* c_str); + +bool is_whole_number(const char* c_str); + +void get_textfile_lines( + std::string filename, std::vector &file_lines); + +int random_int(int minimum, int maximum); + +float random_float(float minimum, float maximum); + +int modulate(int number, int modulus); + +void cerr_and_exit( + int exit_code, + std::string error_name, + std::string file_name, + std::string function_name, + int line_number, + std::string additional_message = ""); + +void cerr_only( + std::string error_name, + std::string file_name, + std::string function_name, + int line_number, + std::string additional_message); + +/* Its a good practice to prototype all functions including which are + * defined in header file itself such as inline functions before defining + * any function. This way, even if we use one function in another + * function, we do not have to worry about function undefined error + * possibilities. + */ + +inline int absolute_number(int number); + +inline int smaller_number(int a, int b); + +inline int bigger_number(int a, int b); + +inline int absolute_number(int number) +{ + if (number < 0) + return -(number); + else + return number; +} + +inline int smaller_number(int a, int b) +{ + if (a > b) + return b; + else + return a; +} + +inline int bigger_number(int a, int b) +{ + if (a < b) + return b; + else + return a; +} + +void string_to_vector( + std::string &a_string, + std::vector &str_vector, + char delimeter = ','); + +void pick_random_string( + std::string &str, const std::vector &str_vector); + +#endif diff --git a/makefile b/makefile new file mode 100644 index 0000000..ac92622 --- /dev/null +++ b/makefile @@ -0,0 +1,28 @@ +# License: AGPLv3 or later. https://www.gnu.org/licenses/licenses.html + +compiler = "CC" +standardCpp11 = "--std=c++11" + +ifeq ($(compiler), "CC") +# gcc, g++, clang etc. follows double-dash '--' convention for non one +# character arguments but banshee CC uses single dash '-' +standardCpp11 = "-std=c++11" +endif + +CFC: auxiliary.o cfc.o driver.o general_functions.o libgenVal.a + $(compiler) $(standardCpp11) -o CFC *.o libgenVal.a + +auxiliary.o: auxiliary.cpp general_functions.h + $(compiler) $(standardCpp11) -c auxiliary.cpp + +cfc.o: cfc.cpp general_functions.h generateValue.h + $(compiler) $(standardCpp11) -c cfc.cpp + +driver.o: driver.cpp auxiliary.h cfc.h + $(compiler) $(standardCpp11) -c driver.cpp + +general_functions.o: general_functions.cpp + $(compiler) $(standardCpp11) -c general_functions.cpp + +clean: + rm *.o diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..a317940 --- /dev/null +++ b/readme.txt @@ -0,0 +1,27 @@ +# License: AGPLv3 or later. https://www.gnu.org/licenses/licenses.html + +NOTE: will not compile if libgenVal.a and generateValue.h are missing +NOTE 2: general_function.h & general_function.cpp files are carried from previous assignments and additional functions related to this assignment added. + +Compile on banshee as: +$ gmake +OR +$ gmake CFC +OR +$ CC -std=c++11 -o CFC *.cpp libgenVal.a + +Assumptions and program behaviour +In: +int difference = Mint1 - Mint2; +both Mint have same modulus, otherwise, it would not make sense. +Plus In: +int difference = Melt2 - Melt2; +Both Mint and Melt, return an int even though usual expected return for operator-() is another object of same type. This is as per specification, Codeword expects an int return when calculating difference bewtween two objects of same type. + +If user give number to Mint object higher than its modulus or less than 0 than Mint itself modulates it before storing in int number variable. So, number passed to Mint and returned by calling Mint.getNumber() function may not be same. NOTE: this is a hypothetical scenerio when someone else may use our written classes and functions as library. The program itself gives number which is within modulus range. + +Error exit code list: +[For exact cause, see stderr] +1 - error related to arguments +2 - Program internal hypothetical errors which should never happen. +3 - Technically possible errors but which should not happen within the runtime of this program.