复习大纲
期末考试占分:40% 题型:选择题(20分),读程序(20分)
一、初步知识
? C/C++ 语言的发展史及其特点 ? C++ 程序的构成和书写形式 ? C++ 程序的开发过程
高级语言(第3、4、?代语言): ? 高层次的编程元素 ? 机器无关(可移植性) ? 操作系统无关(跨平台) ? 需要利用:编译器(compiler),或解释器(interpreter) ? 使开发复杂软件的成为可能 ? 既利于人类思维又便于转换成机器指令 ? 回避寄存器、内存地址、机器周期等的直接使用 ? 将精力集中在要解决的问题上 关于C: ? 功能丰富、表达能力强、使用灵活方便、应用面广、目标程序效率高等。 ? 面向过程,是结构化语言。 关于C++: ? C++保留了C语言原有的所有优点,增加了面向对象的机制。 ? 与C兼容。用C语言写的程序基本上可以不加修改地用于C++。是C的超集。 ? C++既可用于面向过程的程序设计,又可用于面向对象的程序设计,是一种混合型的语言。 ? 适合于开发较大规模软件。 编写和运行C++程序:
1. 用C++语言编写程序 2. 对源程序进行编译 3. 将目标文件连接 4. 运行程序 5. 分析运行结果
程序的三种错误 ? 编译时的错误:通常是语法错误 ? 运行时的错误:如数值的越界、除数为零等。 ? 逻辑(算法)错误:运行结果不正确。 程序结构 ? 一个程序由若干函数组成: ? main函数(必须有一个且只能有一个) ? 其它函数(若干) ? 函数由以下组成: ? 函数头 ? 函数体:若干语句 书写形式
良好的编程习惯,注意程序的可读性:
? ? ? ?
同一层次对齐 不同层次缩进 适当使用注释 有意义地命名
二、数据和数据运算
数据类型、常量/变量、运算符、表达式
数据在计算机中的存在形式: ? 十进制数转换成二进制数 ? 整数:原码、反码、补码 ? 实数:尾数 + 阶码 ? 字符转换成二进制数 ? 按照“ASCII代码表”
程序中数据的存在形式:变量、常量 ? 变量:变量名、变量类型、变量值、变量的地址,变量的命名规则,先定义后使用、变量初始化 常量(由字面形式判断) ? 数值常量 ? 整型常量:123, -123, 123L ,020, 0x20 ? 实型常量:3.14, -0.314e1, 1.23456789L ? 字符常量 ? 普通字符常量:'a', '1', '#' ? 转义字符常量:'\\n', '\\41', '\\x41' ? 符号常量 ? 数据类型:整型、实型、字符型、逻辑型;字节数、数值范围、有效数字,数据溢出;不同类型的数据的转换(自动或强制)
数据运算 ? 表达式:数据 + 运算符 ? 数据(常量和变量 ) ? 运算符的功能、操作数个数、优先级、结合性
三、结构化程序设计
? 程序 = 数据结构 + 算法 ? 数据结构:数据的组织形式 ? 算法:解决问题的步骤和方法 ? 算法的特点: ? 明确性:表述清楚、明确、无二义。 ? 有效性:每一步骤都切实可行。 ? 有限性:可在有限步骤后得到结果。 ? 相同的任务可以有不同的算法 ? 其优劣用空间复杂度与时间复杂度来衡量 算法的表示形式: ? 自然语言、伪代码、流程图 结构化程序设计的优点: ? 程序结构清晰、可读性强 ? 程序更易于调试
? 程序更利于避免错误 如何结构化程序设计 ? 只使用3种基本控制结构: ? 顺序结构、选择结构、循环结构 ? 每个结构块必须单入单出 ? 结构块之间可以嵌套和堆叠 顺序结构 ? 程序按照书写顺序执行语句(在模块内部) 选择结构 ? 根据判断条件选择执行路径。 循环结构 ? 重复执行某段代码 两类语句 ? 非执行语句 ? 可执行语句 控制语句 ? 2种选择结构控制语句:if, switch ? 3种循环结构控制语句:while, do/while, for ? 其它控制语句:break/continue/goto, return
四、模块化和函数
? 模块化程序设计:分解复杂问题 解决子问题:函数(模块)
定义函数(创建模块)
函数定义的格式
返回值类型 函数名(形式参数表) { 函数体 }
关于函数定义的说明 ? 函数名: ? 标识函数,表明函数功能,与变量名命名规则相同 ? 函数形参: ? 传递数据,必须是变量,不能是表达式 ? 返回值类型(函数类型): ? 返回给上一层模块的数据的类型 ? 通过return实现 ? 如果无返回值,则函数类型为void ? 函数体:实现函数的功能 函数设计要求 ? 执行单一的、明确的任务 ? 函数名表达其任务
调用函数(使用模块) ? 调用前要给出函数原型: 类型 函数名(形参表); ? 函数调用的形式:
函数名(实参表); 函数原型的作用 ? 编译程序用以检验函数的调用,以避免因错误调用而导致运行时错误。 函数调用的执行过程 函数调用中的程序控制 ? 主调函数(caller)通过函数名进入被调函数 ? 被调函数(callee)通过以下途径返回主调函数: ? return ? 函数结束部分的右大括号 函数的参数传递的两种途径: ? 按值传递
? 被调函数生成形参 ? 实参值被复制到形参 ? 形参的改变不会改变实参
? 按引用传递
? 形参使用实参的存储空间 ? 形参的改变会改变实参 ? 两种途径均有各自的优缺点
函数参数的按值传递 ? 在函数被调用时形参被分配存储单元。 ? 实参可以是常量、变量或表达式。 ? 数据只能从实参传递给形参,即单向传递。 ? 当实参类型与形参不同时,按形参类型转换。 ? 虚实结合:一一对应(类型、个数、顺序) ? 函数返回时,释放形参和局部变量所占内存 函数参数的按引用传递 ? 在函数被调用时不为形参分配存储单元,形参使用实参空间。 ? 实参不能是常量或表达式,只能是变量,而且类型必需与形参类型一致。 ? 实参和形参共享数据,即双向传递。 ? 引用是标识符的别名 模块化程序设计 ? 设计:自上而下 ? 编码:自下而上 递归算法 ? 由两部分组成: 已知部分:解基本情形
未知部分:与原始问题类似,但更简单或更小
? 递归算法的两个过程:
递推:“未知”到“已知”
回归:由“已知”得到“未知”
递归函数的常见错误 ? 忽略了基本情形,或错误地编写了递归步,以致程序无法运行到基本情形,而导致无限递归,最终内存耗尽。 ? 忘记从递归函数中返回 递归与迭代的比较 ? 软件工程 ? 递归方法更加自然、易于理解和调试
? 迭代方法的解决方案不明显 ? 程序性能 ? 递归方法占用更多的时间和内存 C++标准库函数 ? 不属于C++语言 ? 由编译系统提供 ? 分类: ? 数学函数(math.h) ? 字符串函数(string.h) ? 输入/输出函数(stdio.h)等 库函数原型 ? 使用预处理命令:# include ? 将# include指定的文件内容包含进来 两种形式: ? #include \文件名\: ? 系统先在引用被包含文件的源文件所在的文件目录中寻找要包含的文件,若找不到,再按系统指定的标准方式检索其它目录。 ? #include <文件名>: ? 直接按系统指定的标准方式检索目录 C++改进 ? 使用名字空间:namespace ? 解决名字污染问题
cmath:
namespace std {#include
把
五、作用域和生存期
模块间信息共享的几种方式: ? 函数参数(通过函数接口传递) ? 全局变量(所有函数共享数据) ? 类的封装(相关函数共享数据) 作用域 ? 标识符(变量、函数)能够被访问的区域 ? 三种:块作用域,类作用域,文件作用域 块作用域 ? 函数内定义的变量,其作用域自定义处起到块结束止 类作用域 ? 类内定义的变量和函数 ? 有效范围是整个类 ? 只有类成员函数可以直接访问 文件作用域 ? 函数外或类外定义的标识符 ? 不属于任何函数或类 ? 程序任何地方均可访问 全局变量: ? 函数外定义的变量 ? 具有文件作用域