#include #include #include using namespace std; /* *------> x |0 1 2 |3 4 5 |6 7 8 ↓ y */ class Image { uint mx; uint my; uint* data; public: Image(uint tmx, uint tmy) { // Должен инициализировать изображение 0 mx = tmx; my = tmy; data = (uint*)malloc(sizeof(uint) * mx * my); for (uint y = 0; y < my; y++) { for (uint x = 0; x < mx; x++) { data[mx * y + x] = 27; } } } void freemem() { free(data); } int getMx() { return mx; } int getMy() { return my; } void show() { // Должен выдавать на экран изображение при помощи printf или std::cout for (uint y = 0; y < my; y++) { for (uint x = 0; x < mx; x++) { cout << "\033[48;5;" << data[mx * y + x] << "m \033[0m"; } cout << "\n"; } cout << "\n"; } int get(uint x, uint y) { return data[mx * (y) + (x)]; } void set(uint x, uint y, uint color) { if (x >= mx) { throw(x); } if (y >= my) { throw(y); } data[mx * (y) + (x)] = color; } void copy(Image& original) { freemem(); mx = original.getMx(); my = original.getMy(); data = (uint*)malloc(sizeof(uint) * mx * my); for (uint y = 0; y < my; y++) { for (uint x = 0; x < mx; x++) { data[mx * y + x] = original.get(x, y); } } } // Returns true if equal bool compare(Image& original) { if (original.getMx() == mx && original.getMy() == my) { for (uint y = 0; y < my; y++) { for (uint x = 0; x < mx; x++) { if (data[mx * y + x] != original.get(x, y)) { cout << "Not equal: x = " << x << "; y = " << y << "\n"; return false; } } } return true; } else { cout << "original size: " << original.getMx() << "x" << original.getMy() << "\n"; cout << "current size: " << mx << "x" << my << "\n"; return false; } } void draw_horizontal(uint y, uint color) { if (y >= my) { throw(y); } for (uint x = 0; x < mx; x++) { data[mx * y + x] = color; } } void draw_vertical(uint x, uint color) { if (x >= mx) { throw(x); } for (uint y = 0; y < my; y++) { data[mx * y + x] = color; } } void save_to_file(string filename) { ofstream writefile; writefile.open(filename); if (writefile.is_open()) { writefile << mx << "\n" << my << "\n"; for (uint y = 0; y < my; y++) { for (uint x = 0; x < mx; x++) { writefile << data[mx * y + x] << "\n"; } } writefile << "\n"; writefile.close(); } else { cerr << "saving to file failed\n"; } } void read_from_file(string filename) { string line; ifstream readfile; readfile.open(filename); if (readfile.is_open()) { try { getline(readfile, line); mx = stoi(line); getline(readfile, line); my = stoi(line); for (uint y = 0; y < my; y++) { for (uint x = 0; x < mx; x++) { getline(readfile, line); data[mx * y + x] = stoi(line); } } } catch (const exception& e) { cerr << e.what() << '\n'; } } else { cerr << "reading file failed"; } readfile.close(); } }; Image a(30, 10); Image b(25, 15); int main() { cout << "Image a \n"; a.show(); cout << "Image b \n"; b.show(); b.copy(a); if (b.compare(a) == true) { cout << "a == b after copy\n"; } else { cout << "a != b after copy!\n"; } b.set(4, 3, 20); for (int i = 5; i < 9; i++) { b.set(i, 5, 45); } b.set(9, 3, 20); cout << "Image b, copied from a and edited \n"; b.show(); b.draw_horizontal(8, 214); cout << "Image b, with a horizontal line \n"; b.show(); b.save_to_file("image"); a.read_from_file("image"); cout << "Image a, read from file \n"; a.show(); a.freemem(); b.freemem(); return 0; }