第六十六天学习记录:《高质量C/C++编程指南》中附录的考试试卷(含答案)

news2024/11/24 3:48:26

该试卷转载自林锐《高质量C/C++编程指南》,先贴下原作者的版权声明。
版权声明:本书的大部分内容取材于作者一年前的书籍手稿(尚未出版),现整理汇编成为上海贝尔网络应用事业部的一个规范化文件,同时作为培训教材。由于C++/C编程是众所周知的技术,没有秘密可言。编程的好经验应该大家共享,我们自己也是这么学来的。作者愿意公开本书的电子文档。版权声明如下:(1)读者可以任意拷贝、修改本书的内容,但不可以篡改作者及所属单位。(2)未经作者许可,不得出版或大量印发本书。(3)如果竞争对手公司的员工得到本书,请勿公开使用,以免发生纠纷。预计到2002年7月,我们将建立切合中国国情的CMMI3级解决方案。届时,包括本书在内的约1000页规范将严格受控。欢迎读者对本书提出批评建议。林锐,2001年7月

附录B: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)=
void Func(char str[100])
{
请计算
		sizeof(str)=
}
void* p=malloc(100);
请计算
		sizeof(p)=

三、简答题(25分)
1、头文件中的ifndef/define/endif干什么用?

2、#include<filename.h>和#include“filename.h”有什么区别?

3、const有什么用途?(请至少说明两种)

4、在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”声明?

5、请简述以下两个for循环的优缺点。
第一个:

for(i=0;i<N;i++)
{
	if(condition)
		DoSomething();
	else
		DoOtherthing();
}

优点:
缺点:

if(condition)
{
	for(i=0;i<N;i++)
		DoSomething();
}
else
{
	for(i=0;i<N;i++)
		DoOtherthing();
}

优点:
缺点:

四、有关内存的思考题(20分)

void GetMemory(char* p)
{
	p=(char*)malloc(100);
}
void Test(void)
{
	char* str=NULL;
	GetMemory(str);
	strcpy(str,"hello world");
	print(str);
}

请问运行Test函数会有怎样的结果?

void* GetMemory(void)
{
	char p[]="hello world";
	return p;
}
void Test(void)
{
	char* str=NULL;
	str=GetMemory();
	print(str);
}

请问运行Test函数会有怎样的结果?

void  GetMemory2(char **p,int num)
{
	*p=(char*)malloc(num);
}
void Test(void)
{
	char* str=NULL;
	GetMemory(&str,100);
	strcpy(str,"hello");
	print(str);
}

请问运行Test函数会有怎样的结果?

void Test(void)
{
	char* str=(char*)malloc(100);
	strcpy(str,"hello");
	free(str);
	if(str!=NULL)
	{
		strcpy(str,"world");
		print(str);
	}
}

请问运行Test函数会有怎样的结果?

五、编写strcpy函数(10分)已知strcpy函数的原型是charstrcpy(charstrDest,const char*strSrc);其中strDest是目的字符串,strSrc是源字符串。
(1)不调用C++/C的字符串库函数,请编写函数strcpy


(2)strcpy能把strSrc的内容复制到strDest,为什么还要char*类型的返回值?

六、编写类String的构造函数、析构函数和赋值函数(25分)
已知类String的原型为:

classString
{
	public:
		String(const char* str=NULL); //普通构造函数
		String(const String &other);//拷贝构造函数
		~String(void);//析构函数
		String & operate = (const String &other);//赋值函数
	private:
		char* m_data;//用于保存字符串
};

请编写String的上述4个函数。

附录B: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语句:

标准答案:
if(flag)
if(!flag)
如下写法均属不良风格,不得分。
if(flag==TRUE)
if(flag==1)
if(flag==FALSE)
if(flag==0)
我的答案:属于不良风格……0分
	if(flag!=TRUE)
	if(flag==FALSE)

请写出float x与“零值”比较的if语句:

