線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2300
推到 Plurk!
推到 Facebook!

StringGrid累加值的問題

答題得分者是:RedSnow
iii0628
一般會員


發表:50
回覆:46
積分:19
註冊:2005-04-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-17 15:33:22 IP:220.130.xxx.xxx 未訂閱
請問如果我現在的資料要同一行每隔4列做相加,例如[0][0] [0][4] [0][8] ...[0] [100]、[1][0] [1][4] [1][8] ...[1] [100]、....以此類推的話要怎麼寫???謝謝
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-17 16:06:52 IP:61.70.xxx.xxx 未訂閱
您好: 以下是大致原理,可能會有x,y軸跑掉,請自行修改一下. 挖勒,又忘了這裡是BCB區.
procedure TForm1.Button2Click(Sender: TObject);
var
 int Total;
begin
StringGrid.Row=StringGrid->Row 1;//加一行放總數
for (j=0;jCol;j  )
 {
  Total=0;
  for (i=3;iRow;i =4)//從第四行開始,每次加四
   Total =IntToStr(StringGrid.Cells[i][j]);
  StringGrid->Cells[StringGrid->Row-1][j]:=IntToStr(Total);//填入相加完的結果到最後一行
 }
發表人 - supman 於 2005/06/17 17:17:48
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-17 16:24:47 IP:218.19.xxx.xxx 未訂閱
iii0628 您好:    參考一下:
int total;
// 如果您的資料行 (Row) 是從 0 開始,則下列 row=1 請改為 row=0
for(int row=1; row< StringGrid1->RowCount; row  ){  // 逐行處理 (橫行)
    total = 0;
    // 如果您的資料欄 (Column) 是從 0 開始,則下列 col=1 請改為 col=0
    for(int col=1; col< StringGrid1->ColCount; col  = 4){ // 間隔 4 欄 (縱列) 相加
        if(StringGrid1->Cells[col][row] != ""){  // 如果不是空字串 (必要時應加上是否為數字資料的檢查)
            total  = StrToInt(StringGrid1->Cells[col][row]);  // 單行加總
        }
    }
    // 此處之 total 為每行的加總數字,您的動作可加在此處
}
7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/06/17 17:15:22
iii0628
一般會員


發表:50
回覆:46
積分:19
註冊:2005-04-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-17 17:28:11 IP:220.130.xxx.xxx 未訂閱
RedSnow你好:謝你的回應,我現在遇到一個問題就是我要將相加結果顯示在              StringGrid2上但是照我的寫法只會顯示2行結果在StringGrid2
for( row=1; row< StringGrid1->RowCount; row  ){  // 逐行處理 (橫行)
    total = 0;
    ii  ;
    jj=1;
   // 如果您的 row 是從 0 開始,則下列 row=1 請改為 row=0
    for( col=1; col<= StringGrid1->ColCount; col  = 31){ // 間隔 4 列相加
        jj  ;
        if(StringGrid1->Cells[col][row] != ""){
            total  = StrToInt(StringGrid1->Cells[col][row]);
  
            StringGrid2->Cells[jj][ii]=IntToStr(total);
        }        }
   }
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-17 18:01:39 IP:218.19.xxx.xxx 未訂閱
iii0628 您好:    您是說像這樣子嗎?
int total;
for(int row=1; rowRowCount; row  ){
    total=0;
    for(int col=1; colColCount; col =4){
        if(StringGrid1->Cells[col][row] != ""){
            total  = StrToInt(StringGrid1->Cells[col][row]);
        }
    }
    if(StringGrid2->RowCount < row 1){  // 如果能確保 StringGrid2 行數夠用,則本處理可免
        StringGrid2->RowCount = row 1;
    }        StringGrid2->Cells[1][row] = IntToStr(total);
}
7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/06/17 18:12:01
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-17 18:13:14 IP:61.70.xxx.xxx 未訂閱
您好: 這一行放錯地方了. StringGrid2->Cells[jj][ii]=IntToStr(total); 另外迴圈應該要改成像我上面那樣,一列一列去跑,也就是x放外面,y放裡面不然你永遠只會記載最後一次計算總和的資料. ps.x=col,y=row.
iii0628
一般會員


