MaksNew

Untitled

Nov 17th, 2020
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.50 KB | None | 0 0
  1. Program b3_3;
  2.  
  3. Uses
  4. System.SysUtils, Classes;
  5.  
  6. type
  7. InputType = (FromConsole, FromFile);
  8. ListD = record
  9. Name:AnsiString;
  10. Score:Integer;
  11. end;
  12. AoL = Array of ListD;
  13.  
  14.  
  15. Var
  16. Path: String;
  17. Size: Integer;
  18. List: AoL;
  19.  
  20.  
  21. function GetInputType(): InputType;
  22. var
  23. Ret: InputType;
  24. Input: String;
  25. IsCorrect: Boolean;
  26. begin
  27. IsCorrect := False;
  28. repeat
  29. Writeln('Выберите способ ввода предложения файл/консоль (ф/к)');
  30. Readln(Input);
  31. if (Input = 'ф') or (Input = 'Ф') or (Input = 'Файл')
  32. or (Input = 'файл')
  33. then
  34. begin
  35. Ret := InputType.FromFile;
  36. IsCorrect := True;
  37. end
  38. else if (Input = 'к') or (Input = 'К') or (Input =
  39. 'Консоль') or (Input = 'консоль') then
  40. begin
  41. Ret := InputType.FromConsole;
  42. IsCorrect := True;
  43. end;
  44. until IsCorrect;
  45. Result := Ret;
  46. end;
  47.  
  48. function IntSize(Size: Integer): Integer;
  49. var
  50. IsCorrect: Boolean;
  51. Begin
  52. Writeln('Введите количество участников: ');
  53. repeat
  54. IsCorrect := True;
  55. try
  56. Readln(Size);
  57. except
  58. Writeln('Введите целое число!');
  59. IsCorrect := False;
  60. end;
  61. if Size <= 0 then
  62. begin
  63. Writeln('Введите положительное число!');
  64. IsCorrect := False
  65. end;
  66. until (IsCorrect);
  67. IntSize := Size;
  68. End;
  69.  
  70. Function GetListFromConsole(List: AoL; Size: Integer): AoL;
  71. var
  72. I, J, Ind, K, B, bif: Integer;
  73. IsCorrect: Boolean;
  74. Buf: AnsiString;
  75. bfs: String;
  76. begin
  77. SetLength(List, Size);
  78. for I := 0 to Size-1 do
  79. begin
  80. repeat
  81. IsCorrect := True;
  82. Writeln('Введите фамилию участника');
  83. Readln(List[I].Name);
  84. List[I].Name := Trim(List[I].Name);
  85. Buf := List[I].Name;
  86. for J := 1 to Length(Buf) do
  87. begin
  88. if (NOT(Buf[J] in ['А'..'Я' , 'а'..'я'])) then
  89. begin
  90. IsCorrect := False;
  91. end;
  92. end;
  93. if IsCorrect = false then
  94. begin
  95. Writeln('Фамилия должна состоять из русских букв')
  96. end;
  97. until (IsCorrect);
  98.  
  99. repeat
  100. Writeln('Введите счёт игрока');
  101. IsCorrect := True;
  102. try
  103. Readln(List[I].Score);
  104. except
  105. Writeln('Введите целое число!');
  106. IsCorrect := False;
  107. end;
  108. if List[I].Score < 0 then
  109. begin
  110. Writeln('Введите неотрицательное число!');
  111. IsCorrect := False
  112. end;
  113. until (IsCorrect)
  114. end;
  115. GetListFromConsole := List;
  116. End;
  117.  
  118. Procedure Sorting (var List: AoL);
  119. Var
  120. J, I, BufI :Integer;
  121. BufS: String;
  122. Begin
  123. for J := I + 1 to Size do
  124. Begin
  125. If List[I].Score < List[J].Score then
  126. Begin
  127. BufI := List[J].Score;
  128. List[J].Score := List[I].Score;
  129. List[I].Score := BufI;
  130. BufS := List[I].Name;
  131. List[I].Name := List[J].Name;
  132. List[J].Name := BufS;
  133. End;
  134. End;
  135. End;
  136.  
  137. Procedure Top3Output (var List: AoL; Size: Integer);
  138. Var
  139. Ind, I, J, BufOne, BufTwo: Integer;
  140. HelpArray: AoL;
  141. Begin
  142. //SetLength(HelpArray,
  143. Ind := 0;
  144. Writeln(List[0].Name, ' ', List[0].Score);
  145. For I := 0 to Size-1 do
  146. Begin
  147. if ((List[I].Score = List[0].Score) and (List[I].Name <> List[0].Name)) then
  148. begin
  149. Writeln(List[I].Name, ' ', List[I].Score);
  150. Ind := I;
  151. End;
  152. End;
  153. BufOne := Ind;
  154. Writeln(List[Ind+1].Name, ' ', List[Ind+1].Score);
  155. For I := Ind+1 to Size-1 do
  156. begin
  157. If ((List[I].Score = List[Ind+1].Score) and (List[I].Name <> List[Ind+1].Name)) then
  158. Begin
  159. Writeln(List[I].Name, ' ', List[I].Score);
  160. Ind := I;
  161. End;
  162. End;
  163. BufTwo := Ind;
  164. If BufOne <> BufTwo then
  165. Begin
  166. Writeln(List[Ind+1].Name, ' ', List[Ind+1].Score);
  167. for I := Ind+1 to Size-1 do
  168. If ((List[I].Score = List[Ind+1].Score) and (List[I].Name <> List[Ind+1].Name)) then
  169. Writeln(List[I].Name, ' ', List[I].Score)
  170. End
  171. Else
  172. Begin
  173. Writeln(List[Ind+2].Name, ' ', List[Ind+2].Score);
  174. For I := Ind+2 to Size-1 do
  175. Begin
  176. If ((List[I].Score = List[Ind+2].Score) and (List[I].Name <> List[Ind+2].Name)) then
  177. Begin
  178. Writeln(List[I].Name, ' ', List[I].Score)
  179. End;
  180. End
  181. End;
  182. End;
  183.  
  184. Function IsFileCorrect(Path: String; Size:Integer): Boolean;
  185. Var
  186. ListFile: TextFile;
  187. I, J: Integer;
  188. IsCorrect: Boolean;
  189. Buf: String;
  190. Begin
  191. AssignFile(ListFile, Path);
  192. Reset(ListFile);
  193. IsCorrect := True;
  194. I := 0;
  195. while not(SeekEof(ListFile)) and IsCorrect do
  196. begin
  197. if I mod 2 = 1 then
  198. begin
  199. while not(SeekEoln(ListFile)) and IsCorrect do
  200. begin
  201. try
  202. Read(ListFile, List[I].Score);
  203. except
  204. IsCorrect := false;
  205. end;
  206. end;
  207. Readln(ListFile);
  208. end
  209. else
  210. begin
  211. while not(SeekEoln(ListFile)) and IsCorrect do
  212. begin
  213. Read(ListFile, List[I].Name);
  214. Buf := List[I].Name;
  215. for J := 1 to Length(Buf) do
  216. begin
  217. if (NOT(Buf[J] in ['А'..'Я' , 'а'..'я'])) then
  218. begin
  219. IsCorrect := False;
  220. end;
  221. end;
  222. Readln(ListFile);
  223. end;
  224. end;
  225. Inc(I);
  226. End;
  227. if I <> Size then
  228. Begin
  229. IsCorrect := False
  230. End;
  231. CloseFile(ListFile);
  232. IsFileCorrect := IsCorrect;
  233. End;
  234.  
  235. Function GetFilePath(): String;
  236. Var
  237. Path: String;
  238. IsCorrect: Boolean;
  239. Begin
  240. Repeat
  241. Writeln('Введите абсолютный путь к файлу ');
  242. Readln(Path);
  243. IsCorrect := False;
  244. if FileExists(Path) then
  245. begin
  246. if IsFileCorrect(Path, Size) then
  247. IsCorrect := true
  248. else
  249. Writeln('Данные в файле некорректны');
  250. end
  251. else
  252. Writeln('Файл не найден');
  253.  
  254. Until IsCorrect;
  255. GetFilePath := Path;
  256. End;
  257.  
  258. Function GetListFromFile(List:AoL): AoL;
  259. Var
  260. SenFile: TextFile;
  261. I: Integer;
  262. Begin
  263. Path := GetFilePath();
  264. AssignFile(SenFile, Path);
  265. Reset(SenFile);
  266. for I := 0 to Size-1 do
  267. Begin
  268. If I mod 2 = 1 then
  269. begin
  270. Read(SenFile, List[I].Score)
  271. end
  272. Else
  273. begin
  274. Read(SenFile, List[I].Name)
  275. end;
  276. End;
  277. CloseFile(SenFile);
  278. GetListFromFile := List;
  279.  
  280. End;
  281.  
  282. function GetList():AoL;
  283. var
  284. SelectedInputType: InputType;
  285. begin
  286. SelectedInputType := GetInputType();
  287. if (SelectedInputType = InputType.FromConsole) then
  288. begin
  289. List := GetListFromConsole(List, Size)
  290. end
  291. else if (SelectedInputType = InputType.FromFile) then
  292. begin
  293. List := GetListFromFile(List);
  294. end;
  295. GetList := List;
  296. end;
  297.  
  298. Function Output(): String;
  299. Var
  300. Patho: String;
  301. IsCorrect: Boolean;
  302. Begin
  303. IsCorrect := False;
  304. Repeat
  305. Writeln('Введите директорию, в которую хотите сохранить результат');
  306. Readln(Patho);
  307. If DirectoryExists(Patho) then
  308. IsCorrect := True
  309. Else
  310. Writeln('Такой директории не существует. Попробуйте ещё раз');
  311. Until IsCorrect;
  312. Output := Patho;
  313. End;
  314.  
  315. Procedure SaveListToFile(List: AoL);
  316. Var
  317. I, J: Integer;
  318. OutputFile: TextFile;
  319. Directory: String;
  320. Begin
  321. Directory := Output();
  322. AssignFile(OutputFile, Directory + '\output.txt');
  323. Rewrite(OutputFile);
  324.  
  325.  
  326. Writeln('Результат сохранён по указанному пути');
  327. CloseFile(OutputFile);
  328. Write;
  329. End;
  330.  
  331. Begin
  332. Size := IntSize(Size);
  333. List := GetList();
  334. Sorting(List);
  335. Top3Output(List, Size);
  336. SaveListToFile(List);
  337. Readln;
  338.  
  339. End.
Advertisement
Add Comment
Please, Sign In to add comment