ImageVerifierCode 换一换
格式:DOCX , 页数:41 ,大小:86.60KB ,
资源ID:7326184      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7326184.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(培训用C面试经典题目.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

培训用C面试经典题目.docx

1、培训用C面试经典题目以下是求一个数的平方的程序,请找出错误: #define SQUARE(a)(a)*(a) int a=5; int b;b=SQUARE(a+);请问下面程序有什么错误?#define Max_CB 500 void LmiQueryCSmd(Struct MSgCB * pmsg) unsigned char ucCmdNum; . for(ucCmdNum=0;ucCmdNumMax_CB;ucCmdNum+) .; 死循环(unsigned char 0 到 255)19.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。循环

2、链表,用取余操作做#include #define NULL 0#define TYPE struct stu#define LEN sizeof (struct stu)struct stu int data; struct stu *next; ;TYPE *line(int n) int sum=1; struct stu *head,*pf,*pb; int i; for(i=0;idata=sum; if (i=0) pf=head=pb; else pf-next=pb; if (i=(n-1) pb-next=head; else pb-next=NULL; pf=pb; sum

3、+; return(head); main() int M,N,x,i; struct stu *p,*q; printf(please scanf M and N (MN); scanf(%d %d,&M,&N); p=line(N); x=N; while(x) for(i=1;inext; q=p-next; printf(%dn,q-data) ; p-next = p-next-next; p=p-next; free(q) ; x-; getch(); 2、有一个16位的整数,每4位为一个数,写函数求他们的和。解释:整数110101*1和 1101+0101+1011+0111感觉

4、应该不难,当时对题理解的不是很清楚,所以写了一个函数,也不知道对不对。疑问: 既然是16位的整数,110101*1是2进制的,那么函数参数怎么定义呢,请大虾指教。答案:用十进制做参数,计算时按二进制考虑。/* n就是16位的数,函数返回它的四个部分之和 */char SumOfQuaters(unsigned short n) char c = 0; int i = 4; do c += n & 15; n = n 4; while (-i); return c;3、有1,2,.一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),使用交换,而且一次只能交换两个数.

5、(华为)#includeint main() int a = 10,6,9,5,2,8,4,7,1,3; int len = sizeof(a) / sizeof(int); int temp; for(int i = 0; i len; ) temp = aai - 1;aai - 1 = ai;ai = temp;if ( ai = i + 1) i+; for (int j = 0; j len; j+) coutajnext;while(q!=NULL)r=q-next;q-next=p;p=q;q=r;head-next=NULL;head=p;return head;9、写出下列代

6、码的输出内容 #include int inc(int a) return(+a); int multi(int*a,int*b,int*c) return(*c=*a*b); typedef int(FUNC1)(int in); typedef int(FUNC2) (int*,int*,int*); void show(FUNC2 fun,int arg1, int*arg2) FUNC1 p=&inc; int temp =p(arg1); fun(&temp,&arg1, arg2); printf(%dn,*arg2); main() int a; /局部变量a为0; show(m

7、ulti,10,&a); return 0; 答:110 10、请找出下面代码中的所有错误 (题目不错,值得一看)说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba” #includestring.h main() char*src=hello,world; char* dest=NULL; int len=strlen(src); dest=(char*)malloc(len); char* d=dest; char* s=srclen; while(len-!=0) d+=s-; printf(%s,dest); return 0; 答: 方法1:一共有4个错误; int

8、 main() char* src = hello,world; int len = strlen(src); char* dest = (char*)malloc(len+1);/要为分配一个空间 char* d = dest; char* s = &srclen-1; /指向最后一个字符while( len- != 0 ) *d+=*s-; *d = 0; /尾部要加0 printf(%sn,dest); free(dest); / 使用完,应当释放空间,以免造成内存汇泄露 dest = NULL; /防止产生野指针return 0; 方法2: (方法一需要额外的存储空间,效率不高.)不错

9、的想法#include #include main()char str=hello,world;int len=strlen(str);char t;for(int i=0; ilen/2; i+)t=stri; stri=strlen-i-1; /小心一点strlen-i-1=t;printf(%s,str);return 0;1. 用宏定义写出swap(x,y)答#define swap(x, y)x = x + y;y = x - y;x = x - y;2.数组aN,存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:int do_

10、dup(int a,int N)答:int do_dup(int a,int N) /未经调试 int sun = 0; int sum2; for(int i=0;iN;+i) Sum+=ai; Sum2 = (1+N-1)*N/2; Return (sum-sum2); 下述三个有什么区别?char * const p;char const * pconst char *p解答:char * const p; /常量指针,p的值不可以修改char const * p;/指向常量的指针,指向的常量值不可以改const char *p; /和char const *p3. 解释下列输出结果ch

11、ar str1 = abc;char str2 = abc;const char str3 = abc;const char str4 = abc;const char *str5 = abc;const char *str6 = abc;char *str7 = abc;char *str8 = abc;cout ( str1 = str2 ) endl;cout ( str3 = str4 ) endl;cout ( str5 = str6 ) endl;cout ( str7 = str8 ) (Y)?(Y):(X) /结尾没有;1.有以下表达式:int a=248; b=4;int c

12、onst c=21;const int *d=&a;int *const e=&b;int const *f const =&a;请问下列表达式哪些会被编译器禁止?为什么?答:*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;*c 这是个什么东东,禁止*d 说了是const, 禁止e = &a 说了是const 禁止const *f const =&a; 禁止 4.#include #include void getmemory(char *p)p=(char *) malloc(100);int main( )char *str=NULL;getmemory(str);

13、strcpy(p,hello world);printf(%s/n,str);free(str);return 0;答: 程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险3. 数组越界问题 (这个题目还是有点小险的)下面这个程序执行后会有什么错误或者效果:#define MAX 255int main()unsigned char AMAX,i;for (i=0;i=MAX;i+)Ai=i;解答:MAX=255,数组A的下标范围为:0.MAX-1,这是其一,其二 当i循环到255时,循环内执行: A255=255;这句本身没有问题,但是返回for

14、 (i=0;ihigh) return -1;mid=(low+high)/2;if(x=amid) return mid;if(xamid) return(BSearch(a,x,low,mid-1);else return(BSearch(a,x,mid+1,high);2) 非递归方法实现:int BSearch(elemtype a,keytype key,int n)int low,high,mid;low=0;high=n-1;while(low=high) mid=(low+high)/2;if(amid.key=key) return mid;else if(amid.keyk

15、ey) low=mid+1;else high=mid-1;return -1;1.找错题试题2:void test2()char string10, str110;int i;for(i=0; i10; i+)str1i = a;strcpy( string, str1 ); 试题3:void test3(char* str1)char string10;if( strlen( str1 ) = 10 )strcpy( string, str1 ); 库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:2分void strcpy( cha

16、r *strDest, char *strSrc ) while( (*strDest+ = * strSrc+) != ); 4分void strcpy( char *strDest, const char *strSrc ) /将源字符串加const,表明其为输入参数,加2分 while( (*strDest+ = * strSrc+) != ); 7分void strcpy(char *strDest, const char *strSrc) /对源地址和目的地址加非0断言,加3分assert( (strDest != NULL) & (strSrc != NULL) );while(

17、(*strDest+ = * strSrc+) != ); 10分/为了实现链式操作,将目的地址返回,加3分!char * strcpy( char *strDest, const char *strSrc ) assert( (strDest != NULL) & (strSrc != NULL) );char *address = strDest; while( (*strDest+ = * strSrc+) != ); return address; 从2分到10分的几个答案我们可以清楚的看到,小小的strcpy竟然暗藏着这么多玄机,真不是盖的!需要多么扎实的基本功才能写一个完美的str

18、cpy啊!再看看下面的一段程序有什么错误:swap( int* p1,int* p2 )int *p;*p = *p1;*p1 = *p2;*p2 = *p; 在swap函数中,p是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在VC+中DEBUG运行时提示错误“Access Violation”。该程序应该改为:swap( int* p1,int* p2 )int p;p = *p1;*p1 = *p2;*p2 = p; 试题3:写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事?least = MIN(*p+, b); 解答:#defi

19、ne MIN(A,B) (A) = (B) ? (A) : (B) MIN(*p+, b)会产生宏的副作用剖析:这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换。程序员对宏定义的使用要非常小心,特别要注意两个问题:(1)谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。所以,严格地讲,下述解答:#define MIN(A,B) (A) = (B) ? (A) : (B)#define MIN(A,B) (A = B ? A : B ) 都应判0分;(2)防止宏的副作

20、用。宏定义#define MIN(A,B) (A) = (B) ? (A) : (B)对MIN(*p+, b)的作用结果是:(*p+) = (b) ? (*p+) : (*p+)这个表达式会产生副作用,指针p会作三次+自增操作。除此之外,另一个应该判0分的解答是:#define MIN(A,B) (A) = (B) ? (A) : (B); 这个解答在宏定义的后面加“;”,显示编写者对宏的概念模糊不清,只能被无情地判0分并被面试官淘汰。试题5:编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh” 函数头是这

21、样的:/pStr是指向以结尾的字符串的指针/steps是要求移动的nvoid LoopMove ( char * pStr, int steps )/请填充. 解答:正确解答1:void LoopMove ( char *pStr, int steps )int n = strlen( pStr ) - steps;char tmpMAX_LEN; strcpy ( tmp, pStr + n ); strcpy ( tmp + steps, pStr); *( tmp + strlen ( pStr ) ) = ;strcpy( pStr, tmp ); 正确解答2:void LoopMov

22、e ( char *pStr, int steps )int n = strlen( pStr ) - steps;char tmpMAX_LEN; memcpy( tmp, pStr + n, steps ); memcpy(pStr + steps, pStr, n ); memcpy(pStr, tmp, steps ); 剖析:这个试题主要考查面试者对标准库函数的熟练程度,在需要的时候引用库函数可以很大程度上简化程序编写的工作量。最频繁被使用的库函数包括:(1) strcpy(2) memcpy(3) memsetFuYu注释:这两种方法都很业余,都是算法能力差的人给出的答案,都要用char tmpMAX_LEN 这么多辅助空间,“MAX_LEN”是多么好笑的用法。标准答案是对倒、对倒、再对倒。试题1:请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1解答:int checkCPU()union w int a;char b; c;c.a = 1;retu

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1