Advertisement
fatalryuu

Untitled

May 3rd, 2022
248
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 8.69 KB | None | 0 0
  1. Program Lists;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. {$R *.res}
  6.  
  7. Uses
  8.   System.SysUtils,
  9.   System.Generics.Collections;
  10.  
  11. Const
  12.     FileName = 'in.txt';
  13.     MIN_I = 1;
  14.     MAX_I = 5;
  15.  
  16. Type
  17.     TPElem = ^TElem;
  18.     TElem = Record
  19.         Surname: String;
  20.         Group: Integer;
  21.         Marks: Array[MIN_I..MAX_I] Of Integer;
  22.         Next, Prev: TPElem;
  23.     End;
  24.  
  25.     TStudents = Record
  26.         Head, Tail: TPElem
  27.     End;
  28. Var
  29.     Len: Integer = 1;
  30.     Checked: Array[0..1000] Of Integer;
  31.     Index: Integer = 0;
  32.  
  33. Procedure InitList(Var MyList: TStudents);
  34. Begin
  35.     MyList.Head := Nil;
  36.     MyList.Tail := Nil;
  37. End;
  38.  
  39. Procedure ReadInfoFromFile(Var MyList: TStudents);
  40. Var
  41.     InputFile: File Of TPElem;
  42.     Temp, TempStr, TempSurname, TempGroup: String;
  43.     MyFile: TextFile;
  44.     I, J, K: Integer;
  45.     Arr: Array[1..5] Of Integer;
  46.     Curr: TPElem;
  47. Begin
  48.     AssignFile(MyFile, FileName);
  49.     Reset(MyFile);
  50.  
  51.     While Not EoF(MyFile) Do
  52.     Begin
  53.         Readln(MyFile, Temp);
  54.         TempStr := '';
  55.         J := 1;
  56.         K := 0;
  57.         While J < Temp.Length Do
  58.         Begin
  59.             If Temp[J] <> ' ' Then
  60.             Begin
  61.                 TempStr := TempStr + Temp[J];
  62.                 Inc(J);
  63.             End
  64.             Else
  65.             Begin
  66.                 If K = 2 Then
  67.                 Begin
  68.                     Inc(J);
  69.                     For I := Low(Arr) To High(Arr) Do
  70.                     Begin
  71.                         If Temp[J] = ' ' Then
  72.                         Begin
  73.                             Arr[I - 1] := 10;
  74.                             Inc(J);
  75.                         End;
  76.                         Arr[I] := StrToInt(Temp[J]);
  77.                         Inc(J, 2);
  78.                     End;
  79.                 End
  80.                 Else If K = 1 Then
  81.                 Begin
  82.                     TempGroup := TempStr;
  83.                     TempStr := '';
  84.                     Inc(K);
  85.                 End
  86.                 Else
  87.                 Begin
  88.                     TempSurname := TempStr;
  89.                     TempStr := '';
  90.                     Inc(J);
  91.                     Inc(K);
  92.                 End;
  93.             End;
  94.         End;
  95.  
  96.         New(Curr);
  97.         Curr^.Surname := TempSurname;
  98.         Curr^.Group := StrToInt(TempGroup);
  99.         For I := Low(Arr) To High(Arr) Do
  100.             Curr^.Marks[I] := Arr[I];
  101.         Curr^.Next := Nil;
  102.         Curr^.Prev := Nil;
  103.  
  104.         If MyList.Head = Nil Then
  105.             MyList.Head := Curr
  106.         Else
  107.         Begin
  108.             MyList.Tail^.Next := Curr;
  109.             Curr^.Prev := MyList.Tail;
  110.         End;
  111.         MyList.Tail := Curr;
  112.     End;
  113.  
  114.     CloseFile(MyFile);
  115. End;
  116.  
  117. {Procedure ReadInfoFromFile(Var MyList: TStudents);
  118. Var
  119.     InputFile: File Of TPElem;
  120.     Temp, TempStr, TempSurname, TempGroup: String;
  121.     MyFile: TextFile;
  122.     I, J, K: Integer;
  123.     Arr: Array[1..5] Of Integer;
  124.     Curr: TPElem;
  125. Begin
  126.     AssignFile(InputFile, 'out.txt');
  127.     Reset(InputFile);
  128.  
  129.     While Not EoF(InputFile) Do
  130.     Begin
  131.         New(Curr);
  132.         Read(InputFile, Curr);
  133.  
  134.         If MyList.Head = Nil Then
  135.             MyList.Head := Curr
  136.         Else
  137.         Begin
  138.             MyList.Tail^.Next := Curr;
  139.             Curr^.Prev := MyList.Tail;
  140.         End;
  141.         MyList.Tail := Curr;
  142.     End;
  143.  
  144.     CloseFile(MyFile);
  145. End;}
  146.  
  147. Procedure InitChecked();
  148. Var
  149.     I: Integer;
  150. Begin
  151.     For I := 0 To 1000 Do
  152.         Checked[I] := 0;
  153. End;
  154.  
  155. Function WasUsed(Const ThisGroup: Integer): Boolean;
  156. Var
  157.     I: Integer;
  158.     Flag: Boolean;
  159. Begin
  160.     I := 0;
  161.     If Checked[I] <> 0 Then
  162.         While Checked[I] <> 0 Do
  163.         Begin
  164.             If Checked[I] = ThisGroup Then
  165.                 Flag := True;
  166.             Inc(I);
  167.         End
  168.     Else
  169.         Flag := False;
  170.     WasUsed := Flag;
  171. End;
  172.  
  173. Procedure OutputGoodGroups(Const GoodGroups: Array Of Integer);
  174. Var
  175.     I: Integer;
  176. Begin
  177.     Writeln('Список групп без отстающих студентов: ');
  178.     For I := Low(GoodGroups) To High(GoodGroups) Do
  179.         Write(IntToStr(GoodGroups[I]) + ' ');
  180. End;
  181.  
  182. Procedure FindGoodGroups(MyList: TStudents);
  183. Var
  184.     GoodGroups: Array Of Integer;
  185.     Curr: TPElem;
  186.     IsGood: Boolean;
  187.     I, ThisGroup: Integer;
  188.     ListForCheck: TStudents;
  189.     Used: Boolean;
  190. Begin
  191.     InitChecked;
  192.     While MyList.Head <> Nil Do
  193.     Begin
  194.         ListForCheck := MyList;
  195.         ThisGroup := ListForCheck.Head^.Group;
  196.         IsGood := True;
  197.         Used := WasUsed(ThisGroup);
  198.         While IsGood And Not Used And (ListForCheck.Head <> Nil) Do
  199.         Begin
  200.             If ListForCheck.Head^.Group = ThisGroup Then
  201.             Begin
  202.                 For I := MIN_I To MAX_I Do
  203.                     If ListForCheck.Head^.Marks[I] < 4 Then
  204.                         IsGood := False;
  205.                 ListForCheck.Head := ListForCheck.Head^.Next;
  206.             End
  207.             Else
  208.             Begin
  209.                 ListForCheck.Head := ListForCheck.Head^.Next;
  210.             End;
  211.         End;
  212.         If IsGood And Not Used Then
  213.         Begin
  214.             SetLength(GoodGroups, Len);
  215.             Inc(Len);
  216.             GoodGroups[Len - 2] := ThisGroup;
  217.         End;
  218.         MyList.Head := MyList.Head^.Next;
  219.         If Not Used Then
  220.         Begin
  221.             Checked[Index] := ThisGroup;
  222.             Inc(Index);
  223.         End;
  224.     End;
  225.  
  226.     OutputGoodGroups(GoodGroups);
  227. End;
  228.  
  229. Function FindAverage(Elem: TPElem): Real;
  230. Var
  231.     I, Sum: Integer;
  232. Begin
  233.     Sum := 0;
  234.     For I := MIN_I To MAX_I Do
  235.         Sum := Sum + Elem^.Marks[I];
  236.     FindAverage := Sum / 5;
  237. End;
  238.  
  239. Procedure OutputBestStudent(Const BestStudent: String);
  240. Begin
  241.     Writeln(#10#13 + #10#13 + 'Студент(-ы) с наивысшим баллом: ' + BestStudent);
  242. End;
  243.  
  244. Procedure FindBestStudent(MyList: TStudents);
  245. Var
  246.     BestStudent: String;
  247.     Temp: TPElem;
  248.     I: Integer;
  249.     Average, Max: Real;
  250. Begin
  251.     BestStudent := '';
  252.     Max := 0;
  253.     Temp := MyList.Head;
  254.     While Temp <> Nil Do
  255.     begin
  256.         Average := 0;
  257.         For I := MIN_I To MAX_I Do
  258.             Average := Average + Temp^.Marks[I];
  259.  
  260.         Average := Average / 5;
  261.  
  262.         If Average > Max Then
  263.         Begin
  264.             Max := Average;
  265.             BestStudent := Temp^.Surname;
  266.         End
  267.         Else If Average = Max Then
  268.             BestStudent := BestStudent + ', ' + Temp^.Surname;
  269.  
  270.         Temp := Temp^.Next;
  271.     End;
  272.  
  273.     OutputBestStudent(BestStudent);
  274. End;
  275.  
  276. Procedure OutputList(MyList: TStudents);
  277. Var
  278.     I: Integer;
  279. Begin
  280.     Writeln(#10#13 + 'Отсортированный список: ' + #10#13);
  281.     While MyList.Head <> Nil Do
  282.     Begin
  283.         Write(MyList.Head^.Surname + ' ' + IntToStr(MyList.Head^.Group) + ' ');
  284.         For I := MIN_I To MAX_I Do
  285.             Write(IntToStr(MyList.Head^.Marks[I]) + ' ');
  286.         Writeln;
  287.         MyList.Head := MyList.Head^.Next;
  288.     End;
  289. End;
  290.  
  291. Procedure SortList(Var MyList: TStudents);
  292. Var
  293.     AElem, BElem: TPElem;
  294.     Temp: TElem;
  295. Begin
  296.     AElem := MyList.Head;
  297.     While AElem <> Nil Do
  298.     Begin
  299.         BElem := MyList.Head;
  300.  
  301.         While BElem^.Next <> Nil Do
  302.         Begin
  303.             If FindAverage(BElem) < FindAverage(BElem^.Next) Then
  304.             Begin
  305.                 Temp.Surname :=  BElem^.Surname;
  306.                 Temp.Group := BElem^.Group;
  307.                 Temp.Marks := BElem^.Marks;
  308.  
  309.                 BElem^.Surname := BElem^.Next^.Surname;
  310.                 BElem^.Group := BElem^.Next^.Group;
  311.                 BElem^.Marks := BElem^.Next^.Marks;
  312.  
  313.                 BElem^.Next^.Surname := Temp.Surname;
  314.                 BElem^.Next^.Group := Temp.Group;
  315.                 BElem^.Next^.Marks := Temp.Marks;
  316.             End;
  317.  
  318.             BElem := BElem^.Next;
  319.         End;
  320.  
  321.         AElem := AElem^.Next;
  322.     End;
  323.  
  324.     OutputList(MyList);
  325. End;
  326.  
  327. Procedure WriteToFile(MyList: TStudents);
  328. Var
  329.     MyFile: File Of TPElem;
  330.     Student: TPElem;
  331.     I: Integer;
  332. Begin
  333.     AssignFile(MyFile, 'out.txt');
  334.     Rewrite(MyFile);
  335.     While MyList.Head <> Nil Do
  336.     Begin
  337.         New(Student);
  338.         Student^.Surname := MyList.Head^.Surname;
  339.         Student^.Group := MyList.Head^.Group;
  340.         For I := MIN_I To MAX_I Do
  341.             Student^.Marks[I] := MyList.Head^.Marks[I];
  342.         Student^.Next := Nil;
  343.         Student^.Prev := Nil;
  344.  
  345.         Write(MyFile, Student);
  346.  
  347.         MyList.Head := MyList.Head^.Next;
  348.     End;
  349.     CloseFile(MyFile);
  350. End;
  351.  
  352. Procedure Main();
  353. Var
  354.     MyList: TStudents;
  355. Begin
  356.     InitList(MyList);
  357.     ReadInfoFromFile(MyList);
  358.     FindGoodGroups(MyList);
  359.     FindBestStudent(MyList);
  360.     //WriteToFile(MyList);
  361.     SortList(MyList);
  362. End;
  363.  
  364. Begin
  365.     Main;
  366.     Readln;
  367.     Readln;
  368. End.
  369.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement