C++程序設計(第三版)譚浩強讀書筆記

第一章 c++的初步知識

1.1 C++對c增強

  • 對c功能做了補充
  • 增加面向對象的機制

1.2 C++程序分析

  1. main前面的int的作用是聲明函數類型爲整型
  2. cout實際上爲輸出流對象
  3. 函數體由大括號{ }括起來的
  4. #include是預處理命令,它將iostream內容包含到該命令所在的程序文件中
  5. “<<”是插入運算符,輸出的隊列也叫輸出流
    “>>”是提取運算符
  6. class Student --聲明類
    {private: --以下爲私有變量
    int num;
    int score;
    public: --以下爲公有變量
    void setdata()
    {cin>>num;
    cin>>score;}
    void display()
    {cout<<num<<endl;}
    }
    Student stud1,stud2; --stud1和stud2都是對象

1.3 c++程序構成和書寫形式

  1. 一個c++程序由單個或多個程序單位構成
  2. 一個程序單位包括 ①預處理命令②全局聲明部分③函數
  3. 一個函數包括①函數定義②函數體{包括聲明部分和執行部分}
  4. 語句 :①聲明語句 ②執行語句
  5. 一個c++程序總是從main函數開始執行的

1.4 c++編譯到運行結果步驟

  1. 編寫程序

  2. 編譯:①內容:把源程序翻譯成二進制形式的“目標程序”
    ②作用:對源程序進行詞法檢查和語法檢查

  3. 將目標程序連接

  4. 運行程序

  5. 分析運行結果

第二章 數據存儲、表示和計算

2.1 c++的數據類型

類型名 符號 數量級 字節數
整型 int -232~232-1 4
短整型 short int -215~215-1 2
長整型 long int -232~232-1 4
無符號 unsigned 雙倍整且正數 保持
字符型 char -28~28-1 1
單精度 float 3.410-38~3.41038 4
雙精度 double 1.710-308~1.710308 8
長雙精度 long double 1.710-308~1.710308 8

2.2常量

2.2.1 常量分類

  1. 數值型常量
  2. 字符型常量

2.2.2 數值常量

  1. 整型常量的類型
    非負值整數可以賦值給unsigned型變量
    -十進制整數。整常量後加一個l或者L表示爲長整
    -八進制整數。常熟開頭加一個數字0
    -十六進制整數。常熟開頭加一0和英文字母x

  2. 浮點數表示方法
    ①十進制小數形式
    -單精度浮點數:後加F或f,4字節
    -長雙精度數:後加l或L,12字節
    -雙精度:8字節
    ②指數形式:3.14159——————>0.314159e10

2.2.3 字符常量

  1. 普通的字符常量:單引號括起來的一個字符
    ①只包括一個字符
    ②區分大小寫
    ③‘ 是定界符

  2. 轉義字符常量 p22

  3. 字符數據存儲形式:存放ASCLL對應的二進制形式

  4. 字符串常量:雙引號括起來的多個字符

2.2.4 符號常量

	用一個符號名代表一個常量,稱爲符號常量,即以標識符出現的常量
		#define PRICE 30       //給PRICE符號常量賦值30,該語句後不加分號
	使用符號常量的好處:
	①含義清楚。在規範程序中不提倡用很多直接常量
	②在需要改一個常量的時候做到“一改全改”

2.3 變量

2.3.1 變量的含義

     在程序運行期間其值可以改變的量稱爲變量。變量包括變量名和變量值。
     變量名是內存一個存儲單元地址
     變量值是內存單元中的數值

2.3.2 變量名規則

  1. 標識符:用來標識變量、符號常量、函數、數組、類型等實體名字的有效字符序列稱爲標識符,實際上就是一個名字
  2. 變量的名字需要遵循標識符的命名規則:只能由字母、數字和下劃線3種字符組成,且第一個字符必須爲字母或下劃線。

2.3.3 定義變量

  1. 定義變量的一般形式 : 數據類型 變量名錶列;
    eg: int a;

  2. c語言要求變量的定義應該放在所有的執行語句之前,而c++只要求在第一次使用該變量之前進行定義即可。

  3. 強制定義的目的:
    ①使得程序中變量名使用的正確
    ②變量被指定確定類型後,在編譯時就能爲其分配相應的存儲單元
    ③變量被指定確定類型後,在編譯時可以檢查該變量所進行的運算是否合法

2.3.4 對變量賦初值

  允許在定義變量時對它賦予一個初值,這稱爲變量初始化

2.3.5 常變量

  • 定義變量時在前面加上關鍵字const,則變量的值在程序運行期間不能改變

  • 爲什麼要存在常變量?
    變量的特徵時存在一個以變量名命名的存儲單元,在一般情況下,存儲單元的內容是可以變化的,對常變量來說,無非在此變量的基礎上加上一個限定:存儲單元中的值不允許變化,因此常變量又稱爲只讀變量。

  • 區分#define指令定義的符號常量和用const定義的常變量。
    符號常量知識用一個符號代替一個字符串,在預編譯時把所有符號常量替換爲所指定的字符串,它沒有類型,在內存中並不存在以符號常量命名的存儲單元。

2.4 C++ 的運算符

在這裏插入圖片描述

2.5 算術運算符和算術表達式

2.5.1 基本的算術運算符

在這裏插入圖片描述

  • 兩個整數相除的結果爲整數,捨去小數部分,在visual中“向零取整”
  • c++在運算時對所有float型數據都按double型數據處理

2.5.2 算術表達式和運算符的優先級與結合性

先乘除後加減,如果優先級相同則從左向右運算

2.5.3 表達式中各類數值型數據間的混合運算


箭頭方便只表示數據類型級別的高低,由低到高轉換

2.5.4 自增(++)和自減(–)運算符

  • ++/–i (在使用i之前先使i加/減1)
  • i++/-- (在先使用i,再加/減1)

2.5.5 強制類型轉換運算符

		一般格式:(類型名)(表達式)
  • 在強制類型轉換時,得到一個所需類型的中間數據,但原來變量的類型沒發生改變。
  • 如果要強制類型轉換的對象是一個變量,該變量可以不用括號括起來,如果是一個多項表達式則應該用括號括起來。
  • 如3+6.5這種轉換爲隱式類型轉換,強制類型轉換又叫顯式類型轉換

2.6 賦值運算符和賦值表達式

2.6.1 賦值運算符

		“=”           將一個表達式的值賦給一個變量

2.6.2 賦值過程中的類型轉換

  1. 將浮點型數據賦值給整型時,捨棄小數部分。
  2. 將整型數據賦給浮點型變量時,數值不變,但以指數形式存儲到變量中。
  3. 將一個double型賦給float變量時,注意數值不能溢出
  4. 字符型數據賦給整型,將ascll碼賦給整型變量
  5. 將一個int short 或 long型賦給一個char型數據,只能將其低八位原封不懂地送到char型變量。
  6. 將signed型數據賦給長度相同的unsigned型,將存儲單元內容原樣照搬
  7. 不同類型的整型數據間的賦值:按存儲單元中的存儲形式直接傳送,而負數在存儲單元中存放的是補碼(即原碼除符號位取反加一),正數在存儲單元中存放的是原碼。

2.6.3 複合賦值運算符

	在“ = ”前加上別的運算符,可以構成複合運算符。
  • 如+= 、-=、%=、*=、<<=、>>=、&=、^=、|=
  • 如a+=b ===> a=a+b

2.6.4 賦值表達式

  • 求解過程:先求賦值運算符右側的“表達式”的值,然後賦給賦值運算符左側的變量
  • 表達式和常變量不能被當作左值,變量能被當作左值,右值沒限制

2.7 逗號運算符和逗號表達式

一般形式:
(表達式1,表達式2)
求解過程:先求表達式1,再求表達式2,整個逗號表達式的值是表達式2的值
a=(35,a4)爲先a=35=15,然後a=154=60,若沒有括號則a=15.

第三章程序設計初步

		過程化設計:程序必須要給出計算機全部操作的具體過程。

3.1 基於過程的程序設計

3.1.1 算法的概念

 一個程序必須包括①對數據的描述,即數據結構②對操作的描述,即算法。

程序 = 算法 + 數據結構

	算法是處理問題的一系列步驟,算法必須具體地指出再執行時每一步應當怎樣做。

3.1.2 算法的表示

  • 自然語言
  • 流程圖
  • 僞代碼
  • 計算機語言

3.2 c++的程序結構和c++語句

一個程序包括

  • 預處理命令。包括#include #define
  • 全局聲明。全局的數據類型,函數及變量的聲明和定義
  • 函數。包括函數首部和函數體,在函數體中可以包括聲明語句和執行語句

在這裏插入圖片描述

c++語句可以分爲以下4種。

  • 聲明語句

  • 執行語句
    ①控制語句
    在這裏插入圖片描述
    ②函數和流對象調用語句
    ③表達式語句
    任何一個表達式的最後加一個分號都可以稱爲一個語句,一個語句最後必須出現分號。

  • 空語句(;)

  • 複合語句(可以用{}把一些語句括起來稱爲複合語句)

3.3 c++的輸入和輸出

在這裏插入圖片描述

3.3.1 輸入流與輸出流的基本操作

  1. c語言中輸入和輸出功能時調用scanf和printf函數實現的,而c++中是通過調用cin和cout流對象來實現的。
  2. 定義流對象時,系統會在內存中開闢一段緩衝區,用來暫存輸入輸出流的數據。在執行cout語句時,並不是插入一個數據就馬上輸出一個數據,而是先把插入的數據順序存放在輸出緩衝區中,直到輸出緩衝區滿或遇到cout語句中的endl,此時將緩衝區中已有數據一起輸出,並清空緩衝區

在這裏插入圖片描述

3.3.2 在標準輸入流和輸出流中使用控制符

在這裏插入圖片描述
在這裏插入圖片描述

3.4.3 用getchar和putchar函數進行字符的輸入和輸出

  1. putchar函數(字符輸出函數:向終端輸出一個字符)
    putchar(66);的作用是將66作爲ascll碼轉換爲字符輸出
    putchar(’\n’);的作用是輸出一個換行符

  2. getchar函數(字符輸入函數:從終端或系統隱含指定的輸入設備輸入輸入一個字符)
    一般形式:getchar()
    getchar()函數得到的字符可以賦給一個字符變量或整型變量,也可以不賦給任何變量。

3.4.4 用scanf和printf函數進行輸入和輸出

一般格式:
scanf(格式控制,輸出表列)
printf(格式控制,輸出表列)

3.5 編寫順序結構的程序

從上到下的順序執行各個語句

3.6 關係運算和邏輯運算

在這裏插入圖片描述
在這裏插入圖片描述

  1. 用關係運算符將兩個表達式連接起來的式子,稱爲關係表達式
    一般形式: 表達式 關係運算符 表達式

  2. 算術表達式的值是一個數值;賦值表達式的值就是賦予變量的值;關係表達式的值是一個邏輯值,即真1假0。

在這裏插入圖片描述

3.6.2 邏輯常量和邏輯變量

  1. c語言沒有提供邏輯型數據,關係真假用10表示;c++使用false和true兩個邏輯常量表示。
  2. 邏輯型變量要用標識符bool定義,它的值只有true和false兩種。
  3. 邏輯變量用bool定義,故稱爲布爾變量,邏輯常量又叫做布爾常量

3.6.3 邏輯運算和邏輯表達式

在這裏插入圖片描述
在這裏插入圖片描述

  1. 將兩個關係表達式用邏輯運算符連接起來就稱爲一個邏輯表達式,一般形式爲: 表達式 邏輯運算符 表達式
    邏輯表達式的值是一個邏輯量真假。

  2. 整型數據是0則爲假,非0則爲真

3.7 選擇結構和if語句

3.7.1 if語句的形式

  • 一般形式:
    if(表達式)語句1;
    【else語句2】
  • 多表達式形式:
    if(表達式1)語句1;
    else if(表達式2)語句2;
    else if (表達式3)語句3;

    else 語句n;

3.7.2 if語句的嵌套

一般形式如下:
      if()
          if()語句1;
           else 語句2;
    else
    	   if()語句3
    	   else 語句4
     if與else的配對關係,else總是與它上面最近的,且未配對的if配對

3.7.3 條件運算符和條件表達式

條件運算符(三目運算符) ?:
條件表達式的一般形式: 表達式1 ?表達式2 :表達式3
執行順序是:先求表達式1,若爲真,則求解表達式2,此時表達式2的值就是整個表達式的值;若爲假,則求解表達式3,此時表達式3的值就是整個表達式的值。

3.7.4 多分支選擇結構與switch語句

一般形式:
switch(表達式)
{case 常量表達式1:語句1;
case 常量表達式2:語句2;

case 常量表達式n:語句n
default :語句n+1
}
注:
①switch後面的表達式,可以是數值類型、字符類型的數據
②當switch表達式的值,與某一個case子句中的常量表達式匹配時,執行此case子句中的內嵌語句。
③每個case表達式的值必須不同
④執行完一個case子句後,流程控制轉移到下一個case子句繼續執行。case常量表達式知識起語句標號作用,並不是在此處進行條件判斷,根據switch表達式的值找到對應的casw子句,從此子句開始執行下去,將後面的全部輸出! 如果要停止,則在對應語句後面就假break;
 

3.8 循環結構和循環語句

3.8.1 用while語句構成循環

一般形式:
while(表達式)語句

  • 循環體如果包含一個以上的語句,應該用花括號括起來,以複合語句形式出現
  • 在循環體中應又使循環趨向於結束的語句

3.8.2 用do-while語句構成循環

一般形式:
do
     語句
while(表達式);

特點是:先執行循環體,然後判斷循環條件是否成立。

3.8.3 用for語句構成循環

 
一般格式:
for(表達式1;表達式2;表達式3)語句;
 
在這裏插入圖片描述
在這裏插入圖片描述
 
for語句最常用的形式也是最容易理解的格式如下:
for(循環變量賦初值;循環條件;循環變量增值)語句;

說明:①for語句的一般格式中的“表達式1”可以忽略,此時應在for語句之前給循環變量賦初值。注意省略表達式1時,其後的分毫不能忽略。
for(;i<=100;i++)sum=sum+i;

②如果表達式2省略,即不判斷循環條件,循環無終止進行下去,也就是認爲表達式2始終爲真。
for(i=1;;i++)sum=sum+i;

③表達式3也可以省略,但此時程序設計者應另外設法保證循環能正常結束
for(i=1;i<=100;){sum = sum+i;i++;}

④可以忽略表達式和表達式3,只有表達式2,即只給循環條件
for(;i<=100;){sum=sum+i;i++;}

⑤表達式一般是關係表達式或邏輯表達式,但也可以是數值表達式或字符表達式,只有其值非零,就執行循環體。

3.8.4 提前結束循環(break語句和continue語句)

  1. 用break語句:作用爲使流程從循環體內跳出循環體,即提前結束循環
  2. 用continue:作用爲結束本次循環,即跳過循環體中下面尚未執行的語句,接着進行下一次是否執行循環的判定。

 

 

第四章 利用函數實現指定的功能

 

4.1 什麼是函數

4.1.1 爲什麼需要函數

在程序進行編譯的時候,以程序文件模塊爲編譯單位,即分別對每一個編譯單位進行編譯,如果發現錯誤,可以在本程序模塊範圍內查錯並改正,在分別通過編譯後,才進行連接,把各模塊的目標文件以及系統文件連接在一起形成可執行文件。
程序總是從main函數開始執行的,在應用中main函數總是寫的很簡單。

4.1.2 函數的分類

  1. 系統函數,即庫函數
  2. 自定義函數
    - 無參函數
    - 有參函數
     

4.2 定義函數的一般形式

4.2.1 定義無參函數的一般形式

一般形式:
類型名 函數名(【void】)
   {聲明部分
   執行語句}

4.2.2 定義有參函數的一般形式

一般形式:
類型名 函數名 (形式參數表列)
   {聲明部分
   執行語句}

如:int max(int x,int y)

 

4.3 函數參數和函數的值

4.3.1 形式參數和實際參數

  • 在定義函數時函數名後面括號中的變量名稱爲形式參數
  • 在主調函數中調用一個函數時,函數名後面括號中的參數稱爲實際參數

形參和實參的說明:
①在定義函數時指定的形參,在未出現函數調用時,它們並不佔內存中的存儲單元,因此叫做形式參數虛擬參數

②只有主函數調用的時候,纔會被調用函數中的形參纔會分配存儲單元,以接收實參傳來的數據,在調用結束後,形參所佔的內存單元也被釋放

③實參和形參的類型應當相同或者賦值兼容(如實參時3.5,形參是整型,則將3送給形參,字符型與整型可以互相通用)

④實參可以是常量變量或表達式,但表達式中的值要確定

⑤實參變量對形參變量的數據傳遞是“值傳遞”,即單向傳遞,只由實參傳給形參,而不能由形參傳回給實參。

4.3.2 函數的返回值

通過函數的調用使主調函數能得到一個確定對的函數值,這就是函數的返回值

說明:
①return語句將被調用函數中的一個確定值待會主調函數中去。
②輸出值取決於函數類型而非變量類型

 

4.4 函數的調用

4.4.1 函數調用的一般形式

一般形式:
函數名(【實參表列】}
 

4.4.2 函數調用的方式

  1. 函數語句(完成一定操作)
    printstar();
  2. 函數表達式(返回一個確定的值以參加表達式運算)
    c=2*max(a,b);
  3. 函數參數
    m = max(a,sqrt(b));

4.4.3 調用函數的條件

  1. 被調函數必須是已存在的函數
  2. 如果是庫函數應當用#include引入
  3. 調用自定義函數時,如果被調用函數在主函數的後面時,必須先聲明

4.4.4 函數聲明和原型

  1. 函數聲明:就是在函數尚未定義的情況下,事先將該函數的有關信息通知編譯系統,以便使編譯能正常運行。
    如:float add(float x,float y);
  2. 函數原型:
    float add(float,float)
    它的作用是:根據函數原型在程序編譯階段對調用函數的合法性進行全面檢查。
  3. 函數原型的一般形式:
    函數類型 函數名(參數類型1,參數類型2 ……);
    函數類型 函數名(參數類型1 參數名1,參數類型2 參數名2……)
     
    說明:
    ①如果被調用用函數的定義出現在主調函數之前,可以不必聲明
    ②如果函數聲明放在函數的外部,在所有函數定義之前,則在各個主調函數中不必對所調用的函數再作聲明

4.5 函數的嵌套調用

c++不允許在一個函數中完整地包含另一個函數,但是可以在被調用函數中調用另一個函數。

4.6 函數的遞歸調用

在調用一個函數的過程中又出現直接或間接地調用函數本身,稱爲函數的遞歸調用,包含遞歸調用的函數稱爲遞歸函數。

#include <iostream>

using namespace std;

int digui(int a)
{
    int n=0;
    if(a>1) n=digui(a-1)+2;
    else n=10;
    return n;
}

int main()
{
    int i,x;
    cin>>i;
    x = digui(i);
    cout<<x<<endl;
}

4.7 內置函數

  1. 出現原因:調用函數需要一定的事件和空間開銷
    函數調用過程
    轉去調用函數之前,要記下當時執行指令的地址,還要保護現場,以便在函數調用之後繼續執行,在函數調用之後,流程返回到先前幾下的地址出,並且根據幾下的信息“恢復現場”,然後繼續執行。
  2. 內置函數:嵌入到主調函數的函數,即在編譯時將所調用的代碼直接嵌入到主調函數中。
  3. 內置函數用法:可以在聲明函數和定義函數時同時寫inline,也可以只在函數聲明時加inline
    在這裏插入圖片描述
    編譯系統在遇到調用      max(i,j,k)  ,就用max函數體的代碼代替 max(i,j,k)。
  4. 使用內置函數可以節省運行時間,但增加了目標程序的長度,因此只將規模很小而使用頻繁的函數聲明爲內置函數。內置函數中不能包括複雜的控制語句,如循環語句和switch語句。
     

4.8 函數的重載

  1. 函數的重載:即對一個函數名重新賦予它新的含義,使一個函數名可以多用,所謂重載,其實就是“一物多用”。
  2. 條件:假如要實現同一類功能,但是細節不同,比如要從三個數中找最大值,但是不同類型的函數,整型、雙精度、長整型函數,要實現一個函數滿足三種類型,則需要用函數的重載。
    在這裏插入圖片描述
  3. 兩次調用max函數的參數個數不同,系統就根據參數的個數找到與之匹配的函數並調用它
    在這裏插入圖片描述
     

4.9 函數模板

  1. 函數模板:建立一個通用函數,其函數類型和形參類型不具體指定,用一個虛擬的類型來代替這個通用函數就稱爲函數模板,凡是函數體相同的函數都可以用這個模板來代替。
  2. 一般形式
    template< typename T >
       通用函數定義


    template< class T>
       通用函數定義

    在這裏插入圖片描述
     

4.10 有默認參數的函數

在函數聲明的時候:
int max(int a,int b,int c=0)

4.11 局部變量和全局變量

4.11.1 局部變量

在一個函數內部定義的變量是內部變量,它只在本函數範圍內有效;形參也是局部變量
 

4.11.2 全局變量

   函數之外定義的變量是外部變量,稱爲全局變量,有效範圍從定義變量的位置開始到源文件結束。

說明:

  1. 全局變量的作用是增加了函數間數據聯繫的渠道。
  2. 只在必要的時候使用全局變量
    - 全局變量在程序的全部執行過程中都佔用存儲單元
    - 函數通用性降低了
    - 如果在同一個源文件中,全局變量和局部變量同盟,則在局部變量的作用域內全局變量被屏蔽

4.12 變量的存儲類別

 

4.12.1 動態存儲方式和靜態存儲方式

  1. 變量有兩種屬性①作用域②存儲期
  2. 存儲期是指變量在內存中的存在週期,可以分爲靜態存儲期和動態存儲期
  3. 靜態存儲期:指在程序運行期間,系統對變量分配固定的存儲空間
    動態存儲期:在程序運行期間,系統對變量動態分配存儲空間
  4. 存儲空間分爲三部分:①程序區②靜態存儲區③動態存儲區
  5. 靜態存儲區:全局變量,在程序開始執行的時候給全局變量分配存儲單元,執行完就釋放。
    動態存儲區:函數形式參數,函數中定義的變量,函數調用時的現場保護和返回地址
  6. 存儲類別分爲:①自動的(auto)②靜態的(static)③寄存器的(register)④外部的(extern)

4.12.2 自動變量

函數中的局部變量,如果不用關鍵字static加以聲明,編譯系統對他們是動態地分配存儲空間的

4.12.3 用static聲明靜態局部變量

當希望函數中的局部變量的值在函數調用結束後不消失,即其佔用的存儲單元不釋放,在下一次該函數調用時,該變量保留上一次函數調用結束時的值,就應該指定爲靜態局部變量
在這裏插入圖片描述
說明:

  1. 靜態局部變量在靜態存儲區內分配存儲單元
  2. 對靜態局部變量是在編譯時賦初值的,即支付處置一次,在程序運行時他已有初值
  3. 在定義局部變量時不賦初值,靜態局部變量就自動賦爲0(對數值型)或空字符(對字符型)
  4. 雖然靜態局部變量在函數調用結束後依然存在,但其他函數不能引用

 
什麼情況下需要用局部靜態變量?
①需要保修函數上一次調用結束時的值
②初始化後,變量只被引用而不改變其值,則這時用靜態局部變量比較方便

4.12.4 用register聲明寄存器變量

變量的值一般是存放在內存中的,當程序用到某個變量的時候,由控制器發出指令將內存中該變量的值送到cpu中的運算器。
如果有些變量使用頻繁,可以直接放在寄存器中。由於對寄存器的存取速度高於內存的存取速度,因此這樣可以提高執行效率。

4.12.5 用extern聲明外部變量

全局變量的作用域爲從變量的定義開始,到本程序文件的末尾。有時需要用extern來聲明全局變量,以拓展全局變量的作用域。

  1. 在一個文件內聲明全局變量
    如果外部變量不在文件的開頭定義,其有效的作用範圍只限於定義的位置起到文件終了的位置止。用extern對該變量作外部變量聲明,就可以從聲明的位置起,合法地引用該全局變量,這種聲明稱爲提前引用聲明。
  2. 在多文件的程序中聲明外部變量
    在任一個文件中定義外部變量,在其他文件中用extern對外部變量作外部變量聲明

4.12.6 用static聲明靜態外部變量

有時希望某些外部變量只限於被本文件引用,而不能被其他文件引用,這時可以在定義外部變量時在前面加一個static聲明。
在這裏插入圖片描述

4.13內部函數和內部函數

4.13.1 內部函數

如果一個函數只能被本文件中其他函數所調用,它稱爲內部函數,在定義內部函數時,在函數名和函數類型的前面加static,函數首部的一般格式爲

static 類型標識符 函數名(形參表)

4.13.2 外部函數

  1. 在定義函數時,如果在函數首部的最左端以關鍵則extern,則表示此函數時外部函數,可供其他文件調用。
  2. 在需要調用此函數的文件中,用extern聲明所用的函數時外部函數。

 

4.14 頭文件

4.14.1 頭文件的內容

①對類型的聲明
②內置(inline)函數的定義
③函數聲明
④宏定義。用#define定義的符號變量和用const聲明的常變量
⑤全局變量定義
⑥外部變量聲明
⑦還可以根據需要包含其他頭文件

