Presentation is loading. Please wait.

Presentation is loading. Please wait.

程序设计杂谈 2014级 ACM班 柯嵩宇.

Similar presentations


Presentation on theme: "程序设计杂谈 2014级 ACM班 柯嵩宇."— Presentation transcript:

1 程序设计杂谈 2014级 ACM班 柯嵩宇

2 讲些什么呢? 代码风格 Debug C++11

3 代码风格 合理的空格 合理的空行 花括号的位置 统一的缩进 合理的define 合理的头文件引用(鄙视没事干打了二三十行头文件的人)
命名规则 模块化的设计(非常重要,降低DEBUG难度)

4 空格 单目运算符应紧贴操作数 双目运算符前后有空格 逗号,分号,如果不是行尾请加空格
for, while, if, switch等之后加一个空格以突出关键字。

5 空行 两个函数定义之间加一个空行 不同阶段的语句块之间加空行(或者注释)(如图论算法的建图和其余操作)

6 缩进 Google Code Style推荐是2个空格,但是。。。
两个空格的缩进实在是太小了,有的时候很难看出代码的层次,因此推荐使用 TAB字符缩进。 主流的文本编辑器都支持自定义TAB字符的宽度,TAB字符可以方便其他阅读程 序的人。

7 关于define 定义常量应使用const/constexpr而不是用define
使用inline来定义简单函数,如max,min,sqr等 #define x first … 什么的绝对不可以出现

8 头文件包含 建议顺序: 尽量避免循环引用 自己写的头文件一定要带头文件保护 自己编写的先包含,然后是各类库,同一类的按照下面的顺序
输入/输出(如果有区别的话先输入再输出)(<iostream>,<cstdio>…) 工具(<cmath>,<algorithm>…) 尽量避免循环引用 自己写的头文件一定要带头文件保护

9 命名规则 应当直观且可以拼读 函数名用动词短语 常量/变量名,类名用形容词+名词 不要出现完全相同的局部变量和全局变量。

10 拼写规则 大小写混排(驼峰式)(InsertElement) 小写+下划线(insert_element) 常量名,全部大写+下划线连接
类名,函数名大驼峰 Matrix,TreapNode,InsertElement… 变量名小驼峰 bestAns,pivot… 小写+下划线(insert_element) 常量名,全部大写+下划线连接

11 什么时候需要DEBUG 程序运行不正常(崩溃,内存泄露) 程序运行结果不对 执行效率与期望不符(循环范围or死循环)

12 DEBUG 先自顶向下的确认一下代码的逻辑,程序流程是否正确。 划分模块,单独执行模块,查看运行结果是否正确。 确认到出错的模块。

13 DEBUG方法 本质上都是通过一些办法在程序运行的同时查看程序的执行情况。 with IDE or Debug tools
like Code::Blocks, Visual Studio, Xcode Code::Blocks跨平台 VS、Xcode功能更加强大 with printing message 把变量的信息以一定的格式输出到屏幕或者文件。 建议:输出的时候使用cerr或者是stderr,这样子不会影响程序原有的输出,提交到OJ上 面也不会因为忘记删调试语句的问题WA。

14 Example(with Visual Studio 2015)
对于RE的程序,很简单,直接F5(调试),会执行到引起RE的语句同时报错。 查看变量,思考程序逻辑(想一下那些设计上的细节问题会引起RE,如数组越界, 空指针,野指针等) 对于WA的程序,设断点,然后逐过程,逐语句的执行。

15 过了样例但是WA 了怎么办 读题,确认自己没有看错题目,理解错题意。 读代码,确认代码逻辑是否正确。 小数据测试 大数据测试
优点:可以手算答案。 缺点:可能错误在自己的思维误区。 大数据测试 优点:可以测试程序在大数据下的运行状况。 缺点:并不能正确的知道数据的输出是什么,即,难测试程序的正确性,除非你知道这个 数据的正确输出。——对拍

16 对拍 需要: C++执行外部程序 Python执行外部程序 答案正确的程序 随机数据生成器 自动化脚本
生成数据 执行选手程序 执行答案正确的程序,得到正确输出 将选手的输出和正确输出比较,如果一致,重复以上操作,否则停止并保留数据和执行结果。 C++执行外部程序 int system(const char *s); // <cstdlib> Python执行外部程序 os.system(“command”) need “import os”

17 For TLE 暴力算法,大数据TLE——很正常,想想合理的算法吧
没有办法的办法——优化输入输出效率等各种黑科技。 尽量不要用动态空间,new的效率堪忧。。。

18 For MLE 检查一下数据范围和数组大小,是不是多打了几个0 去掉不必要的变量,重复利用尽量多的空间

19 For RE Stackoverflow Dived by zero std::exception 数组越界
减少递归层数,减少每层递归需要的内存空间 Dived by zero 仔细阅读代码,找到引起问题的语句 std::exception STL的异常,一般是引用了不合法的位置 数组越界 检查循环范围以及边界条件

20 C++11 字面值 二进制字面值 Unicode字面值 range-for thread

21 字面值 二进制字面值 Unicode字面值 0b001=0x1=01=1 0b10=0x2=02=2 UTF-8 u8”乐乐和琛哥”

22 rang-for for (<type> variant : STL’s data structures) { ...... }

23 thread 奔走相告 C++自带多线程了

24 std::thread Thread() noexcept; 默认构造函数,构造一个空的thread对象
template <class Fn, class... Args> explicit thread (Fn&& fn, Args&&... args); 构造一个thread对象,执行函数fn,参数通过后面的参数表给出。对象构造之后立即被执行。 Thread(const thread &th) = delete; 没有复制构造函数,线程不能被复制。 Thread(thread &&th) noexcept; 移动构造函数。

25 线程相关操作:

26 namespace std::this_thread
std::this_thread::get_id();返回调用该函数的线程的ID。 std::this_thread::yield();放弃调用该函数的线程的执行。(CPU会先执行 别的线程,然后在试图执行这个线程,可以用于等待别的线程执行结果) std::this_thread::sleep_until(…);该线程暂停直到给定的时间点。 std::this_thread::sleep_for(…);该线程暂停一段时间。 时间都是通过C++11标准的时间类给出,详见<chrono>。

27 工程作业 full of dark technology


Download ppt "程序设计杂谈 2014级 ACM班 柯嵩宇."

Similar presentations


Ads by Google