You will create a C++ program that can evaluate arithmetic operators with intege
ID: 3788721 • Letter: Y
Question
You will create a C++ program that can evaluate arithmetic operators with integer numbers having any number of digits. These numbers are an alternative to xed size integers or oating point numbers that always have a maximum number of accurate digits (dependent on size of CPU register).
The input is a regular text le, where each line is terminated with an end-of-line character(s). Each line will containanarithmeticoperationbetweentwonumbers. Theprogramshoulddisplaytheinputexpressionand the results, separated with =.
The main program should be called ”innitearithmetic”.
infinitearithmetic "input=<file name>;digitsPerNode=<number>".
The following is the pseudocode
// DoubleLinkedList.h
struct Node {
long long num;
Node* prev;
Node* next;
};
class DoubleLinkedList {
public:
DoubleLinkedList(); // default construct
~DoubleLinkedList(); // deconstruct
DoubleLinkedList(const std::string& num, int digitsPerNode); // user defined construct
DoubleLinkedList(const DoubleLinkedList& list); // copy construct
DoubleLinkedList& operator = (const DoubleLinkedList& list); // assignment consturct
public:
DoubleLinkedList operator + (const DoubleLinkedList& list) const;
DoubleLinkedList operator * (const DoubleLinkedList& list) const;
// optional
DoubleLinkedList operator - (const DoubleLinkedList& list) const;
// 10% extra
DoubleLinkedList operator / (const DoubleLinkedList& list) const;
// 20% extra
DoubleLinkedList Sqrt(const DoubleLinkedList& list) const;
public:
const Node* GetHead() const;
const Node* GetTail() const;
void Append(Node* node);
void Print() const;
private:
Node* head;
Node* tail;
int m_digitsPerNode;
long long remainder; // for / operator
float decimal; // for sqrt() 7 valid digits.
}
// main.cpp
#include "ArgumentManager.h"
int main(int argc, char* argv[])
{
if (argc < 2) {
std::cerr("Usage: infinitearithmetic "filename=xyz.txt;digitsPerNode=<number>" ");
}
ArgumentManager am(argc, argv);
std::string filename = am.get("filename");
int digitsPerNode = std::stoi(am.get("digitsPerNode"));
std::ifstream ifs(filename.c_str());
std::string line;
while (getline(ifs, line)){
std::string num1;
std::string num2;
std::string op;
// get num1 num2 and operator in line
// ...
DoubleLinkedList l1(num1, digitsPerNode); // DoubleLinkedList(const std::string& num, int digitsPerNode)
DoubleLinkedList l2(num2, digitsPerNode);
DoubleLinkedList l(); // DoubleLinkedList();
if (/* plus */)
{l = l1 + l2;} // DoubleLinkedList operator + (const DoubleLinkedList& list) const; DoubleLinkedList& operator = (const DoubleLinkedList& list);
else if (/* mult */) // DoubleLinkedList operator * (const DoubleLinkedList& list) const;
{l = l1 * l2;}
else if (/* div */)
{l = l1 / l2;} // DoubleLinkedList operator / (const DoubleLinkedList& list) const;
else if (...)
{//...}
else {
// ...
}
// output result
}
return 0;
}
Explanation / Answer
// DoubleLinkedList.h
struct Node {
long long num;
Node* prev;
Node* next;
};
class DoubleLinkedList {
public:
DoubleLinkedList(); // default construct
~DoubleLinkedList(); // deconstruct
DoubleLinkedList(const std::string& num, int digitsPerNode); // user defined construct
DoubleLinkedList(const DoubleLinkedList& list); // copy construct
DoubleLinkedList& operator = (const DoubleLinkedList& list); // assignment consturct
public:
DoubleLinkedList operator + (const DoubleLinkedList& list) const;
DoubleLinkedList operator * (const DoubleLinkedList& list) const;
// optional
DoubleLinkedList operator - (const DoubleLinkedList& list) const;
// 10% extra
DoubleLinkedList operator / (const DoubleLinkedList& list) const;
// 20% extra
DoubleLinkedList Sqrt(const DoubleLinkedList& list) const;
public:
const Node* GetHead() const;
const Node* GetTail() const;
void Append(Node* node);
void Print() const;
private:
Node* head;
Node* tail;
int m_digitsPerNode;
long long remainder; // for / operator
float decimal; // for sqrt() 7 valid digits.
}
// main.cpp
#include<iostream.h>
#include "ArgumentManager.h"
int main(int argc, char* argv[])
{
if (argc < 2) {
std::cerr("Usage: infinitearithmetic "filename=xyz.txt;digitsPerNode=<number>" ");
}
ArgumentManager am(argc, argv);
std::string filename = am.get("filename");
int digitsPerNode = std::stoi(am.get("digitsPerNode"));
std::ifstream ifs(filename.c_str());
std::string line;
while (getline(ifs, line)){
std::string num1;
std::string num2;
std::string op;
cout<<"enter num1 and num2 "
cin>>num1>>num2
DoubleLinkedList l1(num1, digitsPerNode); // DoubleLinkedList(const std::string& num, int digitsPerNode)
DoubleLinkedList l2(num2, digitsPerNode);
DoubleLinkedList l(); // DoubleLinkedList();
if (+)
{l = l1 + l2;} // DoubleLinkedList operator + (const DoubleLinkedList& list) const; DoubleLinkedList& operator = (const DoubleLinkedList& list);
else if (*) // DoubleLinkedList operator * (const DoubleLinkedList& list) const;
{l = l1 * l2;}
else if (/)
{l = l1 / l2;} // DoubleLinkedList operator / (const DoubleLinkedList& list) const;
else if (-)
{l=l1-l2;}
else {
l=sqrt(l1)
}
cout<<l;
}
return 0;
}
Explanation
sample input
2+3
5*5
1000+5
sample output
2+3=5
5*5=25
1000+5=1005
Advanced operation
sqrt(49)=7
22/3=7, remainder=1
Assumptios:
Example of numbers stored as a list of nodes of 2 digits:
182 stored as {1,82} or {18,2}
232496 stored as {23,24,96}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.