Question
The main.cpp and canvas.h are provided, these files are not to be edited only used to implement canvas.cpp file to allocate the arrays . Only
The main.cpp and canvas.h are provided, these files are not to be edited only used to implement canvas.cpp file to allocate the arrays.
Only use basic c++ statements: if/else, for loops, basic arrays, allocate arrays, pointers(using *, or arrow ->), reference and dereference(using ampersand: &) ,keywords: new and delete.
"Simulate" a 2D array by a 1D array of pointers to 1D arrays
Create a C++ program implementing a class that represents ASCII art images and operations on them, respresented as two-dimensional char arrays allocated on the heap (using the new keyword).
Create a new C++ source file named canvas.cpp that implements the Canvas class, so that canvas.cpp and the provided files compile into a program that runs with no failed tests.
main.cpp file:
#include#include #include #include "canvas.h" using namespace std; inline void _test(const char* expression, const char* file, int line) { cerr << "test(" << expression << ") failed in file " << file; cerr << ", line " << line << "." << endl; abort(); } #define test(EXPRESSION) ((EXPRESSION) ? (void)0 : _test(#EXPRESSION, __FILE__, __LINE__)) void interactive_mode(char ink, int scale) { cout << "Enter a string and press Enter "; cout << "to see the ASCII art version." << endl; while (cin) { string line; getline(cin, line); string invalid_chars; for (int i = 0; i < line.size(); ++i) if (line[i] < 'A' || line[i] > 'D') invalid_chars += line[i]; if (invalid_chars.size() > 0) { cout << " String contained invalid chars: "; for (int i = 0; i < invalid_chars.size(); ++i) { cout << "'" << invalid_chars[i] << "'"; if (i != invalid_chars.size() - 1) cout << ", "; } cout << "." << endl; } else { Canvas C(line); C.replace('#', ink); for (int i = 1; i < scale; ++i) C.embiggen(); cout << C.to_string(); } } exit(0); } int main() { // Interactive mode. // Uncomment the "interactive_mode..." line below to // use your Canvas implementation interactively. // // The first parameter specifies the character used to fill letters. // The second parameter specifies how large the canvas is scaled. // // interactive_mode('@', 2); Canvas C1(3, 3); test(C1.width() == 3); test(C1.height() == 3); test(C1.to_string() == string(" ") + " " + " "); Canvas C2(4, 6); test(C2.width() == 4); test(C2.height() == 6); test(C2.to_string() == string(" ") + " " + " " + " " + " " + " "); Canvas C3('A'); test(C3.width() == 5); test(C3.height() == 5); test(C3.to_string() == string(" ### ") + "# # " + "##### " + "# # " + "# # "); Canvas C4('B'); test(C4.width() == 5); test(C4.height() == 5); test(C4.to_string() == string("#### ") + "# # " + "#### " + "# # " + "#### "); Canvas C5('C'); test(C5.width() == 5); test(C5.height() == 5); test(C5.to_string() == string(" #### ") + "# " + "# " + "# " + " #### "); Canvas C6('D'); test(C6.width() == 5); test(C6.height() == 5); test(C6.to_string() == string("#### ") + "# # " + "# # " + "# # " + "#### "); Canvas C7('E'); test(C7.width() == 5); test(C7.height() == 5); test(C7.to_string() == string(" ") + " " + " " + " " + " "); C4.replace('#', '@'); test(C4.to_string() == string("@@@@ ") + "@ @ " + "@@@@ " + "@ @ " + "@@@@ "); C4.replace(' ', '-'); test(C4.to_string() == string("@@@@- ") + "@---@ " + "@@@@- " + "@---@ " + "@@@@- "); C4.replace('-', '@'); test(C4.to_string() == string("@@@@@ ") + "@@@@@ " + "@@@@@ " + "@@@@@ " + "@@@@@ "); Canvas C8(2, 6); C8.replace(' ', 'X'); test(C8.to_string() == string("XX ") + "XX " + "XX " + "XX " + "XX " + "XX "); Canvas C9('A'); C9.embiggen(); test(C9.width() == 10); test(C9.height() == 10); test(C9.to_string() == string(" ###### ") + " ###### " + "## ## " + "## ## " + "########## " + "########## " + "## ## " + "## ## " + "## ## " + "## ## "); Canvas C10('B'); C10.embiggen(); test(C10.width() == 10); test(C10.height() == 10); test(C10.to_string() == string("######## ") + "######## " + "## ## " + "## ## " + "######## " + "######## " + "## ## " + "## ## " + "######## " + "######## "); Canvas C11(2, 3); C11.embiggen(); test(C11.width() == 4); test(C11.height() == 6); C11.embiggen(); test(C11.width() == 8); test(C11.height() == 12); C11.embiggen(); test(C11.width() == 16); test(C11.height() == 24); Canvas C12("A"); test(C12.width() == 5); test(C12.height() == 5); test(C12.to_string() == string(" ### ") + "# # " + "##### " + "# # " + "# # "); Canvas C13("AB"); test(C13.width() == 12); test(C13.height() == 5); test(C13.to_string() == string(" ### #### ") + "# # # # " + "##### #### " + "# # # # " + "# # #### "); Canvas C14("CAB"); test(C14.width() == 19); test(C14.height() == 5); test(C14.to_string() == string(" #### ### #### ") + "# # # # # " + "# ##### #### " + "# # # # # " + " #### # # #### "); Canvas C15("!BAD!"); test(C15.width() == 33); test(C15.height() == 5); test(C15.to_string() == string(" #### ### #### ") + " # # # # # # " + " #### ##### # # " + " # # # # # # " + " #### # # #### "); Canvas C16("DAD CAB"); test(C16.width() == 47); test(C16.height() == 5); test(C16.to_string() == string("#### ### #### #### ### #### ") + "# # # # # # # # # # # " + "# # ##### # # # ##### #### " + "# # # # # # # # # # # " + "#### # # #### #### # # #### "); cout << "Assignment complete." << endl; }
canvas.h file:
#ifndef CANVAS_H #define CANVAS_H #includeusing namespace std; // In this homework, you'll manipulate ASCII art images // consisting of a rectangular grid of chararacter pixels. class Canvas { public: // Allocates a canvas of the given width and height // consisting of ' ' chars. Canvas(int width, int height); // Allocates a canvas with width 5 and height 5 that looks like: // // ### #### #### #### // # # # # # # # // ##### or #### or # or # # // # # # # # # # // # # #### #### #### // // depending upon which character ('A', 'B', 'C', or 'D') is // given as a parameter. If some other character is given, // allocates a canvas of ' ' chars with width 5 and height 5. Canvas(char x); // Allocates a canvas containing the sequence of characters // in the string with 2 columns of space between each pair // of adjacent characters. For instance, Canvas("BADCAB") // should yield: // // #### ### #### #### ### #### // # # # # # # # # # # # // #### ##### # # # ##### #### // # # # # # # # # # # # // #### # # #### #### # # #### // // Any characters in s not from {'A', 'B', 'C', 'D'} should be // replaced with empty 5x5 space, just like previous constructor. Canvas(string s); // Returns the width of the canvas. int width(); // Returns the height of the canvas. int height(); // Returns the entire canvas as a single string, consisting of each row // of the canvas, followed by endl. string to_string(); // Replaces every instance in the canvas of old_char with new_char. // For instance, if old_char is '#' and new char is '@', then: // // ### @@@ // # # @ @ // ##### becomes @@@@@ // # # @ @ // # # @ @ // void replace(char old_char, char new_char); // Returns a new canvas twice the width and height, where each pixel // in the old canvas corresponds to a 2x2 region of pixels in the new canvas. // // For instance: // // ### ###### // # # ###### // ##### becomes ## ## // # # ## ## // # # ########## // ########## // ## ## // ## ## // ## ## // ## ## // void embiggen(); // Destructor. Deallocates all of the memory allocated by the canvas. ~Canvas(); private: // A canvas is represented as a 2D char array, i.e. // an array of pointers to char (sub)arrays. // Each subarray corresponds to a column of the image. char** C; int _width; int _height; }; #endif
Step by Step Solution
There are 3 Steps involved in it
Step: 1
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started