Advertisement
dxvmxnd

Untitled

Nov 21st, 2024
8
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.15 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. using namespace std;
  5.  
  6. void outputTask() {
  7. cout << "Данная программа считает сумму элементов матрицы в форме ''песочные часы''." << endl;
  8. }
  9.  
  10. string inputPath() {
  11. string path;
  12. bool isNotCorrect;
  13.  
  14. do {
  15. isNotCorrect = false;
  16. cin >> path;
  17. ifstream fin(path);
  18. if (fin.is_open() and (size(path) > 4) and ((path[size(path) - 1] == 't') and (path[size(path) - 2] == 'x') and (path[size(path) - 3] == 't') and (path[size(path) - 4] == '.'))) {
  19. cout << "Файл успешно открыт!" << endl;
  20. }
  21. else {
  22. cout << "Ошибка открытия файла!" << endl;
  23. isNotCorrect = true;
  24. }
  25. fin.close();
  26. } while (isNotCorrect);
  27.  
  28.  
  29. return path;
  30. }
  31.  
  32. void outputMatrix(int** matrix, int size) {
  33. cout << "Введенная матрица: " << endl;
  34. for (int i = 0; i < size; i++) {
  35. for (int j = 0; j < size; j++) {
  36. cout << matrix[i][j];
  37. cout << " ";
  38. }
  39. cout << endl;
  40. }
  41. }
  42.  
  43.  
  44. int countSum(int**& matrix, int size) {
  45. int sum;
  46. sum = 0;
  47. for (int i = 0; i < (size / 2); i++) {
  48. for (int j = i; j < (size - i); j++) {
  49. sum += matrix[i][j];
  50. }
  51. }
  52.  
  53. for (int i = (size / 2); i < (size); i++) {
  54. for (int j = (size - i - 1); j < i + 1; j++) {
  55. sum += matrix[i][j];
  56. }
  57. }
  58.  
  59.  
  60. return sum;
  61. }
  62.  
  63. void outputAnswer(int sum) {
  64. string path;
  65.  
  66. cout << "Сумма элементов матрицы ''песочные часы'': " << sum << endl;
  67.  
  68. cout << "Введите путь файла для вывода: " << endl;
  69. path = inputPath();
  70. ofstream fout(path);
  71. fout << "Сумма элементов матрицы ''песочные часы'': " << sum << endl;
  72.  
  73. fout.close();
  74. cout << "Данные успешно записаны в файл." << endl;
  75. }
  76.  
  77. int inputSizeFromConsole() {
  78. int size;
  79. bool isNotCorrect;
  80.  
  81. do {
  82. cout << "Введите порядок матрицы: " << endl;
  83. isNotCorrect = false;
  84. cin >> size;
  85. if (cin.fail() or (size < 3)) {
  86. isNotCorrect = true;
  87. cout << "Ошибка ввода!" << endl;
  88. cin.clear();
  89. while(cin.get() != '\n');
  90. }
  91. } while(isNotCorrect);
  92.  
  93. return size;
  94.  
  95. }
  96.  
  97. void fillMatrixFromConsole(int**& matrix, int size) {
  98. bool isNotCorrect;
  99.  
  100. for (int i = 0; i < size; i++) {
  101. for (int j = 0; j < size; j++) {
  102. do {
  103. isNotCorrect = false;
  104. cout << "Введите [" << i + 1 << " , " << j + 1 << "] элемент матрицы: " << endl;
  105. cin >> matrix[i][j];
  106. if (cin.fail()) {
  107. cout << "Ошибка ввода! Повторите попытку." << endl;
  108. isNotCorrect = true;
  109. cin.clear();
  110. while(cin.get() != '\n');
  111. }
  112. } while(isNotCorrect);
  113. }
  114. }
  115. }
  116.  
  117. int** inputFromConsole(int& size) {
  118. int** matrix;
  119.  
  120. size = inputSizeFromConsole();
  121. matrix = new int*[size];
  122. for (int i = 0; i < size; i++) {
  123. matrix[i] = new int[size];
  124. }
  125. fillMatrixFromConsole(matrix, size);
  126. outputMatrix(matrix, size);
  127.  
  128. return matrix;
  129.  
  130. }
  131.  
  132. void outputSize(int size) {
  133. cout << "Введенный размер с файла: " << size << endl;
  134. }
  135.  
  136. void inputSizeFromFile(string path, int& size) {
  137.  
  138. cout << "Считывание размера..." << endl;
  139. ifstream fin(path);
  140. fin >> size;
  141. if (fin.fail() or (size < 3)) {
  142. cout << "Ошибка ввода размера! Введите размер с клавиатуры." << endl;
  143. size = inputSizeFromConsole();
  144. }
  145. else {
  146. outputSize(size);
  147. }
  148.  
  149. fin.close();
  150. }
  151.  
  152. double exceptionRead(int i, int j) {
  153. bool isNotCorrect;
  154. double num;
  155.  
  156. do{
  157. isNotCorrect = false;
  158. cout << "Введите [" << i + 1 << " , " << j + 1 << "] элемент матрицы: " << endl;
  159. cin >> num;
  160. if (cin.fail()) {
  161. cout << "Ошибка ввода!" << endl;
  162. isNotCorrect = true;
  163. cin.clear();
  164. while(cin.get() != '\n');
  165. }
  166.  
  167. } while(isNotCorrect);
  168.  
  169. return num;
  170. }
  171.  
  172. void inputMatrixFromFile(string path, int size, int**& matrix) {
  173. string skipLine;
  174.  
  175. cout << "Ввод матрицы.. " << endl;
  176.  
  177. ifstream fin(path);
  178. getline(fin, skipLine);
  179. for (int i = 0; i < size; i++) {
  180. for (int j = 0; j < size; j++) {
  181. fin >> matrix[i][j];
  182. if (fin.fail()) {
  183. cout << "Ошибка ввода элемента с индексами [" << i + 1 << " , " << j + 1 << "]. Введите этот элемент с клавиатуры. " << endl;
  184. fin.clear();
  185. fin.ignore(numeric_limits<streamsize>::max(), ' ');
  186. matrix[i][j] = exceptionRead(i, j);
  187. }
  188. }
  189. }
  190. fin.close();
  191.  
  192. }
  193.  
  194. int** inputFromFile(int& size) {
  195. string path;
  196. int** matrix;
  197.  
  198. cout << "При вводе из файла учтите, что на первой строке написан порядок матрицы, а далее - сама матрица с новой строки." << endl;
  199. cout << "Введите путь файла с данными: " << endl;
  200. path = inputPath();
  201. inputSizeFromFile(path, size);
  202.  
  203. matrix = new int*[size];
  204. for (int i = 0; i < size; i++) {
  205. matrix[i] = new int[size];
  206. }
  207.  
  208. inputMatrixFromFile(path, size, matrix);
  209. outputMatrix(matrix, size);
  210.  
  211. return matrix;
  212.  
  213.  
  214. }
  215.  
  216. bool isFromFile() {
  217. bool isNotCorrect;
  218. int chooseNum;
  219.  
  220. do {
  221. isNotCorrect = false;
  222. cout << "Выберите, откуда вводить данные: 1, если с файла; 0, если с консоли" << endl;
  223. cin >> chooseNum;
  224. if (cin.fail() or ((chooseNum != 1) and (chooseNum != 0))) {
  225. cout << "Ошибка ввода!" << endl;
  226. isNotCorrect = true;
  227. cin.clear();
  228. while(cin.get() != '\n');
  229. }
  230. } while(isNotCorrect);
  231.  
  232. return (chooseNum == 1);
  233.  
  234. }
  235.  
  236. int** chooseInput(int& size) {
  237. int** matrix;
  238.  
  239. if (isFromFile()) {
  240. matrix = inputFromFile(size);
  241. }
  242. else {
  243. matrix = inputFromConsole(size);
  244. }
  245.  
  246. return matrix;
  247. }
  248.  
  249. int main() {
  250. system("chcp 1251");
  251.  
  252. int** matrix;
  253. int size;
  254. int amountOfRows;
  255. int sum;
  256.  
  257. outputTask();
  258. matrix = chooseInput(size);
  259. sum = countSum(matrix, size);
  260. outputAnswer(sum);
  261.  
  262. for (int i = 0; i < size; ++i) {
  263. delete[] matrix[i];
  264. }
  265. delete[] matrix;
  266.  
  267. cin;
  268. return 0;
  269. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement