




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C软件工程师笔试题 作者: 日期:一、请填写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 EPSINON = 0.00001;if (x = - EPSINON) & (x =”或“=”此类形式。如下是错误的写法,不得分。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 (!) 二、以下为Windows NT下的32位C+程序,请计算sizeof的值(10分) char str = “Hello” ; char *p = str ; int n = 10; sizeof (str ) = 6 sizeof ( p ) = 4 sizeof ( n ) = 4void Func ( char str100) 请计算sizeof( str ) = 4 void *p = malloc( 100 ); 请计算 sizeof ( p ) = 4三、简答题(25分) 1、头文件中的 ifndef/define/endif 干什么用? 防止该头文件被重复引用2、#include 和 #include “filename.h” 有什么区别? 答:对于i nclude ,编译器从标准库路径开始搜索 filename.h 对于i nclude “filename.h” ,编译器从用户的工作路径开始搜索 filename.h3、const 有什么用途?(请至少说明两种) 答:(1)可以定义 const 常量(2)const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。4、在C+ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明? 答:C+语言支持函数重载,C语言不支持函数重载。函数被C+编译后在库中的名字与C语言的不同。假设某个函数的原型为: void foo(int x, int y);该函数被C编译器编译后在库中的名字为_foo,而C+编译器则会产生像_foo_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次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。优点:循环的效率高缺点:程序不简洁四、有关内存的思考题(20分) void GetMemory(char *p) p = (char *)malloc(100); void Test(void) char *str = NULL; GetMemory(str); strcpy(str, hello world); printf(str); 请问运行Test函数会有什么样的结果? 答:程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险博主:getmemory中p是形参,是一个指针变量,getmemory(str)调用后,传入的是指针变量保存的对象地址,p=(char *) malloc(100)实际上是把申请的动态内存空间的首地址付给p指向的地址(即str指向的地址null),这个是错误的。应该修改成指向指针的指针void getmemory(char *p),这样malloc返回的地址付给*p(即str变量本身)。char *GetMemory(void) char p = hello world; return p; void Test(void) char *str = NULL; str = GetMemory(); printf(str); 请问运行Test函数会有什么样的结果? 答:可能是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容已经被清除,新内容不可知。RetMenory执行完毕,p资源被回收,指向未知地址。返回地址,str的内容应是不可预测的, 打印的应该是str的地址Void GetMemory2(char *p, int num) p = (char *)malloc(num); void Test(void) char *str = NULL; GetMemory(&str, 100); strcpy(str, hello); printf(str); 请问运行Test函数会有什么样的结果? 答:(1)能够输出hello(2)内存泄漏 void Test(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, const char *strSrc); 其中strDest是目的字符串,strSrc是源字符串。 (1)不调用C+/C的字符串库函数,请编写函数 strcpy 答:char* my_strcpy(char* strdest, const char* strsrc) assert(strdest != NULL) & (strsrc != NULL) char* address = strdest; while(*strdest+ = *strsrc+) != NULL) return address; (2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值? 答:为了实现链式表达式。 / 2分例如 int length = strlen( strcpy( strDest, “hello world”) );六、编写类String的构造函数、析构函数和赋值函数(25分) 已知类String的原型为: class String public: String(const char *str = NULL); / 普通构造函数 String(const String &other); / 拷贝构造函数 String(void); / 析构函数 String & operate =(const String &other); / 赋值函数 private: char *m_data; / 用于保存字符串 ; 请编写String的上述4个函数。/普通构造函数String:String(const char *str) if(str=NULL) m_data = new char1; / 得分点:对空字符串自动申请存放结束标志0的空 /加分点:对m_data加NULL 判断 *m_data = 0; else int length = strlen(str); m_data = new charlength+1; / 若能加 NULL 判断则更好 strcpy(m_data, str); / String的析构函数String:String(void) delete m_data; / 或delete m_data;/拷贝构造函数String:String(const String &other) / 得分点:输入参数为const型 int length = strlen(other.m_data); m_data = new charlength+1; /加分点:对m_data加NULL 判断 strcpy(m_data, other.m_data); /赋值函数String & String:operate =(const String &other) / 得分点:输入参数为const型 if(this = &other) /得分点:检查自赋值 return *this; delete m_data; /得分点:释放原有的内存资源 int length = strlen( other.m_data ); m_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 ResetTheTime(int *year,int *month,int *date,int *hour,int *minute,int*second) int dayOfMonth12=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 += 1; if(*minute = 60) *minute = 0; *hour += 1; if(*hour = 24) *hour = 0; *date += 1; if(*date dayOfMonth*month-1) *date = 1; *month += 1; if(*month 12) *month=1; *year += 1; return;1.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?全局变量储存在静态数据库,局部变量在堆栈2. static有什么用途?(请至少说明两种)1.限制变量的作用域2.设置变量的存储域不能做switch()的参数类型是:switch的参数不能为实型。如何引用一个已经定义过的全局变量?答:extern可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答:可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错char* ss = 0123456789;sizeof(ss) 结果 4 ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是长整型的,所以是4sizeof(*ss) 结果 1 *ss是第一个字符 其实就是获得了字符串的第一位0 所占的内存空间,是char类型的,占了 1 位请找出下面代码中的所以错误说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”1、#includestring.h2、main()3、4、 char*src=hello,world;5、 char* dest=NULL;6、 int len=strlen(src);7、 dest=(char*)malloc(len);8、 char* d=dest;9、 char* s=srclen;10、 while(len-!=0) 11、 d+=s-;12、 printf(%s,dest);13、 return 0;14、 答:方法1:int main()char* src = hello,world;int len = 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);/ 使用完,应当释放空间,以免造成内存汇泄露return 0;方法2:#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;.用两个栈实现一个队列的功能?要求给出算法和思路!设2个栈为A,B, 一开始均为空.入队:将新元素push入栈A;出队:(1)判断栈B是否为空;(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;(3)将栈B的栈顶元素pop出;char * const p; /常量指针,p的值不可以修改char const * p;/指向常量的指针,指向的常量值不可以改const char *p; /和char const *pmain()int a5=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之后增加的大小不同a是长度为5的int数组指针,所以要加 5*sizeof(int)所以ptr实际是a5但是prt与(&a+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的时候就有问题。cosnt char* s=AAA;然后又因为是常量,所以对是s0的赋值操作是不合法的。int (*s10)(int) 函数指针数组,每个指针指向一个int func(int param)的函数。.交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3;有两种解法, 一种用算术算法, 一种用(异或)a = a + b; b = a - b; a = a - b; or a = ab;/ 只能对int,char. b = ab; a = ab;3.c和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 main(void) int *p;int arr100;p = &arr;return 0;解答:搞错了,是指针类型不同,int *p; /二级指针&arr; /得到的是指向第一维为100的数组的指针#include int main(void) int *p, *q;int arr100;q = arr;p = &q;return 0;下面这个程序执行后会有什么错误或者效果:#define MAX 255int main()unsigned char AMAX,i;/i被定义为unsigned charfor (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+)语句时,由于unsigned char的取值范围在(0.255),i+以后i又为0了.无限循环下去.设编号为1,2, n的n个人围坐一圈,约定编号为k(1=k=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。数组实现:#include #include int Josephu(int n, int m)int flag, i, j = 0;int *arr = (int *)malloc(n * sizeof(int);for (i = 0; i n; +i)arri = 1;for (i = 1; i n; +i)flag = 0;while (flag m)if (j = n)j = 0;if (arrj)+flag;+j;arrj - 1 = 0;printf(第%4d个出局的人是:%4d号n, i, j);free(arr);return j;int main()int n, m;scanf(%d%d, &n, &m);printf(最后胜利的是%d号!n, Josephu(n, m);system(pause);return 0;链表实现:#include #include typedef struct Nodeint index;struct Node *next;JosephuNode;int Josephu(int n, int m)int i, j;JosephuNode *head, *tail;head = tail = (JosephuNode *)malloc(sizeof(JosephuNode);for (i = 1; i index = i;tail-next = (JosephuNode *)malloc(sizeof(JosephuNode);tail = tail-next;tail-index = i;tail-next = head;for (i = 1; tail != head; +i)for (j = 1; j next;tail-next = head-next;printf(第%4d个出局的人是:%4d号n, i, head-index);free(head);head = tail-next;i = head-index;free(head);return i;int main()int n, m;scanf(%d%d, &n, &m);printf(最后胜利的是%d号!n, Josephu(n, m);system(pause);return 0;斐波拉契数列递归实现的方法如下:int Funct( int n )if(n=0) return 1;if(n=1) return 1;retrurn Funct(n-1) + Funct(n-2);请问,如何不使用递归,来实现上述函数?请教各位高手!解答:int Funct( int n ) / n 为非负整数int a=0;int b=1;int c;if(n=0) c=1;else if(n=1) c=1;else for(int i=2;i 47 & *in 47 & *in 58 ; in+ )count+;elsein+;if( maxlen count )maxlen = count;count = 0;final = temp;for(int i = 0; i maxlen; i+)*out = *final;out+;final+;*out = 0;return maxlen;不用库函数,用C语言实现将一整型数字转化为字符串方法1:int getlen(char *s)int n;for(n = 0; *s != 0; s+)n+;return n;void reverse(char s)int c,i,j;for(i = 0,j = getlen(s) - 1; i j; i+,j-)c = si;si = sj;sj = c;void itoa(int n,char s)int i,sign;if(sign = n) 0);/*delete the number*/if(sign 0)si+ = -;si = 0;reverse(s);方法2:#include using namespace std;void itochar(int num);void itochar(int num)int i = 0;int j ;char stra10;char strb10;while ( num )strai+=num%10+48;num=num/10;strai = 0;for( j=0; j i; j+)strbj = strai-j-1;strbj = 0;coutstrbnum;itochar(num);return 0;用指针的方法,将字符串“ABCD1234efgh”前后对调显示#include #include #include int main()char str = ABCD1234efgh;int length = strlen(str);char * p1 = str;char * p2 = str + length - 1;while(p1 p2)char c = *p1;*p1 = *p2;*p2 = c;+p1;-p2;printf(str now is %sn,str);system(pause);return 0;有一个数组a1000存放0-1000;要求每隔二个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。方法2:链表#includeusing namespace std;#define null 0struct nodeint data;node* next;int main()node* head=new node;head-data=0;head-next=null;node* p=head;for(int i=1;idata=i;tmp-next=null;head-next=tmp;head=head-next;head-next=p;while(p!=p-next)p-next-next=p-next-next-next;p=p-next-next;coutdata;return 0;试题: void test2() char string10, str110; int i; for(i=0; i10; i+) str1i = a; strcpy( string, str1 ); 解答:对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string, str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分;str1不能在数组内结束:因为str1的存储为:a,a,a,a,a,a,a,a,a,a,没有0(字符串结束符),所以不能结束strcpy( char *s1,char *
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度绿色环保地坪材料承包服务合同
- 2025版农业科技园区承包经营合同样本
- 二零二五年度石材园林景观石设计与施工合同
- 2025年度果园生态保护与可持续发展承包服务合同范本
- 2025版房地产估价服务定金合同范本
- 2025版生鲜超市联盟商家合作协议书
- 2025版电力线路巡检电力安全服务合同
- 二零二五年度农产品质量安全追溯购销合同规范
- 2025版二手摩托车二手车鉴定评估机构合作合同
- 2025版火车站站房建筑工程劳务分包合同
- 天津农商银行对公授信业务及相关金融知识考试试卷
- 军人心理健康课件
- 2025年综合类-国家统考科目-国家统考科目-第十三章我国社会保险的法规与政策历年真题摘选带答案(5卷100题)
- 2025年天津市初中学业水平考试中考物理真题试卷(中考真题+答案)
- 2025年赤峰市翁牛特旗招聘社区工作者考试试题【答案】
- 2025年陕西建材科技集团股份有限公司招聘笔试真题含答案
- 2025年7月初“第一议题”学习内容清单
- 工程信用评价管理办法
- 2025年广东省中考物理试题卷(含答案)
- 《山东省房屋市政工程专职安全员工作手册》
- 透析病人心律失常的护理
评论
0/150
提交评论