21.while

21.循环语句-while


21.1 知识点

作用

while循环是一种用于让代码可以被重复执行的循环语句。通过设置一个条件,当条件满足时,循环中的代码会被执行,之后再回到循环开始,继续进行条件判断。while循环通常用于处理需要多次迭代的情况。

while循环的执行顺序图

┌─────────────┐
│  条件判断  │
└─────────────┘
      │
      ▼
┌─────────────┐
│ 循环代码块 │
└─────────────┘
      │
      ▼
┌─────────────┐
│ 回到条件判断 │
└─────────────┘

语法相关

语法结构

// bool类型变量  条件运算符 逻辑运算符  
//while(bool类型的值)
//{
//    //当满足条件时 就会执行while语句块中的内容 
//    //...... 
//    //...... 
//    //...... 
//    //...... 
//    //当代码逻辑执行完 会回到while循环开头 
//    //再次进行条件判断 
//}
//Console.WriteLine("主代码逻辑");

死循环

死循环就是不停的执行循环中的逻辑 “直到死为止”。死循环通常在学习控制台程序时会频繁使用,在其他场景可能会因为内存问题导致程序崩溃、卡死。

while (true)
{
    //如果没有语句卡住死循环会崩溃
    Console.WriteLine("**************");
    Console.WriteLine("请玩家输入用户名密码");
    //当前学习阶段可以用死循环构建无限输入的需求
    Console.ReadLine();
}

例题

计算一个为0的整形变量,让它只能累加1,不停的加到10为止。

int i = 0;
while (i < 10)
{
    ++i;
}
Console.WriteLine(i); // 输出结果为 10

嵌套使用

while循环不仅可以嵌套ifswitch,还可以嵌套while循环。

// 示例一
int a = 0;
int b = 0;
while (a < 10)
{
    ++a;
    while (b < 10)
    {
        ++b;
    }
}

// 示例二
a = 0;
b = 0;
while (a < 10)
{
    ++a;
    if (b < 10)
    {
        ++b;
    }
}

// 示例三
int a2 = 0;
while (a2 < 10)
{
    ++a2;
    //每次从外层循环进来时
    //b2和上一次的b2有没有关系 不是一个变量
    //因为上一个代码块结束时上一个b2的生命周期已经结束
    //切忌 没有关系
    int b2 = 0;
    ++b2;
}

流程控制关键词

流程控制关键词主要用于控制循环逻辑。

break

break关键词用于跳出循环,中断循环的执行。

// 示例一
while (true)
{
    Console.WriteLine("break之前的代码");
    break; // 跳出循环
    Console.WriteLine("break之后的代码"); // 不会打印出来
}
Console.WriteLine("循环外的代码");

// 示例二
int i = 0;
while(true)
{
    ++i;
    Console.WriteLine(i);
    if (i == 10)
    {
        break;
    }
}
Console.WriteLine(i); // 输出结果为 10

continue

continue关键词用于回到循环开始,继续执行。

// 示例一
// 会无限打印“continue前的代码”,不会打印“continue后的代码”
while (true)
{
    Console.WriteLine("continue前的代码");
    continue;
    Console.WriteLine("continue后的代码");
}
Console.WriteLine("循环外的代码");

// 示例二
// 打印1到20之间的奇数
int index = 0;
while(index < 20)
{
    ++index;
    //什么样的数是奇数
    //不能被2整除的数 ——> %
    if (index % 2 == 0)
    {
        continue;
    }
    Console.WriteLine(index);
}

break在switch中的作用

breakswitch中的作用和在while循环中的作用有异曲同工之妙。

while (true)
{
    int a1 = 1;
    switch (a1)
    {
        default:
            //如果有continue 会和while循环配对 则不会输出下面打印的"11111"
            continue;
            //这个break是和switch配对的 和while循环无关
            break;
    }
    Console.WriteLine("11111");
}

注意:breakcontinue主要是和循环配合使用,和if语句没关系。


21.2 知识点代码

using System;

namespace Lesson18_循环语句_while
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("while语句");

            #region 知识点一 作用
            // 让顺序执行的代码 可以不停的循环执行某一代码块的内容
            // 条件分支语句 是 让代码产生分支
            // 循环语句 是 让代码可以被重复执行
            #endregion

            #region 知识点二 语法相关
            // bool类型变量  条件运算符 逻辑运算符 
            //while(bool类型的值)
            //{
            //    //当满足条件时 就会执行while语句块中的内容
            //    //......
            //    //......
            //    //......
            //    //......
            //    //当代码逻辑执行完 会回到while循环开头
            //    //再次进行条件判断
            //}
            //Console.WriteLine("主代码逻辑");

            //死循环
            //就不停的执行循环中的逻辑 "直到死为止"
            //死循环只有在目前我们学习 控制台程序时 会频繁使用
            //之后进入 Unity过后  基本不会使用死循环
            //进入Unity过后不使用死循环的原因
            //1.可能因为内存问题 造成程序崩溃 闪退
            //2.造成程序卡死

            //死循环示例
            while (true)
            {
                //如果没有语句卡住死循环 会崩溃
                Console.WriteLine("**************");
                Console.WriteLine("请玩家输入用户名密码");

                //当前学习阶段可以用死循环构建无限输入的需求
                Console.ReadLine();
            }

            //计算一个为0的整形变量 让他只能累加1 不停的加到10为止
            int i = 0;
            //bool类型的值 还可以用逻辑运算符 && || ! 条件运算符 算术运算结合运算
            while (i < 10)
            {
                ++i;
            }
            Console.WriteLine(i);//55


            #endregion

            #region 知识点三 嵌套使用
            // 不仅可以嵌套 if switch 还可以嵌套 while
            int a = 0;
            int b = 0;
            while (a < 10)
            {
                ++a;
                while (b < 10)
                {
                    ++b;
                }
            }

            a = 0;
            b = 0;
            while (a < 10)
            {
                ++a;
                if (b < 10)
                {
                    ++b;
                }
            }

            int a2 = 0;
            while (a2 < 10)
            {
                ++a2;
                //每次从外层循环进来时
                //b2和上一次的b2有没有关系 不是一个变量
                //因为上一个代码块结束时上一个b2的生命周期已经结束
                //切忌 没有关系
                int b2 = 0;
                ++b2;
            }

            #endregion

            #region 知识点四 流程控制关键词
            //作用 : 控制循环逻辑的关键词
            // break:跳出循环


            while (true)
            {
                Console.WriteLine("break之前的代码");
                break;//跳出循环
                Console.WriteLine("break之后的代码");//不会打印出来
            }
            Console.WriteLine("循环外的代码");


            i = 0;
            while(true)
            {
                ++i;
                Console.WriteLine(i);
                if ( i == 10 )
                {
                    break;
                }
            }
            Console.WriteLine(i);//10

            // continue:回到循环开始 继续执行
            // 会无限打印“continue前的代码”,不会打印“continue后的代码”
            while (true)
            {
                Console.WriteLine("continue前的代码");
                continue;
                Console.WriteLine("continue后的代码");
            }
            Console.WriteLine("循环外的代码");

            //打印1到20之间的 奇数
            int index = 0;
            while(index < 20)
            {
                ++index;
                //什么样的数是奇数
                //不能被2整除的数 ——> %
                if (index % 2 == 0)
                {
                    continue;
                }
                Console.WriteLine(index);
            }


            //注意:break和continue主要是和循环配合使用的 和if语句没关
            // break在switch中的作用 和 while循环中的作用有异曲同工之妙

            while (true)
            {
                int a1 = 1;
                switch (a1)
                {
                    default:
                        //如果有continue 会和while循环配对 则不会输出下面打印的"11111"
                        continue;

                        //这个break是和switch配对的 和while循环无关
                        break;
                }
                Console.WriteLine("11111");
            }
            #endregion
        }
    }
}

