恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

C语言经典练习题:用循环输出华氏-摄氏温度转换表

  • 首页
  • 资讯中心
  • /
  • C语言经典练习题:用循环输出华氏-摄氏温度转换表

相关资讯

易混淆连词与连接副词辨析:一份可直接上手的英文写作决策手册 2026/9/10 19:11:23
京东教辅书销售数据分析系统技术解析 2026/9/10 19:11:23
卡尔曼滤波原理与MATLAB工程实现全解析 2026/9/10 19:11:23

最新资讯

使用 Framer Motion 为 React 应用打造文本与图片动画:Refine 项目实战指南
AI原生SCRM:企业微信私域的合规架构重构
数据可视化工具选型与实战指南
Vue组件封装指南:属性、事件、插槽与方法的透传全解析
Shannon AI 凭据解析顺序:如何让环境变量覆盖 .env 与 config.toml
告别AIGC痕迹!实测4个救命级降重技巧+3款一键降AI率工具

今日推荐

AI搜索重构内容生态:企业从“流量争夺”转向“答案共建”
AI搜索的信任缺口:企业内容如何在答案时代自证可信
Spring Boot+Vue+Node.js售后服务系统开发实战

本周热门

超人会飞不算本事:系统稳定依赖清晰规则与边界设计
超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论
基于CNN的调制信号识别:MATLAB实现时频图分类实战

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

C语言经典练习题:用循环输出华氏-摄氏温度转换表

