Answered step by step
Verified Expert Solution
Link Copied!

Question

1 Approved Answer

c++ /* This file is known as calculator02buggy.cpp I have inserted 5 errors that should cause this not to compile I have inserted 3 logic

image text in transcribed c++

/* This file is known as calculator02buggy.cpp I have inserted 5 errors that should cause this not to compile I have inserted 3 logic errors that should cause the program to give wrong results First try to find an remove the bugs without looking in the book. If that gets tedious, compare the code to that in the book (or posted source code) Happy hunting! */ #include "../std_lib_facilities.h" //------------------------------------------------------------------------------ lass Token { public: char kind; // what kind of token double value; // for numbers: a value Token(char ch) // make a Token from a char :kind(ch), value(0) { } Token(char ch, double val) // make a Token from a char and a double :kind(ch), value(val) { } }; //------------------------------------------------------------------------------ class Token_stream { public: Token_stream(); // make a Token_stream that reads from cin Token get(); // get a Token (get() is defined elsewhere) void putback(Token t); // put a Token back private: bool full; // is there a Token in the buffer? Token buffer; // here is where we keep a Token put back using putback() }; //------------------------------------------------------------------------------ // The constructor just sets full to indicate that the buffer is empty: Token_stream::Token_stream() :full(false), buffer(0) // no Token in buffer { } //------------------------------------------------------------------------------ // The putback() member function puts its argument back into the Token_stream's buffer: void Token_stream::putback(Token t) { if (full) error("putback() into a full buffer"); buffer = t; // copy t to buffer full = true; // buffer is now full } //------------------------------------------------------------------------------ Token get() { if (full) { // do we already have a Token ready? // remove token from buffer full=false; return buffer; } char ch; cin >> ch; // note that >> skips whitespace (space, newline, tab, etc.) switch (ch) { case ';': // for "print" case 'q': // for "quit" case '(': case ')': case '+': case '-': case '*': case '/': return Token(ch); // let each character represent itself case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '9': { cin.putback(ch); // put digit back into the input stream double val; cin >> val; // read a floating-point number return Token('8',val); // let '8' represent "a number" } default: error("Bad token"); } } //------------------------------------------------------------------------------ Token_stream ts; // provides get() and putback() //------------------------------------------------------------------------------ double expression(); // declaration so that primary() can call expression() //------------------------------------------------------------------------------ // deal with numbers and parentheses double primary() { Token t = ts.get(); switch (t.kind) { case '(': // handle '(' expression ')' { double d = expression(); t = ts.get(); if (t.kind != ')') error("')' expected); return d; } case '8': // we use '8' to represent a number return t.value; // return the number's value default: error("primary expected"); } } //------------------------------------------------------------------------------ // deal with *, /, and % double term() { double left = primary(); Token t = ts.get(); // get the next token from token stream while(true) { switch (t.kind) { case '*': left *= primary(); t = ts.get(); case '/': { double d = primary(); if (d == 0) error("divide by zero"); left /= d; t = ts.get(); break; } default: ts.putback(t); // put t back into the token stream return left; } } } //------------------------------------------------------------------------------ // deal with + and - double expression() { double left = term(; // read and evaluate a Term Token t = ts.get(); // get the next token from token stream while(true) { switch(t.kind) { case '+': left += term(); // evaluate Term and add t = ts.get(); break; case '-': left += term(); // evaluate Term and subtract t = ts.get(); break; default: ts.putback(t); // put t back into the token stream return left; // finally: no more + or -: return the answer } } } //------------------------------------------------------------------------------ int main() try { while (cin) { Token t = ts.get(); if (t.kind == 'q') break; // 'q' for quit if (t.kind == ';') // ';' for "print now" cout  

Headerfile

/* simple "Programming: Principles and Practice using C++" course header to be used for the first few weeks. It provides the most common standard headers (in the global namespace) and minimal exception/error support. Students: please don't try to understand the details of headers just yet. All will be explained. This header is primarily used so that you don't have to understand every concept all at once. Revised April 25, 2010: simple_error() added */ #ifndef H112 #define H112 201004L #include #include #include #include #include #include #include #include #include #include //------------------------------------------------------------------------------ #ifdef _MSC_VER #include  using stdext::hash_map; #else #include  using __gnu_cxx::hash_map; namespace __gnu_cxx { template struct hash<:string> { size_t operator()(const std::string& s) const { return hash()(s.c_str()); } }; } // of namespace __gnu_cxx #endif //------------------------------------------------------------------------------ #define unordered_map hash_map //------------------------------------------------------------------------------ typedef long Unicode; //------------------------------------------------------------------------------ using namespace std; template string to_string(const T& t) { ostringstream os; os  struct Vector : public std::vector { typedef typename std::vector::size_type size_type; Vector() { } explicit Vector(size_type n) :std::vector(n) {} Vector(size_type n, const T& v) :std::vector(n,v) {} template  Vector(I first, I last) :std::vector(first,last) {} T& operator[](unsigned int i) // rather than return at(i); { if (isize()::operator[](i); } const T& operator[](unsigned int i) const { if (isize()::operator[](i); } }; // disgusting macro hack to get a range checked vector: #define vector Vector // trivially range-checked string (no iterator checking): struct String : std::string { String() { } String(const char* p) :std::string(p) {} String(const string& s) :std::string(s) {} template String(S s) :std::string(s) {} String(int sz, char val) :std::string(sz,val) {} template String(Iter p1, Iter p2) : std::string(p1,p2) { } char& operator[](unsigned int i) // rather than return at(i); { if (i struct hash { size_t operator()(const String& s) const { return hash<:string>()(s); } }; } // of namespace __gnu_cxx #endif struct Exit : runtime_error { Exit(): runtime_error("Exit") {} }; // error() simply disguises throws: inline void error(const string& s) { throw runtime_error(s); } inline void error(const string& s, const string& s2) { error(s+s2); } inline void error(const string& s, int i) { ostringstream os; os  char* as_bytes(T& i) // needed for binary I/O { void* addr = &i; // get the address of the first byte // of memory used to store the object return static_cast(addr); // treat that memory as bytes } inline void keep_window_open() { cin.clear(); cout > ch; return; } inline void keep_window_open(string s) { if (s=="") return; cin.clear(); cin.ignore(120,' '); for (;;) { cout > ss && ss!=s) cout  inline ios_base& general(ios_base& b) // to augment fixed and scientific { b.setf(ios_base::fmtflags(0),ios_base::floatfield); return b; } // run-time checked narrowing cast (type conversion): template R narrow_cast(const A& a) { R r = R(a); if (A(r)!=a) error(string("info loss")); return r; } inline int randint(int max) { return rand()%max; } inline int randint(int min, int max) { return randint(max-min)+min; } inline double sqrt(int x) { return sqrt(double(x)); } // to match C++0x #endif 
This drill involves a series of modifications of a buggy program to turn it from something useless into something reasonably useful. Take the calculator from the file calculator02buggy.cpp. Get it to compile. You need to find and fix a few bugs. Those bugs are not in the text in the book. Find the three logic errors deviously inserted in calculator02buggy.cpp and remove them so that the calculator produces correct results. Change the character used as the exit command from q to x. Change the character used as the print command from:to =. Add a greeting line in main(): "Welcome to our simple calculator. Please enter expressions using floating-point numbers." Improve that greeting by mentioning which operators are available and how to print and exit

Step by Step Solution

There are 3 Steps involved in it

Step: 1

blur-text-image

Get Instant Access to Expert-Tailored Solutions

See step-by-step solutions with expert insights and AI powered tools for academic success

Step: 2

blur-text-image

Step: 3

blur-text-image

Ace Your Homework with AI

Get the answers you need in no time with our AI-driven, step-by-step assistance

Get Started

Students also viewed these Databases questions

Question

1. Define and explain culture and its impact on your communication

Answered: 1 week ago