4.16.2 關於c++標準庫和頭文件的形式

各種c++編譯系統都提供了許多系統函數和宏定義,而對函數的聲明則分別存放在不同的頭文件中。如果用戶自己編寫頭文件,可以用.h作後綴。這樣從#include指令中即可看出那些頭文件是屬於c++標準庫的,哪些頭文件是用戶自編或比爾提供的。

 
 

第五章 利用數組處理批量數據

5.1 爲什麼需要用數組

  1. 數組:具有相同屬性的數據,就可以把這批數據看作一個整體,用序號或下標來區分各個數據
  2. 下標:用來區分各個數據
  3. 數據元素:數組中的數據
  4. 數組每一個元素都必須屬於同一數據類型。

5.2 定義和引用一維數組

5.2.1 定義一維數組

一般形式:
類型名 數組名【常量表達式】;
例如:int a[10]; //僅爲定義時一定要爲常量表達式

說明:
①數組名定義規則和變量名,遵循標識符定名規則
②用方括號括起來的變量表達式表示下標值
③常量表達式的值表示元素的個數,即數組長度
int a[10];中包含十個元素分別是a[0]~a[9]
④常量表達式中可以包括變量、常變量和符號常量,但不能包含變量

5.2.2 引用一維數組的元素

只能逐個引用數組元素的值而不能一次引用整個數組中的全部元素的值
表示形式:
數組名[下標]

5.2.3 一維數組的初始化

  1. 在定義數組時對全部數組元素賦予初值
    int a[10] = {0,1,2,3,4,5,6,7,8,9}
  2. 可以只給一部分元素賦值
    int a[10]={0,1,2,3,4}
  3. 在對全部數組元素賦初值時,可以不指定數組長度
    int a[] = {1,2,3,4,5} //默認數組有五個元素,且分別爲12345

5.3 定義和引用二維數組

具有兩個下標得數組稱爲二維數組,有些數據依賴於兩個因素才能表示出來。

5.3.1 定義多維數組

一般形式:
類型名 數組名【常量表達式】【常量表達式】[……]
二維數組中元素排列的順序是:按行存放,即在內存中先順序存放第一行元素,再存放第二行元素
float a[3 ]【 4 ]爲3×4的單精度數組

5.3.2 引用多爲數組的元素

一般形式:
數組名 【下標】【下標】【……】
數組元素是左值,可以出現在表達式中,也可以被賦值

