软件工程(C编码实践篇)学习总结

软件工程(C编码实践篇)总结

“夏天” 原创作品转载请注明出处 《软件工程(C编码实践篇)》MOOC课程http://mooc.study.163.com/course/USTC-1000002006

本次网易云课堂历时十周,完成了七次实验和一次考试。本次总结有以下内容:

  • 1、对软件工程的理解及学习软件工程(C编码实践篇)的心得;
  • 2、在学习过程中遇到的问题及解决方案;
  • 3、六次实验报告的链接;
  • 4、总结部分。

1、对软件工程的理解及学习软件工程(C编码实践篇)的心得

  • 1、本科的编程环境是通过网易云课堂的实验楼编译输出的,如果熟练git的话,也可以本地编辑,运行后上传,不过在最后提交报告的时候最好先运行下,以免出错。
  • 2、在这门课的实验评分标准中,代码风格的好坏是主要评分标准之一,通过代码规范与代码复审这篇文章以及对MarkDown书写格式的学习,对我的文档编辑有了大大的提高。这让我在编写代码的时候更加注重格式,风格上的问题,对于代码中的空格,空行更加敏感。包括对于注释的编写标准也有了更加深刻的认识。
  • 3、老师介绍了程序的模块化设计并将其运用到实践中,同时也使我熟悉了模块化的优点——低耦合,学会了将代码分离,把程序构造成模块化程序。
  • 4、同时老师也演示了如何将代码设计成一个通用的结构。通过封装基本的使用方法,以及相应的接口,使代码更加通用。同时也讲解了callback函数,可以进行函数的反向调用。并且动手实践了相应理论。
  • 5、初步讲解了函数的可重用性和线程安全,对于多线程思想以及多线程下代码的安全性问题有了更加深刻的认识。
  • 本课程主张实践,有些事情没有亲身经历过,永远不知道书上总结的一些思想方法是多么的实用。所以为这门实践课点个赞

2、在学习过程中遇到的问题及解决方案

实验二

  • Q:linux里编程如何包含其他C文件函数?
  • A:与c\c++程序一样,将函数在.h头文件中声明,实现函数要包含该头文件,再在源码里include 头文件即可直接使用。如果在同一目录下,在使用函数前声明即可。
  • Q:编译主文件出错

实验楼

  • A:一个简单方法:同时编译主文件和引用文件即可,如:gcc -o menu menu.c rand.c。或者可以参考以下文章http://www.cppblog.com/deane/articles/165216.html
  • Q:之前push了一堆测试文件到代码库中如何删除?
  • A:git rm file 后git commint ,git push 即可。

实验三

  • Q:Segmentation fault 错误
    实验楼
  • A:图上错误时出在第一个if()条件判断后其内容体help函数没有传进tDataNode 指针,也就是之前代码展示的初始化列表的head指针,因此在显示函数信息上出现了Segmentation fault 错误 (记忆区段错误)。同时在if()条件判断中指针错误也会导致该问题出现如if(*p = NULL)
  • Q:显示了一堆的星号界面,有用吗?有技术含量吗?
  • A:在没写之前觉得这样做能让文本更易阅读,然并卵(然而发现做出来之后并没有任何卵用)。而且就是简单的星号位置控制,没有任何技术含量,但是代码量大了不少。以后输出结果用printf规整就很好看了,不需要加星号,当然有个性的也可以尝试。

实验四

  • Q:文件这么多,编译繁琐该怎么解决?
  • A:配置makefile文件,将需要编译的文件写进去后,只需执行make命令即可编译成功。详细介绍请看前文。
  • Q:在运行中又出现了Segmentation fault 错误
  • A:通过在程序中设置断点后发现,出错原因有两个,一是构建链表时,其尾节点的下一节点没有设置为NULL导致遍历到最后出错,另一个错误是在找不到命令指针返回NULL值时,没有提前检测并作出错误控制。修复后程序成功运行。

实验七

  • Q:scanf函数读取完命令后,fgets读取会先读取一个空值。
  • A:这是因为两者读取的方式不同,我在主函数循环里读取用的是fgets,在部分功能函数里用的是scanf。想到的一个蠢办法是,在部分函数结束的地方,用fgets先读取空值,清空缓存后再进入主循环。
    -Q:为啥执行完help -a 再执行help -h后不执行任何动作,而且之后再打help -a或-h都不再执行动作、
    -A:在getopt方法里有一个变量optind,全域变量optind指示下一个要读取的参数在argv中的位置,因此在每次调用getopt方法后需要重置指针optind,可以重置为0,也可以重置为1.

3、六次实验报告的链接

实验一:写一个hello world小程序

实验要求:写一个hello world小程序,

  • 在实验楼Linux环境使用C语言编写,编译后执行输出”Hello,World!”;
  • 实验和实验报告务必在实验楼linux下完成,课程视频是在本地虚拟机上操作的,除了目录环境和作业提交方式不同外,基本的命令和编辑操作方式是一致的。
实验二:命令行菜单小程序V1.0

具体要求(参照视频中的具体实验过程):

  • 实现一个命令行的菜单小程序,执行某个命令时调用一个特定的函数作- 为执行动作,实现的命令个数不少于8个;
  • 类似ftp的help目录或者bash的help目录;
  • 程序循环、接收用户的命令,如help、others等命令;
  • 可以广泛通用的命令行菜单子系统组件,可方便地定制而嵌入到其他系统;
实验三:内部模块化的命令行菜单小程序V2.0

实验要求:

  • 注意代码的业务逻辑和数据存储之间的分离,即将系统抽象为两个层级:菜单业务逻辑和菜单数据存储
  • 要求:1)遵守代码风格规范,参考借鉴代码设计规范的一些方法;2)代码的业务逻辑和数据存储使用不同的源文件实现,即应该有2个.c和一个.h作为接口文件。
实验四:用可重用的链表模块来实现命令行菜单小程序V2.5

实验要求:

  • 用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作;
  • 链表模块的接口设计要足够通用,命令行菜单小程序的功能保持不变;
  • 可以将通用的Linktable模块集成到我们的menu程序中;
  • 接口规范;
实验五:用callback增强链表模块来实现命令行菜单小程序V2.8

实验要求:

  • 给lab5-1.tar.gz(在实验楼Linux虚拟机环境下~/se_files/目录下)找bug,quit命令无法运行的bug
  • 利用callback函数参数使Linktable的查询接口更加通用
  • 注意接口的信息隐藏
实验七:将menu设计为可重用的子系统

实验要求:

  • 为menu子系统设计接口,并写用户范例代码来实现原来的功能;
  • 使用make和make clean来编译程序和清理自动生成的文件;
  • 使menu子系统支持带参数的复杂命令,并在用户范例代码中自定义一个带参数的复杂命令;
  • 可以使用getopt函数获取命令行参数。

4、总结部分

收获:

通过本课程的学习,让我认识到了如何灵活运用c语言的特性来进行封装,信息隐藏,如何一步步的将一个程序进行模块化修改与设计,并且做到高内聚,低耦合的设计。而且通过大量的实际练习,巩固所学到的知识,收益颇丰。期待孟宁老师的下一堂课,最后:感谢孟宁老师,感谢实验楼,感谢网易及MOOC团队。

遗憾:

虽然有了大量的实践,但是对于一个完整的项目而言,这点经验杯水车薪,希望以后能接触到实际项目,对开发一个完整项目的经验有所积累。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值