发布时间:2026/9/10 19:11:23
C语言经典练习题:用循环输出华氏-摄氏温度转换表 在学生时代第一次见到“输出华氏-摄氏温度转换表”这道练习题时我满脑子只有一个问题直接写两句 printf 不就完了吗为什么非要让我用循环后来帮别人讲题发现这道练习几乎是每个人学会 C 语言循环结构的必经关卡。它看起来只是生成一张温度对照表实际上把变量、循环、格式化输出、浮点运算全部串在了一起。如果你正在刷题或者刚开始学编程这篇就当一个“带解析的参考答案”看。我会把从公式推导、代码实现到常见翻车点全部拆开讲最后还会给一些扩展思路让这道练习不只是在编译器里跑通而是真正变成你自己的编程能力。1. 这道练习真正想训练的能力不止是“打印一张表”1.1 题目背后隐藏的三层目标很多初学者拿到这道题第一反应是“这不就是一个输出吗我写那么复杂干嘛”。这种想法很正常因为题目最终效果确实只是一张表左边是华氏温度右边是摄氏温度一行一行打出来。但如果只是为了“打印”确实没有必要用循环手动写 16 行 printf 也能交差。问题在于这种写法在数据量变大时立刻崩盘如果要从 0 度打印到 3000 度步长还是 10 度手动写 300 行语句基本是不可能完成的任务。所以这道练习真正想训练的第一层能力是让你建立“重复操作交给循环”的自觉。第二层能力是格式化输出。同样的数据打印成“0 -17.8”和打印成“ 0 -17.8”观感完全不同。练习题里往往会要求表格对齐、列宽统一这背后是对 printf 格式说明符的理解。这一层很多人会忽略但实际写项目时日志对齐、报表输出、数据导出都需要这种能力。第三层能力是“把数学公式变成代码”。华氏和摄氏的换算本身很简单但涉及整数除法、浮点数精度、运算顺序。很多人在数学上知道公式一到代码里就写错原因就是没有理解“程序里的公式”和“纸上的公式”之间存在类型和运算顺序的差异。这道题看起来小但它是少数几个能把“语法、算法、工程习惯”三个维度一起训练入门的题目。所以别急着抄代码先想想它到底在考什么。1.2 为什么偏偏用华氏-摄氏转换做示例我经常被学生问为什么教材里总拿温度转换举例子换个别的不好吗答案挺现实的它是数学关系最简单的映射之一。华氏和摄氏之间是线性关系公式固定没有分支和复杂逻辑。这个特点对初学者非常重要。学循环的时候你的注意力应该集中在“怎么让变量累加”“怎么控制循环次数”“每次循环做什么”而不是被业务逻辑绕晕。温度转换恰好提供了一个足够简单、又足够真实的业务背景。另外一个隐藏原因是这个例子里天然需要浮点数。华氏 0 度对应的摄氏约 -17.8如果你只做整数运算结果会变成 -17表格的准确度就丢了。于是你被迫学习 float、double、%f 这些知识点。这不是偶然而是教材作者刻意设计的“梯度难度”。还有一点温度是一个有生活经验的概念。0 度冷、100 度热大家心里有数验证程序输出是否正确时可以凭常识判断。比如 32 华氏度应该等于 0 摄氏度如果程序输出 32 - 0说明公式大概率没问题如果输出 32 - 17那肯定哪里写错了。这种“可自我验证”的特性让这个案例比抽象数列求和更适合做入门题目。2. 公式与输出格式先想清楚再写代码2.1 从华氏到摄氏的换算逻辑华氏温度到摄氏温度的数学公式长这样C (F - 32) × 5 / 9这个公式本身没什么门道但写成代码时有三个细节需要注意。第一运算顺序。在 C 语言里乘除法的优先级高于加减法所以(F - 32) * 5 / 9 会先算括号里的减法再做乘除。如果你漏了括号写成F - 32 * 5 / 9结果完全不对。很多初学者在这道题上报错不是不会公式而是运算符优先级没搞清楚。第二整数除法问题。如果 F 是 int 类型5 和 9 也是整数那么 5 / 9 在 C 语言里等于 0因为整数除法会丢弃小数部分。这样一来整个公式就变成(F - 32) * 0输出全是 0。正确做法是让 5 和 9 中至少一个是浮点数比如 5.0 / 9或者把(F - 32)先转成 double 再参与运算。第三减法和乘法的先后。虽然这个公式用(F - 32) * 5 / 9 和 5 / 9 * (F - 32)结果相同但两者在浮点精度上可能有细微差异。为了贴近数学定义我习惯先写(F - 32)再把 5.0 / 9.0 乘上去这样逻辑更清晰。这里给出一个快速对照表方便你检查公式写对没有华氏温度 (°F)摄氏温度 (°C)备注320.0水的冰点212100.0水的沸点0-17.8常见负温度10037.8接近体温你写完程序后拿这几个值核对一下比看十遍代码都有用。2.2 输出格式设计列宽、对齐与表头题目要求“输出华氏-摄氏温度转换表”但“表”这两个字意味着什么一般包含表头、分隔线、内容行三部分。很多同学交上来的代码只有数据行没有表头。严格说这不叫“表”只能叫“序列”。所以我建议至少输出两行表头再加一条分隔线。比如华氏温度 摄氏温度 ------------------ 0 -17.8 20 -6.7这里的对齐方式很有讲究。华氏温度如果小于 100int 类型默认右对齐位数不同会导致整体参差不齐。所以要用固定宽度格式化%4d 表示占 4 个字符宽度右对齐%14.1f 表示占 14 个字符宽度、保留 1 位小数的浮点数。宽度数值可以根据你的需要调整但要注意留出足够的列间距。中文表头还要注意一个问题中文字符在控制台里通常占两个英文字符的宽度所以直接用英文空格去对齐容易出现错位。我一般会在表头之间多打几个空格或者在分隔线里加长分隔符让视觉上更整齐。比如“华氏温度 摄氏温度”中间用 4 个空格实际宽度约等于 8 个英文字符这样跟数据列的 14 宽度基本能对应上。还有一点容易被忽略换行符。printf(华氏温度 摄氏温度\n) 这样的语句里必须有 \n否则表头和数据会被挤在一行。这个错误看起来低级但在初学阶段出现频率极高。2.3 用“输出预期”反推变量类型写代码之前先问自己输出的摄氏温度需要带小数点吗如果带用什么类型保存计算结果如果题目要求“保留一位小数”那摄氏温度变量最好用 double 或 float。如果直接用 int 保存结果printf 里写 %f 会导致类型不匹配轻则输出垃圾值重则程序崩溃。华氏温度变量用 int 就好因为它的步长和上下限通常是整数。比如 0、20、40……300。这样设计的好处是循环控制简单自增步长 20不会出现小数点步长带来的误差。于是变量设计就变成了int fahr华氏温度循环控制变量int lower下限 0int upper上限 300int step步长 20double celsius摄氏温度保留浮点精度想清楚这些再动手写代码整个过程就会顺很多。很多时候代码写不顺不是因为语法不会而是因为根本没想清楚每一步要什么类型的数据。3. 完整实现从第一行代码到能跑的结果3.1 用 C 语言实现转换表我先把最常用的 C 语言版本写出来这个版本和很多教材里的思路一致但细节上做了改进。#include stdio.h int main() { int fahr; int lower 0; int upper 300; int step 20; printf(华氏温度 摄氏温度\n); printf(------------------\n); fahr lower; while (fahr upper) { double celsius (5.0 / 9.0) * (fahr - 32.0); printf(%4d %14.1f\n, fahr, celsius); fahr fahr step; } return 0; }逐行解释一下。#include stdio.h引入了标准输入输出库printf 在这里声明少了这行代码编译会报隐式声明错误。main函数是程序入口这里我直接使用int main并返回 0代表程序正常结束。变量部分定义了一个整型fahr作为循环控制变量以及 lower、upper、step 三个边界参数。这样写比直接把 0、300、20 写死在循环里更清晰后边想改范围只需要改这一处。循环里先用fahr lower;把起始值赋给 fahr然后进入 while 循环。条件fahr upper保证包含 300 这一行。循环体里先计算摄氏温度再用 printf 格式化输出最后把 fahr 增加 step。这个版本的关键点是(5.0 / 9.0) * (fahr - 32.0)而不是(5 / 9) * (fahr - 32)。前者能保留小数后者会得到一堆 0。我在本章后面会专门讲这个坑。编译命令也很简单gcc temp_table.c -o temp_table ./temp_table如果你的环境是 Windows没有 gcc也可以用 Dev-C、Code::Blocks 或者在线编译器逻辑完全一样。理论上正确输出应该是华氏温度 摄氏温度 ------------------ 0 -17.8 20 -6.7 40 4.4 ... 300 148.9中间省略了很多行但你至少应该看到第一行和最后一行。如果程序跑完只有第一行说明循环条件出了问题如果所有数据相同说明公式或变量类型有问题。3.2 用 Python 实现的对照版本虽然这道题通常出现在 C 语言教材里但我想用 Python 写一个对照版本帮助你理解“算法思想”和“语言语法”是两回事。lower 0 upper 300 step 20 print(华氏温度 摄氏温度) print(------------------) fahr lower while fahr upper: celsius (5.0 / 9.0) * (fahr - 32.0) print(f{fahr:4d} {celsius:14.1f}) fahr stepPython 的语法更简洁不需要声明变量类型不用管分号格式化字符串用 f-string。但结构上和 C 版本几乎一一对应初始化、循环条件、循环体、更新步长。很多初学者会陷入“学了 C 之后觉得 Python 别扭学了 Python 之后觉得 C 麻烦”的纠结。这里我想说一个经验核心是循环和变量递增的逻辑语言只是外壳。你能用 C 写出这段逻辑用 Python 也一定能写出来反过来也一样。Python 版本的好处是调试更快。你可以在循环里加一句print(f当前 fahr 是 {fahr})立刻看到变量变化过程不用像 C 那样重新编译。对于初学者理解循环执行流程Python 的交互式环境更友好。4. 最容易翻车的三个点整数除法、循环边界与格式说明符4.1 整数除以整数的经典坑我第一次写这个程序时就踩了整数除法的坑。当时写的是double celsius (5 / 9) * (fahr - 32);结果运行后表格里所有摄氏温度全是 0。我盯着代码看了半天觉得公式明明没错怎么全是 0 呢后来才明白在 C 语言里5 / 9是两个整数相除结果只保留整数部分也就是 0。0 乘以任何数都是 0所以整列都是 0。这背后的规则是整数除法结果仍是整数小数部分被直接截断。如果想让结果是浮点数至少有一个操作数是浮点数。所以正确写法是5.0 / 95 / 9.05.0 / 9.0或者你提前转类型double celsius ((double)fahr - 32.0) * 5.0 / 9.0;做题的时候踩一次这个坑印象深刻。但我想提醒你这种问题不只出现在温度转换里任何涉及比例、平均值、百分比的代码都可能遇到。比如“计算及格率”如果有人写了count / total * 100而 count 和 total 都是 int结果大概率是 0。所以看到“除号”先检查两边是不是整数这是一个非常实用的代码审查习惯。4.2 循环边界为什么总是差一行第二个高频问题是循环边界写错导致最后一行没输出。假设题目要求是 0 到 300 度步长 20。如果你写while (fahr upper)那么 fahr 会从 0 一直加到 280因为 300 不小于 300循环就退出了最后一行 300 被丢掉。如果写成while (fahr upper)就能包含 300。怎么避免这种问题不要靠猜直接算一遍循环次数。从 0 开始步长 20每次加 20那么 n 次后 fahr 的值为 0 n × 20。要求 fahr 300那 n 最大可以取 15循环执行 16 次输出 16 行。所以包含 300 才是合理结果。更通用的判断方法先看起始值再看每次加多少最后看终值是否能被“起始值 步长的若干倍”精确到达。如果到达不了比如从 0 到 300 但步长为 7最后一次可能停在 294 或 301边界处理就得小心了。还有一个相关坑是死循环。如果你忘了在循环体里写fahr fahr step;fahr 一直是 0条件永远成立程序会无限打印 0 那一行。真遇到这种情况可以用 CtrlC 终止程序但更重要的是一开始就检查“每次循环是否改变了循环变量”。4.3 打印结果错位怎么办第三个常见问题是输出格式错位明明数据算对了打印出来却乱七八糟。比如你写printf(%d %f\n, fahr, celsius);输出可能是0 -17.777778 20 -6.666667虽然数字没错但完全不是表格的样子。所以格式化说明符必须设计好。我的建议是华氏温度用%4d摄氏温度用%14.1f。%4d表示整数部分占 4 个字符位右对齐%14.1f表示整个浮点数占 14 个字符位保留 1 位小数。这样数据列会整齐地按个位对齐。如果你想左对齐可以加负号%-4d、%-14.1f。右对齐适合数字列左对齐适合文字列。还有一个小细节如果你用中文表头表头长度和数据列宽度不好匹配。比如“华氏温度”四个汉字在控制台占 8 个英文字符宽度而%4d只占 4 个字符宽。这时你可以在表头里手动补空格printf(华氏温度 摄氏温度\n);或者在数据行里把宽度调大一点。具体多少合适要看你的终值和精度。一个笨办法是先跑一次看输出是否对齐不对就调宽度再跑。虽然笨但对初学者很有效。5. 把练习变成小工具扩展思路与自测方法5.1 参数化起点、终点和步长如果只是完成作业写到上一节就够了。但如果你想让这道题更有价值我建议把它改造成一个“可复用的温度转换表工具”。目前代码里的 0、300、20 是写死的。你可以让用户在程序启动时输入这三个值或者通过命令行参数传入。C 语言的命令行参数版本可以这样写#include stdio.h #include stdlib.h int main(int argc, char *argv[]) { if (argc ! 4) { printf(用法: %s 下限 上限 步长\n, argv[0]); return 1; } int lower atoi(argv[1]); int upper atoi(argv[2]); int step atoi(argv[3]); printf(华氏温度 摄氏温度\n); printf(------------------\n); int fahr; for (fahr lower; fahr upper; fahr step) { double celsius (5.0 / 9.0) * (fahr - 32.0); printf(%4d %14.1f\n, fahr, celsius); } return 0; }这样用户可以输入./temp_table 0 100 10生成自己的转换表。参数化带来一个问题如果 step 是负数循环条件fahr upper会立刻不满足程序什么都不输出。如果你想让程序更健壮可以加一个校验当 step 0 时用当 step 0 时用。不过这是进阶内容作业阶段可以先不管但心里要有个概念写通用代码时要考虑边界输入。Python 版本用sys.argv甚至input()都能实现类似效果逻辑一样的。5.2 用测试数据验证表头、末行和步长代码写完不等于正确你需要有意识地测试。不要只看输出“好像没问题”要给程序设置几个明确的检查点。我最常用的验证方法是拿三个已知关系来核对32°F 应该输出 0.0°C212°F 应该输出 100.0°C0°F 应该输出 -17.8°C四舍五入后如果程序从 0 到 300、步长 20那 0 那一行必须是 -17.8300 那一行必须是 148.9。如果第一行对而最后一行不对多半是边界条件问题如果每一行都不对多半是公式或整数除法问题。还有一个检查点是“行数”。从 0 到 300、步长 20一共有 16 行。你可以在程序里加一个计数器或者数一下输出行数。如果少了回头看循环条件如果多了看步长是不是写成了 0。如果你改了参数比如从 0 到 100、步长 10那应该有 11 行0、10、20……100。拿这些具体数字验证比盯着代码看可靠得多。5.3 最终复盘从“完成作业”到“形成能力”练习的意义不在“抄对答案”而在“你脑子里留下来了什么”。做完这道题你应该能回答这几个问题华氏和摄氏转换公式是什么如何避免整数除法带来的精度问题while 循环和 for 循环在这个场景下分别怎么写为什么循环条件要用而不是printf 里%4d、%14.1f分别是什么意思右对齐和左对齐怎么控制如果用户输入非法参数程序会怎样如何加防御如果能流利回答说明这道题你已经吸收成自己的经验了。如果有些问题还含糊建议重新写一遍代码不要看参考答案写完再用测试数据验证。这个过程比“看十遍别人的代码”有效得多。最后分享我个人的一个小习惯每做完一道练习题我都会主动问自己一句——“如果把这个题目的数据范围扩大 100 倍我的代码还能跑吗”温度转换扩大到 3000 行输出没问题但如果在循环里每次打印之前都做一次非常耗时的计算就要考虑性能了。这个习惯帮我提前规避了很多后来项目里的性能坑。这道练习题虽然简单但从它身上养成的检查习惯会陪你走很远。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号