七、判斷(二) 引:學校舉辦了一個抽獎獲得,根據學號給予學生獎勵,學生獎勵如下: 學號 獎勵 15692 現金500 65432 現金450 98741 現金250 2531 現金150 666 學號*2 321 學號*2 //if語句實現 #include <iostream> int main( ...
七、判斷(二)
引:學校舉辦了一個抽獎獲得,根據學號給予學生獎勵,學生獎勵如下:
學號 | 獎勵 |
---|---|
15692 | 現金500 |
65432 | 現金450 |
98741 | 現金250 |
2531 | 現金150 |
666 | 學號*2 |
321 | 學號*2 |
//if語句實現
#include <iostream>
int main()
{
unsigned int sId{}, sPr{}; //定義學生學號和獎勵
std::cout << "請輸入你的學號:";
std::cin >> sId;
if (sId == 15692) sPr = 500;
if (sId == 65432) sPr = 450;
if (sId == 98741) sPr = 250;
if (sId == 2531) sPr = 150;
if (sId == 666) sPr = sId*2;
if (sId == 321) sPr = sId*2;
std::cout << "恭喜你獲得了獎學金" << sPr << "人民幣";
}
1、switch語句
註:if語句中的條件是一個bool類型值,switch語句的條件是一個整數值
1)switch語法
//switch語法
switch(值) //值是一個整數值,裡面的值不管是小數還是其他類型的值預設都會轉化為整數類型
{
case 選項1: //選項和switch中的值進行比較
break;
case 選項2:
break;
case 選項3:
case 選項4:
break;
default: //前面的選項沒有的一律會進入default,需要再加個break返回
break;
}
2)上述案例實現
//switch實現用戶抽獎
#include <iostream>
int main()
{
unsigned int sId, sPr{}; //定義學生學號和獎勵
std::cout << "請輸入你的學號:";
std::cin >> sId;
switch(sId)
{
case 15692:
sPr = 500;
break; //遇到break跳出switch語句
case 65432:
sPr = 450;
break;
case 98741:
sPr = 250;
break;
case 2531:
sPr = 150;
break;
case 666: //等於666,因沒有break,自動執行下麵的語句,同樣使得sId*2
case 321:
sPr = sId*2; //等同於sId << 1;
break;
default: //上述條件都未滿足,則執行default中的代碼
std::cout << "對不起,你未參加本次的抽獎!!";
break;
}
if(sPr)std::cout << "恭喜你獲得了獎學金" << sPr << "人民幣"; //Spr==0不執行該語句
}
3)switch語法C++17升級內容【fallthrough】
switch(值)
{
case 選項1:
break;
case 選項2:
break;
case 選項3:
[[fallthrough]]; //貫穿選項。表示選項3以後直接執行選項4,而不是因為開發人員漏寫了break
case 選項4:
break;
default:
break;
}
2、語句塊中的變數聲明方式
1)if語句
①if語句中臨時變數的聲明
if(條件)
{
變數聲明; //變數在哪用,在那聲明
}
else
{
變數聲明; //上面定義的變數,在else中無法使用
}
②c++17新語法中臨時變數的聲明
if(變數聲明;條件) //if(int a;a>0){ }else{ }
{
變數使用; //if中聲明的變數,在if代碼塊和else代碼塊中都可以使用
}
else
{
變數使用
}
2)switch語句中臨時變數的聲明
switch(變數聲明,值) //switch(int a{},300){...}
{
case 選項1:
break;
case 選項2:
break;
default:
break;
}
3、C語言格式化輸出流及轉義
1)printf格式化輸出
字元 | 含義 | 示例 |
---|---|---|
d | 十進位整數 | print("我叫%s,年齡%d","張三",20); |
o | 八進位整數 | |
u | 無符號十進位整數 | 將負號去掉 |
x/X | 十六進位整數 | |
f | float小數 | |
lf | double小數 | |
s | 字元串 | |
0 | 用0來補齊 | %05d即00001 |
+ | 替數字輸出符號%+ d | %+05d 會將符號表述出來 |
#include <iostream>
int main()
{
int age{ 18 };
printf("你好,世界!!!\n");
printf("我叫%s,我的年齡%d歲", "張三\n",age);
printf("0x%X\n",age); //十六進位輸出
printf("%05d\n", age); //字元對其
printf("%+d", age); //輸出符號
}
2)scanf格式化輸入
字元 | 含義 |
---|---|
d | 十進位整數 |
o | 八進位整數 |
u | 無符號十進位整數 |
x/X | 十六進位整數 |
f | float小數 |
lf | double小數 |
s | 字元串%s |
#include <iostream>
int main()
{
int age{ };
printf("請輸入你的年齡:");
scanf_s("%d",&age);
printf("輸入的年齡為:%d",age);
}
註:**&為取值運算符,&a,表示取a的地址
3)無顯示的輸入
//輸入鍵盤上的字元後,不顯示到屏幕上
#include <iostream>
#include <conio.h>
int main()
{
int uin = _getch(); //輸入一個字元,會將輸入的字元或者數字,通過ASCII表翻譯成整數(輸入的是鍵盤按鍵的值)
std::cout << "你輸入的字元為:"<<uin << std::endl;
}
4、goto語句
1)goto語句語法
//goto語法
標簽:
goto 標簽;
註:goto常和判斷一起使用
2)案例:
//goto案例
#include <iostream>
int main()
{
char a;
linput:
printf("請輸入一個大寫字母:");
std::cin >> a;
if (a > 64 && a < 91)
{
a += 32;
std::cout << "轉化後的小寫字母為:" << a << std::endl;
goto linput; //跳到標簽定義的位置,重覆執行
}
else
{
printf("你輸入的內容不符合要求,請重新輸入\n");
goto linput; //跳到標簽定義的位置,重覆執行
}
}
5、案例:網銀證書密碼攻擊(安全實驗)
需求:設計一個系統來模擬網銀密碼被攻擊的場景,用戶輸入一個6位的數字密碼,然後我們破解它的密碼
#include <iostream>
#include <conio.h>
int main()
{
linput:
int password,repassword;
std::cout << "請輸入一個6位數數字密碼:";
std::cin >> password;
std::cout << "請你再數一次你的數字密碼:";
std::cin >> repassword;
if (password == repassword)
{
if (password > 999999) goto linput;
system("cls");
std::cout << "密碼設置成功,請按任意鍵進入密碼破解系統\n";
_getch();
int testpass{};
lhack:
if (testpass != password)
{
testpass++;
goto lhack;
}
else std::cout << "密碼為:" << testpass;
}
else goto linput;
}
6、if語句和switch語句的出場時機
註:switch語句效率比if語句的效率高,超過3個判斷儘量使用switch
cmp指令表示比較;jmp相當於goto,進行跳轉
7、項目:設置游戲技能
需求:設計麟江湖的技能釋放模型,要求用戶按下相應技能快捷鍵後開始釋放技能,技能數據如下,假設角色的當前等級下最高內力為1000,最高生命為3000,基礎攻擊力為50
快捷鍵 | 技能名稱 | 技能效果 |
---|---|---|
1 | 治愈 | 消耗100內力,生命值恢復最大生命值的10% |
2 | 金剛掌 | 消耗50內力,對遠程目標造成基礎攻擊+50點傷害 |
3 | 麻痹數 | 消耗50內力,禁止目標攻擊三個回合 |
4 | 鷹抓功 | 10個回合內,對目標造成傷害將恢復傷害量20%的內力傷害量60%的生命 |
5 | 絕處逢生 | 消耗100內力,對目標造成基礎攻擊+已損失血量的傷害 |
6 | 易筋經 | 消耗300內力,將內力和生命值進行互換,攻擊力提高1000% |
#include <iostream>
#include <conio.h>
struct Role
{
int Hp;
int maxHp;
int Mp;
int maxMp;
int act; //攻擊力
int cantact; //禁止攻擊
int bufcount; //回合
bool cant;
};
int main()
{
int inkey, damage;
Role user{ 3000,3000,1000,1000,50,0,false };
Role boss{ 30000,30000,1000,1000,190,0,false };
lfight:
system("cls");
printf("生命[%d/%d] BOSS生命[%d/%d]\n",user.Hp,user.maxHp,boss.Hp,boss.maxHp);
printf("內力[%d/%d] 攻擊力[%d]\n", user.Mp, user.maxMp, user.act);
printf("請輸入你的技能:");
inkey = _getch();
damage = 0;
switch(inkey)
{
case 49:
if (user.Mp > 99)
{
user.Mp -= 100;
user.Hp += 300;
user.Hp = user.Hp > user.maxHp ? user.maxHp : user.Hp;
}
break;
case 50:
if (user.Mp >= 50)
{
user.Mp -= 50;
user.Hp -= 50 + user.act;
}
break;
case 51:
if (user.Mp >= 50)
{
user.Mp -= 50;
boss.cantact = 3;
}
break;
case 52:
user.bufcount = 10;
break;
case 53:
if (user.Mp >= 100)
{
user.Mp -= 100;
damage = user.maxHp - user.Hp + user.act;
}
break;
case 54:
if ((user.Mp >= 300) && (!user.cant))
{
int ls = user.maxHp;
user.maxHp = user.maxMp;
user.maxMp = ls;
ls = user.Hp;
user.Hp = user.Mp;
user.Mp = ls;
user.act *= 10;
user.cant = true;
}
break;
}
if (boss.cantact > 0)
{
boss.cantact--;
}
else user.Hp -= boss.act;
boss.Hp -= damage;
if (user.bufcount > 0)
{
user.bufcount--;
user.Hp += damage * 0.6;
user.Mp += damage * 0.2;
user.Hp = user.Hp > user.maxHp ? user.maxHp : user.Hp;
user.Mp = user.Mp > user.maxMp ? user.maxMp : user.Mp;
}
if (user.Hp < 1)
{
system("cls");
printf("你死了,游戲結束!!");
}
else if (boss.Hp < 1)
{
system("cls");
printf("擊敗BOSS,游戲結束!!");
}
else goto lfight;
}