C++基礎(chǔ)入門

本文章是本人黑馬程序員 C++| 匠心之作 從0到1入門學(xué)編程的學(xué)習(xí)筆記


1 C++初識(shí)

1.1 第一個(gè)C++程序

編寫一個(gè)C++程序總共分為四個(gè)步驟

  • 創(chuàng)建項(xiàng)目
  • 創(chuàng)建文件
  • 編寫代碼
  • 運(yùn)行程序
#include <iostream>
using namespace std;

int main()
{
  cout << "Hello world!" << endl;

  system("pause");

  return 0;
}

1.2 注釋

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

兩種格式

  1. 單行注釋//描述信息
    • 通常放在一行代碼的上方淑际,或者一條語句的末尾淀零,對(duì)該行代碼說明
  2. 多行注釋:/* 描述信息 */
    • 通常放在一段代碼的上方滔灶,對(duì)該段代碼做整體說明

提示:編譯器在編譯代碼時(shí)趣斤,會(huì)忽略注釋對(duì)內(nèi)容

1.3 變量

作用:給一段指定的內(nèi)存空間起名,方便操作這段內(nèi)存

語法:數(shù)據(jù)類型 變量名 = 初始值;

示例

#include <iostream>
using namespace std;

int main()
{
  //變量的定義
  //語法:數(shù)據(jù)類型 變量名 = 初始值;

  int a = 10;

  cout << "a = " << a << endl;

  system("pause");

  return 0;
}

1.4 常量

作用:用于記錄程序中不可更改的數(shù)據(jù)

C++定于常量?jī)煞N方式

  1. #define 宏常量:#define 常量名 常量值
    • 通常在文件上方定義,表示一個(gè)常量
  2. const修飾的變量:const 數(shù)據(jù)類型 常量名 = 常量值
    • 通常在變量定義前加關(guān)鍵字const,修飾該變量為常量篱竭,不可修改

示例

#include <iostream>
using namespace std;

//1、宏常量
#define day = 7;

int main()
{
  cout << "一周里共有" << day << "天步绸。 \n";
  //day = 8;    //報(bào)錯(cuò)掺逼,宏常量不可修改

  //2、const修飾變量
  const int month = 12;
  cout << "一年里共有" << day << "個(gè)月瓤介。    \n";
  //month = 24; //報(bào)錯(cuò)吕喘,常量是不可以修改的

  system("pause");

  return 0;
}

1.5 關(guān)鍵字

作用:關(guān)鍵字是C++中預(yù)先保留的單詞(標(biāo)識(shí)符)

  • 在定義變量或者常量的時(shí)候,不要用關(guān)鍵字命名

C++關(guān)鍵字如下

asm do if return typedef
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 violate
const_cast float protected this wchar_t
continue for public throw while
default friend register true
delete goto reinterpret_cast try

提示:在給變量或者常量起名的時(shí)候刑桑,不要用C++的關(guān)鍵字氯质,否則會(huì)產(chǎn)生歧義。

1.6 標(biāo)識(shí)符命名規(guī)則

作用:C++規(guī)定給標(biāo)識(shí)符(變量祠斧、常量)命名時(shí)闻察,有一套自己的規(guī)則

  • 標(biāo)識(shí)符不能是關(guān)鍵字
  • 標(biāo)識(shí)符只能由字母、數(shù)字、下劃線組成
  • 第一個(gè)字符必須為字母或下劃線
  • 標(biāo)識(shí)符中字母區(qū)分大小寫

建議:給標(biāo)識(shí)符命名時(shí)蜓陌,爭(zhēng)取做到見名知意的效果觅彰,方便自己和他人的閱讀

2 數(shù)據(jù)類型

C++規(guī)定在創(chuàng)建一個(gè)變量或者常量時(shí),必須要指定出相應(yīng)的數(shù)據(jù)類型钮热,否則無法給變量分配空間

2.1 整形

作用:整形變量表示的是整數(shù)類型>的數(shù)據(jù)

C++中能夠表示整形的類型有以下幾種方式填抬,區(qū)別在于所占內(nèi)存空間的不同

數(shù)據(jù)類型 占用空間 取值范圍
short (短整形) 2字節(jié) (-2^15 ~ 2^15-1)
int (整形) 4字節(jié) (-2^31 ~ 2^31-1)
long (長(zhǎng)整形) Windows為4字節(jié);Linux為4字節(jié)(32位系統(tǒng))隧期,8字節(jié)(64位系統(tǒng)) (-2^31 ~ 2^31-1)
long long (長(zhǎng)長(zhǎng)整形) 8字節(jié) (-2^63 ~ 2^63-1)

2.2 sizeof關(guān)鍵字

作用:利用sizeof關(guān)鍵字可以統(tǒng)計(jì)數(shù)據(jù)類型所占內(nèi)存大小

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

示例:

#include <iostream>
using namespace std;

int main()
{
  cout << "short 類型所占的內(nèi)存空間為:" << sizeof(short) << endl;

  cout << "int 類型所占的內(nèi)存空間為:" << sizeof(int) << endl;

  cout << "long 類型所占的內(nèi)存空間為:" << sizeof(long) << endl;

  cout << "long long 類型所占的內(nèi)存空間為:" << sizeof(long long) << endl;

  system("pause");

  return 0;
}

整形結(jié)論:short < int <= long <= long long

2.3 實(shí)型

作用:用于表示小數(shù)

浮點(diǎn)型變量分為兩種:

  1. 單精度 float
  2. 雙精度 double

兩者的區(qū)別在于表示的有效數(shù)字范圍不同飒责。

數(shù)據(jù)類型 占用空間 有效數(shù)字范圍
float 4字節(jié) 7位有效數(shù)字
double 8字節(jié) 15 ~ 16位有效數(shù)字

示例

#include <iostream>
using namespace std;

int main()
{
  float f1 = 3.1415926f;
  double d1 = 3.1415926;

  //默認(rèn)情況下,輸出一個(gè)小書會(huì)顯示出6位有效數(shù)字
  cout << f1 << endl;
  cout << d1 << endl;

  cout << sizeof(float) << endl;        // 4
  cout << sizeof(double)<< endl;        // 8

  //科學(xué)計(jì)數(shù)法
  float f2 = 3e2;               // 3 * 10 ^ 2
  cout << f2 << endl;

  float f3 = 3e-2;          // 3 * 10 ^ -2
  cout << f3 << endl;

  system("pause");

  return 0;
}

2.4 字符型

作用:字符型變量用于顯示單個(gè)字符串

語法:char ch = 'a';

注意1:在顯示字符型變量時(shí)仆潮,用單引號(hào)將字符括起來宏蛉,不要用雙引號(hào)

注意2:?jiǎn)我?hào)內(nèi)只能有一個(gè)字符,不能是字符串

  • C和C++中字符型變量只占1個(gè)字節(jié)
  • 字符型變量并不是把字符本身放到內(nèi)存中儲(chǔ)存性置,而是將對(duì)應(yīng)的ASCII編碼放到儲(chǔ)存單元

示例

#include <iostream>
using namespace std;

int main()
{
  char ch = 'a';
  cout << ch << endl;
  cout << sizeof(char) << endl;

  //ch = "b"            //錯(cuò)誤产舞,不可以用雙引號(hào)
  //ch = 'abcde'    //錯(cuò)誤繁疤,單引號(hào)內(nèi)只能引用一個(gè)字符

  //字符變量對(duì)應(yīng)ASCII媽
  //A - 65
  //a - 97
  cout << (int)ch << endl;

  ch = 97;
  cout << ch << endl;

  system("pause");

  return 0;
}

ASCII碼表

ASCII碼 控制字符 ASCII碼 字符 ASCII碼 字符 ASCII碼 字符
0 NUL 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 DC1 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 ETB 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碼大致由以下兩部分組成

  1. ASCII非打印控制字符:ASCII表上的數(shù)字0-31分配給了控制字符樟蠕,用于控制像打印機(jī)等一些外圍設(shè)備钳宪。
  2. ASCII打印字符:數(shù)字32-126分配給了能在鍵盤上找到的字符,當(dāng)查看或打印文檔時(shí)就會(huì)出現(xiàn)隐砸。

2.5 轉(zhuǎn)義字符

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

現(xiàn)階段我們常用的轉(zhuǎn)義字符有:\n \\ \t

轉(zhuǎn)義字符 含義 ASCII碼值(十進(jìn)制)
\a 警報(bào) 007
\b 退格(BS)之碗,將當(dāng)前位置移到前一列 008
\f 換頁(FF),將當(dāng)前位置移到下頁開頭 012
\n 換行(LF)季希,將當(dāng)前位置移到下一行開頭 010
\r 回車(CL)褪那,將當(dāng)前位置移到本行開頭 013
\t 水平制表(HT)(跳到下一個(gè)TAB位置) 009
\v 垂直制表(VT) 011
\\ 代表一個(gè)反斜線字符 "\" 092
\' 代表一個(gè)單引號(hào)(撇號(hào))字符 039
\" 代表一個(gè)雙引號(hào)字符 034
? 代表一個(gè)問號(hào) 063
\0 數(shù)字0(NUL) 000
\ddd 8進(jìn)制轉(zhuǎn)義字符,d范圍0~7 3位8進(jìn)制
\xhh 16進(jìn)制轉(zhuǎn)義字符式塌,h范圍0~9博敬,a~f,A~F 3位16進(jìn)制

示例

#include <iostream>
using namespace std;

int main()
{
  cout << "\n" << endl;
  cout << "\\" << endl;
  cout << "\tHello" << endl;

  system("pause");

  return 0;
}

2.6 字符串型

作用:用于表示一串字符

兩種風(fēng)格

  1. C風(fēng)格字符串:char 變量名[] = "字符串值"

示例

#include <iostream>
using namespace std;

int main()
{
  char str1[] = "Hello world!";
  cout << str1 << endl;

  system("pause");

  return 0;
}

注意:C風(fēng)格的字符串要用雙引號(hào)擴(kuò)起來

  1. C++風(fēng)格字符串:string 變量名 = "字符串值"

示例

#include <iostream>
#include <string>
using namespace std;

int main()
{
  string str2 = "Hello world!";
  cout << str2 << endl;

  system("pause");

  return 0;
}

注意:C++風(fēng)格字符串峰尝,需要加入頭文件 #include <strings>

2.7 布爾類型

作用:布爾數(shù)據(jù)類型代表真或假的值

bool類型只有兩個(gè)值:

  1. true——真(本質(zhì)是1)
  2. false——假(本質(zhì)是0)

布爾類型占一個(gè)字節(jié)大小

示例

#include <iostream>
using namespace std;

int main()
{
  bool flag = true;
  cout << flag << endl; // 1

  flag = false;
  cout << flag << endl; // 0

  cout >> "Size of bool = " << sizeof(bool) << endl;    // 1

  system("pause");

  return 0;
}

2.8 數(shù)據(jù)的輸入

作用:用于從鍵盤獲取數(shù)據(jù)

關(guān)鍵字:cin

語法:cin >> 變量

示例

#include <iostream>
#include <string>
using namespace std;

int main()
{
  //整形輸入
  int a = 0;
  cout << "請(qǐng)輸入整形變量:";
  cin >> a;
  cout << a << endl;

  //浮點(diǎn)型輸入
  double d = 0;
  cout << "請(qǐng)輸入浮點(diǎn)型變量:";
  cin >> d;
  cout << d << endl;

  //字符型輸入
  char ch = '';
  cout << "請(qǐng)輸入字符型變量:";
  cin >> ch;
  cout << ch << endl;

  //字符串型輸入
  string str = '';
  cout << "請(qǐng)輸入字符串型變量:";
  cin >> str;
  cout << str << endl;

  //布爾類型
  bool flag = false;
  cout << "請(qǐng)輸入布爾類型變量:";
  cin >> flag;
  cout << flag << endl;

  system("pause");

  return 0;
}

3 運(yùn)算符

作用:用于執(zhí)行代碼的運(yùn)算

運(yùn)算符類型 作用
suanshu 用于處理四則運(yùn)算
賦值運(yùn)算符 用于將表達(dá)式的值賦給變量
比較運(yùn)算符 用于表達(dá)式的比較冶忱,并返回一個(gè)真值或假值
邏輯運(yùn)算符 用于根據(jù)表達(dá)式的值返回真值或假值

3.1 算數(shù)運(yùn)算符

作用:用于處理四則運(yùn)算

算術(shù)運(yùn)算符包括以下符號(hào):

運(yùn)算符 術(shù)語 示例 結(jié)果
+ 正號(hào) +3 3
- 負(fù)號(hào) -3 -3
+ 10 + 5 15
- 10 - 5 5
* 10 * 5 50
/ 10 / 5 2
% 取模(取余) 10 % 3 1
++ 前置遞增 a = 2;<br /> b = ++a; a = 3;<br />b = 3;
++ 后置遞增 a = 2;<br />b = a++; a = 3;<br />b = 2;
-- 前置遞減 a = 2;<br />b = --a; a = 1;<br />b = 1;
-- 后置遞減 a = 2;<br />b = a--; a =1;<br />b = 2;

示例1

#include <iostream>
using namespace std;

//加減乘除
int main()
{
  int a1 = 10;
  int b1 = 3;

  cout << a1 + b1 << endl;
  cout << a1 - b1 << endl;
  cout << a1 * b1 << endl;
  cout << a1 / b1 << endl;  //兩個(gè)整數(shù)相除結(jié)果依然是整數(shù)

  int a2 = 10;
  int b2 = 20;
  cout << a2 / b2 << endl;

  int a3 = 10;
  int b3 = 0;
  //cout << a3 / b3 << endl;    //報(bào)錯(cuò),除數(shù)不可以為0

  //兩個(gè)小數(shù)可以相除
  double d1 = 0.5;
  double d2 = 0.25;
  cout << d1 / d2 << endl;

  system("pause");

  return 0;
}

總結(jié):在除法運(yùn)算中境析,除數(shù)不能為0

示例2

#include <iostream>
using namespace std;

//取模
int main()
{
  int a1 = 10;
  int b1 = 3;
  cout << a1 % b1 << endl;

  int a2 = 10;
  int b2 = 20;
  cout << a2 % b2 << endl;

  int a3 = 10;
  int b3 = 0;
  //cout << a3 % b3 << endl;    //取模運(yùn)算時(shí),除數(shù)也不能為0

  //兩個(gè)小書不可以取模
  double d1 = 3.14;
  double d2 = 1.1;
  //cout << d1 % d2 << endl;

  system("pause");

  return 0;
}

總結(jié):只有整型變量可以進(jìn)行取模運(yùn)算

示例3

#include <iostream>
using namespace std;

//遞增
int main()
{
  //后置遞增
  int a = 10;
  a++;  //等價(jià)于a = a + 1;
  cout << a << endl;    // 11

  //前置遞增
  int b = 10;
  ++b;
  cout << b << endl;    // 11

  //區(qū)別
  //前值遞增先對(duì)變量進(jìn)行++派诬,再計(jì)算表達(dá)式
  int a2 = 10;
  int b2 = ++a2 * 10;
  cout << a2 << endl;   // 11
  cout << b2 << endl;   // 110

  //后置遞增先計(jì)算表達(dá)式劳淆,再對(duì)變量進(jìn)行++
  int a3 = 10;
  int b3 = a3++ * 10;
  cout << a3 << endl;   // 11
  cout << b3 << endl;   // 100

  system("pause");

  return 0;
}

總結(jié):前值遞增先對(duì)變量進(jìn)行++,再計(jì)算表達(dá)式默赂;后置遞增相反

3.2 賦值運(yùn)算符

作用:用于將表達(dá)式的值賦給變量

賦值運(yùn)算符包括以下幾個(gè)符號(hào):

運(yùn)算符 術(shù)語 示例 結(jié)果
= 賦值 a = 2;<br />b = 3; a = 2;<br />b = 3
+= 加等于 a = 0;<br />a += 2; a = 2
-= 減等于 a = 5;<br />a -= 3; a = 2
*= 乘等于 a = 2;<br />a *= 2; a = 4
/= 除等于 a = 4;<br />a /= 2; a = 2
%= 模等于 a = 3;<br />a %= 2; a = 1

示例:

#include <iostream>
using namespace std;

int main()
{
  int a = 10;
  a += 2;
  cout << a << endl;    // 12

  a = 10;
  a -= 2;
  cout << a << endl;    // 8

  a = 10;
  a *= 2;
  cout << a << endl;    // 20

  a = 10;
  a /= 2;
  cout << a << endl;    // 5

  a = 10;
  a %= 2;
  cout << a << endl;    // 0

  system("pause");

  return 0;
}

3.3 比較運(yùn)算符

作用:用于表達(dá)式的比較沛鸵,并返回一個(gè)真值或假值

比較運(yùn)算符有以下符號(hào):

運(yùn)算符 術(shù)語 示例 結(jié)果
== 相等于 4 == 3 0
!= 不等于 4 != 3 1
< 小于 4 < 3 0
> 大于 4 > 3 1
<= 小于等于 4 <= 3 0
>= 大于等于 4 >= 3 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;     // 1

  system("pause");

  return 0;
}

3.4 邏輯運(yùn)算符

作用:用于根據(jù)表達(dá)式的值返回真值或假值

邏輯運(yùn)算符有以下符號(hào):

運(yùn)算符 術(shù)語 示例 結(jié)果
! !a 如果a為假,則 !a 為真<br />如果a為真,則 !a 為假
&& a && b 如果a和b都為真曲掰,則結(jié)果為真疾捍;<br />否則為假
|| a || b 如果a和b又一個(gè)為真,則結(jié)果為真栏妖;<br />二者都為假時(shí)乱豆,結(jié)果為假

示例1:邏輯非

#include <iostream>
using namespace std;

//邏輯運(yùn)算符 --- 非   
int main()
{
  int a == 10;
  
  cout << !a << endl;       // 0
  cout << !!a << endl;  // 1
  
  system("pause");

  return 0;
}

總結(jié):真變假,假變真

示例2:邏輯與

#include <iostream>
using namespace std;

//邏輯運(yùn)算符 --- 與   
int main()
{
  int a = 10;
  int b = 20;
  
  cout << (a && b) << endl;     // 1
  
  a = 10;
  b = 0;
  
  cout << (a && b) << endl;     // 0
  
  a = 0;
  b = 0;
  
  cout << (a && b) << endl;     // 0
  
  system("pause");

  return 0;
}

總結(jié):同真為真吊趾,其余為假

示例3:邏輯或

#include <iostream>
using namespace std;

//邏輯運(yùn)算符 --- 或   
int main()
{
  int a = 10;
  int b = 20;
  
  cout << (a || b) << endl;     // 1
  
  a = 10;
  b = 0;
  
  cout << (a || b) << endl;     // 1
  
  a = 0;
  b = 0;
  
  cout << (a || b) << endl;     // 0
  
  system("pause");

  return 0;
}

總結(jié):同假為假宛裕,其余為真

4 程序流程結(jié)構(gòu)

C++支持最基本的三種程序運(yùn)行結(jié)構(gòu):順序結(jié)構(gòu),選擇結(jié)構(gòu)论泛,循環(huán)結(jié)構(gòu)

  • 順序結(jié)構(gòu):程序按順序運(yùn)行揩尸, 不發(fā)生跳轉(zhuǎn)
  • 選擇結(jié)構(gòu):依照條件是否滿足,有選擇地執(zhí)行相應(yīng)功能
  • 循環(huán)結(jié)構(gòu):依照條件是否滿足屁奏,循環(huán)多次執(zhí)行某段代碼

