Нужно найти ошибку в программе простенькой задачи - Free Pascal
Формулировка задачи:
Задача:
TopCoder
(Время: 1 сек. Память: 16 Мб Сложность: 25%)
Некоторые из вас, наверное, слышали о сайте http://www.topcoder.com, на котором часто проводятся различные соревнования по программированию.
В некоторых из них участникам предлагаются три задачи, каждая из которых оценивается в некоторое количество баллов. В зависимости от того, насколько долго участник решал задачу, количество полученных им за нее баллов уменьшается. Как и в большинстве других соревнований, выигрывает участник, набравший наибольшее число баллов. Участники, набравшие одинаковое число баллов, считаются выступившими одинаково и их порядок в таблице итоговых результатов не важен. Из-за некоторых особенностей этих соревнований для предотвращения жульничества участники разделены в группы по 20 человек, называемые комнатами.
Ваша задача заключается в том, чтобы написать программу, которая по итоговым результатам в каждой комнате выводила бы суммарные итоговые результаты.
Входные данные:
Первая строка входного файла INPUT.TXT содержит целое число n (1 ≤ n ≤ 100) - число комнат. Далее следуют n описаний итоговых результатов в комнатах. Результаты в i-ой комнате заданы в следующем формате. Первая строка содержит целое число ni (1 ≤ ni ≤ 20)- количество участников в i-ой комнате. Следующие ni строк содержат информацию о выступлениях участников. j+1-ая строка описания результатов в i-ой комнате содержит информацию об участнике, занявшем в i-ой комнате j-ое место: разделенные одним пробелом вещественное число totalij (-5000 ≤ totalij ≤ 10000) и строку nameij - соответственно количество набранных участником баллов и его имя. Имя участника имеет длину от 1 до 25 и может содержать только буквы латинского алфавита, цифры и символ подчеркивания. При этом первый символ имени не является цифрой. Все вещественные числа заданы с двумя знаками после десятичной точки. Гарантируется, что в каждой комнате участники упорядочены по невозрастанию набранных ими баллов.Выходные данные:
На первой строке выходного файла OUTPUT.TXT выведите N - суммарное число участников. На следующих N строках выведите информацию о выступлении участников. (k+1)-ая строка описания суммарных результатов должна содержать информацию об участнике, занявшем k-ое место: разделенные одним пробелом вещественное число totalk с двумя знаками после десятичной точки и строку namek - соответственно количество набранных участником баллов и его имя. Не забудьте, что участники должны быть упорядочены по невозрастанию набранных ими баллов. Пример: Input.txt: 2 6 909.94 Savior 439.51 tywok 130.52 LimberG 0.00 BryanChen 0.00 angsa -75.00 The_Hedgehog 5 867.15 Ying 448.12 natori 195.32 aubergineanode 0.00 shalinmangar -25.00 Excilus Output.txt: 11 909.94 Savior 867.15 Ying 448.12 natori 439.51 tywok 195.32 aubergineanode 130.52 LimberG 0.00 angsa 0.00 shalinmangar 0.00 BryanChen -25.00 Excilus -75.00 The_Hedgehog Вот мой код на FreePascal 2.6.4:Program z;
Var A:Array[1..2000] Of String[34];
i,j,n,m,t,k,l:Word;
S:String;
Function F(S:String):Real;
Var w:Byte;
m:Real;
Begin
Val(Copy(S,1,Pos(' ',S)-1),m,w);
F:=m
End;
Begin
Read(n);
t:=0;
For i:=1 To n Do
Begin
ReadLn(m);
t:=t+m;
For j:=1 To m Do
Begin
ReadLn(S);
If t=m Then A[j]:=S
Else
Begin
l:=1;
While (F(S)<F(A[l])) And (l<=t) Do l:=l+1;
k:=t;
While k>=l Do
Begin
A[k+1]:=A[k];
k:=k-1
End;
A[l]:=S
End
End
End;
WriteLn(t);
For i:=1 To t Do WriteLn(A[i])
End.Решение задачи: «Нужно найти ошибку в программе простенькой задачи»
textual
Листинг программы
Program z;
Type p=^f;
f=Record
d:Real;
s:String[33];
n:p
End;
Var a,b,c,h:p;
l,m,i,j,k,y:Integer;
Begin
ReadLn(l,m);
y:=y+m;
New(a);
ReadLn(a^.s);
With a^ Do
Val(Copy(s,1,Pos(' ',s)-1),d,k);
b:=a;
For i:=2 To m Do
Begin
New(b^.n);
b:=b^.n;
ReadLn(b^.s);
With b^ Do
Val(Copy(s,1,Pos(' ',s)-1),d,k);
End;
b^.n:=Nil;
For i:=2 To l Do
Begin
ReadLn(m);
y:=y+m;
c:=a;
For j:=1 To m Do
Begin
New(h);
ReadLn(h^.s);
With h^ Do
Val(Copy(s,1,Pos(' ',s)-1),d,k);
While (c<>Nil) And (h^.d<c^.d) Do
Begin
b:=c;
c:=c^.n
End;
h^.n:=c;
If c=a Then a:=h Else b^.n:=h;
b:=h
End
End;
WriteLn(y);
For i:=1 To y Do
Begin
WriteLn(a^.s);
a:=a^.n
End
End.
Объяснение кода листинга программы
Список элементов кода:
- Объявление типа данных
pи записиf. - Создание переменных
a,b,c,hтипаp. - Создание переменных
l,m,i,j,k,yтипаInteger. - Чтение из файла двух чисел
lиm. - Увеличение значения переменной
yнаm. - Чтение строки из файла в переменную
a^.s. - Извлечение из строки значения переменной
dи количества символовk. - Установка значения переменной
bравнымa. - Цикл от
iравным 2 доmвыполняющий следующие действия:- Создание нового указателя
b^.n. - Установка значения переменной
bравнымb^.n. - Чтение строки из файла в переменную
b^.s. - Извлечение из строки значения переменной
dи количества символовk. - Пока значение переменной
cне равноNilи значение переменнойh^.dменьше значения переменнойc^.dвыполняющий следующие действия: - Установка значения переменной
bравнымc. - Установка значения переменной
cравнымc^.n. - Установка значения переменной
h^.nравнымc. - Если значение переменной
cравноaто присваивание значения переменнойaравнымh, иначе присваивание значения переменнойb^.nравнымh. - Установка значения переменной
bравнымh. - Вывод на экран значения переменной
y. - Цикл от
iравным 1 доyвыполняющий следующие действия: - Вывод на экран значения переменной
a^.s. - Установка значения переменной
aравнымa^.n.
- Создание нового указателя