软件开发人员招聘笔试试题、c、c笔试试题、微软面试题、清华同方华为面试题.pdf

上传人:奔*** 文档编号:92851551 上传时间:2023-06-15 格式:PDF 页数:72 大小:8.27MB
返回 下载 相关 举报
软件开发人员招聘笔试试题、c、c笔试试题、微软面试题、清华同方华为面试题.pdf_第1页
第1页 / 共72页
软件开发人员招聘笔试试题、c、c笔试试题、微软面试题、清华同方华为面试题.pdf_第2页
第2页 / 共72页
点击查看更多>>
资源描述

《软件开发人员招聘笔试试题、c、c笔试试题、微软面试题、清华同方华为面试题.pdf》由会员分享,可在线阅读,更多相关《软件开发人员招聘笔试试题、c、c笔试试题、微软面试题、清华同方华为面试题.pdf(72页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、2002年度软件开发人员招聘笔试试题应聘者资料:姓名性别出生日期出生地地址邮政编码电话Email毕业院校毕业时间专业学历学位英语水平(资格)计算机水平(资格)要求职位和希望担任的角色待遇要求简 历(如已提供可不填)其他特长(如已提供可不填)评估意见(由招聘小组填写)试题一:基础知识1、从供选择的答案中,选出应填入下面叙述中_?_ 内的最确切的解答,把相应编号写在答卷的对应栏内。假设某计算机具有1 M 字节的内存(目前使用的计算机往往具有6 4 M字节以上的内存),并按字节编址,为了能存取该内存各地址的内容,其地址寄存器至少需要二进制_ A _ 位。为使4字节组成的字能从存储器中一次读出,要求存

2、放在存储器中的字边界对齐,一个字的地址码应一B _。若存储周期为2 0 0 N S,且每个周期可访问4个字节,则该存储器带宽为一C _ B I T/S。假如程序员可用的存储空间为4 M字节,则程序员所用的地址为D ,而真正访问内存的地址称为_ E _。供选择的答案:A:1 01 62 03 2B:最低两位为0 0最低两位为1 0最局两位为0 0最高两位为1 0C:2 0 M4 0 M8 0 M1 6 0 MD:有效地址程序地址逻辑地址物理地址E:指令物理地址内存地址数据地址2、从供选择的答案中。选出应填入下面叙述中_?_内的最确切的解答,把相应编号写在答卷的对应栏内。给定结点的关键字序列(F、

3、B、J、G、E、A、I、D、C、H),对它按字母的字典顺序进行排列,采用不同方法,其最终结果相同。但中间结果是不同的。S h e l l 排序的第一趟扫描(步长为5)结果应为冒泡排序(大数下沉)的第一趟起泡的效果是_ B _ 3.快速排序的第一趟结果是_C_。二路归并排序的第一趟结局是_D_。供选择的答案A:(B、F、G、J、A、D、I、E、H、C)(B、F、G、J,A、E、D、I、C、I I)(A、B、D、C、E、F、I、J、G、H)(C、B、D、A、E、F、I、G、J、H)B:(A、B、I)、C、F、E、I、J、H、G)(A、B、D、C、E、F、I、H、G、J)(B、F、G、E、A、I、1

4、)、C、H、J)(B、F、G、J、A、E、D、I、C、H)C:(C、B、D、A、F、E、I、J、G、H)(C、B、D、A、E、F、I、G、J、H)(B、A、D、E、F、G、I、J、H、C)(B、C、D、A、E、F、I、J、G、H)D:(B、F、G、J、A、E、D、I、G、H)(B、A、D、E、F、G、I、J、H、C)(A、B、D、C、E、F、I、J、G、H)(A、B、D、C、F、E、J、I、1 1、C)3、从供选择的答案中,选出应填入下面叙述中_?_内的最确切的解答.把相应编号写在答卷的对应栏内。进程是操作系统中的一个重要概念。进程是一个具有一定独立功能的程序在某个数据集合上的一次_A2 _。

