Pascal Урок 18 Задача 2

Урок 18 задача 2

У вас есть текстовый файл с информацией об итогах соревнований (каждая строка имеет формат: имя + произвольное число пробелов + балл 1 + произвольное число пробелов + балл 2):
Вася 16 485
Коля 17 555
Юра 18 61
..........
-- где:
слева указаны имена участников, а справа число баллов.
Первое число в каждой строке -- штрафные баллы набранные участниками, а второе число -- "положительные баллы", то есть если у нас есть строка:
Vasya N M
где N -- число шрафных баллов, а M - число баллов положительных, то итоговая оценка Васи Z вычисляется как разность:
Z=M−N.
Напишите программу, которая определяет победителя и его итоговый балл (прочитав данный файл построчно).
По возможности разбивайте код на процедуры и функции.

program U18Z2;
type
  a=array[1..3] of integer;
  b=array[1..3] of string;
procedure ConsOlymp(var f1:text;s:string;var t:b;var l,m:a);
var i,d,f,n: integer;
    w,k:string;
    v:boolean;
begin
  d:=1;
  while not eof(f1) do // пока не достигнут конец файла
  begin
  v:=true;
  readln(f1, s);  // читаем из него очередную строку
    for i:= 1 to length(s) do
    begin
      if (s[i]>='0')and(s[i]<='9')and(v=true) then
      begin
        w:=w+s[i];
        val(w,f);
        l[d]:=f;
      end
      else if (s[i]<>' ')and(v=true) then
      begin
        k:=k+s[i];
        t[d]:=k;
      end
      else if(s[i]=' ')and(l[d]<>0) then
      begin
        v:=false;
        w:=' ';
      end
      else if (v = false)and(l[d]<>0) then
      begin
        w:=w+s[i];
        val(w,f);
        m[d]:=f;
      end;
    end;
    m[d]:=m[d]-l[d];
    d:=d+1;
    w:='';
    k:='';
  end;
  end;
 procedure ResOlimp(t:b;m:a);
 var max,d,n:integer;
 begin
 max:=0;
 for d:= low(m) to high(m) do
 begin
   if m[d] > max then
   begin
      max:=m[d];
      n:=d;
   end;
 end;
 d:=n;
 writeln('Pobeditel: ',t[d]);
 writeln('S kolichestvom ballov: ',max);
 end;
var f1:text; // тип для открытия текстового файла
    filename,s: string;
    t:b;
    l,m:a;
begin
  filename := 'C:\Users\User\Desktop\Pascal\U18Z2\7.txt'; // путь к файлу
  assign(f1, filename); { связывание переменной дескриптора с путём к файлу }
  reset(f1); // открываем файла для чтения
  ConsOlymp(f1,s,t,l,m);
  ResOlimp(t,m);
  readln();
end.          
vedro-compota's picture

v:=true;

-- дать осмысленно название.

2) Вынести в процедуру разбор строки:

for i:= 1 to length(s) do
    begin
      if (s[i]>='0')and(s[i]<='9')and(v=true) then
      begin
        w:=w+s[i];
        val(w,f);
        l[d]:=f;
      end
      else if (s[i]<>' ')and(v=true) then
      begin
        k:=k+s[i];
        t[d]:=k;
      end
      else if(s[i]=' ')and(l[d]<>0) then
      begin
        v:=false;
        w:=' ';
      end
      else if (v = false)and(l[d]<>0) then
      begin
        w:=w+s[i];
        val(w,f);
        m[d]:=f;
      end;
    end;

3)

max:=0;
 for d:= low(m) to high(m) do
 begin
   if m[d] > max then

-- рискованное присваивание максимуму нуля, прокатит далеко не везде (хотя в этой задаче подходит).

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

program U18Z2;
type
  a=array[1..3] of integer;
  b=array[1..3] of string;
procedure FishingStr(s:string;var t:b;var l,m:a;var d:integer);
var i,f: integer;
    w,k:string;
    ArrIsFull:boolean;
