23.while

23.循环语句-while


23.1 知识点

循环语句的作用

循环语句可以让顺序执行的代码不停地循环执行某一代码块的内容。
条件分支语句用于让代码产生分支,而循环语句则用于让代码被重复执行。

while语法相关

while语句的基本形式如下:

cout << "主代码逻辑" << endl;
while (bool类型的值) {
    // 循环语句块
    // 当满足条件时,就执行while语句块中的内容
    // .....
    // 当里面的代码逻辑执行完毕,会回到while循环的开头
    // 再次进行条件判断
}
cout << "主代码逻辑" << endl;

条件判断

while语句中传入的内容能够表示真假即可,例如:

  • bool 类型(truefalse)。
  • 关系表达式或逻辑表达式。
  • 数值类型(非零代表true,零代表false)。

死循环

死循环会不停地执行循环中的逻辑,例如:

while (true) {
    cout << "请玩家输入用户名和密码" << endl;
    string str;
    cin >> str;
}

死循环常见问题:

  1. 可能因内存分配问题导致程序崩溃或闪退。
  2. 导致程序卡死。

示例:计算累加

以下代码将整型变量从0累加到10

int i = 0;
while (i < 10) {
    ++i;
}
cout << i << endl;

嵌套使用

循环语句不仅可以嵌套 ifswitch,也可以嵌套其他循环语句。

示例:嵌套 while

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

示例:嵌套 while 与 if

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

示例:变量作用域

每次外层循环进入时,内层变量b2是重新定义的,与上一次的b2没有关系:

int a2 = 0;
while (a2 < 10) {
    ++a2;
    int b2 = 0;
    ++b2;
    cout << b2 << endl;
}

流程控制关键词

break:跳出循环

break用于跳出循环并停止执行循环内的逻辑。例如:

while (true) {
    cout << "break之前逻辑" << endl;
    break;
    cout << "break之后逻辑" << endl; // 不会执行
}
cout << "循环外的逻辑" << endl;

以下代码在i2累加到10时退出循环:

int i2 = 0;
while (true) {
    ++i2;
    cout << i2 << endl;
    if (i2 == 10) {
        break;
    }
}
cout << "循环外的逻辑" << endl;

continue:跳过当前循环

continue用于回到循环开始并继续执行。例如:

int index = 0;
while (index < 20) {
    ++index;
    if (index % 2 == 0) {
        continue; // 跳过偶数
    }
    cout << index << endl;
}

注意:

  • breakcontinue 主要用于循环,与 if 语句无关。
  • switch 语句中的 break 仅跳出 switch 块,与循环的 break 功能不同。

示例:switchcontinue

while (true) {
    int aa = 1;
    switch (aa) {
        case 1:
            continue; // 跳过当前循环的后续逻辑
            break;    // 不会被执行
        default:
            break;
    }
    break; // 跳出循环
}

23.2 知识点代码

Lesson23_循环语句_while.cpp

