中标软件面试题.docx
- 文档编号:12631879
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:16
- 大小:20.60KB
中标软件面试题.docx
《中标软件面试题.docx》由会员分享,可在线阅读,更多相关《中标软件面试题.docx(16页珍藏版)》请在冰豆网上搜索。
中标软件面试题
一、请填写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;ii++)
{
if(condition)
DoSomething();
else
DoOtherthing();
}
if(condition)
{
for(i=0;ii++)
DoSomething();
}
else
{
for(i=0;ii++)
DoOtherthing();
}
优点:
程序简洁
缺点:
多执行了N-1次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。
优点:
循环的效率高
缺点:
程序不简洁
c语言常见笔试题
关键词:
笔试题
intStrcmp(char*str1,char*str2)
{
inti=0;
intb=0;
while(str1[i]||str2[i])
{
if(str1[i]>str2[i])
{
b=1;break;
}
elseif(str1[i] { b=-1;break; } i++; } returnb; } *************************************************************************************************************** 1.说出下面这个程序的运行结果,并简要叙述其理由: charbuf1[10]="hello"; charbuf2[10]="hello"; if(buf1==buf2) printf("equal! "); elseprintf("notequal! "); 因为buf1,buf2分配了不同的内存块,而比较的是数组名,实际上是两个分别指向数组起始元素地址的指针。 2.指出下面这段程序中存在一些什么问题: intloop,a[5]; int*p=a; for(loop=0;loop<5;loop++) {p++; *p=loop; } 数组a[5]在创建时没有初始化,在for循环里也没有起到完全初始化数组的作用,而且对一块未知内存赋值。 在最后一轮循环 结束时p指向了数组a[5]的最后一个元素的下一个地址。 string系列 char*strcpy(char*strDest,constchar*strSrc) { assert((strDest! =NULL)&&(strSrc! =NULL)); char*address=strDest; while((*strDest++=*strSrc++)! =‘\0’); returnaddress; } char*strncpy(char*strdest,constchar*strsrc,intn) { assert((strdest! =NULL)&&(strsrc! =NULL)); char*address=strdest; while(n-->0) *strdest++=*strsrc++; returnaddress; } intstrcmp(constchar*str1,constchar*str2) { assert((str1! =NULL)&&(str2! =NULL); intret=0; while(! (ret=(unsignedchar*)*str1-(unsignedchar*)*str2)&&(*str2)) { str1++; str2++; } if(ret>0) ret=1; elseif(ret<0) ret=-1; returnret; } intstrlen(constchar*str) { assert(str! =NULL); intlen=0; while('\0'! =*str++) len++; returnlen; } 类string的构造函数 string: : string(constchar*str) { if(str==NULL) { m_data=newchar[1]; *m_data='\0'; } else { intlength=strlen(str); m_data=newchar[str+1]; strcpy(m_data,str); } } string的析构函数 string: : ~string() { delete[]m_data; } string的拷贝构造函数 string: : string(conststring&other) { intlen=strlen(other.m_data); m_data=newchar[len+1]; strcpy(m_data,other.m_data); } string的赋值函数 string&string: : operator=(conststring&other) { if(this==&other) return*this; delete[]m_data; intlen=strlen(other.m_data); m_data=newchar[len+1]; strcpy(m_data,other.m_data); return*this; } 不用任何局部和全局变量实现intstrlen(char*a) intstrlen(char*a){ if('\0'==*a) return0; else return1+strlen(a+1); } 1)sizeof相关系列问题 2)const相关系列问题 3)大量林锐书的习题,以及各种变种 这三个几乎是每次必出现 下面的这些是程序相关题,很多都是以前有讨论过的,还请各位大侠能整理个比较适合做面试时答案的解答,多谢了.最好能给出 讨论链接,让我等后辈有学习的机会. 1)求出相似度的算法. 2)写出二分查找的代码. intbinary_search(int*arr,intkey,intn) { intlow=0; inthigh=n-1; intmid; while(low<=high) { mid=(high+low)/2; if(arr[mid]>k) high=mid-1; elseif(arr[mid] low=mid+1; else returnmid; } return-1; } 3)写出在母串中查找子串出现次数的代码. *4)写出快速排序或者某种排序算法代码 出现次数相当频繁 5)写出查找从一个集合中输出所有子集合的算法. *6)实现strcpy函数 char*strcpy(char*dest,constchar*src) { assert((dest! =NULL)&&(src! =NULL)); char*address=dest; while('\0'! =(*dest++=*src++)); returnaddress; } 出现次数相当频繁 *7)实现strcmp函数 intmystrcmp(constchar*str1,constchar*str2) { assert((str1! =NULL)&&(str2! =NULL)); intret=0; while(! (ret=*(unsignedchar*)str1-*(unsignedchar*)str2)&&*str2) { str1++; str2++; } if(ret>0) ret=1; elseif(ret<0) ret=-1; returnret; } 出现次数相当频繁 8)将一个单链表逆序 structtest { intnumber; doublescore; test*next; } voidreverse(test*&head) { test*pe=head; test*ps=head->next; while(ps! =NULL) { pe->next=ps->next; ps->next=head; head=ps; ps=pe->next; } } 9)循环链表的节点对换和删除。 *10)将一个数字字符串转换为数字."1234"-->1234 #include usingnamespacestd; intf(char*s) { intk=0; while(*s) { k=10*k+(*s++)-'0'; } returnk; } intmain() { intdigit=f("4567"); cout< cin.get(); } 出现次数相当频繁 11)实现任意长度的整数相加或者相乘功能。 *12)写函数完成内存的拷贝 一个内存拷贝函数的实现体 void*memcpy(void*pvTo,constvoid*pvFrom,size_tsize) { assert((pvTo! =NULL)&&(pvFrom! =NULL)); byte*pbTo=(byte*)pvTo;//防止地址被改变 byte*pbFrom=(byte*)pvFrom; while(size-->0) *pbTo++=*pbForm++; returnpvTo; } 出现次数相当频繁 .笔试: 1)写一个内存拷贝函数,不用任何库函数.就是前些时候本版讨论的那个问题. void*memcpy(void*pvTo,constvoid*pvFrom,size_tsize) { assert((pvTo! =NULL)&&(pvFrom! =NULL)); byte*pbTo=pvTo; byte*pbFrom=pbFrom; while(size-->0) { *pbTo++=*pbFrom++; } returnpvTo; } 2)将一个单链表逆序.(这个问题是个常规的数据结构问题.不过不小心时会损失效率) 3)客房预定的问题.根据客户报的人数,客房等级来从预备的客房中选择出所有符合要求的 客房号.客户没有要求等级时,只考虑人数因素就可以了.要考虑有些客房已经预定的情况. (写代码是要考虑好彼此的效率) 4)对于一个无序序列进行二分查找 线排序再查找 5)将一个数字字符串转换为数字."1234"-->1234 intconvert(char*str) { intk=0; while(*str! ='\0') { k=k*10+*s++-'0'; } returnk; } 6)在文件(调用库函数创建的,不用考虑数据库的方式)中读入信息(包括职工号,职工产量) .根据输入的信息(包括职工号,职工产量)..检测是否有相同的职工号记录,如有,则增加其 产量.如没有,则创建新的记录.最后的记录排序的依据是职工产量(降序),如果产量相同,则 按职工号(升序).(具体的题目记不太清了,这个题目有点长.哪位也去笔试了.请修正一下 子) . 2.面试 1)找出两个中文句子的相似度.(例如"中国江苏南京""江苏省中国南京市".实际上是指的 同一个地方.面试官的要求是一分钟给出求相似度的算法.)(幸好听老师讲过中文分词,要不 然当场就挂了) 2)写出二分查找的代码. 3)将上述代码通用化.(在C的规范内.就是我前面所的那个问题) 4)写出在母串中查找子串出现次数的代码.(不顾及效率时好说.当时一不留神把KMP说了 出来,结果又让我描述整个过程.汗..只好从头又学了.不过没有冷场,边学边说.hoho) 5)如何看待在函数中定义很多静态变量. 6)写出quick_sort 7)写出查找从一个集合中输出所有子集合的算法. 8)有关于各种类型指针.各种数据类型的sizeof运算结果(在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函数的原型是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中标 软件 试题
![提示](https://static.bdocx.com/images/bang_tan.gif)