發表:50
回覆:46
積分:19
註冊:2005-04-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-20 10:17:53 IP:220.130.xxx.xxx 未訂閱
先謝謝兩位熱心回答,不過我現在還是在將StringGrid1做相加在複製到StringGrid2上有問題。只會做1行半而已    
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
//int radius= StrToInt(Edit1->Text);
// int number=StrToInt (Edit2->Text);
 int total;
 int col,row,ro=1,co=1;
for(col=1; colColCount; col  ){
    total=0;
    for(row=1; rowRowCount; row =32){
        if(StringGrid1->Cells[col][row] != ""){
            total  = StrToInt(StringGrid1->Cells[col][row]);
        }
    }
//  if(StringGrid2->RowCount < row 1){  // 如果能確保 StringGrid2 行數夠用,則本處理可免
//    StringGrid2->RowCount = row 1;
//   }
    StringGrid2->Cells[co][ro] = IntToStr(total);//
    ro  ;  
    if(ro>=32){
    ro=1;
    co  ;
    }
}
}
iii0628
一般會員


發表:50
回覆:46
積分:19
註冊:2005-04-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-20 10:57:08 IP:220.130.xxx.xxx 未訂閱
RedSnow你好:關於累加值的做法,for(int col=1; col< StringGrid1->ColCount; col += 4)這要寫法是否有誤。這樣的話COL=2 . 3 . 4 都沒有做到吧。我再簡單說明一下我的題目好了,大概如下 就是(1.1)+(1.3)+(1.5)、 (1.2)+(1.4)+(1.6)、(2.1)+(2.3)+(2.5)、(2.2)+(2.4)+(2.6)....等
1111
1111
1111
1111
1111
1111
最後相加的結果,貼在StringGrid2上
3333
3333
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-21 00:12:42 IP:219.137.xxx.xxx 未訂閱
iii0628 您好:    請恕我資質魯鈍....,我越來越看不懂您到底要的是什麼了?
引言:關於累加值的做法,for(int col=1; col< StringGrid1->ColCount; col = 4)這要寫法是否有誤。這樣的話COL=2 . 3 . 4 都沒有做到吧。
沒錯,我寫的是 "間隔四個欄位做一次加總的動作",這不正是符合了您在開題篇所寫 "要同一行每隔4列做相加" 的動作嗎?如果這不是您所要的,那麼請您對於您所認知的 "同一行"、"每隔4列" 以及 "相加" 做個 "明確一點的定義",因為我看不出來您改寫後的 for(col=1; colColCount; col )for(row=1; rowRowCount; row =32) 與前述 "每隔4列做相加" 的關聯性為何?
引言:我再簡單說明一下我的題目好了,大概如下 就是(1.1) (1.3) (1.5)、(1.2) (1.4) (1.6)、(2.1) (2.3) (2.5)、(2.2) (2.4) (2.6)....等 1111 1111 1111 1111 1111 1111 最後相加的結果,貼在StringGrid2上 3333 3333
您雖然說得簡單,但是我卻看得迷糊....,我無法理解 (1.1) (1.3) (1.5)、(1.2) (1.4) (1.6)、(2.1) (2.3) (2.5)、(2.2) (2.4) (2.6).... 是代表著什麼?如果 (1.3) 代表著 "第 1 行第 3 列" 的話,那麼 1.1 與 1.3 和 "每隔4列" 的關係到底在那裡? 您拿一連串的 1 相加成一連串的 3,也實在是無法讓我搞懂它們與 "每隔4列" 之間的關連性。 我看您還是直接用一段 "實際的資料" 與 "應有的結果" 來做說明好了。 7 天天敲鍵盤 v 時時按滑鼠 8
limeca
中階會員


