Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2012, 07:04   #1
alekola
gcc 4.7.1 Opensuse
Пользователь
 
Аватар для alekola
 
Регистрация: 07.03.2012
Сообщений: 22
По умолчанию Интересная хрень - не линейное слияние массивов

Здравствуйте, пишу программу которая собирает много документов в один.
я сделал несколько записей для упрощения кода
Код:
type TProficit = record
        count:double;
        summ:double;
        end;
type TTovar = record
      name:string;
      daySale:integer;
      perDaySale:double;
      proficit:Tproficit;
      balance : double;
   end;
type TDoc = record
        filename:string;
        filial:string;
        docType:string;
        TMC: array of  TTovar;
        end;
у меня прекрасно формируются и наполняются файлами объекты типа TDoc.
Сразу оговорюсь что есть у меня есть два вида документов на основании которых рождается TDoc
1)заполняются все поля кроме TDoc.tmc[].proficit
2)заполняется TDoc.tmc[].proficit && TDoc.filename TDoc.doctype && TDoc.filial
Вконце концов мне нужно объеденить 2 документа у которых TDoc.filial одинаковый
а Tdoc.doctype разный(товары с одинаковым Tdoc.tmc[].name нужно объеденять)
Я написал для этого функцию но никак не могу найти ошибку. Помогите пожалуйста
Код:
function UnionDoc(plan:Tdoc;def:Tdoc):Tdoc;
var
rDoc:TDoc;
i,j:integer;
rDocLength:integer;
Found:boolean;
begin

rDocLength:=0;
rDoc.filename:=plan.filial;
rDoc.filial:=def.filial;
for i:=length(plan.TMC)-1 downto 0 do begin
found:=true;
  if (i<>(length(plan.TMC)-1)) and (found=false) then
    begin
            inc(rDocLength);
            setlength(rDoc.TMC,rDocLength);
            rdoc.TMC[rDocLength].name:=plan.tmc[i-1].name;
            rdoc.TMC[rDocLength].daySale:=plan.tmc[i-1].daySale;
            rdoc.TMC[rDocLength].perDaySale:=plan.tmc[i-1].perDaySale;
            rdoc.TMC[rDocLength].balance:=plan.tmc[i-1].balance;
    end;
   for j:=length(def.TMC)-1 downto 0 do begin

     if plan.TMC[i].name=def.TMC[j].name then
            begin
            inc(rDocLength);
            setlength(rDoc.TMC,rDocLength);
            rdoc.TMC[rDocLength].name:=plan.tmc[i].name;
            rdoc.TMC[rDocLength].daySale:=plan.tmc[i].daySale;
            rdoc.TMC[rDocLength].perDaySale:=plan.tmc[i].perDaySale;
            rdoc.TMC[rDocLength].balance:=plan.tmc[i].balance;
            rdoc.TMC[rDocLength].proficit.count:=def.tmc[j].proficit.count;
            rdoc.TMC[rDocLength].proficit.summ:=def.tmc[j].proficit.summ;
            found:=true;
            continue;

            end;
            found:=false;

end;
end;
result:=rDoc;
end;
alekola вне форума Ответить с цитированием
Старый 21.09.2012, 11:12   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Я написал для этого функцию но никак не могу найти ошибку. Помогите пожалуйста
Неплохо бы знать что это за ошибка.
1. синтаксическая и какая именно
2. AV приблизительное место
3. неверные результаты. (исходные ожидаемые реальные данные).
Т.е. та информация на основе которой вы пришли к выводу что это ошибка.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 21.09.2012, 11:42   #3
alekola
gcc 4.7.1 Opensuse
Пользователь
 
Аватар для alekola
 
Регистрация: 07.03.2012
Сообщений: 22
По умолчанию

когда я отлаживал я пытался вывести содержимое в текстовый фаил..на выходе он был пуст.
сам вижу ошибку в логике слияния...перепишу наверное уже тоже сам без третьего массива..буду расширять и сверять один из переданных со вторым. вообщем уже постараюсь сам, но в понедельник т.к дельфи есть только на работе, выложу сюда может кому пригодится
alekola вне форума Ответить с цитированием
Старый 21.09.2012, 12:23   #4
alekola
gcc 4.7.1 Opensuse
Пользователь
 
Аватар для alekola
 
Регистрация: 07.03.2012
Сообщений: 22
По умолчанию

