Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 421

/ вопрос открыт /

Здравствуйте, эксперты!
требуется сохранить информацию из массива в string list, а затем в файл при этом если в файле есть данные то перед сохранением новых их надо загрузить в программу отсортировать и сохранить все отсортированные с новыми.
информация это запись с параметрами имя игрока время в минутах, время в секундах .
предыдущая статистика загружается в массив записей.

счетчик колва пробелов нужен т.к. информация в файле хранится как
Петров min= 4 sec= 2 <-в конце строки тоже пробел

судя по тому что сохраняется только одна запись целиком, ошибка где то в той части кода, которая для не пустого файла. но понять ее не могу.
помогите пожалуйста.
знаю что и код г. и что переменные дурацкие. но надо сделать...

Приложение:
  1. stat:=TStringList.Create;
  2. stat.LoadFromFile('statistika.txt');
  3. //qw:=1;
  4.  
  5.  
  6. begin {**}
  7.  
  8.  
  9.  
  10.  
  11.  
  12. begin {4*}
  13.  
  14.  
  15.  
  16. begin
  17.  
  18.  
  19. else
  20.  
  21.  
  22. 1: stmas[i+1].name:=slovo;
  23. 3: stmas[i+1].MinTime:=strtoint(slovo);
  24. 5: stmas[i+1].SecTime:=strtoint(slovo);
  25.  
  26. slovo:='';
  27. inc(kolprob);
  28. end; {3*}
  29.  
  30.  
  31. end;
  32. end; {4*}
  33. end{**}
  34.  
  35. begin
  36. qw:=1;
  37.  
  38.  
  39. end;
  40.  
  41.  
  42. if (stmas[i].MinTime>stmas[i+1].MinTime) or ((stmas[i].MinTime=stmas[i+1].MinTime)and(stmas[i].SecTime>stmas[i+1].SecTime)) then
  43. begin
  44. prom:=stmas[i+1];
  45. stmas[i+1]:=stmas[i];
  46. stmas[i]:=prom;
  47. end;
  48. end; }
  49.  
  50.  
  51. memo2.Lines[i+1]:=stmas[i].name+' '+inttostr(stmas[i].MinTime)+' '+inttostr(stmas[i].secTime);
  52. // memo2.Lines[1]:=stmas[0].name+' '+inttostr(stmas[0].MinTime)+' '+inttostr(stmas[0].secTime);
  53. // memo2.Lines[1]:=player.name+' '+inttostr(player.MinTime)+' '+inttostr(player.secTime);
  54.  
  55.  
  56. stat.add(stmas[i].name+' min= '+inttostr(stmas[i].MinTime)+' sec= '+inttostr(stmas[i].SecTime)+' ');
  57.  
  58. stat.savetofile('statistika.txt');
  59. stat.Free;
  60.  


MerryJane Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: MerryJane (статус: Посетитель)
Вопрос отправлен: 17 июня 2011, 22:06
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: min@y™

Короче, обещание я сдержал, класс написал. Исходник его и демо-программу прицепляю к ответу. Кто хочет посмотреть в онлайне - вот ссылка на код класса.
Демо-программа выглядит вот так:

Сортировка работает по клику на заголовках колонок.
На написание всего этого безобразия ушло примерно 3 часа. Код особо не гонял (времени не хватило), возможны баги. Если чо - пиши, исправлю.
Сам ini-файл выглядит вот так:

[Header]
Count=12
[Player_0]
Name=Ангела Доротеевна Меркель
Time=0:10:00
Count=2
Total=100500
[Player_1]
Name=Елизавета II, Елизавета Александра Мария Виндзор
Time=3:33:33
Count=2
Total=65
[Player_2]
Name=Ким Чен Ир
Time=4:00:00
Count=3
Total=4534
[Player_3]
Name=Лукашенко Александр Григорьевич
Time=6:06:06
Count=2
Total=777
[Player_4]
Name=Махмуд Ахмадинежад
Time=0:00:31
Count=3
Total=2345
[Player_5]
Name=Медведев Дмитрий Анатольевич
Time=0:38:00
Count=2
Total=23
[Player_6]
Name=Муаммар бен Мухаммед Абу Меньяр Абдель Салям бен Хамид аль-Каддафи
Time=13:13:13
Count=3
Total=6676
[Player_7]
Name=Обама Барак Хуссейнович
Time=0:25:00
Count=3
Total=100500
[Player_8]
Name=Путин Владимир Владимирович
Time=1:00:00
Count=2
Total=15
[Player_9]
Name=Ху Дзыньтао
Time=0:25:00
Count=2
Total=3487
[Player_10]
Name=Чавес Уго Рафаэлевич
Time=0:10:00
Count=3
Total=36456
[Player_11]
Name=Янукович Виктор Фёдорович
Time=0:45:00
Count=2
Total=100

Как видишь, его можно править вручную в любом текстовом редакторе.
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 20 июня 2011, 14:42
Оценка за ответ: 5

Комментарий к оценке: огромное спасибо за огромную помощь(=

Мини-форум вопроса

Всего сообщений: 28; последнее сообщение — 21 июня 2011, 20:26; участников в обсуждении: 3.

Страницы: [1] [2] [Следующая »]

17 июня 2011, 23:10: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Алгоритмы, преобразования модератором Ерёмин А.А.

min@y™

min@y™ (статус: Доктор наук), 18 июня 2011, 13:49 [#1]:

Код просто жуткий. Напиши мне задание, я тебе сделаю по-нормальному.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
bugmenot

bugmenot (статус: 3-ий класс), 18 июня 2011, 15:49 [#2]:

По-моему, комментарии участников к прошлым вопросам изрядно добавили вермишели. Надо разделить и овладеть, вынеся разбор строки в процедуру. И еще я бы о формате задумался, пробел в конце строки - определённо фигня.
виконання програми розпочинається з того самого мiсця, де призупинилося.

min@y™

min@y™ (статус: Доктор наук), 18 июня 2011, 16:03 [#3]:

Цитата (bugmenot):

пробел в конце строки - определённо фигня.

Это маркер конца слова. Естественно, от него можно и нужно избавляться.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
bugmenot

bugmenot (статус: 3-ий класс), 18 июня 2011, 17:42 [#4]:

"Василий Евлампиевич Пупкин ибн Спробелами 00:42:42"
и тогда весь разбор сведется к нахождению последнего пробела и вызову StrToTime, еще может TrimRight чтобы лишних пробельных символов не затесалось
виконання програми розпочинається з того самого мiсця, де призупинилося.

MerryJane

MerryJane (статус: Посетитель), 18 июня 2011, 21:28 [#5]:

min@y™:
задание такое
есть игра. имя игрока время в минутах , секундах. сколько фишек выбрал по скольку убирал хранятся в записи

Tplayer = record
name:string[20];
MinTime:integer;
SecTime:integer;
PoSkolko:byte;
Skolko:integer;
end;

player: Tplayer;
stmas: array of tplayer;

Нужно сохранять статистику игры в текстовый файл, что бы можно было его редактировать куда то переносить. статистика должна быть отсортирована по времени(от минимального к максимальному). выгрузка данных в программу о предыдущих играх из этого текстового файла.

вот... правда поможете?)
MerryJane

MerryJane (статус: Посетитель), 18 июня 2011, 21:36 [#6]:

bugmenot:
время хранится не в таком формате как вы указали, потому что минуты и секунды в разных разделах записи и при записи в файл не стала так красиво записывать что бы по проще было доставать его(время) обратно в запись. что бы потом в массиве все записи уже просто по времени сортировать.
bugmenot

bugmenot (статус: 3-ий класс), 19 июня 2011, 00:33 [#7]:

Цитата (MerryJane):

время хранится не в таком формате как вы указали, потому что минуты и секунды в разных разделах записи и при записи в файл не стала так красиво записывать что бы по проще было доставать его(время) обратно в запись

Поменять уже нельзя? Потому, что получилось наоборот, сложнее.
виконання програми розпочинається з того самого мiсця, де призупинилося.

MerryJane

MerryJane (статус: Посетитель), 19 июня 2011, 01:05 [#8]:

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

а вообще.. все перподватели меня всегда ругают что слишком усложняю задачи и решения ее. вот.
bugmenot

bugmenot (статус: 3-ий класс), 19 июня 2011, 04:00 [#9]:

А в файле какие-то еще данные будут храниться? А так мне видится разбор строки:

procedure Parse(const Line: string; var Player: Tplayer);
const
  HoursPerDay = 24;
  MinsPerHour = 60;
  SecsPerMin  = 60;
 
  MinsPerDay  = HoursPerDay * MinsPerHour;
  SecsPerDay  = MinsPerDay * SecsPerMin;
var
  Index: Integer;
  Time: TTime;
begin
  Index := LastDelimiter(' ', Line);
  Assert(Index > 0);
 
  Player.name := Copy(Line, 1, Index - 1);
  Time := StrToTime(Copy(Line, Index + 1, MaxInt));
 
  Player.MinTime := Trunc(Time * MinsPerDay);
  Player.SecTime := Round(Time * SecsPerDay) mod SecsPerMin;
end;
 
{ пример }
procedure TForm1.FormCreate(Sender: TObject);
var
  Player: Tplayer;
begin
  Parse('Петрович 01:42:42', Player);
  Parse('Эзра Моисеевич Зильберштейн 00:22:32', Player);
end;
виконання програми розпочинається з того самого мiсця, де призупинилося.

bugmenot

bugmenot (статус: 3-ий класс), 19 июня 2011, 04:09 [#10]:

* константы я приволок ради наглядности, а так они все определены в DateUtils
* для понимания арифметики со временем - рекомендую прочитать в хелпе про TDateTime
* ради краткости я не инициализировал переменную Player поэтому в остальных полях - мусор, я так и не понял что значит сколько-посколько
ну вроде всё

Цитата (MerryJane):

разделять их на минуты и секунды сравнивать потом обратно
идея в том чтобы сравнивать не компоненты времени, а время
типа 00:01:30 это 90 секунд и больше ничем заморачиваться не надо
виконання програми розпочинається з того самого мiсця, де призупинилося.

min@y™

min@y™ (статус: Доктор наук), 19 июня 2011, 11:54 [#11]:

Короче, так.
type
  TPlayer = class
  private
    FName:  string;
    FTime:  TTime;
    FCount: Byte;
    FTotal: DWORD;
  public
    property Name: string read FName write FName;
    property Time: TTime read FTime write FTime;
    property Count: Byte read FCount write FCount;
    property Total: DWORD read FTotal write FTotal;
 
    procedure SaveToFile(Ini: TIniFile);   // сохранение (можно и в XML)
    procedure LoadFromFile(Ini: TIniFile); // загрузка
  end;
 
  TPlayers = class
  private
    FPlayers: TObjectList; // список игроков
    function GetCount: Integer;
    function GetPlayer(const Index: Integer): TPlayer;
  public
    constructor Create;
    destructor Destroy; override;
 
    function SaveToFile(const FileName: string): Boolean; // сохранение
    function LoadFromFile(const FileName: string): Boolean; // загрузка
 
    function AddPlayer(const AName, ATime, ACount, ATotal): TPlayer; // добавление
    procedure DeletePlayer(const Index: Integer); overload; // удаление
    procedure DeletePlayer(APlayer: TPlayer); overload;     // удаление
 
    procedure SortByName;  // сортировка по имени
    procedure SortByTime;  // по времени
    procedure SortByCount; // по количеству
 
    property Count: Integer read GetCount; // количество
    property Players[const Index: Integer]: TPlayer read GetPlayer; // доступ по номеру
  end;

Дальше продолжать?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
MerryJane

MerryJane (статус: Посетитель), 19 июня 2011, 14:47 [#12]:

min@y™: Да продолжать о.о
MerryJane

MerryJane (статус: Посетитель), 19 июня 2011, 14:53 [#13]:

только по кол-ву можно не сортировать ,
min@y™

min@y™ (статус: Доктор наук), 19 июня 2011, 14:56 [#14]:

Цитата (MerryJane):

Да продолжать о.о

Завтра на работу приду и продолжу. Может, вместо INI-файла заюзать XML?

Цитата (MerryJane):

только по кол-ву можно не сортировать

Ладно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
MerryJane

MerryJane (статус: Посетитель), 19 июня 2011, 14:59 [#15]:

Может, вместо INI-файла заюзать XML?

эм.. лучше то что будет выглядеть так как будто не профессионал делал.. иначе получу еще один доп и его уже не переживу. уже вроде пятый делаю...
Спасибо огромное, что помогаете(=
min@y™

min@y™ (статус: Доктор наук), 19 июня 2011, 15:16 [#16]:

Даже если юзать INI, будет похоже, что профессионал делал. Однако преподу можешь сказать полуправду - "в интернете научили".
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
MerryJane

MerryJane (статус: Посетитель), 19 июня 2011, 15:42 [#17]:

и взять тогда еще один доп(+ нет уж лучше разберусь в том что вы напишите так, что бы вообще не в чем засыпать не смог)) ну и что бы на будущее суметь так же написать...
min@y™

min@y™ (статус: Доктор наук), 19 июня 2011, 15:52 [#18]:

Цитата (MerryJane):

и взять тогда еще один доп

А чо такое "доп"?

Цитата (MerryJane):

лучше разберусь в том что вы напишите так, что бы вообще не в чем засыпать не смог)) ну и что бы на будущее суметь так же написать...

Я код комментариями нашпигую, не боись.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
MerryJane

MerryJane (статус: Посетитель), 19 июня 2011, 16:21 [#19]:

ну игра изначально просто лаба а сделать статистику лишнюю фишку таймер сортировку статистики - это все дополнительные задания.) если их не сделать, лабу не сдать(ну еще если на вопросы по коду не ответить). вот) а лабу не сдать - не получить допуск к экзамену).

Я код комментариями нашпигую, не боись.
спасибо огромное
MerryJane

MerryJane (статус: Посетитель), 19 июня 2011, 16:46 [#20]:

эм.. а еще я никогда с этими ini файлами не работала они читаем сами по себе?
ну то есть через блокнот открою и там будет нормальный русский язык, а не какая нибудь символика?

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

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:40
Выполнено за 0.06 сек.