普通高等教育电气信息类应用型规划教材 程序设计基础 基于问题情境的 C 语言实践教程 张克军主 编 代俊雅副主编 北 京

Size: px
Start display at page:

Download "普通高等教育电气信息类应用型规划教材 程序设计基础 基于问题情境的 C 语言实践教程 张克军主 编 代俊雅副主编 北 京"

Transcription

1 科学出版社职教技术出版中心

2 普通高等教育电气信息类应用型规划教材 程序设计基础 基于问题情境的 C 语言实践教程 张克军主 编 代俊雅副主编 北 京

3 内容简介 本书分为基础 提高和扩展三篇, 共 15 章 我们本着巩固学生基础知识 提升学生编程能力和培养学生程序设计素质的想法设计每一章的内容, 确保学生通过循序渐进的学习, 理解 掌握教学内容 本书主要内容包括 : C 语言的基础知识, 数据类型 运算符与表达式, 算法与程序设计方法结构 ( 顺序 选择和循环 ), 基本程序设计方法, 数组, 函数, 指针, 结构体 共用体和枚举类型, 文件等, 还有编译预处理 位运算等扩展部分内容 本书可作为高等院校学生学习 C 语言程序设计课程的教材, 尤其适合应用型本科学校和独立学院选用, 也可作为高职高专 成人教育 社会培训的教材, 还可作为 C 语言爱好者的自学教材或参考书 图书在版编目 (CIP) 数据 程序设计基础 : 基于问题情境的 C 语言实践教程 / 张克军主编. 北京 : 科学出版社,2011 ( 普通高等教育电气信息类应用型规划教材 ) ISBN Ⅰ.1 程 Ⅱ.1 张 Ⅲ.1 C 语言 - 程序设计 - 高等学校 - 教材 Ⅳ.1 TP312 中国版本图书馆 CIP 数据核字 (2011) 第 号责任编辑 : 陈晓萍 / 责任校对 : 王万红责任印制 : 吕春珉 / 封面设计 : 耕者设计工作室 科学出版社发行 * 各地新华书店经销 2011 年 5 月第一版 开本 : / 年 5 月第一次印刷 印张 :23 3/4 印数 : 字数 : 定价 :40.00 元 ( 如有印装质量问题, 我社负责调换 双青 ) 销售部电话 编辑部电话 版权所有, 侵权必究举报电话 : ; ; 科学出版社职教技术出版中心

4 主任 : 刘向东 普通高等教育电气信息类应用型规划教材编委会 副主任 : 方志刚张明君 成员 : 万旭万林生王泽兵龙建忠叶时平代燕 伍良富刘加海祁亨年杜益虹李联宁张永炬 张永奎张克军杨起帆周永恒金小刚洪宁 秦洪军凌惜勤陶德元 秘书长 : 刘加海 ( 兼 ) 秘书 : 陈晓萍周钗美

5 前 言 程序设计语言课程是高等院校计算机等相关专业的重要基础课程, 也是非计算机专 业计算机应用基础教育的重要课程 C 语言作为程序设计语言中的基础语言, 由于其强 大的功能和独有的特点, 在程序设计课程教学中占据突出和重要的地位 许多院校都将 C 语言程序设计 作为第一门程序设计课程, 并在第一学期开设 近年来, 关于如何进行程序设计语言的教学, 存在不同的看法 笔者结合自己从事 C 语言程序设计教学近 20 年的经验, 通过追踪课程发展趋势和教学改革实践, 积累了不 少教学经验, 力求为以应用型人才培养为目标的院校编写一本适合学生渐进认知思维和程序设计能力培养的教材, 根据中国高等院校计算机基础教育改革课题教研组发布的 中国高等院校计算机基础教育课程体系 2006 ( 简称 CFC2006) 中对 C 语言程序设计的要求, 编写了本书 本书的名字为 程序设计基础 基于问题情境的 C 语言实践教程 为什么用这个名字? 作为大学计算机基础教学系列核心课的 计算机程序设计基础 课程, 它主要讲授程序设计语言的基本知识和程序设计的方法与技术, 其内容以程序设计语言的语法规则和程序设计技术的基本方法为主, 同时包括程序设计方法学 数据结构与算法基础等方面的初步内容, 其关键是教会学生掌握程序设计方法, 具备初步设计编写解决简单问题程序的能力 本书的主要思想是创设问题情境, 通过提出问题 分析问题 编程解决问题和问题评价来引出新问题, 引导学生进入问题的情境中, 学习从计算机的角度观察 分析问题, 学会用程序设计的方法来解决问题, 在程序设计的实践中学习 运用和掌握 C 语言语法规则, 通过案例的实践, 使学生掌握计算机程序设计的思想和方法, 初步具备在各领域应用计算机的能力, 并为后续课程的学习创造条件 本书的主要特点如下 1. 按照认识规律, 对章节顺序作了合理安排, 做到先易后难, 循序渐进, 急用先学 语言叙述注重图文并茂, 通过问题引出理论, 通过理论解决实际应用, 这将有助于学生很快进入角色, 进而对本书 本课程产生兴趣, 易于教学, 便于自学 2. 例题贴近实际生活, 章末配有大量的练习题, 便于学生领会 理解 掌握和自我检查所学的语法规则及程序设计方法 3. 配有学习指导与实验教程 教学课件, 便于教 学双方参考使用 4. 通过连续 渐进的问题启发, 把握教学的难度 深度 强度, 提供教材 学习与实验指导 网络课件的支持, 以利于提升学生的知识 能力和素质 本书分为基础 提高和扩展三篇, 共 15 章 我们本着巩固学生基础知识 提升学生编程能力和培养学生程序设计素质的想法设计每一章的内容, 确保学生通过循序渐进的 科学出版社职教技术出版中心

6 ii 程序设计基础 基于问题情境的 C 语言实践教程 学习, 理解掌握教学内容 本书主要内容包括 :C 语言的基础知识, 数据类型 运算符与表达式, 算法与程序设计方法结构 ( 顺序 选择和循环 ), 基本程序设计方法, 数组, 函数, 指针, 结构体 共用体和枚举类型, 文件等, 还有编译预处理 位运算等扩展部分内容 本书可作为高等院校学生学习 C 语言程序设计课程的教材, 尤其适合应用型本科学校和独立学院选用, 也可作为高职高专 成人教育 社会培训的教材, 还可作为 C 语言爱好者的自学教材或参考书 建议教学总学时为 72 学时或 80 学时 ( 其中, 理论课 42 学时 上机实验课 30 或 38 学时 ) 书中 * 为选学内容, 可由教师根据教学学时情况安排 本书由北京理工大学珠海学院计算机学院张克军任主编, 代俊雅任副主编, 高树风 余俊杰 汪元卉等参与编写 其中, 张克军编写第 1~4 章 第 9~12 章, 代俊雅编写第 6~8 章, 高树风编写第 5 章, 余俊杰编写第 13 章和第 14 章, 汪元卉编写第 15 章和附录 全书由张克军统稿, 并请北京理工大学李书涛教授审阅 在编写本书过程中, 我们得到北京理工大学珠海学院计算机学院领导和许多老师的指导和帮助, 并得到浙江大学城市学院刘加海教授 北京师范大学珠海学院马维旻副教授 吉林大学珠海学院陈守孔教授等相关院系领导 老师的指导和协助, 在此一并表示感谢 在编写本书的过程中, 我们参阅了大量的图书资料, 其中的部分参考资料已列在参考文献中, 在此向这些图书的作者表示衷心的感谢 由于编者水平和时间所限, 书中难免有不足之处, 恳请有关专家和广大读者不吝赐教

7 目 录 基 础篇 第 1 章 C 语言概述 计算机与程序设计语言 计算机及发展 计算机系统结构 程序设计语言的发展及特点 C 语言的特点 C 语言程序的基本结构 C 语言程序的基本结构 C 语言程序结构特点 C 语言编程流程 如何学好 C 语言程序设计 编写 C 语言程序流程 C 语言编程环境 在 Turbo C 中编程 在 Visual C++ 中编程 小结 17 第 2 章基本语法 语言描述与数据存储的简单方法 C 语言程序基本元素 19 科学出版社职教技术出版中心 基本字符集 C 语言的词类 数据类型的含义与常用类型 数据类型的含义 整型 实型 字符型 常量与变量 常量 变量 31

8 iv 程序设计基础 基于问题情境的 C 语言实践教程 2.4 运算符与表达式 算术运算符与算术表达式 赋值运算符与赋值表达式 自增与自减运算符 逗号运算符与 sizeof 运算符 数据类型转换与强制类型转换符 小结 41 第 3 章编程语句 简单程序构建的方法 C 语言的语句及分类 基本输入 / 输出函数 字符输入 / 输出函数 格式输入 / 输出函数 典型例题解析 小结 60 第 4 章算法 程序设计的核心 程序设计与算法概述 程序设计思想 结构化程序设计思想 66 *4.2.2 面向对象的程序设计思想 程序基本结构 顺序结构 选择结构 循环结构 算法特性与描述方法 算法的特性 算法描述方法 算法分析与评价 小结 76 第 5 章判断与循环 一般复杂问题程序设计方法 条件描述与选择结构程序设计 程序中限定条件的表示 79 * 逻辑型变量 程序中问题条件选择的处理 if-else 语句 重复操作问题与循环语句 循环问题导引 while 语句 典型例题解析 小结 101

9 目录 v 第 6 章再论程序设计基本结构 再论条件语句 再论循环语句 do-while 语句和 for 语句 循环嵌套 流程转移控制语句 典型应用举例 小结 126 提 高篇 第 7 章复杂数据类型 数据描述与扩展存储方法 数组 一维数组 二维数组 字符串与字符数组 字符串概述 字符串的初始化 字符串长度与字符数组长度 有关字符串的系统函数 指针 指针的基本概念 指针与一维数组 指针与字符串 指向二维数组的指针 枚举类型 定义枚举类型和变量 167 科学出版社职教技术出版中心 枚举类型变量的赋值和使用 结构体类型 结构体类型的定义 结构体类型变量的定义和存储 结构体变量的使用 结构体变量的初始化 结构体数组的定义 结构体指针变量的定义和使用 共用体类型 共用体类型的定义 共用体变量的定义 存储和成员变量的访问 178

10 vi 程序设计基础 基于问题情境的 C 语言实践教程 7.7 类型定义符 typedef 小结 183 第 8 章函数 复杂程序的实现方法 函数定义和调用 函数定义 函数的返回值 函数的调用 定义和调用函数举例 函数原型和函数声明 函数的嵌套调用和递归调用 函数的嵌套调用 函数的递归调用 函数与数组 函数与指针 函数与结构体 结构变量作函数参数 结构指针变量作函数参数 再论说明语句 作用域 变量的生存期 变量的作用域和生存期小结 小结 213 第 9 章文件 数据独立存储的方法 文件概述 文件的概念 文件的分类 文件缓冲区 文件型指针 文件的打开与关闭 文件的打开 文件的关闭 文件的读 / 写操作 读写 单 字符函数 fputc 与 fgetc 函数 读写一个字符串的函数 fgets 与 fputs 函数 格式化读写函数 fscanf 与 fprintf 函数 按数据块方式读写 fwrite 与 fread 函数 字输入 / 输出函数 getw 函数与 putw 函数 文件定位函数 233

11 目录 vii 9.5 文件状态检查函数 小结 238 * 扩展篇 第 10 章编译预处理 程序设计的一般策略 宏定义 文件包含 条件编译 小结 252 第 11 章位运算 直接控制硬件的方法 位运算符与位运算表达式 复合位运算赋值 位段 典型例题解析 小结 265 第 12 章再论指针 C 语言的灵魂之处 指针数组 指向指针的指针 带参数的主函数 指向函数的指针和指针函数 指向函数的指针 指针函数 动态数组的实现 C 语言程序的内存映像 动态内存分配函数 动态函数应用举例 使用 const 修饰指针变量 283 科学出版社职教技术出版中心 12.7 小结 284 第 13 章典型案例程序剖析 万年历 系统概要 主要知识点 系统设计思路 程序代码 学生成绩管理 系统概要 主要知识点 293

12 viii 程序设计基础 基于问题情境的 C 语言实践教程 系统设计思路 程序代码 俄罗斯方块游戏 系统概要 主要知识点 系统设计思路 程序代码 307 第 14 章典型算法介绍 递归与迭代法 递归法 迭代法 递归的消除 贪心法 货币兑付问题 背包问题 最小生成树问题 326 第 15 章趣谈 C 语言 计算机发展 65 年 C 语言史话 IT 英雄榜 一个程序员的成长之路 341 附 录 附录 A ASCII 表 345 附录 B 关键字 346 附录 C 运算符 348 附录 D 数据类型 350 附录 E 常用库函数 351 附录 F C 语言编程代码规范 356 附录 G 常用编译错误及处理 359 参考文献 365

13 基础篇 科学出版社职教技术出版中心

14

15 第 1 章 C 语言概述 内容提要与自学导引 内容提要 : 本章主要内容为计算机与程序设计语言, 程序与软件,C 语言编程 流程和环境等内容 本章从计算机系统 软件 程序等概念入手, 引出编写软件的工具语言 计算机程序设计语言, 并以 C 语言为基础, 认识语言 程序结构和编写程序的过程以及具体编写程序的工具 平台环境的运用方法 自学导引 : 通过本章学习, 要求了解计算机语言 软件 程序和程序设计的概念 ; 掌握 C 语言程序的基本结构 初步掌握在 Turbo C 3.0 和 Visual C 环境下, 建立 编辑修改源程序清单 编译连接生成可执行程序 运行程序 查看运行结果等基本操作方法 学习重点 :C 语言的特点, 程序 软件等基本概念 ;C 语言程序的基本结构 ;Visual C 环境下, 建立 编辑修改 编译连接和运行 C 语言程序的方法 考核知识点说明 1. 程序 程序设计和高级语言, 达到 识记 层次 1 程序的概念 2 程序设计的任务和主要步骤 3 高级语言的概念与作用 2.C 语言和 C 语言程序, 达到 领会 层次 1 C 语言的发展 2 C 语言程序的基本结构 3.Turbo C Visual C 的基本使用方法, 达到 简单应用 层次 1 C 环境的启动和退出操作 2 使用 Turbo C Visual C 建立 修改 保存 C 语言程序的操作 3 使用 Turbo C Visual C 编译连接生成可执行程序的操作 4 使用 Turbo C Visual C 运行可执行程序和查看运行结果的操作 科学出版社职教技术出版中心

16 4 程序设计基础 基于问题情境的 C 语言实践教程 1.1 计算机与程序设计语言 计算机及发展计算机 (Computer) 也称为电脑或电子计算机, 是指一种能存储程序和数据 能自动执行程序 快速而高效地完成对各种数字化信息进行处理的电子设备 人类在对大自然的使用 协调与共处过程中, 创造并逐步发展了计算工具, 我国唐朝末年出现的算盘是人类经过加工制造的第一种计算工具 伴随着社会生产力的发展和科技的进步, 计算工具的发展也经历了人工 机械到电子化的过程 美国于 1946 年 2 月 14 日正式通过验收, 名为 ENIAC(Electronic Numerical Integrator And Calculator) 的电子数值积分计算机, 宣告了人类第一台电子计算机的诞生 在现代计算机的发展中, 有两位最杰出的代表人物 : 英国的图灵 (Alan Mathison Turing,1912~1954 年 ) 和美籍匈牙利物理学家冯 诺依曼 (Johon Von Neumann,1903~ 1957 年 ) 图灵建立了 图灵机 的理论模型, 对数字计算机的一般结构 可时限性和局限性产生了意义深远的影响, 并提出了定义机器智能的 图灵测试, 奠定了 人工智能 的理论基础 冯 诺依曼首先提出了在计算机内存储程序的概念, 并使用单一处理部件来完成计算 存储和通信工作 程序内储工作原理被称为冯 诺依曼原理, 有着 存储程序 的计算机成为现代计算机的重要标志 在 ENIAC 后于 1952 年正式投入运行的第一台具有内部存储程序功能的计算机为 EDVAC(Electronic Discrete Variable Automatic Computer, 电子离散变量自动计算机 ), 从第一台到今天的整个四代计算机习惯地统称为冯氏计算机 现代计算机的发展主要表现为两个方面 : 一是巨型化 微型化 多媒体化 网络化和智能化 ; 二是朝着非冯 诺依曼结构模式发展 计算机系统结构一个完整的计算机系统由硬件系统和软件系统两部分组成 硬件系统 (Hardware System) 是计算机系统的物质基础, 一般由主机和外设构成 主机是计算机的核心部件, 包括中央处理单元 (CPU, 内含运算器和控制器 ) 和主 ( 内 ) 存储器 外设包括输入设备 输出设备 外存储器 ( 硬盘 光盘 优盘等 ) 和其他外围设备 ( 如网络设备 ) 等 图 1-1 所示为电子计算机结构框图 软件系统指运行在硬件系统之上的各种程序和文档资料, 一般分为系统软件和应用软件 系统软件是生成 准备和执行其他软件所需要的一组程序, 它通常负责管理 监督和维护计算机各种软硬件资源, 给用户提供一个友好的操作界面, 扩大计算机处理程序的能力, 充分发挥计算机的各种设备的作用, 提高使用效果 常见的系统软件有操作系统 程序设计语言 ( 如 C 语言 ) 语言处理程序( 如 Turbo C Visual C 等 ) 数据库管理系统 (DBMS) 网络管理软件和系统服务软件等 应用软件是用户为解决某些

17 第 1 章 C 语言概述 5 具体问题而开发和研制或外购的各种程序 它们由程序设计语言编写, 结合某个 ( 些 ) 领域知识, 在系统软件的支持下运行, 如金山的 WPS 微软的 Office 套件, 各类用户应用程序等 图 1-1 电子计算机结构框图 程序设计语言的发展及特点 计算机是由硬件系统和软件系统组成的, 硬件是物质基础, 而软件是计算机的灵魂 没有软件, 计算机就是一台裸机, 有了软件, 才能成为一台真正的计算机 原因就在于计算机的每一个操作 各个硬件的每步工作及之间的协调都是由人们事先安排的指令控制执行的 所谓计算机程序就是一组计算机能识别和执行的指令 ( 指挥计算机部件工作的具体命令或电讯号 ), 所有的软件都是用计算机语言编写的 因此, 程序设计语言是人与计算机进行信息交流的工具, 而交流的方式和途径就是编写解决问题的程序 计算机程序设计语言从诞生至今已经历了四代 1 机器语言 : 由一组计算机可直接识别和接受的 0 和 1 所组成的指令序列构成 2 汇编语言 : 把上述的一组 0 和 1 的序列用一条符号化的指令来代替 3 面向过程的高级语言 : 由于用上述语言所编写的程序只能在同类型的计算机上执行, 都是面向机器的低级语言, 有必要创造一种更加 方便 使用的语言, 这就是高级程序设计语言 所谓 方便, 是指用接近于人们习惯使用的自然语言和数学语言来描述问题, 同时不依赖于具体型号的计算机 高级语言编程序时, 人们不必去熟悉计算机的内部结构和工作原理, 而是把主要的精力放在算法 ( 解决问题的方法步骤 ) 的描述上面, 因此这种语言又称为算法语言 从 1954 年出现 FORTRAN 语言后, 至今世界上已出现了上千种高级语言 使用高级语言编程时, 如果需要考虑和具体指定每个问题处理过程的细节, 即面向解题的过程, 称为面向过程的高级语言, 如 QBASIC FORTRAN 77 和 C 语言等 4 非过程化的高级语言 : 高级语言编程实际上是提出问题 做什么, 然后再去构造 怎么做 的解题过程, 而用非过程化的高级语言时, 人们只要提出 做什么 即可, 科学出版社职教技术出版中心

18 6 程序设计基础 基于问题情境的 C 语言实践教程 而 怎么做 的过程则由计算机去解决, 这种语言更适合非计算机专业的人员学习 非过程化的高级语言也称为面向对象的语言, 如 C++ C# Visual Basic 和 Java 语言, 均为面向对象的程序设计语言, 是近年来使用最普遍的语言 从自然语言角度来说, 程序是对解决某个问题的方法步骤的描述 ; 从计算机角度来说, 程序是用某种计算机能理解并执行的计算机语言描述解决问题的方法步骤, 是有限方法步骤的有序排列 程序的特点是有始有终, 每个步骤都能操作, 所有步骤执行完毕, 对应问题就能得到解决 程序设计就是分析解决问题的方法步骤, 并将其记录下来的过程 一个初级程序员对于一个简单的问题, 若要用计算机解决, 具体步骤大致如下 1 确定待解决问题的计算或处理方法 ( 算法分析 ) 2 将实际问题转变为一个数学问题, 用数学模型 ( 表达式 ) 描述 ( 算法设计 ) 3 编制程序框图, 确定程序结构 ( 算法实现, 下同 ) 4 选择计算机语言和它的工作模式 5 编制程序 6 上机编辑 调试 ( 包括编译和连接 ), 消除语法错误 7 如果结果正确则生成最终的用户程序, 否则返回 1 从头再来, 找出逻辑或设计错误所在 对于一个大型软件来说, 在它的设计过程中会涉及许多复杂的问题, 所以仅仅采用上面的步骤是不够的, 必须按软件工程的方法来设计 需特别指出的是, 初学者在编程时必须注重所编程序的格式, 并加入尽可能多的注释以保证可读性 C 语言的特点如前所述, 各类计算机语言的发展历程大致如下 : 先有机器语言, 再有汇编语言, 最后出现高级语言 但机器语言是各类语言在计算机上存储的最终形式, 它由二进制编码组成, 各命令和地址均用对应的二进制码表示 汇编语言用符号代替机器语言中的各条命令和地址, 所以又称为符号语言 汇编语言必须通过汇编程序把其中的符号还原成对应的二进制码后, 才能运行 它们为 面向机器的语言 或 低级语言 为了使程序能够脱离具体的机器硬件, 将一般程序员从对机器内部结构的深入了解中解放出来, 并使程序的编写接近日常的数学表达习惯, 计算机专家们设计出了一系列的高级语言 用高级语言编写的程序称为源程序, 必须将其翻译成二进制程序后才能执行 翻译有两种方式 : 一种是通过 解释程序 翻译一句执行一句的方式执行 ; 另一种通过 编译程序 一次翻译产生目标程序, 然后执行 虽然高级语言适应面较宽, 但它使程序员对硬件的控制能力大为减弱 因此, 随后又出现了一系列既保留高级语言的使用简便 可读性好等特点, 又具备汇编语言所具有的对硬件的强大控制能力的 中级语言, 常见的就是 C 语言 C 语言是高级语言, 也是中级语言, 既可用来编写系统软件, 也可用来编写应用软件 ; 既具有低级语言的某些特性 ( 对内存地址的操作 位操作等 ), 又具有高级语言的特

19 第 1 章 C 语言概述 7 点 使用 C 语言编程会感到限制少 灵活性大 功能强, 具有语言简单易懂 运算符和数据结构丰富 具有结构化的控制方法 语法控制不太严格 实现汇编语言的大部分功能 程序执行效率高和可移植性好等特点 1.2 C 语言程序的基本结构 通过前一节的学习, 我们知道 :C 语言是高级语言, 也是中级语言 ; 学习 C 语言的目的就是使用这门语言编写解决问题的程序 在能够编写程序之前, 让我们先了解 C 语言程序 C 语言程序的基本结构 先看以下四个实例 例 1-1 在计算机屏幕上输出一串信息 Welcome to C World! /* Visual C++ 下的程序 */ #include "stdio.h" int main() { printf("welcome to C World! \n"); // 显示信息的函数 return 0; // 返回一个函数值 0 运行结果如下 Welcome to C World! - 注意 : 程序运行后 (Visual C 环境下 ), 除显示程序产生的结果外, 还会显示一行信息 Press any key to continue, 意思是按任意键继续, 即结束运行, 返回编辑状态 程序说明 : /* */ 和 // 为程序注释符号, 所含内容为解释信息 注释内容不影响程序运行, 也不会增加真正的程序代码 ( 经编译后形成的可执行程序 ) 的长度 /* 与 */ 要成对出现, 中间为注释信息, 可多行 // 后跟注释信息, 到回车换行符结束, 单行出现, 常放在被解释语句的右侧 以 # 开始的是预处理命令,#include 为包含命令 ( 行尾没有分号 ), 表示把标准输入 / 输出头文件 (standard input & output header file,stdio.h) 包含在本程序中, 并放置在前面 C 语言要求 : 使用系统给定的函数就要事先把含有该函数信息的头文件包含进来 main() 代表主函数, 函数名固定不变, 为 C 语言程序的必要函数 前面的 int 代表需要返回一个整数值 (C99 标准要求 ), 有的教材用 void, 表示不用返回函数值 printf() 为格式输出函数, 实现字符串 ( 双引号内的信息 ) 的输出, \n 表示回车换行 科学出版社职教技术出版中心

20 8 程序设计基础 基于问题情境的 C 语言实践教程 如输出下面三行信息该如何设计程序 *********************** * Welcome to C World! * *********************** 例 1-2 给定半径, 计算圆的周长与面积 /* 计算圆的周长与面积 */ #include "stdio.h" int main() { float pi= ; /* 定义变量 pi 并给定具体值 */ float r, s, area; /* 定义变量 r s area 分别用于存储半径 周长和面积值 */ printf(" 计算圆的周长与面积 :\n"); printf(" 请输入圆的半径 :"); /* 提示输入 */ scanf("%f", &r); /* 输入半径值到变量 r */ s=2*r *pi; /* 计算圆周长 r */ area=pi*r*r; /* 计算面积 area */ printf(" 圆周长 =%.2f\n", s); /* 输出圆周长, 保留 2 位小数 */ printf(" 圆面积 =%.2f\n", area); /* 输出圆面积, 保留 2 位小数, 注意这里的小数点 */ return 0; 假设输入圆的半径为 10, 则程序运行结果如下 计算圆的周长与面积 : 请输入圆的半径 :10 圆周长 =6.28 圆面积 = 程序说明 : 本问题有三个数据要处理, 即输入半径 计算后输出的周长和面积 程序设计解决问题时必须要给数据一个存放的空间 ( 变量 ), 否则处理就很麻烦 因此, 主函数的前两行声明了几个变量 :r s area 和 pi, 其中由于圆周率为固定值, 因此在说明时给定初值 scanf() 为格式输入函数,%f 表示输入的应该为实数 ( 单精度 ),& 表示取变量 r 的地址,&r 就表明把输入的数据存入指定地址对应的变量中 printf() 函数中的 %.2f 表示输出应为实数, 并且小数部分是 2 位 ( 四舍五入 ) 已知正方形边长为 5, 求周长和面积 任意输入一个正方形边长, 求周长和面积 如何编程?

21 第 1 章 C 语言概述 9 例 1-3 输入两个整数, 比较后输出较大的数 /* 数值比较 */ #include<stdio.h> void max(int a, int b) { int m; if(a>b) m=a; else m=b; printf(" 最大的数是 %d\n", m); int main() { int x, y; printf(" 数值比较 \n\n"); printf(" 输入两个整数 :"); scanf("%d, %d", &x, &y); max(x, y); return 0; 假设输入两个数为 10 和 6, 则程序运行结果如下 数值比较输入两个整数 :10,6 最大的数是 10 程序说明 : 本程序由两个函数构成 : 主函数和用户自定义函数 max() 所谓用户自定义函数就是用户自己编写的函数,main() 和 max() 都是, 不同的是 main() 函数名称固定, 并且必须存在,max() 函数名字是用户自己命名的, 并应通过名字知晓函数的功能 ( 见名知意 ) scanf() 和 printf() 函数并非用户编写, 而是由系统事先提供的, 称为系统库函数或标准库函数 max() 函数有两个输入参数, 没有返回参数, 主函数调用时会将键盘输入的两个数 x 和 y 的值对应送给参数 a 和 b, 并经过判断语句 (if) 判别后, 将大数输出到屏幕上 程 序执行到 max() 的右大括号时结束并返回到调用函数所在语句后面的语句处继续执行 与前两例不同的是, 本例的包含预处理命令用尖括号 < > 包含头文件, 而没有用双引号 其实, 二者都可以使用, 不同的是用尖括号时, 会到指定文件夹 ( 目录 ) 查找 所包含的头文件 ; 用双引号时, 先在当前文件夹下查找, 若找不到再到指定文件夹下查找头文件 输入三个整数, 输出最大的数, 如何编程? 提示 : 方法为借用例 1-3 的 max() 函数进行处理 ( 需简单改动 ), 主函数负责输入和输出 科学出版社职教技术出版中心

22 10 程序设计基础 基于问题情境的 C 语言实践教程 例 1-4 在屏幕上显示 AB 图案 /* 字符图案 */ #include "stdio.h" void main() { printf(" 字符图案 \n\n"); printf(" A BBBBBBBB\n"); printf(" AAA BB BB\n"); printf(" AA AA BB BB\n"); printf(" AA AA BB BB\n"); printf(" AA AA BBBBBBBB \n"); printf(" AAAAAAAAA BB BB\n"); printf(" AA AA BB BB\n"); printf(" AA AA BB BB\n"); printf(" AA AA BB BB\n"); printf("aa AA BBBBBBBBB\n"); 请读者分析程序, 并到计算机上进行程序输入, 编译运行后看结果 C 语言程序结构特点 通过上述几个例子, 对用 C 语言编写的程序结构进行总结 1 一个 C 语言程序源文件 ( 扩展名为.c) 是由若干个函数构成的, 每个 C 语言程序有且仅有一个主函数 ( 函数名规定为 main) 若解决一个较大的问题, 解决问题的程序或软件可能会包括若干源程序文件 2 每个函数 ( 含主函数 ) 的定义分为两部分 : 函数说明部分 ( 首部, 函数名所在行 ) 和函数体 ( 处于最外层 { 和 之间 ) 3 函数体内一般分说明和执行两个部分, 说明部分用于声明变量 函数等, 执行部分实现函数主体功能 ( 完成具体操作 ), 一般包括输入 处理和输出部分 若函数体没有内容则为空函数 4 C 语言程序中的函数由语句 ( 向系统发出若干操作命令的部分 ) 构成, 语句最后总要有一个 分号 (;) 作为每个语句的结束 5 可以用 /* 和 */ 括住任意字符作为 注释, 也可用 // 后跟字符信息作为注释 注释部分可放在程序的任意位置 6 根据需要, 在各函数的前面, 一般会有预处理命令, 如用 #include 命令包含头文件 预处理得到的结果和编写的程序一起组成一个完整的 可用来编译的源程序 7 C 语言程序的书写格式很灵活, 在一行上可以书写多条语句, 一条语句较长时也可顺序写在多行上 ( 实际上不应该有行的概念 ) 8 C 语言程序的执行总是从主函数开始, 并在主函数中结束 ( 右大括号处 ) 主函数的位置是任意的 9 主函数可以调用任何非主函数, 任何非主函数都可以相互调用, 但不能调用主函数 10 C 语言本身不提供输入 / 输出语句, 相应功能由相应库函数完成

23 第 1 章 C 语言概述 C 语言编程流程 如何学好 C 语言程序设计 对于初学者, 学好程序设计语言是迈入软件设计之门的第一道通行证 由于 C 语言的简洁紧凑 (37 个关键字 9 条控制语句 ) 小巧灵活 书写自由 功能强大 ( 运算符 数据类型丰富, 库函数齐全 ) 和 C 语言程序的方便移植性, 决定它既是高级语言, 又是中级语言, 能直接对硬件操作, 是面向问题过程进行结构化设计的典型代表语言 如何才能学好 C 语言程序设计呢? 首先, 要避免进入只学语法和只满足于看懂程序这两个误区 大家都听过 哑巴英语 这句话, 英语是用来交流的, 如果把英语学成 哑巴, 只能看懂 会翻译, 而不会表达与沟通, 不会有人认为你英语学得好 同样, 学习 C 语言的目的在于利用这个工具解决问题, 而解决问题的方式是编程 学习 C 语言的语法是必要的, 看懂别人的程序也是应该的, 这两者的目的是为了帮助我们更好地编程, 因此学习掌握 C 语言的方法就是 编程 编程 再编程 其次, 如何实现编程? 一般要先理解计算机解题过程和特点 ; 然后学习基本程序设计方法, 并掌握基本语法和程序书写规范, 初步掌握良好的编程风格 ; 第三就是读书上例题程序和分析程序 ; 第四就是参照示例模仿编写相似问题的程序 ; 最后就是总结提高, 独立编写比较复杂问题的程序, 直至熟练掌握编程方法和技巧 再次, 若要提高编程水平, 在学习编程的时候, 一要掌握基本算法, 总结提炼设计方法技巧 ; 二要基于某个设计环境 ( 比如 Visual C++ 6.0) 不断实践, 在实践中积累和提高 ; 三要分析 研究 比较典型示范程序 ( 比如一些经典的游戏程序 ), 从中学到技巧和处理方法 建议读者养成坚持每天编写一到两个程序的习惯, 通过日积月累, 当有一万行代码的经验时, 编程能力就会有 质 的飞跃 编写 C 语言程序流程 如前所述, 利用高级语言进行程序设计, 一般有面向过程的方法和面向对象的方法 面向对象的方法在后面章节中会详细介绍, 这里只简单介绍面向过程的方法 面向过程的方法就是面向解决问题的整个过程 一个问题的解决一般都是分步骤完成的, 具体步骤如图 1-2 所示 图 1-2 程序设计的一般步骤 1 分析问题 : 分析题意, 搞清楚问题含义, 已知什么条件, 需要解决什么问题, 会产生什么结果 2 确定数学模型和数据结构 : 确定数学模型就是把实际问题直接或间接变换转化为 科学出版社职教技术出版中心

