来来来,看看你的水平有多高!——Aimingoo送分项目(超过600大元) (0分)

  • 主题发起人 aimingoo
  • 开始时间
不好意思掉线发贴子。
同意aimingoo,代码规范化,是件好事情,平时我也是这样来要求自己
可作的多了,也就发现了一些缺陷,那就是规范化束缚一个人思维的灵活性
有的时候脑海里明明知道一个goto语句可以效率更高甚至理解性更高,却还是不由自主的
会去用什么case语句,如果大伙能用softice看看asm和delphi开发的程序,你会发现功能同样的代码,
delphi的编译器不是在优化代码,而是一个劲的死命增加大量的垃圾!
另外高级语言最短有效源代码并不能使编译代码最小,也不能有效提高最终执行效率!
在某些行业高级语言显得是那样的幼稚,它封装了太多关联了太多垃圾了太多
512字节在物理上不能体现最完美的效果,但是在思维上却可以让人有返朴归真的清新
还有啊:)512字节的exe对delphi来说是不可逾越的,要不要考考谁能做最小的delphi程序?
小体积那可比小源代码有用的多多了![:D]
 
优化和统计字节数用delphi甚至包括内嵌汇编来做并且控制在512字节,不可想象
因为要识别的关键字累加起来可能都要512的1/3-1/2,谁知道测试者都用些什么语句呀:(
哦,还要去空格,分析变量名,简化变量名等等
:)没敢作
 
>>分析变量名,简化变量名等等
aimingoo主席,您也看到了,难度...虽然您已经放宽了长度限制,但选手们还是可能会选择尽量短的变量名。
我虽然写了上面的程序,但还是坚持以行数为标准。
 
还是我来吧。
下面的程序已经可以处理 {},// 注释 ' asdf'' asdfas df'字符串了,还不会把编译指示过滤掉,效果不错哦。
(我上面的随机数产生程序经处理后仍能编译![:)])
注意:Delphi的源代码[red]每行的长度不能超过954Bytes[/red]。
{
Function Neme: PackSrc
Author: creation_zy ( creation-zy )
Purpose: 删除 Delphi 源代码中的无用字符
History: 2001-10-1
}
function PackSrc(const Source:String):String;
const
Alpha_Number=['0'..'9','A'..'Z','a'..'z','_'];
var
mstr:String;
i,Len,n,Status:Integer;
LastNone:Boolean;
begin
Status:=1;
n:=0;
i:=1;
LastNone:=false;
Len:=Length(Source);
SetLength(mstr,Len);
while i<=Len do
begin
case Source of
'{':
begin
if Source[i+1]='$' then
repeat
Inc(n);
mstr[n]:=Source;
Inc(i);
until Source[i-1]='}'
else
repeat
Inc(i);
until Source[i-1]='}';
LastNone:=true;
continue;
end;
'''':
begin
Inc(n);
mstr[n]:=Source;
Inc(i);
while true do
begin
if Source='''' then
begin
if Source[i+1]='''' then
begin
mstr[n+1]:='''';
mstr[n+2]:='''';
Inc(n,2);
Inc(i,2);
end
else
begin
Inc(n);
mstr[n]:='''';
Inc(i);
break;
end;
end
else
begin
Inc(n);
mstr[n]:=Source;
Inc(i);
end;
end;
Status:=1;
continue;
end;
'/':
begin
if Source[i+1]='/' then
begin
repeat
Inc(i);
until Source[i-1]<' ';
continue;
end;
end;
end;
case Status of
0:
begin
if Source in Alpha_Number then
begin
if LastNone then
begin
Inc(n);
mstr[n]:=' ';
end;
Inc(n);
mstr[n]:=Source;
LastNone:=false;
end
else
if Source<=' ' then
LastNone:=true
else
begin
Inc(n);
mstr[n]:=Source;
Status:=1;
end;
end;
1:
begin
if Source in Alpha_Number then
begin
Inc(n);
mstr[n]:=Source;
Status:=0;
LastNone:=false;
end
else
if Source>' ' then
begin
Inc(n);
mstr[n]:=Source;
end;
end;
end;
Inc(i);
end;
Result:=Copy(mstr,1,n);
end;

我已经把可执行程序和源代码放到我的主页上去,让大家下载。
http://zhangyi1980.home.chinaren.com/MyPrograms/index.htm
 
建议做统计时将所有变量都作一个字符计算
不然大家用一个字符的变量名
看了都不舒服的
 
The lastest version is available! 新增单词统计功能。(不包括编译指示,一个字符串当成一个单词)
eg:
Source:
{$I+}function{Func Here!}FuncA(const A: String):{Output} Integer;
begin
//Function's Main
Result := ( Length ('He''He! ??' + A){长度} +50 )/2;
end;

Result:
{$I+}function FuncA(const A:String):Integer;
begin
Result:=(Length('He''He! ??'+A)+50)/2;
end;
长度:92 有效单词数:14
[:)][:)]
 
>>- 凡是投稿者,都能得到全部参赛作品以及富翁评价的完整拷贝。
不投稿就没有?呵呵,那我怎么也得投啦。[:)]
下面是我的代码,用我自己这个东东计算正好512[8D]
功能:计算Delphi源码字符数,不含空格和备注,但计算字符串里的空格,那是你自己要加的嘛[:)]
没来得及仔细测试,兄弟们发现有Bug的话我再改.
最后祝大家中秋快乐。
代码:
program P;
uses
  Dialogs,Classes,SysUtils;
var
  S:String;
  i,r,l:Int64;
