2023-2024-1 20231423《计算机基础与程序设计》第十四周学习总结

发布时间 2023-12-31 22:33:05作者: 杨季林

作业信息

这个作业属于哪个课程2023-2024-1-计算机基础与程序设计
这个作业要求在哪里 2022-2023-1计算机基础与程序设计第十四周作业
这个作业的目标 《C语言程序设计》第十三章

《C语言程序设计》

二进制文件和文本文件

  • 二进制文件是一种字节序列,没有字符变换,其中的数据以二进制存储
  • 文本文件是一种字符序列,其中的数据以ASCII码存储
  • 教材学习中的问题和解决过程

    • 问题1:学习过静态库和共享库的概念后,想知道静态库和共享库有啥区别?

    • 问题1解决过程:上网搜寻相关资料后得知:静态库被程序静态链接于编译时,共享库被动态链接于运行时;
      静态链接时,需要把所有对静态库的引用内容都嵌入到最终的可执行文件中,且相同模块并不共用,都有相应的副本,因此相应的可执行文件在磁盘和内存中所占空间较大;而动态链接是发生在运行时的,并且是共享的,因此相应的可执行文件在磁盘中所占空间较小;
      由于静态链接是在编译时完成的,因此可执行文件中以及包含有所需的静态库,可执行文件可以单独运行;由于动态链接是在程序运行时完成的,可执行文件在加载入内存运行时才会链接共享库,因此可执行文件必需共享库的支持,不能单独运行;
      当静态库中某个模块更新后,需要重新编译链接生成相应的可执行文件;另一方面若共享库中某个模块更新了,只要接口没有改变,就不需要重新编译链接生成可执行文件;
      静态链接比动态链接速度稍快;
      静态库中不能包含共享库,而共享库中可以包含静态库。
      综合以上区别,可以发现动态链接的性能是明显优于静态链接的,但是这不一定就说明静态链接一定比不上动态链接了。如果库本身就比较小且不经常改变,基于速度的角度,应当选择静态链接,否则还是应当选择动态链接,由于是大型软件需要经常维护、扩展之类的情况。除此之外,静态链接的一个显著优点是其相应的可执行文件已经是完整的,包含所有所需的模块,因此可以很方便地移动到其他地方执行。

    • 问题2:学习过静态库和共享库的概念后,想知道静态库和共享库各自有什么优点和缺点?

    • 问题2解决过程:上网搜寻相关资料后得知:静态库与动态库优缺点:
      由于由静态库生成的可执行文件是把静态库加载到了其内部, 所以静态库生成的可执行文件一般会比动态库大。

    静态库

    优点:

    执行速度快, 是因为静态库已经编译到可执行文件内部了

    移植方便, 不依赖域其他的库文件

    缺点:

    耗费内存, 是由于每一个静态库的可执行程序都会加载一次
    部署更新麻烦, 因为静态库修改以后所有的调用到这个静态库的可执行文件都需要重新编译
    动态库

    优点:

    节省内存
    部署升级更新方便, 只需替换动态库即可, 然后再重启服务
    缺点:

    加载速度比静态库慢
    移植性差, 需要把所有用到的动态库都移植

    • 问题3:二进制文件和文本文件各有什么优缺点?
    • 问题3解决过程:上网搜寻相关资料后得知:文本文件与二进制文件的优缺点

    因为文本文件与二进制文件的区别仅仅是编码上不同,所以他们的优缺点就是编码的优缺点,这个找本编码的书来看看就比较清楚了。一般认为,文本文件编码基于字符定长,译码容易些;二进制文件编码是变长的,所以它灵活,存储利用率要高些,译码难一些(不同的二进制文件格式,有不同的译码方式)。关于空间利用率,想想看,二进制文件甚至可以用一个比特来代表一个意思(位操作),而文本文件任何一个意思至少是一个字符。

    在windows下,文本文件不一定是一ASCII来存贮的,因为ASCII码只能表示128的标识,你打开一个txt文档,然后另存为,有个选项是编码,可以选择存贮格式,一般来说UTF-8编码格式兼容性要好一些.而二进制用的计算机原始语言,不存贮兼容性. 很多书上还认为,文本文件的可读性要好些,存储要花费转换时间(读写要编译码),而二进制文件可读性差,存储不存在转换时间(读写不要编解码,直接写值).这里的可读性是从软件使用者角度来说的,因为我们用通用的记事本工具就几乎可以浏览所有文本文件,所以说文本文件可读性好;而读写一个具体的二进制文件需要一个具体的文件解码器,所以说二进制文件可读性差,比如读BMP文件,必须用读图软件。

    而这里的存储转换时间应该是从编程的角度来说的,因为有些操作系统如windows需要对回车换行符进行转换(将”\n”,换成”\r\n”,所以文件读写时,操作系统需要一个一个字符的检查当前字符是不是”\n”或”\r\n”).这个在存储转换在Linux操作系统中并不需要,当然,当在两个不同的操作系统上共享文件时,这种存储转换又可能出来。

    代码调试中的问题和解决过程

    • 问题1:在把娄老师发在云班课作业的图片里的代码打到电脑上并传到虚拟机上之后,系统对我的add,sub等四个自定义函数报错,同时对scanf和printf两个函数报错,显示implicit declaration。
    • 问题1解决过程:在C语言查找相关内容后了解到scanf和printf是stdio.h里的函数,要使用这些函数必须引用stdio.h,否则会报错,同时我也需要引用head.h头文件,否则add等四个自定义函数也无法使用。