全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1715
推到 Plurk!
推到 Facebook!

簡單的陣列整理、統計資料的問題,複雜度好大??

答題得分者是:ccchen
c905165
中階會員


發表:50
回覆:120
積分:54
註冊:2002-09-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-12-19 03:13:34 IP:203.204.xxx.xxx 未訂閱
這幾天忽然遇到一個問題,乍看之下沒有什麼,但是想來想去,最後終於發現,這個程式如果寫起來,複雜度會變得異常的大,請問有沒有其他的思緒來處理這個問題。可能是我又進了死胡同了。 比如: ax: array[0..10000,1..5] of string; ax[n,1]:=存放零件名稱 ax[n,2]:=存放耗用日期 ax[n,3]:=存放耗用數量(可以用strtoint轉成數字來運算) 我們今天要將以上這一堆資料整理成以下陣列: bx: array[0..1000,0..33] of string; bx[n,0]:=存放零件名稱 bx[0,n]:=存放「日」(1~31) bx[n,1到31]:=存放這個月各別日的耗用數量 bx[n,32]:=零件本月耗用總計 1.如果零件名稱相同,而且在同一天耗用,要加總在一起 2.如果某日都沒有耗用零件,則該欄就沒有了,也就是後面的欄整個shift往前 我這樣想來想去,發現居然要超過好幾層的迴圈。請問有沒有什麼比較好的方法來解決這個問題? 有困難就是能力不足,有麻煩就是方法不對... 劣者總是遇到困難,也時常出現麻煩
------
有困難就是能力不足,有麻煩就是方法不對... 劣者總是遇到困難,也時常出現麻煩
longjibo
一般會員


發表:18
回覆:18
積分:12
註冊:2002-11-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-12-19 08:14:44 IP:218.16.xxx.xxx 未訂閱
此數組有1000行,33列,先按行、再按列循環, 如 for i:=0 to 1000 for j:=0 to 32 //根據零件名稱依次對第2列到第31列賦每日產量值,用一變量來累加本月產量總和
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-12-19 08:46:56 IP:61.219.xxx.xxx 未訂閱
我的建議: 用一個TClientDataSet就解決了, 程式也好寫多了 DesignTime: 放一個ClientDataSet. -> DoubleCLick此dataSet開啟FieldEditor->NewField ->分別Create"Part","SDATE","QTY"三個欄位 RunTime: FormCreate 時ClientDataSet1.CreateDataSet; 然後你要建Array時, 改成將資料寫入此ClientDataSet就可以了 用ClientDataSet取代Array來存放資料, 讓你可以使用所有DataSet之功能, 而且還可直接存檔
c905165
中階會員


發表:50
回覆:120
積分:54
註冊:2002-09-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-12-19 21:36:59 IP:203.204.xxx.xxx 未訂閱
longjibo的方法到最後還要加上一個for 1 to 10000,也就是至少會有三層的迴圈,再加上往前shift的目的,就要四層迴圈,真的,想過,才知道這個問題很難。 ccchen是否可以「表演」一下。謝謝。 有困難就是能力不足,有麻煩就是方法不對... 劣者總是遇到困難,也時常出現麻煩
------
有困難就是能力不足,有麻煩就是方法不對... 劣者總是遇到困難,也時常出現麻煩
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-12-20 08:27:02 IP:61.219.xxx.xxx 未訂閱
用ClientDataSet做一個Sample給你參考 完整程式在 http://delphi.ktop.com.tw/loadfile.php?TOPICID=7537679&CC=168581    其中button1只為先用random方式產生data button2執行實際加總後, 寫至另一個ClientDataSet
procedure TForm3.Button2Click(Sender: TObject);
var oldpart:string;
  yr,m,d:word;
begin
  oldpart:='';
  with cd1 do begin
    IndexFieldNames:='PART';  //依part排序, 所以只須loop一次
    first;
    while not eof do begin
      if fieldbyname('PART').asstring=oldpart then //part不變
        cd2.Edit
      else begin  //part改變, 須新增cd2
        cd2.Append;
        cd2.fieldbyname('PART').asstring:=fieldbyname('PART').asstring;
      end;
      DeCodeDate(fieldbyname('SDATE').asdatetime, yr,m,d);//取得日期
      cd2.Fields[d].asinteger:=cd2.Fields[d].asinteger
                               FieldByName('QTY').asinteger; 
      cd2.FieldByName('MSUM').asinteger:=cd2.FieldByName('MSUM').asinteger
                                         FieldByName('QTY').asinteger;
      oldpart:=fieldbyname('PART').asstring;
      cd2.post;
      next;
    end;
  end;
end;
[note]兩個ClientDataSet均在DesignTime定義完, 其實也可在RunTime 才Create, 故即使column數不知的情況也可使用. ClientDataSet好處太多, 應多加使用
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-12-20 10:44:49 IP:203.204.xxx.xxx 未訂閱
引言: button2執行實際加總後, 寫至另一個ClientDataSet [note]兩個ClientDataSet均在DesignTime定義完, 其實也可在RunTime 才Create, 故即使column數不知的情況也可使用. ClientDataSet好處太多, 應多加使用
ccchen兄: ClientDataSet還有一個Aggregate的功能,可做Sum, Avg, Count, Min, Max等功能,只要填入資料後,就可直接取用,不知是否可套用。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-12-20 11:37:23 IP:61.219.xxx.xxx 未訂閱
引言: ccchen兄: ClientDataSet還有一個Aggregate的功能,可做Sum, Avg, Count, Min, Max等功能,只要填入資料後,就可直接取用,不知是否可套用。
lieShu兄: 在這例子中我想是無法套用的, 因為結果之筆數與原始不同, 必須經過重整. 最後一個欄位MSUM是可以用, 不過既然已讓CD1整個LOOP了一遍, 使用Aggregate也沒意義了對不對. 如果須讓使用者更改CD2之資料那就有必要了, 你以為如何
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-12-20 13:10:32 IP:203.204.xxx.xxx 未訂閱
引言: jieShu兄: 在這例子中我想是無法套用的, 因為結果之筆數與原始不同, 必須經過重整. 最後一個欄位MSUM是可以用, 不過既然已讓CD1整個LOOP了一遍, 使用Aggregate也沒意義了對不對. 如果須讓使用者更改CD2之資料那就有必要了, 你以為如何
ccchen兄: 嗯!我沒有用力思考過,直覺以為可以,所謂筆數不同是否就是分組小計,Aggregate也有這個功能,不過設定有點難,看不太懂Help,因為這也是一項超強功能,提出給大家參考一下。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
系統時間:2024-04-29 0:21:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!