C语言-for循环

/*输出华氏-摄氏温度转换表,华氏温度取值[lower, upper],每次增加1℉*/
#include <stdio.h>

int main(void)
{
	/*fahr表示华氏度,celsisu为摄氏度,lower为华氏温度下限,upper为上限*/	
	int fahr, lower, upper;
	double celsius;
	
	printf("Enter lower:");			
	scanf("%d", &lower);			
	printf("Enter upper:");		
	scanf("%d", &upper);
	
	/*判断输入数据的合法性,即lower是否小于等于upper*/
	if (lower <= upper)	{			/*lower小于等于upper时,转换温度并输出*/
		printf("fahr celsius\n");	/*输出温度转换表的表头*/
		/*温度重复转换:华氏温度从lower开始,到upper结束,每次增加1℉*/
		for (fahr=lower; fahr<=upper; fahr++) {
			celsius = (5.0/9.0)*(fahr-32);	/*温度转换计算*/
			printf("%4d%6.1f\n", fahr, celsius); 
		} 
	} else {						/*lower大于upper时*/
		printf("Invalid Value!\n");	/*输出错误提示*/
	} 

	return 0;
}

输出效果:

Enter lower: 30 ‾ \underline{30} 30
Enter upper: 35 ‾ \underline{35} 35
fahr celsius
  30  -1.1
  31  -0.6
  32   0.0
  33   0.6
  34   1.1
  35   1.7

其中下划线内容表示输入的数据。

1、for语句

  C语言中,for语句用于循环,是用来重复执行C语言的语句。for语句的一般形式为:

for (表达式1;表达式2;表达式3)
	循环体语句

  在for语句中,用两个分号分隔3个表达式,但for的后面没有分号,因为for与其后的循环体语句合起来作为一条完整的语句。其流程框图如下:

  先计算表达式1;再判断表达式2,若值为"真",则执行循环体语句,并接着计算表达式3,然后继续循环;若值为"假",则结束循环,继续执行for的下一条语句。在for语句的执行过程中,表达式2、循环体语句和表达式3将重复执行,而表达式1只有在进入循环前执行一次
(1)表达式1:初值表达式,对循环变量赋初值,从而指定循环的起点。例如fahr=lower,将fahr的初始值设为lower,循环从lower开始。
(2)表达式2:条件表达式,给出循环的条件,通常判断循环变量是否超过循环的终点。若该表达式为“真”,则执行循环体;为“假”,则循环结束。例fahr<=upper,即为一旦fahr的值超过upper,那么就会结束循环。
(3)表达式3:步长表达式,一般用于循环的步长,改变循环变量的值,从而可以改变表达式2的结果。如fahr++,这里fahr的值自增1,一直到fahr>upper,使得表达式2的值为“假”,使得循环结束。
(4)循环体语句:这里是循环反复执行的语句。若不加大括号,则只能是一条语句,若加上大括号,则会执行大括号内的所有语句,这里规则同if语句。

注:1、for语句的表达式1,表达式2,和表达式3均可以省略,即仅由一个分号(;)构成,这被称为空语句,什么也不做。for语句的表达式2省略的话,代表永远为真,就是一个死循环。一般应避免死循环的出现。
2、for(表达式1;表达式2;表达式3);该个在for语句括号后面添加了一个分号,这种情况下for语句的循环体就是空语句,即没有循环体。这种情况编译器不会报错,一般不会使用这样的语句,一定要注意这种情况,容易出现逻辑错误。

2、指定次数的循环程序设计

for语句一般常用于知道次数的循环程序。下面为几个示例:

例1:输入一个正整数n,求 ∑ i = 1 n i \sum_{i=1}^{n}{i} i=1ni

/*计算1+2+3+...+n*/
#include <stdio.h>

int main(void)
{
	int i, n, sum;
	
	printf("Enter n:");		
	scanf("%d", &n);		
	sum = 0;				/*置累加和sum的初始值为0*/
	for (i=1; i<=n; i++){	/*循环执行n次*/
		sum = sum +i;	
	}
	printf("Sum of numbers from 1 to %d is %d\n", n, sum);
	
	return 0;
} 

Enter n: 100 ‾ \underline{100} 100
Sum of numbers from 1 to 100 is 5050

这个无穷级数的求和公式为 n ( n + 1 ) 2 \frac{n(n+1)}{2} 2n(n+1),可以进行验证结果是否正确。

例2:输入一个正整数n,计算 1 − 1 3 + 1 5 − 1 7 1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7} 131+5171+…的前n项之和。

/*计算1-1/3+1/5-1/7+...共n项之和*/
#include <stdio.h>

int main(void)
{
	int denominator, flag, i, n;
	double item, sum;
	
	printf("Enter n:");	
	scanf("%d", &n);
	flag = 1;				/*flag表示第i项的符号,初始为正*/
	denominator = 1;		/*denominator表示第i项的分母,初值为1*/
	item = 1;
	sum = 0;
	/*用for语句实现循环,循环执行n次*/
	for (i=1; i<=n; i++){
		sum = sum + item;
		flag = -flag;		/*改变符号,为下一次循环做准备*/
		denominator = denominator+2;	/*分母递增2,为下一次循环做准备*/
		item = flag*1.0/denominator;	/*计算第i+1项的值,为下一次循环做准备*/
	}
	printf("sum = %f\n", sum);
	
	return 0;
}

Enter n: 7 ‾ \underline{7} 7
sum = 0.820935

这是一个交错级数,根据 arctan ⁡ x \arctan{x} arctanx的麦克劳林展式:

arctan ⁡ x = x − 1 3 x 3 + 1 5 x 5 − ⋯ + ( − 1 ) n 1 2 n + 1 x 2 n + 1 \arctan{x} = {x} - \frac{1}{3}x^3+\frac{1}{5}x^5 - \cdots + (-1)^{n} \frac{1}{2n+1}x^{2n+1} arctanx=x31x3+51x5+(1)n2n+11x2n+1
易得,当 x = 1 x=1 x=1时,该交错级数收敛于 π 4 \frac{\pi}{4} 4π,即 1 − 1 3 + 1 5 − 1 7 + ⋯ = π 4 1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+\cdots=\frac{\pi}{4} 131+5171+=4π。程序中的n代表的是有效项。该级数可以用来逼近 π \pi π,但是收敛速度比较慢。

例3:从键盘输入一个正整数,计算 n ! n! n!

/*输入一个正整数n,求n!*/
#include <stdio.h>

int main(void)
{
	int i, n;
	double product;		/*变量product中存放阶乘的值*/
	printf("Enter n:");
	scanf("%d", &n);
	product = 1;		/*置阶乘product的初始值为1,不能置为0,否则其值恒为0*/
	for (i=1; i<=n; i++){ /*循环执行n次,计算n!*/
		product = product*i;
	}
	printf("product = %.0f\n", product); /*%.0f指定输出时不要小数部分*/
	
	return 0;
} 

Enter n: 6 ‾ \underline{6} 6
product = 720

注:当n较大(n>12)时,就无法用正整数正确表示n!,所以这里把product定义成双精度浮点型变量。

例4:输入一个正整数n,生成一张2的乘方表,输出 2 0 2^0 20 2 n 2^n 2n的值。

#include <stdio.h>
#include <math.h>	/*程序中调用了数学函数,需包含头文件math.h*/

int main(void)
{
	int i, n;
	double power;
	
	printf("Enter n:");	
	scanf("%d", &n);
	for (i=0; i<=n; i++){
		power = pow(2, i);	/*调用幂函数pow(2,i)计算2的i次方*/
		printf("pow(2, %d) = %.0f\n", i, power);
	}
	
	return 0;
}

Enter n: 5 ‾ \underline{5} 5
pow(2, 0) = 1
pow(2, 1) = 2
pow(2, 2) = 4
pow(2, 3) = 8
pow(2, 4) = 16
pow(2, 5) = 32

例5:输入一个正整数n( n ≤ 16 n\leq16 n16),生成一张阶乘表,输出 0 ! 0! 0! n ! n! n!的值。

/*定义和调用求阶乘函数生成阶乘表*/	
#include <stdio.h>

double fact(int n);		/*自定义函数的声明(简称函数声明)*/

int main(void)
{
	int i, n;
	double result;
	
	printf("Enter n:");	
	scanf("%d", &n);
	for (i=0; i<=n; i++){
		result = fact(i);	/*调用自定义函数fact(i)计算i!*/
		printf("%d! = %.0f\n", i, result);
	}
	
	return 0;
}

/*定义n!的函数*/
double fact(int n)	/*函数首部*/
{
	int i;
	double product;	/*变量product用于存放结果(阶乘的值)*/
	
	/*计算n!*/
	product = 1; 
	for (i=1; i<=n; i++){	/*循环n次,计算n!*/
		product = product*i;
	}
	
	return product;		/*将结果回送主函数*/
}

Enter n: 4 ‾ \underline{4} 4
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24

C语言中没有求阶乘的标准库函数,本例中自己定义了一个求阶乘的函数fact(n)用来计算n的阶乘。在C语言中,函数可以做到一次定义,多次调用,是解决一类问题的统一实现方法,可以使程序设计模块化。

参考 C语言程序设计(第4版)/何钦铭,颜晖
例题及课后习题参考程序:https://gitee.com/sgxgitee/mooc-c

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言双重for循环是指在程序中使用两个嵌套的for循环。在双重for循环中,外层循环控制内层循环的执行次,内层循环在外层循环每次执行时都会完整地执行一次。通过双重for循环,我们可以实现对二维组的遍历、多次嵌套的操作以及其他需要重复执行的任务。 在引用中,我们可以看到一个三层for循环的例子。该程序通过三层嵌套的循环输出了三层的循环变量i、j、k的值,以及相应的循环提示信息。外层循环每次执行一次,中层循环在外层循环每次执行时都会完整地执行三次,内层循环在中层循环每次执行时都会完整地执行三次。 在引用中,我们可以看到一个双层for循环的例子。该程序使用两个嵌套的for循环输出了循环变量i、j的值以及相应的循环提示信息。外层循环在每次执行时,会完整地执行一次内层循环,内层循环在外层循环每次执行时都会完整地执行三次。 在引用中,我们可以看到一个嵌套的for循环的例子,其中外层循环控制内层循环的执行次。该程序输出了循环变量i、j、k的值以及相应的循环提示信息。外层循环在每次执行时,内层循环会根据外层循环的当前值限制内层循环的执行次。 总之,C语言的双重for循环是一种常用的循环结构,可以用来实现对二维组的遍历和其他需要多次嵌套的操作。通过控制外层循环和内层循环循环条件,我们可以灵活地控制循环的执行次和顺序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [C语言-多层for循环详解](https://blog.csdn.net/weixin_45571585/article/details/126698216)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [C语言基础语法第三章流程控制 双层for循环示列](https://blog.csdn.net/Taylorswift_TS/article/details/130554436)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值