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