soustavy/soustavy.cpp
2023-11-21 12:56:20 +01:00

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