5、进程是一个_ B 3 的概念,而程序是一个_C3_的概念。进程的最基本状态有_D4_。在一个单处理机中,若有6个用户进程,在非管态的某一时刻,处于就绪状态的用户进程最多有_ E 5 个。供选择的答案A:单独操作关联操作运行活动并发活动B:静态动态逻辑物理C:物理逻辑动态静态D:就绪、运行、隐蔽停止、就绪、运行运行、就绪、阻塞就绪、撤消、运行E:56144、软件设计中划分模块的一个准则是_ A 2一 两个模块之间的耦合方式中,_B3_耦合的耦合度最高,_C4耦合的耦合度最低。一个模块内部的内聚种类中_D4_内聚的内聚度最高,_E 1 _内聚的内聚度最低。供选择的答案A:低内聚低耦合低内聚高耦合高

6、内聚低耦合高内聚高耦合B:数据非直接控制内容C:数据非直接控制内容D:偶然逻辑功能过程E:偶然逻辑功能过程5、从供选择的答案中选出应填入下面叙述中_?内的最确切的解答,把相应编号写在答卷的对应栏内。最常用的一种基本数据模型是关系数据模型,它用统一的_ A 1 _ 结构来表示实体及实体之间的联系。关系数据库的数据操作语言(DML)主要包括_B2两类操作。关系运算以关系代数为理论基础,关系代数的最基本操作是并、差、笛卡尔积、_C4_。用 R|X|S 表 示 关 系 R和 关 系 S的_D1_。设关系R和关系S图示如下:R:ABC S:BCD T:A B C D则关系T是关系R和关系S _ E _

7、的 结 果。供选择的答案A:树网络图二维表B:插入和删除检索和更新查询和编辑统计和修改C:投影、联接联接、选择选择、投 影 交、选择D:联接笛卡尔积 I I 联接自然联接E:自然联接联接笛卡尔积并试题二:程序设计用你所熟悉的任意一种程序语言,编写一个完整的过程,将一个字符串插入到另一个字符串的某个位置后面(例如:将“abc”插 入 到“abcdef”的第三个字符位置后面,结果为“abcabcdef)。编写程序时,请在必要的地方加以注释(注:不能用该程序语言的内置函数或过程)。用你所熟悉的任意一种程序语言,编写个完整的过程,完成从一个给定的完整的文件路径(如 C:My DocumentsSoft

8、ware Test 1.00.doc)中,析取文件名,扩展名和文件所处目录的功能,编写程序时,请在必要的地方加以注释(注:不能用该程序语言的内置函数或过程)。试题三:数据库设计*城市和街道联合做主键卜面的表有问题吗?如果有,如1 可改进?城市*街道*邮政编码佛山金鱼街528000佛山大福路528000佛山季华路528000广州北京路510000广州三元里510000广州中山路510000 分成二个表,第一个表有以下字段:城市和街道,以城市作为主键;第二个表:街道和邮政编码,以街道为主键.通过街道与第一个表的街道相关联2、假设有以下的两个表:表 Cus_A和表Cus_B的结构完全相同,表 Cus

9、_A和表Cus_B中既存在ID相同的记录,也存在 ID不同的记录。现要求将ID只存在于表Cus A中而不存在于表Cus-B中的记录全部插入到 Cus_B表中,并用表Cus_A中的记录更新表Cus_B中相同的II)的记录,请写出完成这功能的存储过程。Create or procedure test isDeclare idl CusA.id%type;BeginSelect id into idl from CusA a,CusB b where a.id=b.id;3、某公司正在开发一个档案管理系统,要求在关系数据库中实现和Windows文件系统完全一致的树状文件目录。为了实现这一目录结构,至

