What & How & Why

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
cs:programming:cpp:courses:comp306:start:unit_1_2_3 [2024/08/11 05:18] – [Identifier Names] codingharecs:programming:cpp:courses:comp306:start:unit_1_2_3 [2024/09/15 13:00] (当前版本) – [Infinite Recursion] codinghare
行 174: 行 174:
   * 变量使用小写,常量使用**全**大写   * 变量使用小写,常量使用**全**大写
 ===Constants and Variables=== ===Constants and Variables===
 +  * constant 指无法在程序执行期间更改的数据,**定义时必须给出初始值**。
 +  * variable 指可以更改的数据
 +==constants 的三种形式==
 +  * literal:字符串常量,是值
 +  * defined:指用字符(文本)代替的具体常量:
 +<code cpp>
 +#define PI 3.14159
 +</code>
 +  * memory:用户自行定义的常量
 +<code cpp>
 +const double PI = 3.14159
 +</code>
 +==Data Manipulation==
 +  * 计算机中的数据操作是基于数学的
 +  * C++ 中的运算符分为单目,双目和三目
 +===Assignment===
 +Assignment 允许更新指定空间的值。C++ 中使用 ''='' 作为 assignment 的运算符。运算符右边可以是值,也可以是表达式。
 +  * assign 是指给已存在的空间赋予新的值
 +  * C++ 中,assignment 需要匹配类型:变量与值需要有同样的类型
 +==输出变量==
 +<code cpp>
 +//using std::cout
 +cout << var;
 +</code>
 +===Arithmetic===
 +  * 分为加减乘除和末除
 +  * 都是双目
 +===类型转换===
 +  * 分为显示和隐式
 +  * 就结果而言,数据类型可能会被提升(//Promotion//),也就是从较小的类型提升到较大的类型,也可能反过来(//Demotion//
 +==隐式类型转换==
 +  * 指系统自动进行的类型转换
 +  * 转换是否发生和结果取决于运算符的类型
 +==Promotion & Demotion==
 +  * Promotion 通常出现在 int, float-point 和 char 中
 +  * Demotion 通常得到的是 truncate 的结果:需要注意,丢失精度的变量通常会导致无法预测的结果
 +===Integer===
 +  * 用于表示所有的整数:离散的数字
 +  * 通常 ''4'' byte,带符号
 +  * 几种扩展类型: [signed or unsigned] short int /long int
 +  * domain 是 machine dependent 的
 +===Float-point===
 +  * 由尾数(//mantissa//)和指数(//exponent//)组成
 +  * 主要以精度来衡量
 +  * C++ 中使用 ''double'' 和 ''float'' 
 +===String 类型===
 +  * 通过一系列的 char(本质是字符数组)来实现
 +===Operators===
 +  * 两个整数相除依然会得到整数
 +  * 整数除法会将**向下** round。比如结果小于 1,得到的结果为 0(非四舍五入)
 +  * 整数除法与末除相对应
 +===Order of operations===
 +  * 取决于 rule of precedene
 +  * 可以使用 parentheses 进行 override
 +===Operator for chars===
 +  * char 可以基于 ascii 码值进行运算
 +===Lvalue & Rvalue===
 +  * Lvalue(左值):可以接收 value,通常在赋值运算符左边
 +  * Rvalue(右值):用于初始化 / 覆盖左值的内容,通常在赋值运算符右边
 +====Functions====
 +===Floating-point===
 +  * 声明与赋值的组合通常被称为初始化(//initialization//
 +  * 浮点数与整数的运算方式不同
 +  * 浮点转化为整型都会导致 rounddown,比如 ''2.999999'' 会变为 ''2''
 +===Math functions===
 +  * C++ 提供一系列内置的数学函数,需要使用 ''<cmath>''
 +  * 输出需要使用 ''<iostream>''
 +===Composition===
 +  * 表达式可以作为另外的表达式的一部分
 +===自定义函数===
 +  * 允许需要的功能被反复调用
 +  * 函数可以嵌套
 +===函数的执行顺序===
 +拥有多个函数时:
 +  * ''main()'' 中,运行是自顶向下
 +  * 当遇到函数调用时,跳转到函数部分进行执行,完毕之后返回 ''main()''
 +  * 嵌套函数时会堆栈,最后调用的函数会先执行。
 +===parameter & argument===
 +  * argument 是实际传递到函数中的参数
 +  * parameter 是函数定义时用于告知用户该函数需要什么样类型的参数
 +  * 两者名字无任何关系
 +==parameter and variable are local==
 +  * parameter 的生命周期与函数一致,是局部变量
 +===函数的结构分析===
 +==伪代码==
 +组成部分:
 +<code>
 +-开始: function
 +-输入: pass in
 +-输出: pass out
 +-结束: Endfunction
 +-调用: call
 +//example
 +Function main
 +Pass In: nothing
 +Doing some lines of code
 +Call: clear monitor
 +Doing some lines of code
 +Pass Out: value zero to the operating system
 +Endfunction
 +</code>
 +==结构表==
 +  * 作为文档的一部分,用于表示整个程序中函数(模块)的结构
 +  * 调用某个上层的函数将调用其下一级函数
 +{{ :cs:programming:cpp:courses:comp306:start:function_module.jpg?200 |}}
 +===Program Control Functions===
 +  * Modularization:将大的问题分解为小的,可管理的问题
 +==Program Control Function==
 +  * 用于管理函数之间的信息交流
 +  * 使用公共区域(global)存储所有功能函数所需变量信息
 +  * 管理函数没有输入输出(比如 ''main()''
 +===Void Data Type===
 +  * 没有值和类型
 +  * 用于表示缺乏类型的类型
 +===可读文档的建立===
 +  * 文档:至于源程序顶部,用于说明程序的详情
 +  * Vertical Alignment
 +<code cpp>
 +//e.g.
 +//bad
 +float price_gal_paint;
 +int coverage_gal_paint;
 +//good
 +float price_gal_paint;
 +int   coverage_gal_paint;
 +</code>
 +  * 正确使用 comments
 +  * Function Banner
 +<code cpp>
 +//e.g.
 +//******************************************************
 +// main
 +//*****************************************************
 +</code>
 +  *  Block Markers
 +  *  Indent Block Markers
 +  * Meaningful Identifier
 +  * 正确使用 typedef
 +====Conditionals and recursion====
 +===modulus operator===
 +  * 除整数,生成余数
 +  * 可判断是否能被整除 / 求整数最右边的几位数
 +===带条件的执行===
 +<code cpp>
 +// condition
 +if(x > 0) {
 +    cout << "result is positive";
 +}
 +// chained
 +else if(x < 0) {
 +    cout << "result is negtive";
 +}
 +// alternative condition
 +else {
 +   cout << "result is zero";
 +</code>
 +==nested condition==
 +  * 理解为大分支的小分支
 +  * 注意缩进
 +===Recursion===
 +  * 函数调用自身
 +  * 通过自身参数的变化来进行下一步的处理
 +==Infinite Recursion==
 +正常的递归需要
 +    * base case
 +    * 趋向于 Base case 的条件
 +==更多的递归形式==
 +  * 阶乘
 +    * base -> ''0!=1''
 +    * 递归 -> ''f(n!) = n * f(n-1)''
 +====Furitful functions====
 +===return value===
 +  * 返回的类型需要和函数定义的返回类型一致
 +  * 存在条件语句时,满足条件分支中的 return 会直接跳出函数
 +    * 另外一部分不会被执行的 code 被称为 //Dead code//
 +    * 这种情况下需要保证所有的分支都存在 return
 +===Development===
 +==Incremental development==
 +  * 使用小步骤渐进式的编写程序
 +  * 使用临时变量测试中间值,保证每一步修改的正确性
 +  * 移除所有的测试语句(//scaffolding//
 +==Composition==
 +  * 使用已有的函数组合生成新的函数
 +===Overloading===
 +  * 两个函数重名时且**接收的参数不同**,时,同时使用会导致函数的重载(//overloading//
 +  * 使用时需要确保调用的函数是希望的版本
 +==Boolean==
 +  * 只有 ture 和 false 两种值
 +  * 可以被用作 flag
 +===Logocal operator===
 +  * 三种: ''&&'', ''||'', ''!''
 +==Bool functions==
 +  * 返回 boolean 的函数
 +  * 通常用于检测
 +===Main return===
 +  * ''0'' 代表正常
 +  * 出问题时通常返回 ''-1''
 +