Advertisement
dxvmxnd

Untitled

Feb 29th, 2024
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.88 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. void outputTask() {
  8. cout << "Данная программа рассчитывает наибольшее отрицательное число среди заданной квадратной матрицы." << endl;
  9. }
  10.  
  11. void outputMatrix(int** matrix, int size) {
  12. cout << "Исходная матрица:" << endl;
  13. for (int i = 0; i < size; i++) {
  14. for (int j = 0; j < size; j++) {
  15. cout << matrix[i][j] << " ";
  16. }
  17. cout << endl;
  18. }
  19.  
  20. }
  21.  
  22. int findLargestNegativeNumber(int** matrix, int size) {
  23. int num;
  24. bool isThereNegative;
  25.  
  26. isThereNegative = false;
  27. for (int i = 0; i < size; i++) {
  28. for (int j = 0; j < size; j++) {
  29. if (matrix[i][j] < 0) {
  30. isThereNegative = true;
  31. num = matrix[i][j];
  32. }
  33. }
  34. }
  35.  
  36. if (isThereNegative) {
  37. for (int i = 0; i < size; i++) {
  38. for (int j = 0; j < size; j++) {
  39. if ((matrix[i][j] > num) and (matrix[i][j] < 0)) {
  40. num = matrix[i][j];
  41. }
  42. }
  43. }
  44. }
  45. else {
  46. num = 0;
  47. }
  48.  
  49.  
  50. return num;
  51. }
  52.  
  53. bool chooseInput() {
  54. bool isNotCorrect;
  55. int num;
  56.  
  57. do {
  58. isNotCorrect = false;
  59. cout << "Выберите откуда вводить данные: 0, если из консоли, 1 если из файла:" << endl;
  60. cin >> num;
  61. if ((cin.fail()) or ((num != 0) and (num != 1))) {
  62. isNotCorrect = true;
  63. cout << "Ошибка ввода! Повторите попытку." << endl;
  64. cin.clear();
  65. while (cin.get() != '\n');
  66. }
  67. } while (isNotCorrect);
  68.  
  69. return (num == 1);
  70. }
  71.  
  72. string choosePath() {
  73. string path;
  74. bool isNotCorrect;
  75.  
  76. do {
  77. isNotCorrect = false;
  78. cout << "Введите путь к файлу для ввода информации:" << endl;
  79. cin >> path;
  80. ifstream fin(path);
  81. if ((!fin.is_open()) or (path.length() < 5)) {
  82. isNotCorrect = true;
  83. cout << "Ошибка ввода! Повторите попытку." << endl;
  84. }
  85. else {
  86. if (path[path.length() - 1] != 't' and path[path.length() - 2] != 'x' and path[path.length() - 3] != 't' and path[path.length() - 4] != '.' ) {
  87. isNotCorrect = true;
  88. cout << "Ошибка ввода! Повторите попытку." << endl;
  89. }
  90. }
  91. fin.close();
  92. } while (isNotCorrect);
  93.  
  94. return path;
  95. }
  96.  
  97. int inputSizeFromConsole() {
  98. int size;
  99. bool isNotCorrect;
  100.  
  101. do {
  102. isNotCorrect = false;
  103. cout << "Введите размер матрицы (от 2 до 100):" << endl;
  104. cin >> size;
  105. if (cin.fail() or (size < 2) or (size > 100)) {
  106. isNotCorrect = true;
  107. cout << "Ошибка ввода! Повторите попытку." << endl;
  108. cin.clear();
  109. while (cin.get() != '\n');
  110. }
  111. } while (isNotCorrect);
  112.  
  113. return size;
  114.  
  115. }
  116.  
  117. int inputSizeFromFile(string path) {
  118. int size;
  119.  
  120. ifstream fin(path);
  121. cout << "Запись размера..." << endl;
  122. fin >> size;
  123. if (fin.fail() or (size < 2) or (size > 100)) {
  124. cout << "Ошибка ввода! Введите размер с клавиатуры." << endl;
  125. size = inputSizeFromConsole();
  126. }
  127.  
  128. fin.close();
  129.  
  130. return size;
  131. }
  132.  
  133. int exceptionRead(int i, int j) {
  134. bool isNotCorrect;
  135. int num;
  136.  
  137. do {
  138. isNotCorrect = false;
  139. cout << "Введите [" << (i + 1) << " , " << (j + 1) << "] элемент матрицы:" << endl;
  140. cin >> num;
  141. if (cin.fail()) {
  142. cout << "Ошибка ввода! Повторите попытку." << endl;
  143. isNotCorrect = true;
  144. cin.clear();
  145. while (cin.get() != '\n');
  146. }
  147. } while (isNotCorrect);
  148.  
  149. return num;
  150.  
  151. }
  152.  
  153. int** fillMatrixFromFile(string path, int** matrix, int size) {
  154. string line;
  155.  
  156. cout << "Запись матрицы.." << endl;
  157. ifstream fin(path);
  158. std::getline(fin, line);
  159. for (int i = 0; i < size; i++) {
  160. for (int j = 0; j < size; j++) {
  161. fin >> matrix[i][j];
  162. if (fin.fail()) {
  163. cout << "Ошибка ввода! Введите [" << (i + 1) << " , " << (j + 1) << "] элемент матрицы с клавиатуры. " << endl;
  164. matrix[i][j] = exceptionRead(i, j);
  165. fin.clear();
  166. while (fin.get() != ' ');
  167. }
  168. }
  169. std::getline(fin, line);
  170. }
  171.  
  172. fin.close();
  173.  
  174. return matrix;
  175.  
  176.  
  177. }
  178.  
  179. int inputMatrixFromFile() {
  180. string path;
  181. int** matrix;
  182. int size;
  183. int largestNegativeNumber;
  184.  
  185. cout << "При записи из файла учтите, что на 1 строке должен быть записан размер матрицы, а далее с новой строки сама матрица(через пробел). Обратите внимание, что в конце каждой строки нужно поставить пробел." << endl;
  186.  
  187. path = choosePath();
  188. size = inputSizeFromFile(path);
  189. matrix = new int* [size];
  190. for (int i = 0; i < size; i++) {
  191. matrix[i] = new int[size];
  192. }
  193. matrix = fillMatrixFromFile(path, matrix, size);
  194.  
  195. outputMatrix(matrix, size);
  196.  
  197. largestNegativeNumber = findLargestNegativeNumber(matrix, size);
  198.  
  199. return largestNegativeNumber;
  200. }
  201.  
  202. int** fillMatrixFromConsole(int** matrix, int size) {
  203. bool isNotCorrect;
  204.  
  205. for (int i = 0; i < size; i++) {
  206. for (int j = 0; j < size; j++) {
  207. do {
  208. isNotCorrect = false;
  209. cout << "Введите [" << (i + 1) << " , " << (j + 1) << "] элемент матрицы:" << endl;
  210. cin >> matrix[i][j];
  211. if (cin.fail()) {
  212. isNotCorrect = true;
  213. cout << "Ошибка ввода! Повторите попытку." << endl;
  214. cin.clear();
  215. while (cin.get() != '\n');
  216. }
  217. } while (isNotCorrect);
  218. }
  219. }
  220.  
  221. return matrix;
  222. }
  223.  
  224. int inputMatrixFromConsole() {
  225. int size;
  226. int** matrix;
  227. int largestNegativeNumber;
  228.  
  229. size = inputSizeFromConsole();
  230. matrix = new int* [size];
  231. for (int i = 0; i < size; i++) {
  232. matrix[i] = new int[size];
  233. }
  234. matrix = fillMatrixFromConsole(matrix, size);
  235.  
  236. outputMatrix(matrix, size);
  237.  
  238. largestNegativeNumber = findLargestNegativeNumber(matrix, size);
  239.  
  240. return largestNegativeNumber;
  241. }
  242.  
  243. int inputMatrix(bool isFromFile) {
  244. int** matrix;
  245. int largestNumber;
  246.  
  247. if (isFromFile) {
  248. largestNumber = inputMatrixFromFile();
  249. }
  250. else {
  251. largestNumber = inputMatrixFromConsole();
  252. }
  253.  
  254.  
  255. return largestNumber;
  256. }
  257.  
  258.  
  259. string choosePathForOutput() {
  260. string path;
  261. bool isNotCorrect;
  262.  
  263. do {
  264. isNotCorrect = false;
  265. cout << "Введите путь к файлу для вывода информации:" << endl;
  266. cin >> path;
  267. ofstream fout(path);
  268. if ((!fout.is_open()) or (path.length() < 5)) {
  269. isNotCorrect = true;
  270. cout << "Ошибка ввода! Повторите попытку." << endl;
  271. }
  272. else {
  273. if (path[path.length() - 1] != 't' and path[path.length() - 2] != 'x' and path[path.length() - 3] != 't' and path[path.length() - 4] != '.') {
  274. isNotCorrect = true;
  275. cout << "Ошибка ввода! Повторите попытку." << endl;
  276. }
  277. }
  278. fout.close();
  279. } while (isNotCorrect);
  280.  
  281. return path;
  282. }
  283.  
  284. void outputInFile(int num) {
  285. string path;
  286.  
  287. path = choosePathForOutput();
  288. ofstream fout(path);
  289. if (num == 0) {
  290. fout << "Матрица не имеет отрицательные элементы." << endl;
  291. }
  292. else {
  293. fout << "Наибольший отрицательный элемент матрицы: " << num << endl;
  294. }
  295.  
  296. cout << "Данные успешно записаны в файл!" << endl;
  297.  
  298. fout.close();
  299.  
  300. }
  301.  
  302. void outputAnswer(int num) {
  303. if (num == 0) {
  304. cout << "Матрица не имеет отрицательные элементы." << endl;
  305. }
  306. else {
  307. cout << "Наибольший отрицательный элемент матрицы: " << num << endl;
  308. }
  309.  
  310. outputInFile(num);
  311. }
  312.  
  313.  
  314. int main() {
  315. setlocale(LC_ALL, "Rus");
  316.  
  317. bool isFromFile;
  318. int size, largestNegativeNumber;
  319. int** matrix;
  320.  
  321. outputTask();
  322. isFromFile = chooseInput();
  323. largestNegativeNumber = inputMatrix(isFromFile);
  324. outputAnswer(largestNegativeNumber);
  325. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement