九、循环(二)
九、循环(二)
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;
}
热门相关:至尊龙帝陆鸣 至尊剑皇 覆汉 都市剑说 试婚100天:夜少,轻轻宠