博文

_getch()的用法(2006-01-10 16:36:00)

摘要:_getch()的用法 _getch():注意开头的下划线,包含头文件conio.h。_getch()有些键也是不能读入,而且,当输入箭头时回显ffffffe0,不懂为什么。#include <conio.h>#include <stdio.h>int main(){    char c;    while(c = _getch()){        printf("%x\n",c);        switch(c){        case 0x48:            printf("UP\n");            break;        case 0x4b:            printf("Left\n");            break;        case 0x4d:            printf("Right\n");          ......

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

&&与||解析(2006-01-07 14:43:00)

摘要:&&逻辑与,||逻辑或,逻辑运算符,同优先级。其意义如下:A&&B——只有当A、B都为真时,该表达式值才为真;A||B——只有当A、B都为假时,表达式值才为假。 特别注意(似乎是C进行的优化):对于表达式A||B,当A为真时,将不对B进行判断,因为整个表达时的值已经确定了,为真;而对于表达式A&&B,当A为假时,将不对B进行判断,因为整个表达时的值已经确定了,为假。 看如下语句:x=y=z=-1;++x||++y&&++z;++x,值为0,x值也为0;接下来是||,还要对后面进行判断,++y,值为0,y值也为0;接下来是&&,不再进行判断,整个表达式的值为0,z的值仍为-1。故执行完后,x=0,y=0,z=-1 x=y=z=-1;++x&&++y||++z;++x,值为0,x值也为0;接下来是&&,不对紧跟表达式进行判断,y值仍为-1;接下来是||,要对后面进行判断,++z,z的值为0,整个表达式的值为0。故执行完后,x=0,y=-1,z=0看如下程序:#include <stdio.h>int main(){ int x,y,z;  x=y=z=-1; ++x||++y&&++z; printf("x=%d\ty=%d\tz=%d\n",x,y,z);  x=y=z=-1; ++x&&++y||++z; printf("x=%d\ty=%d\tz=%d\n",x,y,z);  return 0;}其输出结果为:x=0     y=0     z=-1x=0     y=-1    z=0......

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

指针本质论(2006-01-06 21:16:00)

摘要: 指针本质论   指针是一个变量,是用来存储地址的变量。这就是指针的本质。  有人可能很纳闷,指针为什么一定要定义成某类型(int, char)呢,不能就是“指针类型”吗?接触过汇编的就容易理解为什么。存储单元的单位是字节,对一个地址进行操作(读取或赋值)就要指明是对单个字节、两个字节、还是双字(四字节)。同样,指针是存储地址的,说白了,指针就是一个地址,自然也要说明了;而且,这个类型还关乎指针自加自减时真正加减的字节数。    顺便说一下,数组名也是指针,数组在申请空间时数组名存储该存储空间的首地址,注意数组名存储的是地址,因此也是指针,只是该指针一旦赋值后就不能修改,即所谓常指针。***************************  如下函数希望为指针p申请空间,但不能达到目的,为什么呢?void GetMemory(char *p){    char *s=NULL;    s= (char*)malloc(100*sizeof(char));     p=s;}  归根结底,C函数形参实参之间只是“值传递”:当形参是普通变量时,传递的是实参的值;当形参是指针时,传递的是指针变量的值,即某变量的地址,这样,可以通过指针成功的改变其所指单元的值,但自身的改变不会传回给实参。上例可改为:void GetMemory(char **p){    char *s=NULL;    s= (char*)malloc(100*sizeof(char));     *p=s;}注意这样修改后,调用时实参应该是指针的“地址”(或指向指针的指针)。  见下例,Test函数可以成功修改a[0]的值,尽管形参a的值发生了变化,但不会改变实参a的值,这就说明指针形参的改变不影响指针实参的改变,但通过形参指针修改了其所对应的存储单元的值是,这改变将影响到实参。#include <iostream>using namespace std;void Test(int *a){ *(a++) = 5; //该函数真正所做的修改:将a所指存储空间的值赋为5,并将a值加1 cou......

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

[收藏]趣题妙答(2006-01-06 20:33:00)

