1. 程式人生 > >C++ primer 第一章筆記及習題

C++ primer 第一章筆記及習題

本章的Github地址:https://github.com/hwl19951007/Cpp_Primer_Exercise/tree/master/Chapter1

筆記


  1. << 運算子為輸出運算子。接受左右兩個物件,左邊必須是一個ostream物件,右邊則是要列印的值。在 << 運算子的鏈中,左側物件始終是第一個接收的物件。

    >> 運算子為輸入運算子,在 >> 運算子的鏈中,邏輯同輸出運算子。

舉例如下:

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

實際上等價於:

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

前一句將字串列印到輸出中,第二句將列印句結束。

Std是標準庫的簡寫,std::cout指的是在標準庫這個名稱空間下的cout物件。

  1. 後續介紹的主要是一些基礎語句,如for迴圈,while迴圈,if語句,以及類的簡介。

練習


練習1.3:編寫程式,在標準輸出上列印Hello, world。

#include <iostream>
int main()
{
    std::cout << "Hello World!\n" << std::endl; 
}

練習1.4:我們的程式使用加法運算子+來將兩個數相加。編寫程式使用乘法運算子*,來列印兩個數的積。

#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 " << v1 << " and " << v2 << " is " << v1 * v2 << std::endl;
    return 0;
}

練習1.5:我們將所有輸出操作放在一條很長的語句中。重寫程式,將每個運算物件的列印操作放在一條獨立的語句中。

#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;
}

練習1.6:解釋下面程式片斷是否合法:

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

不合法,因為在語句中加了分號,使語句邏輯破碎了。解決方法:

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

練習1.7:編譯一個包含不正確的巢狀註釋的程式,觀察編譯器返回的錯誤資訊。

1>c:\users\hwl1995\c++projects\helloworld\helloworld\helloworld.cpp(10): warning C4138: 在註釋外找到“*/”
1>c:\users\hwl1995\c++projects\helloworld\helloworld\helloworld.cpp(10): error C2059: 語法錯誤:“/”

練習1.8: 指出下列哪些輸出語句是合法的(如果有的話):

std::cout << "/*"; //合法 輸出/*
std::cout << "*/"; //合法	輸出*/
std::cout << /* "*/" */;	//非法	可修改為std::cout << /* " */"/* */;
std::cout << /* "*/" /* "/*" */;	//合法 構成了兩個完整的/**/註釋界定符。只有" /* "沒有落在註釋界定符中, 得以正常輸出。
(C++中可以在句中包含註釋。)

練習1.9:編寫程式,使用while迴圈將50到100的整數相加。

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

練習1.10:除了++運算子將運算物件的值增加1之外,還有一個遞減運算子(–)實現將值減少1。編寫程式,使用遞減運算子在迴圈中按遞減順序打印出10到0之間的整數。

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


練習1.11:編寫程式,提示使用者輸入兩個整數,打印出這兩個整數所指定的範圍內的所有整數。

#include <iostream>
int main()
{
    int v1 = 0, v2 = 0;
    std::cout << "Enter two numbers:" << std::endl;
    std::cin >> v1 >> v2;
    while (v2 - v1 >= 0) { //預設v2 > v1
        std::cout << " " << v1;
        ++v1;
    }
    return 0;
}

練習1.12:下面的for迴圈完成了什麼功能?sum的終值是多少?

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

完成了從-100到100 的整數相加的過程。終值為0。

練習1.13:使用for 迴圈重做練習1.9,1.10,1.11。

1.9
#include <iostream>
int main()
{
    int sum = 0;
    for (int i = 50; i <= 100; ++i)
        sum += i;
    std::cout << sum;
    return 0;
}
1.10
#include <iostream>
int main()
{
    for (int i = 10; i >= 0; --i)
        std::cout << " " << i;
    return 0;
}
1.11
#include <iostream>
int main()
{
    int v1 = 0, v2 = 0;
    std::cout << "Enter two numbers:" << std::endl;
    std::cin >> v1 >> v2;
    for (;v2 - v1 >= 0; ++v1)	//預設v2>v1
        std::cout << " " << v1;
    return 0;
}

練習1.14:對比for迴圈和while迴圈,兩種形式的優缺點各是什麼?

1、在for迴圈中,迴圈控制變數的初始化和修改都放在語句頭部分,形式較簡潔,且特別適用於迴圈次數已知的情況。
2、在while迴圈中,迴圈控制變數的初始化一般放在while語句之前,迴圈控制變數的修改一般放在迴圈體中,形式上不如for語句簡潔,但它比較適用於迴圈次數不易預知的情況(用某一條件控制迴圈)。

3、兩種形式各有優點,但它們在功能上是等價的,可以相互轉換。

練習1.16:編寫程式,從cin讀取一組數,輸出其和。

#include <iostream>
int main()
{
    int value = 0, sum = 0;
    std::cout << "Enter some numbers:" << std::endl;
    while (std::cin >> value) {
        sum += value;
    }
    std::cout << "The sum of numbers is:" << sum << std::endl;
    return 0;
}

練習1.17:如果輸入的所有值都是相等的,本節的程式會輸出什麼?如果沒有重複值,輸出又會是怎麼樣?

1)沒有輸出。2)每輸入一個不同的值,就會輸出前一個值出現了一次的資訊(xxx occurs 1 times)。

練習1.18:編譯並執行本節的程式,給它輸入全都相等的值。再次執行程式,輸入沒有重複的值。


練習1.19:修改你為練習1.11所編寫的程式(列印一個範圍內的數),使其能處理使用者輸入的第一個數比第二個數小的情況。

#include <iostream>
int main()
{
    int v1 = 0, v2 = 0;
    std::cout << "Enter two numbers:" << std::endl;
    std::cin >> v1 >> v2;
    if (v1 > v2){
        int t;
        t = v2;
        v2 = v1;
        v1 = t;
    }
    while (v2 - v1 >= 0) {
        std::cout << " " << v1;
        ++v1;
    }
    return 0;
}

練習1.20:在網站http://www.informit.com/title/0321714113上,第一章的程式碼目錄中包含了標頭檔案Sales_item.h。將它拷貝到你自己的工作目錄中,用它編寫一個程式,讀取一組書籍銷售記錄,將每條記錄列印到標準輸出上。

#include <iostream>
#include "Sales_item.h"
int main()
{
    Sales_item item;
    while (std::cin >> item)
        std::cout << item << std::endl;
    return 0;
}

練習1.21:編寫程式,讀取兩個ISBN相同的Sales_item物件,輸出它們的和。

#include <iostream>
#include "Sales_item.h"
int main()
{
    Sales_item item1, item2;
    std::cout << "Please enter two items that have same ISBN: " << std::endl;
    std::cin >> item1 >> item2;
    std::cout << "The sum is :" << item1 + item2 << std::endl;
    return 0;
}

練習1.22:編寫程式,讀取多個具有相同ISBN的銷售記錄,輸出所有記錄的和。

#include <iostream>
#include "Sales_item.h"
int main()
{
    Sales_item item1, item2;
    std::cin >> item1;
    while (std::cin >> item2 and item1.isbn()==item2.isbn()) {
        item1 += item2;
    }
    std::cout << "The sum is :" << item1 << std::endl;
    return 0;
}

練習1.23:編寫程式,讀取多條銷售記錄,並統計每個ISBN(每本書)有幾條銷售記錄。

#include <iostream>
#include "Sales_item.h"
int main()
{
    Sales_item item1, item2;
    int count = 1;
    std::cin >> item1;
    while (std::cin >> item2) {
        if (item1.isbn() == item2.isbn()) {
            count += 1;
        }
        else {
            std::cout << item1.isbn() << " have " << count << " sale records." << std::endl;
            item1 = item2;
            count = 1;
           }
       }
    return 0;
}

練習1.24:輸入表示多個ISBN的多條銷售記錄來測試上一個程式,每個ISBN的記錄應該聚在一起。


練習1.25:藉助網站上的Sales_item.h標頭檔案,編譯並執行本節給出的書店程式。