博文

[编程思想]大道至简--是懒人造就了方法(强烈推荐) (2006-08-10 16:10:00)

摘要:                                  第2章  是懒人造就了方法              “僰蘭道有蜀王兵 ,亦有神作大滩江中。其崖崭峻不可破,(冰)乃积薪烧之。”                                                                                               ——《华阳国志》 1.  是懒人造就了方法            &nbs......

阅读全文(6988) | 评论:3

[编程思想]大道至简--编程的精义(强烈推荐) (2006-08-09 23:47:00)

摘要:                                大道至简                                                                    ——软件工程实践者的思想                                         周爱民(Aimingoo) 著                       ......

阅读全文(4060) | 评论:0

[WIN编程]WINDOWS数据类型的转换大全(转)(2006-08-07 22:28:00)

摘要: 由Thinkboy提供 WINDOWS数据类型的转换 一、其它数据类型转换为字符串短整型(int)itoa(i,temp,10);//将i转换为字符串放入temp中,最后一个数字表示十进制itoa(i,temp,2); //按二进制方式转换 长整型(long)ltoa(l,temp,10); 浮点数(float,double)用fcvt可以完成转换,这是MSDN中的例子:int decimal, sign; char *buffer; double source = 3.1415926535; buffer = _fcvt( source, 7, &decimal, &sign ); 运行结果:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0decimal表示小数点的位置,sign表示符号:0为正数,1为负数 CString变量str = "2008北京奥运";buf = (LPSTR)(LPCTSTR)str; BSTR变量BSTR bstrValue = ::SysAllocString(L"程序员"); char * buf = _com_util::ConvertBSTRToString(bstrValue); SysFreeString(bstrValue); AfxMessageBox(buf); delete(buf); CComBSTR变量CComBSTR bstrVar("test"); char *buf = _com_util::ConvertBSTRToString(bstrVar.m_str); AfxMessageBox(buf); delete(buf); _bstr_t变量_bstr_t类型是对BSTR的封装,因为已经重载了=操作符,所以很容易使用_bstr_t bstrVar("test"); const char *buf = bstrVar;///不要修改buf中的内容 AfxMessageBox(buf); 通用方法(针对非COM数据类型)用sprintf完成转换char buffer[200];char c = '1';int i = 35;long j = 1000;float f = 1.7320534f;sprintf( buff......

阅读全文(4243) | 评论:0

[Win编程]pragma指令简介(转)(2006-08-07 22:15:00)

摘要:由Thinkboy提供 pragma指令简介在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作.下面介绍了一下该指令的一些常用参数,希望对大家有所帮助!一. message 参数。 message 它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为: #pragma message(“消息文本”) 当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。 当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法 #ifdef _X86 #pragma message(“_X86 macro activated!”) #endif 当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_ X86 macro activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了 二. 另一个使用得比较多的#pragma参数是code_seg。格式如: #pragma code_seg( [ [ { push | pop}, ] [ identifier, ] ] [ "segment-name" [, "segment-class" ] ) 该指令用来指定函数在.obj文件中存放的节,观察OBJ文件可以使用VC自带的dumpbin命令行程序,函数在.obj文件中默认的存放节为.text节如果code_seg没有带参数的话,则函数存放在.text节中push (可选参数) 将一个记录放到内部编译器的堆栈中,可选参数可以为一个标识符或者节名pop(可选参数) 将一个记录从堆栈顶端弹出,该记录可以为一个标识符或者节名identifier (可选参数) 当使用push指令时,为压入堆栈的记录指派的一个标识符,当该标识符被删除的时候和其相关的堆栈中的记录将被弹出堆栈 "segment-name" (可选参数) 表示函数存放的节名例如://默认情况下,函数被存放在.text节中void func1() { // stored in .text}//将函数存放在.my_data1节中#pragm......

阅读全文(2882) | 评论:0

[Win编程]Windows消息大全(转)(2006-08-07 22:12:00)

