博文

用vector取代C-style的数组 (2007-11-18 15:20:00)

摘要:用vector取代C-style的数组     提起数组,大家想必都很熟悉,你可以用索引和指针来操作数组,给程序设计带来了很大的灵活性。但是你知道它有许多天生的缺陷吗?     首先,数组的越界可能会引起程序的崩溃(如果崩溃了,还算你走运^_^)。其次是动态性不好,包括动态改变大小,动态申请。诸如此类的事,一定会让你伤透脑筋。有什么办法可以解决这些问题吗? 你不用担心,下面我来给大家介绍一种方法:用vector取代C-style的数组。     关于vector我不想多说,我假设大家都了解temlplate 和 STL。各位在任何一本C++的书上都可以找的到这些内容的(如果没有,那赶快把它扔掉)。那为什么是vector呢?我们知道vector提供了operator[]函数,可以像数组一样的操作,而且还有边界检查,动态改变大小。(从这点上deque也是可以的)。vector本来就是可以用来代替一维数组的,这里只介绍用它来代替二维的数组。二维以上的可以依此类推。     我们知道,C++的template参数是可以嵌套定义的,你可以这样定义一个模板的Instance      vector......

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

键盘的背后(2007-11-08 12:17:00)

摘要:按一个键到底发生了多少事?为什么有的驻留程序能够一下子被热键唤醒从后台弹出?听说过一些能够记录按键的软件吗,平时它不声不响躲在后台,可是你敲入的键全都被它记录在一个文件当中!这一切的原理到底是什么? 先让我们来瞧一个程序: #include #include #include void interrupt(*old9)(); void interrupt(*old60)(); void interrupt(*old61)(); void interrupt(*old78)(); void interrupt(*new61)(); void interrupt new9() { (*old9)(); /* 调用原09H 中断 */ sound(2227); delay(100); nosound(); } void interrupt new60() /* 恢复原向量,由卸载程序使用*/ { setvect(0x9,old9); setvect(0x60,old60); setvect(0x61,old61); setvect(0x78,old78); } void interrupt new78() { /*空函数,起防止多次驻留用*/ } void main(void) { old61=getvect(0x61);/*保存原0x61中断向量*/ old78=getvect(0x78);/*保存原0x78中断向量*/ old60=getvect(0x60);/*保存原0x60中断向量*/ old9=getvect(0x9);/*保存原0x9中断向量*/ if(old78!=0) { printf("程序已经驻留在内存!"); return; } new61=_psp;/*设置new61中断地址为程序段前缀,供卸载程序使用*/ setvect(0x61,new61); /*设置新0x61中断向量*/ setvect(0x9,new9); /*设置新0x9中断向量*/ setvect(0x60,new60);/*设置新0x60中断向量*/ setvect(0x78,new78);/*设置新0x78中断向量*/ printf("已完成驻留!"); keep(0,900......

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

r进制数据的倒序(2007-11-03 14:25:00)

摘要:#include <cstdlib>#include <iostream> using namespace std; // 把 一个二进制数 倒序怎么 实现呀?比如 111000110  --> 011000111// 把一个r进制的数 n(r进制数据对应的十进制数据)进行倒序 ,stage 为数据的长度 int inverse(int n,const short stage,short r) {    char temp[stage];    int i=0; do {  temp[i] = n%r; // 取 r 进制数个数位上的值   i++;  n /= r; }while(i<stage);//while(n>0); for(i = 0;i<stage;i++){ // 倒序前         printf("%x",temp[stage-i-1]); } printf("<-->"); for(i = 0;i<stage;i++){ // 倒序后         printf("%x",temp[i]); } int l = 1,nn = 0; for(i = 0;i<stage;i++){        nn += temp[stage-i-1]*l;        l *= r; // 权值  }  return nn;} int main(int argc, char *argv[]){    int n,nn;    n = 234;    nn = inverse(n,......

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

DIT FFT2 改进版(2007-11-02 23:14:00)

摘要:/* Dev-C++ 4.9.9.2 下运行通过 2007.11.2 */// 改进版,(把 1~ Num)  -->  (0~ Num-1)/*****************fft programe*********************/#include<math.h>#include<stdio.h>#include<stdlib.h>struct complex {    double x;    double y;};#define STAGE  4#define Num   (1<<STAGE) double result[Num];struct complex s[Num];const double PI = 3.14159265358979323846; /* b1 ,b2 相乘的结果 b3 */struct complex EE(struct complex b1,struct complex b2){    struct complex b3 ;    b3.x=b1.x*b2.x-b1.y*b2.y ;    b3.y=b1.x*b2.y+b1.y*b2.x ;    return(b3);}/* M_PI=3.14159265358979323846 为math.h 中定义的 pi 值 */     void FFT(struct complex *xin,int N){    int f,m,i,k,j,l ;        struct complex v,w,t ;        /*变址运算*/    for(j=0,i=0;i<N-1;i++)    {    ......

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

DIT FFT2 示例(2007-11-02 22:35:00)

