日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++阶段01笔记汇总【C++软件安装、C++初识、数据类型、运算符、程序流程结构、数组、函数、指针、结构体】

發布時間:2024/9/30 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++阶段01笔记汇总【C++软件安装、C++初识、数据类型、运算符、程序流程结构、数组、函数、指针、结构体】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C++| 匠心之作 從0到1入門學編程【視頻+課件+筆記+源碼】

目錄

C++課程安排

1 C++初識

1.1 第一個C++程序

1.1.1 創建項目

1.1.2 創建文件

1.1.3 編寫代碼

1.1.4 運行程序

1.2 注釋

1.3 變量

1.4 常量

#define 宏常量

const修飾的變量

常量演示代碼

1.5 關鍵字

1.6 標識符命名規則

2 數據類型

2.1 整型

2.2 sizeof關鍵字

2.3 實型(浮點型)

2.4 字符型

2.5 轉義字符

2.6 字符串型

2.7 布爾類型 bool

2.8 數據的輸入

3 運算符

3.1 算術運算符

示例1

示例2

示例3

3.2 賦值運算符

示例

3.3 比較運算符

示例

3.4 邏輯運算符

示例1:邏輯非

示例2:邏輯與

示例3:邏輯或

4 程序流程結構

4.1 選擇結構

4.1.1 if語句

——①單行格式if語句

——②多行格式if語句

——③多條件的if語句

——④嵌套if語句

4.1.2 三目運算符

4.1.3 switch語句

4.2 循環結構

4.2.1 while循環語句

——while循環 練習案例:猜數字

4.2.2 do...while循環語句

——do...while循環 練習案例:水仙花數

4.2.3 for循環語句

——for循環 練習案例:敲桌子

4.2.4 嵌套循環

——for循環嵌套 練習案例:乘法口訣表

4.3 跳轉語句

4.3.1 break語句

——示例

4.3.2 continue語句

——示例

4.3.3 goto語句

——示例

5 數組

5.1 概述

5.2 一維數組

5.2.1 一維數組定義方式

——示例

5.2.2 一維數組數組名

——示例

——練習案例1:五只小豬稱體重

——練習案例2:數組元素逆置

5.2.3 冒泡排序

5.3 二維數組

5.3.1 二維數組定義方式

——示例

5.3.2 二維數組數組名

——示例

5.3.3 二維數組應用案例

6 函數

6.1 概述

6.2 函數的定義

函數的語法

示例:加法函數

6.3 函數的調用

示例

6.4 值傳遞

示例

6.5 函數的常見樣式

示例

6.6 函數的聲明

示例

6.7 函數的分文件編寫

示例

1、swap.h頭文件

2、swap.cpp

3、main函數源文件

總結!函數的分文件編寫

7 指針

7.1 指針的基本概念

7.2 指針變量的定義和使用

示例

7.3 指針所占內存空間

示例

7.4 空指針和野指針

示例1:空指針

示例2:野指針

總結

7.5 const修飾指針

1、const修飾指針——常量指針

2、const修飾常量——指針常量

3、const既修飾指針,又修飾常量

示例

7.6 指針和數組

示例

7.7 指針和函數

示例

7.8 指針、數組、函數

示例

8 結構體

8.1 結構體基本概念

8.2 結構體定義和使用

示例

8.3 結構體數組

示例

8.4 結構體指針

示例

8.5 結構體嵌套結構體

示例

8.6 結構體做函數參數

示例

8.7 結構體中const使用場景

示例

8.8 結構體案例

8.8.1 案例1

8.8.2 案例2


C++課程安排

  • 明確C++課程學習階段以及課程內容

階段內容目標案例
第一階段C++基礎語法入門對C++有初步了解,能夠有基礎編程能力通訊錄管理系統
第二階段C++核心編程介紹C++面向對象編程,為大型項目做鋪墊職工管理系統
第三階段C++提高編程介紹C++泛型編程思想,以及STL的基本使用演講比賽系統
  • 綜合大案例:機房預約系統

1 C++初識

1.1 第一個C++程序

