Нужно найти ошибку в программе простенькой задачи - 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:
Листинг программы
  1. Program z;
  2. Var A:Array[1..2000] Of String[34];
  3. i,j,n,m,t,k,l:Word;
  4. S:String;
  5. Function F(S:String):Real;
  6. Var w:Byte;
  7. m:Real;
  8. Begin
  9. Val(Copy(S,1,Pos(' ',S)-1),m,w);
  10. F:=m
  11. End;
  12. Begin
  13. Read(n);
  14. t:=0;
  15. For i:=1 To n Do
  16. Begin
  17. ReadLn(m);
  18. t:=t+m;
  19. For j:=1 To m Do
  20. Begin
  21. ReadLn(S);
  22. If t=m Then A[j]:=S
  23. Else
  24. Begin
  25. l:=1;
  26. While (F(S)<F(A[l])) And (l<=t) Do l:=l+1;
  27. k:=t;
  28. While k>=l Do
  29. Begin
  30. A[k+1]:=A[k];
  31. k:=k-1
  32. End;
  33. A[l]:=S
  34. End
  35. End
  36. End;
  37. WriteLn(t);
  38. For i:=1 To t Do WriteLn(A[i])
  39. End.
Решение валится на 3-ем тесте(они мне неизвестны). Выдает ошибку - "Presentation error", которая означает что файл не создан, неверное имя файла или сбой программы до открытия выходного файла. В программе разрешено не открывать файлы Input.txt и Output.txt самостоятельно. Видимо, программа дает ненулевой код возврата, но я придумал много тестов и всегда программа завершала работу с нулевым кодом возврата и верными выходными данными. Помогите найти ошибку!

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

textual
Листинг программы
  1. Program z;
  2.  Type p=^f;
  3.       f=Record
  4.          d:Real;
  5.          s:String[33];
  6.          n:p
  7.         End;
  8.  Var a,b,c,h:p;
  9.      l,m,i,j,k,y:Integer;
  10.  Begin
  11.   ReadLn(l,m);
  12.   y:=y+m;
  13.   New(a);
  14.   ReadLn(a^.s);
  15.   With a^ Do
  16.    Val(Copy(s,1,Pos(' ',s)-1),d,k);
  17.   b:=a;
  18.   For i:=2 To m Do
  19.    Begin
  20.      New(b^.n);
  21.      b:=b^.n;
  22.      ReadLn(b^.s);
  23.      With b^ Do
  24.       Val(Copy(s,1,Pos(' ',s)-1),d,k);
  25.    End;
  26.   b^.n:=Nil;
  27.   For i:=2 To l Do
  28.    Begin
  29.     ReadLn(m);
  30.     y:=y+m;
  31.     c:=a;
  32.     For j:=1 To m Do
  33.      Begin
  34.        New(h);
  35.        ReadLn(h^.s);
  36.        With h^ Do
  37.         Val(Copy(s,1,Pos(' ',s)-1),d,k);
  38.        While (c<>Nil) And (h^.d<c^.d) Do
  39.         Begin
  40.           b:=c;
  41.           c:=c^.n
  42.         End;
  43.        h^.n:=c;
  44.        If c=a Then a:=h Else b^.n:=h;
  45.        b:=h
  46.      End
  47.    End;
  48.   WriteLn(y);
  49.   For i:=1 To y Do
  50.    Begin
  51.     WriteLn(a^.s);
  52.     a:=a^.n
  53.    End
  54.  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы