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

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

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

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

#include <iostream>
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 <iostream>
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:
编译并运行本节的程序,给它输入全都相等的值。再次运行程序,输入没有重复的值。

答:
输入全都相等的值:

输入没有相等的值:

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

#include <iostream>
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 <iostream>
using namespace std;
int main(){unsigned u = 10,u2 = 42;cout << u2 - u << endl;   //32cout << u - u2 << endl;   //4294967264int i = 10, i2 = 42;cout << i2 - i << endl;   // 32cout << i - i2 << endl;   //-32cout << i - u << endl;    //0cout << u - i <<endl;     //0return 0;}

运行截图:

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 <iostream>
using namespace std;
int main(){cout << "\62\115\12";return 0;}
/*
修改程序使其先输出2, 然后输出制表符,
再输出M,然后转到新的一行。
*/
#include <iostream>
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 <iostream>
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 <iostream>
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 <iostream>
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;}elsecout << "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;}elsecout << "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++ primer (中文版-第五版 )练习题答案相关推荐

  1. C++primer 第五版 练习题【3.32】 P104页 个人解答

    [练习题3.32] 题目大致意思如下: 定义一个含有10个int的数组,令每个元素的值就是其下标值,将创建的数组拷贝给另外一个数组.利用vector重写程序,实现类似的功能: [源代码]: #incl ...

  2. C++Primer第五版——习题答案+详解(完整版)

     C++Primer第五版--习题答案详解 新手入门必看的书.知识是一个系统化并且相互关联的体系,零散的东西每天收获如果不形成自己的体系的话,那将是毫无意义的,所以我觉得有必要将这本书先啃一遍,消化其 ...

  3. C++Primer第五版 习题答案 目录

    C++Primer第五版 习题答案 本文当作我学习C++的一个记录,这里的习题答案并不是标准答案,仅仅是我的理解,如有错误,请大家指出,谢谢! 参考的文章会在文末列出. 使用的系统为:ubuntu 1 ...

  4. C++Primer第五版——习题答案详解

     C++Primer第五版--习题答案详解 新手入门必看的书.知识是一个系统化并且相互关联的体系,零散的东西每天收获如果不形成自己的体系的话,那将是毫无意义的,所以我觉得有必要将这本书先啃一遍,消化其 ...

  5. 《C++ Primer中文版(第5版)》学习笔记与习题完整发布!

    点击上方"AI有道",选择"星标"公众号 重磅干货,第一时间送达 现在 Python 越来越流行,学习人工智能也大都以学习 Python 为主.然而,C++ 仍 ...

  6. C++ Primer中文版(第5版)

    <C++ Primer中文版(第5版) > 基本信息 作者: (美)Stanley B. Lippman(斯坦利 李普曼)    Josee Lajoie(约瑟 拉乔伊)    Barba ...

  7. C++ Primer中文版(第4版 特别版)

    简单介绍:什么:哈哈.怎么向家里交代啊,你别误会?你是来找我们的吧,于是.其他人也全部靠在了我的身边.头剪得就 本文写于:2012年10月03日;更不是弓箭手 计划:什么:哈哈.怎么向家里交代http ...

  8. C程序设计谭浩强第五版课后答案 第三章习题答案

    C语言程序设计谭浩强第五版课后答案第三章 1.假如我国国民生产总值的年增长率为7%, 计算10年后我国国民生产总值与现在相比增长多少百分比.计算公式为p=(1+r)np = (1+r)^np=(1+r ...

  9. 【书籍分享】C++ Primer 中文第五版 PDF

    https://gitcode.net/qq_29856169/writings/-/blob/mine/C++_Primer_pdf.md 书籍信息 书名:<C++ Primer 中文版(第 ...

最新文章

  1. UVA10652 Board Wrapping(求凸包、计算凸多边形面积)
  2. 多数元素—leetcode169
  3. C# Replace函数与JS replace函数
  4. Adobe illustrator 直接选择工具删除白板 - 连载 6
  5. 关于C++异常处理的一些思考
  6. 十一、Shell脚本流程控制语句
  7. ActiveMQ消息队列
  8. sql 获取当前时间
  9. cnchar.js 获取汉字的拼音和笔画数的js库 cnchar2.0 支持繁体字、笔画顺序、多音字词
  10. azure 云上安装部署nginx
  11. 网络渗透测试实验二(网络扫描与网络侦察)
  12. 数字图像相关(Digital Image Correlation, DIC)中的非线性优化方法IC-GN的数值解计算
  13. ipad怎么和mac分屏_将Mac屏幕扩展到iPad有多好用?我甚至有了入手iPad Pro的冲动...
  14. 别再花时间统计考勤数据了,这个报表统计神器才是你最后出路
  15. 基于Power BI Desktop的电子产品综合数据分析案例
  16. Cannot obtain license for Compiler (feature compiler) with license version = 2.2(转)
  17. 瑞萨单片机之data flash的使用(五)
  18. 网上邻居无法访问的一点启示
  19. 动态联编与静态联编的区别
  20. 精彩回顾 | 华为 HDG 成都站霸气上演 蓉城风云再起

热门文章

  1. 如何用PHP-Eclipse调试PHP程序
  2. 易语言从c盘开始搜索文件,易语言全盘查找指定文件并返回地址
  3. 汉字的书写效果的实现
  4. 计算机语言cobol,COBOL语言编译器
  5. 猜数字游戏——一个可以无聊到你一直玩的Game
  6. matlab ceiling,ceiling_excel中ceiling函数的用法?
  7. linux:rm运用
  8. 支付宝(查询对账单下载地址+文件下载+解压+遍历文件+读文件)
  9. 从大专生到蚂蚁金服CTO,他写下“支付宝”第一行代码:逆风的方向,更适合飞翔!...
  10. 顺丰货机、无人机齐飞的空中物流网