What & How & Why

Intro, Key Concepts, Functions

Period 1 Notes


Introduction

Programming Language

  • Programming Language:
    • Low Level
      • 计算机实际执行的程序
    • High Level
      • human friendly
      • 需要被转换成 low level 才能被计算机处理
      • 优势:可移植(protable):可以在不同的平台上运行
解释器与编译器
  • 解释器按行对程序进行 High level 到 low level 的转换
  • 编译器只转换一次。转换后的程序被称为 Object Code & Executable,可反复使用

Program

  • 一系列为了实现某种功能的指令集合
  • 需要的部分:
    • input
    • output
    • math:比如加法等算数运算
    • testing:检查程序的执行是否正常
    • repetition:通常用于执行重复的工作

Debuging

错误的种类
  • Compile-time error
    • 编译期间出现的错误,通常是语法错误,由编译器检测
  • Run-time error
    • Logic error & semantics:可成功编译,但结果不正确

System Development

Life Cycle
  • Application 通常包含了各种程序,用于实现各种任务
  • 这些任务的设计与组合通过系统分析师(System Analyst)在程序计划期完成
  • 流程 Cycle:计划→分析→设计>实现→维护→计划
    • 计划期:所有的 Input,processing,output 都会被系统分析师设计好
    • 实现期:每个程序员会被指定去实现对应的模块
    • 维护期:程序在实际使用中出现的问题,以及新的功能的实现,都在此阶段解决

Modularization

Programming 中最重要的一点就是整合(调用)已经实现的代码到我们自己的程序中。调用通常通过函数(function)来实现。通过函数,我们可以将大型的 program 分解为若干的小的部分进行实现。

函数通常分为两种类型:

  • programming Control:分解并控制整个程序,调用的名字可能相同,但每次执行的任务很可能不同
  • Special task:为特定的功能而实现的函数
函数的建立方式
  • 定义函数:撰写函数实际的代码
  • 声明函数:告诉编译器我们已经有了某个函数的原型
  • 调用函数
函数的交流

函数通过参数(parameter)进行数据的传递与交流。这种方式允许我们同时使用多个函数来完成复杂的任务。

C++ 中的函数

  • Program Control: C++ 中使用 main() 函数
    • main 函数是整个程序开始和结束的地方
    • 结构:
      • includes
      • technical items: 比如命名空间
      • 全局变量
      • 函数的声明
      • 函数的调用
      • 函数的实现
Special task function

return type + identifier name (<data type> <identifier name for input value>)
{
    line of code;
    return <value>;
}

函数的前置声明

函数的前置声明是为了使函数对编译器可见。通常在程序的撰写中,main() 函数处于其他函数实现的前面。main() 中可能会包含各种定义至于其后的函数的调用。调用此类后置定义的函数,必须要对其进行前置申明,也就是:声明→调用→定义

Programming Design

  • 程序通常通过 IPO (Input & processing & output) 的方式来设计。
  • 设计工具包含
    • 伪代码(pseudocode):用于对程序的每个函数进行逻辑和算法上的建模
    • 流程图(flowcharting):类似伪代码,以图形的方式对程序进行建模,通常通过计算机软件来实现(computer aid SDE)
  • Test Data:包含一组输入和对应的期望的输出,用于检查程序的正确性
Pseudocode

为了描述逻辑而使用,不是真正的可编译代码。比如下面的例子:

Input
    display a message asking the user to enter the first page
    get the first age from the keyboard
    display a message asking the user to enter the second page
    get the second age from the keyboard
Processing
   calculate the answer by adding two ages together and dividing by two
Output
    display the answer on the screen
    pause so the user can see the answer
当使用伪代码确定了程序的设计之后,我们就可以使用具体的程序语言,按照指定好的逻辑来实现程序。对于程序复杂的情况,每个子模块都需要以 IPO 的形式独立存在,并以 Hierarchy chart 的形式串联起来。这种方法被称为 HIPO(Hierarchy IPO

Test data
  • Test data 可以用于检查 model 和 code 的正确性。
  • model 检测:测试伪代码中的逻辑是否正确
  • code检测:测试实现中的逻辑是否正确

Formal & Natural languages

  • Formal language:为特殊目的而设计的语言。程序语言是 formal lanugage of expressing computations.
    • 对 systax 有严格的要求
  • Nature language:人类使用的语言
  • 区别:
    • 二义性(ambiguity):自然语言通常会有歧义
    • 复杂性(redundancy):自然语言通常非常复杂
    • literalness:自然语言不够精确
Syntax rules

Syntax 与下面的两个概念相关:

  • tokens:语言的基础组成部分
  • structure of statement:taken 的排列方式
    • parsing:排列 taken 进而生成 structure correct 的 statement 的过程。(semetics of sentence)

IDE

IDE(integrated Development Environment)指集成开发环境,包括了:

  • text editer
  • compiler
  • linker
  • operation system commands
编译过程
  1. 加载 pre-processor
  2. 将编程语言转换为机器指令,并将指令和对应数据&linker 的解决方案保存为 Object file
  3. linker 通过 Object file 将对象,库连接到一起,生成可执行文件
  4. IDE 通过 loader 来读取可执行文件进行和运行
编译过程中的错误
  • compiler error:任何 Pre-professior 处理,和机器指令转换过程中遇到的错误
  • linker error:链接期的错误
  • Logic

Compiler Directives

指编译期的预处理阶段,通常包括:

  • include:将会被插入到本文件前的文件,通常是 Header file
  • define:由编译器存储的变量,当在程序中遇到该变量,编译器会自动将其替换为对应的值

#define PI 3.14159
areaCircle = r * r * PI;
//equal to 
areaCircle = r * r * 3.14159

Key concepts

Variables and types

  • 类型(type)定义了一系列的值,和一系列可以应用到此类值上的操作。有四种类型:
    • Nothing
    • Integer
    • Float-point
    • Complex
C++ 中的数据类型属性
  • C++ 关键字
  • Domain:数据类型允许的值
  • Signage:是否允许负数
  • Meaning:数据类型表示的是哪类值
  • Rules of Definition:该类型数据用什么特殊字符表示
  • Size:该类型需要占用多大的内存空间\
Family Data Type Reserved Word Represents Standard Type
Nothing Null or nothing void No data Yes
Integer Boolean bool Logical true and false Yes
Integer Character char Single characters Yes
Integer Integer int Whole numbers Yes
Floating Point Floating Point float Fractional numbers Yes
Complex String string A sequence (sting them along) of characters No
Complex Array N/A A collection of elements of the same data type No
Complex Pointer N/A A value that points to a location (an address) within the data area No
数据类型的特点
  • 变量的类型决定了值的取值范围
  • 赋值的变量必须符合声明的类型
  • 输出变量指输出变量中存储的值

Identifier Names

  • 使程序便于人类理解的一系列名称
C++ 中的 indentifier names
  • 只能使用允许的字符:头字符只能使用 alphabet 或者 下划线
  • 不能使用 reserved word
  • 有长度限制
  • 区分大小写
Good Practices
  • 有意义的
  • 尽量一致
  • 不要以下划线开头
  • 变量使用小写,常量使用大写

Constants and Variables

  • constant 指无法在程序执行期间更改的数据,定义时必须给出初始值
  • variable 指可以更改的数据
constants 的三种形式
  • literal:字符串常量,是值
  • defined:指用字符(文本)代替的具体常量:

#define PI 3.14159

  • memory:用户自行定义的常量

const double PI = 3.14159

Data Manipulation
  • 计算机中的数据操作是基于数学的
  • C++ 中的运算符分为单目,双目和三目

Assignment

Assignment 允许更新指定空间的值。C++ 中使用 = 作为 assignment 的运算符。运算符右边可以是值,也可以是表达式。

  • assign 是指给已存在的空间赋予新的值
  • C++ 中,assignment 需要匹配类型:变量与值需要有同样的类型
输出变量

//using std::cout
cout << var;

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++ 中使用 doublefloat

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 的生命周期与函数一致,是局部变量

函数的结构分析

伪代码

组成部分:

-开始: 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

结构表
  • 作为文档的一部分,用于表示整个程序中函数(模块)的结构
  • 调用某个上层的函数将调用其下一级函数

Program Control Functions

  • Modularization:将大的问题分解为小的,可管理的问题
Program Control Function
  • 用于管理函数之间的信息交流
  • 使用公共区域(global)存储所有功能函数所需变量信息
  • 管理函数没有输入输出(比如 main()

Void Data Type

  • 没有值和类型
  • 用于表示缺乏类型的类型

可读文档的建立

  • 文档:至于源程序顶部,用于说明程序的详情
  • Vertical Alignment

//e.g.
//bad
float price_gal_paint;
int coverage_gal_paint;
//good
float price_gal_paint;
int   coverage_gal_paint;

  • 正确使用 comments
  • Function Banner

//e.g.
//******************************************************
// main
//*****************************************************

  • Block Markers
  • Indent Block Markers
  • Meaningful Identifier
  • 正确使用 typedef

Conditionals and recursion

modulus operator

  • 除整数,生成余数
  • 可判断是否能被整除 / 求整数最右边的几位数

带条件的执行

// condition
if(x > 0) {
    cout << "result is positive";
}
// chained
else if(x < 0) {
    cout << "result is negtive";
}
// alternative condition
else {
   cout << "result is zero";

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