《C++Primer》讀書筆記(一)開始

首先,瞭解一個我們需要嘗試的程序(書店程序),如下:

  • 書店保存每條銷售記錄的檔案,包括3個數據項:ISBN書號、售出冊數、售出單價
  • 需要能夠查詢每本書的銷量,銷售額和平均售價

我認爲,主要需要實現的是:
- 檢測相同ISBN書號
- 可重複錄入銷售記錄的輸入功能

書中提出,雖然沒有編寫程序,但是已經可以確定它必須:
- 定義變量
- 進行輸入輸出
- 使用數據結構保存數據
- 檢測兩條記錄是否有相同的ISBN書號
- 包含一個循環來處理銷售檔案中的每條記錄

接下來,介紹用C++來解決這些子問題

1.1 編寫一個簡單的C++程序

1.一個函數的定義包含4個部分:返回類型、函數名、形參列表、函數體

2.重要概念:類型(類型不僅定義了數據元素的內容,還定義了這類數據能進行的運算)

編譯、運行程序

1.IDE:集成開發環境(Integrated Developed Environment)

2.程序文件成爲源文件(source file),C++文件的後綴名常見爲:cc、cxx、cpp、cp、c

3.從命令行==運行編譯器==

在windows或者UNIX系統外殼程序窗口中,用

$ CC prg1.cc

CC編譯器程序的名字,$是系統提示符

4.從命令行中==運行執行文件==
在windows中,有兩種方法

$ prog1    //忽略其擴展名.exe
$ .\prog1  //一些系統中,必須擇定文件位置,當前目錄爲./

而在==UNIX系統==中,必須使用==全文件名==

5.訪問==main返回值==

在windows和UNIX系統中,都可以用==echo==命令獲得返回值,在windows系統中

$ echo %ERROREVEL%

運行GNU或微軟編譯器(常用編譯器:GNU、Visual Studio)

其中GNU編譯器,可以如下:

$ g++ -o prog1 prog1.cc
  • g++ 是運行命令
  • -o prog1 是編譯器參數(指定生成的可執行文件名爲prog1)
  • 不指定此參數則可執行文件:a.exe或者a.out

另外,Visual Studio編譯器命令可以如下:

C:\Users\me\programs> c1 /Ehsc prog1.cc
  • C:\Users\me\programs>是系統提示符
  • c1命令:調用編譯器
  • /Ehsc是編譯器選項,用來打開標準異常處理

練習

1.查閱編譯器文檔,確定文件命名規則,編譯並運行一個程序

參考CSDN博客 Windows下使用GNU編譯器

2.改寫程序返回值爲-1,通常這是程序錯誤的返回,觀察你的系統如何處理錯誤標識

1.2 初識輸入輸出

1.標準輸入輸出對象
- 標準輸入:cin
- 標準輸出:cout
- 標準錯誤:cerr
- 輸出運行程序時的一般性信息:clog

2.一個使用IO庫的程序

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

(1) #include指令必須在所有函數前面

(2) 輸出運算符(<<)
- 接受兩個對象:左側的運算對象必須是一個ostream對象,右側的運算對象是要打印的值;

(3) 操縱符(endl)
- 寫入endl的效果是:結束當前行,並將與設備關聯的緩衝(buffer)區中的內容刷到設備中
- 緩衝刷新操作:保證到目前爲止程序所產生的所有輸出都真正寫入輸出流中,而不是僅停留在內存中等待寫入流

程序員在調試時添加打印語句,應該一直保證刷新流,否則程序崩潰時,輸出可能還留在緩衝區,而推斷崩潰位置錯誤

(4)使用標準庫中的名字
- 前綴std::是指出cout和endl的命名空間,命名空間可以幫助我們避免名字定義衝突
- 另一個更簡便的方法:using聲明(第3章介紹)

(5)輸入運算符(>>)
- 其左側是一個istream,右側是一個接受對象

練習

1.編寫程序,打印“Hello World”

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

2.編寫使用乘法運算打印兩個數乘積的程序

將例子中的加號改爲 * 號即可

3.重寫程序,將打印對象放在一條獨立語句中

將例子程序中的std::cout切開,記得添加std::endl

4.解釋下列語句是否合法

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

不合法,第一、二行缺乏std::endl結束輸出,第二、三行缺乏std::cout作爲指定輸出的對象

1.3 註釋

(1)註釋界定符(/* */),可以多行,不可以嵌套

(2)單行和半行(//)

1.4 控制流

(1)while語句,形式如下

while(condition)
     statement

(2)複合賦值運算符
- (+=)本質上相當於sum=sum+val
- (++)前綴:將運算對象加1,等價於val=val+1

練習

1.編寫程序,用while循環50~100整數相加

#include <iostream>
int main()
{
    int sum=0,val=50;

    while(val<=100){
        sum+=val;
        val++;
    }

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

    return 0;
}

2.使用–運算實現10~0的運算
- 上程序改成(–)

3.編程:用戶輸入兩個數,打印出這兩個數之間的整數

#include <iostream>
int main()
{
    int left,right;
    std::cout<<"Please enter two numbers"<<std::endl;
    std::cin>>left>>right;

    while(left<=right){
        std::cout<<left<<std::endl;
        left++;
    }

    return 0;
}

(1) for語句,形式如下

for(init-statement;condition;expression)
    statement

讀取數量不定的輸入數據

int main()
{
    int sum=0,value=0;

    while(std::cin>>value)
    sum+=value;
    std::cout<<"Sum is: "<<sum<<std::endl;

    return 0;
}
  • windows中,文件輸入結束符爲:ctrl + Z
  • Mac或者UNIX系統中,文件輸入結束符爲:ctrl + D

(4) if 語句,形式如下

if(conditon)
  statement
  • 統計輸入中每個值連續出現了多少次程序
int main()
{
    int currVal=0,val=0;

    if(std::cin>>currVal){
        int cnt=1;

        while(std::cin>>val){
            if(val==currVal)
              ++cnt;
            else{
                std::cout<<currVal<<" occurs "<<cnt<<" times"<<std::endl;
                currVal=val;
                cnt=1;
            }
        }

        std::cout<<currVal<<" occurs "<<cnt<<" times"<<std::endl;
    }
    return 0;
} 

1.5 類簡介

(1)通過定義一個類來定義自己的數據結構

(2)關鍵概念:類定義了行爲
- 類的作者決定了類類型對象上可以使用的所有操作

==(3)使用文件重定向==
- 當測試程序時,反覆敲鍵盤是非常乏味的,可以利用文件重定向

$ addItems <infile>outfile
  • 程序已經爲編譯爲名爲addItems的可執行文件,上述命令會從一個名爲infile的文件讀取銷售記錄,並將輸出結果寫入到一個名爲outfile的文件中

1.6書店程序

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

int main(){
    Sales_item total;

    if(std::cin>>total){
        Sales_item trans;
        while(std::cin>>trans){
            if(total.isbn()==trans.isbn()){
                total+=trans;
            }
            else{
                std::cout<<total<<std::endl;
                total=trans;
            }
        }
        std::cout<<total<<std::endl;
    }
    else{
        std::cerr<<"No data?!"<<std::endl;
        return -1;
    }
    return 0;
}
發佈了34 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章