176 lines
4.4 KiB
C++
176 lines
4.4 KiB
C++
// soustavy.cpp : This file contains the 'main' function. Program execution begins and ends there.
|
|
//
|
|
|
|
#include <iostream>
|
|
#include <vector>
|
|
#include <windows.h>
|
|
|
|
static HANDLE s_console;
|
|
|
|
#define COLOR_TEXT 0b0111
|
|
#define COLOR_ZERO 0b1000
|
|
#define COLOR_PIVOT_OK 0b1010
|
|
#define COLOR_PIVOT_BAD 0b1100
|
|
#define COLOR_OTHER 0b1111
|
|
#define COLOR_BVEC 0b0111
|
|
|
|
void Color(WORD color) {
|
|
SetConsoleTextAttribute(s_console, color);
|
|
}
|
|
|
|
class Matrix {
|
|
size_t m_m;
|
|
size_t m_n;
|
|
std::vector<float> m_data;
|
|
|
|
public:
|
|
Matrix(size_t m, size_t n) : m_m(m), m_n(n), m_data(m* n) {}
|
|
float& At(size_t i, size_t j) { return m_data[i * m_n + j]; }
|
|
void Print(const char* format) {
|
|
size_t min_pivot = 0;
|
|
for (size_t i = 0; i < m_m; ++i) {
|
|
size_t pivot = 0;
|
|
for (size_t j = 0; j < m_n; ++j) {
|
|
auto val = At(i, j);
|
|
WORD color = COLOR_OTHER;
|
|
|
|
if (j == m_n - 1) {
|
|
color = COLOR_BVEC;
|
|
}
|
|
else if (std::abs(val) < 0.00001f) {
|
|
if (pivot == j) ++pivot;
|
|
color = COLOR_ZERO;
|
|
|
|
}
|
|
else if (pivot == j) {
|
|
color = pivot >= min_pivot ? COLOR_PIVOT_OK : COLOR_PIVOT_BAD;
|
|
min_pivot = pivot + 1;
|
|
}
|
|
|
|
if (j == m_n - 1) {
|
|
Color(COLOR_TEXT);
|
|
printf(" |");
|
|
}
|
|
|
|
Color(color);
|
|
printf(format, val);
|
|
}
|
|
printf("\n");
|
|
}
|
|
Color(COLOR_TEXT);
|
|
}
|
|
|
|
};
|
|
|
|
template <class T>
|
|
T Input(const char* prompt) {
|
|
std::cout << prompt << " = ";
|
|
T a;
|
|
std::cin >> a;
|
|
return a;
|
|
}
|
|
|
|
int main() {
|
|
s_console = GetStdHandle(STD_OUTPUT_HANDLE);
|
|
Color(COLOR_TEXT);
|
|
|
|
auto m = Input<size_t>("m");
|
|
auto n = Input<size_t>("n");
|
|
|
|
std::vector<Matrix> history;
|
|
|
|
{
|
|
Matrix mat(m, n);
|
|
|
|
for (size_t i = 0; i < m; ++i) {
|
|
for (size_t j = 0; j < n; ++j) {
|
|
//mat.At(i, j) = 0.0f;
|
|
std::cin >> mat.At(i, j);
|
|
}
|
|
}
|
|
|
|
history.push_back(mat);
|
|
}
|
|
|
|
|
|
printf("\nupravy:\n s <i1> <i2> ....... prohodit radky i1 a i2\n m <i> <k> ......... vynasobit radek i konstantou k\n a <k> <i1> <i2> ... pricist k-nasobek i1 k i2\n f <format> ........ zmenit format vystupu\n u ................. undo\n");
|
|
|
|
std::string fmt("%4.0f");
|
|
while (true) {
|
|
history.push_back(history.back());
|
|
auto& mat = history.back();
|
|
|
|
printf("\n");
|
|
mat.Print(fmt.c_str());
|
|
printf("\n? ");
|
|
|
|
char op;
|
|
size_t i1, i2;
|
|
float k, temp;
|
|
|
|
|
|
std::cin >> op;
|
|
switch (op) {
|
|
case 's': {
|
|
std::cin >> i1 >> i2;
|
|
--i1; --i2;
|
|
for (size_t j = 0; j < n; ++j) {
|
|
temp = mat.At(i1, j);
|
|
mat.At(i1, j) = mat.At(i2, j);
|
|
mat.At(i2, j) = temp;
|
|
}
|
|
break;
|
|
}
|
|
case 'm': {
|
|
std::cin >> i1 >> k;
|
|
--i1;
|
|
for (size_t j = 0; j < n; ++j)
|
|
mat.At(i1, j) *= k;
|
|
break;
|
|
}
|
|
case 'a': {
|
|
std::cin >> k >> i1 >> i2;
|
|
--i1; --i2;
|
|
for (size_t j = 0; j < n; ++j)
|
|
mat.At(i2, j) += mat.At(i1, j) * k;
|
|
break;
|
|
}
|
|
case 'f':
|
|
std::cin >> fmt;
|
|
break;
|
|
|
|
case 'u':
|
|
if (history.size() > 2) {
|
|
history.pop_back();
|
|
history.pop_back();
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//printf("m(%u) n(%u)\n", m, n);
|
|
|
|
|
|
|
|
std::cout << "Hello World!\n";
|
|
}
|
|
|
|
// Run program: Ctrl + F5 or Debug > Start Without Debugging menu
|
|
// Debug program: F5 or Debug > Start Debugging menu
|
|
|
|
// Tips for Getting Started:
|
|
// 1. Use the Solution Explorer window to add/manage files
|
|
// 2. Use the Team Explorer window to connect to source control
|
|
// 3. Use the Output window to see build output and other messages
|
|
// 4. Use the Error List window to view errors
|
|
// 5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
|
|
// 6. In the future, to open this project again, go to File > Open > Project and select the .sln file
|