2007年09月07日

我从不使用奇怪的指标线,5日、10日、30日等等规则的均线系统才对我更有用,能方便我了解到大部分人的想法,并决定对策。对于选股,我依然认为好的选股方法只有一种就可以了,不论长中短线,方法都是这个,万变不离其宗嘛。(独家证券参考,披露更多内幕……)

条件一:不同的大势有不同的选择。升势的时候选择板块类的个股;盘整的时候突破的个股比较好;跌势的时候我是不会做板块的,即使做了,那些除了龙头股以外的个股也不会跟着被带上来。

条件二:选择龙头股。假如在领头的股票身上赚不到钱又怎能在别的股票身上赚钱呢?即使我要做整个板块,也是有一只的筹码比较集中的作为领头羊。同样的,即使是超跌反弹等行情也都是有筹码最集中的。

条件三:尽量在尾盘买。这样一天的图形做完了,可以简单的看出我们的意图而不会被迷惑。

条件四:不要被大阳线吓倒。涨幅居前的股票总有几只在明、后天还会好的。

条件五:参考大盘。大盘的分析比个股简单的多,牛市阳多阴长,熊市阴多阳长。

条件六:不要相信越跌越买的言论。经过风险的量化可以发现,越跌越买比越涨越买的风险大得多。如果跌到止损位,果断卖出。

条件七:顺势而为。但要明白物极必反的道理,涨了五六天的股票明天还会涨吗?要点:所有所有的一切,成交量换手率相对较大都是非常重要的,我甚至很喜欢买当天的换手率有15%-20%以上的股票。这也关系到你在获利后是否可以顺利出局相对于资金量比较大的人来说。

一些简单的经验:高位拉出下影线不要以为是好事情,有可能是因为我在出了一部分筹码之后再次拉上来为我明天继续出货做准备。

高位横盘或拉升之后尾市下跌,或下跌之后尾市拉升恐怕都是近期出货的迹象,尤其后者表明已经无心恋战了!

我从不使用奇怪的指标线,5日、10日、30日等等规则的均线系统才对我更有用,能方便我了解到大部分人的想法,并决定对策。对于选股,我依然认为好的选股方法只有一种就可以了,不论长中短线,方法都是这个,万变不离其宗嘛。

条件一:不同的大势有不同的选择。升势的时候选择板块类的个股;盘整的时候突破的个股比较好;跌势的时候我是不会做板块的,即使做了,那些除了龙头股以外的个股也不会跟着被带上来。

条件二:选择龙头股。假如在领头的股票身上赚不到钱又怎能在别的股票身上赚钱呢?即使我要做整个板块,也是有一只的筹码比较集中的作为领头羊。同样的,即使是超跌反弹等行情也都是有筹码最集中的。

条件三:尽量在尾盘买。这样一天的图形做完了,可以简单的看出我们的意图而不会被迷惑。

条件四:不要被大阳线吓倒。涨幅居前的股票总有几只在明、后天还会好的。

条件五:参考大盘。大盘的分析比个股简单的多,牛市阳多阴长,熊市阴多阳长。

条件六:不要相信越跌越买的言论。经过风险的量化可以发现,越跌越买比越涨越买的风险大得多。如果跌到止损位,果断卖出。

条件七:顺势而为。但要明白物极必反的道理,涨了五六天的股票明天还会涨吗?要点:所有所有的一切,成交量换手率相对较大都是非常重要的,我甚至很喜欢买当天的换手率有15%-20%以上的股票。这也关系到你在获利后是否可以顺利出局相对于资金量比较大的人来说。

一些简单的经验:高位拉出下影线不要以为是好事情,有可能是因为我在出了一部分筹码之后再次拉上来为我明天继续出货做准备。

高位横盘或拉升之后尾市下跌,或下跌之后尾市拉升恐怕都是近期出货的迹象,尤其后者表明已经无心恋战了

BIAS 乖离率--判断原则

  这里的乖离,具体是指收盘价格(或指数,下略)与某一移动平均价格的差距,而乖

离率则用以表征这种差距的程度。将各BIAS值连成线,则得到一条以零值为中轴波动伸延

的乖离率曲线。