摘要:由Thinkboy提供表A-1 Windows消息分布消息范围说 明0 ~ WM_USER – 1系统消息WM_USER ~ 0x7FFF自定义窗口类整数消息WM_APP ~ 0xBFFF应用程序自定义消息0xC000 ~ 0xFFFF应用程序字符串消息> 0xFFFF为以后系统应用保留表A-2 常用Windows消息消息名称值说 明WM_NULL 0x0000空消息,此消息将被接收窗口忽略WM_CREATE 0x0001应用程序创建一个窗口WM_DESTROY0x0002一个窗口被销毁WM_MOVE0x0003移动一个窗口WM_SIZE0x0005改变一个窗口的大小WM_ACTIVATE0x0006一个窗口被激活或失去激活状态WM_SETFOCUS0x0007获得焦点后WM_KILLFOCUS0x0008失去焦点WM_ENABLE0x000A应用程序Enable状态改变时产生WM_SETREDRAW0x000B设置窗口是否能重画WM_SETTEXT0x000C应用程序发送此消息来设置一个窗口的文本WM_GETTEXT0x000D应用程序发送此消息来复制对应窗口的文本到缓冲区WM_GETTEXTLENGTH0x000E得到与一个窗口有关的文本的长度(不包含空字符)WM_PAINT0x000F要求一个窗口重绘自己WM_CLOSE0x0010当一个窗口或应用程序要关闭时发送一个信号WM_QUERYENDSESSION0x0011用户选择结束对话框或应用程序自己调用ExitWindows()函数WM_QUIT0x0012用来结束程序运行或应用程序调用Postquitmessage()函数来产生此消息WM_QUERYOPEN0x0013当用户窗口恢复以前的大小位置时,把此消息发送给某个图标WM_ERASEBKGND0x0014当窗口背景必须被擦除时(例如在窗口改变大小时)WM_SYSCOLORCHANGE0x0015当系统颜色改变时,发送此消息给所有顶级窗口WM_ENDSESSION0x0016当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序WM_SHOWWINDOW0x0018当隐藏或显示窗口是发送此消息给这个窗口WM_ACTIVATEAPP0x001C当某个窗口将被激活时,将被激活窗口和当前活动(即将失去激活)窗口会收到此消息,发此消......

阅读全文(3512) | 评论:0

[C++]编程入门必做的题第1,2题思路.(2006-08-01 13:12:00)

