![C软件工程师笔试题_第1页](http://file4.renrendoc.com/view/b920a7d1fabbd05672dadd22bb0567da/b920a7d1fabbd05672dadd22bb0567da1.gif)
![C软件工程师笔试题_第2页](http://file4.renrendoc.com/view/b920a7d1fabbd05672dadd22bb0567da/b920a7d1fabbd05672dadd22bb0567da2.gif)
![C软件工程师笔试题_第3页](http://file4.renrendoc.com/view/b920a7d1fabbd05672dadd22bb0567da/b920a7d1fabbd05672dadd22bb0567da3.gif)
![C软件工程师笔试题_第4页](http://file4.renrendoc.com/view/b920a7d1fabbd05672dadd22bb0567da/b920a7d1fabbd05672dadd22bb0567da4.gif)
![C软件工程师笔试题_第5页](http://file4.renrendoc.com/view/b920a7d1fabbd05672dadd22bb0567da/b920a7d1fabbd05672dadd22bb0567da5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、请填写BOOL,float,指针变量与“零值”比较的if语句。(10分)提示:这里“零值”可以是0,0.0,FALSE或者“空指针”。例如int变量n与“零值”比较的if语句为:if(n=0)if(n!=0)以此类推。请写出BOOLflag与“零值”比较的if语句:标准答案:if(flag)if(!flag)如下写法均属不良风格,不得分。if(flag=TRUE)if(flag=1)if(flag=FALSE)if(flag=0)请写出floatx与“零值”比较的if语句:标准答案示例:constfloatEPSINON=0.00001;if(x=-EPSINON)&(x=”或“=”此类形
2、式。如下是错误的写法,不得分。if(x=0.0)if(x!=0.0)请写出char*p与“零值”比较的if语句:标准答案:if(p=NULL)if(p!=NULL)如下写法均属不良风格,不得分。if(p=0)if(p!=0)if(p)if(!)二、以下为WindowsNT下的32位C+程序,请计算sizeof的值(10分)charstr*+=“Hello”;char*p=str;intn=10;sizeof(str)=6sizeof(p)=4sizeof(n)=4voidFunc(charstr100)请计算sizeof(str)=4void*p=malloc(100);请计算sizeof(p
3、)=4三、简答题(25分)1、头文件中的ifndef/define/endif干什么用?防止该头文件被重复引用2、#include和#include“filename.h”有什么区别?答:对于#include,编译器从标准库路径开始搜索filename.h对于#include“filename.h,编译器从用户的工作路径开始搜索filename.h3、const有什么用途?(请至少说明两种)答:(1)可以定义const常量(2)const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。4、在C+程序中调用被C编译器编译
4、后的函数,为什么要加extern“C”声明?答:C+语言支持函数重载,C语言不支持函数重载。函数被C+编译后在库中的名字与C语言的不同。假设某个函数的原型为:voidfoo(intx,inty);该函数被C编译器编译后在库中的名字为_foo,而C+编译器则会产生像_foo_int_int之类的名字。C+提供了C连接交换指定符号extern“C”来解决名字匹配问题。5、请简述以下两个for循环的优缺点for(i=0;iN;i+)if(condition)DoSomething();elseDoOtherthing();/第二个if(condition)for(i=0;iN;i+)DoSometh
5、ing();elsefor(i=0;iN;i+)DoOtherthing();优点:程序简洁缺点:多执行了N-1次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。优点:循环的效率高缺点:程序不简洁四、有关内存的思考题(20分)voidGetMemory(char*p)p=(char*)malloc(100);voidTest(void)char*str=NULL;GetMemory(str);strcpy(str,helloworld);printf(str);请问运行Test函数会有什么样的结果?答:程序崩溃,getmemory中的malloc不能返回动
6、态内存,freeO对str操作很危险博主:getmemory中p是形参,是一个指针变量,getmemory(str)调用后,传入的是指针变量保存的对象地址,p=(char*)malloc(100)实际上是把申请的动态内存空间的首地址付给p指向的地址(即str指向的地址null),这个是错误的。应该修改成指向指针的指针voidgetmemory(char*p),这样malloc返回的地址付给*p(即str变量本身)。char*GetMemory(void)charp=helloworld;returnp;voidTest(void)char*str=NULL;str=GetMemory();pr
7、intf(str);请问运行Test函数会有什么样的结果?答:可能是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是NULL,但其原现的内容已经被清除,新内容不可知。RetMenory执行完毕,p资源被回收,指向未知地址。返回地址,str的内容应是不可预测的,打印的应该是str的地址VoidGetMemory2(char*p,intnum)p=(char*)malloc(num);voidTest(void)char*str=NULL;GetMemory(&str,100);strcpy(str,hello);printf(str);请问运行Test函数会有什么样的结
8、果?答:(1)能够输出hello(2)内存泄漏voidTest(void)char*str=(char*)malloc(100);strcpy(str,“hello”);free(str);if(str!=NULL),strcpy(str,“world”);printf(str);请问运行Test函数会有什么样的结果?答:篡改动态内存区的内容,后果难以预料,非常危险。因为free(str);之后,str成为野指针,五、if(str!=NULL)语句不起作用。五、已知strcpy函数的原型是char*strcpy(char*strDest,constchar*strSrc);其中strDest是
9、目的字符串,strSrc是源字符串。(1)不调用C+/C的字符串库函数,请编写函数strcpy答:char*my_strcpy(char*strdest,constchar*strsrc)assert(strdest!=NULL)&(strsrc!=NULL)char*address=strdest;while(*strdest+=*strsrc+)!=NULL)returnaddress;(2)strcpy能把strSrc的内容复制到strDest,为什么还要char*类型的返回值?答:为了实现链式表达式。/2分例如intlength=strlen(strcpy(strDest,“hello
10、world”);六、编写类String的构造函数、析构函数和赋值函数(25分)已知类String的原型为:classStringpublic:String(constchar*str=NULL);/普通构造函数String(constString&other);/拷贝构造函数String(void);/析构函数String&operate=(constString&other);/赋值函数private:char*m_data;/用于保存字符串;请编写String的上述4个函数。/普通构造函数String:String(constchar*str)if(str=NULL)m_data=newc
11、har1;/得分点:对空字符串自动申请存放结束标志0的空加分点:对m_data加NULL判断*m_data=0;elseintlength=strlen(str);m_data=newcharlength+1;/若能加NULL判断则更好strcpy(m_data,str);/String的析构函数String:String(void)delete口m_data;/或deletem_data;/拷贝构造函数String:String(constString&other)得分点:输入参数为const型intlength=strlen(other.m_data);m_data=newcharleng
12、th+1;/加分点:对m_data力口NULL判断strcpy(m_data,other.m_data);/赋值函数String&String:operate=(constString&other)/得分点:输入参数为const型if(this=&other)/得分点:检查自赋值return*this;deletem_data;/得分点:释放原有的内存资源intlength=strlen(other.m_data);m_data=newcharlength+1;/加分点:对m_data力口NULL判断strcpy(m_data,other.m_data);return*this;/得分点:返回
13、本对象的引用编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。voidResetTheTime(int*year,int*month,int*date,int*hour,int*minute,int*second)intdayOfMonth12=31,28,31,30,31,30,31,31,30,31,30,31;if(*year0|*month12|*date31|*hour23|*minute59|*second60)return;if(*year%400=0|*year%100!=0&*
14、year%4=0)dayOfMonth1=29;if(*second=60)*second=0;*minute+=1;if(*minute=60)*minute=0;*hour+=1;if(*hour=24)*hour=0;*date+=1;if(*datedayOfMonth*month-1)*date=1;*month+=1;if(*month12)*month=1;*year+=1;return;.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?全局变量储存在静态数据库,局部变量在堆栈.static有什么用途?(请至少说明两种).限制变量的作用域2.设置变量的存储域不能做swi
15、tch()的参数类型是:switch的参数不能为实型。如何引用一个已经定义过的全局变量?答:extern可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答:可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错char*ss=0123
16、456789;sizeof(ss)结果4=ss是指向字符串常量的字符指针,sizeof获得的是一个指针的之所占的空间,应该是长整型的,所以是4sizeof(*ss)结果1=*ss是第一个字符其实就是获得了字符串的第一位0所占的内存空间,是char类型的,占了1位请找出下面代码中的所以错误#includestring.hmain()说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”#includestring.hmain()char*src=hello,world;char*dest=NULL;intlen=strlen(src);dest=(char*)malloc(len
17、);char*d=dest;char*s=srclen;while(len-!=0)d+=s-;printf(%s,dest);return0;答:方法1:intmain()char*src=hello,world;intlen=strlen(src);char*dest=(char*)malloc(len+1);/要为0分配一个空间char*d=dest;char*s=&srclen-1;/指向最后一个字符while(len-!=0)*d+=*s-;*d=0;/尾部要加0printf(%sn,dest);free(dest);/使用完,应当释放空间,以免造成内存汇泄露return0;方法2:
18、#include#includemain()charstr=hello,world;intlen=strlen(str);chart;for(inti=0;ilen/2;i+)t=stri;stri=strlen-i-1;strlen-i-1=t;printf(%s,str);return0;.用两个栈实现一个队列的功能?要求给出算法和思路!设2个栈为A,B,一开始均为空.入队:将新元素push入栈A;出队:(1)判断栈B是否为空;如果不为空,则将栈A中所有元素依次pop出并push到栈B;将栈B的栈顶元素pop出;char*constp;/常量指针,p的值不可以修改charconst*p;指
19、向常量的指针,指向的常量值不可以改constchar*p;/和charconst*pmain()inta5=1,2,3,4,5;int*ptr=(int*)(&a+1);printf(%d,%d,*(a+1),*(ptr-1);输出:2,5*(a+1)就是a1,*(ptr-1)就是a4,执行结果是2,5&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)int*ptr=(int*)(&a+1);则ptr实际是&(a5),也就是a+5原因如下:&a是数组指针,其类型为int(*)5;而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小
20、不同a是长度为5的int数组指针,所以要加5*sizeof(int)所以ptr实际是a5但是prt与(&8+1)类型是不一样的(这点很重要)所以prt-1只会减去sizeof(int*)a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a0的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a1,&a+1是下一个对象的地址,即a5.char*s=AAA;printf(%s,s);s0=B;printf(%s,s);有什么错?“AAA”是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。cosntchar*s=AAA;然后又因为是常量,所以对是s的赋值操作
21、是不合法的。int(*s10)(int)函数指针数组,每个指针指向一个intfunc(intparam)的函数。.交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3;有两种解法,一种用算术算法,一种用人(异或)a=a+b;b=a-b;a=a-b;ora=aAb;/只能对int,char.b=aAb;a=aAb;3.c和c+中的struct有什么不同?c和c+中struct的主要区别是c中的struct不可以含有成员函数,而c+中的struct可以。c+中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为priv
22、ate1:(void*)ptr和(*(void*)ptr的结果是否相同?其中ptr为同一个指针.(void*)ptr和(*(void*)ptr值是相同的改错:intmain(void)int*p;intarr100;p=&arr;return0;解答:搞错了,是指针类型不同,int*p;/二级指针&arr;/得到的是指向第一维为100的数组的指针#includeintmain(void)int*p,*q;intarr100;q=arr;p=&q;return0;下面这个程序执行后会有什么错误或者效果:#defineMAX255intmain()unsignedcharAMAX,i;/i被定义为
23、unsignedcharfor(i=0;i=MAX;i+)Ai=i;解答:死循环加数组越界访问(C/C+不进行数组越界检查)MAX=255数组A的下标范围为:0.MAX-1,这是其一.其二.当i循环到255时,循环内执行:A255=255;这句本身没有问题.但是返回for(i=0;i=MAX;i+)语句时,由于unsignedchar的取值范围在(0.255),i+以后i又为0了.无限循环下去.设编号为1,2,n的n个人围坐一圈,约定编号为k(1=k=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序
24、列。数组实现:#include#includeintJosephu(intn,intm)intflag,i,j=0;int*arr=(int*)malloc(n*sizeof(int);for(i=0;in;+i)arri=1;for(i=1;in;+i)flag=0;while(flagm)if(j=n)j=0;if(arrj)+flag;+j;arrj-1=0;printf(第4d个出局的人是:4d号n,i,j);free(arr);returnj;intmain()intn,m;scanf(%d%d,&n,&m);printf(最后胜利的是d号!n,Josephu(n,m);system
25、(pause);return0;链表实现:#include#includetypedefstructNodeintindex;structNode*next;JosephuNode;intJosephu(intn,intm)inti,j;JosephuNode*head,*tail;head=tail=(JosephuNode*)malloc(sizeof(JosephuNode);for(i=1;iindex=i;tail-next=(JosephuNode*)malloc(sizeof(JosephuNode);tail=tail-next;tail-index=i;tail-next=head;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 临时劳动合同(1)
- 专业版工程项目合作合同模板大全
- 个人建房工程承包合同安全条款
- 个人租赁商铺合同格式
- 个人工程项目合同之三:验收标准
- 2025年财产切割无离婚协议文件
- 中小企业员工聘用合同范本
- DB6528T 205-2024 棉花轻简化栽培技术规程
- 个人房产抵押登记合同模板
- 事业单位标准房屋出租合同模板
- Unit6AtthesnackbarStorytimeDiningwithdragons(课件)译林版英语四年级上册
- 2023年四川省公务员录用考试《行测》真题卷及答案解析
- 机电一体化系统设计-第5章-特性分析
- 2025年高考物理复习压轴题:电磁感应综合问题(原卷版)
- 雨棚钢结构施工组织设计正式版
- 医院重点监控药品管理制度
- 2024尼尔森IQ中国本土快消企业调研报告
- 2024年印度辣椒行业状况及未来发展趋势报告
- 骨科医院感染控制操作流程
- 铸铝焊接工艺
- 《社区康复》课件-第六章 骨关节疾病、损伤患者的社区康复实践
评论
0/150
提交评论