1. 用for语句实现循环结构
1.1 问题的提出
我们经常会遇到需要对某个操作重复执行多次的情况。例如,求1~100的累计和,我们需要将每个数相加并保存结果。这种情况下,使用循环结构可以很方便地解决问题。
【例1-1】求1~100的累计和
下面是求1~100的累计和的一个示例代码:
#include <iostream>
using namespace std;
int main()
{
int sum = 0;
for (int i = 1; i <= 100; i++)
{
sum += i;
}
cout << "1~100的累计和为:" << sum << endl;
return 0;
}
这段代码使用了for语句来实现循环,通过定义一个变量i来追踪循环的次数,每次循环将i加1,并将其累加到sum中。
1.2 for语句的一般格式
for语句的一般格式如下:
for (initialization; condition; increment/decrement)
{
// 执行循环体的代码
}
其中:
- initialization:在循环开始之前执行一次的代码,一般用来初始化循环变量。
- condition:判断循环是否继续的条件,如果条件为true,则继续循环;如果条件为false,则退出循环。
- increment/decrement:每次循环后执行的代码,用来改变循环变量的值。
【例1-2】打印水仙花数
下面是一个打印水仙花数的示例代码:
#include <iostream>
using namespace std;
int main()
{
for (int num = 100; num <= 999; num++)
{
int a = num / 100; // 获取百位数字
int b = (num / 10) % 10; // 获取十位数字
int c = num % 10; // 获取个位数字
if (num == a*a*a + b*b*b + c*c*c)
{
cout << num << "是水仙花数" << endl;
}
}
return 0;
}
在这段代码中,循环变量num的取值范围是100到999,通过将num拆分成百位、十位和个位的三个数字,并判断其立方和是否等于num本身,从而判断是否是水仙花数。
1.3 改变步长
在for循环中,通过改变循环变量的增量或减量,可以控制循环的步长。如果不指定步长,默认步长为1。
【例1-3】求100以内的偶数之和
下面是一个求100以内的偶数之和的示例代码:
#include <iostream>
using namespace std;
int main()
{
int sum = 0;
for (int i = 2; i <= 100; i += 2)
{
sum += i;
}
cout << "100以内的偶数之和为:" << sum << endl;
return 0;
}
在这段代码中,我们通过将i的步长设定为2,从而只取偶数进行累加运算。
2. 使用while语句与do-while语句实现循环结构
2.1 while语句
while语句在执行循环体之前,先判断条件是否成立,如果条件为真,则执行循环体;如果条件为假,则跳出循环。
【例1-4】使用while语句求1~100的累加和
下面是一个使用while语句求1~100的累加和的示例代码:
#include <iostream>
using namespace std;
int main()
{
int sum = 0;
int i = 1;
while (i <= 100)
{
sum += i;
i++;
}
cout << "1~100的累计和为:" << sum << endl;
return 0;
}
在这段代码中,我们先初始化循环变量i为1,然后在每次循环结束后将i加1,直到i超过100为止。
【例1-5】求一个整数的阶乘
下面是一个求一个整数的阶乘的示例代码:
#include <iostream>
using namespace std;
int main()
{
int n;
cout << "请输入一个整数:";
cin >> n;
int result = 1;
int i = 1;
while (i <= n)
{
result *= i;
i++;
}
cout << n << "的阶乘为:" << result << endl;
return 0;
}
在这段代码中,我们首先通过cin输入一个整数n,然后使用while循环计算n的阶乘。
2.2 do-while语句
do-while语句先执行一次循环体,再判断条件是否成立。如果条件为真,则继续执行循环体;如果条件为假,则跳出循环。
【例1-6】用do-while语句求1~100的累计和
下面是一个用do-while语句求1~100的累计和的示例代码:
#include <iostream>
using namespace std;
int main()
{
int sum = 0;
int i = 1;
do
{
sum += i;
i++;
} while (i <= 100);
cout << "1~100的累计和为:" << sum << endl;
return 0;
}
与while语句不同的是,在do-while循环中,循环条件的判断发生在循环体执行之后。
2.3 for语句、while语句与do-while语句的比较
for语句、while语句和do-while语句都可以用于实现循环结构,但在不同的情况下选择合适的循环结构是非常重要的。
- for语句:适用于循环次数已知的情况,循环变量的初始化、条件判断和步长控制都在一条语句中完成,代码简洁。
- while语句:适用于循环次数不确定的情况,条件判断发生在循环体之前,确保至少执行一次循环体。
- do-while语句:适用于循环次数不确定的情况,条件判断发生在循环体之后,确保至少执行一次循环体。
【例1-7】循环次数事先不确定的循环
下面是一个循环次数事先不确定的循环的示例代码:
#include <iostream>
using namespace std;
int main()
{
int num;
int sum = 0;
cout << "请输入一系列正整数,以-1结束输入:";
cin >> num;
while (num != -1)
{
sum += num;
cin >> num;
}
cout << "输入的数的累计和为:" << sum << endl;
return 0;
}
这段代码会循环读取一系列正整数,直到输入-1为止,然后将累计和输出。
【例1-8】使用for语句完成例1-7的功能
下面是使用for语句完成例4-7功能的示例代码:
#include <iostream>
using namespace std;
int main()
{
int num;
int sum = 0;
cout << "请输入一系列正整数,以-1结束输入:";
for (cin >> num; num != -1; cin >> num)
{
sum += num;
}
cout << "输入的数的累计和为:" << sum << endl;
return 0;
}
这段代码中,我们通过将读取输入的代码放在for循环的初始化部分和循环体中,实现了与例1-7相同的功能。
3. continue语句与break语句
3.1 continue语句
continue语句用于跳过循环体中剩余的代码,直接进入下一次循环。
【例1-9】求1~100中不能被3整除的整数之和
下面是一个求1~100中不能被3整除的整数之和的示例代码:
#include <iostream>
using namespace std;
int main()
{
int sum = 0;
for (int i = 1; i <= 100; i++)
{
if (i % 3 == 0)
{
continue;
}
sum += i;
}
cout << "1~100中不能被3整除的整数之和为:" << sum << endl;
return 0;
}
在这段代码中,当i能够被3整除时,通过continue语句跳过了将i累加到sum中的代码。
3.2 break语句
break语句用于跳出最内层的循环,完全终止循环的执行。
【例1-10】从键盘输入一个整数,判断是否是素数
下面是一个从键盘输入一个整数,判断是否是素数的示例代码:
#include <iostream>
using namespace std;
int main()
{
int num;
cout << "请输入一个整数:";
cin >> num;
bool isPrime = true;
for (int i = 2; i <= num / 2; i++)
{
if (num % i == 0)
{
isPrime = false;
break;
}
}
if (isPrime)
{
cout << num << "是素数" << endl;
}
else
{
cout << num << "不是素数" << endl;
}
return 0;
}
在这段代码中,我们通过循环从2到num的一半(即num/2),判断num是否能被这些数整除。如果能被整除,说明num不是素数,将isPrime设为false,并通过break语句跳出循环。否则,说明num是素数。