Сейчас ошибка в следующем:
Если в первом массиве есть товар а во втором нет то
в список не найденных товаров добавляется предыдущий товар из второго массива
Вписал сообщения чтобы было яснее что происходит
Хотелось бы чтобы если товар есть в plan и def то происходило соединение
Если есть plan но нет в def то происходило заполнение пустых полей -999
Если нет в plan но есть в def помещалось в NoTfoundTMC

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type TProficit = record
        count:double;
        summ:double;
        end;
type TTovar = record
      name:string;
      daySale:integer;
      perDaySale:double;
      proficit:Tproficit;
      balance : double;
   end;
type TDoc = record
        filename:string;
        filial:string;
        docType:string;
        TMC: array of  TTovar;
        end;
var
  Form1: TForm1;

implementation

{$R *.dfm}

function UnionDoc(plan:TDoc; def:TDoc):TDoc;
var
  found:Boolean;
  i,j:integer;
  NotFoundTMC:TDoc;
  NotFoundTMCLength:Integer;

begin
  //Проинициализируем длину массива не найденых товаров
  NotFoundTMCLength:=0;
  found:=False;
     for i:=0 to Length(plan.TMC)-1 do
            begin
               ShowMessage('внешний цикл: '+inttostr(i));
              //если не первая итерация и статус предудущей итерации = небыл найден(found=false) то добавим пред товар в массив
                    if (i<>0) and (found=False) then begin
                        //увеличим размер массива ненайденных товаров для того чтобы вместился новый товар
                        inc(NotFoundTMCLength);
                        SetLength(NotFoundTMC.TMC,NotFoundTMCLength);
                        ShowMessage(def.tmc[j-1].name);
                        NotFoundTMC.TMC[NotFoundTMCLength-1].name:=def.TMC[j-1].name;
                        NotFoundTMC.TMC[NotFoundTMCLength-1].daySale:=-9999;
                        NotFoundTMC.TMC[NotFoundTMCLength-1].perDaySale:=-9999;
                        NotFoundTMC.TMC[NotFoundTMCLength-1].balance:=-9999;
                        NotFoundTMC.TMC[NotFoundTMCLength-1].proficit:=def.TMC[j-1].proficit;
                        found:=True;
                    end;
               for j:=0 to Length(def.TMC)-1 do
                  begin
                    ShowMessage('зашли во вложенный цикл: '+inttostr(j));
                    ShowMessage('Сравниваем товар '+plan.TMC[i].name+' & '+def.TMC[j].name);
                    //если совпало наименование то дописываем в массив plan недостающие значения
                    if plan.TMC[i].name=def.TMC[j].name then
                        begin
                          ShowMessage('совпал товар');
                          plan.TMC[i].proficit:=def.TMC[j].proficit;
                          //отмечаем что за итераци по массиву def товар был найден  и прерываем вложенный цикл
                          found:=True;
                          Break;
                        end;
                        found:=False;
                  end;
            end;
          result:=NotFoundTMC;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
  one, two, res :TDoc;
   i:integer;
begin
  //initialize
SetLength(one.TMC,5); //на основе планирования
SetLength(two.TMC,3); // на основе д-ф
one.TMC[0].name:='Монитор';
one.TMC[0].daysale:=5;
one.TMC[0].perDaySale:=0.7;
one.TMC[0].balance:=107;
one.TMC[1].name:='Мышка';
one.TMC[1].daysale:=53;
one.TMC[1].perDaySale:=5.0;
one.TMC[1].balance:=7;
one.TMC[2].name:='Колонки';
one.TMC[2].daysale:=2;
one.TMC[2].perDaySale:=3.3;
one.TMC[2].balance:=13;
one.TMC[3].name:='Телефон';
one.TMC[3].daysale:=11;
one.TMC[3].perDaySale:=3.2;
one.TMC[3].balance:=23;
one.TMC[4].name:='Привод';
one.TMC[4].daysale:=1;
one.TMC[4].perDaySale:=6.6;
one.TMC[4].balance:=67;
two.TMC[0].name:='Монитор';
two.TMC[0].proficit.count:=0.1;
two.TMC[0].proficit.summ:=150.50;
two.TMC[1].name:='Клавиатура';
two.TMC[1].proficit.count:=5.1;
two.TMC[1].proficit.summ:=10.50;
two.TMC[2].name:='Телефон';
two.TMC[2].proficit.count:=0.1;
two.TMC[2].proficit.summ:=150.50;
res:=UnionDoc(one,two);
for i:=0 to Length(res.TMC)-1 do
ShowMessage(res.TMC[i].name);


end;

end.

