Нужно найти ошибку в программе простенькой задачи - 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
.
- Создание нового указателя
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д