摘要:/* Dev-C++ 4.9.9.2 下运行通过 2007.11.2 */// /*****************fft programe*********************/#include<math.h>#include<stdio.h>#include<stdlib.h> struct complex {    double x;    double y;}; #define Num 32 double result[Num+1];struct complex s[Num+1]; const double PI = 3.14159265358979323846; /* b1 ,b2 相乘的结果 b3 */struct complex EE(struct complex b1,struct complex b2){    struct complex b3 ;    b3.x=b1.x*b2.x-b1.y*b2.y ;    b3.y=b1.x*b2.y+b1.y*b2.x ;    return(b3);}/* M_PI=3.14159265358979323846 为math.h 中定义的 pi 值 */     void FFT(struct complex *xin,int N){    int f,m,nv2,nm1,i,k,j=1,l ;    /*int f,m,nv2,nm1,i,k,j=N/2,l;*/    struct complex v,w,t ;    nv2=N/2 ;    f=N ;    for(m=1;(f=f/2)!=1;m++) /* N=2^m */    {       ......

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

基4FFT(DIF)代码(2007-11-02 17:54:00)

摘要:/**** fft programe ***** Dev-C++ 4.9.9.2 ************/// 02-11-07 17:51/* 修改 radix 使循环控制完全取决于级数,为流水工作做准备 */ // 用不同的 RAM 存储中间结果 ,单此时仍旧是"原位",需要修改保证每次从不同的RAM读取一个数据 #include<math.h>#include<stdio.h>#include<stdlib.h> #define STAGE 2 #define DISPLAY 1#define Num (1<<STAGE*2)#if DISPLAY    int count = 0;#endif#define START 0    #define END 8        #define WINTH   ((1<<15)-1)#define F(t)  ((int)(WINTH*t)&0xffff)double result[Num];double x[STAGE+1][Num],y[STAGE+1][Num];double TAB[Num*2];const double PI = 3.14159265358979323846; const double EI = PI*2/Num;void rad4(double x0[],double y0[],double x1[],double y1[],double TAB[],                 int i,int n2,int adr1,int adr2,int adr3){    int i1,i2,i3;    double co1,co2,co3,si1,si2,si3;    double r1,r2,r3,r4,s1,s2,s3,s4;&......

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

基4FFT 核心模块代码(2007-11-02 16:52:00)

摘要:void radix4(double x[],double y[],double TAB[],int n) { int i,j,k,e,n1,n2; int a,b,c; // n2=n; // e=1;/* 1 -- n 有效 */ for(k=0;k> (2*k); n2 = n1 >> 2; e = 1 ......

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

函数--用卡丹公式解一元三次方程(2007-10-31 13:05:00)

摘要:#include <iostream.h>#include <stdio.h>#include <math.h> //////////////////函数--用卡丹公式解一元三次方程/////////////////void fun(double a,double b,double c,double d,   double *real_y1,double *real_y2,double *real_y3,   double *imag_y1,double *imag_y2,double *imag_y3){ double p,q,r,u,v,g,h,fai; p=(3.0*a*c-b*b)/(3*a*a); q=(2.0*pow(b,3.0)-9*a*b*c+27.0*a*a*d)/(27.0*pow(a,3.0)); r=b/(3.0*a); h=pow(q/2.0,2.0)+pow(p/3.0,3.0); g=sqrt(h); if(h>=0) {  if(-q/2.0+g<0)  u=-pow(fabs(-q/2.0+g),1.0/3.0);  else  u=pow((-q/2.0+g),1.0/3.0);  if(-q/2.0-g<0)  v=-pow(fabs(-q/2.0-g),1.0/3.0);  else  v=-pow((-q/2.0-g),1.0/3.0);  if(h==0)  {   *real_y1=u+v-r;            *imag_y1=0;      *real_y2=-(u+v)/2-r;       *imag_y2=0;   *real_y3=-(u+v)/2-r;  ......

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

progma 语法(2007-10-25 14:08:00)

摘要:progma 是一个C语言中的预处理指令,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。其格式一般为: #pragma Para其中Para 为参数,下面来看一些常用的参数。 (1)message 参数。 Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:#Pragma message(“消息文本”)当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法#ifdef _X86#Pragma message(“_X86 macro activated!”)#endif当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_X86 macro activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。 (2)另一个使用得比较多的pragma参数是code_seg。格式如:#pragma code_seg( ["section-name"[,"section-class"] ] )它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。 (3)#pragma once (比较常用)只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。 (4)#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。 有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smart_init) ,BCB就会根据优先级的大小先后编译。 (5)#pragma resource "*.dfm"表示把......

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

五子棋(人机对战)(2007-10-23 22:53:00)

摘要:/***************************************************************************************\          modify at  2006.3.28\***************************************************************************************/#include <graphics.h>#include <stdio.h>#include <malloc.h>#include <time.h>#include <math.h>#include <stdlib.h> #include <mousea1.h> #define  MAX  15#define  OFFSET  8      /* 14*14=196<2^8-1=255 偏移8位足够,而优先级最大也是16 */#define  PAN_X 125      /*棋盘初始位置,左上角坐标(125,75) */#define  PAN_Y 75 #define  COMPUTER  1    /*计算机棋子 */#define  PLAYER    2    /*玩家棋子   */int qp[MAX][MAX];       /*定义棋盘   */int iswin;              /*输赢标记,1=计算机胜,2=玩家胜,0=未分胜负;*......

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