begin
ArrIsFull:=true;
for i:= 1 to length(s) do
    begin
      if (s[i]>='0')and(s[i]<='9')and(ArrIsFull=true) then
      begin
        w:=w+s[i];
        val(w,f);
        l[d]:=f;
      end
      else if (s[i]<>' ')and(ArrIsFull=true) then
      begin
        k:=k+s[i];
        t[d]:=k;
      end
      else if(s[i]=' ')and(l[d]<>0) then
      begin
        ArrIsFull:=false;
        w:=' ';
      end
      else if (ArrIsFull = false)and(l[d]<>0) then
      begin
        w:=w+s[i];
        val(w,f);
        m[d]:=f;
      end;
    end;
    m[d]:=m[d]-l[d];
    d:=d+1;
    w:='';
    k:='';
end;
 procedure ResOlimp(t:b;m:a);
 var max,d,n:integer;
 begin
 max:=0;
 for d:= low(m) to high(m) do
 begin
   if m[d] > max then
   begin
      max:=m[d];
      n:=d;
   end;
 end;
 d:=n;
 writeln('Pobeditel: ',t[d]);
 writeln('S kolichestvom ballov: ',max);
 end;
var f1:text; // тип для открытия текстового файла
    filename,s: string;
    t:b;
    l,m:a;
    d:integer;
begin
  d:=1;
  filename := 'C:\Users\User\Desktop\Pascal\U18Z2\7.txt'; // путь к файлу
  assign(f1, filename); { связывание переменной дескриптора с путём к файлу }
  reset(f1); // открываем файла для чтения
  while not eof(f1) do // пока не достигнут конец файла
  begin
    readln(f1, s);  // читаем из него очередную строку
    FishingStr(s,t,l,m,d);
  end;
  ResOlimp(t,m);
  readln();
end.
vedro-compota's picture

1) рискованное присваивание максимуму нуля сохранилось
2) ArrIsFull - имя лучше, но неточно

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

program U18Z2;
type
  a=array[1..3] of integer;
  b=array[1..3] of string;
procedure FishingStr(s:string;var t:b;var l,m:a;var d:integer);
var i,f: integer;
    w,k:string;
    ArrIsMainFull:boolean;
begin
ArrIsMainFull:=true;
for i:= 1 to length(s) do
    begin
      if (s[i]>='0')and(s[i]<='9')and(ArrIsMainFull=true) then
      begin
        w:=w+s[i];
        val(w,f);
        l[d]:=f;
      end
      else if (s[i]<>' ')and(ArrIsMainFull=true) then
      begin
        k:=k+s[i];
        t[d]:=k;
      end
      else if(s[i]=' ')and(l[d]<>0) then
      begin
        ArrIsMainFull:=false;
        w:=' ';
      end
      else if (ArrIsMainFull = false)and(l[d]<>0) then
      begin
        w:=w+s[i];
        val(w,f);
        m[d]:=f;
      end;
    end;
    m[d]:=m[d]-l[d];
    d:=d+1;
    w:='';
    k:='';
end;
 procedure ResOlimp(t:b;m:a);
 var max,d,n:integer;
 begin
 max:=m[1];
 n:=1;
 for d:= low(m) to high(m) do
 begin
   if m[d] > max then
   begin
      max:=m[d];
      n:=d;
   end;
 end;
 d:=n;
 writeln('Pobeditel: ',t[d]);
 writeln('S kolichestvom ballov: ',max);
 end;
var f1:text; // тип для открытия текстового файла
    filename,s: string;
    t:b;
    l,m:a;
    d:integer;
begin
  d:=1;
  filename := 'C:\Users\User\Desktop\Pascal\U18Z2\7.txt'; // путь к файлу
  assign(f1, filename); { связывание переменной дескриптора с путём к файлу }
  reset(f1); // открываем файла для чтения
  while not eof(f1) do // пока не достигнут конец файла
  begin
    readln(f1, s);  // читаем из него очередную строку
    FishingStr(s,t,l,m,d);
  end;
  ResOlimp(t,m);
  readln();
end.                          
vedro-compota's picture

решение засчитано

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