在C++编程中,循环结构是控制程序流程的重要工具之一。前面介绍了for循环相关内容,对于for循环来讲,可以明确循环变量的初始值和终值,即可以确定循环的次数,对于循环次数不确定的情况,可以使用while循环来解决,while循环作为最基本的循环结构之一,允许代码在满足特定条件时重复执行。本文将深入探讨C++中while循环的工作原理、语法、实际应用以及一些常见的注意事项。
while循环的基本语法:
while循环是c++的一种基本循环模式。当循环条件成立时,去执行一次循环体,执行完循环体后再判断循环条件是否成立,当循环条件不成立时,就跳出循环,否则就继续执行循环体。while循环的基本语法结构非常简单明了:
while (condition) {// 循环体:当condition为true时,这些语句会被重复执行
}
其中,condition:这是一个布尔表达式,在每次循环迭代之前都会判断这个表达式,如果表达式的结果为true,则执行循环体中的语句;如果为false,则跳出循环。循环体:包含一组要重复执行的语句。这些语句被大括号{}包围(如果循环体只包含一条语句,那么可以将{}省略)。
while循环的工作原理:
首先会进行初始化:在while循环之前,通常会进行一些初始化操作(虽然这不是必须的,因为初始化可以在循环之前单独进行);其次进行条件判断:判断while循环的条件表达式。如果条件为true,则执行循环体,循环体执行完之后再进行条件表达式的判断,决定是否继续执行循环体;如果条件为false,则跳出循环,继续执行循环之后的代码。
while循环的示例:
下面是一个简单的例子,演示如何使用while循环来计算1到10的总和,具体程序代码如下:
#include <bits/stdc++.h>
using namespace std;
int main() {int sum = 0;//首先定义和变量sum,并初始化为0 int i = 1;//定义循环变量i并初始化为1 while (i <= 10) {//判断i是否小于等于10 sum += i;//如果i小于等于10,则将i累加到和变量sum中 i++;//i进行更改,自增成为下一个数,例如刚开始i为1,将1累加到sum中之后,i需要变成2 }cout << "Sum of numbers from 1 to 10 is: " << sum << endl;return 0;
}
在这个例子中,首先定义一个和变量sum并初始化为0,循环变量i的初始值为1。循环条件是i <= 10,循环体内,将i的值加到sum上,然后将i递增1。当i大于10时,循环终止,程序输出总和。
while循环的注意事项
避免无限循环:确保循环条件最终会变为false,否则会导致无限循环,通常称为"死循环"。无限循环会消耗系统资源,可能导致程序崩溃或系统无响应。例如以下程序代码:
#include <bits/stdc++.h>
using namespace std;
int main() {while (1) { cout<<'#'; }return 0;
}
while循环里面的条件表达式恒为True,在循环体里面没有提前结束循环的break语句,因此会一直不断输出'#',陷入了无限循环中,程序无法停止。
初始化:虽然while循环本身不包含初始化语句,但确保在循环前正确初始化所有需要的变量是很重要的。
更新循环变量:在循环体中更新循环变量,以确保循环能够正确终止。
可读性:对于复杂的循环条件,使用括号和适当的空格来提高代码的可读性。
实战训练—角谷猜想:
问题描述:
所谓角谷猜想,是指对于任意一个正整数,若是奇数,则乘以3加1,若是偶数,则除以2。得到的结果再按照上述规则重复处理,最终总能得到1。例如假定初始整数为5,每步计算的结果分别为16,8,4,2,1。程序要求输入一个正整数,将得到1的过程输出来。
输入格式:
一行一个正整数n(n<=20000000)。
输出格式:
从输入正整数到1的步骤,每一步为一行,每一步中描述计算过程。最后一行输出End。如果输入1,那么直接输出End。
输入输出样例:
输入样例1 | 输出样例1 |
6 | 6/2=3 3*3+1=10 10/2=5 5*3+1=16 16/2=8 8/2=4 4/2=2 2/2=1 End |
输入样例2 | 输出样例2 |
7 | 7*3+1=22 22/2=11 11*3+1=34 34/2=17 17*3+1=52 52/2=26 26/2=13 13*3+1=40 40/2=20 20/2=10 10/2=5 5*3+1=16 16/2=8 8/2=4 4/2=2 2/2=1 End |
问题分析:
对于任意一个输入的正整数,按照奇偶性的不同做不同的处理,然后重读执行这一过程,直到结果为1,到底需要循环多少次,没有一个确定的值来表示次数,只需要判断结束的条件(结果不是1),循环就要继续执行下去,所以使用while循环来解决此问题;其次当输入的正整数可能达到2000000时,需要考虑整数类型的范围,为了防止在运算过程中出现溢出的情况,提高代码的健壮性和可移植性,将n的类型修改为long long类型。具体程序代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){long long n;//首先定义正整数变量n cin>>n;//输入n的值 while(n>1){//只要n大于1 long long tmp;//定义临时变量tmp存储对n计算之后的值 if(n%2==0){//如果n为偶数 tmp = n/2;//n为偶数,则执行n除以2 cout<<n<<'/'<<2<<'='<<tmp<<endl;//输出n为偶数的计算过程 n=tmp;//修改n为计算之后的值 }else if(n%2==1){//如果n为奇数 tmp = n*3+1;//n为奇数,则执行n乘以3加1 cout<<n<<'*'<<3<<'+'<<1<<'='<<tmp<<endl;//输出n为奇数的计算过程 n=tmp;//修改n为计算之后的值 }}cout<<"End"<<endl;//最后输出End,如果n的输入值为1,那么不执行while循环,直接输出End return 0;
}