10、少需求哪些表?请详细描述这些表的用途和 结 构(如有必要,可用图表进行描述)。最后,请用伪编码(或自然语言)描述按树状结构遍历所有档案的算法。试题四:系统设计简 述“面向对象”的概念,并设计一个学校选课系统的对象模型。简 述“软件系统的两层和多层体系结构”的 概 念(如有必要,可用图表进行描述),并指出两者的主要区别。3、简述一个软件工程的主要步骤,并指出每个步骤的明确目标及实施办法。最后分析哪些是关键步骤。试题五:综合你认为在团队开发中,你能发挥自己的能力吗?为什么?当个人意见与主管出现矛盾时J你用什么方法解决?基础知识1.下列那种语言是面向对象的(CD)A.C B.PASCAL C.C+D

11、.JAVA2.下面哪些是面向对象的基本特性(ABC)A 多 态 B 继 承 C 封 装 D 接口3.下面有关计算机操作系统的叙述中,不正确的是(B)A 操作系统属于系统软件B 操作系统只负责管理内存储器,而不管理外存储器CUNIX是一种操作系统D 计算机的处理器、内存等硬件资源也由操作系统管理高级编程1、进程和线程的区别答案:进程是系统进行资源分配和调度的单位;线程是C PU 调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。说法一:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.线程是进程的一个实体,是CPU调度和

12、分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部货源.一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行2 malloc和 new的区别答案:new是 C+的关键字。malloc在分配内存时必须按给出的字节分配,new可以按照对象的大小自动分配,并且能调用构造函数。可以说new 是对象的对象,而 malloc不是。本质上new分配内存时,还会在实际内存块的前后加上附加信息,所以new所使用的内存大小比malloc多。1

13、、new 是 C+中的操作符,malloc是 c 中的一个标准库函数;2,new 可以按照对象的大小自动分配,并 且 new 在分配内存时还会在实际内存块的前后加上附加信息,所 以 new 所使用的内存大小会比malloc多,而 且 new 在分配内存的同时会调用类的构造函数,而 malloc在分配内存时必须按给出的字节分配,也不会进行初始化类成员的工作,即不能够把执行构造函数任务强加于malloc。3、内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的 那 行,而 malloc没有这些信息。3、头文件中的ifndef/define/endif干什么用答案:

14、防止该头文件被重复引用。4、在 C+程序中调用被C 编译器编译后的函数,为什么要加extern“C”声明答案:C+语言支持函数重载,C语言不支持函数重裁。函数被C+编译后在库中的名字与C语言的不同。假设某个函数的原型为:void foo(int x,int y);该函数被C编译器编译后在库中的名字为_ 砧。,而C+编译器则会产生像_foo_int_int之类的名字。C+提供了 C连接交换指定符号extern“C”来解决名字匹配问题。作为一种面向对象的语言,C+支持函数重载,而过程式语言C则不支持。函数被C+编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:voidfoo(int

15、x,int y);该函数被C编译器编译后在符号库中的名字为_fo。,而C+编译器则会产生像_foo_int_int之类的名字(_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C+就是靠这种机制来实现函数重载的。例如,在C+中,函数void foo(int x,iniy)1 j void foo(int x,float y)编译生成的符号是不相同的,后者为_foo_int_float。)。为此C+提供了 C连接交换指定符号extern C,被extern”C”修饰的变量和函数是按照C语言方式编译和连接的,如此来解决名字匹配问题。5、指明以下const的作用void Get

16、Value(const char*in_szName,char*out_szValue);答案:in-szName被强制保护,函数中不允许对其做修改,可以预防意外的变动,程序中使用const有利于提高程序的健壮性。6、请填写float,指 针 变 量 与“零值”比较的i f语句提示:这 里“零值”可以是0,0.0或 者“空 指 针 例 如in t变 量n与“零值”比较的i f语句为:if(n=0)if(n!=0)以此类推。请 写 出float x与“零值”比较的i f语句:答案:const float EPSINON=0.00001;if(x=-EPSINON)&(x v=EPSINON)不