4.1 選擇循環(huán)

4.1.1 if語句

作用:執(zhí)行滿足條件的語句

if語句的三種形式:

  • 單行格式if語句
  • 多行格式if語句
  • 多條件的if語句
  1. 單行格式if語句 if(條件){ 條件滿足執(zhí)行的語句 }
st=>start: 開始
op=>operation: 執(zhí)行語句
cond=>condition: 判斷條件
e=>end: 結(jié)束

st->cond->op->e
cond(yes)->op
cond(no, right)->e

示例:

#include <iostream>
using namespace std;

int main()
{
  //選擇結(jié)構(gòu) - 單行if語句
  //輸入一個(gè)分?jǐn)?shù)岩榆,如果分?jǐn)?shù)大于600分,視為考上一本大學(xué)坟瓢,在屏幕上打印
  
  int score = 0;
  cout << "請(qǐng)輸入考試分?jǐn)?shù):";
  cin >> score;
  
  cout << "分?jǐn)?shù)為:" << score << endl;
  
  //if語句
  //注意事項(xiàng):在if判斷語句后面勇边,不要加分號(hào)
  if (score > 600)
  {
    cout << "我考上了一本大學(xué)!" << endl;
  }
  
  system("pause");

  return 0;
}
  1. 多行格式if語句 if(條件){ 條件滿足執(zhí)行的語句 } else{ 條件不滿足執(zhí)行的語句 }
st=>start: 開始
op1=>operation: 執(zhí)行語句1
op2=>operation: 執(zhí)行語句2
cond=>condition: 判斷條件
e=>end: 結(jié)束

st->cond
cond(yes)->op1->e
cond(no)->op2->e
#include <iostream>
using namespace std;

int main()
{
  //選擇結(jié)構(gòu) - 多行if語句

  int score = 0;
  cout << "請(qǐng)輸入考試分?jǐn)?shù):";
  cin >> score;
  
  cout << "分?jǐn)?shù)為:" << score << endl;
  
  if (score > 600)
  {
    cout << "我考上了一本大學(xué)载绿!" << endl;
  }
  else
  {
    cout << "我沒考上一本大學(xué)" << endl;
  }
  
  system("pause");

  return 0;
}
  1. 多條件的if語句 if(條件1){ 條件1滿足執(zhí)行的語句 }else if(條件2){ 條件2滿足執(zhí)行的語句 }... else{ 都不滿足執(zhí)行的語句 }
st=>start: 開始
op1=>operation: 執(zhí)行語句1
op2=>operation: 執(zhí)行語句2
op3=>operation: ...
opn=>operation: 執(zhí)行語句n
opn1=>operation: 執(zhí)行語句n+1
cond1=>condition: 判斷條件1
cond2=>condition: 判斷條件2
cond3=>condition: ......
condn=>condition: 判斷條件n
e=>end: 結(jié)束

st->cond1
cond1(yes)->op1->e
cond1(no)->cond2()
cond2(yes)->op2->e
cond2(no)->cond3()
cond3(yes)->op3->e
cond3(no)->condn()
condn(yes)->opn->e
condn(no)->opn1->e
#include <iostream>
using namespace std;

int main()
{
  //選擇結(jié)構(gòu) - 多條件的if語句

  int score = 0;
  cout << "請(qǐng)輸入考試分?jǐn)?shù):";
  cin >> score;
  
  cout << "分?jǐn)?shù)為:" << score << endl;
  
  if (score > 600)
  {
    cout << "我考上了一本大學(xué)粥诫!" << endl;
  }
  else if (score > 500)
  {
    cout << "我考上了二本大學(xué)!" << endl;
  }
  else if (score > 400)
  {
    cout << "我考上了三本大學(xué)崭庸!" << endl;
  }
  else
  {
    cout << "我沒考上本科" << endl;
  }
  
  system("pause");

  return 0;
}

嵌套if語句:在if語句中怀浆,可以嵌套使用if語句,達(dá)到更精確的條件判斷

案例需求:

  • 提示用輸入一個(gè)高考考試分?jǐn)?shù)怕享,根據(jù)分?jǐn)?shù)做如下判斷
  • 分?jǐn)?shù)如果大于600分視為考上一本执赡,大于500分考上二本,大于400考上三本函筋,其余視為未考上本科沙合;
  • 在一本分?jǐn)?shù)中,如果大于700分跌帐,考入北大首懈,大于650分,考入清華谨敛,大于600考入人大究履。

示例:

#include <iostream>
using namespace std;

int main()
{ 
  int score = 0;
  cout << "請(qǐng)輸入考試分?jǐn)?shù):";
  cin >> score;
  
  if (score > 600)
  {
    if (score > 700)
    {
      cout << "我考上了清華大學(xué)!" << endl;
    }
    else if (score > 650)
    {
      cout << "我考上了北京大學(xué)脸狸!" << endl;
    }
    else
    {
      cout << "我考上了人民大學(xué)最仑!" << endl;
    }
  }
  else if (score > 500)
  {
    cout << "我考上了二本大學(xué)藐俺!" << endl;
  }
  else if (score > 400)
  {
    cout << "我考上了三本大學(xué)!" << endl;
  }
  else
  {
    cout << "我沒考上本科" << endl;
  }
  
  system("pause");

  return 0;
}

練習(xí)案例:三只小豬稱體重

有三只小豬A泥彤、B欲芹、C,請(qǐng)分別輸入三只小豬的體重吟吝,并判斷哪只小豬最重菱父?

#include <iostream>
using namespace std;

int main()
{
  int weightA = 0;
  int weightB = 0;
  int weightC = 0;
  
  cout << "請(qǐng)輸入小豬A的體重:";
  cin >> weightA;
  
  cout << "請(qǐng)輸入小豬B的體重:";
  cin >> weightB;
  
  cout << "請(qǐng)輸入小豬C的體重:";
  cin >> weightC;
  
  cout << "小豬A的體重為:" << weightA<< endl;
  cout << "小豬B的體重為:" << weightB << endl;
  cout << "小豬C的體重為:" << weightC << endl;
  
  if (weightA > weightB)
  {
    if (weightA > weightC)
    {
      cout << "小豬A最重。" << endl;
    }
    else 
    {
      cout << "小豬C最重爸黄。" << endl;
    }
  }
  else
  {
    if (weightB > weightC)
    {
      cout << "小豬B最重滞伟。" << endl;
    }
    else 
    {
      cout << "小豬C最重。" << endl;
    }
  }
  
  system("pause");

  return 0;
}

4.1.2 三目運(yùn)算符

作用:通過三目運(yùn)算符實(shí)現(xiàn)簡(jiǎn)單的判斷

語法:表達(dá)式1 ? 表達(dá)式2 : 表達(dá)式3

解釋:

如果表達(dá)式1的值為真炕贵,執(zhí)行表達(dá)式2梆奈,并返回表達(dá)式2的結(jié)果;

如果表達(dá)式1的值為假称开,執(zhí)行表達(dá)式3亩钟,并返回表達(dá)式3的結(jié)果。

#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++中三目運(yùn)算符返回的是變量鳖轰,可以繼續(xù)賦值
  (a > b ? a : b) = 100;
  
  cout << "a = " << a << endl;
  cout << "b = " << b << endl;
  
  system("pause");

  return 0;
}

4.1.3 Switch語句

作用:執(zhí)行多條件分支語句

語法:

switch (表達(dá)式)
{
  case 結(jié)果1: 
    執(zhí)行語句;
    break;
  case 結(jié)果2: 
    執(zhí)行語句;
    break;
  ...
  default:
    執(zhí)行語句;
    break;
}

示例:

#include <iostream>
using namespace std;

int main()
{
  // 請(qǐng)給電影打分
  // 10~09  經(jīng)典
  // 08~07  非常好
  // 05~06  一般
  // 5分以下   爛片
  
  int score = 0;
  cout << "請(qǐng)給電影打分:";
  cin >> score;
  
  switch (score)
  {
    case 10:
    case 9:
      cout << "經(jīng)典" << endl;
      break;
    case 8:
    case 7:
      cout << "非常好" << endl;
      break;
    case 6:
    case 5:
      cout << "一般" << endl;
      break;
    default:
      cout << "爛片" << endl;
  }
  system("pause");

  return 0;
}

注意1:switch語句中表達(dá)式類型只能是整形或者字符型

注意2:case里如果沒有break清酥,那么程序會(huì)一直向下執(zhí)行

注意3:與if語句比,對(duì)于多條件判斷時(shí)蕴侣,switch的結(jié)構(gòu)清晰焰轻,執(zhí)行效率高,缺點(diǎn)是switch不可以判斷區(qū)間

4.2 結(jié)構(gòu)循環(huán)

4.2.1 while循環(huán)語句

作用:滿足循環(huán)條件昆雀,執(zhí)行循環(huán)語句

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

解釋:只要循環(huán)的結(jié)果為真辱志,就執(zhí)行循環(huán)語句

st=>start: 開始
cond=>condition: 循環(huán)條件
op=>operation: 執(zhí)行語句
e=>end: 結(jié)束

st(right)->cond
cond(yes)->op->cond
cond(no)->e

示例:

#include <iostream>
using namespace std;

int main()
{
  int num = 0;
  while (num < 10)
  {
    cout << "num = " << num << endl;
    num++;
  }
  
  system("pause");

  return 0;
}

注意:在執(zhí)行循環(huán)語句的時(shí)候,程序必須提供跳出循環(huán)的出口狞膘,否則出現(xiàn)死循環(huán)

while循環(huán)練習(xí)案例:猜數(shù)字

案例描述:系統(tǒng)隨生成一個(gè)1到100之間的數(shù)字揩懒,玩家進(jìn)行猜測(cè),如果猜錯(cuò)挽封,提示玩家數(shù)字過大或過小已球,如果猜對(duì)恭喜玩家勝利,并退出游戲辅愿。

#include <iostream>
#include <ctime>            //time系統(tǒng)時(shí)間頭文件包含
using namespace std;

int main()
{
  //添加隨機(jī)數(shù)種子智亮,利用當(dāng)前系統(tǒng)時(shí)間生成隨機(jī)數(shù),防止每次隨機(jī)數(shù)都一樣
  srand((unsigned int)time(NULL));
  
  int num = rand() % 100 + 1;
  int guess = 0;
  
  while (guess != num)
  {
    cout << "請(qǐng)輸入你的猜測(cè):";
    cin >> guess;
    
    if (guess > num)
    {
      cout << "猜測(cè)過大点待!" << endl;
    }
    else if (guess < num)
    {
      cout << 猜測(cè)過小
    }
    else
    {
      cout << "恭喜鸽素,猜對(duì)了!" << endl;
      //可以利用 break 關(guān)鍵字退出循環(huán)
    }
  }
  
  system("pause");

  return 0;
}

4.2.2 do...while循環(huán)語句

作用:滿足循環(huán)條件亦鳞,執(zhí)行循環(huán)語句

語法:do{ 循環(huán)語句 } while(循環(huán)條件)

注意:與while的區(qū)別在于do...while會(huì)先執(zhí)行一次循環(huán)語句,再判斷循環(huán)條件

st=>start: 開始
cond=>condition: 循環(huán)條件
op=>operation: 執(zhí)行語句
e=>end: 結(jié)束

st->op->cond
cond(yes, right)->op->cond
cond(no)->e

示例:

#include <iostream>
using namespace std;

int main()
{
  int num = 0;
  
  do
  {
    cout << "num = " << num << endl;
    num++;
  } while (num < 10);
  
  system("pause");

  return 0;
}

總結(jié):與while的區(qū)別在于do...while會(huì)先執(zhí)行一次循環(huán)語句,再判斷循環(huán)條件

練習(xí)案例:水仙花數(shù)

案例描述:水仙花數(shù)是指一個(gè)3位數(shù)燕差,它的每個(gè)位上的數(shù)字的3次冪之和等于它本身

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

請(qǐng)利用do...while語句遭笋,求出所有3位數(shù)中的水仙花數(shù)

#include <iostream>
#include <math.h>
using namespace std;

int main()
{
  int num = 100;

  do
  {
    if (pow(num % 10, 3) + pow((num / 10) % 10, 3) + pow(num / 100, 3) == num)
    {
      cout << num << endl;
    }
    num ++;
  } while (num < 1000);
  
  //system("pause");

  return 0;
}

4.2.3 for循環(huán)語句

作用:滿足循環(huán)條件,執(zhí)行循環(huán)語句

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

示例:

#include <iostream>
using namespace std;

int main()
{
  for(int i = 0; i < 10; i++)
  {
    cout << i << endl;
  }
  
  system("pause");
  
  return 0;
}

注意:for循環(huán)中的表達(dá)式徒探,要用分號(hào)進(jìn)行分割

總結(jié):while瓦呼,do...while,for都是開發(fā)中常用的循環(huán)語句测暗,for循環(huán)結(jié)構(gòu)比較清晰央串,比較常用

案例:敲桌子

從1開始數(shù)到數(shù)字100,如果數(shù)字個(gè)位含有7碗啄,或者數(shù)字十位含有7质和,或者該數(shù)字是7的倍數(shù),我們打印敲桌子稚字,其余數(shù)字直接打印輸出饲宿。

#include <iostream>
using namespace std;

int main()
{
  for(int i = 1; i < 101; i++)
  {
    if ((i % 7 == 0) || (i % 10 == 7) || (i / 10 == 7))
    {
      cout << "敲桌子," << endl;
    } 
    else
    {
      cout << i << endl;
    }
  }
  
  system("pause");
  
  return 0;
}

4.2.4 嵌套循環(huán)

作用:在循環(huán)體中再嵌套一層循環(huán)胆描,解決一些實(shí)際問題

示例:

#include <iostream>
using namespace std;

int main()
{
  for(int i = 0; i < 10; i++)
  {
    for(int j = 0; j < 10; j++)
    {
      cout << "* ";
    }
    cout << endl;
  }
  
  system("pause");
  
  return 0;
}

練習(xí)案例:乘法口訣表

案例描述:利用嵌套循環(huán)瘫想,實(shí)現(xiàn)九九乘法表

#include <iostream>
using namespace std;

int main()
{
  for(int i = 1; i < 10; i++)
  {
    for(int j = 1; j < i+1; j++)
    {
      cout << i << " × " << j << " = " << i*j << "\t";
    }
    cout << endl;
  }
  
  system("pause");
  
  return 0;
}

4.3 跳轉(zhuǎn)語句

4.2.1 break語句

作用:用于跳出選擇結(jié)構(gòu)或者循環(huán)結(jié)構(gòu)

break使用的時(shí)機(jī):

  • 出現(xiàn)在switch語句中,作用是中止case并跳出switch
  • 出現(xiàn)在循環(huán)語句中昌讲,作用是跳出當(dāng)前的循環(huán)語句
  • 出現(xiàn)在嵌套循環(huán)中国夜,跳出最近的內(nèi)層循環(huán)語句

示例1

#include <iostream>
using namespace std;

int main()
{
  //1、在switch語句中使用break
  cout << "請(qǐng)選擇您挑戰(zhàn)的副本難度:" << endl;
  cout << "1短绸。普通" << endl;
  cout << "2车吹。中等" << endl;
  cout << "3。困難" << endl;
  
  int num = 0;
  
  cin >> num;
  
  switch (num)
  {
    case 1:
      cout << "您選擇了普通難度" << endl;
      break;
    case 2:
      cout << "您選擇了中等難度" << endl;
      break;
    case 3:
      cout << "您選擇了困難難度" << endl;
      break;
    default:
      break;
  }
  
  system("pause");
  
  return 0;
}

示例2

#include <iostream>
using namespace std;

int main()
{
  //2鸠按、在循環(huán)語句中使用break
  for(int i = 0; i < 10; i++)
  {
    cout << i << endl;
    if (n == 5)
    {
      break;
    }
    
  }
  
  system("pause");
  
  return 0;
}

示例3

#include <iostream>
using namespace std;

int main()
{
  //3礼搁、在嵌套循環(huán)中使用break,跳出最近的內(nèi)層循環(huán)語句
  for(int i = 0; i < 10; i++)
  {
    for(int j = 0; j < 10; j++)
    {
      if (j == 5)
      {
        break;
      }
    }
  }
  
  system("pause");
  
  return 0;
}

4.3.2 continue語句

作用:在循環(huán)語句中目尖,跳過本次循環(huán)中余下尚未執(zhí)行的語句馒吴,繼續(xù)執(zhí)行下一次循環(huán)

示例

#include <iostream>
using namespace std;

int main()
{
  for(int i = 0; i < 100; i++)
  {
    if(i % 2 == 0) 
    {
      continue;
    }
    cout << i << endl;
  }
  
  system("pause");
  
  return 0;
}

注意:continue并沒有使整個(gè)循環(huán)停止,而break跳出循環(huán)

4.3.3 goto語句

作用:可以無條件跳轉(zhuǎn)語句

語法: goto 標(biāo)記;

解釋:如果標(biāo)記的名稱存在瑟曲,執(zhí)行到goto語句時(shí)饮戳,會(huì)跳轉(zhuǎn)到標(biāo)記的位置

示例

#include <iostream>
using namespace std;

int main()
{
  cout << "1" << endl;
  
  goto FLAG;
  
  cout << "2" << endl;
  cout << "3" << endl;
  cout << "4" << endl;
  
  FLAG:
  cout << "5" << endl;
  
  system("pause");
  
  return 0;
}

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

5 數(shù)組

5.1 概述

所謂數(shù)組洞拨,就是一個(gè)集合扯罐,里面里面存放了相同類型的數(shù)據(jù)元素

特點(diǎn)1:數(shù)組中的每個(gè)數(shù)據(jù)元素都是相同的數(shù)據(jù)類型

特點(diǎn)2:數(shù)組是由連續(xù)的內(nèi)存位置組成的

5.2 一維數(shù)組

5.2.1 一維數(shù)組定義方式

一維數(shù)組定義的三種方式

  1. 數(shù)據(jù)類型 數(shù)組名[ 數(shù)組長(zhǎng)度 ];
  2. 數(shù)據(jù)類型 數(shù)組名[ 數(shù)組長(zhǎng)度 ] = { 值1, 值2, ... };
  3. 數(shù)據(jù)類型 數(shù)組名[] = { 值1, 值2, ... };

示例

#include <iostream>
using namespace std;

int main()
{
  //定義方式1
  //數(shù)據(jù)類型 數(shù)組名[ 數(shù)組長(zhǎng)度 ];
  int score[10];
  
  //利用下標(biāo)賦值
  score[0] = 100;
  score[1] = 99;
  score[2] = 85;
  
  //利用下標(biāo)輸出
  for(int i = 0; i < 3; i++)
  {
    cout << score[i] << endl;
  }
  
  //定義方式2
  //數(shù)據(jù)類型 數(shù)組名[ 數(shù)組長(zhǎng)度 ] = { 值1, 值2, ... };
  //如果{}內(nèi)存不足[ 數(shù)組長(zhǎng)度 ]個(gè)數(shù)據(jù);剩余數(shù)據(jù)用0補(bǔ)全
  int score2[10] = {100, 90, 80, 70, 60, 50, 40, 30, 20, 10};
  
  for(int i = 0; i < 10; i++)
  {
    cout << score2[i] << endl;
  }
  
  //定義方式3
  //數(shù)據(jù)類型 數(shù)組名[ ] = { 值1, 值2, ... };
  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;
}

總結(jié)1:數(shù)組名的命名規(guī)范與變量名命名規(guī)范一致烦衣,不要和變量重名

總結(jié)2:數(shù)組中下標(biāo)是從0開始索引

5.2.2 一維數(shù)組組名

一維數(shù)組名稱的用途

  1. 可以統(tǒng)計(jì)整個(gè)數(shù)組在內(nèi)存中的長(zhǎng)度
  2. 可以統(tǒng)計(jì)數(shù)組在內(nèi)存中的首地址

示例

#include <iostream>
using namespace std;

int main()
{
  //數(shù)組名用途
  //1歹河、可以統(tǒng)計(jì)整個(gè)數(shù)組在內(nèi)存中的長(zhǎng)度
  int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  
  cout << "整個(gè)數(shù)組所占內(nèi)存空間為:" << sizeof(arr) << endl;
  cout << "每個(gè)元素所占內(nèi)存空間為:" << sizeof(arr[0]) << endl;
  cout << "數(shù)組的元素個(gè)數(shù)為:" << sizeof(arr) / sizeof(arr[0]) << endl;
  
  //2掩浙、可以統(tǒng)計(jì)數(shù)組在內(nèi)存中的首地址
  cout << "數(shù)組首地址為:" << arr << endl;
  cout << "數(shù)組中第一個(gè)元素的地址為:" << &arr[0] << endl;
  cout << "數(shù)組中第二個(gè)元素的地址為:" << &arr[1] << endl;
  
  //arr = 100;  錯(cuò)誤,數(shù)組名是常量秸歧,因此不可以賦值
  
  system("pause");
  
  return 0;
}

練習(xí)案例1:五只小豬稱體重

紊例描述:

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

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

#include <iostream>
using namespace std;

int main()
{
  int arr[5] = {300, 350, 200, 400, 250};
  int max = 0;
  
  for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
  {
    if (arr[i] > max)
    {
      //如果訪問的數(shù)組元素比已有的最大值還要大,更新最大值
      max = arr[i];
    }
  }
  
  cout << "最重的小豬體重為" << max << "kg键菱。\n";
  
  system("pause");
  
  return 0;
}

練習(xí)案例2:數(shù)組元素逆置

素例描述:請(qǐng)聲明一個(gè)5個(gè)元素的數(shù)組谬墙,并且將元素逆置

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

#include <iostream>
using namespace std;

int main()
{
  int arr[] = {1, 3, 2, 5, 4};
  
  int start = 0;
  int end = sizeof(arr) / sizeof(arr[0]) - 1;
  int temp = 0;
  
  cout << "逆置前:";
  for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
  {
    if(i == sizeof(arr) / sizeof(arr[0]) - 1) {cout << arr[i] << endl;} 
    else {cout << arr[i] << ", ";}
  }
  
  while (start < end)
  {
    temp = arr[start];
    arr[start] = arr[end];
    arr[end] = temp;
    
    start ++;
    end--;
  } 
  
  cout << "逆置后:";
  for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
  {
    if(i == sizeof(arr) / sizeof(arr[0]) - 1) {cout << arr[i] << endl;} 
    else {cout << arr[i] << ", ";}
  }
  
  system("pause");
  
  return 0;
}

5.2.3 冒泡排序

作用:最常用的排序算法经备,對(duì)數(shù)組內(nèi)元素進(jìn)行排序

  1. 比較相鄰的元素拭抬。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)侵蒙。
  2. 對(duì)每一組相鄰元素做同樣的工作造虎,執(zhí)行完畢后,找到第一個(gè)最大值蘑志。
  3. 重復(fù)以上的步驟累奈,每次次數(shù)-1,直到不需要比較

示例:將數(shù)組 {4, 2, 8, 0, 5, 7, 1, 3, 9} 進(jìn)行升序排列

#include <iostream>
using namespace std;

int main()
{
  int arr[] = {4, 2, 8, 0, 5, 7, 1, 3, 9};
  int temp = 0;

  cout << "排序前:";
  for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
  {
    if(i == sizeof(arr) / sizeof(arr[0]) - 1) {cout << arr[i] << endl;} 
    else {cout << arr[i] << ", ";}
  }

  //開始冒泡排序
  cout << sizeof(arr)/sizeof(arr[0]) << endl;
  for(int i = 0; i < (sizeof(arr)/sizeof(arr[0]) - 1); i++)
  {
    for(int j = 0; j < (sizeof(arr)/sizeof(arr[0]) - i - 1); j++)
    {
      if (arr[j] > arr[j + 1])
      {
        temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
      }
    }
  }

  cout << "排序后:";
  for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
  {
    if(i == sizeof(arr) / sizeof(arr[0]) - 1) {cout << arr[i] << endl;} 
    else {cout << arr[i] << ", ";}
  }

  system("pause");

  return 0;
}

5.3 二維數(shù)組

二維數(shù)組就是在一維數(shù)組上急但,多加一個(gè)維度澎媒。

5.3.1二維數(shù)組定義方式

二維數(shù)組定義的四種方式:

  1. 數(shù)組類型 數(shù)組名[ 行數(shù) ][ 列數(shù) ]
  2. 數(shù)組類型 數(shù)組名[ 行數(shù) ][ 列數(shù) ] = { { 數(shù)據(jù)1, 數(shù)據(jù)2, ... }, { 數(shù)據(jù)3, 數(shù)據(jù)4, ... } }
  3. 數(shù)組類型 數(shù)組名[ 行數(shù) ][ 列數(shù) ] = { 數(shù)據(jù)1, 數(shù)據(jù)2, 數(shù)據(jù)3, 數(shù)據(jù)4, ... }
  4. 數(shù)組類型 數(shù)組名[ ][ 列數(shù) ] = { 數(shù)據(jù)1, 數(shù)據(jù)2, 數(shù)據(jù)3, 數(shù)據(jù)4, ... }

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

示例:

#include <iostream>
using namespace std;

int main()
{
  //方式1
  //數(shù)組類型 數(shù)組名[ 行數(shù) ][ 列數(shù) ]
  int arr1[2][3];
  arr1[0][0] = 1;
  arr1[0][1] = 2;
  arr1[0][2] = 3;
  arr1[1][0] = 4;
  arr1[1][1] = 5;
  arr1[1][2] = 6;
  
  for(int i = 0; i < 2; i++)
  {
    for(int j = 0; j < 3; j++)
    {
      cout << arr1[i][j] << " ";
    }
    cout << endl;
  }
  
  //方式2
  //數(shù)組類型 數(shù)組名[ 行數(shù) ][ 列數(shù) ] = { 數(shù)據(jù)1, 數(shù)據(jù)2, ... }{ 數(shù)據(jù)3, 數(shù)據(jù)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;
  }
  
  
  //方式3
  //數(shù)組類型 數(shù)組名[ 行數(shù) ][ 列數(shù) ] = { 數(shù)據(jù)1, 數(shù)據(jù)2, 數(shù)據(jù)3, 數(shù)據(jù)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;
  }
  
  //方式4
  //數(shù)組類型 數(shù)組名[ ][ 列數(shù) ] = { 數(shù)據(jù)1, 數(shù)據(jù)2, 數(shù)據(jù)3, 數(shù)據(jù)4, ... }
  int arr3[][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;
}

總結(jié)L:在定義二維數(shù)組時(shí)戒努,如果初始化了數(shù)據(jù),可以省略行數(shù)

5.3.2 二維數(shù)組數(shù)組名

  • 查看二維數(shù)組所占內(nèi)存空間
  • 獲取二維數(shù)組的首地址
#include <iostream>
using namespace std;

int main()
{
  //二維數(shù)組數(shù)組名
  int arr[2][3] = 
{
    {1, 2, 3},
    {4, 5, 6}
  };
  
  //查看二維數(shù)組所占內(nèi)存空間
  cout << "二維數(shù)組占用內(nèi)存空間為:" << sizeof(arr) << endl;
  cout << "二維數(shù)組第一行占用內(nèi)存空間為:" << sizeof(arr[0]) << endl;
  cout << "二維數(shù)組第一個(gè)元素占用內(nèi)存空間為:" << sizeof(arr[0][0]) << endl;
  
  cout << "二維數(shù)組的行數(shù)為:" << sizeof(arr) / sizeof(arr[0]) << endl;
  cout << "二維數(shù)組的列數(shù)為:" << sizeof(arr[0]) / sizeof(arr[0][0]) << endl;
  
  //獲取二維數(shù)組的首地址
  cout << "二維數(shù)組的首地址為:" << arr << endl;
  cout << "二維數(shù)組第一行的首地址為:" << arr[0] << endl;
  cout << "二維數(shù)組第二行的首地址為:" << arr[1] << endl;
  
  cout << "二維數(shù)組第一個(gè)元素的首地址為:" << &arr[0][0] << endl;
  cout << "二維數(shù)組第二個(gè)元素的首地址為:" << &arr[0][1] << endl;
  
  system("pause");

  return 0;
}

5.3.3 二維數(shù)組應(yīng)用案例

考試成績(jī)統(tǒng)計(jì):

有三名同學(xué)(張三镐躲,李四储玫,王五),在一次考試中的成績(jī)分別如下表萤皂,請(qǐng)分別輸出三名同學(xué)的總成績(jī)

語文 數(shù)學(xué) 英語
張三 100 100 100
李四 90 50 100
王五 60 70 80
#include <iostream>
#include <string>
using namespace std;

int main()
{
  string names[3] = {"張三", "李四", "王五"};
  int scores[3][3] = 
  {
    {100, 100, 100},
    {90, 50, 100},
    {60, 70, 80}
  };
  int sum[3] = {0, 0, 0};
  
  for(int i = 0; i < 3; i++)
  {
    for(int j = 0; j < 3; j++)
    {
      sum[i] += scores[i][j];
    }
  }
  
  for(int i = 0; i < 3; i++)
  {
    cout << names[i] << "的總成績(jī)?yōu)椋? << sum[i] << endl;
  }
  
  system("pause");

  return 0;
}

6 函數(shù)

6.1 概述

作用:將一段經(jīng)常使用的代碼封裝起來撒穷,減少重復(fù)代碼

一個(gè)較大的程序,一般分為若干個(gè)程序塊裆熙,每個(gè)模塊實(shí)現(xiàn)特定的功能端礼。

6.2 函數(shù)的定義

函數(shù)的定義一般主要有5個(gè)步驟:

  1. 返回值類型
  2. 函數(shù)名
  3. 參數(shù)表列
  4. 函數(shù)體語句
  5. return表達(dá)式

語法:

返回值類型 函數(shù)名(參數(shù)列表)
{
  函數(shù)體語句;
  
  return 表達(dá)式;
}
  • 返回值類型:一個(gè)函數(shù)可以返回一個(gè)值。在函數(shù)定義中
  • 函數(shù)名:給函數(shù)起個(gè)名稱
  • 參數(shù)列表:使用該函數(shù)時(shí)入录,傳入的數(shù)據(jù)
  • 函數(shù)體語句:花括號(hào)內(nèi)的代碼蛤奥,函數(shù)內(nèi)需要執(zhí)行的語句
  • return表達(dá)式:和返回值類型掛鉤,函數(shù)執(zhí)行完后僚稿,返回相應(yīng)的數(shù)據(jù)

示例:定義一個(gè)加法函數(shù)凡桥,實(shí)現(xiàn)兩個(gè)數(shù)相加

#include <iostream>
using namespace std;

//定義函數(shù)
int add(int num1, int num2)
{
  int sum = num1 + num2;
  
  return sum;
}

int main()
{ 
  system("pause");

  return 0;
}

6.3 函數(shù)的調(diào)用

功能:使用定義好的函數(shù)

語法:函數(shù)名(參數(shù))

示例

#include <iostream>
using namespace std;

int add(int num1, int num2) //定義中的num1,num2成為形式參數(shù)蚀同,簡(jiǎn)稱“形參”
{
  int sum = num1 + num2;
  
  return sum;
}

int main()
{
  int a = 10;
  int b = 20;
  //調(diào)用add函數(shù)
  int sum = add(a, b);      //調(diào)用時(shí)的a缅刽,b成為實(shí)際參數(shù)啊掏,簡(jiǎn)稱“實(shí)參”
  cout << "sum = " << sum << endl;
  
  a = 100;
  b = 200;
  sum = add(a, b);
  cout << "sum = " << sun << endl;
  
  system("pause");

  return 0;
}

總結(jié):函數(shù)定義里小括號(hào)內(nèi)稱為形參,函數(shù)調(diào)用時(shí)傳入的參數(shù)稱為實(shí)參

6.4 值傳遞

  • 所謂值傳遞衰猛,就是函數(shù)調(diào)用時(shí)實(shí)參將數(shù)值傳入給形參
  • 值傳遞時(shí)脖律,如果形參發(fā)生,并不會(huì)影響實(shí)參

示例

#include <iostream>
using namespace std;

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;     當(dāng)函數(shù)聲明的時(shí)候腕侄,不需要返回值,可以不寫return
}

int main()
{
  int a = 10;
  int b = 20;
  
  cout << "main中的 a = " << a << endl;
  cout << "main中的 b = " << b << endl;
  
  swap(a, b);
  
  cout << "main中的 a = " << a << endl;
  cout << "main中的 b = " << b << endl;
  
  system("pause");
  
  return 0;
}

總結(jié):值傳遞時(shí)芦疏;形參是修試不了實(shí)參的

6.5 函數(shù)的常見樣式

常見的函數(shù)樣式有4種

  1. 無參無返
  2. 有參無返
  3. 無參有返
  4. 有參有返

示例

#include <iostream>
using namespace std;

//常見函數(shù)樣式
//1冕杠、無參無返
void test01()
{
  //void a = 10;        //無(void)類型不可以創(chuàng)建變量,因?yàn)闊o法分配內(nèi)存
  cout << "This is test 01. " << endl;
}
//2酸茴、有參無返
void test02(int a)
{
  cout << "This is test 02. You have passed " << a << endl;
}

//3分预、無參有返
int test03()
{
  cout << "This is test 03." << endl;
  return 1000;
}

//4、有參有返
int test04(int a)
{
  cout << "This is test 04. You have passed " << a << endl;
  return a;
}

int main()
{ 
  test01();                             //1薪捍、無參無返函數(shù)調(diào)用
  test02(15);                           //2笼痹、有參無返函數(shù)調(diào)用
  int num1 = test03();   //3、無參有返函數(shù)調(diào)用
  cout << "num1 = " << num1 << endl;
  int num2 = test04(10);    //4酪穿、有參有返函數(shù)調(diào)用
  cout << "num2 = " << num2 << endl;
  
  system("pause");
  
  return 0;
}

6.6 函數(shù)的聲明

作用:告訴編譯器函數(shù)名稱及如何調(diào)用函數(shù)凳干。

函數(shù)的實(shí)際主體可以單獨(dú)定義。函數(shù)的聲明可以多次被济,但是函數(shù)的定義只能有一次

示例

#include <iostream>
using namespace std;

//聲明可以多次救赐,定義只能一次
//聲明
int max(int a, int b);
int max(int a, int b);
//定義
int max(int a, int b)
{
  return a > b ? a : b;
}

int main()
{
  int a = 100;
  int b = 200;
  
  cout << max(a, b) << endl;
  
  system("pause");
  
  return 0;
}

6.7 函數(shù)的分文件編寫

作用:讓代碼結(jié)構(gòu)更加清晰

函數(shù)分文件編寫一般有4個(gè)步驟

  1. 創(chuàng)建后綴名為h的頭文件
  2. 創(chuàng)建后綴名為cpp的源文件
  3. 在頭文件中寫函數(shù)的聲明
  4. 在源文件中寫函數(shù)的定義

示例

//swap.h文件
#include <iostream>
using namespace std;

//實(shí)現(xiàn)兩個(gè)數(shù)字交換的函數(shù)聲明
void swap(int a, int b);
//swap.cpp文件
#include "swap.h"

void swap(int a, int b)
{
  int temp = a;
  a = b;
  b = temp;
  
  cout << "a = " << a << endl;
  cout << "b = " << b << endl;
}
//main.cpp文件
#include "swap.h"

int main()
{
  int a = 10;
  int b = 20;

  swap(a, b)
  
  system("pause");
  
  return 0;
}

7 指針

7.1指針的基本概念

指針的作用:可以通過指針間接訪問內(nèi)存

  • 內(nèi)存編號(hào)是從0開始記錄的,一般用十六進(jìn)制數(shù)字表示
  • 可以利用指針變量保存地址

7.2指針變量的定義和使用

指針變量定義語法:數(shù)據(jù)類型 * 變量名;

示例

#include <iostream>
using namespace std;

int main()
{
  //1只磷、指針的定義
  int a = 10;       //定義整形變量a
  
  //指針變量定義語法:數(shù)據(jù)類型 * 變量名;
  int * p;
  
  p = &a;       //指針指向變量a的地址
  cout << "a的地址為:" << &a << endl;   //打印數(shù)據(jù)a的地址
  cout << "指針p為:" << p << endl;      //打印指針變量p
  
  //2经磅、使用指針
  //可以通過解引用的方式來找到指針指向的內(nèi)存
  //指針前加 * 代表解引用,找到指針指向的內(nèi)存中的數(shù)據(jù)
  *p = 1000;
  cout << "a = " << a << endl;
  cout << "*p = " << *p << endl;
  
  system("pause");
  
  return 0;
}

7.3 指針?biāo)純?nèi)存空間

提問:指針也是種數(shù)據(jù)類型钮追,那么這種數(shù)據(jù)類型占用多少內(nèi)存空間预厌?

示例

#include <iostream>
using namespace std;

int main()
{
  int a = 10;

  int * p;
  p = &a;       //指針指向數(shù)據(jù)a的地址
  
  cout << *p << endl;       //*解引用
  
  //在32位操作系統(tǒng)下,指針占4個(gè)字節(jié)大小空間元媚,不管是什么數(shù)據(jù)類型
  //在64位操作系統(tǒng)下轧叽,指針占8個(gè)字節(jié)大小空間,不管是什么數(shù)據(jù)類型
  cout << sizeof(p) << endl;
  cout << sizeof(char *) << endl;
  cout << sizeof(float *) << endl;
  cout << sizeof(double *) << endl;
  
  system("pause");
  
  return 0;
}

7.4 空指針和野指針

空指針:指針變量指向內(nèi)存中編號(hào)為0的空間
用途:初始化指針變量
注意:空指針指向的內(nèi)存是不可以訪問的

示例1:空指針

#include <iostream>
using namespace std;

int main()
{
  //指針變量p指向內(nèi)存地址編號(hào)為的空間
  int * p = NULL;
  
  //訪問空指針報(bào)錯(cuò)
  //內(nèi)存編號(hào)0~255為系統(tǒng)占用內(nèi)存惠毁,不允許用戶訪問
  //cout << *p << endl;
  
  system("pause");
  
  return 0;
}

野指針:指針變量指向非法的內(nèi)存空間

示例

#include <iostream>
using namespace std;

