Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
1 / 1 / 3
Регистрация: 27.12.2014
Сообщений: 68
1

Определение победителей

01.03.2015, 15:54. Показов 2083. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Только недавно начал изучать Delphi. Требуется помощь в следующей задаче.
Кликните здесь для просмотра всего текста
Каждый участник регистрируется на сайте игры под определённым игровым именем. Имена участников не повторяются.
Чемпионат проводится в течение определённого времени. В любой момент этого времени любой зарегистрированный участник может зайти на сайт чемпионата и начать зачётную игру. По окончании игры её результат (количество набранных очков) фиксируется и заносится в протокол.
Участники имеют право играть несколько раз. Количество попыток одного участника не ограничивается.
Окончательный результат участника определяется по одной игре, лучшей для данного участника.
Более высокое место в соревнованиях занимает участник, показавший лучший результат.
При равенстве результатов более высокое место занимает участник, раньше показавший лучший результат.
В ходе соревнований заполняется протокол, каждая строка которого описывает одну игру и содержит результат участника и его игровое имя. Протокол формируется в реальном времени по ходу проведения чемпионата, поэтому строки в нём расположены в порядке проведения игр: чем раньше встречается строка в протоколе, тем раньше закончилась соответствующая этой строке игра.
Напишите эффективную, в том числе по памяти, программу, которая по данным протокола определяет победителя и призёров. Гарантируется, что в чемпионате участвует не менее трёх игроков.
Перед текстом программы кратко опишите алгоритм решения задачи и укажите используемый язык программирования и его версию.
Описание входных данных
Первая строка содержит число N- общее количество строк протокола. Каждая из следующих N строк содержит записанные через пробел результат участника (целое неотрицательное число, не превышающее 100 миллионов) и игровое имя (имя не может содержать пробелов). Строки исходных данных соответствуют строкам протокола и расположены в том же порядке, что и в протоколе.
Гарантируется, что количество участников соревнований не меньше 3.
Описание выходных данных
Программа должна вывести имена и результаты трёх лучших игроков по форме, приведённой ниже в примере.
Пример входных данных:
9
69485 Jack
95715 qwerty
95715 Alex
83647 М
197128 qwerty
95715 Jack
93289 Alex
95715 Alex
95710 M
Пример выходных данных для приведённого выше примера входных данных:
1 место. qwerty (197128)
2 место. Alex (95715)
3 место. Jack (95715)

Я реализовал эту задачу на Pascal'е. В Lazarus я набросал интерфейс. В memo1 нужно записывать список участников и их очки, потом сохранять в файл (я попробовал сделать с возможностью сохранять, даже если в пути есть русские буквы), открывать с отображением в том же memo1, а по нажатию "Выполнить" в memo2 должны быть отобраны 3 победителя.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var i, j, k, posName, N:longint;
    res0: integer;
    name0: string;
    name:array[1..3] of string;
    res: array[1..3] of integer;
begin
readln(N);
for i:=1 to 3 do res[i]:=0;
for i:=1 to N do begin
  readln(res0, name0);
    { ищем участнка в списке }    
  posName:= 1;
  while (posName < 3) and (name[posName] <> name0) do
    inc(posName);
    { ищем результат меньше, чем новый }    
  k:= 1;
  while (k < posName) and (res[k] >= res0) do
    inc(k);
    { если получен лучшй результат,... }    
  if res[k] < res0 then begin
    for j:=posName downto k+1 do begin
      res[j]:= res[j-1];
      name[j]:= name[j-1];
    end;
    res[k]:= res0;
    name[k]:= name0;
  end;
end;
for i:=1 to 3 do
  writeln(i,' место. ', name[i], ' (', res[i], ')');
