本文章是本人黑馬程序員 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 注釋
作用:在代碼中加一些說明和解釋腥放,方便自己或其他程序員閱讀代碼
兩種格式
-
單行注釋:
//描述信息
- 通常放在一行代碼的上方淑际,或者一條語句的末尾淀零,對(duì)該行代碼說明
-
多行注釋:/* 描述信息 */
- 通常放在一段代碼的上方滔灶,對(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方式
-
#define 宏常量:
#define 常量名 常量值
- 通常在文件上方定義,表示一個(gè)常量
-
const修飾的變量:
const 數(shù)據(jù)類型 常量名 = 常量值
-
通常在變量定義前加關(guān)鍵字
const
,修飾該變量為常量篱竭,不可修改
-
通常在變量定義前加關(guān)鍵字
示例
#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)型變量分為兩種:
- 單精度 float
- 雙精度 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碼大致由以下兩部分組成
- ASCII非打印控制字符:ASCII表上的數(shù)字0-31分配給了控制字符樟蠕,用于控制像打印機(jī)等一些外圍設(shè)備钳宪。
- 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)格
-
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ò)起來
-
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è)值:
-
true
——真(本質(zhì)是1) -
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語句
- 單行格式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;
}
- 多行格式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;
}
- 多條件的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ù)組定義的三種方式
數(shù)據(jù)類型 數(shù)組名[ 數(shù)組長(zhǎng)度 ];
數(shù)據(jù)類型 數(shù)組名[ 數(shù)組長(zhǎng)度 ] = { 值1, 值2, ... };
數(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ù)組名稱的用途:
- 可以統(tǒng)計(jì)整個(gè)數(shù)組在內(nèi)存中的長(zhǎng)度
- 可以統(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)行排序
- 比較相鄰的元素拭抬。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)侵蒙。
- 對(duì)每一組相鄰元素做同樣的工作造虎,執(zhí)行完畢后,找到第一個(gè)最大值蘑志。
- 重復(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ù)組定義的四種方式:
數(shù)組類型 數(shù)組名[ 行數(shù) ][ 列數(shù) ]
數(shù)組類型 數(shù)組名[ 行數(shù) ][ 列數(shù) ] = { { 數(shù)據(jù)1, 數(shù)據(jù)2, ... }, { 數(shù)據(jù)3, 數(shù)據(jù)4, ... } }
數(shù)組類型 數(shù)組名[ 行數(shù) ][ 列數(shù) ] = { 數(shù)據(jù)1, 數(shù)據(jù)2, 數(shù)據(jù)3, 數(shù)據(jù)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è)步驟:
- 返回值類型
- 函數(shù)名
- 參數(shù)表列
- 函數(shù)體語句
- 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種
- 無參無返
- 有參無返
- 無參有返
- 有參有返
示例
#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è)步驟
- 創(chuàng)建后綴名為h的頭文件
- 創(chuàng)建后綴名為cpp的源文件
- 在頭文件中寫函數(shù)的聲明
- 在源文件中寫函數(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修飾指針有三種情況:
- const修飾指針 -- 常量指針
- const修飾常量 -- 指針常量
- 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;
}