24 12 程序设计基础 基于问题情境的 C 语言实践教程 数学问题, 直到得到求解问题的公式 比如给定三个数据, 计算二次方程的实根问题, 就应该根据方程求解方法得到求根公式, 然后再编程求解 数据结构简单讲就是描述数据以及数据间的关系, 并通过一定的存储空间保存这些数据和体现数据间的关系 语言中涉及的变量 数组 结构体和文件等知识都是数据结构的内容 在程序设计中应着重考虑数据结构的设计, 也就是考虑好数据存储处理的方法, 因为程序运行处理的是数据, 通过对数据的处理实现工作任务的完成 再打个比方, 程序设计就像盖房子, 数据结构就像砖 瓦, 而算法就是设计图纸 若想盖房子, 首先必须有原料 ( 数据结构 ), 但是这些原料不能自动地盖起房子来, 必须按照设计图纸 ( 算法 ) 上的说明一砖一瓦地去砌, 才能拥有想要的房子 所以通俗地说, 编程时必须按照特定的规则, 把特定的功能语句和基本结构按照特定的顺序排列起来, 形成一个有特定功能的程序 : 程序设计 = 数据结构 + 算法 3 算法分析与设计 : 算法是解决问题的方法, 是程序设计的核心, 是程序的灵魂 学习程序设计和软件开发最重要的是学习算法思想 掌握常用算法并能自己设计算法 对于问题进行算法分析与设计要考虑内存空间 执行时间 程序可读性和可移植性等方面, 通过综合考虑进行算法优劣判别和取舍 4 编写程序 : 选择一种计算机语言, 按照算法并根据语言的语法规则写出源程序 5 编译调试运行求解 : 写好的源程序应该先输入到计算机程序编辑环境中, 经检查无误后进行编译, 若有错则再次调试纠错, 直到编译通过, 然后通过环境资源链接成为可执行程序后就可以执行, 程序执行后就会得到答案 通过答案可以反馈上述各方面是否正确 上述五步是从一个问题求解出发, 比较全面地叙述整个分析到求解的过程, 核心为 2 3 两步, 主要考察逻辑思维能力和数理基础 从编程开始才是 C 语言等计算机语言要做的事情 在一个程序或软件完成的最后, 一般还有编写程序文档一项, 如使用说明书 安装手册 帮助等资料 文档是软件的一个重要组成部分 : 软件 = 程序 + 文档 图 1-3 给出从写程序到调试求解的具体过程和步骤 图 1-3 C 语言编写流程

25 第 1 章 C 语言概述 C 语言编程环境 只有计算机能够执行并且结果合理的程序才是正确的程序 程序从分析 编写到编 辑 调试直到得出结果, 每一步都可能存在错误, 有些错误只有在实际的环境中调试运行才能发现并改正 常用的 C 语言程序设计实验环境有 Microsoft Visual C++ Turbo C 和 Quick C 等, 目前普遍使用的是前两种, 尤其以第一种使用最普遍, 它既可以用于调试 C 语言程序, 也可以用于调试 C++ 语言程序, 是 C 语言程序员的首选 工欲善其事, 必先利其器, 要学习 C 语言程序设计, 必须先学会使用 C 语言的编程工具 在 Turbo C 中编程 Turbo C( 简称 TC) 为 Borland 公司的产品, 以其编译的速度快 代码执行效率高而著称, 是 C 语言程序员最乐于使用的工具, 其中广泛使用的是 TC 2.0 和 TC 3.0 在本书中, 我们对它的使用环境不做介绍, 有兴趣的读者可参考其他资料的相关介绍 在 Turbo C 环境下开发 C 语言程序的简单过程如下 1 运行 Turbo C TC 2 进入编辑环境, 选取菜单 File New 或 File Load 建立一个新文件或调入一个已存在的文件 3 编辑修改源程序 4 源程序存盘 5 编译连接生成目标程序 若出现错误, 重复 2~5 步 6 执行目标程序, 显示运行结果 7 若出现错误, 执行调试程序并重复 1~7 步 在 Visual C++ 中编程 近年来, 由于 C++ 语言程序的普及,Visual C++ 中文版集成开发环境作为一种功能强大的程序编译器被相当多的程序员所使用, 使用 Visual C++ 也可以完成 C 语言的编译 由于 Visual C++ 中文版集成开发环境运行于 Windows 下, 对于习惯于图形界面的用户来说是比较易学的 Visual C++ 有多种版本, 本书中使用的是比较普及的 Visual C 中文版集成开发环境 1.Visual C 的安装 中文版集成开发环境的安装比较简单, 在输入 SETUP 执行后, 可以按照提示信息完成程序安装, 具体步骤如下 1 将安装盘插入光驱, 运行 Setup.exe 文件, 出现安装界面, 如图 1-4 所示 科学出版社职教技术出版中心

26 14 程序设计基础 基于问题情境的 C 语言实践教程 图 1-4 Visual C 安装界面 (1) 2 接受软件许可协议, 输入 ID 序列号, 安装正确后会出现如图 1-5 所示对话框 图 1-5 Visual C 安装界面 (2) 3 选定安装方式 安装文件夹和安装组件后开始复制文件 4 安装完成后, 可以选择是否安装 MSDN( 内含帮助信息 ), 若需要则插入 MSDN

27 第 1 章 C 语言概述 15 盘, 否则单击 退出 按钮结束安装, 如图 1-6 所示 图 1-6 Visual C 安装界面 (3) 2.Visual C 的 IDE 操作界面 双击快捷图标或从开始 程序 Microsoft Visual Studio 6.0 菜单找到 Microsoft Visual C 启动程序, 进入工作界面, 如图 1-7 所示 科学出版社职教技术出版中心 图 1-7 Visual C 操作界面

28 16 程序设计基础 基于问题情境的 C 语言实践教程 操作界面由标题栏 菜单栏 工具栏 项目工作台窗口 代码窗口 编译输出窗口和状态栏组成 其中, 代码窗口用于编辑显示 C 语言程序的源文件 ; 项目工作台窗口用于显示项目中的文件 类等信息 ; 编译输出窗口用于显示编译 连接等信息以及错误 警告等提示信息 3.Visual C 的基本操作方法 (1) 文件操作 1 建立新文件 : 选择 文件 菜单的 新建 命令, 在弹出的对话框中, 选择 文件 选项卡中的 C/C++Source File 选项, 在右边的 文件名 文本框中输入源文件名 ( 扩展名为.c 文件 ), 再在 位置 文本框中输入或选择要保存源文件的文件夹位置, 最后单击 确定 按钮, 如图 1-8 所示 图 1-8 建立新文件 2 编辑源文件 : 在代码窗口输入程序代码, 并检查修改错误, 直到程序编写完成 编辑方法与 Word 文档编辑基本相同 3 源文件存盘 : 选择 文件 菜单的 保存 命令, 或工具栏的软盘图示按钮, 就会把已编写的源文件以建立文件时给定的名称存到指定的文件夹中 如果要改名存盘, 可以选择 文件 菜单的 另存为 命令, 在弹出的对话框中输入新名称即可 4 打开已有文件 : 选择 文件 菜单的 打开 命令, 或工具栏的打开文件夹图示按钮, 在弹出的 打开 对话框中, 选择文件夹和文件, 单击 打开 按钮, 也可以双击源程序文件打开 如果已经建立一个项目文件 (.dsp), 则可以选择并打开, 项目文件信息会出现在项目工作台窗口, 从中选择.c 文件 需要说明的是,Visual C 是基于项目的挂起机制, 编译一个 C 语言程序必须先为其建立一个与其相关的项目 (2) 编译连接操作 1 程序编译 : 选择 组建 菜单的 编译 命令或图标按钮或快捷键 Ctrl+F7

29 第 1 章 C 语言概述 17 开始编译, 如果文件没有错误, 会在编译输出窗口显示 ***.obj -- 0 error(s), 0 warning(s) 信息, 否则, 会显示错误类型 个数, 同时提示每个错误大致出现的位置和原因, 提示用户进行修改并重新编译, 直到成功 一般提示的错误有两种 : 致命错误 (Error) 和一般警告错误 (Warning), 警告错误一般问题不大, 有的是一些善意的提醒, 仍然可以进行下一步的操作 ; 但致命错误则必须解决, 这样才能继续下一步的操作 编译成功, 会产生同名的目标文件 (.obj) 如果编译 C 语言源程序之前还没有生成其相应的项目文件, 此时编译系统会自动生成相应的项目文件, 用户只要确认即可 2 连接目标文件 : 选择 组建 菜单的 组建 命令或图标按钮或快捷键 F7 进行连接, 如果没有连接错误, 会在编译输出窗口显示 ***.exe -- 0 error(s), 0 warning(s) 信息, 否则会显示错误提示, 用户按照提示重新进行修改 编译和连接即可 连接成功生成的文件为可执行文件 (.exe) 以上两步也可以一并完成, 方法是选择 组建 菜单的 全部重建 命令即可 (3) 运行文件选择 组建 菜单的 执行 命令或图标按钮或快捷键 Ctrl+F5 开始执行程序, 若有输入信息, 则在弹出的执行窗口中输入数据, 结束输入后会得到运行结果 此时, 按任意键会返回编辑窗口环境 1.5 小结 计算机是一种可以用来解决许多问题的电子工具, 要使用计算机解决某个具体问题, 必须开发相应的程序 程序设计的主要任务就是找出解决问题的方案, 并将该方案用计算机能够理解的方式加以表达 要完成这一任务, 必须以适当的程序设计方法为指导, 并采用某种程序设计语言为编程语言, 此外, 还必须具备应用领域的知识以及开发环境和工具的支持 首先, 本章循着 计算机系统 软件系统 软件 程序 设计程序的语言 C 语言 C 语言特点 的思路比较系统地回答了 为什么要学习 C 语言 的问题 明白了 学习掌握 C 语言, 目的是能够编写解决问题的程序 这个问题后, 通过四个例子, 由简单到复杂介绍了 C 语言程序的构成要素和书写样式, 这部分为本章重点 因为只有掌握程序格式, 才能照此写出程序 其次, 在掌握 C 语言程序特点后, 通过一般编程步骤和程序上机调试运行步骤, 简单介绍了程序设计的方法和调试的方法, 此为重点掌握内容 最后, 重点以 Visual C 为编程环境, 介绍了该编程环境的基本使用方法, 为读者初步进行编程和实践上机调试编译以及运行整个过程奠定基础 科学出版社职教技术出版中心

30 第 2 章基本语法 语言描述与数据存储的简单方法 内容提要与自学导引 内容提要 : 本章主要介绍 C 语言本身的构成要素和基本语法, 重点为描述数据的基本方式以及对数据的基本操作 本章的内容是从认识 C 语言的字符集 关键字 ( 保留字 ) 标识符和分隔符入手; 以数据类型 变量 常量和表达式为起点, 掌握 C 语言基本语法, 并以此为基础, 进一步熟识语法规则 程序构成, 提炼编写程序的思路和过程 自学导引 : 建议类比英语的学习方式学习本章内容, 掌握 C 语言的基本字符集 关键字 标识符和分隔符等的语法和注意事项 ; 掌握变量定义 常量使用 运算符和表达式描述的基本方法 特别指出的是, 本章为 C 语言的语法集中学习的章节, 许多内容必须牢牢记住, 因此希望读者在读懂 理解的基础上加强记忆, 并通过使用牢牢掌握 学习重点 :C 语言的字符集 关键字 标识符和分隔符 ;C 语言程序的基本单词 ( 变量 常量 运算符和表达式 );Visual C 环境下, 建立 编辑修改 编译连接 运行 C 语言程序的方法 考核知识点说明 1.C 语言的字符集 关键字 标识符和分隔符, 达到 领会 层次 1 C 语言的字符集 标识符 分隔符 2 C 语言的关键字及其基本作用 2. 数据类型 变量 常量 运算符和表达式使用方法, 达到 熟练应用 层次 1 理解数据类型的含义, 掌握基本数据类型 2 理解常量 变量的含义, 能够准确地声明变量 3 掌握基本运算符, 理解优先级和结合性, 熟练使用运算符 变量 常量和函数构造表达式 4 熟练使用上述知识编写程序

31 第 2 章基本语法 语言描述与数据存储的简单方法 C 语言程序基本元素 众所周知, 学习英语从 26 个英文字母开始, 加上音标 词法组成具有一定意义的单 词, 加上语法 句法构成语句, 再加上文法形成文章 学习 C 语言也遵循同样的道理 先看下面这个程序 ( 第 1 章例 1-2 程序 ) 引例 给定半径, 计算圆的周长与面积, 程序如下 #include "stdio.h" int main() { float pi= ; /* 定义变量 pi 并赋值 */ float r, s, area; /* 定义变量 r s area 分别用于存储半径 周长和面积值 */ printf(" 计算圆的周长与面积 :\n"); printf(" 请输入圆的半径 :"); /* 提示输入 */ scanf("%f", &r); /* 输入半径值到变量 r */ s=2*r *pi; /* 计算圆周长 r */ area=pi*r*r; /* 计算面积 area */ printf(" 圆周长 =%.2f\n", s); /* 输出圆周长, 保留 2 位小数 */ printf(" 圆面积 =%.2f\n", area); /* 输出圆面积, 保留 2 位小数, 注意这里的小数点 */ return 0; 分析上面的程序, 发现 C 语言的程序从语言的角度看, 应由如下几个部分构成 基本字符集 1. 字符集 在 C 语言程序中允许出现的所有基本字符的组合称为 C 语言的字符集 C 语言的字符集就是 ASCII 字符集, 主要分 52 个大小写英文字母 ( 大小写字母是不同的字符 ) 10 个数字 (0 到 9) 33 个键盘符号 ( 包括运算符号 标点 分隔符号和特殊符号等 ) 和若干转义字符 ( 如 \n) 2. 关键字 ( 保留字 ) 在 C 语言的程序中有特殊含义的英文单词称为关键字 (Keyword) 或保留字, 主要用于构成语句 进行存储类型和数据类型定义 C 语言的 32 个常用关键字 (C99 标准增加 5 个, 共 37 个 ) 如表 2-1 所示 ( 详细内容参见附录 C), 在后续章节中会陆续学到 科学出版社职教技术出版中心

32 20 程序设计基础 基于问题情境的 C 语言实践教程 表 2-1 C 语言的 32 个常用关键字 分类数据类型存储类型流程控制运算符 关键字 char, short, int, unsigned, long, float, double, struct, union, void, enum, signed, const, volatile typedef, auto, register, static, extern break, case, continue, default, do, else, for, goto, if, return, switch, while sizeof 3. 标识符程序中除关键字外, 还有许多信息需要描述和表达, 比如函数的名字 变量的名字等, 这些能够标记识别的符号统称为标识符 (Identifier), 是用户自定义的一种字符序列, 可以由程序设计者指定, 也可以由系统指定 标识符的命名要遵循下列规则 1 C 语言中规定标识符只能由字母 数字和下划线组成, 且第一个字符必须是字母或下划线 2 不能与 C 语言的 37 个关键字同名 3 ANSI C 规定标识符的有效长度不大于 32 个字符, 而 PC 机中通常是前 8 个字符有效 4 标识符命名时最好做到 见名知意 例如, 使用 area sum name 作为存放面积 总和 姓名的变量名比使用 a b c 这样的变量名更能增加程序的可读性 5 符号常量使用大写字母, 变量使用小写字母, 便于区分 以下的标识符都是合法的 : x_y,x2,sex,sex,_int 下面都是非法的标识符 : 2x( 第一个字符不能是数字 );x-y( 要区分下画线与减号 );w.w( 含有非法字符 ) 4. 运算符运算符 (Operator) 是 C 语言中用来表示各种运算的符号 C 语言的运算符多达 34 种, 按运算类别分为算术运算符 关系与逻辑运算符 赋值运算符等 ; 按参与操作的数据数量分为单目 ( 一个操作数 ) 运算符 双目运算符和三目运算符 众多的运算符体现了 C 语言丰富的运算功能 ( 参见附录 C) 本书结合需要将在不同章节中专门进行讲解, 读者在学习运算符时, 特别要注意以下几点 1 优先级 : 每个运算符都规定一个优先运算的级别, 如先乘除后加减 2 结合性 : 若优先级相同的两个运算符参与运算, 运算量应先与哪个运算符结合, 是必须先明确的, 这就是结合性 分为左结合 ( 自左向右 ) 和右结合 ( 自右向左 ) 两种 如 x+y-z, 运算符 + 和 - 优先级相同, 变量 y 先参加哪个运算, 是加还是减, 答案是参加加法运算, 即与 + 运算符相结合, 称为左结合 3 参与运算数据的类型 : 有的运算符对参与运算的数据限定类型

33 第 2 章基本语法 语言描述与数据存储的简单方法 21 4 参与运算数据个数 : 不同运算符有具体的要求 5 运算结果的类型 : 不同类型的数据参与运算, 要考虑结果的类型 5. 分隔符 写文章要有标点符号, 写程序也要进行必要的分隔 分隔符 (Separator) 是用来分隔标识符间或标识符与关键字间的符号 空格字符 水平制表符 垂直制表符 换行符 换页符及注释均是 C 的分隔符, 通称为空白字符, 起分隔单词的作用 在相邻的变量 关键字和常量 函数之间需要用一个或多个空白字符 ( 其效果是一样的 ) 将其分开 逗号也是分隔符, 用于相邻同类项之间的分隔 例如, 本例中定义变量语句 : float r, s, area; 关键字 float 与第一个变量 r 用空格 ( 空白字符 ) 分隔, 三个变量间用逗号分隔 C 语言的词类 所谓 C 语言的 词 是指构成 C 语言语句的基本单位, 主要分为常量 变量 函数调用 表达式等四类, 有的教材也把关键字 标识符看作单词 常量 : 数据的原样表达方式, 是程序执行过程中不发生变化的量, 如 和计算周长公式中的 2 变量 : 是存放数据的地方, 在程序执行过程中, 值可能发生改变, 如存放半径 周长和面积的量 r s area, 它们的命名属于标识符, 但使用上属于变量 程序执行前后, 它们的值 ( 存放空间存储的数据 ) 发生了改变 变量需要先定义后使用, 如 float r, s, area 表示定义三个名字为 r s 和 area 的变量, 用于存放单精度实数 表达式 : 用于描述数学计算公式和其他公式的方法, 本程序中计算周长和面积的公式都属于表达式, 并且是由算术运算符把常量 变量等连接起来构成的算术表达式 函数调用 : 实现输入 / 输出的函数 scanf() 和 printf() 被放在主函数内, 由主函数调动执行, 被称为函数调用 在多函数的程序中, 调用或被调用的函数还可以是用户自己定义编写的函数 注意每个函数的定义都是各自独立的, 不允许出现在一个函数内定义另一个函数的现象 关键字 : 程序中经常用到关键字, 比如定义变量时和确定函数返回值时 本例程序中定义变量并指定类型的 float, 确定主函数返回值类型的 int 都是关键字 标识符 : 本例中的变量名和输入 / 输出函数以及主函数名都属于标识符 C 语言词类的具体内容从下节进行详细介绍 2.2 数据类型的含义与常用类型 数据类型的含义 什么是数据类型? 为什么在计算机运算时要指定数据的类型? 科学出版社职教技术出版中心

34 22 程序设计基础 基于问题情境的 C 语言实践教程 在回答这两个问题之前, 先回顾一下数学知识 数学中有整数集 实数集 有理数集等, 是把数据按照某种标准进行分类的 学习 C 语言的目的是编写解决问题的程序, 并用计算机工具通过处理数据解决问题 而现实问题中的数据是多样性的, 有数值数据也有非数值数据, 也需要进行分类 若要编写程序, 需要解决如何描述和存储数据的问题 结合数学和计算机的知识,C 语言把处理的数据进行分类, 从数据的表示 取值范围和对应的操作等方面进行划分, 形成不同的数据类型, 并通过程序中数据类型的描述确定存放数据的空间大小, 确保 C 语言程序中的每个数据都属于一个确定的 具体的数据类型 划分数据类型后, 不仅可以表达一般的整数和小数这些数值型数据, 还能表达非数值型 ( 文字型或字符型 ) 数据, 如一个英文字母 一组符号 一个汉字 一组文字等 对于非常大或小的数据也能够很好地表达, 如生活中把 1000 亿当作整数, 而在计算机内则作为浮点数处理 C 语言提供了丰富的数据类型, 如图 2-1 所示 图 2-1 C 语言中的数据类型本节主要介绍基本数据类型 基本数据类型是 C 语言事先已在内部定义的 程序员可直接使用的类型 基本数据类型共包括三类 : 整型 实型和字符型 其中, 用整型或实型表示数值型数据, 用字符型表示非数值型数据 特别指出的是一些教材把枚举类型划分为基本类型, 笔者认为, 若从应用的角度出发, 还是划归构造类型比较适合, 因为我们不是直接使用枚举类型关键字定义变量, 而是先构造一个新类型, 再用这个新类型名定义变量 如何学习掌握基本数据类型? 读者可从关键字含义 表达数据的范围 存储空间的大小和包含的操作等四个方面理解掌握基本数据类型, 达到能够区分所用数据的类型和存放不同类型变量的使用方法 C99 标准新增加 逻辑型, 可以将关系和逻辑运算的结果存入该型变量中, 具体可参见第 5 章相关内容

35 第 2 章基本语法 语言描述与数据存储的简单方法 整型整型数据就是生活中的整数 在 C 语言中, 根据存储整数时所需存储空间的大小将整数分为三种 : 短整型 基本整型和长整型 根据整数的取值范围将其分为两类 : 有符号的整型和无符号的整型 有符号的整型数据包括负整数 零 正整数, 无符号的整型数据指的是大于或等于零的正整数 这样, 整型数据共有六种, 每种类型的整型数据采用的系统关键字 所需内存空间的大小以及取值范围如表 2-2 所示 表 2-2 整型数据的分类 ( 假定是 16 位字长的机器 ) 类型关键字 所需内存空间 位数 字节数 取值范围 无符号的短整型 unsigned short [int] ~65535 无符号的基本整型 unsigned [int] ~65535 无符号的长整型 unsigned long [int] ~ 有符号的短整型 [signed] short [int] ~32767 有符号的基本整型 [signed] int ~32767 有符号的长整型 [signed] long [int] ~ 说明 : 1 表 2-2 中 [ ] 里的内容为任选项 如在 C 语言程序中表示无符号的基本整型时, 可使用关键字 unsigned 或 unsigned int, 表示有符号的长整型时, 可使用关键字 long 或 long int 或 signed long int 2 int 类型所占内存空间的大小与使用的计算机有关 如果计算机的字长为 16 位, 则基本整型需要占用 2 个字节的内存空间 ; 如果字长为 32 位, 则 int 对应 4 个字节 使用时可通过 C 语言提供的运算符 sizeof 进行验证 如果 sizeof(int) 的值为 4, 则说明计算机的字长为 32 位 在后面的章节介绍中, 约定 int 类型占用 2 个字节 3 无符号的整型数据的取值范围 2 个字节共 16 位二进制代码, 每位二进制代码的值是 0 或 1,16 位二进制代码的 0 或 1 变化是从 , 直到 , 即从 16 位都是 0 到 16 位都是 1 把用二进制代码表示的整数转换成十进制表示 :16 位都是 0 的二进制就是十进制的 0,16 位都是 1 的二进制转换成十进制为 =2 16 1=65535 因此,unsigned short 与 unsigned 的取值范围为 0~ , 即 0~65535 同理, 我们可以知道 unsigned long 的取值范围为 0~2 32 1, 即 0~ 并非所有的 int 型与 short 型字节大小都相同, 而是看计算机字长和系统环境而定 本书假定二者是相同的 5 要弄清有符号的整型数据的取值范围, 就要知道这样一个原则 : 在计算机内存中存储的是有符号整数的补码 求补码的方法如下 正数的补码和原码 ( 即用二进制形式表示 ) 相同 科学出版社职教技术出版中心

36 24 程序设计基础 基于问题情境的 C 语言实践教程 负数的补码的求解方法 : 将该数绝对值的二进制形式按位取反后再末尾 ( 第 0 位 ) 加 1 例 2-1 求 10 的补码 10 的绝对值的二进制形式 ( 即 10 的原码 ) 如下 : 按位取反后的结果如下 : 再加 1, 得 10 的补码如下 : 注意 :16 位二进制数, 从右到左为 0 到 15 位,0 位是最低位,15 位为最高位, 存放有符号数时, 最高位代表符号, 规定 1 为负,0 为正 由此可知, 最高位 ( 即左面的第一位 ) 是符号位,0 表示正,1 表示负 已知补码反向推导用十进制形式表示的有符号整数的方法如下 1 当最高位是 0 时, 说明存储的是正数 占用内存空间 2 个字节的 16 位二进制代码除符号位的 0 外, 其他 15 位的 0 或 1 变化就从 , 直到 , 转换成十进制形式为 0,1 直到 =2 15 1= 32767, 即存储的有符号整数包括 0 和正整数, 其中最大的正数为 当最高位是 1 时, 说明存储的是负数 占用内存空间 2 个字节的 16 位二进制代码除符号位的 1 外, 其他 15 位的 0 或 1 变化就从 , 直到 由此可以反向推出 已知补码求负数 的方法 : 先减 1 后按位取反 ( 或者按位取反后加 1), 再用十进制形式表示, 然后加负号 例 2-2 求补码 对应的负数 将补码 减 1 后的结果如下 : 按位取反后的结果如下 : 将按位取反后的结果用十进制形式表示为 2 15 =32768 加上负号后, 即 = 2 15 以此类推, 补码是 的负数为 32767, 补码是 对应的负数为 1, 即当最高位是 1 时, 存储的负数范围为从 到 1, 最小的负数是 因此,short 类型与 int 类型的取值范围为 2 15 ~2 15 1, 即 32768~32767 同理, 可以得出 long 类型的取值范围为 2 31 ~2 31 1, 即 ~

37 第 2 章基本语法 语言描述与数据存储的简单方法 实型实型数据就是数学中的实数, 实数一律作为有符号的数据使用 一般地,C 语言将实数分为两类, 单精度实型和双精度实型 每类采用的关键字 所需内存空间的大小 有效数字以及取值范围如表 2-3 所示 表 2-3 实型数据的分类类型关键字内存字节有效数字取值范围 单精度实型 float 4 7 双精度实型 double 8 16 正实数 : ~ 负实数 : ~ 正实数 : ~ 负实数 : ~ 说明 : 1 实型也称浮点型 浮点型数据在内存中按指数形式存储 例如, 实数 转换为二进制为 , 将其规范化之后成为 , 这里的规范化是指移动小数点使小数点的左边只有一个 1 因此, 内存里实际上只存储了实数的三部分信息 : 符号 ( 如 + ) 指数( 如 6 的二进制代码 ) 和尾数 ( 小数点右边的位, 即 ), 而小数点左边的 1 并没有存储 如果把实数 作为单精度实型, 则在内存中的存储形式如下 也就是说, 用 1 位二进制代码存储符号,0 表示正数,1 表示负数 ; 用 8 位二进制代码存储指数部分 ; 用 23 位二进制码存储尾数部分 如果把实数 作为双精度实型, 则在内存中的存储形式如下 尾数部分占的位数愈多, 实数的有效数字愈多, 即有效精度愈高 指数部分占的位数愈多, 则能表示的数值范围愈大 2 实数在操作中存在误差 例如, 把 作为 float 型数据, 输出的结果是 , 因为 float 只能保证 7 位数字是有效的 如果想使这 9 位数字都是准确的, 则应该把它作为 double 型数据使用 字符型 C 语言不仅能处理数值型数据, 也能处理字符型数据 C 语言采用 ASCII 码字符集, 科学出版社职教技术出版中心

38 26 程序设计基础 基于问题情境的 C 语言实践教程 即用 1 个字节存放 1 个字符的 ASCII 码值 字符型使用关键字 char 表示, 占内存空间为 1 个字节,ASCII 码值的范围为 0~255 到此, 我们只介绍几个基本数据类型, 对于其他类型会在后续章节中介绍 读者理解掌握了以上基本类型后, 请思考下面一个问题 程序中如何进行这些类型的数据描述和存储? 2.3 常量与变量 常量常量就是指生活中的常数, 也就是其值和类型在执行过程中不会发生改变的数据 C 语言提供以下几种常量 1. 整型常量可以使用三种形式表示整型常量 1 十进制形式 用十进制形式表示的整型常量与数学中的整数表示方法完全相同, 由 0~9 共 10 个数组成 以下是合法的十进制整型常量 : 八进制形式 八进制整型常量必须以数字 0 开头 ( 即以 0 作为八进制数的前缀 ), 组成八进制的数为 0~7 以下是合法的八进制整型常量:015( 十进制为 13) 0101( 十进制为 65) ( 十进制为 65535) 以下是不合法的八进制整型常量 :56( 无前缀 0) 03A2( 包含了非八进制数码 ) 3 十六进制形式 十六进制整型常量的前缀为 0X 或 0x, 取值为 0~9,A~F( 或 a~f) 以下是合法的十六进制整型常量 :0X2A( 十进制为 42) 0XA0( 十进制为 160) 0XFFFF( 十进制为 65535) 以下是不合法的十六进制整型常量 :5A( 无前缀 0X) 0X3H( 含有非十六进制数码 ) 给定一个整型常量, 属于一般整型还是长整型, 如何判别? 整型常量的类型确定方法如下 1 默认规则 : 根据数据的大小结合数据表示范围确定 如 为一般整型, 为长整型 2 通过加后缀强制改变类型 整型常量的后缀有 L 或 l(l 的小写字母 ) U 或 u

39 第 2 章基本语法 语言描述与数据存储的简单方法 27 L 或 l: 表示数据为长整型, 而不考虑数据本身的大小 如 16L 为长整型数 16 附加说明 : 在 16 位字长的机器上, 基本整型常量的长度为 16 位, 因此表示的数据范围也是有限的 十进制无符号整型常量的表示范围为 0~65535, 有符号整型常量的范围为 32768~+32767; 八进制无符号整型常量的表示范围为 0~ ; 十六进制无符号整型常量的表示范围为 0X0~0XFFFF 或 0x0~0xFFFF 如果使用的整型常量超过了上述范围, 就必须用长整型常量来表示 以下是合法的十进制长整型常量 :158L( 十进制为 158) L( 十进制为 ) 以下是合法的八进制长整型常量 :012L( 十进制为 10) 077L( 十进制为 63) L( 十进制为 65536) 以下是合法的十六进制长整型常量 :0X15L( 十进制为 21) 0XA5L( 十进制为 165) 0X10000L( 十进制为 65536) 请分析 158 与 158L 有什么异同? 长整型常量 158L 和基本整型常量 158 在数值上并无区别, 但在 C 编译系统中却是截然不同的 对 158L 而言, 因为是长整型常量,C 编译系统将为它分配 4 个字节的存储空间 ; 而对 158 而言, 因为是基本整型常量, 所以只分配 2 个字节的存储空间 因此在运算和输出时要予以注意, 避免出错 U 或 u: 表示无符号整型常量 例如,358u 0x3A8u 235Lu 均为无符号整型常量 系统默认是有符号的, 若想表示无符号数, 应加后缀 u 或 U 前缀 后缀可同时使用以表示各种类型的数 例如,0XA5Lu 表示十六进制无符号长整型常量 A5, 其十进制为 实型常量 科学出版社职教技术出版中心 可以使用以下两种形式表示实型常量 1 十进制小数形式 : 由数字 0~9 和小数点组成 例如, 等均为合法的十进制小数形式 2 十进制指数形式 : 由十进制数字 阶码标志 e 或 E( 代表 10) 以及阶码 ( 只能为整数, 可以带符号 ) 组成 其一般形式 :a E( 或 e)n(a 为带符号的十进制数,n 为有符号的十进制整数 ), 其值为 a 10 n 以下是合法的十进制指数形式 :2.1E5 或 2.1E+5( 等于 ) 3.7E 2( 等于 ) 0.5E7 或 0.5E+7( 等于 ) 2.8E 2( 等于 )

40 28 程序设计基础 基于问题情境的 C 语言实践教程 十进制实数必须有小数点, 如没有小数点就是整型常量 不合法的十进制指数形式 :345( 无小数点 ) E7( 阶码标志 E 之前无数字 1) 2.7E ( 无阶码 0) 在字母 E( 或 e) 之前的小数部分中, 小数点左边若有 1 位 ( 且只能有 1 位 ) 非零的数字称为 规范化的指数形式 例如, 前面举例中的 2.1E5 3.7E 2 就是规范化的指数形式 对于一个实数, 是单精度数还是双精度数, 如何判断? 系统默认的实数为双精度型 (Double), 若想表达为单精度型, 则需要加上后缀 实型常量的后缀为 F 或 f 例如,5.6 是 double 型, 而 5.6f 是 float 型 3. 字符常量字符常量是用单引号括起来的一个普通字符或转义字符 (Escape Charactor) 序列 例如,'a' 'b' '=' '+' '?' 'A' 都是合法的字符常量 单引号内只能是一个可从键盘上输入的单个字符 'CR' 'LR' 'Enter' ' ' 都是不合法的字符常量 在 C 语言中, 还可以使用转义字符序列表示字符 什么是转义字符? 为什么要用到转义字符? 描述和处理字符常量的前提是必须能够通过键盘把这个常量输入到计算机中, 键盘上的许多字符 ( 如字母 标点符号 运算符号等 ) 可以直接输入, 但像回车换行 退格等如何输入, 已经作为字符常量的格式标识符号, 那么单引号本身又如何输入呢? 为解决上述问题,C 语言引入转义字符, 并通过它实现特殊字符的输入 转义字符序列以右斜线 \ 开头, 后跟一个特殊字符 ( 即转义字符 ) 或几个数字 由于转义字符已赋予特定的含义, 不同于原有字符的意义, 故称为 转义 字符 转义字符主要用来表示不便于表示的控制代码 C 语言提供的转义序列如表 2-4 所示

41 第 2 章基本语法 语言描述与数据存储的简单方法 29 表 2-4 转义序列及其含义 转义序列 转义序列的含义 ASCII 码值 \n 回车换行 10 \t 与 \v 横 ( 纵 ) 向跳到下一水平 ( 垂直 ) 制表位置 9,11 \b 退格 8 \r 回车 ( 不换行 ) 13 \f 走纸换页 12 \\ 右斜线符 92 \' 单引号符 39 \" 双引号符 34 \0 空字符 (ASCII 码为 0 的字符 ) 0 \a 鸣铃 7 \ddd \xhh ASCII 码值为 1~3 位八进制数所代表的字符 ASCII 码值为 1~2 位十六进制数所代表的字符 广义地讲,C 语言字符集中的任何一个字符均可通过转义序列表示出来 例如,'\n' 表示键盘上的 Enter 键,'\t' 表示键盘上的 Tab 键,'\\' 表示键盘上的右斜线符 \,'\' ' 表示键盘上的单引号符,' \" ' 表示键盘上的双引号符,'\362' 或 '\xf2' 表示 ASCII 码值为 242 的字符, 该字符无法从键盘上输入, 但可在程序中使用 例 2-3 转义字符应用举例 #include<stdio.h> int main() { printf("abc\t def\rg\th\n"); printf("i\t jk\b\b\bl m"); printf("y\b=\n"); return 0; 读者分析这个程序, 思考会在屏幕上显示怎样的结果? 若在打印机上输出, 结果是否不同? '\t' 代表水平制表, 相当于键盘的 Tab 键 每按下一次 Tab 键, 光标走过的 宽度可能为 8, 也可能是 4, 具体看计算机的设置 值得注意的是, 每次按 Tab 键, 并不是从当前光标位置后移一个 Tab 宽度, 而是移到下一个制表位, 实际 移动的宽度视当前光标位置距下一个制表位的距离而定 科学出版社职教技术出版中心 字符常量在内存存储时, 实际保存的是该字符对应的 ACSII 码 例如, 存储字符常量

42 30 程序设计基础 基于问题情境的 C 语言实践教程 'A' 和 'a' 则内存中存放的是对应的 ASCII 码值 65 和 97, 大小写字母字符的 ASCII 值相差 32 C 语言规定 : 在 ASCII 码取值范围内,char 型数据和 int 型数据之间的相互转换不会丢失信息, 即 char 型数据可以参加任何 int 型数据的运算, 反之, 在 ASCII 码取值范围内的 int 型数据也可以参加字符型数据的运算 4. 字符串常量字符串常量是用一对双引号括起的 0 个或多个字符组成的字符序列 例如,"CHINA" "C program" "$12.5" "IBM\nPC\101B" 等都是合法的字符串常量 字符串 "CHINA" 在内存中的存储形式为 C H I N A \0 它在内存中占 6 个字节的存储空间, 最后一个字符为 '\0'( 表示 ASCII 码为 0 的空字符 ), 用它作为一个字符串结束的标志, 它是系统在存储字符串时自动加上的 如何区分字符常量和字符串常量? 'a' 和 "a" 是否一致? 区分字符常量和字符串常量需要从表达方式 字符数量 实际存储结构等加以区分 1 字符常量用单引号括起来, 字符串常量用双引号括起来 2 字符常量只能是单个一般字符或转义字符, 而字符串常量可以没有字符, 也可以包含多个字符 3 字符常量占一个字节的内存空间, 字符串常量占用的内存空间等于组成字符串的字符个数 ( 串长度 ) 加 1, 增加的一个字节用于存放字符串结束标志 '\0' 4 'a' 和 "a" 的区分如下 含义不同 'a' 是字符常量,"a" 是字符串常量, 两者虽然都只有一个字符, 但含义不同 在内存中的存储情况是不同的 'a' 在内存中占一个字节, 表示为,"a" 在内存中占两个字节, 表示为 同样的, 读者思考一下 0 '\0' '0' 与 "0" 的不同点与相同点? 我们可以从数据类型 存储值 所占字节等进行区分 0 为整型数字,'\0' 为转义字符,ASCII 码值为 0,'0' 为字符常量,ASCII 码值为 48,"0" 为一个字符 0 构成的字符串 5. 符号常量在 C 语言中, 可以定义一个标识符来表示一个常量, 称为符号常量 ( 宏常量 ) 符号常量的定义格式为 #define 常量名常量值其中,#define 是一条预处理命令 ( 预处理命令都以 # 开头 ), 称为宏定义命令, 其功能是把该常量名 ( 属于标识符 ) 定义为其后的常量值 一经定义, 以后在程序中所有出现该

43 第 2 章基本语法 语言描述与数据存储的简单方法 31 标识符的地方均以该常量值代之 关于预处理详细知识请参阅第 10 章内容 一般地, 符号常量的标识符用大写字母表示, 变量标识符用小写字母表示 例 2-4 符号常量的使用 #define PRICE 30 // 定义符号常量, 值为 30 int main() { int num, total; num=10; total=num* PRICE; printf(" total=%d", total); return 0; 程序运行结果如下 Total=300 由例 2-4 可以得出, 使用符号常量编写程序的优点是 : 符号常量代表的含义清晰明白, 易于修改 下面的程序及其运行结果留给读者自己分析 变量 #define PI int main() { float r, s; r=2.3; s=pi*r*r; printf("%f", s); return 0; 什么是变量? 为什么在编程时需要变量, 如何定义和使用变量? 通过前面知识的学习, 读者对这几个问题是否有清醒的认识和正确的解答? 如果清楚, 本部分内容可以跳过, 如果仍然不够清楚, 则请认真学习下面的内容 先回答什么是变量 为什么需要变量这两个问题 从字面理解变量是说明这个量会发生变化, 是可变的量 当一个程序处理数据时, 一般需要一些地方来临时存放它们, 不论是原始数据 中间计算结果还是最终结果都要先存放再处理 用来存放数据的地方为一段内存 ( 即一个或多个存储单元 ) 或一个或多个寄存器 (CPU 内 ) 通常情况下, 变量代表一个存储空间, 是存放数据的存储单元 变量的值 ( 即存储单元中存放的数据 ) 在程序的操作过程中是可以被改变的 为能够找到和操作这个数据, 应给这个单元起个名字, 这就是变量名 现在回答第三个问题 : 如何定义和使用变量? 正如住旅馆需要先登记房间一样, 使用变量存放数据也需要登记 C 语言规定 : 所 科学出版社职教技术出版中心

44 32 程序设计基础 基于问题情境的 C 语言实践教程 有变量必须先定义再使用 我们申请旅馆房间时需要考虑旅馆的位置和房间的型号, 那 么申请存放数据的单元需要考虑什么? 一要考虑存储单元的位置 : 是内存还是 CPU 中的寄存器 ; 二要考虑存放什么类型的数据 : 是整数 实数还是字符型数据 前者称为存储类型 ( 参见第 8 章 ), 后者称为数据类型 定义变量的语句格式如下 [ 存储类型 ] 数据类型变量名标识符 ; // 多个用逗号分隔, 中括号表示可选项 在下面的介绍中, 我们暂不考虑变量的存储类型, 省略存储类型表明变量存在内存的动态区域中 例 2-5 定义变量示例 int a; /* 定义标识符 a 为 int 型变量 */ unsigned long sum; /* 定义标识符 sum 为无符号长整型变量 */ float r; /* 定义标识符 r 为 float 型变量 */ char ch; /* 定义标识符 ch 为字符型变量 */ 说明 : 1 执行变量定义的语句实际上就是为变量分配其数据类型所需的内存空间 本例中, 系统为变量 a 分配 2 个字节的内存, 变量 sum 为 4 个字节, 变量 r 为 4 个字节, 变量 ch 为 1 个字节 2 在同一个语句中也可以定义两个及两个以上相同类型的变量 其中规定 : 变量名之间用逗号作为间隔符, 第一个变量名与数据类型关键字之间用空格 ( 空格的个数不限 ) 作为间隔符 例如,double x, y; 语句定义 x y 为 double 型变量, 即执行该语句时, 系统分别为 x 和 y 分配 4 个字节的内存用于存放双精度实数 3 变量的初始化是指定义变量的同时为变量提供初值 例如, int a=123, b, sum=0; /* a 初值为 123,b 没有给定初值, 具体何值不确定, 变量 sum 初值为 0 */ int b=13; // 该语句的作用等于 int b; 和 b=13; 两个语句, 但前者为说明语句, 后者为可执行语句 ( 参见第 3 章关于语句分类 ) 4 变量名的含义有两种 : 一是代表变量对应的存储单元 ; 二是代表存放的数据 ( 即变量的值 ) 在赋值运算符 = 左边的变量取第一种含义, 其他情况取第二种含义 例如, float r=1.5, x; x=r+3.1; 第一条语句中的 r 代表存储单元, 初值 1.5 存放到该单元中 ; 第二条语句的作用是将变量 r 的值 ( 即 r 里存放的数据 1.5) 加上 3.1, 得出的结果为 4.6, 将结果保存到变量 x 对应的存储单元里 5 变量的地址是指分配给变量的一段内存空间的第一个字节的内存地址 ( 或寄存器地址 ), 也就是该段内存的起始地址 变量的地址使用取地址运算符 & 求出 例如, &a 表示变量 a 的地址, 变量 sum 的地址可用 &sum 表示 为了便于读者理解, 变量对应的内存 变量的值 变量的地址可参见图 2-2

45 第 2 章基本语法 语言描述与数据存储的简单方法 33 图 2-2 变量的内存空间示意图 例 2-6 分析下面程序, 理解变量含义 #include<stdio.h> int main() { char ch1='a', ch2; float a; double b; ch2=ch1-32; a= e4; b= e4; printf("%c, %d\n", ch1, ch1); printf("%c, %d\n", ch2, ch2); printf("%f, %f", a, b); return 0; 请读者分析程序并上机调试运行, 分析运行结果 // 以字符和整数格式输出变量 ch1 的值 // 以字符和整数格式输出变量 ch2 的值 // 以实数格式输出变量 a, b 的值 注意字符型数据与 int 型整数的互运算, 实型变量数据的舍入误差 2.4 运算符与表达式 2.1 节已经简单介绍运算符和表达式是 C 语言的四个 单词 之一,C 语言强大功 能之体现就是有丰富的运算符 C 语言把除控制操作和输入 / 输出操作之外的所有操作都 作为运算符操作处理 一个运算符描述的是对数据进行的某种操作 表达式是指由数据和运算符构成的式 子, 其中仅有数据的式子是最简单的表达式 在表达式中, 数据也称为运算量或操作数, 可以是常量 变量或函数 例如, 二次方程求根公式在 C 语言中描述为 x1=(-b+sqrt(b*b-4*a*c))/(2*a) x2=(-b-sqrt(b*b-4*a*c))/(2*a) 科学出版社职教技术出版中心

46 34 程序设计基础 基于问题情境的 C 语言实践教程 其中,a b c 和 x1 x2 为变量,sqrt() 是求一个数的算术平方根库函数 ( 具体参见附录 E), 所用运算符均为算术运算符, 因此这个表达式为算术表达式 C 语言对于表达式的要求如下 1 必须在一行内书写, 没有上 ( 下 ) 角标 2 为保证运算次序, 必要时可以加小括号进行限定, 并且只能用小括号 3 不能出现 C 语言中不允许的字符, 如 等 根据运算符的性质可以分为算术运算符 关系运算符 逻辑运算符 赋值运算符 自增自减运算符 指针运算符 条件运算符 位运算符 逗号运算符 强制类型转换运算符 分量运算符 下标运算符 求字节运算符和函数调用运算符等 根据需要的操作数个数, 运算符又分为单目运算符 双目运算符和三目运算符 ( 只有条件运算符一个 ), 具体可参见附录 C 本章只讲解算术运算符 自增自减运算符 赋值运算符 逗号运算符和强制类型转换运算符, 其他运算符将在后续章节中介绍 算术运算符与算术表达式 1. 算术运算符基本算术运算符共有五个 :+( 加法运算符 ) ( 减法运算符或负值运算符 ) *( 乘法运算符 ) /( 除法运算符 ) 和 %( 求余运算符 ) 说明 : 1 + ( 减 ) * / % 都是双目运算符, 具有自左向右的结合性 * / % 运算符的优先级相同 (3 级 ),+ ( 减 ) 运算符的优先级相同 (4 级 ), 并且前者比后者优先级高 作为负值运算符时是单目运算符, 优先级更高 (2 级 ) 2 + ( 减 ) * / 的运算量可以是整型 实型甚至字符型 例如,4+8 'A' 1 8/5 5.5*4 等 3 求余运算符 % 要求两个运算量均为整型, 余数的符号与被除数相同 例如,5%2 的值为 1,15%( 7) 的值为 1, 而 ( 15)%7 的值为 -1,5.6%2 则是不正确的 4 两个整数相除, 结果仍为整数, 舍去小数部分 例如,6/4 的结果为整数 1, 而 6.0/4 6/4.0 和 6.0/4.0 的结果都是实数 负号运算符 : 符号 作为运算符时有两个含义, 一是表示 减法 操作, 二是表示 取负 操作 作为 减法 操作时需要两个运算量参与, 是双目运算符 ; 作为 取负 操作时只对一个运算量操作, 是单目运算符 单目运算符的优先级高于双目运算符 例如, 已知 a b 为变量, 那么语句 a= a* b+1; 等价于 a=( a)*( b)+1; 注意 : 两个运算符一般不能直接相邻 2. 算术表达式用算术运算符和小括号将运算量连接起来 符合 C 语言语法规则的式子, 称为 C 语言的算术表达式 例如,4+8 'A' 1 8/5 5.5*4 5%2 ( b+sqrt(b*b 4*a*c))/(2*a) 等都

47 第 2 章基本语法 语言描述与数据存储的简单方法 35 是正确的算术表达式, 而 5.6%2 是不合法的 C 语言算术表达式 在进行算术运算时, 应注意 : 如果运算符两侧运算量的数据类型不一致, 则应考虑数据类型的转换问题 赋值运算符与赋值表达式 1. 赋值运算符与赋值表达式 在 C 语言中, 符号 = 称为赋值运算符, 含有赋值运算符的表达式称为赋值表达 式, 其一般形式如下 变量名 = 表达式 说明 : 1 赋值号 = 的左边必须是一个变量名 ( 一般称为左值 ), 赋值号的右边必须是 C 语言中合法的表达式 2 赋值运算符的优先级只比逗号运算符高, 比其他所有运算符优先级别都低 (14 级 ) 赋值运算符具有右结合性 3 赋值运算的功能是先求出右边表达式的值, 然后把此值赋给左边的变量 确切地讲, 就是把数据 ( 表达式计算结果 ) 放入该变量的存储单元中去 4 赋值表达式的值就是被赋值的变量的值 例如, n=10 /* 把常量 10 赋给变量 n */ x=a+b /* 先计算 a+b 的值, 后将和赋给变量 x */ a=b=c=5 /* 可理解为 a=(b=(c=5)), 右结合, 从右向左计算 */ 5 赋值语句 : 在赋值表达式的末尾加上分号就构成赋值语句 例如,x=8; 和 a=b=c=5; 都是赋值语句 在 C 语言程序中, 赋值语句是用得最多的语句, 程序中的大部分计算功能是通过赋值语句完成的, 几乎每一个有实际功能的程序都有赋值语句 6 在定义变量时不允许连续赋值 例如,int a=b=c=5; 是不合法的, 正确的赋值方法为 int a=5, b=5, c=5; 或先定义 再赋值, 如 int a, b, c; a=b=c=5; 7 赋值运算时的类型转换问题 如果赋值运算符两边的数据类型不相同, 系统将自动进行类型转换, 即把赋值号右边的类型转换成左边的类型, 具体规定如下 实型数据 ( 包括单 双精度 ) 赋给整型变量时, 舍去实型的小数部分 如 x 为整型变量, 执行 x=1.61 后 x 的结果是 1, 在内存中以整数形式存储 整型数据赋给实型 ( 包括单 双精度 ) 变量时, 数值不变, 但将以浮点形式存储, 即增加小数部分 ( 小数部分的值为 0) 如将 1 赋给 float 型变量 m, 即执 科学出版社职教技术出版中心

48 36 程序设计基础 基于问题情境的 C 语言实践教程 行 m=1 后 m 的结果是 1.0 字符型数据赋给整型变量时, 由于字符型为一个字节, 而整型为两个字节, 故将字符的 ASCII 码值放到整型变量的低 8 位中, 高 8 位为 0 将一个 int short long 型数据赋给一个 char 型变量时, 只须将其低 8 位原封不动地送到 char 型变量中即可 例 2-7 分析下列程序 /* 赋值时类型转换示例 */ #include<stdio.h> int main() { int a, b=322; float x, y=8.88; char c1='a', c2; a=y; x=b; a=c1; c2=b; printf("%d, %f, %d, %c", a, x, a, c2); return 0; 本例表明了上述赋值运算中类型转换的规则 a 为整型, 被赋予实型变量 y 的值 8.88 后只取整数 8;x 为实型, 被赋予整型变量 b 的值 322 后增加了小数部分 ; 字符型变量 c1 赋给 a 变为整型, 整型变量 b 赋给 c2 后取其低 8 位成为字符型 (b 的低 8 位为 , 即十进制数 66, 作为 ASCII 码对应于字符 B) 8 赋值运算时的整型数据溢出问题 一个 int 型变量的最大取值为 32767, 如果取值大于 32767, 会出现溢出现象 例 2-8 分析下列程序 /* 溢出现象示例程序 */ int main() { int a, b; a=32767; b=a+1; printf("%d, %d\n", a, b); return 0; 该程序运行结果如下 32767, 因为,32767 的二进制表示为 的补码为 当 加 1 后的数值为 的补码形式, 虽然是由于溢出而使结果错误, 但编译时并不报错 所以, 在程序的数值计算过程中一定要注意数据溢出现象, 以免结果错误

49 第 2 章基本语法 语言描述与数据存储的简单方法 复合的赋值运算符和表达式在赋值号 = 之前加上某个双目运算符可构成复合赋值运算符 C 语言规定 : 可以使用十种复合赋值运算符, 其中与算术运算符有关的复合运算符 :+= - = *= /= %= ( 注意 : 两个符号之间不可以有空格, 也不能颠倒 ) 这些运算符是把 运算 和 赋值 两个动作结合在一起, 作为一个复合运算符来使用, 以达到简化程序书写 提高编译效率的目的 复合赋值运算符的优先级与赋值运算符的优先级相同 例如,a+=5 等价于 a=a+5,x*=y+7 等价于 x=x*(y+7),r%=p 等价于 r=r%p 复合赋值运算符 ( 也叫做自反运算符 ) 右边的表达式应作为一个整体对待 自增与自减运算符 i=i+1 i=i 1 自增 1 运算符记作 ++, 其功能是使变量值加 1 例如,++i 或 i++ 等价于 i+=1 或 自减 1 运算符记作, 其功能是使变量值减 1 例如, i 或 i 等价于 i =1 或 说明 : 1 自增 自减运算符均为单目运算符, 并且要求运算量只能是变量 2 当 ++ 出现在变量的左边时, 即 ++i i, 称为前缀形式 当出现在变量的右边时, 即 i++ i, 称为后缀形式 3 在表达式中, 一般先不考虑 ++ 的优先级, 而是去找它的运算量, 从而确定它是以前缀形式还是以后缀形式出现 如果以前缀形式出现, 则先将变量的值增 1( 或减 1), 然后再参与其他运算 ; 如果以后缀形式出现, 则先参与其他运算, 然后再将变量的值增 1( 或减 1) 例如, 已知 int a=5, x;, 执行语句 x=++a; 后, 变量 a 的值为 6,x 的值为 6; 而执行语句 x=a++; 后, 变量 a 的值为 6,x 的值为 5 4 当表达式中只有一个 ++ 或 运算时, 前缀和后缀形式相同 例如, 语句 ++i; 或 i++; 的功能完全一样 ( 对变量 i 的值而言 ), 但表达式是不同的 5 ++ 和 运算符的结合性为右结合 ( 自右向左 ) 例如, i++ 相当于 (i++) 6 编程建议 : 避免自加 自减运算符的 副作用 问题, 宁可使表达式简单而具体或用简单多步骤的语句 例如, 已知 a b c 为变量, 那么语句 :c=a+++b; 是等价于 c=(a++)+b; 还是等价于 c=a+(++b);? 从语法上分析似乎都可以 实际上, 在 Turbo C Visual C 编译系统中规定 : 将加号尽可能多地与左边的变量结合 因此, 语句 c=a+++b; 是等价于 c=(a++)+b; 的 再比如, 语句 c=a+++++b; 本身没有错误, 但编译系统却分析不出五个加号的作用, 在程序中应加上适当的括号, 如 c=(a++)+(++b); 也可以按顺序写成几条语句 :++b;c=a+b;a++;, 这样就不会产生不确定性问题 科学出版社职教技术出版中心

50 38 程序设计基础 基于问题情境的 C 语言实践教程 良好的设计风格提倡在一行语句中, 一个变量最多只能出现一次增 1 或减 1 运算, 提高可读性 复杂难懂的用法即使没有错误, 在不同的编译环境下可能会产生不同的运算结果 建议初学者不要将精力过多地放在分析含有多个加号的表达式上, 遇到复杂的情况, 上机调试就可弄清 逗号运算符与 sizeof 运算符 1. 逗号运算符及逗号表达式 在 C 语言中, 逗号, 的用法可以分为两种 : 一种是作为分隔符使用 ; 另一种是作为运算符使用 在变量定义语句中, 逗号作为变量之间的分隔符使用, 例如,float f1, f2, f3, f4; 除作分隔符使用之外, 逗号还可以作为运算符使用 将逗号作为运算符使用的情况, 通常是将若干个表达式用逗号运算符连接成一个逗号表达式, 它的一般形式如下 表达式 1, 表达式 2,, 表达式 n 其求解过程 : 先求解表达式 1, 再求解表达式 2, 最后求解表达式 n, 此逗号表达式的值为最右边表达式 n 的值 例如,1+1, 2+2, 3+3; 就是一个逗号表达式, 其值为 3+3, 即 6 依据逗号运算符的求值顺序, 逗号运算符也称为顺序求值运算符 逗号运算符在所有运算符中优先级最低 (15 级 ), 且具有左结合性 实际使用中, 经常用于把多条语句变成单一的逗号表达式语句, 以适应 C 语言控制格式要求 例如, 语句 y=1;x=2;z=x+y; 三条语句可以转换为 y=1, x=2, z=x+y; 一条语句, 而程序功能不变 需要注意的是, 由于逗号运算符的优先级最低, 所以, 下面两个表达式的作用是不同的 x=1+1, 2+2; x=(1+1, 2+2); 第一个表达式是逗号表达式,x 的值为 2, 表达式的值为 4; 而第二个表达式是赋值表达式, 它是将一个逗号表达式 (1+1, 2+2) 的值赋给变量 x, 由于此逗号表达式的值是 2+2, 所以 x 的值是 4 在许多情况下, 使用逗号表达式的目的仅仅是为了顺序得到各个表达式的值, 而不是要得到和使用整个逗号表达式的值

51 第 2 章基本语法 语言描述与数据存储的简单方法 39 例如, 可用如下逗号表达式语句交换 a 和 b 两个变量中的数值 :t=a, a=b, b=t; 例 2-9 分析下列程序的运行结果 /* 示例程序 */ int main() { int a=2, b=4, c=6, x, y; y=(x=a+b, b+c); printf("y=%d, x=%d", y, x); return 0; 程序运行结果如下 y=10, x=6 本例中,y 等于整个逗号表达式的值, 也就是表达式 b+c 的值,x 是第一个表达式 a+b 的值 2.sizeof 运算符 sizeof 运算符用于计算数据类型或变量对应内存的字节数 sizeof 后的括号内可以是数据类型关键字, 也可以是变量名 例如,sizeof(double) 的值为 8, 已知声明变量 int a;, 则 sizeof(a) 的值为 数据类型转换与强制类型转换符 在 C 语言的算术表达式 赋值表达式和函数应用中, 用到两种数据类型转换 1. 由系统自动完成的类型转换 由系统自动完成的不同类型数据间的转换也称为隐式转换, 一般在下列情况下发生 1 运算转换 不同类型数据混合运算时 2 赋值转换 把一个值赋给与其类型不同的变量时 3 输出转换 输出时转换成指定的输出格式类型进行输出 4 函数调用与返回转换 实参与形参类型不一致时转换, 返回结果类型转换 (1) 赋值表达式中的类型转换如果赋值运算符左侧变量的类型与右侧表达式的类型不一致, 赋值时将进行自动转换 转换的原则 : 将右侧表达式的值转换成左侧变量的类型 具体转换情形如表 2-5 所示 表 2-5 赋值中常见的类型转换结果 (32 位字长时 ) 目标类型表达式类型可能丢失的信息 signed char char 当值大于 127 时, 目标值为负 char short 高 8 位 char int(16 位 ) 高 8 位 科学出版社职教技术出版中心

52 40 程序设计基础 基于问题情境的 C 语言实践教程 续表 目标类型 表达式类型 可能丢失的信息 char int(32 位 ) 高 24 位 char long 高 24 位 short int(16) 无 short int(32) 高 16 位 int(16) long 高 16 位 int(32) long 无 float double 丧失精度, 结果舍入 double long double 丧失精度, 结果舍入 int float 小数部分, 某些情况下整数部分的精度也会丧失 从表格不难看出, 虽然 C 语言支持自动类型转换, 并为程序员带来方便 ( 比如取整运算 ), 但更多情况下是带来麻烦或隐蔽的错误, 建议读者小心应用 将取值范围小的类型转换为取值范围大的类型是安全的, 编程时选择适当的数据类型进行转换可避免信息丢失 类型溢出等错误 (2) 算术运算表达式中的类型转换 1 对类型相同的操作数进行运算, 结果类型与操作数类型相同, 如 7/5 的结果为 1 2 对类型不同的操作数进行运算时, 先要通过 类型提升 方法转换成同一类型, 然后再计算 C 语言编译器把所有操作数转换成占字节最大的操作数类型, 称为类型提升 类型提升的方法如图 2-3 所示, 具体分两种 横向表示必定的转换 char 和 short 一定先转换成 int 型,float 一定要先转换成 double 型再运算 例如, 一个 char 型与一个 float 型数据进行操作, 则操作前会把 char 型转成 int 型, 把 float 型转成 double 型, 然后按照下面的方式再进行操作时的类型转换 纵向表示不同类型操作数进行操作时的转换 例如, 一个 int 型和一个 long 型进行操作, 将把 int 型转成 long 型后再操作, 结果为 long 型 ; 一个 int 型与一个图 2-3 数据类型转换原则 double 型进行操作, 将先把 int 型转成 double 型再操作, 结果为 double 型

53 第 2 章基本语法 语言描述与数据存储的简单方法 41 这种类型自动转换原则称为 向高看齐 原则, 这里的高与低是指对应内 存的大小 纵向转换路径表明转换时向高看齐, 不代表转换的中间过程, 即 int 型不是一定要先转成 unsigned 型后才能转成 long 型 例如,8.0/5 或 8/5.0 的值与 8.0/5.0 的值一样, 都是 1.6 'B'-1 的值为 64('B' 的 ASCII 码为 65), 5.5*4 的值为 22.0 而不是 22 关于输出转换和函数调用时转换将在相关章节进行介绍 2. 使用强制类型转换运算符显式转换 C 的算术表达式中, 允许使用强制类型转换运算符, 其一般形式如下 ( 类型关键字 )( 表达式 ) // 左侧小括号为必须项 其功能是把表达式的运算结果强制转换成类型关键字所表示的数据类型 该运算符属于单目运算符, 与其他单目运算符优先级一样属于第 2 级 例如,(int)(x+y) 是把 x+y 的结果无论原来是什么类型, 一律强制转换为整型 说明 : 1 表达式 (int)5.6%3 是将 5.6 转换为整数 5, 再与 3 进行求余, 其值为 2 也就是说, 当类型标识符后面没有括号时, 只将后面的一个运算量转换为指定类型 2 类型标识符必须放在括号里, 例如,int5.6%3 是错误的 也就是说, 在算术表达式中, 如果出现表示数据类型的关键字, 则必须将其用括号括起来 3 需要说明的是, 在强制类型转换时, 得到一个所需类型的中间值, 原来变量的类型和值不发生变化 例如, 已知 int a=7; float x=2.5, y=5.7;, 则表达式 x+a%3*(int) y%2/4 的值为 2.5, 并且变量 y 的数据类型仍为 float, 值为 5.7 具体运算过程: 先将变量 y 的值转换为整数 5 后参与运算, 然后按照优先级,a%3 的值为 1,1*5 的值为 5,5%2 的值为 1, 1/4 的值为 0,x+0 的值为 2.5( 自动将 0 转换为 0.0) 2.5 小结 科学出版社职教技术出版中心 从语言的角度分析 C 语言程序, 具有如下层次 第一层为字符集 C 语言的字符集是 ASCII 码, 包括 52 个大小写英文字母,10 个数字 (0~9), 运算符号 标点符号和一些特殊符号 第二层为基本单词 它包括关键字 常量 变量 运算符与表达式和函数, 这一层为本章重点内容 第三层为由基本单词构成的语句, 在下一章讲解 最后一层为编写的程序, 在后续各章中进行讲解 C 语言基本数据类型有整型 实型 字符型 整型数据分为有符号和无符号两种, 每种又分为基本整型 短整型和长整型, 使用的关键字有 signed unsigned int short long 实型数据分为单精度和双精度, 关键字是 float 和 double 字符型的关键字是 char

54 42 程序设计基础 基于问题情境的 C 语言实践教程 常量的值在程序运行期间不会发生改变 C 语言的常量有整型 实型 字符型 字符串和符号常量 整型常量的表示有十进制 八进制和十六进制三种方法, 可以使用 0~ 9 负号( ) A~F 或 a~f 前缀(0 0x) 后缀(l 或 L U 或 u) 实数的表示除小数形式外还可以使用科学计数法 : 用 E 或 e 表示 10 字符常量是用一对单引号括起来的一个字符或一个转义序列 ; 转义序列是以 \ 开头, 后跟一个转义字符或几个数字 ; 例如,'\n' 表示键盘上的 Enter 键,'\t' 表示键盘上的 Tab 键,'\101' 表示 ASCII 码值用八进制表示是 101 的字符,'\x41' 表示 ASCII 码值用十六进制表示是 41 的字符,'\101' 和 '\x41' 都表示 ASCII 码值用十进制表示是 65 的字符 A, 即 'A' 字符串常量是用一对双引号括起的一组字符或转义序列 ; 字符串的长度是指组成字符串的字符个数, 如 'Ibm\n 的长度为 4(\n 是一个字符 ); 存储字符串时, 系统在依次存完每一个字符后会自动保存字符串的结束标志 ; 用 ASCII 码值为 0 的字符, 即 '\0' 作为字符串的结束标志 ; 存储字符串需要的内存大小为长度 +1 个字节, 使用 #define 定义符号常量 C 语言中的变量需要先定义再使用 每个内存变量对应一段内存区域 ( 即存储单元 ), 用来存储一个数据 ( 即变量的值 ), 该值在程序执行过程中是可以变化的 函数名 符号常量名和变量名等统称为标识符 C 语言的标识符是由字母 下划线和数字组成, 并且第一个字符不能为数字 运算符描述的是对数据进行的操作 表达式是指由数据项和运算符组成的式子, 其中的数据项也称为运算量或操作数 C 语言的运算符分为以下几类 : 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 条件运算符 逗号运算符 指针运算符 求字节数运算符 强制类型转换运算符以及一些特殊的运算符, 其中位运算符 关系运算符 逻辑运算符 条件运算符和指针运算符不在本章介绍 根据运算符需要的运算量不同,C 语言将运算符分为单目运算符 双目运算符和三目运算符 表达式运算要考虑运算符的优先级和结合性 单目运算 ( 取负 ++ 等 ) 赋值运算以及复合赋值是右结合性, 其他都是左结合性 单目运算符的优先级高于双目运算符, 算术运算符高于关系运算符, 逗号运算符优先级最低, 次之为赋值运算符 附录 C 有详细列表 双目运算时要考虑数据类型的转换问题 转换方式有两种 : 自动转换和强制转换

55 第 3 章编程语句 简单程序构建的方法 内容提要与自学导引 内容提要 : 本章从程序结构角度和语言角度出发, 介绍 C 语言的第三个层次及构成 C 语言函数的基本成分 : 语句, 包括语句含义 分类和几种基本语句格式和应用特点, 重点和难点为输入和输出函数 自学导引 : 通过本章学习, 要求在进一步巩固 C 语言 单词 和程序结构基础上掌握 C 语言程序的基本语句和实现输入 输出的方法 掌握在 Visual C 环境下, 编写简单程序并编译 连接 执行和调试操作的方法 学习重点 :C 语言语句分类, 赋值语句 复合语句使用, 输入函数格式运用, 输出函数格式运用 考核知识点说明 1. 语句含义 语句分类, 达到 识记 层次 1 语句的含义 2 语句的分类 3 语句作用和使用方法 2. 理解各种语句, 达到 应用 层次 1 表达式语句 2 控制语句 3 赋值语句 4 复合语句 5 空语句 3. 输入 / 输出函数, 达到 熟练应用 层次 1 字符输入函数 2 格式输入函数 3 字符输出函数 4 格式输出函数 科学出版社职教技术出版中心

56 44 程序设计基础 基于问题情境的 C 语言实践教程 回顾前面两章的知识, 第 1 章从计算机系统 软件 程序 程序设计语言到 C 语言的顺序和思路介绍了计算机的发展 语言的发展和学习 C 语言的目的, 重点给读者介绍了 C 语言程序的结构以及初步设计思路和基本上机操作方法 第 2 章从语言的角度介绍了 C 语言的程序构成要素和基本语法规则 从基本字符集到第二层次的 单词, 分类介绍了 C 语言的语法规则, 并要求按这些规则编写程序 本章在前两章基础上, 继续介绍构成 C 语言程序基本单位 函数的主要成分 : 语句 介绍语句含义 分类和几种简单语句的使用方法, 然后介绍基本输入 / 输出的方法, 为初步进行程序设计奠定基础 3.1 C 语言的语句及分类 前面的知识告诉我们,C 语言程序文件由一个或多个函数构成, 函数由语句构成, 包括说明变量和函数的语句 执行语句两部分 程序的功能是由执行语句实现的 什么是语句,C 语言有哪些类别的语句? 语句 (Sentence) 就是一个在语法上自成体系的单位, 它由一个词或句法上有关联的一组词构成, 表达一种主张 疑问 命令 愿望或感叹 C 语言的语句由 C 语言的 单词 构成, 用来向计算机系统发出操作命令, 以实现相应功能 C 语句可分为以下六类 1 说明语句 2 表达式语句 3 函数调用语句 4 控制语句 5 复合语句 6 空语句 因为单独的函数也是表达式, 因此有的教材把函数调用语句也归类到表达式语句 值得读者特别注意的是,C 语言的一条语句 ( 复合语句除外 ), 必须在最后出现分号, 分号是语句不可缺少的一部分 下面分别介绍六类语句 1. 说明语句说明语句用来申请变量或声明将要使用的函数 ( 参见第 8 章函数 ) 比如变量定义语句 int x, y, z;, 由类型关键字后接一个或多个变量名 ( 由逗号分隔 ) 和分号构成 说明语句一般放在函数体声明部分, 编译时处理, 但在程序运行时不会执行 2. 表达式语句表达式语句由表达式加上分号 ; 组成 其一般形式为表达式 ;

57 第 3 章编程语句 简单程序构建的方法 45 执行表达式语句就是计算表达式的值 例如, x=y+z;// 赋值表达式构成的赋值语句, 表达式的值就是变量 x 的值 y+z; // 加法运算语句, 但计算结果不能保留, 故无实际意义 i++; // 自增 1 语句, 使 i 值增 1 x=3, y=5, z=x+y; // 逗号表达式语句 3. 函数调用语句 由一个函数调用 ( 函数名 实际参数 ) 加上分号 ; 组成, 其一般形式为 函数名 ( 实际参数表 ) ; 执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数, 然后执行被调函数体中的语句, 求取函数值或实现函数的功能 例如, 调用库函数, 实现输入 / 输出 scanf("%d", &x); // 由格式输入函数 + 分号构成, 实现从键盘输入整数给变量 x printf("%d", x); // 由格式输出函数 + 分号构成, 实现把变量 x 的值输出到显示器上 printf("\n*******************************"); // 输出一行星号 特别指出的是, 从某种意义上说函数调用语句也属于表达式语句, 因为函数调用也属于表达式的一种 4. 控制语句 控制语句用于规定语句执行顺序, 控制程序的流程, 以实现程序的各种结构方式 它们由特定的语句定义符组成 C 语言有九种控制语句, 可分成以下三类 1 条件判断语句 :if 语句 switch 语句 2 循环执行语句 :do-while 语句 while 语句 for 语句 3 转向语句 :break 语句 goto 语句 ( 此语句尽量少用, 因为这不利于结构化程序设计, 滥用它会使程序流程无规律 可读性差 ) continue 语句 return 语句 上述九种语句是程序设计的关键, 具体格式和功能将在后面的章节中讲解 5. 复合语句 上述各类语句都是单一语句 有的时候需要把多条语句作为一个整体看待, 就需要用到复合语句 把多条语句用括号 { 和 括起来组成的语句称为复合语句, 也称为块语句或语句块 其一般形式为 { 语句 1 语句 2 语句 3 语句 n // 各条语句按顺序书写, 可写在同一行, 也可分行书写 // 右大括号后没有分号 实际编程时, 构成复合语句的各条语句在逻辑上有关联性, 形成一个整体 例如, 科学出版社职教技术出版中心

58 46 程序设计基础 基于问题情境的 C 语言实践教程 构造一个复合语句, 实现两个变量内容的互换 复合语句为 { int x=3, y=4, temp; tmp=x; x=y; y=temp; 在程序中应把复合语句看成是单条语句, 而不是多条语句 凡是单条语句可以出现的地方, 都可以出现复合语句 复合语句作为一条语句, 又可以出现在其他复合语句中 复合语句内的各条语句均以分号 ; 结尾, 但在括号 外不能加分号 在复合语句块中声明的变量, 只能在复合语句中使用 6. 空语句 只有分号 ; 组成的语句称为空语句 空语句是什么也不执行的语句 在程序中空语句可用来作空循环体 例如,while(getchar()!='\n') ; 语句的功能是, 只要从键盘输入的字符不是回车符则重新输入 这里的循环体为空语句 再如,for(i=1;i<=1000;i++) ; 循环体仍为空语句, 起延时的作用 采用自顶向下方法设计程序时, 对一些未设计完成的模块, 通常放一条空语句, 留待以后对模块进行逐步求精实现时再进行扩充 例如, int main() { Pt(); // 调用自定义函数 Mk(); // 调用自定义函数 return 0; void Pt() { ; // 空语句 void Mk() { ; // 空语句 3.2 基本输入 / 输出函数 什么是输入, 什么是输出?

59 第 3 章编程语句 简单程序构建的方法 47 所谓输入 / 输出, 是以计算机主机为参照而言 从计算机向显示器 打印机等设备提 供数据, 称为输出 ; 从键盘 鼠标 扫描仪等设备向计算机提供数据, 称为输入 在 C 语言中, 实现输入 / 输出操作是通过调用 C 语言本身提供的标准输入 / 输出库函数实现的 函数后加分号 ; 就形成了输入 / 输出语句 在使用标准输入 / 输出函数时, 要在程序的 开头加上文件包含命令 : 或 #include<stdio.h> #include "stdio.h" 它的作用 : 将标准输入 / 输出函数的头文件 (stdio.h) 包含到用户源文件中, 其中文件扩展名 h 为 head 之意,stdio 代表 standard input & output C 语言中文本的输入 / 输出是作为字符文本流来处理的, 不管它从何处输入, 输出到何处 文本流是由一行行字符组成的字符序列, 每行字符由 0 到多个字符组成, 后跟一个换行符, 整个文本流的最后跟一个结束符 ( 详见第 9 章 ) 字符输入 / 输出函数 getchar() 和 putchar() 是两个最简单的输入 / 输出函数, 专门用于单个字符的输入与输出 1.getchar() getchar() 用于从键盘读取单个字符 其格式为 getchar() // 没有参数 getchar() 函数的值就是从输入设备得到一个字符, 并且只得到一个字符 如果要想得到多个字符, 就要多次用本函数 实际使用时, 除用户输入指定字符外, 会等待用户单击 Enter 键, 待击键后将读取的字符送到计算机中 在应用编程时, 往往把函数返回值送给一个字符或整数类型变量 例如, ch=getchar(); 这样, 输入的字符就送到变量 ch 中, 否则得到的字符只能存在于键盘缓冲区中而无法使用 例 3-1 从键盘输入三个英文字符 a b 和 c, 并依次同行内输出 问题分析 : 如何输入三个英文字母? 如何保存? 如何输出? 处理方法 : 用字符输入函数实现输入, 输入后分别存到变量中, 用字符输出函数实 现输出 参考程序 : #include<stdio.h> int main() { char ch1, ch2, ch3; ch1=getchar(); 科学出版社职教技术出版中心 // 定义三个字符变量 // 从键盘输入一个字符并存到 ch1 中

60 48 程序设计基础 基于问题情境的 C 语言实践教程 ch2=getchar(); ch3=getchar(); printf("%c%c%c\n", ch1, ch2, ch3); return 0; // 按字符方式顺序输出三个字符 程序调试运行后, 若连续输入 abc, 然后按 Enter 键, 则程序运行结果如下 abc 若分别输入 a b 和 c ( 符号代表回车符, 下同 ), 则程序运行结果如下 a b 读者会问, 为什么是这样的结果? 下面我们详细分析一下程序运行的过程 程序的执行是顺序进行的, 即先从第一条可执行语句 ch1=getchar(); 开始执行, 直到 结束 执行第一条可执行语句时, 键盘缓冲区放置字符 a 和回车符,ch1 保存字符 a; 再执行第二条语句时,ch2 得到的不是输入的字符 b, 而是存放在键盘缓冲区内的回车符 ; 同理, 键入的字符 b 被第三条语句得到存于 ch3 中, 因此输出的结果如上 注意, 键盘缓冲区中存放的信息串是 a b c, 而 getchar() 函数并不是一一对应地取得字符数据, 而是从键盘缓冲区中自左向右顺序读取 ( 这被称为数据流 ) 执行 getchar() 函数时, 不仅能从输入设备获得一个可显示的字符数据, 而且可以获得屏幕上无法显示的控制字符信息 事实上, 本函数是从输入键盘缓冲区取得一个字符的 使用时不管输入几个字符 什么样的字符, 只要按 Enter 键后就会把输入的字符放入键盘缓冲区, 并激活本函数, 实现从左侧起, 每个 getchar() 函数读取一个字符 如果输入 a b c, 如何修改程序, 确保输出与例 3-1 相同? 例 3-1 程序应该修改如下 #include<stdio.h> int main() { char ch1, ch2, ch3; ch1=getchar(); getchar(); ch2=getchar(); getchar(); ch3=getchar(); printf("%c%c%c\n", ch1, ch2, ch3); return 0; // 定义三个字符变量 // 从键盘输入一个字符并存到 ch1 中 // 从键盘输入一个字符并存到 ch2 中 // 从键盘输入一个字符并存到 ch3 中 // 按字符方式顺序输出三个字符

61 第 3 章编程语句 简单程序构建的方法 49 修改后的程序不论输入 a, b, c 还是 a b c, 结果都输出 abc 请读者分析原因 知识拓展 Turbo C 等编译程序还提供 getch() 和 getche() 交互式字符输入函数, 这两个函数 在头文件 conio.h 中定义 getch() 的功能是击键之后立即返回且不回显 ;getche() 的 功能是击键后返回, 但回显 实际编程时使用二者比 getchar() 更好 2.putchar() putchar() 用于向显示器输出一个字符 其格式为 putchar( 数值 字符常量或字符型 数值型变量 ) putchar() 函数的功能就是把参数所表达的数值 字符常量或变量的值 ( 字符 ) 输出到显示器上 实际使用时, 参数还可以是一个 getchar() 函数或其他返回值为字符类型的函数 例 3-2 putchar() 函数应用 #include<stdio.h> int main() { char ch1='a', ch2; int y=98; ch2=getchar(); putchar(ch1); putchar( \n ) putchar(ch2); putchar(getchar()); // 定义两个字符变量, 并给 ch1 赋初值 // 定义一个整型变量并赋初值 // 从键盘输入一个字符并存到 ch2 中 // 输出 ch1 存储的字符 a // 输出换行 // 输出 ch2 存储的字符 // 输出从键盘得到的字符 putchar(y); // 输出整型变量 y 存储的值所对应的字符 ( 为小写字母 b, 可查 ASCII 码表 ) putchar(65); // 输出 65 作为 ASCII 码时所对应的字符 A return 0; 程序调试运行, 并从键盘输入 AB 后, 则程序运行结果如下 a ABbA 请读者用 putchar() 函数修改例 3-1 程序, 仍然确保原样的输出 putchar( 参数 ) 函数的参数若为整型变量或常量, 值应在 0~127 范围内, 否 则不能正确输出 科学出版社职教技术出版中心

62 50 程序设计基础 基于问题情境的 C 语言实践教程 什么情况下用 getchar() 和 putchar() 函数比较好? 例 3-3 从键盘输入一个大写字母, 转换成小写字母后输出 问题分析 : 如何输入一个大写英文字母? 如何保存和转换? 如何输出? 处理方法 : 用字符输入 / 输出函数实现输入和输出, 大写变小写用大写字符 +32 参考程序 : #include<stdio.h> int main() { char ch1; // 定义一个字符变量 ch1=getchar(); // 从键盘输入一个字符并存到 ch1 中 ( 确保是大写字母 ) ch1+=32; // 实现大写转成小写字母, 因为二者 ASCII 码差距为 32 printf("%c\n", ch1); // 按字符方式输出字符, 然后回车换行 putchar(ch1); // 输出变量 ch1 内存放的字符 return 0; 程序调试运行后, 若输入字符 A, 则程序运行结果如下 a a 从结果可以看到, 两种输出方法结果相同 功能一致 格式输入 / 输出函数 在前面章节的例题中, 已经用到了格式输入 / 输出函数 scanf() 和 printf(), 用于实现数据的基本输入和简单输出, 但用到的只是简单情况下的应用 在没有深入学习这两个函数之前, 请先看下面这个程序 例 3-4 输入一个整数半径, 以单精度数形式输出圆的面积 参考程序 : #include<stdio.h> int main() { int r; float s=0; printf("please input a number and then press Enter:"); scanf("%d", &r); s= *r*r; printf("circle area is: "); printf("area=%f\n", s); return 0;

63 第 3 章编程语句 简单程序构建的方法 51 读者分析本例程序, 思考输入函数的作用是什么? 函数使用什么格式? 程序执行时如何输入数据? 输入的数据不是整型数据会如何? 输出函数的功能和格式有什么不同? 为了回答上述问题, 我们先来学习这两个格式输入 / 输出函数 1.printf 函数 printf() 函数的功能是按照设计的格式向终端 ( 主要指显示器 ) 输出一个或多个指定类型的数据 其一般形式为 printf( 格式控制参数, 输出项 1, 输出项 2, ) 函数参数可以是一个参数 ( 即格式控制参数 ), 也可以是多个参数, 其他参数都是将要输出的信息, 为输出项 格式控制参数以字符串的形式描述, 所以也称 格式控制字符串 它由两种成分组成 : 普通字符和格式说明信息 普通字符 ( 包括转义符序列 ) 将被简单地原样显示 ( 或执行 ), 而一个格式说明项将引起一个输出参数项的转换与显示 如上例中的输出函数语句 : printf("circle area is:"); printf("area=%f\n", s); 第一行输出只有格式控制字符串, 但没有包含格式说明信息, 只有普通字符, 所以原样输出显示 ; 第二行第一部分是格式控制参数, 由格式说明项 %f 和普通信息 area= 以及 \n 两部分构成, 实际输出时, 普通部分原样输出,%f 所在位置, 被变量 s 的值按照单精度类型格式显示 若输入半径为 10, 则这两行显示结果如下 Circle area is: area= 格式说明项是由 % 引出并以一个类型描述符结束的字符串, 中间是一些可选的附加说明项, 其完整格式为 % 0 m.n l/h 格式字符 (1) 指定输出类型 (2) 输出长度修正 (3) 指定输出域宽及精度 ( 小数位数 ) (4) 指定空位是否填 0, 默认不填 0 (5) 指定是否左对齐输出, 默认右对齐 (6) 格式说明的起始符号 可选部分 说明 : 格式输出时,(1) 和 (6) 是必选项,(2)~(5) 为可选项, 根据使用需求进行添加 科学出版社职教技术出版中心

64 52 程序设计基础 基于问题情境的 C 语言实践教程 (1) 格式字符格式字符用以指定输出项的数据类型和输出格式, 格式字符应与其对应的输出项的类型一致 表 3-1 给出了 printf 函数中主要的格式字符的意义及其用法示例 表 3-1 格式字符 格式字符 输出形式 举 例 输出结果 d(i) 带符号的十进制整数 int a=123;printf("%d", a); 123 x(x) 十六进制整数 int a=123;printf("%x", a); 7B O 八进制整数 int a=123;printf("%o", a); 173 u 不带符号的十进制整数 int a= 1;printf("%u", a); c 单一字符 char a=69;printf("%c", a); E s 字符串 char a[]="123";printf("%s", a); 123 e(e) 指数型式的浮点小数 float a= ;printf("%e", a) e+002 f 小数形式的浮点数 float a= ; printf("%f", a); g(g) e 和 f 中较短一种不印无效 0 float= ; printf("%g", a) % 百分号本身 printf("%%"); % 说明 : 1 格式符 d 或 i: 按十进制整数实际长度输出, 正号不显示 2 格式符 o 和 x(x): 按照八 十六进制输出, 不带符号 3 格式符 f: 可输出单 双精度的数, 隐含输出六位小数, 整数部分全部输出 4 格式符 e(e): 以指数形式输出, 如 Visual C 等编译系统会自动给出数字部分的小数位数为六位, 指数部分占五位 ( 如 e+002, 共占 5 列 ), 数值按标准化指数形式输出 ( 即小数点前有且只有一位非零数字 ) 5 格式符 g(g): 自动选取 f 或 e 格式输出, 但选择其中长度较短的格式, 并且不输出无意义的 0 值得注意的是, 对于格式符中的小写或大写字符, 输出时也同样是小写或大写 例 3-5 分析程序, 写出运行结果 #include<stdio.h> int main() { int a=123, b=10, c=-1; char ch= A ; float x= ; printf("%d, %d\n", a, b); printf("%x, %o\n", a, a); printf("%d, %u, %x, %o\n", c, c, c, c); printf("%f, %e, %g, %E", x, x, x, x); return 0;

65 第 3 章编程语句 简单程序构建的方法 53 程序运行结果如下 ( 不同字长机器结果会有不同 ) 123, 10 7b, 173-1, 65535, ffff, , e+002, , E+002 为便于阅读, 想使例 3-5 中输出的数据占据指定的列宽, 并且小数位数为 2 位, 左对齐输出, 该如何解决? 如何输出 long 型数据? (2) 长度修正符对整型来说,d x o u 是指 int 型 ; 对实型来说,e f g 是指 float 型或 double 型 为了能适应不同长度的数据, 可在格式字符前面加一个长度修正符 1 l: 若输出 long 型数据, 用 %ld %lx %lo %lu; 若输出 long double 型数据, 用 %lf 格式 2 h: 若输出 short 型数据, 用 %hd %hx %ho %hu 格式 例如, int x=6; long y=120000; float a=1.2; double b= ; printf("%d, %ld, %f, %f", x, y, a, b); 程序运行结果如下 6, , , (3) 域宽及精度描述符 m.n 1 m: 指域宽, 即对应的输出项在输出设备上所占的最少列数 ( 字符数 ) 若实际 数据宽度大于 m, 则按实际输出,m 为正整数 2 n: 指精度, 用于说明输出的实型数的小数位数 不指定 n 时, 隐含的精度为 n=6 位 对于字符串, 用于从字符串左侧开始截取字符的个数 n 为大于等于 0 的整数 例如, int x=600; float a= ; double b= ; printf("%d, %2d, %6d, %3.2f, %8.2f, %.3f", x, x, x, a, a, b); 程序运行结果如下 600, 600, 600, 1.23, 1.23, (4) 数 0 用以指定数字前的空位是否用 0 填补 有此项则空位以 0 填补, 无此项则空位用空格填补 科学出版社职教技术出版中心

66 54 程序设计基础 基于问题情境的 C 语言实践教程 例如, int x=1234; printf("%d, %08d, %8d", x, x, x); 程序运行结果如下 1234, , 1234 (5) 负号用以指定输出项是否左对齐输出不加负号或加正号时为右对齐输出, 但有正号时输出会显示 + 例如, int x=1234; printf("%d, %-8d,%08d, %+8d", x, x, x, x); 程序运行结果如下 1234, 1234, , (6)# 号修饰符用于修饰 e f g 时, 可确保输出的数据有小数点 ( 即使无小数位时 ); 用于修饰 x o 时, 确保输出的十六进制和八进制有前导特征符号 0x 和 0 例如, int x=12;float y=123; printf("%d, %x, %o, %#x, %#o, %#f", x, x, x, x, y); 程序运行结果如下 12, c, 14, 0xc, 014, 123. 提请读者注意的是, 格式输出函数的格式符和修饰符比较多, 也比较繁琐, 刚开始学习时不易掌握 比较好的方法是通过大量上机实践印证来理解和掌握, 特别是对于经常使用的格式, 通过编写和调试程序方面的积累, 最终就会越来越熟练 2. 格式输入函数 scanf 函数的功能是按格式参数的要求, 从终端 ( 键盘 ) 上把数据传送到地址参数所指定的内存空间中 其一般形式为 scanf( 格式控制参数, 地址 1, 地址 2, ) 格式控制参数与 printf() 函数基本相同, 不同的是后面的参数用变量地址方式, 地址是通过对变量名 求地址 运算 ( 参见第 7 章 ) 得到的, 求地址的运算符为 & scanf 函数的格式控制参数有两种成分 : 格式说明项和输入分隔符 (1) 格式说明项 scanf 的格式说明项基本组成如下

67 第 3 章编程语句 简单程序构建的方法 55 % * m l\h 格式字符 (1) 输入数据类型和格式 (2) 长度修正说明符 (3) 域宽说明符可选部分 (4) 赋值抑制符 (5) 格式说明的起始符号 这里格式字符的使用与 printf 函数中的使用方法相同 把输入数据分为整型 (int 型, 用 d o x 指定 ) 字符或字符串型( 用 c 或 s 指定 ) 实型(float 型, 用 f e(e) g(g) 指定 ) 在整型与实型中可再加长度修正符 h( 短整型 ) 或 l( 长整型及长双精度型 ) m ( 注意没有 n) 用以指定输入数据的宽度 (2) 输入流数据分隔 ( 本部分是难点内容 ) 1 根据格式字符的含义从输入流中取得数据, 当输入流中数据类型与格式字符要求不符合时, 就认为这一数据项结束 2 根据格式项中指定的域宽分隔出数据项 3 空格 跳格符 ( \t ) 换行符( \n ) 都是 C 语言认定的数据分隔符 ( 输入为字符型的除外 ) 回车符既是分隔符, 也是结束符 4 使用用户自己指定的字符 ( 必须是非格式字符 ) 来分隔数据 这时应在格式控制参数中的相应位置上出现这些字符, 输入时也必须输入这些字符 例 3-6 写出下列程序运行结果 #include<stdio.h> int main() { int x, y, z; float a, b; scanf("x=%d, %d%d", &x, &y, &z); // 从键盘输入数据时非格式符 "x=" 和逗号 // 必须输入 scanf("%4f%f", &a, &b); printf("%d, %d, %d\n", x, y, z); printf("a=%.2f, b=%f", a, b); return 0; 执行本例程序时, 若输入数据为 x=3, 程序运行结果如下 科学出版社职教技术出版中心

68 56 程序设计基础 基于问题情境的 C 语言实践教程 3, 345, 546 a= , b= 程序结果分析 : 1 键盘缓冲区内存储的数据流为 x=3, 回车换行 回车换行, 因为逗号 空格 回车都是分隔符, 同时认为这些分隔符的类型与输入类型不符, 同时 x= 和, 是需要原样输入的普通字符, 因此, 会顺序把数据 和 546 送到对应变量 x y 和 z 中 2 由于变量 a 对应的输入格式是 %4f, 则会把数据 截取前 4 位给变量 a, 其余给变量 b 3 需要注意的是第一个输入函数中, 前两个格式符间用逗号间隔, 逗号虽然有分隔作用, 但输入时必须输入这个逗号, 否则错误 4 对于控制符相邻的形式, 如 %d%d, 往往用空格或回车符分隔输入的数据 (3) 抑制字符 * 它的作用是按格式对应从数据流中读入数据后不送给任何变量, 即 虚读, 目的是移动键盘缓冲区指针指导其他数据处 例 3-7 写出下列程序运行结果 #include<stdio.h> int main() { int x, y, z; scanf("%d%d%d", &x, &y, &z); printf("%d, %d, %d\n", x, y, z); scanf("%4d%*2d%2d%d", &x, &y, &z); printf("%d, %d, %d\n", x, y, z); return 0; 程序执行时, 先输入 后, 再输入 , 则程序运行结果如下 12,34, ,78,90000 程序结果分析 : 1 第一次输入的数据以空格分隔, 最后回车结束, 则对应送给三个变量, 并按序输出显示 2 第二次输入的数据没有分隔, 输入缓冲区中存放的就是一个连续的数据流, 如何区分? 从输入格式看, 首先 %4d 会从左截取 4 位给变量 x, 再 %*2d 会继续读取 2 位, 但没有给变量 b 和 c, 继续按 %2d 读取值 78, 则送给变量 b, 最后剩余的数据 送给变量 c (4)scanf 函数执行时结束情况 scanf() 中在执行时遇到下面两种情况后结束

69 第 3 章编程语句 简单程序构建的方法 57 1 正常结束 格式参数中的格式项用完时正常结束 2 非正常结束 发生格式项与输入域不匹配时非正常结束 例如, int x, y;scanf("%d%d", &x, &y); 若输入时输入值为 12, 34, 会导致不匹配错误 对程序语句 scanf("%d, %d", &x, &y); 若输入 12 34, 也会导致不匹配错误 scanf() 函数格式控制参数中除格式说明外, 若有其他字符 ( 包括空格 ), 则输入时必须原样输入 若没有其他字符, 如 %d%d%d 格式时, 才使用空格 回车等作为分隔符 为实现以任意字符作为修饰符的目的, 格式控制串可改为 %d%*c%d 等形式, 这样不论两个数据间有什么修饰符都将被屏蔽忽略 编程建议 : 1 用最简单的输入方式, 确保正确是首要目的 2 用户输入时应严格按照数据类型要求进行输入, 确保类型 顺序 个数一致, 以避免不必要的错误出现 因为 C 语言编译器并不检查 类型不匹配 错误, 为达到此目的, 要求程序员编程时尽可能加入提示信息和检查验证手段 ( 一般通过检验输入函数返回值 ) 3 可以使用 fflush() 函数来清除输入 / 输出缓冲区的方式配合检查 4 输入函数格式控制串中不要含有 '\n' 等转义字符, 避免导致输入不能正常结束 5 输入函数输入实型数据时, 不要在格式控制串中规定精度 需要读者注意的是,scanf() 和 printf() 函数, 都有一个返回值, 但实际使用时一般并不用这个返回值, 而是更关注函数的功能 函数返回值往往用于检验程序正确性, 真正健壮性好的程序都会通过这个方法进行错误检验, 以确保程序执行正确 读者可参见例 典型例题解析 例 3-8 分析程序, 写出程序运行的结果 #include<stdio.h> int main() { short x=-1; float y= ; double z= ; int a=123; 科学出版社职教技术出版中心

70 58 程序设计基础 基于问题情境的 C 语言实践教程 printf("%6d\n%06d\n%-6d\n%2d\n%c\n", a, a, a, a, a); printf("%%d:%d\n %%u:%u\n %%o:%o\n %%x:%#x\n", x, x, x, x); printf("%c%s",'t', "his is a book. "); printf("%f\n%9.3f\n%f\n%e\n%g\n", y, y, z, z, z); printf("%.3s,","abcdefghijk"); return 0; 运行结果及原因分析 : 123 占 6 列, 大于实际位数, 右对齐, 左补空格 格式中有前导 0, 因此左侧空位补 域宽为负数, 左对齐, 仍占 6 位, 右补空格 123 域宽小于数的实际宽度, 按实际位数输出 { 输出 ASCII 为 123 所对应的字符 { %d:-1 双百分号 %% 表示显示一个 %, 后面的控制符和冒号原样输出 %u:65535 按无符号数输出 %o: 按八进制形式输出 %x:0xffff 按十六进制形式输出, 由于有附加控制符 #, 显示特征标志 0x This is a book. 连续输出一个字符和一个字符串 按小数标准格式输出, 小数部分默认 6 位 域宽为 9 位, 小数部分占 3 位输出, 默认右对齐 %f 格式可以输出 double 型数据 e+012 按标准指数形式输出 e+012 按最简单格式输出, 有效位数为 7 位 ( 含小数点 ) abc 从字符串左侧截取 3 位输出 例 3-9 写出下列程序运行结果 #include<stdio.h> int main() { long x; short y; int v, w; float m, n; scanf("%ld, %hd, %*d, %3d", &x, &y, &v, &w); // 变量 w 没有得到数据 scanf("%f, %e", &m, &n); printf("%ld\n%hd\n%d\n", x, y, v); printf("%f\n%e\n", m, n); return 0; 程序运行时, 输入信息如下 65666,32768,12345, ,12.34e2 程序运行结果如下 输入与输出的都是长整数

71 第 3 章编程语句 简单程序构建的方法 输入与输出的都是短整数, 数会发生变化 543 输入数据宽度超过 3 位时会截取前 3 位给变量 v e+003 例 3-10 阅读下面程序, 并回答问题 #include<stdio.h> int main() { int x, y; scanf("%d %d", &x, &y); printf("x=%d, y=%d\n", x, y); return 0; 问题 1: 当要求输出结果为 x=12,y=34 时, 如何输入数据? 解答 : 输入 问题 2: 若输入数据方式为 12,34, 如何修改输入语句? 解答 : 输入语句修改为 scanf("%d, %d", &x, &y); 问题 3: 若输入数据方式为 1234, 而使 x 存储 12,y 存储 34, 如何修改输入语句? 解答 : 输入语句修改为 scanf("%2d %d", &x, &y); 问题 4: 若输入数据方式为 x=12, y=34, 如何修改输入语句? 解答 : 输入语句修改为 scanf("x=%d, y= %d", &x, &y); 问题 5: 若输入数据方式为如下形式, 如何修改输入语句? 解答 : 输入语句修改为 scanf("%d %d", &x, &y); 问题 6: 如何修改输入语句, 可以使用任意一个字符作为分隔符? 解答 : 输入语句修改为 scanf("%d%*c %d", &x, &y); 问题 7: 若输入数据方式为 , 而使 x 存储 123,y 存储 7, 如何修改输入语句? 解答 : 输入语句修改为 scanf("%3d%*3d %d", &x, &y); 问题 8: 若输出结果为 x="12", y=34% 时, 该如何修改程序? 解答 : 输入方式同问题 1, 输出语句修改为 printf("x=\"%d\", y=%d%%", x, y); 例 3-11 从键盘输入任意两个一般整数, 完成两数的四则运算并输出结果 输入要求 : 数 1+ 操作符 + 数 2, 输出为数 1+ 操作符 + 数 2= 结果 请编写程序 参考程序 : #include<stdio.h> int main() { int data1, data2; char op; 科学出版社职教技术出版中心

72 60 程序设计基础 基于问题情境的 C 语言实践教程 printf("please enter the expression data1+operate+data2\n"); scanf("%d%c%d", &data1, &op, &data2); // 实现两个数和操作符的输入 if(op=='+') //if 语句为条件判断语句, 如果操作符是加号, 则执行下面输出 // 语句 下同 printf("%d%c%d=%d\n", data1, op, data2, data1+data2); if(op=='-') printf("%d%c%d=%d\n", data1, op, data2, data1-data2); if(op=='*') printf("%d%c%d=%d\n", data1, op, data2, data1*data2); if(op=='/') printf("%d%c%d=%d\n", data1, op, data2, data1/data2); else printf("input operate error!"); //else 为不满足条件的情况判断 return 0; 例 3-12 输入两个一般整数, 并打印 若用户不慎输入非法字符, 程序将提示 输入数据类型错误 参考程序 : #include<stdio.h> int main() { int a, b, ret; printf("please input a int data:"); ret=scanf("%d%d", &a, &b); // 得到输入函数返回值 if(ret==0) // 判断是否遇到非法字符输入 { printf("input data type error!\n"); // 是非法字符, 则显示相关信息 fflush(stdin); // 清除输入缓冲区的错误数据 else if(ret!=2) { printf("input error!\n"); fflush(stdin); else if(ret==eof) printf("input failure occurs!\n"); else printf("a=%d, b=%d\n", a, b); // 检验返回的数据项个数, 如果有任何一个错误, 返回值都不正确 // 判断是否调用失败 // 输出调用失败时的相关信息 // 输出正确输入得到的数据 需要读者注意的是, 采用 if(ret!=2) 判断比 if(ret==0) 判断要好 因为对于任何形式的非法输入, 都会导致提前结束, 输入函数的返回值不可能是输入项的个数 ( 本例是 2) 3.4 小结 除说明语句外,C 语言用得最多的就是表达式语句和流程控制语句 我们把由表达

73 第 3 章编程语句 简单程序构建的方法 61 式组成的语句称为表达式语句 一般表达式语句是由一个表达式后接一个分号组成的, 赋值语句 函数语句都属于表达式语句 分号是语句中不可缺少的一部分, 而任何表达式包括函数调用均可以加上分号成为语句, 这是 C 语言的特色之一 C 语言是一种表达式语言, 在 C 语言的程序中, 所有的操作运算都是通过表达式来实现的 除表达式语句外, 还有大 小两个极端情况 : 复合语句和空语句 这些语句的执行都被流程控制语句所控制 按功能,C 语言中的基本语句可归纳如图 3-1 所示 图 3-1 C 语言语句 到现在为止, 我们已经知道 C 语言的语句主要分为说明语句 ( 包括变量定义和函数原型声明等 ) 赋值语句 函数调用语句 表达式语句 流程控制语句 复合语句 空语句和其他语句 ( 含编译预处理 类型定义语句等 ) 等八类 能否熟练地进行程序编写关键在于对主要语句格式 功能等方面的掌握程度, 读者应结合教材内容, 通过实际编程训练, 加强对各种语句的理解和掌握, 为后续课程的学习奠定基础 本章所学的两类输入 / 输出函数是最基本的输入 / 输出处理实现方法, 读者需特别注意函数的功能 格式和使用注意事项 特别是对于两个输入函数 getchar() 和 scanf() 的使用有一些特别注意的地方应强化记忆和熟练使用, 确保编程不出问题 有些编译系统要求使用 getchar() 和 putchar() 函数必须包含 stdio.h 头文件, 使用格式化输入 / 输出函数可以不用加载头文件 科学出版社职教技术出版中心

74 第 4 章算法 程序设计的核心 内容提要与自学导引 内容提要 : 通过本章学习, 要求了解结构化程序的三种基本结构 ; 深入理解算法的概念, 掌握算法描述的常用方法和结构化设计思想, 能正确分析问题和用算法工具描述问题, 并设计简单顺序结构的程序 自学导引 : 结合前面三章知识, 本章开始重点探讨程序设计的方法, 读者在学习本章时, 必须结合 如何进行程序设计解决现实问题? 这个命题进行学习 进一步掌握程序结构, 学会顺序程序设计方法 ( 比如如何声明变量 如何实现输入 / 输出等 ) 和算法分析与设计的方法以及描述方法 考核知识点说明 1. 三种基本的程序结构, 达到 识记 层次 1 顺序结构的特点 2 选择结构的特点 3 循环结构的特点 2. 算法的概念和特点, 达到 理解 层次 1 算法的概念 2 算法的特点 3 算法的评价 3. 算法描述方法, 达到 简单应用 层次 1 用自然语言描述算法 2 用流程图或 NS 图描述算法 4. 结构化程序设计思想, 达到 领会 层次 5. 面向对象程序设计思想, 达到 了解 层次

75 第 4 章算法 程序设计的核心 63 从自然语言角度来说, 程序是对解决某个问题的方法步骤的描述 ; 从计算机角度来说, 程序是用某种计算机能理解并执行的计算机语言描述解决问题的方法步骤 编写程序的目的是解决现实中的实际问题 用我们学习和掌握的程序设计语言编写解决现实问题的程序是我们这门课程的出发点和落脚点 那么, 如何才能实现编写程序解决实际问题呢? 也就是在编程时要关心哪些问题? 如何描述和解决这些问题? 4.1 程序设计与算法概述 通过前三章知识的学习, 我们已经掌握如下几点 (1) 程序 (Program)= 数据结构 (Data Struct)+ 算法 (Algorithm) 这个公式告诉我们编程解决问题是通过处理数据实现问题求解, 处理数据的关键是数据结构的描述和处理 ; 求解的关键是算法的设计和步骤实现 所谓 数据结构 就是要告诉程序要用到哪些数据 哪种类型的数据 数据间的关系以及数据存储方法 比如已经介绍的数据类型和变量声明就是数据结构的简单体现, 后续章节所涉及的数组 结构体 文件等都是数据结构方面的知识 所谓 算法 就是计算机解题所进行操作的步骤, 是程序的逻辑抽象, 是解决问题的数学过程 比如生产一辆车, 原材料和配件就是数据, 生产过程就是算法 这里特别强调用 计算机 解题, 因为编程是一种 把一件事情交给计算机去做 的行为, 这个行为通过程序语言加以描述 现实生活中的算法 ( 方法步骤 ) 与计算机中的算法不同, 计算机中要求算法更细致 更具体, 而生活中的算法往往比较笼统 算法设计是编程前必须要做的事, 解决 做什么 和 如何做 的问题, 然后程序再根据算法实现出来, 因此算法是程序设计的灵魂 如果原本就不知道如何去做, 那么更不要期望去理解想要做什么和如何做的问题了 (2)C 语言本身的语法规则 C 语言从基本字符集出发到关键字 标识符 常量 变量 函数和表达式等基本 单词, 再到基本语句, 结合具体的语言规则和要求就构成 C 语言的程序 其中, 对各个单词和语句的书写格式要求和运算 执行方法的要求是所有编程者必须遵守的规则 (3)C 语言程序的组成要素和设计 调试步骤函数是构成程序的基本单位, 语句是构成函数的基本单位 函数用于实现某一项功能, 语句用于体现完成这个功能所进行操作的详细步骤 程序设计过程包括分析 设计 编码 测试 排错 文档编写等阶段 掌握上述内容是否就可以编程? 实际上还需要掌握程序设计方法 每个问题都有解决的方法步骤 ( 算法 ), 有的问题算法很简单 很直接, 有的问题需要进行数学模型变换和等效化简, 直至有解决问题的公式或具体方法为止 数据结构是用来分析问题里面的数据和数据间的关系, 通过分析找出内在的联系, 并给出存储方法 编程语言是实现解决问题逻辑的具体工具 有了工具, 有了解决方法, 知道数据如何存 科学出版社职教技术出版中心

76 64 程序设计基础 基于问题情境的 C 语言实践教程 储, 最后的问题就是具体运用工具解决问题, 这就是程序设计 因此, 算法 数据结构 程序设计方法和编程语言是程序设计人员必须要具备的知识, 称为程序设计 四要素 程序的特点是有始有终, 每个步骤都能操作, 所有步骤执行完, 对应问题就能得到解决 程序设计就是分析解决问题的方法步骤, 并将其记录下来的过程 一个初级程序员对于一个简单的问题, 若要用计算机解决, 具体步骤大致如下 1 确定待解决问题的计算或处理方法 2 将实际问题转变为一个数学问题, 用数学模型 ( 表达式 ) 描述 3 编制程序框图, 确定程序结构 4 选择计算机语言和它的工作模式 5 编制程序 6 上机编辑 调试 ( 包括编译和连接 ), 消除语法错误 7 如果结果正确则生成最终的用户程序, 否则返回 1 从头再来, 找出逻辑或设计错误所在 对于一个大型软件来说, 在它的设计过程中会涉及许多复杂的问题, 所以仅仅采用上面的步骤是不够的, 必须按软件工程的方法来设计 需特别指出的是, 初学者在编程时必须注重所编程序的格式, 保证可读性, 并加入可能多的注释 为体现上述方法步骤, 我们先看一个例子 例 4-1 输入三角形三个边的值, 计算这个三角形的面积 问题分析 : 1) 问题要求是输入三个边的值, 输出的是三角形面积值 2) 如何输入? 如何计算和输出? 3) 输入的是什么类型的值, 输出类型 精度如何? 4) 输入值错误 ( 不能构成三角形 ) 如何解决? 问题处理 ( 算法设计 ): 1) 思考实际问题是否能够数学等效? 是否有具体公式对应? s 1 ( a b c ) 2 area s ( s a) ( s b) ( s c) 2) 先确定三个边值的类型和范围, 输出值的类型, 确定数据结构, 即所用变量类型 个数和名称的确定 3) 确定输入边值错误时的解决办法, 给出避免错误的方法 4) 给出解决问题的方法步骤 ( 算法 ) 1 申请五个存储数据的空间, 包括一个存放中间结果数据的空间 2 输入三个边值 3 确定输入的值是否正确, 是否能构成三角形? 4 若能, 则按照公式计算面积 ; 若不能, 则确定是退出还是重新输入 5 若输入正确, 则显示面积值 ; 否则显示错误提示 结束程序运行

77 第 4 章算法 程序设计的核心 65 算法描述如图 4-1 所示 图 4-1 计算三角形面积流程图 程序实现 : #include<stdio.h> #include<math.h> // 由于使用开平方函数, 需要这个数学头文件 int main() { int a, b, c; // 假定三个边长值为一般整型 float s, area; scanf("%d, %d, %d", &a, &b, &c); if(" 不能构成三角形 "){printf("input error!");return 0; else { s=(a+b+c)/2.0; // 除数为实数是为了确保精度 area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("area=%.2f", area); return 0; 上述四个步骤概括了程序设计的方法和解题过程, 体现了变量等数据结构的设计和 算法步骤的设计, 并通过图示方式表达, 最后通过具体程序代码实现 上述过程中, 每个环节都包括正确性的检查和错误的处理, 因为保证正确性是软件的核心 4.2 程序设计思想 科学出版社职教技术出版中心 如何进行程序设计, 通过什么思想形式体现程序设计的方法?

78 66 程序设计基础 基于问题情境的 C 语言实践教程 这些年来, 计算机专家们在软件开发领域一直进行不断的探索, 努力寻找最简洁 最高效 最适用的软件设计方法 不论有多少种方法 ( 业界没有统一的定论 ), 但有两种方法已经得到大家的认可和执行, 就是面向过程的思想方法和面向对象的思想方法 结构化程序设计思想面向过程的设计思想, 就是面向解决问题的过程, 通过分析细化问题, 逐步得到求解 一般又称为 结构化的程序设计思想 或 模块化程序设计思想 分而治之 是一种解决复杂问题的常用方法 大问题可以分解为若干关联的小问题, 小问题又可以分解为若干更小 更具体的问题 把小问题逐一求解, 大问题就得到解决 这种思想往往采用以下方法解决问题 1 自顶向下 逐步细化 2 模块化 3 结构化编码 自顶向下 逐步细化 就是从一个大问题出发, 往下逐步分解, 由宏观到微观, 由一般问题到具体细节实现等进行有序 有层次 有步骤的分析, 最终在编写程序前, 给出所有方法步骤的细节 例如 : 计算学院教师的平均工资 这个任务比较复杂, 可分解为如下几点 1) 找出每个教师的收入 2) 计算共有多少教师 3) 计算工资总额 4) 计算平均工资 对于第 3) 步又可再细分为以下几点 1 找出一位教师档案 2 读出工资数额 3 累计求和 4 重复上述三步骤 对于 1 可再次进一步细分为如下几点 A. 打开档案 B. 找出正确记录 C. 从磁盘读取数据 采用这种方法考虑问题比较周全, 结构清晰, 层次分明, 便于验证算法的正确性 设计时由上往下, 实现时由下往上 大问题如何分解为小问题? 采用的方法是进行模块化 功能分解, 即按照问题的功能进行模块划分, 把相近功能的任务放到一个模块中 比如一个工资管理系统, 按照功能一般可分为数据输入模块 计算处理模块 信息查询模块 报表打印模块和后台数据库修改以及备份删除模块等 对于数据输入模块仍可以继续划分, 如分为人员情况录入子模块 效益工资录入子模块 加班录入模块等

79 第 4 章算法 程序设计的核心 67 按功能进行模块划分的原则是 高内聚 低耦合 高内聚 表示模块功能必须单一, 构成该模块的各子模块必须为模块功能提供支持, 完成相关任务功能, 不能存在与此无关的子模块 低耦合 表示模块之间的关系松散, 每个模块简单 独立, 模块间互不影响 耦合 度是评价模块见彼此影响的程度的指标 做到 高内聚 低耦合 的方法就是要做到信息隐藏, 本模块的信息尽量不要与其 他模块信息产生联系 ( 除非必要 ), 同时把不需要调用者知道的信息都包装在模块内部, 隐藏起来, 给外界和外部使用者尽可能简单的信息和便捷的使用方法 C 语言是通过模块和函数来支持这一思想的, 比如我们使用库函数和函数库带来的方便就是一例 *4.2.2 面向对象的程序设计思想 真正利用结构化程序设计思想编写的软件, 数据与程序是分开存储的, 编程的主要技巧在于追踪哪些函数调用哪些函数, 哪些数据发生了变化 当数据量很大时, 这种方法使程序变得越来越难以理解, 而且程序扩充性差, 可重用性差 面向对象程序设计的本质是把数据与处理数据的过程当成一个整体 对象 传统的面向过程程序设计是把程序看成一系列函数的集合, 而面向对象程序设计可以看作是一系列对象的集合, 每个对象都可以接受数据 处理数据并将数据传达给其他对象 每个对象都是一个负责任的 角色, 由这些角色的不同分工完成一个问题的求解 比如教务管理系统有教师 学生 管理员 课程等不同类别的对象, 每类对象既有属性又有操作, 对象间相互关联 相互制约, 由此构成一个管理软件 以下是面向对象设计思想中的几个基本概念 (1) 类世界上任何事物都是分类管理的, 同类别之间有很多相同的行为特征, 同类间还可以细分成各个子类 类 (Class) 定义了一类事物的抽象特点, 包括事物的属性和它具有的行为 ( 称为方法 ) 比如汽车 房屋是两个不同的 类, 分别有不同的属性 ( 尺寸 颜色 ) 和方法 ( 汽车的前进 倒退, 房屋的开门 关门等 ) 类向下可细分成子类, 向上可有父类 比如 轿车 类是 汽车 的子类, 是 奥迪车 类的父类 (2) 对象对象 (Object) 是类的实例, 是某个类别的具体化的事物 比如汽车类描述了汽车这一类运输工具的特点和行为, 而 奥迪 A6 子类则是更具体描述这一品牌型号的车的特点和行为, 用户具体购买的那台 奥迪 A6 车就是一个对象, 它具有这个类的全部属性和行为特征 (3) 方法方法 (Method) 是一个类能做的事情 在一个类中会描述这个类所有的方法 程序员用类生成对象后可以根据需要使用这些方法 编写处理问题的程序通过方法体现 (4) 继承性和重用性子类会有父类的属性和行为, 也会有自己独有的属性和行为 前者就称为继承 科学出版社职教技术出版中心

80 68 程序设计基础 基于问题情境的 C 语言实践教程 (Inheritance) 一个类有多个子类, 每个子类都继承父类的属性和行为, 同时又有有别于其他子类的属性和行为, 由此构成千差万别的事物 由这些类所派生的对象也就千差万别 各具形态 对于一个类而言, 无论派生多少对象, 都自动具有所对应类的属性和行为特征, 而不用程序员重新编写, 这就是程序的重用性 除以上几种重要属性外, 面向对象的设计思想方法还有封装性 多态性 抽象性等显著特点, 充分体现了程序设计的智能型 灵活性 可扩充性和可维护性, 使程序更加便于分析 设计 理解, 是目前最为广泛使用的方法 比较主流的面向对象程序设计语言有 Java C++ C# 等 4.3 程序基本结构 结构化程序设计方法是指不论什么程序, 都由下列三种基本结构之一或组合构成 这三种基本结构是顺序结构 选择结构和循环结构 顺序结构顺序结构是最简单的结构, 也是必要的结构形式 因为解决问题的方法步骤是按序进行的, 对应采用程序设计语言描述就成为顺序结构程序, 执行的顺序是自上而下, 依次执行 例如, 给定圆的半径, 计算面积这个程序, 算法是先输入半径 再计算面积, 最后输出面积值, 对应程序的语句顺序也是上述这个顺序 程序如下 #include<stdio.h> int main() { int r; float s; scanf("%d", &r); s= *r*r; printf("s=%f", s); return 0; // 定义变量, 确定数据结构 // 输入 // 处理 // 输出 // 返回操作系统 在上述顺序结构中, 根据书写语句的先后顺序执行, 所有语句只能被执行一次, 且保证不存在没有被执行的语句 选择结构对于计算圆面积这个例子, 如果程序执行时输入负数是对还是错? 程序能否执行? 若输入负数, 比如 -10, 程序将正常执行, 执行的结果和输入 +10 一样为 这就出现了 合理不合情 的问题 : 合理是指符合 C 语言语法规则, 因为 -10 也是符合语法规则要求的整数 ; 但不合情, 因为圆半径不应该为负数 再举一个例子 : 给定三角形三边的长度, 计算三角形的面积 这个例子仍然存在需要判断给定的三个边值是否能

81 第 4 章算法 程序设计的核心 69 构成三角形的问题, 若能构成三角形, 才能计算面积, 否则, 要么重新输入, 要么提示错误后退出程序执行 因此, 在具体解决某个问题时, 不论是输入 处理, 还是输出等, 都有可能进行某种限定条件的判断, 并根据判断结果选择进行某种操作, 这就是程序的选择结构 选择结构改变了顺序执行的方式, 并不能保证每个语句都被执行, 而是根据条件有选择地执行 循环结构 先看一个问题 : 计算 1~100 相加之和, 如何用计算机解决这个问题? 可以有如下几种办法 1 顺序计算 100 次, 每次加一个加数, 加数的变化是从 1~100 设定一个存放和的变量 sum, 初值为 0, 顺序执行 :sum=sum+1, sum=sum+2,, 直到 sum=sum+100 为止 2 利用数学特性进行化简, 实现首尾相加, 进行 50 次运算 ; 直接化简为 sum=101 50, 只要一步即可 再看一个例子 : 输入任意 100 个一般整数相加求和 这个问题可以用上述方法 2 化简执行吗? 显然不可以 只能用方法 1 顺序进行 100 次输入 100 次相加, 但这样编写的程序会很长 很繁琐 能否有更简单的办法? 我们分析问题的解决方法, 实质是重复 100 次执行 输入 相加 操作, 只不过每次给的加数不同 那么在控制操作执行时, 可否在执行完一次输入 相加后返回来再次执行输入 相加呢? 实际上, 只要我们能把语句执行顺序改变, 使这两个操作重复执行就可以达到目的 采用这种想法编写的程序就称为循环结构程序 C 语言专门有相应的控制语句实现循环控制 使用循环结构使程序员编写程序比顺序重复书写更加简洁, 但并不会改变程序执行时间 实际上, 不论什么问题, 编程时都可以用上述三种结构组合实现 任何问题解决都有始有终, 因此宏观上看顺序结构是必然的, 微观上会有条件判断选择处理和循环处理的问题 从模块化设计的角度看, 可以分成三种模块 : 顺序模块 选择分支模块和循环模块 程序设计要求对应模块最好单入单出, 体现 多内聚, 少耦合 的思想 这就像电视 空调等许多设备一样, 我们编写的算法 程序应该给使用者以 黑箱子 的感觉, 让他们通过简单的外部特性, 比较方便的连接使用即可 ( 如电视连接 DVD 音响等设备), 而内部真实 复杂的操作细节应尽可能封装 4.4 算法特性与描述方法 我们已经知道, 算法是为解决一个实际问题而采取的计算机能够执行的 确定的方法和有限的步骤 对于不同问题, 可能有相同或不同的算法, 对于同一问题, 也可能有 科学出版社职教技术出版中心

82 70 程序设计基础 基于问题情境的 C 语言实践教程 不同的算法 利用计算机解题, 一般有两类算法 : 数值计算算法和非数值计算算法 数值计算是指求数值解的问题 ( 如计算方程根, 求最大公约数等 ), 往往有现成的模型 计算方法和公式对应 非数值计算主要解决需要用分析推理 逻辑推导才能解决的问题 由于种类繁多 要求各异, 只有一些典型的非数值计算方法 ( 如排序 查找算法等 ), 许多问题需要设计解决问题的专门算法 设计一个算法后, 如何衡量算法是正确的呢? 解决一个问题的多个算法如何判定优劣? 算法的特性 1. 有穷性算法包含的操作步骤是有限的, 每一步都应在合理的时间内完成 一个有效的算法, 应该在合理的限度内完成操作 比如计算圆的面积算法, 程序需要执行 1 个小时就是不合理的限度 2. 确定性算法中的每一步应该是确定的, 而不应当是含糊的 模棱两可的和歧义的 例如,x 大于等于 0 时输出 Yes,x 小于等于 0 时输出 No, 执行时就产生歧义 : 当 x 等于 0 时是输出 Yes 还是输出 No? 再比如体育课上有个动作 : 手举过头顶, 这个步骤就是不确定的, 是左手 右手还是双手举过头顶? 举过头顶多少厘米? 不同的人就会有不同的理解 因此, 算法中的每一步应该不能被解释成不同的含义, 要具有唯一的 明确无误的含义 3. 有效性 ( 可行性 ) 算法中的每一步应该能有效执行, 且能得到确定的结果 如 b=0, 执行 a/b 是不可行的 同样对一个负数取对数也是不可行的, 是无效的操作步骤 4. 有零个或多个输入输入是计算机在执行算法时, 需要从外界得到必要的信息 有些算法不需要从外界输入数据, 如计算 5 的阶乘 (5!); 有些算法需要从外界输入一到多个数据, 如计算任意整数 n 的阶乘 (n!); 再如给定三个系数, 计算二次方程实数根等 5. 有一个到多个输出算法的目的是求得问题的解 ( 计算结果 ), 而解只有输出才有意义, 但需指出的是并非让我们看到的屏幕输出或打印输出才是输出, 一个算法得到的结果就是输出 比如调用函数比较两个数并得到大数的算法语句为 max=max(a, b);, 函数 Max() 的返回值 ( 处理结果 ) 赋值给变量 max 就是一种输出

83 第 4 章算法 程序设计的核心 算法描述方法 只有正确 合理的描述算法, 才能准确表达解决问题的方法步骤, 才能与他人交流 合作, 改进算法和最终编写程序 为了表达一个算法, 可以有不同的方法 常用的有自然语言 传统流程图 NS 结构化流程图 伪代码以及用计算机语言 ( 最准确的描述 ) 1. 自然语言描述 自然语言 (Natural Language) 就是人们日常生活中使用的语言, 可以是汉语 英语或其他语言, 也可以掺杂数学符号等 比如本章例 4-1 的算法, 用自然语言描述 : 第一步, 输入三个边值 ; 第二步, 计算三角形的面积 ; 最后一步, 输出面积值 进一步可细化为更加具体步骤 ( 参见例 4-1 算法设计部分 ) 用自然语言描述通俗易懂, 但往往无法准确 细致, 导致歧义出现, 另外用自然语言描述选择分支和循环不太方便 因此, 除比较简单问题外, 一般不用自然语言描述 2. 传统流程图描述 流程图 (Flow Chart) 是一个描述程序的控制流程和指令执行顺序的有向图, 是程序一种直观的表现形式 建议初学者养成编写程序前先画图的习惯, 通过流程图使你的算法思想和实现步骤得以体现, 便于检查 修改和交流 美国国家标准化协会 ANSI(American National Standard Institute) 规定了一些常用的图形符号, 用于描述算法流程, 构成流程图 具体如图 4-2 所示 图 4-2 基本流程图符号及含义 前面例 4-1 中的算法描述就是用传统流程图实现的 下面给出顺序结构 选择结构和 NS 结构化流程图描述 (1) 顺序结构先执行处理模块 A, 再执行处理模块 B, 如图 4-3 所示 (2) 选择结构根据给定的限定条件进行判别, 决定执行模块 A 还是模块 B( 如图 4-4 所示 ) 有时可能没有模块 A 或 B, 即当条件成立或不成立时可能什么都不执行, 直接进入下一个步骤 科学出版社职教技术出版中心

84 72 程序设计基础 基于问题情境的 C 语言实践教程 图 4-3 顺序结构 图 4-4 选择结构 (3) 循环结构如图 4-5(a) 所示为循环结构中的直到型 (Until) 循环 : 先执行模块 A, 若条件不满足, 继续重复执行模块 A, 直到条件满足为止 如图 4-5(b) 所示为当型 (While) 循环 : 先判断条件, 当条件成立时执行模块 A, 然后继续判断条件, 如果成立就重复执行模块 A, 当条件不成立时就退出循环 图 4-5 循环结构以上三种基本结构流程图中, 每一个都用虚框套起来, 不管里面如何进行条件判断或重复执行, 从虚框外面看是一个入口 一个出口, 从模块化设计思想看, 满足多内聚少耦合的要求, 是模块化设计思想的较好体现 三种结构有机结合就实现了复杂问题解决算法的流程 3.NS 结构化流程图传统流程图描述算法比较直观 形象, 算法逻辑流程一目了然, 便于理解 但由于使用流程线, 流程可以任意转移, 不仅画起来麻烦, 也会造成阅读和修改的困难 NS 图完全取消了流程线, 不允许有随意的控制流, 全部算法写在一个矩形框内, 确保结构化 模块化设计思想的体现 NS 图也由三种基本结构图组成, 如图 4-6 所示

85 第 4 章算法 程序设计的核心 73 图 4-6 NS 结构化流程图基本结构符号 例 4-2 用传统流程图和 NS 结构化流程图分别描述 求三个整数中的最大值 的算法 问题分析 : 求三个整数最大值方法很多, 但都需要通过判断解决 具体步骤如下 1 输入三个整数 2 通过判断比较, 找出最大值 3 输出最大值, 然后结束 算法设计 : 本例的关键是如何比较找到最大值 方法很多, 这里给出一种做法如下 1 先设定一个变量 max 用于保存最大值 2 把先输入的第一个数作为最大值放入 max 变量中 3 把第二个输入的数与最大值量 max 进行比较, 若比 max 中值大, 则放入 max 中 4 同样进行第三个数与 max 的比较, 并保存最大值 5 最后输出最大值 算法流程图描述 : 如图 4-7 和图 4-8 所示 4. 伪代码描述 伪代码 (Pseudo Code) 是用介于自然语言和计算机语言之间的文字和符号表示算法, 即程序设计语言具有的关键字用英文表示, 其他的可用汉字 英文 数字和公式等表示, 便于书写和阅读即可 用此方法描述算法并无格式要求, 只要简单 清晰 易懂 例 4-3 用伪代码描述例 4-2 问题的算法 开始申请四个变量 a, b, c, max, 其中 max 用于存放最大值先后从键盘输入三个整数给变量 a, b, c a->ax 当 b max 时, 继续进行比较, 否则执行 b->max 继续判断 : 当 c>max 时, 执行 c->max 输出 max 的值结束 科学出版社职教技术出版中心

86 74 程序设计基础 基于问题情境的 C 语言实践教程 图 4-7 例 4-2 流程图图 4-8 例 4-2 NS 结构化流程图 5. 用计算机语言描述 用计算机语言描述算法, 应该是上述步骤完成后的最后一步, 也是最精确的一步 这一步的描述要求必须按照程序设计语言的语法规则编写规范的程序代码 ( 参见附录 F), 只有这样才能上机调试和运行 例 4-2 问题的 C 语言程序代码描述如下 #include<stdio.h> int main() { int a, b, c, max; scanf("%d, %d, %d", &a, &b, &c); max=a; if(b>max)max=b; if(c>max)max=c; printf("max=%d\n", max); return 0; 作为初学者, 当学习编程方法和进行编程训练时, 建议先从第一步自然语言描述开始, 当通过自然语言理清思路和算法步骤后, 再用第二步或第三步流程图表达出来 ; 通过流程图既可以体现处理问题的思路步骤, 也方便检查和交流 ; 最后再用程序设计语言

87 第 4 章算法 程序设计的核心 75 对应流程图书写程序 这样, 可确保思路清晰, 编写的程序正确无误, 即便有错误, 也容易查找和解决 算法分析与评价 解决一个问题可能会有多个算法, 哪个算法是优秀的, 哪个算法是不好的, 如何评价? 通常设计一个 好 的算法应该达到下列指标规定的要求 1. 正确性 对于一个问题 ( 特别是大型问题 ) 的需求, 一般会以特定的规格说明方式给出, 哪怕是一个小问题, 也至少应当包括对于输入 输出和加工处理等的明确的 无歧义性的描述 算法应当满足具体问题的需求, 设计和选择算法应该正确反映这种需求, 这样的算法可以称为是正确的 一般对 正确 一词的理解, 可分以下四个层次 1 程序不含语法错误 2 程序对于几组输入数据能够得到满足规格说明要求的结果 3 程序对于精心选择的典型 苛刻而带有刁难性的几组输入数据能够得到满足规格说明要求的结果 4 程序对于一切合法的输入数据都能够得到满足规格说明要求的结果 第 1 层次是调试程序确保能够执行的需要, 结果对错与否不能保证 ; 第 2 层次说明程序基本没有逻辑错误, 但对于边缘数据 特殊数据等还没有检验, 不能说明程序不会出现大问题 ; 第 3 层次是软件开发中 软件测试 环节所采用的方法, 是判断能否达到商品化软件标准的要求 ; 第 4 层次是理想化的要求, 一般无法达到 2. 可读性 现在的软件开发, 一般都是由多人分工协作完成, 需要团队成员的共同合作 算法主要是为了人的阅读与交流, 其次才是机器执行 只有可读性好的软件才能有助于他人对算法的理解, 有助于程序代码的实现 另外, 晦涩难懂的程序易于隐藏较多错误, 难于调试和改进 提高可读性的方法一般有两点 : 一是严格遵循程序代码编写规范要求编写程序 ; 二是添加必要的注释 3. 健壮性 当输入非法数据时, 算法程序能做出适当的反映 ( 如显示输入错误提示等 ) 或针对性的处理, 而不会产生莫名其妙的输出结果或不可控的执行, 这样的程序就是具有健壮性的 程序中健壮性的体现一般通过输入处理检查和错误过滤等方式进行把关, 并通过调用解决问题模块进行处理 4. 高效率 算法效率指的是算法执行所使用的时间 ( 一般为 ns 纳秒级 ) 对于一个问题, 如果 科学出版社职教技术出版中心

88 76 程序设计基础 基于问题情境的 C 语言实践教程 有多个算法可以解决, 执行时间最短的效率最高 一个算法的时间估算用 时间复杂度 来度量, 往往是问题规模 n 的某个函数 f(n) 由于无法仔细计算一个算法的确切时间, 一般都用时间范围和变化趋势函数去度量, 由此分为常量级 线性级 指数级 对数级和平方级等多种时间变化形式 5. 低存储量一个算法程序代码需要存储空间, 处理的数据也需要存储空间, 算法执行时还需要额外的存储空间 ( 比如存放中间结果等 ) 算法存储量需求一般指算法执行过程中所需要的最大存储空间 一个好的算法应该少占用内存和寄存器资源, 尽量节省存储空间为好 算法空间度量方法与时间度量类似, 对于时间 空间复杂度的度量, 读者可参阅数据结构课程知识 4.5 小结 本章知识告诉我们以下几个道理 1 算法是程序设计的核心 想编程解决问题, 仅仅掌握好程序设计语言是不够的, 还必须明白解决问题的思路和方法步骤 2 描述算法的方法有很多, 编写程序是最后一种方法, 也是最严谨 最必要的方法 但对于初学者, 在使用这个方法前, 有必要花时间用其他几种方法, 特别是图形方法进行问题分析和算法描述, 勾勒出草图是完成作品的前提 3 解决一个问题, 设计一组程序有不同的思想方法可以实现 对于初学者, 作为引导和铺垫, 我们先介绍大家学习掌握面向过程的结构化设计方法, 因此三种基本结构是必须掌握的 实际使用中, 三种基本结构是根据需要而选择的, 但一般顺序结构是一定会有的, 因为程序是解决问题的有序步骤的集合 4 由于问题的不同 不同设计者思考的方法不同, 导致问题不可能只有一种程序设计方法和途径 不同方法可能会有不同的结果和效率, 因此就存在程序质量和效率的问题

89 第 5 章判断与循环 一般复杂问题程序设计方法 内容提要与自学导引 内容提要 : 本章主要讲授实际问题中限定条件的表达和处理方法 ( 条件语句 ) 以及重复操作问题的解决方法 ( 循环语句 ), 是初步实现程序设计教学目标的重点章节 通过本章学习, 要求理解为什么需要选择结构和循环结构, 算法中如何确定选择和循环操作, 掌握实现选择和循环操作的思想方法和基本语句, 并能够设计比较复杂问题的程序 自学导引 : 在前面四章知识的基础上, 本章结合具体问题重点探讨程序设计的实现方法 读者在学习本章时, 必须结合 如何处理条件分支问题 如何处理重复操作问题 这个主题进行学习 进一步掌握基本程序结构中的选择结构和循环结构, 熟练掌握一个选择判断语句和循环控制语句, 并用它们解决实际问题 考核知识点说明 1. 条件表达方法, 达到 应用 层次 1 关系运算符与关系表达式 2 逻辑运算符与逻辑表达式 3 条件运算符与表达式 2. 循环算法描述与实现, 达到 理解 层次 1 循环算法的概念 2 循环算法的特点 3 循环算法的控制形式 3. 选择和循环算法实现方法, 达到 熟练应用 层次 1 用流程图或 NS 图描述算法 2 if 语句和 while 语句实现选择和循环 4. 逻辑类型及变量使用, 达到 了解 层次 科学出版社职教技术出版中心

90 78 程序设计基础 基于问题情境的 C 语言实践教程 在未学习新知识之前, 请读者思考下面三个在前面章节中出现的例子 1 给定圆的半径, 计算圆的面积 2 输入三个边值, 计算三角形的面积 3 输入三个系数, 计算二次方程的实根 上述每一个问题是否都有条件限制? 要求什么条件? 第 1 个问题要求输入的半径值不能为负 ( 尽管程序可以执行 ); 第 2 个问题不仅输入不能为负, 而且必须能够构成三角形, 否则结果无意义 ; 第 3 个问题要求二阶系数不能为 0, 开方项 (b 2-4ac) 不能为负, 否则没有实根 再看例子 4~6 4 计算 1 到 100 相加之和 5 计算多项式 的值 6 输入某班 50 名学生 C 语言考试的成绩, 求平均分 上述三个例子用前面提到的顺序结构可以实现吗? 不能实现又如何编写程序? 分析这三个问题, 都是某个或几个操作重复进行的问题 4 和 5 两个问题重复的是加法操作, 通过改变加数实现累加, 并且加数的变化有规律性 问题 6 实现的也是累加, 但加数需要键盘输入, 所以 输入 累加 两个操作需要重复 50 次 再比如, 求全班同学的平均年龄 求全校同学入学的平均成绩 迭代求根 判断素数 兔子繁殖问题等 解决这样的问题就会用到程序基本结构中的循环结构 实际问题中许多都是需要条件判断和循环处理的, 因此选择结构和循环结构是程序中两种很重要的结构 在一些复杂问题中, 还会出现选择中有循环和循环中有选择的复杂结构问题 因此, 熟练掌握选择结构和循环结构是程序设计的基础和关键 5.1 条件描述与选择结构程序设计 首先, 我们先用自然语言描述前三个问题的限定条件 给定圆的半径, 计算圆的面积 的限定条件 : 半径不小于 0 输入三个边值, 计算三角形的面积 的限定条件 : 三个边值大于 0 且任意两边之和大于第三边 输入三个系数, 计算二次方程的实根 的限定条件 : 二次项系数不为 0 且要求 b 2-4ac 0

91 第 5 章判断与循环 一般复杂问题程序设计方法 79 使用 C 语言编写程序如何表达这些条件? 下面我们介绍 C 语言中限定条件的表示方法 程序中限定条件的表示 1. 关系运算符和关系表达式 (1) 关系运算的概念 关系运算是指对两个运算量之间的大小比较 C 语言中提供的关系运算符有以下几种 >( 大于 ) >=( 大于等于 ) <( 小于 ) <=( 小于等于 ) ==( 等于 )!=( 不等于 ) 注意关系运算符号的写法, 不要与数学符号混淆或替代, 也不要在双符号 间加入空格 ( 如 > =), 更不要把双符号写反 ( 如 =>) 其中, 前四个为同一优先级 (6 级 ), 后两个为同一优先级 (7 级 ), 结合性为自左向右结 合 ( 左结合 ) 关系运算符的优先级低于算术运算符的优先级 (3 和 4 级 ), 它们都是双 目运算符 详细内容读者可参见附录 C (2) 关系表达式的值 运用关系运算符把常量 变量 函数以及其他表达式等连接起来的式子称为关系表 达式, 比如 x>y 3+x<=5 等 关系表达式的值只有两个 : 关系表达式成立, 即为 真, C 语言中以 1 表示 ; 关系表达式不成立, 即为 假,C 语言中以 0 表示 旧版本 (C89)C 语言没有逻辑类型, 逻辑判断结果 真 与 假 只能 用整数 1 和 0 表示 新版本 (C99) 虽然增加逻辑类型, 但也可以不使用 实际应用时, 除根据关系表达式的结果 (1 或 0) 判别真假外, 还允许使用其他类型 的表达式 对其他类型的表达式, 若表达式运算结果 非零 就认为 真, 结果为 零 认为 假 也就是说, 任何类型的合法表达式都可以看作判断条件, 这一方面给条件表 达带来灵活性, 另一方面可以提高程序编写效率 例如, 描述 变量 num 不是偶数 的 表达式可以是关系式 num%2!=0, 也可以是算术式 num%2, 二者完全等价 因为 如果 num 不是偶数,num 对 2 求余必然不等于 0, 关系式成立 ( 结果是 1), 同样算术式 num%2 的结果非零也认为是真 二者功能等效, 但后者表达更为简单 科学出版社职教技术出版中心

92 80 程序设计基础 基于问题情境的 C 语言实践教程 注意 计算条件 ( 关系或逻辑 ) 表达式的值 与 判断条件表达式的真假 的差别 计算时, 成立值为 1, 不成立值为 0; 判断真假时, 表达式结果非零为真, 零为假 (3) 关系表达式应用举例前面三个问题的限定条件用关系表达式分别描述如下 1 半径 r>=0 2 三个边设为 a b c, 要求 a>0 b>0 c>0,a+b>c a+c>b 且 b+c>a 3 设三个系数为 a b c, 要求 a!=0 且 b*b-4*a*c>=0 例 5-1 判断 a>b>c 表达式是否正确? 如何表示 b 在 a 和 c 之间? 首先,a>b>c 是正确的关系表达式, 它的运算顺序是先计算关系式 a>b, 运算结果再与 c 进行比较, 相当于关系表达式 (a>b)>c 其次,a>b>c 并不能表达 b 在 a 和 c 之间 假设 a=3, b=2, c=1,b 确实在 a 和 c 之间, 如果计算关系式 a>b>c 的值, 发现结果是假的 因为先计算 a>b 结果是 1( 逻辑真 ), 但 1 不大于 c(1>c 为假 ), 因此整个表达式结果为 0( 逻辑假 ), 因此不能用这种形式表示 同理,'Z'>=ch>='A', 是否表明变量 ch 在 'A' 和 'Z' 之间? 当然不对 那么,'A'<=ch<='Z' 是否正确? 若 ch 为 'D', 结果为真, 若 ch 为 'd', 并不在大写字母范围, 结果仍然为真 因此, 这种表示方式也不对 如何表示范围这样的条件? 如果有多个条件要求同时满足, 该如何描述? 2. 逻辑运算符与逻辑表达式 (1) 逻辑运算符 C 语言有三个逻辑运算符 :&&( 逻辑与 ) ( 逻辑或 )!( 逻辑非 ) 优先级从高到低顺序为非 (2 级 ) 与(11 级 ) 或(12 级 ) 逻辑非为单目运算符, 右结合性, 其他为双目运算符, 左结合性 逻辑运算符介于关系运算符和赋值运算符之间 一般用逻辑运算符描述多个条件的复杂情况 逻辑与可以理解为 并且, 表示只有两个条件都成立才可以 比如对二次方程求实根问题的条件应该写成 : a!=0&&b*b-4*a*c>=0 从数学角度看, 逻辑与可以看作两个集合的交集 逻辑或可以理解为 或者, 表示两个条件中只要其中一个成立就可以 比如假设评比奖学金的条件 : 年度考试科目平均成绩 ( 变量 p 表示 ) 大于 80 分或者 C 语言 ( 变量 c 表示 ) 大于 90 分, 条件可以描述为 p>=80 c>90 从数学角度看, 逻辑或可以看作两个集合的并集

93 第 5 章判断与循环 一般复杂问题程序设计方法 81 逻辑非是对原有条件的 否定, 成立的变成不成立, 不成立的变成成立 比如描述 C 语言不大于 90 分的条件可以用!(c>90) 表示, 当然也可以用 c<=90 表示 从数学角度看, 逻辑非可以看作一个集合的补集 ( 相对于全集 ) (2) 逻辑表达式的值用逻辑运算符把一个或两个表达式 ( 可以不是关系表达式 ) 连接起来构成的式子称为逻辑表达式 逻辑运算是对两个关系式或逻辑值进行运算的, 运算结果仍是逻辑值 ( 真用 1, 假用 0) 在 C 语言中, 由于运算结果值非 0 和 0 可以用来表示逻辑真和假, 所以逻辑运算符也可以对两个数值型表达式或数据进行运算, 包括整型 实型 字符型等数据 (3) 逻辑表达式应用举例前面三个问题中的二 三问题的限定条件用逻辑表达式分别描述如下 a>0&&b>0&&c>0&&a+b>c&&a+c>b&&b+c>a 和 a!=0&&b*b-4*a*c>=0 描述 b 在 a 和 c 之间 (a>b>c) 的正确形式 :b<a&&b>c, 同理, 表明变量 ch 在 'A' 和 'Z' 之间 ( 包含 'A' 和 'Z') 的逻辑表达式为 ch>='a'&&ch<='z' 描述复杂限制条件时, 如果不能够化简, 就应用逻辑表达式 不论如何描 述条件, 都不可能会有唯一的形式, 但应该尽可能用最简单形式描述 例 5-2 写出判断某年为闰年的条件, 假设年份用变量 year 表示 判断某一年是否为闰年的条件是满足下列条件之一 1 能被 4 整除, 但不能被 100 整除 2 能被 400 整除 描述第一个条件的表达式 :year%4==0&&year%100!=0 描述第二个条件的表达式 :year%400==0 由于两个条件满足一个就可以, 因此最终形成的条件表达式为 (year%4==0&&year%100!=0) (year%400==0) 由于逻辑与 (&&) 的优先级高于逻辑或 ( ), 因此上面条件表达式的小括号可以去掉 上面的条件也可以描述如下的简单式子 :!(year%4)&&year%100!(year%400) 特别值得向读者指出的是, 逻辑表达式在实际运算处理时存在一种 短路行为 就 是说, 对逻辑表达式的求解, 并不是所有的逻辑运算符都被执行, 只是在必须执行下一个逻辑运算符才能求得表达式的解时, 才执行该运算符 例如, 对逻辑表达式 a&&b&&c 求解, 有以下几种情况 1 若 a 为假, 则 b 和 c 不必计算, 直接求得结果为假 2 若 a 为真, 则需要计算 b 和 c, 若 b 为假,c 不用计算 3 若 a 和 b 都为真, 则一定要计算 c 的值, 才能决定表达式的真假 科学出版社职教技术出版中心

94 82 程序设计基础 基于问题情境的 C 语言实践教程 再如, 对逻辑表达式 a b c 求解, 有以下几种情况 4 若 a 为真, 则 b 和 c 不必计算, 直接求得结果为真 5 若 a 为假, 则需要计算 b 和 c, 若 b 为真,c 不用计算 6 若 a 和 b 都为假, 则一定要计算 c 的值, 才能决定表达式的真假 3. 条件运算符和条件表达式条件运算是一种在两个表达式的值中选择一个值的操作, 条件运算符由两个符号? 和 : 组成, 运算时共需要三个运算量, 是 C 语言中唯一的三目运算符 由条件运算符和运算量构成的式子为条件表达式 它的一般形式为 e1?e2:e3 //e1 e2 e3 为任意表达式, 但一般应用时 e1 往往为关系式或逻辑式条件表达式操作顺序为 : 计算表达式 e1 的值, 若 e1 为真 ( 非 0), 则求解表达式 e2, 此条件表达式的值为 e2 的值 ; 若 e1 为假 (0), 则求解表达式 e3, 整个条件表达式取 e3 的值 条件运算符 (?:) 的优先级为 13 级, 介于逻辑或 (12 级 ) 和赋值运算符 (14 级 ) 之间, 结合性为自右向左结合 ( 右结合 ) 例如, 表达式 max=a>b?a:b, 赋值号右侧为条件表达式, 由于赋值运算符优先级低于条件运算符优先级, 则计算时先计算条件表达式, 再把条件表达式结果赋值给变量 max, 即实现 若 a>b 则把 a 的值赋值给 max, 否则把 b 的值赋值给 max 的功能 再例如, 表达式 a>b?(max=a): (max=b) 表达的含义与前面的相同, 若结尾加分号 ;, 就成为一条独立的语句了, 功能与下面提示框中的 if-else 语句相同 max=a>b?a:b 功能相当于下一节讲到的 if-else 语句, 即 if(a>b) max=a; else max=b; 条件表达式也可以嵌套使用 例如, 判断三个整数, 找出最大值的例子, 如果用条件表达式, 可以写成 :max=a>(b>c?b:c)?a:b>c?b:c, 计算处理时本着 先内后外 由右向左 原则进行 需要读者注意的是, 条件表达式的值的类型为 e2 与 e3 二者中类型较高者 若把条件表达式结果赋值给一个变量, 则会进行赋值运算类型自动转换 例 5-3 输入一个字符, 判断是否是大写字母, 若是则转换成小写字母, 若不是则不转换, 要求输出最后得到的字符 请用条件表达式解决 问题分析 : 本问题思路清晰, 要求简单, 具体分为如下几步 1 输入字符 2 判断是否是大写字母 3 若是则转换成小写字母, 若不是则不转换 4 最后输出字符

95 第 5 章判断与循环 一般复杂问题程序设计方法 83 如何判断是否为大写字母? 结合前面学习的知识, 判断在两个字母区间需要用到逻 辑表达式 如果是大写字母就转换成小写, 否则不转换 可以用条件表达式描述 参考程序 : #include<stdio.h> int main() { char ch; scanf("%c", &ch); ch=(ch>='a'&&ch<='z')?(ch+32):ch; // 小括号可以不用, 但使用则会使描述 // 更加清晰 printf("%c\n", ch); return 0; * 逻辑型变量 逻辑型是 C 语言新标准 (C99) 新增加的一种数据类型, 是基本类型之一, 用关键 字 _Bool 表示 比如, 声明两个逻辑型变量 a b, 语句为 :_Bool a, b;,_bool 类型的 值是 0 或 1 逻辑变量用于存放关系运算和逻辑运算的结果, 以便于程序的分析和计算 比如, 输出一个考试分数, 用逻辑变量存放分数大于等于 60 分的值, 最后输出分数等级 程序 片段为 float score; _Bool a; scanf("%f", &score); a=score>=60; if(a) printf("the grade is C\n"); C99 中增加了用来定义 bool true 以及 false 宏的头文件 <stdbool.h>, 以便 程序员能够编写同时兼容于 C 与 C++ 的应用程序 在编写新的应用程序时, 应 该使用 <stdbool.h> 头文件中的 bool 宏 程序中问题条件选择的处理 if-else 语句 在 C 语言中, 程序由函数构成, 函数由语句构成 对于问题中的限定条件, 我们可 以用条件表达式 ( 关系或逻辑式 ) 描述, 对于问题的处理逻辑, 我们用选择结构 那么在程序或函数中, 如何用语句实现呢? C 语言提供专门的条件语句完成条件判断选择逻辑的实现, 具体形式有如下三种 科学出版社职教技术出版中心

96 84 程序设计基础 基于问题情境的 C 语言实践教程 1. 单分支判断执行语句 (1) 语句格式 if( 条件表达式 ) 语句 // 后面为一条语句, 若执行多条, 可改为复合语句 (2) 功能先计算条件表达式的值, 然后进行真假逻辑判断 若 条件表达式 成立 ( 结果为真 ), 执行后面的语句 语句执行完后或者条件不成立时, 都按顺序执行下一条语句 (3) 流程图流程图 ( 如图 5-1 所示 ) 中的语句可以是最简单的一条语句或多条语句构成的复合语句 ( 语句块 ) 图 5-1 if 语句流程图 图 5-2 例 5-4 流程图 (4) 应用举例 例 5-4 编写程序, 输入一个字符, 若是字母, 则输出 Yes! 问题分析 : 问题简单, 要求明确 顺序步骤是先输入, 后判断, 再输出 流程图描述 : 如图 5-2 所示 参考程序 : #include<stdio.h> int main() { char ch; ch=getchar(); if(ch>='a'&&ch<='z' ch>='a'&&ch<='z') printf("yes!"); return 0; 例 5-5 结合第 4 章例 4-2, 输入三个一般整数, 找出最大值并输出 问题分析和流程图可参看第 4 章例 4-2

97 第 5 章判断与循环 一般复杂问题程序设计方法 85 参考程序 : #include<stdio.h> /* 采用简单的 if 结构实现 */ int main() { int a, b, c, max; scanf("%d, %d, %d", &a, &b, &c); max=a; if(b>max) max=b; // 此时,max 已保存 a 和 b 中的较大值 if(c>max) max=c; // 此时,max 已保存 a b 和 c 中的最大值 printf("max=%d\n", max); return 0; 例 5-6 编写程序, 给定一个自变量 x, 计算 并输出下面分段函数的值 x+1 x<0 y= 5 x=0 x 2-2 x>0 问题分析 : 分段函数是指根据自变量 x 条件的不 同, 有不同的函数关系与之对应, 当给定的 x 在该条 件范围内时, 就按照这样的函数对应关系计算因变量 y 的值 算法顺序步骤为先输入 x, 再判断, 并根据对 应函数表达式计算出 y 值, 最后输出 y 的值 流程图描述 : 如图 5-3 所示 参考程序 : #include<stdio.h> int main() { // 假设自变量 x 类型为一般整型, 先把 5 赋值给 y int x, y=5; scanf("%d", &x); // 如果 x 为 0, 本语句不会执行, 将继续判断 if(x<0) y=x+1; if(x>0)y=x*x-2; // 如果 x<0, 本语句也不会执行 printf("y=%d\n", y); return 0; 2. 双分支判断执行语句 (1) 语句格式 图 5-3 例 5-6 流程图 if( 条件表达式 ) 语句 1 else 语句 2 // 语句 1 和语句 2 都是一条语句, 若执行多条, 可改为复合语句 科学出版社职教技术出版中心

98 86 程序设计基础 基于问题情境的 C 语言实践教程 (2) 功能先计算条件表达式的值, 然后进行真假逻辑判断 若 条件表达式 成立 ( 结果为真 ), 执行后面的语句 1, 否则执行语句 2 (3) 流程图流程图描述 : 如图 5-4 所示 图 5-4 if-else 语句流程图 (4) 应用举例 例 5-7 输入一个一般整数, 若是偶数, 显示偶数 even number, 否则显示奇数 odd number 问题分析 : 本问题描述清晰简单, 步骤是先输入一个一般整数, 然后进行奇偶判断, 并根据判断结果相应显示奇数还是偶数信息 流程图描述 : 如图 5-5 所示 参考程序 : 图 5-5 例 5-7 流程图 #include<stdio.h> int main() { int x; scanf("%d", &x); if(x%2) printf("odd number!\n"); else printf("even number!\n"); return 0;

99 第 5 章判断与循环 一般复杂问题程序设计方法 87 程序判断处理部分也可以写成 : if(x%2==0) printf("even number!\n"); else printf("odd number!\n"); 或者 if(x%2!=0) printf("odd number!\n"); else printf("even number!\n"); 或者 if(!(x%2)) printf("even number!\n"); else printf("odd number!\n"); 由此可见, 条件表达式不同, 写出的程序也不同, 但所 包含的逻辑关系不能改变 例 5-8 输入三个整数作为边构成三角形, 计算三角 形的面积并输出 若不能构成三角形则显示输入错误信息 问题分析 : 本问题要求首先输入三个整数, 然后判断能 否构成三角形, 如果能则计算三角形面积并输出, 如果不能则输出错误信息提示 流程图描述 : 如图 5-6 所示 参考程序 : #include<stdio.h> #include<math.h> // 因为后面用到开平方函数 int main() { int a, b, c; float s, area; scanf("%d, %d, %d", &a, &b, &c); if(a>0&&b>0&&c>0&&a+b>c&&a+c>b&&b+c>a) // 构成三角形的条件 { // 下面为复合语句或语句块, 完成面积计算输出 s=(a+b+c)/2.0; area=sqrt((s-a)*(s-b)*(s-c)*s); printf("area=%5.2f\n", area); else printf("input data error!\n"); return 0; 3. 多分支判断执行语句 图 5-6 例 5-8 流程图 在前面两种格式的 if 语句中, 格式要求 if 和 else 后面跟随的语句是一条语句 下面两种情况需要注意 1 如果条件成立 ( 或不成立 ) 时要执行多条语句, 则必须把多条语句转换成一条语句 转换的方法有两种, 一种方法是通过加一对大括号 { 把这些语句括起来, 成为 科学出版社职教技术出版中心

100 88 程序设计基础 基于问题情境的 C 语言实践教程 一条复合语句 ( 参看上例 ) 比如输入两个整数给变量 a 和 b, 若 a>b 则 a b 中的数据互换 程序代码片段如下 int a, b, c; scanf("%d, %d", &a, &b); if(a>b) {c=a;a=b;b=c; 程序表明, 若 a>b, 需要执行三条语句实现数值交换 语句格式要求把这三条语句看作一个整体对待, 需用大括号括起来改为复合语句 另一种方法是逗号表达式语句解决多语句问题 比如上例, 可改为如下语句形式 int a, b, c; scanf("%d, %d", &a, &b); if(a>b) c=a, a=b, b=c; // 一条逗号表达式语句 2 在格式中, 并没有说明条件成立或不成立时执行的是什么语句, 虽然我们举例时经常用赋值语句, 但并非一定要求用赋值语句 也就是说,if 和 else 后面的语句要求不确定 可以是简单赋值语句, 也可以是另一个条件语句或循环语句, 更可以是其他复杂的语句块 如果这些语句是 if 语句, 则称为 if 语句的嵌套, 一般用来表示复杂条件, 但每个 if 后面的条件表达式可能相对简单些 if 嵌套格式为 if( 条件表达式 1) if( 条件表达式 2) 语句 1 else 语句 2 else if( 条件表达式 3) 语句 3 else 语句 4 功能 : 若 条件表达式 1 结果为真, 执行一个条件语句继续进行判断, 否则执行另一个条件语句进行判断 或者说, 若 条件表达式 1 成立且 条件表达式 2 也成立, 则执行语句 1, 否则执行语句 2; 若 条件表达式 1 不成立但 条件表达式 3 成立, 则执行语句 3, 否则执行语句 4 语句 1 到语句 4 仍然可以是 if-else 语句, 以此类推, 可构成更复杂的表达形式 流程图如图 5-7 所示 图 5-7 if 语句嵌套图解

101 第 5 章判断与循环 一般复杂问题程序设计方法 89 需要指出的是, 上述嵌套格式并非总是如此, 而是根据实际问题, 情况发生变化 下面给出几种 if 语句嵌套形式特例 if( 条件表达式 1) if( 条件表达式 2) 语句 1 else 语句 2 else 语句 3 if( 条件表达式 1) 语句 1 else if( 条件表达式 2) 语句 2 else 语句 3 if( 条件表达式 1) 语句 1 else if( 条件表达式 2) 语句 2 else if( 条件表达式 3 ) 语句 3 else 语句 n if( 条件表达式 1) if( 条件表达式 2) if( 条件表达式 3 ) if( 条件表达式 n) 语句 1 else 语句 2 else 语句 3 else 语句 n 上述各种格式, 需要读者仔细理解和体会, 并且要注意实际问题的逻辑关系体现, 更要注意 if 与 else 的匹配关系, 千万不能混淆和模糊, 以免造成混乱 C 语言规定,else 总是与它上面最近的且没有配对的 if 语句进行匹配 下面通过几个例题来理解和掌握 if 语句嵌套方式的使用方法 例 5-9 实型变量 a b 中放有两门课程的考试成绩, 如果两门成绩都及格 ( 成 绩 >=60), 则显示 pass, 如果 a 成绩不及格, 则显示 fail, 如果 a 成绩及格而 b 成绩 不及格, 则不做任何处理 下列程序段中可实现上述要求的是 A.if(a>=60) B.if(a<60) printf("fail"); if(b>=60) printf("pass"); else if(b>=60) printf("pass"); else printf("fail"); C.if((a>=60)&&(b>=60)) printf("pass");d.if(b>=60) else if(b<60) printf("fail"); if(a>=60) printf("pass"); else printf("fail"); 问题分析 : 显示 pass 的前提是两门成绩都及格 (a>=60, 且 b>=60), 而显示 fail 科学出版社职教技术出版中心

102 90 程序设计基础 基于问题情境的 C 语言实践教程 的前提只有 a 不及格即可 A 中 pass 显示正确, 但 fail 错误, 因为这里的 else 是对 b>=60 的否定 B 是正确的描述, 体现了问题中的逻辑关系 C 中 pass 显示正确, 但 fail 错误, 因为这里的条件是 b<60, 而不知道 a 是否小于 60 D 中 pass 显示正确, 但 fail 错误, 因为这里的 else 是在 b>=60 前提下对 a>=60 的否定 实际上不论 b 是否及格, 只要 a<60, 就要显示失败 fail 这个例子告诉我们实际问题的逻辑关系一定要理清, 同时在程序中应该原原本本地表达才是正确的 如果觉得 if 嵌套麻烦不好懂, 只要把条件表达式修改一下就可以, 也就是把比较简单的表达式改为稍微复杂些即可 建议编程时, 能避免复杂嵌套的尽量避免 描述例 5-9 逻辑关系的程序段修改如下 if(a>=60&&b>=60) printf("pass"); else if(a<60) printf("fail"); 例 5-10 据学生的成绩, 将学生划分为 A B C D E 五个等级, 其对应的关系如下 ( 其中整型变量 result 存放学生成绩, 字符型变量 grade 存放学生等级 ), 编写程序 A 90 result 100 B 80 result<90 grade= C 70 result<80 D 60 result<70 E 0 result<60 问题分析 : 本题思路是先输入一个学生成绩, 然后根据给定的条件进行判断, 并给 出对应的等级, 最后输出等级信息 问题的关键是如何表达问题中的逻辑关系, 可以从 高往低判断, 也可以由低往高判断, 还可以直接如问题中描述的进行分段判断 但无论 哪种判断, 都要注意条件关系不能出现交叉重叠 下面给出两个程序, 请读者阅读理解 程序 1: #include<stdio.h> int main() { int result;char grade; scanf("%d", &result); if(result<0 result>100) {printf("input Error!\n");return -1; if(result>=90&&result<=100)grade='a';

103 第 5 章判断与循环 一般复杂问题程序设计方法 91 if(result>=80&&result<90)grade='b'; if(result>=70&&result<80)grade='c'; if(result>=60&&result<70)grade='d'; if(result>=0&&result<60)grade='e'; printf("grade=%c", grade); return 0; 程序 2: #include<stdio.h> int main() { int result;char grade; scanf("%d", &result); if(result<0 result>100) {printf("input Error!\n");return -1; else if(result<60) grade='e'; else if(result<70) grade='d'; else if(result<80) grade='c'; else if(result<90) grade='b'; else grade='a'; printf("grade=%c", grade); return 0; 可否把程序 2 的判断条件反过来, 先判断是否小于 90, 再判断是否小于 80, 如此等等? 如果从高往低判断, 该如何书写程序? 5.2 重复操作问题与循环语句 本章开头 4 到 6 三个例子有一个共同的特点 : 重复操作 C 语言如何编程解决重复操作问题? 方法是通过控制程序执行的顺序, 确保某些语句被反复执行, 直到规定的次数或满足某种条件为止, 这就是循环结构 C 语言中有多种完成重复操作的语句, 本节只讲授使用最简单 最方便的一条语句 循环问题导引 实际生活中, 有许多循环应用的例子 比如给银行卡输入密码, 它是允许错误后重新输入的, 一般会给三次机会, 这就是重复操作, 否则一次错误就退出或吞卡, 我们会觉得相当不方便 再比如收银机的计算处理程序, 只要开始工作就始终处于工作状态, 即程序处于反复 输入 记录 打印 汇总 状态, 除非机器工作不稳定, 否则我们不会看到每当一位客户交费时, 收银员都重新启动程序 上述两例都是生活中实际问题, 科学出版社职教技术出版中心

104 92 程序设计基础 基于问题情境的 C 语言实践教程 作为程序设计者必须考虑这些问题并能够实现出来, 从程序功能结构层面上实现循环 还有如 n 的计算问题和计算 n 的阶乘 (n!) 问题等多项式计算问题, 也都是重复操作问题, 只不过是具体计算层面的循环问题而已 再有一类问题, 需要逐个给定条件进行判断处理, 直到得到满足要求的值为止 如判断某个数 m 是否为素数, 方法就是用 m 分别与 2 到 m-1 这些数进行整除, 如果有一个能够实现整除 ( 除得尽 ), 则 m 就不是素数 再如 百元百鸡 问题 : 用 100 元钱买 100 只鸡, 已知公鸡 5 元一只, 母鸡 3 元一只, 雏鸡一元 3 只, 问你能买多少只公鸡 母鸡和雏鸡? 从数学角度讲, 这个问题只能写出两个方程式, 无法解决问题 但实际解决问题时, 我们可以尝试先买一只公鸡 一只母鸡 98 只雏鸡, 判断能否花掉 100 元 若不能则改变公鸡和母鸡的数目后再检验, 经过多次改变和检验, 就会得到结果 显然, 这一类问题也是重复操作问题 总之, 实际问题中需要重复操作的问题很多, 需要有解决此类问题的语句, 需要有循环结构 因此, 顺序结构 选择结构和循环结构是最重要的三种基本结构, 三者配合不仅能解决如上的简单问题, 还能设计解决诸如游戏程序 管理程序等很多比较复杂的程序问题 while 语句 while 语句用来实现循环结构 while 语句的格式为 while( 循环条件 ) { 循环体语句 while 语句的执行过程 : 首先计算描述循环条件的表达式的值, 当值为 真 ( 即非 0) 时, 执行循环体语句, 然后再回到循环条件进行判断 ; 当值为 真 时, 再次执行循环体语句, 如此重复, 直到循环条件不成立为止, 因此被称为 当型 循环, 如图 5-8 所示 图 5-8 while 语句的执行流程

105 第 5 章判断与循环 一般复杂问题程序设计方法 93 循环体语句一般为一个复合语句, 也可以是单一一条语句, 还可以是空语句 为确保循环正常执行, 循环条件必须要改变, 因此在循环体中应该有改变 循环条件的语句 ; 否则, 循环条件不变, 就不会退出循环, 导致死循环 例 5-11 分析阅读下面的程序, 写出程序执行后的结果 int main() { int n=0; while(n<=2) { n++; printf("%d", n); return 0; 程序的运行结果如下 123 说明 : 1 循环体如果包含一个以上的语句, 则应该用花括号括起来, 以复合语句的形式出现 ; 否则,while 语句的执行范围只到 while 语句后的第一个分号处 例如, 本例中的循环体在 { 内, 含有两个语句 如果没有花括号, 则循环体只有 n++;, 这时程序的运行结果为 3 2 在循环体中应该有使循环趋于结束的语句 例如, 本例的循环条件是 n<=2, 因此, 在循环体中应该有使 n 不断增值, 最终导致 n>2 的语句 在此是用 n++; 语句来实现此目 的 如果没有该语句, 则 n 的值始终不变, 总是满足循环条件, 循环永不结束, 这种循 环称为死循环 读者在写程序时要避免出现死循环 3 while 语句中的循环条件一般是关系表达式或逻辑表达式, 但也可以是其他表达 式, 只要表达式的值为真 ( 非 0) 就认为条件成立 的值 例 5-12 用 while 语句求 s= 问题分析 : 此题是求一组数的累加和问题, 要 累加的数从 1~100 是有规律的, 后一个数比前一个 数大 1 因此, 可在循环中使用一个整型变量 n, 开 始的初值是 1, 每累加一次使 n 增 1, 直到 n 的值大 于 100 为止 流程图描述 : 可以使用变量 sum 作为累加器, 用来存放累加和 累加之前, 累加器清 0, 即 sum 的初值设为 0 每循环一次, 把 n 的值加到 sum 中, 当循环结束时,sum 的值就是最终的结果 用传统流 程图表示算法, 如图 5-9 所示 科学出版社职教技术出版中心 图 5-9 例 5-12 的流程图

106 94 程序设计基础 基于问题情境的 C 语言实践教程 参考程序 : #include<stdio.h> int main() { int n=1, sum=0; while(n<=100) { sum=sum+n; n++; printf("sum=%d\n", sum); return 0; 若计算 或 该如何编写程序, 若输入 100 个整数相加求和该如何编写程序, 若计算 5!(5 的阶乘 ) 如何编程, 若输入一个数 n, 计算 n! 又如何编程 请读者研读本例后模仿编写 例 5-13 统计从键盘输入一行字符的个数 ( 输入完一行字符后以回车符结束 ), 程序如下 #include<stdio.h> int main() { int n=0; printf("input a string:\n"); while(getchar()!='\n') n++; printf("%d", n); return 0; 本程序中的循环条件为 getchar()!='\n', 其意义 : 只要从键盘输入的字符不是回车符就继续循环 整型变量 n 作为计数器使用, 循环体 n++ 完成对输入字符的个数进行计数 例 5-14 分析下面的程序, 若输入值为 5, 则程序运行结果为多少? int main() { int a=0, n; printf("\n input n:"); scanf("%d", &n); while (n--) printf("%d ", a++*2); return 0; 本程序将执行 n 次循环, 每执行一次,n 值减 1 循环体输出表达式 a++*2 的值 该表达式等价于 (a*2;a++) 输入值为 5, 程序运行结果如下

107 第 5 章判断与循环 一般复杂问题程序设计方法 95 input n: 分析循环五次执行过程, 变量 n 和 a 变化如图 5-10 所示 通过前面的知识和例题, 我们对循环结构做如下总结 1 待解决的问题必须有重复操作的特性, 这是选定循环结构的前提 2 分析问题, 找出重复操作的部分, 并用 C 语言语句描述 3 分析设计控制循环的办法, 一般有如下两种 : 已知重复次数, 用次数控制循环, 如例 5-12 所示 ; 已知结束条件, 用结束条件控制循环, 如例 5-13 所示 4 对于利用循环次数控制循环, 要明晰循环控制的初始值 变化情况和结束条件, 确保循环控制变量由初值向循环终值变化, 并达到结束条件 图 5-10 例 5-14 变量变化表示 5 对于利用结束条件控制循环, 应确保输入的结束条件能被发现执行导致循环结 束 对于这一类, 还有一种方法 : 循环条件永远成立, 但在循环体中加入结束循环结束条件判别 例如, 例 5-13 可以修改为 #include<stdio.h> int main() {int n=0; printf("input a string:\n"); while(1) {if(getchar()=='\n')break; else n++; printf("%d", n); return 0; // 值为 1, 循环条件永远为真 // 满足条件跳出循环, 关键字 break 表示中断 // 循环并跳出 科学出版社职教技术出版中心 例 5-15 输入任意一个一般整数, 判断其是否是素数? 编写程序实现 问题分析 : 前面已经提到, 判断素数的方法是用 2 到该数减一的数去除被判断的数, 若有一次能够整除, 则不是素数 设输入的数为 m, 除数 n 为 2 到 m-1, 重复操作的问

108 96 程序设计基础 基于问题情境的 C 语言实践教程 题是判断 m%n 是否为 0, 若不是则继续判别, 直到所有数都用完 ; 若是则结束重复操作 值得注意的是不论是否为素数, 循环都应该结束 那么结束后如何知道是因为不是素数提前结束的, 还是所有都检验后结束的? 为此, 这里设定一个标识变量 k, 初值为 1 代表是素数, 若不是则 k 值赋值为 0 参考程序 1: #include<stdio.h> int main() { int m, n, k=1; // 变量 k 为标识量, 初值为 1 代表是素数 printf("\n input an integer to m:"); scanf("%d", &m); //m 是用户输入需要判断的数 n=2; while(n<m) { if(m%n==0){k=0;break; // 如果 m 能够被 n 整除, 表明 m 不是素数 else n++; if(k) printf("%d is a prime! \n", m); else printf("%d is not a prime! \n", m); return 0; 参考程序 2( 读者分析, 对比与第一种有何区别 ): #include<stdio.h> #include<math.h> int main() { int m, n, k; printf("\n input an integer to m:"); scanf("%d", &m); n=2; k=sqrt(m); //k 的值为 m 的开平方 while(n<=k) { if(m%n==0)break; else n++; if(n>k) printf("%d is a prime! \n", m); //n>k 代表所有的数都已经尝 // 试过, 没有能够除尽的 else printf("%d is not a prime! \n", m); return 0; 5.3 典型例题解析 前面我们已经学习了问题中限定条件的表达 ( 关系式和逻辑式 ) 和程序中使用判断

109 第 5 章判断与循环 一般复杂问题程序设计方法 97 的方法 (if 语句 ), 学习了重复操作问题的处理方法 (while 语句 ) 现在再通过几个例题 巩固这些知识 比较 例 5-16 输入一个年份, 编写程序判断是否为闰年? 问题分析 : 前面已经介绍过判断闰年的方法 现在用不同的方法编写程序, 请读者 参考程序 1: #include<stdio.h> int main() { int year; printf("\n input a year:"); scanf("%d", &year); if((year%4==0&&year%100!=0) (year%400==0)) printf("%d is a leap year.", year); else printf("%d is not a leap year.", year); return 0; 参考程序 2: #include<stdio.h> int main() { int year, leap; // 读者注意 leap 变量的含义 printf("\n input a year:"); scanf("%d", &year); if(year%4!=0)leap=0; else if(year%100!=0)leap=1; else if(year%400!=0)leap=0; else leap=1; if(leap) printf("%d is a leap year.\n", year); else printf("%d is not a leap year.\n", year); return 0; 比较这两个例子, 可以得出结论 : 若描述条件的表达式复杂, 则使用的语句就简单, 反之就复杂 例 5-17 输入两个正整数给变量 a 和 b, 要求 a 值不大于 31,b 值不超过 2 位数 让 a 在左,b 在右, 拼成一个新的数给 c, 比如 a=12,b=20, 则 c 为 1220 编写实现程序 问题分析 :a 的范围在 [1,31],b 的范围在 [1,99], 根据题意, 可得到由 a 和 b 构 成 c 的数学模型如下 : 当 b 为 1 位时,c=a 10+b; 当 b 为 2 位时,c=a 100+b; 因此, 计算 c 值的公式为 c=a k+b;k 值为 10 或 100 算法流程图 : 如图 5-11 所示 科学出版社职教技术出版中心

110 98 程序设计基础 基于问题情境的 C 语言实践教程 图 5-11 例 5-17 流程图 参考程序 : #include<stdio.h> int main() { int a, b, c, k; printf("\n input two integer number:"); scanf("%d, %d", &a, &b); if(a<=0 b<=0 a>31 b>99)) {printf("input data error!");return -1; // 返回 -1 代表程序有错 else if(b<10)k=10; else k=100; c=a*k+b; printf("\na=%2d, b=%2d, c=%4d", a, b, c); return 0; 例 5-18 有一类数, 被称为 水仙花数, 它是一个三位数, 其各位数字立方和等于该数本身 例如,153 是水仙花数, 因为 153= 请输入一个三位数, 编程判断是否为水仙花数 问题分析 : 题意要求输入一个三位数, 并根据水仙花数的含义加以判断, 是与不是要给出相应信息 算法流程图 : 如图 5-12 所示 参考程序 : #include<stdio.h> int main() { int a, b, c, d; /* b c d 变量代表三位数 a 分解的三位数字 */ printf("\n input a integer number:"); scanf("%d", &a); if(a<100 a>999)

111 第 5 章判断与循环 一般复杂问题程序设计方法 99 {printf("input data error!");return -1; // 返回 -1 代表程序有错 else {b=a/100;d=a%10;c=a-b*100-d; if(a==b*b*b+c*c*c+d*d*d)printf("%d is narcissus.", a); else printf("%d is not narcissus.", a); return 0; 图 5-12 例 5-18 流程图 有一类问题是寻找特征数 比如上例的水仙花数, 此外还有素数 完数 同 构数等, 方法都差不多, 请读者仿照此例编写查找这些数的程序 例 5-19 求 Fibonacci 数列的前 20 个数 这个数列的特点 : 第 1 2 两个数为 1 和 1, 从第 3 个数开始, 每个数都是前面连续两个数的和, 即数列为 1,1,2,3,5,8, 13,21,, 请编程显示这些数 数学史话 : 该数列来源于一个有趣的数学故事 有一对兔子, 从出生后第三个月起 每个月都生一对兔子 小兔子长到第三个月后每月又生一对兔子 假设所有兔子都不死, 问每月的兔子总数为多少? 问题分析 : 设第一个月兔子对数为 f 1 为 1, 根据题意, 第二个月的兔子对数 f 2 也是 1, 第三个月的兔子对数 f 3 =f 1 +f 2, 同理第四个月的兔子对数 f 4 =f 2 +f 3, 第五个月的兔子对数 f 5 =f 3 +f 4, 第六个月的兔子对数 f 6 =f 4 +f 5, 以此类推, 直到得到前 20 个数为止 总结上述分析, 从中可以得到一个数学通式 :f n =f n-2 +f n-1 显然, 通过给定不同的值, 利用循环可以求得问题解 算法流程图 : 如图 5-13 所示, 区别在于得到下个月的兔子的方法不同 (a) 图先得到第三个月的兔子数, 然后把第一个月改成第二个月, 第二个月改成第三个月, 再次循环 (b) 图先输出前两个月的兔子数, 然后分别得到三 四两个月的再输出, 每次都得到两个月的数量 两种形式都采用一种称为 辗转赋值 的方法完成 科学出版社职教技术出版中心

112 100 程序设计基础 基于问题情境的 C 语言实践教程 图 5-13 例 5-19 流程图 参考程序 1: #include<stdio.h> int main() { int f1=1, f2=1, f3; int i=1; // 循环控制变量, 初值为 1 printf("%12d\n%12d\n", f1, f2); while(i<=18) { f3=f1+f2; // 产生下一个数 printf("%12d\n", f3); f1=f2; f2=f3; i++; return 0; 参考程序 2: // 辗转赋值 #include<stdio.h> int main() { int f1=1, f2=1; int i=1; while(i<=10) { printf("%12d\n%12d\n", f1, f2); f1=f1+f2; f2=f2+f1; i++; return 0; // 辗转赋值, 连续产生两个新数 与之类似的例子还有计算两个数的最大公约数以及许多数列计算问题 计算最大公约数要用到辗转赋值 ; 计算数列要找到通式, 并在循环中改变

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc C 语言开发入门 课程教学大纲 ( 课程英文名称 ) 课程编号 :201409210011 学分 :5 学分学时 :60 学时 ( 其中 : 讲课学时 :37 学时上机学时 :23 学时 ) 先修课程 : 计算机导论后续课程 :C++ 程序设计适用专业 : 信息及其计算机相关专业开课部门 : 计算机系 一 课程的性质与目标 C 语言开发入门 是计算机各专业必修的基础课程, 是数据结构 C++ Java

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

FJXBQ

FJXBQ 高等医学院校选用教材 ( 供成人教育中医药专业 中西医结合专业使用 ) 方剂学 闫润红 主编 2 0 0 1 内容简介本书是供成人教育中医药专业 中西医结合专业使用的教材 全书分总论和各论两部分, 总论部分对中医方剂的基本理论, 如治法 君臣佐使 剂型 剂量等及其现代研究进展进行了介绍 各论部分对常用方剂的主治病证 配伍意义 临床应用 加减变化规律及现代研究概况等内容, 按分类进行了系统阐述 在保证方剂学学科知识结构完整性的前提下,

More information

<4D F736F F D205A572D2D A1AAA1AAD4ACE7F42D43D3EFD1D4CAB5D1B5BDCCB3CC2E646F6378>

<4D F736F F D205A572D2D A1AAA1AAD4ACE7F42D43D3EFD1D4CAB5D1B5BDCCB3CC2E646F6378> 第 1 部分 Visual Studio 6.0 开发环境介绍 本书以 Visual C++ 6.0 作为 C 源程序的实践开发环境, 本章将首先介绍 Visual C++ 6.0 环境的基本操作, 包括 Visual C++ 6.0 的安装和启动,C 源程序的编辑 运行与调试 1.1 安装与启动 Visual C++ 6.0 MSDN Visual C++ 6.0 1.1 Microsoft Visual

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 第 1 章程序设计和 C 语言 1.1 什么是计算机程序 1.2 什么是计算机语言 1.3 C 语言的发展及其特点 1.4 最简单的 C 语言程序 1.5 运行 C 程序的步骤与方法 1.6 程序设计的任务 1.1 什么是计算机程序 程序 : 一组计算机能识别和执行的指令 只要让计算机执行这个程序, 计算机就会自动地 有条不紊地进行工作 计算机的一切操作都是由程序控制的, 离开程序, 计算机将一事无成

More information

没有幻灯片标题

没有幻灯片标题 第 2 章 C 语言的基本数据类型与表达 式 2. 1 C 语言的语法基础 2. 2 C 语言的基本数据类型 2. 3 常量和变量 2. 4 运算符与表达式 2. 5 数据类型转换 用 第 2 章 C 语言的基本数据类型与表达 2.1 C 语言的语法基础 2. 1. 1 C 语言字符集 式 C 语言的基本符号可分 4 个类, 归纳如下 : (1) 英文字母 : 大小写各 26 个, 共计 52 个

More information

新・明解C言語入門編『索引』

新・明解C言語入門編『索引』 !... 75!=... 48 "... 234 " "... 9, 84, 240 #define... 118, 213 #include... 148 %... 23 %... 23, 24 %%... 23 %d... 4 %f... 29 %ld... 177 %lf... 31 %lu... 177 %o... 196 %p... 262 %s... 242, 244 %u... 177

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN:978-7-302-13599-9, 红色封面 答案制作时间 :2011 年 2 月 -5 月 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p=&a 2. 设已定义 int x,*p=&x;, 则下列表达式中错误的是 :B)&*x 3. 若已定义 int a=1,*b=&a;,

More information

2015年计算机二级(C语言)模拟试题及答案(三)

2015年计算机二级(C语言)模拟试题及答案(三) 2016 年计算机二级 (C 语言 ) 模拟试题及答案 (3) 1.( A ) 是构成 C 语言程序的基本单位 A 函数 B 过程 C 子程序 D 子例程 2.C 语言程序从 ( C ) 开始执行 A 程序中第一条可执行语句 B 程序中第一个函数 C 程序中的 main 函数 D 包含文件中的第一个函数 3 以下说法中正确的是( C ) A C 语言程序总是从第一个定义的函数开始执行 B 在 C 语言程序中,

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 计算概论 A 课程程序设计部分 C++ 语言基本成分 数据成分 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn 再谈, 我们的进度安排 我们的学习过程 感性理性函数指针等 数据成分运算成分控制成分数组字符串 结构化的程序递归 传统学习过程 数据类型与表达式 输入输出 关系运算 控制语句 函数数组指针结构体 作业练习 感性认识作业练习 ( 以抄程序为主 ) 正常作业练习

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

Microsoft Word - 正文.doc

Microsoft Word - 正文.doc 第 2 章 Java 语言基础 通过本章的实践, 要掌握 Java 中的标识符 关键字 常量, 熟练掌握算术 关 系 逻辑 条件 赋值 位运算符的使用, 掌握简单顺序结构的程序设计 2.1 典型习题解答 2.1 Java 中怎样进行注释? 解答 Java 语言中的注释有 3 种形式 : (1) 单行 : // (2) 多行 : /* */ (3) 文档注释 : /** */ 第三种形式是第二种形式的变形,

More information

Microsoft PowerPoint - 03.Fortran程序设计基础1

Microsoft PowerPoint - 03.Fortran程序设计基础1 简单 Fortran 90 程序的构造形式 : 第二讲 Fortran 程序设计基础 (2) [PROGRAM 程序名 ] [ 声明语句 ] [ 执行语句 ] END [PROGRAM [ 程序名 ]] 程序的书写 (P5) PROGRAM MONEY!calculate balance after interest compounded! 根据利息计算余额 REAL BALANCE, INTEREST,

More information

《C语言程序设计》第2版教材习题参考答案

《C语言程序设计》第2版教材习题参考答案 教材 C 语言程序设计 ( 第 2 版 ) 清华大学出版社, 黄保和, 江弋编著 2011 年 10 月第二版 ISBN:978-7-302-26972-4 售价 :35 元 答案版本 本习题答案为 2012 年 2 月修订版本 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p = &a A. *p = *a B. p = *a C.p = &a D. *p =

More information

_汪_文前新ok[3.1].doc

_汪_文前新ok[3.1].doc 普 通 高 校 本 科 计 算 机 专 业 特 色 教 材 精 选 四 川 大 学 计 算 机 学 院 国 家 示 范 性 软 件 学 院 精 品 课 程 基 金 青 年 基 金 资 助 项 目 C 语 言 程 序 设 计 (C99 版 ) 陈 良 银 游 洪 跃 李 旭 伟 主 编 李 志 蜀 唐 宁 九 李 涛 主 审 清 华 大 学 出 版 社 北 京 i 内 容 简 介 本 教 材 面 向

More information

林子雨《C语言程序设计》讲义PPT

林子雨《C语言程序设计》讲义PPT C 语言程序设计 厦门大学计算机科学系 2012-02-26 林子雨 ziyulin@xmu.edu.cn 2012-02-26 厦门大学非计算机专业本科生公共课 (2011-2012 第 2 学期 ) C 语言程序设计 林子雨厦门大学计算机科学系 E-mail: ziyulin@xmu.edu.cn 个人主页 :http://www.cs.xmu.edu.cn/linziyu 课程提要 第一章绪论

More information

计算概论A B03 C++语言的基本成分 - 运算成分(2)

计算概论A B03 C++语言的基本成分 - 运算成分(2) 计算概论 A 程序设计部分 C 语言的构成成分 运算成分 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn C 语言中的运算符 C 语言的运算符范围很宽 求字节数运算符 : sizeof 下标运算符 [ ] 赋值运算符 = 算术运算符 + - * / % 关系运算符 < > == >= > ~

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

没有幻灯片标题

没有幻灯片标题 指针作为函数参数 : 原因 : 1 需要修改一个或多个值,( 用 return 语句不能解决问题 ) 2 执行效率的角度 使用方法 : 在函数原型以及函数首部中需要声明能够接受指针值的形参, 具体的写法为 : 数据类型 * 形参名 如果有多个指针型形参, 则用逗号分隔, 例如 : void swap(int *p1, int *p2) 它说明了形参 p1 p2 是指向整型变量的指针 在函数调用时,

More information

试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期 " 开放本科 " 期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默

试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期  开放本科  期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默 试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期 " 开放本科 " 期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默认扩展名为 ( ) A. cpp B. c C. exe D. obj 2. 设 x 和 y 均为逻辑值,

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

实验 2 顺序结构程序设计 9 unsigned short a; a= 1; printf("%d\n",a); 运行以上程序, 查看输出的结果, 分析为什么会输出这些信息 (1) 打开 VC 创建 liti2 2.c 文件 (2) 输入以上代码并编译执行 (3) 结果如图 2 2 所示 图 2

实验 2 顺序结构程序设计 9 unsigned short a; a= 1; printf(%d\n,a); 运行以上程序, 查看输出的结果, 分析为什么会输出这些信息 (1) 打开 VC 创建 liti2 2.c 文件 (2) 输入以上代码并编译执行 (3) 结果如图 2 2 所示 图 2 实验 2 顺序结构程序设计 明符 一 实验目的 1. 掌握 C 语言基本数据类型 运算符和赋值语句 2. 变量的定义及初始化 整型 实型 字符型等基本类型变量的定义和初始化 3. 熟练使用赋值运算 算术运算等表达式, 能够编写简单顺序结构程序 4. 掌握 C 语言基本的输入输出 熟练使用标准输入 输出函数及各种数据类型的格式说 二 实验内容及步骤 例题 2.1 输入程序, 查看输出结果 (1) 参照第一章创建

More information

《计算概论》课程 第十九讲 C 程序设计语言应用

《计算概论》课程 第十九讲  C 程序设计语言应用 计算概论 A 程序设计部分 字符数组与字符串 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn 字符数组的定义 #include int main() char a[10] = 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ; for (int i = 0; i < 10; i++) cout

More information

nooog

nooog C : : : , C C,,, C, C,, C ( ), ( ) C,,, ;,, ; C,,, ;, ;, ;, ;,,,, ;,,, ; : 1 9, 2 3, 4, 5, 6 10 11, 7 8, 12 13,,,,, 2008 1 1 (1 ) 1.1 (1 ) 1.1.1 ( ) 1.1.2 ( ) 1.1.3 ( ) 1.1.4 ( ) 1.1.5 ( ) 1.2 ( ) 1.2.1

More information

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023) ( CIP) /. :, 2005. 2 ( ) ISBN 7-5624-3339-9.......... TP311. 1 CIP ( 2005) 011794 : : : : * : : 174 ( A ) :400030 : ( 023) 65102378 65105781 : ( 023) 65103686 65105565 : http: / /www. cqup. com. cn : fxk@cqup.

More information

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式] 指针 Pointers 变量指针与指针变量 Pointer of a variable 变量与内存 (Variables and Memory) 当你声明一个变量时, 计算机将给该变量一个内存, 可以存储变量的值 当你使用变量时, 计算机将做两步操作 : - 根据变量名查找其对应的地址 ; - 通过地址对该地址的变量内容进行读 (retrieve) 或写 (set) 变量的地址称为变量的指针! C++

More information

图书在版编目穴 CIP 雪数据做事细节全书 / 赵彦锋编著郾 北京 : 企业管理出版社, ISBN Ⅰ 郾做... Ⅱ 郾赵... Ⅲ 郾工作方法 通俗读物 Ⅳ 郾 B 中国版本图书馆 CIP 数据核字 (2005) 第 号 书

图书在版编目穴 CIP 雪数据做事细节全书 / 赵彦锋编著郾 北京 : 企业管理出版社, ISBN Ⅰ 郾做... Ⅱ 郾赵... Ⅲ 郾工作方法 通俗读物 Ⅳ 郾 B 中国版本图书馆 CIP 数据核字 (2005) 第 号 书 做事细节全书 赵彦锋著 企业管理出版社 图书在版编目穴 CIP 雪数据做事细节全书 / 赵彦锋编著郾 北京 : 企业管理出版社, 2005.11 ISBN 7-80197-338-0 Ⅰ 郾做... Ⅱ 郾赵... Ⅲ 郾工作方法 通俗读物 Ⅳ 郾 B026-49 中国版本图书馆 CIP 数据核字 (2005) 第 136676 号 书 名 : 做事细节全书 作 者 : 赵彦锋 责任编辑 : 吴太刚

More information

C C

C C C C 2017 3 8 1. 2. 3. 4. char 5. 2/101 C 1. 3/101 C C = 5 (F 32). 9 F C 4/101 C 1 // fal2cel.c: Convert Fah temperature to Cel temperature 2 #include 3 int main(void) 4 { 5 float fah, cel; 6 printf("please

More information

C 语言程序设计 ( 第 33 版 )) #define PI // 下面 2 行是函数的原型说明部分 double sup_area(double r); double volume(double r); // 下面是主函数部分 { double a=-5,b,c,d; b=fab

C 语言程序设计 ( 第 33 版 )) #define PI // 下面 2 行是函数的原型说明部分 double sup_area(double r); double volume(double r); // 下面是主函数部分 { double a=-5,b,c,d; b=fab 第 1 章 C 语言基础与顺序结构 学习目标 1. 掌握 C 语言程序的结构 2. 合理选用数据类型 3. 掌握算术运算符和赋值运算符 4. 掌握控制数据的输入 输出方法 5. 掌握顺序结构以及顺序结构的流程 6. 掌握 Visual C++ 6.0 集成环境的使用方法 7. 掌握转换大小写字母的方法 8. 掌握产生随机整数的方法 计算机由硬件系统和软件系统组成, 其中硬件是物质基础, 而软件是计算机的灵魂

More information

科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心

More information

科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心

More information

科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心 科学出版社职教技术出版中心

More information

JAVA 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:/

JAVA 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:/ 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:// 不能以数字开头 D._3_ B:// 不能用点和空格 提问 抢答 E.$anothervar C: // 不能用点和空格

More information

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3 浙江大学 C 程序设计及实验 试题卷 2002-2003 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:30-10:30 注意 : 答题内容必须写在答题卷上, 写在本试题卷上无效 一. 单项选择题 ( 每题 1 分, 共 10 分 ) 1. 下列运算符中, 优先级最低的是 A.

More information

网C试题(08上).doc

网C试题(08上).doc 学习中心 姓名 学号 西安电子科技大学网络与继续教育学院 高级语言程序设计 (C) 全真试题 ( 闭卷 90 分钟 ) 题号一二三总分 题分 60 20 20 得分 一 单项选择题 ( 每小题 3 分, 共 60 分 ) 1.C 语言程序的基本单位是 A) 程序行 B) 语句 C) 函数 D) 字符 2. 下列四组选项中, 均是不合法的用户标识符的选项是 A)A B)getc C)include D)while

More information

期中考试试题讲解

期中考试试题讲解 一 选择题 ( 一 ) 1. 结构化程序设计所规定的三种基本结构是 C A 主程序 子程序 函数 B 树形 网形 环形 C 顺序 选择 循环 D 输入 处理 输出 2. 下列关于 C 语言的叙述错误的是 A A 对大小写不敏感 B 不同类型的变量可以在一个表达式中 C main 函数可以写在程序文件的任何位置 D 同一个运算符号在不同的场合可以有不同的含义 3. 以下合法的实型常数是 C A.E4

More information

图书在版编目 (CIP) 数据程序员的数学. 3, 线性代数 /( 日 ) 平冈和幸, ( 日 ) 堀玄著 ; 卢晓南译. 北京 : 人民邮电出版社, ( 图灵程序设计丛书 ) ISBN Ⅰ. 1 程 Ⅱ. 1 平 2 堀 3 卢 Ⅲ. 1 电子计算

图书在版编目 (CIP) 数据程序员的数学. 3, 线性代数 /( 日 ) 平冈和幸, ( 日 ) 堀玄著 ; 卢晓南译. 北京 : 人民邮电出版社, ( 图灵程序设计丛书 ) ISBN Ⅰ. 1 程 Ⅱ. 1 平 2 堀 3 卢 Ⅲ. 1 电子计算 图灵程序设计丛书 程序员的数学 3: 线性代数 [ 日 ] 平冈和幸堀玄著 卢晓南译 图书在版编目 (CIP) 数据程序员的数学. 3, 线性代数 /( 日 ) 平冈和幸, ( 日 ) 堀玄著 ; 卢晓南译. 北京 : 人民邮电出版社, 2016.3 ( 图灵程序设计丛书 ) ISBN 978-7-115-41774-9 Ⅰ. 1 程 Ⅱ. 1 平 2 堀 3 卢 Ⅲ. 1 电子计算机 数学基础 2

More information

ch02_Basic

ch02_Basic 主要内容 C++ 语言概述 C++ 的发展 C++ 源程序结构与书写规范 C++ 编译器和集成开发环境 C++ 编程基础 数据的简单输入输出 2 C++ 语言概述 C++ 语言概述 C++ 的发展 - C++ 是从 C 语言发展演变而来, 可以看成是 C 的超集 - 1980 年由 Bjarne Stroustrup 开发创建 - 1983 年正式取名为 C++,1989 年开始 C++ 的标准化工作

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 第二讲 C++ 编程基础 主要内容 C++ 语言概述 C++ 的发展 C++ 源程序结构与书写规范 C++ 编译器和集成开发环境 C++ 编程基础 数据的简单输入输出 2 C++ 语言概述 C++ 的发展 - C++ 是从 C 语言发展演变而来, 可以看成是 C 的超集 - 1980 年由 Bjarne Stroustrup 开发创建 - 1983 年正式取名为 C++,1989 年开始 C++ 的标准化工作

More information

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2

运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2 第十一讲 运算符重载 与类型转换 运算符重载 为什么要 运算符重载 那些运算符可以重载, 哪些不可以 如何实现运算符重载 实现方式 : 成员函数与非成员函数 类型转换 怎样实现对象与基本数据类型数据的运算 2 为什么要运算符重载 预定义的运算符只针对基本数据类型, 若要对类的对象进行类似的运算, 需要重新定义运算符的功能 运算符重载实质就是函数重载 : 对已有的运算符赋予多重含义, 使得同一个运算符作用于不同类型的数据时导致不同的行为

More information

Microsoft Word - YYCXfm.DOC

Microsoft Word - YYCXfm.DOC C 语言程序设计 王曙燕主编曹锰副主编 北京 内容简介 本书共 13 章, 主要内容包括 C 语言的基本概念 基本语法和基本数据结构, 另外, 给出了一个小型超市管理的综合实例, 介绍了 C 语言图形程序设计的基本方法, 还简单介绍了 C++ Visual C++ 和 C# 等面向对象程序设计语言 本书注重应用性和实践性, 通过一些典型算法的解题分析及其实现给读者一些解题示范和启发 每章后面配有习题,

More information

download.kaoyan.com_2006ÄêÌì½ò¹¤Òµ´óѧ¸ß¼¶ÓïÑÔ³ÌÐòÉè¼Æ£¨409£©¿¼ÑÐÊÔÌâ

download.kaoyan.com_2006ÄêÌì½ò¹¤Òµ´óѧ¸ß¼¶ÓïÑÔ³ÌÐòÉè¼Æ£¨409£©¿¼ÑÐÊÔÌâ 考生注意 : 本试卷共七大题, 满分 150 分 考试时间为 3 小时 ; 所有答案均写在答题纸上 ( 注明题号 ), 在此答题一律无效无效 一 选择题 ( 本题共 20 小题, 每小题 2 分, 满分 40 分 ) 1 char ch 1 2 A 0

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章流程控制和数组 3.1 实验目的 (1) 熟练掌握控制台应用程序的代码编写和调试, 以及运行方法 (2) 掌握选择结构的一般语法格式和应用 (3) 掌握 switch 语句的用法 (4) 掌握选择结构的嵌套的用法, 能灵活使用选择结构解决实际问题 (5) 掌握 while 循环语句的一般语法格式 (6) 掌握 for 循环语句的一般语法格式 (7) 掌握循环嵌套的语法格式 (8) 掌握一维数组的定义

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

任务 3 加法运算练习游戏 019 这就需要用到 C# 语言的基础语法, 如数据类型 运算符和控制语句, 还需要其他的常用控件 在此任务的完成过程中, 读者可以接触到 C# 的数据类型 变量常量 运算符 控制语句等基础语法, 掌握以上知识点及其在软件开发中的应用 3.2 相关知识 预定义

任务 3 加法运算练习游戏 019 这就需要用到 C# 语言的基础语法, 如数据类型 运算符和控制语句, 还需要其他的常用控件 在此任务的完成过程中, 读者可以接触到 C# 的数据类型 变量常量 运算符 控制语句等基础语法, 掌握以上知识点及其在软件开发中的应用 3.2 相关知识 预定义 任务 3 加法运算练习游戏 3.1 情境描述 选择了开发环境并理解了事件驱动机制以后, 要开发项目, 还需掌握 C# 语言的语法 本任务的目标是完成如图 3.1 和图 3.2 所示的小学生加法运算练习游戏 这个小软件的功能是在窗体中的 + 两边出现 2 个 10 以内的随机数, 让用户 ( 适合于小学生 ) 在文本框内输入其和, 然后单击 OK 按钮 若输入的和是正确的, 则跳出一个红色的图片, 同时提示答对了,

More information

Introduction to Computer Systems /18-243, spring st Lecture, Jan. 12th

Introduction to Computer Systems /18-243, spring st Lecture, Jan. 12th 计算机组成原理习题课 1 授课老师 : 王浩宇 haoyuwang@bupt.edu.cn 1 练习 : 机器数的表示和相互转化 练习 1: 当十六进制数 9B 和 FF 分别表示为原码 补码 反码 移码和无符号数时, 所对应的十进制数各为多少 ( 设机器数采用一位符号位 )? 16 进制 真值 无符号数 原码 ( 真值 ) 反码 ( 真值 ) 补码 ( 真值 ) 移码 ( 真值 ) 9BH 二进制十进制

More information

<4D F736F F F696E74202D20B5DA32D5C220B5A5C6ACBBFA433531D3EFD1D4BBF9B4A1>

<4D F736F F F696E74202D20B5DA32D5C220B5A5C6ACBBFA433531D3EFD1D4BBF9B4A1> 第 2 章 单片机 C51 语言基础 2.1 C51 语言的基本知识 2.2 运算符与表达式 2.3 指针与绝对地址访问 2.4 本章小结 2.5 实训二发光二极管流水广告灯 返回首页 教学提示 随着单片机开发技术的不断发展, 目前已有越来越多 的人从普遍使用汇编语言逐渐过渡到使用高级语言开发, 其中又以 C 语言为主, 市场上几种常见的单片机均有其 C 语言开发环境 应用于 51 系列单片机开发的

More information

内容简介 本书以教育部高等学校计算机科学与技术教学指导委员会编制的 关于进一步加强高等学校计算机基础教学的意见暨计算机基础课程教学基本要求 中有关计算机程序设计基础 (C 语言 ) 课程教学基本要求为指导, 结合教育部考试中心最新的全国计算机等级考试二级 (C 语言程序设计 ) 考试大纲要求和作者多

内容简介 本书以教育部高等学校计算机科学与技术教学指导委员会编制的 关于进一步加强高等学校计算机基础教学的意见暨计算机基础课程教学基本要求 中有关计算机程序设计基础 (C 语言 ) 课程教学基本要求为指导, 结合教育部考试中心最新的全国计算机等级考试二级 (C 语言程序设计 ) 考试大纲要求和作者多 普通高等教育 十二五 重点规划教材公共课系列 中国科学院教材建设专家委员会 十二五 规划教材 C 语言程序设计 张淑华朱丽莉主编 于雪晶顾煜新副主编 北京 内容简介 本书以教育部高等学校计算机科学与技术教学指导委员会编制的 关于进一步加强高等学校计算机基础教学的意见暨计算机基础课程教学基本要求 中有关计算机程序设计基础 (C 语言 ) 课程教学基本要求为指导, 结合教育部考试中心最新的全国计算机等级考试二级

More information

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点

OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 复习 : Java 类型 基本类型 boolean, char, 封装 (wrappers) 类 (class) 定义 class MyType { int i; double d; 数据 (Fields) char c; void set(double

More information

科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心

More information

科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心

More information

科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心

More information

科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心 www.aboo 科学出版社职教技术出版中心

More information

高等学校计算机应用规划教材 C 语言程序设计 梁海英张红军主编 千文陈科尹孟伟东曾霖副主编 北 京

高等学校计算机应用规划教材 C 语言程序设计 梁海英张红军主编 千文陈科尹孟伟东曾霖副主编 北 京 高等学校计算机应用规划教材 C 语言程序设计 梁海英张红军主编 千文陈科尹孟伟东曾霖副主编 北 京 内 容 简 介 本书按照程序设计的体系结构 系统地介绍了 C 语言程序设计的基本思想及基本方法 全书内容分为三 部分 第一部分(第 1 7 章)依次介绍了 C 语言程序设计的基本应用 包括 C 语言程序的结构 数据类型 及其运算 基本语句 结构化程序设计的顺序结构 选择结构 循环结构 数组及函数的开发方法与应用实

More information

第 1 章 C 语言的发展 特点与程序结构 本章主要介绍了 C 语言的发展 特点和程序结构, 重点阐述了程序设计的基本方法, 包括面向过程的程序设计和面向对象的程序设计 ; 算法的概念及其表示, 包括用自然语言 流程图 伪代码 N-S 流程图的表示方法 ; 最后介绍了 C 语言应用程序的开发过程 1

第 1 章 C 语言的发展 特点与程序结构 本章主要介绍了 C 语言的发展 特点和程序结构, 重点阐述了程序设计的基本方法, 包括面向过程的程序设计和面向对象的程序设计 ; 算法的概念及其表示, 包括用自然语言 流程图 伪代码 N-S 流程图的表示方法 ; 最后介绍了 C 语言应用程序的开发过程 1 C 语言程序设计 电子教程 主编 : 杨健霑副主编 : 汪同庆 1 第 1 章 C 语言的发展 特点与程序结构 本章主要介绍了 C 语言的发展 特点和程序结构, 重点阐述了程序设计的基本方法, 包括面向过程的程序设计和面向对象的程序设计 ; 算法的概念及其表示, 包括用自然语言 流程图 伪代码 N-S 流程图的表示方法 ; 最后介绍了 C 语言应用程序的开发过程 1.1 C 语言的发展与特点 1.1.1

More information

教学输入与学习者的语言输出 温晓虹 本文从三个方面探讨了语言的输入与输出的关系 首先从理论研究的角度讨 论了从语言输入到语言输出的习得过程 实验研究表明 输入的语言素材必须被学习者所接收 即使接收了的内容也并不会自动进入中介语的体系 而是需要进一步对输入语言进行 分解 归类等分析性与综合性的处理 在语言 内化 的基础上 学习者的中介语系统才能 够不断地得到重新组合 趋于目的语 另外 学习者在语言输出前和输出时需要调节

More information

数据结构

数据结构 信息管理与信息系统专业 第 3 章变量与表达式 任课教师 : 吕雅丽 本章内容 3.1 C# 基本数据类型 3.2 常量与变量 3.3 创建并使用枚举类型 3.4 运算符与表达式类型 3.5 运算符的优先级与结合性 2 3.1 C# 基本数据类型 3.1.1 数值类型 1. 整数类型 整数类型又有有符号整数与无符号整数 有符号整数可以带正负号, 无符号整数不需带正负号, 默认为正数 有符号整数包括

More information

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢

OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 : Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 复习 : Java 类型 基本类型 boolean, char, 封装 (wrappers) 类 (class) 定义 class MyType { int i;

More information

STRUCT Tag OptTag ID Tag ID 7..4 Declarators VarDec ID VarDec LB INT RB FunDec ID LP VarList RP ID LP RP VarList ParamDec COMMA VarList ParamDec Param

STRUCT Tag OptTag ID Tag ID 7..4 Declarators VarDec ID VarDec LB INT RB FunDec ID LP VarList RP ID LP RP VarList ParamDec COMMA VarList ParamDec Param 7. 附录 A:C 语言文法 在本附录中, 我们给出 C 语言的文法定义和补充说明 7. 文法定义 7.. Tokens INT /* A sequence of digits without spaces */ FLOAT /* A real number consisting of digits and one decimal point. The decimal point must be surrounded

More information

プログラムの設計と実現II

プログラムの設計と実現II UNIX C ls mkdir man http://www.tj.chiba-u.jp/lecture/prog2/ Ctrl+x, Ctrl+s ( )..[4]% gcc Wall o hoge hoge.c..[5]%./hoge 1 : 1 2 : 2 3 : 3 4 : 0 6..[6]% (! )..[4]% gcc Wall o hoge hoge.c..[5]%!g gcc Wall

More information

关于编写硕士研究生入学考试自命题初试科目

关于编写硕士研究生入学考试自命题初试科目 华北水利水电大学 2019 年硕士研究生入学考试初试科目考试大纲 农业综合知识三 ( 科目代码 :341) 考试大纲 考试形式和试卷结构一 试卷分值及考试时间考试时间 180 分钟 (3 个小时 ), 满分 150 分二 考试基本要求本考试大纲适用于报考华北水利水电大学农业工程与信息技术专业硕士研究生入学考试, 该科目包括 : 数据库 c 语言程序设计 计算机网络三部分内容 三 试卷内容及结构数据库部分占

More information

文件

文件 CH10 文件 1 文件的概念 一 文件分类 二 文件的组织结构 : ASCII 码文件 ( 文本文件 ) 二进制文件 文件是二进制代码的, 则文件就是字节流 文件是 ASCII 码的, 则文件就是字符流, 也是字节流 1 如 : 对于整型变量 x, 其值为 32767 若以文本方式存放, 则共有 5 个字符, 内容为 : 00110011 00110010 00110111 00110110 00110111

More information

内容简介 C 语言是一种结构化程序设计语言, 本书通过大量的实例讲解 C 语言程序设计的方法, 主要内容包括 C 语言程序的结构 数据类型 运算符和表达式 数据的输入和输出 选择结构 循环结构 数组 函数 指针 编译预处理 结构和共用体 位运算 文件等 每个单元包括小结 实验 习题等 本书可作为高等

内容简介 C 语言是一种结构化程序设计语言, 本书通过大量的实例讲解 C 语言程序设计的方法, 主要内容包括 C 语言程序的结构 数据类型 运算符和表达式 数据的输入和输出 选择结构 循环结构 数组 函数 指针 编译预处理 结构和共用体 位运算 文件等 每个单元包括小结 实验 习题等 本书可作为高等 普通高等教育 十二五 重点规划教材计算机系列中国科学院教材建设委员会 十二五 规划教材 C 语言程序设计 张秀萍主编闫丽王淑霞副主编 北 京 科学出版社职教技术出版中心 www.aboo 内容简介 C 语言是一种结构化程序设计语言, 本书通过大量的实例讲解 C 语言程序设计的方法, 主要内容包括 C 语言程序的结构 数据类型 运算符和表达式 数据的输入和输出 选择结构 循环结构 数组 函数 指针 编译预处理

More information

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式] 函数 Function 如何重用代码 How to reuse code 3 4 = 3*3*3*3 3 4,6 5 : 拷贝 - 粘帖代码 (Copy-paste code) 3 4,6 5,12 10 : 拷贝 - 粘帖代码 (Copy-paste code) Bad! 使用函数 (with a function) 使用函数 (with a function) 使用函数 (with a function)

More information

大侠素材铺

大侠素材铺 编译原理与技术 词法分析 Ⅱ 计算机科学与技术学院李诚 13/09/2018 主要内容 记号 (token) 源程序 词法分析器 getnexttoken 语法分析器 符号表 词法分析器的自动生成 正则表达式 NFA DFA 化简的 DFA 词法分析器的生成器 Lex: flex jflex Fst lexicl nlyzer genertor 2/51 Regulr Expr to NFA 正则表达式

More information

吉林大学学报 工学版 244 第 4 卷 复杂 鉴于本文篇幅所限 具体公式可详见参考文 献 7 每帧的动力学方程建立及其解算方法如图 3 所示 图4 滚转角速度与输入量 η 随时间的变化波形 Fig 4 Waveform of roll rate and input η with time changing 图5 Fig 5 滚转角随时间的变化波形 Waveform of roll angle with

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 移动平台应用软件开发 课程建设小组北京大学二零一五年

移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 移动平台应用软件开发 课程建设小组北京大学二零一五年 移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组北京大学二零一五年 预处理 2 预处理器 C 语言的编译系统分为编译预处理和正式编译 预处理作用 : 对源程序编译之前做一些处理, 生成扩展 C 源程序 预处理器的行为是由预处理指令控制的 宏定义 文件包含 条件编译 #define #ifdef

More information

C 1

C 1 C homepage: xpzhangme 2018 5 30 C 1 C min(x, y) double C // min c # include # include double min ( double x, double y); int main ( int argc, char * argv []) { double x, y; if( argc!=

More information

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63> 第三章 Q3 1 1. 省略了 I/O 操作的复杂逻辑, 易实现, 耗费低 ; 2. 可以利用丰富的内存寻址模式实现灵活的 I/O 操作 Q3 2 假设存储单元 ds1 处寄存器地址为 0x2000, 代码如下 #define ds1 0x2000 while ( *ds1 == 0 ) ; Q3 3 假设设备 (dev1) 中有两个寄存器 ds1 和 dd1,dev1 的地址为 0x1000,ds1

More information

手册 doc

手册 doc 1. 2. 3. 3.1 3.2 3.3 SD 3.4 3.5 SD 3.6 3.7 4. 4.1 4.2 4.3 SD 4.4 5. 5.1 5.2 5.3 SD 6. 1. 1~3 ( ) 320x240~704x288 66 (2G SD 320x2401FPS ) 32M~2G SD SD SD SD 24V DC 3W( ) -10~70 10~90% 154x44x144mm 2. DVR106

More information

内容简介 本书从结构化程序设计技术出发, 以 C 程序设计语言为载体, 以 Windows 下的 Visual C 为程序调试和运行平台, 通过对典型实例的算法及相应 C 语言代码的描述, 介绍了在程序设计过程中如何对问题进行分析 如何组织数据和如何描述解决问题, 揭示了在计算机应用过

内容简介 本书从结构化程序设计技术出发, 以 C 程序设计语言为载体, 以 Windows 下的 Visual C 为程序调试和运行平台, 通过对典型实例的算法及相应 C 语言代码的描述, 介绍了在程序设计过程中如何对问题进行分析 如何组织数据和如何描述解决问题, 揭示了在计算机应用过 普通高等教育 十二五 规划教材 计算机系列规划教材 计算机程序设计基础 周启生姬涛 主编 刘菲田红梅副主编 科学出版社职教技术出版中心 www.aboo 北京 内容简介 本书从结构化程序设计技术出发, 以 C 程序设计语言为载体, 以 Windows 下的 Visual C++ 2010 为程序调试和运行平台, 通过对典型实例的算法及相应 C 语言代码的描述, 介绍了在程序设计过程中如何对问题进行分析

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 4.4.1 逻辑运算符及其优先次序 3 种逻辑运算符 : &&( 逻辑与 ) ( 逻辑或 )!( 逻辑非 ) && 和 是双目 ( 元 ) 运算符! 是一目 ( 元 ) 运算符 逻辑表达式 用逻辑运算符将关系表达式或其他逻辑量连接起来的式子 4.4.1 逻辑运算符及其优先次序 判断年龄在 13 至 17 岁之内? age>=13 && age

More information

第3章 Java语言基础

第3章 Java语言基础 第 3 章 Java 语言基础 第 1/55 页 习题 3 3. 8. 9. 13. 18. 实验 : 1. 实验 4( 实 P11~12) 2. 实验任务 : 1 例 3.1( 教 P30) 2 变量赋值 ( 教 P29) 3 编写两个缓冲区对应同一个输入流对象, 并键盘输入整型 a 和双精度 b, 求和 第 2/55 页 习题 3 3. 实验任务 : 1 实验 5( 实 P12~13) 2 实验

More information

内容简介本书主要内容包括程序设计基础知识 C 语言数据类型 运算符与表达式 程序结构 数组 指针 其他数据类型 函数 文件等, 通过对大量实例进行分析, 力求提高和培养学生的程序设计能力 本书有配套辅导教程 程序设计基础实训指导教程 C 语言 ( 科学出版社出版 ), 引导读者学习和巩固各章节内容

内容简介本书主要内容包括程序设计基础知识 C 语言数据类型 运算符与表达式 程序结构 数组 指针 其他数据类型 函数 文件等, 通过对大量实例进行分析, 力求提高和培养学生的程序设计能力 本书有配套辅导教程 程序设计基础实训指导教程 C 语言 ( 科学出版社出版 ), 引导读者学习和巩固各章节内容 普通高等教育 十二五 规划教材计算机系列中国科学院教材建设专家委员会 十二五 规划教材 程序设计基础 C 语言 杨莉刘鸿翔主编唐宏亮邓芳副主编余慧王海军 1 科学出版社职教技术出版中心 www.aboo 北 京 内容简介本书主要内容包括程序设计基础知识 C 语言数据类型 运算符与表达式 程序结构 数组 指针 其他数据类型 函数 文件等, 通过对大量实例进行分析, 力求提高和培养学生的程序设计能力 本书有配套辅导教程

More information

C/C++程序设计 - 字符串与格式化输入/输出

C/C++程序设计 - 字符串与格式化输入/输出 C/C++ / Table of contents 1. 2. 3. 4. 1 i # include # include // density of human body : 1. 04 e3 kg / m ^3 # define DENSITY 1. 04 e3 int main ( void ) { float weight, volume ; int

More information

中国科学院优秀教材普通高等教育电气信息类应用型规划教材 C 语言程序设计 ( 第二版 ) 罗朝盛主编 张银南白宝钢魏英 副主编 北 京 内容简介 本书共 10 章, 包括 :C 语言程序设计概述, 数据类型与常用库函数, 运算符与表达式, 算法与控制结构, 数组 字符串与指针, 函数, 编译预处理, 结构体 共用体与枚举类型, 文件操作,C++ 程序设计初步 本书配有大量的例题和习题, 适合教师课堂教学和读者自学

More information

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit 6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C51 6.1 C51 6.1.1 C51 C51 ANSI C MCS-51 C51 ANSI C C51 6.1 6.1 C51 bit Byte bit sbit 1 0 1 unsigned char 8 1 0 255 Signed char 8 11 128

More information

内容简介 本书根据全国计算机等级考试二级 C 语言程序设计考试大纲要求, 结合目前高等院校学生学习计算机程序设计课程的情况组织内容, 全面地介绍了 C 语言程序设计的基础知识, 系统地讲述了 C 语言程序设计的基本方法和技巧 本书以 ANSI C 语言标准为依据, 深入浅出地介绍了 C 语言的基本数

内容简介 本书根据全国计算机等级考试二级 C 语言程序设计考试大纲要求, 结合目前高等院校学生学习计算机程序设计课程的情况组织内容, 全面地介绍了 C 语言程序设计的基础知识, 系统地讲述了 C 语言程序设计的基本方法和技巧 本书以 ANSI C 语言标准为依据, 深入浅出地介绍了 C 语言的基本数 普通高等教育计算机系列规划教材 C 语言程序设计 ( 第二版 ) 姜海涛主编曹震中武楠王妍闫超刘红娟叶永凯卫娜副主编 副主编 科学出版社职教技术出版中心 www.aboo 北京 内容简介 本书根据全国计算机等级考试二级 C 语言程序设计考试大纲要求, 结合目前高等院校学生学习计算机程序设计课程的情况组织内容, 全面地介绍了 C 语言程序设计的基础知识, 系统地讲述了 C 语言程序设计的基本方法和技巧

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

4.C ( 详细解析见视频课程 绝对值 01 约 21 分 15 秒处 ) 5.E ( 详细解析见视频课程 绝对值 01 约 32 分 05 秒处 ) 6.D ( 详细解析见视频课程 绝对值 02 约 4 分 28 秒处 ) 7.C ( 详细解析见视频课程 绝对值 02 约 14 分 05 秒处 )

4.C ( 详细解析见视频课程 绝对值 01 约 21 分 15 秒处 ) 5.E ( 详细解析见视频课程 绝对值 01 约 32 分 05 秒处 ) 6.D ( 详细解析见视频课程 绝对值 02 约 4 分 28 秒处 ) 7.C ( 详细解析见视频课程 绝对值 02 约 14 分 05 秒处 ) [ 说明 ] 1. 以下所指教材是指朱杰老师的 管理类联考综合能力数学套路化攻略 2. 该文档中所标答案和参见的教材答案, 与视频有冲突的, 以视频答案为准! 基础篇 第 1 章 数 1.2.1 整数例题答案 : 1. A ( 详细解析见教材 P7 例 2) 2. D ( 详细解析见视频课程 数的性质 约 10 分 53 秒处 ) 3. C ( 详细解析见教材 P7 例 3) 4.E ( 详细解析见视频课程

More information

设计模式 Design Patterns

设计模式 Design Patterns 丁勇 Email:18442056@QQ.com 学习目标 描述 JSP 表达式语言的语法 认识使用 JSP 表达式的优点 在 JSP 中使用表达式语言 表达式语言简介 5 1 EL 为表达式语言 由两个组开发 JSP 标准标签库专家组 JSP 2.0 专家组 JSP 表达式语言的语法 ${EL Expression} JSP EL 表达式用于以下情形 静态文本 标准标签和自定义标签 表达式语言简介

More information

5 2. 过程与方法 情感 态度与价值观 三 知识结构图 四 教学内容和教学要求 课 程 教学要求 课时安排

5 2. 过程与方法 情感 态度与价值观 三 知识结构图 四 教学内容和教学要求 课 程 教学要求 课时安排 单元教学综述 一 内容概述 2 IE 5 5 10 11 12 13 14 二 教学目标 1. 知识与技能 1 2 3 4 5 2. 过程与方法 1 2 3 4 3. 情感 态度与价值观 1 2 3 三 知识结构图 四 教学内容和教学要求 课 程 教学要求 课时安排 1 10 1 2 11 1 1 2 12 1 2 3 4 1 小学信息技术第 3 册教师用书 续表 课 程 教学要求 课时安排 13

More information

图书在版编目 (CIP) 数据 满堂花醉 / 沈胜衣著. 南京 : 江苏教育出版社, ( 沈郎文字 ) ISBN Ⅰ. 满... Ⅱ. 沈... Ⅲ. 作家 - 人物研究 - 世界 Ⅳ.K815.6 中国版本图书馆 CIP 数据核字 (2005) 第 041

图书在版编目 (CIP) 数据 满堂花醉 / 沈胜衣著. 南京 : 江苏教育出版社, ( 沈郎文字 ) ISBN Ⅰ. 满... Ⅱ. 沈... Ⅲ. 作家 - 人物研究 - 世界 Ⅳ.K815.6 中国版本图书馆 CIP 数据核字 (2005) 第 041 图书在版编目 (CIP) 数据 满堂花醉 / 沈胜衣著. 南京 : 江苏教育出版社, 2005.4 ( 沈郎文字 ) ISBN 7-5343-6512-0 Ⅰ. 满... Ⅱ. 沈... Ⅲ. 作家 - 人物研究 - 世界 Ⅳ.K815.6 中国版本图书馆 CIP 数据核字 (2005) 第 041843 号 出版者社址网址出版人 南京市马家街 31 号邮编 :210009 http://www.1088.com.cn

More information

语言教程 1 C 语言概述 C 语言的发展过程 当代最优秀的程序设计语言 C 语言版本 C 语言的特点 面向对象的程序设计语言 C 和 C 简单的 C 程序介绍 输入和

语言教程 1 C 语言概述 C 语言的发展过程 当代最优秀的程序设计语言 C 语言版本 C 语言的特点 面向对象的程序设计语言 C 和 C 简单的 C 程序介绍 输入和 语言教程 1 C 语言概述...6 1.1 C 语言的发展过程...6 1.2 当代最优秀的程序设计语言...6 1.3 C 语言版本...7 1.4 C 语言的特点...7 1.5 面向对象的程序设计语言...7 1.6 C 和 C++...8 1.7 简单的 C 程序介绍...8 1.8 输入和输出函数...9 1.9 C 源程序的结构特点...10 1.10 书写程序时应遵循的规则...10

More information

Microsoft Word - FM{new}.doc

Microsoft Word - FM{new}.doc Lanczos 方法 Louis Komzsik 著张伟廖本善译 演变与应用 清华大学出版社 北京 内容简介 Lanczos 方法是 20 世纪计算数学方向最有影响的方法之一, 并且已经在工程中得到了广泛应用. 本书兼顾了 Lanczos 方法的理论演变和工程中的实际应用, 其内容分为两部分 : 第一部分阐述了方法的演变, 并提供了具体算法 ; 第二部分讨论了工业中的实际应用, 包括常用的模态分析

More information

Mx* Language Reference Manual 2016 年 4 月 7 日 1 用词说明 未定义 指中央还没有表态指语言定义中不涉及的部分, 编译器和运行时环境如何表现是未知的 主要是为了给学生实现语言留下足够的空间, 标准测试集里不会出现涉及未定义部分的内容 例如 : 术语 : 源程

Mx* Language Reference Manual 2016 年 4 月 7 日 1 用词说明 未定义 指中央还没有表态指语言定义中不涉及的部分, 编译器和运行时环境如何表现是未知的 主要是为了给学生实现语言留下足够的空间, 标准测试集里不会出现涉及未定义部分的内容 例如 : 术语 : 源程 Mx* Language Reference Manual 2016 年 4 月 7 日 1 用词说明 未定义 指中央还没有表态指语言定义中不涉及的部分, 编译器和运行时环境如何表现是未知的 主要是为了给学生实现语言留下足够的空间, 标准测试集里不会出现涉及未定义部分的内容 例如 : 术语 : 源程序大小超过 256M 是未定义的 解释 : 我们测试用的源程序大小不会超过 256M 2 程序结构 Mx*

More information

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx

Microsoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx 运算符重载 Operator Overloading class Point { public: ; double x_, y_; Why Operator Overloading? Point (double x =0, double y = 0):x_(x),y_(y) { int main(){ Point a(1., 2), b(3,4); Point c = a + b; return 0;

More information

工程项目进度管理 西北工业大学管理学院 黄柯鑫博士 甘特图 A B C D E F G 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 甘特图的优点 : 直观明了 ( 图形化概要 ); 简单易懂 ( 易于理解 ); 应用广泛 ( 技术通用 ) 甘特图的缺点 : 不能清晰表示活动间的逻辑关系 WBS 责任分配矩阵 ( 负责〇审批

More information

C

C C 14 2017 5 31 1. 2. 3. 4. 5. 2/101 C 1. ( ) 4/101 C C ASCII ASCII ASCII 5/101 C 10000 00100111 00010000 ASCII 10000 31H 30H 30H 30H 30H 1 0 0 0 0 0 ASCII 6/101 C 7/101 C ( ) ( ) 8/101 C UNIX ANSI C 9/101

More information

Microsoft PowerPoint - 07 派生数据类型

Microsoft PowerPoint - 07 派生数据类型 能源与动力工程学院 目录 派生类型 陈 斌 固有数据类型 数值型 (numerical) 整型 INTEGER 实型 REAL 复数型 COMPLEX 非数值型 字符型 CHARACTER 逻辑型 ( 布尔型 )LOGICAL 自定义数据类型 ( 派生类型, derived type) 派生类型是指用户利用 Fortran 系统内部类型, 如整型 实型 复数型 逻辑型 字符型等的组合自行创建出一个新的数据类型,

More information

! " # " " $ % " " # # " $ " # " #! " $ "!" # "# # #! &$! ( % "!!! )$ % " (!!!! *$ ( % " (!!!! +$ % " #! $!, $ $ $ $ $ $ $, $ $ "--. %/ % $ %% " $ "--/

!  #   $ %   # #  $  #  #!  $ ! # # # #! &$! ( % !!! )$ %  (!!!! *$ ( %  (!!!! +$ %  #! $!, $ $ $ $ $ $ $, $ $ --. %/ % $ %%  $ --/ "##$ "% "##& " "##( )$ "##%! ) "##$ * "##( "##$ "##(!!!!!!!!! ! " # " " $ % " " # # " $ " # " #! " $ "!" # "# # #! &$! ( % "!!! )$ % " (!!!! *$ ( % " (!!!! +$ % " #! $!, $ $ $ $ $ $ $, $ $ "--. %/ % $

More information

幻灯片 1

幻灯片 1 第一类换元法 ( 凑微分法 ) 学习指导 复习 : 凑微分 部分常用的凑微分 : () n d d( (4) d d( ); (5) d d(ln ); n n (6) e d d( e ); () d d( b); ); () d d( ); (7) sin d d (cos ) 常见凑微分公式 ); ( ) ( ) ( b d b f d b f ); ( ) ( ) ( n n n n d f

More information

Microsoft Word - VB全文.doc

Microsoft Word - VB全文.doc 实验 5 顺序结构 一 实验目的 1. 熟悉常用的输入和输出的方法 2. 掌握 InputBox 函数和 MsgBox 函数的用法 3. 掌握编写顺序结构程序的一般步骤 二 实验内容 1. 设计一个计算圆面积的程序 要求 : 利用 InputBox 函数输入圆的半径, 利用 MsgBox 显示最后的计算结果 2. 设计一个简单的水果商店结算程序 要求 : 利用文本框输入香蕉 梨子 苹果三类水果的单价和重量,

More information

Ps22Pdf

Ps22Pdf C ( CIP) C /. :, 2001. 7 21 ISBN 7-5624 -2355-5. C........ C. TP312 CIP ( 2001 ) 034496 C * * : 7871092 1 /16 : 14. 25 : 356 20017 1 20017 1 : 1 6 000 ISBN 7-5624-2355-5 / TP311 : 21. 00 C, C,,,, C,, (

More information