博文
四色定理源程序(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......
逗号表达式(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)。注:这......
笔试题目汇总(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 *)&......
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......
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......
关于位结构体和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......
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......
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)数组名可以转换为指向其指代实体的指......
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......
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 ) ......
