《C语言》循环结构程序设计

198 阅读3分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路

 

一.while循环

1.while循环的一般形式为:

while(表达式){
语句块
}

意思是,先计算“表达式”的值,当值为真(非0)时, 执行“语句块”;执行完“语句块”,再次计算表达式的值,如果为真,继续执行“语句块”……这个过程会一直重复,直到表达式的值为假(0),就退出循环,执行 while 后面的代码。

我们通常将“表达式”称为循环条件,把“语句块”称为循环体,整个循环的过程就是不停判断循环条件、并执行循环体代码的过程。

2.案例

求1+2+3+……10

int i,sum=0;
i=1;             //规定初值
while(i<=10)     //规定终值(或其他循环条件),无分号
{
  sum+=i;        
  i++;           //规定步长
}

 当i=11的时候结束循环

二.do-while循环

1.do-while循环的一般形式为:

do{
循环体
}while(表达式);

 

 

do-while循环与while循环的不同在于:它会先执行“  循环体”,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while 循环至少要执行一次“语句块”。

2.案例

求1+2+3+……10,do-while 循环的用法与while类似

int i,sum=0;
i=1;                   //规定初值
do
{
    sum+=i;
    i++;               //规定步长
}while(i<=10);          //规定终值(或其他循环条件),此行有分号

 

 三.for循环

1.for 循环的一般形式为:

for(表达式1; 表达式2; 表达式3){
语句块
}

它的运行过程为:

  • 先执行“表达式1”。
  • 再执行“表达式2”,如果它的值为真(非0),则执行循环体,否则结束循环。
  • 执行完循环体后再执行“表达式3”。
  • 重复执行前两个步骤,直到“表达式2”的值为假,就结束循环。

 

“表达式1”仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句。“表达式2”一般是一个关系表达式,决定了是否还要继续下次循环,称为“循环条件”。“表达式3”很多情况下是一个带有自增或自减操作的表达式,以使循环条件逐渐变得“不成立”。

2.案例

求1+2+3+……10,do-while 循环的用法与while类似

int i,sum=0;
for(i=1;i<=10;i++)              //i++后面没有分号
{
     sum+=i; 
}

四.break,continue

程序中,有时候并不需要把设定的循环次数都执行完,而是需要提前结束循环或跳过一部分代码直接进入下一轮的循环,这时候用到break,continue。

1.break案例:

找出100~200之间第一个能被3和5都整除的数

没用break前

main() {
	for (int i = 100; i <= 200; i++) {
		if (i % 3 == 0 && i % 5 == 0) {
			printf("%d\n", i);
		}
	}
}

 

发现与题意不合,并不是只找到了第一个能被3和5整除的数

break后

main() {
	for (int i = 100; i <= 200; i++) {
		if (i % 3 == 0 && i % 5 == 0) {
			printf("%d\n", i); break;
		}
	}
}

2.continue案例

从键盘输入两个整数,求他们的最小公倍数

int m, n,i;
	scanf_s("%d%d", &m,&n);
	for (i = 1; i <= m * n; i++) {
		if (i % m != 0) {
			continue;          //若除以m不尽,则转回到i+1换下一个数
		}
		if (i % n == 0)
		{
			break;             //若除尽,意味着已经找到最小公倍数,跳出循环
		}
	}
	printf("%d和%d的最小公倍数是:%d\n", m, n, i);
	return 0;

五.例题

1.编程找出所有的水仙花数。水仙花数是三位数,它的3个数字的立方和等于本身 如:153=1*1*1+5*5*5+3*3*3。

int  a, b, c;
	for (int i = 100; i <= 999; i++) {
		a = i % 10;            //求个位上的数字
		b = i / 10 % 10;       //求出十位上的数字
		c = i / 100;           //求出百位上的数字
		if (a * a * a + b * b * b + c * c * c == i) {
			printf("%5d\n", i);
		}

2.求m,n的最大公约数

辗转相除求最大公约数

先用大数作为被除数,小数作为除数,求余。如果余数不为0,则将原来的除数作为被除数,原来的余数作为除数,继续求余……,直到余数为0,最后一次求余的除数便是最大公约数。

例如:20和12两个数

20/12=1……8

12/8=1……4

8/4=2……0

则20和12的最大公约数为4

//辗转相除求最大公约数
	int m, n, k;                  //k用来存储余数
	scanf("%d%d", &m, &n);
	if (m < n) {                  //若m<n则交换
		int t;                    //在复合语句中也可以定义变量
		t = m;
		m = n;
		n = t;
	}
	k = m % n;
	while (k != 0) {
		m = n;                     //上一次的除数作为被除数
		n = k;                     //上一次的余数作为除数
		k = m % n;                 //求余数

	}
	printf("最大公约数:%d\n", n); //最后一次的除数便是所求
	return 0;

开发者涨薪指南

48位大咖的思考法则、工作方式、逻辑体系