C语言学习(五)之循环

一、 循环

1.1 定义

在程序中,某些代码会被一直重复循环的执行,直到满足一些条件时,就会退出,这部分的代码就包含在循环结构中。

1.2 循环分类

在C语言中,循环主要有三种,for循环、while循环和do…while()循环。下面会详细介绍。

1、for()循环
2、while()循环
3、do...while()循环 

1.3 真假判断

在介绍循环之前,先说明在C语言中对真假的判断。循环是在满足条件为真时,就会退出循环,所以知道对真假的判断就十分重要。在C语言中:

1、非零即真
2、0为假

1.3.1 C语言中真假的示例

#include <stdio.h>


int main(){
    
    

    int num1 = 5;   // 5为非零数,则为真。-5时同样的结果
    int num2 = 0;   // 为0则为假

    int num3 = num1 && num2;    // 逻辑与同为真时则为真,有一个为假则为假,所以结果为 0
    int num4 = num1 || num2;    // 逻辑或同为假时则为假,有真则为1,所以输出结果为 1
   
   printf("%d\n", num3);  // 结果为:0
   printf("%d", num4);  // 结果为:1

    return 0;
}

二、for()循环

2.1 语法

for(exp1; exp2; exp3){
		statement
}

for循环后面的圆括号中有3个表达式,分别用分号隔开。其中:

1、表达式1是初始化,只会在for循环开始时执行一次。
2、表达式2是测试条件,在执行循环之前对表达式求值。如果表达式为假,则循环结束。
3、表达式3是执行更新,在每次循环结束时求值。

2.2 示例程序

2.2.1 for循环求和1-10

# include <stdio.h>

int main(void)
//1-10的加法
{
    
    
	int i; // 定义i变量
	int sum = 0;	// 定义并初始化求和结果的变量
	for (i = 1; i <= 10; i++)//i=1为初始化i变量的值,i<=10为测试条
	//件,在本例中当i=11时,表达式2为假,则跳出循环。i++为执行循环的更新
	//条件,执行一次循环,i+1
		sum = sum + i;
	printf("sum = %d", sum);
	return 0;
}

2.2.2 for循环求1-10的奇数和

# include <stdio.h>

int main(void)
{
    
    
	int i;
	int sum = 0;
	// 同上,当表达式3为i+=2时,循环每次的更新条件为i+2,就会过滤掉偶
	// 数,从而奇数相加
	for (i = 1; i <= 10; i+=2)
			sum = sum + i;
	printf("sum = %d", sum);
	return 0;
}

2.2.3 for循环求1-100之间能被3整除数的和

# include <stdio.h>

int main(void)
{
    
    
	int i;
	int sum = 0;
	for (i = 1; i <= 100; ++i)
	// if判断1-100之间的数,只有能被3整除时,才会被相加
		if (i % 3 == 0)
			sum = sum + i;
		printf("sum = %d\n", sum);
	return 0;
}

2.2.4 for循环求1-100之间的奇数之和,奇数的个数,奇数的平均值

#include <stdio.h>

// 求1-100之间的奇数之和,奇数的个数,奇数的平均值
int main(void)

{
    
    
	int i, j = 0, sum_j = 0;
	float aver_j;
	for (i = 1; i <= 100; ++i)
		if (i % 2 != 0)
		{
    
    
			sum_j = sum_j + i;
			j++;
			aver_j = sum_j / j;
		}
		printf("奇数个数为:%d 奇数之和为:%d 平均值为:%f\n", j, sum_j, aver_j);
}

2.2.2 for循环求1+1/2+…+1/100

#include <stdio.h>

int main(void)
// 1+1/2+...+1/100
{
    
    
	int i;
	float sum = 0;
	for (i = 1; i <= 100; ++i)
	{
    
    
		sum = sum + 1 / (float)(i);//也可以写为sum = sum + 1.0/ i 
	}
	printf("%f\n", sum);
	return 0;
}

2.3 for循环嵌套

for循环里面在套一层for循环,就构成了for循环嵌套。
结构示例:

for (int i = 0; i < count; i++) // 外层for循环
{
    
    
    for (int j = 0; j < count; j++)	//内层for循环
    {
    
    
        /* code */
    }   
}

2.3.1for循环嵌套打印乘法表

#include <stdio.h>

int main(){
    
    

int i, j;

for (int i = 1; i < 10; i++)    // 外层循环
{
    
    
    for (int j = 1; j <= i ; j++)   // 内层循环
    {
    
    
        printf("%d * %d = %d\t", i, j, i*j);
    }
     printf("\n");
}
    return 0;
}

三、while()循环

3.1 语法

while ( expression){
		statement
}

1、statement部分可以是分号结尾的简单语句,也可以是花括号括起来的符合语句
2、如果expression为真,执行statement部分一次,然后再次判断expression。在expression为假之前,循环的判断和执行一直重复执行。每一次的循环称为一次迭代
3、while循环有一点非常重要:在构建while循环时,必须让测试表达式有所变化,表达式最终为假,否则,循环就不会终止。

3.2 示例程序

3.2.1 while循环求和1-100和

#include <stdio.h>

int main(void)

{
    
    
	// 定义自增变量
	int i = 1;
	// 定义求和结果变量
	int sum = 0;
	// while循环
	while (i < 101)
	{
    
    
		sum = sum + i;
		// 自增变量
		++i;
	}
	printf("sum = %d", sum);
	return 0;
}

3.3 for与while互相转换

for(exp1; exp2; exp3){
    
    
	statement
}

等价于:


exp1;
while(exp2){
    
    
	statement;
	exp3;
}

while和for可以相互转化,但for的逻辑性更强,更不容易出错,推荐多使用for。

四、do…while()循环

for循环和while循环都是入口条件循环,即在循环的每次迭代之前检查测试条件,所以有可能根本不执行循环体中的内容。C语言还有出口条件循环,即在循环的每次迭代之后检查测试条件,这就保证了至少执行循环体中的内容一次。这种循环称为do…while循环。

4.1 语法

do
{
    
    
	statement;
}while(expression);

4.2 示例程序

4.2.1 检查输入数字是否正确

#include <stdio.h>

int main(){
    
    

// 定义并初始化只读变量
const int secret_code = 11;
// 定义输入的变量
int enter_code;

do
{
    
    
	// 先打印输出语句
    printf("please enter secret code:");
    // 接收键盘输入的数字
    scanf("%d", &enter_code);
    // 判断输入的数字是否和规定的相同,如果不相同,执行循环,如果相同,打印输出内容
} while (secret_code != enter_code);
printf("Congulation!");
    return 0;
}

do…while并不等价于for,也不等价于while。

五、 break和continue

一般而言,程序进入循环后,在下一次循环测试之前会执行完循环体中的所有语句。continue和break可以根据循环体中的测试结果来忽略一部分循环内容,甚至结束循环。

5.1 break

程序执行到循环中的break语句时,会终止包含它的循环,并执行下一阶段的程序。

5.1.1 示例程序

#include <stdio.h>

int main(){
    
    

int ret = 3;

for(int i = 0; i < 5; i++){
    
    
	// 判断i的值是否等于ret,如果等于则跳出循环
    if (i == ret)
    {
    
    
        break;  
    }
    printf("hello world\n");  // 输出三句hello world
}
    return 0;
}

5.1.2 注意事项

1、break如果用于循环是用来终止循环。
2、break如果用于switch,则是用来终止switch。
3、break不能直接用于if,除非if属于循环内部的一个子句。
4、在多层循环嵌套中,break只能终止距离它最近的循环。

在这里插入图片描述
在这里插入图片描述

5.2 continue

3种循环都可以使用continue语句。执行到该语句时,会跳过本次迭代的剩余部分,并开始下一轮迭代。如果continue语句嵌套在循环内,则只会影响包含该语句的内层循环。

5.2.1 for示例程序

#include <stdio.h>

int main(){
    
    

for(int i = 0; i <= 5; i++){
    
    
   
	// 当i等于3时,跳过i=3的本次循环
    if (i == 3)
    {
    
    
        continue;
    }
    printf("i=%d hello world\n", i);
    }
    return 0;
}

// 输出结果:
// i=0 hello world
// i=1 hello world
// i=2 hello world
// i=4 hello world
// i=5 hello world

5.2.2 while示例程序

#include <stdio.h>

int main(){
    
    

int i = 0;

while (i < 5)
{
    
    
	// 当i=3时跳过本次循环,但注意,在跳过之前需要将i+1,
	// 否则i会始终等于3,而不能退出循环
    if (i == 3){
    
    
        i++;
        continue;        
    }     
    printf("i=%d Hello world\n", i);
    i++;
}
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_46292926/article/details/127568810