C++C编程质量试题.docx
- 文档编号:11287909
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:12
- 大小:53.74KB
C++C编程质量试题.docx
《C++C编程质量试题.docx》由会员分享,可在线阅读,更多相关《C++C编程质量试题.docx(12页珍藏版)》请在冰豆网上搜索。
C++C编程质量试题
C++/C编程质量试题
本试题仅用于考查C++/C程序员的基本编程技能。
内容限于C++/C常用语法,不涉及数据结构、算法以及深奥的语法。
考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不能反映考生的智力和软件开发能力。
笔试时间90分钟。
请考生认真答题,切勿轻视。
一、请填写BOOL,float,指针变量与“零值”比较的if语句。
(10分)
提示:
这里“零值”可以是0,0.0,FALSE或者“空指针”。
例如int变量n与“零值”比较的if语句为:
if(n==0)
if(n!
=0)
以此类推。
请写出BOOL flag与“零值”比较的if语句:
请写出float x与“零值”比较的if语句:
请写出char *p与“零值”比较的if语句:
二、以下为WindowsNT下的32位C++程序,请计算sizeof的值(10分)
char str[]=“Hello”;
char *p=str;
int n=10;
请计算
sizeof(str)=
sizeof(p)=
sizeof(n)=
voidFunc(charstr[100])
{
请计算
sizeof(str)=
}
void*p=malloc(100);
请计算
sizeof(p)=
三、简答题(25分)
1、头文件中的ifndef/define/endif干什么用?
2、#include
3、const有什么用途?
(请至少说明两种)
4、在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”声明?
5、请简述以下两个for循环的优缺点
//第一个
for(i=0;i { if(condition) DoSomething(); else DoOtherthing(); } //第二个 if(condition) { for(i=0;i DoSomething(); } else { for(i=0;i DoOtherthing(); } 优点: 缺点: 优点: 缺点: 四、有关内存的思考题(20分) voidGetMemory(char*p) { p=(char*)malloc(100); } voidTest(void) { char*str=NULL; GetMemory(str); strcpy(str,"helloworld"); printf(str); } 请问运行Test函数会有什么样的结果? 答: char*GetMemory(void) { charp[]="helloworld"; returnp; } voidTest(void) { char*str=NULL; str=GetMemory(); printf(str); } 请问运行Test函数会有什么样的结果? 答: VoidGetMemory2(char**p,intnum) { *p=(char*)malloc(num); } voidTest(void) { char*str=NULL; GetMemory(&str,100); strcpy(str,"hello"); printf(str); } 请问运行Test函数会有什么样的结果? 答: voidTest(void) { char*str=(char*)malloc(100); strcpy(str,“hello”); free(str); if(str! =NULL) { strcpy(str,“world”); printf(str); } } 请问运行Test函数会有什么样的结果? 答: 五、编写strcpy函数(10分) 已知strcpy函数的原型是 char*strcpy(char*strDest,constchar*strSrc); 其中strDest是目的字符串,strSrc是源字符串。 (1)不调用C++/C的字符串库函数,请编写函数strcpy (2)strcpy能把strSrc的内容复制到strDest,为什么还要char*类型的返回值? 六、编写类String的构造函数、析构函数和赋值函数(25分) 已知类String的原型为: classString { public: String(constchar*str=NULL);//普通构造函数 String(constString&other); //拷贝构造函数 ~String(void); //析构函数 String&operate=(constString&other); //赋值函数 private: char *m_data; //用于保存字符串 }; 请编写String的上述4个函数。 C++/C试题的答案与评分标准 一、请填写BOOL,float,指针变量与“零值”比较的if语句。 (10分) 请写出BOOL flag与“零值”比较的if语句。 (3分) 标准答案: if(flag) if(! flag) 如下写法均属不良风格,不得分。 if(flag==TRUE) if(flag==1) if(flag==FALSE) if(flag==0) 请写出float x与“零值”比较的if语句。 (4分) 标准答案示例: constfloatEPSINON=0.00001; if((x>=-EPSINON)&&(x<=EPSINON) 不可将浮点变量用“==”或“! =”与数字比较,应该设法转化成“>=”或“<=”此类形式。 如下是错误的写法,不得分。 if(x==0.0) if(x! =0.0) 请写出char *p与“零值”比较的if语句。 (3分) 标准答案: if(p==NULL) if(p! =NULL) 如下写法均属不良风格,不得分。 if(p==0) if(p! =0) if(p) if(! ) 二、以下为WindowsNT下的32位C++程序,请计算sizeof的值(10分) char str[]=“Hello”; char *p=str; int n=10; 请计算 sizeof(str)= 6 (2分) sizeof(p)= 4 (2分) sizeof(n)= 4 (2分) voidFunc(charstr[100]) { 请计算 sizeof(str)= 4 (2分) } void*p=malloc(100); 请计算 sizeof(p)= 4 (2分) 三、简答题(25分) 1、头文件中的ifndef/define/endif干什么用? (5分) 答: 防止该头文件被重复引用。 2、#include (5分) 答: 对于#include 对于#include “filename.h”,编译器从用户的工作路径开始搜索filename.h 3、const有什么用途? (请至少说明两种)(5分) 答: (1)可以定义const常量 (2)const可以修饰函数的参数、返回值,甚至函数的定义体。 被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。 4、在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”? (5分) 答: C++语言支持函数重载,C语言不支持函数重载。 函数被C++编译后在库中的名字与C语言的不同。 假设某个函数的原型为: voidfoo(intx,inty); 该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。 C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。 5、请简述以下两个for循环的优缺点(5分) for(i=0;i { if(condition) DoSomething(); else DoOtherthing(); } if(condition) { for(i=0;i DoSomething(); } else { for(i=0;i DoOtherthing(); } 优点: 程序简洁 缺点: 多执行了N-1次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。 优点: 循环的效率高 缺点: 程序不简洁 四、有关内存的思考题(每小题5分,共20分) voidGetMemory(char*p) { p=(char*)malloc(100); } voidTest(void) { char*str=NULL; GetMemory(str); strcpy(str,"helloworld"); printf(str); } 请问运行Test函数会有什么样的结果? 答: 程序崩溃。 因为GetMemory并不能传递动态内存, Test函数中的str一直都是NULL。 strcpy(str,"helloworld");将使程序崩溃。 char*GetMemory(void) { charp[]="helloworld"; returnp; } voidTest(void) { char*str=NULL; str=GetMemory(); printf(str); } 请问运行Test函数会有什么样的结果? 答: 可能是乱码。 因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是NULL,但其原现的内容已经被清除,新内容不可知。 voidGetMemory2(char**p,intnum) { *p=(char*)malloc(num); } voidTest(void) { char*str=NULL; GetMemory(&str,100); strcpy(str,"hello"); printf(str); } 请问运行Test函数会有什么样的结果? 答: (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函数(10分) 已知strcpy函数的原型是 char*strcpy(char*strDest,constchar*strSrc); 其中strDest是目的字符串,strSrc是源字符串。 (1)不调用C++/C的字符串库函数,请编写函数strcpy char*strcpy(char*strDest,constchar*strSrc); { assert((strDest! =NULL)&&(strSrc! =NULL));//2分 char*address=strDest; //2分 while((*strDest++=*strSrc++)! =‘\0’) //2分 NULL; returnaddress; //2分 } (2)strcpy能把strSrc的内容复制到strDest,为什么还要char*类型的返回值? 答: 为了实现链式表达式。 //2分 例如 intlength=strlen(strcpy(strDest,“helloworld”)); 六、编写类String的构造函数、析构函数和赋值函数(25分) 已知类String的原型为: classString { public: String(constchar*str=NULL);//普通构造函数 String(constString&other); //拷贝构造函数 ~String(void); //析构函数 String&operate=(constString&other); //赋值函数 private: char *m_data; //用于保存字符串 }; 请编写String的上述4个函数。 标准答案: //String的析构函数 String: : ~String(void) //3分 { delete[]m_data; //由于m_data是内部数据类型,也可以写成deletem_data; } //String的普通构造函数 String: : String(constchar*str) //6分 { if(str==NULL) { m_data=newchar[1]; //若能加NULL判断则更好 *m_data=‘\0’; } else { intlength=strlen(str); m_data=newchar[length+1]; //若能加NULL判断则更好 strcpy(m_data,str); } } //拷贝构造函数 String: : String(constString&other) //3分 { intlength=strlen(other.m_data); m_data=newchar[length+1]; //若能加NULL判断则更好 strcpy(m_data,other.m_data); } //赋值函数 String&String: : operate=(constString&other) //13分 { // (1)检查自赋值 //4分 if(this==&other) return*this; // (2)释放原有的内存资源 //3分 delete[]m_data; //(3)分配新的内存资源,并复制内容//3分 intlength=strlen(other.m_data); m_data=newchar[length+1]; //若能加NULL判断则更好 strcpy(m_data,other.m_data); //(4)返回本对象的引用 //3分 return*this; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编程 质量 试题