發表:2
回覆:74
積分:60
註冊:2005-05-11

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-21 08:46:54 IP:202.145.xxx.xxx 未訂閱
不知道是不是這樣~~裡面的兩個for迴圈也可以while寫
int total;
for(int col=1; col < StringGrid1-> ColCount; col  ){
   total=0;
   for(int row=1; row < StringGrid1->RowCount; row   = 2){
      if(StringGrid1->Cells[col][row] != ""){
          total =StringGrid1->Cells[col][row].ToInt();
      }
   }
   StringGrid2 -> Cells[col][1] = IntToStr(total);
   total=0;
   for(int row=2; row < StringGrid1-> RowCount; row   = 2){
      if(StringGrid1->Cells[col][row] != ""){
         total =StringGrid1->Cells[col][row].ToInt();
      }
   }
   StringGrid2 -> Cells[col][2] = IntToStr(total);
}
發表人 - limeca 於 2005/06/21 08:51:28
iii0628
一般會員


發表:50
回覆:46
積分:19
註冊:2005-04-04

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-06-21 12:46:41 IP:220.130.xxx.xxx 未訂閱
RedSnow你好:真的很不好意思,一直讓你誤解了。因為實際的資料實在是太龐大了貼上來很麻煩了,所以我就舉一次簡單的例子來說明,沒想到還是讓你誤解,SORRY。 我重新說明一下我的題目好了,第一列跟第五列、第九列(每一個相對位置)做統計若數字大於1則在StringGrid2的相對位置上加1、第二列跟第六列、第十列、第三列跟第七列、第十一列、第四列跟第八列、第十二列...以此類推
StringGrid1
0 1 1 0 第一列
1 1 1 1
0 1 1 0
1 1 1 1
0 2 3 0 第五列 
1 1 1 2 
0 1 4 0
0 1 5 5
0 2 3 0 第九列
1 1 1 2 
0 1 4 0
0 1 5 5     StringGrid2
0 2 2 0
0 0 0 2
0 0 2 0
0 0 2 2    
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-06-21 15:59:06 IP:219.137.xxx.xxx 未訂閱
iii0628 您好:    我以您提供的數據來模擬測試,大致上取得了相同的結果,以下就是我處理的方式,測試先決條件為: 1. StringGrid1 欄位內均為數字資料。 2. StringGrid2 對應的欄位全部預先填上 0 程式敘述:
int row, col;  // 供處理行列資料的迴圈使用
int rowstep = (StringGrid1->RowCount-1) / 4;  // 將總行數 (rows) 除以 4 做為迴圈的計算基底
int restartRow;  // 每次重新處理的第一行 (row) 編號
int processRows = 0;  // 存放處理行數 (rows) 的累加數字
int tmpNum;  // 暫存用之變數    for (restartRow=1; restartRow<=4; restartRow  ) {  // 處理 4 次
    for (row=restartRow; row<=(restartRow 3)*(rowstep-1) 1; row =4) {  // 每次隔 4 行 (rows)
        processRows  ;  // 累加處理行數 (rows)
        if (processRows > (StringGrid1->RowCount-1)) {  // 若超過處理範圍就跳出迴圈
            break;
        }            for (col=1; colColCount; col  ) {  // 逐欄 (column) 比對
            if (StrToInt(StringGrid1->Cells[col][row]) > 1) {  // 若比對欄位的數字大於 1
                tmpNum = StrToInt(StringGrid2->Cells[col][restartRow]) 1;  // 取得 StringGrid2 對應欄位的數字並加 1
                StringGrid2->Cells[col][restartRow] = IntToStr(tmpNum);  // 回存累加數字
            }
        }
    }
}
以上程式敘述未做最佳化與容錯處理,這個部分請自行補強。 希望這次沒有會錯意~ 7 天天敲鍵盤 v 時時按滑鼠 8
iii0628
一般會員


發表:50
回覆:46
積分:19
註冊:2005-04-04

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-06-22 09:48:36 IP:220.130.xxx.xxx 未訂閱
RedSnow你好:謝謝你的幫忙。
5515531
一般會員


發表:19
回覆:44
積分:12
註冊:2008-04-16

發送簡訊給我
#14 引用回覆 回覆 發表時間:2008-09-27 13:01:28 IP:218.210.xxx.xxx 訂閱
不好意思~~我想請教一下
那如果我的值並不是做累加
而是將相同的數值作次數的統計
那應該怎麼做呢???
系統時間:2024-04-19 19:16:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!