博文

四色定理源程序(2006-12-05 21:30:00)

摘要:#include<stdio.h> #define N 10 void output(int color[])/*输出一种着色方案*/ { int i ; for ( i = 0 ; i < N ; i++ ) printf( "%4d" , color[i] ) ; printf( "\n" ) ; } int back( int *ip ,int color[] ) /*回溯*/ { int c = 4 ; while ( c == 4 ) { if ( *ip <= 0 ) return 0 ; --(*ip) ; c = color[*ip]; color[*ip] = -1 ; } return c ; } /*检查区域i,对c种颜色的可用性*/ int colorok( int i , int c , int adj[][N] , int color[ ] ) { int j ; for ( j = 0 ; j < i ; j++ ) if (adj[i][j] != 0 && color[j] == c) return 0 ; return 1 ; } /*为区域i选一种可着的颜色*/ int select( int i ,int c ,int adj[][N] , int color[ ] ) { int k ; for ( k = c ; k <= 4 ; k++ ) if ( colorok(i,k,adj,color) ) return k ; return 0 ; } int coloring( int adj[][N] ) /*寻找各种着色方案*/ { int color[N] , i , c , cnt ; for ( i = 0 ; i < N ; i++ ) color[i] = -1 ; i = c = 0 ; cnt = 0 ; while ( 1 ) { if ( ( c =select (i,c+1,adj,color) ) == 0 ){ c = back( &i , color) ; if ( c == 0) return cnt ; } else { color[i]=c; i++ ; if ( i == N ) { output(color) ; ++c......

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

逗号表达式(2006-12-03 21:37:00)

摘要:逗号表达式的形式如下:  表达式1,表达式2,表达式3,...... ,表达式n 逗号表达式的要领:(1) 逗号表达式的运算过程为:从左往右逐个计算表达式。(2) 逗号表达式作为一个整体,它的值为最后一个表达式(也即表达式n)的值。(3) 逗号运算符的优先级别在所有运算符中最低。 例题1:若已定义x和y为double类型,则表达式:x=1,y=x+3/2的值是   A) 1  B) 2 C) 2.0 D) 2.5   分析:该表达式是一个逗号表达式,所以先运算x=1,结果变量x中的值为1.0,然后运算y=x+3/2,其结果是变量y中的值为2.0(这个运算过程可参阅本专题的“整数除法的注意事项”),注意此时表达式y=x+3/2的值即等于变量y的值为2.0。最后,整个逗号表达式的值应该等于最后一个表达式的值2.0,所以,正确答案是C)。  注:该题曾在1998年4月和2000年9月的二级C考试中两次出现过。 例题2:若t为double类型,表达式t=1,t+5,t++的值是   A) 1 B) 6.0 C) 2.0 D) 1.0   分析:该题的表达式也是一逗号表达式,运算过程同例题1。需要注意的是,其中的第二个表达式(t+5)对整个表达式的运算结果不产生任何影响,因为它没有改变变量x的值(x的值仍为1.0),最后一个表达式(t++)的值为变量x进行自增运算前的值1.0,所以整个表达式的值也为1.0。  注:这是1998年4月二级C考试中的一道选择题。 例题3:有如下函数调用语句 func(rec1,rec2+rec3,(rec4,rec5)); 该函数调用语句中,含有的实参个数是  A)3  B)4 C)5 D)有语法错误   分析:C语言规定,函数调用时实参与实参之间是用逗号隔开的,所以,本题的函数调用语句中包含3个实参,其中第一个实参是rec1,第二个实参是rec2+rec3,第三个实参是(rec4,rec5),这里的第三个实参就是一个逗号表达式,根据逗号表达式的运算规则,第三个实参的值应该等于rec5的值。  注:这是2000年9月二级C考试中的一道选择题。 例题4:有如下函数调用语句 fun(a+b,(x,y),fun(n+k,d,(a,b))); 在此函数调用语句中实参的个数是  A)3  B)4 C)5 D)6 正确答案应该是A)。注:这......

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

笔试题目汇总(2006-11-21 22:29:00)

摘要:第一篇 笔试题目 Intel今年笔试题 ●第一道是一个编译器优化的题目。条件大致说在ZF为0或者不为0的情况下,分别有两条移位指令可以移进去。然后出了两个小题,要你优化。 ●第二道是N个人围成一圈报数,报到某一个数的就出局,问你最后剩下来的那个人的号码。编程题。 ●第三道大致如下: 以下两个程序哪个的performance高,并解释为什么。 a) extern int foo(void); int main() { int i; for(i=0;i<10000;i++) foo(); return i; } b) extern int foo(void); int i; int main() { for(i=0;i<10000;i++) foo(); return i; }    ●智力题 将如下图形(边长相等,即突出的都是正方形)割成几块,再拼成一个正方形,要求最少最少。       ---       |    |  ---     ---  |               |  ---     ---       |    | ---             ● ee试卷考的是电磁场波导,拉式变化,电容器等内容 ●下面的程序是否正确,如正确,给出结果,否则,说明理由。 #include <stdio.h> struct A{ int i; char j; char * ptr; long Array[100]; char b[2]; char * c; }; #define PRINT_ME  (char *)&......

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

