Pascal Урок 18 Задача 2
Primary tabs
У вас есть текстовый файл с информацией об итогах соревнований (каждая строка имеет формат: имя + произвольное число пробелов + балл 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. - Log in to post comments
- 4030 reads
vedro-compota
Sat, 09/05/2020 - 20:08
Permalink
v:=true;
-- дать осмысленно название.
2) Вынести в процедуру разбор строки:
3)
-- рискованное присваивание максимуму нуля, прокатит далеко не везде (хотя в этой задаче подходит).
_____________
матфак вгу и остальная классика =)
JimATI
Mon, 09/07/2020 - 18:04
Permalink
Доработка программы
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
Wed, 09/09/2020 - 19:17
Permalink
рискованное присваивание
1) рискованное присваивание максимуму нуля сохранилось
2) ArrIsFull - имя лучше, но неточно
_____________
матфак вгу и остальная классика =)
JimATI
Sat, 09/12/2020 - 18:58
Permalink
Доработка программы
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
Sat, 09/12/2020 - 20:16
Permalink
решение засчитано
решение засчитано
_____________
матфак вгу и остальная классика =)