本题根据C程序设计语言第二版中第一章第一节的华氏温度与摄氏温度转换用例和相关习题揉合而来。主要是用来练习:
1. 如何用一个循环体解决是从华氏转换至摄氏还是摄氏转换至华氏,同时一起解决是顺序打印还是逆序打印;
2. 程序强制只接受指定输入内容;
3. 条件表达式的应用;
4. 标准输出格式;
5. 整除运算符易混淆的地方;
6. 宏定义常数及带参宏定义。
题目:根据给定的华氏温度或者摄氏温度的范围按大小顺序或者逆序打印华氏温度与摄氏温度的对照表。(因为还未练习命令行带参,所以用程序内交互输入解决。)
#define FAHR2CEL(fahr) 5.0/9.0*((fahr)-32)
#define CEL2FAHR(celsius) 9.0/5.0*(celsius)+32
#define TRUE 1
#define FALSE 0
int fahr2celV2(void){
float step,lower,upper,temp;
char b1,b2,ch;
printf("打印华氏温度与摄氏温度的转换表\n");
printf("请输入需要转换的下限温度值\t");
scanf("%f",&lower);
printf("请输入需要转换的上限温度值\t");
scanf("%f",&upper);
printf("请输入温度转换步长值\t");
scanf("%f",&step);
printf("是否是从华氏温度转换为摄氏温度?(y/n)\n");
do{
ch=getchar();
if(ch=='y')b1=TRUE;
else
if(ch=='n')b1=FALSE;
}while(ch!='y'&&ch!='n');//控制只能输入y或者n
printf("是否逆序打印转换表?(y/n)\n");
b2=FALSE;
do{
ch=getchar();
if(ch=='y'){
step=-step;
temp=lower;
lower=upper;
upper=temp;
b2=TRUE;
}
}while(ch!='y'&&ch!='n');
/* 如果为逆序打印,需要交换转换上下限值,并置步长值为负,这样可以通过一个循环体来进行转换 */
//打印表头
if(b1==TRUE)printf("Fahrenheit\tCelsius\n");
else
printf("Celsius\tFahrenheit\n");
while((b2==TRUE)?(lower>=upper):(lower<=upper)){//是否逆序来设置循环结束条件
printf("%6.2f\t\t%6.2f\n",lower,(b1==TRUE)?FAHR2CEL(lower):CEL2FAHR(lower));
lower+=step;
}
return 0;
}
编译环境:GCC for windows V 3.3.1
运行结果如下: