Advertisement
klasscho

Untitled

Nov 13th, 2019
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.89 KB | None | 0 0
  1. program lab2_4;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. {$R *.res}
  6.  
  7. uses
  8. System.SysUtils;
  9. type
  10. MatrixType = array of array of integer;
  11. MassType = array of integer;
  12.  
  13. function IsMatrixCorrect(FileName: string): boolean;
  14. var
  15. FileIn: TextFile;
  16. Sign: Integer;
  17. CorrectMatrix: boolean;
  18. begin
  19. CorrectMatrix := true;
  20. AssignFile(FileIn, FileName);
  21. reset(FileIn);
  22. while (not EOF(FileIn)) do
  23. begin
  24. try
  25. read(FileIn, Sign)
  26. except
  27. CorrectMatrix := false
  28. end;
  29. end;
  30. CloseFile(FileIn);
  31. IsMatrixCorrect := CorrectMatrix;
  32. end;
  33.  
  34. function MatrixRowSize(FileName: string): integer;
  35. var
  36. FileIn: TextFile;
  37. Count: integer;
  38. begin
  39. Count := 0;
  40. AssignFile(FileIn, FileName);
  41. reset(FileIn);
  42. while (not EOF(FileIN)) do
  43. begin
  44. readln(FileIn);
  45. inc(Count);
  46. end;
  47. CloseFile(FileIn);
  48. MatrixRowSize := Count;
  49. end;
  50.  
  51. function MatrixColSize(FileName: string): integer;
  52. var
  53. FileIn: TextFile;
  54. Count, Sign: integer;
  55. begin
  56. Count := 0;
  57. AssignFile(FileIn, FileName);
  58. reset(FileIn);
  59. while (not EOln(FileIN)) do
  60. begin
  61. read(FileIn, Sign);
  62. inc(Count);
  63. end;
  64. CloseFile(FileIn);
  65. MatrixColSize := Count;
  66. end;
  67.  
  68. function FileNameInputRead(): string;
  69. var
  70. isCorrect: boolean;
  71. FileName: string;
  72. begin
  73. isCorrect := false;
  74. repeat
  75. writeln('Enter file name:');
  76. readln(FileName);
  77. if FileExists(FileName) then
  78. if IsMatrixCorrect(FileName) then
  79. if MatrixRowSize(FileName) = MatrixColSize(FileName) then
  80. isCorrect := true
  81. else
  82. writeln('Matrix must be of order n!')
  83. else
  84. writeln('There are unallowable symbols in file!')
  85. else
  86. writeln('This file does not exist!');
  87. until isCorrect;
  88. FileNameInputRead := FileName;
  89. end;
  90.  
  91. function FileNameOutputRead(): string;
  92. var
  93. FileName: string;
  94. isCorrect: boolean;
  95. i: integer;
  96. begin
  97. isCorrect := false;
  98. repeat
  99. writeln('Enter the file name for output:');
  100. readln(FileName);
  101. for i := 1 to length(FileName) do
  102. if FileName[i] <> ' ' then
  103. isCorrect := true;
  104. if not isCorrect then
  105. writeln('Empty string entered!');
  106. until isCorrect;
  107. if not(ExtractFileExt(FileName) = '.txt') then
  108. FileName := FileName + '.txt';
  109. FileNameOutputRead := FileName;
  110. end;
  111.  
  112. function FileExistProc(): integer;
  113. var
  114. Sign: string;
  115. isCorrect: boolean;
  116. begin
  117. writeln('This file already exists! Enter 1 to rewrite or 2 to create new name:');
  118. repeat
  119. begin
  120. readln(Sign);
  121. isCorrect := true;
  122. if sign = '1' then
  123. FileExistProc := 1
  124. else
  125. if sign = '2' then
  126. FileExistProc := 2
  127. else
  128. begin
  129. isCorrect := false;
  130. writeln('You must enter 1 to rewrite or 2 to create new name! Try
  131. again:');
  132. end;
  133. end
  134. until isCorrect;
  135. end;
  136. function FileNameForOutput(): string;
  137. var
  138. FileOut: TextFile;
  139. FileName: string;
  140. isCorrect: boolean;
  141. begin
  142. FileName := FileNameOutputRead();
  143. if FileExists(FileName) then
  144. repeat
  145. isCorrect := true;
  146. if (FileExistProc() = 2) then
  147. begin
  148. FileName := FileNameOutputRead();
  149. if FileExists(FileName) then
  150. isCorrect := false;
  151. end;
  152. until isCorrect;
  153. FileNameForOutput := FileName;
  154. end;
  155.  
  156. procedure MatrixOutput(const Matrix: MatrixType; Row, Col: integer);
  157. var
  158. i, j: integer;
  159. begin
  160. for i := 0 to Row do
  161. begin
  162. for j := 0 to Col do
  163. write(Matrix[i, j], ' ');
  164. writeln;
  165. end;
  166. writeln;
  167. end;
  168.  
  169. procedure ReadFromFile(var Matrix: MatrixType; FileName : string; Row, Col: integer);
  170. var
  171. FileIn: TextFile;
  172. i, j: integer;
  173. begin
  174. AssignFile(FileIn, FileName);
  175. reset(FileIn);
  176. while (not EOF(FileIN)) do
  177. for i := 0 to Row do
  178. for j := 0 to Col do
  179. read(FileIn, Matrix[i, j]);
  180. CloseFile(FileIn);
  181. end;
  182.  
  183. procedure WriteToFile(const Matrix: MatrixType; FileName : string; Row, Col: integer);
  184. var
  185. FileOut: TextFile;
  186. i, j: integer;
  187. begin
  188. AssignFile(FileOut, FileName);
  189. rewrite(FileOut);
  190. for i := 0 to Row do
  191. begin
  192. for j := 0 to Col do
  193. begin
  194. write(FileOut, Matrix[i, j]);
  195. write(FileOut, ' ');
  196. end;
  197. writeln(FileOut, ' ');
  198. end;
  199. CloseFile(FileOut);
  200. writeln('Saved to file: ', FileName);
  201. end;
  202.  
  203. procedure MatrixLineCorrect(var Matrix: MatrixType; Row, Col: integer);
  204. var
  205. j, Sign: integer;
  206. begin
  207. for j := 0 to Col do
  208. begin
  209. Sign := Matrix[Row + 1, j];
  210. Matrix[Row + 1, j] := Matrix[Row, j];
  211. Matrix[Row, j] := Sign;
  212. end;
  213. end;
  214.  
  215. procedure NumbersOfZeroCorrect(var NumbersOfZero: array of integer; CurrentCol: integer);
  216. var
  217. k: integer;
  218. begin
  219. k := NumbersOfZero[CurrentCol + 1];
  220. NumbersOfZero[CurrentCol + 1] := NumbersOfZero[CurrentCol];
  221. NumbersOfZero[CurrentCol] := k;
  222. end;
  223.  
  224. procedure MatrixZeroCount(var NumbersOfZero: array of integer; Matrix: MatrixType; Row,
  225. Col:integer);
  226. var
  227. i, j, count: Integer;
  228. begin
  229. count := 0;
  230. for i := 0 to Row do
  231. begin
  232. for j := 0 to Col do
  233. if matrix[i, j] = 0 then
  234. inc(count);
  235. NumbersOfZero[i] := count;
  236. count := 0;
  237. end;
  238.  
  239. end;
  240.  
  241. procedure MatrixZeroCorrect (Matrix:MatrixType; Row, Col: integer);
  242. var
  243. i, j: integer;
  244. NumbersOfZero: array of integer;
  245. begin
  246. Setlength(NumbersOfZero, Row + 1);
  247. MatrixZeroCount(NumbersOfZero, Matrix, Row, Col);
  248. Row := Row - 1;
  249. for i := 0 to Row do
  250. for j := 0 to Row - i do
  251. if NumbersOfZero[j] > NumbersOfZero[j + 1] then
  252. begin
  253. NumbersOfZeroCorrect(NumbersOfZero, j);
  254. MatrixlineCorrect(Matrix, j, Col);
  255. end;
  256. writeln;
  257. end;
  258.  
  259.  
  260. var
  261. Matrix: MatrixType;
  262. Row, Col, Sign, i: integer;
  263. FileNameIn, FileNameOut: string;
  264.  
  265. begin
  266. FileNameIn := FileNameInputRead();
  267. Row := MatrixRowSize(FileNameIn);
  268. Col := MatrixColSize(FileNameIn);
  269. SetLength(Matrix, Row, Col);
  270. dec(Row);
  271. dec(Col);
  272. ReadFromFile(Matrix, FileNameIn, Row, Col);
  273. writeln;
  274. writeln('Initial matrix:');
  275. MatrixOutput(Matrix, Row, Col);
  276. MatrixZeroCorrect(Matrix, Row, Col);
  277. writeln('Finished matrix:');
  278. MatrixOutput(Matrix, Row, Col);
  279. writeln;
  280. FileNameOut := FileNameForOutput();
  281. WriteToFile(Matrix, FileNameOut, Row, Col);
  282. readln;
  283. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement