九、迴圈(二) 1、while迴圈 1)while迴圈語法 //while迴圈語法 while(條件表達式) //條件表達式是一個bool類型的值 { 迴圈語句; } //示例 int i = 9; while(i<0) { i--; std::cout<<i; } 2)while迴圈嵌套 //wh ...
九、迴圈(二)
1、while迴圈
1)while迴圈語法
//while迴圈語法
while(條件表達式) //條件表達式是一個bool類型的值
{
迴圈語句;
}
//示例
int i = 9;
while(i<0)
{
i--;
std::cout<<i;
}
2)while迴圈嵌套
//while迴圈嵌套語法
while()
{
while()
{
}
}
3)while(整數)
while(i) //i如果是整數值,編譯器會將其預設轉化為bool類型
{
}
4)跳出迴圈
註:goto、break、continue可以跳出迴圈
5)案例:
需求:設計一個程式,要求用戶輸入一個數,然後判斷這個數是不是質數,並且顯示結果,當計算完成後,輸出"按Y計算下一個數,按其他按鍵退出本程式",並且設計對應的功能。
//要求用戶輸入一個數,然後判斷這個數是不是質數(while迴圈實現)
#include <iostream>
#include <cmath>
int main()
{
char inkey{'y'};
while ((inkey=='Y')||(inkey=='y'))
{
int intIn;
std::cout << "請輸入一個數:";
std::cin >> intIn;
bool bcase{};
bcase = (intIn % 2 != 0); //偶數直接
for (int i = 3; (bcase)&&(i <= sqrt(intIn)); i += 2)
{
if (intIn % i == 0)
{
bcase = false;
break;
}
}
if (!bcase)std::cout << "這個數不是質數";
else
std::cout << "這個數是質數!!";
std::cout << "按Y計算下一個數,按其他按鍵退出本程式:";
std::cin >> inkey;
}
}
2、do...while迴圈
1)do...while語法
//語法
do //先執行一次迴圈語句,再判斷條件表達式
{
迴圈語句;
}while(條件表達式);
//示例
int i=9;
do
{
i--;
std::cout<<i;
}while(i>0);
//迴圈體最少執行一次
2)do...while的嵌套
do
{
do
{
}while();
}while();
3)do...while(整數)
do
{
}while(i); //i如果是整數值,編譯器會將其預設轉化為bool類型
4)跳出迴圈
註:goto、break、continue可以跳出迴圈
5)案例:
需求:設計一個程式,要求用戶輸入一個數,然後判斷這個數是不是質數,並且顯示結果,當計算完成後,輸出"按Y計算下一個數,按其他按鍵退出本程式",並且設計對應的功能。
#include <iostream>
#include <cmath>
int main()
{
char inkey{ 'y' };
do
{
int intIn;
std::cout << "請輸入一個數:";
std::cin >> intIn;
bool bcase{};
bcase = (intIn % 2 != 0); //偶數直接
for (int i = 3; (bcase) && (i <= sqrt(intIn)); i += 2)
{
if (intIn % i == 0)
{
bcase = false;
break;
}
}
if (!bcase)std::cout << "這個數不是質數";
else
std::cout << "這個數是質數!!";
std::cout << "按Y計算下一個數,按其他按鍵退出本程式:";
std::cin >> inkey;
} while ((inkey == 'Y') || (inkey == 'y'));
}
3、while迴圈之網銀證書密碼攻擊(安全實驗)
需求:設計一個系統來模擬網銀證書密碼被攻擊的場景,用戶輸入一個6位的數字密碼,然後我們破解它的密碼並且顯示出來,用while和do while分別實現一次
//while迴圈實現網銀證書密碼攻擊
#include <iostream>
int main()
{
int password{ 0 }, repassword{-1}, hackpass{ 0 }; //設置初始值是,password和repassword要不一樣,否則直接破解程式
while (password != repassword)
{
system("cls");
std::cout << "請輸入你的密碼:";
std::cin >> password;
std::cout << "請再次輸入你的密碼:";
std::cin >> repassword;
}
std::cout << "破解程式開始\n";
while (password != hackpass) hackpass++;
std::cout << "密碼破解成功,密碼為:" << hackpass;
}
#include <iostream>
int main()
{
//hackpass初始值要設置為1,否則進行破解時,初始值若為0,通過hackpass++,初始時password和repassword就不相等
int password{ 0 }, repassword{ }, hackpass{ -1 };
do
{
system("cls");
std::cout << "請輸入你的密碼:";
std::cin >> password;
std::cout << "請再次輸入你的密碼:";
std::cin >> repassword;
} while (password != repassword);
std::cout << "破解程式開始\n";
do hackpass++; while (password != hackpass); //如果
std::cout << "密碼破解成功,密碼為:" << hackpass;
}
4、練習:WPS功能路由器入侵(安全實驗)
需求:設計一個程式,模擬WPS路由器被破解的場景,要求分別用goto,for,while,do...while實現
#include <iostream>
int main()
{
int password{ 75634125 };
int hackpass{0};
//goto
lcrack:
if (password != hackpass)
{
hackpass++;
goto lcrack;
}
std::cout << "你的路由器密碼為:" << hackpass << std::endl;
//for迴圈方式一
for (hackpass = 0; hackpass < 100000000; hackpass++)
if (hackpass == password) break;
std::cout << "你的路由器密碼為:" << hackpass << std::endl;
//for迴圈方式二
for (hackpass = 0; hackpass !=password; hackpass++)
if (hackpass == password) break;
std::cout << "你的路由器密碼為:" << hackpass << std::endl;
//while迴圈
hackpass = 0;
while (password != hackpass) hackpass++;
std::cout << "你的路由器密碼為:" << hackpass << std::endl;
//do while迴圈
hackpass = -1;
do hackpass++; while (password != hackpass);
std::cout << "你的路由器密碼為:" << hackpass << std::endl;
}
5、迴圈練習
1)水仙花樹:如果一個三位數立方和等於該數本身,那麼這個數就是水仙花數,比如153等於1立方+5立方+3立方,計算出100-1000之前的水仙花數
#include <iostream>
int main()
{
int g, s, b;
for (int i = 100; i < 1000; i++)
{
g = i % 10;
s = i / 10 % 10;
b = i / 100;
if (g * g * g + s * s * s + b * b * b==i)
{
std::cout << "水仙花數有:" << i << std::endl;
}
}
}
2)計算完數
要求:如果一個自然數,恰好除去它本身以外的一切因數和相等,這個數就是完數,比如6=1+2+3,求出1000以內的完數。
//計算完數
#include <iostream>
int main()
{
for (int i = 4;i < 1000;i++)
{
int sum{};
for (int a = 1; a < i; a++)
{
if (i % a == 0) sum += a;
}
if (sum == i)std::cout << "找到一個完數" << i << std::endl;
}
}
7、麟江湖必殺技的設計
需求:游戲麟江湖,角色技能有一項必殺技,當技能發動後,會對目標造成100點傷害,同時對目標進行下一次連擊,每次連擊都會比上次攻擊額外多造成100點傷害,並且每次比上次多消耗50點MP,知道角色的MP不足以釋放技能,連擊結束,角色的MP將恢復到使用技能前的原值。寫出本技能的實現過程
#include <iostream>
int main()
{
int Mp{ 1383 }, lsMp{}; //藍量、臨時藍量
int damage{}, needMp{}; //造成傷害;藍的消耗
do
{
damage += 100;
Mp -= needMp;
needMp += 50;
std::cout << "造成傷害" << damage << ",剩餘MP" << Mp<<std::endl;
} while (Mp>=needMp);
Mp = lsMp;
}