《2022年C软件工程师笔试题.docx》由会员分享,可在线阅读,更多相关《2022年C软件工程师笔试题.docx(27页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精品学习资源一、请填写 BOOL , float,指针变量 与“零值”比较的if 语句;( 10 分)提示:这里“零值”可以是0, 0.0 , FALSE 或者“空指针”;例如int 变量 n 与“零值”比较的if 语句为: if n = 0 if n .= 0 以此类推;请写出BOOL flag 与“零值”比较的if 语句:标准答案: if flag if .flag 如下写法均属不良风格,不得分;if flag = TRUE if flag = 1 if flag = FALSE if flag = 0请写出 float x 与“零值”比较的if 语句:标准答案示例:const float
2、 EPSINON = 0.00001; if x = - EPSINON & x =”或 “=”此类形式;如下是错误的写法,不得分; if x= 0.0 if x .= 0.0请写出 char *p 与“零值”比较的if 语句:标准答案:if p = NULLif p .= NULL如下写法均属不良风格,不得分;if p = 0 if p .= 0 if p if .二、以下为 Windows NT 下的 32 位 C+ 程序,请运算 sizeof 的值( 10 分) char str =“ H;elcloha”r *p = str ; int n = 10 ;sizeof str = 6si
3、zeof p = 4sizeof n = 4 void Func char str100 请运算 sizeof str = 4 void *p = malloc 100 ;请运算 sizeof p = 4三、简答题( 25 分)1、头文件中的 ifndef/define/endif干什么用?防止该头文件被重复引用2、#include 和 #include “ filename.h ” 有什么区分?答: 对 于 include, 编 译 器从 标 准 库 路径开 始 搜 索filename.h对于 i nclude“ filename.h ,”编译器从用户的工作路径开头搜寻filename.h3
4、、const 有什么用途?(请至少说明两种)答:(1)可以定义const常量(2) const可以修饰函数的参数、返回值,甚至函数的定义体;被const 修饰的东西都受到强制爱惜,可以预防意外的变动,能提高程序的健壮性;4、在 C+ 程序中调用被 C 编译器编译后的函数,为什么要加extern “ C”声明?答: C+ 语言支持函数重载, C 语言不支持函数重载;函数被C+ 编译后在库中的名字与C 语言的不同;假设某个函数的原型为:voidfoointx,inty;该 函 数 被 C编 译 器 编 译 后 在 库 中 的 名 字 为 _foo , 而C+ 编 译 器 就 会 产 生 像 _fo
5、o_int_int之 类 的 名 字 ;C+ 供应了 C 连接交换指定符号extern “ C来”解决名字匹配问题;5、请简述以下两个for 循环的优缺点for i=0 ; iN ; i+ if condition DoSomething ;else DoOtherthing ;/ 其次个if condition for i=0 ; iN ; i+ DoSomething ; else for i=0 ; iN ; i+DoOtherthing ; 优点:程序简洁缺点:多执行了N-1 次规律判定,并且打断了循环 “流水线 ”作业,使得编译器不能对循环进行优化处理,降低了效率;优点:循环的效率高
6、缺点:程序不简洁四、有关内存的摸索题(20 分)void GetMemorychar *p欢迎下载精品学习资源 p = char *malloc100;void Testvoid char *str = NULL;GetMemorystr ;strcpystr, hello world;printfstr ; 请问运行 Test 函数会有什么样的结果?答: 程序崩溃, getmemory 中的 malloc 不能返回动态内存,free()对 str 操作很危险博主: getmemory 中 p 是形参,是一个指针变量,getmemorystr 调用后,传入的是指针变量储存的对象地址,p=cha
7、r * malloc100实际上是把申请的动态内存空间的首地址付给p 指向的地址(即str 指向的地址 null ),这个是错误的;应当修改成指向指针的指针 void getmemorychar *p,这样 malloc 返回的地址付给 *p (即 str 变量本身);char *GetMemoryvoid char p = hello world;return p; void Testvoid char *str = NULL;str = GetMemory ;printfstr ; 请问运行 Test 函数会有什么样的结果?答:可能是乱码;由于 GetMemory 返回的是指向 “栈内存
8、”的指针,该指针的地址不是NULL ,但其原现的内容已经被清除,新内容不行知;RetMenory 执行完毕, p 资源被回收,指向未知地址;返回地址,str的内容应是不行推测的 ,打印的应该是 str的地址Void GetMemory2char *p, int num p = char *mallocnum; void Testvoid char *str = NULL;GetMemory&str, 100 ;strcpystr, hello ;printfstr ; 请问运行 Test 函数会有什么样的结果?答:(1)能够输出hello(2)内存泄漏void Testvoid char *s
9、tr = char * malloc100;strcpystr,“ ;hello”freestr;ifstr .= NULL strcpystr,“ ;world ”printfstr ; 请问运行 Test 函数会有什么样的结果?答 : 篡 改 动 态 内 存 区 的 内 容 , 后 果 难 以 预 料 , 非 常 危 险 ;因 为 freestr; 之 后 , str成 为 野 指 针 , ifstr .= NULL 语句不起作用;五、已知 strcpy 函数的原型是 char *strcpychar *strDest, const char *strSrc;其中 strDest 是目的字
10、符串, strSrc 是源字符串;( 1)不调用 C+/C 的字符串库函数,请编写函数strcpy答:char*my_strcpychar*strdest,constchar*strsrcassertstrdest.=NULL&strsrc.=NULLchar*address=strdest;while*strdest+=*strsrc+.=NULLreturnaddress;欢迎下载精品学习资源( 2) strcpy 能把 strSrc 的内容复制到strDest,为什么仍要 char * 类型的返回值?答:为了实现链式表达式;/ 2 分例如 int length = strlen strc
11、py strDest,“hello;world” 六、编写类 String 的构造函数、析构函数和赋值函数(25 分) 已知类 String 的原型为:class String public:Stringconst char *str = NULL; / 一般构造函数Stringconst String &other ; / 拷贝构造函数 Stringvoid ; / 析构函数String & operate =const String &other; / 赋值函数private:char *m_data ; / 用于储存字符串 ;请编写 String 的上述 4 个函数;/一般构造函数Str
12、ing:Stringconstchar*strifstr=NULLm_data=newchar1 ;/得 分 点 : 对 空 字 符 串 自 动 申 请 存 放 结 束 标 志 0 的 空/加分点:对m_data加NULL判断*m_data=0;elseintlength=strlenstr;m_data=newcharlength+1;/如能加NULL判断就更好strcpym_data,str;/ String 的析构函数String:Stringvoiddeletem_data;/或deletem_data;/拷贝构造函数String:StringconstString&other/得分点
13、:输入参数为const型int length = strlenother.m_data ;m_data=newcharlength+1;/加 分 点 : 对m_data加NULL判 断strcpym_data,other.m_data;/赋值函数String&String:operate=constString&other/得 分 点 : 输 入 参 数 为const型ifthis = &other/得分点:检查自赋值return *this ;欢迎下载精品学习资源delete m_data ;/得分点:释放原有的内存资源int length = strlen other.m_data ;m_
14、data = new charlength+1 ;/加分点:对 m_data 加 NULL判定strcpy m_data, other.m_data ;return*this;/得 分 点: 返回 本 对象 的引 用编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒;如输入2004 年 12 月 31 日 23 时 59 分 59 秒,就输出2005 年 1 月 1 日 0 时 0 分 0 秒;void ResetTheTimeint *year,int *month,int *date,int *hour,int*minute,int*secondint dayOfMonth12
15、=31,28,31,30,31,30,31,31,30,31,30,31;if *year 0| *month 12 |*date 31 | *hour 23 |*minute 59| *second 60 return;if *year%400 = 0 | *year%100 .= 0 & *year%4 = 0 dayOfMonth1 = 29;if*second = 60*second = 0*minute += 1if*minute = 60*minute = 0*hour += 1if*hour = 24*hour = 0*date += 1;if*date dayOfMonth*m
16、onth-1*date = 1*month += 1if*month 12*month=1*year += 1;return;1. 全局变量和局部变量在内存中是否有区分?假如有,是什么区分?全局变量储存在静态数据库,局部变量在堆栈2. static 有什么用途?(请至少说明两种) 1.限制变量的作用域 2.设置变量的储备域不能做 switch的参数类型是:switch 的参数不能为实型;如何引用一个已经定义过的全局变量? 答: extern欢迎下载精品学习资源printf%sn,dest freedest;return/使用完,应当释放0空间,以免造成内存汇泄;露;可以用引用头文件的方式,也可
17、以用extern 关键字,假如用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,假如你用extern 方式引用时, 假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错全局变量可不行以定义在可被多个 .C 文件包含的头文件中?为什么?答:可以,在不同的 C 文件中以 static 形式来声明同名全局变量;char* ss = 0123456789;sizeofss结果 4 ss 是指向字符串常量的字符指针,sizeof获得的是一个指针的之所占的空间,应当是长整型的,所以是 4sizeof*ss结果 1 *ss 是第一个字符 其实就是获得了
18、字符串的第一位0 所占的内存空间,是char 类型的,占了 1 位可以在不同的 C 文件中声明同名的全局变量,前提是其中只能有一个C 文件中对此变量赋初值,此时连接不会出错请找出下面代码中的所以错误说 明 : 以 下 代 码 是 把 一 个 字 符 串 倒 序 , 如 “ abcd ” 倒 序 后 变 为 “ dcba ”1 、#includestring.h2 、main3 、4 、char*src=hello,world;5 、char*dest=NULL;6 、intlen=strlensrc;7 、dest=char*malloclen;8 、char*d=dest;9 、char*s
19、=srclen;10 、whilelen-.=011、d+=s-;12、printf%s,dest;13、14、答方法intreturn0;:1:main=hello,world;=;/要为strlensrc0分配一个空;间=dest;char*intchar*dest=char*char*s=src lenchar*malloclen+1d/指向最后一个字符.=0&srclen-1;whilelen-*d+=*s-;*d=0 ;/尾部要加0方#include #include法2:maincharintstr=hello,worldlen=strlenstr;chart;欢迎下载精品学习资源
20、forinti=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中所有元素依次顶元(2) 如 果(3) 将栈B的栈pop出 并 push到 栈B ; 素pop出;欢迎下载精品学习资源char*constp;charconst*p;/指constchar*p/常量指针,p的值不可以修改向 常量 的 指 针, 指 向 的常
21、 量 值 不可 以 改;/和charconst*pmainintint*ptr=inta5=1,2,3,4,5*&a+1;printf%d,%d,*a+1,*ptr-1;输*a+1)就是a1,*ptr-1出:2,5就 是 a4, 执 行 结 果 是 2 , 5 &a+1 不是首地址 +1,系统会认为加一个 a 数组的偏移,是偏移了一个数组的大小(本例是 5 个 int ) int *ptr=int*&a+1 ; 就 ptr 实 际 是 &a5, 也 就 是 a+5 原 因 如 下 : &a 是 数 组 指 针 , 其 类 型 为 int *5 ;而 指 针 加 1 要 根 据 指 针 类 型
22、加 上 一 定 的 值 , 不 同 类 型 的 指 针 +1 之 后 增 加 的 大 小 不 同a 是 长 度 为 5 的 int 数 组 指 针 , 所 以 要 加 5*sizeofint所以ptr实际是a5但是prt与&a+1类型是不一样的这点很重要所以prt-1只会减去sizeofint*a,&a 的地址是一样的,但意思不一样,a 是数组首地址,也就是a0 的地址, &a 是对象(数组)首地址 , a+1是 数 组 下 一 元 素 的 地 址 , 即a1,&a+1是 下 一 个 对 象 的 地 址 , 即 a5.char* printf%s,ss0=Bs=AAA;printf%s,s有什
23、么错;?AAA 是 字 符 串 常 量 ; s 是 指 针 , 指 向 这 个字 符 串 常 量 , 所 以声 明 s 的 时 候 就 有 问 题;cosntchar*s=AAA;然后又由于是常量,所以对是 s0 的赋值操作是不合法的;int *s10int函数指针数组,每个指针指向一个 int funcint param 的函数;. 交 换 两 个 变 量 的 值 , 不 使 用 第 三 个 变 量 ; 即 a=3,b=5, 交 换 之 后 a=5,b=3 ;有 两 种 解 法 , 一 种 用 算 术 算 法 , 一 种 用 异 或 欢迎下载精品学习资源a=a+orba3.c和解 答 : 死
24、 循 环 加 数 组 越 界 访 问 ( C/C+不 进 行 数 组 越 界 检 查 )MAX=255 数组 A 的 下标范畴为:0.MAX-1,这是其一.其二 . 当 i循环 到 255 时 , 循环内 执行 :设编号为 1, 2, n 的 n 个人围坐一圈,商定编号为k( 1=k=n)的人从 1 开头报数,数到 m 的那个人出列,它的下一位又从1 开头报数,数到m的那个人又出列,依次类推,直到全部人出列为止,由此产生一个出队编号的序列;数组#include #includeintJosephuint实n,现int:mb;b=a-b;a=a-b;a=ab;/只能对int,char.=ab;=
25、ab;c+ 中 的 struct有 什 么 不 同 ? c 和 c+中 struct 的主要区分是 c 中的 struct 不行以含有成员函数,而 c+中的 struct 可以; c+中struct 和 class 的主要区分在于默认的存取权限不同, struct 默认为 public ,而 class 默认为private1 : void*ptr和*void*ptr的 结 果 是否相同 ?其中ptr为同一 个指针.void*ptr和*void*ptr值是相同的改int int错mainvoid*p:;int p=arr100&arr;return0;解答:搞错了,是指针类型不同int*p;/
26、二级指&arr;/得到的是 指向第 一维为100的 数组的指#include,针针intint*p,mainvoid*q;intarr100;qp=arr&q;return0;下面#define这个程序执行后会有MAX什么错误或者效果:255intmainunsignedcharAMAX,i;/i被定义为unsignedcharfori=0;i=MAX;i+Ai=i;A255=255; 这 句 本 身 没 有 问 题 .但 是 返 回 fori=0; i=MAX ; i+语 句 时 ,由 于 unsignedchar的 取 值 范 围 在 0.255,i+以 后i又为 0了 .无 限 循 环
27、下 去 .欢迎下载精品学习资源intint*arrflag,=i,intfori=0arri=fori=1flag=whileflagj=0;*mallocn*sizeofint;in;+i1;in;+i0;mifj=nj=0;ifarrj+flag;+j;arrj-1=0;printf第%4d个出局的人是:%4d号n,i,j;freearr;returnj;intmainintn,scanf%d%d,&n,m&m;printf最后胜利的是%d号!n,Josephun,m;systempausereturn0;链表#include实现:#includetypedefstructNodeints
28、tructNodeindex*next;JosephuNode;intJosephuintn,intminti,j;JosephuNode*head,*tail;headfor=itail=JosephuNode*mallocsizeofJosephuNode;1;iindextail-next=i;JosephuNode*mallocsizeofJosephuNode;tail=tail-next;tail-index tail-next=i head;fori=1;tail.=head;+i欢迎下载精品学习资源forj=1;jnext;tail-next=head-next;printf第
29、%4d个出局的人是:%4d号n,i,head-index;freehead;head=tail-next;i=head-index;freehead;returni;intmainn,&n,m&m;后胜利的是%d号!n,Josephun,m;0;int scanf%d%d, printf最systempause return斐int波拉契数Funct列递归实int现的方n法如下:ifn=0return1;ifn=1return1;retrurnFunctn-1+Functn-2;请问,如何不使用递归,来实现上述函数?请教各位高手!解答:intFunctintn/n为非负整数inta=0;intb=1;intifn=0cc=1;elseifn=1c=1;elseforinti=2;i=n;i+/应该n从2开始算起c=a+b;a=b;b=c;returnc;在对齐为4的情况下structBBBlongnum;欢迎下载精品学习资源char*name;shortintdata;charha;shortba5;*p;p=0x1000000;p+0x200= Ulongp+0x200= ;char*p+0x200= ;希望各位达人给出答案和原因,谢谢拉解答:假设在32位CPU上,sizeoflong=4bytessizeofchar
限制150内