天天看點

c++primer(第五版) 閱讀筆記_第1章

一、結構圖:

 二、代碼及練習題

1.1節 編寫一個簡單的C++程式

1.1節練習

練習1.1:

查閱使用的編譯器的文檔:我使用的是vs2013,其文檔為https://docs.microsoft.com/zh-cn/previous-versions/visualstudio/visual-studio-2013/60k1461a(v=vs.120)

編譯運作第2頁程式:

#include <iostream>
using namespace std;
int main()
{
    return 0;
}      

傳回值為 0 (0x0)

練習1.2:

改寫程式,讓它傳回-1.

#include <iostream>
using namespace std;
int main()
{
    return -1;
}      

傳回值為 -1 (0xffffffff)

0xffffffff ,0x表示十六進制,計算機裡用補碼表示。-1的補碼(32位系統,每四位二進制可以由一位十六進制代替)為ffffffff

原碼、反碼、補碼,這篇文章講的不錯:https://www.imooc.com/article/16813?block_id=tuijian_wz

正數的原碼、反嗎、補碼一樣。

以-1(8位)為例,最高位符号位,1為負數、0為正數。

原碼:1000 0001

反碼:1111 1110(反碼在原碼基礎上按位取反,符号位不變)

補碼:1111 1111(補碼在反碼的基礎上加1)

補碼轉原碼:補碼基礎上按位取反後加一,符号位在取反時不變,加一時最高位符号位有進位的,進位忽略

1.2 初識輸入輸出

#include <iostream>
using namespace std;
int main()
{
    cout << "Enter two numbers:" << endl;
    int v1 = 0, v2 = 0;
    cin >> v1 >> v2;
    cout << "The sum of " << v1 << " and " << v2 << " is " << v1 + v2 << endl;
    return 0;
}      

1.2節練習

練習1.3:

#include <iostream>
using namespace std;
int main()
{
    cout << "Hello Word" << 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;
    return 0;
}      

練習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 << endl;
    return 0;
}      

練習1.6:

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

程式不合法,原因是<<運算符接受兩個運算對象:左側的運算對象必須是一個ostream對象,右側的運算對象是要列印的值。顯然第二、三行缺少ostream對象。

可以修改為:

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

或者:

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

1.3注釋簡介

c++有兩種注釋:單行注釋(//)和界定符對注釋(/**/)

#include <iostream>
using namespace std;
/*
* 簡單主函數:
* 讀取兩個數,求它們的和
*/
int main()
{
    //提示使用者輸入兩個數
    cout << "Enter two numbers:" << endl;
    int v1 = 0, v2 = 0; //儲存我們讀入的輸入資料的變量
    cin >> v1 >> v2;    //讀取輸入資料
    cout << "The sum of "<< v1 << " and "<< v2 
         << " is "<<v1 + v2 << endl;
    return 0;
}      

注釋界定符不能嵌套

#include <iostream>
using namespace std;
/*
* 注釋對/* */ 不能嵌套
*"不能嵌套"幾個字會被認為是源碼
* 像剩餘程式一樣處理
*/
int main()
{
    return 0;
}      
///*
//* 單行注釋中的任何内容都會被忽略
//* 包括嵌套的注釋對也一樣會被忽略
//*/      

1.3節練習

練習1.7,包含不正确嵌套的程式,傳回錯誤資訊

 練習1.8

cout << "/*"; //正确

cout << "*/"; //正确

cout << /*"*/"*/; //錯誤

cout << /* "*/" /* "/*" */; //正确

改為:

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

1.4 控制流

1.4.1 while語句

#include <iostream>
using namespace std;
int main()
{
    int sum = 0, val = 1;
    //隻要val的值小于等于10,while循環就會持續執行
    while(val <=10){
        sum += val; //将sum+val賦予sum
        ++val;   //将val加1
    }
    cout << "Sum of 1 to 10 inclusive is " << sum << endl;
    return 0;
}      

 練習1.9

#include <iostream>
using namespace std;
int main()
{
    int sum = 0, val = 50;
    //隻要val的值小于等于100,while循環就會持續執行
    while(val <=100){
        sum += val; //将sum+val賦予sum
        ++val;   //将val加1
    }
    cout << "Sum of 50 to 100 inclusive is " << sum << endl;
    return 0;
}      

練習1.10

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

練習 1.11

#include <iostream>
using namespace std;
void fun(int v1,int v2)
{
    while (v1 >= v2){

        cout << v1<<" ";
        --v1;
    }
    cout << endl;
}
int main()
{
    int  v1,v2;
    cout << "請輸入兩個整數:" << endl;
    cin >> v1 >> v2;
    if (v1 >= v2) fun(v1, v2);
    else  fun(v2, v1);
    return 0;
}      

 1.4.2 for語句

#include <iostream>
using namespace std;

int main()
{
    int  sum =0;
    //從1加到10
    for (int val = 1; val <= 10; ++val)
        sum += val; //等價于sum =sum+val
    cout << "Sum of 1 to 10 inclusive is " << sum << endl;
    return 0;
}      

 練習1.12

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

for循環完成-100到100的求和,sum終值為0

練習1.13

#include <iostream>
using namespace std;
int main()
{
    int sum = 0, val = 50;
    for (int val = 50; val <= 100;++val)
        sum += val; 
    cout << "Sum of 50 to 100 inclusive is " << sum << endl;
    return 0;
}      
#include <iostream>
using namespace std;
int main()
{
    for (int val = 10; val >= 0;--val)
        cout << val << endl;
    return 0;
}      
#include <iostream>
using namespace std;
void fun(int v1, int v2)
{
    for (; v1 >= v2; --v1)
        cout << v1 << " ";
    cout << endl;
}
int main()
{
    int  v1, v2;
    cout << "請輸入兩個整數:" << endl;
    cin >> v1 >> v2;
    if (v1 >= v2) fun(v1, v2);
    else  fun(v2, v1);
    return 0;
}      

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

for循環和while循環的優缺點如下: 

1、在for循環中,循環控制變量的初始化和修改都放在語句頭部分,形式較簡潔,且特别适用于循環次數已知的情況。

2、在while循環中,循環控制變量的初始化一般放在while語句之前,循環控制變量的修改一般放在循環體中,形式上不如for語句簡潔,但它比較适用于循環次數不易預知的情況(用某一條件控制循環)。

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

 https://blog.csdn.net/sixabs/article/details/82708318

練習1.15 熟悉編譯器生成的錯誤資訊。

1.4.3 讀取數量不定的輸入資料

#include <iostream>
using namespace std;

int main()
{
    int sum = 0, value = 0;
    //讀取資料直到遇到檔案尾,計算所有讀入的值的和
    while (cin >> value)
        sum += value; //等價于sum =sum+value
    cout << "Sum is: " <<sum << endl;
    return 0;
}      

鍵盤輸入檔案結尾符:windows中先“Ctrl+Z”,然後再“換行Enter”

1.4.4  if語句

#include <iostream>
using namespace std;
int main()
{
    //currVal是我們正在統計的數;我們将讀入的新值存入val
    int currVal=0, val=0;
    //讀取第一個數,并確定确實有資料可以處理
    if (cin >> currVal){
        int cnt = 1;   //儲存我們正在處理的目前值的個數
        while (cin >> val){  //讀取剩餘的數
            if (val == currVal) //如果值相同
                ++cnt;  //将cnt加1
            else{      //否則,列印前一個值的個數
                cout << currVal << " occurs " << cnt << " times" << endl;
                currVal = val; //記住新值
                cnt = 1; //重置計數器
            }
        }//while 循環在這裡結束
        //記住列印檔案中最後一個值的個數
        cout << currVal << " occurs " << cnt << " times " <<endl;
    }//最外層的if語句在這裡結束
    return 0;
}      

 1.5 類簡介

 1.5.1 Sale_item類

#include <iostream>
#include "Sales_item.h"
using namespace std;
int main()
{
    Sales_item book;
    //讀入ISBN号、售出的冊數以及銷售價格
    cin >> book;
    //寫入ISBN、售出的冊數、總銷售額和平均價格
    cout << book << endl;
    return 0;
}      
#include <iostream>
#include "Sales_item.h"
using namespace std;
int main()
{
    Sales_item item1,item2;
    cin >> item1>>item2;   //讀取一對交易記錄
     cout << item1 + item2 << endl;  //列印它們的和
    return 0;
}      

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

#include <iostream>
#include "Sales_item.h"
using namespace std;
int main()
{
    Sales_item item1, item2;
    while (cin >> item1)
    {
        item2 = item1 + item2;
    }
    
    cout <<  item2 << endl;  //列印它們的和
    return 0;
}      

 1.5.2 初始成員函數

#include <iostream>
#include "Sales_item.h"
using namespace std;
int main()
{
    Sales_item item1, item2;
    cin >> item1 >> item2;
    //首先檢查item1和item2是否表示相同的書
    if (item1.isbn() == item2.isbn()){
        cout << item1 + item2 << endl;
        return 0;  //表示成功
    }
    else {
        cerr << "Data must refer to same isbn" << endl;
        return -1;
    }
}      

 1.6 書店程式

#include <iostream>
#include "Sales_item.h"
using namespace std;
int main()
{
    Sales_item total; //儲存下一條交易記錄的變量
    //讀入第一條交易記錄,并確定有資料可以處理
    if (cin >> total){
        Sales_item trans; //儲存和的變量
        //讀入并處理剩餘交易記錄
        while (cin >> trans){
            //如果我們仍在處理相同的書
            if (total.isbn() == trans.isbn())
                total += trans;  //更新總銷售額
            else{
            //列印前一本書的結果
                cout << total << endl;
                total = trans; //total 現在表示下一本書的銷售額
            }
        }
        cout << total << endl; //列印最後一本書的結果
    }
    else {
        //沒有輸入!警告讀者
        cerr << "No data?!" << endl;
        return -1;
    }
    return 0;
}      

  小結

術語表

繼續閱讀