目录
第一章
1. 请根据你的了解,叙述C++的特点。C++对C有哪些发展?(百度搜的)
①支持数据封装和数据隐藏
在C++中,类是支持数据封装的工具,对象则是数据封装的实现。C++通过建立用户定义类支持数据封装和数据隐藏。
在面向对象的程序设计中,将数据和对该数据进行合法操作的函数封装在一起作为一个类的定义。对象被说明为具有一个给定类的变量。每个给定类的对象包含这个类所规定的若干私有成员、公有成员及保护成员。
完好定义的类一旦建立,就可看成完全封装的实体,可以作为一个整体单元使用。类的实际内部工作隐藏起来,使用完好定义的类的用户不需要知道类是如何工作的,只要知道如何使用它即可。
②支持继承和重用
在C++现有类的基础上可以声明新类型,这就是继承和重用的思想。通过继承和重用可以更有效地组织程序结构,明确类间关系,并且充分利用已有的类来完成更复杂、深入的开发。新定义的类为子类,成为派生类。它可以从父类那里继承所有非私有的属性和方法,作为自己的成员。
③支持多态性
采用多态性为每个类指定表现行为。多态性形成由父类和它们的子类组成的一个树型结构。在这个树中的每个子类可以接收一个或多个具有相同名字的消息。
当一个消息被这个树中一个类的一个对象接收时,这个对象动态地决定给予子类对象的消息的某种用法。多态性的这一特性允许使用高级抽象。
继承性和多态性的组合,可以轻易地生成一系列虽然类似但独一无二的对象。由于继承性,这些对象共享许多相似的特征。由于多态性,一个对象可有独特的表现方式,而另一个对象有另一种表现方式。
2. 一个C++程序由哪几个部分构成的?其中的一部分分别起什么作用?
①预处理指令:程序的第1行#include <iostream>, 这不是C++的语句,而是 C++ 的一个预处理命令,它以 # 开头以与 C++语句相区别,行的末尾没有分号
②全局声明部分
③函数:有且仅有一个主函数main()
using namespace std; 的意思是:使用命名空间 std。 C++ 标准库中的类和函数是在命名空间 std 中声明的,因此程序中如果需要用到 C++ 标准库 (此时就需要用 #include 命令行),就需要用 using namespace std; 作声明,表示要用到命名空间 std 中的内容。
3. 从接受一个任务到获得最终结果,一般要经过几个步骤?
①用C++语言编写程序
②对源程序进行编译
③将目标文件连接
④运行程序
⑤分析运行结果
4.请说明编辑、编译、连接的作用。在编译后得到的目标文件为什么不能直接运行?
编译是以源程序文件为单位进行的,而一个完整的程序可能包含若干个程序文件,在分别对他们编译之后,得到若干个目标文件(后缀一般为.obj),然后要将它们连接为一个整体。此外,还需要与编译系统提供的标准库连接,才能生成一个可执行文件(后缀为.exe)。不能直接运行后缀为.obj的目标文件,只能运行后缀为.exe的可执行文件。
在程序进行编译时,先对所有的预处理命令进行处理,将头文件的具体内容代替 #include 命令行,然后再对该程序单元进行整体编译。
5. 语句 -> 语句块
- 分号;是语句结束符,也就是说,每个语句必须以分号结束,它表明一个逻辑实体的结束。
如果每次运行环境只能执行一条语句,但是有许多语句需要执行,需要用{}构成语句块。
- 复合语句 = 语句块是一组使用大括号{}括起来的按逻辑连接的语句,一个块是一个作用域
C++ 不以行末作为结束符的标识,因此,您可以在一行上放置多个语句。
x = y; y = y+1; add(x, y);
6. 输入输出
std::cout <<"Enter tow numbers:" <<std::endl;
<< 左侧对象为ostream对象,右侧为要打印的值
endl被称为操纵符,结束当前行,将与设备相连的缓冲区的内容刷到设备中
7. 单行注释:“//” 任意注释:“/* */”(不能嵌套)
第二章
1. 不同于Python和其他语言,C++中的字符常量只能用单引号 ' ',双引号" "是用来表示字符串的
2. C++规定标识符只能由字母、数字和下划线3种字符组成,且其第一个字符必须为字母或下划线。
3. C++规定了各种运算符的结合方向(结合性),算术运算符结合方向为“自左至右”,即先左后右。自左至右的结合方向又称左结合性,即运算对象先与左面的运算符结合。
算术运算符结合方向为“自左至右”,即先左后右,又称左结合性,即运算对象先与左面的运算符结合。赋值运算符按照按照“自右而左”的顺序结合,e.g:a=(b=5)和a=b=5等价,都是先求b=5的值(即5),然后再赋值给a
4. C++的算数运算符:+ - * /
关系运算符:
( < > >= <=)优先级高于(== !=)
赋值运算符:=
逻辑运算符: !(NOT)高于 &&(AND) 高于 ||(OR)
!高于算数,&& ||低于关系
例题
1.求Fibonacci数列前40个数。(斐波那契数列)
这个数列有如下特点:第1,2两个数为1,1。从第三个数开始,该数使其前面两个数之和。
即,
F1 = 1 (n = 1)
F2 = 1 (n = 2)
Fn = Fn-1 + Fn-2 (n >=3)
#include <iostream>
#include <iomanip>
using namespace std;
int main(){
long f1,f2;
f1 = f2 = 1;
for (int i = 1; i <= 20; i++) {
cout << setw(12) << f1 << setw(12) << f2;//设备输出字段宽度为12,每次输出两个数
if (i % 2 == 0) { //每输出完4个数后换行,使每行输出4个数
cout << endl;
}
f1 = f1 + f2; //左边的f1代表第2个数,使第1,2两个数之和
f2 = f2 + f1; //左边的f2代表第4个数,使第2,3两个数之和
}
return 0;
}
2. 找出100~200间的全部素数
解题思路:判别m是否为素数的算法使这样的:让m被2 ~ √m除,如果m不能被2 ~ √m 之中任何一个整数整除,就可以确定m是素数。为了记录m是否为素数,可以用一个布尔变量prime来表示。在循环开始时先设prime为真,若m被某一整数整除,就表示m不是素数,此时使布尔变量prime的值变假。最后根据prime是否为真,决定是否输出m。
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main() {
int m, k, n = 0;
bool prime; //定义布尔值变量prime
for (m = 101; m <= 200; m++) { //判别m是否为素数
prime = true; //循环开始时设prime为真,即先认为m为素数
k = int(sqrt(m)); //用k代替√m的整数部分
for (int i=2; i <= k; i++) { //此时循环的作用是将m别2~√m除,检查是否能整除
if (m % i == 0) { //如果能整除,表示m不是素数
prime = false; //是prime变为假
break; //终止执行本次循环
}
}
if (prime) { //如果m为素数
cout << setw(5) << m; //输出素数m,字段宽度为5
n = n + 1; //n用来累计输出素数的个数
}
if (n % 10 == 0) {
cout << endl; //输出10个数后换行
}
}
cout << endl; //最后执行一次换行
return 0;
}
3. 输出所有的“水仙花数”。所谓水仙花数是指一个3位数,其各自数字立方和等于该数本身,例如,153是一个水仙花数,因为153=1*1*1+5*5*5+3*3*3
#include <iostream>
using namespace std;
int main() {
int j, k, l;
for (int i = 100; i < 1000; i++) {
j = i / 100;
k = i / 10 % 10;
l = i % 10;
if (i == j * j * j + k * k * k + l * l * l) {
cout << i << "是一个水仙花数" << endl;
}
}
cout << endl;
return 0;
}
4. 猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天在上都吃了前一天剩下的一半另加一个。到第10天早上再想吃时就只剩一个桃子了。求第一天共摘了多少个桃子?
#include <iostream>
using namespace std;
int main() {
int sum = 1;
for (int i = 1; i < 10; i++) {
sum = (sum + 1) * 2;
}
cout<<"第一天共有" << sum << "个桃子"<<endl;
return 0;
}