21.3 练习题

在控制台输出1到100

int i = 0;

while (i < 100)
{
    ++i;
    Console.WriteLine(i);
}

在控制台输出1到100之间所有整数的和

i = 0;
int sum = 0;

while (i < 100)
{
    ++i;
    sum += i;
}

Console.WriteLine(sum); // 5050

用while和continue实现计算1到100(包含)之间的除了能被7整除之外所有整数的和

i = 0;
sum = 0;

while (i < 100)
{
    ++i;

    if (i % 7 == 0)
    {
        continue;
    }

    sum += i;
}

Console.WriteLine(sum); // 4315

提示用户输入一个数,判断该数是否是素数并打印。

while (true)
{
    try
    {
        Console.WriteLine("请输入一个数字");
        int num1 = int.Parse(Console.ReadLine());

        int index1 = 2;

        while (index1 < num1)
        {
            if (num1 % index1 == 0)
            {
                break;
            }

            ++index1;
        }

        if (index1 != num1)
        {
            Console.WriteLine("不是一个质数");
        }
        else
        {
            Console.WriteLine("是质数");
        }
    }
    catch
    {
        Console.WriteLine("请正确输入");
    }
}

要求输入用户名和密码(admin/8888)

while (true)
{
    Console.WriteLine("请输入用户名");
    string userName = Console.ReadLine();
    Console.WriteLine("请输入密码");
    string passWord = Console.ReadLine();

    if (userName == "admin" && passWord == "8888")
    {
        Console.WriteLine("登录成功");
        break;
    }
    else
    {
        Console.WriteLine("用户名或密码错误");
    }
}

输入班级人数,然后依次输入学员成绩,计算班级学员的平均成绩和总成绩。

try
{
    Console.WriteLine("请输入班级人数");
    int num = int.Parse(Console.ReadLine());

    int index2 = 0;
    int sum1 = 0;

    while (index2 < num)
    {
        ++index2;
        Console.WriteLine("请输入第{0}个学员的成绩", index2);
        int cj = int.Parse(Console.ReadLine());
        sum1 += cj;
    }

    Console.WriteLine("平均成绩是{0},总分是{1}", sum1 / num, sum1);
}
catch
{
    Console.WriteLine("请输入数字");
}

定义一个整形变量sum,然后分别把1~100之间的数字依次累加到sum中,当sum的值大于500的时候,中断操作,并在控制台输出累加到第几个数字就可以使sum大于500

int sum2 = 0;
int index3 = 0;

while (index3 < 100)
{
    ++index3;
    sum2 += index3;

    if (sum2 > 500)
    {
        break;
    }
}

Console.WriteLine("sum大于500时是第{0}个数", index3); // sum大于500时是第32个数

假设看韬老狮视频的同学有100人,每个月增长20%,请问按此速度增长,经历多少个月看韬老狮视频的同学能达到1000人?

// 100   
// 1   100 * 20% + 100 = 120
// 2   120 * 20% + 120 = 144
// 3   144 * 20% + 144 = 结果
//     上一次结果 * 20% + 上一次的结果 = 本月结果
int persons = 100;
int month = 0;
while (true)
{
    //本月结果 = 上一次结果 * 20% + 上一次的结果
    //persons = persons + (int)(persons * 0.2f);
    persons += (int)(persons * 0.2f);
    ++month;

    //当前人数大于1000时跳出循环
    if (persons >= 1000)
    {
        break;
    }
}
Console.WriteLine("经历了{0}个月,观看视频的人数能达到1000", month);
//经历13个月,观看视频的人数能达到1000

求数列 1,1,2,3,5,8,13….的第20位数字是多少?

int n1 = 1;
int n2 = 1;
int index = 0;
int result = 0;

while (index < 20)
{
    ++index;

    if (index == 1)
    {
        result = n1;
    }
    else if (index == 2)
    {
        result = n2;
    }
    else
    {
        result = n1 + n2;
        n1 = n2;
        n2 = result;
    }
}