5.3.3 二維數組的初始化

  1. 按行給二維數組全部元素賦初值
    int a[3][4】 = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
  2. 可以將所有數據寫在一個花括號內,按數組排列的順序對全部元素賦初值
    int a【3】【4】={1,2,3,4,5,6,7,8,9,10,11,12};
  3. 可以對部分元素賦初值
    int a【3】【4】={{1},{5},{9}}
    它的作用只對各行第一列的元素賦初值,其餘元素自動置爲0.
  4. 如果對全部元素都賦初值,則定義數組時對第1維的長度可以不指定,但對第2維的長度不能省。
    int a【】【4】= {1,2,3,4,5,6,7,8,9,10,11,12};
    相當於int a【3】【4】

5.4 用數組作函數參數

數組名也可以作實參和形參,傳遞的是數組的起始地址

  • 用數組元素作函數實參
    由於實參可以是表達式,而數組元素可以是表達式組成部分,因此數組元素當然可以作爲函數的實參,與用變量作實參一樣,將數組元素的值傳給形參變量
  • 用數組名作函數參數
    如 max(a,10);
    說明:①如果函數實參是數組名,形參也應爲數組名②數組名代表數組首元素的地址,形參可以是數組名,也可以是指針變量,它們用來接收形參傳來的地址
  • 在用變量作爲函數參數時,只能將實參變量的值傳給形參變量,在調用函數過程中如果改變了形參的值,對實參沒有影響;數組名作函數實參時,如果改變了形參數組元素的值將同時改變實參數組元素的值。

5.5 字符數組

字符數組中的一個元素存放一個字符

5.5.1 定義和初始化字符數組

  • 如果花括號中提供的初值個數大於字符長度,則按語法錯誤處理
  • 如果花括號中提供的初值個數小於字符長度,則其他元素自動定位空字符(即’\0’)
  • 如果個數相等,則定義時可以省略長度。

5.5.2 字符數組的賦值和引用

只能對字符數組的元素賦值,而不能用賦值語句對整個數組賦值。
在這裏插入圖片描述

5.5.3 字符串和字符串結束標誌

  1. c++規定了一個字符串結束標誌,字符’\0’。
    遇到字符’\0’就表示字符串到此結束,由它前面的字符組成有效字符串。所以,在程序中往往依靠 檢測’\0’的位置來判定字符串是否結束,而不是根據數組的長度決定字符串長度。
  2. 可以用字符串常量來初始化字符數組
    在這裏插入圖片描述
    在這裏插入圖片描述
    這兩種等效

5.5.4 字符數組的輸入輸出

字符數組的輸入輸出可以有兩種方法:
①逐個字符輸入輸出
②將整個字符串一次輸入或輸出
   cin>>str;
   cout<<str;
   字符數組名str代表字符數組第一個元素str[0]的地址,執行cout<<str;的過程是從str所指向的數組第一個元素開始逐個輸出字符,直到遇到’\0’爲止

說明:

  1. 輸出的字符不包括結束符’\0’
  2. 輸出字符串時,cout流中用字符數組名,而不是數組元素名
  3. 如果數組長度大於字符串實際長度,輸出遇’\0’結束
  4. 如果一個字符數組中包含一個以上’\0’,則遇第一個’\0’時輸出就結束
  5. 用cin從鍵盤向計算機輸入一個字符串時,從鍵盤輸入的字符串應短於已定義的字符數組的長度,否則會出現錯誤。(例子中的溢出覆蓋沒有出現,輸入什麼還是輸出什麼,只是返回值錯誤)

5.5.5 使用字符串處理函數對字符串進行操作

用#include<string>把函數庫包含到本文件中後可以使用對字符串操作函數

  1. 字符串連接函數strcat
    原型位strcat(char[],const char[]);
    函數的作用:將第2個字符數組的字符串連接到前面字符數組的字符串的後面,第2個字符數組被聲明爲const,以保證該數組中的內容不會在函數調用期間修改。
    在這裏插入圖片描述
  2. 字符串複製函數strcpy
    strcpy(char[],const char[])
    函數作用:將第2個字符數組中的字符串複製到第1個字符數組中去,將第1個字符數組中的相應字符覆蓋。
    說明:①在調用strcpy函數時,第1個實參必須時數組名,第2個實參可以時字符數組名,也可以時一個字符串變量在這裏插入圖片描述②可以用strcpy函數將一個字符串中前若干個字符複製到一個字符數組中去strcpy(str1,str2,2)③只能用此函數來將一個字符串賦給字符數組,不能用賦值語句實現。
  3. 字符串比較函數strcmp
    函數原型爲 strcmp(const char【】,const char【】);這兩個參數都加上const聲明
    作用:①如果字符串1等於字符串2,函數值爲0
    ②如果字符串1大於字符串2,函數值爲一正整數
    ③如果字符串1小於字符串2,函數值爲一負整數
    在這裏插入圖片描述
  4. 字符串長度函數strlen
    strlen(const char【】);
    函數作用:字符串中的實際長度,不包括空字符在內

5.6 c++處理字符串的方法——字符串類與字符串常量

c++提供了一中信的數據類型——字符串類型

5.6.1字符串變量的定義和引用

  1. 定義字符串變量
    首先引入庫#include<string>
    定義 string string1;
    定義並初始化 string string2=“china”;
  2. 對字符串變量的賦值
    既可以用字符串常量給字符串變量賦值,也可以用一個字符串變量給另一個字符串變量賦值
  3. 字符串變量的輸入輸出
    cin>>string1;
    cout<<string2;

5.6.2 字符串變量的運算

字符數組存放字符串時,字符串的運算要用字符串函數,但是string類對象可以直接用簡單的運算符

  1. 字符串複製直接用賦值號
    string1 = string2;
  2. 字符串連接用加號
    在這裏插入圖片描述
  3. 字符串比較直接用關係運算符
    在這裏插入圖片描述

5.6.3 字符串數組

在這裏插入圖片描述
說明:①在字符串數組的每一個元素中存放一個字符串,而不是一個字符,這是字符串數組與字符數組的區別。②不要求每個字符串元素有相同的長度③對於同一元素而言,它的長度也可以變化,當向某一個元素重新賦值,長度就可能變化④字符串數組中的每一個元素的值值包含字符串本身的字符而不包括’\0’。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章