不是很明白你的意思,所以,我就在函数里只实现了互换的功能; 如果还有什么要求的话,我马上再做:) ====================================================================unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Memo1: TMemo; Memo2: TMemo; Memo3: TMemo; Button1: TButton; function Calc(mFuncs: TStrings; mSources: TStrings; mDest: TStrings): Boolean; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.DFM}{ TForm1 }function TForm1.Calc(mFuncs, mSources, mDest: TStrings): Boolean; begin //mDest->msources; Result := False; if not (Assigned(mFuncs) and Assigned(mSources) and Assigned(mDest)) then Exit; { TODO : 赋值交换 } try mFuncs.Text:=mSources.GetText; mSources.Text:=mDest.GetText; mDest.Text:=mFuncs.GetText; except Showmessage('运行错误'); Exit; end; Result := True; end;procedure TForm1.Button1Click(Sender: TObject); begin if Calc(Memo1.Lines, Memo2.Lines, Memo3.Lines) then begin showmessage('作业完成,第一课100分') end else showmessage('执行失败'); end;end. ====================================================================
我输入 A := B; 你输出 B := A;我输入 A := B; C := D; 你输出 B := A; D := C;我输入 I := StrToInt(S); 你输出 S := IntToStr(I);是对文本中语句的操作,不是对文本操作!你理解没有?//我只要这个函数的代码就可以了,其他的不用复制 function Calc(mFuncs: TStrings; mSources: TStrings; mDest: TStrings): Boolean; //mFuncs: 对应函数列表,用“=”分隔(输入) //mSources:普通源代码(输入) //mDest:交换后的代码(输出) begin Result := False; if not (Assigned(mFuncs) and Assigned(mSources) and Assigned(mDest)) then Exit; { TODO : 赋值交换 } Result := True; end;
function TForm1.Calc(mFuncs, mSources, mDest: TStrings): Boolean; var str:array of string; s,str_s,str_1:string; i,j,k,m,h:integer; begin
//mDest->msources; Result := False; if not (Assigned(mFuncs) and Assigned(mSources) and Assigned(mDest)) then Exit; mDest.Text:=''; { TODO : 赋值交换 } s:=mFuncs.Text; k:=0; j:=0; h:=0; for i:= 0 to length(s) do begin m:=j; if copy(s,i,1)=#13 then begin h:=h+1; for k:= i-1 downto 0 do if copy(s,k,1)=#13 then begin break; end; str_s:=copy(s,k+2,i-k); showmessage(str_s); for j:= 0 to length(str_s) do begin if copy(str_s,j,2)=':=' then begin str_1:=copy(str_s,j+2,length(str_s)-pos(str_s,':=')-2*h)+':='+copy(str_s,1,j-1); mDest.Append(str_1); end; end; end; end; Result := True; end;procedure TForm1.Button1Click(Sender: TObject); var s:Tstrings; begin //Memo1.Lines.FUpdateCount; if Calc(Memo1.Lines, Memo2.Lines, Memo3.Lines) then begin showmessage('作业完成,第一课100分') end else showmessage('执行失败'); end;
function Calc(mFuncs, mSources, mDest: TStrings): Boolean; var str:array of string; //#没有用的变量不要留下,如果真的需要就用注释屏蔽 s,str_s,str_1:string; //#没有适当的空格,看看系统的是这样吗? i,j,k,m,h:integer; //#integer -> Integer;大小写和系统保持一致;如果没有这个习惯,今后用其他语言会吃苦 //#单个变量标识用大写如: I, J, K: Integer; begin //mDest->msources; Result := False; if not (Assigned(mFuncs) and Assigned(mSources) and Assigned(mDest)) then Exit; mDest.Text := ''; //#递进是两格,不是三格 { TODO : 赋值交换 } s:=mFuncs.Text; //赋值号没有适当 k:=0; j:=0; h:=0; for i:= 0 to length(s) do //#字符串的下标是从1开始的 begin m:=j; //#m没有使用,不要让Delphi出现任何提示或警告,除非是她自己的单元 if copy(s,i,1)=#13 then //#用Copy()虽然很安全,但没有 S[I] 快速(你必须保证I不会出界) begin h:=h+1; //#变量加一一般用Inc()函数 for k:= i-1 downto 0 do if copy(s,k,1)=#13 then begin break; //#递进不是一格 end; str_s:=copy(s,k+2,i-k); showmessage(str_s); //#函数里最好不要显示对话框,除非发生异常或者自己调试 for j:= 0 to length(str_s) do begin if copy(str_s,j,2)=':=' then begin str_1:=copy(str_s,j+2,length(str_s)-pos(str_s,':=')-2*h)+':='+copy(str_s,1,j-1); mDest.Append(str_1); end; end; end; //#递进的位置不对,这个end要和对应begin在同一个起点 end; Result := True; end;//#你用我的测试数据通过没有? //#我调试,没有出结果
当一个复杂的问题摆在你的面前时 没把它分解成若干相对简单的问题 只到问题还没有解决时才后悔莫及 ............................就来分析这个问题可分解那些问题 No.1 遍历文本行 for I := 0 to mSources.Count - 1 do ShowMessage(mSources[I]);No.2 排除没有赋值运算的语句 if Pos(':=', mSources[I]) then { };No.3 交换赋值号左右两边的表达式 1、取的赋值号左边的表达式 2、取的赋值号右边的表达式 3、交换(如果有函数存在,则替换成对应函数) a. 在函数列表中查询 b. 如果存在,替换No.4 将结果返回到目标中问题已经分解,等你一步步的实现 实现一步得一步 “这下,再复杂的问题也不用当心” “问题越来越少、感觉越来越好” “别看广告!” “看什么?” “看疗效”
function TForm1.scal(aFun, aSource, ADest: Tstrings): boolean; var I,J:integer; Str_1,Str_2:string; begin aDest.Clear; aSource.Clear; result:=false; if not (assigned(aFun) and assigned(aSource) and assigned(Adest) ) then Exit; //**************************************************************************** for I:=0 to aFun.Count-1 do begin Str_1:=aFun.Strings[i]; for J:=1 to length(str_1)-2 do begin if copy(str_1,j,2)=':=' then begin Str_2:=copy(str_1,J+2,length(str_1)-J-1)+':='+copy(str_1,1,J-1); aDest.Append(Str_2); aSource.Append('='); end; end; end; //**************************************************************************** result:=true; end; 这是我在学校做的:)
如果还有什么要求的话,我马上再做:)
====================================================================unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm1 = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
Memo3: TMemo;
Button1: TButton;
function Calc(mFuncs: TStrings; mSources: TStrings; mDest: TStrings): Boolean;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}{ TForm1 }function TForm1.Calc(mFuncs, mSources, mDest: TStrings): Boolean;
begin
//mDest->msources;
Result := False;
if not (Assigned(mFuncs) and Assigned(mSources) and Assigned(mDest)) then Exit;
{ TODO : 赋值交换 }
try
mFuncs.Text:=mSources.GetText;
mSources.Text:=mDest.GetText;
mDest.Text:=mFuncs.GetText;
except
Showmessage('运行错误');
Exit;
end;
Result := True;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
if Calc(Memo1.Lines, Memo2.Lines, Memo3.Lines) then
begin
showmessage('作业完成,第一课100分')
end else
showmessage('执行失败');
end;end.
====================================================================
A := B;
你输出
B := A;我输入
A := B;
C := D;
你输出
B := A;
D := C;我输入
I := StrToInt(S);
你输出
S := IntToStr(I);是对文本中语句的操作,不是对文本操作!你理解没有?//我只要这个函数的代码就可以了,其他的不用复制
function Calc(mFuncs: TStrings; mSources: TStrings; mDest: TStrings): Boolean;
//mFuncs: 对应函数列表,用“=”分隔(输入)
//mSources:普通源代码(输入)
//mDest:交换后的代码(输出)
begin
Result := False;
if not (Assigned(mFuncs) and Assigned(mSources) and Assigned(mDest)) then Exit;
{ TODO : 赋值交换 } Result := True;
end;
var
str:array of string;
s,str_s,str_1:string;
i,j,k,m,h:integer;
begin
//mDest->msources;
Result := False;
if not (Assigned(mFuncs) and Assigned(mSources) and Assigned(mDest)) then Exit;
mDest.Text:='';
{ TODO : 赋值交换 }
s:=mFuncs.Text;
k:=0;
j:=0;
h:=0;
for i:= 0 to length(s) do
begin
m:=j;
if copy(s,i,1)=#13 then
begin
h:=h+1;
for k:= i-1 downto 0 do
if copy(s,k,1)=#13 then
begin
break;
end;
str_s:=copy(s,k+2,i-k);
showmessage(str_s);
for j:= 0 to length(str_s) do
begin
if copy(str_s,j,2)=':=' then
begin
str_1:=copy(str_s,j+2,length(str_s)-pos(str_s,':=')-2*h)+':='+copy(str_s,1,j-1);
mDest.Append(str_1);
end;
end;
end;
end;
Result := True;
end;procedure TForm1.Button1Click(Sender: TObject);
var
s:Tstrings;
begin
//Memo1.Lines.FUpdateCount;
if Calc(Memo1.Lines, Memo2.Lines, Memo3.Lines) then
begin
showmessage('作业完成,第一课100分')
end else
showmessage('执行失败');
end;
var
str:array of string; //#没有用的变量不要留下,如果真的需要就用注释屏蔽
s,str_s,str_1:string; //#没有适当的空格,看看系统的是这样吗?
i,j,k,m,h:integer; //#integer -> Integer;大小写和系统保持一致;如果没有这个习惯,今后用其他语言会吃苦
//#单个变量标识用大写如: I, J, K: Integer;
begin
//mDest->msources;
Result := False;
if not (Assigned(mFuncs) and Assigned(mSources) and Assigned(mDest)) then Exit;
mDest.Text := ''; //#递进是两格,不是三格
{ TODO : 赋值交换 }
s:=mFuncs.Text; //赋值号没有适当
k:=0;
j:=0;
h:=0;
for i:= 0 to length(s) do //#字符串的下标是从1开始的
begin
m:=j; //#m没有使用,不要让Delphi出现任何提示或警告,除非是她自己的单元
if copy(s,i,1)=#13 then //#用Copy()虽然很安全,但没有 S[I] 快速(你必须保证I不会出界)
begin
h:=h+1; //#变量加一一般用Inc()函数
for k:= i-1 downto 0 do
if copy(s,k,1)=#13 then
begin
break; //#递进不是一格
end;
str_s:=copy(s,k+2,i-k);
showmessage(str_s); //#函数里最好不要显示对话框,除非发生异常或者自己调试
for j:= 0 to length(str_s) do
begin
if copy(str_s,j,2)=':=' then
begin
str_1:=copy(str_s,j+2,length(str_s)-pos(str_s,':=')-2*h)+':='+copy(str_s,1,j-1);
mDest.Append(str_1);
end;
end;
end; //#递进的位置不对,这个end要和对应begin在同一个起点
end;
Result := True;
end;//#你用我的测试数据通过没有?
//#我调试,没有出结果
TStrings.Strings //访问每一行 如:ShowMessage(Memo1.Lines[0]);
TStrings.Add() //添加一行
TStrings.Count //行数
TStrings.Insert() //插入一行
TStrings.Move() //移动行
TStrings.Delete() //删除行
....
在学习标准类的时候,自己先想想应该提供什么方法和属性,再看帮助,查资料编程思想最重要,我的方法是这样No.1 把自己当成 计算机 来思维
No.2 把自己当成 语言设计师 来思维
No.3 把自己当成 开发工具提供商 来思维
No.4 把自己当成 客户 来思维闭眼睛先想一下,如果你是他们 你将提供什么?
您好,嗯,先谢谢你的批示:);
程序在我的机子上真的通过了,不过,我也觉的用我的这种办法是很笨很笨的,而且可读性极差,让别人无法理解,DELPHI的语言规则一点也没有;不过,我会改的,真的;真心的感谢你,老师!
或许您不知道,今天我已经返校了,给您回复也已经是在外边的网吧了;
但是,我还是希望能当您的学生,嗯,做一个好学生,做一个优秀的学生,现在我就回去做作业:)您等着我的好消息:)
想问一下你是怎么败入师门的?我也想做个学生啊。TO:zswang(伴水)(* pascal→c *)
老师好,我做个旁听生可以吗?
没把它分解成若干相对简单的问题
只到问题还没有解决时才后悔莫及
............................就来分析这个问题可分解那些问题
No.1 遍历文本行
for I := 0 to mSources.Count - 1 do
ShowMessage(mSources[I]);No.2 排除没有赋值运算的语句
if Pos(':=', mSources[I]) then
{ };No.3 交换赋值号左右两边的表达式
1、取的赋值号左边的表达式
2、取的赋值号右边的表达式
3、交换(如果有函数存在,则替换成对应函数)
a. 在函数列表中查询
b. 如果存在,替换No.4 将结果返回到目标中问题已经分解,等你一步步的实现
实现一步得一步
“这下,再复杂的问题也不用当心”
“问题越来越少、感觉越来越好”
“别看广告!”
“看什么?”
“看疗效”
var
I,J:integer;
Str_1,Str_2:string;
begin
aDest.Clear;
aSource.Clear;
result:=false;
if not (assigned(aFun) and assigned(aSource) and assigned(Adest) ) then Exit;
//****************************************************************************
for I:=0 to aFun.Count-1 do
begin
Str_1:=aFun.Strings[i];
for J:=1 to length(str_1)-2 do
begin
if copy(str_1,j,2)=':=' then
begin
Str_2:=copy(str_1,J+2,length(str_1)-J-1)+':='+copy(str_1,1,J-1);
aDest.Append(Str_2);
aSource.Append('=');
end;
end;
end;
//****************************************************************************
result:=true;
end;
这是我在学校做的:)
所以,嗯,就是没有好好的想;
我在试一下,但函数列表我不值得如何取得
const
cEvaluateSign = ':='; //赋值符号
var
vStrLeft: string; //左边表达式
vStrRight: string; //右边表达式
vStrSpace: string; //递进空格
vStrCurrent: string; //次要字符
vStrFuncName: string; //函数名
vStrFuncParam: string; //函数参数
I, J: Integer;
begin
Result := False;
if not (Assigned(mFuncs) and Assigned(mSources) and Assigned(mDest)) then Exit;
mDest.Clear; //清除显示内容
for I := 0 to mSources.Count - 1 do begin //遍历源代码
vStrCurrent := mSources[I]; //获得当前处理行字符
if Pos(':=', vStrCurrent) <= 0 then begin //排除非赋值语句
mDest.Add(vStrCurrent);
Continue;
end;
///////Begin 获取递进空格
vStrSpace := '';
for J := 1 to Length(vStrCurrent) do
if vStrCurrent[J] = #32 then
vStrSpace := vStrSpace + #32
else Break;
///////End 获取递进空格
vStrLeft := Trim(Copy(vStrCurrent, 1, Pos(cEvaluateSign, vStrCurrent) - 1)); //获取左边表达式
vStrRight := Trim(Copy(vStrCurrent, Pos(cEvaluateSign, vStrCurrent) +
Length(cEvaluateSign), MaxInt)); //获取右边表达式
vStrRight := StringReplace(vStrRight, ';', '', [rfReplaceAll]); //删除分号
///////Begin 处理对应函数
vStrFuncName := Copy(vStrRight, 1, Pos('(', vStrRight) - 1); //获得函数名
vStrFuncParam := Copy(vStrRight, Pos('(', vStrRight), MaxInt); //获得完整参数
Delete(vStrFuncParam, 1, 1); //删除参数前括号
Delete(vStrFuncParam, Length(vStrFuncParam), 1); //删除参数后括号
if (vStrFuncName <> '') and (vStrFuncParam <> '') then
for J := 0 to mFuncs.Count - 1 do begin
vStrCurrent := mFuncs[J] + '='; //获得当前处理行字符//并在其后加一个等号
if Pos(vStrFuncName + '=', vStrCurrent) > 0 then begin
vStrFuncName := StringReplace(vStrCurrent, vStrFuncName + '=',
'', [rfReplaceAll]); //把自己从两个对应函数中排除掉
vStrFuncName := StringReplace(vStrFuncName, '=', '', [rfReplaceAll]); //排除等号
vStrRight := vStrFuncParam; //右边换成参数
vStrLeft := Format('%s(%s)', [vStrFuncName, vStrLeft]); //左边重新组织
Break;
end;
end;
///////End 处理对应函数
mDest.Add(Format('%s%s %s %s;',
[vStrSpace, vStrRight, cEvaluateSign, vStrLeft])); //返回到目标中
end;
Result := True;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
Calc(Memo1.Lines, Memo2.Lines, Memo3.Lines);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
///////Begin 模拟数据
Memo1.Text :=
'StrToInt=IntToStr'#13#10 +
'StrToDate=DateToStr'#13#10 +
'StrToTime=TimeToStr'#13#10 +
'StrToDateTime=DateTimeToStr'#13#10 +
'StringToColor=ColorToString'#13#10 +
'StrToBool=BoolToStr'#13#10; Memo2.Text :=
'begin'#13#10 +
' B := A;'#13#10 +
' I := StrToInt(S);'#13#10 +
' try'#13#10 +
' T := DateToStr(D);'#13#10 +
' except'#13#10 +
' ShowMessage(''Error'');'#13#10 +
' end;'#13#10 +
'end;'#13#10;
///////End 模拟数据
end;
对于一些常用技巧多实践实践本贴需要掌握的函数:
StringReplcae() //替换字符
Tirm() //不说你也知道
Assigned() //判断指针是否为nil
Format() //格式化字符本贴任务:
到Delphi Source->Classes.pas分析TStrings类建议参考:
http://kingron.myetang.com/zsdoc01.txt
http://kingron.myetang.com/zsdoc02.txt
http://kingron.myetang.com/zsdoc03.txt
http://kingron.myetang.com/function.htm技术总结:
能够运用一些的技巧 //不断积累
代码没有风格 //参考Delphi Source
可读性差 //加适当的空格,加适当的注释
对于基础的类不熟悉 //花时间看看书//或者花时间看看VCL源代码//下接贴
http://www.csdn.net/Expert/TopicView1.asp?id=686377