Console.WriteLine(result); // 6765

找出100内所有素数并打印。

int num2 = 2;

while (num2 < 100)
{
    int i1 = 2;

    while (i1 < num2)
    {
        if (num2 % i1 == 0)
        {
            break;
        }

        ++i1;
    }

    if (i1 == num2)
    {
        Console.WriteLine(num2);
    }

    ++num2;
}

21.4 练习题代码

using System;

namespace Lesson18_练习题
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("while循环练习题");
            #region 练习题一
            //在控制台输出1到100

            int i = 0;
            while (i < 100)
            {
                ++i;
                Console.WriteLine(i);
            }
            #endregion

            #region 练习题二
            //在控制台输出1到100之间所有整数的和

            i = 0;
            ////用于表示最终结果的 变量 一定在外面声明
            int sum = 0;
            while (i < 100)
            {
                ++i;
                //每次加完这个i 就得把它加起来
                //sum = sum + i;
                sum += i;
            }
            Console.WriteLine(sum);//5050
            #endregion

            #region 练习题三
            //用while和continue实现计算1到100(包含)之间的除了能被7整除之外所有整数的和
            
            i = 0;
            sum = 0;
            while (i < 100)
            {
                ++i;
                //只要能被 7 整除 就不执行后面的累加
                if (i % 7 == 0)
                {
                    Console.WriteLine(i);
                    continue;
                }
                sum += i;
            }
            Console.WriteLine(sum);//4315
            #endregion

            #region 练习题四
            //提示用户输入一个数,判断该数是否是素数并打印。
            //(素数 / 质数:只能被1和这个数字本身整除的数字,1不是质数,最小的质数是2)

            //死循环 无限输入数判断是不是质数
            while (true)
            {
                try
                {
                    //让用户先输入
                    Console.WriteLine("请输入一个数字");
                    int num1 = int.Parse(Console.ReadLine());

                    // 脑海中的输入举例 把他翻译成程序语言

                    // 5
                    // 5 % 2 能不能整除 不能
                    // 5 % 3 能不能整除 不能
                    // 5 % 4 能不能整除 不能
                    // 5 % 5 能 质数

                    // 6
                    // 6 % 2 能 不是质数

                    // 获得从2开始与输入的数比较的数
                    // 每次比较完一轮就+1 直到这个数不小于输入的数为止
                    int index1 = 2;
                    while (index1 < num1)
                    {
                        //有了这个数 做一些操作判断
                        //判断是否能整除
                        if (num1 % index1 == 0)
                        {
                            // 能整除的话退出循环
                            break;
                        }

                        // 每次比较完一轮就+1
                        ++index1;
                    }
                    if (index1 != num1)
                    {
                        //整除且不等于本身的话不是质数
                        Console.WriteLine("不是一个质数");
                    }
                    else
                    {
                        //否则是质数
                        Console.WriteLine("是质数");
                    }

                }
                catch
                {
                    Console.WriteLine("请正确输入");
                }
            }
            #endregion

            #region 练习题五
            //要求输入用户名和密码(admin/8888),用户名或者密码错误,
            //则提示“用户名或密码错误”,直到输入正确为止

            //死循环无线输入用户名和密码
            while (true)
            {
                Console.WriteLine("请输入用户名");
                string userName = Console.ReadLine();
                Console.WriteLine("请输入密码");
                string passWord = Console.ReadLine();
                if (userName == "admin" && passWord == "8888")
                {
                    Console.WriteLine("登录成功");
                    break;
                }
                else
                {
                    Console.WriteLine("用户名或密码错误");
                }
            }

            #endregion

            #region 练习题六
            //输入班级人数,然后依次输入学员成绩(需提示当前是第几个学员),
            //计算班级学员的平均成绩和总成绩。

            try
            {
                Console.WriteLine("请输入班级人数");
                int num = int.Parse(Console.ReadLine());

                //index表示输入到第几次 第几个人
                int index2 = 0;
                //sum1表示全班总成绩
                int sum1 = 0;
                while (index2 < num)
                {
                    ++index2;
                    Console.WriteLine("请输入第{0}个学员的成绩", index2);
                    //得到输入的成绩
                    int cj = int.Parse(Console.ReadLine());
                    //计算总成绩 每次 加上输入的分数 
                    sum1 += cj;
                }
                //计算平均成绩 打印他们
                Console.WriteLine("平均成绩是{0},总分是{1}", sum1 / num, sum1);
            }
            catch
            {
                Console.WriteLine("请输入数字");
            }

            #endregion

            #region 练习题七
            //定义一个整形变量sum,然后分别把1~100之间的数字依次累加到sum中,
            //当sum的值大于500的时候,中断操作,并在控制台输出累加到第几个数字就可以使sum大于500

            int sum2 = 0;
            int index3 = 0;
            while (index3 < 100)
            {
                ++index3;
                sum2 += index3;
                if (sum2 > 500)
                {
                    break;
                }
            }
            Console.WriteLine("sum大于500时是第{0}个数", index3);//sum大于500时是第32个数
            #endregion

            #region 练习题八
            //假设看韬老狮视频的同学有100人,每个月增长20 %,
            //请问按此速度增长,经历多少个月看韬老狮视频的同学能达到1000人?

            // 100   
            // 1   100 * 20% + 100 = 120
            // 2   120 * 20% + 120 = 144
            // 3   144 * 20% + 144 = 结果
            //     上一次结果 * 20% + 上一次的结果 = 本月结果
            int persons = 100;
            int month = 0;
            while (true)
            {
                //本月结果 = 上一次结果 * 20% + 上一次的结果
                //persons = persons + (int)(persons * 0.2f);
                persons += (int)(persons * 0.2f);
                ++month;

                //当前人数大于1000时跳出循环
                if (persons >= 1000)
                {
                    break;
                }
            }
            Console.WriteLine("经历了{0}个月,观看视频的人数能达到1000", month);
            //经历13个月,观看视频的人数能达到1000

            #endregion

            #region 练习题九
            //求数列 1,1,2,3,5,8,13....的第20位数字是多少?

            //斐波那契数列  从第三个数开始 每个数的值等于前两个数相加
            // 2 = 1 + 1
            // 3 = 2 + 1;
            // 5 = 3 + 2;
            // 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765

            int n1 = 1;
            int n2 = 1;
            // 构造一个 可以数20次数的一个流程
            // 斐波那契数列索引
            int index = 0;
            // 斐波那契数列计算结果
            int result = 0;
            while (index < 20)
            {
                ++index;
                //前两个数特殊处理
                if (index == 1)
                {
                    result = n1;
                }
                else if (index == 2)
                {
                    result = n2;
                }
                else
                {
                    //从第三个数以后 都是用前两个数相加得到结果
                    // 2 = 1 + 1;
                    //目前算的第三个数
                    result = n1 + n2;
                    //接下来要算第四个数
                    n1 = n2;
                    n2 = result;
                }
            }
            Console.WriteLine(result);//6765

            #endregion

            #region 练习题十
            //找出100内所有素数并打印。

            int num2 = 2;
            while( num2 < 100 )
            {
                // 用想要判断是素数的数  从2开始 去取余 如果 中途就整除了 证明不是素数
                // 如果 累加到和自己一样的数了 证明是素数

                //用来遍历的数
                int i1 = 2;

                //小于当前被判断是不是素数的数时进循环
                while ( i1 < num2 )
                {
                    //判断是否整除
                    if( num2 % i1 == 0 )
                    {
                        //整除跳出素数判断循环
                        break;
                    }
                    ++i1;
                }

                //如果等于自己就是素数
                if ( i1 == num2 )
                {
                    Console.WriteLine(num2);
                }

                //判断下一个数
                ++num2;
            }
            #endregion
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