Последний раз редактировалось alekola; 21.09.2012 в 12:56.
alekola вне форума Ответить с цитированием
Старый 22.09.2012, 07:54   #5
alekola
gcc 4.7.1 Opensuse
Пользователь
 
Аватар для alekola
 
Регистрация: 07.03.2012
Сообщений: 22
По умолчанию

Работает! Может кому понадобиться.
Складывает два массива..если видит одинаковые наименования то сливает запись иначе добавляет в конец массива.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type TProficit = record
        count:double;
        summ:double;
        end;
type TTovar = record
      name:string;
      daySale:integer;
      perDaySale:double;
      proficit:Tproficit;
      balance : double;
   end;
type TDoc = record
        filename:string;
        filial:string;
        docType:string;
        TMC: array of  TTovar;
        end;
var
  Form1: TForm1;

implementation

{$R *.dfm}

function UnionDoc(plan:TDoc; def:TDoc):TDoc;
var
  found:Boolean;
  i,j:integer;
  lng:integer;
begin
  //Проинициализируем длину массива не найденых товаров
  found:=False;
     for i:=0 to Length(plan.TMC)-1 do
            begin
              //если не первая итерация и статус предудущей итерации = небыл найден среди def(found=false) то добавим пред товар в массив def
                    if (i<>0) and (found=False) then begin

                     lng:=Length(def.TMC);
                     Inc(lng);
                     SetLength(def.TMC,lng);
                     def.TMC[lng-1]:=plan.TMC[i-1];

                    end;
               for j:=0 to Length(def.TMC)-1 do
                  begin
                   //если совпало наименование то дописываем в массив def недостающие значения
                    if plan.TMC[i].name=def.TMC[j].name then
                        begin
                          def.TMC[j].daySale:=plan.TMC[i].daySale;
                          def.TMC[j].perDaySale:=plan.TMC[i].perDaySale;
                          def.TMC[j].balance:=plan.TMC[i].balance;
                          //отмечаем что за итераци по массиву def товар был найден  и прерываем вложенный цикл
                          found:=True;
                          Break;
                        end;
                        //дописать условие
                        found:=False;
                  end;
                  //если в последней итерации небыл найден товар то дополнительная проверка

            end;
            if (found=False) then begin
                    lng:=Length(def.TMC);
                     Inc(lng);
                     SetLength(def.TMC,lng);
                     def.TMC[lng-1]:=plan.TMC[i-1];
                     end;
       result:=def;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
  one, two, res :TDoc;
   i:integer;
begin
  //initialize
SetLength(one.TMC,5); //на основе планирования
SetLength(two.TMC,3); // на основе д-ф
one.TMC[0].name:='Монитор';
one.TMC[0].daysale:=5;
one.TMC[0].perDaySale:=0.7;
one.TMC[0].balance:=107;
one.TMC[1].name:='Мышка';
one.TMC[1].daysale:=53;
one.TMC[1].perDaySale:=5.0;
one.TMC[1].balance:=7;
one.TMC[2].name:='Колонки';
one.TMC[2].daysale:=2;
one.TMC[2].perDaySale:=3.3;
one.TMC[2].balance:=13;
one.TMC[3].name:='Телефон';
one.TMC[3].daysale:=11;
one.TMC[3].perDaySale:=3.2;
one.TMC[3].balance:=23;
one.TMC[4].name:='Привод';
one.TMC[4].daysale:=1;
one.TMC[4].perDaySale:=6.6;
one.TMC[4].balance:=67;
two.TMC[0].name:='Монитор';
two.TMC[0].proficit.count:=0.1;
two.TMC[0].proficit.summ:=150.50;
two.TMC[1].name:='Клавиатура';
two.TMC[1].proficit.count:=5.1;
two.TMC[1].proficit.summ:=10.50;
two.TMC[2].name:='Телефон';
two.TMC[2].proficit.count:=0.1;
two.TMC[2].proficit.summ:=150.50;
res:=UnionDoc(one,two);
for i:=0 to Length(res.TMC)-1 do
ShowMessage(res.TMC[i].name);


end;

end.

Последний раз редактировалось alekola; 22.09.2012 в 07:58.
alekola вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Слияние массивов pisarev-70 Общие вопросы C/C++ 8 31.03.2011 14:24
Слияние двух массивов Anubys Общие вопросы C/C++ 5 28.03.2011 10:07
Слияние двух массивов Anubys Помощь студентам 0 26.03.2011 16:12
Слияние массивов в паскале A_Orlov Помощь студентам 0 20.06.2010 21:09