memo取最大值問題 |
答題得分者是:christie
|
mickey10112001
一般會員 發表:29 回覆:14 積分:8 註冊:2006-08-04 發送簡訊給我 |
請問我現在有一串數字,此串數字使用指標形式顯示在memo上
但我需要取其數字串中的最大值,我該如何做呢? 是不是可以將指標以陣列形式表示??因為我知道陣列可以取其中的最大值... 以下是我的程式 [code cpp] X_point=new float[Memo1->Lines->Count]; int count; //count是指行數 int a=0; int X1; for(count=0 ; count < count-1 ; count ) { X1=*(X_point a ); AnsiString str="X:" IntToStr(int (X1)); Memo2->Lines->Insert(linecount,str); } [/code] 以下是我數字的顯示情況 我取最大值的方法: [code cpp] int X0,Xm,Xmax; X0 = abs(X1); Xm=0; if( X0 > Xm ) { Xmax=X0; } Edit1->Text=Xmax; [/code] 但這方法會有問題...因為它會每個值都取到..最後得到的Xmax是2 卻不是我想要的10...... 請問有改善方法嗎? 用陣列應該可行..但我不知該如何把指標以陣列表示..... 請各位大大幫幫忙....謝謝!!! 編輯記錄
mickey10112001 重新編輯於 2007-10-12 11:22:09, 註解 無‧
mickey10112001 重新編輯於 2007-10-12 11:25:00, 註解 無‧ mickey10112001 重新編輯於 2007-10-12 11:25:40, 註解 無‧ mickey10112001 重新編輯於 2007-10-12 11:25:56, 註解 無‧ mickey10112001 重新編輯於 2007-10-12 11:28:08, 註解 無‧ |
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
|
mickey10112001
一般會員 發表:29 回覆:14 積分:8 註冊:2006-08-04 發送簡訊給我 |
===================引 用 GGL 文 章=================== for(count=0 ; count < count-1 ; count ) 這一行有問題吧,這樣怎麼會跑到for loop裡面... 還有...memo1裡面的資料是?第一段code看起來不太完整 既然你都用X_point=new float[Memo1->Lines->Count] 為何不把memo1裡面的值放到X_point[ ],這樣就是陣列了 大大你好..迴圈是這樣才對 for(count=0 ; count < Memo1->Count-1; count ).........我主要是要取X1的值出來些運算!! 為何不把memo1裡面的直放到X_point[ ]....可以請大大說明該怎麼作嗎? 我之前是這樣作的 [code cpp] X_point=new float[Memo1->Lines->Count]; int count; //count是指行數 int a=0; int X1; for(count=0 ; count < count-1 ; count ) { X1=*(X_point a ); AnsiString str="X:" IntToStr(int (X1)); Memo2->Lines->Insert(linecount,str); } int X0[ ]={X1}; Edit1->Text=X0[0]; [/code] int X0[ ]={X1}; Edit1->Text=X0[0]; //但其中會出現X0[1]時值顯示錯誤!! 是我這個方法錯誤了嗎???
編輯記錄
mickey10112001 重新編輯於 2007-10-12 13:03:46, 註解 無‧
mickey10112001 重新編輯於 2007-10-12 13:05:32, 註解 無‧ mickey10112001 重新編輯於 2007-10-12 13:06:25, 註解 無‧ mickey10112001 重新編輯於 2007-10-12 13:06:53, 註解 無‧ mickey10112001 重新編輯於 2007-10-12 13:20:32, 註解 無‧ |
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
你可以貼出比較完整的code嗎?這樣看實在是怪怪的,無法知道你最後是把code改成怎樣...
[code cpp] X_point=new float[Memo1->Lines->Count]; for(int i=0;i { X_point[i]=Memo1->Lines->Strings[i]; } [/code] 大概是這樣....然後比對大小 而且你比對大小的code乍看之下也不對,因為你沒完整的code,我無法知道你的比對大小那段是放在哪?
編輯記錄
GGL 重新編輯於 2007-10-12 15:20:04, 註解 無‧
|
christie
資深會員 發表:30 回覆:299 積分:475 註冊:2005-03-25 發送簡訊給我 |
|
mickey10112001
一般會員 發表:29 回覆:14 積分:8 註冊:2006-08-04 發送簡訊給我 |
===================引 用 GGL 文 章=================== 你可以貼出比較完整的code嗎?這樣看實在是怪怪的,無法知道你最後是把code改成怎樣... [code cpp] X_point=new float[Memo1->Lines->Count]; for(int i=0;iLines->Count;i ) { X_point[i]=Memo1->Lines->Strings[i]; } [/code] 大概是這樣....然後比對大小 而且你比對大小的code乍看之下也不對,因為你沒完整的code,我無法知道你的比對大小那段是放在哪? 我完整的code有點複雜..我盡量描述...希望大大能看的懂: 我第一步載入數字碼於Memo1上 第二步我將控格處拿掉並將數列排列在Memo2上,如圖 程式碼如: [code cpp] void __fastcall TForm1::Button1Click(TObject *Sender) { int count; for (count=0;count AnsiString str="X:" FloatToStrF(*(X_point count),ffGeneral,7,3) "\t" "Y:" FloatToStrF(*(Y_point count),ffGeneral,7,3) "\t" "Z:" FloatToStrF(*(Z_point count),ffGeneral,7,3) "\t"; Application->ProcessMessages(); Memo2->Lines->Insert(count,str); } } X_point=new float[Memo1->Lines->Count]; Y_point=new float[Memo1->Lines->Count]; Z_point=new float[Memo1->Lines->Count]; for(i=0;i { StrPCopy(p1,Memo1->Lines->Strings[i]); for(p1_point=0;(*(p1 p1_point))!='\0';p1_point ) { if(*(p1 p1_point)=='X') { if(*(p1 p1_point 2)!='\t'){char_temp[0]=*(p1 p1_point 2); if(*(p1 p1_point 3)!='\t'){char_temp[1]=*(p1 p1_point 3); if(*(p1 p1_point 4)!='\t'){char_temp[2]=*(p1 p1_point 4); if(*(p1 p1_point 5)!='\t'){char_temp[3]=*(p1 p1_point 5); if(*(p1 p1_point 6)!='\t'){char_temp[4]=*(p1 p1_point 6); if(*(p1 p1_point 7)!='\t'){char_temp[5]=*(p1 p1_point 7); if(*(p1 p1_point 8)!='\t'){char_temp[6]=*(p1 p1_point 8); if(*(p1 p1_point 9)!='\t'){char_temp[7]=*(p1 p1_point 9); if(*(p1 p1_point 10)!='\t'){char_temp[8]=*(p1 p1_point 10); if(*(p1 p1_point 11)!='\t'){char_temp[9]=*(p1 p1_point 11);}}}}}}}}}} X_new=StrToFloat(char_temp); search=true; } if(*(p1 p1_point)=='Y') { if(*(p1 p1_point 2)!='\t'){char_temp[0]=*(p1 p1_point 2); if(*(p1 p1_point 3)!='\t'){char_temp[1]=*(p1 p1_point 3); if(*(p1 p1_point 4)!='\t'){char_temp[2]=*(p1 p1_point 4); if(*(p1 p1_point 5)!='\t'){char_temp[3]=*(p1 p1_point 5); if(*(p1 p1_point 6)!='\t'){char_temp[4]=*(p1 p1_point 6); if(*(p1 p1_point 7)!='\t'){char_temp[5]=*(p1 p1_point 7); if(*(p1 p1_point 8)!='\t'){char_temp[6]=*(p1 p1_point 8); if(*(p1 p1_point 9)!='\t'){char_temp[7]=*(p1 p1_point 9); if(*(p1 p1_point 10)!='\t'){char_temp[8]=*(p1 p1_point 10); if(*(p1 p1_point 11)!='\t'){char_temp[9]=*(p1 p1_point 11);}}}}}}}}}} Y_new=StrToFloat(char_temp); search=true; } if(*(p1 p1_point)=='Z') { if(*(p1 p1_point 2)!='\t'){char_temp[0]=*(p1 p1_point 2); if(*(p1 p1_point 3)!='\t'){char_temp[1]=*(p1 p1_point 3); if(*(p1 p1_point 4)!='\t'){char_temp[2]=*(p1 p1_point 4); if(*(p1 p1_point 5)!='\t'){char_temp[3]=*(p1 p1_point 5); if(*(p1 p1_point 6)!='\t'){char_temp[4]=*(p1 p1_point 6); if(*(p1 p1_point 7)!='\t'){char_temp[5]=*(p1 p1_point 7); if(*(p1 p1_point 8)!='\t'){char_temp[6]=*(p1 p1_point 8); if(*(p1 p1_point 9)!='\t'){char_temp[7]=*(p1 p1_point 9); if(*(p1 p1_point 10)!='\t'){char_temp[8]=*(p1 p1_point 10); if(*(p1 p1_point 11)!='\t'){char_temp[9]=*(p1 p1_point 11);}}}}}}}}}} Z_new=StrToFloat(char_temp); search=true; } } if (search) { *(G_point vec_point)=G_new; *(X_point vec_point)=X_new; *(Y_point vec_point)=Y_new; *(Z_point vec_point)=Z_new; *(R_value vec_point)=R_new; vec_point ; } } [/code] 因此在我最後的memo2上會有X..Y..Z....3列的數字串....而我必須按Button時,取各列的最大值 [code cpp] void __fastcall TForm1::Button2Click(TObject *Sender) { float X1,Y1,Z1; for(count=0; count { X1=*(X_point a ); Y1=*(Y_point b ); Z1=*(Z_point c ); } Edit1->Text=X的最大值 Edit2->Text=Y的最大值 Edit3->Text=Z的最大值 } [/code] 所以上面X1=*(X_point a ); 是指X那排的數列 Y1=*(Y_point b ); 是指Y那排數列 Z1=*(Z_point c ); 是指Z那排數列 所以大大你上面的方法..會讓我一次同時讀到X:10 Y:0 Z:0.5這一整排吧...... 請大大指教................
編輯記錄
mickey10112001 重新編輯於 2007-10-12 19:13:31, 註解 無‧
mickey10112001 重新編輯於 2007-10-12 19:14:38, 註解 無‧ mickey10112001 重新編輯於 2007-10-12 19:16:27, 註解 無‧ |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
|
mickey10112001
一般會員 發表:29 回覆:14 積分:8 註冊:2006-08-04 發送簡訊給我 |
===================引 用 jow 文 章=================== 你的程式寫得有些複雜,看了半天, 試著猜猜你的需求: (1)你有一個文字資料檔, 沒有特定筆數, 檔案中可能還有空白行 每筆資料的格式是: X:數值\tY:數值\tZ:數值\t (2)然後你要找出X, Y, Z的最大值. 嗯嗯...這位大大說的就是我想要的.... 因為我現在是用指標去指位址...所以若使用到*(X_point a )和*(Y_point b )時都會從第一個數字指到最後一個數字...... 如此我將無法判斷最大值...所以才想說陣列應該可以...但我指標的字串...該如何使用陣列表示.....我不太知道..... 或是有更好的方法可以做到....我ㄧ串數字取最大值呢? 請大大指教...謝謝!! |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
(1)
先給你分離資料的方法參考參考^^ 你可以查看Button1Click中每個動作後 檔案內容的變化. (2) 至於後續資料的處理,你可以使用物件封裝 資料,例如: class TMyXYZ: public TObject { public: float X; float Y; float Z; } 將資料放在物件中. (3) 再用物件容器,如 TStringList, 或用物件陣列來 管理物件, 依你的需要分別來找X, Y, Z 的最大值. (4) 記得程式結束或物件不再需要時, 要將他們釋放...^_^ (5)修正: 新增分別找出 X, Y, Z的做法, 僅供參考 [code cpp] //--------------------------------------------------------------------------- #ifndef fMainH #define fMainH //--------------------------------------------------------------------------- #include #include #include #include <Forms.hpp><br />#include //--------------------------------------------------------------------------- class TMyXYZ : TObject { public: float X; float Y; float Z; AnsiString __fastcall SortKey(int SortBy){ AnsiString key; switch(SortBy){ case 0: key.sprintf(".2f", X); break; case 1: key.sprintf(".2f", Y); break; case 2: key.sprintf(".2f", Z); break; default: key = ""; } return key; } }; //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: TButton *Button1; TListBox *ListBox1; void __fastcall Button1Click(TObject *Sender); private: TStringList* __fastcall split(AnsiString S, AnsiString Delimiter); void __fastcall generate_data_sample(int DataCount); void __fastcall split_item_with(AnsiString Delimiter); void __fastcall eliminate_blank_item(); TStringList* __fastcall get_data_list(int SortBy); void __fastcall clear_data_list(TStringList *List); float __fastcall find_max_value(int type); public: __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif [code cpp] //--------------------------------------------------------------------------- #include #pragma hdrstop #include "fMain.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner) { Randomize(); } //--------------------------------------------------------------------------- TStringList* __fastcall TForm1::split(AnsiString S, AnsiString Delimiter) { TStringList *List = new TStringList(); TReplaceFlags Flags; Flags< return List; } //--------------------------------------------------------------------------- void __fastcall TForm1::generate_data_sample(int DataCount) { //用程式產生測試資料檔案 - D:\\TEST.TXT AnsiString FILE_NAME = "D:\\TEST.TXT"; AnsiString DATA_FORMAT = "X:%5.2f\tY:%5.2f\tZ:%5.2f\t"; TStringList *L = new TStringList(); try{ AnsiString s; float f[3]; for(int i=0; i else{ for(int j=0; j<3; j ) f[j] = (float)random(10000) / 100; s.sprintf(DATA_FORMAT.c_str(), f[0], f[1], f[2]); L->Add(s); } } L->SaveToFile(FILE_NAME); } __finally{ delete L; } } //--------------------------------------------------------------------------- void __fastcall TForm1::split_item_with(AnsiString Delimiter) { //以傳入之 Delimiter, 將檔案資料欄位分離 AnsiString FILE_NAME = "D:\\TEST.TXT"; if(FileExists(FILE_NAME)){ TStringList *L = new TStringList(); try{ L->LoadFromFile(FILE_NAME); TStringList *M = split(L->Text, Delimiter); try{ M->SaveToFile(FILE_NAME); } __finally{ delete M; } } __finally{ delete L; } } } //--------------------------------------------------------------------------- void __fastcall TForm1::eliminate_blank_item() { //去除資料檔案之空白列 AnsiString FILE_NAME = "D:\\TEST.TXT"; if(FileExists(FILE_NAME)){ TStringList *L = new TStringList(); try{ L->LoadFromFile(FILE_NAME); for(int i=L->Count-1; i>-1; i--) if(L->Strings[i].Trim()=="") L->Delete(i); L->SaveToFile(FILE_NAME);//回存至資料檔 } __finally{ delete L; } } } //--------------------------------------------------------------------------- TStringList* __fastcall TForm1::get_data_list(int SortBy) { //X: SortBy==0, Y: SortBy==1, Z: SortBy==2 TMyXYZ *O = NULL; AnsiString key; AnsiString FILE_NAME = "D:\\TEST.TXT"; TStringList *List = new TStringList(); if(FileExists(FILE_NAME)){ TStringList *L = new TStringList(); try{ L->LoadFromFile(FILE_NAME); if(L->Text.Pos("X") == 0){//檢查是否為最後轉出之檔案,檔案中不含X||Y||Z for(int i=0; i AnsiString s = L->Strings[i].Trim(); switch(i%3){ case 0: O = new TMyXYZ(); O->X = StrToFloat(s); break; case 1: if(O)O->Y = StrToFloat(s); break; case 2: if(O){ O->Z = StrToFloat(s); List->AddObject(O->SortKey(SortBy), (TObject*)O); O = NULL; } break; } } } } __finally{ delete L; } } List->Sorted = true;//將List排序 return List; } //--------------------------------------------------------------------------- void __fastcall TForm1::clear_data_list(TStringList *List) { if(List){ for(int i=0; i delete List->Objects[i]; List->Clear(); } } //--------------------------------------------------------------------------- float __fastcall TForm1::find_max_value(int type) { float ret = 0; TStringList *L = get_data_list(type); try{ int count = L->Count; if(count>0){ TMyXYZ *O = (TMyXYZ*)L->Objects[count-1]; switch(type){ case 0: ret = O->X; break; case 1: ret = O->Y; break; case 2: ret = O->Z; break; } } } __finally{ clear_data_list(L); delete L; } return ret; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { generate_data_sample(1000); split_item_with("X:"); split_item_with("Y:"); split_item_with("Z:"); split_item_with("\t"); eliminate_blank_item(); ListBox1->Clear(); ListBox1->Items->Add("分別找出X, Y, Z 的最大值"); for(int i=0; i<3; i ){ AnsiString s; float m = find_max_value(i); ListBox1->Items->Add(s.sprintf("%c: %5.2f", (char)('X' i), m)); } } //--------------------------------------------------------------------------- [/code] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |