创维笔试题目.docx
《创维笔试题目.docx》由会员分享,可在线阅读,更多相关《创维笔试题目.docx(7页珍藏版)》请在冰豆网上搜索。
![创维笔试题目.docx](https://file1.bdocx.com/fileroot1/2022-12/14/c0d272f6-57e3-45dd-928f-15d8240e7bfa/c0d272f6-57e3-45dd-928f-15d8240e7bfa1.gif)
创维笔试题目
创维笔试题目
是当时面创维数字的笔试题,题目比较简单,只涉及到了基本的c语法,没有考到数据结构以及算法,试题在前面说明这套题并不能反映应聘者实际的软件开发及编程能力。
一、请填写bool,float,指针变量与“零值”比较的if语句。
(10分)
请写出boolflag与“零值”比较的if语句。
if(flag)
if(!
flag)
请写出floatx与“零值”比较的if语句。
constfloatepsinon=0.00001;
if((x>=-epsinon)&&(x<=epsinon)
不可将浮点变量用“==”或“!
=”与数字比较,应该设法转化成“>=”或“<=”此类形式。
请写出char*p与“零值”比较的if语句。
if(p==null)
if(p!
=null)
二、以下为windowsnt下的32位c++程序,请计算sizeof的值(10分)
charstr[]=“hello”;
char *p=str;
intn=10;
请计算
sizeof(str)=6(2分)
sizeof(p)=4(2分)
sizeof(n)=4
voidfunc(charstr[100])
{
请计算
sizeof(str)=4(2分)
}
void*p=malloc(100);
请计算
sizeof(p)=4(2分)
三、简答题(25分)
1、头文件中的ifndef/define/endif干什么用?
(5分)
答:
防止该头文件被重复引用。
2、#include和#include“filename.h”有什么区别?
(5分)
答:
对于#include,编译器从标准库路径开始搜索filename.h
对于#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分,共20分)
一.
voidgetmemory(char*p)
{
p=(char*)malloc(100);
}
voidtest(void)
{
char*str=null;
getmemory(str);
strcpy(str,"helloworld");
printf(str);
}
请问运行test函数会有什么样的结果?
答:
试题传入getmemory(char*p)函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完char*str=null;getmemory(str);后的str仍然为null;
二.
char*getmemory(void)
{
charp[]="helloworld";
returnp;
}
voidtest(void)
{
char*str=null;
str=getmemory();
printf(str);
}
请问运行test函数会有什么样的结果?
答:
可能是乱码。
charp[]="helloworld";
returnp;
的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。
这是许多程序员常犯的错误,其根源在于不理解变量的生存期。
三.
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)test函数中也未对malloc的内存进行释放。
(3)getmemory避免了试题1的问题,传入getmemory的参数为字符串指针的指针,但是在getmemory中执行申请内存及赋值语句
p=(char*)malloc(num);
后未判断内存是否申请成功,应加上:
if(*p==null){ }
四.
voidtest(void)
{
char*str=(char*)malloc(100);
strcpy(str,“hello”);
free(str);
if(str!
=null)
{
strcpy(str,“world”);
printf(str);
}
}
请问运行test函数会有什么样的结果?
答:
执行char*str=(char*)malloc(100);后未进行内存是否申请成功的判断;另外,在free(str)后未置str为空,导致可能变成一个“野”指针,应加上:
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:
perate=(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;
}