基于VS2013的C++ Primer代码练习
练习1.1
查阅你使用的编译器文档,确定它所使用的文件命名约定。编译并运行第2页的main程序。
练习1.2
改写程序,让它返回-1。返回值-1通常被当作程序错误的标识。重新编译并运行你的程序,观察你的系统如何处理main返回的错误标识。
images missing
练习1.3
编写程序,在标准输出上打印 Hello, World。
| #include <iostream> int main(){
std::cout << "Hello, World!" << endl; return 0; }
|
练习1.4
我们的程序使用加法运算符+来将两个数相加。编写程序使用乘法运算符*,来打印两个数的积。
| #include <iostream> using namespace std;
int main(){
std::cout << "Enter two numbers:" << endl; int v1 = 0, v2 = 0; cin >> v1 >> v2; cout << "the sum of " << v1 << " and " << v2 << " is " << v1 + v2 << endl; system("pause"); return 0; }
|
练习1.5
我们将所有输出操作放在一条很长的语句中。重写程序,将每个运算对象的打印操作放在一条独立的语句中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include <iostream> using namespace std;
int main(){
std::cout << "Enter two numbers:" << endl; int v1 = 0, v2 = 0; cin >> v1 >> v2; cout << "The sum of "; cout << v1; cout << " and "; cout << v2; cout << " is "; cout << v1 + v2; cout << endl; system("pause"); return 0; }
|
练习1.6
解释下面程序片段是否合法。
| std::cout << "The sum of " << v1; << " and " << v2; << " is " << v1 + v2 << std::endl;
|
如果程序是合法的,它的输出是什么?如果程序不合法,原因何在?应该如何修正?
不合理,报错如下:
- 错误 1 error C2143: 语法错误 : 缺少“;”(在“<<”的前面)
修正:移除掉多余的分号。
| std::cout << "The sum of " << v1 << " and " << v2 << " is " << v1 + v2 << std::endl;
|
练习1.7
编译一个包含不正确的嵌套注释的程序,观察编译器返回的错误信息。
|
* */
int main() { return 0; }
|
由于注释错误,影响了之后的一系列代码,VS2013报错如下: 
练习1.8
指出下列哪些输出语句是合法的(如果有的话):
| std::cout << "/*"; std::cout << "*/"; std::cout << " */; std::cout << /* "*/" /* ";
|
预测编译这些语句会产生什么样的结果,实际编译这些语句来验证你的答案(编写一个小程序,每次将上述一条语句作为其主体),改正每个编译错误。
第三行编译出错,C++中的注释界定符,从/*
开始到*/
结束第三行出现了/* "*/" */
可以分为 /
(第二个/
) 前面部分以及后面一部分,前面一部分是对 "
的注释,而后面一部分则是少了一个引号的字符串,因此改正方法是增加一个引号。
输出:
练习1.9
编写程序,使用while循环将50到100的整数相加。
| #include <iostream> using namespace std;
int main(){ int sum = 0, val = 1; while (val<=50){ sum += val; ++val; } cout << " Sum of 1 to 50 inclusive is " << sum << std::endl; return 0; }
|
练习1.10
除了++运算符将运算对象的值增加1之外,还有一个递减运算符(--)实现将值减少1。编写程序,使用递减运算符在循环中按递减顺序打印出10到0之间的整数。
| #include <iostream> using namespace std;
int main(){ int val1 = 0, val2 = 10; while (val1<=10){ val1++; cout << val2 << endl; val2--; } return 0; }
|
练习1.11
编写程序,提示用户输入两个整数,打印出这两个整数所指定的范围内的所有整数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include <iostream> using namespace std;
void print_range(int val1, int val2){ int max = 0 , min = 0; if (val1>val2){ max = val1; min = val2; }else{ max = val2; min = val1; }
int temp_val = max;
while (min <= temp_val){ min++; cout << max << endl; max--; } }
int main(){ int val1 = 0, val2 = 0; cout << "Please input two numbers!" << endl; std::cin >> val1 >> val2; print_range(val1, val2); 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节中的所有练习(第11页)。
| #include <iostream> using namespace std;
int main(){ int sum = 0, val = 1; for (int i = 0; i <= 50; i++){ sum += i; } cout << " Sum of 1 to 50 inclusive is " << sum << std::endl; return 0; }
|
| #include <iostream> using namespace std;
int main(){ int val1 = 0, val2 = 10; for(int i = 10; i >= 0; i--){ cout << i << endl; } return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include <iostream> using namespace std;
void print_range(int val1, int val2){ int max = 0, min = 0; if (val1>val2){ max = val1; min = val2; } else{ max = val2; min = val1; }
int temp_val = max;
for (int i = max; i >= min; i--) { cout << i << endl; } }
int main(){ int val1 = 0, val2 = 0; cout << "Please input two numbers!" << endl; std::cin >> val1 >> val2; print_range(val1, val2); return 0; }
|
练习1.14
对比for循环和while循环,两种形式的优缺点各是什么?
在Stack Overflow上面有与这个相似的问题
练习1.15
编写程序,包含第14页“再探编译”中讨论的常见错误。熟悉编译器生成的错误信息。
常见的错误有语法错误、类型错误、声明错误,这些都是编译器可以检查出的错误。
练习1.16
编写程序,从cin读取一组数,输出其和。
| #include <iostream>
int main() { int sum = 0; for (int value = 0; std::cin >> value;) sum += value; std::cout << sum << std::endl; return 0; }
|
练习1.17
如果输入的所有值都是相等的,本节的程序会输出什么?如果没有重复值,输出又会是怎样的?
效果如下所示: 
练习1.18
编译并运行本节的程序,给它输入全都相等的值。再次运行程序,输入没有重复的值。
代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #include <iostream> using namespace std;
int main() { int currVal = 0, val = 0; if (cin >> currVal) { int cnt = 1; while (cin >> val) { if (val == currVal) ++cnt; else{ cout << currVal << " occurs " << cnt << " items " << endl; currVal = val; cnt = 1; } } cout << currVal << " occurs " << cnt << " items " << endl; }
return 0; }
|
练习1.19
修改你为1.4.1节练习1.11(第11页)所编写的程序(打印一个范围内的数),使其能处理用户输入的第一个数比第二个数小的情况。
练习1.11本身就对输入数据的大小进行了判断
练习1.20
在网站http://www.informit.com/title/032174113上,第1章的代码目录包含了头文件 Sales_item.h。将它拷贝到你自己的工作目录中。用它编写一个程序,读取一组书籍销售记录,将每条记录打印到标准输出上。
| #include <iostream> #include "Sales_item.h"
using std::cin; using std::cout; using std::endl;
int main() { for (Sales_item item; cin >> item; cout << item << endl); return 0; }
|
练习1.22
编写程序,读取多个具有相同 ISBN 的销售记录,输出所有记录的和。
| #include <iostream> #include "Sales_item.h"
using std::cin; using std::cout; using std::endl;
int main() { for (Sales_item item1, item2; cin >> item1 >> item2 ; cout << item1 + item2 << endl); return 0; }
|
练习1.23
编写程序,读取多条销售记录,并统计每个 ISBN(每本书)有几条销售记录。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include <iostream> #include "Sales_item.h"
using std::cin; using std::cout; using std::endl;
int main() { Sales_item currItem, valItem; if (cin>>currItem) { int count = 1; while (cin >> valItem) { if (currItem.isbn() == valItem.isbn()) { ++count; } else { cout << currItem << " occurs " << count << " times " << endl; currItem = valItem; count = 1; } } cout << currItem << " occurs " << count << " times " << endl; } return 0; }
|
练习1.24
输入表示多个 ISBN 的多条销售记录来测试上一个程序,每个 ISBN 的记录应该聚在一起。
- data/books.txt是输入数据文件,在网站http://www.informit.com/title/032174113上下载

练习1.25
接祖Sales_item.h头文件,编译并且运行1.6节给出的书店程序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include <iostream> #include "Sales_item.h"
using std::cin; using std::cout; using std::endl;
int main() { Sales_item total; if (cin >> total) { int count = 1; Sales_item trans; while (cin >> trans) { if (total.isbn() == trans.isbn()) { total += trans; } else { cout << total << endl; total= trans; } } cout << total << endl; } return 0; }
|
效果如下: 