资源描述
第二章
[2_1]简述C++的主要特点
C++语言的主要特点表现在两个方面,一是全面兼容C,并对C的功能作了不少扩充,二是增加了面向对象的机制,具体表现为:
(1)C++是C的超集,C++保持与C的兼容,这就使许多C代码不经修改就可以为C++所用,用C编写的众多的库函数和实用软件可以用于C++中。
(2)C++是一个更好的C,它保持了C的简洁、高效和接近汇编语言等特点,并对C的功能做了不少扩充。用C++编写的程序比C更安全,可读性更好,代码结构更合理,C++的编译系统能够检查出更多的类型错误。
(3)用C++编写的程序质量高,从开发时间、费用到形成的软件的可重用性、可扩充性、可维护性和可靠性等方面有了很大的提高,使得大中型的程序开发变得更加容易。
(4)增加了面向对象的机制,几乎支持所有的面向对象程序设计特征,体现了近20年来在程序设计和软件开发领域出现的新思想和新技术,主要包括:
l 抽象数据类型;
l 封装与信息隐藏;
l 以继承方式实现程序的重用;
l 以函数重载、运算符重载和虚函数来实现多态性;
l 以模板来实现类型的参数化。
C++语言最有意义的方面是支持面向对象的特征,然而,由于C++与C保持兼容,使得C++不是一个纯正的面向对象的语言,C++既可以用于面向过程的结构化程序设计,也可以用于面向对象的程序设计。
[2_2]下面是一个C程序,改写它,使它采用C++风格的i/o语句
改写如下:
#include <iostream>
using namespace std;
int main()
{
int a,b,d,min;
cout<<”enter two numbers: “;
cin>>a;
cin>>b;
min=a>b?b:a;
for(d=2;d<min;d++)
if((a%b)==0)&&((b%d)==0)) break;
if(d==min)
{
cout<<”no common denominators\n”;
return 0;
}
cout<<”the lowest common denominator is “<<endl<<d;
return 0;
}
[2_3]测试下面的注释是否有效?
此注释有效,单行注释中可以嵌套/*……….*/方式的注释。
[2_4]以下简单的C++程序不可能编译通过,为什么?
原因是:在程序中,当一个函数的定义在后,而对它的调用在前时,必须将该函数的原型写在调用语句之前,而在本程序中缺少函数原型语句。在语句:using namespace std;后加上函数原型语句sum(int a,int b);就可以通过了。
[2_5]
(1)答:这两个函数原型是等价的,因为函数原型中的参数名可以缺省。
(2)答:这两个函数的第一行是不等价的,函数的第一行中必须包含参数名。
[2_6]----[2_17]
D D A A B A C B D C D C
[2_18]
答:运行结果为:
101
说明:在语句::i=i+1;中赋值号左边::i的i单元是全局变量,赋值号右边的i单元是局部变量i。所以执行该语句的结果是将局部变量i的值+1(101)赋值给全局变量i
[2_19]
答:结果是:
10 10
说明:函数f(int &m,int n)中的第一个参数是引用,引用参数是一种按地址传递参数的方法,对其的调用是传地址调用;而第二个参数是变量参数,对它的调用是通常的传值调用。所以运行后,a的值被改为10,b的值不变,仍为10
[2_20]
答:输出结果为:
10
20
因为f函数的参数是引用,所以修改k的值有效。
函数调用后,主函数中k的值变为10。由于m是对函数的引用,当m被赋值为20时,k的值也变为20。
[2_21] 举例说明可以使用const替代#define以消除#define的不安全性
答:例如:
#include <iostream>
using namespace std;
#define A 2+4
#define B A*3
int main()
{
cout<<B<<endl;
return 0;
}
上面程序的运行结果是14而不是18,但很容易被认为是18。用const替代#define就能得到正确结果,从而消除了#define的不安全性。
#include <iostream>
using namespace std;
const A=2+4;
const B=A*3;
int main()
{
cout<<B<<endl;
return 0;
}
运行结果为18。
[2_22] 用动态分配空间的方法计算Fibonacci数列的前20项并存储到动态分配的空间中。
答:
#include <iostream>
using namespace std;
int main()
{
int *p=new int[20];//动态分配20个整型空间
*p=1;
*(p+1)=1;//前面两个空间赋值1
cout<<*p<<”\t”<<*(p+1)<<”\t”;
p=p+2;//p指向第三个空间
for(i=3;i<=20;i++)
{
*p=*(p-1)+*(p-2);
cout<<*p<<”\t”; //”\t”表示的就是键盘上的Tab键,称为跳格键,一般等于8个空格的长度
if(i%5==0) cout<<endl;
p++;//指向下一个空间
}
return 0;
}
结果:
1 1 2 3 5
8 13 21 34 55
89 144 233 377 610
987 1597 2584 4181 6765
[2_23] 建立一个被称为sroot()的函数,返回其参数的二次方根。重载sroot()三次,
让它返回整数、长整数与双精度数的二次方根(计算二次方根时,可以使用标准
库函数sqrt())
#include <iostream>
#include <cmath>
using namespace std;
double sroot(int i)
{ return sqrt(i); } //i是整数
double sroot(long l)
{ return sqrt(l); } //l是长整型
double sroot(double d)
{ return sqrt(d); } //d是双精度
int main()
{
int i=12;
long l=1234;
double d=12.34;
cout<<“i的二次方根是:”<<sroot(i)<<endl;
cout<<“l的二次方根是:”<<sroot(l)<<endl;
cout<<“d的二次方根是:”<< sroot(d)<<endl;
return 0;
}
[2_24] 编写C++风格的程序,解决百钱问题,将一元人民币兑换成1、2、5分的硬币,有多少种换法?
#include <iostream>
using namespace std;
int main()
{
int i,j,sum=0;
for(i=0;i<=20;i++)
for(j=0;j<=50;j++)
if(100-5*i-2*j>=0)
{
sum++;
cout<<100-5*i-2*j<<”\t”<<j<<”\t”<<i<<endl;
}
cout<<”sum is “<<sum<<endl;
return 0;
}
[2_25]
#include <iostream>
using namespace std;
int main()
{
void change(int &,int &);
int a,b;
cin>>a>>b;
if(a>b) change(a,b);
cout<<a<<”,”<<b<<endl;
return 0;
}
void change(int &a1,int &b1);
{
int temp;
temp=a1;
a1=b1;
b1=temp;
}
[2_26] 编写C++风格的程序,用二分法求解f(x)=0的根
#include <iostream>
#include <cmath>
using namespace std;
inline float f(float x)
{
return 2*x*x*x-4*x*x+3*x-6;
}
int main()
{
float left,right,middle,ym,yl,yr;
cout<<”pleass two number:”<<endl;//接收输入,确定第一组数据区域
cin>>left>>right;
yl=f(left);
yr=f(right);
do
{
middle=(right+left)/2;
ym=f(middle);
if(yr*ym>0)
{
right=middle;
yr=ym;
}
else
{
left=middle;
yl=ym;
}
}while(fabs(ym)>=1e-6);
cout<<”\nRoot is:”<<middle<<endl;
return 0;
}
本例使用了内联函数f(x),因为在主函数中多次调用它,这样可以加快代码执行的速度。输入两个数:-10 10结果:Root is 2
展开阅读全文