/*输出华氏-摄氏温度转换表,华氏温度取值[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} 1−31+51−71+…的前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=x−31x3+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}
1−31+51−71+⋯=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 n≤16),生成一张阶乘表,输出 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