23.循环语句-while
23.1 知识点
循环语句的作用
循环语句可以让顺序执行的代码不停地循环执行某一代码块的内容。
条件分支语句用于让代码产生分支,而循环语句则用于让代码被重复执行。
while语法相关
while
语句的基本形式如下:
cout << "主代码逻辑" << endl;
while (bool类型的值) {
// 循环语句块
// 当满足条件时,就执行while语句块中的内容
// .....
// 当里面的代码逻辑执行完毕,会回到while循环的开头
// 再次进行条件判断
}
cout << "主代码逻辑" << endl;
条件判断
while
语句中传入的内容能够表示真假即可,例如:
bool
类型(true
或false
)。- 关系表达式或逻辑表达式。
- 数值类型(非零代表
true
,零代表false
)。
死循环
死循环会不停地执行循环中的逻辑,例如:
while (true) {
cout << "请玩家输入用户名和密码" << endl;
string str;
cin >> str;
}
死循环常见问题:
- 可能因内存分配问题导致程序崩溃或闪退。
- 导致程序卡死。
示例:计算累加
以下代码将整型变量从0
累加到10
:
int i = 0;
while (i < 10) {
++i;
}
cout << i << endl;
嵌套使用
循环语句不仅可以嵌套 if
和 switch
,也可以嵌套其他循环语句。
示例:嵌套 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;
}
注意:
break
和continue
主要用于循环,与if
语句无关。switch
语句中的break
仅跳出switch
块,与循环的break
功能不同。
示例:switch
和 continue
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