Задача 2 Урок 19

Урок 19

У вас есть текстовый файл с информацией об итогах соревнований (каждая строка
имеет формат: имя + произвольное число пробелов + балл 1 + произвольное число пробелов + балл 2):

Вася    16     485
Коля    17   555
Юра     18   61
..........

-- где:
слева указаны имена участников, а справа число баллов.
Первое число в каждой строке -- штрафные баллы набранные участниками,
а второе число -- "положительные баллы", то есть если у нас есть строка:

Vasya    N      M

где N -- число шрафных баллов, а M - число баллов положительных,
то итоговая оценка Васи Z вычисляется как разность: Z=M-N.

Напишите программу, которая определяет победителя и его итоговый
балл (прочитав данный файл построчно).
По возможности разбивайте код на процедуры и функции.

function getDif(inputString: string; var name: string): integer;
//ищем имя, проверяем разницу между очками и штрафом
  var score, fine, errorCode, loopCount: integer;
      stringToInt: string;
      flag: boolean;

begin
  score := 0;
  fine := 0;
  errorCode := 0;
  stringToInt := '';
  flag := false;
  name := '';
  for loopCount := 1 to length(inputString) do //прохожу по строке
  begin
    //ищу число
    if (inputString[loopCount] >= '0') and (inputString[loopCount] <= '9') then //если символ - цифра
    begin
      flag := true;
      stringToInt := stringToInt + inputString[loopCount]; // то добавляю цифру в числовую строку
    end
    else  //если символ не цифра
    begin
      if flag then //и флаг поднят
      begin
        val(stringToInt, fine, errorCode); //то получаем штраф из первого набора цифр
        stringToInt := '';//обнуляем строку для получения счета
        //WriteLn('Штрафы: ', fine);
        flag := false;
      end
      else if (inputString[loopCount] <> ' ') then //иначе, если не пробел
      begin
        name := name + inputString[loopCount]; //то собираем имя игрока из символов
      end;
    end;
  end;
  val(stringToInt, score, errorCode); //получаем счет из последнего набора цифр
  //WriteLn('Счет: ', score);
  //WriteLn('Разница: ', score - fine);
  getDif := score - fine;

end;

procedure fileContent(var f1: text; filename: string);//выводим контент файла

  var
    s, winName, name: string;
    sCount, winScore, maybeWin: integer;

begin
  sCount := 0;
  winName := '';
  name := '';
  winScore := 0;
  assign(f1, filename); // ассоциируем переменную f1 с именем файла
    {$I-} reset(f1); {$I+} //проверка на ошибку при открытии файла
    if IOResult <> 0 then
      WriteLn('Файл ', filename, ' не найден!')
    else
    begin
      WriteLn('Файл существует, вот его содержимое:');
      WriteLn();
      WriteLn('===Начало файла===');
      while not eof(f1) do //пока не конец файла
      begin
        readln(f1, s);
        WriteLn(s);
        inc(sCount); // считаю строки чисто для себя
        maybeWin := getDif(s, name); //чтобы не дергать функцию каждый раз
        if maybeWin > winScore then
        //смотрим победил ли новый участник предыдущего победителя по итоговому счету; если да, то записываем имя и счет победителя
        begin
          winScore := maybeWin;
          winName := name;
        end;
      end;
      WriteLn('===Конец файла===');
      WriteLn();
      WriteLn('Число строк в файле ', sCount);
      WriteLn('Победитель ', winName);
      WriteLn('С итоговым счетом ', winScore);
    end;
end;

var f1: text;
    filename: string;

begin
  filename := 'C:\Pascal\19\input2.txt';
  fileContent(f1, filename);
  readln();
end.

КОНСОЛЬ

Файл существует, вот его содержимое:

===Начало файла===
Вася    16     485
Коля    17   555
Юра     18   61
Саша    34   456
Андрей   44   67
Влад     2    51
Карл     8     8
Георгий  545   2000
===Конец файла===

Число строк в файле 8
Победитель Георгий
С итоговым счетом 1455