PTA浙大版《C语言程序设计(第3版)》练习2-12 输出华氏-摄氏温度转换表

输入2个正整数lowerupperlowerupper≤100),请输出一张取值范围为[lowerupper]、且每次增加2华氏度的华氏-摄氏温度转换表。

温度转换的计算公式:C=5×(F−32)/9,其中:C表示摄氏温度,F表示华氏温度。

输入格式:

在一行中输入2个整数,分别表示lowerupper的值,中间用空格分开。

输出格式:

第一行输出:"fahr celsius"

接着每行输出一个华氏温度fahr(整型)与一个摄氏温度celsius(占据6个字符宽度,靠右对齐,保留1位小数)。

若输入的范围不合法,则输出"Invalid."。

输入样例1:

32 35

输出样例1:

fahr celsius
32   0.0
34   1.1

输入样例2:

40 30

输出样例2:

Invalid.

代码如下:

#include<stdio.h>
int main()
{
	int a,b,i;
	double c;
	scanf("%d %d",&a,&b);

	if((b>=a)&&(b<=100)){
		printf("fahr celsius\n");
		for(i=a;i<=b;i=i+2){
			c=(5.0/9.0)*(i-32);
			printf("%d%6.1lf\n",i,c);
		}
	}

    else
		printf("Invalid.");
    
	return 0;
}

 

<think>好的,我现在需要帮助用户找到用C语言实现华氏-摄氏温度转换表PTA习题解决方案。用户之前已经提供了Python的实现,但现在需要C语言本。让我先回顾一下用户的问题相关引用内容。 用户提供的引用中有多个C语言代码示例,比如引用1、3、4、5都是不同的实现。需要综合这些代码,找出共同点正确的做法,同时确保符合题目要求。 首先,题目要求是输入两个整数lowerupper,满足lowerupper≤100,输出华氏到摄氏的转换表,每次增加2华氏度。如果输入不合法,输出Invalid.。输出格式要求第一行是fahr celsius,接着每行华氏温度是整型,摄氏温度占6个字符宽度,右对齐,保留一位小数。 接下来,我需要检查各个引用中的代码是否符合这些要求。例如,引用1的代码使用了while循环,每次增加2,但需要注意输出格式是否有空格。引用3的代码在for循环中处理了步长,但可能需要检查条件判断是否正确。引用45也有不同的实现方式,比如使用do-while循环或者不同的条件判断。 需要特别注意的地方包括输入验证是否包括upper超过100的情况,以及输出格式是否正确,比如华氏摄氏温度之间的空格或对齐方式。例如,引用1中提到在C语言代码中,printf的格式字符串里%d%f之间没有空格,否则会导致输出不符合要求。这一点很重要,因为PTA的测试用例对格式要求非常严格。 另外,各个引用中的输入验证条件是否全面。例如,引用4中判断upper>100,而引用5中判断upper>100或lower>upper。需要确保代码中同时检查lower>upperupper>100的情况,否则可能遗漏某些非法输入。 还有摄氏温度的计算是否正确,是否使用了浮点数运算,比如分母是9.0或者5.0乘以,以确保结果不是整数除法。例如,引用3中的代码使用了F*1.0来转换为浮点数,而其他引用可能直接使用9.0作为分母。 综合这些信息,正确的C语言代码应该包括: 1. 输入lowerupper,检查是否lower>upper或者upper>100,如果是则输出Invalid。 2. 输出表头fahr celsius,注意中间的空格。 3. 使用循环从lower开始,每次增加2,直到upper。 4. 在循环中计算摄氏温度,使用5.0*(F-32)/9.0确保浮点运算。 5. 输出时,华氏温度用%d,摄氏温度用%6.1f,并且两者之间没有空格,因为题目中的示例输出显示没有空格,例如32 0.0,中间是多个空格,但实际是华氏温度占整型,然后直接接6位宽度的摄氏温度。 需要注意,在C语言的printf中,格式字符串"%d%6.1f"会自动在数字后面填充空格以达到6位宽度,因此不需要在%d%6.1f之间加空格,否则会导致输出格式错误。 此外,循环结构可以选择for、while或do-while,但需要确保在lower超过upper时不会执行循环。例如,使用for循环时,初始条件应为fahr = lower,继续条件为fahr <= upper,步长增加2。 现在需要将上述分析整合成一个正确的代码示例,并解释关键点,确保用户理解每个部分的作用,特别是格式输出输入验证。同时,需要提醒用户注意常见的错误,比如步长错误、格式对齐错误边界条件处理。 最后,生成相关问题,帮助用户进一步理解练习相关知识点,比如输入验证的其他情况、格式化输出的调整,或者扩展到其他温度单位。</think>根据PTA习题要求,以下是用C语言实现华氏-摄氏温度转换表的完整方案及解析: ### 标准实现代码 ```c #include <stdio.h> int main() { int lower, upper; scanf("%d %d", &lower, &upper); // 输入验证 if (lower > upper || upper > 100) { printf("Invalid."); } else { printf("fahr celsius\n"); // 循环生成温度表(步长2) for (int f = lower; f <= upper; f += 2) { double c = 5.0 * (f - 32) / 9.0; printf("%d%6.1f\n", f, c); // 关键格式控制 } } return 0; } ``` ### 核心实现要点 1. **输入验证逻辑** - 同时检查 $lower \leq upper$ $upper \leq 100$[^1][^4] - 非法输入包括:`40 30`(逆序)、`90 110`(越界)等 2. **温度转换计算** - 必须使用浮点运算:`5.0 * (f - 32) / 9.0` - 若分母写为整数9会导致整数除法错误(如:32℉将错误计算为0℃而非0.0℃)[^3] 3. **格式化输出控制** | 元素 | 格式说明 | 示例 | |---|---|--| | 表头 | 固定字符串 `fahr celsius` | 直接输出 | | 华氏温度 | `%d` 整型 | 32 | | 摄氏温度 | `%6.1f`(6字符宽+右对齐+1位小数) | `  0.0` | - **特别注意**:`printf`中`%d`与`%6.1f`之间不能添加空格[^1] ### 执行流程示意图 ```mermaid graph TD A[开始] --> B[输入lower,upper] B --> C{验证合法性} C -->|非法| D[输出Invalid.] C -->|合法| E[输出表头] E --> F[循环生成温度行] F --> G[计算摄氏温度] G --> H[格式化输出] H --> I{是否到达upper?} I -->|否| F I -->|是| J[结束] ``` ### 常见错误排查表 | 错误现象 | 原因分析 | 解决方案 | |---|---|---| | 输出多出空格 | `printf`格式字符串添加多余空格 | 检查`%d%6.1f\n`是否紧密连接[^1] | | 计算结果为整数 | 使用整数除法`5/9` | 改为`5.0/9.0`[^4] | | 漏最后一行 | 循环条件错误 | 确保使用`f <= upper`而非`f < upper`[^5] | | 输出对齐错误 | 未使用`%6.1f`格式 | 检查格式字符串拼写 | ### 扩展练习方向 1. **增强输入验证**:处理非数字输入(如字母、符号) 2. **动态步长支持**:通过新增参数控制温度递增步长(如1/2/5度) 3. **反向转换表**:添加摄氏转华氏功能 4. **文件IO本**:从文件读取输入并写入结果 [相关问题] 1. 如何处理用户输入非整数的情况? 2. 若要求华氏温度显示为4位宽右对齐,应如何修改格式? 3. 如何添加开尔文温度列并保持对齐? [^1]: 输入输出格式要求(PTA平台特别强调格式准确性) [^3]: 浮点运算精度保障 [^4]: 循环边界条件控制 [^5]: 代码结构验证逻辑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值