function C(s:String):Integer;
begin
  r:=0;i:=0;
  while(i<Length(s)) do
  begin
    Inc(i);
    l:=Length(s);
    case s[i] of
      '{':
        if s[i+1]='$' then
          Inc(r)
        else
          i:=i+Pos('}',Copy(s,i,l));
      '/':
        if s[i+1]='/' then
          i:=i+Pos(#13#10,Copy(s,i,l))
        else
          Inc(r);
      '''':
      begin
        l:=Pos('''',Copy(s,i+1,Length(s)));
        r:=r+l+1;
        i:=i+l;
      end;
      ' ',#13,#10:;
    else
      Inc(r);
    end
  end;
  result:=r;
end;

begin
  if PromptForFileName(S,'','','','') then
    with TStringList.Create do
    begin
      LoadFromFile(S);
      ShowMessage(IntToStr(C(Text)));
    end;
end.
 
凑个热闹,就是chinakiss8848说的自己写自己啦!
原来的程序(336字节):
CONST S:STRING='VAR I:WORD;F:TEXT;
begin
ASSIGN(F,''M.DPR'');REWRITE(F);WRITE(F,''CONST S:STRING='');FOR I:=1TO LENGTH(S)DO WRITE(F,''#'',ORD(S));WRITE(F,'';''+S);CLOSE(F);
end.
';VAR I:WORD;F:TEXT;
begin
ASSIGN(F,'M.DPR');REWRITE(F);WRITE(F,'CONST S:STRING=');FOR I:=1TO LENGTH(S)DO WRITE(F,'#',ORD(S));WRITE(F,';'+S);CLOSE(F);
end.
但是写完后,程序变为(632字节)不合要求:
CONST S:STRING=#86#65#82#32#73#58#87#79#82#68#59#70#58#84#69#88#84#59#66#69#71#73#78#32#65#83#83#73#71#78#40#70#44#39#77#46#68#80#82#39#41#59#82#69#87#82#73#84#69#40#70#41#59#87#82#73#84#69#40#70#44#39#67#79#78#83#84#32#83#58#83#84#82#73#78#71#61#39#41#59#70#79#82#32#73#58#61#49#84#79#32#76#69#78#71#84#72#40#83#41#68#79#32#87#82#73#84#69#40#70#44#39#35#39#44#79#82#68#40#83#91#73#93#41#41#59#87#82#73#84#69#40#70#44#39#59#39#43#83#41#59#67#76#79#83#69#40#70#41#59#69#78#68#46;VAR I:WORD;F:TEXT;
begin
ASSIGN(F,'M.DPR');REWRITE(F);WRITE(F,'CONST S:STRING=');FOR I:=1TO LENGTH(S)DO WRITE(F,'#',ORD(S));WRITE(F,';'+S);CLOSE(F);
end.
改为,共398字节:
CONST S:STRING='VAR I:WORD;F:TEXT;
begin
ASSIGN(F,''M.DPR'');REWRITE(F);WRITE(F,''CONST S:STRING=''#39);FOR I:=1TO LENGTH(S)DO IF S=#39then
WRITE(F,#39#39)else
WRITE(F,S);WRITE(F,#39'';''+S);CLOSE(F);
end.
';VAR I:WORD;F:TEXT;
begin
ASSIGN(F,'M.DPR');REWRITE(F);WRITE(F,'CONST S:STRING='#39);FOR I:=1TO LENGTH(S)DO IF S=#39then
WRITE(F,#39#39)else
WRITE(F,S);WRITE(F,#39';'+S);CLOSE(F);
end.

不知道符合要求否?
 
最精悍而又有效的控件!
该控件可以添加鼠标离开事件,即监测鼠标的移动离开目标的过程。
unit MyImg;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
ExtCtrls;
type
TMyImage = class(TImage)
private
FOnMouseLeave: TNotifyEvent;
procedure CMMouseLeave(var Message: TMessage);
message CM_MOUSELEAVE;
protected
public
published
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;

procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TMyImage]);
end;

procedure TMyImage.CMMouseLeave(var Message: TMessage);
begin
inherited;
if Assigned(FOnMouseLeave) then
FOnMouseLeave(Self);
end;

end.
 
精彩!!可惜我只是个初学者,写不出来这么简炼的程序。:(
得好好学学!!
 
什么是多态性,我不懂,不知这样理解对不对
var
ob:tstringlist;
begin
ob:=tstringlist.create;
ob.addobject('root',ttreeview1.addchild(nil,'root');
ob.addobject('node1',ttreeview1.addchild(ob.objects[ob.indexof('root')] as ttreenode,'node1'));
ob.free;
end;
 
来凑热闹
 
呵呵,好主意啊!这里贡献一个,把应用程序隐藏起来的!
unit HideApp;
interface
uses Windows, Messages, Classes, Controls, Forms;
type THideApp = class(TComponent)
private
{ Private declarations }
protected
{ Protected declarations }
public
Procedure Execute;
published
{ Published declarations }
end;

procedure Register;
function RegisterServiceProcess(
dwProcessID, dwType: Integer): Integer;
stdcall;
external 'KERNEL32.DLL';
implementation
Procedure THideApp.Execute;
begin
RegisterServiceProcess(GetCurrentProcessID, 1);
end;

procedure Register;
begin
RegisterComponents('Freeware', [THideApp]);
end;

end.
 
有意思。;)
 
to yyanghhong

[:D][:D][:D]我怎么总看总觉得你那加treenode那部分还是用我的好[:D][:D][:D]
 
不知道"hello world!"算不算?
这可是初学者必修的程序啊。
符合1、2、3、4、5、6条要求,呵呵。
[:D][:D][:D]
 
是件好玩的事,不过我不认为512字节或更多一些的代码能够真正反应出任何人的水平:)
特别是OP这样对规范性要求很高的语言
不如用汉字写篇文章,阐述一下一种原理或思想,似乎更有意义些
 
to qiubole
i saw your code, your code is short, but the efficiency is low,
eg: ob.addobject('node1',treeview1.items.addchild(ob.objects[ob.indexof('root')] as ttreenode,'node1'));
when you use indexof function, it would seek the entire string list. if there are lots of rows on the table,
you can figure out how much times this list have to be seek.
 
[:)][:D][8D]太可惜了,俺的水平就那样了,只能眼睁睁看着别人写,不过俺会努力的。[^][?]
 

Similar threads

S
回复
0
查看
953
SUNSTONE的Delphi笔记
S
S
回复
0
查看
775
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
顶部