input.txt 2 4 4 42 1 2 7 46 2 2 0 14 #include #include #include #include using namespace std; const int M = 3; // pocet radku const int N = 4; // pocet sloupcu typedef double T; // typ T = double void clear(T p[M][N]) { for (int i = 0; i < M; i++) for (int j = 0; j < N; j++) p[i][j] = 0; } string name[] = { "x", "y", "z", "" }; string separator[] = { "", "", "", " = " }; bool znam[] = { false, true, true, false}; int width = 4; void print(ostream& f, T p[M][N]) { for (int i = 0; i < M; i++) // cyklus pro radky { for (int j = 0; j < N; j++) // cyklus pro sloupce { f << separator[j]; if (znam[j]) { if (p[i][j] >= 0) f << "+"; else f << "-"; f << setw(width) << abs (p[i][j]) << setw(1); } else { f << setw(width) << p[i][j] << setw(1); } f << name[j] << " "; // vytiskni jedno cislo } f << endl; // konec radky } f << endl; // a jedna prazdna radka } void read(T p[M][N], string fileName) { ifstream h(fileName); for (int i = 0; i < M; i++) for (int j = 0; j < N; j++) h >> p[i][j]; if (! h.good() ) { cerr << "Chyba pri cteni souboru " << fileName << endl; exit (1); } h.close(); } void pricti(T p[M][N], int target, int src, T koef = 1) // pricti koef * radku s indexem src k radce s indexem target { for (int j = 0; j < N; j++) p[target][j] = p[target][j] + koef * p[src][j]; // p[target][j] += koef * p[src][j]; } void vydel(T p[M][N], int target, T koef) // vydel radku s indexem target cislem koef { for (int j = 0; j < N; j++) p[target][j] = p[target][j] / koef; // p[target][j] /= koef ; } const T eps = 1e-9; void prohod(T p[M][N], int start) { T nej = 0; // nejvetsi hodnota ( v absolutni hodnote ) int inx = -1; // nejvetsi hodnota byla na radku inx for (int k = start + 1; k < M; k++) // pro radky "pod" radkou start { if (abs(p[k][start]) > nej) { nej = abs(p[k][start]); // zapamatovat hodnotu inx = k; // zapamatovat index } } if (abs(nej) < eps) { cerr << "Same nuly" << endl; exit (0); } else { cout << "prohazuji radky " << start << " a " << inx << endl; // prohodit radky s indexy start a inx for (int j = 0; j < N; j++) { T tmp = p[start][j]; p[start][j] = p[inx][j]; p[inx][j] = tmp; } } } void uprav(T p[M][N]) { for (int i = 0; i < M; i++) { if ( abs(p[i][i]) < eps ) { prohod (p, i); } vydel(p, i, p[i][i]); // doufam, ze a[i][i] != 0 for (int k = 0; k < M; k++) { if (k != i) // pro radky jine nez radka i { pricti(p, k, i, -p[k][i]); } } print(cout, p); } } void priprav(T p[M][N], T r[N - 1]) // priprav pravou stranu matice p, aby resenim byla cisla z pole r { for (int i = 0; i < M; i++) { T v = 0; for (int j = 0; j < N - 1; j++) // vynecham pravou stranu { v = v + p[i][j] * r[j]; } p[i][N - 1] = v; // ulozim pravou stranu } } T a[M][N]; int main() { clear(a); read(a, "input.txt"); print(cout, a); T reseni [N - 1] = { 3, 4, 5 }; priprav(a, reseni); print(cout, a); uprav(a); ofstream f("abc.txt"); print(f, a); f.close(); cout << "Data ze souboru abc.txt" << endl; ifstream g("abc.txt"); while (g.good()) { string t; getline(g, t); if (g.good()) { cout << t << endl; } } g.close(); cout << "O.K."; }