zswang (伴水)(* pascal→c *)真是一个好老师。

解决方案 »

  1.   

    不是很明白你的意思,所以,我就在函数里只实现了互换的功能;
    如果还有什么要求的话,我马上再做:)
    ====================================================================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.
    ====================================================================
      

  2.   

    我输入
    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;
      

  3.   

    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;
      

  4.   

    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;//#你用我的测试数据通过没有?
    //#我调试,没有出结果
      

  5.   

    你先熟悉TStrings以下属性和方法
    TStrings.Strings //访问每一行 如:ShowMessage(Memo1.Lines[0]);
    TStrings.Add() //添加一行
    TStrings.Count //行数
    TStrings.Insert() //插入一行
    TStrings.Move() //移动行
    TStrings.Delete() //删除行
    ....
    在学习标准类的时候,自己先想想应该提供什么方法和属性,再看帮助,查资料编程思想最重要,我的方法是这样No.1 把自己当成 计算机 来思维
    No.2 把自己当成 语言设计师 来思维
    No.3 把自己当成 开发工具提供商 来思维
    No.4 把自己当成 客户 来思维闭眼睛先想一下,如果你是他们 你将提供什么?
      

  6.   

    老师:
       您好,嗯,先谢谢你的批示:);
       程序在我的机子上真的通过了,不过,我也觉的用我的这种办法是很笨很笨的,而且可读性极差,让别人无法理解,DELPHI的语言规则一点也没有;不过,我会改的,真的;真心的感谢你,老师!
       或许您不知道,今天我已经返校了,给您回复也已经是在外边的网吧了;
       但是,我还是希望能当您的学生,嗯,做一个好学生,做一个优秀的学生,现在我就回去做作业:)您等着我的好消息:)
      

  7.   

    TO:xgto
         想问一下你是怎么败入师门的?我也想做个学生啊。TO:zswang(伴水)(* pascal→c *)
         老师好,我做个旁听生可以吗?
      

  8.   

    当一个复杂的问题摆在你的面前时
    没把它分解成若干相对简单的问题
    只到问题还没有解决时才后悔莫及
    ............................就来分析这个问题可分解那些问题
    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 将结果返回到目标中问题已经分解,等你一步步的实现
    实现一步得一步
    “这下,再复杂的问题也不用当心”
    “问题越来越少、感觉越来越好”
    “别看广告!”
    “看什么?”
    “看疗效”
      

  9.   

    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;
    这是我在学校做的:)
      

  10.   

    还有,前边是说得玩的其实,我先前已经想到了,只是我想如果用copy也同样可以得到string形的啊!
    所以,嗯,就是没有好好的想;
    我在试一下,但函数列表我不值得如何取得
      

  11.   

    function Calc(mFuncs: TStrings; mSources: TStrings; mDest: TStrings): Boolean;
    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;
      

  12.   

    伴水兄的胸怀和学问让人敬佩,xgto小妹妹要加油呀!
      

  13.   

    呵呵,是啊,听说xgto还在实习中,我想如果好好的和伴水大哥学的话,应该也是一个很优秀的程序员,来吧,我们踢上去!
      

  14.   

    对于不明白的函数多看看帮助
    对于一些常用技巧多实践实践本贴需要掌握的函数:
    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