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

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


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

3.11.1

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

#include <stdio.h>
// 引入这两个头文件以通过预先定义好的变量
// 导出整数和浮点数的最大值
#include <limits.h>
#include <float.h>
int main()
{
	// 原始最值 
    printf("int:\nmax:%d,min:%d\n", INT_MAX, INT_MIN);
    printf("float:\nmax:%e,min:%e\n", FLT_MAX, FLT_MIN);
    printf("double:\nmax:%e,min:%e\n\n", DBL_MAX, DBL_MIN);
	
	// 上溢和下溢 
    printf("int:\nmax:%d,min:%d\n", INT_MAX + 1, INT_MIN - 1);
    printf("float:\nmax:%e,min:%e\n", FLT_MAX * 1000, FLT_MIN / 1000);
    printf("double:\nmax:%e,min:%e\n", DBL_MAX * 1000, DBL_MIN / 1000);
    return 0;
}

思路:

  • 对于整数,利用limit.h头文件直接获取整数的最值,并进行简单加一减一处理使之越界;
  • 浮点数同理,不过使之越界的处理更改为了乘除一些10的倍数,使浮点数的尾数部分溢出(应该无法造成指数部分和符号位的损失,这不太确定),从而损失精度

问题:无
解决:无

3.11.2

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

#include <stdio.h>
int main()
{
    printf("Please input an ASCII number:\n");
    int a;
    scanf("%d",&a);
    printf("%c",a);
    return 0;
}

思路:按题意理解即可
问题:无
解决:无

3.11.3

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

#include <stdio.h>
int main()
{
    // 发出警报
    printf("\a");
    printf("Startled by the sudden sound, Sally shouted, \n\"By the Great Pumpkin, what was that!\"");
    return 0;
}

思路:按题意理解即可
问题:忘记了警报的转义符
解决:上网查找资料最终解决

3.11.4

题目:编写一个程序,读取一个浮点数,先打印成小数点形式,再打印成指数形式。然后,如果系统支持,再打印成p记数法(即十六进制记数法)。按以下格式输出(实际显示的指数位数因系统而异):
Enter a floating-point value: 64.25\n
fixed-point notation: 64.250000\n
exponential notation: 6.425000e+01\n
p notation: 0x1.01p+6

#include <stdio.h>
int main()
{
    double a;
    printf("Enter a floating-point value: ");
    scanf("%lf",&a);
    printf("fixed-point notation: %.6f\n",a);
    printf("notation: %e\n",a);
    // 十六进制占位符
    printf("p notation: %a\n",a);
    return 0;
}

思路:按题意理解即可
问题:无
解决:无

3.11.5

题目:一年大约有3.156×10000000 秒。编写一个程序,提示用户输入年龄,然后显示该年龄对应的秒数。

#include <stdio.h>
int main()
{
    double Secnum = 3.156e7;
    printf("Please input your age: ");
    int age;
    scanf("%d", &age);
    printf("The number of seconds corresponding to your age is: %lf\n", age * Secnum);
    return 0;
}

思路:按题意理解即可
问题:无
解决:无

3.11.6

题目:1个水分子的质量约为3.0×10 −23 克。1夸脱水大约是950克。编写一个程序,提示用户输入水的夸脱数,并显示水分子的数量

#include <stdio.h>
int main()
{
    double h2oNum = 3.0e-23;
    printf("Please enter the quarter number of the water: ");
    int q;
	scanf("%d", &q);
    printf("The number of water molecules is:%e\n", q * 950 / h2oNum);
    return 0;
}

思路:按题意理解即可
问题:无
解决:无

3.11.7

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

#include <stdio.h>
int main()
{
    const double a = 2.54;
    double inch;
    printf("Please enter your height: ");
    scanf("%lf", &inch);
    printf("The cm of your height is:%lf\n", inch * a);
    return 0;
}

思路:按题意理解即可
问题:无
解决:无

3.11.8

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

#include <stdio.h>
int main()
{
    double cup, ounce, tablespoon;
    printf("Please enter the number of cups: ");
    scanf("%lf", &cup);
    printf("In pints:%lf\n", cup / 2);
    ounce = cup * 8;
    printf("In ounces:%lf\n", ounce);
    tablespoon = ounce * 2;
    printf("In tablespoons:%lf\n", tablespoon);
    printf("In teaspoons:%lf\n", tablespoon * 3);
    return 0;
}

思路:按题意理解即可
思考:

  • 因为整数在进行除法运算的过程中可能会损失精度,例如int在进行计算的时候会得到10/3=3这样的错误答案
  • 浮点数的话就没有这样的问题,虽然浮点数在某些复杂情况下也会损失精度,但是这道题显然没有那么大的运算量,所以浮点数是合适的

问题:无
解决:无


二、将书本中给的程序清单3.1~3.10的示例程结果输出(无需代码,截图程序输出结果)

3.1

问题:无
解决办法:无

3.2

问题:无
解决:无

3.3

问题:无
解决:无

3.4

问题:无
解决:无

3.5

问题:无
解决:无

3.6

问题:无
解决:无

3.7

问题:无
解决:无

3.8

问题:
long的size是4byte
解决:

  • 查询资料过后发现是DevC++的问题,换成VSCode之后答案就对了。
  • 原理是VScode是64位的,DevC++是32位,长整型数据在不同字长的系统里的储存空间是不一样大的

3.9

问题:无
解决:无

3.10

问题:无
解决:无


三、总结思考:

  1. 复习了C的格式化输入输出,加强了对输入输出的理解
  2. 复习了\a转义符的作用,顺带复习了其它转义符的作用
  3. 复习了C的浮点数精度相关问题,巩固了定点数、浮点数储存相关部分的知识
  4. 学习了不同字长的系统或编译器中,相同的数据类型的所占的存储空间不一样长这个知识点,收获颇丰
posted @ 2024-10-07 15:26  空余晚秋  阅读(8)  评论(0编辑  收藏  举报