C++Primer学习-习题(1)

来源:互联网 发布:黄连上清丸河南淘宝 编辑:程序博客网 时间:2024/05/01 05:17

第一章

习题1.1 查看所用的编译器文档,了解它所用的文件命名规范。编译并运行本节的main程序。

运行结果为:
这里写图片描述

习题1.2 修改程序使其返回-1。… 看系统如何处理。

我所使用的系统并没有报错,结果与1.1一致。

习题1.3 编写一个程序,在标准输出上打印“Hello,World”。

#include<iostream>using namespace std;int main(){    cout << "Hello,World" << endl;    return 0;}

书中这个地方还没有开始使用namespace,我按照自己的习惯用了。

这里写图片描述

习题1.4 编写程序,使用乘法操作符“*”产生两个数的积。

#include<iostream>using namespace std;int main(){cout << "请输入两个数:" << endl;int a, b;cin >> a >> b;cout <<a<<"与"<<b<<"的乘积为:"<<a*b<< endl;return 0;}

习题1.5 我们的程序使用了一条较长的输出语句。重写程序,使用单独的语句打印每一个操作数。

#include<iostream>using namespace std;int main(){cout << "请输入两个数:" << endl;int a, b;cin >> a >> b;cout << a;cout << "与";cout << b;cout << "的乘积为:";cout << a*b;cout<< endl;return 0;}

习题1.6 解释下面的程序段:

std::cout<<"The Sum of"<<v1;                <<"and"<<v2;                <<"is"<<v1+v2                 <<std::endl;

这段代码合法吗?

这段代码不合法。

注意,第1、2、4行的末尾有分号,表示这段代码包含三条语句,即第1、2行各为一个语句,第3、4行构成一个语句。“<<”为二元操作符,在第2、3两条语句中,第一个“<<”缺少左操作数,因此不合法。
在第2、3行的开头加上“std::cout”,即可更正。

习题1.7 编译有不正确嵌套注释的程序

如:

#include<iostream>using namespace std;/*623872489362/* */8373*/int main(){    cout << "Hello,World" << endl;    return 0;}

产生错误:

1>—— 已启动生成: 项目: Test, 配置: Debug Win32 ——
1> 1v1.cpp
1>d:\vs\test\test\1v1.cpp(5): error C2059: 语法错误:“常量”
1>d:\vs\test\test\1v1.cpp(5): warning C4138: 在注释外找到“*/”
1>d:\vs\test\test\1v1.cpp(7): error C2143: 语法错误 : 缺少“;”(在“{”的前面)
1>d:\vs\test\test\1v1.cpp(7): error C2447: “{”: 缺少函数标题(是否是老式的形式表?)

习题1.8 指出下列输出语句哪些(如果有)是合法的,预测结果并编译。

std::cout<<"/*";std::cout<<"*/";std::cout<</*"*/"*/;

第一和第二条语句是合法的,第三条语句有一个“被注释掉了,会出现错误。

第三条语句中<<操作符之后至第二个双引号之前的部分被注释掉了,导致<<操
作符的右操作数不是一个完整的字符串,所以不合法。在分号之前加上一个双
引号即可更正。

这里写图片描述

这里写图片描述

这里写图片描述

习题1.9 下列循环做什么?sum的最终值是什么?

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

求-100到100中所有整数的和,最终值为0.

习题1.10 用for循环编程,求从50到100的所有自然数的和。然后用while循环重写改程序。

for

#include<iostream>using namespace std;int main(){int sum = 0;for (int i = 50; i <= 100; i++){sum += i;}cout << sum << endl;return 0;}

while

#include<iostream>using namespace std;int main(){int sum = 0;int i = 50;while ( i <= 100){sum += i;i++;}cout << sum << endl;return 0;}

习题1.11 用while循环编程,输出10到0递减的自然数,然后用for循环重写该程序。

使用while:

#include<iostream>using namespace std;int main(){    int num = 10;    while (num >= 0)    {        cout << num << " ";        num--;    }    return 0;}

使用for:

#include<iostream>using namespace std;int main(){    int num ;    for (num = 10; num >= 0;num--)    {        cout << num << " ";    }    return 0;}

结果均为:
这里写图片描述

习题1.12 对比前面两个习题中的循环,两种形式各有何优缺点?

在for循环中,循环控制变量的初始化和修改都放在语句头部分,形式较简洁,
且特别适用于循环次数已知的情况。在while循环中,循环控制变量的初始化
一般放在while语句之前,循环控制变量的修改一般放在循环体中,形式上不
如for语句简洁,但它比较适用于循环次数不易预知的情况(用某一条件控制
循环)。两种形式各有优点,但它们在功能上是等价的,可以相互转换。

习题1.13 编译器不同,理解其诊断内容的难易程度也不同。编写一些程序,包含本节“再谈编译”部分讨论的那些常见错误。研究编译器产生的信息,这样你在编译更复杂的程序遇到这些信息时就不会感到陌生。

常见的有语法错误、类型错误、声明错误。
暂略。

习题1.14 如果输入值相等,本节展示的程序将产生什么问题?

本节展示的程序为求用户提供的两个数之间的数的和,代码如下:

#include<iostream>using namespace std;int main(){    cout << "Enter two numbers:" << endl;    int v1, v2;    cin >> v1 >> v2;//read input    //使用较小的数作为下界lower,较大的数作为上界upper    int lower, upper;    if (v1 <= v2)    {        lower = v1;        upper = v2;    }    else    {        lower = v2;        upper = v1;    }    int sum = 0;    for (int val = lower; val <= upper; val++)        sum += val;    cout << "Sum of " << lower << " to " << upper << " inclusive is " << sum << endl;    return 0;}

若输入值相等,则sum等于该值

习题1.15 验证你的预测

这里写图片描述

习题1.16 编写程序,输出用户输入的两个数中的较大者。

#include<iostream>using namespace std;int main(){    cout << "Enter two numbers:" << endl;    int v1, v2;    cin >> v1 >> v2;//read input    if (v1 > v2)        cout << v1 << endl;    else cout << v2;    return 0;}

这里写图片描述

习题1.17 编写程序,要求用户输入一组数。输出信息说明其中有多少个负数。

#include<iostream>using namespace std;int main(){    cout << "请输入一组数,以Ctrl+Z结束:" << endl;    int v1;    int num = 0;    while (cin >> v1)    {        if (v1 < 0)            num++;    }    cout <<"负数的个数为:"<< num << endl;    return 0;}

结果如图:
这里写图片描述

习题1.18 编写程序,提示用户输入两个数并将这两个数范围内的每个数写到标准输出。

#include<iostream>using namespace std;int main(){    int a, b;    int temp;    cout << "请输入两个数:" << endl;    cin >> a >> b;    if (a >b)    {        temp = a;        a = b;        b = temp;    }    cout << a << "和" << b << "之间的数有:" << endl;    for (int i = a;i<=b; i++)    {        cout << i << " ";    }    return 0;}

这里写图片描述

习题1.19 如果给上题定数1000和2000,会产生什么结果?修改程序,使每一行输出不超过十个数。

输入1000和2000得出的结果为:
这里写图片描述
修改程序:

#include<iostream>using namespace std;int main(){    int a, b;    int temp;    int count = 1;    cout << "请输入两个数:" << endl;    cin >> a >> b;    if (a >b)    {        temp = a;        a = b;        b = temp;    }    cout << a << "和" << b << "之间的数有:" << endl;    for (int i = a;i<=b; i++)    {        cout << i << " ";        if (count % 10 == 0)            cout << endl;        count++;    }    return 0;}

测试:
这里写图片描述

习题1.20 编写程序,求用户指定范围内数的和,省略设置上界和下界的if测试,假定输入的是7与3,预测结果并运行,看实际是否与预测相符。若不相符,反复研究关于for和while循环的讨论直至弄清楚其中的原因。

#include<iostream>using namespace std;int main(){    int a, b;    int sum=0;    cout << "请输入两个数:" << endl;    cin >> a >> b;    for (int i = a;i<=b; i++)        sum += i;    cout << a << "与" << b << "之间所有数的和为:" << sum << endl;    return 0;}

预测:输入7和3后输出的sum应为0。因为for循环不能进行,sum为初始化时的值。
运行程序后结果为: (与预测结果相同)
这里写图片描述

习题1.21 复制Sale_item.h源文件到工作目录,编写程序,循环遍历一组书的销售交易,读入每笔交易写至标准输出。

#include<iostream>#include"Sales_item.h"using namespace std;int main(){    Sales_item book;    cout << "请输入书的销售信息:" << endl;    while (cin >> book)    {        cout << "书的ISBN、销售数、总金额、单价分别为:" << endl;        cout << book << endl;    }    return 0;}

运行结果

习题1.22 编写程序,读入两个具有相同ISBN的Sales_item对象并产生它们的和。

0 0