Нужно найти ошибку в программе простенькой задачи - 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.
Решение валится на 3-ем тесте(они мне неизвестны). Выдает ошибку - "Presentation error", которая означает что файл не создан, неверное имя файла или сбой программы до открытия выходного файла. В программе разрешено не открывать файлы Input.txt и Output.txt самостоятельно. Видимо, программа дает ненулевой код возврата, но я придумал много тестов и всегда программа завершала работу с нулевым кодом возврата и верными выходными данными. Помогите найти ошибку!

Решение задачи: «Нужно найти ошибку в программе простенькой задачи»

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.

Объяснение кода листинга программы

Список элементов кода:

  1. Объявление типа данных p и записи f.
  2. Создание переменных a, b, c, h типа p.
  3. Создание переменных l, m, i, j, k, y типа Integer.
  4. Чтение из файла двух чисел l и m.
  5. Увеличение значения переменной y на m.
  6. Чтение строки из файла в переменную a^.s.
  7. Извлечение из строки значения переменной d и количества символов k.
  8. Установка значения переменной b равным a.
  9. Цикл от i равным 2 до m выполняющий следующие действия:
    1. Создание нового указателя b^.n.
    2. Установка значения переменной b равным b^.n.
    3. Чтение строки из файла в переменную b^.s.
    4. Извлечение из строки значения переменной d и количества символов k.
    5. Пока значение переменной c не равно Nil и значение переменной h^.d меньше значения переменной c^.d выполняющий следующие действия:
    6. Установка значения переменной b равным c.
    7. Установка значения переменной c равным c^.n.
    8. Установка значения переменной h^.n равным c.
    9. Если значение переменной c равно a то присваивание значения переменной a равным h, иначе присваивание значения переменной b^.n равным h.
    10. Установка значения переменной b равным h.
    11. Вывод на экран значения переменной y.
    12. Цикл от i равным 1 до y выполняющий следующие действия:
    13. Вывод на экран значения переменной a^.s.
    14. Установка значения переменной a равным a^.n.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5
Похожие ответы