int main()
{
  //指針變量p指向地址編號(hào)為0x1100空間
  int *p = (int *)0x1100;
  
  //訪問野指針報(bào)錯(cuò)
  cout << *p << endl;
  
  system("pause");
  
  return 0;
}

總結(jié):空指針和野指針都不是我們申請(qǐng)的空間犹芹,因此不要訪問。

7.5 const修飾指針

const修飾指針有三種情況:

  1. const修飾指針 -- 常量指針
  2. const修飾常量 -- 指針常量
  3. const即修飾指針鞠绰,又修飾常量

示例

#include <iostream>
using namespace std;

int main()
{
  int a = 10;
  int b = 10;
  
  //const修飾的是指針腰埂,指針指向可以改,指針指向的值不可以更改
  const int * p1 = &a;
  p1 = &b;      //正確
  //p1 = 100;   //報(bào)錯(cuò)
  
  //const修飾的是常量蜈膨,指針指向不可以改屿笼,指針指向的值可以更改
  int const p2 = &a;
  //p2 = &b;    //錯(cuò)誤
  p2 = 100;     //正確
  
  //const即修飾指針牺荠,又修飾常量,指針的指向和指針指向的值都不可以更改
  const int * const p3 = &a;
  //p3 = &b;    //錯(cuò)誤
  //p3 = 100;       //正確
  
  system("pause");
  
  return 0;
}

技巧:看const右側(cè)緊跟著的是指針還是常量驴一,是指針就是常量指針休雌,是常量就是指針常量

7.6 指針和數(shù)組

作用:利用指針訪問數(shù)組中元素

示例

#include <iostream>
using namespace std;

int main()
{
  int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  
  int * p = arr;        //指向數(shù)組的指針
  
  cout << "第一個(gè)元素:" << arr[0] << endl;
  cout << "指針訪問第一個(gè)元素" << *p << endl;
  
  for(int i = 0; i < 10; i++)
  {
    //利用指針遍歷數(shù)組
    cout << *p << endl;
    p++;        //讓指針向后偏移4(32位)/8(64位)個(gè)字節(jié)
  }
  
  system("pause");
  
  return 0;
}

7.7 指針和函數(shù)

作用:利用指針做函數(shù)參數(shù),可以修改實(shí)參的值

示例

#include <iostream>
using namespace std;

//值傳遞
void swap1(int a, int b)
{
  int temp = a;
  a = b;
  b = temp;
}

//地址傳遞
void swap2(int * p1, int * p2)
{
  int temp = *p1;
  *p1 = *p2;
  *p2 = temp;
}

int main()
{
  int a = 10;
  int b = 20;
  
  //值傳遞不會(huì)改變實(shí)參
  swap1(a, b);
  cout << "a = " << a << endl;
  cout << "b = " << b << endl;
  
  //如果是地址傳遞肝断,可以修飾實(shí)參
  swap2(&a, &b);
  cout << "a = " << a << endl;
  cout << "b = " << b << endl;
  
  system("pause");
  
  return 0;
}

總結(jié):如果不想修改實(shí)參杈曲,就用值傳遞;如果想修改實(shí)參胸懈,就用地址傳遞

7.8 指針担扑、數(shù)組、函數(shù)

案例描述:封裝一個(gè)函數(shù)趣钱,利用冒泡排序涌献,實(shí)現(xiàn)對(duì)整形數(shù)組的升序排序

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

示例

#include <iostream>
using namespace std;

//冒泡排序函數(shù)
void bubbleSort(int * arr, int len)     //int * arr 也可以寫為 int arr[]
{
  int temp = 0;
  
  for(int i = 0; i < len - 1; i++)
  {
    for(int j = 0; j < len - i - 1; j++)
    {
      if (arr[j] > arr[j + 1])
      {
        temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
      }
    }
  }
}

//打印數(shù)組
void printArray(int * arr, int len)
{
  for(int i = 0; i < len; i++)
  {
    if(i == len - 1)
    {
      cout << arr[i] << endl;
    }
    else
    {
      cout << arr[i] << ", ";
    }
  }
}

int main()
{
  int arr[10] = {4, 3, 6, 9, 1, 2, 10, 8, 7, 5};
  
  int len = sizeof(arr) / sizeof(arr[0]);
  
  cout << "排序前:";
  printArray(arr, len);
  
  bubbleSort(arr, len);
  
  cout << "排序后:";
  printArray(arr, len);
  
  system("pause");
  
  return 0;
}

8 結(jié)構(gòu)體

8.1 結(jié)構(gòu)體基本概念

結(jié)構(gòu)體屬于用戶自定義的數(shù)據(jù)類型,允許用戶存儲(chǔ)不同的數(shù)據(jù)類型

8.2結(jié)構(gòu)體定義和使用

語法:struct 結(jié)構(gòu)體名結(jié) 構(gòu)體成員列表;

通過結(jié)構(gòu)體創(chuàng)建變量的方式有三種:

  • struct 結(jié)構(gòu)體名 變量名;
  • struct 結(jié)構(gòu)體名 變量名 = {成員1值, 成員2值, ...};
  • 定義結(jié)構(gòu)體時(shí)順便創(chuàng)建變量

示例

#include <iostream>
#include <string>
using namespace std;

//結(jié)構(gòu)體定義
struct student
{
  //成員列表
  string name;  //姓名
  int age;          //年齡
  int score;        //分?jǐn)?shù)
}s3;    //定義結(jié)構(gòu)體時(shí)順便創(chuàng)建變量

int main()
{
  //通過結(jié)構(gòu)體創(chuàng)建變量
  //struct 結(jié)構(gòu)體名 變量名
  //struct關(guān)鍵字可以省略
  struct student s1;
  //給s1賦值首有,通過 . 訪問結(jié)構(gòu)體變量中的屬性
  s1.name = "張三";
  s1.age = 18;
  s1.score = 100;
  cout << "姓名:" << s1.name << "\t年齡:" << s1.age << "\t分?jǐn)?shù):" << s1.score << endl;
    
  //struct 結(jié)構(gòu)體名 變量名 = {成員1值, 成員2值, ...}
  struct student s2 = {"李四", 19, 80};
  cout << "姓名:" << s2.name << "\t年齡:" << s2.age << "\t分?jǐn)?shù):" << s2.score << endl;
  
  //定義結(jié)構(gòu)體時(shí)順便創(chuàng)建變量
  s3.name = "王五";
  s3.age = 20;
  s3.score = 60;
  cout << "姓名:" << s3.name << "\t年齡:" << s3.age << "\t分?jǐn)?shù):" << s3.score << endl;
  
  system("pause");
  
  return 0;
}

總結(jié)1:定義結(jié)構(gòu)體時(shí)的關(guān)鍵字是struct燕垃,不可省略

總結(jié)2:創(chuàng)建結(jié)構(gòu)體變量時(shí),關(guān)鍵字struct可以省略

總結(jié)3:結(jié)構(gòu)體變量利用操作符"."訪問成員

8.3 結(jié)構(gòu)體數(shù)組

作用:將自定義的結(jié)構(gòu)體放入到數(shù)組中方便維護(hù)

語法:struct 結(jié)構(gòu)體名 數(shù)組名[元素個(gè)數(shù)] = { {}, {}, ... }

示例

#include <iostream>
#include <string>
using namespace std;

//結(jié)構(gòu)體定義
struct student
{
  //成員列表
  string name;  //姓名
  int age;          //年齡
  int score;        //分?jǐn)?shù)
};

int main()
{
  //結(jié)構(gòu)體數(shù)組
  struct student arr[] = 
  {
    {"張三", 18, 100},
    {"李四", 19, 80},
    {"王五", 20, 60}
  };
  
  //給結(jié)構(gòu)體數(shù)組中的元素賦值
  arr[2].name = "趙六";
  arr[2].age = 38;
  arr[2].age = 50;
  
  //遍歷結(jié)構(gòu)體數(shù)組
  for(int i = 0; i < 3; i++)
  {
    cout << "姓名:" << arr[i].name << "\t年齡:" << arr[i].age << "\t分?jǐn)?shù):" << arr[i].score << endl;
  }
  
  system("pause");

  return 0;
}

8.4 結(jié)構(gòu)體指針

作用:通過指針訪問結(jié)構(gòu)體中的成員

  • 利用操作符->可以通過結(jié)構(gòu)體指針訪問結(jié)構(gòu)體屬性

示例

#include <iostream>
#include <string>
using namespace std;

//結(jié)構(gòu)體定義
struct student
{
  //成員列表
  string name;  //姓名
  int age;          //年齡
  int score;        //分?jǐn)?shù)
};

int main()
{
  struct student stu = {"張三", 18, 100};
  
  //通過指針指向結(jié)構(gòu)體變量
  struct student * p = &stu;
  
  //通過指針訪問結(jié)構(gòu)體中的變量
  p->score = 80;        //指針通過 -> 操作符可以訪問成員 
  cout << "姓名:" << p->name << "\t年齡" << p->age << "\t"
  
  system("pause");

  return 0;
}

結(jié)構(gòu)體指針可以通過->操作符來訪問結(jié)構(gòu)體中的成員

8.5 結(jié)構(gòu)體嵌套結(jié)構(gòu)體

作用:結(jié)構(gòu)體重的成員可以是另一個(gè)結(jié)構(gòu)體

例如:每個(gè)老師輔導(dǎo)一個(gè)學(xué)員井联,一個(gè)老師的結(jié)構(gòu)體中卜壕,記錄一個(gè)學(xué)生的結(jié)構(gòu)體

示例

#include <iostream>
#include <string>
using namespace std;

//學(xué)生結(jié)構(gòu)體定義
struct student
{
  //成員列表
  string name;  //姓名
  int age;          //年齡
  int score;        //分?jǐn)?shù)
};