摘要:原体由tiaohui发表http://www.programfan.com/club/showbbs.asp?id=135189 A,B,C,D,E,F,G,H 八人站成一排,按图所示的方法从1开始报数。问谁先报到19431005?          A      B    C     D     E     F     G     H          1——>2——>3——>4——>5——>6——>7——>8         15<—14<——13<——12<—11<——10<—9<——         ——>16——> bruceteen的解答(超赞啊!!!) #include using namespace std;int main( void ){    unsigned n = 19431005;    n = (n-1)%14;    if( n > 7 ) n = 14-n;    char c = 'A'+(char)n;    cout << c << endl;}答案是 C 。 FancyMouse......

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

快速排序(2006-01-04 16:47:00)

摘要:快速排序  基本思想:通过一趟排序将待排序的记录分割为独立的两部分,其中一部分记录的关键字均比另一部部分记录的关键字小,然后再分别对这两部分记录继续进行排序,已达到整个序列有序。  以趟快速排序的具体做法是:附设两个指针low和high,它们的初值分别指向文件的第一个记录和最后一个记录。设枢轴记录(通常是第一个记录)的关键字为pivotkey,则首先从high所指位置起向前搜索,找到第一个关键字小于pivotkey的记录并与枢轴记录互相交换,然后从low所指位置向后搜索,找到第一个关键字大于pivotkey的记录并与枢轴记录互相交换,重复这两步直到low=high。例:82 16 9 95 27 75 42 69 34 进行快速排序的过程注:[]表示该步交换的两记录,()表示已趟排序结束后所分割出的的两部分,||表示pivotkey原始数据:82 16 9 95 27 75 42 69 34第一趟排序:p=82[34]16 9  95  27 75 42  69 [82] 34  16 9 [82]27 75 42  69 [95] 34  16 9 [69]27 75 42 [82] 95结果为:(34 16 9 69 27 75 42)|82|(95)第二趟排序:两部分分别排序,后半部分不用再排了。前半部分p=34[27]16 9  69 [34] 75 42 |82| 9527 16 9 [34][69] 75 42 |82| 95结果为:(27 16 9)|34|(69 75 42)|82| 95第三趟排序:对第一个括号p=27[9]16[27]|34|(69 75 42)|82| 95结果:(9)|16|(27)|34|(69 75 42)|82| 95对第二个括号p=699 |16| 27 |34|[42] 75 [69] |82| 959 |16| 27 |34| 42 [69][75] |82| 95结果:9 |16| 27 |34| (42)|69|(75)|82| 95最终结果为:9 |16| 27 |34| 42 |69| 75 |82| 95......

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

[收藏]回文数判断(2006-01-04 14:37:00)

摘要: 编写一个程序判定用户输入的正整数是否是"回文数",所谓回文数是指正读反读都相同的数. 由陵轹发表http://www.programfan.com/club/showbbs.asp?id=134790 #include int main(){ int m, i,j = 0; scanf("%d",&m); i = m; while(m > 0){  j = j * 10 + m % 10;  m /= 10; } if(i == j)printf("Is"); else printf("NO");  return 0;}; ***************************http://www.programfan.com/club/showbbs.asp?id=135071 回文数是从左边往右读或者从右边往左读都一样的数比如 1, 121,12321,33433,123454321编程求从1开始的第n个回文数f(1) = 1f(2) = 2...f(9)=9f(10)=11f(11)=22... f(24)=151f(10000)=9001009.......输入一个正整数 n 输出这个回文数。pcboyxhy的答案(不懂~~~~)#include <iostream.h>int main(int argc, char *argv[]){  long long n, k, l;  while(cin>>n)  {      if(!n)          break;      for(l=18; n>l; l*=10) n-=l;      l/=2;k=1;     ......

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

[收藏]using namespace std 的用法(2005-12-05 15:12:00)

摘要:using namespace std 的用法 摘自 using namespace std;用的并不少!    ---------------------------------------------------------------  实际上就是告诉编译器,你类型是什么,在哪能找到。  常用的是using  namespace  std,就是说用C++的标准名字空间。  你也可以引用你自己的名字空间。比如说:  import  "C:\\MyTest\\test.tlb"  using  namespace  CMyTest  就可以引用CMyTest内的各个类型名  看C++  prime  ---------------------------------------------------------------  声明该文件使用C++标准库吧!  比如  #include  <iostream>  using  namespace  std;  void  main()  {     cout  <<  "hello!"  <<  endl;  }  如果不用using  namespace  std;这句,那么  std::cout  <<  "hello!"  <<endl;  ......

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

