C++ primer (中文版-第五版 )练习题答案

C++ primer (中文版-第五版 ) 练习题答案

  • 第1章 开始
    • 1.4控制流
      • 1.4.1节 while语句练习
      • 1.4.2节 for语句练习
      • 1.4.3节 读取数量不定的输入数据练习
      • 1.4.4 if 语句练习
  • 第2章 变量和基本类型
    • 2.1 基本内置类型
      • 2.1.1 算术类型 练习
      • 2.1.2 类型转换 练习
      • 2.1.3 字面值常量 练习
    • 2.2 变量
      • 2.2.1 变量定义 练习
      • 2.2.2 变量声明和定义的关系 练习
      • 2.2.3 标识符
      • 2.2.4 名字的作用域
    • 2.3 符合类型
      • 2.3.1 引用 练习
      • 2.3.2 指针 练习
      • 2.2.3 理解符合变量的声明 练习
  • 3 字符串、向量和数组
    • 3.2 标准库类型string
      • 3.2.2 string对象上的操作

第1章 开始

1.4控制流

1.4.1节 while语句练习

练习1.9:
编写程序利用while循环将50到100的整数相加。

#include 
using namespace std;
void main(){
	int sum=0, val=50;
    while(val<=100){
        sum +=val;
        val++;
    }
    cout<< "50到100的整数相加为"<<sum<<endl;
}   
 

练习1.10:
除了++运算符将运算对象的值增加1之外,还有一个递减的运算符(- -)实现将减少1。编写程序,使用递减运算符在循环过程中按照递减的顺序打印出10到0之间的整数。

#include 
using namespace std;
void main(){
    cout<< "递减打印10到0之间的整数:";
    int i =10;
    while(i>=0){
        cout <<i<<" ";
        i--;
    }
}

练习1.11:
编写程序,提示用户输入两个整数,打印出这两个整数所指定的范围的所有整数。

