编程菜鸟到大佬之路:C语言程序(七)
第七天学习精要
for循环
for循环语句
- for循环一般用于将某段代码(语句组)重复执行若干次。
- 第一步:计算“表达式1”。
- 第二步:计算“表达式2”,若其值为true,则执行“{ }”中的语句组,然后转到第三步;若为false,则不再执行“{}”中的语句组,for语句结束,转到第五步。
- 第三步:计算“表达式3”。
- 第四步:转到第二步。
- 第五步:从for语句后面继续往下执行程序。
for( 表达式1 ;表达式2;表达式3) { 语句组 }
# include <iostream>
using namespace std;
int main()
{
int i; // i是循环控制变量
for (i = 0; i < 26; ++i)
{
cout << char('a' + i); // 'a'+i强制转换成char类型
}
return 0;
}
# 第二种写法
# include <iostream>
using namespace std;
int main()
{
for (int i = 0; i < 26; ++i)
// 语句组里只有一条一句就可以不用写”{ }”
cout << char('a' + i);
return 0;
}
-
循环控制变量定义在"表达式1"中,则其只在for语句内部起作用,可以不用担心循环控制变量重名。
-
循环控制变量并非每次只能加1,for循环可以嵌套,形成多重for循环。
-
for循环结构里的“表达式1”和“表达式3”都可以是用逗号连接的若干个表达式。
for( int i= 15, j = 0; i > j; i-=2, j+= 3)
cout << i << "," << j << endl;
- 例题: 写一个程序,输入一个正整数n,从小到大输出它的所有因子。
# include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; ++i)
{
if (n % i == 0)
cout << i << endl;
}
return 0;
}
- 例题: 给定正整数n和m,在1至n这n个数中,取出两个不同的数,使得其和是m的因子,问有多少种不同的取法。
# include <iostream>
using namespace std;
int main()
{
int n, m, total = 0; // total表示取法总数
cin >> n >> m;
for (int i = 1; i < n; ++i) // 取第一个数,共n-1种取法
{
// 第二个数要比第一个数大,以免取法重复
for (int j = i + 1; j <= n; ++j)
{
if (m % (i + j) == 0)
total += 1;
}
}
cout << total;
return 0;
}
-
for 语句括号里面的“表达式1”,“表达式2”,“表达式3”任何一个都可以不写,甚至可以全都不写,但是“;”必须保留。
-
可以用 break 语句从 for( ; ;)死循环中跳出。
while循环和do…while循环
while循环
- 并非到达指定次数,而是满足某条件时即停止循环,则适合用while语句来实现循环。
-
第一步:判断“表达式”是否为真,如果不为真,则转第四步。
-
第二步:执行“语句组”。
-
第三步:转第一步。
-
第四步:while语句结束,继续执行while语句后面的语句。
while(表达式) { 语句组 }
-
- 例题:输入若干个(至少1个)不超过100的正整数,输出其中的最大值、最小值以及所有数的和。输入的最后一个数是0,标志着输入结束。
# include <iostream>
using namespace std;
int main()
{
int min = 150, max = 0, n, sum = 0;
cin >> n;
while (n <= 100 && n > 0)
{
if (n > max)
max = n;
if (n < min)
min = n;
sum = sum + n;
cin >> n;
}
cout << max << "," << min << "," << sum;
return 0;
}
- 例题:用牛顿迭代法求输入的数的平方根。
- 欲求a的平方根,首先猜测一个x1?=a/2(也可以是随便什么其他值)作为其平方根
- 根据迭代公式: xn+1?=(xn?+a/xn?)/2算出x2?
- 再将x2?代入公式右边算出x3?……
- 直到连续两次算出的xn?和xn+1?的差的绝对值小于某个值ε,即认为找到了足够精确的平方根。
- 这个ε值取得越小,计算出来的平方根就越精确。
# include <iostream>
using namespace std;
double EPS = 0.001; //用以控制计算精度
int main()
{
double a; // 输入a,要求a的平方根
cin >> a;
if (a >= 0)
{
double x = a / 2;
double lastX = x + 1 + EPS; // 确保能够进行至少一次迭代
//只要精度未达要求,就继续迭代
while (x - lastX > EPS || lastX - x > EPS)
{
lastX = x;
x = (x + a/x)/2;
}
cout << x;
}
else
{
cout << "It can't be nagitive.";
}
return 0;
}
do…while循环
-
如果希望循环至少要执行一次,就可以使用do…while语句。
-
每执行一次循环后,都要判断“表达式”的值是否为真,如果真就继续循环,如果为假,就停止循环。
do {
语句组
} while(表达式);
- 输出1到10000以内所有2的整数次幂:
int n = 1;
do {
cout << n << endl;
n *= 2;
} while( n < 10000);