九、循环(二)

  • 2023-12-08 04:15:18
  • 阅读:42次

九、循环(二)

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;
}

热门内容