标准答案示例:
constfloatEPSINON=0.00001;
if((x>=-EPSINON)&&(x<=EPSINON)
不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“>=”或“<=”此类形式。
我的答案:是错误的写法,0分。
	if(x==0.0)
	if(x!=0.0)

请写出char* p与“零值”比较的if语句:

标准答案:
if(p==NULL)
if(p!=NULL)
我的答案:3分
	if(p==NULL)
	if(p!=NULL)

二、以下为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分
void Func(char str[100])
{
请计算
		sizeof(str)=4        我的答案:sizeof(str)=100 错误 0分 这题太粗心了……
}
void* p=malloc(100);
请计算
		sizeof(p)=4 我的答案:正确 2分

三、简答题(25分)
1、头文件中的ifndef/define/endif干什么用?
标准答案:
答:防止该头文件被重复引用。
我的答案:
答:总体来说,头文件中的ifndef/define/endif是防止头文件在被重复引用时多次进行调用而加的限制。ifndef就是指该头文件如果被定义,就define定义以下头文件的内容直到endif结束。这样当下一次重复引用该头文件的时候,ifndef到endif之间的内容就不再被执行。

2、#include<filename.h>和#include“filename.h”有什么区别?
标准答案:
答:对于#include<filename.h>,编译器从标准库路径开始搜索filename.h对于#include“filename.h”,编译器从用户的工作路径开始搜索filename.h
我的答案:
答:#include<filename.h>是直接从编译器库的安装路径查找头文件名字,若没有则报错。#include“filename.h”则是先在工程文件目录下查找头文件名字,若没有再从编译器库的安装路径查找头文件名字。

3、const有什么用途?(请至少说明两种)
标准答案:
答:(1)可以定义const常量(2)const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
我的答案:
答:一、定义常量,例如const int a;定义后a的值无法被变更。
二、修饰函数的形参,在执行函数时加了const修饰的形参所对应的实参值不会被变更,使得程序更加健壮。
三、修饰指针,常量指针和指针常量。

4、在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”声明?
标准答案:
答:C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为:void foo(intx,inty);该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。
我的答案:
答:因为C++编译器无法直接编译.c文件,需要加extern“C”声明后编译器才会将extern“C”声明的内容通过C语言的方式进行编译。

5、请简述以下两个for循环的优缺点。
第一个:

for(i=0;i<N;i++)
{
	if(condition)
		DoSomething();
	else
		DoOtherthing();
}

标准答案:
优点:程序简洁
缺点:多执行了N-1次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。
我的答案:
优点:代码量较少
缺点:循环体每进行一次,if,else就会进行一次重复的条件判断,造成资源浪费。
第二个:

if(condition)
{
	for(i=0;i<N;i++)
		DoSomething();
}
else
{
	for(i=0;i<N;i++)
		DoOtherthing();
}

标准答案:
优点:循环的效率高
缺点:程序不简洁
我的答案:
优点:资源浪费相对第一种较少
缺点:代码量较大

四、有关内存的思考题(20分)

void GetMemory(char* p)
{
	p=(char*)malloc(100);
}
void Test(void)
{
	char* str=NULL;
	GetMemory(str);
	strcpy(str,"hello world");
	print(str);
}

请问运行Test函数会有怎样的结果?
标准答案:
答:程序崩溃。因为GetMemory并不能传递动态内存,Test函数中的str一直都是NULL。strcpy(str,“helloworld”);将使程序崩溃。
我的答案:
答:会造成程序崩溃,因为函数GetMemory并没有真正的将str指针的地址传过去,str仍然是空指针,直接对空指针进行操作会造成程序崩溃。

void* GetMemory(void)
{
	char p[]="hello world";
	return p;
}
void Test(void)
{
	char* str=NULL;
	str=GetMemory();
	print(str);
}

请问运行Test函数会有怎样的结果?
标准答案:
答:可能是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是NULL,但其原现的内容已经被清除,新内容不可知。
我的答案:
答:会造成非法访问。函数结束后,p指针所在内存已经被释放,不能再对其指针的内容进行访问。

void  GetMemory2(char **p,int num)
{
	*p=(char*)malloc(num);
}
void Test(void)
{
	char* str=NULL;
	GetMemory(&str,100);
	strcpy(str,"hello");
	print(str);
}

请问运行Test函数会有怎样的结果?
标准答案:
答:(1)能够输出hello(2)内存泄漏
我的答案:
答:会造成内存泄漏,因为malloc之后没有进行free。

void Test(void)
{
	char* str=(char*)malloc(100);
	strcpy(str,"hello");
	free(str);
	if(str!=NULL)
	{
		strcpy(str,"world");
		print(str);
	}
}

请问运行Test函数会有怎样的结果?
标准答案:
答:篡改动态内存区的内容,后果难以预料,非常危险。因为free(str);之后,str成为野指针,if(str!=NULL)语句不起作用。
我的答案:
答:会造成非法访问,free之后,str指针所指的空间已被释放,不能再对其进行访问。而free之后str本身不会变成NULL。

五、编写strcpy函数(10分)已知strcpy函数的原型是charstrcpy(charstrDest,const char*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分
	}

我的答案:
答:

char* my_strcpy(char*strDest,const char*strSrc)
{
	assert(strDest&&strSrc);
	char* p=strDest;
	while(*strDest++=*strSrc++)
	{
		;
	}
	return p;
}

(2)strcpy能把strSrc的内容复制到strDest,为什么还要char*类型的返回值?
标准答案:
答:为了实现链式表达式。例如intlength=strlen(strcpy(strDest,“helloworld”));
我的答案:
答:函数返回的是源字符串的首地址。这是为了防止strSrc的首地址再后续中还会被其他函数调用。

六、编写类String的构造函数、析构函数和赋值函数(25分)
已知类String的原型为:

classString
{
	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::~String(void)//3分
{
	delete [] m_data;//由于m_data是内部数据类型,也可以写成delete m_data;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我的答案:
因为还没开始对C++进行系统性学习,这里做得一塌糊涂……就不贴出来献丑了……

总结

这套题考查的是基本编程能力……但是最后得分很尴尬,如果是“有人情味”大学老师,些许能给个“60分万岁”。但如果稍微严厉一点就肯定不及格。而且其中内存那一块的题还是上C语言视频课时老师讲的原题。
看来路还很长……学无止境……
不过要是没有这2个月的学习,这套题我能拿到的分数估计只有个位数……都不知道我这4年的Qt工作是怎么做下来的……

对于考卷一些内容对ChatAI的提问:
问:const floatEPSINON=0.00001;
答:
这行代码定义了一个名为 EPSINON 的浮点型常量,并将其赋值为 0.00001。常量使用 const 关键字来修饰,以指出它们的值不能被修改。在这个例子中,我们定义了一个用于比较两个浮点数是否相等的精度值,也可以理解为一个允许的误差范围(即在这个误差范围内,可以认为两个浮点数相等)。在很多需要进行浮点数比较的算法中,通常会定义一个这样的常量,以确保比较的正确性和精度。

问:delete [] m_data;和delete m_data;的区别
答:
在 C++ 中,当我们利用 new 操作符动态分配内存以后,就需要利用 delete 操作符来释放这些内存,以免出现内存泄漏。delete 操作符有两种形式,即:

  • delete:用于释放单个对象所占用的内存。
  • delete[]:用于释放数组所占用的内存。

它们的区别在于,delete 释放一个单独的对象所占用的内存,而 delete[] 释放数组中的所有元素所占用的内存,包括数组对象本身。如果你使用 delete 来释放数组内存,则可能会造成内存泄漏,因为它只会释放数组对象本身的内存,而不会释放数组元素的内存,这就会导致内存泄漏。

假设你在动态分配内存时使用了 new[] 操作符,那么就应该使用 delete[] 来释放这段内存,否则会导致内存泄漏和未定义的行为。而在使用 new 来动态分配单个对象的内存时,则需要使用 delete 来释放这段内存。

在具体实现中,delete[] 操作符在释放数组时,会遍历数组的所有元素,并逐个调用元素的析构函数,然后再释放内存。而 delete 操作符只会调用单个对象的析构函数,并释放该对象的内存。因此,在释放动态分配的数组内存时,我们需要使用 delete[] 操作符,而不是 delete 操作符。

最后贴上该书作者写在导读的话:
首先请做附录B的C++/C试题(不要看答案),考查自己的编程质量究竟如何。然后参照答案严格打分。(1)如果你只得了几十分,请不要声张,也不要太难过。编程质量差往往是由于不良习惯造成的,与人的智力、能力没有多大关系,还是有药可救的。成绩越差,可以进步的空间就越大,中国不就是在落后中赶超发达资本主义国家吗?只要你能下决心改掉不良的编程习惯,第二次考试就能及格了。(2)如果你考及格了,表明你的技术基础不错,希望你能虚心学习、不断进步。如果你还没有找到合适的工作单位,不妨到上海贝尔试一试。(3)如果你考出85分以上的好成绩,你有义务和资格为你所在的团队作“C++/C编程”培训。希望你能和我们多多交流、相互促进。半年前我曾经发现一颗好苗子,就把他挖到我们小组来。(4)如果你在没有任何提示的情况下考了满分,希望你能收我做你的徒弟。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/615043.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python如何分配内存

Python如何分配内存 Python是一种动态解释型语言&#xff0c;它在运行时分配内存用于存储变量和对象。Python提供了一种内存管理机制&#xff0c;它能够动态地分配和管理内存。本文将介绍Python如何分配内存并讨论与之相关的一些最佳实践。 Python内存管理机制 Python中的所…

Vue.js 中的性能优化是什么?如何进行性能优化?

Vue.js 中的性能优化是什么&#xff1f;如何进行性能优化&#xff1f; Vue.js 是一款流行的前端框架&#xff0c;它具有响应式数据绑定、组件化开发、虚拟 DOM 等特性&#xff0c;使得开发者可以更加高效地构建交互式的用户界面。然而&#xff0c;在实际开发中&#xff0c;由于…

LeetCode 2352. 相等行列对:手动哈希

【LetMeFly】2352.相等行列对&#xff1a;手动哈希 力扣题目链接&#xff1a;https://leetcode.cn/problems/equal-row-and-column-pairs/ 给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid &#xff0c;返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。 如果行和…

ArduPilot之H743遗留配置问题解决

ArduPilot之H743遗留配置问题解决 1. 源由2. 资源3 遗留问题汇总3.1 问题一&#xff1a;无法设置VTX 600m3.2 问题二&#xff1a;双向Dshot未显示RMP转速3.3 问题三&#xff1a;mavlink esp32 2.4G WiFi电传 4. 参考资料 1. 源由 在ArduPilot开源代码之H743BMI270x2ChibiOS配置…

步进电机相数、细分、步距角、接线方法

1、旋转步进电机 旋转步进电机就是电机是一步一步转动的&#xff0c;故叫旋转步进电动机。每输入一个脉冲冲信号&#xff0c;该电动机就转过一定的角度&#xff0c;因此旋转步进电机是一种把脉冲变为角度位移的执行元件。 可通过脉冲频率控制步进电机的旋转速度&#xff0c;通…

ChatGPT中文版提示词学习手册, 学完工作效率提升百倍!

既然你对ChatGPT及其功能有了⼀些了解&#xff0c;让我们更深入地了解⼀下ChatGPT是什么以及它是如何工作的。 那么ChatGPT是如何工作的呢&#xff1f;在高层次上&#xff0c;这个过程可以分解为以下步骤&#xff1a; 1. 用户将文本输入ChatGPT界面。这可能是一个问题&#xf…

Android AIDL的使用(配源码)

零、完整源代码 链接: https://github.com/jx0260/TestGradle 一、创建AIDL文件 // IShopAidlInterface.aidl package com.example.testgradle;// Declare any non-default types here with import statementsinterface IShopAidlInterface {String getProductInfo(int prod…

speedtest-cli 源码集成

speedtest-cli 是一个开源的测速sdk&#xff0c;可以下载源码集成到自己的项目中&#xff0c;源码是C代码&#xff0c;所以可以集成到linux终端程序中&#xff0c;如果在Android APP中需要通过NDK开发集成&#xff0c;下面是在linux设备中集成过程。 1、首先在github中下载源码…

代码随想录算法训练营第四十九天|121. 买卖股票的最佳时机|122.买卖股票的最佳时机II

LeetCode121. 买卖股票的最佳时机 动态规划五部曲&#xff1a; 1&#xff0c;确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i][0] 表示第i天持有股票所得最多现金&#xff0c;其实一开始现金是0&#xff0c;那么加入第i天买入股票现金就是 -pric…

界面组件DevExpress Reporting v22.2亮点 - 添加更多自定义支持

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表 界面组件DevExpress Reporting v22.2已正式发布一…

CDN如何帮助我们的网站实现安全?

各类网络攻击正在变得越来越复杂&#xff0c;它们有可能导致服务可用性的严重中断和企业的财务损失。根据Gartner的数据&#xff0c;IT行业平均停机每分钟就将为企业带来超过3万元的损失。 对于每个具有在线相关业务的企业&#xff0c;如何能以安全、可靠和快速的方式服务于用…

MySQL(进阶篇2.0)

SQL优化 插入数据 insert 如果需要一次性往数据库表中插入多条记录&#xff0c;可以从以下三个方面进行优化 1、优化方案一 批量插入数据 insert into tb_test values(1, Tom),(2,Cat),(3,Jerry);2、优化方案二 手动控制事务 start transaction; insert into tb_test v…

ShardingSphere 荣获一等奖!2022 年中国开源创新大赛成绩单公布

&#x1f3c6; 参赛回顾 “2022年中国开源创新大赛”在国家中央网信办信息化发展局的指导下&#xff0c;由中国互联网发展基金会、中国网络空间研究院、中国互联网投资基金联合主办&#xff0c;大赛以“开源创新&#xff0c;共建生态”为主题&#xff0c;围绕国家在开源人才培养…

uniApp页面通讯大汇总,如何页面之间传值

文章目录 往期回顾页面通讯出现场景通讯方案通讯方案小结 如何父传子页面跳转时序图 uni.\$on和eventChannel.on使用推荐 往期回顾 uniapp 踩坑记录 uni.$on为什么不能修改data里面的数据 页面通讯 出现场景 我们在一个页面往另一个页面跳转的时候&#xff0c;希望跳转的页…

golang实现webgis后端开发

目录 前言 二、实现步骤 1.postgis数据库和model的绑定 2.将pg库中的要素转换为geojson (1)几何定义 (2)将wkb解析为几何类型 (3)定义geojson类型 (4)数据转换 &#xff08;5&#xff09;数据返回 2.前端传入的geojson储存到数据库 3、其他功能实现 总结 前言 停更了…

从java直接上手SpringBoot【CTGU启明星】

本文适合刚刚学完java包括面向对象的同学&#xff0c;直接上手SpringBoot教程。 一、写在前面 先说说为什么这样做&#xff0c;现在主流的java后端学习是 面向对象->ssm框架->SpringBoot 其间还穿插数据库的学习&#xff0c;例如MyBatis等。 但是我们认为从项目入手…

来自腾讯AI实验室的Real-ESRGAN将模糊老照片和视频修复成高清晰(一些错误处理)

Real-ESRGAN:Enhanced Super-Resolution GAN&#xff1a;增强的超分辨率的对抗生成网络&#xff0c;对于GAN相信大家都比较熟悉&#xff0c;前有阿尔法狗&#xff0c;现有很多GAN的延伸版本&#xff0c;StyleGAN1~3系列以及DragGAN对于图片的生成和编辑&#xff0c;出来的效果都…

Tomcat顶层架构、服务部署、虚拟主机配置

Tomcat顶层架构、服务部署、虚拟主机配置 一、Tomcat概述1、Tomcat介绍2、Tomcat三个核心组件3、Java Servlet4、JSP 二、Tomcat顶层架构三、Tomcat请求过程四、Tomcat服务部署1、关闭防火墙&#xff0c;将安装 Tomcat 所需软件包传到/opt目录下2、安装JDK3、设置JDK环境变量4、…

Java中导出Excel步骤总结(案例学习)

【辰兮要努力】&#xff1a;hello你好我是辰兮&#xff0c;很高兴你能来阅读&#xff0c;昵称是希望自己能不断精进&#xff0c;向着优秀程序员前行&#xff01; 博客来源于项目以及编程中遇到的问题总结&#xff0c;偶尔会有读书分享&#xff0c;我会陆续更新Java前端、后台、…

怎么把伴奏提取出来?分享两个方法给大家~

对于音乐制作人和音乐爱好者而言&#xff0c;创作个人音乐作品是一项令人兴奋的体验。然而&#xff0c;有时我们希望使用一首现有歌曲的伴奏来创作自己的音乐作品&#xff0c;但却无法找到原版伴奏。为了解决这一难题&#xff0c;现在可以使用记灵在线工具来提取音频伴奏。本文…