v$bN(eh{S a[;}IJ0?N日BIAS的N值通常取6、10、30、72及以上,分别用以研判短期、中期、中长期以

· ·               
.K-]8XUf/lX&w7I0   及长期的市势。

?一般而言,当BIAS过高或由高位向下时为卖出信号, 当BIAS过低或由低位向上时为

·   网眼科技超级BLOGi-`E6`{-l,J
    买入信号。

?在中长期多方市场里, BIAS在0上方波动,0是多方市场调整回档的支持线, BIAS在0附

· ·                  网眼科技超级BLOGHvgFc}h-Kn/M
   近掉头向上为买入信号。在中长期空方市场里, BIAS在0下方波动, 0是空方市场调整

   反弹的压力线,BIAS在0附近掉头向下为卖出信号。BIAS若有效上穿或下穿0,则是

   中长线投资者入场或离场的信号。

?采用N值小的快速线与N值大的慢速线作比较观察,若两线同向上, 升势较强; 若两

· ·               网眼科技超级BLOG!SesBT7ERm(j9~
   线同向下,跌势较强;若快速线上穿慢速线为买入信号;若快速线下穿慢速线为卖

   出信号

CCI 顺势指标--判断原则

1、CCI正值为多头市场,CCI负值为空头市场。

2、如CCI由-100之下回升,可认为是买入信号。

3、如CCI由+100之上下跌,可认为是卖出信号。

KDJ 随机指标--判断原则

:Z!J3L r-?&^r @01、一般而言, D线由下转上为买入信号,由上转下为卖出信号。

2、KD都在0~100的区间内波动,50为多空均衡线。如果处在多方市场,50是

  回档的支持线; 如果处在空方市场,50是反弹的压力线。

3、K线在低位上穿D线为买入信号,K线在高位下穿D线为卖出信号。

4、K线进入90以上为超买区,10以下为超卖区;D线进入80以上为超买区,20

  以下为超卖区。宜注意把握买卖时机。

5、高档区D线的M形走向是常见的顶部形态,第二头部出现时及K线二次下穿

  D线时是卖出信号。低档区D线的W形走向是常见的底部形态,第二底部出

  现时及K线二次上穿D线时是买入信号,若与价格走向发生背离,分别称为

  "顶背离"和"底背离",买卖信号可信度极高。

6、J 值可以大于100或小于0。J 指标值为依据KD买卖信号是否可以采取行动提

  供可信判断。通常,当 J值大于100或小于10 时被视为采取买卖行动的时机。

7、KDJ本质上是一个随机性的波动指标,故计算式中的N 值通常取值较小,以

  5至14为宜, 可以根据市场或商品的特点选用。不过, 将KDJ应用于周线图或

  月线图上, 也可以作为中长期预测的工具

W&R 威廉指标--判断原则

  威廉指标全名为"威廉氏超买超卖指标",属于分析市场短线买卖走势的技术指

标。它是以N日内市场空方的力道(H – c)与多空总力道(H – L) 之比率,以此研判市势。

它是一个随机性很强的波动指标,本质上与KDJ理论中的未成熟随机指标RSV无异。

 

1、0≤WMS%R≤100。由于WMS%R以研究空方力道为主,这与其它相似的振荡

  性指标以研究多方力道为主恰好相反,因此,WMS%R 80以上为超卖区,

  20以下为超买区。

2、由于其随机性强的缘故,若其进入超买区时,并不表示价格会马上回落,

  只要仍在其间波动,则仍为强势。当高出超买线(WMS%R=20)时,才发出

  卖出信号。

3、同上理,当低过超卖线(WMS%R=80)时,才发出买入信号。

4、WMS%R=50是多空平衡线,上穿或跌破此线, 是稳健投资者的买卖信号。

5、公式中N的取值通常有6、12、26、等,分别对应短期、中短期、中期的分

  析。

MACD 指数平滑异同平均线--判断原则

  平滑异同移动平均线 MACD  是通过对指数型平滑移动平均线 EMA 的乖离曲线

(DIF)以及DIF值的指数型平滑移动平均线(DEA)这两条曲线走向之异同、乖离的描

绘和计算,进而研判市势的一种技术方法。

 

1、0轴以下:DIF若上穿 DEA为买入信号;DIF若下穿 DEA为反弹结束信号, 也

  为卖出信号,但适于多方平仓,空方新卖单不适于入场。

2、0 轴以上:DIF 若下穿 DEA 为卖出信号;DIF 若上穿 DEA 为回档结束信号,

  也为买入信号,但适于空方平仓,多方新买单不适于入场。

3、与市势的 M头(或三头)以及 W底(或三底)形态相仿, 高档区DIF二次以上

  下穿 DEA可能大跌;低档区DIF二次以上上穿 DEA可能大涨。这两处交叉若

  与价格走向相背离,则可信度极高。

4、由于柱线图拐点的变化十分敏感,虽可捕捉先机,但需小心因小失大。

“主力进出”指标

主力进出线是大智慧股软的一个特色指标,是综合反应量价关系的指标。
2M!I$oz6KK$f’R,]G0
L%`1Mk"R*N5f0用法: 网眼科技超级BLOG [u)M[n7HJ
绿线为短期主力运作轨迹,黄线为中期主力运作轨迹,白线为长期主力运作轨迹。
6Cd&l k4yP!K]u0主力进出指标的绿线向上突破黄线、白线且三线向上发散,表示主力有效控盘,可逢底介入,持股待涨。
6WJ9]8M1Xl&b0主力进出指标的绿线上涨过快远离黄、白线,出现较大乖离,表示短线获利筹码较多,宜注意控制风险,可适当卖出。
0X2wd0?J~5k dK_-u0当绿线回落至黄、白线处受支撑时,而黄白线发散向上,表示上升趋势未改,前期股价回落仅是途中的回调,可适量跟进。 网眼科技超级BLOGtAm0a0y
主力进出三线“死亡交叉”,盘口呈空头排列,投资者宜尽快出局。 网眼科技超级BLOGv P$f-tv[&GhA.uUdj
主力进出三线相近并平行向下时,表明主力尚未进场或正在出货,此时不宜介入。 网眼科技超级BLOG)B4\ oN W.p m?$a
主力进出是一种趋势指标,但趋势改变信号有时会出现滞后现象,此时就要用主力买卖指标加以配合使用。

2006年11月17日

  http://www.altium.com/forms/designer/servicepacks.aspx       Pretel2004升级包下载官方网站
    http://www.networkdictionary.com/chinese/                    网络大典网站(网络技术资料网站)
    http://www.snmplink.org/               有很多关于SNMP的图书和资料
    http://www.net-snmp.org/docs/man/      ucd-snmp或net-snmp的官方网站
    http://datasheet.com.cn/               电子器件数据手册搜索网站
    http://www.datasheetcatalog.com/       国外电子器件资料索引网站
    http://www.cnpaf.net/                  中国协议分析网
    http://21ic.com/                       集电子器件和电子技术资料于一身的网站
    http://www.china-pub.com/              中国电子书刊专业网站
    http://61.152.169.29/                  蚂蚁公社网站(Ant Power),有很多好资料
    http://drew.nease.net/                 程序员的个人主页-有很多嵌入式系统资料
    http://prdownloads.sourceforge.net/    国外的GNU工具网站
    http://asg.web.cmu.edu/rfc/            RFC索引网页,搜查RFC资料的起始页
    http://www.agentpp.com/                Agent++软件包官方网站
    http://www.uclinux.org/                uClinux官方网站
    http://www.ucos-ii.com/                uCOS嵌入式操作系统官方网站
    http://www.embhelp.com/download/       嵌入式网-嵌入式技术资料的网站
    http://www.hz.zj.cninfo.net/khfw/      电信业务客户服务网
    http://www.zlgmcu.com/home.asp         周立功单片机-嵌入式系统品牌网
    http://www.61ic.com/                   61IC中国电子在线—有很多嵌入式资料
    http://friends.mop.com/                猫扑朋友圈
    http://www.51eda.com/                  中国EDA技术网,很多嵌入式开发资料
    http://www.scte.org/international.cfm  SCTE官方网站
    http://www.orsoon.com/                 未来软件园(下载资料速度极快)
    http://www.techor.com                  技创科技网,有不少嵌入式资料可以参考
    http://www.520code.com/                藏经阁下载站   很多好软件免费下载
    http://www.fixdown.com/                很多软件下载,并附有破解程序
    http://www.fpga.com.cn/                可编程逻辑器件中文网
    http://www.lihuasoft.net/download/     有许多PC编程的源代码,很实用!
    http://msdn.microsoft.com/downloads/   微软开发资源下载链接!!!
    http://www.frontfree.net/              北京工业大学放飞技术网(有很多计算机图书)
    http://gro.clinux.org/                 GRO嵌入式系统资源开放网
    http://arm.com/documentation/          ARM官方网文档
    http://savannah.nongnu.org/projects/lwip/    lwIP协议栈官方网站!!!

2006年04月28日

VSS and ClearCase on same machine

I did some research on google, but couldn’t find anything useful, that helped solve the problem. But – I did find some remarks stating that VSS and ClearCase on the same machine could be quite problematic.

Next station was the registry. After an extensive research, it turned out that there is a specific registry key that the IDE (both of them!) looks into to see whether a specific SourceControl is installed. For some unknown reason (to me), there is no value in there for source safe, only for ClearCase. This value should be removed prior using the VSS. If it is there – the VSS integration in VS.NET won’t work.

So, here is a step by step instructions to re-enable VSS on a machine with ClearCase installed:

1. Open RegEdit

(Imagine that all the regular yada yada about the dangers in messing with the Registry is written right here.)

2. Navigate to: HKEY_LOCAL_MACHINE/SOFTWARE/SourceCodeControlProvider/InstalledSCCProviders

3. If ClearCase is installed, you should see one entry (besides the “(Default)”) named “ClearCase”, with the value “Software\Atria\ClearCase”. Remove the entry.

4. Now try to work with VSS under VS.NET. It should work.

If you would like to re-enable ClearCase later, simply add the entry mentioned above.

After a few rounds of adding / deleting from the registry, I became quite tired from this procedure, so I wrote a little tool which performs this exact task. If you’re interested – email me and I’ll send it back to you. Just remember that this tool requires the .NET runtime on your machine

2005年11月29日

本文由lanyus收集整理,文中技术来源网络,部分摘自《奇思异想编程之DELPHI篇》,转载请注明此处。

       ///* lanyus QQ:231221 greathjw@163.com *///

一、隐藏任务栏
在WINDOWS中,系统的任务栏本质上也是一个窗口,其窗口类名为“Shell_TrayWnd"。要实现对它的操作,可通过API

函数FindWindow和ShowWindow来达到目的。

var
wndHandle:THandle;
wndClass:Array[0..50] of char;
begin
StrPCopy(@wndClass[0],’Shell_TrayWnd’);
wndHandle:=FindWindow(@wndClass[0],nil);
ShowWindow(wndHandle,SW_HIDE);   //sw_restore
end;


二、隐藏桌面上的快捷方式
跟任务栏一样,桌面其实也是一个窗口,它的类名为“ProgMan”,同样用FindWindow找到窗口句柄,再由

ShowWindow来决定是否显示。

三、获取任务栏尺寸及位置
用FindWindow找到句柄,再用GetWindowRect获取当前任务栏尺寸大小。
GetWindowRect(HWND hWnd,    //所求窗口的句柄
              LPRECT lpRect   //存储窗口坐标的结构体的地址
             ):Boolean;

四、获取CPU信息
CPU的相关信息是存储在一个结构体中的,这个结构体由DELPHI用TSYSTEMINFO进行了封装,定义如下:
typedef struct_SYSTEM_INFO{
  union{
 DWORD dwOemId;                    //已改用如下结构体分支来代替这个变量的使用了
        struct{
            WORD wProcessorArchitecture; //表示处理器的架构
            word wReserved;        //保留字
        };
   };
 DWORD swPageSiae;            //分页大小
 LPVOID lpMinimumApplicationAddress;   //应用程序和动态链接库可以访问的最小地址
 LPVOID lpMaximumApplicationAddress;   //应用程序和动态链接库可以访问的最大地址
 DWORD  swActiveProcessorMask;      //活动处理器的掩码
 DWORD  dwNumberOfProcessors;       //处理器的数目
 DWORD  dwProcessorType;         //处理器的类别
 DWORD  dwAllocationGranularity;     //虚拟内存地址分配的间隔
 WORD   wProcessorLevel;         //处理器的级别
 WORD   wProcessorRevision;       //处理器修改信息
 }SYSTEM_INFO;
其中dwProcessorType由wProcessorArchitecture、wProcessorLevel和wProcessorRevision三个成员来确定

,其值为:
  PROCESSOR_INTEL_386:INTEL80386系列;
  PROCESSOR_ITNEL_486:INTEL80486系列;
  PROCESSOR_INTEL_PENTIUM:INTEL PENTIUM系列;
  PROCESSOR_MIPS_R4000:MIPS的4000系列(仅适用于WINDOWS NT);
  PROCESSOR_ALPHA_21064:ALPHA的21064系列(仅适用于WINDOWS NT);

另外,获得CPU信息调用API函数GetSystemInfo即可。

五、获取内存信息。
与获取CPU一样,系统依然采用了一个结构体来存储内存信息。这个存储内在状态信息的体定义下如:
typedef struct_MEMORYSTATUS{
 DWORD dwLength;            //SIZEOF(MEMORYSTATUS)即本结构体的大小
 DWORD dwMemoryLoad;        //当前使用内存与总内在的百分比
 DWORD dwTotalPhys;     //总物理内存大小
 DWORD dwAvailPhys;     //可用物理内存大小
 DWORD dwTotalPageFile;   //总页面文件的大小
 DWORD dwAvailPageFile;   //可用页面文件的大小
 DWORD dwTotalVirtual;    //总虚拟内存的大小
 DWORD dwAvailVirtual;    //可用虚拟内存的大小
}MEMORYSTATUS,*LPMEMORYSTATUS;

最后调用API函数GlobalMemoryStatus来获取内存信息。

六、获取磁盘空间大小。   (测试发现不准)
使用API函数GetDiskFreeSpace。
BOOL GetDiskFreeSpace(
 LPCTSTR lpRootPathName,           //根目录
 LPDWORD lpSectorsPerCluster,   //每簇的扇区数
 LPDWORD lpBytesPerSector,     //每个扇区的字节数
 LPDWORD lpNumberOfFreeClusters,  //可用的簇数
 LPDWORD lpTotalNumberOfClusters  //总簇数
 );
procedure TForm1.BitBtn1Click(Sender: TObject);
var
Secspclu,Bytespsec,Freeclu,Totalclu,Ts,Fs:DWORD;
begin
GetDiskFreeSpace(‘c:\’,Secspclu,Bytespsec,Freeclu,Totalclu);
Fs:=Freeclu*Secspclu*Bytespsec;
Ts:=Totalclu*Secspclu*Bytespsec;
Edit1.text:=FormatFloat(‘###,###’,Ts); //总空间
Edit2.text:=FormatFloat(‘###,###’,Fs);  //可用空间
end;

七、限制鼠标移动范围。
WINDOWS里有一个现成的API函数ClipCursor可以限制光标移动区域。
BOOL ClipCursor(
     CONST RECT *lpRect    //指向一个存储矩形范围数据的结构体
     );
有了这个函数就可以限制光标在屏幕的移动范围了。但是,如果想控制鼠标在某窗口的固定范围内移动,则需要调用

咖一个函数MapWindowPoints,它可以将一个窗体的坐标转化为另一个相关的窗体坐标。
int MapWindowPoints(
    HWND hWndFrom,         //源窗口句柄
    HWND hWndTo,     //目标窗体句柄
    LPPOINT lpPoints,   //指向结构体数组,包含需要转化的坐标
    UINT cPoints     //数组中结构体的数量
    );
参数hWndForm或hWndTo为NULL或HWND_DESKTOP时,表明所源窗体或目标窗体为屏幕窗体。参数lpPoints可以指向一个

Rect结构体,此时cPoints的值将设为2。

procedure TForm1.BitBtn1Click(Sender: TObject);
var
sc:TRect;
begin
sc:=BitBtn2.BoundsRect;
MapWindowPoints(handle,0,sc,2);
ClipCursor(@sc);

end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
sc:TRect;
begin
sc:=RECT(0,0,screen.Width,screen.Height);
ClipCursor(@sc);
end;

八、如何启动屏幕保护程序。
使用SendMessage或PostMessage函数。
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
   sendmessage(HWND_BROADCAST,WM_SYSCOMMAND,SC_SCREENSAVE,0);
end;
启动屏幕保护程序还有一个方法,调用函数SystemParametersInfo,能过其参数设置可以启动或关闭屏幕保护程序。
  SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,1,nil,0);  //启动屏保
 SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,0,nil,0);  //关闭屏保


九、检测驱动器是否准备就绪。
在DELPHI中没有提供专门的函数检测驱动器是否准备就绪,也不能直接调用一人API函数来实现这一操作。但是,我

们可以利用DiskSize来检测磁盘容量,如果驱动器不存在或没有准备好,它会返回-1,其它情况下则返回该磁盘或光

盘的容量。

Function DiskSize(Drive:Byte):Int64;
参数为0时,表示指定当前驱动器;为1时表示A盘,2表示B盘,依此类推。

十、隐藏鼠标。
利用ShowCursor函数。
int ShowCursor(
    BOOL bShow     //光标是否可见的标志
    );
参数bShow为FALSE时表示光标不可见。注意,调用此函数仅仅隐藏了鼠标,程序还是可以检测到并激发鼠标的单击或

移动等事件的。

十一、串口操作。
在DELPHI中没有提供专门的串口操作控件,帮助文件里介绍串口的资料也是廖廖无几的。但是,我们可以通过调用一

系列的API来操作串口,spcomm串口操作控件也是通过调用一系列API工作的。
打开串口用API函数CreateFile,该函数可打开、新建文件或打开设备,其原形如下:
CreateFile(
  lpFileName:PChar;   //为文件名或设备名,串口用COM1,COM2表示。
  dwDesiredAccess:DWORD;   //访问类型,Generic_Read为只读访问,Generic_Write为写访问。Generic_Read or

Generic_Write为读写访问。
  dwShareMode:DWORD; //指定该文件的共享属性,该参数是为有许多应用程序共享的文件提供的,串口不能共享,

必须设置为0。
  lpSecurityAttributes:PSecurityAttributes; //引用安全性属性SECURITY_ATTRIBUTES结构,该结构定义了一些

属性,例如通信句柄如何被 打开端口的应用程序的子程序所继承。设置为NULL将为该端口分配缺省的安全性属性。
  dwCreationDisposition:DWORD; //指定如果CreateFile正在被已有的文件调用时应做些什么,串口是实物,必须

设置成OPEN_Existing,该标志告诉WINDOWS不要创建新端口,而是打开已存在的端口。
  dwFlagsAndAttributes:DWORD; //描述了该端口的各种属性。对串口来说,唯一有意义的设置是

File_Flag_Overlapped。
  hTemplateFile:THandle  //是指向文件的句柄。串口没有模板文件,因而设置该参数为0。
  ):THANDLE;stdcall;

关闭串口使用API函数CloseHandle:CloseHandle(hObject:THandle):BOOL;stdccall; 句柄是CREATEFILE打开串口时

返回的句柄。
初始化串口使用API函数SetupComm:SetupComm(hFile:Thandle; dwInQueue,dwOutQueue:DWORD):BOOL;stdcall;
 dwInQueue,dwOutQueue分别定义接收缓冲区和发送缓冲区的大小(只是推荐的,实际大小由WINDOWS分配);
获取串口当前配置:GetCommState(hFile:Thandle; varlpDCB:TDCB):BOOL;Stdcall; 调用成功返回非0值,

GetLastError函数可获取错误信息

配置串口:SetCommState(hFile:Thandle; const lpDCB:TDCB):BOOL;Stdcall;
获取串口性能:GetCommProperties(hFile:Thandle; var lpCommProp:TCommProp):bool;stdcall;
通信设备配置:CommConfigDialog(lpszName:PChar;hWnd:HWND; var lpCC:TCommConfig);调用该函数将弹出一个配

置窗口
读串口操作:ReadFile(hFile:THandle; var Buffer; nNumberOfBytesToRead:DWORD; var

lpNumberOfBytesRead:DWORD; lpOverlapped:POverlapped):BOOL;Stdcall;支持同步或异步操作。

十二、列举进程。
引用Tlhelp32单元。
利用API函数CreateToolhelp32Snapshot创建一个系统进程快照,用Process32First得到第一个系统进程,再用

Process32Next向后列举。

procedure TForm1.BitBtn13Click(Sender: TObject);      //进程操作
var
ProName:string;  //进程名
ProID:integer;     //进程ID号
ProTheard:integer; //进程线程数
goloop:boolean;
FSnapshothandle:Thandle;   //系统进程快照句柄
FProcessEntry32:TProcessEntry32;//进程入口的结构信息
begin
  FSnapshothandle:=CreateToolHelp32Snapshot(TH32CS_SnapProcess,0); //创建一个系统进程快照
  FProcessEntry32.dwSize:=sizeof(FProcessEntry32);
  goloop:=Process32First(FSnapshothandle,FProcessEntry32); //得到第一个进程
  while goloop do
  begin
    ProName:=FProcessEntry32.szExeFile;
    ProID:=FProcessEntry32.th32ProcessID;
    ProTheard:=FProcessEntry32.cntThreads;
    ListBox1.Items.Add(ProName+’  ‘+Inttostr(ProID)+’  ‘+inttostr(ProTheard)); //进程全显示在LISTBOX组

件里
    goloop:=Process32Next(FSnapshothandle,FProcessEntry32);
end;

十三、以其它身份运行程序(RUNAS)。
使用API函数CreateProcessWithLogonW。该函数在DELPHI并没封装完整,使用前需对其作出声明与定义。
声明:
function CreateProcessWithLogon(
                         lpUsername: PWChar;  // 用户乙的账号(Account)
                         lpDomain: PWChar;  //用户乙的域(Domain)
                         lpPassword: PWChar;  // 用户乙的密码(Password)
                         dwLogonFlags: DWORD;  // logon option
                         lpApplicationName: PWChar;  // 需要运行的程序
                         lpCommandLine: PWChar;  // command-line string
                         dwCreationFlags: DWORD;  // creation flags
                         lpEnvironment: Pointer;   // new environment block
                         lpCurrentDirectory: PWChar;  // current directory name
                         const lpStartupInfo: TStartupInfo;  // startup information
                         var lpProcessInfo: TProcessInformation   // process information
                               ): BOOL; stdcall;             

定义:
function CreateProcessWithLogon; external advapi32 name ‘CreateProcessWithLogonW’;

十四、获取当前登录用户名。
使用API函数GetUserName.
procedure TForm1.XP_Button2Click(Sender: TObject);  //获取当前登录用户名
var
users:array[0..255] of char;//用户名
i:Dword; //缓冲区大小
begin
   if GetUserName(users,i) then
   Edit6.Text:=users;
end;

十五、修改文件创建时间、修改时间和最后访问时间。
利用API函数SetFileTime可直接修改文件的创建时间、修改时间及最后访问时间。而API函数GetFileTime则可以读出

文件的创建时间、修改时间及最后访问时间。
这两个函数原形如下:

function SetFileTime(
  hFile: THandle;   //文件句柄,可由createFile函数打开文件获得
  lpCreationTime,  //文件创建时间
  lpLastAccessTime,  //最后访问时间
  lpLastWriteTime: PFileTime //最后修改时间
  ): BOOL;

function GetFileTime(
  hFile: THandle;  //文件句柄,可由createFile函数打开文件获得
  lpCreationTime,   //文件创建时间
  lpLastAccessTime,   //最后访问时间
  lpLastWriteTime: PFileTime //最后修改时间
  ): BOOL;
//////////////////////////////////////////////////////////////////////
 hFileOld :=createFile(srcFile,generic_read,file_share_read,nil,
                open_existing,FILE_ATTRIBUTE_NORMAL,Cardinal(nil));
  hFileNew :=createFile(destFile,generic_write,file_share_write,nil,
                open_existing,FILE_ATTRIBUTE_NORMAL,Cardinal(nil));
  GetMem(CreationTime,SizeOf(TFileTime));
  GetMem(LastAccessTime,SizeOf(TFileTime));
  GetMem(LastWriteTime,SizeOf(TFileTime));
  GetFileTime(hFileOld,CreationTime,LastAccessTime,LastWriteTime);
  SetFileTime(hFileNew,CreationTime,LastAccessTime,LastWriteTime);

十六、在系统托盘添加图标。
在系统托盘区添加一个图标可以通过发消息的发送来实现。WINDOWS中有这样一个API函数Shell_NotifyIcon可以用来

向托盘发送消息。
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
   DWORD dwMessage,       //发送的消息
   PNOTIFYICONDATA pnid  //指向结构体NOTIFYICONDATA
   );
它发送的消息参数如下:
  NIM_ADD        //向托盘中添加一个图标
    NIM_DELETE   //删除托盘中的某个图标
    NIM_MODIFY   //修改托盘中的某个图标
另一参数为指向结构体NOTIFYICONDATA的指针,结构体NOTIFYICONDATA则是用来存储系统任务状态栏信息的。
typedef struct_NOTIFYICONDATA{
   DWORD cbSize;                //结构体NOTIFYICONDATA的大小
   HWND hWnd;          //接收托盘鼠标事件的窗口句柄
   UINT uID;          //图标的ID(托盘鼠标事件的wParam参数)
   UINT uFlags;         //消息的有效范围
   UINT uCallbackMessage;    //系统回送消息的ID
   HICON HIcon;         //显示在托盘中的图标的句柄
   char szTip[64];       //鼠标移动到图标上时的提示信息
  }NOTIFYICONDATA,*PNOTIFYICONDATA;
注意:在安装图标时需要对结构体NOTIFYICONDATA的每一个成员赋值,而更改或删除时某些成员可不必赋值。

十七、使程序不在系统任务条上出现
procedure TForm1.FormCreate(Sender: TObject);
begin 
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
end;

2005年04月21日

在股票报价、天气预报、交通报告等系统中都有实时操作系统的影子。“实时”这一术语广为使用,那么对嵌入式软件开发者来说,这一概念究竟有什么样的含义呢?

IEEE(美国电气电子工程师协会)定义实时系统为“那些正确性不仅取决于计算的逻辑结果,也取决于产生结果所花费的时间的系统”。

一般来说,这意味着实时嵌入式系统必须在一个可预测可保证的时间段内做出对外部事件的反应。如果没有达到上述要求,那么系统就会做出错误的操作。

好,那么按照定义,下面的系统可以认为是实时系统:

  • 必须在是10毫秒内移走机械手来避免碾压的微控制器
  • 必须在30秒时间内关闭安全阀来防止发动机停转的系统
  • 必须在80微妙时间内对通信端口中断做出响应、否则可能会丢失数据包的微控制器
硬实时和软实时

在上面所列出最后一个例子中,如果微控制器有一个健壮的通信协议,它可以拥有失败重发机制,而且可以保证平均每一千万的数据包仅丢失一个,那么会发生什么呢?它还是实时系统么?这取决于重发的结果,但是很显然,在某种程度上它的确是实时的。

因此,实时系统一般可分为硬件实时和软件实时这两大类:

  • 硬实时系统有一个刚性的、不可改变的时间限制,它不允许任何超出时限的错误。超时错误会带来损害甚至导致系统失败、或者导致系统不能实现它的预期目标。
  • 软实时系统的时限是一个柔性灵活的,它可以容忍偶然的超时错误。失败造成的后果并不严重,仅仅是轻微的降低了系统的吞吐量。
实时有多快?

实时系统的正式定义只是要求系统的响应“足够快”而并没有指出它究竟有多快。这样,实时这一术语就可以应用于许多系统上。

这也意味着任何系统都是实时的——只要我们希望它是。例如,你可以说:“如果我们不在一分钟内对顾客的要求做出反应,那么顾客就会不满而要求退货”;因此,它肯定是一个实时系统。

实际上,当我们说到实时嵌入式软件时,时限究竟是多少呢?一般从软件的角度来说,软件可以在大约十微妙的时间内对外部事件做出可靠的响应。

为什么这么限制呢?这是因为在典型的微处理器体系结构、典型的时钟速度下经过精细的设计,我们可以构造一个复杂的嵌入式系统,它可以处理这个量级的硬实时限制。按照这种时限来编写硬实时软件是困难的,但却很有实际意义。

快并不总是意味着更好

不要认为实时代码必须是运行速度最快的代码。在实时系统中,可预测性比速度更重要。因此,我们要避免使用那些在大多数情况下速度很快、但在某些条件下速度又会慢下来的算法,我们更愿意采用虽然慢一些但是更有可预测性的算法。

当你从事嵌入式项目时,你首先需要知道该系统究竟属于哪一个类型(硬实时、软实时还是非实时系统),这一点很重要。这三种系统所要求的编程技术和规范并不相同。

2004年09月30日
人气最高的论坛
001 http://people.sina.com.cn/forum.html 新浪网论坛 
000015 002 http://club.sohu.com/ 搜狐社区 
000020 003 http://bj.163.com/ 网易北京社区 
000043 004 http://bbs.tom.com/bbs.php TOM海云天论坛 
000143 005 http://bbs.china.com/ 中华网论坛 
000151 006 http://forum.21cn.com/ 21CN.COM论坛 
000197 007 http://bbs.lycos.com.cn/channel_index.php LYCOS中国论坛 
000244 008 http://bbs.tencent.com 腾讯QQ讨论组 
000307 009 http://club.online.sh.cn/ 上海热线社区 
000388 010 http://bbs.ourgame.com/ 联众游戏讨论区 
000446 011 http://forum.xinhuanet.com/ 新华网论坛 
000780 012 http://club.szptt.net.cn/ 深圳社区 
000793 013 http://bbs.people.com.cn/bbs/start 人民网强国社区 
000828 014 http://community.eastday.com/ 东方社区 
000938 015 http://www.xilubbs.com/ 西陆专业论坛 
000940 016 http://bbs.sogua.com/index.asp SoGua娱乐论坛 
000947 017 http://bbs.cbbn.net/ 中华宽带网论坛 
001108 018 http://club.etang.com/ 亿唐俱乐部论坛 
001463 019 http://bbs.xicn.net/ 喜满你论坛 
001504 020 http://bbs.shangdu.com/bbs/home.cgi 商都BBS 
001521 021 http://creater.vicp.net/m-zone/index.asp 动感地带BBS 
001679 022 http://forum.xaonline.com 古城热线论坛 
001686 023 http://club.sdinfo.net/new3club/newclub.php 齐鲁热线虚拟社区 
001688 024 http://club.dayoo.com/ 大洋论坛 
001953 025 http://bbs.yesky.com/ 天极论坛 
002024 026 http://www.xici.net/main.asp 西祠胡同社区 
002471 027 http://club.999.com.cn/index.jsp 三九健康网社区 
002496 028 http://bbs.pku.edu.cn/ 北大末名bbs 
002634 029 http://forum.bbvod.net/index.php 九州梦网娱乐论坛 
002730 030 http://bbs.phoenixtv.com.cn/bbs/index.php 凤凰网论坛 
003266 031 http://www.158china.com/bbs1/ 158论坛 
003636 032 http://forum.netbig.com/ 网大新版论坛netbig 
004240 033 http://community.rising.com.cn/ 瑞星社区 
005214 034 http://www.tianyaclub.com 天涯虚拟社区 
005412 035 http://bbs.asiagame.com/ 亚联游戏论坛 
005584 036 http://www.gameabc.com/adbbs/ 边锋游戏论坛 
005606 037 http://file.flashempire.com/ 闪客帝国交流中心论坛 
005897 038 http://bbs.inhe.net/index.asp 银河网论坛 
006181 039 http://bbs.droiyan.com.cn/224/ 决战官方论坛 
006474 040 http://cx.269.net/ 269家园网虚拟社区 
007180 041 http://forums.zdnet.com.cn/cgi-bin/leoboard.cgi ZDNet China论坛 
007344 042 http://bbs.ccidnet.com/ 赛迪网社区 
007467 043 http://bbs.kingsoft.net/ 金山KINGSOFT社区 
007538 044 http://bbs.it168.com IT168论坛 
007715 045 http://www.agenow.com/Bbs/ AGENOW社区论坛中心 
007728 046 http://www.k666.com/bbs/NowBoard.aspx K666软件园k665休闲社区 
008063 047 http://bbs.cnmaya.com/bbs/ 美亚BBS论坛 
008107 048 http://bbs.fjii.com/ 福建热线论坛 
008282 049 http://www.datef4.net/bbs/index.asp 相约F4论坛 
008873 050 http://bbs.winzheng.com/ 嬴政天下论坛 
009394 051 http://bbs.21sports.com/ 雄起体育论坛 
009598 052 http://bbs.7gg.net/index.asp 嘟嘟在线论坛 
010049 053 http://bbs.ttdown.com/LBmx/cgi-bin/leoboard.cgi 天天精品论坛 
010352 054 http://member.ali213.net/ 游侠网会员区 
010402 055 http://www.china139.com/club/ 玫瑰社区 
010971 056 http://expert.csdn.net/expert/forum.asp 中国软件CSDN论坛 
011135 057 http://www.txyx.net/bbs/index.php 天下论坛 
011505 058 http://17173.86114.com/ 搜狐网络游戏火爆论坛 
012147 059 http://bbs.dzwww.com/ 大众社区 
012397 060 http://www.donews.com/ IT写作社区 
013156 061 http://bbs.kaoyan.com/ 考研论坛 
013195 062 http://pop.pcpop.com/default.htm PCPOP-电脑时尚-泡泡俱乐部 
013520 063 http://bbs.cyol.com/ 中青在线-中青论坛 
014024 064 http://bbs.soft163.com/index.asp 163软件站 
014939 065 http://bbs.northtimes.com/ 北方时空BBS 
015953 066 http://www.001.com.cn 001互助网综合论坛 
017051 067 http://bbs.jetdown.com/ 杰特交流论坛 
017384 068 http://bbs.21youth.com/ 红袖讨论区,青年行社区 
017742 069 http://gz.sucaiw.com/bbs/index.asp 素材精品屋论坛 

2004年09月11日

/*
cpphtml
a C++ to HTML converter by Bob Rost
converts C++ code to NetPositive-friendly HTML with BeIDE color scheme
*/

#include <stdio.h>
#define bool unsigned char
#define true 1
#define false 0

bool comments=false;
bool strings=false;
bool chars=false;

bool isletter(char c) /*is a char a letter or number?*/
 {
 return ((‘a’<=c&&c<=’z')||(‘A’<=c&&c<=’Z')||(‘0′<=c&&c<=’9′));
 }

void printout(char c) /*prints an html-friendly char*/
 {
 switch(c)
  {
  case ‘<’: printf(“&lt;”); break;
  case ‘>’: printf(“&gt;”); break;
  case ‘&’: printf(“&amp;”); break;
  default: printf(“%c”,c);
  }
 }

int printword(const char *s)
 {
 int i=0;
 if (!isletter(s[0]))
  {
  printout(s[0]);
  return 1;
  }
 while (isletter(s[i])) printout(s[i++]);
 return i;
 }

bool match(const char *s, const char *str)
 {
 int i=0;
 while (str[i]!=0) if(s[i]!=str[i++]) return false;
 if (isletter(s[i])) return false;
 return true;
 }

bool match2(const char *s, const char *str) /*doesn’t check if something is a letter*/
 {
 int i=0;
 while (str[i]!=0) if(s[i]!=str[i++]) return false;
 return true;
 }

void handle(const char *s)
 {
 int i=0;
 if (s[0]==0) return;
 if(comments) /*continue commented code*/
   {
   while(!(match2(s+i,”*/”)||s[i]==0)) printout(s[i++]);
   if (s[i]!=0)
     {
     comments=false;
     printf(“*/</font>”);
     handle(s+i+2);
     }
   }
 else if(chars) /*continue char text*/
   {
   if (match2(s,”\\\“”))
     {
     printf(“\\\“”);
     handle(s+2);
     }
   else if (match2(s,”\\\’“))
     {
     printf(“\\\’“);
     handle(s+2);
     }
   else if (s[0]==’\”)
     {
     printf(“\’</font>”);
     chars=false;
     handle(s+1);
     }
   else
     {
     printout(s[0]);
     handle(s+1);
     }
   }
 else if(strings) /*continue string text*/
   {
   if (match2(s,”\\\“”))
     {
     printf(“\\\“”);
     handle(s+2);
     }
   else if (match2(s,”\\\’“))
     {
     printf(“\\\’“);
     handle(s+2);
     }
   else if (s[0]==’\”‘)
     {
     printf(“\”</font>”);
     strings=false;
     handle(s+1);
     }
   else
     {
     printout(s[0]);
     handle(s+1);
     }
   }
 else if (match2(s,”/*”)) /*block comment start*/
   {
   printf(“<font color=\”red\”>/*”);
   comments=true; strings=chars=false;
   handle(s+2);
   }
 else if (match2(s,”//”)) /*line comment handler*/
   {
   strings=chars=false;
   printf(“<font color=\”red\”>”);
   while (s[i]!=0) printout(s[i++]);
   printf(“</font>”);
   }
 else if (s[0]==’\”‘) /*start string text*/
   {
   printf(“<font color=\”#888888\”>\”");
   strings=true;
   handle(s+1);
   }
 else if (s[0]==’\”) /*start char text*/
   {
   printf(“<font color=\”#888888\”>\’”);
   chars=true;
   handle(s+1);
   }

 /*keyword handlers*/
 else if (match(s,”int”)){printf(“<font color=\”blue\”>int</font>”);handle(s+3);}
 else if (match(s,”return”)){printf(“<font color=\”blue\”>return</font>”);handle(s+6);}
 else if (match(s,”float”)){printf(“<font color=\”blue\”>float</font>”);handle(s+5);}
 else if (match(s,”double”)){printf(“<font color=\”blue\”>double</font>”);handle(s+6);}
 else if (match(s,”#include”)){printf(“<font color=\”blue\”>#include</font>”);handle(s+8);}
 else if (match(s,”new”)){printf(“<font color=\”blue\”>new</font>”);handle(s+3);}
 else if (match(s,”if”)){printf(“<font color=\”blue\”>if</font>”);handle(s+2);}
 else if (match(s,”else”)){printf(“<font color=\”blue\”>else</font>”);handle(s+4);}
 else if (match(s,”char”)){printf(“<font color=\”blue\”>char</font>”);handle(s+4);}
 else if (match(s,”delete”)){printf(“<font color=\”blue\”>delete</font>”);handle(s+6);}
 else if (match(s,”bool”)){printf(“<font color=\”blue\”>bool</font>”);handle(s+4);}
 else if (match(s,”unsigned”)){printf(“<font color=\”blue\”>unsigned</font>”);handle(s+8);}
 else if (match(s,”void”)){printf(“<font color=\”blue\”>void</font>”);handle(s+4);}
 else if (match(s,”while”)){printf(“<font color=\”blue\”>while</font>”);handle(s+5);}
 else if (match(s,”class”)){printf(“<font color=\”blue\”>class</font>”);handle(s+5);}
 else if (match(s,”public”)){printf(“<font color=\”blue\”>public</font>”);handle(s+6);}
 else if (match(s,”true”)){printf(“<font color=\”blue\”>true</font>”);handle(s+4);}
 else if (match(s,”false”)){printf(“<font color=\”blue\”>false</font>”);handle(s+5);}
 else if (match(s,”switch”)){printf(“<font color=\”blue\”>switch</font>”);handle(s+6);}
 else if (match(s,”default”)){printf(“<font color=\”blue\”>default</font>”);handle(s+7);}
 else if (match(s,”case”)){printf(“<font color=\”blue\”>case</font>”);handle(s+4);}
 else if (match(s,”const”)){printf(“<font color=\”blue\”>const</font>”);handle(s+5);}
 else if (match(s,”#define”)){printf(“<font color=\”blue\”>#define</font>”);handle(s+7);}
 else if (match(s,”#ifndef”)){printf(“<font color=\”blue\”>#ifndef</font>”);handle(s+7);}
 else if (match(s,”#endif”)){printf(“<font color=\”blue\”>#endif</font>”);handle(s+6);}
 else if (match(s,”try”)){printf(“<font color=\”blue\”>try</font>”);handle(s+3);}
 else if (match(s,”catch”)){printf(“<font color=\”blue\”>catch</font>”);handle(s+5);}
 else if (match(s,”private”)){printf(“<font color=\”blue\”>private</font>”);handle(s+7);}
 else if (match(s,”protected”)){printf(“<font color=\”blue\”>protected</font>”);handle(s+9);}
 else if (match(s,”namespace”)){printf(“<font color=\”blue\”>namespace</font>”);handle(s+9);}
 else if (match(s,”inline”)){printf(“<font color=\”blue\”>inline</font>”);handle(s+6);}
 else if (match(s,”virtual”)){printf(“<font color=\”blue\”>virtual</font>”);handle(s+7);}
 else if (match(s,”explicit”)){printf(“<font color=\”blue\”>explicit</font>”);handle(s+8);}
 else if (match(s,”template”)){printf(“<font color=\”blue\”>template</font>”);handle(s+8);}
 else if (match(s,”typename”)){printf(“<font color=\”blue\”>typename</font>”);handle(s+8);}
 else if (match(s,”typedef”)){printf(“<font color=\”blue\”>typedef</font>”);handle(s+7);}
 else if (match(s,”operator”)){printf(“<font color=\”blue\”>operator</font>”);handle(s+8);}
 else {handle(s+printword(s));} /*catch substring keywords*/
 }

int main(int argn, char **argv)
{
 char buff[1024];
 FILE *fp;
 if (argn!=2)
 {
  printf(“usage: %s [input cpp file]\n”,argv[0]);
  return 1;
 }
 
 fp=fopen(argv[1],”r”);
 printf(“<html>\n<pre>\n”);
 while (fgets(buff,1024,fp))
 {
  handle(buff);
 }
 printf(“</pre>\n</html>\n”);
}

/*
 ******************************************************
 * 该程序是算24 的小程序,可以在TC BC or VC下编译通过
 * 使用方法:
 * 输入程序名,然后输入4个数字回车, It’s OK
 * Try it
 ******************************************************
 */
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <conio.h>
#define NUM 24

char calc(int,double);
void exchange(int,int);
void addform(int,int);
float operate(int,int,int);
void show(int,int,int);
void item(int,int,int,char*);

int a[4];
double b[4];
char form[40]=”";
char need;
char ok=0;

/*
 ******************************************************
 * void main()
 * Entrypoint of the program
 ******************************************************
 */
void main()
{
 int i,k1,k2;
 float tp1,tp2;
 cputs(“\n”);
// textattr(0×1e); /*This line can work only in TC or BC */
loop:
 cputs(“Please input 4 numbers:(0 to exit)\n\r”);
 for(i=0;i<4;i++)
 {
  cscanf(“%d”,a+i);
  if(!a[i])
  {
   //textattr(0×0f);/*This line can work only in TC or BC */
   exit(0);
  }
  b[i]=(double)a[i];
 }
 cputs(“\n”);
 if(calc(4,NUM))
 {
  ok=1;
  cprintf(“%s=%d\n\r”,form,NUM);
 }

 for(i=1;i<4;i++)
 {
  exchange(1,i);
  for(k1=0;k1<3;k1++)
   for(k2=0;k2<3;k2++)
   {
    tp1=operate(0,1,k1);
    tp2=operate(2,3,k2);
    if(fabs(tp1+tp2-NUM)<1e-3) show(k1,k2,0);
    if(fabs(tp1-tp2-NUM)<1e-3) show(k1,k2,1);
    if(fabs(tp2-tp1-NUM)<1e-3) show(k1,k2,2);
   }
   exchange(1,i);
 }
 if(!ok) cprintf(“No way to get %d!\n\r”,NUM);
 goto loop;
}

/*
 ******************************************************
 * char calc(int n, double f)
 * Calcualte 24
 * n — number
 * f — the result
 ******************************************************
 */
char calc(int n,double f)
{
 int i;

 if(n>1)
 {
  for(i=0;i<n;i++) 
  {
   exchange(i,n-1);
   if(calc(n-1,b[n-1]+f)) /*A – B = F*/
   {
    addform(0,n-1);
    exchange(i,n-1);
    need=2;  /*优先级为2 */
    return 1;
   }

   if(calc(n-1,b[n-1]-f))/* -A + B = F */
   {
    addform(1,n-1);
    exchange(i,n-1);
    need=2;
    return 1;
   }

   if(calc(n-1,f-b[n-1])) /*A + B = F*/
   {
    addform(2,n-1);
    exchange(i,n-1);
    need=2;
    return 1;
   }

   if(calc(n-1,f*b[n-1])) /* A/B = F*/
   {
    addform(3,n-1);
    exchange(i,n-1);
    need=1;
    return 1;
   }

   if(fabs(f)>0.01)
   {
    if(calc(n-1,b[n-1]/f)) /* B / A = F*/
    {
     addform(4,n-1);
     exchange(i,n-1);
     need=1;
     return 1;
    }
   }

   if(calc(n-1,f/b[n-1])) /* A * B = F*/
   {
    addform(5,n-1);
    exchange(i,n-1);
    need=1;
    return 1;
   }
   exchange(i,n-1);
  }
  return 0;
 }
 else
 {
  if(fabs(b[0]-f)<0.001)
  {
   itoa(a[0],form,10);
   need=0;
   return 1;
  }
  else return 0;
 }
}

/*
 ******************************************************
 * Exchange Number I with Number J
 ******************************************************
 */
void exchange(int i,int j)
{
 double tpf;
 int tpi;
 tpf=b[i];
 b[i]=b[j];
 b[j]=tpf;
 tpi=a[i];
 a[i]=a[j];
 a[j]=tpi;
}

/*
 ******************************************************
 ******************************************************
 */
void addform(int s,int k)
{
 char str[40];
 itoa(a[k],str,10);

 switch(s)
 {
 case 0: /* A – B = F*/
  strcat(form, “-”);
  strcat(form, str);
  break;
 case 1: /* -A + B = F*/
  if(need==2) strcat(str,”-(“);
  else strcat(str,”-”);

  strcat(str,form);
  if(need==2) strcat(str,”)”);
  strcpy(form,str);
  break;
 case 2: /*A + B = F*/
  strcat(form,”+”);
  strcat(form,str);
  break;
 case 3: /* A/B = F*/
  if(need==2) strcat(form,”)/”);
  else strcat(form,”/”);
  strcat(form,str);
  if(need==2) strcpy(str,”(“);
  else strcpy(str,”");
  strcat(str,form);
  strcpy(form,str);
  break;
 case 4: /* B / A = F*/
  if(need==2)  strcat(str,”/(“);
  else      strcat(str,”/”);
  strcat(str,form);
  if(need==2)  strcat(str,”)”);
  strcpy(form,str);
  break;
 case 5: /* A * B = F*/
  if(need==2) strcat(str,”*(“);
  else        strcat(str,”*”);
  strcat(str,form);
  if(need==2) strcat(str,”)”);
  strcpy(form,str);
  break;
 }
}

/*
 ******************************************************
 * float operator(int i, int j, int k)
 * i — index of the first operator
 * j — index of the second operator
 * k — operate type, it can be
 *  0 — is b(i)*b(j)
 *  1 — is b(i)/b(j)
 *  2 — is b(j)/b(i)
 ******************************************************
  */
float operate(int i,int j,int k)
{
 float v;

 switch(k)
 {
 case 0: v=b[i]*b[j];
  break;
 case 1: v=b[i]/b[j];
  break;
 case 2: v=b[j]/b[i];
  break;
 }
 return v;
}

/*
 ******************************************************
 * void show (int k1, int k2, int s)
 * change to string format
 ******************************************************
 */
void show(int k1,int k2,int s)
{
 char str[40];

 item(0,1,k1,str);
 item(2,3,k2,form);
 switch(s)
 {
 case 0:
  strcat(form,”+”);
  strcat(form,str);
  break;
 case 1:
  strcat(str,”-”);
  strcat(str,form);
  strcpy(form,str);
  break;
 case 2:
  strcat(form,”-”);
  strcat(form,str);
  break;
 }
 cprintf(“%s=%d\n\r”,form,NUM);
 ok=1;
}

/*
 ******************************************************
 * void item(int i, int j, int k, char *str)
 *
 ******************************************************
 */
void item(int i,int j,int k,char *str)
{
 char s1[5],s2[5];

 itoa(a[i],s1,10);
 itoa(a[j],s2,10);

 switch(k)
 {
 case 0:
  strcat(s1,”*”);
  strcat(s1,s2);
  strcpy(str,s1);
  break;
 case 1:
  strcat(s1,”/”);
  strcat(s1,s2);
  strcpy(str,s1);
  break;
 case 2:
  strcat(s2,”/”);
  strcat(s2,s1);
  strcpy(str,s2);
  break;
 }
}
/*
 ******************************************************
 * END OF THE PROGRAM
 ******************************************************
*/

/* ************************************************************************************************** * 该程序是算24 的小程序,可以在TC BC or VC下编译通过 * 使用方法: * 输入程序名,然后输入4个数字回车, It's OK * Try it ************************************************************************************************** */ #include <stdio.h> #include <math.h> #include <string.h> #include <conio.h> #define NUM 24 char calc(int,double); void exchange(int,int); void addform(int,int); float operate(int,int,int); void show(int,int,int); void item(int,int,int,char*); int a[4]; double b[4]; char form[40]=""; char need; char ok=0; /* ************************************************************************************************** * void main() * Entrypoint of the program ************************************************************************************************** */ void main() { int i,k1,k2; float tp1,tp2; cputs("\n"); // textattr(0x1e); /*This line can work only in TC or BC */ loop: cputs("Please input 4 numbers:(0 to exit)\n\r"); for(i=0;i<4;i++) { cscanf("%d",a+i); if(!a[i]) { //textattr(0x0f);/*This line can work only in TC or BC */  exit(0); } b[i]=(double)a[i]; } cputs("\n"); if(calc(4,NUM)) { ok=1; cprintf("%s=%d\n\r",form,NUM); } for(i=1;i<4;i++) { exchange(1,i); for(k1=0;k1<3;k1++) for(k2=0;k2<3;k2++) { tp1=operate(0,1,k1); tp2=operate(2,3,k2); if(fabs(tp1+tp2-NUM)<1e-3) show(k1,k2,0); if(fabs(tp1-tp2-NUM)<1e-3) show(k1,k2,1); if(fabs(tp2-tp1-NUM)<1e-3) show(k1,k2,2); } exchange(1,i); } if(!ok) cprintf("No way to get %d!\n\r",NUM); goto loop; } /* ************************************************************************************************** * char calc(int n, double f) * Calcualte 24 * n -- number * f -- the result ************************************************************************************************** */ char calc(int n,double f) { int i; if(n>1) { for(i=0;i<n;i++) { exchange(i,n-1); if(calc(n-1,b[n-1]+f)) /*A - B = F*/ { addform(0,n-1); exchange(i,n-1); need=2; /*优先级为2 */ return 1; } if(calc(n-1,b[n-1]-f))/* -A + B = F */ { addform(1,n-1); exchange(i,n-1); need=2; return 1; } if(calc(n-1,f-b[n-1])) /*A + B = F*/ { addform(2,n-1); exchange(i,n-1); need=2; return 1; } if(calc(n-1,f*b[n-1])) /* A/B = F*/ { addform(3,n-1); exchange(i,n-1); need=1; return 1; } if(fabs(f)>0.01) { if(calc(n-1,b[n-1]/f)) /* B / A = F*/ { addform(4,n-1); exchange(i,n-1); need=1; return 1; } } if(calc(n-1,f/b[n-1])) /* A * B = F*/ { addform(5,n-1); exchange(i,n-1); need=1; return 1; } exchange(i,n-1); } return 0; } else { if(fabs(b[0]-f)<0.001) { itoa(a[0],form,10); need=0; return 1; } else return 0; } } /* ************************************************************************************************** * Exchange Number I with Number J ************************************************************************************************** */ void exchange(int i,int j) { double tpf; int tpi; tpf=b[i]; b[i]=b[j]; b[j]=tpf; tpi=a[i]; a[i]=a[j]; a[j]=tpi; } /* ************************************************************************************************** ************************************************************************************************** */ void addform(int s,int k) { char str[40]; itoa(a[k],str,10); switch(s) { case 0: /* A - B = F*/ strcat(form, "-"); strcat(form, str); break; case 1: /* -A + B = F*/ if(need==2) strcat(str,"-("); else strcat(str,"-"); strcat(str,form); if(need==2) strcat(str,")"); strcpy(form,str); break; case 2: /*A + B = F*/ strcat(form,"+"); strcat(form,str); break; case 3: /* A/B = F*/ if(need==2) strcat(form,")/"); else strcat(form,"/"); strcat(form,str); if(need==2) strcpy(str,"("); else strcpy(str,""); strcat(str,form); strcpy(form,str); break; case 4: /* B / A = F*/ if(need==2) strcat(str,"/("); else strcat(str,"/"); strcat(str,form); if(need==2) strcat(str,")"); strcpy(form,str); break; case 5: /* A * B = F*/ if(need==2) strcat(str,"*("); else strcat(str,"*"); strcat(str,form); if(need==2) strcat(str,")"); strcpy(form,str); break; } } /* ************************************************************************************************** * float operator(int i, int j, int k) * i -- index of the first operator * j -- index of the second operator * k -- operate type, it can be * 0 -- is b(i)*b(j) * 1 -- is b(i)/b(j) * 2 -- is b(j)/b(i) ************************************************************************************************** */ float operate(int i,int j,int k) { float v; switch(k) { case 0: v=b[i]*b[j]; break; case 1: v=b[i]/b[j]; break; case 2: v=b[j]/b[i]; break; } return v; } /* ************************************************************************************************** * void show (int k1, int k2, int s) * change to string format ************************************************************************************************** */ void show(int k1,int k2,int s) { char str[40]; item(0,1,k1,str); item(2,3,k2,form); switch(s) { case 0: strcat(form,"+"); strcat(form,str); break; case 1: strcat(str,"-"); strcat(str,form); strcpy(form,str); break; case 2: strcat(form,"-"); strcat(form,str); break; } cprintf("%s=%d\n\r",form,NUM); ok=1; } /* ************************************************************************************************** * void item(int i, int j, int k, char *str) * ************************************************************************************************** */ void item(int i,int j,int k,char *str) { char s1[5],s2[5]; itoa(a[i],s1,10); itoa(a[j],s2,10); switch(k) { case 0: strcat(s1,"*"); strcat(s1,s2); strcpy(str,s1); break; case 1: strcat(s1,"/"); strcat(s1,s2); strcpy(str,s1); break; case 2: strcat(s2,"/"); strcat(s2,s1); strcpy(str,s2); break; } } /* ************************************************************************************************** * END OF THE PROGRAM ************************************************************************************************** */