第五章——循环结构程序设计

一.为什么需要循环控制

1.用顺序语句效率太低

#include <stdio.h>  

int main()
{
	float score1, score2, score3, aver;

	scanf("%f%f%f", &score1, &score2, &score3);

	aver = (score1 + score2 + score3) / 3;

	printf("aver = %7.2f", aver);

	return 0;
}

2.while 循环结构,更高效

#include <stdio.h>  

int main()
{
	float score1, score2, score3,aver;
	int i = 1;

	while (i < 4)
	{
	scanf("%f%f%f", &score1, &score2, &score3);

	aver = (score1 + score2 + score3) / 3;

	printf("aver = %7.2f", aver);

	i++;    // i = i + 1;
	}

	return 0;
}

例:求1+2+3+......+100的结果
#include <stdio.h>  

int main()
{
	int i = 1;    //初始化
	int sum = 0;

	while (i <= 100)    //条件    条件成立,进入循环体
	{
		sum = sum + i;    

		i++;    //迭代表达式    反复循环,直至条件不成立。循环结束
	}

	printf("sum = %d", sum);

	return 0;
}
注:

1.循环体如果包含一个以上的语句,应该用花括号括起来,作为复合语句出现。

2.如果不加花括号,while语句的范围只到while后面第一个分号处。

3.do...while 循环

#include <stdio.h>  

int main()
{
	int i = 1;
	int sum = 0;

	do
	{
		sum = sum + i;

		i++;
	}while (i <= 100);

	printf("%d\n", sum);

	return 0;
}

 

4.while和do...while循环区别如图:

注:

1.while先判断条件,再执行循环体

2.do...while先执行循环体,再判断条件

5.for循环

#include <stdio.h>  

int main()
{
    int i = 0;
    int sum = 0;

    for (i = 1, sum = 0; i <= 100; i++)     //for (初始化; 条件; 迭代表达式)
    {
        sum += i;    // 将i的值加到sum上
    }

    printf("%d\n", sum);

    return 0;
}

6.循环语句的嵌套

 7.用break语句提前终止循环

        在1000名学生中举行慈善募捐,当募捐金额达到10万元时就结束,统计捐款的人数,以及平均每人捐款的金额。


#include <stdio.h>  

int main()
{
	int i = 0;
	int num = 0;
	float money = 0.0;
	float aver = 0.0;
	float total = 0.0;

	for (i = 0; i < 1000; i++)
	{
		printf("请输入募捐的金额:");
		scanf("%f", &money);

		total += money;    //将money加到total上
		num = num + 1;
		aver = total / num;

		if (total >= 1e+5)
		{
			break;    //满足total >= 1e+5,立刻跳出循环
		}
	}
	if(total >= 1e+5)
	{
		printf("募捐成功\n");
		printf("总共捐款:%f\n", total);
		printf("捐款人数:%d\n", num);
		printf("平均每人捐款金额:%f\n", aver);
	}
	else
	{
		printf("募捐失败\n");
		printf("总共捐款:%f\n", total);
		printf("捐款人数:%d\n", num);
		printf("平均每人捐款金额:%f\n", aver);
	}

	return 0;
}

 运行结果:

8.用continue语句提前结束本次循环

输出100~200之间不能被3整除的数

#include <stdio.h> 

int main()
{
	int i = 0;

	for (i = 100; i <= 200; i++)
	{
		if (i % 3 == 0)    //‘%’取余符号	
		{
			continue;	
			// 跳过当前迭代,不执行后面的printf语句,直接进入下一次for循环  
		}
		printf("%d\n", i);
	}

	return 0;
}

9.输出一个4 *5的矩阵

#include <stdio.h> 

int main()
{
	int i = 0;
	int j = 0;

	for (i = 1; i <= 4; i++)
	{
		for(j = 1;j <=5; j++)
		{
		printf("%d\t", i * j);    //\t是一个制表符,用于在打印的输出中插入一个水平制表符
	}

	printf("\n");
	}

	return 0;
}
 注:

\t是一个制表符,用于在打印的输出中插入一个水平制表符

运行结果:

9.1当i = 3,j = 5时,break跳出内层循环
#include <stdio.h> 

int main()
{
	int i = 0;
	int j = 0;

	for (i = 1; i <= 4; i++)
	{
		for(j = 1;j <=5; j++)
		{
			if (i == 3 && j == 1)    //满足条件,执行break语句
			{
				break;
			}
		printf("%d\t", i * j);
	}

	printf("\n");
	}

	return 0;
}

运行结果:

9.2当i = 3,j = 5时,continue跳出内层循环的其中一次结果的打印
#include <stdio.h> 

int main()
{
	int i = 0;
	int j = 0;

	for (i = 1; i <= 4; i++)
	{
		for(j = 1;j <=5; j++)
		{
			if (i == 3 && j == 1)
			{
				continue;
			}
		printf("%d\t", i * j);
	}

	printf("\n");
	}

	return 0;
}

运行结果:

注:

1.第三行第一列 i * j = 3 被continue跳过了,同一列的数向前补充

2.continuebreak在嵌套循环中的主要区别在于它们对循环流程的控制方式

continue只是跳过当前迭代,而break则是完全终止循环(或至少是当前层级的循环)。

例5.7 求π的近似值

#include <stdio.h> 
#include <math.h> 

int main()
{
	int i = 1;
	int flag = 1;
	double sum = 0.0;
	double pi = 0.0;

	while (1)    //直接进入循环体
	{
		if(fabs(flag * (1.0 / i)) < 1e-6)
			break;
		sum += flag * (1.0 / i);
		i += 2;
		flag = -flag;
	}

	pi = 4 * sum;

	printf("π的近似值为:%lf\n", pi);

	return 0;
}
注:

1.if语句后直接放置一个分号(;

当在C语言的if语句后直接放置一个分号(;),这会导致if语句本身只包含其后的分号作为“空操作”(即什么也不做)。紧随其后的任何语句(如breakcontinue、赋值语句等)将不再属于if语句的一部分,而是无条件地执行。

2.while (1)

是一种常见的编程结构,用于创建一个无限循环。这里的 1 总是被评估为真(true)

3.fabs()函数

fabs() 函数用于计算一个浮点数的绝对值        //在#include<math.h>库中

例5.8 兔子的繁殖问题

斐波那契数列:1、1、2、3、5、8、13、21、34……

#include <stdio.h> 

int main()
{
	int n = 0;
	scanf("%d", &n);

	// 对于n为1或2的情况,直接输出1  
	if (n == 1 || n == 2)
	{
		printf("%d", 1);
	}
	else 
	{
	// 对于n > 2的情况,初始化前两个数并使用循环计算第n个数  
		int f1 = 1;
		int	f2 = 1;
		int	f3 = 0;

		for (int i = 3; i <= n; i++)
		{
			f3 = f1 + f2;
			f1 = f2;
			f2 = f3;
		}

		printf("%d", f3);
	}

	return 0;
}
代码逻辑:

1.前两个月兔子不繁殖。所以当n = 1或n = 2时,直接输出1。       //减少了不必要的内存使用

2.        int f1 = 1;        f3 = f1 + f2;           
           int f2 = 1;        f1 = f2;
           int f3 = 0;        f2 = f3

先给f1、f2赋初值为1,当n>3时,进入for循环,i++,f3的值会被覆盖

f1 = f2;       
f2 = f3;

然后将f1更新为f2的值,将f2更新为f3的值(即刚刚计算出的新值),为下一次迭代做准备。

3.循环结束后用printf函数输出斐波那契数列的第n个数。

例5.9 输入一个大于3的整数n,判断它是否为素数
#include <stdio.h> 

int main()
{
	int n = 0;
	int i = 0;

	printf("请输入一个大于1的整数:");
	scanf("%d", &n);

	// 检查 n 是否大于 1  
	if (n <= 1) 
	{
		printf("这个整数不是素数:\n");
		return 0;
	}

	for (i = 2; i < n; i++)
	{
		if (n % i == 0)
			break;
	}
	if (i < n)
		printf("这个整数不是素数\n");
	else
		printf("这个整数是素数\n");
	
	return 0;
}
例5.11 译密码
#include <stdio.h> 

int main()
{
	char c;

	c = getchar();		//读取用户输入的单个字符,并将其存储在变量 c 中

	while (c != '\n')	//只要变量 c 的值不等于换行符 '\n',就继续执行循环体内的代码
	{
		if (c >= 'a' && c <= 'v' || c >= 'A' && c <= 'V')
		{
			c = c + 4;
		}
		else if(c >= 'w' && c <= 'z' || c >= 'W' && c <= 'Z')
		{
			c = c + 4 - 26;
		}

		printf("%c", c);

		c = getchar();		//再次调用 getchar() 读取下一个字符,继续循环
	}

	putchar('\n');	//结束循环

	return 0;
}
注:

putchar('\n');        //输出一个换行符

putchar 函数用来输出单个字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值