循环结构步伐计划
为什么必要循环控制循环结构或称重复结构
几乎每一种计算机高级语言都提供了循环控制,用来处置惩罚必要进行的重复操纵
大多数的应用步伐都会包含循环结构
循环结构和顺序结构、选择结构是结构化步伐计划的3中基本结构,它们是各种复杂步伐的基本构成单位。
用 while 语句实现循环
while 语句的一般形式:while (表达式) 语句
其中“语句”就是循环体。循环体只能是一个语句,可以是一个简朴的语句,还可以是复合语句(用花括号包起来的多少语句)
实行循环体的次数是由循环条件控制的,这个循环条件就是“表达式”,它也成为循环条件式。
当循环条件式的值为“真”(非0)时,就实行循环,否则就不实行循环语句
在实行 while 语句时,先查抄循环条件表达式的值,当为非0值(真)时,就实行 while 语句中的循环体语句;当表达式为0(假)时,不实行循环体语句
while 循环流程:https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241021191624035-1754551100.png
while循环的特点:先判断条件表达式,后实行循环体语句
例:求1+2+3+...+100的值
//例:求1+2+3+...+100的值
#include <stdio.h>
int main(void)
{
int i = 1, sum = 0;
while (i < 101)
{
sum += i;
i++;
}
printf("%d\n", sum);
return 0;
}在VS编译器内会报C4996错误,办理见下文:(下同)
C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. - EricsT - 博客园 (cnblogs.com)
运行结果:
https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241021192218129-570646781.png
循环体如果包含一个以上的语句,应该用花括号括起来,作为复合语句出现。如果不加花括号则 while 语句的范围只到 while 后面的第一个分号处。
循环体中应该有使循环趋向于结束的语句。
用 do...while 语句实现循环
do...while 语句的实行过程是:先实行循环体,然后再查抄条件是否建立,若建立则再实行循环体。
do...while 语句的特点是:先无条件的实行循环体,然后判断循环条件是否建立
//do...while 语句的一般形式:
do
语句
while (表达式);do...while 循环的流程:https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241021192804335-399120413.png
先实行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(真)时,返回重新实行循环体语句,云云反复,直到表达式的值等于0(假)为止,此时循环结束
例:求1+2+3+...+100的值
//例:求1+2+3+...+100的值
#include <stdio.h>
int main(void)
{
int i = 1, sum = 0;
do
{
sum += i;
i++;
} while (i < 101);
printf("%d\n", sum);
return 0;
}运行结果:
https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241021193209461-1144722386.png
对同一个问题可以用 while 语句处置惩罚,也可以用 do...while 语句处置惩罚。do...while 结构可以转换为 while 结构。
在一般环境下,用 while 语句和用 do...while 语句处置惩罚同一问题时,若二者的循环体部门是一致的,那么结果也是一致的。但是如果 while 后面的表达式一开始就是为假(0值)时,两种循环的结果是不同的,while 循环一次不进行,但是 do...while 循环会进行一次循环。
当 while 后面的表达式的第一次的值为“真”时,两种循环得到的结果雷同;否则,二者结果不雷同(指二者具有雷同的循环体的环境)
用 for 语句实现循环
for 语句更为灵活,不但可以用于循环次数已经确定的环境,还可以用于循环次数不确定而只给出循环结束条件的环境,它完全可以代替 while 语句
//for语句的一般形式:
for (表达式1; 表达式2; 表达式3)
语句3个表达式的主要作用:
[*]表达式1:设置初始条件,只实行一次。可以为零个、一个或多个变量设置初值
[*]表达式2:是循环条件表达式,用来判别是否继续循环。在每次实行循环体前先实行此表达式,决定是否继续实行循环
[*]作为循环的调整,例如使循环变量增值,它是在实行完循环体后才进行的
//for语句的理解:
for (循环变量赋初值; 循环条件; 循环变量增值)
语句for 语句的实行过程:
[*]先求解表达式1
[*]求解表达式2,若此条件表达式的值为真(非0)则实行 for 语句中循环体,然后实行第3步;若为假(0),则结束循环,转到第5步
[*]求解表达式3
[*]转回步骤2继续实行
[*]循环结束,实行 for 语句下面的一个语句
for 循环的过程:https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241021200126456-1734253524.png
//for 语句的一般形式:
for (表达式1; 表达式2; 表达式3)
语句
//改写为 while 语句:
表达式1;
while (表达式2)
{
语句;
表达式3;
}
//二者无条件等价“表达式1”可以忽略,即不设置初值,但是分号不能省略
“表达式2”可以忽略,即不消“表达式2”来作为循环条件表达式,不设置和查抄循环的条件
“表达式3”可以忽略
“表达式1”可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式
“表达式3”也可以是与循环控制无关的恣意表达式
“表达式1”和“表达式3”可以是一个简朴的表达式,也可以是逗号表达式,即包含一个以上的简朴表达式,中间用逗号隔断
在逗号表达式内按自左至右顺序求解,整个逗号表达式的值为最右边的表达式的值
“表达式2”一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值为非零,就实行循环体
从终端键盘向计算机输入时,是在按 Enter 键以后才将一批数据一起送到内存缓冲区中去的。
C语言的 for 语句比其他语言(如 FORTRAN,Pascal)中的 for 语句功能强得多。可以把循环体和一些与循环控制无关的操纵也作为“表达式1”或“表达式3”出现,这样步伐可以短小简洁。太过的利用这一特点会使 for 语句显的紊乱,可读性降低,最好不要把与循环控制无关的内容放到 for 语句中
循环的嵌套
一个循环体内又包含另一个完整的循环结构,称为循环嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。各种语言中关于循环的嵌套的概念是一致的
3种循环( while 循环、do...while 循环和 for 循环)可以互相嵌套。
循环嵌套的例子:https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241021201623952-529158116.png
几种循环的比较
3种循环都可以用来处置惩罚同一问题,一般环境下它们可以互相代替
在 while 循环和 do...while 循环中,只在 while 后面的括号内实行循环条件,因此为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句
for 循环可以在“表达式3”中包含使循环趋于结束的操纵,甚至可以将循环体中的操纵全部放到“表达式3”中。
for 语句的功能更强,凡是用 while 循环能完成的,用 for 循环都能实现
用 while 和 do...while 循环时,循环变量初始化的操纵应在 while 和 do...while 语句之前完成,而 for 语句可以在“表达式1”中实现循环变量的初始化
while 循环、 do...while 循环和 for 循环,都可以用 break 语句跳出循环,用 continue 语句结束本次循环
改变循环实行的状态
可以用 break 语句和 continue 语句来实现提前结束循环
用 break 语句提前终止循环
break 语句还可以用来宠循环体内跳出循环体,即提前结束循环,接着实行循环下面的语句
例:在全系1000弟子中,征集慈善募捐,当总数达到10万元时就结束,统计此时捐款的人数,以及平均每人捐款的数量
//在全系1000学生中,征集慈善募捐,当总数达到10万元时就结束,统计此时捐款的人数,以及平均每人捐款的数目
#include <stdio.h>
int main(void)
{
int iTotle = 100000;
int iSum = 0;
int iCount = 0;
while (1)
{
int money;
printf("请输入捐款数目\n");
scanf("%d", &money);
iSum += money;
iCount++;
if (iSum >= iTotle)
break;
}
printf("捐款人数%d,平均每人捐款的数目%lf", iCount, iSum / (double)iCount);
return 0;
}运行结果:
https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241021231541477-1176161450.png
break 语句的一般形式为:break;其作用是使流程跳到循环体之外,接着实行循环体下面的语句
break 语句只能用于循环语句和 switch 语句之中,而不能单独利用
用 continue 语句提前结束本次循环
例:要求输出100~200之间的不能被3整除的数
//要求输出100~200之间的不能被3整除的数
#include <stdio.h>
int main(void)
{
for (int i = 100; i < 201; i++)
{
if (0 == i % 3)
continue;
printf("%d\t", i);
}
return 0;
}运行结果:
https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241021232257232-2081473886.png
continue 语句的一般形式为:continue;其作用为结束本次循环,即跳过循环体中下面尚未实行的语句,转到循环体结束点之前,接着实行下一次循环
break 语句和 continue 语句的区别
continue 语句只结束本次循环,而不是终止整个循环的实行;而 break 语句则是结束整个循环过程,不再判断实行循环的条件是否建立
https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241021232900739-1032733161.pnghttps://img2024.cnblogs.com/blog/3512406/202410/3512406-20241021232917888-1835572791.png https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241021232937556-1232402705.pnghttps://img2024.cnblogs.com/blog/3512406/202410/3512406-20241021232950499-1396634835.png
如果是双重循环,在内循环体内有一个 break 语句,是提前终止内循环,流程是跳转到内循环体之外(实行内循环体下面的语句)
https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241021233223409-430183553.png
#include <stdio.h>
int main(void)
{
for (int i = 1; i < 5; i++)
{
for (int j = 1; j < 6; j++)
{
printf("%d\t", i * j);
if (5 != j)
continue;
printf("\n");
}
}
return 0;
}运行结果:
https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241021233721752-1749214848.png
循环步伐举例
https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241021234307471-711300204.png
#include <stdio.h>
#include <math.h>
int main(void)
{
double sun = 0;
for (int i = 1; ; i += 2)
{
if (0 == ((i / 2) % 2))
sun += 1.0 / i;
else
sun -= 1.0 / i;
if (fabs(1.0 / i) < 1E-6)
break;
}
printf("%lf", sun * 4);
return 0;
}运行结果:
https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241021235930631-1248424819.png
https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241022000134849-819358574.png
#include <stdio.h>
int main(void)
{
int f1 = 1, f2 = 1;
printf("%10d\t", f1);
printf("%10d\t", f2);
for (int i = 3; i < 41; i++)
{
int temp = f2;
f2 = f1 + f2;
f1 = temp;
printf("%10d\t", f2);
if (0 == (i % 5))
printf("\n");
}
return 0;
}运行结果:
https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241022001004493-719822057.png
例:输入一个大于 3 的整数 n,判定它是否为素数(prime,又称质数)
//输入一个大于 3 的整数 n,判定它是否为素数(prime,又称质数)
#include <stdio.h>
int main(void)
{
int n;
while (1)
{
printf("请输入一个大于3的整数\n");
scanf("%d", &n);
if (n > 3)
break;
}
for (int i = 2; i < n; i++)
{
if (0 == (n % i))
{
printf("不是素数\n");
return 0;
}
}
printf("是素数\n");
return 0;
} 运行结果:
https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241022001928769-1250369617.png
例:求100~200间的全部素数
//求100~200间的全部素数
#include <stdio.h>
int main(void)
{
for (int i = 100; i < 201; i++)
{
char isPrime = 1;
for (int j = 2; j < i; j++)
{
if (0 == (i % j))
{
isPrime = 0;
break;
}
}
if (1 == isPrime)
printf("%d\t", i);
}
return 0;
}运行结果:
https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241022002512691-488932115.png
https://img2024.cnblogs.com/blog/3512406/202410/3512406-20241022002610417-226248217.png
#include int main(void){ char ch; while ('\n' != (ch = getchar())) { if (((ch >= 'A') || (ch = 'a') || (ch
页:
[1]