C++ Primer(第五版)读书笔记 & 习题解答 --- Chapter 1

Chapter 1.1

1. 每个C++程序都必须有且只能有一个main函数,main函数的返回类型必须是int。操作系统通过调用main函数来运行C++程序。

2. 一个函数的定义包含四部分:返回类型、函数名、形参列表以及函数体。

3. 当return语句包含一个值时,此返回值的类型必须与函数的返回类型相兼容。

4. 类型是程序设计最基本的概念之一。一种类型不仅定义了数据元素的内容,还定义了这类数据上可以进行的运算。

Chapter 1.2

1. C++包含了一个全面的标准库,标准库就是一个类型和函数的集合,每个C++编译器都必须支持。

2. 标准库中包含了iostream库,用来提供IO机制。iostream库包含了两个基础类型istream和ostream,分别表示输入流和输出流。一个流就是一个字符序列,术语“流”想要表达的是,随着时间的推移,字符是顺序生成或消耗的。

3. 标准库定义了4个IO对象:1. cin,一个istream类型的对象,也被称为标准输入,用来处理输入 2. cout,一个ostream类型的对象,也被称为标准输出,用来处理输出 3. cerr,一个ostream类型的对象,也被称为标准错误,通常写入到与标准输出相同的设备,用来输出错误信息或其他不属于程序正常逻辑的输出内容。默认情况下,写到cerr的数据是不缓冲的 4. clog,一个ostream类型的对象,用来报告程序的执行信息。默认情况下,写到clog的数据是被缓冲的。

4. #include指令和头文件的名字必须写在同一行中。

5. 输出(<<)运算符的计算结果就是其左侧运算对象。代码:

std::cout << "Enter two numbers:" << std::endl;

使用了输出运算符两次。因为输出运算符的结果是其左侧运算对象,所以第一个运算符的结果成为了第二个运算符的左侧

运算对象。因此,我们的代码等价于:

// 表达式 std::cout << "Enter two numbers:" 的运算结果是std::cout
std::cout << "Enter two numbers:";
std::cout << std::endl;

6. 输入(>>)运算符与输出运算符类似,返回其左侧运算对象作为其计算结果。因此,代码:

int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;

等价于:

// 表达式 std::cin >> v1 的运算结果是std::cin
int v1 = 0, v2 = 0;
std::cin >> v1;
std::cin >> v2;

7. IO设备通常将输入(或输出)数据保存在一个缓冲区中。

8. std::endl是一个被称为操纵符的特殊值。写入std::endl的效果是结束当前行,并将与设备关联的缓冲区中的内容刷到设备中。

9. 标准库定义的所有名字都在命名空间std中。

Chapter 1.3

1. 编译器会忽略注释,因此注释对程序的行为或性能不会有任何影响。

2. C++中有两种注释:单行注释和界定符对注释。

单行注释以双斜线(//)开始,以换行符结束。这种注释可以包含任何文本,包括额外的双斜线。

界定符对注释以“/*”开始,以“*/”结束,可以包含除“*/”外的任意内容。

3. 界定符对注释不能嵌套。下面的代码中嵌套使用界定符对注释就会产生错误:

int main()
{
    /* /* 注释1 */ 注释2 */
    // "注释2 */" 会被当做源码
    return 0;
}

Chapter 1.4

1. 所谓语句块,就是用花括号包围的零条或多条语句的序列。语句块也是语句的一种,在任何要求使用语句的地方都可以使用语句块。

2. while语句的形式为:

while ( condition )    // 所谓condition就是一个产生真或假的结果的表达式
    statement

while语句的执行过程是交替地检测condition和执行关联的语句statement,直至condition为假时停止。

3.

for ( int val = 1; val <= 10; ++val )
    statement;

上述代码使用了for语句。每个for语句都包含两部分:循环头和循环体。循环头控制循环体的执行次数,它由三部分组成:初始化语句、循环条件以及表达式。在上述代码中,初始化语句为“int val = 1”,初始化语句只在for语句入口处执行一次。在上述代码中,循环条件为“val <= 10”,循环体每次执行前都会先检查循环条件,只要循环条件为真,循环体就会被执行。在上述代码中,表达式为“++val”,表达式在循环体之后执行,执行完表达式后,for语句就会重新检测循环条件。

4. 当使用一个istream对象作为条件时,其效果是检测流的状态。如果流是有效的,则条件为真。当遇到文件结束符或遇到一个无效输入时,istream对象的状态会变为无效。处于无效状态的istream对象会使条件变为假。

5. 当用键盘向程序输入数据时,对于如何指定文件结束,不同操作系统有不同的约定。在Windows系统中,输入文件结束符的方法是Ctrl + Z。在Unix系统中,包括Mac OS X系统中,输入文件结束符的方法是Ctrl + D。

Chapter 1.5

1. 每个类实际上都定义了一个新的类型,其类型名就是类名。

2. 大多数操作系统支持文件重定向,这种机制允许我们将标准输入和标准输出与命名文件关联起来:

$ addItems <infile >outfile

假定$是操作系统提示符,应用程序为addItems.exe,则上述命令会从一个名为infile的文件读取销售记录,并将输出结果写入到一个名为outfile的文件中,两个文件都位于当前目录中。

Exercises Section 1.2

Q_1. Write a program to print Hello, World on the standard output.

A_1.

#include <iostream>

int main()
{
    std::cout << "Hello, World" << std::endl;

    return 0;
}

Q_2. Our program used the addition operator, +, to add two numbers. Write a program that uses the multiplication operator, *, to print the product instead.

A_2.

#include <iostream>

int main()
{
    std::cout << "Enter two numbers:" << std::endl;

    int v1 = 0, v2 = 0;
    std::cin >> v1 >> v2;

    std::cout << "The product of " << v1 << " and " << v2 << " is " << v1 * v2 << std::endl;

    return 0;
}

Q_3. We wrote the output in one large statement. Rewrite the program to use a separate statement to print each operand.

A_3.

#include <iostream>

int main()
{
    std::cout << "Enter two numbers:" << std::endl;

    int v1 = 0, v2 = 0;
    std::cin >> v1 >> v2;

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

    return 0;
}

Q_4. Explain whether the following program fragment is legal.

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

If the program is legal, what does it do? If the program is not legal, why not? How would you fix it?

A_4. 这个程序是非法的,v1后的分号表示了一条语句的结束,所以程序会认为“<< " and " << v2;”是一条独立的语句,而这条语句缺少了左侧运算对象。同理,“<< " is " << v1 + v2 << std::endl;”也缺少了左侧运算对象。

修正如下:

std::cout << "The sum of " << v1    // 去除分号
             << " and " << v2              // 去除分号
             << " is " << v1 + v2 << std::endl;

Exercises Section 1.3

Q_1. Indicate which, if any, of the following output statements are legal:

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

After you‘ve predicted what will happen, test your answers by compiling a program with each of these statements. Correct any errors you encounter.

A_1.

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

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

std::cout << /* "*/" */;
// 非法,修正为:
std::cout << /* "*/" */";

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

Exercises Section 1.4.1

Q_1. Write a program that uses a while to sum the numbers from 50 to 100

A_1.

#include <iostream>

int main()
{
    int sum = 0, val  = 50;
    while ( val <= 100 )
    {
        sum += val;
        ++val;
    }

    std::cout << "Sum of 50 to 100 inclusive is " << sum << std::endl;

    return 0;
}

Q_2. In addition to the ++ operator that adds 1 to its operand, there is a decrement operator (--) that subtracts 1. Use the decrement operator to write a while that prints the numbers from ten down to zero.

A_2.

#include <iostream>

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

    return 0;
}

Q_3. Write a program that prompts the user for two integers. Print each number in the range specified by those two integers.

A_3.

#include <iostream>

int main()
{
    std::cout << "Enter two numbers:" << std::endl;

    int v1 = 0, v2 = 0;
    std::cin >> v1 >> v2;

    while ( v1 <= v2 )
    {
        std::cout << v1 << std::endl;
        ++v1;
    }

    return 0;
}

Exercises Section 1.4.2

Q_1. What does the following for loop do? What is the final value of sum?

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

A_1. 上述代码的功能是计算-100到100的和,最终sum的结果是0。

Q_2. Rewrite the exercises from § 1.4.1 (p. 13) using for loops

A_2.

#include <iostream>

int main()
{
    int sum = 0;
    for ( int val = 50; val <= 100; ++val )
    {
        sum += val;
    }

    std::cout << "Sum of 50 to 100 inclusive is " << sum << std::endl;

    return 0;
}
#include <iostream>

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

    return 0;
}
#include <iostream>

int main()
{
    std::cout << "Enter two numbers:" << std::endl;

    int v1 = 0, v2 = 0;
    std::cin >> v1 >> v2;

    for ( ; v1 <= v2; ++v1 )
    {
        std::cout << v1 << std::endl;
    }

    return 0;
}

Exercises Section 1.4.3

Q_1. Write your own version of a program that prints the sum of a set of integers read from cin.

A_1.

#include <iostream>

int main()
{
    int sum = 0;
    for ( int val; std::cin >> val; )
    {
        sum += val;
    }

    std::cout << "Sum is: " << sum << std::endl;

    return 0;
}

Exercises Section 1.4.4

Q_1. Revise the program you wrote for the exercises in § 1.4.1 (p. 13) that printed a range of numbers so that it handles input in which the first number is smaller than the second.

A_1.

#include <iostream>

int main()
{
    std::cout << "Enter two numbers:" << std::endl;

    int v1 = 0, v2 = 0;
    std::cin >> v1 >> v2;
    if ( v1 > v2 )
    {
        // 如果v1大于v2,就进行交换
        int temp = v1;
        v1 = v2;
        v2 = temp;
    }

    while ( v1 <= v2 )
    {
        std::cout << v1 << std::endl;
        ++v1;
    }

    return 0;
}

Exercises Section 1.5.1

Q_1. http://www.informit.com/title/032174113 contains a copy of Sales_item.h in the Chapter 1 code directory. Copy that file to your working directory. Use it to write a program that reads a set of book sales transactions, writing each transaction to the standard output.

A_1.

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

int main()
{
    Sales_item book;
    while ( std::cin >> book )
    {
        std::cout << book << std::endl;
    }

    return 0;
}

Q_2. Write a program that reads two Sales_item objects that have the same ISBN and produces their sum.

A_2.

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

int main()
{
    Sales_item item1, item2;
    std::cin >> item1 >> item2;
    std::cout << item1 + item2 << std::endl;

    return 0;
}

Q_3. Write a program that reads several transactions for the same ISBN. Write the sum of all the transactions that were read.

A_3.

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

int main()
{
    Sales_item sum, val;

    // 读取第一笔交易
    std::cin >> sum;

    // 累加所有交易
    while ( std::cin >> val )
    {
        sum = sum + val;
    }

    std::cout << sum << std::endl;

    return 0;
}

Exercises Section 1.5.2

Q_1. Write a program that reads several transactions and counts how many transactions occur for each ISBN.

A_1.

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

int main()
{
    Sales_item lastItem;
    if ( std::cin >> lastItem )
    {
        int count = 1;
        Sales_item curItem;
        while ( std::cin >> curItem )
        {
            if ( lastItem.isbn() == curItem.isbn() )
            {
                ++count;
            }
            else
            {
                std::cout << lastItem.isbn() << " occurs " << count;

                lastItem = curItem;
                count = 1;
            }
        }

        std::cout << lastItem.isbn() << " occurs " << count;
    }

    return 0;
}
时间: 2024-10-15 16:06:53

C++ Primer(第五版)读书笔记 & 习题解答 --- Chapter 1的相关文章

C++ Primer(第五版)读书笔记 &amp; 习题解答 --- Chapter 3