摘要:第一题: /* 题目:  1.  给定等式  A B C D E     其中每个字母代表一个数字,且不同数字对应不                    D F G     同字母。编程求出这些数字并且打出这个数字的             +      D F G     算术计算竖式。              ───────                 X Y Z D E*/ /* 分析: 1: 由G + G = E和F + F = D,知G = 0,F = 5.  如果G = 5则F + F != D,因为G + G会进一.  2: ABC + D + D = XYZ,知C + D + D会进2, 得C + D + D + 1(F+F进位的1) > 20, 而B + 2(前面进位的2)又要进1, 可知B = 9,Y = 1,( B != 8,因为如果B = 8, 则Y就会等于0, 而与G = 0 相矛盾). 也知 A = X - 1;  通过上2步,得出的结果是G=0, F=5, B=9, Y=1, A=X-1, C+D+D+1>20;                ......

阅读全文(5170) | 评论:4

[C++]A* 算法之误区(转自云风)(2006-07-30 21:30:00)

摘要: 估计是因为我在上大学时在网上留过一篇文章,里面有一个简单的使用 A* 算法寻路的源程序,导致了这近七年来,不段的收到 email 和我讨论这个算法。 对,毫不夸张。那个简陋的代码。在七年前我随手写出来扔在网上后,已经遍布中文网络世界的犄角旮旯,让我在痛恨那段代码的时候,想收回都不可能。 我最大的困惑在于,为什么课堂上最为基础的算法知识,却有如此多的人行入误区。难道写游戏的程序员都不去读读基本的课本? A* ,读作 A-Star 。它仅仅是一个启发式搜索算法。就是说在一个可以被穷举的有限解空间集中,用比较有效的方法(主要是利用估价函数)求出最优解的算法。A* 跟寻路算法没有太多关系,我们只是借助了这个方法来解决寻路这个问题,正如四则运算对于无数的数学题一样,它只是一个基本工具。寻路算法本身有很多种,我们找到算法后,借助 A* 这个工具实现这个算法而已。 我的那篇文章中提到的,也是传统意义上的地图寻路,其实依据的是这样一种算法:把地图分成若干个格子,把起始点的格子上标作 0 。然后根据将周围一圈可以通畅的格子上标为1。然后再把所有标上 1 的格子周围可以通达的格子标为 2 ,当然,如果那些格子上已经有过数字了(一定比 2 小)就不用标了。 如此反复跌代下去,我们地图上的终点只要可以通达,就一定会被标上数字。而这个数字就是理论最短的距离,而标记过的每个格子都有一个前导的入口(即它由附近一个比它小 1 的格子引导过来)整个标记的过程逆推,也就找到了最短路径。 这种一步步尝试的过程,就是一种搜索过程。如果加上启发函数,不让它盲目的寻找,就衍生出很多启发式搜索算法。A* 是其中的一种。之所以加一个 * 号,是因为它的启发式函数是有限制的,这个限制确保它能找到绝对最优解,去掉这个限制,就是 A 算法了。 我们可以看到,把地图分格子,给格子间的路径一个权值(前面的例子中,格子间的距离都是相等的,我们也可以根据地形划分成不等的距离,即权值,或者定义单向道路,这都是可以的),这是解决寻路问题的关键,但都不是 A* 算法的范畴。 如果你想出某种算法,比如把地图划分成不规则的区域,或者把地图矢量化。依然可以再此基础上用 A* 算法这个工具来从中求到最优解。如果想别的方法来寻路,比如拟人的判断,预设路点等等,甚至按走迷宫的方法一样,分叉右转,碰壁回头,那些可以算是......

阅读全文(6870) | 评论:0

[C++]2005“现代C++设计与编程”讲师讲义下载(2006-07-13 00:19:00)

摘要:2005 "现代C++设计与编程" 技术大会 讲师讲义开放下载:       Bjarne Stroustrup  《Direction for C++0x》       云风  《游戏的优化》       孟岩  《什么是高级C++》       荣耀  《C++模板元编程技术与应用》       陈榕  《面向目标代码编程与C++的未来》       李建忠  《C++/CLI:建立本地世界与托管世界互通的桥梁》       张银奎  《C++异常处理得与失》       温昱  《架构设计:策略与过程》       何宗键  《C++在嵌入式系统中的运用》       鲍志云  《用C++开发高性能服务器端网络应用程序》       黄飞龙  《多核技术与C++并发编程》       王旭  《基于C++的网游服务器中间件模型》因牵扯到相关公司机密,不便公开。 有2,3篇讲义是英文的,看来要补下英文了,不然看不懂。。。  ......

阅读全文(4204) | 评论:7

[C++]初步掌握类和对象阶段一(2006-07-12 22:48:00)

摘要:初步掌握类和对象分三阶段来讲解:              第一阶段讲解:定义类,访问类数据成员和方法,在栈或堆上创建对象。              第二阶段讲解:类的构造函数, 析构函数。              第三阶段讲解:类的复制构造函数,赋值操作符。 之所以分为三个阶段来讲解是因为讲解的东西比较多和细,特别是第二阶段和第三阶段有很多细小的东西需要分析,不会一步概括。让你明白为什么会这样。。 口水话讲完。呵呵。 进入正题。               如果你对栈或堆没有初步的认识,可以看[C++]栈和堆原理介绍。               首先让我们来看下类是怎么定义的:                class 类名                                             &nb......

阅读全文(4289) | 评论:1

[C++]文件输出的怪异(BUG)之处(2006-07-08 19:32:00)

摘要:PS: 本来想写一个文件分割的程序,复习了下文件的输入输出,结果被偶发现了这个怪异之处。。呵呵   #include <fstream.h> // 写入  int main( void )  { char *name = "heshaohua";  int age = 21; float salary = 2000; ofstream fout("Text.txt");            // 打开文件写入  // 写入资料 fout << "此行写入了Test.txt中\n";        // 次句话长度为20,后面有用。  fout << name << " " << age << " " << salary;  fout.close();  return 0;   } =================================================================== #include <fstream.h> // 读取  int main( void )  { char  line[1];        // 读取“此行写入了Test.txt中”这句话 char  name[10];   // 读取姓名 int   age;    float salary;   char *test;           // 测试从......

阅读全文(3734) | 评论:0