#include 
using namespace std;
void main(){
    cout<< "请依次输入v1和v2的值:";
    cin>>v1>>v2;
    cout<< "v1和v2之间的所有整数:";
    int n=v1;
    while(n<=v2){
        cout<<n<<" ";
        n++;
 }
 

1.4.2节 for语句练习

练习1.12:
下面for循环完成了什么功能?sum的终值是多少?

#include 
using namespace std;
void main(){
	int sum = 0;
    for(int i = -100; i <= 100;++i)
        sum += i;
   cout <<"This sum is:"<< sum << endl;
}

答:for循环完成了从-100到100之间的整数相加;sum的终值为0。
练习1.13:
使用for循环重做1.4.1节的所有练习

1.9 将50到100整数相加。

#include 
using namespace std;
void main()
{
    int sum = 0;
    for(int i = 50; i <= 100;i++)
        sum += i;
    cout <<"50到100之间的整数相加:"<< sum << endl;
}

1.10 编写程序,使用递减运算符在循环过程中按照递减的顺序打印出10到0之间的整数。

#include 
using namespace std;
void main(){
    cout <<"递减打印出10到0之间的整数:";
    for(int n = 10;n >= 0;n--)
        cout <<n<< " " ;
    cout << endl;
}

1.11 编写程序,提示用户输入两个整数,打印出这两个整数所指定的范围的所有整数。

#include 
using namespace std;
void main(){
    int v1, v2;
    cout << "请输入v1和v2的值:";
    cin >> v1 >> v2;
    cout <<"v1和v2之间的整数为:";
    for(int j = v1;j<=v2;j++){
        cout << j << " ";
    }
}

练习 1.15:
对比for循环和while循环,两种形式的优缺点格式什么?
while循环:
while循环,可以对一些不确定循环次数的循环进行较好的控制。

for循环:
for循环书写简练,对内存较节省(局部变量i再循环结束后自动清除)。

1.4.3节 读取数量不定的输入数据练习

练习1.16:
编写程序,从cin读取一组数,输出其和。

#include 
using namespace std;
int main(){
    int sum = 0, num = 0;
    while(cin >> num){
        sum += num;
    }
    cout << "Sum is " << sum <<endl;
    return 0;
}

1.4.4 if 语句练习

练习1.17:
如果输入的所有值都是相等的,本节的程序会输出什么?如果没有重复值,输出又会是怎样的?

答:输入所有值都是相等的,则程序会统计出重复的次数;若输入的值没有重复,那么每个值的重复次数都为 1 。

练习1.18:
编译并运行本节的程序,给它输入全都相等的值。再次运行程序,输入没有重复的值。

答:
输入全都相等的值:
输入相等的值
输入没有相等的值:
C++ primer (中文版-第五版 )练习题答案_第1张图片

练习1.19:
修改你为1.4.1节练习1.10(第11页)所编写的程序(打印一个范围内的数),使其能处理用户输入的第一个数比第二个数小的情况。

#include 
using namespace std;
int main(){
    int v1, v2;
    cout<< "请依次输入v1和v2的值:";
    cin>>v1>>v2;
    if  (v1<=v2){
        cout<< "v1和v2之间的所有整数:";
    int n=v1;
    while(n<=v2){
        cout<<n<<" ";
        n++;
      }
    }else{
        cout << "您的输入有误。";
    }
    return 0;
 }

第2章 变量和基本类型

2.1 基本内置类型

2.1.1 算术类型 练习

练习2.1:
类型 int、 long、long long和 short 的区别是什么?无符号类型和带符号类型的区别是什么? float 和 double 的区别是什么?
答:int、 long、 long long和short尺寸不同,表示的数据范围不同。无符号只能表示0和正数,无符号还可以表示负数。float为单精度浮点数,double为双精度,一般来说,float占4字节,double占8字节。

练习2.2:
计算按揭贷款时,对于利率本金和付款分别应选择何种数据类型?说明理由。
答:利率应该用unsigned double表示,本金和付款应使用unsigned float表示。因为利率一般小数位数较多,且没有负数,本金和付款小数位数少,也没有负数。

2.1.2 类型转换 练习

练习2.3:
读写程序结果。

#include 
using namespace std;
int main(){
    unsigned u = 10,u2 = 42;
    cout << u2 - u << endl;   //32
    cout << u - u2 << endl;   //4294967264

    int i = 10, i2 = 42;
    cout << i2 - i << endl;   // 32
    cout << i - i2 << endl;   //-32
    cout << i - u << endl;    //0
    cout << u - i <<endl;     //0

    return 0;
 }

运行截图:
C++ primer (中文版-第五版 )练习题答案_第2张图片

2.1.3 字面值常量 练习

练习2.5:
指出下述字面值的数据类型并且说明每一组内几种字面值的区别:
( a ) ‘a’ , L’a’, “a”, L"a"
( b ) 10, 10u, 10L, 10uL, 012, 0xC
( c ) 3.14, 3.14f, 2.14L
( d ) 10, 10u, 10., 10e-2
答:
( a ) ’ a ’ :字符字面值; L ’ a ': 宽字符型字面值;" a " : 字符串字面值; L" a ":宽字符字符串字面值。

( b ) 10:十进制; 10u:无符号整型; 10L:长整型;10uL:无符号长整型; 012:八进制; 0xC:十六进制。

( c ) 3.14: 浮点型;3.14f: 单精度浮点型字面值,类型是float; 3.14L:扩展精度浮点型字面值,类型是long double。

( d ) 10:整型; 10u:无符号整型,10.浮点型, 10e-2:双精度浮点型

练习2.6:
下面两组定义是否有区别,若有,请叙述之:
答:

int month = 9, day = 7; //mounth day均为10进制
int month = 09, day = 07; //mounth day均为8进制,且month会报错,因为09超出范围了。error: invalid digit '9' in octal constant 

练习2.7:
下述字面值表示何种含义?它们各自的数据类型是什么?
( a ) “Who goes with F\145rgus?\012”
( b )3.14e1L
( c )1024f
( d ) 3.14L
答:
( a ) \145表示小写字母“e”, \012表示换行符。 输出:who goes with Fergus?
( b ) 扩展精度浮点型字面值,类型是 long double
( c ) 单精度浮点型字面值,类型事float
( d ) 表示扩展的浮点型,类型是long double

练习2.8:
请利用转义序列编写一段程序,要求先输出2M,然后转到新的一行。修改程序使其先输出2, 然后输出制表符,再输出M,然后转到新的一行。

/*
请利用转义序列编写一段程序,要求先输出2M,然后转到新的一行。
*/
#include 
using namespace std;
int main(){
    
    cout << "\62\115\12";
    return 0;
 
 }
/*
修改程序使其先输出2, 然后输出制表符,
再输出M,然后转到新的一行。
*/
#include 
using namespace std;
int main(){

    cout << "\62\t\115\12";
    return 0;

 }

2.2 变量

2.2.1 变量定义 练习

练习2.9:
解释下列定义的含义。对于非法的定义,请说明错在何处并将其改正。

( a )  std ::  cin >> int inout_value; 
( b )  int i = { 3,14 };
( c )  double salary = wage = 9999.99;
( d )  int i = 3.14;

答: ( a ) 错误

	int inout_value;
	std ::  cin >> inout_value; 

( b ) 错误

	float i = { 3,14 };

( c ) 错误

double salary , wage;
       salary = wage = 9999.99;

( d ) 警告,有隐式转化,i值为3。

练习2.10:
下列变量的初值分别是什么?

#include 
using namespace std;
std::string global_str;    //初始化为一个空串
int global_int;            // 初始化为0
int main(){
    int local_int;         //按标准局部变量不初始化,g++编译器下可能也会初始化为空
    std::string local_str;
    return 0;
 }

2.2.2 变量声明和定义的关系 练习

练习2.11:
指出下面的语句是声明还是定义。
( a ) entern int ix =1024;
( b ) int iy;
( c ) extern int iz;
答:( a ) 定义
( b ) 声明并定义
( c ) 声明

2.2.3 标识符

练习2.12:
请指出下面的名字中哪些是非法的?
(1)int doube = 3.14;
(2)int _;
(3)int catch-22;
(4)int 1_or_2 = 1;
(5)double Double = 3.14;
答:(1)非法,double为关键字,不能作为变量名
(2)合法
(3)非法,变量名只能包含字母、数字、下划线
(4)非法,不能以数字开头
(5)合法

2.2.4 名字的作用域

练习2.13:
下面程序中j的值是多少?

int i = 42;
int main(){
    int i = 100;
    int j = i;
}

答: j = 100
练习2.14:
下面的程序合法吗?如果合法,它将输出什么?

int i = 100, sum = 0;
for(int i = 0; i != 10; ++i)
    sum +=i;
    cout << i << " " << sum << endl;
答:合法。 将输出   100 45

2.3 符合类型

2.3.1 引用 练习

练习 2.15:
下面哪个定义是不合法的?为什么?

 ( a ) int ival = 1.01;  //不合法,用float初始化int,会有警告
 ( b )int &rvall = 1.01;  // 不合法,引用的初始值必须是一个对象
 ( c )int &rvall2 = ival;    //合法
 ( d )int &rval3;  // 不合法,引用必须初始化

练习2.16:
练习2.16:考查下面的所有赋值然后回答:哪些赋值是不合法的?为什么?哪些赋值是合法的?它们执行了什么样的操作?

int i = 0, &r1 = i;
double d = 0, &r2 = d;
r2 = 3.12159; //合法,但隐式转化
r2 = r1;      //合法,但隐式转化
i = r2;       //合法,但隐式转化
r1 = d;       //合法,但隐式转化

练习 2.17:
执行下面的代码段将输出什么结果?

    int i, &ri = i;
    i = 5; ri = 10;
    cout << i <<  " " << ri <<endl;

答:10 10

2.3.2 指针 练习

练习 2.18:
编写代码分别更改指针的值以及指针所指对象的值。

#include 
using namespace std;
int main(){
    int i = 3;
    int j = 9;
    int *p = &i;
    cout <<  "p = " << p <<" *p = "<< *p <<endl;
    cout <<  "i = " << i <<" j = "<< j <<endl;
    p = &j;
    cout << "更改指针的值" <<endl;
    cout <<  "p = " << p <<" *p = "<< *p <<endl;
    cout <<  "i = " << i <<" j = "<< j <<endl;
    cout << "更改指针所指对象的值"<<endl;
    *p = 39;
    cout <<  "p = " << p <<" *p = "<< *p <<endl;
    cout <<  "i = " << i <<" j = "<< j <<endl;
 }

练习 2.19:
说明指针和引用的主要区别。
答:
(1) 引用在定义时必须初始化,而指针可不初始化
(2)引用在其生命周期内,只能指向一个对象,而指针可以先后指向不同的对象
(3)指针本身就是一个对象,允许对指针进行赋值和拷贝。
练习 2.20:
请叙述下面这段代码的作用。

#include 
using namespace std;
int main(){
   int i = 42;
   int *p1 = &i;
   *p1 = *p1 * *p1;
 }

答:求 i 的平方的结果存在原地址
练习 2.21:
请解释下述定义。在这些定义中有非法的吗?如果有,为什么?

	int i = 0;
   double *dp = &i; //非法,不能用int型的变量初始化doube指针
   int *ip = i;     //非法,不能用int值初始化指针
   int *p = &i;     //合法

练习2.22:
假设p是一个int型指针,说明下面代码的含义
if § //如果地址不为0
​ if (*p) //如果所指的值为真
练习2.23:

给定指针p,能否知道它指向了一个合法的对象?
答:不行,指针只是只想一个储存地址,并没有只想对象的属性所有无法判断对象是否合法。

练习2.24:
在下面这段代码中为什么p合法而1p非法?

int i = 42;
void *p = &i;   //因为void指针类型可以存放任意对象的地址  
long *lp = &i;  //但是long指针,就只能存放long对象的地址

2.2.3 理解符合变量的声明 练习

练习 2.25:
说明下列变量的类型和值。

( a ) int *p//int指针类型,
		  i//int型变量, &r = i//引用类型,初始化为i;
( b ) int i,//int型变量 
	      *p = 0//int指针类型,初始值为0;
( c ) int *ip//int型指针,
          ip2 //int型变量;

3 字符串、向量和数组

3.2 标准库类型string

3.2.2 string对象上的操作

练习3.2:
编写一段程序从标准输入中一次读入一整行,然后修改该程序使其一次读入一个词。
一次读入一整行

   string line;
   while(getline(cin, line))
        cout << s << endl;

一次读入一个词

   string word;
   while(cin >> word){
    cout << word <<endl;

练习3.3:
请说明string类的输入运算符和getline函数分别是如何处理空白字符的。

答:输入运算符:会自动忽略字符串前的空白(空格、制表符、换行等),从第一个真正的字符到下一个空白,反复读取,逐个输出单词。
getline:getline函数会保存字符串中的所有的空白,读入数据直到遇见换行符。
练习3.4:
编写一段程序读入两个字符串,比较其是否相等并输出结果。如果不相等,输出较大的那个字符串。改写上述程序,比较输入的两个字符串是否等长,如果不等长,输出长度较大的那个字符串。

比较是否相等


 string s1, s2;
    cin >> s1 >> s2;
    
    if(s1 > s2){
        cout << s1 << endl;
    }else if(s1 < s2){
        cout << s2 << endl;
    }else
        cout << "equal" << endl;

比较长度

    string s1, s2;
    cin >> s1 >> s2;
    if(s1.length() > s2.length()){
        cout << s1 << endl;
    }else if(s1.length() < s2.length()){
        cout << s2 << endl;
    }else
        cout << "equal" << endl;

练习3.5:
编写一段程序从标准输入中读入多个字符串并将它们连接在一起,输出连接成的大字符串。然后修改上述程序,用空格把输入的多个字符串分隔开来。
输出连接成的大字符串

	string word;
    string sum;
    while (getline(cin, word)) {
        sum += word ;
        cout << sum << endl;
    }

用空格把输入的多个字符串分隔开来

	string word;
    string sum;

    while (getline(cin, word)) {

        sum += word + " ";
        cout << sum << endl;
    }

你可能感兴趣的:(习题代码,c++)