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

memo取最大值問題

答題得分者是:christie
mickey10112001
一般會員


發表:29
回覆:14
積分:8
註冊:2006-08-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-10-12 11:17:42 IP:140.128.xxx.xxx 訂閱
請問我現在有一串數字,此串數字使用指標形式顯示在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-10-12 11:35:32 IP:59.105.xxx.xxx 未訂閱
for(count=0 ; count < count-1 ; count )
這一行有問題吧,這樣怎麼會跑到for loop裡面...
還有...memo1裡面的資料是?第一段code看起來不太完整

既然你都用X_point=new float[Memo1->Lines->Count]
為何不把memo1裡面的值放到X_point[ ],這樣就是陣列了
mickey10112001
一般會員


發表:29
回覆:14
積分:8
註冊:2006-08-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-10-12 13:02:40 IP:140.128.xxx.xxx 訂閱

===================引 用 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-10-12 15:18:43 IP:140.118.xxx.xxx 未訂閱
你可以貼出比較完整的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,我無法知道你的比對大小那段是放在哪?
編輯記錄
GGL 重新編輯於 2007-10-12 15:20:04, 註解 無‧
christie
資深會員


發表:30
回覆:299
積分:475
註冊:2005-03-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-10-12 15:48:46 IP:203.73.xxx.xxx 訂閱
AnsiString str="X:"+IntToStr(int (X1));  
試改為
AnsiString str=String().sprintf("X:", X1);
------
What do we live for if not to make life less difficult for each other?
mickey10112001
一般會員


發表:29
回覆:14
積分:8
註冊:2006-08-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-10-12 19:04:30 IP:140.128.xxx.xxx 訂閱

===================引 用 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;iLines->Count;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; countLines->Count-1;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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-10-12 20:00:35 IP:123.193.xxx.xxx 訂閱
你的程式寫得有些複雜,看了半天, 試著猜猜你的需求:

(1)你有一個文字資料檔, 沒有特定筆數, 檔案中可能還有空白行
每筆資料的格式是:

X:數值\tY:數值\tZ:數值\t

(2)然後你要找出X, Y, Z的最大值.
mickey10112001
一般會員


發表:29
回覆:14
積分:8
註冊:2006-08-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-10-12 20:33:23 IP:140.128.xxx.xxx 訂閱

===================引 用 jow 文 章===================
你的程式寫得有些複雜,看了半天, 試著猜猜你的需求:

(1)你有一個文字資料檔, 沒有特定筆數, 檔案中可能還有空白行
每筆資料的格式是:

X:數值\tY:數值\tZ:數值\t

(2)然後你要找出X, Y, Z的最大值.



嗯嗯...這位大大說的就是我想要的....
因為我現在是用指標去指位址...所以若使用到*(X_point a )和*(Y_point b )時都會從第一個數字指到最後一個數字......
如此我將無法判斷最大值...所以才想說陣列應該可以...但我指標的字串...該如何使用陣列表示.....我不太知道.....
或是有更好的方法可以做到....我ㄧ串數字取最大值呢?
請大大指教...謝謝!!
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-10-12 23:42:00 IP:123.193.xxx.xxx 訂閱
(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]
[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< List->Text = StringReplace(S, Delimiter, "\r", 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 if(random(3)==0) L->Add("");//模擬插入空白列
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; iCount; 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; iCount; 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]
編輯記錄
jow 重新編輯於 2007-10-12 23:51:20, 註解 無‧
jow 重新編輯於 2007-10-12 23:52:14, 註解 無‧
jow 重新編輯於 2007-10-13 08:28:32, 註解 無‧
jow 重新編輯於 2007-10-13 08:36:17, 註解 無‧
系統時間:2024-05-03 12:19:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!