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

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

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

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

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

type ar = array[1..20] of string;
type br = array[1..10] of integer;
Var f1:text; // тип для открытия текстового файла
    filename, s: string;
    aRs :ar;
    bRs :br;
    cnt, i :integer;

function count(var cnt :integer) :integer;
begin
  cnt := cnt + 1;
  count := cnt;
end;

procedure make_array_string(s :string);
var i :integer;
    str :string;
    fl :boolean;
begin
  for i := 1 to length(s) do
    if (i = length(s)) and (s[i] <> '.') then
    begin
      str := str + s[i];
      count(cnt);
      aRs[cnt] := str;
    end
    else
      if (s[i] <> ' ') and (s[i] <> '.') then
      begin
        str := str + s[i];
        fl := true;
      end
      else
        if s[i] = ' ' then
          if fl then
          begin
            count(cnt);
            aRs[cnt] := str;
            str := '';
            fl := false;
          end
          else
            continue;
end;

procedure make_array_integer(aRs :ar; cnt :integer);
var i, j, vl_I, vl_C :integer;
    s :string;
begin
  j := 1;
  for i := 1 to cnt do
  begin
    s := aRs[i];
    val(s, vl_I, vl_C);
    if vl_C = 0 then
    begin
       bRs[j] := vl_I;
       j := j + 1;
    end;
  end;
end;

begin
  cnt := 1;
  filename := 'C:\Pascal\U_0\input.txt'; // путь к файлу

  assign(f1, filename);
  {$I-} reset(f1);  {$I+}  // попытка открыть файл на чтение с подавлением ошибки
  if IOResult <> 0 then    // если есть ошибки
  begin
    writeLn('File ', filename, ' ne naiden!');
  end else  // если удалось открыть на чтение
  begin
    writeLn('File ', filename, ' suchectvuet. I vot ego soderzimoe:');
    while not eof(f1) do
    begin
      readln(f1, s);
      make_array_string(s);
    end;
   end;

  make_array_integer(aRs, cnt);
  if (bRs[2] - bRs[1] > bRs[4] - bRs[3]) and (bRs[6] - bRs[5] < bRs[4] - bRs[3]) then
    writeln('Vasya - ', bRs[2] - bRs[1])
  else
    if bRs[6] - bRs[5] < bRs[4] - bRs[3] then
      writeln('Kolya  - ', bRs[4] - bRs[3])
    else
      writeln('Urya  - ', bRs[6] - bRs[5]);

  readln();
end. 
File C:\Pascal\U_0\input.txt suchectvuet. I vot ego soderzimoe:
Kolya  - 538
vedro-compota's picture


        if s[i] = ' ' then
          if fl then
          begin
            count(cnt);
            aRs[cnt] := str;
            str := '';
            fl := false;
          end
          else
            continue;

-- можно переписать без вложенности + ветка else когда находится в конце витка только с continue не нужна.

_____________
матфак вгу и остальная классика =)

type ar = array[1..20] of string;
type br = array[1..10] of integer;
Var f1:text; // тип для открытия текстового файла
    filename, s: string;
    aRs :ar;
    bRs :br;
    cnt, i :integer;

function count(var cnt :integer) :integer;
begin
  cnt := cnt + 1;
  count := cnt;
end;

procedure make_array_string(s :string);
var i :integer;
    str :string;
    fl :boolean;
begin
  for i := 1 to length(s) do
    if (i = length(s)) and (s[i] <> '.') then
    begin
      str := str + s[i];
      count(cnt);
      aRs[cnt] := str;
    end
    else
      if (s[i] <> ' ') and (s[i] <> '.') then
      begin
        str := str + s[i];
        fl := true;
      end
      else
        if (s[i] = ' ') and fl then
          begin
            count(cnt);
            aRs[cnt] := str;
            str := '';
            fl := false;
          end ;

end;

procedure make_array_integer(aRs :ar; cnt :integer);
var i, j, vl_I, vl_C :integer;
    s :string;
begin
  j := 1;
  for i := 1 to cnt do
  begin
    s := aRs[i];
    val(s, vl_I, vl_C);
    if vl_C = 0 then
    begin
       bRs[j] := vl_I;
       j := j + 1;
    end;
  end;
end;

begin
  cnt := 1;
  filename := 'C:\Pascal\U_0\input.txt'; // путь к файлу

  assign(f1, filename);
  {$I-} reset(f1);  {$I+}  // попытка открыть файл на чтение с подавлением ошибки
  if IOResult <> 0 then    // если есть ошибки
  begin
    writeLn('File ', filename, ' ne naiden!');
  end else  // если удалось открыть на чтение
  begin
    writeLn('File ', filename, ' suchectvuet. I vot ego soderzimoe:');
    while not eof(f1) do
    begin
      readln(f1, s);
      make_array_string(s);
    end;
   end;

  make_array_integer(aRs, cnt);
  if (bRs[2] - bRs[1] > bRs[4] - bRs[3]) and (bRs[6] - bRs[5] < bRs[4] - bRs[3]) then
    writeln('Vasya - ', bRs[2] - bRs[1])
  else
    if bRs[6] - bRs[5] < bRs[4] - bRs[3] then
      writeln('Kolya  - ', bRs[4] - bRs[3])
    else
      writeln('Urya  - ', bRs[6] - bRs[5]);

  readln();
end.
vedro-compota's picture

засчитано

_____________
матфак вгу и остальная классика =)