面向过程的程序设计.ppt

上传人:za****8 文档编号:7191494 上传时间:2020-03-15 格式:PPT 页数:113 大小:508.51KB
返回 下载 相关 举报
面向过程的程序设计.ppt_第1页
第1页 / 共113页
面向过程的程序设计.ppt_第2页
第2页 / 共113页
面向过程的程序设计.ppt_第3页
第3页 / 共113页
点击查看更多>>
资源描述
第3章程序设计初步第4章函数与预处理第5章数组第6章指针第7章自定义数据类型 第4讲面向过程的程序设计 第3章程序设计初步 3 1面向过程的程序设计和算法3 2 程序和语句3 3赋值语句3 4C 的输入与输出3 5编写顺序结构的程序3 6关系运算和逻辑运算3 7选择结构和 语句3 8条件运算符和条件表达式3 9多分支选择结构和switch语句3 10编写选择结构的程序3 11循环结构和循环语句3 12循环的嵌套3 13break语句和continue语句3 14编写循环结构的程序 在面向过程的程序设计中 程序设计者必须指定计算机执行的具体步骤 程序设计者不仅要考虑程序要 做什么 还要解决 怎么做 的问题 根据程序要 做什么 的要求 写出一个个语句 安排好它们的执行顺序 怎样设计这些步骤 怎样保证它的正确性和具有较高的效率 这就是算法需要解决的问题 3 1面向过程的程序设计和算法 一个面向过程的程序应包括以下两方面内容 1 对数据的描述 在程序中要指定数据的类型和数据的组织形式 即数据结构 datastructure 2 对操作的描述 即操作步骤 也就是算法 algorithm 对于面向过程的程序 可以用下面的公式表示 程序 算法 数据结构作为程序设计人员 必须认真考虑和设计数据结构和操作步骤 即算法 算法是处理问题的一系列的步骤 算法必须具体地指出在执行时每一步应当怎样做 3 1 1算法的概念 不要认为只有 计算 的问题才有算法 广义地说 为解决一个问题而采取的方法和步骤 就称为 算法 计算机算法可分为两大类别 数值算法和非数值算法 数值算法的目的是求数值解 非数值算法包括的面十分广泛 最常见的是用于事务管理领域 目前 计算机在非数值方面的应用远远超过了在数值方面的应用 C 既支持面向过程的程序设计 又支持面向对象的程序设计 无论面向过程的程序设计还是面向对象的程序设计 都离不开算法设计 1 自然语言用中文或英文等自然语言描述算法 但容易产生歧义性 在程序设计中一般不用自然语言表示算法 2 流程图可以用传统的流程图或结构化流程图 用图的形式表示算法 比较形象直观 但修改算法时显得不大方便 3 伪代码 pseudocode 伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法 如 3 1 2算法的表示 ifxispositivethenprintxelseprint x用伪代码写算法并无固定的 严格的语法规则 只需把意思表达清楚 并且书写的格式要写成清晰易读的形式 它不用图形符号 因此书写方便 格式紧凑 容易修改 便于向计算机语言算法 即程序 过渡 4 用计算机语言表示算法用一种计算机语言去描述算法 这就是计算机程序 由第1章已知 一个程序包含一个或多个程序单位 每个程序单位构成一个程序文件 每一个程序单位由以下几个部分组成 1 预处理命令 如 include命令和 define命令 2 声明部分 例如对数据类型和函数的声明 以及对变量的定义 3 函数 包括函数首部和函数体 在函数体中可以包含若干声明语句和执行语句 如下面是一个完整的C 程序 3 2C 程序和语句 include 预处理命令usingnamespacestd 在函数之外的声明部分inta 3 在函数之外的声明部分intmain 函数首部 floatb 函数内的声明部分b 4 5 执行语句cout a b 执行语句return0 执行语句 如果一个变量在函数之外进行声明 此变量是全局变量 它的有效范围是从该行开始到本程序单位结束 如果一个变量在函数内声明 此变量是局部变量 它的有效范围是从该行开始到本函数结束 C 程序结构可以用图3 1表示 图3 1 程序应该包括数据描述 由声明语句来实现 和数据操作 由执行语句来实现 数据描述主要包括数据类型的声明 函数和变量的定义 变量的初始化等 数据操作的任务是对已提供的数据进行加工 C 程序中最小的独立单位是语句 statement 它相当于一篇文章中的一个句子 句子是用句号结束的 语句一般是用分号结束的 复合语句是以右花括号结束的 C 语句可以分为以下4种 1 声明语句如inta b 在C语言中 只有产生实际操作的才称为语句 对变量的定义不作为语句 而且要求对变量的定义必须出现在本块中所有程序语句之前 因此C程序员已经养成了一个习惯 在函数或块的开头位置定义全部变量 在C 中 对变量 以及其他对象 的定义被认为是一条语句 并且可以出现在函数中的任何行 即可以放在其他程序语句可以出现的地方 也可以放在函数之外 这样更加灵活 可以很方便地实现变量的局部化 变量的作用范围从声明语句开始到本函数或本块结束 2 执行语句通知计算机完成一定的操作 执行语句包括 1 控制语句 完成一定的控制功能 C 有9种控制语句 即 if else 条件语句 for 循环语句 while 循环语句 do while 循环语句 continue 结束本次循环语句 break 中止执行 或循环语句 switch 多分支选择语句 goto 转向语句 return 从函数返回语句 2 函数和流对象调用语句 函数调用语句由一次函数调用加一个分号构成一个语句 例如sort x y z 假设已定义了sort函数 它有3个参数cout x endl 流对象调用语句 3 表达式语句 由一个表达式加一个分号构成一个语句 最典型的是 由赋值表达式构成一个赋值语句 i i 1 是一个赋值表达式i i 1 是一个赋值语句任何一个表达式的最后加一个分号都可以成为一个语句 一个语句必须在最后出现分号 表达式能构成语句是C和C 语言的一个重要特色 C 程序中大多数语句是表达式语句 包括函数调用语句 3 空语句下面是一个空语句 即只有一个分号的语句 它什么也不做 有时用来做被转向点 或循环语句中的循环体 4 复合语句可以用 把一些语句括起来成为复合语句 如下面是一个复合语句 z x y if z 100 z z 100 cout z 注意 复合语句中最后一个语句中最后的分号不能省略 在本章中将介绍几种顺序执行的语句 在执行这些语句的过程中不会发生流程的控制转移 前面已介绍 赋值语句是由赋值表达式加上一个分号构成 1 C 的赋值语句具有其他高级语言的赋值语句的功能 但不同的是 C 中的赋值号 是一个运算符 可以写成a b c d 而在其他大多数语言中赋值号不是运算符 上面的写法是不合法的 3 3赋值语句 2 关于赋值表达式与赋值语句的概念 在C 中 赋值表达式可以包括在其他表达式之中 例如if a b 0 cout0 0 0 cout0 endl 因为在if的条件中不能包含赋值语句 C 把赋值语句和赋值表达式区别开来 增加了表达式的种类 能实现其他语言中难以实现的功能 输入和输出并不是C 语言中的正式组成成分 C和C 本身都没有为输入和输出提供专门的语句结构 输入输出不是由C 本身定义的 而是在编译系统提供的I O库中定义的 C 的输出和输入是用 流 stream 的方式实现的 图3 2和图3 3表示C 通过流进行输入输出的过程 3 4C 的输入与输出 图3 2图3 3 有关流对象cin cout和流运算符的定义等信息是存放在C 的输入输出流库中的 因此如果在程序中使用cin cout和流运算符 就必须使用预处理命令把头文件stream包含到本文件中 include尽管cin和cout不是C 本身提供的语句 但是在不致混淆的情况下 为了叙述方便 常常把由cin和流提取运算符 实现输入的语句称为输入语句或cin语句 把由cout和流插入运算符 实现输出的语句称为输出语句或cout语句 根据C 的语法 凡是能实现某种操作而且最后以分号结束的都是语句 cout语句的一般格式为cout 变量1 变量2 变量n 在定义流对象时 系统会在内存中开辟一段缓冲区 用来暂存输入输出流的数据 在执行cout语句时 先把插入的数据顺序存放在输出缓冲区中 直到输出缓冲区满或遇到cout语句中的endl 或 n ends flush 为止 此时将缓冲区中已有的数据一起输出 并清空缓冲区 输出流中的数据在系统默认的设备 一般为显示器 输出 3 4 1输入流与输出流的基本操作 一个cout语句可以分写成若干行 如cout ThisisasimpleC program endl 可以写成cout Thisis 注意行末尾无分号 aC program endl 语句最后有分号也可写成多个cout语句 即cout Thisis 语句末尾有分号cout aC cout program cout endl 以上3种情况的输出均为 ThisisasimpleC program 注意不能用一个插入运算符 a b c d 可以写成cin a 注意行末尾无分号 b 这样写可能看起来清晰些 c d 也可以写成cin a cin b cin c cin d 以上3种情况均可以从键盘输入 1234 也可以分多行输入数据 1 23 4 在用cin输入时 系统也会根据变量的类型从输入流中提取相应长度的字节 如有charc1 c2 inta floatb cin c1 c2 a b 如果输入123456 78 注意 34后面应该有空格以便和56 78分隔开 也可以按下面格式输入 123456 78 在1和2之间有空格 不能用cin语句把空格字符和回车换行符作为字符输入给字符变量 它们将被跳过 如果想将空格字符或回车换行符 或任何其他键盘上的字符 输入给字符变量 可以用3 4 3节介绍的getchar函数 在组织输入流数据时 要仔细分析cin语句中变量的类型 按照相应的格式输入 否则容易出错 上面介绍的是使用cout和cin时的默认格式 但有时人们在输入输出时有一些特殊的要求 如在输出实数时规定字段宽度 只保留两位小数 数据向左或向右对齐等 C 提供了在输入输出流中使用的控制符 有的书中称为操纵符 见书中表3 1 需要注意的是 如果使用了控制符 在程序单位的开头除了要加iostream头文件外 还要加iomanip头文件 举例 输出双精度数 3 4 2在输入流与输出流中使用控制符 doublea 123 456789012345 对a赋初值 1 cout a 输出 123 456 2 cout setprecision 9 a 输出 123 456789 3 cout setprecision 6 恢复默认格式 精度为6 4 cout setiosflags ios fixed 输出 123 456789 5 cout setiosflags ios fixed setprecision 8 a 输出 123 45678901 6 cout setiosflags ios scientific a 输出 1 234568e 02 7 cout setiosflags ios scientific setprecision 4 a 输出 1 2346e02下面是整数输出的例子 intb 123456 对b赋初值 1 cout b 输出 123456 2 cout hex b 输出 1e240 3 cout setiosflags ios uppercase b 输出 1E240 4 cout setw 10 b b 输出 123456 123456 5 cout setfill setw 10 b 输出 123456 6 cout setiosflags ios showpos b 输出 123456 如果在多个cout语句中使用相同的setw n 并使用setiosflags ios right 可以实现各行数据右对齐 如果指定相同的精度 可以实现上下小数点对齐 例3 1各行小数点对齐 include includeusingnamespacestd intmain doublea 123 456 b 3 14159 c 3214 67 cout setiosflags ios fixed setiosflags ios right setprecision 2 cout setw 10 a endl cout setw 10 b endl cout setw 10 c endl return0 输出如下 123 46 字段宽度为10 右对齐 取两位小数 3 14 3214 67先统一设置定点形式输出 取两位小数 右对齐 这些设置对其后的输出均有效 除非重新设置 而setw只对其后一个输出项有效 因此必须在输出a b c之前都要写setw 10 C 还保留了C语言中用于输入和输出单个字符的函数 使用很方便 其中最常用的有getchar函数和putchar函数 1 putchar函数 字符输出函数 putchar函数的作用是向终端输出一个字符 例如putchar c 它输出字符变量 的值 3 4 3用getchar和putchar函数进行字符的输入和输出 例3 2输出单个字符 include 或者包含头文件stdio h includeusingnamespacestd intmain chara b c a B b O c Y putchar a putchar b putchar c putchar n putchar 66 putchar 79 putchar 89 putchar 10 return0 运行结果为BOYBOY 可以看到 用putchar可以输出转义字符 putchar n 的作用是输出一个换行符 使输出的当前位置移到下一行的开头 putchar 66 的作用是将66作为ASCII码转换为字符输出 66是字母 B 的ASCII码 因此putchar 66 输出字母 B 其余类似 putchar 10 中的10是换行符的ASCII码 putchar 10 输出一个换行符 作用与putchar n 相同 也可以输出其他转义字符 如putchar 101 输出字符 A 八进制的101是 A 的ASCII码 putchar 输出单引号字符 putchar 015 输出回车 不换行 使输出的当前位置移到本行开头 2 getchar函数 字符输入函数 此函数的作用是从终端 或系统隐含指定的输入设备 输入一个字符 getchar函数没有参数 其一般形式为getchar 函数的值就是从输入设备得到的字符 例3 3输入单个字符 includeusingnamespacestd intmain charc c getchar putchar c 32 putchar n return0 在运行时 如果从键盘输入大写字母 A 并按回车键 就会在屏幕上输出小写字母 a 请注意 getchar 只能接收一个字符 getchar函数得到的字符可以赋给一个字符变量或整型变量 也可以不赋给任何变量 作为表达式的一部分 例如 例3 3第5行可以用下面一行代替 putchar getchar 32 putchar n 因为getchar 读入的值为 A A 32是小写字母 a 的ASCII码 因此putchar函数输出 a 此时不必定义变量c 也可用cout输出getchar函数得到字符的ASCII的值 cout getchar 这时输出的是整数97 因为用getchar 读入的实际上是字符的ASCII码 现在并未把它赋给一个字符变量 cout就按整数形式输出 如果改成 cout c getchar 设c已定义为字符变量则输出为字母 a 因为要求输出字符变量c的值 可以看到用putchar和getchar函数输出和输入字符十分灵活方便 由于它们是函数所以可以出现在表达式中 例如cout c getchar 32 在C语言中是用printf函数进行输出 用scanf函数进行输入的 C 保留了C语言的这一用法 在此只作很简单的介绍 scanf函数一般格式是scanf 格式控制 输出表列 printf函数的一般格式是printf 格式控制 输出表列 3 4 4用scanf和printf函数进行输入和输出 例3 4用scanf和printf函数进行输入和输出 includeusingnamespacestd intmain inta floatb charc scanf d c f 运行情况如下 12A67 98 本行为输入 输入的3个数据间以空格相间 a 12 b 67 980003 c A 本行为输出 输入的整数12送给整型变量a 字符 A 送给字符变量c 67 98送给单精度变量b 例3 5求一元二次方程式ax2 bx c 0的根 a b c的值在运行时由键盘输入 它们的值满足b2 4ac 0 根据求x1 x2的算法 它可以编写出以下C 程序 include include 由于程序要用到数学函数sqrt 故应包含头文件cmathusingnamespacestd intmain floata b c x1 x2 cin a b c x1 b sqrt b b 4 a c 2 a x2 b sqrt b b 4 a c 2 a cout x1 x1 endl cout x2 x2 endl return0 3 5编写顺序结构的程序 运行情况如下 4 58 82 4 x1 0 327612x2 1 17794如果程序中要用到数学函数 都要包含头文件cmath 也可以用老形式的头文件math h 但提倡使用C 新形式的头文件 请参阅第14章14 3节 在写程序时 一定要注意将数学表达式正确地转换成合法的C 表达式 可以看到 顺序结构的程序中的各执行语句是顺序执行的 这种程序最简单 最容易理解 往往要求根据某个指定的条件是否满足来决定执行的内容 例如 购物在1000元以下的打九五折 1000元及以上的打九折 C 提供if语句来实现这种条件选择 如ifamount 1000tax 0 95 amount代表购物总额 tax代表折扣elsetax 0 9 若amount 1000 条件满足 tax 0 95 否则tax 0 9pay amount tax pay为实付款流程可以用图3 4表示 图3 4 3 6关系运算和逻辑运算 上面if语句中的 amount 是一个比较符 称为关系运算符 C 的关系运算符有 大于 大于或等于 等于 不等于 优先级相同 低 3 6 1关系运算和关系表达式 关于优先次序 前4种关系运算符 的优先级别相同 后两种也相同 前4种高于后两种 例如 优先于 而 与 a b等效于c a b a b c等效于 a b ca bc等效于a b c 用关系运算符将两个表达式连接起来的式子 称为关系表达式 关系表达式的一般形式可以表示为 表达式关系运算符表达式其中的 表达式 可以是算术表达式或关系表达式 逻辑表达式 赋值表达式 字符表达式 例如 下面都是合法的关系表达式 a b a b b c a 3 b 5 a b b 0 的值为 真 在C和C 中都用数值1代表 真 用0代表 假 如果有以下赋值表达式 d a b则d得到的值为1f a b cf得到的值为0 C语言没有提供逻辑型数据 关系表达式的值 真或假 分别用数值1和0代表 C 增加了逻辑型数据 逻辑型常量只有两个 即false 假 和true 真 逻辑型变量要用类型标识符bool来定义 它的值只能是true和false之一 如boolfound flag false 定义逻辑变量found和flag 并使flag的初值为falsefound true 将逻辑常量true赋给逻辑变量found由于逻辑变量是用关键字bool来定义的 因此又称为布尔变量 逻辑型常量又称为布尔常量 所谓逻辑型 就是布尔型 设立逻辑类型的目的是为了看程序时直观易懂 3 6 2逻辑常量和逻辑变量 在编译系统处理逻辑型数据时 将false处理为0 将true处理为1 因此 逻辑型数据可以与数值型数据进行算术运算 如果将一个非零的整数赋给逻辑型变量 则按 真 处理 如flag 123 赋值后flag的值为truecout flag 输出为数值1 有时只用一个关系表达式还不能正确表示所指定的条件 C 提供3种逻辑运算符 1 逻辑与 相当于其他语言中的AND 2 逻辑或 相当于其他语言中的OR 3 逻辑非 相当于其他语言中的NOT 逻辑运算举例如下 a b若a b为真 则a b为真 a b若a b之一为真 则a b为真 a若a为真 则 a为假 书中表3 2为逻辑运算的 真值表 3 6 3逻辑运算和逻辑表达式 在一个逻辑表达式中如果包含多个逻辑运算符 按以下的优先次序 1 非 与 或 即 为三者中最高的 2 逻辑运算符中的 和 低于关系运算符 高于算术运算符 例如 a b x y 可写成a b x y a b x y 可写成a b x y a a b 可写成 a a b将两个关系表达式用逻辑运算符连接起来就成为一个逻辑表达式 上面几个式子就是逻辑表达式 逻辑表达式的一般形式可以表示为 表达式逻辑运算符表达式逻辑表达式的值是一个逻辑量 真 或 假 前面已说明 在给出逻辑运算结果时 以数值1代表 真 以0代表 假 但在判断一个逻辑量是否为 真 时 采取的标准是 如果其值是0就认为是 假 如果其值是非0就认为是 真 例如 1 若a 4 则 a的值为0 因为a的值为非0 被认作 真 对它进行 非 运算 得 假 假 以0代表 2 若a 4 b 5 则a b的值为1 因为a和b均为非0 被认为是 真 3 a b值同前 a b a b的值为1 因为a b和a b的值都为非零值 4 a b值同前 a b的值为1 5 4 0 2的值为1 在C 中 整型数据可以出现在逻辑表达式中 在进行逻辑运算时 根据整型数据的值是0或非0 把它作为逻辑量假或真 然后参加逻辑运算 通过这几个例子可以看出 逻辑运算结果不是0就是1 不可能是其他数值 而在逻辑表达式中作为参加逻辑运算的运算对象可以是0 假 或任何非0的数值 按 真 对待 如果在一个表达式中的不同位置上出现数值 应区分哪些是作为数值运算或关系运算的对象 哪些作为逻辑运算的对象 实际上 逻辑运算符两侧的表达式不但可以是关系表达式或整数 0和非0 也可以是任何类型的数据 如字符型 浮点型或指针型等 系统最终以0和非0来判定它们属于 真 或 假 例如 c 的值为1 可以将表3 2改写成书中表3 3形式 熟练掌握C 的关系运算符和逻辑运算符后 可以巧妙地用一个逻辑表达式来表示一个复杂的条件 例如 要判别某一年 year 是否为闰年 闰年的条件是符合下面两者之一 能被4整除 但不能被100整除 能被100整除 又能被400整除 例如2004 2000年是闰年 2005 2100年不是闰年 可以用一个逻辑表达式来表示 year 4 0 year 100 0 year 400 0当给定year为某一整数值时 如果上述表达式值为真 1 则year为闰年 否则year为非闰年 可以加一个 用来判别非闰年 year 4 0 year 100 0 year 400 0 若表达式值为真 1 year为非闰年 也可以用下面的逻辑表达式判别非闰年 year 4 0 year 100 0 year 400 0 若表达式值为真 year为非闰年 请注意表达式中右面的括号内的不同运算符 的运算优先次序 if语句是用来判定所给定的条件是否满足 根据判定的结果 真或假 决定执行给出的两种操作之一 3 7选择结构和 语句 1 表达式 语句例如 if x y couty cout x elsecout y 见图3 5 b 3 7 1 语句的3种形式 图3 5 3 if 表达式1 语句1elseif 表达式2 语句2elseif 表达式3 语句3 elseif 表达式m 语句melse语句n流程图见图3 6 例如 if number 500 cost 0 15 elseif number 300 cost 0 10 elseif number 100 cost 0 075 elseif number 50 cost 0 05 elsecost 0 图3 说明 1 从图3 5和图3 6可以看到 3种形式的if语句都是由一个入口进来 经过对 表达式 的判断 分别执行相应的语句 最后归到一个共同的出口 这种形式的程序结构称为选择结构 在C 中if语句是实现选择结构主要的语句 2 3种形式的if语句中在if后面都有一个用括号括起来的表达式 它是程序编写者要求程序判断的 条件 一般是逻辑表达式或关系表达式 3 第2 第3种形式的if语句中 在每个else前面有一分号 整个语句结束处有一分号 4 在if和else后面可以只含一个内嵌的操作语句 如上例 也可以有多个操作语句 此时用花括号 将几个语句括起来成为一个复合语句 例3 6求三角形的面积 include include 使用数学函数时要包含头文件cmath include 使用I O流控制符要包含头文件iomanipusingnamespacestd intmain doublea b c cout a b c if a b c 运行情况如下 pleaseentera b c 2 453 674 89 area 4 3565变量s和area只在复合语句内用得到 因此在复合语句内定义 它的作用范围为从定义变量开始到复合语句结束 如果在复合语句外使用s和area 则会在编译时出错 系统认为这两个变量未经定义 将某些变量局限在某一范围内 与外界隔离 可以避免在其他地方被误调用 在if语句中又包含一个或多个if语句称为if语句的嵌套 一般形式如下 if if 语句1else语句2内嵌ifelseif 语句3else语句4内嵌if应当注意if与else的配对关系 else总是与它上面最近的 且未配对的if配对 假如写成 3 7 2 语句的嵌套 if if 语句1elseif 语句2else语句3内嵌if编程序者把第一个else写在与第一个if 外层if 同一列上 希望else与第一个if对应 但实际上else是与第二个if配对 因为它们相距最近 而且第二个if并未与任何else配对 为了避免误用 最好使每一层内嵌的if语句都包含else子句 如本节开头列出的形式 这样if的数目和else的数目相同 从内层到外层一一对应 不致出错 如果if与else的数目不一样 为实现程序设计者的企图 可以加花括号来确定配对关系 例如 if if 语句1 这个语句是上一行if语句的内嵌ifelse语句2 本行与第一个if配对这时 限定了内嵌if语句的范围 外的else不会与 内的if配对 关系清楚 不易出错 若在if语句中 当被判别的表达式的值为 真 或 假 时 都执行一个赋值语句且给同一个变量赋值时 可以用简单的条件运算符来处理 例如 若有以下if语句 if a b max a elsemax b 可以用条件运算符 来处理 max a b a b 其中 a b a b 是一个 条件表达式 它是这样执行的 如果 a b 条件为真 则条件表达式的值就取 后面的值 即条件表达式的值为 否则条件表达式的值为 后面的值 即b 3 8条件运算符和条件表达式 条件运算符要求有3个操作对象 称三目 元 运算符 它是C 中惟一的一个三目运算符 条件表达式的一般形式为表达式1 表达式2 表达式3条件运算符的执行顺序是 先求解表达式1 若为非0 真 则求解表达式2 此时表达式 的值就作为整个条件表达式的值 若表达式1的值为0 假 则求解表达式3 表达式3的值就是整个条件表达式的值 max a b a b 的执行结果是将条件表达式的值赋给max 也就是将a和b二者中的大者赋给max 条件运算符优先于赋值运算符 因此上面赋值表达式的求解过程是先求解条件表达式 再将它的值赋给max 条件表达式中 表达式1的类型可以与表达式2和表达式3的类型不同 如x a b 如果已定义x为整型变量 若x 0 则条件表达式的值为字符 b 的ASCII码 表达式2和表达式3的类型也可以不同 此时条件表达式的值的类型为二者中较高的类型 如有条件表达式x y 1 1 5 如果x y 则条件表达式的值为1 5 若x y 值应为1 由于C 把1 5按双精度数处理 双精度的类型比整型高 因此 将1转换成双精度数 以此作为表达式的值 例3 7输入一个字符 判别它是否为大写字母 如果是 将它转换成小写字母 如果不是 不转换 然后输出最后得到的字符 includeusingnamespacestd intmain charch cin ch ch ch A switch语句是多分支选择语句 用来实现多分支选择结构 它的一般形式如下 switch 表达式 case常量表达式1 语句1case常量表达式2 语句2 case常量表达式n 语句ndefault 语句n 1 3 9多分支选择结构和switch语句 例如 要求按照考试成绩的等级打印出百分制分数段 可以用switch语句实现 switch grade case A cout 85 100 n case B cout 70 84 n case C cout 60 69 n case D cout 60 n default cout error n 说明 1 switch后面括号内的 表达式 允许为任何类型 2 当switch表达式的值与某一个case子句中的常量表达式的值相匹配时 就执行此case子句中的内嵌语句 若所有的case子句中的常量表达式的值都不能与switch表达式的值匹配 就执行default子句的内嵌语句 3 每一个case表达式的值必须互不相同 否则就会出现互相矛盾的现象 对表达式的同一个值 有两种或多种执行方案 4 各个case和default的出现次序不影响执行结果 例如 可以先出现 default 再出现 case D 然后是 case A 5 执行完一个case子句后 流程控制转移到下一个case子句继续执行 case常量表达式 只是起语句标号作用 并不是在该处进行条件判断 在执行switch语句时 根据switch表达式的值找到与之匹配的case子句 就从此case子句开始执行下去 不再进行判断 例如 上面的例子中 若grade的值等于 A 则将连续输出 85 10070 8460 69 60error因此 应该在执行一个case子句后 使流程跳出switch结构 即终止switch语句的执行 可以用一个break语句来达到此目的 将上面的switch结构改写如下 switch grade case A cout 85 100 n break case B cout 70 84 n break case C cout 60 69 n break case D cout 60 n break default cout error n break 最后一个子句 default 可以不加break语句 如果grade的值为 B 则只输出 70 84 流程图见图3 7 图3 7 在case子句中虽然包含一个以上执行语句 但可以不必用花括号括起来 会自动顺序执行本case子句中所有的执行语句 6 多个case可以共用一组执行语句 如 case A case B case C cout60 n 当grade的值为 A B 或 C 时都执行同一组语句 例3 8编写程序 判断某一年是否为闰年 includeusingnamespacestd intmain intyear boolleap cout year 输入年份if year 4 0 年份能被4整除 if year 100 0 年份能被4整除又能被100整除 if year 400 0 年份能被4整除又能被400整除leap true 闰年 令leap true 真 elseleap false 非闰年 令leap false 假 else 年份能被4整除但不能被100整除肯定是闰年leap true 是闰年 令leap true 3 10编写选择结构的程序 else 年份不能被4整除肯定不是闰年leap false 若为非闰年 令leap falseif leap cout year is 若leap为真 就输出年份和 是 elsecout year isnot 若leap为真 就输出年份和 不是 cout aleapyear endl 输出 闰年 return0 运行情况如下 2005 2005isnotaleapyear 1900 1900isnptaleapyear 也可以将程序中第8 16行改写成以下的if语句 if year 4 0 leap false elseif year 100 0 leap true elseif year 400 0 leap false elseleap true 也可以用一个逻辑表达式包含所有的闰年条件 将上述if语句用下面的if语句代替 if year 4 0elseleap false 例3 9运输公司对用户计算运费 路程 s 越远 每公里运费越低 标准如下 s 250km没有折扣250 s 5002 折扣500 s 10005 折扣1000 s 20008 折扣2000 s 300010 折扣3000 s15 折扣设每公里每吨货物的基本运费为p price的缩写 货物重为w wright的缩写 距离为 折扣为d discount的缩写 则总运费f freight的缩写 的计算公式为f p w s 1 d 图3 8 据此写出程序如下 includeusingnamespacestd intmain intc s floatp w d f cout p w s if s 3000 c 12 elsec s 250 switch c case0 d 0 break case1 d 2 break case2 case3 d 5 break case4 case5 case6 case7 d 8 break case8 case9 case10 case11 d 10 break case12 d 15 break f p w s 1 d 100 0 cout freight f endl return0 运行情况如下 pleaseenterp w s 10020300 freight 588000 在人们所要处理的问题中常常遇到需要反复执行某一操作的情况 这就需要用到循环控制 许多应用程序都包含循环 顺序结构 选择结构和循环结构是结构化程序设计的3种基本结构 是各种复杂程序的基本构造单元 因此程序设计者必须熟练掌握选择结构和循环结构的概念及使用方法 3 11循环结构和循环语句 while语句的一般形式如下 while 表达式 语句其作用是 当指定的条件为真 表达式为非0 时 执行while语句中的内嵌语句 其流程图见图3 9 其特点是 先判断表达式 后执行语句 while循环称为当型循环 图3 9 3 11 1用while语句构成循环 例3 10求1 2 3 100 用流程图表示算法 见图3 10 根据流程图写出程序 includeusingnamespacestd intmain inti 1 sum 0 while i 100 sum sum i i cout sum sum endl 运行结果为sum 5050 图3 10需要注意 1 循环体如果包含一个以上的语句 应该用花括号括起来 以复合语句形式出现 如果不加花括号 则while语句的范围只到while后面第一个分号处 2 在循环体中应有使循环趋向于结束的语句 do while语句的特点是先执行循环体 然后判断循环条件是否成立 其一般形式为do语句while 表达式 它是这样执行的 先执行一次指定的语句 即循环体 然后判别表达式 当表达式的值为非零 真 时 返回重新执行循环体语句 如此反复 直到表达式的值等于0为止 此时循环结束 可以用图3 11表示其流程 3 11 2用do while语句构成循环 图3 11图3 12 例3 11用do while语句求1 2 3 100 先画出流程图 见图3 12 可编写出下面的程序 includeusingnamespacestd intmain inti 1 sum 0 do sum sum i i while i 100 cout sum sum endl return0 运行结果与例3 10相同 可以看到 对同一个问题可以用while语句处理 也可以用do while语句处理 do while语句结构可以转换成while结构 图3 11可以改画成图3 13的形式 二者完全等价 而图3 13中虚线框部分就是一个while结构 图3 13 C 中的for语句使用最为广泛和灵活 不仅可以用于循环次数已经确定的情况 而且可以用于循环次数不确定而只给出循环结束条件的情况 它完全可以代替while语句 for语句的一般格式为for 表达式1 表达式2 表达式3 语句它的执行过程如下 1 先求解表达式1 2 求解表达式2 若其值为真 值为非0 则执行for语句中指定的内嵌语句 然后执行下面第 3 步 若为假 值为0 则结束循环 转到第 5 步 3 11 3用for语句构成循环 3 求解表达式3 4 转回上面第 2 步骤继续执行 5 循环结束 执行for语句下面的一个语句 可以用图3 14来表示for语句的执行过程 图3 14 for语句最简单的形式也是最容易理解的格式如下 for 循环变量赋初值 循环条件 循环变量增值 语句例如for i 1 i 100 i sum sum i 它的执行过程与图3 10完全一样 它相当于以下语句 i 1 while i 100 sum sum i i 显然 用for语句简单 方便 for语句的使用有许多技巧 如果熟练地掌握和运用for语句 可以使程序精炼简洁 说明 1 for语句的一般格式中的 表达式1 可以省略 此时应在for语句之前给循环变量赋初值 2 如果表达式2省略 即不判断循环条件 循环无终止地进行下去 也就是认为表达式2始终为真 3 表达式3也可以省略 但此时程序设计者应另外设法保证循环能正常结束 4 可以省略表达式1和表达式3 只有表达式2 即只给循环条件 5 3个表达式都可省略 6 表达式1可以是设置循环变量初值的赋值表达式 也可以是与循环变量无关的其他表达式 7 表达式一般是关系表达式 如i 100 或逻辑表达式 如a b x y 但也可以是数值表达式或字符表达式 只要其值为非零 就执行循环体 C 中的for语句比其他语言中的循环语句功能强得多 可以把循环体和一些与循环控制无关的操作也作为表达式1或表达式3出现 这样程序可以短小简洁 但过分地利用这一特点会使for语句显得杂乱 可读性降低 建议不要把与循环控制无关的内容放到for语句中 1 3种循环都可以用来处理同一问题 一般情况下它们可以互相代替 2 while和do while循环 是在while后面指定循环条件的 在循环体中应包含使循环趋于结束的语句 如i 或i i 1等 for循环可以在表达式3中包含使循环趋于结束的操作 甚至可以将循环体中的操作全部放到表达式3中 因此for语句的功能更强 凡用while循环能完成的 用for循环都能实现 3 用while和do while循环时 循环变量初始化的操作应在while和do while语句之前完成 而for语句可以在表达式1中实现循环变量的初始化 3 11 4几种循环的比较 一个循环体内又包含另一个完整的循环结构 称为循环的嵌套 内嵌的循环中还可以嵌套循环 这就是多层循环 3种循环 while循环 do while循环和for循环 可以互相嵌套 例如 下面几种都是合法的形式 1 while while 3 12循环的嵌套 2 do do while while 3 for for 4 while do while 5 for while 6 do for while 在3 9节中已经介绍过用break语句可以使流程跳出switch结构 继续执行switch语句下面的一个语句 实际上 break语句还可以用于循环体内 break语句的一般格式为break 其作用为使流程从循环体内跳出循环体 即提前结束循环 接着执行循环体下面的语句 break语句只能用于循环语句和switch语句内 不能单独使用或用于其他语句中 3 13break语句和continue语句 continue语句的一般格式为continue 其作用为结束本次循环 即跳过循环体中下面尚未执行的语句 接着进行下一次是否执行循环的判定 continue语句和break语句的区别是 continue语句只结束本次循环 而不是终止整个循环的执行 而break语句则是结束整个循环过程 不再判断执行循环的条件是否成立 如果有以下两个循环结构 1 while 表达式1 if 表达式2 break 2 while 表达式1 if 表达式2 continue 程序 1 的流程图如图3 18所示 而程序 2 的流程如图3 19所示 请注意图3 18和图3 19中当 表达式2 为真时流程的转向 图3 18图3 19 例3 12用下面公式求 的近似值 4 1 1 3 1 5 1 7 直到最后一项的绝对值小于10 7为止 根据给定的算法很容易编写程序如下 include include includeusingnamespacestd intmain ints 1 doublen 1 t 1 pi 0 while fabs t 1e 7 pi pi t n n 2 3 14编写循环结构的程序 s s t s n pi pi 4 cout pi setiosflags ios fixed setprecision 6 pi endl return0 运行结果为pi 3 141592注意 不要把n定义为整型变量 否则在执行 t s n 时 得到t的值为0 原因是两个整数相除 例3 13求Fibonacci数列前40个数 这个数列有如下特点 第1 2个数为1 1 从第3个数开始 每个数是其前面两个数之和 即F1 1 n 1 F2 1 n 2 Fn Fn 1 Fn 2 n 3 这是一个有趣的古典数学问题 有一对兔子 从出生后第3个月起每个月都生一对兔子 小兔子长到第3个月后每个月又生一对兔子 假设所有兔子都不死 问每个月的兔子总数为多少 可以从书中表3 4看出兔子数的规律 根据给出的每月兔子总数的关系 可编写程序如下 include includeusingnamespacestd intmain longf1 f2 inti f1 f2 1 for i 1 i 20 i cout setw 12 f1 setw 12 f2 设备输出字段宽度为12 每次输出两个数if i 2 0 cout endl 每输出完4个数后换行 使每行输出4个数f1 f1 f2 左边的f1代表第3个数 是第1 2个数之和f2 f2 f1 左边的f2代表第4个数 是第2 3个数之和 return0 例3 14找出100 200间的全部素数 编写程序如下 include include includeusingnamespacestd intmain intm k i n 0 boolprime 定义布尔变量primefor m 101 m 200 m m 2 判别m是否为素数 m由101变化到200 增量为2 prime true 循环开始时设prime为真 即先认为m为素数k int sqrt m 用k代表根号m的整数部分for i 2 i k i 此循环作用是将m被2 根号m除 检查是否能整除if m i 0 如果能整除 表示m不是素数 prime false 使prime变为假break 终止执行本循环 if prime 如果m为素数 cout setw 5 m 输出素数m 字段宽度为5n n 1 n用来累计输出素数的个数 if n 10 0 cout endl 输出10个数后换行 cout endl 最后执行一次换行return0 例3 15译密码 为使电文保密 往往按一定规律将电文转换成密码 收报人再按约定的规律将其译回原文 例如 可以按以下规律将电文变成密码 将字母A变成字母E a变成e 即变成其后的第4个字母 W变成A X变成B Y变成C Z变成D 见图3 20 字母按上述规律转换 非字母字符不变 如 Wonderful 转换为 Asrhivjyp 输入一行字符 要求输出其相应的密码 图3 20 程序如下 includeusingnamespacestd intmain charc while c getchar n if c a 运行结果如下 IamgoingtoBeijing MeqksmrkxsFimnmrk while语句中括号内的表达式有3个作用 从键盘读入一个字符 这是用getchar函数实现的 将读入的字符赋给字符变量c 判别这个字符是否为 n 即换行符 如果是换行符就执行while语句中的复合语句 即花括号内的语句 对输入的非换行符的字符进行转换处理 按前面分析的思路对输入的字符进行处理 有一点请读者注意 内嵌的if语句不能写成if c Z c z c c 26 因为所有小写字母都满足 c Z 条件 从而也执行 c c 26 语句 这就会出错 因此必须限制其范围为 c Z c z c z 即可
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!