C++常见面试题(2006-11-21 22:27:00)

摘要:SIZEOF CONST 预处理题目:1. sizeof相关系列问题 a. 对于 struct s{char a;int b};  sizeof(s) = 8; 因为当结构体内元素长度都小于处理器位数(32位=4字节)的时候,便以结构体中最长的数据元素为对齐条件,a 按 1 字节对齐,b 按 4 字节对齐,所以s默认对其参数为8   struct A{short a1;short a2;short a3};sizeof(A)=6; 原因同上,结构体按最长元素short(2字节对齐)。b. 对于 int a[200]; sizeof(a) = 200* sizeof(int) = 800; 对整个数组大小评测    int* a = new int[200]; sizeof(a) = 4; 对指针大小进行评测    char str[]="012345"; sizeof(str) = 7; str 是一个字符数组,数组最初大小未定,由具体值"012345"来决定,6*sizeof(char) = 6,还有隐含的"\0",所以一共7位。    char str[]="s\n";sizeof(str) = 3; 回车"\n" 是一个字符,可以查看ASCII表。还有\r、\t等等字符c. 这种使用位域的也有,其中元素最大为1字节大小=8 bits,元素按照1字节进行对齐, sizeof(b) = 1 +  1(4 bits+2bits < 8 bits) + 1(3bits) = 3.           struct  b    {        char a:8;        char b:4;        char c:2;   &nbs......

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

C++中虚析构函数的作用 (2006-11-11 10:30:00)

摘要:我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:        有下面的两个类: class ClxBase{public:    ClxBase() {};    virtual ~ClxBase() {};    virtual void DoSomething() { cout << "Do something in class ClxBase!" << endl; };};class ClxDerived : public ClxBase{public:    ClxDerived() {};    ~ClxDerived() { cout << "Output from the destructor of class ClxDerived!" << endl; };     void DoSomething() { cout << "Do something in class ClxDerived!" << endl; };};     代码 ClxBase *pTest = new ClxDerived;pTest->DoSomething();del......

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

关于位结构体和union的一些介绍(2006-11-10 17:22:00)

摘要:在写通讯协议的时候用到有关位结构体和union的相关内容,整理一部分东西: 首先摘一段《C语言编程宝典》上关于位结构体的说明: /*************以下文字摘自《C语言编程宝典》********************/ 位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构 比按位运算符更加方便。     位结构定义的一般形式为:      struct位结构名{           数据类型 变量名: 整型常数;           数据类型 变量名: 整型常数;      } 位结构变量;     其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整 数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。     变量名是选择项, 可以不命名, 这样规定是为了排列需要。     例如: 下面定义了一个位结构。      struct{           unsigned incon: 8;  /*incon占用低字节的0~7共8位*/           unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/           unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/           unsigned blink: 1;&n......

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

C/C++ 试题剖析(5)(2006-11-09 22:58:00)

摘要:试题5:编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh”   函数头是这样的://pStr是指向以'\0'结尾的字符串的指针//steps是要求移动的nvoid LoopMove ( char * pStr, int steps ){ //请填充...}  解答:  正确解答1:void LoopMove ( char *pStr, int steps ){ int n = strlen( pStr ) - steps; char tmp[MAX_LEN];  strcpy ( tmp, pStr + n );  strcpy ( tmp + steps, pStr);  *( tmp + strlen ( pStr ) ) = '\0'; strcpy( pStr, tmp );}  正确解答2:void LoopMove ( char *pStr, int steps ){ int n = strlen( pStr ) - steps; char tmp[MAX_LEN];  memcpy( tmp, pStr + n, steps );  memcpy(pStr + steps, pStr, n );  memcpy(pStr, tmp, steps ); }  剖析:  这个试题主要考查面试者对标准库函数的熟练程度,在需要的时候引用库函数可以很大程度上简化程序编写的工作量。  最频繁被使用的库函数包括:  (1) strcpy  (2) memcpy  (3) memset  试题6:已知WAV文件格式如下表,打开一个WAV文件,以适当的数据结构组织WAV文件头并解析WAV格式的各项信息。  WAVE文件格式说明表   偏移地址 字节数 数据类型 内 容 文件头   00H 4 Char "RIFF"标志 04H 4 int32 文件长度 08H 4 Char "WAVE"标志 0CH 4 Char "fmt"标志 10H 4   过渡字节(不定) 14H 2 int16 格式类别 16H 2 int16 通道数 1......

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

C/C++ 试题剖析(4)(2006-11-09 22:48:00)

摘要:试题1:分别给出BOOL,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为var)  解答:   BOOL型变量:if(!var)   int型变量: if(var==0)   float型变量:   const float EPSINON = 0.00001;   if ((x >= - EPSINON) && (x <= EPSINON)   指针变量:  if(var==NULL)  剖析:  考查对0值判断的“内功”,BOOL型变量的0判断完全可以写成if(var==0),而int型变量也可以写成if(!var),指针变量的判断也可以写成if(!var),上述写法虽然程序都能正确运行,但是未能清晰地表达程序的意思。  一般的,如果想让if判断一个变量的“真”、“假”,应直接使用if(var)、if(!var),表明其为“逻辑”判断;如果用if判断一个数值型变量(short、int、long等),应该用if(var==0),表明是与0进行“数值”上的比较;而判断指针则适宜用if(var==NULL),这是一种很好的编程习惯。  浮点型变量并不精确,所以不可将float变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”形式。如果写成if (x == 0.0),则判为错,得0分。  试题2:以下为Windows NT下的32位C++程序,请计算sizeof的值void Func ( char str[100] ){ sizeof( str ) = ?}void *p = malloc( 100 );sizeof ( p ) = ?  解答:sizeof( str ) = 4sizeof ( p ) = 4  剖析:  Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。  数组名的本质如下:  (1)数组名指代一种数据结构,这种数据结构就是数组;  例如:char str[10];cout << sizeof(str) << endl;  输出结果为10,str指代数据结构char[10]。  (2)数组名可以转换为指向其指代实体的指......

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

C/C++ 试题剖析(3)(2006-11-09 22:46:00)

摘要:试题4:void GetMemory( char *p ){ p = (char *) malloc( 100 );}void Test( void ) { char *str = NULL; GetMemory( str );  strcpy( str, "hello world" ); printf( str );}  试题5:char *GetMemory( void ){  char p[] = "hello world";  return p; }void Test( void ){  char *str = NULL;  str = GetMemory();  printf( str ); }  试题6:void GetMemory( char **p, int num ){ *p = (char *) malloc( num );}void Test( void ){ char *str = NULL; GetMemory( &str, 100 ); strcpy( str, "hello" );  printf( str ); }  试题7:void Test( void ){ char *str = (char *) malloc( 100 ); strcpy( str, "hello" ); free( str );  ... //省略的其它语句}  解答:  试题4传入中GetMemory( char *p )函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完char *str = NULL;GetMemory( str );   后的str仍然为NULL;  试题5中char p[] = "hello world"; return p;   的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期。  试题6的GetMemory避免了试题4的问题,传入GetMemory的参数为字符串指针的指针,但是在GetMemory中执行申请内存及赋值语句*p = (char *) malloc( num );  后未判断内存是否申请成功,应加上:if ( *p == NULL ){ ...//进行申请内存失败处理}  试题7存在与试题6同样的问题,在执行c......

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

C/C++ 试题剖析(2)(2006-11-09 22:44:00)

摘要:试题3:void test3(char* str1){ char string[10]; if( strlen( str1 ) <= 10 ) {  strcpy( string, str1 ); }} if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计’\0’所占用的1个字节。 考查对基本功的掌握:  (1)字符串以’\0’结尾;  (2)对数组越界把握的敏感度;  (3)库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:  2分void strcpy( char *strDest, char *strSrc ){  while( (*strDest++ = * strSrc++) != ‘\0’ );}  4分void strcpy( char *strDest, const char *strSrc ) //将源字符串加const,表明其为输入参数,加2分{  while( (*strDest++ = * strSrc++) != ‘\0’ );}  7分void strcpy(char *strDest, const char *strSrc) { //对源地址和目的地址加非0断言,加3分 assert( (strDest != NULL) && (strSrc != NULL) ); while( (*strDest++ = * strSrc++) != ‘\0’ );}  10分//为了实现链式操作,将目的地址返回,加3分!char * strcpy( char *strDest, const char *strSrc ) { assert( (strDest != NULL) && (strSrc != NULL) ); char *address = strDest;  while( (*strDest++ = * strSrc++) != ‘\0’ );   return address;}   (4)对strlen的掌握,它没有包括字符串末尾的'\0'。  一个10分的strlen函数了,完美的版本为: int strlen( const char *str ) ......

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