Size: px
Start display at page:

Download ""

Transcription

1 普通高等教育 十二五 规划教材中国科学院教材建设专家委员会规划教材 C 语言程序设计 何丽余平主编 胡勇刘云杰陈勇副主编 北 京

2

3 内容简介 本书根据教育部计算机基础课程教学指导分委员会制定的 高级语言程序设计 课程的教学基本要求和全国高等学校非计算机专业学生计算机等级考试教学大纲要求, 以 C 语言为主要内容, 介绍了结构化程序设计的方法 本书主要内容有 C 语言概述 C 语言程序基础 结构化程序设计 数组 函数 指针 结构体和共用体 文件 各章均包含了具体的知识内容与操作实例 另外, 附录中有 C 语言要使用的 ASCII 码表 运算符表和常用函数介绍 本书内容丰富 由浅入深, 语言通俗易懂, 适合于高等学校作为教材使用, 也可供从事计算机应用和开发的各类人员使用 本书每章后面有丰富的习题, 供读者练习使用 本书配有电子教案及丰富的网络教学资源, 请访问精品课程网站 计算机基础教学网站 ( 图书在版编目 CIP 数据 C 语言程序设计 / 何丽, 余平主编. 北京 : 科学出版社,2011 ( 普通高等教育 十二五 规划教材 中国科学院教材建设专家委员会规划教材 ) ISBN Ⅰ.1 C Ⅱ.1 何 2 余 Ⅲ.1 C 语言 - 程序设计 - 高等职业教育 - 教材 Ⅳ.1 TP312 中国版本图书馆 CIP 数据核字 (2011) 第 号 责任编辑 : 吕燕新李太铼艾冬冬 / 责任校对 : 耿耘 责任印制 : 吕春珉 / 封面设计 : 耕者设计工作室 科学出版社发行 各地新华书店经销 * 2012 年 1 月第一版 开本 : / 年 1 月第一次印刷 印张 :14 字数 : 定价 :25.00 元 ( 如有印装质量问题, 我社负责调换 双青 ) 销售部电话 编辑部电话 版权所有, 侵权必究举报电话 : ; ;

4

5 前 言 随着计算机技术的飞速发展, 出现了很多高级程序设计语言, 其中 C 语言是推广应 用最迅速的 而今,C 语言不仅为计算机专业工作者使用, 而且为广大计算机应用人员 所喜爱和使用, 学习 C 语言已经成为社会和个人对掌握程序设计思想的需要 C 语言是一种理想的结构化程序设计语言, 支持自顶向下 逐步求精的程序设计技 术, 通过 C 语言函数结构可以方便地实现程序的模块化 C 语言功能丰富 表达能力强 程序执行效率高 可移植性好 C 语言既具有高级计算机程序设计语言的特点, 同时又 具有汇编语言的部分特点, 因此它具有较强的系统处理能力 在 C 语言基础上发展起来 的面向对象程序设计语言, 如 C++ Java C# 等与 C 语言有许多共同的特征 掌握好 C 语言, 对学习和应用这些面向对象程序设计语言有极大的帮助,C 语言也为非计算机专 业的计算机基础教学提供了一个非常优秀的程序设计平台 本书根据教育部计算机基础课程教学指导分委员会制定的 高级语言程序设计 课 程的教学基本要求, 本着系统 准确 合理和实用的基本原则, 由长期从事计算机基础课程教学工作的教师, 结合丰富的教学经验编写而成 本书具有知识结构合理 条理清楚, 描述准确 文字流畅, 内容由浅入深 循序渐进, 实例丰富 突出应用的特点, 且采用案例驱动的教学方式, 注重培养学生的实际操作能力, 为读者学习如何利用计算机处理信息和掌握程序设计技术打下坚实的基础 本书内容共分为 8 章 第 1 章介绍 C 语言的发展 基本特点和实验环境, 第 2 章介绍 C 语言程序基础, 第 3 章介绍 C 程序基本结构, 第 4 章介绍数组, 第 5 章介绍函数, 第 6 章介绍指针, 第 7 章介绍结构体和共用体, 第 8 章介绍文件的相关知识 全书所有程序均在 Visual C 系统中调试通过 本书第 1 2 章由重庆师范大学刘云杰编写, 第 3 章由重庆师范大学何丽编写, 第 4 章及附录 A~C 由重庆师范大学余平编写, 第 5 章由重庆师范大学蒋明宇编写, 第 6 章由重庆师范大学陈勇编写, 第 7 8 章由重庆交通大学胡勇编写 全书由重庆师范大学的何丽 余平主编并负责组织 策划 统稿等工作 本书在编写过程中, 得到了重庆师范大学同仁和科学出版社的大力支持, 在此表示最衷心的感谢! 由于编者水平有限, 书中难免存在不足或疏漏之处, 欢迎广大读者批评指正 编者 2011 年 11 月于重庆

6

7 目 录 前言第 1 章 C 语言概述 C 语言出现的历史背景 C 语言的基本特点 C 语言的发展 K&R C ANSI C 和 ISO C C C1X C 语言的程序结构 C 语言程序上机环境 7 第 2 章 C 语言程序基础 变量和常量 变量名 基本数据类型 常量 变量的说明 运算符和表达式 算术运算符 关系运算符与逻辑运算符 自增运算符与自减运算符 按位运算符 赋值运算符 逗号运算符 条件运算符 运算符优先级与求值顺序 类型转换 预处理 宏定义和宏展开 文件包含 25 习题 25 第 3 章结构化程序设计 顺序结构程序设计 赋值语句 输入 / 输出函数 28

8 iv 目 录 3.2 选择结构程序设计 if 语句 条件运算符 switch 语句 选择结构程序设计举例 循环结构程序设计 四种循环结构 循环的嵌套 break 与 continue 语句 循环结构程序设计举例 51 习题 54 第 4 章数组 一维数组 一维数组的定义 数组中元素的引用 一维数组的初始化 一维数组应用举例 二维数组 二维数组的定义 二维数组的引用 二维数组的初始化 二维数组应用举例 字符数组 字符数组的定义和赋值 字符串的输入和输出 字符串常用处理函数 字符串应用举例 72 习题 77 第 5 章函数 函数简述 函数定义和调用 函数的定义和声明 函数的调用和参数传递 数组作为函数参数 函数的嵌套调用和递归调用 函数的嵌套调用 函数的递归调用 变量的作用域和生存期 变量的作用域 99 C 语言程序设计

9 目 录 v 变量的生存期 内部函数和外部函数 内部函数 外部函数 106 习题 106 第 6 章指针 地址与指针 指针变量 指针变量的定义 指针变量的引用 指针变量作为函数参数 指针与数组 数组名是一个常量指针 数组元素的指针表示 指向数组元素的指针变量 数组名作函数参数 字符串与针指变量 字符串的表示 字符串指针作函数的参数 字符串指针变量与字符数组的区别 函数指针变量 指针型函数 指针数组和指向指针的指针 指针数组 指向指针的指针 main 函数的参数 有关指针的数据类型和指针运算的小结 常见指针类型 指针的运算 void 指针类型 156 习题 157 第 7 章结构体和共用体 结构体的概念与定义 结构体简况 定义结构体类型变量的方法 结构体变量的初始化与引用 结构体变量的输入和输出 结构体数组 结构体数组的定义 166

10 vi 目 录 结构体数组的初始化 结构体数组的引用 指针与结构体 指向结构体变量的指针 指向结构体数组的指针 用结构体变量和指向结构体的指针作函数参数 动态存储分配 链表 链表的建立 链表的遍历 链表的插入与删除 共用体 共用体的概念 共用体变量的引用 共用体变量的应用 枚举类型 用 typedef 定义类型 186 习题 187 第 8 章文件 文件概述及文件类型指针 文件概述 文件 (FILE) 类型指针 文件的打开与关闭 文件的打开 (fopen 函数 ) 文件的关闭 (fclose 函数 ) 文件的读写 输入和输出一个字符 输入和输出一个字符串 格式化的输入和输出 按 记录 的方式输入和输出 文件的定位及出错检测 文件的定位 文件操作的出错检测 201 习题 202 附录 A ASCII 码表 205 附录 B 运算符表 206 附录 C 常用函数表 207 主要参考文献 214 C 语言程序设计

11 第 1 章 第 1 章 C 语言概述 C 语言概述 C 语言是一种通用的程序设计语言, 它不受限于任何一种操作系统和机器 由于它很适合用来编写编译器和操作系统等系统软件,C 语言被称为 系统编程语言 C 语言同样适合于编写不同领域中的大多数程序 现在世界上许多软件都是在 C 语言及其衍生的各种语言的基础上开发出来的 C 语言的特点包括简洁的表达式 流行的控制流和数据结构 丰富的运算符集等 C 语言既具有一般高级语言的特性 语言本身不依赖于特定硬件, 程序可读性和可移植性强, 又具有低级语言的优势 能实现类似于汇编语言的对内存地址和二进制位的操作功能 ; 同时,C 语言限制少, 通用性强, 这些都使得 C 语言使用起来更方便 效率更高 1.1 C 语言出现的历史背景 C 语言最初是由贝尔实验室的 Dennis Ritchie( 全名 Dennis MacAlistair Ritchie) 为 UNIX 操作系统设计的, 并在 DEC PDP-11 计算机上实现 Dennis Ritchie 因此被誉为 C 语言之父, 他还和 Ken Thompson( 全名 Kenneth Lane Thompson) 一起开发了 UNIX 操作系统 作为 UNIX 操作系统和 C 语言的设计者 开发者,Dennis Ritchie 与同为 UNIX 发明人的 Ken Thompson 一起, 于 1983 年获得了由美国计算机学会 (ACM) 颁发的 图灵奖 同时, 美国计算机学会在 1983 年还设立一个名为 软件系统奖 的新奖项, 首届 软件系统奖 的获得者也是 Dennis Ritchie 和 Ken Thompson 1999 年, 因为开发了 C 语言和 UNIX 操作系统, 两人共同获得了美国国家技术奖章 C 语言和 UNIX 在发展过程可以说是相辅相成, 谈到 C 语言的历史就不得不谈到 UNIX UNIX 操作系统源自 MAC 项目的 Multics 系统 MAC 项目开始于 1964 年, 最早是由麻省理工 (MIT) 主导 通用电气和贝尔实验室共同参与的一个项目, 旨在开发出一个名为 Multics 的系统 Multics 系统的目标是要向大的用户团体提供对计算机的同时访问, 支持强大的计算数据存储, 以及允许用户在需要的时候很容易地共享他们的数据 遗憾的是,MAC 并不是一个成功的项目, 由于开发费用投入太大, 同时也由于它的一些超前的想法和设计使得系统过于庞杂, 糅合了太多特性, 开发周期过长, 系统迟迟不能提交 贝尔实验室于 1969 年退出了该项目, 通用电气的计算机部门也于 1970 年被 Honeywell 收购 Honeywell 买下通用电气的计算机部门后接管了 Multics 项目, 对它进行了持续的开发和发布 直到 1985 年,Honeywell 才停止了对 Multics 的支持 当时

12 2 第 1 章 C 语言概述 的大学 企业和政府部门已经有相当多数量的服务器运行着 Multics 系统,Honeywell 停止了对 Multics 的支持后, 用户不得不将服务器迁移到其他的系统上 已知的最后一 台运行 Multics 的服务器是在加拿大国防部, 于 2000 年 10 月 30 日关闭 尽管 Multics 没有成功, 但它在计算机领域中却占有重要的地位, 它的设计思想影 响了其后一系列的操作系统, 这其中就包括 UNIX 在 MAC 项目之初,Dennis Ritchie 和 Ken Thompson 作为贝尔实验室的工程师都被派往麻省理工学院参与了该项目 1969 年, 贝尔实验室退出 MAC 项目后,Dennis Ritchie 和 Ken Thompson 返回了贝尔实验室, 回到贝尔实验室后 Dennis Ritchie 和 Ken Thompson 决定将 Multics 进行改写, 让它在一 个较小的规模上实现, 以体现 小既是美 的设计哲学, 这一设计思想也影响到后来对 C 语言的设计, 包括 UNIX 的名字, 最早名为 Unics, 意即 Uniplexed Information and Computing Service, 以对应 Multics 的 MULTiplexed Information and Computing System 最初的 UNIX 是用汇编语言编写的, 一些应用是由叫做 B 语言的解释型语言和汇编语言混合编写的 B 语言在进行系统编程时不够强大, 所以 Dennis Ritchie 和 Ken Thompson 对其进行了改造, 并与 1971 年共同开发了 C 语言 C 语言的很多重要概念来源于 Martin Richards 开发的 BCPL 语言 1973 年 Dennis Ritchie 和 Ken Thompson 用 C 语言重写了 UNIX 在当时, 为了实现最高效率, 系统程序都是由汇编语言编写, 所以 Dennis Ritchie 和 Ken Thompson 此举是极具大胆创新和革命意义的 用 C 语言编写的 UNIX 代码简洁紧凑 易移植 易读 易修改, 为此后 UNIX 的发展奠定了坚实基础 1977 年,Dennis Ritchie 发表了不依赖于具体机器系统的 C 语言编译文本 可移植的 C 语言编译程序, 极大地推动了 C 语言的发展, 使 C 语言移植到其他机器时所需要做的工作大大简化 目前,C 语言编译器普遍存在于各种不同的操作系统中 C 语言的设计也影响了许多后来的编程语言, 例如 C++ C# Java 等 1.2 C 语言的基本特点 C 语言是面向过程的结构化程序设计语言, 它的设计的目标是能够提供这样一种程序设计语言 : 具有良好的可移植性 能像汇编语言一样可以直接通过存储器地址访问存储单元 编译后能产生有效率的机器指令, 做到代码优化 只需要尽量小的运行时态库 (run-time library) 就可以支持所编写的程序运行 遵循这样的设计思路,C 语言既提供了许多类似于汇编语言的低级处理功能, 又保持了良好的跨平台特性, 同时利用 C 语言开发的程序还具有非常高的执行效率 作为结构化程序设计语言,C 语言提供了对变量作用域 (variable scope) 和递归的支持 在 C 语言中, 所有的可执行代码都包含在名为 函数 的程序模块里 从整体结构来讲, 由 C 语言编写的程序就是由一个一个的函数组成的 尤其需要注意的是, 在 C 语言中, 函数的参数始终是通过值来传递的, 称为 值传递 (pass-by-value) C 语言 C 语言程序设计

13 1.3 C 语言的发展 3 没有直接提供现代编程语言中的 引用传递 (pass-by-reference), 但是可利用在函数参 数中传递指针的值来实现 引用传递 这里特别要强调的是, 在函数参数中传递指针仍然是 值传递, 传递的是指针的值, 指针的值也就是存储单元的地址 除此以外,C 语言还包括以下一些基本特点 : (1)C 语言简洁 紧凑 使用方便 灵活 程序书写形式自由, 每条语句用分号作为结束标志 程序中字母区分大小写 (2)C 语言提供了很多类型, 其基本类型包括字符 具有多种长度的整数和浮点数等 另外还有通过指针 数组 结构和联合派生的各种数据类型, 并允许用户自定义类型 (3) 运算符丰富, 表达式多样化 包括赋值和函数调用都作为表达式, 每个表达式都可以作为程序中的一条语句 (4) 指针提供了与具体机器无关的地址运算 (5)C 语言采用静态类型系统, 但它并不提供对类型的强制检查 这意味着, 每个变量虽然有一个类型, 但不同类型的变量可以进行相互赋值以及作比较 算术等运算 编译器允许通过隐式或显式类型转换来实现以上情况 例如, 一个字符型变量可以接收一个整数值对它赋值, 也可以跟一个整数进行大小比较和加减运算 (6)C 语言为实现结构良好的程序提供了完备的控制流结构, 如条件判断 (if else) 多分支 (switch) 循环(while for do while) 等 (7) 函数可以返回基本类型 结构 联合或指针类型的值 任何函数都可以递归调用 (8) 在编译的预处理阶段对程序文本进行替换 包含其他源文件以及进行条件编译 (9)C 语言本身没有提供输入 / 输出功能, 要实现输入 / 输出必须通过调用函数来实现 类似地,C 语言也没有直接提供诸如内存块分配 内存回收 文件访问等功能, 所有这些高层机制都是通过函数来实现的 K&R C 1.3 C 语言的发展 1978 年,Brian Kernighan 和 Dennis Ritchie 出版了 The C Programming Language 一书 这本书里面介绍的 C 语言标准被程序员们非正式地叫 K&R C 语言,K&R 就是两位作者名字的缩写 在 ANSI( 美国国家标准协会 ) 制定 C 语言标准之前,C 语言的定义就是 K&R C 在 1989 年 ANSI C 标准颁布后的很多年,K&R 依然是许多 C 语言编译器支持的最低标准要求, 只要遵循 K&R C 编写的代码, 就能够通过编译器的编译 K&R C 出版后, 包括 AT&T 在内的一些厂商在发布 C 语言编译器时, 还加入了一些新的特性, 包括以下几方面 : void 函数

14 4 第 1 章 C 语言概述 函数返回值可以是结构类型或联合类型 可以对结构类型的变量直接赋值 支持枚举类型 随着 C 语言的流行, 越来越多的厂商针对不同的操作系统都发布了 C 语言编译器, 但是它们或多或少都做了一些自己的扩展, 没有一个统一的标准, 包括附带发布的 C 语言标准函数库也没有统一, 这就使得 C 语言的标准化工作越来越迫切 ANSI C 和 ISO C 1983 年,ANSI( 美国国家标准协会 ) 成立了一个委员会, 其目的是制定 一个无歧义的且与具体机器无关的 C 语言定义, 同时又要保持 C 语言原有的 精神 最后的结果就是 1988 年完成的 ANSI C 语言标准 该标准于 1989 年被 ANSI 批准通过 (ANSI X ) 遵循这个标准的 C 语言通常被称做 ANSI C 或 标准 C, 有时候也叫做 C 年,ANSI C 标准被 ISO( 国际标准化组织 ) 采纳, 形成 ISO/IEC 9899:1990 标准, 这就是被称为 C90 的 C 语言标准 C89 和 C90 只在个别规定上有很细微的差别, 我们通常将 C89 和 C90 认为是同一个标准 C89 标准是基于 K&R C 制定的, 语言本身只做了较少的改动 对大部分程序员来说, 最重要的变化是函数声明和函数定义的新语法 在 C89 中, 函数声明可以包含描述函数实际参数的信息, 这使得编译器很容易检测到因参数不匹配而导致的错误 C89 标准还对语言做了一些细微的改进, 允许对结构变量直接赋值 ; 支持枚举类型 ; 支持单精度的浮点数运算 ; 对预处理操作做了详尽的说明 该标准还为 C 语言定义了标准函数库, 描述了诸如读写文件 格式化输入 / 输出 内存分配和字符串操作等函数 还定义了一系列的标准头文件, 它们为访问函数声明和数据类型声明提供了统一的标准, 确保了兼容性和可移植性 C89 标准被当前的绝大多数编译器所支持 目前大部分的 C 语言程序也都是基于 C89 标准来编写的 C99 在 ANSI 标准确立后, 在很长一段时间内 C 语言的规范没有大的变动 1995 年, 针对 C90 的标准修正案发表, 修正了 C90 中的细节, 并增加了对国际字符集的支持 1999 年,ISO 发布了新的 C 语言标准 ISO/IEC 9899:1999, 也就是通常所说的 C99 C99 的特性如下 : 增加了对编译器的限制 比如源程序每行要求至少支持到 4095 字节, 变量名函数名的要求支持到 63 字节 (extern 要求支持到 31 字节 ) 增强了预处理功能 支持 // 开头的单行注释 增加了新关键字 restrict, inline, _Complex, _Imaginary, _Bool 支持 long long, long double _Complex, float _Complex 等类型 C 语言程序设计

15 1.4 C 语言的程序结构 5 支持不定长的数组, 即数组长度可以在运行时决定 比如利用变量作为数组长度 声明时使用 int a[var] 的形式 不过考虑到效率和实现, 不定长数组不能用在全局或 struct 与 union 里 修改了 / % 处理负数时的定义, 这样可以给出明确的结果 例如在 C89 中有些编译器 -22/7=-3,-22%7=-1, 有些编译器 -22/7=-4,-22%7=6, 而 C99 中明确为 -22/7=-3,-22%7=-1, 只有一种结果 取消了函数返回类型默认为 int 的规定 现在编译器大多数只部分支持了 C C1X 随着 C++0X 标准的制定工作开展, 为了增强对 C++ 的兼容性, 对 C 语言标准新的修订工作也于 2007 年开始, 这就是被大家称为 C1X 的标准 C1X 中增加的内容包括 : 支持匿名结构 ; 增强对 Unicode 的支持 ; 提供对泛型宏的支持, 允许宏根据参数的类型来生成不同的内容 ; 提供对多线程的支持 ; 提供边界检查功能等 1.4 C 语言的程序结构 学习程序设计语言的目的就是要使用它来编写程序 从编写 C 语言的源程序开始, 到它最后生成可以执行的程序, 要经历编译和链接两个阶段, 如图 1-1 所示 先选择编辑器书写 C 语言源代码, 并以文本的方式保存为扩展名为.c 的源程序文件 然后通过编译器将文本方式的源文件编译成二进制的机器指令, 并生成扩展名为.obj 的目标文件 最后再通过链接器, 将本程序的目标文件和要用到的库文件以及要用到的其他目标文件一起链接起来, 生成扩展名为.exe 的可执行文件 图 1-1 生成程序的过程 下面从书写一个最简单的 C 语言程序入手来分析 C 语言程序的基本构成 #include <stdio.h> printf("hello, the world!\n"); /* 打印输出 */ 该程序通过编译 链接生成可执行程序后, 执行该程序会在屏幕打印输出字符串 :

16 6 第 1 章 C 语言概述 Hello, the world! 下面对本程序涉及内容做些说明 一个 C 语言程序, 无论其大小, 都是由函数构成的 一个主程序中只能有一个 main 函数 main 是一个特殊的函数名, 它代表了程序的入口地址, 程序在执行时要从 main 函数的起点开始执行 在 main 函数之前, 有一条预处理命令 #include <stdio.h> 用于告诉编译器在本程序中要包含输入 / 输出库的头文件信息 需要注意的是, 预处理命令并不会在程序运行的过程中执行, 而是在编译阶段由编译器来处理 程序在执行时, 始终从 main 函数的起点开始执行, 而不管它处于程序中的什么位置 函数中的语句用一对花括号括起来, 本程序中 main 仅包含下面一条语句 : printf("hello, the world!\n"); 每条语句用分号作为结束标志 上面这条语句调用了一个名为 printf 的函数 C 语言本身没有输入 / 输出语句, 输入和输出都是由库函数 scanf 和 printf 等函数来完成 调用函数时, 只需要使用函数名加上用圆括号括起来的参数表就可以了 上面这条语句将字符串 "Hello,the world!\n" 作为参数调用 printf 函数 printf 是一个用于打印输出的函数, 在标准输入 / 输出函数库中 因此, 在使用它之前要用 #include <stdio.h> 包含标准输入 / 输出库的头文件, 以便获得该函数的声明信息 用双引号括起来的字符序列被称为字符串或字符串常量, 如 "Hello, the world!\n" 就是一个字符串 另外, 在 C 语言中字符 \n 表示换行 在 printf 函数的参数中, 只能用 \n 表示换行, 不能用程序语句中本身的换行来代替 \n, 例如 : printf("hello, the world!\n"); 在程序执行后, 并不能在屏幕中输出 : Hello, the world! 相反, 它只会使该程序在编译时产生一条错误信息 如果要想产生如上所述的输出效果, 可以使用 : printf("hello, \nthe world!\n"); 在 printf 函数的参数所接收到的字符串中, 只要一遇到 \n 就会产生一个换行 另外注意到, 在 printf("hello,the world\n"); 的右边还出现了一个 /* 打印输出 */ C 语言中可以使用 /* */ 对程序中的任何部分作注释 注释中的内容不会被编译成可执行代码, 只是在源程序中起到注释的作用 在编译时, 编译器遇到 /* */ 就会把 /* */ 里的内容忽略掉 了解了 C 语言源程序的基本结构后, 可知在编写 C 语言程序的时候一般包括以下几个部分 : C 语言程序设计

17 1.5 C 语言程序上机环境 7 (1) 分析问题 仔细分析所要解决的具体问题, 明确解决问题的具体方法和步骤, 抽象出问题的数学模型 (2) 确定数据结构和算法 确定所用的数据结构, 选择一种算法描述方式将解决问 题的步骤明确化 (3) 编辑程序 选择编辑环境编写程序, 一般选择在 C 语言编程环境中进行编辑, 编辑好的文件称为源程序文件 ( 文件的扩展名为.c) (4) 编译程序 源程序文件不能直接运行, 必须用 C 语言的编译程序进行编译, 生 成计算机能识别的二进制代码组成的目标文件 ( 文件的扩展名为.obj) 在编译过程中进 行语法检查, 如果源程序中存在错误, 会给出相应错误提示, 例如 f.obj - 1 error(s), 2 warning(s), 只有当源文件中不存在错误时才生成目标文件 (5) 调试运行 程序通过编译后还不可直接运行, 需要将程序与编程环境中的库函数进行链接 (link), 形成可执行文件 ( 文件的扩展名为.exe) 运行可执行文件, 查看运行结果 如果源程序中存在语义上或设计上的错误, 运行结果就会不正确, 需要重新检查修改源程序 再编译 再运行, 直至运行结果正确, 这个过程就称为调试 调试的方法主要有单行调试和设置断点调试 单行调试也称为单步跟踪, 一般用于程序行数较少 程序结构较简单的程序 ; 断点调试一般用于较复杂的程序, 在设置断点后, 程序运行到断点所在位置会自动停止, 这时可以通过查看变量的值来判断程序有无错误 (6) 保存文件 编辑源程序的过程中随时可以保存文件, 调试运行程序前或退出 C 语言环境前必须保存文件, 以便以后对源程序进一步维护和修改 1.5 C 语言程序上机环境 启动 VC 6.0 后进入的界面如图 1-2 所示 图 1-2 VC 6.0 的界面

18 8 第 1 章 C 语言概述 然后将写好的程序输入到计算机中, 采用的方法是 : 单击 文件 菜单, 选择 新 建 命令, 则弹出图 1-3 所示的界面 图 1-3 VC 6.0 的 新建 界面 选择 文件 选项卡, 再选择 C++ Source File, 在文件名位置处输入源程序的名字, 位置处选择保存的位置, 单击 确定 按钮后进入图 1-4 所示的界面 图 1-4 源程序编辑界面 在中间编辑窗口中输入源程序的内容后, 单击 组建 菜单, 选择 编译 命令, 或单击工具栏上箭头所指的按钮后出现图 1-5 所示的界面 C 语言程序设计

19 1.5 C 语言程序上机环境 9 图 1-5 选择 编译 命令后 再单击 组建 菜单, 选择 执行 命令, 或单击工具栏上箭头所指的按钮, 如 图 1-6 所示, 之后出现图 1-7 所示的界面 图 1-6 选择 执行 命令

20 10 第 1 章 C 语言概述 图 1-7 运行后的界面在图 1-5 的窗口中可以看到, 中间窗口为编辑区, 窗口下端是信息窗口, 显示编译过程中是否有错, 是什么错误, 然后用户根据提示信息再进行修改 编译 链接, 直到运行结果满足要求为止 C 语言程序设计

21 第 2 章 第 2 章 C 语言程序基础 C 语言程序基础 变量和常量是程序处理的两种基本数据对象 说明语句表明变量的名字及类型, 也可以指定变量的初始值 运算符指定将要进行的操作 表达式则把变量与常量组合起来生成新的值 对象的类型决定该对象可取值的集合以及可以对该对象执行的操作 本章将讨论这些内容 2.1 变量和常量 变量是一个容器, 这个容器可以是 CPU 里的寄存器, 或者是存储器里的存储单元 而容器里面装的内容就是我们要访问的值 在访问变量时, 实际就是通过变量的名字, 找到它对应的容器, 然后访问容器里面存放的值 因此, 变量具备两个基本要素 : 一个是它的名字, 另一个是它对应的容器 通过在变量名字前加上 & 运算符, 得到变量的地址值, 形如 & 变量名 在 C 语言中, 把这个地址值叫做 指针 我们就是通过变量的地址, 找到它对应的容器, 容器里面存放的正是我们要访问的变量的值 就像通过门牌号码, 找到对应的房间, 然后再使用这个房间一样, 可以往房间里面装东西, 也可以把房间里面的东西取出来用, 我们可以给变量赋值, 也可以把变量里的值取出来进行运算, 或者把一个变量的值赋值给另外一个变量 对一个变量赋值, 就是把这个值放到变量对应的容器中, 同时这个容器里原来的值会被清除掉 而把一个变量的值赋值给另外一个变量, 指的是把这个变量容器里的值 复制 到另外一个变量对应的容器中 而常量是不具备容器的, 它就是直接以值本身的形式出现 常量不具备容器, 当然就不能对一个常量进行赋值, 它的值也不会被改变, 但是可以直接取它来使用 在 CPU 的寻址方式中, 常量采用的是立即数寻址, 其值是立即数, 作为指令的一部分 而变量是采用寄存器寻址或内存操作数寻址, 其值就是存放在寄存器或者存储器单元中的值 变量名 对变量的命名与符号常量的命名存在一些限制 : 名字是由字母和数字组成的序列, 但其第一个字符必须为字母或下画线 _ 大写字母与小写字母是有区别的, 所以 x 与 X 是两个不同的名字

22 12 第 2 章 C 语言程序基础 对于内部名而言, 至少前 31 个字符是有效的 对于外部名,ANSI 标准仅保证前 6 个字符的唯一性, 并且不区分大小写 类似于 if else int float 等关键字是保留给语言本身使用的, 不能把关键字用做变量名 选择的变量名要能够尽量从字面上表达变量的用途, 这样做不容易引起混淆 在传统的 C 语言用法中, 变量名通常使用小写字母, 符号常量名通常全部使用大写字母 这一点只是习惯用法, 不是语法规定 基本数据类型 ANSI C 语言只提供了下列几种基本数据类型 : char int float double 字符型, 占用 1 字节整型单精度浮点型双精度浮点型 要注意到 int 类型的长度通常反映编译器中确定的机器字长 例如, 在 16 位编译器中,int 类型长度为 16 位 ( 这里的位表示二进制位, 下同 ), 即 2 字节 ; 在 32 位编译器中,int 类型长度为 32 位, 即 4 字节 此外, 还可以在这些基本数据类型的前面加上一些限定符 short 与 long 两个限定符可以用于限定整型 : short int inum; long int lcounter; 在使用 short int 和 long int 时, 通常将 int 省略 : short inum; long lcounter; short 与 long 两个限定符的引入可以为我们提供满足实际需要的不同长度的整型数 int 类型的长度通常反映编译器中确定的机器字长 short 类型通常为 16 位,1ong 类型通常为 32 位,int 类型可以为 16 位或 32 位 各编译器可以根据硬件特性自主选择合适的类型长度, 但要遵循下列限制 :short 与 int 类型至少为 16 位, 而 long 类型至少为 32 位, 并且 short 类型不得长于 int 类型, 而 int 类型不得长于 long 类型 类型限定符 signed 与 unsigned 可用于限定 char 类型或任何整型 unsigned 类型表示无符号数, 这里的符号即表示正 负的 + 和 - 无符号数也就意味着这个数据中的所有二进制位都表示数值, 没有二进制位用来表示符号 而 signed 类型表示有符号数, 意味着这个数据在用机器数表示时, 最高有效位会作为符号位,0 表示正,1 表示负 在 C 语言中机器数一般用补码来表示有符号数 因此,unsigned 类型的数总是正值或 0, 而 signed 类型的数据却有正有负 例如, 如果 char 对象占用 8 位, 那么 unsigned char 类型变量的取值范围为 0~255, 而 signed char 类型变量的取值范围则为 -128~+127( 在采 C 语言程序设计

23 2.1 变量和常量 13 用补码的机器上 ) 不带限定符的 char 类型对象是否带符号则取决于具体机器, 但可 打印字符总是正值 不带限定符的整型, 包括 int short long 默认为 signed 类型, 即 默认为有符号数 在反汇编时可以看到,IA86 体系结构的机器中, 整数都是用补码表 示的 long double 类型表示高精度的浮点数 同整型一样, 浮点型的长度也取决于具体的 实现 float double 与 long double 类型可以表示相同的长度, 也可以表示两种或三种不 同的长度 有关这些类型长度定义的符号常量以及其他与机器和编译器有关的属性可以在标 准头文件 <limits.h> 与 <float.h> 中找到 常量 (1) 类似于 1234 的整数常量属于 int 类型 long 类型的常量以字母 l 或 L 结尾, 如 L 如果一个整数太大以至于无法用 int 类型表示时, 也将被当作 long 类型处 理 无符号常量以字母 u 或 U 结尾 后缀 ul 或 UL 表明是 unsigned long 类型 (2) 浮点数常量中包含一个小数点 ( 如 123.4) 或一个指数 ( 如 1e-2), 也可以两者 都有 没有后缀的浮点数常量为 double 类型 后缀 f 或 F 表示 float 类型, 而后缀 l 或 L 则表示 long double 类型 (3) 整型数除了用十进制表示外, 还可以用八进制或十六进制表示 带前缀 0 的整 型常量表示它为八进制形式 ; 前缀为 0x 或 0X, 则表示它为十六进制形式 例如, 十进 制数 31 可以写成八进制形式 037, 也可以写成十六进制形式 0x1f 或 0X1F 八进制与 十六进制的常量也可以使用后缀 L 表示 long 类型, 使用后缀 U 表示 unsigned 类型 例 如,0XFUL 是一个 unsigned long 类型 ( 无符号长整型 ) 的常量, 其值等于十进制数 15 (4) 一个字符常量是一个整数, 书写时将一个字符括在单引号中, 如,'x' 字符在 机器字符集中的数值就是字符常量的值 例如, 在 ASCII 字符集中, 字符 '0' 的值为 0x30 ( 十进制为 48), 它与数值 0 没有关系 字符常量可以与其他字符进行比较, 也可以像其 他整数一样参与数值运算 某些字符可以通过转义字符序列 ( 例如, 换行符 \n) 表示 ANSI C 语言中的全部转义字符序列如下 : \a 响铃符 \b 退格符 \f 换页符 \n 换行符 \r 回车符 \t 横向制表符 \v 纵向制表符 \\ 反斜杠 \? 问号 \' 单引号

24 14 第 2 章 C 语言程序基础 \" 双引号 \ooo \xhh 八进制数 十六进制数 有时候, 我们会用到字符的 ASCII 码来直接表示字符常量,\ooo 表示用 1~3 位八进制数来表示 ASCII 码,\xhh 表示用 x 加上一两位十六进制数来表示 ASCII 码 例如字符大写字母 'A', 可以表示为 '\101', 也可以表示为 '\x41' 在使用 C 语言的过程中, 因为有可能要做一些低级控制, 所以可以记住常用字符的 ASCII 值 大写字母字符 'A'~'Z' 的 ASCII 码值为 0x41~0x5a, 小写字母字符 'a'~'z' 的 ASCII 码值为 0x61~0x7a, 数字字符 '0'~'9' 的 ASCII 值为 0x30~0x39, 空格字符的 ASCII 码为 0x20 字符常量 '\0' 表示值为 0 的字符, 也就是空字符 (null) (5) 字符串常量是用双引号括起来的 0 个或多个字符组成的字符序列 例如 : "I am a string" 或 "" /* 空字符串 */ 都是字符串 双引号不是字符串的一部分, 它只用于限定字符串 字符常量中使用的转义字符序列同样也可以用在字符串中 在字符串中使用 \" 表示双引号字符 这里需要特别注意的是, 字符串常量本身的值并不是双引号里面的字符序列, 而是内存中为这个字符序列分配的存储空间的首地址 例如 : char* cptest = "Hello"; 送到变量 cptest 的值是内存中为 "Hello" 这个字符序列分配的存储空间的首地址, 而不是把 "Hello" 中的字符序列送到变量 cptest 中 在本章一开始讨论变量和常量时强调过, 常量是不具备容器的 这里的字符串常量 "Hello" 的值是内存中为 "Hello" 这个字符序列分配的存储空间的首地址, 这个地址值并不是放在容器中, 因此这个地址值本身是不能被修改的 所以,"Hello" = "world" 这样的赋值是错误的 既然系统要为 "Hello" 这个字符串中的字符序列分配存储空间, 那么这个存储空间里的内容可以被修改吗? 答案是否定的, 系统会为 "Hello" 这个字符串中的字符序列在常量区中分配存储空间, 该区域是受保护的, 里面的内容不允许访问 因此 : #include <stdio.h> char* cp1="hello"; *(cp1+1)='a'; printf("%c", *(cp1+1)); C 语言程序设计

25 2.1 变量和常量 15 或者 #include <stdio.h> Char* cp1="hello"; cp1[1]='a'; printf("%c", cp1[1]); 以上两段程序都可以通过编译, 但是执行时会因为在受保护的内存区域中写数据而出错 这里要注意跟另外一种情况区别 : 或者 #include <stdio.h> char cp1[]="hello"; *(cp1+1)='a'; printf("%c", *(cp1+1)); #include <stdio.h> char cp1[]="hello"; cp1[1]='a'; printf("%c", cp1[1]); 以上两段程序都能通过编译, 并可以正确执行, 输出结果为字符 'A' 这两段程序跟上面两段程序的不同之处在于用了 char cp1[] = "hello"; char cp1[ ] 表示定义了一个数组, 这条语句会在栈中为名为 cp1 的数组分配存储空间, 空间大小跟字符串 "hello" 占用的空间大小相同 分配了数组的空间后, 再将字符串 "hello" 复制到数组所占用的空间中 因此, 在以上两段程序中, 无论是 *(cp1+1) 还是 cp1[1] 访问的都是在栈中为 cp1 分配的空间 C 语言对字符串的长度没有限制, 那么程序怎么知道一个 字符串什么时候结束?C 语言在字符串的末尾加上一个结束标志来表示结束, 这个结束标志是 '\0' 因此,"Hello" 中的字符序列在存储空间中实际要占 6 字节, 如图 2-1 所示 图 2-1 字符序列在存储单元中的表示

26 16 第 2 章 C 语言程序基础 标准库函数 strlen( ) 可以返回字符串的长度, 但长度不包括末尾的 '\0' strlen( hello ) 得到的值就是 5 再例如 : #include <stdio.h> #include <string.h> char cptest[]="hello"; printf("%d", strlen(cptest)); 得到的结果为 5 (6) 字符常量与仅包含一个字符的字符串之间的区别 :'A' 与 "A" 是不同的 前者是一个整数, 其值是字母 A 的 ASCII 码, 为 0x41; 后者是一个包含一个字符 ( 即字母 A) 以及一个结束符 '\0' 的字符串常量, 字符串常量本身的值是一个地址值, 也就是存放其字符 A 和结束符 '\0' 的存储器空间的首地址 (7)#define 指令可以把符号名 ( 或称为符号常量 ) 定义为一个特定的字符串 : #define 名字替换文本 在该定义之后, 程序中出现的所有在 #define 中定义的名字 ( 既没有用引号引起来, 也不是其他名字的一部分 ) 都将用相应的替换文本替换 其中, 名字与普通变量名的形式相同 : 它们都是以字母或下画线打头的字母和数字序列 ; 替换文本可以是任何字符序列, 而不仅限于数字 #include <stdio.h> #define ZERO 0 printf("%d", ZERO); 在上面这段程序中, 编译时, 程序中凡是出现名字 ZERO 的地方都会被替换为 0 在掌握符号常量时, 要注意两点 : 一是符号常量实际上会被替换为它代表的内容, 二是这个替换发生在编译阶段 另外注意,#define 指令行的末尾一般没有分号 变量的说明 所有变量都必须先说明后使用 一个说明指定一种变量类型, 后面所带的变量列表可以包含一个或多个该类型的变量 变量说明的一般形式如下 : 类型符变量名表 ; C 语言程序设计

27 2.2 运算符和表达式 17 例如 : int num, age, weight; char gender, addr[512]; 一个说明语句中的多个变量可以拆开在多个说明语句中说明 上面的两个说明语句也可以等价地写成下列形式 : int num; int age; int weight; char gender; cbar addr[512]; 还可以在说明的同时对变量进行初始化 在说明中, 如果变量名的后面紧跟一个赋值号以及一个表达式, 该表达式就是变量初始化的值 例如 : int num = 1001; int age = 18; int weight = 70; char gender = 'M'; cbar addr[512] = "Room 501,Unit 6,Building 20"; 如果变量是静态变量或全局变量, 则只能被执行一次初始化 如果是非静态的局部变量, 每次进入函数或程序块时, 显式初始化的非静态局部变量都将被初始化一次, 其初始化表达式可以是任何表达式 在没有显式初始化时, 全局变量与静态变量的默认值为 0, 非静态的局部变量的值为未定义值 ( 即无效值 ) 2.2 运算符和表达式 程序是一些按次序执行的语句 执行语句是为了完成某个操作, 或修改某个数据 程序中大部分的语句是由表达式构成的, 表达式直接返回值 正因为如此, 表达式是 C 语言编译器处理的重要环节 表达式是操作符和操作数构成的, 其目的是完成一个特定的操作 其中, 操作符表明 做什么, 操作数提供要操作的对象, 表明 对谁做 表达式根据某些约定的结合性和优先级顺序来进行运算 算术运算符 二元算术运算符包括 + - * / %( 取模运算符 ) 整数除法会截断结果中的小数部分 表达式 x % y 的结果是 x 除以 y 的余数, 当 x 能被 y 整除时, 其值为 0 例如,

28 18 第 2 章 C 语言程序基础 如果某一年的年份能被 4 整除但不能被 100 整除, 那么这一年就是闰年 此外, 能被 400 整除的年份也是闰年 因此, 可以用下列语句判断闰年 : C 语言程序设计 if ((year % 4 == 0 && year % 100!= 0) year % 400 == 0) printf("%d 是闰年 \n", year); else printf("%d 不是闰年 \n", year); 取模运算符 % 不能应用于 float 或 double 类型 在有负操作数的情况下, 整数除法截取的方向以及取模运算结果的符号取决于具体机器的实现 二元运算符 + 和 - 具有相同的优先级, 它们的优先级比运算符 * / 和 % 的优先级低 算术运算符采用从左到右的结合规则 关系运算符与逻辑运算符 关系运算符包括下列几个 : > >= < <= ==!= >,>=,<,<= 具有相同的优先级 优先级仅次于它们的是 ==!= 关系运算符的优先级比算术运算符低, 因此 n<m-1 等价于 n<(m-1) 关系表达式的结果用一对逻辑量来表示, 在 C 语言中, 逻辑真用 1 表示, 逻辑假用 0 来表示 逻辑运算符包括下列几个! && 分别对应逻辑运算的非 与 或, 这三个运算符的优先级从高到低 逻辑运算中的 && 优先级低于关系运算符 但是逻辑运算中! 优先级比算术运算符还高 逻辑表达式的结果也是用一对逻辑量来表示 逻辑运算符 && 与 有一些较为特殊的属性, 由 && 与 连接的表达式按从左到右的顺序进行求值 并且,&& 在知道结果值为假后会立即停止计算, 在知道结果为真后也会立即停止计算 例如, 对于 (year % 4 == 0 && year % 100!= 0), 只要 year % 4 == 0 为假, 就不会再去判断 year % 100!=0, 因为已经可以得出来该表达式的结果为假 逻辑非运算符! 的作用是将非 0 操作数转换为 0, 将操作数 0 转换为 1 关系运算符和 && 采用从左到右的结合规则 自增运算符与自减运算符 C 语言提供了两个用于变量递增与递减的特殊运算符, 自增运算符 ++ 使其操作数递增 1, 自减运算符 -- 使其操作数递减 1 ++ 与 -- 这两个运算符特殊的地方主要表现在 : 它们既可以用做前缀运算符 ( 用在变量前面, 如 ++i), 也可以用做后缀运算符 ( 用在变量后面, 如 i++) 在这两种情况下, 其效果都是将变量 i 的值加 1 但是它们之间有一点不同: 表达式 ++i 先将 i 的值递增 1, 然后再使用变量 i 的值, 而表达式 i++ 则是先使用变量 i 的值, 然后再将 i 的值递增 1

29 2.2 运算符和表达式 19 也就是说, 对于使用变量 i 的值的上下文来说,++i 和 i++ 的效果是不同的 如果 i 的值 为 5, 那么 x = i++; 执行后的结果是将 x 的值置为 5, 而 x = ++i; 将 x 的值置为 6 这两条语句执行完成后, 变量 i 的值都是 6 自增与自减运算符只能作用于具有容器性质的变量, 类似于表达式 (i+j)++, 或者 5++ 都是非法的 按位运算符 C 语言提供了 6 个位操作运算符, 这里的 位 意即 bit, 表示二进制位, 也就是说 这 6 个操作符是在二进制位的层面来完成相应的工作 这些运算符只能作用于整型操作 数, 即只能作用于带符号或无符号 char short int long 类型 : & 按位与 按位或 ^ 按位异或 << 对二进制位左移 >> 对二进制位右移 ~ 按位求反 ( 一元运算符 ) 按位与运算符 & 的操作是相应位上数字为 1, 则结果为 1, 只要一个为 0 则结果 为 0, 因此按位与运算符 & 经常用于屏蔽 ( 置 0) 某些二进制位, 而保持其余二 进制位不变 假设 n 是一个 16bit 的变量, 则 n = n & 0xfffc; 表示将 n 的最低两位置为 0, 其余位保持不变, 也叫做将 n 的最低两位屏蔽掉 按位或运算符 的操作是相应位上数字为 0, 则结果为 0, 只要一个为 1 则结果为 1 因此按位或运算符 常用于将某些二进制位置为 1, 而保持其余二进制位不变 假设 n 是一个 16bit 的变量, 则 n = n 0x000f; 表示将 n 的低 4 位置为 1, 其余位保持不变 按位异或运算符 ^ 的操作是相应位上数字相同, 则结果为 0, 相应位上数字不同, 则结果为 1, 因此按位异或运算符 ^ 常用于将某些二进制位变反, 而保持其余二 进制位不变 假设 n 是一个 16bit 的变量 n = n ^ 0x000f;

30 20 第 2 章 C 语言程序基础 表示将 n 的低 4 位变反, 其余位保持不变 按位求反运算符 ~ 的操作是将相应位上的数字由 0 变 1, 由 1 变 0, 因此按位求 反运算符 ~ 常用于将二进制位整体变反 假设 n 是一个 16bit 的变量, 则 n = ~0xfffc; 表示将 0xfffc 按位取反, 再将结果送到变量 n 送到 n 的值为 0x0003 必须将位运算符 ~ & 同逻辑运算符! && 区分开来, 前者做的是针对二进制位的运算, 后者做的是逻辑运算 假设 m 和 n 都是 16bit 的变量,m 的值为 1,n 的值为 2:!m 的结果为 0;~m 的结果为 0xfffe m && n 的结果为 1;m & n 的结果为 0 m n 的结果为 1;m n 的结果为 3 移位运算符 << 与 >> 分别用于将操作数左移与右移 这是一个二元操作符, 运算符的左操作数将被移位, 移动的位数则由右操作数指定 ( 右操作数的值必须是非负值 ) 例如, 表达式 x << 2 将把 x 的值左移 2 位, 右边空出的 2 位用 0 填补 移位运算符 << 表示左移, 在 IA86 体系的机器指令中, 对应的指令为 shl 和 sal 对于左移, 移动后空出来的二进制位用 0 填充 如果是在机器数上进行移位 ( 针对具有容器性质的变量 ), 左边的位会根据移动的位数被依次移出容器, 如图 2-2 所示 图 2-2 左移示意图 假设一个 8 位的机器数为 0x81, 现在对它左移 1 位, 如图 2-3 所示 数据在机器中均是用二进制表示, 平时我们书写十六进制只是为了方便地表示二进制 0x81 也就是二进制 移动 1 位后, 如图 2-4 所示 在容器中装填的数据, 就是 0x81 左移 1 位的结果 结果为 0x02 图 2-3 将 0x81 左移 1 位示意图 图 2-4 将 0x81 左移 1 位后的结果 移位运算符 >> 表示右移, 在 IA86 体系的机器中, 对应的指令为 shr 和 sar 在右移 时, 对无符号数, 用 0 来填充空出来的位 ; 对有符号数, 用符号位的值来填充空出来的 位, 如图 2-5 所示 图 2-5 右移示意图 C 语言程序设计

31 2.2 运算符和表达式 21 另外, 根据进制运算规则, 把一个数左移一位等于在这个数上乘以它的基数 右移一位等于在这个数上除以它的基数 二进制的基数为 2, 所以在一个二进制数的基础上左移一位就等于在这个数上乘以 2 但在实际使用中要注意机器数的容量, 只有在没有超过表示范围的前提下, 结果才正确 赋值运算符 在赋值表达式中, 如果表达式左边的变量重复出现在表达式的右边, 如 : i = i + 2; 则可以将这种表达式缩写为下列形式 : i += 2; 其中的运算符 += 也称为赋值运算符 大多数二元运算符 ( 即有左 右两个操作数的运算符, 比如 +) 都有一个相应的赋值运算符 op=, 其中,op 可以是下面这些运算符之一 : 等价于 +,-,*,/,%,<<,>>,&,^, 如果 expr1 和 expr2 是表达式, 那么 expr1 op= expr2 expr1 = (expr1) op (expr2) 它们的区别在于, 前一种形式 expr1 只计算一次, 执行效率要高 除了简洁外, 赋值运算符还有一个优点 : 表示方式与人们的思维习惯比较接近 我们通常会说 把 2 加到 i 上 或 把 i 增加 2, 而不会说 取 i 的值, 加上 2, 再把结果放回到 i 中, 因此, 表达式 i += 2 比 i = i + 2 更自然 在所有这类表达式中, 赋值表达式的类型是它的左操作数的类型, 其值是赋值操作完成后的值 逗号运算符 C 语言提供了一种特殊的运算符 逗号运算符, 用它可以将多个表达式连接起来 逗号表达式的一般形式为 表达式 1, 表达式 2,, 表达式 n 逗号表达式的求解过程是 : 依次求解每个表达式 表达式 n 的值作为整个逗号表达式的值 条件运算符 下面这组语句 : if (a>b)

32 22 第 2 章 C 语言程序基础 z=a; else z=b; 用于求 a 和 b 中的最大值, 并将结果保存到 z 中 条件表达式 ( 使用三元运算符? : ) 提供了另外一种方法编写这段程序及类似的代码段, 在表达式 expr1? expr2 : expr3 中, 首先计算 expr1, 如果其值不等于 0( 为真 ), 则计算 expr2 的值, 并以该值作为条件表达式的值, 否则计算 expr3 的值, 并以该值作为条件表达式的值 expr2 与 expr3 中只能有一个表达式被计算 因此, 上面用 if else 书写的语句可以改写为 z = (a > b)? a : b; /* 表示求出 a 和 b 的最大值, 并放入 z */ 条件表达式中第一个表达式两边的圆括号并不是必须的, 这是因为条件运算符?: 的优先级非常低, 仅高于赋值运算符 但我们还是建议使用圆括号, 因为这可以使表达式的条件部分更易于阅读 运算符优先级与求值顺序 运算符优先级参见附录 B, 表中总结了所有运算符的优先级与结合性 同一行中的各运算符具有相同的优先级, 各行间从上往下优先级逐行降低 例如,* / 与 % 三者具有相同的优先级, 它们的优先级都比二元运算符 + - 高 同大多数语言一样,C 语言没有指定同一运算符中多个操作数的计算顺序 (&&? : 和, 运算符除外 ) 例如, 在形如 x = f() + g(); 的语句中,f( ) 可以在 g( ) 之前计算, 也可以在 g( ) 之后计算, 不同的编译器可能有不同 的处理 因此, 如果函数 f 或 g 改变了另一个函数所使用的变量, 那么 x 的结果可能会 依赖于这两个函数的计算顺序 为了保证特定的计算顺序, 可以把中间结果保存在临时变量中 类似地,C 语言本身也没有指定函数各参数的求值顺序 因此, 下列语句 printf("%d %d\n", ++i, power(2, i)); /* 应避免这样写 */ 在不同的编译器中可能会产生不同的结果, 这取决于 i 的自增运算在 power 调用之前还 是之后执行 解决的办法是避免以上写法, 把该语句改写成下列形式 : ++i; printf("%d %d\n", i, power(2, i)); 函数调用 嵌套赋值语句 自增与自减运算符都有可能产生 副作用 在对表达式求值的同时, 修改了某些变量的值 C 语言程序设计

33 2.3 类型转换 23 在有副作用影响的表达式中, 其执行结果同表达式中的变量被修改的顺序之间存在着微妙的依赖关系, 下列语句就是一个典型的令人不愉快的情况 : a[i] = i++; /* 应避免这样写 */ 问题是 : 数组下标 i 是用自增之前的值还是自增之后的值? 对这种情况不同的编译器的解释可能不同, 并因此产生不同的结果 C 语言标准对大多数这类问题未做具体规定 表达式何时会产生这种副作用 ( 对变量赋值 ), 将由编译器决定, 因为最佳的求值顺序同机器结构有很大关系 在任何一种编程语言中, 如果代码的执行结果与求值顺序相关, 则都是不好的程序设计风格 很自然, 有必要了解哪些问题需要避免, 但是, 如果不知道这些问题在各种机器上是如何解决的, 就最好不要尝试运用某种特殊的实现方式 2.3 类型转换 当一个运算符的几个操作数类型不同时, 就需要通过一些规则把它们转换为某种共同的类型 一般来说, 自动转换是指把 比较窄的 操作数转换为 比较宽的 操作数, 并且不丢失信息的转换 例如, 在计算表达式 f+i 时 ( 假设变量 f 是浮点型, 变量 i 是整型 ), 将整型变量 i 的值自动转换为浮点型 不允许使用无意义的表达式, 例如, 不允许把 float 类型的表达式作为下标 针对可能导致信息丢失的表达式, 编译器可能会给出警告信息, 比如把较长的整型值赋给较短的整型变量, 把浮点型值赋值给整型变量等, 但这些表达式并不非法 C 语言中, 很多情况下会进行隐式的算术类型转换 一般来说, 如果二元运算符 ( 具有两个操作数的运算符称为二元运算符, 比如 + 或 *) 的两个操作数具有不同的类型, 那么在进行运算之前先要把 较低 的类型提升为 较高 的类型, 运算的结果为较高的类型 如果没有 unsigned 类型的操作数, 则只要使用下面这些非正式的规则就可以了 : 如果其中一个操作数的类型为 long double, 则将另一个操作数转换为 1ong double 类型 如果其中一个操作数的类型为 double, 则将另一个操作数转换为 double 类型 如果其中一个操作数的类型为 float, 则将另一个操作数转换为 float 类型 将 char 与 short 类型的操作数转换为 int 类型 如果其中一个操作数的类型为 long, 则将另一个操作数也转换为 long 类型 在任何表达式中都可以使用一个称为强制类型转换的一元运算符强制进行显式类型转换 在下列语句中, 表达式将被转换为类型名指定的类型 : ( 类型名 ) 表达式

34 24 第 2 章 C 语言程序基础 可以这样来理解强制类型转换的准确含义 : 在上述语句中, 表达式首先被赋值给类型名指定的类型的某个变量, 然后再用该变量替换上述整条语句 例如, 库函数 sqrt(sqrt 在 <math.h> 中声明 ) 的参数为 double 类型 如果有整数 i, 可以使用 sqrt((double) i) 在把 i 传递给函数 sqrt 之前先将其强制转换为 double 类型 注意 : 强制类型转换只是生成一个指定类型的 i 的值,i 这个变量容器里面的值本身并没有被改变 2.4 预处理 预处理执行宏替换 条件编译以及包含指定的文件, 以 # 开头的命令行 ( # 前可以有空格 ) 就是预处理处理的对象 这些命令行的语法独立于语言的其他部分, 它们可以出现在程序中任何位置 由编译预处理器来完成其功能, 所以也称做编译预处理 这里仅简单介绍预处理中的宏定义和文件包含 宏定义和宏展开 (1) 定义无参数宏 无参数宏定义的格式如下 : #define 标识符符号序列将使得预处理器把程序中使用该标识符的地方用给定的符号序列替换 符号序列前后的空白符都将被丢弃掉 例如 :#define PI 3.14 程序中出现的 PI 全部会被替换成 3.14 (2) 定义带参数宏 有参数宏定义的格式如下 : #define 标识符 ( 参数表 ) 符号序列 例如 :#define S(x) ((x)*(x)), 若有 m = S(a+b); 则宏展开为 m = ((a+b)*(a+b)); 也就是宏在展开时用实参原样替换形参 (3) 取消宏定义格式如下 : #undef 标识符 用于取消标识符的预处理器定义 将 #undef 应用于未知标识符 ( 即未用 #define 指令定义的标识符 ) 并不会导致错误 文件包含所谓 文件包含 是指一个源程序文件可以将另外一个源程序文件的内容包含进来 C 语言程序设计

35 习题 25 文件包含的格式如下 : (1)# include < 文件名 > (2)# include " 文件名 " 说明 : (1) 一个 include 命令只能指定一个被包含的文件, 如果要包含多个文件, 要用多个 include 命令 (2) 这两种形式的区别是用 < > 时, 系统到存放 C 库函数头文件的目录中寻找要包含的文件, 这称为标准方式 用 " " 时, 系统先在用户当前目录中寻找要包含的文件, 若找不到, 再按标准方式寻找 习 题 一 单项选择题 1. 以下 ( ) 是 C 语言中正确的变量名 A.while B.55 C.num_2 D.a%2 2. 有如下程序语句 : int a,b; a = 6; b = 3 b = a; 执行后, 变量 a 和 b 的值分别为 ( ) A.a 的值为 6,b 的值为 6 B.a 的值为 3,b 的值为 3 C.a 的值为 3,b 的值为 6 D.a 的值为 6,b 的值为 3 3. 在对变量 x 的定义中, 错误的是 ( ) A.signed char x; B.signed int x; C.signed short x; D.signed float x; 4. 变量定义 : long x; 与下列 ( ) 选项等价 A.short int x; B.long int x; C.long x; D.float x; 5. 变量定义 : long x; 与下列 ( ) 选项等价 A.unsigned long x; B.signed long x; C.float x; D.double x;

36 26 第 2 章 C 语言程序基础 6. 整型常量除了用十进制表示外, 还可以用八进制或十六进制表示 C 语言中如 果要用八进制来表示整型常量, 则需要带前缀 ( ) A.0 B.0x C.h D.8 7. 小写字母 'a' 的 ASCII 码为 ( ) A.0x41 B.0x61 C.0xa D.0x30 8. 字符串 "ABC" 在存储空间中实际要占 ( ) 字节 A.3 B.4 C.5 D.6 9. 假设 n 是一个 16bit 的变量, 如果要将变量 n 的最低两位变反, 其余位保持不变, 应该使用 ( ) A.n = n & 0xfffc; B.n = n 0xfffc; C.n = n ^ 0x0003; D.n = ~n; 10. 定义带参数宏 : #define S(x) ((x) *( x)) 若有 m=s(2+3); 则执行后变量 m 的值为 ( ) A.11 B.25 C.5 D.6 C 语言程序设计

37 第 3 章 第 3 章结构化程序设计结构化程序设计 C 语言的程序设计有三种基本结构 顺序结构 选择结构和循环结构 在本章中 将具体介绍在 C 语言中实现这三种结构的控制语句, 并通过例题来介绍这三种结构的程 序设计方法 3.1 顺序结构程序设计 在顺序结构程序设计中, 各语句按照位置的先后次序顺序地执行, 且每个语句都会 被执行到 本节主要以几个简单的例子来介绍顺序结构语句 例 3-1 任意输入两个整数, 求它们绝对值的和 #include"stdio.h" #include"math.h" int x,y, sum; scanf("%d%d",&x,&y); /* 输入两个整数 */ sum= abs(x)+abs(y); /* 求两个整数绝对值的和 */ printf("sum=%d\n", sum);/* 输出两个整数的和 */ 程序运行情况如图 3-1 所示 图 3-1 运行结果 如若输入数据为 15,20, 则程序运行结果为 sum=35 分析 : 程序的第 1 2 行是用预处理命令 include 将头文件 stdio.h 和 math.h 包含进去, 因为程序的第 4 行用到了求绝对值函数 abs( ), 而此函数的相关信息在头文件 math.h

38 28 第 3 章结构化程序设计 中声明 由于两个整数的和一定是整数, 因此在定义变量的时候 x,y,sum 定义为整型 从这个例子中可以看出, 顺序结构程序设计中主要使用的语句有赋值语句和输入 / 输出函数 赋值语句 变量 = 表达式 ; 语句含义是将表达式的值赋值给变量, 如果表达式的类型与变量的类型不一致, 则将表达式的类型转换成变量的类型再赋值给变量 如 :int x; float a; x=5.7; 则是将 5.7 转换为整数 5 赋值给 x, 因此 x 的值为 5 a=5; 则是将 5 转换为 5.0 赋值给 a, 因此 a 的值为 输入 / 输出函数 1. 带格式输入函数 scanf 函数的一般形式为 scanf( 字符串, 地址表列 ); 字符串是用双引号括起来的所有字符组成, 其中字符串中有格式字符和非格式字符两类, 格式字符对应地址表列中地址需要输入的数据类型, 非格式字符在输入时将原样输入 格式字符及其含义 : (1)%md 表示输入宽度为 m 的有符号的十进制整数 (2)%mo 表示输入宽度为 m 的有符号的八进制整数 (3)%mx 表示输入宽度为 m 有符号的十六进制整数 (4)%mu 表示输入宽度为 m 无符号的十进制整数 (5)%mf 表示输入宽度为 m 的十进制实数 (6)%me 表示输入宽度为 m 的各种形式实数 (7)%mc 表示输入宽度为 m 个字符, 但只将第一个字符赋值给相应的变量 (8)%ms 表示输入宽度为 m 的字符串, 并将该字符串存入一个字符数组中 m 表示输入数据的宽度, 但在实际应用中 m 一般省略, 省略时将按数据的实际宽度输入 地址表列是由若干个地址组成的表列, 每个地址间用, 分隔 如语句 scanf("a=%db=%d",&a,&b); 表示将从键盘上输入两个整数到 a 和 b 的地址中 如从键盘上输入 a=5 b=10, 则 a 的值为 5,b 的值为 格式输出函数 printf 函数的一般形式为 printf( 字符串, 输出项表列 ); C 语言程序设计

39 3.1 顺序结构程序设计 29 字符串是用双引号括起来的所有字符组成, 其中字符串中有格式字符和非格式字符 两类, 格式字符对应输出项表列中输出项的数据类型, 非格式字符在输出时将原样输出 格式字符及其含义 : (1)%md 表示输出宽度为 m 的有符号的十进制整数 (2)%mo 表示输出宽度为 m 的有符号的八进制整数 (3)%mx 表示输出宽度为 m 的有符号的十六进制整数 (4)%mu 表示输出宽度为 m 的无符号的十进制整数 (5)%m.nf 表示输出宽度为 m 小数点位数为 n 的十进制形式的实数 (6)%e 表示输出规范化指数形式的实数 (7)%c 表示输出单个字符 (8)%m.ns 表示输出一个字符串,m 表示字符串的宽度,n 表示输出字符串中 最左边的 n 个字符 m 表示输出数据的宽度, 如果指定的宽度大于所要显示的数的实际宽度则用空格补 足 ; 如果指定的宽度小于所要显示的实际宽度, 则按照实际的宽度显示 m 如为正整数, 则输出时右对齐 ;m 如为负整数, 则输出时左对齐 ;m 如省略, 则按实际宽度输出 输 出项表列由 0 或多个输出项组成, 每个输出项间用, 分隔 例如 :float a; int b; a = 85.56; b = 100; printf("a=%fb=%d", a, b); %f 第一个输出表列的格式说明, 以小数形式输出单 双精度实数, 隐含输出 6 位小数 %d 第二个输出表列的格式说明, 以带有符号的十进制形式输出整数 ( 正数不输出符号 ); 输出结果为 a= b=100 例如 :x= ; printf("x=%6.2f\n",x); 输出结果为 x=12.46 例如 :printf("s=%5.3ss=%-5.3s","computer","computer"); 输出结果为 s= coms=com 3. 字符输入 / 输出函数 在 C 语言中除了可以用 scanf 和 printf 输入和输出数据外, 还可以使用 getchar( ) 函 数和 putchar( ) 函数来输入和输出字符

40 30 第 3 章结构化程序设计 getchar( ) 函数的一般形式为 : getchar( ); 其功能是从键盘输入一个字符, 函数结果为从键盘上输入的字符 例如 :char ch; ch=getchar(); 如从键盘上输入大写字母 A, 则 ch 的值为 'A' putchar( ) 函数的一般形式为 putchar(c); 其功能是将 c 所表示的字符输出到屏幕上 其中 c 可以是整型或字符型的常量 变量或表达式 例如 :int a=65; char c='b'; putchar(a); 就是将 a 所表示的字符 'A' 输出到屏幕上 putchar(c+2); 就是将 c+2 所表示的字符 'D' 输出到屏幕上 例 3-2 从键盘上输入一个大写字母, 将其转换为小写字母后输出 # include "stdio.h" char ch; ch=getchar(); ch=ch+32;/* 将大写字母转换成小写字母 */ putchar(ch); printf("\n"); 程序运行情况如图 3-2 所示 图 3-2 运行结果如若输入数据为 M, 则程序运行结果为 m 例 3-3 交换任意两个整型变量的值 # include "stdio.h" int a,b,t; C 语言程序设计

41 3.2 选择结构程序设计 31 scanf("%d%d",&a,&b); t=a;a=b;b=t;/* 交换 a,b 的值 */ printf("a=%db=%d\n"a,b); 程序运行情况如图 3-3 所示 如若输入数据为 :10 25 则程序运行结果为 :a=25 b=10 图 3-3 运行结果 3.2 选择结构程序设计 选择结构是程序的基本控制结构之一 在 C 语言中, 实现程序的选择结构有专门的语句 :if 语句和 switch 语句 这两个语句都是功能强 格式明确的结构控制语句, 都能进行各种嵌套使用 if 语句 if 语句是用来判断给定的条件是否满足, 根据判定的结果 ( 真或假 ) 决定执行两条分支中的其中一条分支 if 语句有两种形式 :if 和 if else 1.if 语句格式 if( 表达式 ) 语句 ; 语句功能 : 执行此语句时, 先求表达式的值, 若其值为 真, 则执行语句, 否则执行 if 语句后面的语句 2.if else 语句格式 if( 表达式 ) 语句 1; else 语句 2; 语句功能 : 执行此语句时, 先求表达式的值, 若其值为 真, 则执行语句 1, 否则执行语句 2 if 语句使用说明 : (1) 两种形式的 if 语句中的表达式可以是 C 语言允许的任意类型的表达式, 但一般都是逻辑表达式或关系表达式 在执行 if 语句时, 先对表达式求解, 表达式的值为 0,

42 32 第 3 章结构化程序设计 按 假 处理, 只要表达式的值为非 0, 就按 真 处理 (2)else 前面都有分号, 但是不能认为单独的 else 加上后面的部分就是一个语句, 任何 else 都必须和 if 配对才能构成一个语句, 没有单独的 else 语句 例 3-4 写一程序, 从键盘上输入年份 year, 判断其是否闰年 程序分析 : 判断闰年的条件是 : 能被 4 整除 但不能被 100 整除, 或者能被 100 也能被 400 整除 整除就是 : 如果 x 能被 y 整除, 则余数为 0, 即 x%y==0 因此程序写成 #include stdio.h int year; printf("please input the year:"); scanf("%d",&year); if (year % 4 == 0 && year %100!=0 year %100==0 && year%400==0) printf("%d 是闰年 \n",year); else printf("%d 不是闰年 \n",year); 例 3-5 从键盘上输入 3 个整数, 按由小到大的顺序输出 程序分析 : 从键盘上输入的 3 个整数是任意的, 因此用 3 个变量 x,y,z 来接受这 3 个整数, 输入时 x,y,z 的值是任意的, 但输出时如能确定 x 的值最小,y 的值其次,z 的值最大, 则依次输出 x,y,z 就可以了, 此题的关键是怎样能保证 x 的值最小,y 的值其次, z 的值最大, 首先让 x 与 y 比较大小, 让 x 的值小于 y 的值, 然后让 x 与 z 比较大小, 让 x 的值小于 z 的值, 最后让 y 与 z 比较大小, 让 y 的值小于 z 的值就可以了 程序可以写成 # include "stdio.h" int x,y,z,t; scanf("%d%d%d",&x,&y,&z);/* 输入 x,y,z 的值 */ if(x>y)t=x;x=y;y=t; /* 如果 x>y 则交换 x 与 y 的值, 否则不变 */ if(x>z)t=x;x=z;z=t; /* 如果 x>z 则交换 x 与 z 的值, 否则不变 */ if(y>z)t=y;y=z;z=t; /* 如果 y>z 则交换 y 与 z 的值, 否则不变 */ printf("%d %d %d\n",x,y,z);/* 输出 x,y,z 的值 */ 程序运行情况如图 3-4 所示 C 语言程序设计

43 3.2 选择结构程序设计 33 图 3-4 运行结果 例 3-6 计算并输出下列函数的值, 其中 x 由键盘输入 x y = x ( x 0) ( x> 0) 以写成 : 程序分析 : 此题是求 y 的值, 而 y 的值与 x 有关,x 的值由键盘输入, 因此程序可 #include "stdio.h" float x,y; printf("input x:"); /* 运行程序时提示输入 x 的值 */ scanf("%f",&x); /* 输入 x 的值 */ if(x<=0) y=-x; else y=x; printf("x=%f,y=%f\n",x,y); 在使用 if 语句中还应注意以下问题 : (1) 两种形式的 if 语句中,if 后面的表达式一般是逻辑表达式或关系表达式, 但也允许是其他类型的表达式, 如赋值表达式等, 甚至也可以是一个变量 例如 :if(b=5) 语句 ;if(c) 语句 ; 都是允许的 又如, 有程序段 : if(a=b) printf("%d",a); else printf("a=0"); 本语句的含义是把 b 的值赋给 a, 如 b 为非 0 则输出 a 的值, 否则输出 a=0 字符串 这种用法在程序中是经常出现的 (2) 在 if 语句中, 条件判断表达式必须用括号括起来, 许多初学者在使用 if 语句时在条件判断表达式的括号后面加上分号, 这样虽然在语法上没有错误, 但意思就变了, 相当于 if 后跟的是一个空语句, 这往往和程序编写者的初衷不符 (3) 在 if 语句的两种形式中, 所有的语句可以是空语句 单条语句和由 括 起来的复合语句 3.if 语句的嵌套 在一个 if 语句中可以又包含另一个 if 语句, 这称为 if 语句的嵌套或多重 if 语句

44 34 第 3 章结构化程序设计 上面 if 语句的两种形式都可以互相嵌套 使用嵌套 if 语句时, 必须特别注意 if 与 else 配对 配对原则是 : 从最内层开始,else 总是与它前面离得最近的 ( 未配对的 )if 配对 例 3-7 计算函数 1 ( x > 0) yx ( ) = 0 ( x= 0) 1 ( x < 0) 程序分析 : 要输出 y 的值, 则应求出 y 的值, 而 y 的值与 x 的值有关, 因此只要知道 x 的值就可以求出 y 的值,x 的值应从键盘上输入 程序编写为 #include "stdio.h" float x,y; printf("please input a real number:"); scanf("%f",&x); if(x>0) y=1; else if(x<0) y=-1; else y=0; printf("the value of y is: %.0f\n",y); 程序也可以编写为 : #include "stdio.h" float x,y; printf("please input a real number: "); scanf("%f",&x); if(x>=0) if(x>0) y=1; else y=0; else y=-1; printf("the value of y is: %.0f\n",y); C 语言程序设计

45 3.2 选择结构程序设计 35 程序还可以写为 #include "stdio.h" float x,y; printf("please input a real number: "); scanf("%f",&x); y=0; if(x>=0) if(x>0) y=1; else y=-1; printf("the value of y is: %.0f\n",y); 就这个程序写成第二 三两种情况, 在运行后的结果与我们想要的是不一样的, 如图 3-5 图 3-6 所示 图 3-5 第二种情况运行结果 图 3-6 第三种情况运行结果 第二种情况第一个 else 应该与第二个 if 匹配, 第二个 else 应该与第一个 if 匹配, 但在系统识别时有可能将第一个 else 应该与第一个 if 匹配, 第二个 else 与第二个 if 匹配, 这样就要出错 上两个图是第三种情况运行的结果, 从图中可以看到这个结果与我们所想得到的结果不一致, 原因在于这种情况的 else 应该与第一个 if 匹配, 但在系统识别时这个 else 是与第二个 if 匹配, 这样程序就出错了 第二种情况程序应该改为如下形式才正确 : #include "stdio.h" float x,y;

46 36 第 3 章结构化程序设计 printf("please input a real number: "); scanf("%f",&x); if(x>=0) if(x>0) y=1; else y=0; else y=-1; printf("the value of y is: %.0f\n",y); 第三种情况程序应该改为如下形式才正确 : C 语言程序设计 #include "stdio.h" float x,y; printf("please input a real number:"); scanf("%f",&x); y=0; if(x>=0) if (x>0) y=1; else y=-1; printf("the value of y is: %.0f\n",y); 那么怎样避免发生这样的配对出错呢? 为了避免 if 与 else 配对出错的最佳办法是尽量在 else 分支中嵌套而不要在 if 分支中嵌套, 还有就是在 if 分支中即使只有一条 if 语句也加花括号用复合语句来表示 条件运算符 在 C 语言中, 常有下列的 if else 结构 : if(x>y) z=x; else z=y; 此类语句在 C 语言中可用下列包含条件运算符的赋值语句来实现 : z=(x>y)?x:y; 该语句中 (x>y)?x:y 就是一个条件运算符的使用范例 条件运算符要求有三个操作数才能运算, 它是 C 语言中唯一的一个三目运算符 1. 一般格式 表达式 1? 表达式 2: 表达式 3

47 3.2 选择结构程序设计 37 其中 表达式 1 表达式 2 表达式 3 可以是 C 语言中允许的任意类型的表达式, 且它们的类型可以互不相同 运算规则 : 先求解表达式 1 的值, 若其为真, 则求解表达式 2 的值, 作为整个条件表达式的值 ; 若表达式 1 为假, 则求解表达式 3 的值, 作为整个条件表达式的值 2. 运算符的优先级与结合性 条件运算符的优先级高于赋值运算符, 低于算术运算符和关系运算符, 其结合性为 从右到左 ( 即右结合性 ) 如表达式 :a>b?a:c>d?c:d 等价于表达式 :(a>b)?a:(c>d?c:d) 在 if 语句的 if 分支 else 分支均为赋值语句时, 可以用条件表达式来代替 switch 语句 switch 语句也称为开关语句 在实际问题中我们经常遇到多分支选择问题 前面的 if 语句可以实现双分支问题, 利用 if 语句的嵌套也可实现多分支的操作, 但比较麻烦, 而且程序嵌套太多的话编写容易出错, 阅读者也不容易看清楚 用 switch 语句就可以方便 简洁地实现多分支选择 switch 语句的一般格式如下 : switch( 表达式 ) case 常量表达式 1: 语句 1 case 常量表达式 2: 语句 2 case 常量表达式 n: 语句 n default: 语句 n+1 语句功能 : 先求表达式的值, 然后依次与各常量表达式的值进行比较, 若与某常量表达式的值相等, 则执行其后的各语句, 直至遇到 break 语句或 switch 语句的最后一条 语句 即 : 当 表达式 等于 常量表达式 1 时, 从 语句 1 开始执行 ; 当 表达 式 等于 常量表达式 2 时, 从 语句 2 开始执行 ; 当 表达式 与 常量表达式 1 常量表达式 2 常量表达式 n 都不相等时, 从 语句 n+1 开始 执行 使用说明 : (1) 当每一个 case 语句后均有 break 语句时,case 出现的次序不影响执行结果 ( 习惯上 default 总是放在最后, 这时,deafult 后不需要 break 语句 ) (2)case 后面包含多个语句时, 不需要加大括号 (3) 多个 case 可以共用一组执行语句 例如 : case 'A':

48 38 第 3 章结构化程序设计 case 'B': case 'C': x=5; break; 在 A B C 三种情况下, 均执行相同的语句组 (4) 表达式和各常量表达式的类型为字符型 整型或枚举型 (5) 各常量表达式的值要互不相等 (6)switch 允许嵌套 (7)default 子句可以没有 例 3-8 从键盘输入学生的百分制成绩, 判断其等级制成绩 程序分析 : 等级制即将成绩分为优 良 中 及格和不及格五个等级 假设百分制成绩 score 只能取整型值, 则取值范围为 0~100, 共计 101 个值 若直接用 score 作为 switch 后的表达式, 则其下面的 case 子句就应有 101 个, 这样编写出的程序就很长 若以 score/10 作为 switch 后的表达式, 则 score/10 的值的范围为 0~10, 共计 11 个 程序编写为 #include <stdio.h> int score; printf("please input a score:"); scanf("%d",&score); switch(score/10) case 10: case 9: printf(" 优 "); break; case 8: printf(" 良 "); break; case 7: printf(" 中 "); break; case 6: printf(" 及格 "); break; default:printf(" 不及格 "); 选择结构程序设计举例 例 3-9 求解一元二次方程 ax 2 +bx+c=0 的根,a b c 由键盘输入 程序分析 : 对系数 a b c 考虑以下情形 (1) 若 a=0: 则没有构成一元二次方程 (2) 若 a!=0; 1 b 2-4ac>0, 有两个不等的实根 2 b 2-4ac=0, 有两个相等的实根 3 b 2-4ac<0, 有两个不等的复根 C 语言程序设计

49 3.2 选择结构程序设计 39 程序编写为 #include <stdio.h> #include <math.h> float a,b,c,d,x1,x2; printf("please Input the coefficients of equation: "); scanf("%f,%f,%f",&a,&b,&c); if(a!=0) d=b*b-4*a*c; if(d>=0) x1=(-b+sqrt(d))/(2*a); x2=(-b-sqrt(d))/(2*a); printf("the equation has two real roots: x1=%.2f,x2=%.2f\n", x1,x2); else x1=b/(2*a); x2=sqrt(-d)/(2*a); printf("the equation has two complex roots\n"); printf("x1=%.2f+%.2f i 为虚数单位 */ else printf(" 输入数据有错 \n"); 程序运行情况如图 3-7 所示 x2=%.2f-%.2f i \n",x1,x2,x1,x2); /* i 图 3-7 运行结果 如若输入数据为 2,2,1, 则程序的运行结果为两个虚数

50 40 第 3 章结构化程序设计 3.3 循环结构程序设计 利用前面学过的顺序结构和选择结构可以处理一些简单的问题 在实际生活中, 往往会对一组相关联的数据进行相同或相似的处理, 这时候就需要使用循环结构 循环结构是在一定的条件下重复执行某段程序的一种程序结构 C 语言中提供的循环控制语句有以下四种 :if 语句,goto 语句,while 语句,do while 语句,for 语句 四种循环结构 1.goto 语句构成循环 1)goto 语句 goto 语句称为 无条件转移语句 它可以插在程序的任何地方, 实现程序流程的任意转移, 即跳转到程序中的其他语句处继续执行 goto 语句破坏了程序的三种基本结构, 使得程序的执行顺序不清晰 建议少用或不用 goto 语句 在不少高级语言中已经不提供该语句,C 语言中虽然保留了 goto 语句, 但希望用户慎用该语句 语句格式 :goto 语句标号 语句功能 : 强制中断本语句之后的语句, 跳转到语句标号对应的语句继续执行程序 使用说明 : (1) 语句标号是标识符, 其后必须跟一个 ":" 才能放在本程序的某条语句之前, 作为该语句的一个代号 带有语句标号的语句可以是 C 语言的任何语句 (2)goto 语句中的 " 语句标号 " 必须是在本语句所在的函数中已存在的 不允许从某个函数跳转到其他函数中 2) 用 goto 语句构成循环在 C 语言中可以用 goto 语句构造循环 下面用一个例子来说明如何用 goto 语句来构造循环 100 例 3-10 编程求 i, 即求 i= 1 这是一个累加求和问题, 其算法就是将第 i 项的值加在前面的 i-1 项的和中去, 直至加到第 100 项为止 程序编写为 #include"stdio.h" int n,sum; n=1;sum=0; C 语言程序设计

51 3.3 循环结构程序设计 41 A: if(n<=100) sum=sum+n; /* 每次参加运算的 sum 值为上一次的累加结果 */ n=n+1; goto A; printf("sum=%d\n",sum); 2.while 语句构成循环 语句格式 : while( 表达式 ) 语句 ; 语句功能 : 先判断表达式的值, 如表达式的值为非 0, 则执行语句, 然后再计算表达式, 直到表达式为 0 时退出整个循环 由于语句可能重复执行, 因此语句又称为循环体 while 循环是先判断后执行, 因此循环体有可能一次也不做 使用说明 : (1) 格式中的表达式可以为各种类型的表达式 (2) 循环体可以为空语句 一条语句, 也可为复合语句 空语句就是一个 ;, 复合语句是用大括号括起来的所有语句 (3) 在循环体中要含有使循环趋于结束的语句, 否则将形成死循环 例 3-11 用 while 循环编程求 i, 即求 i= 1 此题与例 3-10 相同, 使用 while 循环来编写程序 程序编写为 #include "stdio.h" int sum,n; sum=n=0; while(n<=100) sum=sum+n; n=n+1; printf("sum=%d\n",sum);

52 42 第 3 章结构化程序设计 例 3-12 从键盘上输入一个整数, 求这个整数每位数字的和 程序分析 : 求一个整数每位数字的和, 则只需将这个整数每位数字分解出来 然后每位数字相加即可 程序编写为 # include "stdio.h" # include "math.h" int x,s,a; scanf("%d",&x); x=abs(x); s=0; while(x!=0) a=x%10; s=s+a; x=x/10; printf("s=%d\n",s); 程序运行情况如图 3-8 所示 C 语言程序设计 图 3-8 运行结果 大家考虑如何求一个整数每位数字的积? 例 3-13 从键盘上输入一行字符, 以 Enter 键结束, 统计这行字符中大写字母的个数 程序分析 : 要统计这行字符中大写字母的个数, 只需将这行字符中的字符进行判断, 如果该字符为大写字母, 则大写字母的个数就增加一个 程序编写为 # include "stdio.h" int n=0; char ch; ch=getchar(); while(ch!='\n') if (ch>= A &&ch<= Z )

53 3.3 循环结构程序设计 43 n=n+1; ch=getchar(); printf(" 大写字母的个数为 %d\n,n); 程序运行情况如图 3-9 所示 图 3-9 运行结果 例 3-14 求两个整数的最大公约数 程序分析 : 求两个整数的最大公约数可以采用辗转相除法来做 :m 除以 n, 得余数 r; 如果 r 不等于 0, 则将 n 赋予 m,r 赋予 n, 再用 m 除以 n, 得余数 r; 依此类推, 直到 r=0 为止, 此时的 n 就是最大公约数 程序编写为 : # include "stdio.h" int m,n,r; scanf("%d%d",&m,&n); r=m%n; while(r!=0) m=n; n=r; r=m%n; printf(" 最大公约数为 %d\n",n); 3.do while 语句构成循环 语句格式 : do 循环体 while( 表达式 ); 语句功能 : 先执行循环体, 然后计算表达式, 如果表达式的值为非 0( 真 ), 继续执行循环体, 然后再计算表达式, 直到表达式的值为 0( 假 ) 时, 结束 do while 语句, 执行 do while 语句后面的语句 do while 语句是先执行后判断, 因此循环体至少执行一次

54 44 第 3 章结构化程序设计 使用说明 : 1 格式中的表达式可以为各种类型的表达式 2 循环体可以为空语句 一条语句, 也可为复合语句 空语句就是一个 ;, 复合语句是用大括号括起来的所有语句 3 在循环体中要含有使循环趋于结束的语句, 否则将形成死循环 4 在使用时,while( 条件表达式 ) 后的分号必须有 例 3-15 用 do while 编程求 i, 即 i= 1 此例题目与例 3-10 一样 本例中用 do while 语句来做 程序编写为 : #include "stdio.h" int sum,n; sum=0; n=1; do sum=sum+n; n=n+1; while(n<=100); printf("sum=%d\n",sum); 一般情况下, 用 do while 和 while 两种方法编写的同一问题的程序执行结果是一样的 但是在循环条件也就是 do while 和 while 后面的表达式在一开始就为假的时候两者就不一样了 while 后面的表达式在一开始就为假的时候循环体一次也不执行, 而 do while 后面的表达式在一开始就为假的时候循环体照样已经执行了一次 例如分析以下程序的结果 例 3-16 do while 和 while 循环的比较 (1)#include "stdio.h" int n,sum=0; scanf("%d",&n); while(n<=5) sum=sum+n; n=n+1; printf("sum=%d",sum); C 语言程序设计

55 3.3 循环结构程序设计 45 (2)#include"stdio.h" int n,sum=0; scanf("%d",&n); do sum=sum+n; n=n+1; while(n<=5); printf("sum=%d",sum); 如果在 (1) 中输入 n 的值为 10 时输出结果是 sum=0, 而在 (2) 中输入 n 的值为 10 时输出结果是 例 3-17 求 s = ( 直到 1! 2! 3! n! n! <10-6 为止 ) 程序分析 : 此题也是一个典型的多项式累加求和的例子, 只需将多项式的每一项表达出来, 然后累加到和中就可以 程序编写为 : # include "stdio.h" int n=1; float s=0,t=1; do s=s+1/t; n=n+1; t=t*n; while(1/t>=1.0e-6); printf("s=%.2f\n",s); 程序运行情况如图 3-10 所示 图 3-10 运行结果 4.for 语句构成循环 for 语句是循环控制结构中使用最广泛的一种循环控制语句, 特别适合已知循环次

56 46 第 3 章结构化程序设计 数的情况 语句格式 : C 语言程序设计 for ( 表达式 1; 表达式 2; 表达式 3) 循环体 语句功能 : 先执行表达式 1, 再求表达式 2 的值, 如果表达式 2 的值为非 0, 则执行循环体和表达式 3, 当表达式 2 的值为 0 时退出整个循环 for 语句执行的流程如图 3-11 所示 使用说明 : (1) 表达式 1 可以是任何类型的表达式, 一般为赋值表达式, 用于给变量赋初值, 但一般是给循环变量赋初值 (2) 表达式 2 可以是任何类型的表达式, 一般为关系或逻辑表达式, 用于控制循环是否结束 (3) 表达式 3 可以是任何类型的表达式, 一般为赋值表达式, 用于改变变量的值, 但一般是给循环变量重新赋值, 以便能使程序正常退出循环 (4) 循环体可以为空语句 一条语句, 也可为复合语句 空语句就是一个 ;, 复合语句是用大括号括起来的所有语句 (5) 表达式 1 表达式 2 表达式 3 这三图 3-11 for 语句执行流程图个表达式中可以省略其中一个 两个或三个, 但相应表达式后面的分号不能省略 (6)for 语句与 while 语句可以相互转换, 其关系如下 : 表达式 1; while( 表达式 2) 循环体表达式 3; 100 例 3-18 编程求 i, 即 程序可以写成 : i= 1 # include "stdio.h" int s,n; for(s=0,n=1;n<=100;s+=n,n++); printf("s=%d\n",s); 由于表达式 1 和表达式 3 可以省略, 则程序又可以写成 :

57 3.3 循环结构程序设计 47 # include "stdio.h" int s,n; s=0; n=1; for(;n<=100;) s+=n; n++; printf("s=%d\n",s); 由于表达式 1 一般是给循环变量赋初值, 表达式 3 一般是给循环变量重新赋值, 因此程序还可以写成 : # include "stdio.h" int s,n; s=0; for(n=1;;n<=100; n++) s+=n; printf("s=%d\n",s); 例 3-19 有一个数列, 第 1 个数是 1, 第 2 个数是 1, 第 3 个数是第 1 2 两个数的和, 以后的每个数都是其前两个数之和, 输出这个数列的前 30 项 ( 要求每一行输出 5 个数 ) 程序分析 : 要输出这个数列的前 30 项, 则只需将这个数列的前 30 项依次求出然后输出即可 程序编写如下 : #include "stdio.h" long int f1,f2,f3; int i; f1=1; f2 = 1; /* 已知数列的前两个初值 */ printf("%-10ld %-10ld ",f1,f2); /* 输出数列的前两项 */ for(i=3; i<=30; i++) f3=f1+f2; /* 当前项是其前两项的和 */

58 48 第 3 章结构化程序设计 printf("%-10ld ",f3); /* 输出当前项 */ if (i%5 == 0) printf("\n"); /* 若当前行输出了 5 项, 则换行输出 */ f1 = f2; f2 = f3; 程序运行情况如图 3-12 所示 图 3-12 运行结果至此, 我们已经学习了 C 语言中四种循环控制语句 if...goto while do...while 和 for 语句,while 和 for 语句都是先判断后执行, 因此循环体有可能一次也不做, 这两个语句可以相互通用 ; 而 do...while 语句是先执行后判断, 因此循环体至少做一次 如果在实际问题中能保证循环体至少做一次, 这 3 个语句可以相互通用 但在实际应用中, 单重循环只能实现一部分问题, 有些问题需要用多重循环来实现 循环的嵌套在一个循环体内又完整的包含另一个循环体, 这称为循环的嵌套 在前面所讲的 while do...while 和 for 语句三种循环语句中, 都可以互相嵌套 注意 : 循环嵌套的外层循环每执行一次, 内层循环就完整的执行了一遍 因此在编写程序的时候要注意程序内每个语句的具体执行次数和每次执行后各个变量值的相应变化 为了避免发生预想不到的错误, 各层循环的循环体变量一般不要相同 例 3-20 输出如下星形图案 * ** *** 程序分析 : 对于此类问题, 应该了解如何完整的输出此图形, 这个图形共有 3 行, 第 1 行只有 1 个 *, 并且输出 1 个 * 号后应该换行, 第 2 行有 2 个 *, 并且输出 2 个 * 号后也应该换行, 第 3 行有 3 个 *, 并且输出 3 个 * 号后也应该换行, 依次类推, 第 i 行有 i 个 *, 并且输出 i 个 * 号后要换行 对于本题, 关键在于如何输出 i 个 * 号, 我们可以这样来实现一次输出 1 个 * 号, 然后循环 i 次就可以输出 i 个 * 号, 因此程序就可以写成 : #include "stdio.h" C 语言程序设计

59 3.3 循环结构程序设计 49 int i,j; for(i=1;i<=3;i++) /* 用于控制图形的行数 */ for(j=i;j<=i;j++) /* 用于控制每行的 * 号的个数 */ printf("*"); /* 每行输出的字符 */ printf("\n"); /* 第 i 行输出后要换行 */ 若要输出如下的图案, 应做怎样的变化? * ** *** 此图案与上面的图案的区别在于每行的第 1 个字符没有对齐 因此在每行输出第 1 个字符前, 应输出足够多的空格数, 根据观察, 第 i 行的空格数为 3-i 个, 因此这个程序应写成 : #include "stdio.h" int i,j,k; for(i=1;i<=3;i++) /* 用于控制图形的行数 */ for(k=1;k<=3-i;k++)/* 用于控制图形每行前的空格数 */ printf(" "); for(j=1;j<=i;j++) /* 用于控制每行的 * 号的个数 */ printf("*"); /* 每行输出的字符 */ printf("\n"); /* 第 i 行输出后要换行 */ 读者可以自己考虑下列图形应该怎么输出 例 3-21 输出 1~400 之间的完全平方数 所谓完全平方数是指一个数是另一个数的平方, 则此数称为完全平方数 程序分析 : 由于不知道 1~400 之间的哪些数是完全平方数, 因此只能将 1~400 之间的每一个数来进行判断 这就是所谓的 穷举法 程序编写为 :

60 50 第 3 章结构化程序设计 #include "stdio.h" #include "math.h" void main () int m,n,i=0; for (n = 1; n <= 400; n++) for (m = 1; m<= sqrt(n); m++) if (m * m == n) i++; printf("%6d", n); if(i%5==0) printf("\n"); 程序运行情况如图 3-13 所示 图 3-13 运行结果 break 与 continue 语句 1.break 语句语句格式 : break; 语句功能 :break 用于循环体中, 表示在程序执行过程中执行到 break 语句则无条件退出本次循环体 例 3-22 将 1~100 中第一个能被 7 整除的数找出来 程序分析 :n 从 1 开始, 当 n 的值增加到能被 7 整除后则退出循环, 因此程序可以写成 : #include "stdio.h" int n; C 语言程序设计

61 3.3 循环结构程序设计 51 for(n=1;n<=100;n++) if(n%7==0) printf("%d\n",n); break; 2.continue 语句 语句格式 : continue; 语句功能 :continue 语句只能用于循环体中, 程序执行时, 执行到 continue 语句则停止本次循环, 但不退出循环结构, 而是继续判断循环条件, 如果循环条件为非 0 则继续执行循环体 如果 continue 用于 for 语句中则停止本次循环, 但不退出循环结构, 而是执行表达式 3 后再判断循环条件, 如果循环条件为非 0 则继续执行循环体 例 3-23 将 1~100 中所有不能被 3 整除的数找出来 #include "stdio.h" int n; for(n=1;n<=100;n++) if(n%3==0) continue; printf("%3d",n); 例 3-24 分析下列程序, 写出程序的运行结果 #include "stdio.h" int x=1,y; for(y=1;y<=50;y++) if(x>=10) break; if(x%2!=0)x+=5; continue; x-=3; printf("y=%d\n",y); 循环结构程序设计举例 例 3-25 从键盘上输入一个大于 2 的正整数, 判断其是否为素数 程序分析 : 只能被 1 和自身整除的数称为素数 根据素数的定义, 若要判断一个正整数 x 是否为素数, 只要将 2 到 x-1 间的每一个整数去除 x, 若有一个能整除 x, 则 x 不是素数, 若其间的所有整数都不能整除 x, 则 x 为素数

62 52 第 3 章结构化程序设计 程序编写为 : #include <stdio.h> int x,m; scanf("%d",&x); for(m=2;m<=x-1;m++) if(x % m ==0) break; if(m>x-1) printf("%d 是素数.\n",x); else printf("%d 不是素数.\n",x); 程序运行情况如图 3-14 所示 图 3-14 运行结果 例 3-26 输出 100~200 之间的所有素数 在例 3-25 中讲解了素数的判定, 如要输出 100~200 之间的所有素数, 只需要将 100~200 之间的每一个数去判定, 如果是则输出, 因此程序可以写成 : #include <stdio.h> int x,m,n=0; for(x=100;x<=200;x++) for(m=2;m<=x-1;m++) if(x % m ==0) break; if(m>x-1) printf("%-10d",x);n++; if(n%5==0)printf("\n"); C 语言程序设计

63 3.3 循环结构程序设计 53 程序运行情况如图 3-15 所示 图 3-15 运行结果 例 3-27 百钱买百鸡问题 公鸡 5 元一只, 母鸡 3 元一只, 小鸡 3 只一块钱, 假设用 100 元买了 100 只鸡, 问 : 公鸡 母鸡 小鸡各有多少只? #include <stdio.h> int x,y,z; for(x=0;x<20;x++) for(y=0;y<33;y++) for(z=0;z<100;z++) if(x+y+z==100&&5*x+3*y+z/3.0==100) printf("%d %d %d\n",x,y,z); 程序运行情况如图 4-16 所示 图 4-16 运行结果 例 3-28 用二分法求 f(x)=3x 3-4x 2-5x+13 的根, 已知 f(-2)= -7<0,f(1)=7>0, 根据连续函数性质, 则在 (-2,1) 之间存在 x0, 使得 f(x0)=0 程序分析 : 二分法就是通过每次把 f(x) 的零点所在小区间收缩一半的方法, 使区间 的两个端点逐步迫近函数的零点, 以求得零点的近似值 设 a=-2,b=1, 由于 f(a)<0,f(b)>0, 则求区间 (a,b) 的中点 x0 然后计算 f(x0) (1) 若 f(x0)f(a)>0, 则令 a= x0; (2) 若 f(x0)f(a)<0, 则令 b= x0; (3) 判断是否达到精确度 10^(-6): 即若 a-b <10^(-6), 则得到零点近似值 x0, 否则重复求区间 (a,b) 的中点 x0 然后计算 f(x0) 程序编写为 #include <stdio.h> #include <math.h> float a,b, x0;

64 54 第 3 章结构化程序设计 a=-2; b=1; while(fabs(b-a)>=1.0e-6) x0=(a+b)/2; if((3* pow(x0,3)-4* pow(x0, 2)-5* x0+13)* (3*pow(a,3)-4*pow(a,2) -5*a+13)>0) a= x0; else b= x0; printf("%.2f\n", x0); 程序运行情况如图 3-17 所示 图 3-17 运行结果 习 题 一 单项选择题 1. 表达式 9!=7 的值是 ( ) A.true B. 非 0 值 C.0 D.1 2. 循环语句 for(i=0;i<4;i++); 的循环执行 ( ) 次 A.3 B.4 C.5 D.6 3. 在 C 语言中, 下列说法中正确的是 ( ) A. 不能使用 do 语句 while( 条件 ) 的循环 B. do 语句 while( 条件 ) 的循环中必须使用 break 语句退出循环 C. do 语句 while( 条件 ) 的循环中, 当条件非 0 时将结束循环 D. do 语句 while( 条件 ) 的循环中, 当条件为 0 时将结束循环 4. 以下不形成死循环的循环语句是 ( ) A.for (i=1;i<10;) printf("%d",i++); B.while (1) x++; C.for (i=10;;i--) sum+=i++; D.for (;;x+=i); 5. 结构化程序语言的三种基本结构是 ( ) A. 顺序结构 选择结构 循环结构 B. 递归结构 循环结构 转移结构 C. 嵌套结构 递归结构 顺序结构 D. 循环结构 转移结构 顺序结构 C 语言程序设计

65 习题 对于 for(s=2; ;s++) 可以理解为 ( ) A.for(s=2;0;s++) C.for(s=2;s<2;s++) 7. 有如下程序, 该程序的输出结果是 ( ) B.for(s=2;1;s++) D.for(s=2;s>2;s++) #include <stdio.h> int x=1,a=0,b=0; switch(x) case 0;b++; case 1:a++; case 2:a++;b++; A.a=2,b=1 B.a=l,b=l C.a=l,b=0 D.a=2,b=2 8. 有如下程序, 该程序的执行结果是 ( ) #include <stdio.h> int x=23; do printf("%d",x--); while(!x); A.321 B.23 C. 不输出任何内容 D. 陷入死循环 9. 有一 C 语言源程序如下 : #include <stdio.h> int a,b=-1;scanf("%d",&a); if(a)if(a>0)b=1;else b=0; 该程序所表示的数学函数关系是 ( ) 1 ( a < 0) 1 ( a = 0) A. b= 0 ( a = 0) B. b= 0 ( a > 0) 1 ( a > 0) 1 ( a < 0) 1 ( a = 0) 1 ( a < 0) C. b= 0 ( a< 0) D. b= 0 ( a > 0) 1 ( a > 0) 1 ( a = 0)

66 56 第 3 章结构化程序设计 10. 下面程序的输出结果是 ( ) #include <stdio.h> main() int k=0,m=0,i,j; for (i=0; i<2; i++) for (j=0; j<3; j++) k++; k-=j; m = i+j; printf("k=%d,m=%d",k,m); A.k=0,m=3 C.k=1,m=3 B.k=0,m=5 D.k=1,m=5 二 程序阅读题 1. 下面程序运行后变量 x 的值是 ( ) # include "stdio.h" int a,b,c,x; a=b=c=0;x=35; if(!a) x--; else if(b); if( c) x=3; else x=4; printf("%d\n",x); 2. 写出下面程序的运行结果 # include "stdio.h" char c='a'; int k=0; do switch(c++) case 'A': k=k+1; case 'B': k=k+1; break; C 语言程序设计

67 习题 57 case 'C': k%=2; break; case 'D':k*=10;continue; default:k/=3; k++; while(c<'f'); printf( %d,k); 3. 写出下面程序的运行结果 #include <stdio.h> int i,j,x=0; for(i=0;i<2;i++) x++; for(j=0;j<=3;j++) if(j%2) continue; x++; x++; printf("x=%d\n",x); 4. 在下列程序中, 若输入为 3275<CR>, 写出输出结果 #include<stdio.h> int x,y,t; scanf('%d",&x); x=(x>=0?x:-x); y=0; while(x) t=x%10; x=x/10; y=y*10+t; prinnf("the result is %5d",y); 5. 写出下面程序的运行结果

68 58 第 3 章结构化程序设计 # include<stdio.h> int m,n,numl,num2,temp; numl=6;num2=52; if(num1<num2) temp=numl,numl=num2,num2=temp; m=numl; n=num2; while(n!=0) temp=m%n; m=n; n=temp; printf("%d\n",m); 三 程序填空题 1. 下面程序用于计算 1+(1+2)+(1+2+3)+ +( ), 请填空 #include<stdio.h> int total,sum,m,n; 1 ; for (m=1;m<=10;m++) sum=0; for(n=1;n<=m;n++) sum=sum+n; 2 ; printf("total=%d\n",total); 2. 编一个 C 程序, 计算并输出数列 : n-1 的前 n 项之和, 其中的 n 由键盘输入 #include<stdio.h> long s,n, k, i; scanf("%ld", 1 ); k=2*n-1; for (i=1; i<= 2 ; 3 ) s+=i; C 语言程序设计

69 习题 59 printf("1+3+ +%1d= 4 \n",k,s); 3. 下面程序从键盘读入 50 个整数并求其中正整数之和 请填空 #include<stdio.h> int i,a,sum; sum=0; for(i=0;i<50;i++) scanf("%d",&a); if(a<0) 1 ; sum=sum+a; pfinff("sum=%d\n",sum); 四 编程题 1. 编写一个程序, 从键盘上输入 x 的值, 计算下列公式的 y 值 3x+ 1 ( x< 0) y = 2 x (0 x< 5) x + 2 ( x 5) 2. 求 s=1!+2!+3!+ +19!+20! 3. 打印出 100~999 之间所有的 水仙花数, 所谓 水仙花数 是指一个 3 位数, 其各位数字的立方和等于该数本身 ( 例如 153= ) 4. 编程序按下列公式计算 e 的值 ( 精度为 1e-6) 并输出 e 的值和项数 n e=1+1/1!+1/2!+1/3!+ +1/n! 求数列 的前 20 项之和 6. 一个正整数与 3 的和是 5 的倍数, 与 3 的差是 6 的倍数, 求出符合此条件的最 小整数 7. 猴子吃桃问题 : 猴子第一天摘下若干个桃子, 当即吃了一半, 还不瘾, 又多吃 了一个 第二天早上又将剩下的桃子吃掉一半, 又多吃了一个 以后每天早上都吃了前一天剩下的一半零一个 到第 10 天早上想再吃时, 见只剩下一个桃子了 求第一天共 摘了多少 8. 输出下列图形 * *** ***** ******* ***** *** *

新版 明解C言語入門編

新版 明解C言語入門編 328, 4, 110, 189, 103, 11... 318. 274 6 ; 10 ; 5? 48 & & 228! 61!= 42 ^= 66 _ 82 /= 66 /* 3 / 19 ~ 164 OR 53 OR 164 = 66 ( ) 115 ( ) 31 ^ OR 164 [] 89, 241 [] 324 + + 4, 19, 241 + + 22 ++ 67 ++ 73 += 66

More information

Microsoft Word - 文前.doc

Microsoft Word - 文前.doc 普通高等教育 十二五 规划教材中国科学院教材建设专家委员会规划教材 C 语言程序设计 何丽余平主编 胡勇刘云杰陈勇副主编 北京 内容简介 本书根据教育部计算机基础课程教学指导分委员会制定的 高级语言程序设计 课程的教学基本要求和全国高等学校非计算机专业学生计算机等级考试教学大纲要求, 以 C 语言为主要内容, 介绍了结构化程序设计的方法 本书主要内容有 C 语言概述 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

<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

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

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

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

More information

没有幻灯片标题

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

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试题(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

PowerPoint 演示文稿

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

More information

FY.DOC

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

More information

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

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

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

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

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

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

More information

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

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

More information

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

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

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

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

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

新・解きながら学ぶC言語

新・解きながら学ぶC言語 330!... 67!=... 42 "... 215 " "... 6, 77, 222 #define... 114, 194 #include... 145 %... 21 %... 21 %%... 21 %f... 26 %ld... 162 %lf... 26 %lu... 162 %o... 180 %p... 248 %s... 223, 224 %u... 162 %x... 180

More information

Microsoft PowerPoint - 01_Introduction.ppt

Microsoft PowerPoint - 01_Introduction.ppt Hello, World C 程序设计语言 第 1 章章观其大略 孙志岗 sun@hit.edu.cn http://sunner.cn prf("hello,, world\n"); 超级无敌考考你 : 如何把 hello 和 world 分别打印在两行? 2004-12-19 A Tutorial Introduction 2 hello.c 打印华氏温度与摄氏温度对照表 计算公式 : C=(5/9)(

More information

期中考试试题讲解

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

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

《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

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

2015年计算机二级(C语言)模拟试题及答案(四) 2015 年计算机二级 (C 语言 ) 模拟试题及答案 (4) 一 填空题 1 C 语言中基本的数据类型有 : 2 C 语言中普通整型变量的类型说明符为, 在内存中占 字节, 有符号普通整型的数据范围是 3 整数-35 在机内的补码表示为 4 执行下列语句 int a=8;a+=a-=a*a; 后,a 的值是 5 有如下语句:charA[ ]={ I am a student }; 该字符串的长度是,A[3]=

More information

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7>

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7> 能源与动力工程学院 结构化编程 结构化程序设计 循环 循环结构 确定性循环 非确定性循环 I=1 sum=sum+i I = I +1 陈 斌 I>100 Yes No 目录 求和 :1+2+3++100 第四节循环的应用 PROGRAM GAUSS INTEGER I, SUM 计数器 SUM = 0 DO I = 1, 100, 1 SUM = SUM + I print*, I, SUM DO

More information

FJXBQ

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

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

林子雨《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

试卷代号 :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

没有幻灯片标题

没有幻灯片标题 第 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 C 2017 3 14 1. 2. 3. 4. 2/95 C 1. 3/95 C I 1 // talkback.c: 2 #include 3 #include 4 #define DENSITY 62.4 5 int main(void) 6 { 7 float weight, volume; 8 int size; 9 unsigned long letters;

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

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

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

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

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

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

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

More information

试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期 " 开放本科 " 期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new

试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期  开放本科  期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new 试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期 " 开放本科 " 期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. long 2. 在每个 C 十 + 程序中都必须包含有这样一个函数, 该函数的函数名为 ) A.main

More information

实验目的 (1) 熟练掌握顺序 分支 循环三种结构 (2) 会使用流程控制结构编写程序 第三章程序的流程控制 实验要求 (1) 掌握 if-else swith-case 的使用 (2) 掌握 while do-while for 的使用 (3) 掌握分支嵌套和循环嵌套 (4) 分析理解如何避免死循

实验目的 (1) 熟练掌握顺序 分支 循环三种结构 (2) 会使用流程控制结构编写程序 第三章程序的流程控制 实验要求 (1) 掌握 if-else swith-case 的使用 (2) 掌握 while do-while for 的使用 (3) 掌握分支嵌套和循环嵌套 (4) 分析理解如何避免死循 实验目的 (1) 熟练掌握顺序 分支 循环三种结构 (2) 会使用流程控制结构编写程序 第三章程序的流程控制 实验要求 (1) 掌握 if-else swith-case 的使用 (2) 掌握 while do-while for 的使用 (3) 掌握分支嵌套和循环嵌套 (4) 分析理解如何避免死循环 实验范例 系统常用类 : 字符串类 (String) a) 从字符串 s 中截取一个字符串方法 s.substring()

More information

第一章 引言

第一章  引言 第四章 循环结构 上机问题 程序书写风格 缩入 : 例如, 统一缩入四个空格 复合语句中 {} 的对齐 适当的空行 变量名命名 变量名使用 2 上机问题 关系运算符 == 与赋值运算符 = n == 0 与 n = 0 的区别? 逻辑运算符 :&& 与 的区别? && : 两个条件均为真, 结果为真 : 有一个条件为真, 结果为真 for 语句 if-else 语句的逻辑错误 3 上机问题 scanf

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

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

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

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

( 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

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

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

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

More information

试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期 " 开放本科 " 期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. l

试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期  开放本科  期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. l 试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期 " 开放本科 " 期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. long 2. 在每个 c++ 程序中都必须包含有这样一个函数, 该函数的函数名为 ( ) A. main

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语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN: 978-7-302-13599-9, 红色封面答案制作时间 :2011 年 2 月 -5 月一 选择题 1. 设有程序段 int k=10;while(k=0)k=k-1;, 则下面叙述正确的是 D 循环体语句一次也不执行 2. 设有程序段 int x=0,s=0;while(!x!=0)s+=++x;printf(

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

Microsoft Word - 第3章.doc

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

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++ / 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

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

第 3 章选择结构 q q q Python 中表示条件的方法 if 语句 选择结构程序设计方法

第 3 章选择结构 q q q Python 中表示条件的方法 if 语句 选择结构程序设计方法 第 3 章选择结构 q q q Python 中表示条件的方法 if 语句 选择结构程序设计方法 3.1 条件的描述 3.1.1 关系运算 Python 的关系运算符有 : =( 大于等于 ) ==( 等于 )!=( 不等于 ) 关系运算符用于两个量的比较判断 由关系运算符将两个表达式连接起来的式子就称为关系表达式, 它用来表示条件, 其一般格式为

More information

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

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 1 TEMPLATE 1 Template 描述 使用模板函数求最大值 使用如下 main 函数对程序进行测试 int main() { double a, b; cin >> a >> b; cout c >> d; cout

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

<4D F736F F D204A617661B3CCD0F2C9E8BCC6BBF9B4A1A3A8B5DA35B0E6A3A9CAB5D1E9D6B8B5BCD3EBCFB0CCE2BDE2B4F020B5DA33D5C22E646F63>

<4D F736F F D204A617661B3CCD0F2C9E8BCC6BBF9B4A1A3A8B5DA35B0E6A3A9CAB5D1E9D6B8B5BCD3EBCFB0CCE2BDE2B4F020B5DA33D5C22E646F63> 第 3 章 结构语句 本章知识点 : 流程控制语句是用来控制程序中各语句执行顺序的语句, 是程序中基本却又非常关键的部分 流程控制语句可以把单个的语句组合成有意义的 能完成一定功能的小逻辑模块 最主要的流程控制方式是结构化程序设计中规定的顺序结构 分支结构 ( 选择结构 ) 和循环结构三种基本流程结构 本章将指导读者掌握 Java 程序中的流程控制语句, 包括这些语句的语法结构和使用中需注意的要点

More information

C/C++ - 函数

C/C++ - 函数 C/C++ Table of contents 1. 2. 3. & 4. 5. 1 2 3 # include # define SIZE 50 int main ( void ) { float list [ SIZE ]; readlist (list, SIZE ); sort (list, SIZE ); average (list, SIZE ); bargragh

More information

untitled

untitled Introduction to Programming ( 數 ) Lecture 3 Spring 2005 March 4, 2005 Lecture 2 Outline 數 料 If if 狀 if 2 (Standard Output, stdout): 料. ((Standard Input, stdin): 料. 類 數 數 數 說 printf 見 數 puts 串 數 putchar

More information

C/C++ - 字符输入输出和字符确认

C/C++ - 字符输入输出和字符确认 C/C++ Table of contents 1. 2. getchar() putchar() 3. (Buffer) 4. 5. 6. 7. 8. 1 2 3 1 // pseudo code 2 read a character 3 while there is more input 4 increment character count 5 if a line has been read,

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

chp3

chp3 Java 软件设计基础 3. 流程控制 3.1 语句控制结构 语句类型 变量声明语句 用来声明变量, 格式为 : 表达式语句 在一个表达式的最后加上一个分号构成的语句, 分号是语句不可缺少的部分, 格式为 : 变量 = 表达式 ; 复合语句 [ 修饰符 ] 类型名变量名 1[, 变量名 2][, ]; [ 修饰符 ] 类型名变量名 1[= 初值 1][, 变量名 2][= 初值 2][, ]; 将相关语句组合在一起就构成复合语句,

More information

untitled

untitled 不 料 料 例 : ( 料 ) 串 度 8 年 數 串 度 4 串 度 數 數 9- ( ) 利 數 struct { ; ; 數 struct 數 ; 9-2 數 利 數 C struct 數 ; C++ 數 ; struct 省略 9-3 例 ( 料 例 ) struct people{ char name[]; int age; char address[4]; char phone[]; int

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 - C语言课件-9-结构体.pptx

Microsoft PowerPoint - C语言课件-9-结构体.pptx 第九章结构体 郎大鹏 第九章结构体 9.1 结构体类型的声明方法 9.2 结构体类型变量的定义与使用 9.3 结构体数组 9.4 编程举例 9.5 习题 9.1 结构体类型的声明方法 结构体声明的语法形式如下 : struct 结构体标识符 成员变量列表 ; }; 例如, 为了描述班级 ( 假设仅仅包括班级编号 专业 人数等信息 ), 可以声明如下的结构体类型 struct Class char Code[10];

More information

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

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

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

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

器之 间 向一致时为正 相反时则为负 ③大量电荷的定向移动形成电 流 单个电荷的定向移动同样形成电流 3 电势与电势差 1 陈述概念 电场中某点处 电荷的电势能 E p 与电荷量 q Ep 的比值叫做该点处的电势 表达式为 V 电场中两点之间的 q 电势之差叫做电势差 表达式为 UAB V A VB 2 理解概念 电势差是电场中任意两点之间的电势之差 与参考点的选择无关 电势是反映电场能的性质的物理量

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

求出所有的正整数 n 使得 20n + 2 能整除 2003n n 20n n n 20n n 求所有的正整数对 (x, y), 满足 x y = y x y (x, y) x y = y x y. (x, y) x y =

求出所有的正整数 n 使得 20n + 2 能整除 2003n n 20n n n 20n n 求所有的正整数对 (x, y), 满足 x y = y x y (x, y) x y = y x y. (x, y) x y = 求出所有的正整数 n 使得 20n + 2 能整除 2003n + 2002 n 20n + 2 2003n + 2002 n 20n + 2 2003n + 2002 求所有的正整数对 (x, y), 满足 x y = y x y (x, y) x y = y x y. (x, y) x y = y x y 对于任意正整数 n, 记 n 的所有正约数组成的集合为 S n 证明 : S n 中至多有一半元素的个位数为

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

实验 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

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章 流程控制语句的应用 语句是程序中最小的程序指令, 即程序完成一次完整正操的基本单位 在 C# 中, 可以使用多种类型的语句, 每一种类型的语句又可以通过多个关键字实现 通过这些语句可以控制程序代码的逻辑, 提高程序的灵活性, 从而实现比较复杂的程序逻辑 本章主要内容 : 选择语句的应用 迭代语句的应用 跳转语句的应用 3.1 选择语句的应用 选择语句也叫作分支语句, 选择语句根据某个条件是否成立来控制程序的执行流程

More information

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

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

More information

数据结构

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

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

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

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

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

第 章 顺序结构程序设计 程序里要对数据进行各种操作 其中进行各种运算操作是最基本的操作之一 在 语言程序中 使用表达式 也就是通常所说的计算式子 描述各种运算 表达式是由参与运算的数据和表示运算的符号按照一定的规则组成的式子 描述运算的符号称为运算符 由一个或两个特定符号表示一种运算 语言具有丰富

第 章 顺序结构程序设计 程序里要对数据进行各种操作 其中进行各种运算操作是最基本的操作之一 在 语言程序中 使用表达式 也就是通常所说的计算式子 描述各种运算 表达式是由参与运算的数据和表示运算的符号按照一定的规则组成的式子 描述运算的符号称为运算符 由一个或两个特定符号表示一种运算 语言具有丰富 第 章 顺序结构程序设计 程序里要对数据进行各种操作 其中进行各种运算操作是最基本的操作之一 在 语言程序中 使用表达式 也就是通常所说的计算式子 描述各种运算 表达式是由参与运算的数据和表示运算的符号按照一定的规则组成的式子 描述运算的符号称为运算符 由一个或两个特定符号表示一种运算 语言具有丰富的运算符 可分为多种类型 包括 算术运算符? 9 关系运算符 >> > > > 逻辑运算符 位运算符

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

C/C++ 语言 - 循环

C/C++ 语言 - 循环 C/C++ Table of contents 7. 1. 2. while 3. 4. 5. for 6. 8. (do while) 9. 10. (nested loop) 11. 12. 13. 1 // summing.c: # include int main ( void ) { long num ; long sum = 0L; int status ; printf

More information

第 3 章顺序结构程序设计 31 2) 直到型循环结构 先执行 A 操作, 再判断条件, 若条件成立, 再执行 A 操作, 如此反复, 直到条件不成立时才停止循环 由上述三种程序结构组成的程序称作结构化程序, 形成的软件称作结构化软件 C 程序结构 C 语言以文件为编译单位 一个 C 程

第 3 章顺序结构程序设计 31 2) 直到型循环结构 先执行 A 操作, 再判断条件, 若条件成立, 再执行 A 操作, 如此反复, 直到条件不成立时才停止循环 由上述三种程序结构组成的程序称作结构化程序, 形成的软件称作结构化软件 C 程序结构 C 语言以文件为编译单位 一个 C 程 第 3 章顺序结构程序设计 随着计算机应用的不断发展, 软件变得越来越复杂 软件的可读性 可理解性等问题变得十分突出 经过不断的研究和实践, 确定了程序设计的基本方法, 这就是结构化程序设计方法 结构化程序设计方法使得程序的逻辑结构清晰, 层次分明, 有效地改善了程序的可靠性, 提高了软件的质量 本章所介绍的语句, 将按它们在程序中出现的顺序逐条执行, 由这样的语句构成的程序结构称为顺序结构 本章主要介绍以下内容

More information

2001年(下)局域网技术与组网工程试卷答案

2001年(下)局域网技术与组网工程试卷答案 二 一年上半年全国高等教育自学考试计算机基础与程序设计试卷 一 单项选择题 ( 本大题共 20 小题, 每小题 1 分, 共 20 分 ) 在每小题列出的四个选项中只有一个选项是符合题目要求的, 请将正确选项前的字母填在题后的括号内 1.I/O 设备指的是计算机的 ( ) A 存储设备 B 输入和输出设备 C 控制器 D 运算器 2. 具有只读功能的内存储器是指 ( ) A ROM B RAM C

More information

Microsoft Word C语言程序设计-理论与实践正文.doc

Microsoft Word C语言程序设计-理论与实践正文.doc 第 3 章 C 语言流程控制 在本章中将学习到如下内容 : 格式化输入 / 输出函数 C 语言中的顺序 分支和循环程序的设计方法 通过前面的学习, 我们已经能够编写一些比较简单的 C 程序了, 但是在解决实际问题的时候, 可能会遇到一些诸如满足某种条件进行怎样的处理, 不满足又进行怎样的处理, 或者某一个处理需要反复进行很多次处理这样的问题 那么在 C 语言中, 怎样来解决这类问题呢? 通过对本章的学习,

More information

普通高等教育 十二五 重点规划教材 C 语言程序设计习题集 刘立君主 编 王立武朱姬凤王锦 副主编 北 京

普通高等教育 十二五 重点规划教材 C 语言程序设计习题集 刘立君主 编 王立武朱姬凤王锦 副主编 北 京 社 心 版 中 出 版 学 科 术出 k.cn 技 boo 教.a 职 ww w 普通高等教育 十二五 重点规划教材 C 语言程序设计习题集 刘立君主 编 王立武朱姬凤王锦 副主编 北 京 ii C 语言程序设计习题集 内容简介 本书是为学习 C 语言程序设计的读者提供的参考书, 书中精心设计的例题和习题对读者深入掌握 C 语言极有参考价值 全书共分为 13 章, 书中的试题基本覆盖了 C 语言程序设计课程的全部内容,

More information

第 10 章结构体和枚举教案 一 授课题目 ( 教学章 节或主题 ) 10.1 结构体及结构体变量 10.2 结构体数组 二 教学时间安排 上课 2 学时 三 教学目的 要求 知识目标 : 学习结构体变量和结构体数组的定义和引用能力目标 : 掌握结构体的初步应用情感目标 : 通过结构体编程实践获得成

第 10 章结构体和枚举教案 一 授课题目 ( 教学章 节或主题 ) 10.1 结构体及结构体变量 10.2 结构体数组 二 教学时间安排 上课 2 学时 三 教学目的 要求 知识目标 : 学习结构体变量和结构体数组的定义和引用能力目标 : 掌握结构体的初步应用情感目标 : 通过结构体编程实践获得成 第 10 章结构体和枚举教案 一 授课题目 ( 教学章 节或主题 ) 10.1 结构体及结构体变量 10.2 结构体数组 二 教学时间安排 上课 2 学时 三 教学目的 要求 知识目标 : 学习结构体变量和结构体数组的定义和引用能力目标 : 掌握结构体的初步应用情感目标 : 通过结构体编程实践获得成就感, 提升 C 语言编程的兴趣 四 教学重点或难点 教学重点 : 结构体数组成员的引用 教学难点 :

More information

Microsoft Word - FM{new}.doc

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

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

<4D F736F F D D382043D3EFD1D4B3CCD0F2C9E8BCC6D5FDCEC42E646F63>

<4D F736F F D D382043D3EFD1D4B3CCD0F2C9E8BCC6D5FDCEC42E646F63> 第 5 章循环控制结构 本章导读在进行程序设计时, 仅仅使用前面学过的顺序结构和选择结构, 往往解决不了一些较复杂的问题, 比如累加 求一个班学生的平均分等 C 语言还提供了一种重要的控制结构 循环结构, 利用循环结构可以解决复杂的 重复性的操作 循环结构的作用是使某段程序重复的执行, 具体循环的次数会根据某个条件来决定 循环结构的应用非常普遍, 使用起来也比较灵活, 熟练掌握循环结构对学习编程是非常重要的

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 Python 入门 孙栩 xusun@pku.edu.cn 1 课程的整体介绍 目录 contents 2 Python 的介绍及如何安装 Python 3 使用 Python 编写简单小程序 1 课程的整体介绍 课程的整体介绍 Python 入门 1. Python 的介绍与安装 2. 变量与表达式 3. 一些简单的小程序 数据结构 1. 字符串 2. 列表 3. 元组 4. 字典 5. 集合 分支与循环

More information

文件

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

More information

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

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN: 978-7-302-13599-9, 红色封面答案制作时间 :2011 年 2 月 -5 月一 思考题 1 函数总需要从 main 中调用吗? 当调用一个函数时, 为什么要使用参数? 函数不是总需要从 main 函数中调用, 使用参数的目的是为了给被调函数传递数据 2 什么是函数的返回值? 是否每个函数都有返回值?

More information

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

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

More information

Microsoft Word - 扉页

Microsoft Word - 扉页 科学出版社职教技术出版中心 普通高等教育 十一五 规划教材 ( 第二版 ) 刘加海朱云其等编著 北 京 内容简介 本书系统地介绍了 C 语言程序的设计思路 设计方法及开发流程, 通过大量的程序设计实例及与实例相仿的思考题, 能使读者尽快提高 C 语言程序设计能力 本书结构合理, 概念清楚, 由浅入深, 实用性强, 程序中的函数 循环 数组与基本算法 ( 如查找 排序 删除等 ) 融为一体 全书从字符串输出开始,

More information

Static Enforcement of Security with Types

Static Enforcement of Security with Types 例题 1 一个 C 语言程序及其在 X86/Linux 操作系统上的编译结 果如下 根据所生成的汇编程序来解释程序中四个变 量的存储分配 生存期 作用域和置初值方式等方面 的区别 static long aa = 10; short bb = 20; func( ) { } static long cc = 30; short dd = 40; static long aa = 10; func(

More information

Guava学习之Resources

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

More information