from http://www.csdn.net/Expert/topic/419/419956.shtm
回复人: zswang(伴水)(被黑中) (2001-12-14 11:16:53)  得0分 
to urchinjj(懒刺猬):我来做其中一个吧,我是首开先例啊,不要你的学费
我是以算法为主,有些Delphi5/6+SQL SERVER 7.0/2000 ¦ Access商业开发经验//这是我能教你的

解决方案 »

  1.   

    开个“伴水道场”吧!!
    等会儿取sprikg(3.14159)的人头做见面礼
    呵呵!!
      

  2.   

    Lesson 1
      测试题 1.1  算法名题:在一个列表中排除相同元素
      输入范例:
    2
    9
    1
    9
    2
    4
    3
    4  输出范例:
    2
    1
    9
    4
    3  函数声明:
    procedure Calc(mStrings: TStrings);
    begin
      { 自己发挥 }
    end;
     
     测试代码:
    begin
      Calc(Memo1.Lines);
    end;
      

  3.   

    procedure Calc(InString: TStrings);
    var
      i, j: Integer;
    begin
      i := 0;
      while i < InString.Count do
      begin
        j := i + 1;
        while j < InString.Count do
        begin
          if InString.Strings[j] = InString.Strings[i] then
          begin
            InString.Delete(j);
            continue;
          end;
          Inc(j);
        end;
        Inc(i);
      end;
    end;
    满足要求不
      

  4.   

    procedure xzgybCalc(mString: TStrings);//已经实现了
    var
      I, J: Integer;
    begin
      I := 0;
      while I < mString.Count do begin
        J := I + 1;
        while J < mString.Count do begin
          if mString[J] = mString[I] then begin
            mString.Delete(J);
            Continue;
          end;
          Inc(J);
        end;
        Inc(I);
      end;
    end; { xzgybCalc }procedure TForm1.Button1Click(Sender: TObject);
    var
      T: DWord;
    begin
      T := GetTickCount;
      xzgybCalc(Memo1.Lines); //Count=1000
      Caption := Format('%d', [GetTickCount - T]);//886
    end;
      

  5.   

    procedure zswangCalc(mString: TStrings);
    begin
      { 怎么写 }
    end; { zswangCalc }procedure TForm1.Button1Click(Sender: TObject);
    var
      T: DWord;
    begin
      T := GetTickCount;
      zswangCalc(Memo1.Lines); //Count=1000
      Caption := Format('%d', [GetTickCount - T]);//563
    end;
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      T: DWord;
    begin
      T := GetTickCount;
      zswangCalc(Memo1.Lines); //Count=3000
      Caption := Format('%d', [GetTickCount - T]);//1658
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      T: DWord;
    begin
      T := GetTickCount;
      xzgybCalc(Memo1.Lines); //Count=3000
      Caption := Format('%d', [GetTickCount - T]);//4078
    end;
      

  7.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
        //procedure calc (mstrings:tstrings);
      private
        { Private declarations }
      public
        { Public declarations }
        //procedure calc(mstrings:tstrings);  end;var
      Form1: TForm1;implementation{$R *.DFM}procedure calc (var mstrings:tstrings);
    var
    i,j,k:integer;                       //k计数string1中的元素个数
     string1:   tstrings;               //string1中放置新的元素
    begin
      if mstrings.Count>0 then
       begin
         string1.Strings[0]:=mstrings[0];
         k:=1;
          for i:= 1 to  mstrings.Count-1 do
           begin
             for j:=1 to k do
             begin
              if mstrings[i]=string1[j] then   break
              else K:=k+1;
             end;
           end;
       end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
    MyList:TStrings;
     
    begin
      MyList:=TStringList.create;      // 测试没通过,,
      MyList1:=TStringList.create;     //  不会用Memol.line@_@
       with  MyList do
       begin
         Add('Animals');
         Add('Flowers');
       end;
     calc(MyList);
    end;end.师傅俺不会tsrings,嘿嘿,俺会什么耶?俺知道怎么计算,可是还没通过那,您别急啊,,
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
      

  8.   

    procedure calc (var mstrings:tstrings);
    var
    i,j,k:integer;                       //k计数string1中的元素个数
    string1:   tstrings;               //string1中放置无重复元素
    begin
      if mstrings.Count>0 then
       begin
          string1[0]:=mstrings[0];  //报错,相同类型不能直接赋值,为什么???????
          k:=1;
          for i:= 0 to  mstrings.Count-1 do
           begin
             for j:=0 to k-1 do         //string1中已经存在的的元素
             begin
              if mstrings[i]=string1[j] then   break  //如果在1到k之间有相等的,则跳出不在搜寻
              else
                begin
                   string1[k]:= mstrings[i];   //把无重复元素放在 string1最后一位
                   K:=k+1;
                end;
             end;
           end;
       end;
    end;
    师傅,我明白你的意思,是在原来的列表中操作,我的意思是把不同的元素取出放在另一个列表中,不为什么相同类型直接赋值不可以??
      

  9.   

    抱歉下午有事没有上网
    string1[0]:=mstrings[0];  //string1没有创建
    string1 := TStringList.Create;
    {                   }
    string1.Free;
    你的代码没有风格
    大小写统一,排整齐先
      

  10.   


    师傅,你怎么这么晚还上网啊?是不是看流星雨了?嘿嘿,俺是双子座的,拍完师傅了@_@
    现在:
    1,俺用的算法对不对?
    2,俺知道没风格啊,呜呜,俺排,,
    3,师傅怎么排整齐?还有大小写,怎么统一?俺先去看看书发规范@_@
    师傅,俺今天停电了,出去放风了,嘿嘿,所以才上来看见,//sorry2俺现在改,
      

  11.   

    师傅~~~~~~~~~~~~交作业了~~~~~~~~~嘿嘿
    这个程序调试过了,就是俺实现的太麻烦了,呜呜,俺现在去研究师傅的程序了,
    不过俺还是不会用那个meno测试,嘿嘿,谢谢师傅,严肃的,嘻嘻嘻嘻嘻嘻嘻嘻
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Button2: TButton;
        Edit2: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure calc (var mstrings:tstrings);
      end;var
      Form1: TForm1;
      string1:  tstrings;              //string1中放置无重复元素
        k:integer;
    implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);Var
    myList:TStrings;
    i,l:integer;
    begin
      myList:=TStringList.create;
      string1:= TStringList.Create;
      with  myList do
        begin
          Add('animals');
          Add('flowers');
          Add('stone');
          Add('stream');
          Add('stream');
          Add('s ');
          Add('str ');
          Add('stra ');
          Add('stra ');
        end;
      calc(myList);
      string1[0]:=myList[0];   //测试是否能相互赋值,嘿嘿
      edit1.Text:=string1[0]+string1[6];
      showmessage(inttostr(k))
    end;procedure TForm1.calc(var mstrings: tstrings);
    var
    flag:boolean;                    //标志string1中是否有和mstring中相同的元素
    i,j,n:integer;                      //k计数string1中的元素个数
    begin
      if mstrings.Count>0 then
        begin
          string1:= TStringList.Create;
          with  string1 do
            begin
              for n:=0 to mstrings.Count-1  do   //srtring1初始化与mstrings相同多字符数,
                Add('');
            end;
          showmessage(inttostr(string1.count));
          string1[0]:=mstrings[0];  //不报错了@_@,
          flag:=false;
          k:=1;
          for i:= 1 to  mstrings.Count-1 do
            begin
              for j:=0 to k-1 do        //string1中已经存在的元素个数,
                begin
                  if mstrings[i]=string1[j] then
                    begin
                      flag:=true;
                      break;  //如果在1到k之间有相等的,则跳出不在搜寻
                    end
                  else
                    flag:=false;
                end;
              if flag=false then    //string1中没有与mstrings[i]重复元素
                begin
                  string1[k]:= mstrings[i];  //把无重复元素放在 string1里
                  k:=k+1;
                end;
            end;
        end;
    end;
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      string1.Free;
      close;
    end;
    end.
      

  12.   

    哈哈,这下可比以前的快多了,而且简单多了
    procedure XzgybCalc4(InString: TStrings);
    var
      i: Integer;
      vList: TStringList;
      iCount : Integer;
    begin
      vList := TStringList.Create;
      vList.Capacity := iCount;  for i := 0 to InString.Count - 1 do
        if vList.IndexOf(InString.Strings[i]) = -1 then
          vList.Add(InString.Strings[i]);  InString.Text := vList.Text;
      vList.Free;end;
      

  13.   

    我天,写错了
    procedure XzgybCalc4(InString: TStrings);
    var
      i: Integer;
      vList: TStringList;
    begin
      vList := TStringList.Create;
      vList.Capacity := InString.Count;  for i := 0 to InString.Count - 1 do
        if vList.IndexOf(InString.Strings[i]) = -1 then
          vList.Add(InString.Strings[i]);  InString.Text := vList.Text;
      vList.Free;end;
      

  14.   

    to xzgyb:很好呀!
    //我是这样写的
    procedure zswangCalc(mStrings: TStrings);
    var
      I: Integer;
    begin
      for I := mStrings.Count - 1 downto 0 do
        if mStrings.IndexOf(mStrings[I]) then
          mStrings.Delete(I);
    end; { zswangCalc }
      

  15.   

    procedure zswangCalc(mStrings: TStrings);
    var
      I: Integer;
    begin
      for I := mStrings.Count - 1 downto 0 do
        if mStrings.IndexOf(mStrings[I]) <> I then
    //                                  ~~~~~~~
          mStrings.Delete(I);
    end; { zswangCalc }   
      

  16.   

    to urchinjj(懒刺猬):通过 <<测试题 1.1>> 我已经大楷知道了你的基础和水平首先你要记住:
    No.1 直接判断逻辑值
      if flag=false then ; //不建议
      if not flag then ; //建议  理由: 逻辑型有很多种Boolean,BOOL,LongBool,WordBool.........
      True和False在不同的逻辑型中有不同的数值
      有可能Boolean(True) <> BOOL(True)No.2 循环标记
    ///////Begin 不建议
              for j:=0 to k-1 do        
                begin
                  if mstrings[i]=string1[j] then
                    begin
                      flag:=true;
                      break; //很好知道要跳出循环
                    end
                  else
                    flag:=false; //每次都要赋值
                end;
    ///////End 不建议///////Begin 建议
              flag:=false; //只赋值一次
              for j:=0 to k-1 do        
                begin
                  if mstrings[i]=string1[j] then
                    begin
                      flag:=true;
                      break;
                    end;
                end;
    ///////End 建议
      理由:减少计算量,增加运行速度No.3 常用函数,看别人程序的时候不要看不懂,最好自己也用用
      Inc(I); //I := I + 1;
      Dec(I); //I := I - 1;
      Succ(I); //I + 1;
      Pred(I); //I - 1;
      Odd(I); //I mod 2 <> 0;
      Include(S, I); //S := S + [I];
      Declude(S, I); //S := S - [I];
      Trunc(R); //自己看Help
      Round(R); //自己看Help
      Str();
      Val();
      .....
      理由:pascal最基础的函数一定要知道其次你要锻炼:
      熟能生巧
      多看,多写,多研究
      曾经我把<<pascal标准教材>>所有习题都自己独立的通写了一遍
      我就不多说了最后风格:
      看看Delphi是怎样写的就怎样写
      没有风格的程序看不是享受
      当然以后我会花时间给你谈谈编程风格Home Work:
    测试题 1.2  算法名题:计算N!(N阶乘)(必须使用递归方法,N<10测试)
      输入范例:4
      输出范例:24
    //        ~~1*2*3*4
      函数声明:
    function Calc(mNumber: Integer): Integer;
    begin
      { 自己发挥(其他地方不准乱写代码) }
    end;  测试代码:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Caption := IntToStr(Calc(StrToIntDef(Edit1.Text)));
    end; 
      

  17.   

    zswang:
    不错,又学东西,简洁阿,我还一直不懂为什么是这结果
    2
    1
    9
    4
    3
    明白了,呵呵
    这张贴子,我是在偷艺阿,也很希望能跟你学习,呵呵,虽然我岁数大了点  
      

  18.   

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    师傅,俺感冒了,呜呜,晚上才上来,俺去作题了,,临走,to xzgyb(老达摩),你怎么偷艺啊?//ice//hammer,嘿嘿//hand//sorry//@@
      

  19.   

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    师傅,俺交作业了,这是最简单的递归,嘿嘿
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Edit2: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        function Calc(mNumber: Integer): Integer;
      end;var
      Form1: TForm1;implementation{$R *.DFM}{ TForm1 }function TForm1.Calc(mNumber: Integer): Integer;
    begin
      if mNumber=0 then          //如果N=0 则N!=1
        calc:=1
      else
        calc:=mNumber*calc(mNumber-1);  //否则 N!=N*(N-1)! ,实现递归
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      Number: Integer;
    begin
      Caption := IntToStr(Calc(StrToIntDef(Edit1.Text, 0)));  //调试通过~~~~嘿嘿
    end;
    end.
      

  20.   

    to xzgyb(老达摩) 哈哈,不好意思,呵呵 俺师傅不说你,俺就不管了,嘿嘿,侬好好学啊,别和俺一样,,//kick//paste暗害你,嘿嘿,,俺师傅怎么不是被黑,就是副本啊?//cry
      

  21.   

    //to urchinjj(懒刺猬):Good!
    //注意以下几点
    //function TForm1.Calc(mNumber: Integer): Integer;
    //         ~~~~~~~不用声明成类函数,应该是单元函数,TForm1不创建是不能使用Calc
    function Calc(mNumber: Integer): Integer;
    begin
    //  if mNumber=0 then          //如果N=0 则N!=1
    //            ~用空格分开一下,容易区分标识
      if mNumber <= 0 then //如果N<=0 则N!=1
    //    calc:=1
    //    ~~~~~~~用Result比较好,不用怕函数以后改名
        Result := 1
    //  else
    //    calc:=mNumber*calc(mNumber-1);  //否则 N!=N*(N-1)! ,实现递归
    //    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~自己看看上面美观还是下面美观
        else Result := mNumber * Calc(mNumber - 1); //否则 N!=N*(N-1)! ,实现递归
    end;procedure TForm1.Button1Click(Sender: TObject);
    //var
    //  Number: Integer;
    //  ~~~~~~~~~~~~~~~~ 没用的变量不要声明
    begin
      Caption := IntToStr(Calc(StrToIntDef(Edit1.Text, 0)));  //调试通过~~~~嘿嘿
    end;end.
      

  22.   

    嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿
    嘿嘿嘿知道师傅嘿嘿嘿
    嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿俺一直在等侬来查作业那,,俺又学会了一个函数StrToIntDef,俺总是没记性,怎么办啊?//cry
      

  23.   


    ~~~~~~~不用声明成类函数,应该是单元函数,TForm1不创建是不能使用Calc
    师傅,俺就知道去那里声明啊?这样声明不好吗?俺还知道如果把函数放在调用前面,在一个单元里也可以不声明,是吗?类函数和单元函数分别在哪里声明?除了使用范围不同,还有什么区别?对性能有影响吗?
      

  24.   

    Home Work(2):
    测试题 1.3  算法名题:判断N是不是质数(如:2,3,5,7,11,13,17....)
      输入范例1:17
      输出范例1:True
      输入范例2:57
    //         ~~3*19=57
      输出范例2:False  函数声明:
    function Calc(mNumber: Integer): Boolean;
    begin
      { 自己发挥(用Result) }
    end;  测试代码:
    procedure TForm1.Button1Click(Sender: TObject);
    const
      cBoolStr: array[Boolean] of string = ('False', 'True');
    begin
      Caption := cBoolStr[Calc(StrToIntDef(Edit1.Text))];
    end; 测试题 1.4
      算法名题:输入日期字符返回中文表达方式(不考虑错误输入)
      输入范例1:2001-9-7
      输出范例1:二零零一年九月七日
      输入范例2:2018-11-27
      输出范例2:二零一八年十一月二十七日
      函数声明:
    function Calc(mString: string): string;
    begin
      { 自己发挥(用Result) }
    end;  测试代码:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Caption := Calc(Edit1.Text);
    end; 
      

  25.   

    呜呜呜呜呜呜呜呜呜呜
    呜呜呜师傅收到呜呜呜
    呜呜呜呜呜呜呜呜呜呜师傅,这个晚一点交可以不?明天俺有任务,可能没时间,嘿嘿,
    //shy//inn//cry................................@_@...................................
      

  26.   

    第一条俺和师傅一样,想不明白,俺就编不出来,
    第二条俺做不到,在俺自己的能力范围内,俺总想简单一些实现,不过现在在改变这个毛病,
    第三条,俺就没的想那,嘿嘿,@@@@@@@@@@@@@@@@@@@@@@@@@@
    好呀!我只是留在这里
    什么时候有时间什么时候写
    关注就行 
    @@@@@@@@@@@@@@@@@@@@@@@@@@
    俺上来先看这里了,俺现在项目里担任的一点事快作完了,明天就集成了,所以以后有时间来看了,嘿嘿,
    //thank,就不说了吧?@_@
      

  27.   

    //类函数和单元函数分别在哪里声明?
    IntToStrDef()//是一个单元函数
    SysUtils.IntToStrDef()//完全写法
    Close//是一个类型函数//过程也可以叫函数
    Self.Close//完全写法//除了使用范围不同,还有什么区别?
    //对性能有影响吗? 
    类函数可以直接访问类事例的属性
    procedure TForm.Calc;
    begin
      ShowMessage(Caption); //直接访问Caption
    end;单元函数不能直接访问类事例的属性
    procedure Calc;
    begin
    //  ShowMessage(Caption); //编译不能通过//Caption是谁的?
      ShowMessage(Form1.Caption); //只能间接访问Caption
    end;
      

  28.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      { 其实Button1Click就是类函数 }
    end; 
      

  29.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      with TForm1.Create(Self) do try //也算是个递归,自己玩玩看
        ShowModal;
      finally
        Free;
      end;
    end; //try except 和try finally的区别
    try ... except { 出现异常才执行 } end;
    try ... finally { 不管怎样都执行 } end;
      

  30.   

    嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿
    嘿嘿嘿师傅收到嘿嘿嘿
    嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿师傅,俺走了,侬也早点休息,嘿嘿//sleep//@@