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++關鍵字,如下:
| auto | double | inline | short | typeid |
| bool | dynamic_cast | int | signed | typename |
| break | else | long | sizeof | union |
| case | enum | mutable | static | unsigned |
| catch | explicit | namespace | static_cast | using |
| char | export | new | struct | virtual |
| class | extern | operator | switch | void |
| const | false | private | template | volatile |
| const_cast | float | protected | this | wchar_t |
| continue | for | public | throw | while |
| default | friend | register | true | ? |
| delete | goto | reinterpret_cast | try | ? |
提示:在給變量或者常量起名稱時候,不要用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
兩者的區別在于表示的有效數字范圍不同。
| float | 4字節 | 7位有效數字 |
| double | 8字節 | 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碼 表格:
| 0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
| 1 | SOH | 33 | ! | 65 | A | 97 | a |
| 2 | STX | 34 | " | 66 | B | 98 | b |
| 3 | ETX | 35 | # | 67 | C | 99 | c |
| 4 | EOT | 36 | $ | 68 | D | 100 | d |
| 5 | ENQ | 37 | % | 69 | E | 101 | e |
| 6 | ACK | 38 | & | 70 | F | 102 | f |
| 7 | BEL | 39 | , | 71 | G | 103 | g |
| 8 | BS | 40 | ( | 72 | H | 104 | h |
| 9 | HT | 41 | ) | 73 | I | 105 | i |
| 10 | LF | 42 | * | 74 | J | 106 | j |
| 11 | VT | 43 | + | 75 | K | 107 | k |
| 12 | FF | 44 | , | 76 | L | 108 | l |
| 13 | CR | 45 | - | 77 | M | 109 | m |
| 14 | SO | 46 | . | 78 | N | 110 | n |
| 15 | SI | 47 | / | 79 | O | 111 | o |
| 16 | DLE | 48 | 0 | 80 | P | 112 | p |
| 17 | DCI | 49 | 1 | 81 | Q | 113 | q |
| 18 | DC2 | 50 | 2 | 82 | R | 114 | r |
| 19 | DC3 | 51 | 3 | 83 | S | 115 | s |
| 20 | DC4 | 52 | 4 | 84 | T | 116 | t |
| 21 | NAK | 53 | 5 | 85 | U | 117 | u |
| 22 | SYN | 54 | 6 | 86 | V | 118 | v |
| 23 | TB | 55 | 7 | 87 | W | 119 | w |
| 24 | CAN | 56 | 8 | 88 | X | 120 | x |
| 25 | EM | 57 | 9 | 89 | Y | 121 | y |
| 26 | SUB | 58 | : | 90 | Z | 122 | z |
| 27 | ESC | 59 | ; | 91 | [ | 123 | { |
| 28 | FS | 60 | < | 92 | / | 124 | | |
| 29 | GS | 61 | = | 93 | ] | 125 | } |
| 30 | RS | 62 | > | 94 | ^ | 126 | ` |
| 31 | US | 63 | ? | 95 | _ | 127 | DEL |
ASCII 碼大致由以下兩部分組成:
-
ASCII 非打印控制字符:ASCII 表上的數字 0-31 分配給了控制字符,用于控制像打印機等一些外圍設備。
-
ASCII 打印字符:數字 32-126 分配給了能在鍵盤上找到的字符,當查看或打印文檔時就會出現。
2.5 轉義字符
作用:用于表示一些不能顯示出來的ASCII字符。
現階段我們常用的轉義字符有:\n、\\、\t。
| \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 | 數字0 | 000 |
| \ddd | 8進制轉義字符,d范圍0~7 | 3位8進制 |
| \xhh | 16進制轉義字符,h范圍09,af,A~F | 3位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 字符串型
作用:用于表示一串字符。
兩種風格
示例:
#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 算術運算符
作用:用于處理四則運算。
算術運算符包括以下符號:
| + | 正號 | +3 | 3 |
| - | 負號 | -3 | -3 |
| + | 加 | 10 + 5 | 15 |
| - | 減 | 10 - 5 | 5 |
| * | 乘 | 10 * 5 | 50 |
| / | 除 | 10 / 5 | 2 |
| % | 取模(取余) | 10 % 3 | 1 |
| ++ | 前置遞增 | 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 == 3 | 0 |
| != | 不等于 | 4 != 3 | 1 |
| < | 小于 | 4 < 3 | 0 |
| > | 大于 | 4 > 3 | 1 |
| <= | 小于等于 | 4 <= 3 | 0 |
| >= | 大于等于 | 4 >= 1 | 1 |
示例
#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 二維數組數組名
-
查看二維數組所占內存空間。
-
獲取二維數組首地址。
——示例
三個地址是重合的:
總結1:二維數組名就是這個數組的首地址。
總結2:對二維數組名進行sizeof時,可以獲取整個二維數組占用的內存空間大小。
5.3.3 二維數組應用案例
考試成績統計:
案例描述:有三名同學(張三,李四,王五),在一次考試中的成績分別如下表,請分別輸出三名同學的總成績。
| 張三 | 100 | 100 | 100 |
| 李四 | 90 | 50 | 100 |
| 王五 | 60 | 70 | 80 |
參考答案:
?
#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表達式:和返回值類型掛鉤,函數執行完后,返回相應的數據。
示例:加法函數
示例:定義一個加法函數,實現兩個數相加。
?
#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名老師,通過函數給每個老師及所帶的學生賦值;
- 最終打印出老師數據以及老師所帶的學生數據。
8.8.2 案例2
案例描述:
設計一個英雄的結構體,包括成員姓名、年齡、性別;創建結構體數組,數組中存放5名英雄。
通過冒泡排序的算法,將數組中的英雄按照年齡進行升序排序,最終打印排序后的結果。
五名英雄信息如下:
{"劉備", 23, "男"},
{"關羽", 22, "男"},
{"張飛", 20, "男"},
{"趙云", 21, "男"},
{"貂蟬", 19, "女"},
此案例鍛煉的3點:
總結
以上是生活随笔為你收集整理的C++阶段01笔记汇总【C++软件安装、C++初识、数据类型、运算符、程序流程结构、数组、函数、指针、结构体】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++阶段01笔记08【结构体(基本概念
- 下一篇: s3c2440移植MQTT