高级语言程序设计第三次作业
高级语言程序设计第二次作业
此作业所属课程:https://edu.cnblogs.com/campus/fzu/2026gjyycxsj
此作业要求:https://edu.cnblogs.com/campus/fzu/2026gjyycxsj/homework/16748
学号:022401208
姓名:范敬翔
一:编写并运行书本第3章3.11 编程练习题目中的第1题~第8题
1 .通过试验(即编写带有此类问题的程序)观察系统如何处理整数上溢、浮点数上溢和浮点数下溢的情况。
设计思路:
- 整数上溢测试
- 引入
<limits.h>头文件,通过宏INT_MAX获取当前环境 int 类型的最大值; - 对最大值执行
+1运算触发上溢; - 补充说明:有符号整数上溢在 C 语言标准中属于未定义行为,多数主流编译器环境下会表现为 “模 2^N 环绕”(最大值跳转到对应负数最小值),本程序用于观察该常见表现。
- 引入
- 浮点数上溢测试
- 引入
<float.h>头文件,通过宏FLT_MAX获取 float 类型的最大有限正数值; - 将最大值乘以大于 1 的系数(如 2),让数值超出浮点数的最大表示范围;
- 浮点数上溢的标准行为是得到正无穷(
inf),符合 IEEE 754 浮点数规范。
- 引入
- 浮点数下溢测试
- 通过
FLT_MIN获取 float 类型的最小正规范数; - 循环对极小值执行除以 2 的操作,让数值逐步小于最小规范数,进入非规格化区间,最终趋近于 0;
- 输出多轮运算后的数值,观察下溢过程中精度丢失、数值逐步衰减到 0 的过程。
- 通过
- 整体采用分模块结构,每个测试模块打印标题、初始值、运算结果,便于对比观察。
具体代码:
#include <stdio.h>
#include <limits.h> // 提供整数类型边界宏
#include <float.h> // 提供浮点数类型边界宏
int main(void)
{
// ========== 1. 整数上溢测试 ==========
printf("===== 1. 整数上溢测试 (int类型) =====\n");
int int_max = INT_MAX;
printf("int 类型最大值: %d\n", int_max);
int int_overflow = int_max + 1;
printf("最大值 +1(上溢后): %d\n\n", int_overflow);
// ========== 2. 浮点数上溢测试 ==========
printf("===== 2. 浮点数上溢测试 (float类型) =====\n");
float flt_max = FLT_MAX;
printf("float 最大有限值: %e\n", flt_max);
float flt_overflow = flt_max * 2;
printf("最大值 *2(上溢后): %e\n\n", flt_overflow);
// ========== 3. 浮点数下溢测试 ==========
printf("===== 3. 浮点数下溢测试 (float类型) =====\n");
float flt_min = FLT_MIN;
printf("float 最小正规范数: %e\n", flt_min);
float underflow_val = flt_min;
// 连续除以2,逐步触发下溢
for (int i = 1; i <= 10; i++)
{
underflow_val /= 2;
printf("第 %d 次除以2后: %e\n", i, underflow_val);
}
return 0;
}

图1 第3章3.11 编程练习第一题运行结果展示
2 .编写一个程序,要求提示输入一个 ASCII 码值(如,66),然后打印输入的字符。
设计思路:
- 定义一个整型变量,用于存储用户输入的 ASCII 码整数值。
- 使用
printf输出提示文本,引导用户输入一个整数形式的 ASCII 码。 - 通过
scanf的%d格式符读取用户输入的整数,存入对应变量。 - 利用 C 语言中 char 类型本质为整型的特性,使用
printf的%c格式控制符,将该整数直接以对应 ASCII 字符的形式打印输出。
具体代码:
#include <stdio.h>
int main(void)
{
int ascii_code;
printf("请输入一个ASCII码值(如 66):");
scanf("%d", &ascii_code);
printf("对应的字符是:%c\n", ascii_code);
return 0;
}

图2 第3章3.11 编程练习第二题运行结果展示
3.编写一个程序,发出一声警报,然后打印下面的文本:Startled by the sudden sound, Sally shouted,"By the Great Pumpkin, what was that!"
设计思路:
- 实现警报音效:使用 C 语言标准转义字符
\a(响铃字符),向标准输出打印该字符时,会触发终端 / 系统的提示警报音。 - 处理特殊符号:目标文本包含双引号,而双引号在 C 语言中是字符串的边界标记,因此需要用转义字符
\"来表示字符串内部的双引号,避免语法错误。 - 匹配原文排版:按照题目给出的换行格式,分两行输出文本,还原题目中的段落样式。
具体代码:
#include <stdio.h>
int main(void)
{
printf("\a"); // 输出响铃字符,触发系统警报
printf("Startled by the sudden sound, Sally shouted,\n");
printf("\"By the Great Pumpkin, what was that!\"\n");
return 0;
}

图3 第3章3.11 编程练习第三题运行结果展示
4.写一个程序,读取一个浮点数,先打印成小数点形式,再打印成指数形式。然后,如果系统支持,再打印成 p 记数法(即十六进制记数法)。按以下格式输出(实际显示的指数位数因系统而异):Enter a floating-point value: 64.25 fixed-point notation: 64.250000 exponential notation: 6.425000e+01 p notation: 0x1.01p+6
设计思路:
- 变量选型:使用
double类型存储用户输入的浮点数,适配更高的输出精度,同时兼容十六进制 p 记数法的格式要求。 - 输入交互:通过
printf输出提示文案,使用scanf的%lf格式符读取用户输入的浮点数。 - 定点小数输出:使用
%f格式控制符,默认保留 6 位小数,匹配题目示例的输出精度。 - 指数形式输出:使用
%e格式控制符,输出科学计数法格式,尾数保留 6 位小数,附带指数位。 - 十六进制 p 记数法输出:使用
%a格式控制符(C99 标准引入),输出以0x开头、p分隔尾数与指数的十六进制浮点数形式。 - 格式对齐:严格按照题目给出的输出文案与排版编写代码,保证输出样式与示例完全一致。
具体代码:
#include <stdio.h>
int main(void)
{
double num;
printf("Enter a floating-point value: ");
scanf("%lf", &num);
printf("fixed-point notation: %f\n", num);
printf("exponential notation: %e\n", num);
printf("p notation: %a\n", num);
return 0;
}

图4 第3章3.11 编程练习第四题运行结果展示
5.一年大约有 3.156×10⁷秒。编写一个程序,提示用户输入年龄,然后显示该年龄对应的秒数。
设计思路:
- 常量定义:使用科学计数法
3.156e7表示一年的秒数,用const double类型存储,既贴合题目给出的数值形式,也保证运算精度。 - 输入处理:定义整型变量接收用户输入的年龄,通过
printf输出输入提示,使用scanf读取整数年龄值。 - 换算逻辑:总秒数 = 年龄 × 每年秒数;利用 C 语言的自动类型转换规则,整型年龄与浮点常量运算后,结果自动提升为浮点型。
- 结果输出:以易读的格式输出换算结果,保留整数形式的秒数,符合日常阅读习惯。
具体代码:
#include <stdio.h>
int main(void)
{
const double seconds_per_year = 3.156e7; // 一年的秒数
int age;
double total_seconds;
printf("请输入您的年龄:");
scanf("%d", &age);
total_seconds = age * seconds_per_year;
printf("%d 岁对应的秒数约为:%.0f 秒\n", age, total_seconds);
return 0;
}

图5 第3章3.11 编程练习第五题运行结果展示
6.1 个水分子的质量约为 3.0×10⁻²³ 克。1 夸脱水大约是 950 克。编写一个程序,提示用户输入水的夸脱数,并显示水分子的数量。
设计思路:
- 常量定义:使用
double类型定义两个物理常量 —— 单个水分子质量3.0e-23克、每夸脱水的质量950.0克,双精度浮点型可以保证极小值参与运算时的精度。 - 输入交互:定义
double类型变量存储用户输入的水的夸脱数,通过printf输出输入提示,使用scanf的%lf格式符读取浮点数值。 - 换算逻辑:先通过 “夸脱数 × 每夸脱质量” 计算水的总质量,再用总质量除以单个水分子的质量,得到水分子的总数量。
- 结果输出:水分子总数数值极大,采用科学计数法
%e格式输出结果,直观展示大数量级的计算结果。
具体代码:
#include <stdio.h>
int main(void)
{
const double mass_per_molecule = 3.0e-23; // 单个水分子质量,单位:克
const double mass_per_quart = 950.0; // 1夸脱水的质量,单位:克
double quart_num;
double molecule_count;
printf("请输入水的夸脱数:");
scanf("%lf", &quart_num);
// 总质量 / 单个分子质量 = 水分子总数
molecule_count = quart_num * mass_per_quart / mass_per_molecule;
printf("%.2f 夸脱水含有的水分子数量约为:%e 个\n", quart_num, molecule_count);
return 0;
}

图6 第3章3.11 编程练习第六题运行结果展示
7.1 英寸相当于 2.54 厘米。编写一个程序,提示用户输入身高(/ 英寸),然后以厘米为单位显示身高。
设计思路:
- 常量定义:使用
const double类型定义换算系数2.54,即 1 英寸对应的厘米数,保证换算标准统一且便于后续维护修改。 - 输入处理:定义浮点型变量存储用户输入的英寸身高,通过
printf输出提示信息,使用scanf的%lf格式符读取用户输入的浮点数值。 - 换算逻辑:执行公式
厘米身高 = 英寸身高 × 2.54,通过浮点乘法完成单位转换。 - 结果输出:保留两位小数输出换算后的厘米身高,保证结果的可读性与精度。
具体代码:
#include <stdio.h>
int main(void)
{
const double cm_per_inch = 2.54;
double height_inch;
double height_cm;
printf("请输入您的身高(英寸):");
scanf("%lf", &height_inch);
height_cm = height_inch * cm_per_inch;
printf("对应的身高为:%.2f 厘米\n", height_cm);
return 0;
}

图7 第3章3.11 编程练习第七题运行结果展示
8.在美国的体积测量系统中,1 品脱等于 2 杯,1 杯等于 8 盎司,1 盎司等于 2 大汤勺,1 大汤勺等于 3 茶勺。编写一个程序,提示用户输入杯数,并以品脱、盎司、汤勺、茶勺为单位显示等价容量。思考对于该程序,为何使用浮点类型比整数类型更合适?
设计思路:
- 梳理换算关系:以 “杯” 为基准,推导各单位的换算公式:
- 品脱:1 品脱 = 2 杯 → 品脱数 = 杯数 ÷ 2
- 盎司:1 杯 = 8 盎司 → 盎司数 = 杯数 × 8
- 大汤勺:1 盎司 = 2 大汤勺 → 汤勺数 = 杯数 × 8 × 2
- 茶勺:1 大汤勺 = 3 茶勺 → 茶勺数 = 杯数 × 8 × 2 × 3
- 数据类型选择:采用
double浮点类型存储输入值与换算结果。实际场景中杯数可能为非整数(如 1.5 杯),且杯转品脱的运算会产生小数,浮点类型可保留完整精度,避免整数截断导致的结果失真。 - 输入交互:通过
printf提示用户输入杯数,使用scanf的%lf格式符读取浮点型的杯数数值。 - 运算与输出:根据换算公式分别计算四个单位的对应数值,按清晰的格式输出各单位的等价容量,保留合理小数位数保证可读性。
具体代码:
#include <stdio.h>
int main(void)
{
double cups;
double pints, ounces, tablespoons, teaspoons;
printf("请输入杯数:");
scanf("%lf", &cups);
// 各单位换算计算
pints = cups / 2; // 1品脱 = 2杯
ounces = cups * 8; // 1杯 = 8盎司
tablespoons = ounces * 2; // 1盎司 = 2大汤勺
teaspoons = tablespoons * 3; // 1大汤勺 = 3茶勺
// 输出结果
printf("%.2f 杯等价的容量:\n", cups);
printf("品脱:%.2f\n", pints);
printf("盎司:%.2f\n", ounces);
printf("大汤勺:%.2f\n", tablespoons);
printf("茶勺:%.2f\n", teaspoons);
return 0;
}

图8 第3章3.11 编程练习第八题运行结果展示
二:将书本中给的程序清单3.13.5,3.83.9的示例程序结果输出
各运行结果如下所示:

图9 3.1运行结果展示

图10 3.2运行结果展示

图11 3.3运行结果展示

图12 3.4运行结果展示

图13 3.5运行结果展示

图14 3.8运行结果展示
*
图15 3.9运行结果展示
三:运行作业博客程序给出程序结果

图16 程序(1)运行结果展示

图17 程序(2)运行结果展示

图18 程序(3)运行结果展示

图19 程序(4)运行结果展示

图20 程序(5)运行结果展示
四:总结和思考
由于已有第一次作业的经验,对博客的使用熟练程度提升了不少,主要花在逐行理解并type示例程序代码的过程,在这个过程中我对C语言输入输出与和关键字等语法的应用了解得更为深入了些,后续学习我将继续深进高级程序设计相关内容的理解,争取在学业上更进一步。
浙公网安备 33010602011771号