高级语言程序设计第二次作业

高级语言程序设计第二次作业

此作业所属课程:https://edu.cnblogs.com/campus/fzu/2026gjyycxsj
此作业要求:https://edu.cnblogs.com/campus/fzu/2026gjyycxsj/homework/16748
学号:022401208
姓名:范敬翔

一:编写并运行书本第3章3.11 编程练习题目中的第1题~第8题

1 .通过试验(即编写带有此类问题的程序)观察系统如何处理整数上溢、浮点数上溢和浮点数下溢的情况。

设计思路:

  1. 整数上溢测试
    • 引入 <limits.h> 头文件,通过宏 INT_MAX 获取当前环境 int 类型的最大值;
    • 对最大值执行+1运算触发上溢;
    • 补充说明:有符号整数上溢在 C 语言标准中属于未定义行为,多数主流编译器环境下会表现为 “模 2^N 环绕”(最大值跳转到对应负数最小值),本程序用于观察该常见表现。
  2. 浮点数上溢测试
    • 引入 <float.h> 头文件,通过宏 FLT_MAX 获取 float 类型的最大有限正数值;
    • 将最大值乘以大于 1 的系数(如 2),让数值超出浮点数的最大表示范围;
    • 浮点数上溢的标准行为是得到正无穷(inf),符合 IEEE 754 浮点数规范。
  3. 浮点数下溢测试
    • 通过 FLT_MIN 获取 float 类型的最小正规范数;
    • 循环对极小值执行除以 2 的操作,让数值逐步小于最小规范数,进入非规格化区间,最终趋近于 0;
    • 输出多轮运算后的数值,观察下溢过程中精度丢失、数值逐步衰减到 0 的过程。
  4. 整体采用分模块结构,每个测试模块打印标题、初始值、运算结果,便于对比观察。
    具体代码:
#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;
}

image
图1 第3章3.11 编程练习第一题运行结果展示

2 .编写一个程序,要求提示输入一个 ASCII 码值(如,66),然后打印输入的字符。

设计思路:

  1. 定义一个整型变量,用于存储用户输入的 ASCII 码整数值。
  2. 使用printf输出提示文本,引导用户输入一个整数形式的 ASCII 码。
  3. 通过scanf的%d格式符读取用户输入的整数,存入对应变量。
  4. 利用 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;
}


image
图2 第3章3.11 编程练习第二题运行结果展示

3.编写一个程序,发出一声警报,然后打印下面的文本:Startled by the sudden sound, Sally shouted,"By the Great Pumpkin, what was that!"

设计思路:

  1. 实现警报音效:使用 C 语言标准转义字符\a(响铃字符),向标准输出打印该字符时,会触发终端 / 系统的提示警报音。
  2. 处理特殊符号:目标文本包含双引号,而双引号在 C 语言中是字符串的边界标记,因此需要用转义字符\"来表示字符串内部的双引号,避免语法错误。
  3. 匹配原文排版:按照题目给出的换行格式,分两行输出文本,还原题目中的段落样式。
    具体代码:
#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;
}


image
图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

设计思路:

  1. 变量选型:使用double类型存储用户输入的浮点数,适配更高的输出精度,同时兼容十六进制 p 记数法的格式要求。
  2. 输入交互:通过printf输出提示文案,使用scanf的%lf格式符读取用户输入的浮点数。
  3. 定点小数输出:使用%f格式控制符,默认保留 6 位小数,匹配题目示例的输出精度。
  4. 指数形式输出:使用%e格式控制符,输出科学计数法格式,尾数保留 6 位小数,附带指数位。
  5. 十六进制 p 记数法输出:使用%a格式控制符(C99 标准引入),输出以0x开头、p分隔尾数与指数的十六进制浮点数形式。
  6. 格式对齐:严格按照题目给出的输出文案与排版编写代码,保证输出样式与示例完全一致。
    具体代码:
#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;
}

image
图4 第3章3.11 编程练习第四题运行结果展示

5.一年大约有 3.156×10⁷秒。编写一个程序,提示用户输入年龄,然后显示该年龄对应的秒数。

设计思路:

  1. 常量定义:使用科学计数法 3.156e7 表示一年的秒数,用 const double 类型存储,既贴合题目给出的数值形式,也保证运算精度。
  2. 输入处理:定义整型变量接收用户输入的年龄,通过 printf 输出输入提示,使用 scanf 读取整数年龄值。
  3. 换算逻辑:总秒数 = 年龄 × 每年秒数;利用 C 语言的自动类型转换规则,整型年龄与浮点常量运算后,结果自动提升为浮点型。
  4. 结果输出:以易读的格式输出换算结果,保留整数形式的秒数,符合日常阅读习惯。
    具体代码:
#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;
}

屏幕截图 2026-10-29 194910
图5 第3章3.11 编程练习第五题运行结果展示

6.1 个水分子的质量约为 3.0×10⁻²³ 克。1 夸脱水大约是 950 克。编写一个程序,提示用户输入水的夸脱数,并显示水分子的数量。

设计思路:

  1. 常量定义:使用double类型定义两个物理常量 —— 单个水分子质量3.0e-23克、每夸脱水的质量950.0克,双精度浮点型可以保证极小值参与运算时的精度。
  2. 输入交互:定义double类型变量存储用户输入的水的夸脱数,通过printf输出输入提示,使用scanf的%lf格式符读取浮点数值。
  3. 换算逻辑:先通过 “夸脱数 × 每夸脱质量” 计算水的总质量,再用总质量除以单个水分子的质量,得到水分子的总数量。
  4. 结果输出:水分子总数数值极大,采用科学计数法%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;
}


image
图6 第3章3.11 编程练习第六题运行结果展示

7.1 英寸相当于 2.54 厘米。编写一个程序,提示用户输入身高(/ 英寸),然后以厘米为单位显示身高。

设计思路:

  1. 常量定义:使用const double类型定义换算系数2.54,即 1 英寸对应的厘米数,保证换算标准统一且便于后续维护修改。
  2. 输入处理:定义浮点型变量存储用户输入的英寸身高,通过printf输出提示信息,使用scanf的%lf格式符读取用户输入的浮点数值。
  3. 换算逻辑:执行公式 厘米身高 = 英寸身高 × 2.54,通过浮点乘法完成单位转换。
  4. 结果输出:保留两位小数输出换算后的厘米身高,保证结果的可读性与精度。
    具体代码:
#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;
}

image
图7 第3章3.11 编程练习第七题运行结果展示

8.在美国的体积测量系统中,1 品脱等于 2 杯,1 杯等于 8 盎司,1 盎司等于 2 大汤勺,1 大汤勺等于 3 茶勺。编写一个程序,提示用户输入杯数,并以品脱、盎司、汤勺、茶勺为单位显示等价容量。思考对于该程序,为何使用浮点类型比整数类型更合适?

设计思路:

  1. 梳理换算关系:以 “杯” 为基准,推导各单位的换算公式:
    • 品脱:1 品脱 = 2 杯 → 品脱数 = 杯数 ÷ 2
    • 盎司:1 杯 = 8 盎司 → 盎司数 = 杯数 × 8
    • 大汤勺:1 盎司 = 2 大汤勺 → 汤勺数 = 杯数 × 8 × 2
    • 茶勺:1 大汤勺 = 3 茶勺 → 茶勺数 = 杯数 × 8 × 2 × 3
  2. 数据类型选择:采用double浮点类型存储输入值与换算结果。实际场景中杯数可能为非整数(如 1.5 杯),且杯转品脱的运算会产生小数,浮点类型可保留完整精度,避免整数截断导致的结果失真。
  3. 输入交互:通过printf提示用户输入杯数,使用scanf的%lf格式符读取浮点型的杯数数值。
  4. 运算与输出:根据换算公式分别计算四个单位的对应数值,按清晰的格式输出各单位的等价容量,保留合理小数位数保证可读性。
    具体代码:
#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;
}

image
图8 第3章3.11 编程练习第八题运行结果展示

二:将书本中给的程序清单3.13.5,3.83.9的示例程序结果输出

各运行结果如下所示:
屏幕截图 2026-10-29 201735
图9 3.1运行结果展示
image
图10 3.2运行结果展示
image
图11 3.3运行结果展示
image
图12 3.4运行结果展示
image
图13 3.5运行结果展示
image
图14 3.8运行结果展示
*image
图15 3.9运行结果展示

三:运行作业博客程序给出程序结果

image
图16 程序(1)运行结果展示
image
图17 程序(2)运行结果展示
image
图18 程序(3)运行结果展示
image
图19 程序(4)运行结果展示
image
图20 程序(5)运行结果展示

四:总结和思考

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

posted @ 2026-10-29 21:23  范敬翔  阅读(4)  评论(0)    收藏  举报