Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
3 / 3 / 3
Регистрация: 18.12.2014
Сообщений: 158
1

База данных

23.02.2017, 01:11. Показов 1079. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, не могу придумать логику для решения задачи.
Суть задачи: Найти победителя для каждой группы.
Есть 2 текстовых файла.
1 файл:
id участника|группа
1 | ГР1
2 | ГР2
..

2 файл:
id участника|время финиша
1 | 01:00
2 | 01:05
..

Выиграл тот, кто пришел раньше.

В двух файлах id участника это ключевое поле.
Но логику решения я не особо пойму.
Моя логика: при помощи множеств найти, сколько всего разных групп.
После чего для каждого элемента множества ( группы) найти по id участников.
После чего сортировать участников каждой группы через цикл <если время i меньше, чем i+1 ТО он победитель>

Но я не совсем пойму, как брать один элемент множества и находить для него участников.
Групп же может быть и 100 и 1000. И для каждой группы придется делать множество участников.


Вобщем прошу помочь разобраться с логикой построения программы.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.02.2017, 01:11
Ответы с готовыми решениями:

База данных
Написать программу заполнения базы данных с клавиатуры и выполнения одного какого-либо запроса...

База данных студенты.
Нужна программа создающая базу данных студентов Имя и Номер, программа должна перезаписываться или...

Фаил и база данных
В обшем у меня задание такое: В файле хранится информация о продукте, а именно код товара,...

школьная база данных
Ребят вот не могу справиться с задачей , условия таковы - &quot;Составить&quot; школьная база данных в...

2
5079 / 2651 / 2349
Регистрация: 10.12.2014
Сообщений: 10,028
24.02.2017, 07:08 2
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Т.к. полного задания не вижу, сделаю предположение, что в первом и втором файле количество строк одинаковое и поле id соответствуют друг другу.
Тогда делаем параллельное считывание сразу из двух файлов и запоминаем только пары с минимальным временем.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
const
  f1name = '1 файл';
  f2name = '2 файл';
  
type
  GT = record
    id : Integer;
    time : String[5];
  end;
 
function vector(time : String) : Integer;
begin
  var a := time.toWords(':'); Result := StrToInt(a[0]) * 60 + StrToInt(a[1]);
end;
 
function Parse(S : String; var id : Integer; var r : String) : Boolean;
begin
  Result := False;
  try
    var a := S.toWords('|');
    id := StrToInt(a[0].Trim);
    r  := a[1].Trim;
  except
    Exit;
  end;
  Result := True;
end;
  
begin
  var id, idMin : Integer;
  var S1, S2, group, time : String;
  var f1, f2 : Text;
  var a, aMin : GT;
 
  var groups := New Dictionary<string,GT>; // Группа и id победителя
  
  Reset(f1, f1name); Reset(f2, f2name);
  while Not EOF(f1) and Not EOF(f2) do
    begin
      ReadLn(f1, S1); ReadLn(f2, S2);
      if Parse(S1, id, group) and Parse(S2, id, time) then
        begin
          (a.id, a.time) := (id, time);
          if Not groups.TryGetValue(group, aMin) then // такой группы ещё нет
            groups[group] := a
          else if vector(aMin.time) > vector(a.time) then // группа есть, а время не минимальное
            groups[group] := a;
        end;
    end;
  Close(f1); Close(f2);
  
  WriteLn('Номера участников победителей для каждой группы:');
  foreach var u in groups do
    WriteLnFormat('Группа {0} - победитель с id {1}', u.key, u.value.id);
end.
Вроде ни чего сложного ;–)
1
3 / 3 / 3
Регистрация: 18.12.2014
Сообщений: 158
26.02.2017, 21:32  [ТС] 3
в 54 строке выдает, что id не объявлен в типе. Хотя он же объявлен.

Добавлено через 2 часа 3 минуты
Я вот так сделал:
Сделал запись групп и id
Взял время финиша и для каждой группы нашел победителя.
Только у меня массив записей получился фиксированным. Не получилось его сделать динамическим

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
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
type
  TSpisoc = array [1..11] of record
    fio: string;
    id: string;
    grupa: string;
    finish: integer;
  end;
 
var
  sort: Tspisoc;
  
  fU, fF: text;
  str: string;
  i, min: integer;
  set_gr: set of string;
 
begin
  assign(fU, 'Участники.txt');
  assign(fF, 'Протокол финиша.txt'); 
  Reset(fU);
  readln(fU, str);
  i := 1;
  
  while not EOF(fU) do
  begin
    readln(fU, str);
    sort[i].id := copy(str, pos('|', str) + 1, 2);
    sort[i].grupa := copy(str, pos('|ГР', str) + 1, 5);
    sort[i].fio := copy(str, 1, 18);
    inc(i);
  end;
  close(fU);
  
  
  Reset(fF);
  i := 1;
  readln(fF, str);
  while not EOF(fF) do
  begin
    readln(fF, str);
    if str = '' then inc(i)
    else
    begin
      if pos('сошел', str) <> 0 then
      begin
        sort[i].finish := 0;
        inc(i);
      end
      else
      begin
        sort[i].finish := StrToInt(concat((copy(str, pos('|', str) + 1, 2)), (copy(str, pos('|', str) + 4, 2)), (copy(str, pos('|', str) + 7, 2))));
        inc(i);
      end;
    end;
  end;
  close(fF);
  
  
  writeln('ФИО                |Группа|Лучшее время финиша');
  for var k := 1 to i - 2 do
  begin
    min := sort[k].finish;
    for var j := 1 to i - 2 do
    begin
      if sort[k].grupa = sort[j].grupa then
        if (sort[j].finish < min) and (sort[j].finish <> 0) then
          min := sort[j].finish;
    end;
    
    if not (sort[k].grupa in set_gr) then
      if(sort[k].finish <> 0) then
      begin
        writeln(sort[k].fio, ' |', sort[k].grupa, ' |', copy(IntToStr(min), 1, 1), ':', copy(IntToStr(min), 2, 2), ':', copy(IntToStr(min), 4, 2));
        include(set_gr, sort[k].grupa);
      end;
  end;
    
end.
0
26.02.2017, 21:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2017, 21:32
Помогаю со студенческими работами здесь

База данных в Pascal
Задание такое: Создать текстовый файл, как базу данных. В текстовом файле описание(класс,...

База данных сотрудников.
Program kontrrabota; uses crt; type lich_dan=record fam:string; ...

База данных файлы
Составить базу данных на паскале..использовать тему файлы,типизированные файлы,записи...Составить...

База данных из записей
дано такое задание База данных должна содержать не менее трех записей с 5 полями...


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

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