【c++ primer第五版习题集】第一章

第一章 开始

练习1.1

查阅你使用的编译器的文档,确定它所使用的文件名约定。编译并运行第2页的main程序。

解:

  • g++ ch1.cpp -o main
  • ./main

练习1.2

改写程序,让它返回-1。返回值-1通常被当做程序错误的标识。重新编译并运行你的程序,观察你的系统如何处理main返回的错误标识。

解:

  • 在ubuntu下,使用g++,返回-1,./main没有发现任何异常。
  • echo $?,返回255。而我们都知道,-1的补码正是255

练习1.3

编写程序,在标准输出上打印Hello, World。

解:

#include <iostream>

using namespace std;

int main()
{
	cout << "Hello, World" << endl;
	return 0;
}

练习1.4

我们的程序使用加法运算符+来将两个数相加。编写程序使用乘法运算符*,来打印两个数的积。

解:

#include <iostream>

using namespace std;

int main()
{
    cout << "Enter two numbers:" << endl;
    
    int v1 = 0, v2 = 0;
    cin >> v1 >> v2;
    
    cout << "The product of " << v1 << " and " << v2 << " is " << v1 * v2 << endl;
}        

练习1.5

我们将所有的输出操作放在一条很长的语句中,重写程序,将每个运算对象的打印操作放在一条独立的语句中。

解:

#include <iostream>

using namespace std;

int main()
{
    	cout << "Enter two numbers:" << endl;
    	
        int v1 = 0, v2 = 0;
        cin >> v1 >> v2;
        
        cout << "The product of ";
        cout << v1;
        cout << " and ";
        cout << v2;
        cout << " is ";
        cout << v1 * v2;
        cout << endl;
		
		return 0;
}    

练习1.6

解释下面程序片段是否合法。

cout << "The sum of " << v1;
          << " and " << v2;
          << " is " << v1 + v2 << endl;

如果程序是合法的,它的输出是什么?如果程序不合法,原因何在?应该如何修正?

解:

程序不合法,第一、二行有多余的分号,修改如下:

cout << "The sum of " << v1
          << " and " << v2
          << " is " << v1 + v2 << endl;

练习1.7

编译一个包含不正确的嵌套注释的程序,观察编译器返回的错误信息。

解:

/* 正常注释 /* 嵌套注释 */ 正常注释*/

错误信息:

  /* 正常注释 /* 嵌套注释 */ 正常注释*/
                                     ^
ch1.cpp:97:37: error: stray ‘\255’ in program
ch1.cpp:97:37: error: stray ‘\243’ in program
ch1.cpp:97:37: error: stray ‘\345’ in program
ch1.cpp:97:37: error: stray ‘\270’ in program
ch1.cpp:97:37: error: stray ‘\270’ in program
ch1.cpp:97:37: error: stray ‘\346’ in program
ch1.cpp:97:37: error: stray ‘\263’ in program
ch1.cpp:97:37: error: stray ‘\250’ in program
ch1.cpp:97:37: error: stray ‘\351’ in program
ch1.cpp:97:37: error: stray ‘\207’ in program
ch1.cpp:97:37: error: stray ‘\212’ in program
ch1.cpp: In function ‘int main()’:
ch1.cpp:97:50: error: expected primary-expression before ‘/’ token
  /* 正常注释 /* 嵌套注释 */ 正常注释*/
                                                  ^
ch1.cpp:98:5: error: expected primary-expression before ‘return’
     return 0;
     ^

练习1.8

指出下列哪些输出语句是合法的(如果有的话):

cout << "/*";
cout << "*/";
cout << /* "*/" */;
cout << /* "*/" /* "/*" */;

预测编译这些语句会产生什么样的结果,实际编译这些语句来验证你的答案(编写一个小程序,每次将上述一条语句作为其主体),改正每个编译错误。

解:

只有第三句编译出错,因为注释不能嵌套,以第四句为例子,当编译器看到/*的时候,如果后续看到*/则会认为多行注释已经结束,后续的内容不会再被视为是注释,所以第三行改成如下即可:

cout << /* "*/" */";

对于第三句,编译器会认为是一个不完整的字符串,所以会报错:
error: missing terminating " character
第四句等价于输出 " /* "

练习1.9

编写程序,使用while循环将50到100整数相加。

解:

#include <iostream>

using namespace std;

int main()
{
    int sum = 0, val = 50;			//累加器切记初始化为0,累乘器切记初始化为1
    while (val <= 100)
    {
        sum += val;
        val += 1;
    }
    cout << "Sum of 50 to 100 inclusive is "
              << sum << endl;
}    

练习1.10

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

解:

#include <iostream>

using namespace std;

int main()
{
    int val = 10;
    while (val >= 0){
        cout << val << " ";
        val -= 1;
    }
    cout << endl;
    
    return 0;
}  

练习1.11

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

解:

#include <iostream>

using namespace std;

int main()
{
    int left = 0, right = 0;
    cout << "Please input two num: ";
    cin >> left >> right;

    while (left - right)
    {
        cout << left << " ";
        ++left;
    }
    while (right - left)
    {
        cout << right << " ";
        ++right;
    }

    cout << endl;
    return 0;
}

练习1.12

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

int sum = 0;
for (int i = -100; i <= 100; ++i)
	sum += i;

解:

从-100加到100,sum的终值是0。

练习1.13

使用for循环重做1.4.1节中的所有练习(练习1.9到1.11)。

解:

练习1.9

#include <iostream>

using namespace std;

int main()
{
    int sum = 0;
    for (int val = 50; val <= 100; ++val){
        sum += val;
    }
    cout << "Sum of 50 to 100 inclusive is "
              << sum << endl;
    return 0;
}    

练习1.10

#include <iostream>

using namespace std;

int main()
{
    for (int val = 10; val >=0; --val){
        std::cout << val << " ";
    }
    cout << endl;
    return 0;
}  

练习1.11

#include <iostream>

using namespace std;

int main()
{
    int left = 0, right = 0;
    cout << "Please input two num: ";
    cin >> left >> right;

    for (; left - right; ++ left)
        cout << left << " ";

    for (; right - left; ++ right)
        cout << right << " ";

    cout << endl;
    return 0;
}

练习1.14

对比for循环和while循环,两种形式的优缺点各是什么?

解:

循环次数已知的情况下,for循环的形式更为简洁
未知的时候,用while更合适

练习1.15

编写程序,包含第14页“再探编译”中讨论的常见错误。熟悉编译器生成的错误信息。

解:

编译器可以检查出的错误有:

  • 语法错误
  • 类型错误
  • 声明错误

练习1.16

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

解:

#include <iostream>

using namespace std;

int main()
{
    int sum = 0;					//累加器切记初值为0,累乘器切记初值为1
    
    for (int value = 0; cin >> value; )
        sum += value;
    cout << sum << endl;
    
    return 0;
}

练习1.17

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

练习1.18

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

解:

全部重复:

1 1 1 1 1 
1 occurs 5 times 

没有重复:

1 2 3 4 5
1 occurs 1 times 
2 occurs 1 times 
3 occurs 1 times 
4 occurs 1 times 
5 occurs 1 times 

练习1.19

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

解:

#include <iostream>

using namespace std;

//懒得自己写了,上面有我写的,比这个简短
int main()
{
    int start = 0, end = 0;
    cout << "Please input two num: ";
    cin >> start >> end;
    if (start <= end) {
        while (start <= end){
            cout << start << " ";
            ++start;
        }
        cout << endl;
    }
    else{
        cout << "start should be smaller than end !!!";
    }
}  

练习1.20

在网站http://www.informit.com/title/032174113 上,第1章的代码目录包含了头文件 Sales_item.h。将它拷贝到你自己的工作目录中。用它编写一个程序,读取一组书籍销售记录,将每条记录打印到标准输出上。

解:

#include <iostream>
#include "Sales_item.h"

int main()
{
	for (Sales_item item; std::cin >> item; std::cout << item << std::endl);
	return 0;
}

命令:

./main < data/add_item

输出:

0-201-78345-X 3 60 20
0-201-78345-X 2 50 25

练习1.21

编写程序,读取两个 ISBN 相同的 Sales_item 对象,输出他们的和。

解:

#include <iostream>
#include "Sales_item.h"

int main()
{
    Sales_item item_1;
    Sales_item item_2;
    std::cin >> item_1;
    std::cout << item_1 << std::endl;
    std::cin >> item_2;
    std::cout << item_2 << std::endl;
    std::cout << "sum of sale items: " << item_1 + item_2 << std::endl;
	return 0;
}

命令:

./main < data/add_item

输出:

0-201-78345-X 3 60 20
0-201-78345-X 2 50 25
sum of sale items: 0-201-78345-X 5 110 22

练习1.22

编写程序,读取多个具有相同 ISBN 的销售记录,输出所有记录的和。

解:

#include <iostream>
#include "Sales_item.h"

int main()
{
    Sales_item sum_item;
    std::cin >> sum_item;
    std::cout << sum_item << std::endl;
    for (Sales_item item; std::cin >> item; std::cout << item << std::endl){
        sum_item += item;
    }
    std::cout << "sum of sale items: " << sum_item << std::endl;
	return 0;
}

命令:

./main < data/add_item

输出:

0-201-78345-X 3 60 20
0-201-78345-X 2 50 25
sum of sale items: 0-201-78345-X 5 110 22

练习1.23

编写程序,读取多条销售记录,并统计每个 ISBN(每本书)有几条销售记录。

练习1.24

输入表示多个 ISBN 的多条销售记录来测试上一个程序,每个 ISBN 的记录应该聚在一起。

解:

#include <iostream>
#include "Sales_item.h"

int main()
{
    Sales_item total;
    if (std::cin >> total){
        Sales_item trans;
        while (std::cin >> trans){
            if (total.isbn() == trans.isbn()) {
                total += trans;
            }
            else {
                std::cout << total << std::endl;
                total = trans;
            }
        }
        std::cout << total << std::endl;
    }
    else {
        std::cerr << "No data?!" << std::endl;
        return -1;
    }
    return 0;
}

命令:

./main < data/book_sales

输出:

0-201-70353-X 4 99.96 24.99
0-201-82470-1 4 181.56 45.39
0-201-88954-4 16 198 12.375
0-399-82477-1 5 226.95 45.39
0-201-78345-X 5 110 22

练习1.25

借助网站上的Sales_item.h头文件,编译并运行本节给出的书店程序。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ Primer习题集(第五) , 带目录完整。 --------------------------------------------------------------------------- 目录 第1章............................................................ 1 练习1.1 练 习1.25 第2 章变量和基本类型................................................. 12 练习2.1 练 习2.42 第3 章字符串、向量和数组..............................................37 练习3.1 练 习3.45 第4 章表达式......................................................... 80 练习4.1 练 习4.38 第5 章语句........................................................... 99 练习5.1 练 习5.25 第6 章函数.......................................................... 120 练习6.1 练 习6.56 m m m ...................................................................... 152 练习7.1 练 习7.58 第8 章1 0库..........................................................183 练习8.1 练 习8.14 第9 章顺序容器...................................................... 193 练习9.1 练 习9.52 第10章泛型算法..................................................... 234 练习10.1 练 习10.42 目录 ◄ v 第11章关联容器..................................................... 273 练习11.1 练 习11.38 第12章动态内存..................................................... 297 练习12.1 练 习12.33 第13章拷贝控制..................................................... 331 练习13.1 练 习13.58 第14章重载运算与类型转换............................................368 练习14.1 练 习14.53 第15章面向对象程序设计..............................................399 练习15.1 练 习15.42 第16章模板与泛型编程............................................... 424 练习16.1 练 习16.67 第17章标准库特殊设施............................................... 458 练习17.1 练 习17.39 第18章用于大型程序的工具............................................483 练习18.1 练 习18.30 第19章特殊工具与技术............................................... 502 练习19.1 练 习19.26

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值