C++编程基础教程_第1页
C++编程基础教程_第2页
C++编程基础教程_第3页
C++编程基础教程_第4页
C++编程基础教程_第5页
已阅读5页,还剩78页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C 程序设计程序设计 C 是一门面向对象的程序设计语言 语法丰富 概念全面 兼顾易用和效率 在 游戏开发 网络软件 分布式 服务器集群 移动 手持 设备 嵌入式系统等 领域有着广泛的应用 C 是由 C 语言发展而来 保留了 C 语言原有的所有优点 增加了面向对象的机制 C 与 C 语言兼容 用 C 语言写的程序基本上可以不加 修改地用于 C 一一 C 基础知识基础知识 1 C 语言概述 2 简单的 C 程序实例 3 C 的词法单位 4 C 的数据类型 5 变量和常量 6 运算符和表达式 7 C 语句 8 算术类型转换和赋值类型转换 9 求值次序与副作用 10 数组与字符数组 11 输入输出 12 输入输出格式的控制 二二 基本控制结构基本控制结构 1 算法的概念与表示方法 2 分支结构 if 语句 3 分支结构 if 语句的嵌套 4 分支结构 条件运算符 5 分支结构 switch 语句 6 循环结构 while 语句 7 循环结构 do while 语句 8 循环结构 for 语句 9 循环结构 循环的嵌套 10 转向语句 11 结构化程序设计思想 12 常用算法的应用实例 13 枚举类型 14 文件操作 三三 函数函数 函数的定义与调用 参数传递 返回值及函数声明 全局变量和局部变量 函数调用机制 作用域与标识符的可见性 变量存储类型与标识符生命期 函数的递归调用 函数的重载 内联和默认参数 头文件与多文件结构 编译预处理 四四 类与对象类与对象 1 类和成员函数的定义 2 C 对象的创建与使用 3 从面向过程到面向对象 4 构造函数和析构函数 5 引用与复制构造函数 6 运算符重载 7 友元 8 静态成员 9 结构 五五 数组与指针数组与指针 1 数组 2 多维数组 3 指针与地址 4 指针与地址 5 this 指针 6 数组与指针的关系 7 字符串和 string 类 8 多级指针与多维数组 六六 模板与数据结构模板与数据结构 C 模板 函数模板 C 模板 类模板与线性表 常用的查找方法 常用的排序方法 索引查找与指针数组 函数指针与指针识别 七七 动态内存分配动态内存分配 1 自由存储区内存分配 2 浅复制与深复制 3 链表 单链表的基本算法 4 链表 单链表类型模板 5 链表 双向链表 6 栈与队列 栈的基本操作和应用 7 栈与队列 队列及其操作 8 二叉树 八八 继承与多态继承与多态 1 继承与派生的概念 2 派生类的构造函数与析构函数 3 多重继承与派生类成员标识 4 虚基类 5 派生类应用讨论 6 多态性与虚函数 九九 输入输入 输出流类库输出流类库 C 的基本流类体系 输入输出的格式控制 标准设备的输入 输出 文件 文件的打开与关闭 文件 文件的读 写 文件 文件的随机访问 字符串流 文件与对象 十十 异常处理异常处理 1 异常的概念和处理机制 2 栈展开与异常捕获 3 异常的重新抛出和 catch all 4 异常与继承 5 异常规范 6 C 标准库的异常类层次结构 十一十一 标准模板库标准模板库 1 标准模板库简介 2 迭代子类 3 顺序容器类 4 泛型算法与函数对象 5 关联容器类 6 容器适配器 一 C 基础知识 C 语言是目前广泛使用的程序设计语言之一 因其特有的优势在计算机应用领域 占有重要一席 本章作为 C 程序设计的入门章节 首先结合实例介绍 C 程序的概貌 然后针 对其特点 介绍 C 中的基本词法单位 数据类型 相关运算 以及常量 变量 表达式 语句等基础知识 为编程做好准备 最后介绍简单的输入输出方法 本章内容 本章内容 1 C 语言概述 C 语言是广泛使用的程序设计语言之一 因其特有的优势在计算机应用领域占有 重要一席 C 语言的发展语言的发展 20 世纪 70 年代初 贝尔实验室的 Dennis Richie 等人在 B 语言基础上开发出 C 语言 最初是作为 UNIX 的开发语言 20 世纪 70 年代末 随着微型计算机的发展 C 语言开始移植到非 UNIX 环境中 并逐步成为独立的程序设计语言 C 语言版本很多 为了让开发出来的代码能够在多种平台上运行 1988 年 ANSI 美国国家标准协会 对 C 语言进行了标准化 产生了 ANSI C C 语言的特点语言的特点 既有高级语言的结构和编程环境 又有类似于低级语言 如汇编语言 的系统资源 操纵能力 目标代码的执行效率只比汇编低 10 20 比其他高级语言高 适合解决有实时 要求的问题 有丰富的运算符 数据类型和表达式 对程序设计有良好的适应性 支持以函数为基础结构化程序设计 多文件构成及文件独立编译 适合大型复杂程 序设计 语言简洁 紧凑 使用方便 灵活 书写形式自由 代码及可执行程序的可移植性好 C 语言的发展语言的发展 20 世纪 80 年代初 继面向对象语言 smalltalk 后 许多程序设计语言都向面向对 象的方向发展 C 就是以 C 语言为基础而发展起来的以面向对象为主要特征的语 言 C 语言的特点语言的特点 继承了 C 语言的优点 又扩充了数据类型 使编译系统可检查出更多类型错误 支持面向对象程序设计 通过继承 重载和多态性等特征实现了软件重用和程序自 动生成 加强了一致性 Consistency 检查机制 提高了软件开发的效率和质量 完全兼容 C 多数 C 编写的库函数和应用程序都可为 C 所用 加快了 C 和面向 对象技术的推广 既支持面向对象程序设计 也支持面向过程设计 不是纯正的面向对象的语言 C 有许多版本 国内较为流行的有 Microsoft 公司的 Visual C 2 简单的 C 程序实例 下面通过一个简单的程序例子来分析 C 程序的基本构成及主要特点 程序举例程序举例 例 1 1 一个简单的 C 程序 输入两个整数 通过调用函数求两个数中的较 大值 include using namespace std int max int i int j 定义 max 函数 if i j return i else return j int main void 定义 main 函数 cout i j 从键盘上输入变量的值 cout 最大数是 max i j n 输出提示信息和结果 return 0 上面的示例代码中 黑色字体为程序主体 深绿色字体为注释 组成结构及特点组成结构及特点 C 的程序结构由注释 编译预处理指令和程序主体组成 注释注释 注释内容不参与编译 仅供程序阅读使用 编写程序时可根据需要选取 注释有两种形式 以 开头 至所在行结尾处 换行符之前 之间的内容 以 开头和 结尾 两者之间的内容均为注释 可占多行 编译预处理编译预处理 以符号 引出 一条指令也需在一行内写完 上例中的 include 命令 称为 文件包含指令 它使得后面被包含文件成为本程序 的一个组成部分 被包含文件中的代码可以直接被使用 编译预处理是 C 提供 的组织程序的工具 有关内容在第 3 章 函数中介绍 程序主体程序主体 一般由一个或多个函数组成 但只有一个函数是程序入口 即代码 执行的起点 如本例由 max 和 main 两个函数组成 函数 main 是所有控制台程 序程序的入口 在传统的 Windows 操作系统编程中 入口由系统定义为 Winmain 函数 任一函数的描述都是包括在一对 和 中的语句序列 每个语句以 结束 关 于函数的详细知识将在第 3 章 函数中介绍 C 中严格区分大小写 但不严格限制程序的书写格式 不过从可读性角度出发 程序书写应采用内缩格式 一般一个语句占一行 执行过程执行过程 上例给出的是源程序代码 以扩展名为 cpp 的文件形式保存在磁盘上 经编译 连接生成可执行程序 即扩展名为 exe 的文件 运行可执行程序后 显示器显示 输入 i j 若用户从键盘上输入两个整数 10 20 并按回车键 显示器上将显示结果 最大数 是 20 这种编程方式称为 控制台编程 即通过键盘和显示器 用文本方式对程序进行编 辑 运行和调试 是最初的编程方式 3 C 的词法单位 本节将分为 4 个小节介绍 C 语言使用的字符集 关键字 标识符及标点符号 C 的字符集的字符集 ASCII 码字符集是计算机中的常用字符集 它包括英文字母及阿拉伯数字等 128 个 字符 存储一个 ASCII 码占用一个字节单元 由于汉字处理的需要 又出现了汉字国标码等对应于不同语言的字符集 国标码的 存储占用两个字节单元 为了对各类字符进行统一编码 Unicode 字符集应运而生 它包括了世界上多种语 言的基本字符 共有 65536 个字符 ASCII 码字符集国标码字符集都是它的子集 Unicode 字符集对所有字符进行统一的双字节编码 C 语言使用下列基本字符来构成词法单位 语言使用下列基本字符来构成词法单位 26 个小写字母abcdefghijklmnopqrstuvwxyz 26 个大写字母ABCDEFGHIJKLMNOPQRSTUVWXYZ 10 个阿拉伯数字 0 1 2 3 4 5 6 7 8 9 其他符号 说明 3 个整型变量 i j k float x y z 说明 3 个实型变量 x y z char c1 c2 说明 2 个字符型变量 c1 c2 double dx 说明 1 个双精度型变量 dx 变量的使用变量的使用 变量使用的第一步 是给变量赋初始值 称为 初始化 有两种 方法 变量说明时直接赋初值 int a 3 b 4 c 5 float x 3 0 用赋值语句赋初值 float x e x 3 5 e 2 71828 文字常量文字常量 文字常量指程序中直接给出的量 文字常量存储在程序区 而不是数据区 对它的 访问不是通过数据地址进行的 根据取值和表示方法的不同 可分为整型常量 实型常量 字符型常量和字符串常 量 整型常量整型常量 即整数 可以有多种表示方法 十进制表示法 是平时的习惯写法 例如 15 24 八进制表示法 以 0 打头 由数字 0 7 组成 例如 012 八进制数 12 即十进制数 10 6555 八进制数 655 即十进制数 429 十六进制表示法 以 0X 大小写均可 打头 由数字 0 9 和字母 A F 大小写 均可 组成 用来表示一个十六进制数 例如 0 x32A 十六进制数 32A 即十进制数 810 0 x2fe0 十六进制数 2fe0 即十进制数 12256 其他表示法 还可以表示以 L 或 l 结尾的长整数和以 U 或 u 结尾的无符号整数 以 UL 或 LU 大小写均可 结尾则可表示无符号长整型常数 例如 84L 十进制长整数 84 026U 八进制表示的无符号数 26 0X32LU 十六进制表示的无符号长整数 32 实型常量实型常量 包含小数点和 10 的幂的数 有两种表示方法 一般形式 与平时书写形式相同 由数字 0 9 和小数点组成 例如 0 23 125 76 0 0 46 35 指数形式 即科学表示法 表示为尾数乘以 10 的次方形式 由尾数 E 或 e 和阶 数组成 要求在 E 或 e 前面的尾数部分必须有数字 后面的指数部分必须为整数 判断下列实型常量表示是否合法 答案 红色的不合法 123E12 E4 1 43E3 5 34e 2 字符型常量字符型常量 用单引号引起来的单个字符 保存形式 在内存中保存的是字符的 ASCII 码值 直接表示形式 对于可显示字符 通常用单引号直接引起来表示 例如 a 字符 a 4 字符 4 字符 空格字符 转义序列表示法 对于不可显示的或无法从键盘输入的字符 如回车符 换行符 制表符 响铃 退格等 另外 还有几个具有特殊含义的字符 如反斜杠 单引号 和双引号等 C 提供了一种称为 转义序列 的表示方法 例如 a 响铃 n 换行符 字符 下表给出 C 中预定义的转义序列字符及其含义 字符表示 ASCII 码值名 称功 能 或 用 途 a0 x07响铃用于输出 b0 x08退格 Backspace 键 退回一个字符 f0 x0c换页用于输出 n0 x0a换行符用于输出 r0 x0d回车符用于输出 t0 x09水平制表符 Tab 键 用于输出 v0 x0b纵向制表符用于制表 00 x00空字符用于字符串结束标志等 0 x5c反斜杠字符用于需要反斜杠字符的地方 0 x27单引号字符用于需要单引号的地方 0 x22双引号字符用于需要双引号的地方 nnn八进制表示 用八进制 ASCII 码表示字符 xnn十六进制表示 用十六进制 ASCII 码表示字符 说明 上表中最后两行是所有字符的通用表示方法 即用反斜杠加 ASCII 码表示 对于可显示字符 有三种表示方法 以字母 a 为例 a 141 和 x61 显然 对于可见字符 第一种是最简单直观的表示方法 字符串常量字符串常量 由一对双引号 引起来的若干个字符组成 例如 I am a Chinese 123 a 字符串常量与字符型常量的区别如下 字符串常量 a 占两个字节 存放 a 和 0 如图左半部分 值为 0 x6100 字符型常量 a 占一个字节 存放 a 如图右半部分 值为 0 x61 常变量常变量 用常量说明符 const 给文字常量命名所得的标识符就称为 标识符常量 因为标识 符常量的说明和引用形式很像变量 所以也称 常变量 例如 const float PI 3 14159 定义了常变量 PI const int Number of Student 100 定义了常变量 Number of Student 在使用常变量时应注意以下几点 常变量必须也只能在说明时进行初始化 常变量初始化之后 不允许再被赋值 常变量必须先说明后使用 6 C 运算符和表达式 程序中相当一部分数据处理和 语句 是通过 表达式 表达的 其中使用各种 运算符 C 的运算符 优先级和结合性的运算符 优先级和结合性 在 C 中对常量或变量进行运算或处理的符号称为 运算符 参与运算的数称 为 操作数 运算符的 优先级 指不同运算符在运算中的优先关系 可用序号表示 序号越 小 优先级越高 比如 加号 和减号 的优先级是 6 乘号 和除号 的优先级是 5 和 的优先级 高于 和 符合数学运算的规律 运算符的 结合性 决定同优先级的运算符对操作数的运算次序 从左到右运算 称为 右结合 反之 从右到左称为 左结合 比如 的结合性是从左到右 右结合 则 a b c d 的运算次序为 a b c d 先算 a b 再加 c 最后减 d 又如 前置 和单目负 的结合性是从右到左 左结合 则 a 的运算次序为 a 先做 a 再取相反数 加负号 同一优先级的运算符有相同的结合性 按照要求的操作数个数 运算符分为单目 一元 运算符 双目 二元 运算符和 三目 三元 运算符 单目运算符只对一个操作数运算 如负号运算符 等 双目运算符要求有两个操作数 如乘号运算符 等 三目运算符要求有三个操作数 三目运算符只有一个 运算符与操作数是相关联的 相同的运算符对不同类型的操作数所执行的运算是有 差异的 基本运算符及其表达式基本运算符及其表达式 表达式 就是由运算符 操作数及标点符号组成的 能取得一个值的式子 本小节 介绍的基本运算包括算术运算 关系运算 逻辑运算 位运算等 1 算术运算符及其表达式 算术运算符及其表达式 算术运算符 包括 加 减 乘 除 和 求余 如下表所 示 优先级优先级运算符运算符名称名称 3 正 单目 负 单目 5 乘 双目 除 双目 取余 双目 6 加 双目 减 双目 算术表达式 由算术运算符连接的表达式称为 算术表达式 例如 a b 3 和 a b 4 注意 表达式中每个变量都有确定的值时才能进行表达式求值 注意数据溢出问题 应避免两个很接近的数直接相减 除数是一个很小的数 整数 的连续乘运算等情况 2 赋值运算符与赋值表达式 赋值运算符与赋值表达式 赋值 将数据存放在相应存储单元中称为 赋值 如果该单元中已有值 赋值使新 值取代旧值 引用 从某个存储单元中取出数据使用 称为 引用 引用也是对数据的使用 但 不影响单元中的值 即一个量可以多次引用 赋值运算符 其意义是将赋值号右边的值送到左边变量所标识的单元中 左 操作数称为 左值 而右操作数称为 右值 赋值表达式 由运算符连接的表达式称为格式为 例如 x 5 6 复合赋值运算 复合赋值运算符的要求与格式和赋值运算符完全相同 表示为 它等同于 例如 x 5 等同与 x x 5 注意 赋值号不是等号 它具有方向性 左值 必须放在内存中可以访问且可以合 法修改值的存储单元 通常只能是变量名 右值 则可以是常量 也可以是变量或 表达式 但一定能取得确定的值 例如 下面的赋值运算是错误的 3 1415926 pi 左值不能是常数 x y z 左值不能是表达式 设 const int N 30 则 N 40 左值不能是常变量 3 自增 自减运算 自增 自减运算 意义 使变量当前值加 1 或减 1 再赋给该变量 要求 操作数只能是变量 不能是常量或表达式 运算 分前置和后置两种 例如 int i 5 j 5 m n m i 后置 相当于 m i i i 1 结果 i 的值为 6 m 的值为 5 n j 前置 相当于 j j 1 n j 结果 j 的值为 6 n 的值为 6 4 逻辑运算 逻辑表达式和逻辑表达式的求值优化 逻辑运算 逻辑表达式和逻辑表达式的求值优化 逻辑运算用于判断分析 运算符包括关系运算符和逻辑运算符 关系运算符 包括 大于 大于等于 小于 b c 先求 a b 结果为 true 即 1 再将结果 1 与 c 比较 结果为假 a b c d 等同于 a b c d 结果为假 a b 则逻辑表达式 a b c 产生的结果是 分析 a 2 第一个操作数为 1 1 与任何值相或的结果总是 1 true 所 以不用再计算 b 和 c 则此 b 的值仍为 0 c 的值仍为 3 整个表达式的值为 1 例 3 假定 x 0 y 2 z 3 求表达式 x 以下逗号表达式的结果是 c b a 3 4 3 结果为 a 3 b 12 c 12 表达式的值为 12 c b a 3 4 3 结果为 a 3 b 3 c 3 表达式的值为 12 c b a 3 4 3 结果为 a 3 b 3 c 12 表达式的值为 12 7 sizeof 运算符运算符 sizeof 运算符 用于计算存储一种数据类型或一个变量所需的字节数 一般格式为 sizeof 或 sizeof 关于 sizeof 的几点说明 数据类型可以是标准数据类型 也可以是用户自定义类型 变量必须是已定义的变量 括号可以省略 运算符与操作数之间用空格间隔 sizeof 应用举例 sizeof int 值为 4 sizeof float 值为 4 设 double x 则 sizeof x 值为 8 7 C 语句 语句是程序的基本单位 必须以分号作为结束标记 C 中的语句分为以下几种 1 表达式语句 是最简单的语句形式 一般格式为 表达式 2 空语句 只由一个分号构成的语句 一般格式为 注意 空语句不执行任何操作 但具有语法作用 例如 for 循环在有些情况下 循环体 或者循环判别条件是空语句 详细内容请参见第二章 从程序结构的紧凑性与合理性角度考虑 尽量不要随便使用空语句 3 复合语句 由 括起来的一组语句 一般格式为 若干语句序列 注意 复合语句描述一个块 在语法上起一个语句的作用 复合语句中的每个语句以 结束 而整个复合语句的结束符为 4 流程控制语句 用来控制或改变程序的执行方向的语句 详细内容请参见第 2 章 8 C 算术类型转换和赋值类型转换 运算过程中 当参与运算的操作数类型不同时 可进行类型转换 包括 自动转换 和强制转换 自动类型转换指在算术运算以及在赋值过程中 如果运算符两边的操作数属于 类 型相容 指类型不同但系统可以自动进行转换 的情况 如整数 字符和实数之 间 系统会自动进行类型转换 然后再做运算 包括 算术类型转换 赋值类型转 换 一一 混合运算的类型转换混合运算的类型转换 当运算符两边的操作数类型不同但类型相容时 系统自动将不同的数据类型转换成 相同类型 再进行运算 具体规则如下 具体规则如下 字符可作为整数参与运算 整数值为其 ASCII 码 对于字符或短整型操作数 系统自动变换成整型 对于单精度型操作数时 系统自动变换成双精度型 当两操作数类型不同时 将精度低 或表示范围小 的操作数的数据类型变换成与 另一操作数类型相同 再进行运算 变换关系如图 1 2 所示 图 1 2 数据类型转换规则 举例说明 例如 设有变量 char c1 c2 int i1 i2 float x1 x2 则表达式 x2 c1 i1 c1 x1 c1 c2 的求值过程为 1 将 c1 转换成整型 完成 c1 i1 结果为 t1 2 将 c1 和 x1 转换成双精度型 完成 c1 x1 结果为 t2 3 将 c1 和 c2 均转换成整型 完成 c1 c2 结果为 t3 4 将 t1 转换成双精度型 完成 t1 t2 结果为 t4 5 将 t3 转换成双精度型 完成 t4 t3 6 最后结果转化为单精度型 赋给 x2 二二 赋值类型转换赋值类型转换 当赋值号左值和右值类型不一致但类型相容时 系统将自动进行类型转换 转换规则如下 转换规则如下 实型数赋给整型变量时 仅取整数部分 若该部分超出整型变量取值范围 结果将 溢出 整数赋给实型变量时 将整数转换成实数再赋值 字符数据赋给整型变量时 将字符转换为整型 转换分两种情况 对无符号字符数据 低位字节不变 高位字节补 0 对有符号字符数据 若符号位为 0 与无符号字符数据转换规则相同 若符号位为 1 则低位字节不变 高位字节全部置 1 绝对值较大的数赋给表达范围较小的数据时 注意溢出 举例说明 例如 设有变量 signed char c1 250 short int a a c1 分析 c1 的值为 11111010 转换成 11111111 11111010 赋给 a 正是 6 的 补码 所以 a 的值为 6 三三 强制类型转换强制类型转换 如果需要人为地将一种类型转换为另一种类型 必须使用 C 提供的强制类型转 换运算符 一般格式为 或 注意 对整个表达式作强制类型转换 举例说明 设有变量说明 int a 7 b 5 float x 求表达式 x a b 的值 分析 因为 a 和 b 都是整数 该除法将执行整除运算 再将整数结果 1 转换 为单精度类型后进行赋值 所以 结果 x 1 转换 将两个操作数或其中一个操作数进行强制类型转换 可表示为 x float a float b 或 x float a b 表达式将求出这两个整数相除的实数商 1 4 并赋给 x 关于强制类型转换需要注意的几点 上述 float a b 与 float a b 结果是不同的 后者是先进行整除运算 将结果 整数 1 强制转换为单精度型数 1 0 所以结果为 x 1 0 强制类型转换不改变表达式本身的值类型 而是产生一个临时变量 用来暂存转换 后的值 该临时变量引用后即自动释放 如上例 执行强制类型转换后变量 a 和 b 的值及类型都不变 而是各自产生一个临时变量 用这两个临时变量的值进行运算 强制类型转换符优先级较高 只对紧随其后的表达式起作用 而对其他部分不起作 用 9 C 求值次序与副作用 编译器在求解表达式时 首先要对表达式进行解析 在符合优先级和结合性的前提 下 不同编译器在解析时可能存在差异 使得求值次序不同 将导致结果不同 例如 设有 int a 2 b 5 c 对表达式 c a b a b 10 三个同级运算中 是 先算 a b 还是 a 还是 b 10 其次再算哪个 C 语言的标准对表达式中各操作数的求值次序没有做统一规定 对于 VC 是按 照从前向后的顺序进行 则上述表达式的结果是 23 而对有的 C 编译器 则是 从后向前进行 结果是 43 如果某个操作数经历了求值运算 那么这个求值过程 可能影响到其他操作数的值 这时就会产生出乎意料的结果 称为 副作用 Side effect 上例中 求表达式 b 10 改变了变量 b 的值 而求 a 则改变了 a 的值 这些都将 影响到表达式 a b 的值 这就是所谓的副作用 由于编译器有求值次序 因此对于复合表达式 交换律不一定成立 求值次序带来副作用的主要原因是使用复合表达式 如果将复合表达式分开写成若 干个简单表达式 就可以有效消除副作用 例如 可将上式按照从前向后的次序写成 c a b a b 10 c c a b 或按照从后向前的次序写成 a b 10 c a b a b 10 C 数组与字符数组 C 数组数组 数组 是有限个同类型元素的有序集合 这些元素有一个共同的名字 即 数组名 每个元素以其在数组中的位置区分 位置用 下标 表示 例如 数列或向量就可以看作一个数组 其中的元素用一个下标即可确定 矩阵也 可看作一个数组 其中的元素需要用 行 列 两个下标确定 数组下标的个数称 维数 代表数列的数组和代表矩阵的数组分别称为一维数组和 二维数组 1 一维数组的定义 一维数组的定义 定义一个一维数组的一般格式为 存储类型 其中 数据类型 指数组中元素的数据类型 可以是 C 中定义的任何一种数据类型 常量 写在中括号中 用来定义数组大小 即数组中元素的个数 举例 int m 5 定义整型数组 m 其中有 5 个整数 const int N 3 float x N 定义浮点型数组 x 其中有 3 个实数 注意 数组大小不能用变量定义 而只能是一个正整数常量 在 C 中 数组大小在编译时确定 编译系统根据数组的定义为其分配一段连续 的存储单元 且一经分配不能改变 因此 数组大小不能用变量定义 而只能是一 个正整数常量 例如 下列定义是非法的 int count float s count 数组大小不能是变量 const float Num 3 int n Num 数组个数不能是实数 2 数组的初始化 数组的初始化 一般方法 在定义时用大括号列出元素的值 例如 int score 5 88 92 90 85 78 初始化值少于元素个数的用法 初始化值的个数少于定义的元素个数时 从第 0 个 元素开始逐个取得初始化值 其余的元素初始化为 0 例如 float y 5 3 4 4 2 7 5 个元素的取值分别为 3 4 4 2 7 0 0 缺省维数的用法 初始化时可以不指明元素个数 编译器会按照初始化值的个数确 定数组大小 例如 int n 1 2 3 4 数组 n 有 4 个元素 int nn 非法定义 不是初始化时定义数组必须指明数组元素个数 3 数组的使用 数组的使用 数组的存储形式 数组在存储单元中是按下标的顺序连续存放的 例如 上面定义 的数组 m 的存储如下图所示 访问方式 数组中任何一个元素都可以单独访问 访问的一般格式为 数组名 表达式 其中 表达式 用来计算下标值 C 中规定数组第一个元素的下标为 0 注意 对数组的访问指的是对数组元素的访问 一般不能直接将数组名作为访问对 象 对数组赋值也必须对每一个元素逐个赋值 字符数组字符数组 如果数组中的元素为字符 就称为 字符数组 例如 char string1 10 可用来保存 10 个字符的字符数组 char city name1 N a n j i n g 7 个字符的字符数组 C 中字符数组可用来处理字符串 允许直接用字符串常量对字符数组初始化 此 时 系统会自动加上一个串结束符 0 例如 char city name2 Nanjing 则字符数组 city name2 实际占用的内存比 city name1 多一个字节 串结束符 0 在字符串操作中具有十分重要的意义 因此 在定义字符数组大小时 应注意留出保存串结束符的空间 除了可以用字符串常量初始化外 字符数组的用法与一般数组是一样的 另外 C 中提供若干字符串处理函数 在头文件中定义 其中包括 strlen strcpy 等 strlen s 返回字符串 s 的实际长度 不包括 0 strcpy s1 s2 将字符串 s2 中 0 之前的所有字符依次赋值到字符串 s1 中 最 后再加上一个 0 由于不能直接对字符数组名赋值 所以将一个字符串的值赋给另一个字符串必须用 字符串复制函数完成 例如 char string2 20 string2 VC 非法 strcpy string2 VC 合法 11 C 输入输出 程序执行期间 从外设接收信息的操作称为 输入 向外设发送信息的操作称为 输出 本节介绍从键盘向程序中的变量输入数据以及将程序计算的结果输出到显示器上的基本操 作 C 输入输出简介输入输出简介 C 中没有专门的输入输出语句 而是通过系统提供的输入输出流类来实现 cin 用来在程序执行期间给变量输入数据 一般格式为 cin 其中 称为 提取运算符 程序执行到这条语句便暂停下来 等待从键盘上输入相应数 据 直到所列出的所有变量均获得值后 程序方继续执行 cout 实现将数据输出到显示器的操作 一般格式为 cout 其中 称为 插入运算符 将紧跟其后的表达式的值输出到显示器上当前光标位置 cin 和 cout 的书写形式很灵活 如果有多个变量 即使类型不相同 也可以写在同一个语 句中或者分成若干个语句输入或输出 注意 使用 cin 和 cout 必须在程序开头增加一行 include 或者两行 include using namespace std 数据的输入输出数据的输入输出 1 字符的输入输出 字符的输入输出 cin 用 cin 为字符变量输入数据时 输入的各字符之间可以间隔开也可以无间隔 系统会 自动跳过输入行中的间隔符 包括空格符 制表符 回车符等 例如 char c1 c2 c3 则 cin c1 A cin c2 c3 执行过程为 1 程序执行到 A 行时 等待用户输入数据 2 若输入 Abc CR 代表回车符 3 cin 分别将字符 A b c 赋给变量 c1 c2 c3 若在第 2 步中输入 A b c 则结果一样 cin get 用于提取键盘上输入的所有字符 包括间隔符等 赋给字符变量 并且 cin get 函数一次只能提取一个字符的值 其格式为 cin get 字符变量 举例 设有定义 char c1 c2 c3 c4 则下列语句的执行过程是 cin get c1 cin get c2 cin get c3 cin get c4 程序执行过程中若输入 A b Ab 间有空格 C 则字符 A 空格 b 回车分别赋给变量 c1 c2 c3 c4 输入缓冲区中保留字符 C 和回 车符 注意 cin 与 cin get 是有区别的 cin 自动跳过分隔符 如空格 回车 cin get 不会 字符输出 字符间无间隔 如需间隔 可在数据间插入间隔符 如 t 制表符 自动跳过 若干字符位置 n 或 endl 表示回车换行 并清空缓冲区 等 2 字符串的输入输出 字符串的输入输出 字符串的输入 用系统提供的函数 cin getline 将回车之前输入的所有字符都放入字符 数组中 并以回车作为结束 字符串的输出 可以直接输出串常量 常用于输出一些提示信息 也可以用字符数组名直 接输出字符数组 举例 char city 11 cin getline city 10 由键盘输入城市名 cout 城市名 city endl 其中 cin getline 第 1 个参数是已经定义的字符数组名 第 2 个参数是读入字符的 最多个数 包括字符串结束符 0 执行结果 从输入行中提取最多 9 个字符 由 cin getline 的第 2 个参数指明 再加 上一个 0 字符 输入到字符数组 city 由 cin getline 的第 1 个参数指明 输出时 字符 数组输出串结束符前的所有字符 3 十进制数据的输入输出 十进制数据的输入输出 请看下例 int i j float x y cout Input i j x y i j E cin x y 要求输入十进制数据 cout i i t j j endl cout x y x y endl 程序执行到 D 行 将输出提示信息 Input i j x y 并停留在 E 行 等待用户输入数据 若输入 10 20 4 5 8 6 则程序输出 i 10 j 20 x y 13 1 12 输入输出格式的控制 数的进制数的进制 默认进制 默认状态下 数据按十进制输入输出 如果要求按八进制或十六进制输 入输出 在 cin 或 cout 中必须指明相应的数据形式 oct 为八进制 hex 为十六进 制 dec 为十进制 举例 int i j k l cout Input i oct j hex k hex l dec oct i 输入为八进制数 cin hex j 输入为十六进制数 cin k 输入仍为十六进制数 cin dec l 输入为十进制数 cout hex i hex i endl cout dec j dec j t k k endl cout oct l oct l cout dec endl 恢复十进制输出状态 执行结果 1 输出提示 Input i oct j hex k hex l dec 2 此时从键盘输入 032 0 x3f 0 xa0 17 3 输出结果为 hex i 1a dec j 63 k 160 oct l 21 几点说明 使用不带 h 的头文件时 必须在 cin 中指明数制 否则从键盘输入时 不认八进制和十六进制数开头的 0 和 0 x 标志 指明后可省略 0 和 0 x 标志 进制控制只适用于整型变量 不适用于实型和字符型变量 输入数据的格式 个数和类型必须与 cin 中的变量一一对应 否则不仅使输入数据 错误 而且影响后面其他数据的正确输入 在 cin 或 cout 中指明数制后 该数制将一直有效 直到重新指明使用其他数制 数据间隔数据间隔 常用设置方法常用设置方法 输出空格符或回车换行符 指定数据输出宽度指定数据输出宽度 用 C 提供的函数 setw 指定输出数据项的宽度 setw 括 号中通常给出一个正整数值 用于限定紧跟其后的一个数据项的输出宽度 如 setw 8 表示紧跟其后的数据项的输出占 8 个字符宽度 举例 int i 2 j 3 float x 2 6 y 1 8 cout setw 6 i setw 10 j endl cout setw 10 i j endl cout setw 8 x setw 8 y endl 则输出结果为 2 3 6 2 6 1 8 几点说明 如果数据的实际宽度小于指定宽度 按右对齐的方式在左边留空 如果数据的实际 宽度大于指定宽度 则按实际宽度输出 即指定宽度失效 setw 只能限定紧随其后的一个数据项 输出后即回到默认输出方式 使用 setw 必须在程序开头再增加一句 include 二二 基本控制结构基本控制结构 1 算法的概念与表示方法 算法的作用在于表述人类解决问题的思想 对于复杂问题 直接写出程序往往比较 困难 通常的步骤是先设计算法 再编程 可见算法设计是编制程序 尤其是复杂 程序的前导步骤 一一 算算 法法 的的 概概 念念 算法就是解决问题的步骤序列 一般用计算机解决问题的算法应具有以下几个特征 可执行性 算法的每一步计算机都可执行 如计算机无法执行 解一元二次方程 操 作 因为它不是计算机系统定义的基本操作之一 确 定 性 算法中的每一步必须有明确定义 不能有任何歧义 非确定性 例如 用 10 和 2 进行算术运算 是一个有歧义的步骤 而 计算 10 与 2 的和 就是确定的 步骤 有 穷 性 算法必须在执行有穷步后结束 而不能陷入死循环 可输入输出信息 输入信息是算法加工的对象 而算法解决问题的结果应当输出 大多数算法有输入和输出信息提示 也有些算法不需要输入 如打印一个信息 但 所有算法都至少有一个输出 二二 算算 法法 的的 表表 示示 算法的表示方法有很多种 其中流程图和伪码是程序设计人员常用的两种算法表示 方法 流程图流程图 是图形化的表示方法 比较直观 基本组成元件包括矩形框 菱形框 箭 头线等 其中 矩形框 表示要执行的指令 在框内标注指令内容 菱形框 表示要判断其中表达式的值是真还是假 箭头线 则标示指令的流程方向 伪码伪码 是介于自然语言和程序设计语言之间的一种类自然语言的表示方法 书写形 式自由 容易转换为程序 三三 算法描述的三种基本结构算法描述的三种基本结构 对算法的理论研究和实践表明 任何算法的描述都可以分解为三种基本结构和它们 的组合 这三种基本结构是顺序结构 分支结构和循环结构 图 2 1 为三种基本结 构的执行流程图 图 2 1 3 种基本结构的流程图 其中的 块 在程序和算法中代表一条指令或用 和 括起来的一个指令组 指令 组是一个整体 在整个算法中相当于一条指令的作用 要么一起执行 要么一起不 执行 下面结合伪码介绍三种基本结构的算法 请大家观看 Flash 演示动画 顺序结构演示 选择结构演示 循环结构演示 结构化程序设计的特点是 任何程序都可由上述三种基本结构 即顺序 分支 循环 及其组合来描述 这些结构或组合必须由程序设计语言提供的 流程控制 语句 来实现 所谓流程控制语句 是专门用来控制程序执行流程的语句 也称 为 过程化语句 本章后续小节将介绍分支 循环结构程序设计以及一些常用 算法 2 分支结构 if 语句 if 语句是实现分支结构的常用分支语句之一 另外还有条件运算符 switch 语句等 if 语句的功能是 根据给定条件 选择程序执行方向 if 语句的基本格式语句的基本格式 if 语句 又称条件语句 其基本格式为 if 表达式 语句 1 else 语句 2 其中 表达式 条件表达式 可以是 C 中任意合法表达式 如算术 关系 逻辑或 逗号表达式等 表达式的值为 0 则为 假 非 0 则为 真 语句 1 2 内嵌语句 可以是单一 复合或者空语句 在语法上各自表现为 1 个语句 执行流程执行流程 if 语句的执行流程示意图如上图所示 描述如下 1 计算条件表达式的值 2 若表达式的值为真 或非 0 执行语句 1 否则 即表达式的值为假 或 为 0 则执行语句 2 图中的 块 即代表语句 注意 if 分支中的语句 1 也可以是空语句 如 if x 0 注意与前面的简化格式区别开 使用时千万记得空语句也要以分号与其他语句分 隔 简化格式简化格式 当语句 2 为 空语句 时 往往可以将 else 语句省略 得到基本格式的简化形式 if 表达式 语句 1 执行流程变为 当条件表达式的值为假时 程序将直接执行分支语句之后的语句 例如 对于下列分支函数 1 用标准 if 语句描述 格式如下 if x 0 重新计算 y 的 值 否则 即 x 0 y x x x 3 x 应用举例应用举例 例 2 4 输入一个年份 判断是否为闰年 查看动画演示 include using namespace std int main int year cout 输入年份 year if year 4 0 else cout year 年不是闰年 endl return 0 例 2 5 从键盘上输入三个整数 输出其中的最大数 查看动画演示 include using namespace std int main int a b c max cout a b c cout a a t b b t c c b max a else max b if c max max c cout 最大数为 max endl return 0 3 分支结构 if 语句的嵌套 如果 if 语句中的 内嵌语句 即语句 1 或语句 2 也是 if 语句 就构成了 嵌套 if 语 句 嵌套的基本格式嵌套的基本格式 嵌套 if 语句有 2 种形式 嵌套在 else 分支中 格式如下 if 表达式 1 语句 1 else if 表达式 2 语句 2 else if else 语句 n 嵌套在 if 分支中 格式如下 if 表达式 1 if 表达式 2 语句 1 else 语句 2 else 语句 3 配对原则配对原则 C 规定 在嵌套 if 语句中 if 和 else 按照 就近配对 的原则配对 即相距最近且 还没有配对的一对 if 和 else 首先配对 试分析下面的 2 组语句有何区别 语句 1 if n 3 0 if n 5 0 cout n 是 15 的倍数 endl else cout n 是 3 的倍数但不是 5 的倍数 endl else 与第二个 if 配对 语句 2 if n 3 0 if n 5 0 cout n 是 15 的倍数 endl else cout n 不是 3 的倍数 else 与第一个 if 配对 两个语句的差别虽然仅在于一对 但逻辑关系却完全不同 关于关于 if 嵌套语句的几点说明 嵌套语句的几点说明 if 语句用于解决二分支的问题 嵌套 if 语句则可以解决多分支问题 2 种嵌套形式各有特点 应用时注意区别 考虑一下是否可以互相替换 由上述 2 个语句可以看出 if 中嵌套的形式较容易产生逻辑错误 而 else 中嵌套 的形式配对关系则非常明确 因此从程序可读性角度出发 建议尽量使用在 else 分支中嵌套的形式 应用举例应用举例 例 2 6 用嵌套 if 语句完成改写 例 2 5 求三个整数中的最大值 include using namespace std int main int a b c max cout a b c if a b else if b a else max c cout 最大数为 max max endl return 0 例 2 7 某商场优惠活动规定 某商品一次购买 5 件以上 包含 5 件 10 件 以下 不包含 10 件 打 9 折 一次购买 10 件以上 包含 10 件 打 8 折 设 计程序根据单价和客户的购买量计算总价 include using namespace std int main float price discount amount 单价 折扣 总价 int count 购买件数 cout 输入单价 price cout 输入购买件数 count if count 5 discount 1 else if count 10 discount 0 9 else discount 0 8 amount price count discount cout 单价 price endl cout 购买件数 count t t 折扣 discount endl cout 总价 amount endl return 0 例 2 8 求一元二次方程 ax2 bx c 0 的根 系数 a a 0 b c 由键盘输入 include include using namespace std int main float a b c float delta x1 x2 cout 输入三个系数 a a 0 b c a b c cout a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论