博文
键盘代码表(2005-08-15 21:01:00)
摘要:bios.hint bioskey(int cmd)本函数用来执行各种键盘操作,由cmd确定操作。 cmd可为以下值: 0 返回敲键盘上的下一个键。若低8位为非0,即为ASCII字符;若低8位为0, 则返回扩充了的键盘代码。 1 测试键盘是否可用于读。返回0表示没有键可用;否则返回下一次敲键之值。 敲键本身一直保持由下次调用具的cmd值为0的bioskey所返回的值。 2 返回当前的键盘状态,由返回整数的每一个位表示,见下表: ┌──┬───────────┬───────────┐ │ 位 │为0时意义 │为1时意义 │ ├──┼───────────┼───────────┤ │ 7 │插入状态 &nb......
年龄趣题(2005-08-15 14:25:00)
摘要:两位俄罗斯数学家在飞机上相遇."如果我没记错的话,你有3个儿子."伊凡说."他们现在多大拉?""他们年龄的乘积是36,"艾格说."他们年龄的和恰是今天的日期.""对不起,艾格."一分钟后,伊凡开口道,"你并没有告诉我你儿子的年龄.""哦,忘记告诉你拉,我的小儿子是红头发的.""啊,那就很清楚拉."伊凡说,"我现在知道你的3个儿子各是多大拉."请问....伊凡是怎么知道的他们的年龄的?分别是多少?......
%*的又一应用(2005-08-15 12:46:00)
摘要:用*组成X型图案,如下:1* *7 2* *6 3* *5 4*4 5* *3 6* *27* *1 程序由林杰杰发布http://programfan.com/club/showbbs.asp?id=97897#include int main(void){ int i; int k; for (i = 1;i <= 7;i++) { k = (i <= 4 ? i : 8 - i); printf("%*s",k,"*"); printf("%*s\n",8 - 2 * k,"*" + (k == 4)); } return 0;} 运行结果:* ** * * * * * **  ......
Jos问题(2005-08-14 16:25:00)
摘要:Jos问题n个人围成一圈,从1开始顺序报数,报到m的退出,再从1开始报数,直到仅剩一个人为止。输出出列序列。#include<stdio.h>#include<malloc.h>
struct Man{ int num; struct Man *next;};
void Jos(int n,int m = 3){ struct Man *head, *p, *b, *t; int i; head=(struct Man*)malloc(sizeof head); p = head; b = head; for(i = 1;i < n;i++){ //创建循环单链表 p->num = i; p->next = (struct Man*)malloc(sizeof p->next); p = p->next; } p->num = n; p->next = head;//创建完毕
//开始报数 p = head; i = 0; do{ if(++i == m){ //报到3 i = 0; //重新......
解析:菱形的高效率代码(2005-08-15 12:28:00)
摘要:解析:菱形的高效率代码输出菱形的高效率代码如下:#include int main(int _){ while(_!=10) { printf("%*s\n",_<=5?4+_:14-_,"*********"+(_<=5?10-2*_:2*_-10)); _++; } return 0;}运行结果如下: * *** **************************** ***** *** *(注:第4、6行显示有误。应为一个菱形。下同)解析:1.printf("%*s", int, char*);%*表示右对齐方式显示,int为从左起到右对齐处的字符数例如:printf("%*d", 4, 345);输出结果如下:3452._<=5?4+_:14-_该表达式即是计算菱形右边界3."*********"+(_<=5?10-2*_:2*_-10)该表达式是计算显示*的个数,事实上是地址运算。printf("%p\n", "*********"+(_<=5?10-2*_:2*_-10));注:%p为输出16进制32位地址。则输出:00420FA000420F9E00420F9C00420F9A00420F9800420F9A00420F9C00420F9E00420FA0若改为printf("%*s\n",_<=5?4+_:14-_,"123456789"+(_<=5?10-2*_:2*_-10));则输出结果如下: 9 789 5678934567891234567893456789  ......
feof(2005-08-14 01:12:00)
摘要:MSDN 2001
------------------------
feof
Tests for end-of-file on a stream.
int feof( FILE *stream );
The feof function returns a nonzero value after the first read operation that attempts to read past the end of the file. It returns 0 if the current position is not end of file. There is no error return.
Example
/* FEOF.C: This program uses feof to indicate when
* it reaches the end of the file FEOF.C. It also
* checks for errors with ferror.
*/
*********************************************************
#include<stdio.h>
struct number
{
int num;
}a[10],b[10];
int main(void)
{
int i;
FILE *fp;
fp=fopen("d:\\abc.txt","w+");
for(i=0;i<10;i++)
a[i].num=i;
for(i=0;i<10;i++)
fwrite(&a[i],sizeof(struct number),1,fp);
&......
输出变量内存地址(2005-08-13 17:03:00)
摘要:%p的运用
#include <stdio.h>
int main()
{
int i = 0;
printf("[%p]\n",&i);
return 0;
}......
(转)成为编程高手的五个阶段(2005-08-22 10:58:00)
摘要:第一阶段
此阶段主要是能熟练地使用某种语言。这就相当于练武中的套路和架式这些表面的东西。
第二阶段
此阶段能精通基于某种平台的接口(例如我们现在常用的Win 32的API函数)以及所对应语言的自身的库函数。到达这个阶段后,也就相当于可以进行真实散打对练了,可以真正地在实践中做些应用。
第三阶段
此阶段能深入地了解某个平台系统的底层,已经具有了初级的内功的能力,也就是“手中有剑,心中无剑”。
第四阶级
此阶段能直接在平台上进行比较深层次的开发。基本上,能达到这个层次就可以说是进入了高层次。这时进入了高级内功的修炼。比如能进行VxD或操作系统的内核的修改。
这时已经不再有语言的束缚,语言只是一种工具,即使要用自己不会的语言进行开发,也只是简单地熟悉一下,就手到擒来,完全不像是第一阶段的时候学习语言的那种情况。一般来说,从第三阶段过渡到第四阶段是比较困难的。为什么会难呢?这就是因为很多人的思想变不过来。
第五阶级
此阶段就已经不再局限于简单的技术上的问题了,而是能从全局上把握和设计一个比较大的系统体系结构,从内核到外层界面。可以说是“手中无剑,心中有剑”。到了这个阶段以后,能对市面上的任何软件进行剖析,并能按自己的要求进行设计,就算是MS Word这样的大型软件,只要有充足的时间,也一定会设计出来。
第六阶级
此阶段也是最高的境界,达到“无招胜有招”。这时候,任何问题就纯粹变成了一个思路的问题,不是用什么代码就能表示的。也就是“手中无剑,心中也无剑”。
此时,对于练功的人来说,他已不用再去学什么少林拳,只是在旁看一下少林拳的对战,就能把此拳拿来就用。这就是真正的大师级的人物。这时,Win 32或Linux在你眼里是没有什么差别的。
每一个阶段再向上发展时都要按一定的方法。第一、第二个阶段通过自学就可以完成,只要多用心去研究,耐心地去学习。
要想从第二个阶段过渡到第三个阶段,就要有一个好的学习环境。例如有一个高手带领或公司里有一个好的练手环境。经过二、三年的积累就能达到第三个阶段。但是,有些人到达第三个阶段后,常常就很难有境界上的突破了。他们这时会产生一种观念,认为软件无非如此,认为自己已无所不能。其实,这时如果遇到大的或难些的软件,他们往往还是无从下手。
现在我们国家大部分程序员都是在第二、三级之间。他们大多都是通过自学成才的,不过......
打印1+11+111+1111+11111=(2005-08-13 16:26:00)
摘要:问题: 打印1+11+111+1111+11111= 2+22+222+2222+22222= .................... 9+99+999+9999+99999=#include int main(){ int i, j, n, sum=0; for(i = 1;i <= 9;i++){ sum = 0; for(j = 0,n = 0; j < 5; j++){ n *= 10; n += i; sum += n; if(j == 4) printf("%d = ",n); else printf("%d+",n); } printf("%d\n",sum); } getchar(); return 0; }结果如下:1+11+111+1111+11111=123452+22+222+2222+22222=246903+33+333+3333+33333=370354+44+444+4444+44444=493805+55+555+5555+55555=617256+66+666+6666+666......
(转)关于指针及数组的基本概念问题(2005-08-13 14:44:00)
摘要:原贴: http://www.programfan.com/club/showbbs.asp?id=95120xiangyu138的答复
回答网友的问题:主题:关于指针及数组的基本概念问题1.请问如下的函数参数定义是不是相等的,用指针做参数有什么意义Node(double *xyz) { x = xyz[0]; y = xyz[1]; z = xyz[2]; }Node(double xyz[3]) { x = xyz[0]; y = xyz[1]; z = xyz[2]; }答:两者是相等的,而且第一种其实更标准,因为第二种也是转化为第一种。在函数形式参数里是没有数组的,都被转化为指针了。所以这时在函数里面没有办法通过像:sizeof(xyz)/sizeof(xyz[0])来取得数组元素的个数(因为根本就不是数组),所以一般还要传递一个数组元素个数的值,否则编这个函数的人不知道你原来的数组个数是多少。如:Node(double xyz[],int n) { x = xyz[0]; y = xyz[1]; z = xyz[2]; }
2.单看double *xyz 的定义,是不是数或数组都可以传递。但是看了{ x = xyz[0]; y = xyz[1]; z = xyz[2]; }这个具体实现所以才知道要传递一个数组过来?答:这个完全错,是看形式参数double *xyz 就知道要传递一个一次指针(一次地址)过来,你要是传数值就会出错的,而且不能传二次指针如:char **argv;的argv。
3.请问 main(int argc,char **argv)这里面的char **argv 具体是表示的是什么意思,传递参数进来时,是应该传递一个指针还是其他,谢谢!答:char **argv 是二次指针,也就是二次地址的意思,就是地址的地址(本身地址也是一个二进制数,它也需要一个地址来保存的哦)。可以传char *aa[];这个是指针数组(也就是数组的元素是指针),或者是二次指针char **a。
**************************1.那为什么我看大部分都喜欢用指针而不直接用数组呢?我觉得用数组定义的很清楚啊答:随便你了,没有所谓的大部分的,其实两者的速度差不多的。3.传 char* p[3] = { "abc", "1234567......
