<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title><![CDATA[小四学编程（C语言）]]></title>
<link>http://blog.pfan.cn/petibo</link>
<description>编程爱好者博客</description>
<language>zh-cn</language>
			<item>
		<title><![CDATA[收藏：C语言出错信息中英文对照表&nbsp;]]></title>
		<link>http://blog.pfan.cn/petibo/17053.html</link>
		<description><![CDATA[Ambiguous operators need parentheses &nbsp;&nbsp;&nbsp; 不明确的运算需要用括号括起&nbsp;&nbsp;&nbsp; Ambiguous symbol ’’xxx’’ &nbsp;&nbsp;&nbsp; 不明确的符号 &nbsp;&nbsp;&nbsp; Argument list syntax error &nbsp;&nbsp;&nbsp; 参数表语法错误 &nbsp;&nbsp;&nbsp; Array bounds missing &nbsp;&nbsp;&nbsp; 丢失数组界限符 &nbsp;&nbsp;&nbsp; Array size toolarge &nbsp;&nbsp;&nbsp; 数组尺寸太大 &nbsp;&nbsp;&nbsp; Bad character in paramenters &nbsp;&nbsp;&nbsp; 参数中有不适当的字符 &nbsp;&nbsp;&nbsp; Bad file name format in include directive &nbsp;&nbsp;&nbsp; 包含命令中文件名格式不正确 &nbsp;&nbsp;&nbsp; Bad ifdef directive synatax &nbsp;&nbsp;&nbsp; 编译预处理ifdef有语法错 &nbsp;&nbsp;&nbsp; Bad undef directive syntax &nbsp;&nbsp;&nbsp; 编译预处理undef有语法错 &nbsp;&nbsp;&nbsp; Bit field too large &nbsp;&nbsp;&nbsp; 位字段太长 &nbsp;&nbsp;&nbsp; Call of non-function &nbsp;&nbsp;&nbsp; 调用未定义的函数 &nbsp;&nbsp;&nbsp; Call to function with no prototype &nbsp;&nbsp;&nbsp; 调用函数时没有函数的说明 &nbsp;&nbsp;&nbsp; Cannot modify a const object &nbsp;&nbsp;&nbsp; 不允许修改常量对象 &nbsp;&nbsp;&nbsp; Case outs]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-31 19:55:00</pubDate>
		</item>
				<item>
		<title><![CDATA[[转帖][推荐]c语言补课笔记(5)]]></title>
		<link>http://blog.pfan.cn/petibo/17039.html</link>
		<description><![CDATA[第九天&nbsp;&nbsp; 今天终于到了C语言的核心部份了，指针一直都是被学习C语言公认为最难的一个大重点了，如果假如我们不学C语言的指针的话，那我们可以说根本没有学过C语言了。不过话说回来，在我刚开始接触C的时候前面的基本语法倒是很快的过了，可是学到指针结合到数组里就傻了眼，因为我根本看不明为什么可以有这么多的数组调用方式（结合指针）。其实我下面的三言两语也很难说的明白指针这家伙的，请大家在上机里多多调试看看，待增加了经验后再回头看看指针这章，相信也能全摸透了。因为我也是这样过来的，我还特别看了很多运用指针方面的源程序。　　现在我们就从相对于二维数组来说比较简单的一维数组开始吧，先看看如何定义一个指向一维数组的指针吧。 int a[5]={1,2,3,4,5};int *p;p=a; /*这里a因为是数组的变量名，它的值是这个数组的首地址*/跟着我们可以通过指针来改变数组的值p++;*p=6; /*那么数组的第二个元素就等于6了*/　　这里的意思就是让指针向下移一个，这样一来指向了数组的第二个元素。我们再细一点看看它的地址，通过这个指针，即当前指向的元素的地址。那么地址又是怎么运行的呢？p++这个命令就是让地址往下移的了，如果按照数组a 的类型来看，数组a是一个整数的类型，占的空间是两字节，而p++就只加1，顶多都是到第一个元素的后一半里，哪里可以指到第二个元素呢？其实这里就关系到定义指针时的类型，我们这里定义的也是整型类型，"对啊，这里定义整型是对的啊，因为它要指向整形数据嘛,那么当然就是一定要定义这种类型啦"，其实这并不是真正的答案，而且也不必一定要定义为跟指向的数据一样类型，我们完全可以定义指针的类型为其它的。就比如定义为float吧，不过这里执行p++就直接跳过了一个数组元素，那么现在我们来看看究竟是怎么一回事。其实我们定义的指针类型就是用来结合指针,进行一定规则的运算方式。这里很明显可以看出如果是定义int 类型的就可以到第二个元素，说明了p++不是简单的地址加一，而是先结合这个是什么类型才进行运算的，加一次就等于地址移了2位了。float道理一样移4位，所以得到的结合是移到第三个元素。再往下看看：a=a+1;这里我们进行地址移位赋值，不过这条命令是错误的，C语言里数组名是一个地址常量，所以不以试图改变它的值。接下来简单地说一说二维数组，因为我们今天]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-31 02:06:00</pubDate>
		</item>
				<item>
		<title><![CDATA[[转帖][建议]c语言补课笔记（4）]]></title>
		<link>http://blog.pfan.cn/petibo/17038.html</link>
		<description><![CDATA[第七天&nbsp;&nbsp; 今天终于都讲到C语言比较后的范围了，"函数"说是C语言的一切真的没错（可能有吧，我不知道）。很多书上都说着函数是C语言根本，就是说函数是构成C语言的。看以下这个程序： main() { 　　printf("Hello World"; } 　　main()就是C语言里最特殊的一个函数，是构成整个程序的关键。在C编译器里首先就是要找出这个主函数才开始执行编译，好了，说了一些书上原来的东西。现在我们就来看看C语言里的函数究竟是怎么的，如果我们从基础的说起也没有什么意思。那么我们就从函数的另一个特点说起，"递归函数"相信很多人都知道这个吧，看过老潭的教程应该都知道他经典的第一个递归程序吧： int abc(int n) { 　　int s; 　　if(n &gt;1) s= n*abc(n-1); 　　else s=1; 　　return (s); } 　　从这个源程序很容易就看出有一个同自己名字的函数在里面，所以以后我们看到一个函数里面调用自己就是递归函数了。而且我们看一个递归函数就主要就是看它是否一个返回的条件，就好像一条又黑又深的山洞，我们前去探险如果往到底就一定要回头，就算是更深的也要返回啊！所以我们判定一个递归函数是否成立也常常是看它的返回条件。至于上面的那个源程序我也不想多说了，应该大家也看得明白。 这里就看看另一个利用递归函数做的题目吧，就是诺汉塔（老潭的书上也是有的）。 #include &lt;stdio.h&gt; void move(char x,char y) { 　　printf("%c--&gt;%c\n",x,y); } void hanoi (int n,char one ,char two,char three) { 　　if(n==1) move (one ,three); 　　else 　　{ 　　　　hanoi (n-1,one,three,two); 　　　　move(one,three); 　　　　hanoi(n-1,two,one,three); 　　} } 
main() { 　　int m; 　　printf("input the number of diskes:"; 　　scanf("%d",&amp;m); 　　printf("the step to moving %3d diskes]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-31 02:05:00</pubDate>
		</item>
				<item>
		<title><![CDATA[转帖][推荐]c语言补课笔记（3）]]></title>
		<link>http://blog.pfan.cn/petibo/17037.html</link>
		<description><![CDATA[第五天&nbsp; &nbsp; &nbsp;昨天老师布置的我们一道答，我昨天都给忙了做，而是今天突然想起才冲冲的赶着做，是这样的一道题： 给一个不多于5位的正整数，要求：1，这个数有几位2，打印每一位的数，3逆序打印，比如321 输出 123。好在这答也不难，用了一会儿时间就做完了。main(){　　int n; int num;　　int i=0,a[5];　　printf("请输入不大于5位的正整数";　　scanf("%d",&amp;num);　　do 　　{　　　　do =num % 10;　　　　num /=10;　　　　i++;　　}while(num!=0); 　　n=i;　　printf("LEN%d",n);　　for(i=n-1;i&gt;=0;i--)　　　　printf("%d",a[ i ]);　　for(i=0;i&lt;n;i++)　　　　printf("%d",a[ i ]); }　　做这题时我也用到了昨天老师教的画图方法作了验算，不过还是要上机求正否，这样一来可以锻练一下编写程序。我们大家都各有各的方法，有些是很长（用Switch语句呢），我也不知道他怎么想的了，不过不同人有不同思想是正确的，编程这玩意没有完全统一的答案的。那么你们想想你们有什么方法做呢，好吧，就给五分钟你们做做吧。……好了，时间到了，下面我再说说我的另一位同学做的方法吧，他是用字符数组的，也很简单方便可以实现。你们做的怎么了？如果有好的方法也可以大家交流啊，因为我写这些都是为了大家（也为了自己）。大家应该都看得明白我的程序吧，因为我的思想就是这么单纯。 老师说完了昨天的作业后就开始说今天要讲的课程了。今天的主题是循环语句，其实C语言里也只是这么几条循环语句吗？相比QB来说真的可以算是见大场面了，因为QB里单是循环语句已经有七八种之种，至于有那些我也记不太清了。那么下面讲讲C语言的好了。C语言的循环语句一共有三种，先说说比较简单的前两种吧！While ( 条件 ) { 语句；} 和　do { 语句；}　　　　　　　　　　　　　　　while ( 条件 )；　　这里我想重复一下老师给我们说的一个笑话，就是有一个小女孩问妈妈拿糖的小故事。有一个很乖的小女孩总是先问妈妈可不可以吃糖，如果得么批准了就拿一粒来吃。可是有一次她就很拿着一粒吃着了，跟着才问妈妈我可不可吃糖啊]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-31 02:05:00</pubDate>
		</item>
				<item>
		<title><![CDATA[[推荐]c语言补课笔记（2）]]></title>
		<link>http://blog.pfan.cn/petibo/17036.html</link>
		<description><![CDATA[[推荐]c语言补课笔记（2） 第三天&nbsp;&nbsp;&nbsp; 今天所讲的都是围绕着数组，我们在C语言里定义数组和其它高级语言定义的不同，这里示出C语言和其它语言的。　　C语言 　　　　　Foxbase　　int a[10][10]; dim a(10，10)　　是不是符号也不同了，我们以前用惯的都是小括号，但是现在突然来的是中括号真的是有些不习惯呢。但是谁叫我们是学C语言呢，不习惯都要得习惯了。还记得以前定数组根本就是不用理会它的地址，只知道用就行了，就算用错了也会编译出错。可是C语言可不是呢，一但你定义了一个数组之后，你就得好好的管住它，因为数组出了边界是绝对不会通知你的。数组的定义和调用方法也是很多，真是灵活多变，这里不再重复书上里的东西了。现在就定义一个数组来看看：int a[10]; 　　如这个表所示，数组定义之后有相对地址，而且数组名a就是存放这些地址的首地址。（但是数组名是一个指针常量。）现在我们定义多一个整型指针变量 int *p; ，让他指向数组a，p=a; 我们试着让指针运算递增一个p++; 我们看到的结果是p指向了新的地址2003，原来的地址是2001，为什么递增一个就移向了2003呢？不是2002才是正确的吗？其实这里就说明了我们定义指针变量为什么要整型呢，是因为所有的指针运算也是看自己本身是什么类型的指针作出什么的运算，就是现在是整型类型，整型数据存储是需要2字节的，所以针指运算也是按这个方式来到进行，结果很显然就是往下移2了。　　好了，接下来我们做一些题目吧，这是今天老师给我们出的题，其实也是2001年程序员下午考试里出现过的题目。所以请大家自己也动手做做，多思考，看看谁的方法比较好。 在n行n列矩阵中，每行都有最大数，本程序求这几个最大数中的最小一个。#include &lt;stdio.h&gt;#define N 100int a[N][N];void main(){　　int row,col,max,min,n;　　/*输入合法的n和n*n个整数的代码, 注，这里略了一部份到后面练习自己做回*/　　for(row=0;row&lt;n;row++)　　{　　　　for(max=a[row][0],col=1;col&lt;n;col++)　　　　if ( 　) max=a[row][col];　　　　if (　 ) mi]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-31 02:01:00</pubDate>
		</item>
				<item>
		<title><![CDATA[[建议]转载c语言补课笔记(1)]]></title>
		<link>http://blog.pfan.cn/petibo/17035.html</link>
		<description><![CDATA[网上有一篇考高程的补课笔记，看来是当事人为提高c语言参见的c语言补习班，我想对大家可能有所帮助，将原来的内容编辑以后在这里列出，希望大家喜欢。(部分内容我有些删改，是为了大家能更好的学习。)&nbsp;&nbsp;&nbsp; 第一天&nbsp;&nbsp;&nbsp; 　　今天因为第一天吧，老师还不太清楚我们的底究竟到那里。是因为我们之前都是全自学的，所以现在要摸一摸底吧。一开始，他直接引入了上界程序员考试的下午的第一道题，是一道编程填空题。如下：&nbsp;&nbsp;&nbsp;&nbsp; int strcmp( char *s, char *t)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {　　&nbsp;&nbsp;&nbsp;&nbsp; while(*s &amp;&amp; *t &amp;&amp; _______)　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { s++;t++;　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ________;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }　　这是模仿C语言字符函数库里的字符比较函数，当时我第一时间就想到了一种方法，第一空因为大家都没有问题吧，*s和*t这两个都保持为逻辑真就行，表明这个存储单元是用字符的，大家都知道C语言里没有字符串这种变量的，只有字符数组，'\0'这个符号就是用来表明这个字符数组到了结尾了，这里又有一个新的概念要说说的了，就是C语言逻辑里非零的都为真，那么'\0'这个符号就是为零。所以填这个空就应该没有什么太大的难度了，跟着就是还要有一个条件退出循环，因为是比较大小，只要保持一样都继续，所以条件也很显示的可以写出来*s == *t。至于第二题当时我的思维就销定在条件运算符里，因为返回的值是有三种可以性的，大于返回正数，等于就返回零，小于就返回负数。知道了这三种可能就可以用条件运算符填了，我当时的答案]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-31 02:00:00</pubDate>
		</item>
				<item>
		<title><![CDATA[&nbsp;C语言笔试轻松过—也谈二级C应试&nbsp;]]></title>
		<link>http://blog.pfan.cn/petibo/17034.html</link>
		<description><![CDATA[二级C语言笔试只有选择题和填空题两种题型。这两种题型的解题方法有所不同，考生在备考时要深化对基本概念和知识点的理解，并注重实践，同时要作一些针对性的练习，特别是历年真题，从中找出规律性的东西以及解题技巧。 　　　一、选择题 　　这种类型的题，要求考生从四个待选答案中选择一个正确答案。考生可综合运用直选法，排除法等多种方法。但是这类题目考的知识点往往都比较多且细，容易出错，考生在做这类题时，切忌不加分析，一看就选，从而漏掉正确的答案。如2003年9月笔试第49题： 　　有以下程序 　　mai( ) 　　{ int a[3][3],p,i; 　　　p=&amp;&amp;a[0][0]; 　　　for (i=0;i&lt;9;i++) p[i]=i+1; 　　　printf("%d\n",a[1][2]); 　　} 　　程序运行后的输出结果是 　　(A)3 (B)6 (C)9 (D)2 　　此题主要考的知识点有：(1)数组与指针的关系；(2)数组的初始化和数组元素的引用。在C语言中，数组与指针有着非常密切的联系。任何能用数组下标完成的操作也都可以用指针来实现。语句“p=&amp;&amp;a[0][0];”使p指向数组中的第0号元素，即a[0][0]，指针变量p中存放了数组元素a[0][0]的地址，由于数组元素在内存中是连续存储的，因此，我们就可以通过指针变量p访问数组中的任何一个元素。本题中通过“for (i=0;i&lt;9;i++) p[i]=i+1；”语句使a[3][3]={1,2,3,4,5,6,7,8,9}，所以a[1][2]=6。这里要特别注意C语言中数组的下标从0开始，不要错选a[1][2]=3。 　　　二、填空题 　　填空题主要考查考生对基础知识的准确理解。对于这类型的题，考生应深刻理解题意，明确题目要求，运用相关知识做出正确回答。在历年考试中，考生这部分试题的得分直接决定考试成绩。由于这部分共20个空，计40分，有的考生能得35~40分，而有的考生却得不到10分，直接拉开了最后成绩。在判卷过程中发现考生常犯的错误有以下几个方面： 　　1.基础知识掌握不扎实，概念理解不准确。 　　如2003年9月填空第8题： 　　main( ) 　　{int a=1,b=3,c=5; 　　　if (c=a+b) printf ("yes\n"); 　　　else p]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-31 01:47:00</pubDate>
		</item>
				<item>
		<title><![CDATA[计算机待级考试（二级）&nbsp;]]></title>
		<link>http://blog.pfan.cn/petibo/17033.html</link>
		<description><![CDATA[　c语言二级考试主要考c语言程序设计知识，除此之外还有计算机基础知识、dos基本操作、windows基本操作的内容，有些考生只注重c语言知识的学习，忽略了c语言之外内容的复习，造成不小的损失。c语言二级考试笔试试题有选择和填空两类大题。以下仅对c语言中的一些易错难懂的题进行解析。　　1、设有如下的变量定义:　　int i =8,k ,a,b ;　　unsigned long w=5;　　double x=1,42,y=5.2;　　则以下符合c语言语法的表达式是　　a、a＋=a－=(b=4)＊(a=3)　　b、x％(－3);　　c、a=a＊3=2 　 　　d、y=float(i)　　答案：a　　解析：赋值运算符按照“自右而左”的结合顺序，答案a的运算顺序是：先将4赋给变量b，3赋给变量a，然后计算a=a－b＊a，运算后变量a的值为－8，最后计算a=a＋a，此表达式最终结果为－16，c语言的表达式很简洁，但是心中必须清楚运算的顺序。模运算要求两个数必须是整型数据，故答案b是错误的。答案c是错误的原因是不能将一个常数赋给一个表达式。答案d也是错误的，应该给float加上括号才对，需要强调的是强制类型转变后变量i本身的数据类型没有改变，强制类型运算后得到一个float型的中间变量。　　2、以下程序的输出结果是　　a、2 0 b、3 1 　　c、3 2 1 d、2 1 0　　main( )　　 { int n=4；　　 while(n╠╠)printf("％d "，－－n)；　　}　　答案：a　　解析：这道题是考查考生对自增运算符以及循环语句的的掌握。n的含义是先使用变量n，使用完后再使其减1，n表示先使变量n减1后再使用n。自增运算符是c语言的重点和难点，每次考试都考。该题的运行步骤是首先判断条件表达式的真假，因为变量n的值为4大于0，所以条件表达式的值为真，判断完条件表达式之后，变量n的值变为3，然后执行循环体，要输出n的值，显然是先对n减1再输出，故输出应是2，然后再进行第二次循环，由于变量n的值大于0，故条件表达式的值为真，判断完条件表达式之后，变量n的值变为1，然后执行循环体，输出n的值为0，然后判断条件表达式n的值为假，跳出循环。　　3、若有说明：long ＊p，a；则不能通过scanf语句正确给输入项读入数据的程序段是　　a、＊p=＆a； scanf("％ld"]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-31 01:41:00</pubDate>
		</item>
				<item>
		<title><![CDATA[[推荐]二级C语言常见易错题]]></title>
		<link>http://blog.pfan.cn/petibo/17031.html</link>
		<description><![CDATA[1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据溢出int a = 32767;a = a + 1; 此时a的值为 –327682.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(-1)&amp;&amp;(-1) 值为：1非0的数，逻辑值均为1只有数0，逻辑值为03.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设a=5, b=6, c=7, d=8, m=2, n=2执行 (m = a &gt; b) &amp;&amp; ( n = c &gt; b)结果：n 的值为 2解析：&amp;&amp;是短路(shortway)运算符，当&amp;&amp;左边表达式的值为0时，不再执行右边的表达式4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 / 2 = 0 1.0 / 2 = 0.55.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;转义字符遇到’\’字符应注意转义字符问题，比如’\\’,’\ddd’就是转义字符常见考法：Q：”a\045+045\b”有几个字节？&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A：8个字节（分别是’a’,’\045’,’+’,’0’,’4’,’5’,’\b’,’\0’）字符串结束符如上题，”a\045+045\b”含有最后的字符串结束符’\0’，因而长度为8个字节注意：计算字符串长度时，sizeof会将’\0’计算在内，strlen()则不算Main(){char b[] = “hello, you”;b[5] = 0;printf(“%s\n”, b);} 运行结果：hello解析：b[5]=0 ;等价于 b[5] = ‘\0’;6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++ i , i ++x = 5;y1 = x++ *]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-31 01:29:00</pubDate>
		</item>
				<item>
		<title><![CDATA[另类的穷举算法]]></title>
		<link>http://blog.pfan.cn/petibo/17010.html</link>
		<description><![CDATA[Description有一个未完成的等式1 2 3 4 5 6 7 8 9=N空格内（1前面没有空格）可以填入+,-,也可以不填。 编程找出输入某个整数 N 后使等式成立的所有方案的总数。保证有解。Input该题含有多组测试数据，每组数据为一行，仅一个整数N。Output输出方案总数。Sample Input108Sample Output15 #include&lt;iostream.h&gt;#define OpNo 0 //No operator#define OpAdd 1 //+#define OpSub 2 //-typedef int Operator;long Calc(int Status);int main(){&nbsp;&nbsp;&nbsp;&nbsp;long t,count,loop;&nbsp;&nbsp;&nbsp;&nbsp;while(cin&gt;&gt;t)&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(loop=0,count=0;loop&lt;6561;loop++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(Calc(loop) == t) count++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;count&lt;&lt;endl;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;return 0;}long Calc(int Status){&nbsp;&nbsp;&nbsp;&nbsp;long buffer=1,result=0;&nbsp;&nbsp;&nbsp;&nbsp;int currentNum;&nbsp;&nbsp;&nbsp;&nbsp;Operator op,elapsedop=OpNo;&nbsp;&nbsp;&nbsp;&nbsp;for(currentNum=2;currentNum&lt;=9;currentNum++)&nbsp;&nbsp;&nbs]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-30 03:09:00</pubDate>
		</item>
				<item>
		<title><![CDATA[求最大公约数的两种算法]]></title>
		<link>http://blog.pfan.cn/petibo/17009.html</link>
		<description><![CDATA[求最大公约数的两种算法 ________________________________________辗转相除法和移位相减法（Euclid &amp; stein 算法）给出Stein算法如下： 1.&nbsp;&nbsp;&nbsp;&nbsp;如果A=0，B是最大公约数，算法结束 2.&nbsp;&nbsp;&nbsp;&nbsp;如果B=0，A是最大公约数，算法结束 3.&nbsp;&nbsp;&nbsp;&nbsp;设置A1 = A、B1=B和C1 = 1 4.&nbsp;&nbsp;&nbsp;&nbsp;如果An和Bn都是偶数，则An+1 =An /2，Bn+1 =Bn /2，Cn+1 =Cn *2(注意，乘2只要把整数左移一位即可，除2只要把整数右移一位即可) 5.&nbsp;&nbsp;&nbsp;&nbsp;如果An是偶数，Bn不是偶数，则An+1 =An /2，Bn+1 =Bn ，Cn+1 =Cn (很显然啦，2不是奇数的约数) 6.&nbsp;&nbsp;&nbsp;&nbsp;如果Bn是偶数，An不是偶数，则Bn+1 =Bn /2，An+1 =An ，Cn+1 =Cn (很显然啦，2不是奇数的约数) 7.&nbsp;&nbsp;&nbsp;&nbsp;如果An和Bn都不是偶数，则An+1 =|An -Bn|，Bn+1 =min(An,Bn)，Cn+1 =Cn 8.&nbsp;&nbsp;&nbsp;&nbsp;n++，转4 //greatest common divisor//by heaton//2005/03/11#include &lt;iostream&gt;using namespace std;//交换a ，b的值 void swap(int&amp; a1,int &amp;b1){&nbsp;&nbsp;&nbsp;&nbsp;int temp;&nbsp;&nbsp;&nbsp;&nbsp;temp=a1;&nbsp;&nbsp;&nbsp;&nbsp;a1=b1;&nbsp;&nbsp;&nbsp;&nbsp;b1=temp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//辗转相除法 int gcd(int a,int b){&nbsp;&nbsp;&nbsp;&nbsp;if(a &lt; b)sw]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-30 03:09:00</pubDate>
		</item>
				<item>
		<title><![CDATA[6&nbsp;（农历的算法，这个是最花费我心力的～～）]]></title>
		<link>http://blog.pfan.cn/petibo/17008.html</link>
		<description><![CDATA[void Lunar(){int n;printf("1.Inquire the corresponding lunar day of the day you input\n");printf("2.Inquire the corresponding solar day of the day you input\n");printf("3.Exit\n");printf("Please input right number of the option which you want to inqiure:");scanf("%d",&amp;n);switch (n){case 1:&nbsp;&nbsp;&nbsp;&nbsp;solar_lunar();&nbsp;&nbsp;&nbsp;&nbsp;break;case 2:&nbsp;&nbsp;&nbsp;&nbsp;lunar_solar();&nbsp;&nbsp;&nbsp;&nbsp;break;case 3:&nbsp;&nbsp;&nbsp;&nbsp;screen();&nbsp;&nbsp;&nbsp;&nbsp;break;default:&nbsp;&nbsp;&nbsp;&nbsp;printf("Error!Please input the right character!!!\n");&nbsp;&nbsp;&nbsp;&nbsp;Lunar();&nbsp;&nbsp;&nbsp;&nbsp;break;}}void solar_lunar(){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int year,month,day,gan,zhi,animal;char yn;&nbsp;&nbsp;&nbsp;&nbsp;Date *date;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input(solar_lunar);&nbsp;&nbsp;&nbsp;&nbsp;if((y&lt;1900)||(y&gt;2100))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-30 03:08:00</pubDate>
		</item>
				<item>
		<title><![CDATA[一个比较臃肿的电子表程序（欢迎提加好的算法和语法）]]></title>
		<link>http://blog.pfan.cn/petibo/17007.html</link>
		<description><![CDATA[#include&lt;stdio.h&gt;#include&lt;graphics.h&gt;#include&lt;math.h&gt;#include&lt;time.h&gt;#include&lt;conio.h&gt;#define BB 3.1415926/180/*弧度*/#define R 200#define X 320#define Y 240main(){int gdriver=9,gmode=2;void draw();void ddraw();double x1,y1,x2,y2;int i;initgraph(&amp;gdriver,&amp;gmode,"");draw();/*画界面*/ddraw();/*处理秒、分、时针的转动*/getch();}void draw(){double x1,y1,x2,y2;int i;setbkcolor(1);setcolor(11);setlinestyle(0,0,3);circle(X,Y,R);setcolor(5);circle(X,Y,8);setcolor(5);setlinestyle(0,0,1);for(i=0;i&lt;360;i=i+6){x1=X+(R-1.5)*cos(i*BB);y1=Y+(R-1.5)*sin(i*BB);if(i%90==0)&nbsp;&nbsp;{x2=X+(R-20)*cos(i*BB);&nbsp;&nbsp;&nbsp;y2=Y+(R-20)*sin(i*BB);}else if(i%30==0)&nbsp;&nbsp;{x2=X+(R-13)*cos(i*BB);&nbsp;&nbsp;&nbsp;y2=Y+(R-13)*sin(i*BB);}else&nbsp;&nbsp;{x2=X+(R-8)*cos(i*BB);&nbsp;&nbsp;&nbsp;y2=Y+(R-8)*sin(i*BB);}line(x1,y1,x2,y2);}}void ddraw(){struct tm *local;time_t t;double x2,y2;float sec1,sec2,min,hour,n;t=time(NULL);local=localtime(&amp;t);printf(ctime(&amp;t));sec1=local-]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-30 03:05:00</pubDate>
		</item>
				<item>
		<title><![CDATA[遗传算法]]></title>
		<link>http://blog.pfan.cn/petibo/17006.html</link>
		<description><![CDATA[遗传算法介绍遗传算法(Genetic Algorithm, GA)是近几年发展起来的一种崭新的全局优化算法，它借用了生物遗传学的观点，通过自然选择、遗传、变异等作用机制，实现各个个体的适应性的提高。这一点体现了自然界中"物竞天择、适者生存"进化过程。1962年Holland教授首次提出了GA算法的思想，从而吸引了大批的研究者，迅速推广到优化、搜索、机器学习等方面，并奠定了坚实的理论基础。 用遗传算法解决问题时，首先要对待解决问题的模型结构和参数进行编码，一般用字符串表示，这个过程就将问题符号化、离散化了。也有在连续空间定义的GA(Genetic Algorithm in Continuous Space, GACS)，暂不讨论。 　　一个串行运算的遗传算法(Seguential Genetic Algoritm, SGA)按如下过程进行： 　　(1) 对待解决问题进行编码； 　　(2) 随机初始化群体X(0):=(x1, x2, … xn)； 　　(3) 对当前群体X(t)中每个个体xi计算其适应度F(xi)，适应度表示了该个体的性能好坏； 　　(4) 应用选择算子产生中间代Xr(t)； 　　(5) 对Xr(t)应用其它的算子，产生新一代群体X(t+1)，这些算子的目的在于扩展有限个体的覆盖面，体现全局搜索的思想； 　　(6) t:=t+1；如果不满足终止条件继续(3)。　　GA中最常用的算子有如下几种： 　　(1) 选择算子(selection/reproduction): 选择算子从群体中按某一概率成对选择个体，某个体xi被选择的概率Pi与其适应度值成正比。最通常的实现方法是轮盘赌(roulette wheel)模型。 　　(2) 交叉算子(Crossover): 交叉算子将被选中的两个个体的基因链按概率pc进行交叉，生成两个新的个体，交叉位置是随机的。其中Pc是一个系统参数。 　　(3) 变异算子(Mutation): 变异算子将新个体的基因链的各位按概率pm进行变异，对二值基因链(0,1编码)来说即是取反。 　　上述各种算子的实现是多种多样的，而且许多新的算子正在不断地提出，以改进GA的某些性能。系统参数(个体数n,基因链长度l,交叉概率Pc,变异概率Pm等)对算法的收敛速度及结果有很大的影响，应视具体问题选取不同的值。　　GA的程序设计应考虑到通用性，而且]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-30 03:04:00</pubDate>
		</item>
				<item>
		<title><![CDATA[软件水平考试常用算法设计方法&nbsp;]]></title>
		<link>http://blog.pfan.cn/petibo/17005.html</link>
		<description><![CDATA[软件水平考试常用算法设计方法&nbsp;

&nbsp;要使计算机能完成人们预定的工作，首先必须为如何完成预定的工作设计一个算法，然后再根据算法编写程序。计算机程序要对问题的每个对象和处理规则给出正确详尽的描述，其中程序的数据结构和变量用来描述问题的对象，程序结构、函数和语句用来描述问题的算法。算法数据结构是程序的两个重要方面。 
　　算法是问题求解过程的精确描述，一个算法由有限条可完全机械地执行的、有确定结果的指令组成。指令正确地描述了要完成的任务和它们被执行的顺序。计算机按算法指令所描述的顺序执行算法的指令能在有限的步骤内终止，或终止于给出问题的解，或终止于指出问题对此输入数据无解。
　　通常求解一个问题可能会有多种算法可供选择，选择的主要标准是算法的正确性和可靠性，简单性和易理解性。其次是算法所需要的存储空间少和执行更快等。
　　算法设计是一件非常困难的工作，经常采用的算法设计技术主要有迭代法、穷举搜索法、递推法、贪婪法、回溯法、分治法、动态规划法等等。另外，为了更简洁的形式设计和藐视算法，在算法设计时又常常采用递归技术，用递归描述算法。　　&nbsp;&nbsp;&nbsp; 一、迭代法
　　迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0，用某种数学方法导出等价的形式x=g(x)，然后按以下步骤执行：　　（1） 选一个方程的近似根，赋给变量x0；　　（2） 将x0的值保存于变量x1，然后计算g(x1)，并将结果存于变量x0；　　（3） 当x0与x1的差的绝对值还小于指定的精度要求时，重复步骤（2）的计算。　　若方程有根，并且用上述方法计算出来的近似根序列收敛，则按上述方法求得的x0就认为是方程的根。上述算法用C程序的形式表示为：　　【算法】迭代法求方程的根　　{ x0=初始近似根；　　 do {　　 x1=x0；　　 x0=g(x1)； /*按特定的方程计算新的近似根*/　　 } while ( fabs(x0-x1)&gt;Epsilon)；　　 printf(“方程的近似根是%f\n”，x0)；　　}　　迭代算法也常用于求方程组的根，令　　 X=（x0，x1，…，xn-1）　　设方程组为：　　 xi=gi(X) (I=0，1，…，n-1)　　则求方程组根的迭代算法可描述如下：　　【算法】迭代法求方程组的根　　]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-30 03:03:00</pubDate>
		</item>
				<item>
		<title><![CDATA[贪心算法::启发式搜索]]></title>
		<link>http://blog.pfan.cn/petibo/17004.html</link>
		<description><![CDATA[蛮干算法的成功完全是借助于计算机运算的快速，如果问题的解比较少的时候使用起来是比较容易的。但当问题的解比较多，则不宜使用，常用的做法是剪枝，剪枝是一种形象的描述，因为按深搜的算法，图可以描述为与之对应的树或森林，而剪枝的意思就是去掉某些子树，为什么要去掉，这里要用到一个剪枝判断，判断的方法是具体问题具体分析，但是有一点是要考虑到的，剪枝的高效性是建立在判断的额外开销上的，如果这里的开销大，则剪枝只会宣告失败。而更好的做法是运用“贪心策略”。【贪心算法】贪心算法（也叫贪婪算法）不是某种特定的算法，而是一类抽象的算法，或者说只是一种思想，它的具体表现在，对解空间进行搜索时，不是机械地搜索，而是对局部进行择优选取，贪心算法的目的不是为了找到全部解，也当然找不出最优解，而只是找出一种可行解，这样就会得到惊人的高效性。因此，贪心算法也叫启发式搜索，这种启发就是所谓的“贪心策略”。以马踏棋盘问题为例，问题描述：在国际象棋的棋盘上指定一个初始马位置，一匹马从这个位置出发，经过不重复的走动，直到踏遍整个棋盘，输出一种可行路径。对8×8的棋盘来说，马踏棋盘的解是一个天文数字，相当之多，而采用蛮干算法，求一个解的时候会非常吃力，因此采用贪心算法。这里选取的贪心策略是，在某个马位置顶点的后继顶点（子结点）中，择优选取那些出口更小的顶点进行搜索，出口的意思就是这个点能跳到的可行位置的路径数，这样的贪心策略是容易被人接受的，一开始往出口少的点跳，则往后出口多的点就多，能跳通的可能性就大，而事实也证明了，如果采用这样的策略在求一个解时几乎不需要回溯，对于更大的棋盘也如此。C++代码：在（VC6上调试通过）#include "stdio.h"class horse{public:&nbsp;&nbsp;&nbsp;&nbsp;horse(int,int);&nbsp;&nbsp;&nbsp;&nbsp;~horse();&nbsp;&nbsp;&nbsp;&nbsp;void solve(int,int);protected:&nbsp;&nbsp;&nbsp;&nbsp;void dfs(int,int,int);&nbsp;&nbsp;&nbsp;&nbsp;int **data;&nbsp;&nbsp;&nbsp;&nbsp;int *head;&nbsp;&nbsp;&nbsp;&nbs]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-30 03:02:00</pubDate>
		</item>
				<item>
		<title><![CDATA[QQ&nbsp;加密算法]]></title>
		<link>http://blog.pfan.cn/petibo/17003.html</link>
		<description><![CDATA[QQ 加密算法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QQ使用的加密算法来源于一种称为TEA（Tiny Encryption Algorithm）加密算法。它是在1994年由英国剑桥大学的David Wheeler和Roger Needham所发明的一种加密方法。大概来说，它是使用128bit密钥加密64bit数据产生64bit输出的一种算法。这种算法的可靠性是通过加密轮数而不是算法的复杂度来保证的。具体的算法可以参考：http://www.ftp.cl.cam.ac.uk/ftp/papers/djw-rmn/djw-rmn-tea.html。实现可以参考：http://abcn.net/crypto.htm。QQ使用16轮的加密（这是最低限，推荐应该是32轮）。QQ在使用这个算法的时候，由于需要加密不定长的数据，所以使用了一些常规的填充办法和交织算法（也就是说，把前一组的加密结果和后一组的进行运算，产生新的结果）。具体的填充算法是：原始字符串加上8个字节再加上填充字符数应该是8的倍数（至少填充2个字节）。填充后的字符串是这样组织的。第一个字节，为填充字符数减2 OR 上0xA8。后面是填充字节。然后是待加密的数据，最后是7个0。填充的字节一般是0xAD，但再0A1dD版本中，会使用随机的填充字符串。一般，我们会用解密后最后是否7个零来判断是否正确的解密。]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-30 03:01:00</pubDate>
		</item>
				<item>
		<title><![CDATA[公历历法::星期算法]]></title>
		<link>http://blog.pfan.cn/petibo/17002.html</link>
		<description><![CDATA[原创]【引】《创世纪》创世在宇宙天地尚未形成之前，黑暗笼罩着无边无际的空虚混饨，上帝那孕育着生命的灵运行其中，投入其中，施造化之工，展成就之初，使世界确立，使万物齐备。上帝用七天创造了天地万物。这创造的奇妙与神秘非形之笔墨所能写尽，非诉诸言语所能话透。第一日，上帝说：“要有光！”便有了光。上帝将光与暗分开，称光为昼，称暗为夜。于是有了晚上，有了早晨。第二日，上帝说：“诸水之向要有空气隔开。”上帝便造了空气，称它为天。……第七日，天地万物都造齐了，上帝完成了创世之功。在这一天里，他歇息了，并赐福给第七天，圣化那一天为特别的日子，因为他在那一天完成了创造，歇工休息。就这样星期日也成为人类休息的日子。“造化钟神秀，阴阳割分晓。”上帝就是这样开辟鸿蒙，创造宇宙万物的。以上来自《圣经》，现在还有一些基督教徒每个礼拜天去教堂朝拜，可见一个星期七天就源于此，这正是我讨论的中心，如何计算哪年哪月哪日是星期几。【公历历法】公历历法很简单，年有润年（LeapYear）和平年之分，平年每月天数恒为：月份 一 二 三 四 五 六 七 八 九 十 十一 十二天数 31 28 31 30 31 30 31 31 30 31&nbsp;&nbsp;30&nbsp;&nbsp;&nbsp;31共365天。润年366天，二月多一天，29天。【润年判断】如果年份数能被4整除但不能被100整除或者能被400整除者，为润年。【400年刚好一个轮回】很容易想到每400年内的润年数相等，即刚好一个轮回，400年有多少个润年？被4整除的有100个，被100整除的有4个，被400整除的只有1个，所以一共有100-4+1=97个润年，所以400年共有(365*400+97)天，即146097天，除7余0！也就是说2001年1月1日的星期数与1年1月1日的星期数相同，翻出日历一看，星期一，我不知道上帝什么时候造的人，或许是1年1月1日。这样一来，任何一个日期我们都可以把它折算到0~399年之内的日期来算，0年的说法不准确，或许没有，但不影响这个数学结论，我们只是借它来推一推而已。【起初的400年】如果每一年都是平年，即365天，除7余1，也就是说如果不遇上润年，每往下一年就会使星期数增一。同样的道理，如果遇上润年，则多增一。我们要算的也就是把润年数算出来就行了，很容易，如果是y年（0&lt;=y&lt;400），则遇]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-30 02:57:00</pubDate>
		</item>
				<item>
		<title><![CDATA[阴阳历算法]]></title>
		<link>http://blog.pfan.cn/petibo/17001.html</link>
		<description><![CDATA[阴阳历算法________________________________________程序为： /* 西历农历转换程式 黄晓鸣 1995,7,25 prototype: int calconv( struct convdate * ); struct convdate { int source; ==0 则输入日期为西历, !=0 则输入为农历 int solaryear; 输出或输入之西历年份 int solarmonth; 西历月 int solardate; 西历日 int lunaryear; 输出或输入之农历年份 int lunarmonth; 农历月 int lunardate; 农历日 int weekday; 该日为星期几 ( 0==星期日, 1==星期一, ... ) int kan; 该日天干 ( 0==甲, 1==乙, ..., 9==癸 ) int chih; 该日地支 ( 0==子, 1==丑, ..., 11==亥 ) }; 呼叫时须设定 souce 的值, 若为 0 则为西历转农历, 否则为农历转西历. 然後视 输入为西历或农历来设定西历或农历的年月日. 转换後的年月日会填入结构中( 农 历或西历 ), 以及该日为星期几, 天干地支. 若函式的返回值为 0 表示没有错误, 1 为输入之年份错误, 2 为输入之月份错误, 3 为输入之日期错误. 输入之西历年须在 1937 - 2031 间 输入之农历年须在 1936 - 2030 间 若须扩充, 则增加 lunarcal[] */ #define firstyear 1936 /* the first year in lunarcal[] */ struct convdate { int source; int solaryear; int solarmonth; int solardate; int lunaryear; int lunarmonth; int lunardate; int weekday; int kan; int chih; }; struct taglunarcal { int basedays; /* 到西历 1 月 1 日到农历正月初一的累积日数 */ int intercalation; /* 闰月月份. 0==此年没有闰月 */ int basewee]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-30 02:49:00</pubDate>
		</item>
				<item>
		<title><![CDATA[求最大公约数的算法。]]></title>
		<link>http://blog.pfan.cn/petibo/17000.html</link>
		<description><![CDATA[1、欧几里德算法和扩展欧几里德算法 欧几里德算法 欧几里德算法又称辗转相除法，用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理： 定理：gcd(a,b) = gcd(b,a mod b) 证明：a可以表示成a = kb + r，则r = a mod b 假设d是a,b的一个公约数，则有 d|a, d|b，而r = a - kb，因此d|r 因此d是(b,a mod b)的公约数 假设d 是(b,a mod b)的公约数，则 d | b , d |r ，但是a = kb +r 因此d也是(a,b)的公约数 因此(a,b)和(b,a mod b)的公约数是一样的，其最大公约数也必然相等，得证 欧几里德算法就是根据这个原理来做的，其算法用C++语言描述为： &nbsp;&nbsp;void swap(int &amp; a, int &amp; b) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int c = a; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a = b; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b = c; &nbsp;&nbsp;} &nbsp;&nbsp;int gcd(int a,int b) &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(0 == a ) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return b; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( 0 == b) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return a; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&]]></description>
		<author><![CDATA[petibo]]></author>
		<pubDate>2006-07-30 02:48:00</pubDate>
		</item>
		</channel>
</rss>