17、可 将 浮 点 变 量 用 或“!=”与数字比较,应该设法转化成“=或“=”此类形式。请 写 出char*p与“零值”比较的i f语句:答案:if(p=NULL)if(p!=NULL)7、以下为Windows N T下的32位C+程序,请计算sizeof的值char strlJ=Hello”;char*p=str;int n=10;请计算sizeof(str)=6sizeof(p)=4sizeof(n)=4void Func(char strflOO)(请计算sizeof(str)=4)void*p=malloc(100);请计算sizeof(p)=48、有关内存的思考void GetMemo

18、ry(char*p)p=(char*)malloc(100);)void Test(void)(char*str=NULL;GetMemory(str);strcpy(str,nhello world*1);printf(str);请问运行T est函数会有什么样的结果?答案:程序崩溃。因为GetMemory并不能传递动态内存,Test函数中的str 一直 都 是 NULLostrcpy(str,uhello world);将使程序崩溃。char*GetMemory(void)(char p=hello world11;return p;)void Test(void)(char*str=NU

19、LL;str=GetMemoryO;printf(str);)请问运行Test函数会有什么样的结果?答案:可能是乱码。因 为 GetMemory返回的是指向“栈内存”的指针,该指针的地址不是N U LL,但其原现的内容已经被清除,新内容不可知。void GetMemory2(char*p,int num)*p=(char*)malloc(num);)void Test(void)(char*str=NULL;GetMemory(&str,100);strcpy(str,HhelloH);printf(str);请问运行Test函数会有什么样的结果?答案:(1)能够输出hello(2)内存泄漏v

20、oid Test(void)(char*str=(char*)malloc(lOO);strcpy(str,hello”);free(str);if(str!=NULL)(strcpy(str,world”);printf(str);)请问运行Test函数会有什么样的结果?答案:篡改动态内存区的内容,后果难以预料,非常危险。因为free(str);之后,str成为野指针,if(str!=NULL)语句不起作用。9、找错题void test 1()(char stringflO;char*strl=0123456789”;strcpy(string,strl);)答案:字符串strl需 要11个

21、字节才能存放已有内容,因为字符串是以0作为结束的,而string只分配了 10个字节的空间,strcpy将导致数组越界。10、编写strcpy函数已知strcpy函数的原型是char*strcpy(char*strDest,const char*strSrc);其 中strDest是目的字符串,strSrc是源字符串。不调用C+/C的字符串库函数,请编写函数strcpy答案:char*strcpy(char*strDest,const char*strSrc);(assert(strDest!=NULL)&(strSrc!=NULL);/assert()用于判断括号内的条件是否为真,为真时继续

22、执行程序,为假时就终止该程序。char*address=strDest;while(*strDest+=*strSrc+)!=0)return address;C+/C试题本试题仅用于考查C+/C程序员的基本编程技能。内容限于C+/C常用语法,不涉及数据结构、算法以及深奥的语法。考试成绩能反映出考生的编程质量以及对C+/C的理解程度,但不能反映考生的智力和软件开发能力。笔试时间90分钟。请考生认真答题,切勿轻视。一、请填写BOOL,float,指 针 变 量 与“零值”比较的i f 语句。(10分)提示:这 里“零值”可以是0,0.0,FALSE或 者“空指针”。例 如 in t变 量 n 与

23、“零值”比较 的 i f 语句为:if(n=0)if(n!=0)以此类推。请 写 出 BOOL flag与“零值”比较 的 i f 语句:请 写 出 float x 与“零值”比较的i f 语句:请 写 出 char*p 与“零值”比较的i f 语句:二、以下为Windows NT下的32位 C+程序,请计算sizeof的 值(10分)char str=Hello”;void Func(char strflOO)char*p=str;(int n=10;请计算请计算sizeof(str)=sizeof(str)=)sizeof(p)=void*p=malloc(100);请计算sizeof(n

24、)=sizeof(p)=三、简 答 题(25分)1、头文件中的ifndef/define/endif干什么用?2、#include 和#include filename.h”有什么区别?3、const有什么用途?(请至少说明两种)4、在 C+程序中调用被C 编译器编译后的函数,为什么要加extern“C”声明?5、请简述以下两个for循环的优缺点/第一个for(i=0;iN;i+)(if(condition)DoSomethingO;elseDoOtherthingO;)/第二个if(condition)(for(i=0;iN;i+)DoSomethingO;)else(for(i=0;i=-

25、EPSINON)&(x=”或“=”此类形式。if(x !=0.0)请 写 出char*p与“零值”比较的if语句。(3分)标准答案:如下写法均属不良风格,不得分。if(p=N U LL)if(p=0)if(p!=N U LL)if(p!=0)if(p)if(!)二、以下为Windows NT下的32位 C+程序,请计算sizeof的 值(10分)char str=H el l o”;v o id F u n c(char str 1 0 0)char*p=str;(in t n =1 0;请计算请计算sizeof(str)=4(2 分)sizeof(str)=6(2 分)sizeof(p)=4

26、(2 分)v o id*p=mal l o c(1 0 0 );请计算sizeof(n)=4(2 分)sizeof(p)=4(2 分)三、简 答 题(25分)1、头文件中的ifn def/defin e/en dif干什么用?(5分)答:防止该头文件被重复引用。2、#in cl u de 和#in cl u de fil en ame.h”有什么区别?(5 分)答:对于#include ,编译器从标准库路径开始搜索filename.h对于#include“filename.h”,编译器从用户的工作路径开始搜索filename.h3、co n st有什么用途?(请至少说明两种)(5分)答:(1)

27、可以定义const常量(2)const可以修饰函数的参数、返回值,甚至函数的定义体。被 const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。4、在 C+程序中调用被C编译器编译后的函数,为什么要加e x te rn“C”?(5分)答:C+语言支持函数重载,C 语言不支持函数重载。函数被C+编译后在库中的名字与C语言的不同。假设某个函数的原型为:void f oo(int x,int y);该函数被C 编译器编译后在库中的名字为一foo,而 C+编译器则会产生像一foo_int_int之类的名字。C+提供了 C 连接交换指定符号extern C 来解决名字匹配问题。5、请

28、简述以下两个for循环的优缺点(5 分)f or(i=0;iN;i+)(if (c ond ition)D oS ome thing O ;e lseD oO the rthing O ;if (c ond ition)(f or(i=0;iN;i+)D oS ome thing O ;)e lsef or(i=0;iN;i+)D oO the rthing O ;)优点:程序简洁缺点:多执行了 NT次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。优点:循环的效率高缺点:程序不简洁四、有关内存的思考题(每小题5 分,共 20分)void G e tM e

29、 mory(c ha r*p)c ha r*G e tM e mory(void)tp=(c ha r*)ma lloc(1 0 0);tc ha r p =he llo world”;re turn p;void T e st(void)(void T e st(void)c ha r*str=N U L L;(G e tM e mory(str);strc py(str,he llo world );printf(str);请问运行T e st函数会有什么样的结果?答:程序崩溃。因为GetMemory并不能传递动态内存,T e st函数中的str 一直 都 是 N U L L。strc p

30、y(str,he llo world );将使程序崩溃。c ha r*str=N U L L;str=G e tM e mory();printf(str);)请问运行T e st函数会有什么样的结果?答:可能是乱码。因为G e tM e mory返回的是指向“栈内存”的指针,该指针的地址不是N U L L,但其原现的内容已经被清除,新内容不可知。void G e tM e mory2(c ha r*p,int num)(*p=(c ha r*)ma lloc(num);void T e st(void)(c ha r*str=N U L L;G e tM e mory(&str,1 0 0)

31、;strc py(str,he llo);printf(str);)请问运行T e st函数会有什么样的结果?答:(1)能够输出he llo(2)内存泄漏void T e st(void)(c ha r*str=(c ha r*)ma lloc(1 0 0);strc py(str,he llo);f re e (str);if(str!=N U L L)(strc py(str,“world”);printf(str);)请问运行T e st函数会有什么样的结果?答:篡改动态内存区的内容,后果难以预料,非常危险。因为f re e (str);之后,str成为野指针,if (str!=N U

32、L L)语句不起作用。五、编写strcpy函 数(10分)已知strc py函数的原型是c ha r*strc py(c ha r*strD e st,c onst c ha r*strS rc);其中strD e st是目的字符串,strS rc 是源字符串。(1)不调用C+/C 的字符串库函数,请编写函数strc pychar*strcpy(char*strDest,const char*strSrc);(a sse rt(strD e st!=N U L L)&(strS rc !=N U L L);/2 分c ha r*a d d re ss=strD e st;/2 分while (

33、*strD e st+=*strS rc+)1=0 )/2 分N U L L ;re turn a d d re ss;/2 分(2)strc py能把strS rc 的内容复制到strD e st,为什么还要c ha r*类型的返回值?答:为了实现链式表达式。/2 分例如 int length=strlen(strcpy(strDest,uhello world);六、编写类String的构造函数、析构函数和赋值 函 数(25分)J知类S tr ing的原型为:c la s s S tr ing(p u b lic:S tr ing(c ons t c ha r *s tr =N U LL)

34、;/普通构造函数S tr ing(c ons t S tr ing&othe r);/拷贝构造函数z S tr ing(v oid);/析构函数S tr ing&op e r a te =(c ons t S tr ing&othe r);赋值函数p r iv a te:c ha r *m_ d a ta;/用于保存字符串);请编写S tr ing的上述4 个函数。标准答案:/S tr ing的析构函数String:S tr ing(v oid)3 分(d e le te 口 m_ d a ta;/由于m_ d a ta 是内部数据类型,也可以写成d e le te m_ d a ta;)/S

35、 tr ing的普通构造函数String:S tr ing(c ons t c ha r *s tr)6 分(if(s tr=N U LL)m_ d a ta =ne w c ha r l;/若 能 加 N U LL判断则更好*m_ d a ta -0;)e ls e(int le ngth=s tr le n(s tr);m_ d a ta =ne w c ha r 1 e ngth+1;/若能加 N U LL 判断则更好s tr c p y(m_ d a ta,s tr);)/拷贝构造函数S tr ing:S tr ing(c ons t S tr ing&othe r)3 分int le

36、 ngth=s tr le n(othe r.m_ d a ta);m_ d a ta =ne w c ha r le ngth+l;/若能加 N U LL 判断则更好s tr c p y(m_ d a ta,othe r.m_ d a ta);)/赋值函数S tr ing&S tr ing:op e r a te =(c ons t S tr ing&othe r)/13 分(/检 查 自 赋 值 4 分if(this -&othe r)r e tu r n*this;/(2)释放原有的内存资源 3 分d e le te 口 m_ d a ta;/(3)分配新的内存资源,并复制内容 3 分i

37、nt le ngth=s tr le n(othe r.m_ d a ta);m_ d a ta =ne w c ha r le ngth+l;/若能加 N U LL 判断则更好s tr c p y(m_ d a ta,othe r.m_ d a ta);/(4)返回本对象的引用 3 分r e tu r n*this;)C+/C代码审查表文件结构重要性审查项结论头文件和定义文件的名称是否合理?头文件和定义文件的目录结构是否合理?版权和版本声明是否完整?重要头文件是否使用了 ifndef/define/endif预处理块?头文件中是否只存放“声明”而不存放“定义”.程序的版式重要性审查项结论空行

38、是否得体?代码行内的空格是否得体?长行拆分是否得体?“”和是否各占一行并且对齐于同一列?重要一行代码是否只做一件事?如只定义一个变量,只写一条语句。重要If、for、while,d o等语句自占一行,不论执行语句多少都要加“重要在定义变量(或参数)时,是否将修饰符*和&紧靠变量名?注释是否清晰并且必要?重要注释是否有错误或者可能导致误解?重要类结构的public,protected,private顺序是否在所有的程序中保持一致?.命名规则重要性审查项结论重要命名规则是否与所采用的操作系统或开发工具的风格保持一致?标识符是否直观且可以拼读?标 识 符 的 长 度 应 当 符 合“min-leng

39、th&max-informat ion w 原则?重要程序中是否出现相同的局部变量和全部变量?类名、函数名、变量和参数、常量的书写格式是否遵循定的规则?静态变量、全局变量、类的成员变量是否加前缀?.表达式与基本语句重要性审查项结论重要如果代码行中的运算符比较多,是否一经用括号清楚地确定表达式的操作顺序?是否编写太复杂或者多用途的复合表达式?重要是否将复合表达式与“真正的数学表达式”混淆?重要是否用隐含错误的方式写if语句?例如(1)将布尔变量直接与T R U E、F A L S E或 者1、0进行比较。(2)将浮点变量用“=或*!=”与任何数字比较。(3)将指针变量用“=或 !=”与N U L

40、 L比较。如果循环体内存在逻辑判断,并且循环次数很大,是否已经将逻辑判断移到循环体的外面?重要C as e语句的结尾是否忘了加b r e ak?重要是否忘记写s wi tc h的d e fault分支?重要使 用go to语句时是否留下隐患?例如跳过了某些对象的构造、变量的初始化、重要的计算等。.常量重要性审查项结论是否使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串?在C+程序中,是否用c o ns t常量取代宏常量?重要如果某一常量与其它常量密切相关,是否在定义中包含了这种关系?是否误解了类中的c o ns t数据成员?因为c o ns t数据成员只在某个对象生存期内是常量,而

41、对于整个类而言却是可变的。.函数设计重要性审查项结论参数的书写是否完整?不要贪图省事只写参数的类型而省略参数名字。参数命名、顺序是否合理?参数的个数是否太多?是否使用类型和数目不确定的参数?是否省略了函数返回值的类型?函数名字与返回值类型在语义上是否冲突?重要是否将正常值和错误标志混在一起返回?正常值应当用输出参数获得,而错误标志用r e t u r n语句返回。重要在函数体的“入口处”,是 否 用a s s e r t对参数的有效性进行检查?重要使用滥用了 a s s e r t?例如混淆非法情况与错误情况,后者是必然存在的并且是定要作出处理的。重要r e t u r n语句是否返回指向“栈

42、内存”的“指针”或者“引用”?是否使用const提高函数的健壮性?const可以强制保护函数的参数、返回值,甚至函数的定义体。“Use constwhenever you need”.内存管理重要性审查项结论重要用m alloc或new申请内存之后,是否立即检查指针值是否为NULL?(防止使用指针值为NULL的内存)重要是否忘记为数组和动态内存赋初值?(防止将未被初始化的内存作为右值使用)重要数组或指针的下标是否越界?重要动态内存的申请与释放是否配对?(防止内存泄漏)重要是否有效地处理了“内存耗尽”问题?重要是否修改“指向常量的指针”的内容?重要是否出现野指针?例如(1)指针变量没有被初始化。

43、(2)用free或delete释放了内存之后,忘记将指针设置为 NULLo重要是否将malloc/free和new/delete混淆使用?重要m alloc语句是否正确无误?例如字节数是否正确?类型转换是否正确?重要在创建与释放动态对象数组时,ncw/delcte的语句是否正确无误?.C+函数的高级特性重要性审查项结论重载函数是否有二义性?重要是否混淆了成员函数的重载、覆盖与隐藏?运算符的重载是否符合制定的编程规范?是否滥用内联函数?例如函数体内的代码比较长,函数体内出现循环。重要是否用内联函数取代了宏代码?.类的构造函数、析构函数和赋值函数重要性审查项结论重要是否违背编程规范而让C+编译器自

44、动为类产生四个缺省的函数:(1)缺省的无参数构造函数;(2)缺省的拷贝构造函数;(3)缺省的析构函数;(4)缺省的赋值函数。重要构造函数中是否遗漏了某些初始化工作?重要是否正确地使用构造函数的初始化表?重要析构函数中是否遗漏了某些清除工作?是否错写、错用了拷贝构造函数和赋值函数?重要赋值函数一般分四个步骤:(1)检查自赋值;(2)释放原有内存资源;(3)分配新的内存资源,并复制内容;(4)返 回*t h i s。是否遗漏了重要步骤?重要是否正确地编写了派生类的构造函数、析构函数、赋值函数?注意事项:(1)派生类不可能继承基类的构造函数、析构函数、赋值函数。(2)派生类的构造函数应在其初始化表里

45、调用基类的构造函数。(3)基类与派生类的析构函数应该为虚(即加v i r t u a l关键字)。(4)在编写派生类的赋值函数时,注意不要忘记对基类的数据成员重新赋值。.类的高级特性重要性审查项结论重要是否违背了继承和组合的规则?(1)若在逻辑上B是A的“种”,并且A的所有功能和属性对B而言都有意义,则允许B继承A的功能和属性。(2)若在逻辑上A是B的“一部分”(a p a r t o f),则不允许B从A派生,而是要用A和其它东西组合出B。.其它常见问题重要性审查项结论重要数据类型问题:(1)变量的数据类型有错误吗?(2)存在不同数据类型的赋值吗?(3)存在不同数据类型的比较吗?重要变量值问

46、题:(1)变量的初始化或缺省值有错误吗?(2)变量发生上溢或下溢吗?(3)变量的精度够吗?重要逻辑判断问题:(1)由于精度原因导致比较无效吗?(2)表达式中的优先级有误吗?(3)逻辑判断结果颠倒吗?重要循环问题:(1)循环终止条件不正确吗?(2)无法正常终止(死循环)吗?(3)错误地修改循环变量吗?(4)存在误差累积吗?重要错误处理问题:(1)忘记进行错误处理吗?1#i nclude filename.h”和#i nclude 的区另ij?(2)错误处理程序块一直没有机会被运行?(3)错误处理程序块本身就有毛病吗?如报告的错误与实际错误不一致,处理方式不正确等等。(4)错误处理程序块是“马后炮

47、”吗?如在被它被调用之前软件已经出错。重要文件I/O问题:(1)对不存在的或者错误的文件进行操作吗?(2)文件以不正确的方式打开吗?(3)文件结束判断不正确吗?(4)没有正确地关闭文件吗?答:对于#i nclude 编译器从标准库开始搜索filename.h对于#i nclude“filename.h”编译器从用户工作路径开始搜索filename.h2头文件的作用是什么?答:、通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可;用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。二、头文件能

48、加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。3 C+函数中值的传递方式有哪几种?答:C+函数的三种传递方式为:值传递、指针传递和引用传递。4内存的分配方式的分配方式有几种?答:一、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。二、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。三、从堆上分配,亦称动态内存分配

49、。程序在运行的时候用malloc或 new 申请任意多少的内存,程序员自己负责在何时用free或 delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。5实现双向链表删除一个节点P,在节点P 后插入一个节点,写出这两个函数;答:双向链表删除一个节点Ptemplate void list:delnode(int p)(int k=1;listnode*ptr,*t;ptr=first;while(ptr-next!=NULL&k!=p)ptr=ptr-next;k+;t=ptr-next;coutvv”你 已经将数据项,t-d ata,J*en d l;ptr-next=

50、ptr-next-next;length;delete t;)在节点P 后插入一个节点:templateclass typo bool list:insert(type t,int p)(listnode*ptr;ptr=first;int k=l;while(ptr!=NULL&knext;k+;)if(ptr=NULL&k!=p)return false;else(listnode 九 p;tp=new listnode;tp-data=t;tp-next=ptr-next;ptr-next=tp;length+;return true;)6写一个函数,将其中的 t 都转换成4 个空格。v

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