[收藏]C/C++头文件一览(2005-12-05 15:05:00)

摘要:C/C++头文件一览 摘自空中学堂  (wengdr 的 BLOG) C、传统 C++#include <assert.h>    //设定插入点#include <ctype.h>     //字符处理#include <errno.h>     //定义错误码#include <float.h>     //浮点数处理#include <fstream.h>    //文件输入/输出#include <iomanip.h>    //参数化输入/输出#include <iostream.h>   //数据流输入/输出#include <limits.h>    //定义各种数据类型最值常量#include <locale.h>    //定义本地化函数#include <math.h>     //定义数学函数#include <stdio.h>     //定义输入/输出函数#include <stdlib.h>    //定义杂项函数及内存分配函数#include <string.h>    //字符串处理#include <strstrea.h>   //基于数组的输入/输出#include <time.h>     //定义关于时间的函数#include <wchar.h>     //宽字符处理及输入/输出#include <wctype.h>    //宽字符分类//////////////////////////////////////////////////////////////////////////标准 C++ (同上的不再注释)#include <algorithm>    //STL 通用算法#include <bitset>     //STL 位集容器#include <cctype>#include <cerrno>#include <clocale>#include <cmath>#include <complex>   ......

阅读全文(2895) | 评论:2

[收藏]C++中获得当前系统时间(2005-12-05 14:57:00)

摘要:C++中获得当前系统时间 摘自 空中学堂  (wengdr 的 BLOG)http://blog.programfan.com/article.asp?id=7472 //方案— 优点:仅使用C标准库;缺点:只能精确到秒级 #include #include int main( void ) {     time_t t = time( 0 );     char tmp[64];     strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A 本年第%j天 %z",localtime(&t) );     puts( tmp );     return 0; } //方案二 优点:能精确到毫秒级;缺点:使用了windows API #include #include int main( void ) {  SYSTEMTIME sys;  GetLocalTime( &sys );  printf( "%4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d\n",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek);   return 0;} //方案三,优点:利用系统函数,还能修改系统时间 #include#include using namespace std;void main(){    system("time");} //方案四,将当前时间折算为秒级,再通过相应的时间换算即可 #include#includeusing namespace std; int main(){ time_t now_time; now_time = time(NULL); cout<......

阅读全文(6901) | 评论:2

[收藏]简单俄罗斯方块教程(2005-11-14 16:38:00)

摘要:nully  http://www.programfan.com/club/showbbs.asp?id=120594 /*先写原理:    本次的俄罗斯方块代码出其的简单,比我去年写的四十几K要小得多实际上核心代码只有3-4K,而且很容易理解,适合有一点C语言基础并对此有兴趣的人.    这前面只粗略讲解核心算法:    这里把游戏的关键设计放在三个盒子和一个坐标上:    大盒子:一个两维数组,记录着方块点阵的开与关(把游戏的舞台想像成一个点阵),在下面也把这个东西称为地图    两个5*5小盒子:两维数组,一个盛放着正在下落的方块,一个盛放在下一个下落的方块(即next),当然这两个也必须想像成一个点阵:如长条的点阵为:      00000      00100      00100      00100      00100    现在你只要有这么一个概念:一个不断定时下落的小盒子从大盒子顶部下降到底部,之后再将next盒子放在下落盒子,再进行下一轮的下落...中间的控制等尚不要太着急.    现在面临着一个问题:    下落的盒子和地图之间要怎么联系起来?一个好的方法是再定义一个坐标:x,y,保存着小盒子左上角在地图上对应的下标(位置),即当x = 0, y = 0时,小盒子处于地图的左上部.如此,当小盒子需要移动时,即只须要改变x,y的值.    现在说说旋转.    小盒子保存着当前下落形状的点阵,那么旋转就只须要将这个点阵旋转90度:例如:00000......

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