Chapter 3.1 1. using声明具有如下的形式: using namespace::name; Chapter 3.2 1. C++标准一方面对库类型所提供的操作做了规定,另一方面也对库的实现做出了性能上的要求,所以,在一般的应用场合,标准库类型都有足够的效率. 2. 当用一个字符串字面值初始化string对象时,除了最后那个空字符外其他所有的字符都会被拷贝到新创建的string对象中去. 3. 如果使用等号初始化一个变量,实际上执行的是拷贝初始化.如果不使用等号,则执行的是直接初始

C++ Primer(第五版)读书笔记 &amp; 习题解答 --- Chapter 2

Chapter 2.1 1. 数据类型决定了程序中数据和操作的意义. 2. C++定义了一套基本数据类型,其中包括算术类型和一个名为void的特殊类型.算术类型包含了字符.整型.布尔值以及浮点数.void无值也无操作,我们不能定义一个void类型的变量. 3. 算术类型的尺寸,也就是该类型所占的比特数,在不同机器上有所差别.下表列出了C++标准规定的最小尺寸,同时允许编译器赋予这些类型更大的尺寸: 由于比特数的不同,一个类型所能表达的最大(最小)值也是不同的. 4. C++语言规定,一个int至

C++ Primer 第五版学习笔记

<C++ Primer>第五版中文版学习笔记 ? C++ Primer 第五版学习笔记

C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器

C++ Primer(第五版)学习笔记_9_标准模板库_multimap多重映照容器 多重映照容器multimap与map结构基本相同,但由于重复键值存在,所以multimap的元素插入.删除.查找都与map的方法不相同. 1.multimap对象创建.元素插入 插入元素时,需要使用insert()方法和类似pair<string,double>("Jack", 300.5)的元素结构.可以看到,重复的元素是按照插入的先后顺序排序的. #include <iostre

C++ Primer(第五版)学习笔记_5_标准模板库string(2)

C++ Primer(第五版)学习笔记_5_标准模板库string(2) 10.搜索string对象的元素或子串 采用find()方法可查找字符串中的第一个字符元素(char, 用单引号界定)或者子串(用双引号界定):如果查到,则返回下标值(从0开始计数),如果查不到,则返回一个很大的数string:npos(即:4294967295). #include <iostream> #include <stdio.h> #include <string> using nam

C++ Primer(第五版)学习笔记_3_标准模板库vector(2)

C++ Primer(第五版)学习笔记_3_标准模板库vector(2) 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 6.元素的插入 insert()方法可以在vector对象的任意位置前插入一个新的元素,同时,vector自动扩张一个元素空间,插入位置后的所有元素依次向后挪动一个位置. 要注意的是,insert()方法要求插入的位置,是元素的迭代器位置,而不是元素的下标. #include <iostream> #include <vector> using namespa

C++ Primer(第五版)学习笔记_1_标准模板库--快速入门

C++ Primer(第五版)学习笔记_1_标准模板库--快速入门 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 标准模板库(STL)提供三种类型的组件:容器.迭代器和算法,他们都支持泛型程序设计标准. 容器主要有两类:顺序容器和关联容器.顺序容器(vector.list.deque和string等)是一系列元素的有序集合.关联容器(set.multiset.map和multimap)包含查找元素的键值. 迭代器的作用是遍历容器. STL算法库包含四类算法:排序算法.不可变序算法.变序性算法

C++ Primer(第五版)学习笔记_2_标准模板库vector(1)

C++ Primer(第五版)学习笔记_2_标准模板库vector(1) 欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 向量容器vector不但能像数组一样进行随机访问,还能在尾部插入元素,完全可以替代数组. 值得注意的是,vector具有内存自动管理的功能,对于元素的插入和删除,可以动态调整所占的内存空间. 容器vector的下标是从0开始的,如果vector容器的大小是n,则元素下标为0~n-1,这和数组的一样的.不一样的是,vector可以随时调整其大小. vector重要的方法有三个

C++ Primer(第五版)学习笔记_4_标准模板库string(1)

C++ Primer(第五版)学习笔记_4_标准模板库string(1) 1.创建string对象 创建一个空字符串,其长度为0 #include <iostream> #include <string> using namespace std; int main(int argc, char* argv[]) { string s; cout << s.length() << endl; return 0; } 运行结果: 0 2.给string对象赋值