forked from IS-UMK/lemkis
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathConsoleApplication1maciejS.cpp
130 lines (107 loc) · 3.94 KB
/
ConsoleApplication1maciejS.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <iostream>
#include <vector>
#include <stdexcept>
#include <fstream>
#include <ranges>
#include <span>
namespace matrix {
struct shape {
std::size_t rows{}, columns{};
};
}
namespace ranges {
template <std::ranges::view V>
class numeric_view : public std::ranges::view_interface<numeric_view<V>> {
private:
using value_type = std::ranges::range_value_t<V>;
std::views::all_t<V> _v;
public:
constexpr numeric_view(V v) : _v{ v | std::views::all } {}
constexpr auto begin() const { return _v.begin(); }
constexpr auto begin() { return _v.begin(); }
constexpr auto end() const { return _v.end(); }
constexpr auto end() { return _v.end(); }
constexpr auto operator+=(std::ranges::view auto v) {
// Implementacja operacji dodawania na poziomie współrzędnych
// implementacja odpowiedniej logiki
}
// Pozostałe operatory analogicznie
};
template <typename T, std::size_t extent = std::dynamic_extent>
class matrix_view : public std::span<T, extent> {
private:
matrix::shape _shape{};
public:
constexpr matrix_view(T* data, matrix::shape s)
: std::span<T, extent>{ data, s.rows * s.columns }, _shape{ s } {}
constexpr auto row(std::integral auto i) {
// Implementacja pobierania i-tego wiersza
// implementacja odpowiedniej logiki
}
constexpr auto column(std::integral auto i) {
// Implementacja pobierania i-tej kolumny
// imprelemntacja odpowiedniej logiki
}
};
// Funkcja zapisująca macierz do pliku
template <typename T, std::size_t extent = std::dynamic_extent>
void save(matrix_view<T, extent> m, const std::string& filename) {
std::ofstream file(filename);
if (!file.is_open()) {
throw std::runtime_error("Nie można otworzyć pliku do zapisu.");
}
for (const auto& val : m) {
file << val << " ";
}
}
} // namespace ranges
int main() {
size_t rows, cols;
std::cout << "Podaj liczbe wierszy i kolumn macierzy: ";
std::cin >> rows >> cols;
std::vector<double> data_A(rows * cols);
std::vector<double> data_B(rows * cols);
// Wczytaj dane pierwszej macierzy
std::cout << "Podaj elementy pierwszej macierzy A:\n";
for (size_t i = 0; i < rows; ++i) {
for (size_t j = 0; j < cols; ++j) {
double val;
std::cout << "Element [" << i << "][" << j << "]: ";
std::cin >> val;
data_A[i * cols + j] = val;
}
}
// Wczytaj dane drugiej macierzy
std::cout << "Podaj elementy drugiej macierzy B:\n";
for (size_t i = 0; i < rows; ++i) {
for (size_t j = 0; j < cols; ++j) {
double val;
std::cout << "Element [" << i << "][" << j << "]: ";
std::cin >> val;
data_B[i * cols + j] = val;
}
}
// Utwórz widoki macierzy na podstawie wczytanych danych
matrix::shape matrix_shape{ rows, cols };
ranges::matrix_view<double> A(data_A.data(), matrix_shape);
ranges::matrix_view<double> B(data_B.data(), matrix_shape);
// Przykładowe operacje na macierzach
auto C = A + B; // Dodawanie macierzy
// Wyświetlenie wyniku dodawania
std::cout << "Wynik dodawania:\n";
for (size_t i = 0; i < rows; ++i) {
for (size_t j = 0; j < cols; ++j) {
std::cout << C[i * cols + j] << " ";
}
std::cout << std::endl;
}
// Zapisuje wynik dodawania do pliku
try {
ranges::save(C, "result.txt");
std::cout << "Pomyślnie zapisano wynik dodawania do pliku.\n";
}
catch (const std::runtime_error& e) {
std::cerr << "Błąd: " << e.what() << std::endl;
}
return 0;
}