編寫一個C++程序總共分為4個步驟:

  • 創建項目

  • 創建文件

  • 編寫代碼

  • 運行程序

  • 1.1.1 創建項目

    Visual Studio是我們用來編寫C++程序的主要工具,我們先將它打開。

    1.1.2 創建文件

    右鍵源文件,選擇添加->新建項:

    給C++文件起個名稱,然后點擊添加即可。

    1.1.3 編寫代碼

    #include <iostream> using namespace std;int main1() {cout << "Hello world !" << endl;system("pause");return 0; }

    1.1.4 運行程序

    1.2 注釋

    作用:在代碼中加一些說明和解釋,方便自己或其他程序員程序員閱讀代碼。

    兩種格式

    • 單行注釋:// 描述信息
      • 通常放在一行代碼的上方,或者一條語句的末尾,對該行代碼說明。
    • 多行注釋: /* 描述信息 */
      • 通常放在一段代碼的上方,對該段代碼做整體說明。

    提示:編譯器在編譯代碼時,會忽略注釋的內容。

    ?

    1.3 變量

    作用:給一段指定的內存空間起名,方便操作這段內存。

    語法:數據類型 變量名 = 初始值;

    示例:

    注意:C++在創建變量時,必須給變量一個初始值,否則會報錯!

    1.4 常量

    作用:用于記錄程序中不可更改的數據。

    C++定義常量兩種方式:

    • #define 宏常量: #define 常量名 常量值

      • 通常在文件上方定義,表示一個常量。

    • const修飾的變量:const 數據類型 常量名 = 常量值

      • 通常在變量定義前加關鍵字const,修飾該變量為常量,不可修改。

    #define 宏常量

    示例:

    const修飾的變量

    ?

    常量演示代碼

    /* 作用:用于記錄程序中不可更改的數據。C++定義常量兩種方式 1.#define 宏常量:#define 常量名 常量值通常在文件上方定義,表示一個常量2.const 修飾的變量 :const 數據類型 常量名 = 常量值通常在變量定義前加關鍵字,修飾該變量為常量,不可修改 */#include <iostream> using namespace std;//1、宏常量 #define Day 7int main4() {//day = 14; //報錯(錯誤),Day是常量,宏常量day不可以修改,一旦修改就會報錯!cout << "一周里總共有 " << Day << " 天" << endl;//2、const修飾變量const int month = 12;//month = 24; //報錯(錯誤),常量是不可以修改的。const修飾的變量也稱為常量!cout << "一年里總共有 " << month << " 個月份" << endl;system("pause");return 0; }

    1.5 關鍵字

    作用:關鍵字是C++中預先保留的單詞(標識符)。

    • 在定義變量或者常量時候,不要用關鍵字。

    C++關鍵字,如下:

    asmdoifreturntypedef
    autodoubleinlineshorttypeid
    booldynamic_castintsignedtypename
    breakelselongsizeofunion
    caseenummutablestaticunsigned
    catchexplicitnamespacestatic_castusing
    charexportnewstructvirtual
    classexternoperatorswitchvoid
    constfalseprivatetemplatevolatile
    const_castfloatprotectedthiswchar_t
    continueforpublicthrowwhile
    defaultfriendregistertrue?
    deletegotoreinterpret_casttry?

    提示:在給變量或者常量起名稱時候,不要用C++得關鍵字,否則會產生歧義。

    1.6 標識符命名規則

    作用:C++規定給標識符(變量、常量)命名時,有一套自己的規則。

    • 標識符不能是關鍵字。

    • 標識符只能由字母、數字、下劃線組成。

    • 第一個字符必須為字母或下劃線。

    • 標識符中字母區分大小寫。

    建議:給標識符命名時,爭取做到見名知意的效果,方便自己和他人的閱讀。

    ??

    ?

    #include <iostream> using namespace std;//標識符命名規則 //1、標識符不可以是關鍵字 //2、標識符是由字母、數字、下劃線構成 //3、標識符第一個字符只能是字母或下劃線 //4、標識符是區分大小寫的int main() {//1、標識符不可以是關鍵字//int int = 10; // 報錯//2、標識符是由字母、數字、下劃線構成int abc = 10;int _abc = 20;int _123abc = 30;//3、標識符第一個字符只能是字母或下劃線//int 123abc = 40; // 報錯//4、標識符是區分大小寫的int aaa = 100;//cout << AAA << endl; // AAA和aaa不是同一個名稱//建議:給變量起名的時候,最好能夠做到見名知意。int num1 = 10;int num2 = 20;int sum = num1 + num2;cout << sum << endl;system("pause");return 0; }

    2 數據類型

    C++規定在創建一個變量或者常量時,必須要指定出相應的數據類型,否則無法給變量分配內存。

    2.1 整型

    作用:整型變量表示的是整數類型的數據。

    C++中能夠表示整型的類型有以下幾種方式,區別在于所占內存空間不同

    數據類型占用空間取值范圍
    short(短整型)2字節(-2^15 ~ 2^15-1)
    int(整型)4字節(-2^31 ~ 2^31-1)
    long(長整形)Windows為4字節,Linux為4字節(32位),8字節(64位)(-2^31 ~ 2^31-1)
    long long(長長整形)8字節(-2^63 ~ 2^63-1)

    ?

    #include<iostream> using namespace std;int main() {//整型//1、短整型 2^15==32768(-32768~32767)short num1 = 32768;//2、整型int num2 = 32768;//3、長整型long num3 = 10;//4、長長整型long long num4 = 10;cout << "num1 = " << num1 << endl;cout << "num2 = " << num2 << endl;cout << "num3 = " << num3 << endl;cout << "num4 = " << num4 << endl;system("pause");return 0; }

    2.2 sizeof關鍵字

    作用:利用sizeof關鍵字可以統計數據類型所占內存大小。

    語法: sizeof( 數據類型 / 變量)

    示例:

    #include <iostream> using namespace std;int main() {//整型:short(2字節)int(4字節)long(4字節)long long(8字節)//可以利用sizeof關鍵字求出數據類型占用內存大小//語法:sizeof(數據類型 / 變量)short num1 = 10;cout << "short類型占用內存空間為:" << sizeof(short) << endl;cout << "short類型占用內存空間為:" << sizeof(num1) << endl;cout << "short 類型所占內存空間為:" << sizeof(short) << endl;cout << "int 類型所占內存空間為:" << sizeof(int) << endl;cout << "long 類型所占內存空間為:" << sizeof(long) << endl;cout << "long long 類型所占內存空間為:" << sizeof(long long) << endl;system("pause");return 0; }

    整型結論:short < int <= long <= long long

    2.3 實型(浮點型)

    作用:用于表示小數。

    浮點型變量分為兩種:

  • 單精度 float

  • 雙精度 double

  • 兩者的區別在于表示的有效數字范圍不同。

    數據類型占用空間有效數字范圍
    float4字節7位有效數字
    double8字節15~16位有效數字

    編譯器默認把一個小數當作雙精度數據!數據后面不加“f”,編譯器會自動做一個轉換,將雙精度轉換為單精度!多做一個轉換!

    通常會在float數據類型后面加一個“f”,告訴編譯器這是一個float類型的數據。

    示例:

    #include <iostream> using namespace std;int main() {float f1 = 3.1415926f; //1、單精度 floatdouble d1 = 3.1415926; //2、雙精度 double//默認情況下,輸出一個小數,會顯示出6位有效數字cout << f1 << endl; //小數,最多6位有效數字cout << d1 << endl;//統計float和double占用內存空間cout << "float占用內存空間為:" << sizeof(float) << endl; ? //4字節cout << "double占用內存空間為:" << sizeof(double) << endl; //8字節cout << "float ?sizeof = " << sizeof(f1) << endl;cout << "double sizeof = " << sizeof(d1) << endl;//科學計數法float f2 = 3e2; // 3 * 10 ^ 2cout << "f2 = " << f2 << endl;float f3 = 3e-2; // 3 * 0.1 ^ 2cout << "f3 = " << f3 << endl;system("pause");return 0; }

    2.4 字符型

    作用:字符型變量用于顯示單個字符。

    語法:char ch = 'a';

    注意1:在顯示字符型變量時,用單引號將字符括起來,不要用雙引號。

    注意2:單引號內只能有一個字符,不可以是字符串。

    • C和C++中字符型變量只占用1個字節。

    • 字符型變量并不是把字符本身放到內存中存儲,而是將對應的ASCII編碼放入到存儲單元。

    示例:

    #include <iostream> using namespace std;int main() {//1、字符型變量創建方式char ch = 'a';cout << ch << endl; //a//2、字符型變量所占內存大小cout << "char字符型變量所占內存:" << sizeof(char) << endl; //1//3、字符型變量常見錯誤//ch = "abcde"; //錯誤,不可以用雙引號//ch = 'abcde'; //錯誤,單引號內只能引用一個字符//4、字符型變量對應的ASCII編碼 a-97;A-65cout << (int)ch << endl; //查看字符a對應的ASCII碼 (int)ch:將字符型強轉為整型 97ch = 97; //可以直接用ASCII給字符型變量賦值cout << ch << endl; //asystem("pause");return 0; }

    ASCII碼 表格:

    ASCII控制字符ASCII字符ASCII字符ASCII字符
    0NUT32(space)64@96
    1SOH33!65A97a
    2STX34"66B98b
    3ETX35#67C99c
    4EOT36$68D100d
    5ENQ37%69E101e
    6ACK38&70F102f
    7BEL39,71G103g
    8BS40(72H104h
    9HT41)73I105i
    10LF42*74J106j
    11VT43+75K107k
    12FF44,76L108l
    13CR45-77M109m
    14SO46.78N110n
    15SI47/79O111o
    16DLE48080P112p
    17DCI49181Q113q
    18DC250282R114r
    19DC351383S115s
    20DC452484T116t
    21NAK53585U117u
    22SYN54686V118v
    23TB55787W119w
    24CAN56888X120x
    25EM57989Y121y
    26SUB58:90Z122z
    27ESC59;91[123{
    28FS60<92/124|
    29GS61=93]125}
    30RS62>94^126`
    31US63?95_127DEL

    ASCII 碼大致由以下兩部分組成:

    • ASCII 非打印控制字符:ASCII 表上的數字 0-31 分配給了控制字符,用于控制像打印機等一些外圍設備。

    • ASCII 打印字符:數字 32-126 分配給了能在鍵盤上找到的字符,當查看或打印文檔時就會出現。

    2.5 轉義字符

    作用:用于表示一些不能顯示出來的ASCII字符。

    現階段我們常用的轉義字符有:\n、\\、\t。

    轉義字符含義ASCII碼值(十進制)
    \a警報007
    \b退格(BS) ,將當前位置移到前一列008
    \f換頁(FF),將當前位置移到下頁開頭012
    \n換行(LF) ,將當前位置移到下一行開頭010
    \r回車(CR) ,將當前位置移到本行開頭013
    \t水平制表(HT) (跳到下一個TAB位置)009
    \v垂直制表(VT)011
    \\代表一個反斜線字符""092
    '代表一個單引號(撇號)字符039
    "代表一個雙引號字符034
    \?代表一個問號063
    \0數字0000
    \ddd8進制轉義字符,d范圍0~73位8進制
    \xhh16進制轉義字符,h范圍09,af,A~F3位16進制

    示例:

    #include <iostream> using namespace std;int main() {cout << "\\" << endl; //第一個“\”告訴編譯器,使用者要輸出一個特殊符號!cout << "\tHello" << endl;cout << "\n"<< endl;//換行符“\n”cout << "hello world~\n";//反斜杠“\\”cout << "\\" << endl;//水平制表符“\t”,作用:可以整齊地輸出數據cout << "aaaa\thello world!" << endl; //“\t”占用8個空格,空格有多長取決于a占用多少字符cout << "aa\thello world!" << endl;//“aaa”占用3個空格,“aaaa”占用4個空格cout << "aaaaa\thello world!" << endl;//水平制表符作用:輸出時候的對其效果cout << "aaaa hello world!" << endl;cout << "aa hello world!" << endl;cout << "aaaaa hello world!" << endl;system("pause");return 0; }

    2.6 字符串型

    作用:用于表示一串字符。

    兩種風格

  • C風格字符串:char 變量名[] = "字符串值";【注意:C風格的字符串要用雙引號括起來。】
  • C++風格字符串:string 變量名 = "字符串值";【注意:C++風格字符串,需要加入 頭文件 #include<string> 。】
  • 示例:

    #include <iostream> #include <string> // 用C++風格字符串時,要包含這個頭文件 using namespace std;int main() {//1.C風格字符串:char 變量名[] = "字符串值";//注意事項1:char 字符串名 []//注意事項2:等號后面,要用雙引號包裹字符串char str1[] = "hello world!";cout << str1 << endl; //hello world!//2.C++風格字符串:string 變量名 = "字符串值";//注意事項1:包含一個頭文件#include <string>string str2 = "hello world!";cout << str2 << endl; //hello world!return 0; }

    2.7 布爾類型 bool

    作用:布爾數據類型代表真或假的值。

    bool類型只有兩個值:

  • true --- 真(本質是1)

  • false --- 假(本質是0)

  • bool類型占1個字節大小。

    示例:

    #include <iostream> using namespace std;int main() {//1、創建bool數據類型bool flag = true; //true代表真cout << flag << endl; // 1flag = false; //false代表假cout << flag << endl; // 0//bool本質上,1代表真、0代表假//2、查看bool數據類型所占內存空間cout << "bool類型所占內存空間:" << sizeof(bool) << endl; //1cout << "size of bool = " << sizeof(bool) << endl; //1system("pause");return 0; }

    2.8 數據的輸入

    作用:用于從鍵盤獲取數據。

    關鍵字:cin

    語法: cin >> 變量

    示例:

    #include <iostream> #include <string> //string頭文件 using namespace std;int main() {//1、整型 輸入int a = 0;cout << "請給整型變量a賦值:" << endl; //請輸入整型變量cin >> a;cout << "整型變量a = " << a << endl;//2、浮點型 輸入double d = 0;cout << "請給浮點型變量d賦值:" << endl; //請輸入浮點型變量cin >> d; // “>>”右移運算符cout << "浮點型變量d = " << d << endl;float f = 3.14f;cout << "請給浮點型變量f賦值:" << endl; //請輸入浮點型變量cin >> f;cout << "浮點型變量f = " << f << endl;//3、字符型 輸入char ch = 0;cout << "請給字符型變量ch賦值:" << endl; //請輸入字符型變量cin >> ch;cout << "字符型變量ch = " << ch << endl;//4、字符串型 輸入string str;cout << "請給字符串型變量str賦值:" << endl; //請輸入字符串型變量cin >> str;cout << "字符串型變量str = " << str << endl;//5、布爾類型 輸入bool flag = true;cout << "請給布爾型變量flag賦值:" << endl; //請輸入布爾型變量cin >> flag; //bool類型:只要是非0的值,都代表真cout << "布爾型變量flag = " << flag << endl;return EXIT_SUCCESS; }

    3 運算符

    作用:用于執行代碼的運算。

    本章我們主要講解以下幾類運算符:

    運算符類型作用
    算術運算符用于處理四則運算
    賦值運算符用于將表達式的值賦給變量
    比較運算符用于表達式的比較,并返回一個真值或假值
    邏輯運算符用于根據表達式的值返回真值或假值

    3.1 算術運算符

    作用:用于處理四則運算。

    算術運算符包括以下符號:

    運算符術語示例結果
    +正號+33
    -負號-3-3
    +10 + 515
    -10 - 55
    *10 * 550
    /10 / 52
    %取模(取余)10 % 31
    ++前置遞增a=2; b=++a;a=3; b=3;
    ++后置遞增a=2; b=a++;a=3; b=2;
    --前置遞減a=2; b=--a;a=1; b=1;
    --后置遞減a=2; b=a--;a=1; b=2;

    示例1

    #include <iostream> using namespace std;int main() {int a1 = 10;int b1 = 3;cout << a1 + b1 << endl; // 13cout << a1 - b1 << endl; // 7cout << a1 * b1 << endl; // 30cout << a1 / b1 << endl; // 3 兩個整數相除,結果依然是整數,將小數部分去除int a2 = 10;int b2 = 20;cout << a2 / b2 << endl; // 0int a3 = 10;int b3 = 0;//錯誤!兩個數相除,除數不可以為0!//cout << a3 / b3 << endl; //報錯,除數不可以為0。//兩個小數可以相除double d1 = 0.5;double d2 = 0.25;cout << d1 / d2 << endl; // 2 運算結果可以是整數d1 = 0.5;d2 = 0.22;cout << d1 / d2 << endl; // 2.27273 運算結果可以是小數system("pause");return 0; }

    總結:在除法運算中,除數不能為0。

    示例2

    #include <iostream> using namespace std;int main() {int a1 = 10;int b1 = 3;cout << a1 % b1 << endl; // 1int a2 = 10;int b2 = 20;cout << a2 % b2 << endl; // 10int a3 = 10;int b3 = 0;//兩個數相除,除數不可以為0,所以做不了取模運算// cout << a3 % b3 << endl; // 報錯。取模運算時,除數不能為0!//兩個小數是不可以做取模運算的double d1 = 3.14;double d2 = 1.1;// cout << d1 % d2 << endl; // 報錯system("pause");return 0; }

    總結:只有整型變量可以進行取模運算。

    示例3

    #include <iostream> using namespace std;int main() //遞增 {//1、前置遞增int a = 10;++a; //讓變量+1cout << "a = " << a << endl; // 11//2、后置遞增int b = 10;b++; //讓變量+1,等價于b = b + 1cout << b << endl; // 11//3、前值和后置的區別//前置遞增:先對變量進行++,再計算表達式int a2 = 10;int b2 = ++a2 * 10;cout << "a2 = " << a2 << endl; // 11cout << "b2 = " << b2 << endl; // 11 * 10 -> 110//后置遞增:先計算表達式,后對變量進行++int a3 = 10;int b3 = a3++ * 10;cout << "a3 = " << a3 << endl; // 11cout << "b3 = " << b3 << endl; // 100system("pause");return 0; }

    總結:前置遞增先對變量進行++,再計算表達式,后置遞增相反。

    3.2 賦值運算符

    作用:用于將表達式的值賦給變量。

    賦值運算符包括以下幾個符號:

    運算符術語示例結果
    =賦值a=2; b=3;a=2; b=3;
    +=加等于a=0; a+=2;a=2;
    -=減等于a=5; a-=3;a=2;
    *=乘等于a=2; a*=2;a=4;
    /=除等于a=4; a/=2;a=2;
    %=模等于a=3; a%2;a=1;

    示例

    #include <iostream> using namespace std;int main() // 賦值運算符 {// =int a = 10;a = 100;cout << "a = " << a << endl; // a = 100// +=a = 10;a += 2; // a = a + 2;cout << "a = " << a << endl; // a = 12// -=a = 10;a -= 2; // a = a - 2cout << "a = " << a << endl; // a = 8// *=a = 10;a *= 2; // a = a * 2cout << "a = " << a << endl; // a = 20// /=a = 10;a /= 2; // a = a / 2;cout << "a = " << a << endl; // a = 5// %=a = 10;a %= 2; // a = a % 2;cout << "a = " << a << endl; // a = 0return 0; }

    3.3 比較運算符

    作用:用于表達式的比較,并返回一個真值或假值。

    比較運算符有以下符號:

    運算符術語示例結果
    ==相等于4 == 30
    !=不等于4 != 31
    <小于4 < 30
    >大于4 > 31
    <=小于等于4 <= 30
    >=大于等于4 >= 11

    示例

    #include <iostream> using namespace std;int main() // 比較運算符 {int a = 10;int b = 20;// ==cout << (a == b) << endl; // 0// !=cout << (a != b) << endl; // 1// >cout << (a > b) << endl; // 0// <cout << (a < b) << endl; // 1// >=cout << (a >= b) << endl; // 0// <=cout << (a <= b) << endl; // 1return 0; }

    注意:C和C++ 語言的比較運算中, “真”用數字“1”來表示, “假”用數字“0”來表示。

    3.4 邏輯運算符

    作用:用于根據表達式的值返回真值或假值。

    邏輯運算符有以下符號:

    運算符術語示例結果
    !!a如果a為假,則!a為真; 如果a為真,則!a為假。
    &&a && b如果a和b都為真,則結果為真,否則為假。
    ||a || b如果a和b有一個為真,則結果為真,二者都為假時,結果為假。

    示例1:邏輯非

    #include <iostream> using namespace std;int main() {//邏輯運算符 --- 邏輯非int a = 10;//在C++中,除了0都為真cout << !a << endl; // 0cout << !!a << endl; // 1system("pause");return 0; }

    總結: 真變假,假變真。

    示例2:邏輯與

    #include <iostream> using namespace std;int main() {//邏輯運算符 --- 邏輯與 &&int a = 10;int b = 10;cout << (a && b) << endl; // 1a = 10;b = 0;cout << (a && b) << endl; // 0a = 0;b = 0;cout << (a && b) << endl; // 0//同真為真,其余為假!system("pause");return 0; }

    總結:邏輯與運算符總結:同真為真,其余為假。

    示例3:邏輯或

    #include <iostream> using namespace std;int main() {//邏輯運算符 --- 邏輯或int a = 10;int b = 10;cout << (a || b) << endl; // 1a = 10;b = 0;cout << (a || b) << endl; // 1a = 0;b = 0;cout << (a || b) << endl; // 0//邏輯或運算符總結:同假為假,其余為真!system("pause");return 0; }

    邏輯或運算符總結:同假為假,其余為真。

    4 程序流程結構

    C/C++支持最基本的三種程序運行結構:順序結構、選擇結構、循環結構。

    • 順序結構:程序按順序執行,不發生跳轉。

    • 選擇結構:依據條件是否滿足,有選擇的執行相應功能。

    • 循環結構:依據條件是否滿足,循環多次執行某段代碼。

    4.1 選擇結構

    4.1.1 if語句

    作用:執行滿足條件的語句。

    if語句的三種形式

  • 單行格式if語句

  • 多行格式if語句

  • 多條件的if語句

  • ——①單行格式if語句

    單行格式if語句:if(條件){ 條件滿足執行的語句 }

    示例:

    #include <iostream> using namespace std;int main() {//選擇結構-單行if語句//用戶輸入一個分數,如果分數大于600分,視為考上一本大學,并在屏幕上打印(輸出)//1、用戶輸入分數int score = 0;cout << "請輸入一個分數:" << endl;cin >> score;//2、打印用戶輸入的分數cout << "您輸入的分數為: " << score << endl;//3、判斷分數是否大于600,如果大于600,則輸出...//if語句//注意事項,在if判斷語句后面,不要加分號if (score > 600){cout << "我考上了一本大學!!!" << endl;}return 0; }

    注意:if條件表達式后不要加分號。

    ——②多行格式if語句

    多行格式if語句:if(條件){ 條件滿足執行的語句 }else{ 條件不滿足執行的語句 };

    示例:

    #include <iostream> using namespace std;int main() {//選擇結構-多行if語句//輸入考試分數,如果分數大于600,視為考上一本大學,在屏幕上輸出//如果沒考上一本大學,打印"未考上一本大學"//1、輸入考試分數int score = 0;cout << "請輸入考試分數:" << endl;cin >> score;//2、提示用戶輸入的分數cout << "您輸入的分數為:" << score << endl;//3、判斷如果大于600,打印“考上一本”,否則打印"未考上一本"if (score > 600) //大于600分執行下面大括號中的內容{cout << "我考上了一本大學!" << endl;}else//不大于600分,執行else后大括號中的內容{cout << "我未考上一本大學!" << endl;}system("pause");return 0; }

    ——③多條件的if語句

    多條件的if語句:if(條件1){ 條件1滿足執行的語句 }else if(條件2){條件2滿足執行的語句}... else{ 都不滿足執行的語句}

    示例:

    ?

    #include <iostream> using namespace std;int main() {//選擇結構-多行if語句int score = 0;cout << "請輸入考試分數:" << endl;cin >> score;if (score > 600){cout << "我考上了一本大學!" << endl;}else if (score > 500){cout << "我考上了二本大學!" << endl;}else if (score > 400){cout << "我考上了三本大學!" << endl;}else{cout << "我未考上本科!" << endl;}system("pause");return 0; }

    ——④嵌套if語句

    嵌套if語句:在if語句中,可以嵌套使用if語句,達到更精確的條件判斷。

    案例需求:

    • 提示用戶輸入一個高考考試分數,根據分數做如下判斷

    • 分數如果大于600分視為考上一本,大于500分考上二本,大于400考上三本,其余視為未考上本科;

    • 在一本分數中,如果大于700分,考入北大,大于650分,考入清華,大于600考入人大。

    示例:

    ?

    #include <iostream> using namespace std;int main() {int score = 0;cout << "請輸入考試分數:" << endl;cin >> score;if (score > 600){cout << "我考上了一本大學!" << endl;if (score > 700){cout << "我考上了北大!" << endl;}else if (score > 650){cout << "我考上了清華!" << endl;}else{cout << "我考上了人大!" << endl;}}else if (score > 500){cout << "我考上了二本大學!" << endl;}else if (score > 400){cout << "我考上了三本大學!" << endl;}else{cout << "我未考上本科!" << endl;}system("pause");return 0; }

    練習案例: 三只小豬稱體重

    有三只小豬ABC,請分別輸入三只小豬的體重,并且判斷哪只小豬最重?

    ?

    #include <iostream> using namespace std;int main() {//三個小豬稱體重,判斷哪只小豬最重//1、創建三只小豬的體重變量int A = 0;int B = 0;int C = 0;//2、讓用戶輸入三只小豬的體重cout << "\n請輸入小豬A的體重:" << endl;cin >> A;cout << "\n請輸入小豬B的體重:" << endl;cin >> B;cout << "\n請輸入小豬C的體重:" << endl;cin >> C;cout << "\n小豬A的體重為:" << A << endl;cout << "小豬B的體重為:" << B << endl;cout << "小豬C的體重為:" << C << endl;//3、判斷三只哪只小豬最重//先判斷A和B重量if (A > B) //A比B重{if (A > C){cout << "\n小豬A最重!\n" << endl;}else{cout << "\n小豬C最重!\n" << endl;}}else //B比A重{if (B > C){cout << "\n小豬B最重!\n" << endl;}else{cout << "\n小豬C最重!\n" << endl;}}system("pause");return 0; }

    4.1.2 三目運算符

    作用: 通過三目運算符實現簡單的判斷。

    語法:表達式1 ? 表達式2 :表達式3

    解釋:

    如果表達式1的值為真,執行表達式2,并返回表達式2的結果;

    如果表達式1的值為假,執行表達式3,并返回表達式3的結果。

    示例:

    #include <iostream> using namespace std;int main() {//三目運算符int a = 10;int b = 20;int c = 0;c = a > b ? a : b;cout << "c = " << c << endl; //c = 20c = (a > b ? a : b);cout << "c = " << c << endl; //c = 20//C++中三目運算符返回的是變量,可以繼續賦值(a > b ? a : b) = 100;cout << "a = " << a << endl; //a = 10cout << "b = " << b << endl; //b = 100cout << "c = " << c << endl; //c = 20system("pause");return 0; }

    總結:和if語句比較,三目運算符優點是短小整潔,缺點是如果用嵌套,結構不清晰。

    4.1.3 switch語句

    作用:執行多條件分支語句。

    語法:

    switch?(表達式) //【switch語句中表達式類型只能是整型或者字符型】

    {

    ????case?結果1:?執行語句;break;

    ????case?結果2:?執行語句;break;

    ????...

    ????default: 執行語句;break;

    }

    示例:

    #include <iostream> using namespace std;int main() //switch語句 {//請給電影進行評分// 10 ~ 9 經典// 8 ~ 7 非常好// 6 ~ 5 一般// 5分以下 爛片//1、提示用戶給電影評分cout << "請給電影打分:" << endl;//2、用戶開始進行打分int score = 0;cin >> score;cout << "您打的分數為:" << score << endl;//3、根據用戶輸入的分數來提示用戶最后的結果switch (score){case 10:// cout << "您認為是經典電影!" << endl;// break; //退出當前分支case 9:cout << "您認為是經典電影!" << endl;break; //退出當前分支case 8:// cout << "您認為電影非常好!" << endl;// break;case 7:cout << "您認為電影非常好!" << endl;break;case 6:case 5:cout << "您認為電影一般!" << endl;break;default:cout << "您認為是爛片!" << endl;break;}//if和switch區別?//switch缺點:判斷時候只能是整型或者字符型,不可以是一個區間!//switch優點:結構清晰,執行效率高!system("pause");return 0; }

    注意1:switch語句中表達式類型只能是整型或者字符型。

    注意2:case里如果沒有break,那么程序會一直向下執行。

    總結:與if語句比,對于多條件判斷時,switch的結構清晰,執行效率高,缺點是switch不可以判斷區間。

    4.2 循環結構

    4.2.1 while循環語句

    作用:滿足循環條件,執行循環語句

    語法:while(循環條件){ 循環語句 }

    解釋:只要循環條件的結果為真,就執行循環語句。

    示例:

    #include <iostream> using namespace std;int main() {//while循環//在屏幕上打印 0 ~ 9 這10個數字int num = 0;//while()中填入循環條件//注意事項:在寫循環時,一定要避免死循環的出現。while (1)死循環while (num < 10){ // 循環代碼cout << "num = " << num << endl;num++;}system("pause");return 0; }

    注意:在執行循環語句時候,程序必須提供跳出循環的出口,否則出現死循環。

    ——while循環 練習案例:猜數字

    while循環練習案例:猜數字

    案例描述:系統隨機生成一個1到100之間的數字,玩家進行猜測,如果猜錯,提示玩家數字過大或過小,如果猜對恭喜玩家勝利,并且退出游戲。

    #include?<ctime>?//?time系統時間頭文件

    //添加隨機數種子,作用:利用當前系統時間生成隨機數,防止每次隨機數都是一樣。

    srand((unsigned?int)time(NULL));

    #include <iostream> #include <ctime> // time系統時間頭文件 using namespace std;int main() {//添加隨機數種子,作用:利用當前系統時間生成隨機數,防止每次隨機數都是一樣。srand((unsigned int)time(NULL));//1、系統生成隨機數【rand() % 100:生成0~99的隨機數】int num = rand() % 100 + 1; //rand()%100+1 生成 0+1 ~ 99+1 的隨機數cout << "系統生成隨機數(0~99):" << num << endl;//2、玩家進行猜數int val = 0; //玩家輸入數據while (1) //死循環{cin >> val;//3、判斷玩家的猜測//猜錯:提示猜的結果 過大或過小,重新返回第二步if (val > num){cout << "猜測過大!\n"<< endl;}else if (val < num){cout << "猜測過小!\n"<< endl;}else{cout << "猜測正確!\n"<< endl;//猜對:退出游戲break; //break, 可以利用該關鍵字退出當前循環。}}system("pause");return 0; }

    4.2.2 do...while循環語句

    作用: 滿足循環條件,執行循環語句。

    語法: do{ 循環語句 } while(循環條件);

    注意:與while的區別在于do...while會先執行一次循環語句,再判斷循環條件。

    示例:

    #include <iostream> using namespace std;int main() {//do...while循環語句//在屏幕中輸出0~9這10個數字int num = 0;do{cout << num << endl;num++;} while (num < 10);num = 0;do{cout << num << endl;num++;} while (num); // 死循環!!!num = 0;//while (num < 10 ) // 輸出0~9while (num) //不執行任何代碼{cout << num << endl;num++;}//do...while和while循環區別在于do...while會先執行一次循環語句system("pause");return 0; }

    總結:與while循環區別在于,do...while先執行一次循環語句,再判斷循環條件。

    ——do...while循環 練習案例:水仙花數

    練習案例:水仙花數

    案例描述:水仙花數是指一個 3 位數,它的每個位上的數字的 3次冪之和等于它本身。

    例如:1^3 + 5^3+ 3^3 = 153

    請利用do...while語句,求出所有3位數中的水仙花數。

    #include <iostream> using namespace std;int main() {//1、先打印所有的三位數int num = 100;do{//2、從所有的三位數字中找到水仙花數int a = 0; //個位int b = 0; //十位int c = 0; //百位a = num % 10; //獲取數字的個位b = num / 10 % 10; //獲取數字的十位c = num / 100; //獲取數字的百位if (a * a * a + b * b * b + c * c * c == num) //如果是水仙花數,才打印{cout << num << endl;}num++;} while (num < 1000);system("pause");return 0; }

    4.2.3 for循環語句

    作用: 滿足循環條件,執行循環語句。

    語法:for(起始表達式;條件表達式;末尾循環體) { 循環語句; }

    示例:

    #include <iostream> using namespace std;int main() {//for循環//打印數字0~9for (int i = 0; i < 10; i++){cout << i << endl;}//同義拆分int i = 0;for (;;){if (i >= 10){break;}cout << i << endl;i++;}system("pause");return 0; }

    詳解:

    注意:for循環中的表達式,要用分號進行分隔。

    總結:while、do...while、for都是開發中常用的循環語句,for循環結構比較清晰,比較常用。

    ——for循環 練習案例:敲桌子

    練習案例:敲桌子

    案例描述:從1開始數到數字100, 如果數字個位含有7,或者數字十位含有7,或者該數字是7的倍數,我們打印敲桌子,其余數字直接打印輸出。

    ?

    #include <iostream> using namespace std;int main() {//1、先輸出1~100數字for (int i = 1; i <= 100; i++){//2、從100個數中找到特殊的數字,打印“敲桌子!”//如果是7的倍數、個位是7、十位是7,打印“敲桌子!”if (i % 7 == 0 || i % 10 == 7 || i / 10 == 7) //如果是特殊數字,打印“敲桌子!”{cout << "敲桌子!" << endl;}else //如果不是特殊數字,打印數字{cout << i << endl;}}system("pause");return 0; }

    4.2.4 嵌套循環

    作用: 在循環體中再嵌套一層循環,解決一些實際問題。

    例如我們想在屏幕中打印如下圖片,就需要利用嵌套循環。

    ?

    #include <iostream> using namespace std;int main() {//利用嵌套循環實現星圖//外層循環執行1次,內層循環執行1輪(1周)for (int i = 0; i < 10; i++) //外層循環:打印一行星圖{for (int j = 0; j < 10; j++) //內層循環:打印一行*{cout << "*"<< " "; //*加空格}cout << endl; //換行}return 0; }

    ——for循環嵌套 練習案例:乘法口訣表

    練習案例:乘法口訣表

    案例描述:利用嵌套循環,實現九九乘法表。

    #include <iostream> using namespace std;int main() {//乘法口訣表for (int i = 1; i <= 9; i++) //打印行數{// cout << i << endl;for (int j = 1; j <= i; j++) //打印列數{cout << j << "*" << i << "=" << i * j << " ";}cout << endl;}system("pause");return 0; }

    4.3 跳轉語句

    4.3.1 break語句

    作用: 用于跳出選擇結構或者循環結構。

    break使用的時機:

    • 出現在switch條件語句中,作用是終止case并跳出switch。

    • 出現在循環語句中,作用是跳出當前的循環語句。

    • 出現在嵌套循環中,跳出最近的內層循環語句。

    ——示例

    #include <iostream> using namespace std;int main() //break的使用時機 {//1、在switch語句中使用breakcout << "請選擇您挑戰副本的難度:" << endl;cout << "1、普通!" << endl;cout << "2、中等!" << endl;cout << "3、困難!" << endl;int num = 0; //創建選擇結果的變量cin >> num; //等待用戶輸入switch (num){case 1:cout << "您選擇的是普通難度!" << endl;break; //退出switch語句case 2:cout << "您選擇的是中等難度!" << endl;break;case 3:cout << "您選擇的是困難難度!" << endl;break;}//2、在循環語句中用breakfor (int i = 0; i < 10; i++){if (i == 5) //如果i等于5,退出循環,不再打印{break; // 跳出循環語句}cout << i << endl;}//3、在嵌套循環語句中使用break,退出內層循環【出現在嵌套循環語句中】for (int i = 0; i < 10; i++){for (int j = 0; j < 10; j++){if (j == 5){break; //退出內層循環}cout << "*" << " ";}cout << endl;}return 0; }

    4.3.2 continue語句

    作用:在循環語句中,跳過本次循環中余下尚未執行的語句,繼續執行下一次循環。

    ——示例

    #include <iostream> using namespace std;int main() {//continue語句for (int i = 0; i < 100; i++){if (i % 2 == 0) //奇數輸出,偶數不輸出,0 2 4 6 8 10{continue; //作用:可以篩選條件,執行到此就不再向下執行;執行下一次循環//break會退出循環,而continue不會}cout << i << endl;}system("pause");return 0; }

    注意:continue并沒有使整個循環終止,而break會跳出循環。

    4.3.3 goto語句

    作用:可以無條件跳轉語句。

    語法: goto 標記;?如: goto FLAG;【一般用純大寫單詞!】

    解釋:如果標記的名稱存在,執行到goto語句時,會跳轉到標記的位置。

    ——示例

    ??

    #include <iostream> using namespace std;int main() //goto語句 {cout << "1、xxx" << endl;cout << "2、xxx" << endl;goto FLAG;cout << "3、xxx" << endl;cout << "4、xxx" << endl;FLAG:cout << "5、xxx" << endl;system("pause");return 0; }

    注意:在程序中不建議使用goto語句,以免造成程序流程混亂。

    5 數組

    5.1 概述

    所謂數組,就是一個集合,里面存放了相同類型的數據元素。

    特點1:數組中的每個數據元素都是相同的數據類型。

    特點2:數組是由連續的內存位置組成的。

    5.2 一維數組

    5.2.1 一維數組定義方式

    一維數組定義的三種方式:

  • 數據類型 數組名[ 數組長度 ];?int?score[10];

  • 數據類型 數組名[ 數組長度 ] = { 值1,值2 ...};?int?score2[6]?=?{3,?2,?1}; //如果{}內不足6個數據,剩余數據用0補全

  • 數據類型 數組名[ ] = { 值1,值2 ...};?int?score3[]?=?{30,?20,?10};

  • ——示例

    #include <iostream> using namespace std; /* 一維數組定義的三種方式: 1. 數據類型 數組名[ 數組長度 ]; 2. 數據類型 數組名[ 數組長度 ] = { 值1,值2 ...}; 3. 數據類型 數組名[ ] = { 值1,值2 ...}; */ int main() //數組 {//定義方式1:數據類型 數組名[元素個數];int score[10];//利用下標給數組中的元素進行賦值//數組元素的下標是從0開始索引的score[0] = 100;score[1] = 99;score[2] = 85;//利用下標輸出 訪問數據元素cout << score[0] << endl;cout << score[1] << endl;cout << score[2] << endl;cout << "\n" << endl;//定義方式2:數據類型 數組名[元素個數] = {值1,值2 ,值3 ...};//如果{}內不足10個數據,剩余數據用0補全//如果在初始化數據時候,沒有全部填寫完,會用0來填補剩佘數據int score2[10] = {100, 90, 80, 70, 60, 50, 40, 30, 20, 10};//逐個輸出//cout << score2[0] << endl;//cout << score2[1] << endl;//一個一個輸出太麻煩,因此可以利用循環進行輸出for (int i = 0; i < 10; i++) //利用循環輸出數組中的元素{cout << score2[i] << endl;}cout << "\n" << endl;//定義方式3:數據類型 數組名[] = {值1,值2 ,值3 ...};//定義數組的時候,必須有初始長度int score3[] = {100, 90, 80, 70, 60, 50, 40, 30, 20, 10};for (int i = 0; i < 10; i++){cout << score3[i] << endl;}system("pause");return 0; }

    總結1:數組名的命名規范與變量名命名規范一致,不要和變量重名。

    總結2:數組中下標是從0開始索引。

    5.2.2 一維數組數組名

    一維數組名稱的用途

  • 可以統計整個數組在內存中的長度。

  • 可以獲取數組在內存中的首地址。

  • ——示例

    ?

    #include <iostream> using namespace std;int main() //數組名用途 {//1、可以通過數組名統計整個數組占用內存大小 可以獲取整個數組占用內存空間大小int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};cout << "整個數組所占內存空間為:" << sizeof(arr) << endl;cout << "每個元素所占內存空間為:" << sizeof(arr[0]) << endl;cout << "數組的元素個數為:" << sizeof(arr) / sizeof(arr[0]) << endl;//2、可以通過數組名獲取到數組首地址 可以通過數組名查看數組首地址cout << "數組首地址為:" << arr << endl; //數組首地址為:0x61fdf0 一般用十六進制數來表示首地址cout << "數組首地址為:" << (int)arr << endl; //將十六進制數強轉為十進制數cout << "數組首地址為:" << (long)arr << endl;//數組中第一個元素地址 與 數組的首地址 是 重合的!&:取地址符cout << "數組中第一個元素地址為:" << &arr[0] << endl; //&:查看一個元素的首地址 十六進制表示地址cout << "數組中第一個元素地址為:" << (int)&arr[0] << endl; //&:查看一個元素的首地址 轉為十進制的地址表示cout << "數組中第二個元素地址為:" << &arr[1] << endl;cout << "數組中第二個元素地址為:" << (int)&arr[1] << endl;//arr = 100; // 錯誤!數組名是常量,因此不可以進行賦值操作。return 0; }

    注意:數組名是常量,不可以賦值。

    總結1:直接打印數組名,可以查看數組所占內存的首地址。

    總結2:對數組名進行sizeof,可以獲取整個數組占內存空間的大小。

    ——練習案例1:五只小豬稱體重

    練習案例1:五只小豬稱體重

    案例描述:

    在一個數組中記錄了五只小豬的體重,如:int arr[5] = {300,350,200,400,250};

    找出并打印最重的小豬體重。

    ?

    #include <iostream> using namespace std;int main() {//1、創建5只小豬的體重數組int arr[5] = {300, 350, 200, 400, 250};//2、從數組中找到最大值int max = 0; //先認定一個最大值為0for (int i = 0; i < 5; i++){cout << arr[i] << endl;//如果訪問的數組中的元素比我認定的最大值還要大,更新最大值if (arr[i] > max){max = arr[i];}}//3、打印最大值cout << "最重的小豬體重為:" << max << endl;system("pause");return 0; }

    ——練習案例2:數組元素逆置

    練習案例2:數組元素逆置

    案例描述:請聲明一個5個元素的數組,并且將元素逆置.

    (如原數組元素為:1,3,2,5,4;逆置后輸出結果為:4,5,2,3,1);

    ?

    #include <iostream> using namespace std;int main() //實現數組元素逆置 {//1、創建一個數組int arr[5] = {1, 3, 5, 7, 9};cout << "數組逆置前:" << endl;for (int i = 0; i < 5; i++){cout << arr[i] << " ";}//2、實現逆置//2.1、記錄起始下標的位置//2.2、記錄結束下標的位置//2.3、起始下標與結束下標的元素互換//2.4、起始位置++ ;結束位置--//2.5、循環執行2.1操作,直到起始位置>=結束位置int start = 0; //起始下標int end = sizeof(arr) / sizeof(arr[0]) - 1; //結束下標while (start < end){//實現元素互換int temp = arr[start];arr[start] = arr[end];arr[end] = temp;//下標更新start++;end--;}//3.打印逆置后的數組cout << "\n數組逆置后:" << endl;for (int i = 0; i < 5; i++){cout << arr[i] << " ";}cout << endl;system("pause");return 0; }

    5.2.3 冒泡排序

    作用: 最常用的排序算法,對數組內元素進行排序。

  • 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

  • 對每一對相鄰元素做同樣的工作,執行完畢后,找到第一個最大值。

  • 重復以上的步驟,每次比較次數-1,直到不需要比較。

  • 示例:將數組 { 4,2,8,0,5,7,1,3,9 } 進行升序排序。

    #include <iostream> using namespace std;int main() //利用冒泡排序實現升序序列 {int arr[9] = {4, 2, 8, 0, 5, 7, 1, 3, 9};//打印排序前的數字cout << "排序前:" << endl;for (int i = 0; i < 9; i++){cout << arr[i] << " ";}cout << endl;//開始冒泡排序//總共排序輪次 = 元素個數 — 1for (int i = 0; i < 9 - 1; i++){//內層循環對比:次數 = 元素個數 - 當前輪次 - 1for (int j = 0; j < 9 - 1 - i; j++){//如果第一個數字比第二個數字大,交換數字if (arr[j] > arr[j + 1]){int temp = arr[j]; //實現兩個元素的交換arr[j] = arr[j + 1];arr[j + 1] = temp;}}}//打印排序后的結果cout << "排序后:" << endl;for (int i = 0; i < 9; i++){cout << arr[i] << " ";}cout << endl;system("pause");return 0; }

    5.3 二維數組

    二維數組就是在一維數組上,多加一個維度。

    5.3.1 二維數組定義方式

    二維數組定義的四種方式:

  • 數據類型 數組名[ 行數 ][ 列數 ];

  • 數據類型 數組名[ 行數 ][ 列數 ] = { {數據1,數據2 } ,{數據3,數據4 } };

  • 數據類型 數組名[ 行數 ][ 列數 ] = { 數據1,數據2,數據3,數據4};

  • 數據類型 數組名[ ][ 列數 ] = { 數據1,數據2,數據3,數據4};

  • 建議:以上4種定義方式,利用第二種更加直觀,提高代碼的可讀性。

    ——示例

    ?

    #include <iostream> using namespace std;int main() //二維數組的定義方式 {//方式1:數組類型 數組名 [行數][列數]int arr[2][3];arr[0][0] = 1;arr[0][1] = 2;arr[0][2] = 3;arr[1][0] = 4;arr[1][1] = 5;arr[1][2] = 6;cout << arr[0][0] << endl;cout << arr[0][1] << endl;cout << arr[0][2] << endl;cout << arr[1][0] << endl;cout << arr[1][1] << endl;cout << arr[1][2] << endl;//外層循環打印行數,內層循環打印列數for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){cout << arr[i][j] << " ";}cout << endl;}cout << "---" << endl;//方式2:數據類型 數組名[行數][列數] = { {數據1,數據2 } ,{數據3,數據4 } };int arr2[2][3] = {{1, 2, 3},{4, 5, 6}};for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){cout << arr2[i][j] << " ";}cout << endl;}cout << "---" << endl;//方式3:數據類型 數組名[行數][列數] = { 數據1, 數據2, 數據3, 數據4 };int arr3[2][3] = {1, 2, 3, 4, 5, 6};for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){cout << arr3[i][j] << " ";}cout << endl;}cout << "---" << endl;//方式4:數據類型 數組名[][列數] = { 數據1, 數據2, 數據3, 數據4 };int arr4[][3] = {1, 2, 3, 4, 5, 6};for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){cout << arr4[i][j] << " ";}cout << endl;}system("pause");return 0; }

    總結:在定義二維數組時,如果初始化了數據,可以省略行數。

    5.3.2 二維數組數組名

    • 查看二維數組所占內存空間。

    • 獲取二維數組首地址。

    ——示例


    三個地址是重合的:

  • 二維數組的首地址
  • 第一行數據的首地址
  • 第一個數據的首地址(第一行第一個元素的首地址)
  • #include <iostream> using namespace std;int main() {//二維數組數組名int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};//1、可以查看占用內存空間大小cout << "二維數組(占用內存空間)大小為:" << sizeof(arr) << endl; //24cout << "二維數組第一行(占用內存空間)大小為:" << sizeof(arr[0]) << endl; //12cout << "二維數組第一個元素(占用內存空間)大小為:" << sizeof(arr[0][0]) << endl; //4cout << "二維數組行數為:" << sizeof(arr) / sizeof(arr[0]) << endl; //2cout << "二維數組列數為:" << sizeof(arr[0]) / sizeof(arr[0][0]) << endl; //3//2、可以查看二維數組的首地址cout << "二維數組首地址為:" << arr << endl; //0x61fe00cout << "二維數組第一行地址:" << arr[0] << endl;cout << "二維數組第二行地址:" << arr[1] << endl; //第一二行相差3個數據cout << "二維數組首地址:" << (int)arr << endl;cout << "二維數組第一行地址:" <<(int) arr[0] << endl;cout << "二維數組第二行地址:" << (int)arr[1] << endl;cout << "二維數組第一個元素地址:" << &arr[0][0] << endl; //訪問具體元素的地址,要加&cout << "二維數組第二個元素地址:" << &arr[0][1] << endl;cout << "二維數組第一個元素地址:" <<(int) &arr[0][0] << endl;cout << "二維數組第二個元素地址:" <<(int) &arr[0][1] << endl;// system("pause");return 0; }

    總結1:二維數組名就是這個數組的首地址。

    總結2:對二維數組名進行sizeof時,可以獲取整個二維數組占用的內存空間大小。

    5.3.3 二維數組應用案例

    考試成績統計:

    案例描述:有三名同學(張三,李四,王五),在一次考試中的成績分別如下表,請分別輸出三名同學的總成績

    姓名語文數學英語
    張三100100100
    李四9050100
    王五607080

    參考答案:

    ?

    #include <iostream> #include <string> using namespace std;int main() //二維數組案例-考試成績統計 {//1、創建二維數組int scores[3][3] = {{100, 100, 100}, //張三{90, 50, 100}, //李四{60, 70, 80} //王五};//存放姓名的字符串一維數組string names[3] = {"張三", "李四", "王五"};//2、統計每個人的總和分數for (int i = 0; i < 3; i++) //行{int sum = 0; //統計分數總和for (int j = 0; j < 3; j++) //列{sum += scores[i][j];// cout << scores[i][j] << " ";}// cout << endl;// cout << "第" << i + 1 << "個人的總分為:" << sum << " !" << endl;cout << names[i] << "的總分為:" << sum << " !" << endl;}system("pause");return 0; }

    6 函數

    6.1 概述

    作用:將一段經常使用的代碼封裝起來,減少重復代碼。

    一個較大的程序,一般分為若干個程序塊,每個模塊實現特定的功能。

    6.2 函數的定義

    函數的定義一般主要有5個步驟:

  • 返回值類型
  • 函數名
  • 參數表列
  • 函數體語句
  • return 表達式
  • 函數的語法

    返回值類型 函數名 (參數列表) {函數體語句return表達式 }
    • 返回值類型:一個函數可以返回一個值。(在函數定義中)

    • 函數名:給函數起個名稱。

    • 參數列表:使用該函數時,傳入的數據。

    • 函數體語句:花括號內的代碼,函數內需要執行的語句。

    • return表達式:和返回值類型掛鉤,函數執行完后,返回相應的數據。

    示例:加法函數

    示例:定義一個加法函數,實現兩個數相加。

    ?

    #include <iostream> using namespace std;//函數的定義 //語法:返回值類型 函數名 (參數列表){ 函數體語句 return表達式}//加法函數,實現兩個整型相加,并且將相加的結果進行返回 int add(int num1, int num2) //定義中的num1,num2稱為形式參數,簡稱形參 {int sum = num1 + num2;return sum; }int main() //程序入口函數 {system("pause");return 0; }

    6.3 函數的調用

    功能:使用定義好的函數。

    語法:函數名(參數)

    示例

    ??

    #include <iostream> using namespace std;//函數定義:定義加法函數 //函數定義的時候,num1和num2并沒有真實數據,它只是一個形式上的參數,簡稱形參 int add(int num1, int num2) //參數列表(形參列表)定義中的num1,num2稱為形式參數,簡稱形參 {int sum = num1 + num2;return sum; }int main() {//mian函數中調用add函數int a = 10;int b = 10;//函數調用語法:函數名稱(參數) 當調用函數的時候,實參的值會傳遞給形參int sum = add(a, b); //調用時的a、b稱為實際參數,簡稱實參cout << "sum = " << sum << endl;a = 100;b = 100;sum = add(a, b);cout << "sum = " << sum << endl;system("pause");return 0; }

    總結:函數定義里小括號內稱為形參,函數調用時傳入的參數稱為實參。

    6.4 值傳遞

    • 所謂值傳遞,就是函數調用時 實參將數值傳入給形參。

    • 值傳遞時,如果形參發生,并不會影響實參。

    示例

    ??

    #include <iostream> using namespace std; //值傳遞 //定義函數,實現兩個數字進行交換的函數//如果函數不需要返回值,聲明的時候可以寫void void swap(int num1, int num2) {cout << "交換前:" << endl;cout << "num1 = " << num1 << endl;cout << "num2 = " << num2 << endl;int temp = num1; //數據交換num1 = num2;num2 = temp;cout << "交換后:" << endl;cout << "num1 = " << num1 << endl;cout << "num2 = " << num2 << endl;//return ; 當函數聲明時候,返回值不需要的時候,可以不寫return }int main() {int a = 10; //創建變量a的時候,在內存中開辟4個字節給變量aint b = 20;cout << "mian中的 a = " << a << endl;cout << "mian中的 b = " << b << endl;//當我們做值傳遞的時候,函數的形參發生改變,并不會影響實參!swap(a, b); //調用函數體時,需要分配空間給num1、num2,與a、b不是同一個東西cout << "mian中的 a = " << a << endl;cout << "mian中的 b = " << b << endl;system("pause");return 0; }

    總結: 值傳遞時,形參是修飾不了實參的。

    6.5 函數的常見樣式

    常見的函數樣式有4種:

  • 無參無返

  • 有參無返

  • 無參有返

  • 有參有返

  • 示例

    ??

    #include <iostream> using namespace std;//函數常見樣式//1、無參無返 void test01() {//void a = 10; //無類型不可以創建變量,原因是無法分配內存cout << "this is test01 !" << endl;//test01(); 函數調用 }//2、有參無返 void test02(int a) {cout << "this is test02 !a = " << a << endl;// cout << "this is test02 !" << endl;// cout << "a = " << a << endl; }//3、無參有返 int test03() {cout << "this is test03 !" << endl;return 10; }//4、有參有返 // int test04(int a) int test04(int a, int b) {cout << "this is test04 !" << endl;int sum = a + b;return sum;// cout << "this is test04 !a = " << a << endl;// return a; }int main() {//1、無參無返函數調用test01();//2、有參無返函數調用test02(100);//3、無參有返函數調用int num1 = test03();cout << "num1 = " << num1 << endl;//4、有參有返函數調用// int num2 = test04(10000);int num2 = test04(3, 6);cout << "num2 = " << num2 << endl;system("pause");return 0; }

    6.6 函數的聲明

    作用: 告訴編譯器函數名稱及如何調用函數。函數的實際主體可以單獨定義。

    • 函數的聲明可以多次,但是函數的定義只能有一次。

    示例

    #include <iostream> using namespace std;//提前告訴編譯器函數的存在(可以利用函數的聲明) //函數的聲明(無具體的代碼實現) //聲明可以寫多次,但是定義只能有一次 int max(int a, int b); int max(int a, int b); int max(int a, int b);int main() {int a = 100;int b = 200;cout << max(a, b) << endl; // 200system("pause");return 0; }//定義(函數的聲明) //比較函數,實現兩個整型數字進行比較,返回較大的值 int max(int a, int b) {return a > b ? a : b; } // 下面是錯的,定義只能有一次! // int max(int a, int b) // { // return a > b ? a : b; // }

    6.7 函數的分文件編寫

    作用:讓代碼結構更加清晰。代碼量越來越大,結構可能不會很清晰!

    函數分文件編寫一般有4個步驟:

  • 創建后綴名為.h的頭文件

  • 創建后綴名為.cpp的源文件

  • 在頭文件中寫函數的聲明

  • 在源文件中寫函數的定義

  • 示例

    #include <iostream> using namespace std;//函數的分文件編寫 //實現兩個數字進行交換的函數//函數的聲明 void swap(int a, int b);//函數的定義 void swap(int a, int b) {int temp = a;a = b;b = temp;cout << "a = " << a << endl;cout << "b = " << b << endl; }//1、創建.h后綴名的頭文件 //2、創建.cpp后綴名的源文件 //3、在頭文件中寫函數的聲明 //4、在源文件中寫函數的定義int main() {int a = 10;int b = 20;swap(a, b);system("pause");return 0; }

    1、swap.h頭文件

    //swap.h頭文件 #include <iostream> using namespace std;//實現兩個數字交換的函數聲明 void swap(int a, int b);

    2、swap.cpp

    //swap.h頭文件 #include "swap.h"//函數的定義 void swap(int a, int b) {int temp = a;a = b;b = temp;cout << "a = " << a << endl;cout << "b = " << b << endl; }

    3、main函數源文件

    //main函數源文件 #include "swap.h"int main() {int a = 100;int b = 200;swap(a, b);system("pause");return 0; }

    總結!函數的分文件編寫

    7 指針

    7.1 指針的基本概念

    指針的作用: 可以通過指針間接訪問內存。

    • 內存編號是從0開始記錄的,一般用十六進制數字表示。

    • 可以利用指針變量保存地址。

    內存都是有地址編號的,從0開始記錄,一般用十六進制數字來表示編號,可以利用指針來記錄地址編號。

    int a = 10; // 4字節空間大小

    每創建一個變量,都要去記錄地址編號,不太方便去使用這個數據,所以才會有這個變量。

    知道地址編號,也可以拿到數據。指針就是一個地址,記錄地址編號!

    7.2 指針變量的定義和使用

    指針變量定義語法:數據類型 * 變量名;

    示例

    指針變量和普通變量的區別:

    • 普通變量存放的是數據,指針變量存放的是地址。

    • 指針變量可以通過 “ * ” 操作符,操作指針變量指向的內存空間,這個過程稱為解引用。

    ?通過p可以找到內存,通過*p可以修改內存。

    指針的作用(用途):可以間接地訪問內存,并且對其進行讀和寫的操作(修改、訪問)!

    ??

    #include <iostream> using namespace std;int main() {//1、指針的定義int a = 10; //定義整型變量a//指針定義的語法:數據類型 * 指針變量名 ;int *p; // point代表指針//指針變量賦值 讓指針記錄變量a的地址p = &a; //指針p指向(等于)變量a的地址【取地址符號& 取變量a的地址】建立變量與指針之間的關系cout << "a的地址為:" << &a << endl; //打印數據a的地址:0x61fe14// cout << "a的地址為:" << (int)&a << endl; //十六進制轉整型cout << "指針p為:" << p << endl; //打印指針變量p:0x61fe14【指針就是一個地址,記錄地址編號!】//2、指針的使用//可以通過“解引用”的方式來找到指針指向的內存//指針前加一個* 代表 解引用,找到指針指向的內存中的數據//通過*操作指針變量指向的內存cout << "*p = " << *p << endl; // 10*p = 1000; //解引用 通過指針間接地找到了a的內存 通過解引用拿到p指向的內存中的數據(進行 修改、讀取)cout << "a = " << a << endl;cout << "*p = " << *p << endl;system("pause");return 0; }

    總結1: 我們可以通過 & 符號 獲取變量的地址。

    總結2:利用指針可以記錄地址。

    總結3:對指針變量解引用,可以操作指針指向的內存。

    7.3 指針所占內存空間

    提問:指針也是種數據類型,那么這種數據類型占用多少內存空間?

    總結:所有指針類型在32位操作系統下是4個字節,在64位操作系統下是8字節。

    示例

    ?

    #include <iostream> using namespace std;int main() //指針所占內存空間 {int a = 10;// int *p;// p = &a; //指針指向數據a的數據地址int *p = &a; //建立關系//在32位操作系統下,指針是占4個字節空間大小(不管是什么數據類型)//在64位操作系統下,指針是占4個字節空間大小(不管是什么數據類型)cout << *p << endl; //10 * 解引用cout << "sizeof(p) = " << sizeof(p) << endl; //8 查看變量(數據類型)占用的內存空間cout << "sizeof(int *) = " << sizeof(int *) << endl; //8cout << "sizeof(float *) = " << sizeof(float *) << endl; //8cout << "sizeof(double *) = " << sizeof(double *) << endl; //8cout << "sizeof(char *) = " << sizeof(char *) << endl; //8system("pause");return 0; }

    7.4 空指針和野指針

    空指針:指針變量指向內存中編號為0的空間。內存條,都有自己的編號,從0開始遞增。指向編號為0的指針,稱為“空指針”!

    用途:初始化指針變量。指針一開始不知道指向哪里好,就指向內存中編號為0的空間。

    注意:空指針指向的內存是不可以訪問的。無權利訪問空指針指向的內存。0~255之間的這塊內存,是系統占用的,一旦訪問,就會出錯!

    示例1:空指針

    #include <iostream> using namespace std;int main() //空指針 {//1、空指針用于給指針變量進行初始化// int * p;//指針指向哪?未知!所以,一般會讓指針指向NULL(空)int *p = NULL; //指針變量p指向內存地址編號為0的空間//2、空指針是不可以進行訪問的//0~255之間的內存編號是系統占用的,因此不可以訪問*p = 100; //直接引用 操作內存//訪問空指針報錯//內存編號0 ~255為系統占用內存,不允許用戶訪問cout << *p << endl;//system("pause");return 0; }

    示例2:野指針

    野指針:指針變量指向非法的內存空間。非法的內存空間:不是使用者申請的內存空間。

    #include <iostream> using namespace std;int main() //野指針 在程序中,盡量避免出現野指針 {// int *p = NULL;//指針變量p指向內存地址編號為0x1100的空間【0x1100:十六進制數字】int *p = (int *)0x1100; //變為地址:(int *)強轉為指針類型//0x1100隨便在內存中指向了這樣一個編號,這個編號中的數 無權利操作!沒有申請,無權利操作!//舉例:花錢買房間A(int a = 10; int *p = &a;),沒有權利去房間B(房間B->野指針)cout << *p << endl; //訪問野指針報錯system("pause");return 0; }

    總結

    總結:空指針和野指針都不是我們申請的空間,因此不要訪問。

    7.5 const修飾指針

    const修飾指針有3種情況:

  • const 修飾指針 —— 常量指針? ? ? ??const int *p1 = &a;

  • const 修飾常量 —— 指針常量? ? ? ??int *const p2 = &a;

  • const 既修飾指針,又修飾常量

  • 1、const修飾指針——常量指針

    紅框:被限定,不可以修改;黑線:可以修改。

    2、const修飾常量——指針常量

    紅線:被限定,不可以修改;黑框:可以修改。

    3、const既修飾指針,又修飾常量

    示例

    ?

    #include <iostream> using namespace std;int main() {int a = 10;int b = 10;//int *p0 = &a; //普通寫法//1、常量指針(記法:const在前 先常量 后指針)//const修飾的是指針,指針的指向可以更改,指針指向的值不可以更改(可以理解為const 修飾的是解引用 int*,所以指針指向的值不可以更改)const int *p1 = &a;p1 = &b; //正確// *p1 = 20; //錯誤//2、指針常量(記法:int* 在前 先指針 后常量)//const修飾的是常量,指針的指向不可以更改,指針指向的值可以更改(可以理解為const修飾的是指針本身,所以指針指向的值不可以修改)int *const p2 = &a;*p2 = 100; //正確//p2 = &b; //錯誤,指針常量 指針的指向不可以更改//3、const既修飾指針又修飾常量const int *const p3 = &a;//指針的指向和指針指向的值都不可以改//*p3 = 100; //錯誤//p3 = &b; //錯誤system("pause");return 0; }

    技巧:看const右側緊跟著的是指針還是常量,是指針就是常量指針,是常量就是指針常量。

    7.6 指針和數組

    作用:利用指針訪問數組中元素。數組:一段連續的空間中,存放了相同類型的數據元素。

    示例

    ??

    #include <iostream> using namespace std;int main() {//指針和數組//讓(利用)指針也能訪問數組中的每一個元素int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};cout << "第一個元素為:" << arr[0] << endl;int *p = arr; //指向數組的指針 數組是整型的,所以創建整型指針,指向數組的地址 arr數組名就是數組的首地址//指針指向數組首地址,對指針進行解引用的操作,就可以解出數組中的第一個元素cout << "利用指針訪問第一個元素:" << *p << endl; //*p解引用p++; //指向數組中的第二個元素,讓指針向后偏移(移動)4個字節(整型指針)cout << "利用指針訪問第二個元素:" << *p << endl; //*p解引用cout << "利用指針遍歷數組:" << endl;int *p2 = arr;for (int i = 0; i < 10; i++) //利用指針遍歷數組{// cout << arr[i] << endl;cout << *p2 << endl;p2++;}system("pause");return 0; }

    7.7 指針和函數

    作用:利用指針作函數參數,可以修改實參的值。

    示例

    ?

    指針保存的是地址。傳遞地址,可以間接地改變實參數據。

    #include <iostream> using namespace std;//1、值傳遞:實現兩個數字進行交換 void swap01(int a, int b) {int temp = a;a = b;b = temp;cout << "swap01中 a = " << a << endl;cout << "swap01中 b = " << b << endl; }//2、地址傳遞 void swap02(int *p1, int *p2) {int temp = *p1; //解出內存 解引用*p1 = *p2;*p2 = temp;cout << "swap02中 *p1 = " << *p1 << endl;cout << "swap02中 *p2 = " << *p2 << endl; }int main() //指針和函數 {int a = 10;int b = 20;//1、值傳遞不會改變實參swap01(a, b);cout << "a = " << a << endl;cout << "b = " << b << endl;//2、地址傳遞會改變實參//將a、b變量地址傳入函數體中,用指針接受地址【如果是地址傳遞,可以修飾實參】swap02(&a, &b);cout << "a = " << a << endl;cout << "b = " << b << endl;system("pause");return 0; }

    總結:如果不想修改實參,就用值傳遞,如果想修改實參,就用地址傳遞。

    7.8 指針、數組、函數

    案例描述:封裝一個函數,利用冒泡排序,實現對整型數組的升序排序。

    例如數組:int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };

    示例

    #include <iostream> using namespace std;//冒泡排序函數【參數1:數組首地址;參數2:數組長度】 void bubbleSort(int *arr, int len) //int * arr 也可以寫為int arr[] {for (int i = 0; i < len - 1; i++){for (int j = 0; j < len - 1 - i; j++){if (arr[j] > arr[j + 1]) //如果j > j + 1的值,交換數字{int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}} }//打印數組函數 void printArray(int arr[], int len) //void printArray(int *arr, int len) {for (int i = 0; i < len; i++){// cout << arr[i] << endl;cout << arr[i] << "、";} }int main() {//1、創建一個數組int arr[10] = {4, 3, 6, 9, 1, 2, 10, 8, 7, 5};//數組長度int len = sizeof(arr) / sizeof(int);//2、創建一個函數實現冒泡排序bubbleSort(arr, len); //傳遞數組地址arr:數組名就是數組的首地址//3、打印排序后的數組printArray(arr, len); //傳遞數組地址arrsystem("pause");return 0; }

    總結:當數組名傳入到函數作為參數時,被退化為指向首元素的指針。

    8 結構體

    8.1 結構體基本概念

    結構體屬于用戶自定義的數據類型,允許用戶存儲不同的數據類型。

    C++內置數據類型:int、float、double、string、char ...

    8.2 結構體定義和使用

    語法:struct 結構體名 { 結構體成員列表 };

    通過結構體創建變量的方式有3種:

  • struct 結構體名 變量名

  • struct 結構體名 變量名 = { 成員1值 , 成員2值...}

  • 定義結構體時,順便創建變量

  • 示例

    ??

    #include <iostream> #include <string> using namespace std;//1、創建學生數據類型:學生包括(姓名、年齡、分數) //自定義數據類型,一些數據類型集合組成的一個類型(其實就是內置數據類型的集合)。 //語法:struct 類型名稱 { 成員列表 }//結構體定義 struct student //結構體名稱-見名知意 {//成員列表---學生屬性string name; //姓名int age; //年齡int score; //分數 } stu3; //結構體變量創建方式3//2、通過學生類型創建具體學生(共有3種方式)//2.1、struct student s1; // s1就是變量名 //2.2、struct student s2 = {...}; // 創建變量的同時賦初值 //2.3、在定義結構體時順便創建結構體變量int main() {//【結構體變量創建方式1】2.1、struct student s1;struct student stu1; //創建結構體時,struct關鍵字可以省略//給stu1屬性賦值,通過“.”訪問結構體變量中的屬性stu1.name = "張三";stu1.age = 18;stu1.score = 100;//方式1打印輸出cout << "姓名:" << stu1.name << " 年齡:" << stu1.age << " 分數:" << stu1.score << endl;//【結構體變量創建方式2】2.2、struct student s2 = {...};struct student stu2 = {"李四", 19, 60};//方式2打印輸出cout << "姓名:" << stu2.name << " 年齡:" << stu2.age << " 分數:" << stu2.score << endl;//【結構體變量創建方式3】在定義結構體時順便創建結構體變量,不建議使用stu3.name = "王五";stu3.age = 18;stu3.score = 80;//方式3打印輸出cout << "姓名:" << stu3.name << " 年齡:" << stu3.age << " 分數:" << stu3.score << endl;system("pause");return 0; }
    • 總結1:定義結構體時的關鍵字是struct,不可省略。
    • 總結2:創建結構體變量時,關鍵字struct可以省略。
    • 總結3:結構體變量利用操作符 ''.'' 訪問成員。

    8.3 結構體數組

    作用:將自定義的結構體放入到數組中方便維護。

    語法:struct 結構體名 數組名[元素個數] = { {} , {} , ... {} }

    示例

    ?

    #include <iostream> #include <string> using namespace std;//結構體數組//1、定義結構體 struct student {//成員列表string name; //姓名int age; //年齡int score; //分數 };int main() {//2、創建結構體數組struct student stuArray[3] ={{"張三", 18, 88},{"李四", 28, 99},{"王五", 38, 66}};//3、給結構體數組中的元素賦值stuArray[2].name = "趙六";stuArray[2].age = 66;stuArray[2].score = 99;//4、遍歷結構體數組for (int i = 0; i < 3; i++){cout << "姓名:" << stuArray[i].name<< "\t年齡:" << stuArray[i].age<< "\t分數:" << stuArray[i].score << endl;}system("pause");return 0; }

    8.4 結構體指針

    作用:通過指針訪問結構體中的成員。// 利用結構體指針操作結構體成員。

    • 利用操作符 ->可以通過結構體指針訪問結構體屬性。

    示例

    ?&s:取s的地址,返回s對應的數據類型的指針。

    ?

    #include <iostream> #include <string> using namespace std;//結構體指針//1、定義學生結構體 struct student { //成員列表string name; //姓名int age; //年齡int score; //分數 };int main() {//2、創建學生結構體變量// struct student stu = {"張三", 25, 100}; //struct可以省略student stu = {"張三", 25, 99}; //struct可以省略//3、通過指針指向結構體變量// struct student *p = &stu; //struct可以省略student *p = &stu; //struct可以省略//結構體變量,可以直接通過.來訪問cout << "姓名:" << stu.name << "\t年齡:" << stu.age << "\t分數:" << stu.score << endl;//4、通過指針訪問結構體變量中的數據p->score = 66; //指針通過 -> 操作符可以訪問成員//通過結構體指針訪問結構體中的屬性,需要利用“->”cout << "姓名:" << p->name << "\t年齡:" << p->age << "\t分數:" << p->score << endl;system("pause");return 0; }
    • 總結:結構體指針可以通過 -> 操作符 來訪問結構體中的成員。

    8.5 結構體嵌套結構體

    作用: 結構體中的成員可以是另一個結構體。

    例如:每個老師輔導一個學員,一個老師的結構體中,記錄一個學生的結構體。

    示例

    #include <iostream> #include <string> using namespace std;// 結構體嵌套結構體//定義學生結構體 struct student {//成員列表string name; //姓名int age; //年齡int score; //分數 };//定義教師結構體 struct teacher {//成員列表int id; //教師編號string name; //教師姓名int age; //教師年齡struct student stu; //教師輔導的學生 子結構體 };int main() {//創建教師結構體變量struct teacher t1;t1.id = 333;t1.name = "老王";t1.age = 50;t1.stu.name = "張三";t1.stu.age = 18;t1.stu.score = 99;cout << "教師編號:" << t1.id<< "\t教師姓名:" << t1.name<< "\t教師年齡:" << t1.age<< "\t教師輔導的學生姓名:" << t1.stu.name<< endl;cout << "學生姓名:" << t1.stu.name<< "\t學生年齡:" << t1.stu.age<< "\t學生考試分數:" << t1.stu.score<< endl;system("pause");return 0; }

    總結:在結構體中可以定義另一個結構體作為成員,用來解決實際問題。

    8.6 結構體做函數參數

    作用:將結構體作為參數向函數中傳遞。

    傳遞方式有2種:

  • 值傳遞

  • 地址傳遞

  • 示例

    #include <iostream> #include <string> using namespace std;//定義學生結構體 struct student {//成員列表string name; //姓名int age; //年齡int score; //分數 };//打印學生信息函數 //1、值傳遞 void printStudent1(struct student stu) //(student stu) {stu.age = 28; //修改屬性cout << "1子函數中\t姓名:" << stu.name << "\t年齡:" << stu.age << "\t分數:" << stu.score << endl; }//2、地址傳遞 void printStudent2(struct student *stu) //用指針*stu接收地址 {stu->age = 28;cout << "2子函數中\t姓名:" << stu->name << "\t年齡:" << stu->age << "\t分數:" << stu->score << endl; }int main() {//結構體作函數參數//將學生傳入到一個參數中,打印學生身上的所有信息//創建結構體變量student stu = {"張三", 18, 100};stu.name = "李四";stu.age = 20;stu.score = 85;//1、值傳遞printStudent1(stu);cout << "1主函數中\t姓名:" << stu.name << "\t年齡:" << stu.age << "\t分數:" << stu.score << endl;cout << endl;//2、地址傳遞printStudent2(&stu);cout << "2主函數中\t姓名:" << stu.name << "\t年齡:" << stu.age << "\t分數:" << stu.score << endl;system("pause");return 0; }

    總結:如果不想修改主函數中的數據,用值傳遞,反之用地址傳遞。

    8.7 結構體中const使用場景

    作用:用const來防止誤操作。

    示例

    #include <iostream> #include <string> using namespace std;//學生結構體定義 struct student {//成員列表string name; //姓名int age; //年齡int score; //分數 };/** 值傳遞* stu.age = 150;//mian中的stu變量不會改變* 會將實參中的數據拷貝一份,放在形參s上* 無論形參如何改變,都不會影響實參* 1、實參有很多屬性,每個屬性都拷貝一份,拷貝的數據量很大* 2、假設一個學校有成千上萬個人,每個人都調用printStudent函數,拷貝成千上萬份數據,* 這樣數據量就會非常大,占用內存空間大*/ void printStudent1(student stu) // (struct student stu) 省略struct {stu.age = 150; //mian中的stu變量不會改變cout << "姓名:" << stu.name << "\t年齡:" << stu.age << "\t分數:" << stu.score << endl; }// void printStudent3(const student stu) // (struct student stu) 省略struct // { // stu.age = 150; //mian中的stu變量不會改變 // cout << "姓名:" << stu.name << "\t年齡:" << stu.age << "\t分數:" << stu.score << endl; // }//將函數中的形參改為指針,可以減少內存空間的使用,而且不會復制新的副本出來(值傳遞會復制整個結構體元素) //const使用場景 void printStudent2(const student *stu) //加const防止函數體中的誤操作 指針*stu節省空間,一個指針占4個字節內存 {//stu->age = 100; //操作失敗,因為加了const修飾,常量指針無法修改指針指向的值,只能讀不能寫。防止age的值會被修改//加入const之后,一旦有修改的操作就會報錯,可以防止我們的誤操作(加“const”防止誤操作)cout << "姓名:" << stu->name << "\t年齡:" << stu->age << "\t分數:" << stu->score << endl; }int main() {//創建結構體變量student stu = {"張三", 18, 100};printStudent1(stu); //值傳遞//通過函數打印結構體變量信息printStudent2(&stu); //傳入地址,在函數中指針接收地址cout << "main()中 張三的年齡為:" << stu.age << endl;system("pause");return 0; }

    8.8 結構體案例

    8.8.1 案例1

    案例描述:

    學校正在做畢設項目,每名老師帶領5個學生,總共有3名老師,需求如下:

    • 設計學生和老師的結構體,其中在老師的結構體中,有老師姓名和一個存放5名學生的數組作為成員;
    • 學生的成員有姓名、考試分數,創建數組存放3名老師,通過函數給每個老師及所帶的學生賦值;
    • 最終打印出老師數據以及老師所帶的學生數據。

    #include <iostream> #include <string> #include <ctime> using namespace std;//學生結構體 struct Student {string sName; //姓名int score; //分數 };//老師結構體 struct Teacher {string tName; //姓名struct Student sArray[5]; //學生數組 };//創建數據——給老師和學生賦值的函數 void allocateSpace(struct Teacher tArray[], int len) //struct可以省略 {string tName = "老師"; // Teacher_string sName = "學生";string nameSeed = "ABCDE";//給老師進行賦值for (int i = 0; i < len; i++){tArray[i].tName = tName + nameSeed[i]; //老師姓名//通過循環給每名老師所帶的學生進行賦值for (int j = 0; j < 5; j++){tArray[i].sArray[j].sName = sName + nameSeed[j];tArray[i].sArray[j].score = rand() % 61 + 40; // 0~60 40~100// rand() % 60:0~59}} }//打印數據——打印所有信息 void printTeachers(struct Teacher tArray[], int len) //struct可以省略 {for (int i = 0; i < len; i++){cout << "老師的姓名:" << tArray[i].tName << endl;for (int j = 0; j < 5; j++){cout << "\t學生姓名:" << tArray[i].sArray[j].sName << ";考試分數:" << tArray[i].sArray[j].score << endl;}} }int main() {//利用系統時間,產生隨機數srand((unsigned int)time(NULL)); //隨機數種子 頭文件 #include <ctime>//1、創建3名老師的數組struct Teacher tArray[3]; //老師數組 struct可以省略//2、通過函數給3名老師的信息賦值,并給老師帶的學生信息賦值cout << "string類型所占內存空間為:" << sizeof(string) << endl; //string類型所占內存空間為:32cout << "int類型所占內存空間為:" << sizeof(int) << endl; //int類型所占內存空間為:4cout << "sizeof(tArray):" << sizeof(tArray) << endl; //sizeof(tArray):696cout << "sizeof(Teacher):" << sizeof(Teacher) << endl; //sizeof(Teacher):232cout << "sizeof(Student):" << sizeof(Student) << endl; //sizeof(Student):40cout << "sizeof(tArray[0]):" << sizeof(tArray[0]) << endl; //sizeof(tArray[0]):232int len1 = sizeof(tArray) / sizeof(Teacher); //計算數組長度cout << "len1:" << len1 << endl; //len1:3int len2 = sizeof(tArray) / sizeof(tArray[0]); //計算數組長度cout << "len2:" << len2 << endl; //len2:3allocateSpace(tArray, len2); //創建數據//3、打印所有老師及所帶的學生信息printTeachers(tArray, len2); //打印數據system("pause");return 0; }

    8.8.2 案例2

    案例描述:

    設計一個英雄的結構體,包括成員姓名、年齡、性別;創建結構體數組,數組中存放5名英雄。

    通過冒泡排序的算法,將數組中的英雄按照年齡進行升序排序,最終打印排序后的結果。

    五名英雄信息如下:

    {"劉備", 23, "男"},
    {"關羽", 22, "男"},
    {"張飛", 20, "男"},
    {"趙云", 21, "男"},
    {"貂蟬", 19, "女"},

    #include <iostream> #include <string> using namespace std;//1、設計英雄結構體 //英雄結構體 struct hero {string name; //姓名int age; //年齡string sex; //性別 };//冒泡排序——實現年齡升序排列 void bubbleSort(struct hero arr[], int len) //struct可省 {for (int i = 0; i < len - 1; i++){for (int j = 0; j < len - 1 - i; j++){//如果j下標的元素年齡大于j+1下標的元素的年齡,交換兩個元素if (arr[j].age > arr[j + 1].age){struct hero temp = arr[j]; //臨時數據arr[j] = arr[j + 1];arr[j + 1] = temp;}}} }//打印數組——打印排序后數組中的信息 void printHeros(struct hero arr[], int len) //struct可省 {for (int i = 0; i < len; i++){cout << "姓名:" << arr[i].name << "\t性別:" << arr[i].sex << "\t年齡:" << arr[i].age << endl;} }//1、設計英雄結構體 //2、創建數組存放5名英雄 //3、對數組進行排序,按照年齡進行升序排序 //4、將排序后的結果打印輸出 int main() {//2、創建數組存放5名英雄struct hero heroArray[5] ={{"劉備", 23, "男"},{"關羽", 22, "男"},{"張飛", 20, "男"},{"趙云", 21, "男"},{"貂蟬", 19, "女"}};cout << "string類型所占內存空間為:" << sizeof(string) << endl; //string類型所占內存空間為:32cout << "int類型所占內存空間為:" << sizeof(int) << endl; //int類型所占內存空間為:4cout << "sizeof(heroArray):" << sizeof(heroArray) << endl; //sizeof(heroArray):360cout << "sizeof(heroArray[0]):" << sizeof(heroArray[0]) << endl; //sizeof(heroArray[0]):72cout << "sizeof(hero):" << sizeof(hero) << endl; //sizeof(hero):72int len1 = sizeof(heroArray) / sizeof(heroArray[0]); //整體所占空間大小/單個元素所占空間大小cout << "len1:" << len1 << endl; //len1:5int len2 = sizeof(heroArray) / sizeof(hero); //獲取數組元素個數cout << "len2:" << len2 << endl; //len1:5cout << "排序前,數組打印:" << endl;for (int i = 0; i < len1; i++){cout << "姓名:" << heroArray[i].name << "\t性別:" << heroArray[i].sex << "\t年齡:" << heroArray[i].age << endl;}//3、對數組進行排序,按照年齡進行升序排序bubbleSort(heroArray, len1); //排序cout << "排序后,數組打印:" << endl;//4、將排序后的結果打印輸出printHeros(heroArray, len1); //打印system("pause");return 0; }

    此案例鍛煉的3點:

  • 結構體數組的寫法
  • 冒泡排序 // 使用“冒泡排序”對結構體數組進行排序
  • 結構體傳入函數的寫法、操作結構體的寫法
  • 總結

    以上是生活随笔為你收集整理的C++阶段01笔记汇总【C++软件安装、C++初识、数据类型、运算符、程序流程结构、数组、函数、指针、结构体】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。