#include <iostream>
using namespace std;
int main()
{
    std::cout << "while循环语句\n";

    #pragma region 知识点一 循环语句的作用

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

    #pragma endregion

    #pragma region 知识点二 while语法相关

    //传入的内容 能表示真假就可以
    //bool true false
    //关系表达式 逻辑表达式 
    //数值 非0代表true 0代表false
    //cout << "主代码逻辑" << endl;
    //while (bool类型的值)
    //{
    //    //循环语句块
    //    //当满足条件时  就回去执行while语句块中的内容
    //    //.........
    //    //.........
    //    //.........
    //    //.........
    //    //.........
    //    //当里面的代码逻辑执行完毕 会回到while循环的开头
    //    //再次进行条件判断
    //}
    //cout << "主代码逻辑" << endl;

    //死循环
    //不停的执行循环中的逻辑,"直到死为止"
    //死循环只会在我们目前学习控制台相关内容时 才会频繁使用
    //以后进入UE相关学习时,几乎是不会再使用死循环的 
    //1.可能会因为内存分配问题,造成程序崩溃 闪退
    //2.造成程序卡死

    //while (true)
    //{
    //    //cout << "*********" << endl;
    //    cout << "请玩家输入用户名和密码" << endl;
    //    string str;
    //    cin >> str;
    //}
    //cout << "循环后的逻辑" << endl;

    //计算一个为0的整型变量 让它只能累加1 不停的加到10为止
    int i = 0;
    while ( i < 10)
    {
        ++i;
    }
    cout << i << endl;

    #pragma endregion

    #pragma region 知识点三 嵌套使用

    // 不仅可以嵌套 if switch 还可以嵌套 while
    int a = 0;
    int b = 0;
    while ( a < 10)
    {
        ++a;
        //一定是while不满足条件才停下来继续执行外一层while的逻辑
        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他们有没有关系 是不是一个变量
        //他们没有关系!!!!!!!
        int b2 = 0;
        ++b2;
        cout << b2 << endl;
    }

    #pragma endregion

    #pragma region 知识点四 流程控制关键词

    //作用 : 控制循环逻辑的关键词
    // break:跳出循环
    while (true)
    {
        cout << "break之前逻辑" << endl;
        //跳出循环 停止循环 break后米娜的内容 是不会被执行的
        break;
        cout << "break之后逻辑" << endl;
    }
    cout << "循环外的逻辑" << endl;

    int i2 = 0;
    while (true)
    {
        ++i2;
        cout << i2 << endl;
        if (i2 == 10)
        {
            break;
        }
    }
    cout << "循环外的逻辑" << endl;


    // continue:回到循环开始 继续执行
   /* while (true)
    {
        cout << "continue之前的逻辑" << endl;
        continue;
        cout << "continue之后的逻辑" << endl;
    }
    cout << "循环外的逻辑" << endl;*/

    //打印1到20之间的奇数 
    int index = 0;
    while (index < 20)
    {
        ++index;
        //什么样的数是奇数
        //不能被2整除的数 ——> %
        //偶数不打印
        if (index % 2 == 0)
            continue;//continue的主要作用是可以用来处理 某些情况满足时 不想要执行后面的逻辑了
        cout << index << endl;
    }


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

    while (true)
    {
        int aa = 1;
        switch (aa)
        {
            case 1:
                continue;
                break;//这个switch当中的break只会跳出switch语句块 不会和while配对使用
            default:
                break;
        }
        break;
    }

    #pragma endregion
}

23.3 练习题

在控制台输出1到100

int i = 0;
while (i < 100)
{
    ++i;
    cout << i << endl;
}

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

int i = 0;
int sum = 0;
while (i < 100)
{
    ++i;
    //sum = sum + i;
    //每一次都把当前的i加上去 相当于就是在累加
    sum += i;
    //1 ~ 100
}
cout << sum << endl;

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

int i = 0;
int sum = 0;
while (i < 100)
{
    ++i;
    //在加之前应该判断
    //如果当前的这个i能够被7整除 就不要加上去
    if (i % 7 == 0)
    {
        cout << i << endl;
        continue;
    }
        
    sum += i;
}
cout << sum << endl;

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

//构造死循环
while (true)
{
    try
    {
        cout << "请输入一个数" << endl;
        string str;
        cin >> str;
        //1.输入
        //得到了玩家输入的数
        int num = stoi(str);

        //2.判断这个数是不是质数(素数)
        //num % 2 == 0 如果满足这个条件 证明它不是素数 就不需要继续往后算了
        //num % 3 == 0 如果满足这个条件 证明它不是素数 就不需要继续往后算了
        //num % 4 == 0 如果满足这个条件 证明它不是素数 就不需要继续往后算了
        //......
        //num % index == 0 直到 index == num 时 就结束
        int index = 2;
        while (index < num)
        {
            //发现了一个数能够整除 就直接停下来 
            if (num % index == 0)
                break;
            ++index;
        }

        //出了循环后 什么时候 才能证明它是素数
        if (num == index)
        {
            cout << "它是一个素数" << endl;
        }
        else
        {
            cout << "它不是素数" << endl;
        }
    }
    catch (const std::exception&)
    {
        cout << "请输入正确的数字" << endl;
    }
}

要求输入用户名和密码,直到输入正确为止

while (true)
{
    cout << "请输入用户名" << endl;
    string name;
    cin >> name;
    cout << "请输入密码" << endl;
    string password;
    cin >> password;
    if (name == "admin" && password == "8888")
    {
        cout << "登录成功" << endl;
        break;
    }
    else
    {
        cout << "用户名或密码错误,请重新输入" << endl;
    }
}

输入班级人数并计算学员成绩的总成绩和平均成绩

try
{
    cout << "请输入班级人数" << endl;
    string numStr;
    cin >> numStr;
    int num = stoi(numStr);
    int index = 0;
    int sum = 0;
    while (index < num)
    {
        ++index;
        cout << "请输入第" << index << "个学员的成绩" << endl;
        cin >> numStr;
        int cj = stoi(numStr);
        sum += cj;
    }
    cout << "总成绩为" << sum << ", 平均成绩为" << sum / (float)num << endl;
}
catch (const std::exception&)
{
    cout << "请输入数字" << endl;
}

累加1到100的数字,直到sum大于500,并输出累加到的数字个数

int index = 0;
int sum = 0;
while (index < 100)
{
    ++index;
    sum += index;
    if (sum > 500)
        break;
}
cout << "sum加到500时是第" << index << "个数字" << endl;

增长率问题:假设看韬老狮视频的同学有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;
//我也不知道什么时候回超过1000,所以直接死循环 当里面满足1000人时 在break
while (true)
{
    //本月的结果 = 上一次的结果 * 20% + 上一次的结果 
    //persons = (int)(persons * 0.2f) + persons;
    persons += (int)(persons * 0.2f);
    ++month;
    //满足情况 跳出while
    if (persons >= 1000)
        break;
}
cout << "经历了" << month << "个月,观看人数就达到了1000人" << endl;

求斐波那契数列的第20位数字

//斐波那契数列 从第三个数开始 每个数是前面两个数的的和
//2 = 1 + 1
//3 = 2 + 1
//5 = 3 + 2
//8 = 5 + 3
//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;
int index = 0;
int result = 0;
//循环的目的 是循环20次 相当于就要计算20次 就得到第20个数字
while ( index < 20)
{
    ++index;
    //第一和第二次 得到的数 是定死的 都是1
    if (index == 1)
        result = n1;
    else if (index == 2)
        result = n2;
    else
    {
        result = n1 + n2;
        //计算完本次结果后
        //应该让n1和n2往后移 为下一次计算做准备
        n1 = n2;
        n2 = result;
    }
}
cout << result << endl;

找出100内所有素数并打印

int num = 2;
while (num < 100)
{
    //2~99
    //如果想要判断是不是素数,那么就从2开始 用当前的数去对2开始的数取余 直到 中途被整除
    //那就不是素数,如果中途没有被整除 最后用来当除数的数会和当前数一样 那么就是素数
    int i = 2;
    while (i < num)
    {
        //被整除了 证明不是素数了 就没有必要继续往下循环 直接break即可
        if (num % i == 0)
            break;
        ++i;
    }
    if (i == num)
        cout << num << endl;
    ++num;
}

23.4 练习题代码

Lesson23_练习题.cpp

#include <iostream>
#include <string>
using namespace std;
int main()
{
    std::cout << "while练习题\n";

    #pragma region 练习题一

    //在控制台输出1到100

    int i = 0;
    while (i < 100)
    {
        ++i;
        cout << i << endl;
    }

    #pragma endregion

    #pragma region 练习题二

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

    int i = 0;
    int sum = 0;
    while (i < 100)
    {
        ++i;
        //sum = sum + i;
        //每一次都把当前的i加上去 相当于就是在累加
        sum += i;
        //1 ~ 100
    }
    cout << sum << endl;

    #pragma endregion

    #pragma region 练习题三

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

    int i = 0;
    int sum = 0;
    while (i < 100)
    {
        ++i;
        //在加之前应该判断
        //如果当前的这个i能够被7整除 就不要加上去
        if (i % 7 == 0)
        {
            cout << i << endl;
            continue;
        }
            
        sum += i;
    }
    cout << sum << endl;

    #pragma endregion

    #pragma region 练习题四

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

    //构造死循环
    while (true)
    {
        try
        {
            cout << "请输入一个数" << endl;
            string str;
            cin >> str;
            //1.输入
            //得到了玩家输入的数
            int num = stoi(str);

            //2.判断这个数是不是质数(素数)
            //num % 2 == 0 如果满足这个条件 证明它不是素数 就不需要继续往后算了
            //num % 3 == 0 如果满足这个条件 证明它不是素数 就不需要继续往后算了
            //num % 4 == 0 如果满足这个条件 证明它不是素数 就不需要继续往后算了
            //......
            //num % index == 0 直到 index == num 时 就结束
            int index = 2;
            while (index < num)
            {
                //发现了一个数能够整除 就直接停下来 
                if (num % index == 0)
                    break;
                ++index;
            }

            //出了循环后 什么时候 才能证明它是素数
            if (num == index)
            {
                cout << "它是一个素数" << endl;
            }
            else
            {
                cout << "它不是素数" << endl;
            }
        }
        catch (const std::exception&)
        {
            cout << "请输入正确的数字" << endl;
        }
    }

    #pragma endregion

    #pragma region 练习题五

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

    while (true)
    {
        cout << "请输入用户名" << endl;
        string name;
        cin >> name;
        cout << "请输入密码" << endl;
        string password;
        cin >> password;
        if (name == "admin" && password == "8888")
        {
            cout << "登录成功" << endl;
            break;
        }
        else
        {
            cout << "用户名或密码错误,请重新输入" << endl;
        }
    }

    #pragma endregion

    #pragma region 练习题六

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

    try
    {
        cout << "请输入班级人数" << endl;
        string numStr;
        cin >> numStr;
        int num = stoi(numStr);
        int index = 0;
        int sum = 0;
        while (index < num)
        {
            ++index;
            cout << "请输入第" << index << "个学员的成绩" << endl;
            cin >> numStr;
            int cj = stoi(numStr);
            //对输入的成绩进行累加
            sum += cj;
        }
        //计算平均成绩了
        cout << "总成绩为" << sum << ",平均成绩为" << sum / (float)num << endl;
    }
    catch (const std::exception&)
    {
        cout << "请输入数字" << endl;
    }

    #pragma endregion

    #pragma region 练习题七

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

    int index = 0;
    int sum = 0;
    while (index < 100)
    {
        ++index;
        //1~100
        sum += index;
        if (sum > 500)
            break;
    }
    cout << "sum加到500时是第" << index << "个数字" << endl;

    #pragma endregion

    #pragma 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;
    //我也不知道什么时候回超过1000,所以直接死循环 当里面满足1000人时 在break
    while (true)
    {
        //本月的结果 = 上一次的结果 * 20% + 上一次的结果 
        //persons = (int)(persons * 0.2f) + persons;
        persons += (int)(persons * 0.2f);
        ++month;
        //满足情况 跳出while
        if (persons >= 1000)
            break;
    }
    cout << "经历了" << month << "个月,观看人数就达到了1000人" << endl;

    #pragma endregion

    #pragma region 练习题九

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

    //斐波那契数列 从第三个数开始 每个数是前面两个数的的和
    //2 = 1 + 1
    //3 = 2 + 1
    //5 = 3 + 2
    //8 = 5 + 3
    //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;
    int index = 0;
    int result = 0;
    //循环的目的 是循环20次 相当于就要计算20次 就得到第20个数字
    while ( index < 20)
    {
        ++index;
        //第一和第二次 得到的数 是定死的 都是1
        if (index == 1)
            result = n1;
        else if (index == 2)
            result = n2;
        else
        {
            result = n1 + n2;
            //计算完本次结果后
            //应该让n1和n2往后移 为下一次计算做准备
            n1 = n2;
            n2 = result;
        }
    }
    cout << result << endl;

    #pragma endregion

    #pragma region 练习题十

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

    int num = 2;
    while (num < 100)
    {
        //2~99
        //如果想要判断是不是素数,那么就从2开始 用当前的数去对2开始的数取余 直到 中途被整除
        //那就不是素数,如果中途没有被整除 最后用来当除数的数会和当前数一样 那么就是素数
        int i = 2;
        while (i < num)
        {
            //被整除了 证明不是素数了 就没有必要继续往下循环 直接break即可
            if (num % i == 0)
                break;
            ++i;
        }
        if (i == num)
            cout << num << endl;
        ++num;
    }

    #pragma endregion
}


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

×

喜欢就点赞,疼爱就打赏