//教師結(jié)構(gòu)體定義
struct teacher
{
  //成員列表
  int id;                //職工編號(hào)
  string name;  //姓名
  int age;          //教師年齡
  struct student stu;   //子結(jié)構(gòu)體 學(xué)生
};

int main()
{
  //創(chuàng)建老師
  teacher t;
  t.id = 10000;
  t.name = "老王";
  t.age = 50;
  t.stu.name = "小王";
  t.stu.age = 20;
  t.stu.score = 90;
  
  cout << "老師姓名:" << t.name << "\t職工編號(hào):" << t.id << "\t老師年齡:" << t.score << endl;
  cout << "學(xué)生姓名:" << t.stu.name << "\t年齡" << t.stu.age << "\t考試分?jǐn)?shù):" << t.stu.score << endl;
  
  system("pause");

  return 0;
}

總結(jié):在結(jié)構(gòu)體中可以定義另一個(gè)結(jié)構(gòu)體作為成員,用來解決實(shí)際問題

8.6 結(jié)構(gòu)體做函數(shù)參數(shù)

作用:將結(jié)構(gòu)體作為參數(shù)向函數(shù)中傳遞

傳遞方式有兩種:

  • 值傳遞
  • 地址傳遞

示例

#include <iostream>
#include <string>
using namespace std;

//學(xué)生結(jié)構(gòu)體定義
struct student
{
  //成員列表
  string name;  //姓名
  int age;          //年齡
  int score;        //分?jǐn)?shù)
};

//值傳遞
void printStudent1(struct student s)
{
  s.age = 28;
  cout << "子函數(shù)1中\(zhòng)t姓名:" << s.name << "\t年齡" << s.age << "\t考試分?jǐn)?shù):" << s.score << endl;
}

//地址傳遞
void printStudent2(struct student * p)
{
  p->age = 28;
  cout << "子函數(shù)2中\(zhòng)t姓名:" << p->name << "\t年齡" << p->age << "\t考試分?jǐn)?shù):" << p->score << endl;
}

int main()
{
  //創(chuàng)建結(jié)構(gòu)體變量
  struct student s = {"張三", 20, 85};
  cout << "main函數(shù)中\(zhòng)t姓名:" << s.name << "\t年齡" << s.age << "\t考試分?jǐn)?shù):" << s.score << endl;
  
  //值傳遞
  printStudent1(s);
  cout << "main函數(shù)中\(zhòng)t姓名:" << s.name << "\t年齡" << s.age << "\t考試分?jǐn)?shù):" << s.score << endl;
  
  //地址傳遞
  printStudent2(&s);
  cout << "main函數(shù)中\(zhòng)t姓名:" << s.name << "\t年齡" << s.age << "\t考試分?jǐn)?shù):" << s.score << endl;
  
  system("pause");

  return 0;
}

總結(jié):如果不想修改主函數(shù)中的數(shù)據(jù)低矮,用值傳遞印叁,反之用地址傳遞

8.7 結(jié)構(gòu)體中const使用場(chǎng)景

作用:const來防止誤操作

示例

#include <iostream>
#include <string>
using namespace std;

//學(xué)生結(jié)構(gòu)體定義
struct student
{
  //成員列表
  string name;  //姓名
  int age;          //年齡
  int score;        //分?jǐn)?shù)
};

//const使用場(chǎng)景
//將函數(shù)中的形參改為指針,可以節(jié)省內(nèi)存空間军掂,而且不會(huì)復(fù)制新的副本
void printStudent(const struct student * p) //加const防止函數(shù)體中的誤操作
{
  //stu->age = 100      //操作失敗轮蜕,因?yàn)榧恿薱onst修飾
  cout << "姓名:" << p->name << "\t年齡" << p->age << "\t考試分?jǐn)?shù):" << p->score << endl;
}

int main()
{
  struct student s = {"張三", 18, 100};
  
  printStudent(&s);
  
  system("pause");

  return 0;
}

8.8 結(jié)構(gòu)體案例

8.8.1 案例1

案例描述:

學(xué)校正在做畢設(shè)項(xiàng)目,每名老師帶領(lǐng)5個(gè)學(xué)生蝗锥,總共有3名老師跃洛,需求如下

  • 設(shè)計(jì)學(xué)生和老師的結(jié)構(gòu)體,其中在老師的結(jié)構(gòu)體中终议,有老師姓名和一個(gè)存放5名學(xué)生的數(shù)組作為成員
  • 學(xué)生的成員有姓名汇竭、考試分?jǐn)?shù),創(chuàng)建數(shù)組存放3名老師穴张,通過函數(shù)給每個(gè)老師及所帶的學(xué)生賦值
  • 最終打印出老師數(shù)據(jù)以及老師所帶的學(xué)生數(shù)據(jù)细燎。

示例

#include <iostream>
#include <string>
#include <ctime>
using namespace std;

struct student
{
  string sName;
  int score;
};

struct teacher
{
  string tName;
  struct student sArray[5];
};

//給老師和學(xué)生賦值的函數(shù)
void allocateSpace(struct teacher tArray[], int len)
{
  //給老師賦值
  string nameSeed = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  
  for(int i = 0; i < len; i++)
  {
    tArray[i].tName = "Teacher_";
    tArray[i].tName += nameSeed[i];
    
    //給每名老師的學(xué)生賦值
    for(int j = 0; j < 5; j++)
    {
      tArray[i].sArray[j].sName = "Student_";
      tArray[i].sArray[j].sName += nameSeed[j];
      
      tArray[i].sArray[j].score = rand() % 61 + 40;     // 40 - 100
    }
  }
}

//打印所有的信息
void printInfo(struct teacher tArray[], int len)
{
  for(int i = 0; i < len; i++)
  {
    cout << "教師姓名:" << tArray[i].tName << endl;
    
    for(int j = 0; j < 5; j++)
    {
      cout << "\t學(xué)生姓名:" << tArray[i].sArray[j].sName 
           << "\t考試分?jǐn)?shù):" << tArray[i].sArray[j].score << endl;
    }
  }
}

int main()
{
  //隨機(jī)數(shù)種子
  srand((unsigned int)time(NULL));
  
  struct teacher tArray[3];
  
  int len = sizeof(tArray) / sizeof(tArray[0]);
  
  allocateSpace(tArray, len);
  
  printInfo(tArray, len);
  
  system("pause");
  
  return 0;
}

8.8.2 案例2

案例描述:

設(shè)計(jì)一個(gè)英雄的結(jié)構(gòu)體,包括成員姓名皂甘,年齡玻驻,性別;創(chuàng)建結(jié)構(gòu)體數(shù)組,數(shù)組中存放5名英雄

通過冒泡排序的算法璧瞬,將數(shù)組中的英雄按照年齡進(jìn)行升序排序户辫,最終打印排序后的結(jié)果。

五名英雄信息如下:

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

示例

#include <iostream>
#include <string>
using namespace std;

//英雄的結(jié)構(gòu)體
struct hero
{
  string name;
  int age;
  string gender;
};

void printHero(struct hero heroArray[], int len)
{
  for(int i = 0; i < len; i++)
  {
    cout << "姓名:" << heroArray[i].name << "\t年齡" << heroArray[i].age 
         << "\t性別" << heroArray[i].gender << endl;
  }
}

void bubbleSort(struct hero heroArray[], int len)
{
  struct hero temp;
  
  for(int i = 0; i < len - 1; i++)
  {
    for(int j = 0; j < len - i - 1; j++)
    {
      if (heroArray[j].age > heroArray[j + 1].age)
      {
        temp = heroArray[j];
        heroArray[j] = heroArray[j + 1];
        heroArray[j + 1] = temp;
      }
    }
  }
}

int main()
{
  struct hero heroArray[5] = 
  {
    {"劉備", 23, "男"},
    {"關(guān)羽", 22, "男"},
    {"張飛", 20, "男"},
    {"趙云", 21, "男"}, 
    {"貂蟬", 19, "女"}
  };
  int len = sizeof(heroArray) / sizeof(heroArray[0]);
  
  cout << "排序前:\n";
  printHero(heroArray, len);
  
  bubbleSort(heroArray, len);
  
  cout << "排序后:\n";
  printHero(heroArray, len);
  
  system("pause");
  
  return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嗤锉,一起剝皮案震驚了整個(gè)濱河市渔欢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘟忱,老刑警劉巖奥额,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異访诱,居然都是意外死亡披坏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門盐数,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人伞梯,你說我怎么就攤上這事玫氢。” “怎么了谜诫?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵漾峡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我喻旷,道長(zhǎng)生逸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任且预,我火速辦了婚禮槽袄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锋谐。我一直安慰自己遍尺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布涮拗。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪欧啤。 梳的紋絲不亂的頭發(fā)上脯爪,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音就漾,去河邊找鬼呐能。 笑死,一個(gè)胖子當(dāng)著我的面吹牛从藤,可吹牛的內(nèi)容都是我干的催跪。 我是一名探鬼主播锁蠕,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼懊蒸!你這毒婦竟也來了荣倾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤骑丸,失蹤者是張志新(化名)和其女友劉穎舌仍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體通危,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铸豁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了菊碟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片节芥。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖逆害,靈堂內(nèi)的尸體忽然破棺而出头镊,到底是詐尸還是另有隱情,我是刑警寧澤魄幕,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布相艇,位于F島的核電站,受9級(jí)特大地震影響纯陨,放射性物質(zhì)發(fā)生泄漏坛芽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一翼抠、第九天 我趴在偏房一處隱蔽的房頂上張望咙轩。 院中可真熱鬧,春花似錦阴颖、人聲如沸臭墨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胧弛。三九已至,卻和暖如春侠畔,著一層夾襖步出監(jiān)牢的瞬間结缚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工软棺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留红竭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像茵宪,于是被迫代替她去往敵國和親最冰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344