end.
Прикрепил то, что сделал в Lazarus. Помогите разобраться.
Вложения
Тип файла: rar Задача.rar (124.5 Кб, 8 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2015, 15:54
Ответы с готовыми решениями:

Из списка участников конкурса, с их количеством баллов, выбрать 3-х победителей
Добрый день. Нужна помощь в решении задачи. Нужно из списка участников конкурса с их количеством...

Определение победителей в соревнованиях по яйцеводству
в двух разных деревнях проходят соревнования по яйцеводству. Известно, что в каждом хозяйстве...

Непростой запрос на определение победителей
Уважаемые гуру sql, прошу вашей помощи в написании запроса. В общем суть такая, --проводится...

Количество победителей по классам
В условиях предыдущей задачи (https://www.cyberforum.ru/turbo-pascal/thread1684276.html) определите...

1
1 / 1 / 3
Регистрация: 27.12.2014
Сообщений: 68
03.03.2015, 17:10  [ТС] 2
Лучший ответ Сообщение было отмечено Ovenvan как решение

Решение

Написал код на Delphi. Только вот программа работает некорректно. Не могли бы вы помочь с решение этой проблемы.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, Menus;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    MainMenu1: TMainMenu;
    Memo1: TMemo;
    Memo2: TMemo;
    MenuItem1: TMenuItem;
    MenuItem2: TMenuItem;
    MenuItem3: TMenuItem;
    MenuItem4: TMenuItem;
    MenuItem5: TMenuItem;
    MenuItem6: TMenuItem;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Splitter1: TSplitter;
    procedure MenuItem1Click(Sender: TObject);
    procedure MenuItem3Click(Sender: TObject);
    procedure MenuItem4Click(Sender: TObject);
    procedure MenuItem5Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
 
procedure TForm1.MenuItem1Click(Sender: TObject); {close}
begin
  Form1.Close;
end;
 
procedure TForm1.MenuItem3Click(Sender: TObject);{make}
var
    i, j, k, posName, n:longint;
    ires, iname, res0: integer;
    copyresult, name0: string;
    name1:array[1..3] of string;
    res1: array[1..3] of integer;
begin
n := 0;
for i := 0 to Memo1.Lines.Count-1 do
  if Trim(Memo1.Lines[i]) <> '' then Inc(n);
for i:=1 to 3 do res1[i]:=0;
for i:=1 to n do
  begin
  for ires := 0 to Memo1.Lines.Count - 1 do
    if Pos(#32, Memo1.Lines.Strings[ires]) <> 0 then
    begin
      res0 := strtoint(Copy(Memo1.Lines.Strings[ires], Pos( ' ', Memo1.Lines.Strings[ires] ) + 1, Length(Memo1.Lines.Strings[ires]) ));
      Break;
    end;
  begin
  for iname := 0 to Memo1.Lines.Count - 1 do
    if Pos(#32, Memo1.Lines.Strings[iname]) <> 0 then
    begin
      name0 := Copy(Memo1.Lines.Strings[iname], Pos(' ',Memo1.Lines.Strings[iname] ), Length(Memo1.Lines.Strings[iname]));
      Break;
    end;
  end;
    { ищем участнка в списке }
  posName:= 1;
  while (posName < 3) and (name1[posName] <> name0) do
    inc(posName);
    { ищем результат меньше, чем новый }
  k:= 1;
  while (k < posName) and (res1[k] >= res0) do
    inc(k);
    { если получен лучшй результат,... }
  if res1[k] < res0 then
  begin
    for j:=posName downto k+1 do
      begin
      res1[j]:= res1[j-1];
      name1[j]:= name1[j-1];
      end;
    res1[k]:= res0;
    name1[k]:= name0;
  end;
  end;
for i:=1 to 3 do
  begin
  Memo2.Lines.Add(name1);
  Memo2.Lines.Add(res1);
  end;
end;
 
procedure TForm1.MenuItem4Click(Sender: TObject); {open}
begin
  if OpenDialog1.Execute then
  Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end;
 
procedure TForm1.MenuItem5Click(Sender: TObject); {save}
 begin
   if SaveDialog1.Execute then Memo1.Lines.SaveToFile(SaveDialog1.FileName);
end;
end.
0
03.03.2015, 17:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2015, 17:10
Помогаю со студенческими работами здесь

Вывести победителей заплыва
Pascal ABC 1)В ЭВМ поступают результаты соревнований по плаванию для трех спортсменов. Составить...

Найти количество победителей олимпиады
По школам района(№15,181,211,213,215,367,1115,1125,1560,1820) собирается информация об участниках...

Определить победителей в соревновании по стрельбе
В системе координат X, Y «нарисована» мишень на 10 кругов с центром в начале координат и шагом...

Задача про пары победителей
Дана корзина, в которой размещены и случайно перемешаны M шариков N цветов: M = s1+s2+...+sN, где...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru