Форум по 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.
Ответить с цитированием
 


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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