Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.12.2011, 17:07
win32nod32 win32nod32 вне форума
Прохожий
 
Регистрация: 27.02.2011
Сообщения: 12
Репутация: 10
По умолчанию Курсовая на файлы

Всем привет! Возникла проблема, весь день сижу - понять не могу в чем дело. Вообщем, есть функция, задача которой возвратить список деталей.
Конкретно: есть 2 TStringList'а - один содержит id деталей, другой количества этих деталей. Необходимо среди этих деталей найти одинаковые, и если такие есть, то сложить их количества. Уверен, что никто ничего не понял поэтому вот код функции:

Код:
function DataBase.GetDetList(id, count: TStringList): TStringList;
var
  i, j, h, q, acont: integer;
  p: byte;
  s: string;
  det, cot: array[1..300] of integer;

begin
  acont := 0; p := 0; q := 0; {обнуление переменных}
  result := tstringlist.Create;
  for i := 0 to id.Count - 1 do  {от 0 до конца списка id}
  begin
    inc(p); {для проверки на обработку не первой записи}
    c := GetComplectForID(strtoint(id[i])); 
{процедура GetComplectForID возвращает тип рекорд: 
           Complects = record
              id: integer;
              engine: integer;
              detail, count: array[1..100] of integer;
              length: integer;
            end;}
    for j := 1 to c.length do {от 1 до конца массивов detail, count}
    begin
      if p = 1 then {если обрабатывается 1 запись}
      begin
        det[j + acont] := c.detail[j]; {то сразу заполняем массивы}
        cot[j + acont] := c.count[j] * strtoint(count[i]); {тут начальное количество деталей умножаеться на кол-во двигателей}
      end else {иначе проходимся по всему массиву}
      for h := 1 to acont do
        if det[h] = c.detail[j] then {если есть одинаковая деталь}
        begin
          inc(q); 
          cot[h] := cot[h] + (c.count[j] * strtoint(count[i])) {прибавляем кол-во текущей записи к ранее записанной}
        end else {иначе просто дополняем массив}
        begin 
          det[j + acont] := c.detail[j];
          cot[j + acont] := c.count[j] * strtoint(count[i]);
        end;
    end;
    acont := acont + c.length; {чтобы не перезаписать, при след. цикле начинаем с конца массива}
  end;
  for i := 1 to acont - q do {отнимаем q от общего кол-ва деталей}
  begin
    s := inttostr(det[i]) + '$' + inttostr(cot[i]); 
    result.Add(s); {заносим в стринглист}
  end;
end;
Если что могу скинуть программу. Сама функция криво считает, значение
acont почему то больше на 1 с.length.
Эмм... Чтобы было понятнее - запустите прогу, в меню есть пункт Создать отчет, нажимаете, выбираете 1,2,3,4 двигатели, количество - по одному. Жмите батон3. По идее в listbox4 должен попасть список : 4$7, 5$11, 7$8,1$9, 2$5, 8$2, 10$3
Вложения
Тип файла: rar 124.rar (239.7 Кбайт, 0 просмотров)

Последний раз редактировалось win32nod32, 01.12.2011 в 17:22.
Ответить с цитированием
  #2  
Старый 02.12.2011, 12:48
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Цитата:
Сообщение от win32nod32
и если такие есть, то сложить их количества.
А результат-то куда девать?
Ответить с цитированием
  #3  
Старый 02.12.2011, 13:39
win32nod32 win32nod32 вне форума
Прохожий
 
Регистрация: 27.02.2011
Сообщения: 12
Репутация: 10
По умолчанию

Результат заноситься в СтрингЛист, который, собственно, и возвращается функцией. Если кто то разобрался, что требуется от функции и есть предложение сделать проще - пожалуйста, говорите)))

Вот, немного изменил процедуру. Заменил массивы StringList'ами. Только толку мало. Опять, вместо того, чтобы не записывать в лист id одинаковой детали, он все правильно плюсует детали и все равно записывает...

Код:
function DataBase.GetDetList(id, count: TStringList): TStringList;
var
  d, k: TStringList;
  i, j, l: integer;
  f: boolean;
  s: string;

begin
  result := TStringList.Create;
  d := TStringList.Create;
  k := TStringList.Create;
  f := false;
  for i := 0 to id.count - 1 do
  begin
    c := GetComplectForID(strtoint(id[i]));
    for j := 1 to c.length do
  	begin
      if i = 0 then
	    begin
      	d.add(inttostr(c.detail[j]));
        k.add(inttostr(strtoint(count[i]) * c.count[j]))
      end else
      for l := 0 to d.count - 1 do
        if c.detail[j] = strtoint(d[l]) then (если в списке есть такая деталь)
          k[l] := inttostr(strtoint(k[l]) + c.count[j] * strtoint(count[i])) (то прибавляем к ней кол-во) 
        else f := true; (если нет, то тогда пишем в листы ид и кол-во)
      if f then
      begin
        d.add(inttostr(c.detail[j]));
        k.add(inttostr(strtoint(count[i]) * c.count[j]))
      end;
    f := false;
    end;
  end;
	for i := 0 to d.count - 1 do
  begin
    s := d[i] + '$' + k[i];
    result.add(s);
  end;
end;
сделал 2 движка с комплектацией (id_детали$количество) :
1) 1$1 2$1 3$1 4$1
2) 1$1 2$1

По идее, при их выборе программа дожна занести в лист:
1$2 2$2 3$1 4$1 (т.к. 1 и 2 деталь повторяются, их кол-во складываем)
Вместо этого она пишет то же самое + 1$1 2$1 (добавляет то что не нужно, т.к. эти детали повторяются)

Последний раз редактировалось win32nod32, 02.12.2011 в 15:35.
Ответить с цитированием
  #4  
Старый 03.12.2011, 11:38
win32nod32 win32nod32 вне форума
Прохожий
 
Регистрация: 27.02.2011
Сообщения: 12
Репутация: 10
По умолчанию

Неужели никто не знает, в чем проблема?? (( Второй день уже голову ломаю...
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:39.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025