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

Size: px
Start display at page:

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

Transcription

1 普通高等教育 十二五 规划教材计算机系列中国科学院教材建设专家委员会 十二五 规划教材 程序设计基础 C 语言 杨莉刘鸿翔主编唐宏亮邓芳副主编余慧王海军 1 科学出版社职教技术出版中心 北 京

2 内容简介本书主要内容包括程序设计基础知识 C 语言数据类型 运算符与表达式 程序结构 数组 指针 其他数据类型 函数 文件等, 通过对大量实例进行分析, 力求提高和培养学生的程序设计能力 本书有配套辅导教程 程序设计基础实训指导教程 C 语言 ( 科学出版社出版 ), 引导读者学习和巩固各章节内容 本书结构清晰 内容精练 概念清楚 实例丰富 深入浅出, 对读者可能遇到的疑难问题和易混淆概念作了详细的阐述 本书可作为高等院校相关专业教材和参考用书, 还可以作为参加二级 C 语言程序设计考试者的自学用书 图书在版编目 (CIP) 数据 程序设计基础 :C 语言 / 杨莉, 刘鸿翔主编. 北京 : 科学出版社,2011 ISBN Ⅰ. 1 程 Ⅱ. 1 杨 2 刘 Ⅲ. 1C 语言 - 程序设计 - 高等学校 - 教材 Ⅳ. 1TP312 中国版本图书馆 CIP 数据核字 (2011) 第 号 责任编辑 : 戴薇郭丽娜 / 责任校对 : 马英菊 责任印制 : 吕春珉 / 封面设计 : 东方人华平面设计部 出版北京东黄城根北街 16 号邮政编码 : 北京双清印刷厂印刷科学出版社发行各地新华书店经销 2012 年 1 月第一版 2012 年 1 月第一次印刷 * 开本 : /16 印张 :18 3/4 字数 : 定价 :32.00 元 ( 如有印装质量问题, 我社负责调换 < 环伟 >) 销售部电话 编辑部电话 版权所有, 侵权必究举报电话 : ; ;

3 前 言 随着计算机在社会各个领域的广泛应用, 对计算机的应用能力, 特别是程序设计能 力的要求在不断提高 程序设计基础课程作为计算机能力培养的重要课程, 侧重于培养学 生掌握程序设计的基本方法和技巧, 以及编写程序解决相关专业领域问题的能力 在众多的程序设计语言中,C 语言因其具有完备的高级语言特性 丰富灵活的控制 和数据结构 简洁而高效的语句表达以及清晰的程序结构, 一直得到广泛的应用 即使在面向对象程序设计语言逐渐普及的今天, 各理工类专业, 尤其是计算机专业, 程序设计语言入门课程都首选 C 语言 本书共分九章, 内容包括程序设计概述 数据类型 运算符与表达式 程序结构 数组 指针 其他数据类型 函数 文件 综合应用等 根据初学者的特点和认识规律, 本书内容的组织遵循先易后难 深入浅出的原则 从第 2 章开始每章后面增加本章小结及常见错误列举, 对读者可能遇到的疑难问题和易混淆概念作了详细的阐述, 帮助读者深刻理解 书中给出的综合应用, 能帮助初学者了解大型程序的编写技巧, 为学生提供了课程设计的指导资料, 具有参考和借鉴价值, 从而提高学生兴趣, 激发上进, 使得理论与实践结合得更为紧密 程序设计是一门实践性很强的课程, 读者在学习过程中一定要重视实践环节 在掌握概念的基础上, 要求能够独立完成每章习题中的设计和开发型编程题, 并要求能上机调试运行 与本书配套的 程序设计基础实训指导教程 C 语言 ( 与本书同时出版 ), 主要用于上机实训 等级考试实训和自测练习 本书主编十几年来一直从事程序设计基础的一线教学工作, 也是学校程序设计基础的精品课程负责人, 在多年的程序设计基础课程的教学改革实践基础上编写了本书 本书具有概念清晰 例题丰富 实用性强的特点 参加本书编写与审稿工作的有杨莉 刘鸿翔 唐宏亮 邓芳 余慧 王海军 王芳 宋婉娟 杨宜波 万润泽 许庆炜 文中林 书中所给出的实例程序全部在 Visual C 环境下调试通过 在本书的内容编排和文字排版等方面, 科学出版社给予了多方面的支持与帮助, 在此表示衷心的感谢 由于编者水平有限, 书中难免有欠妥之处, 恳请广大读者提出宝贵意见 科学出版社职教技术出版中心

4 目 录 第 1 章程序设计概述 基本概念 程序 计算机程序 程序设计 软件 程序设计语言 问题求解与算法设计 计算机求解问题的步骤 算法定义 伪代码 流程图 N-S 图 UML C 语言概述 C 语言的发展过程和特点 C 程序设计的基本结构 C 语言程序的运行 C 程序集成开发环境 Visual C 启动 VC 新建 / 打开 C 语言程序文件 保存程序 执行程序 关闭程序工作区 18 习题 1 18 第 2 章数据类型 运算符与表达式 C 语言的数据类型 常量与变量 关键字 标识符 常量与符号常量 变量 整型数据 24

5 iv 程序设计基础 C 语言 整型常量 整型变量 实型数据 实型常量 实型变量 字符型数据 字符常量 转义字符 字符串常量 字符变量 变量赋初值 算术运算符和算术表达式 C 语言运算符简介 算术运算符和算术表达式 赋值运算符和赋值表达式 赋值运算符 赋值表达式 逗号运算符和逗号表达式 本章小结及常见错误列举 41 习题 2 43 第 3 章程序结构 顺序结构程序设计 C 语言中的语句 格式化输入 / 输出函数 字符输入 / 输出函数 顺序结构程序举例 55 科学出版社职教技术出版中心 选择结构程序设计 关系运算符及关系表达式 逻辑运算符和逻辑表达式 选择结构 条件运算符 switch 语句 选择结构程序举例 循环结构程序设计 goto 语句 while 语句构成的循环结构 do-while 语句构成的循环结构 75

6 目录 v for 循环 循环的嵌套 break 语句和 continue 语句 应用综合举例 本章小结及常见错误列举 87 习题 3 90 第 4 章数组 一维数组 一维数组的定义 一维数组的初始化 一维数组元素的引用 一维数组程序举例 二维数组 二维数组的定义 二维数组的初始化 二维数组元素的引用 二维数组程序举例 字符串 C 语言对字符串的约定 字符串的存储 字符串的输入 / 输出 字符串处理函数 字符串程序举例 本章小结及常见错误列举 111 习题 第 5 章指针 指针变量的定义与应用 变量的地址和指针的概念 指针变量的定义 指针变量的赋值 对指针变量的操作 指针和一维数组 数组元素的指针 通过指针引用数组元素 指针和二维数组 二维数组与一维数组的关系 二维数组元素地址的表示方法 127

7 vi 程序设计基础 C 语言 指向二维数组元素的指针变量 指向二维数组行的指针变量 指针数组 指针与字符串 使用指针指向字符串 指向指针的指针变量 本章小结及常见错误列举 135 习题 第 6 章其他数据类型 结构体 结构体类型的定义 结构体变量 结构体数组 结构体与指针 指向结构体变量的指针 指向结构体数组的指针 用指针处理静态链表简介 共用体 枚举类型 用 typedef 定义数据类型 位运算 位运算符和位运算 位运算举例 本章小结及常见错误列举 161 习题 第 7 章函数 167 科学出版社职教技术出版中心 概述 函数的定义 函数的一般调用 函数调用方式 函数声明 函数参数的传递方式 形参和实参 数组元素作为实参 数组名作函数参数 二维数组名作函数参数 函数的嵌套与递归调用 178

8 目录 vii 函数的嵌套调用 函数的递归调用 函数与指针 指针作函数参数 返回指针值的函数 函数指针和指向函数的指针变量 主函数 main 的参数 函数与结构体 用结构体变量作参数 用指向结构体变量的指针作参数 变量的作用域 局部变量 全局变量 自动变量 寄存器变量 静态变量 内部函数与外部函数 内部函数 外部函数 预处理命令 宏定义 文件包含 条件编译 模块结构程序设计 结构化程序设计方法 模块化程序设计 结构化程序编写 学生成绩统计程序 模块结构程序的工程创建与调试 本章小结及常见错误列举 233 习题 第 8 章文件 C 文件概述 文件类型指针 文件的打开与关闭 文件的打开 文件的关闭 245

9 viii 程序设计基础 C 语言 8.4 文件的读写 fputc(putc) 函数和 fgetc(getc) 函数 fgets 函数和 fputs 函数 fread 函数和 fwrite 函数 fprintf 函数和 fscanf 函数 文件的定位 rewind 函数 fseek 函数 ftell 函数 文件检测函数 本章小结及常见错误列举 256 习题 第 9 章综合应用 动态链表 系统功能与分析 数据结构 模块设计 参考程序 265 附录 281 附录 Ⅰ C 语言关键字 281 附录 Ⅱ C 语言运算符的优先级与结合性 281 附录 Ⅲ ASCII 字符编码表 282 附录 Ⅳ C 语言常用库函数浏览 282 参考文献 288 科学出版社职教技术出版中心

10 第 1 章程序设计概述 自 1946 年世界上第一台计算机问世以来, 计算机的应用已无处不在, 无所不及 一种是人们利用计算机强大的计算能力和事务处理能力为自己的事业和生活服务, 如利用 Photoshop 处理图片 利用 Word 编写文档 利用 PowerPoint 设计幻灯片 利用 Internet 获取信息等 而另一种则是利用计算机进行程序设计, 学会程序设计意味着真正地走进了计算机的世界, 程序设计语言本身就是与计算机进行交互的有力工具 本章主要介绍程序设计的相关概念和 C 语言程序设计概述及 Visual C 开发环境 1.1 基本概念 程序 程序一词来自生活, 通常指完成某些事务的一种既定方式和过程, 也可以将程序看成对一系列动作的执行过程的描述 日常生活中可以找到许多 程序 实例 例如, 到图书馆借书的过程描述如下 : S1. 进入图书馆 ; S2. 查书目 ; S3. 按书目找书 ; S4. 办理借书手续 ; S5. 离开图书馆 这是一个直线形程序, 是形式最简单的程序, 它给出一个包含具体步骤的序列 如果按顺序实施这些步骤, 也就完成了该项事务 上述过程是一种理想情况, 而实际过程要复杂得多, 这里再给出一个细化的过程描述 S1. 进入图书馆 ; S2. 查书目 ; S3. 按书目找书 ; S4. 如果该书已经借出, 可以有两种选择 : S4.1. 回到 S2( 进一步查找其他相关的书目 ); S4.2. 放弃借书, 到 S6; S5. 找到了要借的书, 办理借书手续 ; S6. 离开图书馆 这个程序比前一个复杂一些, 它不再是一个平铺直叙的动作序列, 步骤更多, 还出现了分情况处理 (S4) 和可能出现的重复性动作 (S4.1) 如果仔细探究这个实例, 可以发现还有很多情况未考虑, 即这一程序还可以进一步细化 现实生活中有许多程序性活动, 通常需要按部就班完成一系列动作 对这种工作 ( 事物 活动 ) 过程细节动作的描述就是一个 程序 在一个程序描述中, 总有一批预先假定的 基本动作, 这些基本动作是程序执行

11 2 程序设计基础 C 语言 者能够理解和直接完成的 一个程序总有开始与结束, 在执行此程序的过程中, 动作者需要按照程序的描述执行一系列的动作, 在达到结束位置时工作就完成了 计算机程序 计算机里的程序执行与日常生活中的程序性活动情况很相似 从这点出发, 可以帮助理解计算机的活动方式 当然, 人们日常生活中的程序性工作有更多变数, 许多事情并不要求完全按程序做, 可以有许多 灵活性 而计算机对程序的执行则完全是严格的, 必须一步步按程序中的指令办事, 一点 商量 的余地都没有 人们把需要计算机完成的任务编排出正确的方法和步骤, 用计算机能够理解的语言表达出来, 就是 程序 例如, 要计算机计算两个数的平均值, 计算步骤如下 1) 确定要计算的是哪两个数 2) 求两个数的和 3) 将此和除以 2 4) 输出计算结果 编写程序的目的就是将这些步骤用计算机能够接受的形式告诉计算机, 指挥计算机完成任务 综上所述, 程序就是为实现特定目标或解决特定问题而用计算机语言编写的 可以连续执行并能够完成一定任务的指令序列的集合 程序是用汇编语言 高级语言等编写出来的可以运行的文件, 在计算机中称为可执行文件 ( 扩展名一般为.exe), 是计算机软件的一个实例 所谓指令, 就是计算机可以识别的命令 虽然在人类社会中, 各民族都有丰富的语言用以表达思想 交流感情 记录信息, 但计算机不能识别它们 计算机所能识别的指令形式, 只能是 0 和 1 的组合 一台计算机硬件系统所能识别的所有指令的集合, 称为它的指令系统 一个程序包括数据和算法两个部分 前者是对数据形式的表示和描述 ( 数据流 ), 即指定程序所使用数据的数据结构和组织形式, 不同语言对数据定义不同, 本书是指 C 语言的数据类型和数据结构 ; 后者是对数据进行操作的描述 ( 控制流 ), 指定操作的步 骤, 即程序设计的算法 因此, 数据和算法是程序中既对立又统一的两个概念, 它们之 间的对立统一体现了程序要处理的数据对象与处理数据对象方法之间的关系 没有数据, 算法就没有运算处理的对象 算法具有通用性, 它脱离于语言之外, 是程序设计的灵魂 著名的瑞士计算机科学家 PASCAL 语言发明者 N. 沃思 (Niklaus Wirth) 教授提出 了程序定义的著名公式, 即 程序设计 程序 = 算法 + 数据结构 科学出版社职教技术出版中心 程序设计是给出解决特定问题程序的过程, 是软件构造活动中的重要组成部分 程序设计往往以某种程序设计语言为工具, 如本书给出的是 C 语言的程序设计 程序设计过程应当包括分析 设计 编码 测试 排错等不同阶段 专业的程序设计人员常被称为程序员 目前程序设计方法主要有面向过程的结构化程序设计和面向对象程序设计 本书只介绍面向过程的结构化程序设计

12 第 1 章程序设计概述 3 结构化程序设计方法的主要原则可以概括为自顶向下 逐步求精 模块化 限制使用 goto 语句 1) 自顶向下 程序设计时, 应先考虑总体, 后考虑细节 ; 先考虑全局目标, 后考虑局部目标 不要一开始就过多追求众多的细节, 先从最上层总目标开始设计, 逐步使问题具体化 2) 逐步求精 对复杂问题, 应设计一些子目标作过渡, 逐步细化 3) 模块化 一个复杂问题, 肯定是由若干稍简单的问题构成 模块化是把程序要解决的总目标分解为分目标, 再进一步分解为具体的小目标, 把每个小目标称为一个模块 4) 限制使用 goto 语句 结构化程序设计采用单入口单出口的控制方式, 程序由顺序 分支选择和循环三种基本结构组成 这三种基本结构的特点是每一种结构只有一个入口和一个出口, 任何一个问题都可以用三种基本结构实现, 任何复杂的程序都可以由这三种基本结构组成 结构化程序设计使得程序结构清晰 可读性好, 在出现问题时, 便于查错, 易于修改, 提高了程序设计的质量 软件 软件是计算机系统的重要组成部分 软件由程序和有关程序的技术文档资料组成, 具有专门而完善的功能 软件系统包括系统软件和应用软件 系统软件是围绕计算机系统本身开发的程序系统, 如我们使用的各类操作系统 (Windows UNIX DOS 等 ) 语言编译程序 数据库管理软件等 应用软件是专门为了某种使用目的而编写的程序系统, 常用的应用软件包括文字处理软件 专用财务软件 人事管理软件 图形处理软件等 1.2 程序设计语言 程序设计语言的发展经历了以下几个阶段 1. 第一代语言 第一代语言是机器语言, 它由计算机的指令系统组成 由于计算机只能识别和存储二进制的数据和指令, 机器语言中的每一条语句 ( 机器指令 ) 实际就是由 0 和 1 组成的二进制代码, 它由操作码的二进制编码和操作数的二进制编码组成 机器指令通常随计算机类型不同而不同, 编写效率较低 例如, 通过某类型的计算机计算 a= 1.27 则其机器语言表示如表 1.1 和表 1.2 所示 表 1.1 数据 地 址 数 a

13 4 程序设计基础 C 语言 地 址 操作码 表 1.2 程序 指 令 地址码 取 乘 加 除以 存储 a 打印 a 停止 计算机虽然可以直接识别和执行机器语言程序, 执行效率高, 但是人工编写机器语言程序较为繁琐, 且易出错 2. 第二代语言 第二代语言是汇编语言, 也称为符号语言, 它用符号代替机器语言中的二进制编码, 这样看起来较直观, 不易出错 上例的汇编语言程序如下 : K: LDA 5.36 MUL 1.64 ADD 2.58 DIV 1.27 STA a PRINTF a STOP 与机器语言一样, 不同类型的计算机具有不同的汇编语言 计算机不能直接识别和执行汇编语言程序, 必须把汇编程序 ( 系统软件 ) 转换成机器语言 ( 目标程序 ) 后, 才能执行, 如图 1.1 所示 汇编语言与机器语言是一一对应的, 一个复杂的程序包含许多汇编语言指令, 写起来较繁琐 机器语言和汇编语言都是面向机器的语言, 因此两者也被称为 低级语言 3. 第三代语言 图 1.1 汇编语言的汇编与执行 第三代语言也称为算法语言 算法语言中的语句较为接近自然语言的英文字句, 数据用十进制来表示, 从而更容易为人们掌握和理解 并且算法语言独立于计算机系统, 用它编写的程序可以在任何其他类型的计算机上执行 因此算法语言也称为 高级语言 注 释 科学出版社职教技术出版中心

14 第 1 章程序设计概述 5 常用的高级语言有 BASIC FORTRAN ALGOL COBOL PASCAL C 语言等 上例用 BASIC 语言实现如下 : 10 a=( *1.64)/ PRINTF a 30 END 用高级语言编写的程序称为 源程序, 计算机不能直接识别和执行, 必须将它翻译成计算机能够识别的机器指令表示的目标程序 翻译方式有解释方式和编译方式 解释方式是解释一条执行一条 BASIC 语言采用解释方式翻译执行,C 语言源程序采用编译方式翻译执行, 需要经过编译程序 ( 系统软件 ) 编译成目标程序 (*.obj), 再经过连接程序 ( 系统软件 ) 连接成可执行文件 (*.exe) 后, 才能执行, 其过程如图 1.2 所示 图 1.2 语言的编译与执行算法 4. 第四代语言第三代语言是过程化语言, 必须描述问题是如何求解的 第四代语言是非过程化语言, 只用描述需要求解的问题是什么 例如, 需要将某班学生的成绩按高低的次序输出 用第四代语言只需写出这个要求即可, 而不必写出排序的过程 数据库查询语言就可以做到这一点, 因此可以把数据库查询语言看成是最简单的第四代语言 5. 第五代语言第五代语言主要是为人工智能领域设计的, 如知识库系统 专家系统 推理工程 自然语言处理等, 称为智能化语言 在这些领域内将复杂的知识进行编码, 使得计算机能从中得出推论 第五代语言还处于萌芽状态,PROLOG 语言可以看作是它的一个例子 1.3 问题求解与算法设计 计算机求解问题的步骤人们所要解决的问题, 大致有两类 : 一类问题可以抽象成数学模型, 通过求解这个数学问题达到求解问题的本身 ; 另一类问题由于人类的认识有限 使用方法有限或其他一些原因的存在, 无法抽象出数学模型, 因而只能通过模拟事物本身运作的过程来解决 但不管是哪一类问题, 都需要首先明确问题的描述 问题的要求, 然后根据已有的知识 认识的能力, 以一种较抽象的方式来表达问题, 再提出解决该问题的途径 若存在多种

15 6 程序设计基础 C 语言 途径, 可从中选择最合适的一种, 然后设计解决方案并把它付诸实施, 最终解决这个问题 对于一些大的 复杂的问题还需作可行性研究 综上所述, 可以把人解决问题的步骤归纳为以下几步 : S1. 明确问题 ; S2. 精确表达问题 ; S3. 设计解决方案 ; S4. 实施解决 从解决具体问题的过程出发, 目的是为了导出计算机帮助人解决问题的方法和步骤, 让计算机按照人的思维过程, 完成人布置的任务 当然, 目前计算机只是一个电子装置, 无法像科幻电影中的机器人一样, 具有逻辑思维能力, 可以自动完成工作 计算机硬件必须在系统软件和应用软件的支持下, 按照人所规定的解决方案, 完成指定的工作 因此, 计算机在配合人解决问题的过程中, 只是根据人提出的解决方案, 给出一个解决问题的数值或模拟 如果解决方案本身已经抽象出数学模型, 它就可以解这个数学模型, 进而得到数值解 ; 如果解决方案是一个逻辑模拟模型, 计算机可求得模拟实现过程 使用计算机解决问题时, 首先要把具体问题抽象为模型, 再把模型表现为用具体的计算机语言描述的程序 在这一过程中, 程序设计者不应首先考虑实现细节, 而要把精力放在建立系统的总体模型上 如果把程序看作是构成系统的程序零件, 首先要根据系统的要求或功能, 考虑系统应由哪些程序零件构成, 然后再考虑各个程序零件该如何实现 因此, 使用计算机解决问题, 大致有如下步骤 : S1. 明确问题 ; S2. 精确表达问题 ; S3. 设计解决方案 ( 模型或算法 ); S4. 把解决方案用计算机程序实现 ( 程序设计 ); S5. 计算机运行 求解 其中,S1~S4 都要由人来完成 对于实际中的复杂问题,S1~S3 通常会涉及问题所处领域的专业知识, 由专业人士完成或参与完成, 不具有通用的方法 ;S4 由程序员完成 ;S5 才是计算机的工作 为了学习程序设计, 读者应了解上面 5 个步骤, 掌握计算机对简单问题的求解步骤 算法定义 科学出版社职教技术出版中心 算法是为了解决一个特定问题而采取的确定的 有限的 按照一定次序进行的 缺一不可的执行步骤 一个好的算法将产生质量较好的程序 算法应当具备以下几个方面的特点 :1 一个算法必须保证执行有穷步骤之后结束 ; 2 算法的每一个步骤必须具有确切的定义 ;3 应对算法给出初始量 ;4 算法具有一个或多个输出 ;5 算法必须能够进行, 如 计算 X/0 是不允许的

16 第 1 章程序设计概述 7 算法必须能在有限时间内完成, 且对相同的输入有相同的输出 在程序设计语言中, 与算法密切相关的便是语句, 包括与程序执行处理有关的 功能语句 ( 如输入语句 输出语句 赋值语句 调用语句等 ) 和与程序执行流程有关的语句 ( 如条件语句 循环语句等 ) 对程序设计而言, 算法的确定也就是如何合理安排这些语句以完成人要求的特定功能 从上面的分析可知, 算法是描述某一问题求解的有限步骤, 而且必须有结果输出 设计一个算法, 或者描述一个算法, 最终是由程序设计语言来实现的 但算法与程序设计又是有区别的, 主要是一个由粗到细的过程 算法是考虑实现某一个问题求解的方法和步骤, 是解决问题的框架流程 ; 而程序设计则是根据这一求解的框架流程进行语言细化, 实现这一问题求解的具体过程 学习高级语言时, 一方面要熟练掌握该种语言的语法规则, 因为它是算法实现的基础 ; 另一方面必须认识到算法的重要性, 加强分析问题的能力训练, 写出高质量的程序 设计算法的过程是从具体到抽象的过程 首先, 应该清楚人工处理应该采取的主要步骤 ; 其次, 对这些步骤进行归纳整理, 抽象出数学模型 ; 最后, 采用描述工具加以描述 算法描述工具包括伪代码 流程图 N-S 图 UML 等 伪代码 伪代码 (pseudocode) 是一种算法描述语言 伪代码是介于自然语言与编程语言之间的文字和符号描述算法, 是在算法开发过程中用来表达设计思想的符号系统 使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言 (PASCAL C Java 等 ) 实现 因此, 伪代码必须结构清晰 代码简单 可读性好, 并且类似自然语言 伪代码只是像流程图一样用在程序设计的初期, 帮助写出程序流程 简单的程序一般都不用写流程 写思路, 但是复杂的代码, 最好还是把流程写下来, 总体考虑整个功能如何实现 写完以后不仅可以用来作为以后测试 维护的基础, 还可用来与他人交流 但是, 如果把全部的东西写下来必定会浪费很多时间, 那么这个时候可以采用伪代码方式 例如, 求 Y=1-1/2+1/3-1/4+1/5- 前 30 项之和 用伪代码表示的算法如下 : BEGIN( 算法开始 ) 0 =>Y 1 =>i -1 =>f while i <= 30 Y + 1 / i * ( - f ) =>Y i+1 =>i printf Y END( 算法结束 )

17 8 程序设计基础 C 语言 这样, 不但可以达到文档的效果, 同时可以节约时间, 更重要的是能使结构比较清晰, 表达方式更加直观 流程图流程图采用不同的几何图形来表示算法的各个步骤, 每个几何图形表示不同性质的操作 美国国家标准协会 (American National Standard Institute,ANSI) 规定了一些常用的流程图符号, 表 1.3 列出常用的流程图符号及功能 表 1.3 常用流程图符号及功能 流程图符号 符号功能 开始 结束 处理 判断 输入 输出 流程方向 例如, 比较两个数的大小, 流程图如图 1.3 所示 科学出版社职教技术出版中心 图 1.3 比较两个数的大小流程图流程图描述方法在算法表达上简明直观 易于理解 但流程图的 流程方向 代表控制流, 可以不受结构化制约而任意跳转控制 此外, 每个符号对应一行源程序代码, 使得大型程序的可读性较差

18 第 1 章程序设计概述 N-S 图 N-S 图是美国学者 I.Nassi 和 B.Shneiderman 提出的一种新的流程图形式, 并以二人姓氏首字母命名 N-S 图摒弃了传统流程图中带箭头的流向线, 全部算法以一个大的矩形框表示, 该框内还可以包含一些从属于它的小矩形框, 适于结构化程序设计 图 1.4 表示了结构化程序设计的 4 种基本结构的 N-S 图 其中,(a) 表示顺序结构 ; (b) 表示选择结构 ;(c) 表示当型循环结构 ;(d) 表示直到型循环结构 T 表示条件为真 ; F 表示条件为假 n 图 1.4 N-S 图的四种基本结构 例如, 求解 sum = i,n-s 图的描述如图 1.5 所示 i 1 图 1.5 N-S 图描述举例 UML UML(Unified Modeling Language) 即统一建模语言, 是用来对软件密集系统进行可视化建模的一种语言 UML 是为面向对象开发系统的产品进行说明 可视化和编制文档的一种标准语言, 是在开发阶段, 说明 可视化 构建和书写一个面向对象软件密集系统的制品的开放方法 UML 展现了一系列最佳工程实践, 这些最佳实践在对大规模 复

19 10 程序设计基础 C 语言 杂系统进行建模方面, 特别是在软件架构层次上已经被验证有效 UML 最适于数据建模 业务建模 对象建模和组件建模等 UML 代表了面向对象方法的软件开发技术的发展方向, 具有巨大的市场前景, 也具 有重大的经济价值和国防价值 UML 的目标是以面向对象图的方式描述任何类型的系 统, 具有很宽的应用领域 其中, 最常用的是建立软件系统的模型, 但它同样可以用于 描述非软件领域的系统, 如机械系统 企业机构或业务过程, 以及处理复杂数据的信息 系统 具有实时要求的工业系统或工业过程等 总之,UML 是一个通用的标准建模语言, 可以对任何具有静态结构和动态行为的系统进行建模 此外,UML 适用于系统开发过程中从需求规格描述到系统完成后测试的不同阶段 在需求分析阶段, 可以用用例捕获用户需求 通过用例建模, 描述对系统感兴趣的外部 角色及其对系统 ( 用例 ) 的功能要求 分析阶段主要关注问题域中的主要概念 ( 如抽象 类和对象等 ) 和机制, 需要识别这些类及其相互间的关系, 并用 UML 类图描述 为实现用例, 类之间需要协作, 这可以用 UML 动态模型来描述 在分析阶段, 只对问题域的对象 ( 现实世界的概念 ) 建模, 而不考虑定义软件系统中技术细节的类 ( 如处理用户接口 数据库 通信和并行性等问题的类 ) 这些技术细节将在设计阶段引入, 因此设计阶段为构造阶段提供更详细的规格说明 UML 是一个标准的图形表示法, 它不是面向对象的分析和设计, 也不是一种方法, 而是一组符号 C 语言的发展过程和特点 1.4 C 语言概述 1972 年 C 语言的产生 C 语言于 1972 年由美国的 Dennis M.Ritchie 设计发明, 首次应用是在运行 UNIX 操作系统的 DEC PDP-11 计算机上 它由早期的编程语言 BCPL(Basic Combind Programming Language) 发展演变而来, 既保持了 BCPL 和 B 语言简练的优点, 又克服了它们过于简单 数据无类型的缺点 1973~1988 年 C 语言的发展 为了使 UNIX 操作系统推广,1977 年 Dennis.M.Ritchie 发表了不依赖于具体机器系统的 C 语言编译文本 可移植的 C 语言编译程序 1978 年 Brian.W.Kernighian 和 Dennis.M.Ritchie 出版了名著 The C Programming Language, 从而使 C 语言成为目前世界上流行最广泛的高级程序设计语言 1988 年 C 语言的成熟 随着微型计算机的日益普及, 出现了许多 C 语言版本 由于没有统一的标准, 使得这些 C 语言之间出现了一些不一致的地方 为了改善这种情况, 美国国家标准协会为 C 语言制定了一套 ANSI 标准, 成为现行的 C 语言标准 C 语言具有下列特点 1) 功能强大 灵活, 可用于完成操作系统 文字处理 图形 电子表格等工作 许多大型应用软件都是用 C 语言编写的, 甚至可以用来编写其他语言的编译器 可以说, 科学出版社职教技术出版中心

20 第 1 章程序设计概述 11 使用 C 语言能完成的工作完全受限于使用者的想象力, 语言本身不会带来任何约束 2) 具有结构紧凑 灵活方便的特点 C 语言一共只有 32 个关键字 9 种控制语句, 语法限制较少, 程序书写自由 3) 具有丰富的运算符 C 语言共有 34 个运算符, 灵活使用各种运算符可以实现在 其他高级语言中难以实现的运算 4) 具有丰富的数据结构 C 的数据类型有整型 实型 字符型 数组类型 指针类型 结构体类型 共用体类型等, 能用来实现各种复杂的数据类型的运算, 并引入了指针概念, 使程序效率更高 5) 语法限制不太严格 程序设计自由度大 一般高级语言语法检查比较严, 能够查出所有语法错误, 而 C 语言允许程序编写者有较大的自由度 6) 结构式语言 实现了代码与数据的分离, 即程序的各个部分除了必要的信息交流外彼此独立, 使程序层次清晰, 便于读写 维护以及调试 C 语言是以函数形式提供给用户的, 这些函数可以方便地调用, 并具有多种循环 条件语句控制程序结构, 从而使程序完全结构化 7)C 语言适用范围大, 可移植性好 这意味着为一种计算机系统 ( 如 Windows 系统 ) 编写的 C 语言程序, 只需做少量的修改, 甚至完全无需修改, 就可以在其他系统 ( 如 UNIX 系统 ) 上编译运行 8)C 语言允许直接访问物理地址, 可以直接对硬件进行操作 C 语言明显优于其他高级语言, 既具有高级语言的功能, 又具有低级语言的实用性, 能够像汇编语言一样对位 字节和地址进行操作, 而这三者是计算机最基本的工作单元, 因此可以用来写系统软件 9) 程序生成代码质量高, 程序执行效率高 一般只比汇编程序生成的目标代码效率低 10%~20% 10)C 语言至今仍是编程的主要语言之一 例如, 嵌入式系统领域, 一些新开发工具也基于 C 语言平台 ( 如 IBM 的 Mq) 基于上述特性,C 语言是程序设计初学者的首选 当然,C++ 和 Java 在目前实际应用中已经超过了 C 语言, 尤其是 Java 语言 C++ 是 C 语言的超集, 包含了 C 语言中的所有内容, 同时增加了面向对象的概念 Java 语言同样也是基于 C 语言的 因此, 无论今后想进一步学习何种语言, 几乎有关 C 语言的所有知识都适用 C 程序设计的基本结构 下面介绍几个简单的 C 语言程序, 从这些例子中了解 C 语言源程序的基本结构和书写格式 例 1.1 在屏幕上显示 Hello C World! 字符串 程序如下 : printf("hello C World!\n"); /* 输出结果 */

21 12 程序设计基础 C 语言 运行结果为 程序中的 main 被称作 主函数, 在任何一个 C 语言程序中都必须有一个且只有一个 main 函数, 该函数中可以有很多语句, 这些语句要用一对大括号 括起来 本例中, 主函数只有一条输出语句, printf 是 C 语言中的输出函数, 作用是向屏幕上输出信息, 它将双引号之间的内容输出到屏幕, 其中 \n 是换行符, 作用是在输出 Hello C World! 后回车, 使光标换行 而分号 ; 表示该语句结束 程序中的 是编译预处理命令, 因为调用的 printf 函数是 C 语言提供的标准输出函数, 需要由系统文件 stdio.h 解释执行 程序中 /* 和 */ 之间的文本是注释文字 C 语言编译程序不对注释的内容进行语法检查, 有无注释不影响程序的功能和正确性 程序中插入适当的注释, 可以使程序易于理解 void 表示 main 函数没有返回值 例 1.2 计算并输出两数之和 程序如下 : /* 主函数 */ int x,y,sum; /* 定义变量 */ x=1999;y=1; /* 给变量赋值 */ sum=x+y; /* 求和 */ printf("the sum is %d\n",sum); 运行结果为 第 4 行, 定义变量 x y 和 sum, 将它们定义为整型 (int) 变量 第 5 行, 是赋值语句, 对变量 x 和 y 分别赋值为 1999 和 1 第 6 行, 将 x+y 的值送入变量 sum 中 第 7 行, 利用 printf 函数将结果输出到屏幕, 输入语句中的 %d 为输入输出的 格式字符串, 用来指明数据类型和格式, %d 表示 十进制整数类型, 在执行输出时, %d 的位置上将用一个十进制的整型数值代替, 本例中用 sum 的值 2000 来代替 %d 这个位置上的内容 例 1.3 输入两个整数, 屏幕显示较大的数 程序如下 : int max(int a,int b) /* 函数功能 : 计算两个数中的较大数入口参数 : 整型数 a 和 b 函数返回值 : 整型数 a 和 b 的较大数 */ 科学出版社职教技术出版中心

22 第 1 章程序设计概述 13 int c; /* 在此定义 max 函数中要用到的变量 c */ if(a>b) /* 假如 a>b 是真的 */ c=a; /* 如果 a>b 是真的, 将 a 的值赋给 c */ else /* 如果 a>b 是假的 */ c=b; return c; /* 把结果返回主调函数 */ /* 主函数 */ int x,y,z; /* 变量说明 */ int max(int a,int b); /* 函数声明 */ printf(" 请输入两个数 x,y:"); scanf("%d,%d",&x,&y); /* 输入变量 x 和 y 值 */ z=max(x,y); /* 调用 max 函数, 将得到的值赋给 z */ printf(" 较大数为 %d\n",z);/* 输出 z 的值 */ 运行结果为 本程序由两个函数组成 : 主函数和 max 函数 函数之间是并列关系, 可从主函数中调用其他函数 max 函数的功能是比较两个数, 然后把较大的数返回给主函数 max 函数是一个用户自定义函数 关于函数的详细内容将在以后的章节介绍 例 1.3 程序的执行过程如下所示 1) 首先由用户输入两个数 2) 由 scanf 函数语句接收这两个数并送入变量 x y 中,scanf 函数与 printf 函数一样, 也是 C 语言提供的标准输入输出函数, 语句中 &x 和 &y 的 & 符号表示 取地址, 用户输入的 35 和 90, 将分别存储到 x 和 y 所对应的存储单元中 3) 调用 max 函数, 并把 x y 的值传送给 max 函数的形式参数 ( 以下简称形参 )a, b 在 max 函数中比较 a b 的大小, 把大者 ( 用变量 c 表示 ) 作为函数返回值 4) 将函数返回值赋值给主函数 main 中的变量 z, 最后在屏幕上输出 z 的值 从以上三个例子, 大致归纳出 C 语言程序的基本结构和特点有以下 5 点 (1)C 语言程序是由多个函数构成的 1) 函数是 C 语言程序的基本单位, 即 C 语言程序是由函数构成的 任何一个 C 语言程序必须有且只有一个用 main 作为名字的函数, 这个函数称为 主函数 C 语言程序总是从 main 函数开始执行并且以 main 函数作为结束, 与其在程序中的位置无关 2) 一个 C 语言程序可以包含 0 到 n 个用户自定义函数, 如例 1.3 中, 有一个用户自定义函数 max,main 函数调用 max 函数求出两个数中的最大数 3) 在函数中可以调用系统提供的库函数, 在调用之前只要将相应的头文件包含到本文件中即可 例如, 以上三个例子都需要实现屏幕输出, 调用系统输入 / 输出函数 printf, 需要用编译预处理命令, 具体细节在后续章节中详细介绍 这里的

23 14 程序设计基础 C 语言 # 为预处理命令的开始标志 (2)C 程序的书写格式与规则 1)C 语句都以分号作为结束标志 2)C 程序书写格式自由, 一行内可以包含若干条语句, 也可以将一条语句写成多 行 为了提高程序的可读性和可测试性, 建议一行只写一条语句 3) 括起来的部分, 通常表示程序的某一层次结构 一般与该结构语句 的第一个字母对齐, 可单独占一行 4) 变量名和函数名必须是合法的标识符, 标识符就是一个名字,C 语言规定标识 符只能由字母 数字和下划线三种字符组成, 并且第一个字符必须是字母或下划线 标识符习惯用小写字母,C 语言是字母大小写敏感的语言 关键字是一些特别的标识符, 它们的用途已经事先定义好了, 程序员不能再将它们另作他用, 不能用关键字来命名变量和函数 (3) 库函数 printf 和 scanf C 语言没有专门的输入 / 输出语句, 输入 / 输出的操作是通过 scanf 和 printf 等库函数实现的, \n 表示换行 (4) 函数由函数首部和函数体两部分组成 1) 函数首部包括对函数返回值类型 函数名 形参的说明, 函数名后的一对圆括号中放入形参, 即使没有形参, 圆括号也不能省略 2) 函数体由函数首部下面最外层的一对大括号中的内容组成, 包括变量声明语句和执行语句 (5)C 语言程序中的注释注释用来对程序进行说明, 可以提高程序的可读性 使用 /* 和 */ 括起来进行注释, 在 /* 和 */ 之间的所有字符都为注释内容, 且注释内容可以跨行 注意斜线 / 和星号 * 之间不能有空格, /* 和 */ 之间不能再嵌套书写 /* 和 */ C 语言程序的运行 科学出版社职教技术出版中心 C 语言的编译程序属于编译系统, 完成一个 C 语言程序的运行, 必须经过编辑 编译 连接和运行四个步骤 1) 源程序就是符合 C 语言语法的程序文本文件, 扩展名为.c 2).c 文件编辑完成后需要编译, 编译生成目标程序 目标程序文件的主文件名与源程序的主文件名相同, 扩展名为.obj 源程序的语法和语义都正确, 才能生成目标程序 3) 目标文件不能运行, 需要将目标程序和库函数连接为一个整体, 从而生成可执行文件 可执行文件的主文件名与源程序的主文件名相同, 扩展名为.exe 4) 最后运行可执行文件, 将可执行文件装入内存执行 源程序编辑运行过程如图 1.6 所示

24 第 1 章程序设计概述 15 图 1.6 源程序编辑运行过程 1.5 C 程序集成开发环境 Visual C C++ 语言是在 C 语言的基础上发展而来的, 增加了面向对象的编程, 成为当今最流行的一种程序设计语言 Visual C++( 简称 VC++) 是微软公司开发的面向 Windows 平台的 C++ 语言工具 它不仅支持 C++ 语言的编程, 也兼容 C 语言的编程 由于 VC++ 被广泛地用于各种编程, 使用面很广, 是目前 C 语言和 C++ 语言最常用的开发平台, 也是目前全国计算机等级考试 C 语言 C++ 语言的运行平台 下面简要介绍在 Windows 操作系统中 VC++ 平台下编辑 调试 运行 C 语言程序的方法 启动 VC++ VC++ 是一个庞大的语言集成工具, 经安装后将占用几百兆磁盘空间 在 开始 菜单中选择 程序 Microsoft Visual C Microsoft Visual C 命令可启动 VC++, 屏幕上将显示如图 1.7 所示的界面 ; 也可以双击桌面上的 Microsoft Visual C 图标 ; 或者双击 C 语言源程序文件, 同样可以启动 VC++ 编辑窗口 信息窗口 图 1.7 VC++ 窗口 新建 / 打开 C 语言程序文件选择菜单栏中的 文件 新建 命令, 弹出 新建 对话框, 如图 1.8 所示, 在 文件 选项卡中选择 C++ Source File, 在对话框右侧 目录 处选择文件的存放路径 ; 文件 处输入程序的文件名, 如这里填入 hel.c, 单击 确定 按钮

25 16 程序设计基础 C 语言 图 1.8 新建文件 如果程序之前已经存在, 可在图 1.7 所示界面中选择菜单栏中的 文件 / 打开 命令, 并在 查找范围 中找到正确的文件夹, 调入指定的.c C 语言程序文件 保存程序 在打开的 VC++ 界面上, 可直接在编辑窗口输入程序, 由于完全是 Windows 界面, 输入及修改可借助鼠标和菜单进行, 十分方便 当程序输入结束后, 保存文件时, 可以直接选择菜单栏中的 文件 / 保存 命令, 弹出 保存为 对话框, 也可以选择菜单栏中的 文件 另存为 命令 保存文件时, 应指定扩展名.c, 如图 1.9 所示, 否则系统将按 C++ 扩展名.cpp 保存, 编译时有可能显示出错信息 执行程序 图 1.9 指定保存文件名 科学出版社职教技术出版中心 对于输入好的源程序, 必须经过编译 连接, 生成可执行文件后才能执行 使用 VC++ 菜单栏中的 编译 构件 命令, 如图 1.10 所示, 或者按 F7 键, 均可完成编译 连接

26 第 1 章程序设计概述 17 图 1.10 编译连接菜单在编译 连接过程中,VC++ 首先将生成一个同名的工作区, 若前面没有保存文件, 这里将提示保存此新输入的程序 如果程序没有错误, 将在图 1.11 所示信息窗口中显示内容 : 0 error(s),0 warning(s) 图 1.11 编译连接正确它表示没有任何错误 有时可能会出现几个警告性信息 (warning), 一般不影响程序执行 假如有出错信息 (error), 如图 1.12 所示, 双击某行出错信息, 程序窗口中会指示对应出错位置, 根据信息窗口的提示分别予以纠正, 然后选择菜单栏中的 编译 执行 命令, 或按 Ctrl+F5 组合键编译执行程序 当运行 C 语言程序后,VC++ 将自动弹出数据输入输出窗口, 如图 1.13 所示 按任意键关闭该窗口 对于编译连接执行操作,VC++ 还提供了一组工具按钮, 如图 1.14 所示

27 18 程序设计基础 C 语言 图 1.12 编译连接错误 图 1.13 数据输入输出窗口 图 1.14 编译连接执行工具按钮组 关闭程序工作区 当一个程序编译连接后,VC++ 系统自动产生相应的工作区, 以完成程序的运行和 调试 若要执行第二个程序, 必须关闭前一个程序的工作区, 然后通过新的编译连接, 产生第二个程序的工作区 否则, 运行的将一直是前一个程序 选择菜单栏中的 文件 关闭工作区 命令可以关闭程序工作区, 如图 1.15 所示, 然后在如图 1.16 所示的对话框中选择 是 将同时关闭源程序窗口 图 1.15 关闭程序工作区 习题 1 图 1.16 对话框 1. 什么是一般意义上的程序? 什么是计算机程序? 2. 算法设计 : 计算一个圆的面积和周长 ( 假设已知圆的半径 ) 3. 算法设计 : 查找 200 以内既是 3 的倍数又是 5 的倍数的数 科学出版社职教技术出版中心

28 第 1 章程序设计概述 请参照本章例题编写一个 C 语言程序, 输出以下信息 : ************************************** HELLO WORLD! ************************************** 5. 下面的程序用来计算已知底和高的情况下三角形的面积, 请找找看有几处错误 ; int bottom,high, area ;/*bottom 表示底,high 表示高,area 表示面积 */ bottom=4; High=6; area=botton*high/2 printf( The area is %d\n, area); 6. 模仿例 1.3, 找出 3 个数中的最小数 7. 上机运行本章例题, 熟悉 VC++6.0 环境以及程序运行的方法与步骤

29 第 2 章数据类型 运算符与表达式 想要学好 C 语言并使用 C 语言编写程序, 首先必须十分了解和熟练掌握 C 语言中的数据类型描述以及运算符和表达式, 这是学习 C 语言的重要基础 2.1 C 语言的数据类型 数据类型是一类数据的抽象表示, 这类数据具有相同的表现形式, 遵从相同的运算规则, 将规则和形式上的共同特征抽取出来就形成了数据类型的概念 数据类型确定了数据的性质和取值范围, 还确定了数据所能参加的运算以及数据在内存中的存储方式 数据类型决定了编译系统为该类型数据分配存储单元的字节数 C 语言提供了丰富的数据类型, 如图 2.1 所示 科学出版社职教技术出版中心 图 2.1 数据类型 C 语言程序中所使用的任何数据都属于上述某一种类型, 这几种类型数据的长度和表示范围因处理器的类型和 C 语言编译程序的实现而异 在计算机中, 内存的最小存储单位称为 位 (bit), 用于存放二进制数 0 或 1 由 8 个二进制位组成一个 字节 (byte),

30 第 2 章数据类型 运算符与表达式 21 系统为每个字节分配一个地址 若干个字节组成一个 字 (word), 用一个 字 存储一条机器指令或一个数据, 一个 字 含多少个字节随计算机不同而不同, 如果系统以两个字节 (16 位 ) 数存放一条机器指令, 则称该计算机为 16 位机 如果系统以四个字节 (32 位 ) 数存放一条机器指令, 则称该计算机为 32 位机 对于 16 位机, 整型数据在内存中占 2 个字节, 如 TC 环境下其表示范围为 ~32767; 对于 32 位机, 整型在内存中占 4 个字节, 如 VC++6.0 环境下, 其表示范围为 ~ 本书中所有程序的运行环境为 VC++6.0, 因此整型数据的取值范围以后者为标准, 以后不再一一说明 利用以上数据类型还可以构成表 树 栈等复杂的数据结构 这些复杂类型将在以后的章节中讨论 本章主要介绍基本数据类型 C 语言基本数据类型如表 2.1 所示 表 2.1 C 语言基本数据类型 (32 位计算机 ) 类型 ( 关键字 ) 长度 ( 字节 ) 表示范围 [signed] char 1-128~127 即 -2 7 ~2 7-1 unsigned char 1 0~255 即 0~2 8-1 [signed] int ~ 即 ~ unsigned [int] 4 0~ 即 0~ [signed] short [int] ~32767 即 ~ unsigned short [int] 2 0~65535 即 0~ long [int] ~ 即 ~ unsigned long [int] 4 0~ 即 0~ float ~ double ~ long double ~ 注 : 表中方括号内的部分在书写时可以省略 2.2 常量与变量 关键字 关键字又称为保留字, 是 C 语言编译系统预先设定的标识符, 它们代表固定的意义, 用户不能将其用作变量名 函数名等 C 语言提供的关键字共 32 个 : auto double int struct break else long switch case enum register typedef char extern return union const float short unsigned continue for signed void

31 22 程序设计基础 C 语言 default goto sizeof volatile do if while static 在 C 语言中, 所有关键字都是小写的 标识符 在 C 语言中, 标识符是对变量 函数 标号和其他各种用户定义对象的命名, 分为系统预定义标识符和用户自定义标识符 系统预定义标识符是由系统预先定义好的, 这些标识符在 C 语言中有特定的含义, 如主函数名标识符 main C 语言提供的库函数的名字 ( 如 printf) 和预编译处理命令 ( 如 define) 等 C 语言允许用户把这类标识符另作他用, 但将失去系统规定的原意, 故用户一般不要把这些预定义标识符另作他用 用户自定义标识符是由用户根据需要自己定义的标识符 命名时应注意以下 5 点 1) 标识符的第一个字符必须是字母或下画线, 随后的字符必须是字母 (a~z,a~ Z) 数字或下画线 例如, count,test23,high_balance,_total,class,_1_2_3 等是正确的命名形式 ; 2count,hi! There,a.b.c,a>b,sum*n 等是错误的命名形式 2) 大写字母和小写字母代表不同的标识符, 因此 count Count COUNT 代表三个不同的标识符 3) 标识符不能是 C 语言关键字, 否则编译时系统会报错, 与预定义标识符冲突, 编译时不报错, 但会失去原有含义, 在程序运行时可能会引发错误 4) 为变量命名时, 要注意做到见名知意 用户选择变量名的时候宜采用简洁有含义的英文单词 ( 或缩写 ) 作为标识符, 如 stu_name total day count 等, 以增加程序的可读性 重要的标识符尽量不要用代数符号 ( 如 x y z 等 ) 本书为简单起见, 有些例题中仍采用了单字符的变量名 5) 标识符的长度可以是一个或多个字符 各个 C 语言编译系统都有自己的规定,C 语言标准建议至少能识别 31 个字符,IBM-PC 的 MS C 语言只识别 8 个字符, 即超过 8 个字符时, 只有前 8 个字符有效,Turbo C 语言允许使用 32 个字符, 在写程序时应了解所用系统对标识符长度的规定, 以免出现混淆 建议变量名的长度最好不要超过允许范围 常量与符号常量 科学出版社职教技术出版中心 在程序运行过程中, 其值不能被改变的量称为常量, 常量可为任意基本数据类型, 从其字面形式即可判别的常量称为字面常量或直接常量, 如表 2.2 所示

32 第 2 章数据类型 运算符与表达式 23 表 2.2 常量的类型和举例 数据类型 char int long int short int unsigned int float 常量举例 'a' '9' '#' '\n' '\0' '\\' xf2a 35000L L L 0xffff000L xa x e e-3 double e20 标识符可以代表一个常量, 代表常量的标识符称为符号常量 符号常量一般使用大写英文字母表示, 以区别于一般用小写字母表示的变量 符号常量在使用前必须先定义, 定义的格式为 例如 : #define < 符号常量名 > < 常量 > #define PI #define STAR '*' 这里定义 PI STAR 为符号常量, 它们代表的常量值分别为 和 * 例 2.1 符号常量的使用 程序如下 : #define PRICE 30 int num,total; num=10; total=num*price; printf("total=%d\n",total); 运行结果为 程序中用 #define 命令定义 PRICE 代表常量 30, 此后凡是本程序中出现的 PRICE 都代表 30, 可以和常量一样进行运算 值得注意的是, 符号常量和变量的意义是不同的, 它的值在其作用域内不能改变, 也不能再被赋值 例如, 以下语句就是错误的 : PRICE=40; 定义符号常量的目的是为了提高程序的可读性, 便于程序的调试和修改 因此在定义符号常量名时, 应使其尽可能表达所代表的常量的含义, 如前面所定义的符号常量名 PI, 表示圆周率 此外, 若要对一个程序中多次使用的符号常量的值进行

33 24 程序设计基础 C 语言 修改, 只需对预处理命令中定义的常量值进行修改即可 变量变量是指在程序的运行过程中其值可以发生改变的量 变量代表内存中具有特定属性的一个存储单元, 它用来存放变量的值, 一个变量应该有一个名字, 以便被引用 注 变量名 a 12 变量值存储单元 意区分变量名和变量值这两个不同的概念, 如图 2.2 所示 在对程序编译连接时由编译系统给每一个变量分配对应的内存地址 从变量中取值, 实际上是通过变量名找到相应的内存地址, 从该存储单元中读取数据 定义变量的一般形式 : 图 2.2 变量的存储 类型标识符变量名表 ; 这里的类型标识符必须是有效的 C 语言数据类型, 变量名表可以由一个或多个由逗 号分隔的标识符构成, 下面给出一些定义的范例 int i,j,k; unsigned int unum; float score1, score2; double val_1, val_2; char ch1; 在 C 语言中, 要求对所用到的变量作强制性定义, 也就是 先定义, 后使用, 这样做的目的有以下几点 1) 没有事先定义的, 系统不把它认作变量名, 这就能保证程序中变量名使用正确 例如, 在程序定义部分有语句 : int stu1; /* 定义整型变量 stu1*/ 在执行语句中错写成了 stu, 在编译时系统将会检查出 stu 未经定义, 不作为变量名, 并给出 stu 未经定义 的出错提示 2) 每一个变量被指定为一个确定类型, 编译时系统会为其分配相应的存储单元 如指定 a b 为整型变量, 系统就会为 a 和 b 各分配 4 个字节, 并按整数方式存储数据 3) 指定每一变量属于一个类型, 便于在编译时检查该变量所进行的运算是否合法 例如, 表达式 a%b, 如果 a b 都是整型变量则合法 ; 如果都是实型变量, 则在编译时会给出出错信息 2.3 整型数据 科学出版社职教技术出版中心 整型常量 整型常量, 即整常数, 可以是十进制 八进制 十六进制数字表示的整数值 1) 十进制整型常量 如

34 第 2 章数据类型 运算符与表达式 25 2) 八进制整型常量 以 0 开头的数是八进制数, 如 0123 代表八进制数 123, 即 ( 123), 换算成十进制数的方法为 8 ( ) = = 83 同样,-076 代表八进制数 -76, 即十进制数 -62 3) 十六进制整型常量 以 0x 开头的数是十六进制数, 引导符 0 不能省略,x 可用小写或大写, 如 0xf 0x10 0Xde 等, 分别表示十进制数 等, 其中,a b c d e f 分别表示十进制数 等, 具体换算如下 : ( 123) = = Xde 16 = = = 222 ( ) 例如,0x357, 代表十六进制数 357, 即十进制数 855,-0x4fl 等于十进制数 整型常量在不加特别说明时总是正值 在一个整型常量后面加一个字母 l 或 L, 则认为是长整型 例如 L( 十进制为 ) L( 十进制为 65536) -0XA5L ( 十进制为 -165) 无符号的整型常量的后缀为 u 或 U 例如,0XA5Lu 表示十六进制无符号长整型数据 A5, 其十进制形式为 整型变量 1. 整型数据在内存中的存放形式 数据在内存中是以二进制形式存放的 int i,j,k; /* 定义 i,j,k 为整型变量 */ i=10; /* 给 i 赋值为十进制整数 10 */ j=011; /* 给 j 赋值为八进制整数 11 */ k=0x12; /* 给 k 赋值为十六进制数 12 */ 十进制数 10 的二进制形式为 1010, 在 VC 中, 每一个整型变量在内存中占 4 个字节 (32 位 ), 图 2.3(a) 是整型数据的存放情况 图 2.3(b) 是整型数据在内存中实际的存放情况 图 2.3 整型数据的存放一个字节的 8 个二进制位中, 最右边的一位称为最低位, 最左边的称为最高位 C 语言中, 一个 int 由 4 个字节组成, 其中最高位存放符号, 正整数的最高位为 0, 负整数的最高位为 1, 故从最高位可以判断该整数的正负 数值在计算机内以补码 (complement) 的形式存放 正数的补码和其原码相同, 负

35 26 程序设计基础 C 语言 数的补码有一定计算规则 1) 写出该负整数对应正整数的二进制码 2) 将该二进制码各位取反, 即将 1 变 0, 0 变 1, 得到该数的反码 3) 将反码加 1, 得到该数的补码 从补码的最高位, 可以看出数据的正负性 类似地, 将一个负数的补码减 1 后取反可以得到该数的原码 以 -10 为例, 计算机存放为补码形式, 其补码求解过程如图 2.4 所示 图 2.4 求 -10 的补码过程 2. 整型数据的溢出 一个整型变量的最大允许值为 , 如果再加 1, 会出现什么情况? 例 2.2 整型数据的溢出 程序如下 : int a,b; a= ; b=a+1; printf("%d,%d\n",a,b); 运行结果为 科学出版社职教技术出版中心 为什么会得到这样的结果呢? 是因为变量 b 发生了 溢出 从图 2.5 可以看到变 量 a 的最高位为 0, 其余各位为 1, 表示正整数 加 1 以后, 最高位变为 1, 其余各位为 0, 正好是 的补码形式, 所以输出的变量 b 的值为 图 2.5 数据的溢出

36 第 2 章数据类型 运算符与表达式 27 发生溢出现象的原因是系统给 int 型变量仅分配 4 个内存字节, 它只能容纳 ~ , 即 ~ 范围以内的数据, 超出该范围就会发生 溢出 溢出 就好像挂钟表面的数字一样, 超过 12 点后指针又回到了 1 点 同理, 如果 int 型数据 a= , 则 a-1 也得不到 , 而是得到 , 这显然与编程者的原意不同 值得注意的是, 发生溢出后, 编译系统并不会报错, 这就要靠编程者的细心和经验来保证结果的正确 将变量 a 和 b 改成 long 型, 并按 %ld 格式输出, 就可以得到预期的结果 2.4 实型数据 实型常量 实型常量就是实数, 又称浮点数, 有以下两种表示形式 1) 十进制小数形式 它由数码 0~9 以及小数点组成 如 等均为合法的实型常量 注意, 十进制小数形式必须含有小数点 2) 指数形式 由十进制数 阶码 ( 指数 ) 标志 e 或 E 以及阶码组成 例如, 2.1E5 表示 ,0.5E7 表示 ,-2.8E-2 表示 实型常量的整数部分为 0 时可以省略, 如下列形式是允许的 : -.57( 相当于 -0.57) -.175E3( 相当于 e3).0075e2( 相当于 e2) 字母 E 或 e 之前必须有数字, 且 E 或 e 后面指数必须为整数, 如 e3 2.1e3.5.e3 等都是不合法的实型常量 一个实型常量有多种指数表示形式, 如 可以表示为 e e e e e4 等 通常把 e2 称为 规范化的指数形式, 即在字母 e( 或 E) 之前的数据部分中, 小数点左边有且仅有一位非零的数字 如 5.33e e e-2 都属于规范化指数形式, 而 e e e-3 则不属于规范化指数形式 一个实型常量在输出时, 是按规范化指数形式输出的 例如, 指定将实型常量 按指数形式输出, 输出结果是 e+003 实型常量分为单精度 (float) 双精度 (double) 和长双精度 (long double) 三类 一般情况下, 实型常量都是作为双精度类型来处理的 例如, 已经定义了 float 型变量 x: x= * , 系统将 和 当作双精度数来计算, 得到一个双精度的乘积, 然后取 6~7 位有效数字赋给变量 x 这样做的目的是使计算结果更加精确, 但是是以降低运算速度为代价的 如果在实型常量后面加后缀 f 或 F( 如 1.234f,-32.85f), 则编译系统就会按单精度来处理了 实型变量 1. 实型数据在内存中的存放形式 实型数据在内存中是按指数形式存储的 系统把实型数据分为小数部分和整数部分分别存放, 图 2.6 表示实型数据 的存放方式

37 28 程序设计基础 C 语言 图 2.6 实型数据的存放 单精度实型数据所占的 4 字节 (32 位 ) 中, 究竟多少位来表示小数部分, 多少位来 表示指数部分, 并没有具体的规定 不少 C 语言编译系统以 24 位表示小数部分 ( 包括 符号位 ), 以 8 位表示指数部分 ( 包括指数的符号 ) 小数部分占的位数 (bit) 越多, 数 的有效数字越多, 精度越高 指数部分占的位数越多, 则能表示的数值范围越大 2. 实型数据的舍入误差 由于实型变量是由有限的存储单元组成, 因此能提供的有效数字总是有限的, 在有 效位以外的数字将被舍去, 由此可能会产生一些误差 例如 : float a; a= ; 由于单精度实型变量只能接收 7 位有效数字, 因此最后两位小数不起作用 如果将 a 改为双精度型, 因为双精度型变量能接收 15 位有效数字, 故可以全部接收上述 9 位数字并存储在变量 a 中 除此之外, 将一个很大的数和一个很小的数相加或相减时, 很容易 丢失 较小的数发生误差 例 2.3 单精度实型数据的舍入误差 程序如下 : float a,b; a= e5; b=a+50; 科学出版社 printf("%f,%f\n",a,b); 运行结果为程序内 printf 函数中的 %f 是输出单精度实数时的格式符 a+50 理论值应该是 , 可以看出程序输出变量 a 和 b 的值都是不正确的 这是因为单精度实型变量只能保证前 7 位有效数字, 后面的数字是无意义的, 并不能准确地表示该数 因此, 在编写程序的过程中, 应当避免将一个很大的数和一个很小的数一起运算 当需要保证较高精度的运算时, 可采用双精度或长双精度型变量 职教技术出版中心

38 第 2 章数据类型 运算符与表达式 字符型数据 字符常量 字符常量是指用一对单引号括起来的一个字符, 如 'a' 'A' '9' '!' '#' 等 字符常量中的单引号只起界定作用, 并不表示字符本身 单引号中的字符不能是单引号 (') 和反斜杠 (\), 它们特有的表示法将在转义字符中介绍 在 C 语言中, 字符是按其所对应的 ASCII 码值来存储的, 一个字符占一个字节 例如 : 字符 A B a b 0! ASCII 码值 ( 十进制 ) 注意字符 '0' 和数字 0 的区别, 前者是字符常量, 后者是整型常量, 它们的含义和在计算机中的存储长度是不同的 由于 C 语言中字符型数据的存储与整数存储方式类似, 所以字符常量可以像整数一样在程序中参与相关的运算 例如 : 'a'-32 /* 执行结果 97-32=65 */ 'A'+32 /* 执行结果 65+32=97 */ '9'-9 /* 执行结果 57-9=48 */ 转义字符 转义字符是 C 语言中表示字符的一种特殊形式 通常使用转义字符表示 ASCII 码字符集中不可打印的控制字符和特定功能的字符, 如用于表示字符常量的单引号 ('), 用于表示字符串常量的双引号 (") 和反斜杠 (\) 等 转义字符用反斜杠后面跟一个字符或一个八进制或十六进制数表示 表 2.3 给出了 C 语言中常用的转义字符 广义地讲,C 语言字符集中的任何一个字符均可用转义字符来表示 表中的 \ddd 和 \xhh 正是为此而提出的 ddd 和 hh 分别为八进制和十六进制的 ASCII 代码 如 '\101' 表示 ASCII 码为 101( 八进制 ) 的字符 'A','\102' 表示 ASCII 码为 102( 八进制 ) 的字符 'B','\0' 表示 ASCII 码为 0 的字符, 即 空操作 符,'\134' 表示反斜线,'\x0A' 表示换行等 表 2.3 转义字符及其含义 转义字符 转义字符的含义 ASCII 码 ( 十进制 ) \0 空字符 (NULL) 0 \a 鸣铃 7 \b 退格 8 \t 横向跳到下一制表位置 9 \n 回车换行 10 \f 走纸换页 12

39 30 程序设计基础 C 语言 续表 转义字符 转义字符的含义 ASCII 码 ( 十进制 ) \r 回车不换行 13 \" 双引号符 34 \' 单引号符 39 \\ 反斜线符 \ 92 \ddd \xhh 1~3 位八进制数所代表的字符 1~2 位十六进制数所代表的字符 例 2.4 转义字符的使用 程序如下 : printf(" ab c\t de\rf\tg\n"); printf("h\ti\b\bj k"); 程序中没有定义任何变量, 直接用两个 printf 语句将双引号中的内容输出 双引号中含有转义字符, 下面分析一下输出的结果 第 1 个 printf 函数在第 1 行先输出 ab c, 然后遇到转义字符 \t, 它的作用是跳格, 即跳到下一个 制表位置, 一个制表区占 8 列, 下一个制表位置从第 9 列开始, 故在第 9~11 列上输出 de, 然后遇到 \r, 它代表 不换行, 光标回到本行开头 ( 第 1 列 ), 输出字符 f, 遇到 \t 再一次使光标移到第 9 列, 输出 g, 最后输出 \n, 表示换行, 光标移到下一行的起始位置 第 2 个 printf 函数在第 2 行开头输出字符 h, 接下来的 \t 使光标移至第 9 列, 输出字符 i ( 此时光标已经在第 10 列, 准备输出下一个字符 ) 接着遇到两个 \b, \b 表示退一格, \b\b 表示连退两格, 光标回退到第 8 列, 在第 8~10 列输出 j k 程序在打印机上得到以下结果 : fab c gde h jik 在屏幕上的运行结果与上述打印结果不同 : f gde h j k 科学出版社职教技术出版中心 由于 \r 使当前位置回到本行开头, 自此再输出的字符 ( 包括空格和跳格所经过的位置 ) 将取代原来屏幕上该位置上显示的字符 所以原有的 ab c 被新的字符 f g 代替, 其后的未被新字符取代 换行后, 先输出 h i, 退两格后, 光标在 i 的左边一列, 然后输出 j k, j 后面的 取代了原来的 i, 因此屏幕上看不到 i 屏幕输出结果之所以和打印结果不一致是由于屏幕显示的是最后的结果, 先前输出

40 第 2 章数据类型 运算符与表达式 31 的字符被后输出的字符 掩盖 了, 而打印机却不能像屏幕一样 掩盖 先前的字符, 所以打印机反映的是输出的过程以及结果 字符串常量 字符串常量是由一对双引号 (" ") 括起来的由 0 个或多个字符组成的字符序列, 任何字母 数字 符号和转义字符都可以组成字符串 例如,"This is a string" 空串 " " 空格串 " " "ab\n\t\b" C 语言规定字符串的存储方式为 : 串中的每个字符 ( 转义字符只能被看成是一个字符 ) 按照它们的 ASCII 码值的二进制形式存储在内存中, 并在串的末尾加一个 串结束标志, 即 ASCII 码为 0 的字符 '\0' 因此, 长度为 n 个字符的字符串常量, 在内存中占有 n+1 个字节的存储空间 例如, 字符串 "China" 有 5 个字符, 作为字符串常量 "China" 存储于内存中时, 共占 6 个字节, 系统自动在后面加上字符 '\0', 其存储形式如下 : C h i n a \0 要特别注意字符常量与字符串常量的区别, 除了表示形式不同外, 其存储性质也不相同, 字符 'A' 只占 1 个字节, 而字符串常量 "A" 占 2 个字节 C 语言中没有设置专门的变量来存储字符串, 字符串如果要存放到变量中, 只能通过字符数组来实现, 这个问题将在后面介绍 字符变量 字符变量用来存放字符型数据, 注意一个字符变量只能存放一个字符, 而不是字符串 字符变量的定义形式如下 : char c1,c2; 其中,c1 和 c2 为字符变量名, 各放一个字符, 因此可以用下面语句对 c1 c2 赋值 : c1='a';c2='b'; 而语句 c1="a" 是错误的 系统在表示一个字符型数据时, 并不是将字符本身存入内存, 而是将字符的 ASCII 码存入内存 在内存中所有的数据都是以二进制形式存放的 因此, 上面例子中的 c1 和 c2 的实际存放形式如图 2.7 所示 图 2.7 字符的实际存放形式

41 32 程序设计基础 C 语言 字符型数据和整型数据之间是可以通用的, 一个字符型数据既能以字符形式输出, 也能以整数形式输出 例 2.5 向字符变量赋整数, 然后输出 程序如下 : char c1,c2; c1=97; c2=98; printf("%c,%c\n",c1,c2); printf("%d,%d\n",c1,c2); c1 c2 被指定为字符变量 但在第 4 行和第 5 行中, 将整数 97 和 98 分别赋给 c1 和 c2, 它的作用相当于以下两个赋值语句 : c1='a';c2='b'; 因为 'a' 和 'b' 的 ASCII 码为 97 和 98 程序第 6 行以字符的格式 %c 输出两个字符 程序第 7 行是以整数格式输出 c1 和 c2 运行结果为 字符型数据和整型数据虽然可以通用, 但是要注意, 整型数据占 4 字节, 而字符型数据只占 1 字节, 它只能存放 0~255 内的整数 例 2.6 大小写字母的转换 程序如下 : char c1,c2; c1='a'; c2='b'; c1=c1-32; c2=c2-32; printf("%c,%c",c1,c2); 运行结果为 科学出版社职教技术出版中心 本程序的作用是将两个小写字母转换为大写字母 因为 'a' 的 ASCII 码为 97, 而 'A' 为 65,'b' 为 98,'B' 为 66 从 ASCII 代码表中可以看到每一个小写字母比其对应大写字母的 ASCII 码值大 32, 即 'a'='a'+32

42 第 2 章数据类型 运算符与表达式 变量赋初值 C 语言允许在定义变量的同时对变量赋初值 例如 : int x=3; /* 指定 x 为整型变量, 初值为 3 */ float y=4.5; /* 指定 y 为实型变量, 初值为 4.5 */ char z='a'; /* 指定 z 为字符型变量, 初值为 'a'*/ 也可以只对一部分变量赋初值, 如 : int x,y,z=3; 表示定义 x y z 为整型变量,z 的初始值为 3, 变量 x y 没有被赋初值 那么变量 x y 的初值是多少呢? 注意, 如果定义了变量, 但是没有对它赋初值, 那么它的初值是一个不确定的数值 例 2.7 未被赋初值的变量的值 程序如下 : int x,y; printf("%d,%d",x,y); 运行结果为 该例中的 x y 被定义为整型变量, 但是没有赋初值, 这时 x y 的值就是不确定的 程序执行结果也是不能预料的 如果要同时对多个变量赋初值, 可写成 : int x=3,y=3,z=3; 注意不能写成 : int x=y=z=3; 对变量赋初值的过程是在程序运行过程中完成的, 而不是在对程序进行编译时完成的, 相当于有一个赋值语句 例如 : int x,y,z=3; 等价于语句 : int x,y,z; z=3;

43 34 程序设计基础 C 语言 2.7 算术运算符和算术表达式 C 语言运算符简介 C 语言的运算符可分为以下几类 1) 算术运算符 : 加 (+), 减 (-), 乘 (*), 除 (/), 求余 ( 或称模运算 %), 自增 (++), 自减 (--) 2) 关系运算符 : 大于 (>), 小于 (<), 等于 (==), 大于等于 (>=), 小于等于 (<=), 不等于 (!=) 3) 逻辑运算符 : 与 (&&), 或 ( ), 非 (!) 4) 位操作运算符 : 按位与 (&), 按位或 ( ), 按位非 (~), 按位异或 (^), 左移 (<<), 右移 (>>) 5) 赋值运算符 : 简单赋值 (=), 复合算术赋值 (+=,-=,*=,/=,%=), 复合位 运算赋值 (&=, =,^=,>>=,<<=) 6) 条件运算符 (? :) 7) 逗号运算符 (,) 8) 指针运算符 : 取内容 (*), 取地址 (&) 9) 求字节数运算符 (sizeof) 10) 特殊运算符 : 括号 (()), 下标 ([]), 成员运算符 (->,.) 11) 其他 : 函数调用运算符 算术运算符和算术表达式 1. 基本的算术运算符 在 C 语言中, + - * / 以及 % 五种运算符称为基本算术运算符, 它 们的用法与大多数计算机语言相同, 几乎可用于 C 语言内定义的所有数据类型 当 / 被用于整数或字符时, 结果也为整数 例如, 在整数除法中,10/3=3 一元减法 ( 负号 ) 的实际效果等于用 -1 乘单个操作数, 即任何数值前放置减号将改变其符号 取模运算符 % 的操作数只能为整数, 作用是取整数除法的余数, 如 10%3=1 例 2.8 除法的取值 程序如下 : int a=-5,b=3,c; c=a/b; printf("%d\n",c); 科学出版社职教技术出版中心

44 第 2 章数据类型 运算符与表达式 35 运行结果为 其中, 因为 a b c 为整型变量,c 是两整数相除的结果取整, 结果值为商的整数部分 例如,7/4=1 29/6=4 等, 都舍去了小数部分, 而保留整数部分 但是如果除数和被除数中有一个是负值, 如 -5/3, 有的计算机运行结果为 -1, 有的计算机运行结果为 -2 一般情况下取前者, 即 向零取整 的方法, 如 -5/3=-1.66, 取不超过该数的整数部分, 即为 -1 例 2.8 就是在 VC 环境下的运行结果,-5/3=-1,-5%3=-2 2. 算术表达式和运算符的优先级与结合性用算术运算符和括号将运算对象 ( 也称操作数 ) 连接起来的 符合 C 语言语法规则的式子, 称为 C 语言算术表达式 运算对象包括常量 变量 函数等 以下都是合法的算术表达式例子 : a+b-1.5 (a*2)/c+'a' (x+r)*8-(a-b)/7 sin(x)+sin(y) C 语言规定了运算符的优先级和结合性 在表达式求值时, 按优先级的高低次序从高到低进行运算, 如先乘除, 后加减 如果运算符优先级相同, 则按规定的结合方向处理 例如, 表达式 a-b*c+d, 由于乘号的优先级高于减号, 所以应该先计算 b*c, 加法和减法的优先级相同, 则按照结合性来处理 加号和减号的结合性是 从左至右 的结合方向, 即 左结合性, 因此 b*c 的结果应该先与左边的减号结合, 减法运算结束以后再与加号结合 结合性的概念是 C 语言独有的特点之一, 本书附录 Ⅱ 中给出了所有运算符的优先级以及它们的结合性 3. 表达式中的类型转换在 C 语言中, 整型数据 实型数据以及字符型数据可以混合运算 例如 : 10+'A'-32.75*2+'D' 该表达式是合法的 混合于同一表达式中的不同类型常量及变量, 应变换为同一类型才能进行计算 C 语言的编译程序总是将精度较低的类型向精度较高的类型转换 图 2.8 给出部分类型的转换规则 图中的横向左箭头表示必然的转换, 如字符数据必定先转换为整型数据, 单精度数据必定转换为双精度数据, 以提高运算精度 ( 即使是两个单精度数据运算, 也先转换为双精度数据 ) 纵向箭头表示当表达式中的操作数为不同类型时候的转换方向 例 2.9 若有定义 : char int i; ch;

45 36 程序设计基础 C 语言 float f; double d; 且变量均已赋值, 则表达式 result=(ch/i)+(f*d)-(f+i) 的计算结果应该为双精度数据 图 2.8 表达式中的类型转换规则 4. 强制类型转换运算符 利用强制类型转换运算符可以将一个表达式转换成所需要的类型, 其一般形式为 ( 类型说明符 ) ( 表达式 ) 其功能是把表达式的运算结果强制转换成类型说明符所表示的类型 例如 : (float)a /* 把 a 转换为 float 型 */ (int)(x+y) /* 把 x+y 的结果转换为整型 */ 需要说明的是, 在强制类型转换时, 只是得到一个所需类型的中间变量, 原来变量或表达式的类型并没有发生变化 例如, 对于表达式 (float)a, 若 a 本身是整型变量, 强制类型转换以后得到一个单精度型的中间变量, 用于赋值或参与运算, 而 a 的类型保持不变, 仍为整型变量 例 2.10 强制类型转换 程序如下 : float f; int i; f=7.5; i=(int)f; printf("f=%f,i=%d\n",f,i); 运行结果为 科学出版社职教技术出版中心 由此可知, 有两种方式进行类型转换, 一种是系统自动进行的, 如 'a'-32, 自动将

46 第 2 章数据类型 运算符与表达式 37 字符变量转换为整型变量 ; 另一种则是强制转换 5. 自增 自减运算符 C 语言中有自增和自减运算符 :++ 和 -- 运算符 ++ 是使操作数的值自加 1, 而 -- 是使操作数的值自减 1, 即 a++ 相当于 a=a+1,a-- 相当于 a=a-1 自增和自减运算符可用在操作数之前, 也可放在其后 例如, a=a+1; 可写成 ++a; 或 a++;, 但在表达式中这两种用法是有区别的 自增或自减运算符在操作数 之前,C 语言在引用操作数之前就先执行加 1 或减 1 操作 ( 先加后用 ); 运算符在操作 数之后, 就先引用操作数的值, 而后再进行加 1 或减 1 操作 ( 先用后加 ) 例如 : x=10; y=++x; 此时,x=11,y=11 如果程序段改为 x=10; y=x++; 则 x=11,y=10 在这两种情况下,x 都被置为 11, 但区别在于设置的时刻, 上例的结果使 y 获得了不同的值 又如 : i=3; printf("%d",++i); 输出结果为 4,i 的值为 4 若改为 printf("%d",i++); 输出结果为 3,i 的值为 4 在使用自增运算符 (++) 和自减运算符 (--) 时, 需要注意以下几点 1) 自增运算符 (++) 和自减运算符 (--) 只能用于变量, 不能用于常量或表达式, 如 3++ 或 (a+b)++ 都是错误的, 因为常量或表达式是不能被赋值的, 假如 (a+b) 的初始值为 15, 自增后得到的 16 放在什么地方呢? 没有变量可供存放 2)++ 和 -- 运算的结合方向是 自右至左 例如, 有 -i++, 假设 i 的初值为 3,i 的左边是负号运算符, 右边是自加运算符, 而负号运算和自增运算的优先级相同, 按照自右至左的结合性,-i++ 应理解为 -(i++), 语句 printf("%d",-i++) 的执行过程是先取出 i 的值 3, 输出 -i 的值 -3, 然后 i 自增为 4 注意不要理解成输出-4, 也不要将该式理解成 (-i)++, 因为 (-i) 是表达式,(-i)++ 是不合法的 自增 ( 减 ) 运算常用于使循环变量自动加 ( 减 )1, 也用于指针变量, 使指针指向下一个地址, 这些将在以后的章节中介绍 6. 表达式使用中应注意的问题 1)C 语言运算符和表达式使用灵活, 但是要注意的是标准 C 语言中并没有规定表达式中子表达式的求值顺序 例如, 表达式 a=f1()+f2(); 并不是所有的编译系统都先调用

47 38 程序设计基础 C 语言 f1(), 再调用 f2() 一般情况下, 先调用 f1() 和先调用 f2() 的结果是一样的, 但在有些情况下可能不同, 因此调用的时候务必要谨慎 例如, 设 i 的初值为 5, 则表达式 j=(i++)+(i++)+(i++) 的值为多少呢? 有人认为应该是 j=5+6+7, 即 j=18, 而实际上 j=15 对于这类自加运算组合起来的表达式, 应先考查是 先加后用 还是 先用后加 本例由于三个(i++) 都是 先用后加, 所以 i 值保持为 5 不变, 三个 i 相加得到表达式的值为 15, 然后再进行 3 次自加运算, 得到 i 的值为 8 又如,i 的初值仍然为 5, 则表达式 j=(++i)+(++i)+(++i) 的值又是多少呢? 按照上面的思路, 不少人得到结论,j 的值为 即 24, 而实际上 j 的值为 22 VC++ 在处理这一类表达式时是比较特殊的, 在这里列出几个表达式, 假设每个表达式计算之前,i 的初值均为 5, 则 j=(++i)+(++i); j=7+7=14,i=7 j=(++i)+(++i)+(++i); j=7+7+8=22,i=8 j=(++i)+(++i)+(++i)+(++i); j= =31,i=9 j=(++i)+(++i)+(++i)+(++i)+(++i); j= =41,i=10 从上述表达式的计算情况, 可以得出 VC++ 在处理这类表达式时的规律 先计算两次 ++i, 然后再将自增后的 i 相加 若表达式超过两个 ++i 相加, 则从第三个 ++i 开始, 按照 先加后用 的规律依次加上 i 的值 2)C 语言中的运算符可能为 1 个字符或 2 个字符, 若同时出现在表达式中应该如 何组合呢? 例如,i+++j 应该理解为 (i++)+j, 还是 i+(++j) 呢?C 语言编译系统在处理时会尽可能多地 ( 此例为自左至右 ) 将若干字符组合成一个运算符, 如 i+++j 将被理解为 (i++)+j 此外, 表达式中若含有过多的自增自减运算, 则非常容易出错, 建议书写的时候带上括号 例如, 表达式 k=i+++++j; 在编译时就会报错, 而 k=(i++)+(++j) 则可正确执行 3)C 语言没有统一规定调用函数时实际参数 ( 以下简称实参 ) 的求值顺序 一般情况下, 实参的求值顺序是自右至左 如果 i 的初值为 5, 则语句 printf("%d,%d",i,i++) 的执行结果为 5,5; 如果 i 的初值仍为 5, 将上面语句改为 printf("%d,%d",i,++i), 其执行结果为 6, 赋值运算符 1. 赋值运算符 2.8 赋值运算符和赋值表达式 科学出版社职教技术出版中心 C 语言程序中 = 是赋值运算符, 它的作用是将一个数据或表达式的值赋给一个变量 如 a=3 就是把常量 3 赋给变量 a, x=y+z 是把 y+z 这个表达式的值赋给变量 x

48 第 2 章数据类型 运算符与表达式 类型转换 如果赋值运算符两侧的类型不一致, 但都是数值型或字符型时, 在赋值的时候系统自动进行类型转换, 转换时, 会尽量保持前后数据的一致性 表 2.4 给出了转换的原则 表 2.4 类型转换 源类型 目标类型 转换说明 举 例 实型 整型 舍弃小数部分 int i=3.6; i 的值为整数 3 整型 实型 数值不变, 补足有效位数 float x=3; x 的值为 double y=12345; y 的值为 双精度 单精度 截取前 7 位有效数字 float x= ; x 的值为 字符型 整型 保持数值不变且进行符号扩展 int x='0'; x 的值为整数 30 int y='\xfe'; y 的值为整数 -2 或 254 整型 字符型 截取 1 个字节的长度 int x=1000; x 的值为整数数据 1000 char y=x; y 的值为字符型数据 -24 整型 长整型 保持数值不变 int x=300000; x 的值为 long y=x; y 的值为 无符号短整型 长整型 数值不变, 高位补 0 long x=33; x 的值为 33 带符号型 同长度无符号 int i=-1; 将符号位也当做数字进行赋值类型 int x=i; i 的值为 -1 x 的值为 无符号类型 同长度带符号 unsigned int i= ; 将最高位当做符号进行赋值类型 int x=i; i 的值为 x 的值为 -1 说明 : 1) 双精度数据赋给单精度变量时, 要注意数值的范围不要超出单精度数的表示范围, 否则会发生溢出, 造成错误 例如 : float f= e100; 就会出现溢出错误 2) 表 2.4 中所谓的符号扩展是指为了保持原数值不变而采取的措施 以字符型数据赋给整型变量为例, 如果所用的系统将字符型看作是无符号的, 则将字符型的 8 位直接放到整型数的低 8 位, 高位补 0 如果系统将字符型看作是带符号的, 则根据字符型数据的最高位来填补整型数的高 24 位 若字符型数据的最高位为 0, 则高 24 位补 0; 若字符型数据的最高位为 1, 则高 24 位补 1, 如图 2.9 所示 短整型数据赋给长整型变量时也会遇到符号扩展的问题, 解决方法同上所述 '\xfe' y: (a) 字符 '\xfe' 被当作无符号字符型 '\xfe' y: (b) 字符 '\xfe' 被当作带符号字符型 图 2.9 符号扩展

49 40 程序设计基础 C 语言 3. 复合赋值运算符 在赋值符 = 之前加上其他二目运算符可构成复合赋值符, 如 += -= *= /= %= <<= >>= &= ^= = 等 例如 : a+=5 等价于 a=a+5 x*=y+7 等价于 x=x*(y+7) r%=p 等价于 r=r%p x*=y+7 相当于 x=x*(y+7), 而不是 x=x*y+7 复合赋值符这种写法初学者可能不习惯, 但它对于编译处理十分有利, 能提高编译效率并产生质量较高的目标代码 赋值表达式 由赋值运算符将一个变量和一个表达式连接起来的式子称为 赋值表达式 它的一般形式为 变量 赋值运算符表达式 如 x=a+b w=sin(a)+sin(b) 等都是合法的赋值表达式 赋值表达式本身也有值, 它的值就是被赋值后变量的值 例如 a=5 这个表达式的值为 5 a=b=5 也是合法的赋值表达式 根据赋值运算符 自右至左 的结合性得知, 表达式 a=b=5 相当于 a=(b=5), 先进行 b=5 运算, 将 5 赋值给变量 b, 再进行 a=(b=5) 运算, 将表达式 b=5 的值 5 赋给变量 a, 最终变量 a 和 b 都被赋值为 5 以下是一些赋值表达式的例子 a=b=c=5 /*a b c 的值都为 5*/ a=5+(b=6) /* 表达式值为 11,a 值为 11,b 值为 6*/ a=(b=4)+(c=6) /* 表达式值为 10,a 值为 10,b 值为 4,c 值为 6*/ 赋值表达式也可以包含复合赋值运算符 例如 : a+=a-=a*a 假如 a 的初值为 10, 该赋值表达式的求解过程如下所示 1) 先进行 a-=a*a 运算, 它相当于 a=a-a*a, 计算得到 a=10-10*10, 所以 a=-90 2) 再计算 a+=-90, 相当于计算 a=a+(-90), 得到 a=-180 赋值操作不仅可以出现在赋值语句中, 还能以表达式的形式出现在其他语句 ( 如输出语句 循环语句等 ) 中, 例如 : printf("%d",a=b=5); 科学出版社职教技术出版中心

50 第 2 章数据类型 运算符与表达式 41 其输出结果为 5, 在这个语句中完成了赋值和输出双重功能 这也是 C 语言灵活性的一 种表现, 在后面的学习中将更进一步体现这种应用及其优越性 2.9 逗号运算符和逗号表达式 在 C 语言中逗号, 也是一种运算符, 称为逗号运算符 其功能是把多个表达式连接起来组成一个表达式, 称为逗号表达式 逗号表达式的一般形式为表达式 1, 表达式 2, 表达式 3,, 表达式 n 其求值过程是分别求出每个表达式的值, 并以最后的表达式 n 的值作为整个逗号表达式的值 例如 : 3+x,6*y,7-5 这就是逗号表达式, 它的值为 7-5 的值, 即为 2 根据运算符的优先级可知, 逗号运算符的优先级最低 因此, 下面两个表达式的含义是不同的 x=(a=3,6*3) // 该表达式为赋值表达式, 其值为 18, 变量 x 的值为 18 x=a=3,6*3 // 该表达式为逗号表达式, 其值为 18, 变量 x 的值为 3 对于逗号表达式还要说明以下两点 1) 程序中使用逗号表达式, 通常是要分别求逗号表达式内各表达式的值, 并不一定要求整个逗号表达式的值 2) 并不是在所有出现逗号的地方都组成逗号表达式, 如在变量说明中 函数参数表中逗号只是各变量之间的间隔符 2.10 本章小结及常见错误列举 1. 本章小结 1)C 语言提供了丰富的数据类型, 本章着重介绍了几种基本类型 这些基本类型非常重要, 一方面, 它们描述了 C 语言程序中所有参与运算的常量及变量的性质 ; 另一方面, 它们也是将来学习构造类型的基础 通过本章的学习, 读者应该掌握基本数据类型在内存中所占的字节长度 所能表示的数据范围以及能够参与的运算 要能够识别各类型常量和变量的特征 掌握其存储形式和书写规范 能够利用关键字定义各种类型的变量, 并为变量赋初值 2)C 语言提供了 + - * / % 等 7 种算术运算符 可以利用这些运算符和括号一起构成算术表达式 在计算算术表达式时, 需要注意优先级及结合性的问题 不同类型的数据在一起运算时, 需要转换为相同的类型 转换的方式有两种 : 自动转换和强制转换 自加 (++) 和自减 (--) 运算是 C 语言特有的算术运算, 它们非常实用,

51 42 程序设计基础 C 语言 但在使用时, 要根据变量在运算符的前后来判定应该 先用后加 还是 先加后用 当表达式中有多种算术运算符混合计算时, 可以用括号来明确运算的先后次序以免出错 3) 注意赋值运算符的左边一定是变量, 右边可以是变量 常量或表达式 当赋值 运算符左右两边的类型不一致时, 需要按规则将右边的数据类型转换成左边的类型, 再进行赋值 4) 逗号运算符是 C 语言中优先级最低的运算符 利用逗号运算, 可以计算出多个表达式的值, 并把最右边表达式的值作为逗号表达式的值 需要注意的是, 并非有逗号的地方就一定是逗号表达式, 逗号还可以用作分隔符 2. 常见错误列举 1) 变量类型和运算类型不相符 例如 : float a,b,c; x=a%b; % 运算要求操作对象为整数, 对实型数据进行此操作编译时会出错 2) 混淆八进制与十进制常量 例如 : int a=0180; 这种赋值在编译时会出错, 原因是系统将 0 开头的数看作是八进制数, 而八进制数中不存在符号 8, 因此 0180 不是一个合法的八进制数 ; 又由于它以 0 开头, 也不是一个合法的十进制数, 因此程序报错 3) 混淆字符常量与字符串常量 例如 : 该是 : 或 char ch="a"; 这种赋值在编译时也会出错, 原因是无法将一个字符串赋给字符变量 4) 分隔符错误 例如 : int a=10;b=20;c=30; C 语言中同一类型变量定义可以写在同一行, 但是要用逗号分隔, 正确的形式应 int a=10,b=20,c=30; int a=10; int b=20; int c=30; 5) 括号的运用出错 例如 : a=[a-(b+c)]+d/e; 科学出版社职教技术出版中心 C 语言中很多表达式都会借助括号来改变运算的优先顺序, 但和数学公式不同, 在

52 第 2 章数据类型 运算符与表达式 43 表达式中只能用圆括号 () 方括号 [] 和大括号 在 C 语言中有其他作用 6) 赋值超出变量表达范围 例如 : char a=150; printf("a=%d\n",a); 运行结果是 :a=-106 这是由于 VC++ 环境中, 字符型数据的取值范围是 -128~127, a 最后的取值是产生溢出之后的结果 这类错误在编译的时候可以顺利通过, 因此比一般错误更难发现, 在编程过程中一定要注意, 给变量赋值不要超出其表示范围 习题 2 1. 已知整数 a 值为 6, 求下列表达式的值 (1)a+=a (2)a*=a+1 (3)a*=(a%=10) (4)a/=a+a (5)a+=a-=a*=a (6)a*=3+6,a/=a/2,a+=a-=a*=a 2. 根据所给的变量的值, 求下列算术表达式的值 (1)int x= ; (int)(x* )/100.0; (2)int b=7; float a=2.5,c=4.7; a+(int)(b/3*(int)(a+c)/2)%4; (3)int a=2,b=3; float x=3.5,y=2.5; (float)(a+b)/2+(int)x%(int)y; (4)int i=5; (i++)+(i++)+(++i)+(++i); 3. 阅读以下程序, 请写出运行结果 (1) printf("abcde\rabc\tabcd\n"); printf("efgh\b\bijkl\ref\n"); (2) unsigned char c1,c2; c1='a'; c2=5; printf("%c,%c\n",c1-32,c2+'0'); int i; c1=c2=i= ;

53 44 程序设计基础 C 语言 printf("%c,%d,%d\n",c1,c2,i); (3) int x=10; int y=x++; printf("%d,%d\n",(++x,x),(++y,y)); (4) int x=010; int y=110; printf("%d,%d\n",++x,y++); 科学出版社职教技术出版中心

54 第 3 章程序结构 1966 年, 计算机科学家 Bohm 和 Jacopini 提出了顺序结构 选择结构和循环结构这三种基本结构, 并证明任何算法都可以由顺序结构 选择结构和循环结构这三种基本结构组合而成 从执行方式上看, 若程序按从上到下顺序每条语句都执行且仅执行一次, 则该结构为顺序结构 ; 若在程序执行过程中, 根据用户的输入或中间结果去执行若干不同任务中的某一任务, 则该结构为选择结构 ; 如果在程序的某处, 需要根据某个条件重复地执行某项任务若干次直到满足或不满足某条件为止, 则该结构为循环结构 实际编程中, 程序一般不会是单纯的某种结构, 而是三种结构的复杂组合 从本章开始将一一为大家介绍这三种基本结构 3.1 顺序结构程序设计 C 语言中的语句 C 语言程序由函数组成, 一个函数包含声明部分和执行部分, 执行部分即由 C 语言语句组成, 而声明部分并非 C 语言语句 例如 int a; 并不是 C 语言语句, 它不产生机器操作, 而只是对变量的定义 C 语言语句分为以下 5 类 1) 表达式语句 在任何表达式后面加一个分号 ; 就构成了一条表达式语句 例如 : a=b+c; /* 赋值语句 */ x+y; /* 该语句的执行结果没有赋给任何变量保存, 没有实际意义 */ i++,j--; /* 逗号表达式构成的 C 语句 */ 2) 控制语句 用来完成一定的控制功能, 共有 9 种 if( 条件 ) else /* 条件语句 */ switch /* 多分支选择语句 */ for( 条件 ) /* 循环语句 */ while( 条件 ) /* 循环语句 */ do while( 条件 ) /* 循环语句 */ continue /* 结束本次循环语句 */ break /* 中止执行 switch 或循环语句 */ goto /* 转向语句 */ return( 表达式 ) /* 从函数中返回语句 */ 3) 函数调用语句 由一个函数调用加一个分号构成函数调用语句 例如 : printf("this is a C statement."); 4) 空语句 只有一个分号的语句, 表示什么也不做 一般用于占位或者廷时, 把它作为循环语句中的循环体时就是典型的廷时 ;

55 46 程序设计基础 C 语言 5) 复合语句 用 把一些语句括起来称为复合语句, 又称分程序 例如 : t=x;x=y;y=t; 在这个复合语句中, 共有 3 条语句, 每个语句都以分号结尾 这些语句可以看作一个整体, 注意括号外没有分号 如果复合语句内只有一条语句, 大括号可以省略 格式化输入 / 输出函数 在 C 语言中, 没有专门的输入 / 输出语句, 所有的输入 / 输出操作都是通过对标准 I/O 库函数的调用来实现 最常用的输入 / 输出函数有 scanf printf getchar 和 putchar 等 C 语言提供的函数以库的形式存放在系统中, 它们并不是 C 语言文本的组成部分 而各种 C 语言函数库是各软件开发公司针对某一类型计算机的情况编写的, 并且已编译成目标文件 (.obj 文件 ), 因此不同的计算机系统所提供的函数数量 名称以及功能并不是完全一致的 不过, 有些通用的函数 ( 如 printf scanf 等 ) 各种计算机系统都提供, 成为各种计算机系统的标准函数 在使用 C 语言的库函数时, 要用预编译命令 #include 将有关的 头文件 包含到用户源文件中, 因为在头文件中包含了库函数的有关信息 例如, 使用标准输入 / 输出库函数时, 要用到 stdio.h 文件后缀中的 h 是 head 的缩写, stdio 是 standard input & output 的缩写 在调用标准输入 / 输出函数时, 文件开头应有以下预编译命令 : 或 #include "stdio.h" 1. 标准输出函数 printf printf 函数称为格式输出函数, 其关键字最末一个字母 f 即为 格式 (format) 之意 其功能是按用户指定的格式输出若干个指定的任意类型的数据, 通常是显示到屏幕上 在前面的例题中已多次使用过这个函数 (1)printf 函数的一般形式 printf 函数的一般形式为 printf(" 格式控制字符串 ", 输出表列 ); 科学出版社职教技术出版中心 括号内是 printf 函数的参数, 包含两部分 1) 格式控制字符串用于指定输出格式, 它由格式说明部分和普通字符组成 格式说明是以 % 开头的字符串, 如 %d %c %f 等 跟在 % 后面的称为格式字符, 以说明输出数据的类型 形式 长度 小数位数等, 格式说明都是由 % 字符开始的 普通字符按原样输出, 在显示上起到提示作用 2) 输出表列中给出了需要输出的数据 这些数据可以是变量也可以是表达式, 要求格式控制字符串和各输出项在数量和类型上应该一一对应 printf 函数的一般形式如图 3.1 所示

56 第 3 章程序结构 47 printf( x = % d, y = % d, x, y ); 普通字符 输出表列 格式说明 格式控制字符串 图 3.1 printf 函数的一般形式 (2) 格式字符不同类型的数据要用不同的格式字符, 常用的格式字符有以下几种 1)d 格式符 ( 或 i 格式符 ) 用来输出十进制整数 1 %d, 按整型数据的实际长度输出 2 %md,m 指输出字段的宽度 如果数据的位数小于 m, 则在左端补空格 ; 若大于 m, 则按数据的实际位数输出 例如 : 输出结果为 x=100; y=10000; printf("%4d,%4d",x,y); 100,10000 ( 表示空格 ) 3 %ld, 输出长整型数据 例如 : 输出结果为 long x=655360; printf("%ld",x); 由于在 VC 编译环境下, 整型数据与长整型数据所占的内存字节数相同, 所以在使用时 %d 和 %ld 并无区别 长整型数据也可以指定输出宽度, 如上例把 %ld 改为 %8ld, 则结果为 ( 表示空格 ) 2)o 格式符 以八进制形式输出整型数 注意 : 凡是以八进制形式输出的整型数都被处理为无符号数, 即符号位也一起作为八进制数的一部分输出 例如 : 输出结果为 int x=-1; printf("%d,%o",x,x); -1, 因为 -1 在内存中以补码形式存放如下 :

57 48 程序设计基础 C 语言 将其换算成八进制, 为 例如 : 3)x 格式符 以十六进制输出整型数 同样输出结果不会出现负的十六进制数 输出结果为 int x=-1; printf("%d,%x",x,x); -1,ffffffff 对于十六进制数也可以用 %lx 输出长整型数, 也可以指定输出字段的宽度 4)u 格式符 以十进制形式输出无符号数 一个整型数可以用 %u 格式输出 ; 反之, 一个无符号数也可以用 %d 格式输出 无符号数也可以用 %o 或 %x 格式输出 例 3.1 无符号数据的输出 程序如下 : unsigned int x=65535; int y=-2; printf("x=%d,%o,%x,%u\n",x,x,x,x); printf("y=%d,%o,%x,%u\n",y,y,y,y); 运行结果为 5)c 格式符 用来输出一个字符 整型数也能够以字符的形式输出 在输出前, 系统会自动截取该整型数最后一个字节, 将这个字节所对应的无符号数作为字符的 ASCII 码, 并输出该字符 ; 反之, 一个字符型数据经过符号扩展也能够以整型数的形式输出 例 3.2 字符数据的输出 程序如下 : char c='a'; int i=-159; printf("%c,%d\n",c,c); printf("%c,%d\n",i,i); 运行结果为 科学出版社职教技术出版中心

58 第 3 章程序结构 49 输出字符时也可以指定输出宽度, 如上例 printf("%3c",c); 则输出 : A( 表示空格 ) 6)s 格式符 用来输出一个字符串, 有以下几种用法 1 %s, 输出字符串, 不含双撇号 2 %ms, 输出字符串占 m 列, 如果串长度小于 m 则左边补空格, 如果大于 m, 则按原长度输出 3 %-ms, 如果串长度小于 m, 则字符串向左靠, 右边补空格 4 %m.ns, 输出占 m 列, 但只取字符串的左端 n 个字符 这 n 个字符在 m 列的右侧, 左边补空格 5 %-m.ns, 其中 m n 含义同上,n 个字符输出在 m 列的左侧, 右端补空格 如果 n>m, 则 m 自动取 n 值, 即保证 n 个字符正常输出 例 3.3 字符串的输出 程序如下 : printf("%3s,%7.4s\n","good morning","good morning"); printf("%-5.3s,%.6s\n","good morning","good morning"); 运行结果为 其中, 格式说明 %.6s 中没有指定 m, 自动使 m=n=6 7)f 格式符 用来输出实型数 ( 包括单精度和双精度 ), 以小数形式输出, 有以下 几种用法 1 %f, 待输出数据的整数部分全部输出, 小数部分输出 6 位 输出双精度数时, 也可用 %lf 应当注意, 输出的数字并非全部都是有效数字 单精度数的有效位数一般 为 7 位, 而双精度数有效位数一般为 16 位 例 3.4 输出实数时的有效位数 程序如下 : float m,n; double x,y; m= ; n= ; x= ; y= ; printf("m+n=%f\n",m+n);

59 50 程序设计基础 C 语言 printf("x+y=%f\n",x+y); 运行结果为 可以看到单精度数超过前 7 位, 双精度数超过前 16 位都是无意义的 2 %m.nf 指定输出的数据占 m 列, 其中有 n 位小数 若数值长度小于 m, 左端补空格 3 %-m.nf 与 %m.nf 的区别仅在于使输出的数值向左端靠, 右端补空格 例 3.5 输出实数时指定小数位数 程序如下 : float f= ; printf("%f,%10f,%10.2f,%-10.2f,%.2f\n",f,f,f,f,f); 运行结果为 f 的值为 , 而输出的是 , 这是由实数在内存中的存储误差引起的 注意, 输出时小数点要占据 1 列 8)e 格式符 以指数形式输出实数, 有以下几种用法 1 %e 不指定输出数据所占的宽度和数字部分的小数位数, 有的 C 语言编译系统自动指定输出 6 位小数, 指数占 5 位 ( 如 e+002,e-003 等 ), 其中 e 占 1 位, 指数符号占 1 位, 指数占 3 位 数值按规范化指数形式输出 例如 : printf("%e\n", ); 输出结果为 e+002 输出实数占 14 列, 不同的系统宽度会略有不同 2 %m.ne 和 %-m.ne 此处的 m n 和 - 字符含义与前面相同 n 代表输出数据的小数部分 ( 又称尾数 ) 的位数 若 f= , 则 输出结果为 printf("%e,%10e,%10.2e,%.2e,%-10.2e\n",f,f,f,f,f); 科学出版社职教技术出版中心 空格 ) e+002, e+002, 1.23e+002,1.23e+002,1.23e+002 ( 表示 9)g 格式符 用来输出实数, 它根据实数的大小, 自动选取 f 格式或者 e 格式 ( 选择输出时占宽度较小的一种 ), 且不输出无意义的零 例如 :

60 第 3 章程序结构 51 输出结果为 f= ; printf("%f,%e,%g\n",f,f,f); , e+002, 用 %f 格式输出占 10 列, 用 %e 格式输出占 13 列, 所以用 %g 格式时, 自动从这两种格式中选择较短者,%f 格式较短, 所以按 %f 的格式输出, 最后 3 个小数位为无意义的 0, 不输出, 因此输出 %g 格式用得比较少 在用 printf 函数输出时, 还有几点要说明 1) 除了 X E G 外, 其他格式字符必须用小写字母, 如 %d 不能写成 %D 小写格式字符与大写格式字符的区别在于 : 当输出的数据里面含有字母时, 以小写格式字符输出的为小写字符, 以大写格式字符输出的为大写字符 例如, 十六进制数 5a3d, 如果以 %x 输出为 5a3d, 以 %X 输出则为 5A3D 2) 可以在 printf 函数中的 格式控制 字符串内包含转义字符, 如 \n \t \b \r \377 等 3) 如果想输出字符 %, 则应该在 格式控制 字符串中连续使用两个 % 表示 例如 : printf("%f%%",1.0/3); 对应输出为 % 4) 在 % 与格式字符之间可以加入 + 空格或者 # 进行修饰, 其作用如表 3.1 所示 表 3.1 printf 函数的附加格式说明字符 标 志 说 明 + 输出数据的符号 ( 正号或负号 ) 空格 输出值为正时冠以空格, 为负时冠以负号 对 c s d u 类无影响 ; 对 o 类, 在输出时加前缀 0; 对 x 类, 在输出时加前缀 0x; 对 e f g # 类, 当结果有小数时才给出小数点 例 3.6 附加格式说明字符举例 程序如下 : int a=42,b=-42; printf("%+d,%+d\n",a,b); printf("% d,% d\n",a,b); printf("%#d,%#d\n",a,b); printf("%#x,%#x\n",a,b); 运行结果为

61 52 程序设计基础 C 语言 2. 标准输入函数 scanf (1)scanf 函数的一般形式 scanf 函数的一般形式为 scanf(" 格式控制字符串 ", 地址表列 ); 格式控制字符串 的含义同 printf 函数 地址表列 是由若干个地址组成的表列, 可以是变量地址, 或是字符串的首地址 例 3.7 用 scanf 函数输入数据 程序如下 : int a,b,c; scanf("%d%d%d",&a,&b,&c); printf("%d,%d,%d\n",a,b,c); 运行结果为 运行结果中, 第一行是用户输入的值, 输入格式为 ( 表示空格 ), 第二行是 printf 的执行结果 程序中 &a &b &c 中的 & 是 地址运算符,&a 表示 a 在内存中的地址 scanf 函数的作用是将用户输入的数据按顺序存放到变量 a b c 所在的内存地址中 变量 a b c 的地址是在编译连接阶段分配的 %d%d%d 表示按十进制整数形式输入数据 输入数据时, 在两个数据间以一个 或多个空格间隔, 也可以按 Enter 键或 Tab 键间隔 以下都是正确有效的输入 ( 表示空格 ) ( 回车 ) ( 按 Tab 键 )4( 回车 ) 5 科学出版社职教技术出版中心 以 %d%d%d 格式输入数据时, 不能用逗号或其他符号作为两个数据间的分隔符

62 第 3 章程序结构 53 (2) 格式说明和 printf 函数中的格式说明相似,scanf 函数的格式说明也是以 % 开始, 加以一个格式说明, 中间可插入附加说明字符 ( 修饰符 ), 如表 3.2 和表 3.3 所示 表 3.2 scanf 格式字符 格式说明 d,i u o 输入带符号十进制整数 输入无符号十进制整数 输入无符号八进制整数 x,x 输入无符号十六进制整数 ( 大小写作用相同 ) c s 输入单个字符 输入字符串, 输入时以空格或按 Enter 键为结束 f 输入实型数 ( 用小数形式或指数形式都可 ) e,e,g,g 与 f 作用相同,e 与 f g 可以互相替换 ( 大小写作用相同 ) 表 3.3 scanf 的附加格式说明字符 字符说明 l h 域宽 输入长整型数据 (%ld,%lo,%lx,%lu) 以及双精度型数据 (%lf 或 %le) 输入短整型数据 (%hd,%ho,%hx) 指定输入数据所占宽度 ( 列数 ), 域宽应为正整数 * 表示本输入项在读入后不赋给相应的变量 说明 : 1) 对无符号型变量所需的数据, 可以用 %u %d 或 %o %x 格式输入 2) 可以指定输入数据的宽度, 系统自动按它截取所需的数据 例如 : scanf("%3d%3d",&a,&b); 若输入 , 则系统自动将 123 赋给 a,456 赋给 b 3) 如果在 % 后面有一个附加说明符 *, 表示跳过它指定的列数 例如 : scanf("%2d %*3d %2d",&a,&b); 若输入 ( 表示空格 ), 则系统将 12 赋给 a,%*3d 表示读入 3 位整数, 但是不赋给任何变量 然后再读入 2 位整数 67 赋给 b 也就是说, 第 2 个数据 345 被跳过 4) 输入数据时不能规定精度 语句 scanf("%7.2f ",&f); 是不合法的 (3) 使用 scanf 函数时应注意的问题 1) 如果在 格式控制字符串 中除了格式说明以外还有其他字符, 则输入数据时在对应位置输入与这些字符相同的字符 例如 : scanf("%d,%d,%d",&a,&b,&c); 应输入 10,20,30

63 54 程序设计基础 C 语言 scanf("%d:%d:%d",&a,&b,&c); 应输入 10:20:30 scanf("%d %d",&a,&b); 应输入 或 a b( 表示空格 ), 输入时应间隔 2 个或两个以上空格 scanf("a=%d,b=%d",&a,&b); 应输入 a=10,b=20 与 printf 不同,scanf 的格式控制字符串中一般不会出现转义字符 2) 在用 %c 格式输入字符时, 空格也应作为有效字符输入 : scanf("%c%c%c",&a,&b,&c); 若输入 A B C( 表示空格 ), 则系统将字符 A 赋给变量 a, 空格赋给变量 b, 字 符 B 赋给变量 c, 因为 %c 只要求读入一个字符, 后面不需要用空格作为字符的间隔 3) 在输入数据时, 遇到以下情况时认为该数据结束 1 遇空格 Enter 或 Tab 键 2 指定的宽度结束 例如, %3d 只取 3 列 3 遇非法输入 例如 : scanf("%d",&a); 若输入 12abc, 实际上变量 a 的值为 字符输入 / 输出函数 1. 字符输出函数 putchar putchar 函数的作用是向终端输出一个字符 其格式为 putchar(ch); 其中,ch 为字符变量或整型变量 例如 : char ch='a'; /* 此句可替换为 int ch=65; */ putchar(ch); 它输出字符变量 ch 的值 A, 输出效果等同于 printf("%c",ch) 例 3.8 putchar 函数的使用 程序如下 : 科学出版社职教技术出版中心

64 第 3 章程序结构 55 char a,b,c; a='b'; b='o'; c='y'; putchar(a); putchar(b); putchar(c); 运行结果为 putchar 还可以用来输出转义字符 例如 : putchar('\101') /* 输出字符 A*/ putchar('\'') /* 输出单撇号 '*/ putchar('\n') /* 输出换行符 */ 2. 字符输入函数 getchar 此函数的作用是从终端设备输入一个字符 getchar 函数没有参数, 其一般形式为 getchar(); 函数的值就是从终端设备得到的字符 例如 : char ch; ch=getchar(); 执行时, 要求从终端输入一个字符, 并将这个字符赋给字符变量 ch 如果输入 : a ch 的值就是 "a" 输入效果等同于 scanf("%c",&ch) 接着如果执行: putchar(ch); 得到的结果就是 a putchar 函数一次只能输出一个字符,getchar 函数一次只能输入一个字符 另外, 无论程序中用到的是 printf 函数或 scanf 函数, 还是 putchar 函数或 getchar 函数, 不要忘记在本文件开头加上 包含命令 : 或 # include "stdio.h" 顺序结构程序举例 所谓顺序结构, 是指程序严格按从上到下的顺序执行, 没有分支 跳转或循环 如图 3.2 所示, 先执行 A 操作, 再执行 B 操作, A B 两者即是顺序执行的关系 下面介绍几个顺序结构程序设计的例子 例 3.9 从键盘输入圆的半径, 求圆的面积 程序如下 : #define PI A B 图 3.2 顺序结构

65 56 程序设计基础 C 语言 float r,s; printf(" 请输入半径值 :\n r="); scanf("%f",&r); s=pi*r*r; printf(" 圆形面积为 :%f\n",s); 该程序运行结果为 程序开头用一条 #define 命令定义了符号常量 PI, 代表圆周率 程序第 3 行是向屏幕输出一行提示信息, 这样做的目的是提醒用户下面该输入程序要用的数据 例 3.10 从键盘输入一个大写字母, 要求用小写字母输出 程序如下 : char c1,c2; printf(" 请输入一个大写字母 :\n c1="); /* 提示输入一个大写字母 */ c1=getchar(); c2=c1+32; printf(" 它对应的小写字母及 ASCII 码是 :"); printf("%c,%d\n",c2,c2); /* 转换成小写字母和 ASCII 码 */ 该程序的运行结果为 例 3.11 输入三角形的两边的长度及其夹角, 求三角形的三边及面积 程序的思路 : 输入两边的长度 a b 以及夹角 alfa 的值 将 alfa 转为弧度值 根据 公式 c= a + b 2abcos ( alfa) 求出第三边 c 的长度, 再根据公式 s= absin( alfa), 求 2 出三角形面积 s #define PI #include <math.h> float a,b,c,s,alfa; printf(" 请输入三角形两边长度 a,b:"); scanf("%f,%f",&a,&b); 科学出版社职教技术出版中心

66 第 3 章程序结构 57 printf(" 请输入 ab 两边的夹角度数 :"); scanf("%f",&alfa); alfa=alfa*pi/180; /* 将 alfa 转为弧度值 */ c=sqrt(a*a+b*b-2*a*b*cos(alfa)); s=0.5*a*b*sin(alfa); printf(" 三角形第三边长度为 :%f\n",c); printf(" 三角形面积为 :%f\n",s); 该程序运行结果为 3.2 选择结构程序设计 关系运算符及关系表达式 关系运算是指对两个运算量进行比较, 关系运算的结果为逻辑值 ( 或称布尔值, boolean) 在 C 语言中有以下关系运算符 < 小于 <= 小于或等于 > 大于 >= 大于或等于 == 等于!= 不等于 前 4 种关系运算符 (< > <= >=) 的优先级相同, 后两种也相同, 前面 4 种的 优先级高于后面两种 关系运算的优先级高于赋值运算, 低于算术运算 用关系运算符将两个表达式 ( 可以是算术表达式 关系表达式 逻辑表达式 赋值 表达式 字符表达式 ) 连接起来的式子, 称为关系表达式 关系表达式的值是一个逻辑值, 即只有 真 和 假 两种可能 但 C 语言中没有逻辑类型数据, 因此用 1 代表 真, 用 0 代表 假 在进行判断时, 系统视非零值为 真, 零值为 假 ; 而关系运算或逻辑运算的结果若为 真, 则其值为 1, 若为 假, 则其值为 0, 结果为无符号整数 例如 : 3+5==2*4 /* 等价于 (3+5)==(2*4), 其结果值为 1 */ 2+3!=5>5-3 /* 等价于 (2+3)!=(5>(5-3)), 其结果值为 1 */ x=5>4>3 /* 先计算 5>4, 结果为 1, 再进行 1>3 的比较, 结果 x 值为 0 */ 'a'<'b' /* 比较字符 'a' 与字符 'b' 的 ASCII 码值, 结果为 1 */ 说明 : 1) 如果关系式两边的值类型不一致, 例如一边为整型数, 一边为实型数, 则系统自动按实型数进行比较 2) 对于实型数, 尽量避免 x==y 这样的比较, 因为 x 与 y 可能有舍入误差, 不宜进行精确比较

67 58 程序设计基础 C 语言 3) 区别关系运算符 == 和赋值运算符 = 例如, 判断 x 是否等于 8 的关系表 达式为 x==8, 若写成 x=8, 则变为赋值表达式, 无论 x 原来的值是多少, 表达式 值为真 4) 避免关系表达式的书写错误 例如, 需表达 x 大于等于 5, 小于等于 20, 在数学中可写成 5 x 20, 而在 C 语言程序中, 写成 5<=x<=20 是错误的 这个错误是语义错而非语法错, 编译器不会报错 运行时,x 若为 3 或者 60, 表达式的值都是真 正确的写法应该是 5<=x&&x<= 逻辑运算符和逻辑表达式 C 语言中提供了三种逻辑运算符, 如表 3.4 所示 表 3.4 逻辑运算符 运算符名称例子操作数结合性优先级! 逻辑非!a 单目从右到左 && 逻辑与 a&&b 双目从左到右 逻辑或 a b 双目从左到右 运算规则如表 3.5 所示 表 3.5 逻辑运算真值表 a b!a!b a&&b a b 非 0 非 非 非 &&: 当且仅当两个运算量的值都为真, 运算结果为真, 否则为假 : 当且仅当两个运算量的值都为假, 运算结果为假, 否则为真!: 当运算量的值为真时, 运算结果为假 ; 当运算量的值为假时, 运算结果为真 用逻辑运算符连接起来的表达式称为逻辑表达式 例如 : 说明 : a>b&&x>y /* 等价于 (a>b)&&(x>y) */ a==b x==y /* 等价于 (a==b) (x==y) */!a x+y /* 等价于 (!a) (x+y) */ 1) 逻辑运算的结果是逻辑值 真 或 假 如前所述,C 语言中并无逻辑型数据, 在进行判断时, 以非零值代表 真, 以 0 值代表 假 而关系运算或逻辑运算的结果以 1 代表 真, 以 0 代表 假 例如,a 的值为 3,!a 的值则为 0;3&&4 的值为 1 2) 逻辑运算符两侧的操作数, 除了可以是零和非零的整数外, 还可以是其他类型的任何数据, 如实型 字符型等 3) 逻辑表达式的计算, 只有在必须执行时才进行 高 低 科学出版社职教技术出版中心

68 第 3 章程序结构 59 1 对于 && 运算 : 表达式 1 && 表达式 2 && 表达式 i && 表达式 n, 依次 计算各表达式值, 若计算出第一个值为假的表达式是表达式 i, 则从表达式 i+1 开始到 最后一个表达式 n, 都不必运算, 表达式的结果一定为 0 2 对于 运算 : 表达式 1 表达式 2 表达式 i 表达式 n, 依次计算各表达式值, 若计算出第一个值为非 0 的表达式是表达式 i, 则从下一个表达式 i+1 开始到最后一个 表达式 n, 都不必运算, 表达式的结果一定为 1 例 3.12 求表达式 5>3&&2 8<4-!0 之值 根据优先级别, 按下列方式分组 :((5>3)&&2) (8<(4-(!0))) 5>3: 值为 1;5>3&&2: 相当于 1&&2, 值为 1; 此时系统不会再去计算 8<(4-(!0)) 的值, 可以得到结论 : 表达式结果为 1 例 3.13 求表达式 a++&&b++ 之值 本例要分两种情况讨论 : 若 a 值为 0, 则 a++ 之值也为 0, 故所求表达式之值为 0, 此时将跳过 b++ 不再对其求值 在这种情况下,a 先参与逻辑运算, 然后其值自增 1,b 并未参与运算, 其值不变 若 a 值不为 0, 则仅根据表达式 a++ 的值无法确定所求逻辑表达式的结果, 还需对 b++ 进行求值 在这种情况下,a 和 b 先参与逻辑运算, 然后值均自增 1 用相同的方法可分析表达式 a++ b++ 之值 例 3.14 写出判断某一年 year 是否为闰年的表达式 闰年的条件为二者之一 : 1 年份能被 4 整除, 但不能被 100 整除 2 年份能被 400 整除 则判别闰年的表达式为 选择结构 (year%4==0&&year%100!=0) (year%400==0) C 语言中, 可用 if 语句构成选择结构 它根据给定的条件, 在多项分支操作中选择 其一执行, 因此选择结构又称分支结构 1.if 语句的基本形式 (1)if 语句单分支结构 if 语句单分支结构格式如下 : if( 表达式 ) 语句 ; 计算括号内 表达式 的值, 若结果为 真, 则执行 语 句 ; 若结果为 假, 则跳过 语句 其执行过程如图 3.3 所示 例 3.15 利用单分支结构实现找出两个整数中的较大 者 程序如下 : int a,b,max; 图 3.3 if 语句单分支结构

69 60 程序设计基础 C 语言 printf(" 请输入两个整数 :"); scanf("%d,%d",&a,&b); max=a; if(max<b) max=b; printf(" 两个数中较大者为 :%d\n",max); 运行结果为 (2)if 语句双分支结构 if 语句双分支结构格式如下 : if( 表达式 ) 语句 1; else 语句 2; 计算括号内 表达式 的值, 若结果为 真, 则执行语句 1; 否则执行语句 2, 其执行过程如图 3.4 所示 图 3.4 if 语句双分支结构 例 3.16 利用双分支结构实现找出两个整数中的较大者 程序如下 : int a,b,max; printf(" 请输入两个整数 :"); scanf("%d,%d",&a,&b); if(a>b) max=a; else max=b; printf(" 两个数中较大者为 :%d\n",max); 运行结果为 科学出版社职教技术出版中心

70 第 3 章程序结构 61 2.if 语句嵌套 上述两种 if 语句的基本形式可以使程序实现 二选一 的功能, 那么如何让程序实 现 多选一 呢? 在 if 语句中又包含一个或多个 if 语句可以实现多分支结构,C 语言中 将这种 包含 称为 if 语句的嵌套 常见的 if 嵌套有以下几种形式 (1)if-else if 结构 格式为 : if( 表达式 1) 语句 1; else if( 表达式 2) 语句 2; else if( 表达式 3) 语句 3; else if( 表达式 n-1) 语句 n-1; else 语句 n; 依次判断各表达式的值, 若表达式 1 为真, 则执行语句 1; 若表达式 1 为假而表达式 2 为真, 则执行语句 2; 若前面的 n-1 个表达式均为假, 则执行语句 n, 其执行过程如图 3.5 所示 图 3.5 if-else if 结构 例 3.17 输入一个字符, 要求根据其 ASCII 码判断该字符属于控制字符 数字字符 大写字符 小写字符还是其他字符 程序如下 : char ch; printf(" 请输入一个字符 :"); ch=getchar(); if(ch<32) printf(" 您输入的字符为控制字符 \n");

71 62 程序设计基础 C 语言 else if(ch> 0 &&ch< 9 ) printf(" 您输入的字符为数字字符 \n"); else if(ch>= A &&ch<= Z ) printf(" 您输入的字符为大写字符 \n"); else if(ch>= a &&ch<= z ) printf(" 您输入的字符为小写字符 \n"); else printf(" 您输入的字符为其他字符 \n"); 程序运行 3 次的结果为 (2) 嵌套的 if-else 结构格式为 if( 表达式 1) if( 表达式 2) 语句 1; else 语句 2; else if( 表达式 3) 语句 3; else 语句 4; 依次判断各表达式的值, 若表达式 1 为真且表达式 2 为真, 则执行语句 1; 若表达式 1 为真而表达式 2 为假, 则执行语句 2; 若表达式 1 为假而表达式 2 为真, 则执行语句 3; 若表达式 1 为假且表达式 2 为假, 则执行语句 4, 其执行过程如图 3.6 所示 图 3.6 嵌套的 if-else 结构 例 3.18 比较两个数的大小关系 程序如下 : 科学出版社职教技术出版中心

72 第 3 章程序结构 63 int a,b; printf(" 请输入两个整数 a,b:"); scanf("%d,%d",&a,&b); printf("a=%d,b=%d\n",a,b); if(a!=b) if(a>b) printf("a 大于 b\n"); else printf("a 小于 b\n"); else printf("a 等于 b\n"); 运行结果为 本例中在第一个 if 语句内又嵌入了一个 if-else 结构, 完成了程序的多分支选择 可以看出, 这个问题用 if-else if 语句也可以完成, 下面是将上例用 if-else if 语句改写后的代码, 其运行结果与例 3.18 一致 if(a==b) else if(a>b) else printf("a 等于 b\n"); printf("a 大于 b\n"); printf("a 小于 b\n"); 例 3.19 求一元二次方程 :ax 2 +bx+c=0 的根 程序如下 : #include <math.h> #define ESP 1e-6 float a,b,c; /* 定义方程参数 a,b,c */ double data,term1,term2; printf(" 请输入方程的三个系数 a,b,c: "); scanf("%f,%f,%f",&a,&b,&c); if(fabs(a)<=esp) /* 当 a=0 时 */ if(fabs(b)<=esp) /* 当 a=0 且 b=0 时 */ printf(" 方程无解!\n"); else /* 当 a=0 且 b!=0 时 */ printf(" 方程为一元一次方程, 有一个根 :x=%.3f\n",-c/b); else /* 当 a!=0 时 */ data=b*b-4*a*c; term1=-b/a/2; term2=sqrt(fabs(data))/a/2; if(data>esp) /* 若 b 2-4ac>0, 有两个实根 */

73 64 程序设计基础 C 语言 printf(" 方程为一元二次方程, 有两个实根 :\n"); printf("x1=%.3f,x2=%.3f\n",term1+term2,term1-term2); else if(fabs(data)<esp) /* 若 b 2-4ac=0, 有一个实根 */ printf(" 方程为一元二次方程, 有一个实根 :\n"); printf("x=%.3f\n",term1); else /* 若 b 2-4ac<0, 有两个虚根 */ printf(" 方程为一元二次方程, 有两个虚根 :\n"); printf("x1=%.3f+%.3fi,x2=%.3f-%.3fi\n",term1,term2, term1,term2); 程序运行 3 次的结果为 程序步骤描述如下 : S1. 确定系数 a b c; S2. 当 a=0 时, 若 b=0, 则方程无解 ; S3. 当 a=0 时, 若 b 0, 方程为一元一次方程, 只有一个实根 x=-c/b; S4. 否则 : S4.1. 计算 Δ =b 2-4ac; S4.2.if( Δ >0) 计算两个不同实根 x=-b/(2a)± S4.3.if( Δ ==0) 计算两个相同实根 x=-b/(2a); S4.4.if( Δ <0) 计算两个虚根 x=-b/(2a)±( b 2 科学出版社职教技术出版中心 b 2-4ac /(2a); - 4ac /(2a))i 若 Δ 计算出来的是实数, 直接判断 Δ ==0 会存在问题, 因为十进制实数转换为二进 制数时会产生误差 所以当 Δ 值很小 非常接近零时, 就认为它等于 0 因此可设置一个值近似为 0 的常量 ε, 其值为 1e-6( 或者更小 ), 若 Δ <= ε, 则认为 Δ 值为 0 本例中用到了数学函数,fabs() 求绝对值,sqrt() 求平方根, 它们的函数原型在头文件 math.h 里 C 语言中语句的书写格式比较自由, 因此一般对于嵌套采取缩进形式, 这样程序更易懂, 不易错

74 第 3 章程序结构 65 在使用 if 语句中还应注意以下问题 1) 在 if 语句中, 条件判断表达式必须用括号括起来, 括号后不加分号, 但在其后 的语句末尾必须加分号 例如 : if(a==0) printf("yes"); else printf("no"); 2)if 和 else 同属于一个 if 语句,else 不能作为语句单独使用, 它只是 if 语句的一部分, 与 if 配对使用 3)if-else 语句执行时, 只执行与 if 有关的语句或者执行与 else 有关的语句, 不可能同时执行两者 4)if-else 的后面, 可以是单条语句, 也可以是多条语句, 即复合语句 单条语句后要加 ; 多条语句则要用大括号 括起来, 组成复合语句, 后不必加 ; 5) 在 if 关键字后面的括号中通常是逻辑表达式或关系表达式, 但也可以是其他表达式, 如赋值表达式等, 甚至也可以是一个变量 例如,if(a=5) b=a; 或者 if(b) printf("ok"); 都是允许的 只要表达式的值为非零值, 即为 真, 如在 if(a=5) b=a; 中表达式的值永远非 0, 所以其后的语句总是要执行的, 同理 if(a=0) 判断结果则永远为假, 但是在语法上是合法的 条件运算符 条件运算符是 C 语言中唯一一个三目运算符, 即有三个参与运算的量 由条件运算符组成条件表达式的一般形式为 表达式 1? 表达式 2 : 表达式 3 其求值规则 : 如果表达式 1 的值为真, 则以表达式 2 的值作为整个条件表达式的值, 否则以表达式 3 的值作为整个条件表达式的值 条件表达式通常用于实现较为简单的分支结构 例如 : if(a>b) max=a; else max=b; 可用条件表达式写为 max=(a>b)?a:b; 执行该语句的含义: 如 a>b 为真, 则把 a 赋予 max, 否则把 b 赋予 max 使用条件表达式时, 还应注意以下几点 1) 条件运算符的运算优先级低于逻辑运算符 关系运算符和算术运算符等, 但高于赋值运算符 因此 max=(a>b)?a:b 可以去掉括号而写为 max=a>b?a:b 2) 条件运算符的结合方向是自右至左 例如 : a>b?a:c>d?c:d; 应理解为 a>b?a:(c>d?c:d), 这也就是条件表达式嵌套的情形, 即其中的表达式 3 又

75 66 程序设计基础 C 语言 是一个条件表达式 3) 条件表达式中的 表达式 2 和 表达式 3 不仅可以是数值表达式, 还可以是 赋值表达式或是函数表达式 例如 : 或 a>b?(a=100):(b=200); a>b?printf("%d",a):printf("%d",b); 都是允许的 例如 : 4) 条件表达式中, 条件表达式 1 的类型可以和表达式 2 表达式 3 的类型不同 x? a : b ; 其中,x 是整型变量, 如 x 为 0, 则条件表达式的值为 'b' 表达式 2 和表达式 3 的类型 也可以不同, 此时条件表达式的类型是二者中较高的类型 例如 : x>y?1:1.5; 如果 x 小于等于 y, 则表达式的值为 1.5; 若 x 大于 y, 表达式值本应为 1, 但由于 1.5 是实型, 比整型高, 因此将 1 转换为实型 1.0 例 3.20 输出两数中的较大者 程序如下 : int a,b; printf(" 请输入两个整数 a,b:"); scanf("%d,%d",&a,&b); printf(" 两个数中较大者为 :%d\n",a>b?a:b); 运行结果为 switch 语句 switch 语句和 if-else 嵌套结构是 C 语言的两种多分支选择形式 if-else 嵌套结构多用于多条件并列测试, 从中取一的情形 ;switch 结构用于单条件测试, 从中取一的情形 一般情况下用 switch 能解决的问题,if-else 嵌套结构也一样能解决, 但如果分支较多, if-else 嵌套的层次也较多, 程序就显得比较冗长,switch 结构的层次就比较清晰 switch 语句的一般形式为 switch( 表达式 ) case 常量表达式 1: 语句序列 1; case 常量表达式 2: 语句序列 2; 科学出版社职教技术出版中心

76 第 3 章程序结构 67 case 常量表达式 n: 语句序列 n; default: 语句序列 n+1; 其执行过程是 : 计算表达式的值, 并逐个与其后的常量表达式值进行比较, 当表达式的值与某个常量表达式的值相等时, 便开始执行其后的语句, 然后不再进行判断, 继续执行后面所有 case 后的语句 如表达式的值与所有 case 后的常量表达式均不相同, 则执行 default 后的语句 例 3.21 根据输入的整数, 判别并输出是星期几 程序如下 : int a; printf(" 请输入 1~7 之间任一整数 :"); scanf("%d",&a); switch(a) case 1: printf("monday\n"); case 2: printf("tuesday\n"); case 3: printf("wednesday\n"); case 4: printf("thursday\n"); case 5: printf("friday\n"); case 6: printf("saturday\n"); case 7: printf("sunday\n"); default: printf(" 输入出错!\n"); 运行结果为 程序说明 : 1)switch 语句的表达式可以是整型 实型和枚举型中的一种 每个 case 后面的常量表达式的类型必须与 switch 后面的条件表达式类型一致 2) 每个 case 后的常量表达式的值不能相同, 否则会出现错误, 因为对表达式的同一个值, 有多种执行方案显然是矛盾的 3) 一般情况下,case 后面的常量表达式是 switch 后面括弧内的表达式可能取到的值 如果表达式的值与所有 case 后的常量表达式均不相同, 则执行 default 后的语句 4)case 和其后的常量表达式中间要有空格, 不能写成 case1, 正确的写法为 case 1 5) 在 case 后, 允许有多个语句构成复合语句, 可以不用 括起来

77 68 程序设计基础 C 语言 6) 在 switch 结构中,switch case default 均为关键字 case 后面的常量表达式仅仅起语句标号作用, 并不进行条件判断 表达式的值和某标号相等则转向该标号执行, 但不能在执行完该标号的语句后自动跳出整个 switch 语句, 而是继续执行所有剩下的 case 后的语句 例如例 3.21 若输入 5, 则运行结果为 7)C 语言还提供了一种 break 语句, 用于跳出 switch 语句 在例 3.21 的每个 case 语句之后增加 break 语句, 使每一次执行之后均可跳出 switch 语句, 从而避免输出不应有的结果 case 1: printf("monday\n"); break; case 2: printf("tuesday\n"); break; case 3: printf("wednesday\n"); break; case 4: printf("thursday\n"); break; case 5: printf("friday\n"); break; case 6: printf("saturday\n"); break; case 7: printf("sunday\n"); break; default: printf(" 输入出错!\n"); break; 此时如果输入 5, 则运行结果为 8) 添加了 break 语句的各 case 和 default 语句的顺序可以改变, 不会影响程序的执行结果 但若没有 break 语句, 随意改动 case 和 break 的顺序, 将会得到不同的结果 9) 多个 case 可共用一组执行语句 例如 : case 1: case 2: case 3: case 4: case 5: printf("work day\n"); break; 表示 a 的值为 1~5 的时候都执行同一组语句 选择结构程序举例 科学出版社职教技术出版中心 例 3.22 输入三个整数 x y z, 把这三个数由小到大输出 算法思路 : 1) 将 x 与 y 进行比较, 如果 x>y, 则将 x 与 y 的值进行交换, 否则不变 2) 将 x( 此时是 x 与 y 两者中的较小者 ) 与 z 进行比较, 如果 x>z 则将 x 与 z 的值

78 第 3 章程序结构 69 进行交换, 否则不变, 这样 x 便成为三个数中的最小者 3) 将 y 与 z 进行比较, 使 y 为二者中的较小者, 此时 z 为三个数中的最大者 4) 顺序输出三个变量值 程序如下 : int x,y,z,t; printf(" 请输入三个整数 x,y,z:"); scanf("%d,%d,%d",&x,&y,&z); if(x>y) t=x;x=y;y=t; /* 交换 x,y 的值 */ if(x>z) t=z;z=x;x=t; /* 交换 x,z 的值 */ if(y>z) t=y;y=z;z=t; /* 交换 z,y 的值 */ printf(" 三者从小到大的顺序为 : %d,%d,%d\n",x,y,z); 运行结果为 例 3.23 计算器程序, 输入运算数和四则运算符, 输出计算结果 程序如下 : float a,b,s; char c; printf(" 请输入一个算式 : \n"); scanf("%f%c%f",&a,&c,&b); switch(c) case '+': s=a+b; break; case '-': s=a-b; break; case '*': s=a*b; break; case '/': s=a/b; break; default: printf(" 输入出错!\n"); printf("%.3f%c%.3f=%.3f\n",a,c,b,s); 运行结果为

79 70 程序设计基础 C 语言 例 3.24 企业发放的奖金根据利润提成 利润 i 低于或等于 10 万元时, 按 10% 提成 ; 利润高于 10 万元, 低于 20 万元时, 低于 10 万元的部分按 10% 提成, 高于 10 万元的部分, 按 7.5% 提成 ; 利润在 20 万到 40 万元之间时, 高于 20 万元的部分, 按 5% 提成 ; 利润在 40 万到 60 万元之间时高于 40 万元的部分, 按 3% 提成 ; 利润在 60 万到 100 万元之间时, 高于 60 万元的部分, 按 1.5% 提成, 利润高于 100 万元时, 超过 100 万元的部分, 按 1% 提成 从键盘输入当月利润 i, 求应发放奖金总数, 如图 3.7 所示 图 3.7 奖金与利润关系图 设最终得到的奖金为 bonus, 当月的利润为 i 根据数轴可以看到 bonus 的计算是有 规律的, 也就是当 i 在某个范围内变化时, 提成的百分比是固定的 因此可以先算出 i 在 每个变化点所获得的奖金的值 设 bonus1 是当 i= 时所获得的奖金,bonus2 是 i= 时所获得的奖金,bonus4 是 i= 时获得的奖金 依此类推,bonus10 是 i= 时所获得的奖金 得到以下的结论 : 利 润 奖 金 0<i i* <i bonus1+(i )* <i bonus2+(i )* <i bonus4+(i )* <i bonus6+(i )* <i bonus10+(i )*0.01 用 if 语句编写, 程序如下 : long i; double bonus1,bonus2,bonus4,bonus6,bonus10,bonus; bonus1=100000*0.1; bonus2=bonus *0.075; 科学出版社职教技术出版中心

80 第 3 章程序结构 71 bonus4=bonus *0.05; bonus6=bonus *0.03; bonus10=bonus *0.015; printf(" 请输入利润值 i( 单位 : 元 ):\n"); scanf("%ld",&i); if(i<=100000) bonus=i*0.1; else if(i<=200000) bonus=bonus1+(i )*0.075; else if(i<=400000) bonus=bonus2+(i )*0.05; else if(i<=600000) bonus=bonus4+(i )*0.03; else if(i<= ) bonus=bonus6+(i )*0.015; else bonus=bonus10+(i )*0.01; printf(" 对应的奖金为 ( 单位 : 元 ):%10.2f\n",bonus); 改用 switch 语句编写, 程序如下 : long i; int c; double bonus1,bonus2,bonus4,bonus6,bonus10,bonus; bonus1=100000*0.1; bonus2=bonus *0.075; bonus4=bonus *0.05; bonus6=bonus *0.03; bonus10=bonus *0.015; printf(" 请输入利润值 i( 单位 : 元 ):\n"); scanf("%ld",&i); c=i/100000; if(c>10) c=10; switch(c) case 0: bonus=i*0.1; break; case 1: bonus=bonus1+(i )*0.075; break; case 2: case 3: bonus=bonus2+(i )*0.05; break; case 4: case 5: bonus=bonus4+(i )*0.03; break; case 6: case 7: case 8: case 9: bonus=bonus6+(i )*0.015; break; case 10: bonus=bonus10+(i )*0.01; printf(" 对应的奖金为 ( 单位 : 元 ):%10.2f\n",bonus);

81 72 程序设计基础 C 语言 运行结果为 3.3 循环结构程序设计 循环结构是 C 语言程序中一种很重要的结构 其特点是, 在给定条件成立时, 反复 执行某程序段, 直到条件不成立为止 给定的条件称为循环条件, 反复执行的程序段称为循环体 C 语言提供了多种循环语句, 可以组成各种不同形式的循环结构 goto 语句 首先, 提出两个常见的问题, 让读者思考 1) 在屏幕上输出 1~20 有的读者马上会想到这样来解决这个问题: printf("1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20"); 这样的语句能够顺利通过编译, 而且也能够达到题目要求, 但是, 这绝对不是一个好的程序, 因为程序设计者没有掌握循环程序设计的思想 如果本题改为输出 1~1000, 那么又该如何编写呢? 这个问题的解决思路应该是 : 从 1 开始输出, 每次输出一个比前一次大 1 的整数, 一共重复 1000 次 凡是类似有 重复 操作, 即使是 5 次 10 次, 都应该用循环的思想来解决 2) 计算 的值 下面采用循环结构加以实现 例 3.25 用 goto 语句和 if 语句构成循环, 求 的值 程序如下 : int i,sum=0; i=1; loop: if(i<=100) sum=sum+i; i++; goto loop; printf(" =%d\n",sum); 运行结果为 科学出版社职教技术出版中心 程序中的 goto 语句是无条件转移语句, 与 BASIC 中的 goto 语句相似 goto 语句的 使用格式为 :

82 第 3 章程序结构 73 goto 语句标号 ; 在 C 语言中, 语句标号可以是任何合法的标识符, 而不必特殊加以定义, 只须在后面加一个 : 即可, 如 flag1: stop0: 等, 这个语句标号出现在函数内某处, 执行 goto 语句时, 程序将跳转到该标号处并执行其后的语句 结构化程序设计方法主张限制使用 goto 语句, 主要是因为它会造成程序层次不清和不易读, 但也不是绝对禁止使用 goto 语句 一般来说, 可以有两种用途 1) 与 if 语句一起构成循环结构 2) 从循环体中跳到循环体外 由于在 C 语言中可以用 break 语句和 continue 语句跳出本层循环和结束本次循环, 这使得 goto 语句的使用机会大大减少, 只是需要从多层循环嵌套退出时才用到 goto 语句 由于这种用法不符合结构化编程的原则, 一般不提倡采用 while 语句构成的循环结构 while 语句用来实现 当 型循环结构, 其一般形式为 while( 表达式 ) 语句 ; while 后面用圆括号括起来的表达式, 可以是 C 语言中的任何表达式, 一般是可以判断真假的条件表达式, 也就是循环条件, 用来控制循环体是否执行 后面的语句称为循环体, 循环体一般为单语句, 若有多条语句, 则要用大括号括起来构成复合语句 while 的执行过程如图 3.8 所示 其步骤如下 : S1. 先计算 while 后圆括号内表达式的值 当值非零时, 执行 S2.; 当值为零时, 执行 S4.; S2. 执行循环体中语句 ; S3. 转去执行 S1.; 图 3.8 while 循环结构 S4. 退出 while 循环 由以上叙述可知,while 后圆括号内表达式的值决定了循环体是否执行 因此, 进入 while 循环后, 一定要有能使此表达式的值变为 0 的操作, 也就是有使循环趋于结束的语句, 否则, 循环将会无限制地进行下去, 称为死循环 例 3.26 用 while 语句, 求 的值 程序如下 : int i,sum=0; i=1; while(i<=100)

83 74 程序设计基础 C 语言 sum=sum+i; i++; printf(" =%d\n",sum); 运行结果为 说明 : 1) 程序中,i 称为循环变量,sum 称为累加变量, 使用这种变量时要先赋初值 2) 在第一次进入循环时, 若 while 后圆括号内表达式的值为 0, 循环一次也不执行 在本程序中, 若 i 的初值大于 100, 将使表达式的值为 0, 循环体一次也不执行 3) 在循环中一定要有使循环趋向结束的操作, 以上循环体内的语句 i++ 使 i 不断增 1, 当 i>100 时, 循环结束 如果没有这一语句,i 的值始终不变, 循环将无限进行 4) 语句的先后位置必须符合逻辑, 否则将会影响运算结果, 若将上例中的 while 循环体改写成 : while(i<=100) i++; /* 先计算 i++, 后计算 sum 的值 */ sum=sum+i; 运行结果为 运行的过程中, 少加了第一项的值 1, 而多加了最后一项的值 101 例 3.27 统计输入的字符个数 程序如下 : int n=0; printf(" 请输入一个字符串 :"); 运行结果为 while(getchar()!='\n') n++; printf(" 字符个数 :%d 个 \n",n); 科学出版社职教技术出版中心 本例中循环条件为 getchar()!='\n', 表明只要不按 Enter 键就继续循环 循环体 n++ 完成对输入字符个数计数 通过上面两个程序, 可以得出以下结论

84 第 3 章程序结构 75 1)while 语句中的表达式一般是关系表达式或逻辑表达式, 只要表达式的值为真 ( 非 0) 即可继续循环 2) 循环体如包含一个以上的语句, 则必须用 括起来, 组成复合语句 如果不加,while 语句的范围只到 while 后面的第一个分号处 3) 应注意循环条件的选择以避免死循环, 例如 : while(a=5) printf("%d",a); 本例中 while 语句的循环条件为赋值表达式 a=5, 该表达式的值永远为真, 而循环体中又没有其他中止循环的手段, 该循环将无休止地进行下去, 形成死循环 因此在循环体中应有使循环趋向结束的语句 例 3.28 用公式 π/4=1-1/3+1/5-1/7+1/9-, 求圆周率 π 的近似值, 直到上述级数最后一项的绝对值小于 10-4 为止 程序如下 : float pi=0,t=1.0,n=1.0; while(1.0/n>=1e-4) pi=pi+t*1.0/n ; n+=2.0; t=-1*t; pi=pi*4; printf("n=%f,pi=%f\n",n,pi); 运行结果为 程序说明 : 1) 本题用分母来控制循环的次数 用变量 n 存放分母的值, 每累加一次,n 自增 2 2) 本题中各相加项的符号是正负交替的, 每加一项之后的符号应当改变, 这可用交替乘 1 和 -1 来实现, 变量 t 用来实现正负交替 3) 从以上待求的公式来看, 不易决定的问题是最终的循环次数应该是多少 ; 但可以用最后一项 (1/n) 的值小于 10-4 来作为循环的结束条件 如果将循环条件改为 (1.0/n>=1e-6), 则运行结果为 由此可知, 用级数的方法求近似值, 计算的项数越多, 结果越精确, 但需要运行的时间也就越长 do-while 语句构成的循环结构 do-while 语句的一般形式为

85 76 程序设计基础 C 语言 do 循环体语句 ; while( 表达式 ); do-while 的执行过程如图 3.9 所示 其步骤如下 S1. 执行 do 后面循环体中的语句 ; S2. 计算 while 后圆括号中表达式的值 当值为非零时, 转去执行 S1.; 当值为零时, 执行 S3.; S3. 退出 do-while 循环 图 3.9 do-while 循环结构 说明 : 1)do 是 C 语言的关键字, 必须和 while 联合使用 2)do-while 循环由 do 开始,while 结束 必须注意 : 在 while( 表达式 ) 后的 ; 不可省略, 它表示 do-while 语句的结束 3)while 后圆括号中的表达式, 可以是 C 语言中任意合法的表达式, 由它控制循环是否执行 4) 在 do 和 while 之间的循环体只能有一条可执行语句 ; 若循环体内需要多个语句, 应该用大括号括起来, 组成复合语句 do-while 循环与 while 循环十分相似, 它们之间的重要区别 :while 循环的控制出现在循环体之前, 只有当 while 后面表达式的值为非零时, 才可能执行循环体 ; 而在 do-while 构成的循环中, 总是先执行一次循环体, 然后再求 while 表达式的值 因此, 无论表达式的值是零还是非零, 循环将会至少执行一次 用 do-while 语句可以描述 直到型 循环 例 3.29 while 和 do-while 循环比较 程序如下 : 科学出版社职教技术出版中心 int sum=0,i; int sum=0,i; printf(" 请输入起始值 i:"); printf(" 请输入起始值 i:"); scanf("%d",&i); scanf("%d",&i); while(i<=100) do sum=sum+i; sum=sum+i;

86 第 3 章程序结构 77 i++; printf("sum=%d\n",sum); i++; while(i<=100); printf("sum=%d\n",sum); 运行结果为 运行结果为 再次运行结果为 再次运行结果为 一般情况下, 对于同一个问题如果可以用 while 处理, 也可以用 do-while 处理 这两种结果是可以互相转换的 用 while 语句和 do-while 语句处理同一个问题时, 若二者的循环体部分一样, 它们的结果也一样 但是如果 while 后面的表达式一开始就为假 (0 值 ), 两者的结果是有区别的 for 循环 for 语句是 C 语言所提供的功能更强 使用更广泛的一种循环语句 它不仅可以用在循环次数已经确定的情况, 而且可以用于循环次数不确定而只给出循环结束条件的情况 它完全可以代替 while 语句 其一般形式为 for( 表达式 1; 表达式 2; 表达 3) 语句 ; 其中, for 是 C 语言的关键字, 其后的圆括号中通常含有三个表达式, 各表达式之间用 ; 隔开, 这三个表达式可以是任意形式的表达式, 通常主要用于 for 循环的控制 紧跟在 for( ) 之后的循环体, 在语法上要求是一条语句, 若在循环体内需要多条语句, 应该用大括号括起来组成复合语句 for 语句的执行过程如图 3.10 所示 S1. 计算表达式 1 的值, 通常是对循环变量赋初值 ; S2. 计算表达式 2 的值, 若值为真 ( 非 0) 则执行循环体一次, 否则跳出循环, 这是循环的条件 ; S3. 计算表达式 3 的值, 转回 S2. 步重复执行 在整个 for 循环过程中, 表达式 1 只计算一次, 表达式 2 和表达式 3 则可能计算多次 循环体可能多次执行, 也可能一次都不执行 for 语句最简单的应用形式也是最易理解的形式如下 : for( 循环变量赋初值 ; 循环条件 ; 循环变量增值 ) 语句 ; 例如 : for(i=1;i<=100;i++) sum=sum+i; 图 3.10 for 循环结构

87 78 程序设计基础 C 语言 它的执行过程完全等价于 i=1; while(i<=100) sum=sum+i; i++; 显然, 使用 for 语句更加简单 方便 对于 for 语句一般形式也可以改写成 while 循环的形式 : 表达式 1; while( 表达式 2) 语句 ; 表达式 3; 说明 : 1)for 语句的一般形式中的表达式 1 可以省略, 此时应在 for 语句之前给循环变量赋初值 注意省略表达式 1 时, 后面的分号不能省略 2) 表达式 2 也可省略, 即不判断循环条件, 此时循环将无终止地进行下去, 即认为表达式 2 始终为真 例如 : 相当于 for(i=1 ; ; i++) sum=sum+i; i=1; while(1) sum=sum+i;i++; 在这种情况下, 程序设计者应该用其他方式以保证循环能够结束 3) 表达式 3 也可以省略, 但此时需要另外设法保证循环能正常结束 例如 : for(i=1;i<=100; ) sum=sum+i; i++; i++ 操作不放在表达式 3 的位置, 而是放在循环体中, 效果是一样的, 都能使循环正常结束 4) 可以省略表达式 1 和表达式 3, 只有表达式 2, 即只给出循环条件 这种情况下 for 语句完全等同于 while 语句 例如 : 相当于 相当于 for( ;i<=100; ) sum=sum+i; i++; while(i<=100) sum=sum+i; i++; 5)3 个表达式都可以省略 例如 : for( ; ; ) 语句 ; 科学出版社职教技术出版中心

88 第 3 章程序结构 79 while(1) 语句 ; 此时不设初值, 不判断条件, 循环变量也不增值, 无终止地执行循环体, 即死循环 6) 表达式 1 可以是设置循环变量初值的表达式, 也可以是与循环变量无关的其他表达式 例如 : for(sum=0;i<=100;i++) sum=sum+i; 表达式 1 和表达式 3 可以是一个简单表达式, 也可以是逗号表达式, 即包含一个以上的简单表达式, 中间用逗号分隔 例如 : 或 for(sum=0,i=1;i<=100;i++) sum=sum+i; for(i=1,j=100;i<=j;i++,j--) k=i+j; 表达式 1 和表达式 3 都是逗号表达式, 各包含两个赋值表达式, 即同时设两个初值, 同时使两个变量改变 7) 表达式 2 一般是关系表达式 ( 如 i<100) 或逻辑表达式 ( 如 a<b&&x<y), 但也可以是其他表达式, 只要其值非零, 就执行循环体 例如 : for( ;(c=getchar())!= \n ; ) printf("%c",c); 如果只有表达式 2, 而无表达式 1 和表达式 3, 其作用是每读入一个字符后立即输出该字符, 直到输入一个 换行符 为止 注意, 从终端键盘向计算机输入时, 是在按 Enter 键以后才送到内存缓冲区去的, 运行结果为 而不是 computer ( 输入 ) computer ( 输出 ) ccoommppuutteerr 例 3.30 打印 200 以内能被 3 整除的所有整数, 每行打印 10 个数 程序如下 : int i,j=0; for(i=3; i<=200; i++) if(i%3==0) printf("%5d",i); j++; if(j%10==0) printf("\n"); printf("\n");

89 80 程序设计基础 C 语言 运行结果为 循环的嵌套 一个循环体内又包含另一个完整的循环结构, 称为循环的嵌套 内嵌的循环中还 可以嵌套循环, 称为多层循环 三种循环 (while 循环 do-while 循环和 for 循环 ) 可以互相嵌套 以下都是合法的 嵌套形式 : 1 for(; ;) 2 do while( ) for(; ;) while( ); 3 while( ) 4 for(; ;) for(; ;) for(; ;) 例 3.31 在屏幕上输出所有的 3 位以内的二进制数 程序如下 : int i, j, k; for(i=0; i<2; i++) for(j=0; j<2; j++) for(k=0; k<2; k++) printf("%d%d%d ",i,j,k); printf("\n"); 运行结果为 科学出版社职教技术出版中心

90 第 3 章程序结构 break 语句和 continue 语句 1.break 语句 break 语句只能用在 switch 语句或循环语句中, 其作用是跳出 switch 语句或跳出本 层循环, 即不再继续执行下面的循环, 转去执行循环体后面的程序 break 语句的一般形式为 break; 例 3.32 找出第一个各位之和与各位之积相等的三位数 程序如下 : int i,a,b,c; for(i=100; i<=999; i++) /* 试探全部三位数 */ a=i%10; /* a 为 i 的个位数 */ b=i/10%10; /* b 为 i 的十位数 */ c=i/100; /* c 为 i 的百位数 */ if(a*b*c==a+b+c) printf(" 第一个各位之和等于各位之积的三位数是 :%d\n",i); break; /* 跳出循环 */ 运行结果为 当 break 处于嵌套结构中时, 它将只跳出本身所在层次的循环, 而对其他层次无影响 break 不能用于循环语句和 switch 语句之外的任何其他语句中 2.continue 语句 continue 语句只能用在循环体中, 用于结束本次循环, 即不再执行循环体中 continue 语句之后的语句, 转入下一次循环条件的判断与执行 其一般格式为 continue; 应注意的是, 执行 continue 语句并没有使整个循环终止, 只结束本层本次的循环, 并不跳出循环 例 3.33 输出 20 以内不能被 7 整除的数 程序如下 :

91 82 程序设计基础 C 语言 int i; printf("20 以内不能被 7 整除的整数有 :\n"); for(i=1;i<=20;i++) if(i%7==0) continue; printf("%3d",i); 运行结果为 当然这个题目还可以用其他的方法来解决, 在这里只是为了说明 continue 的用法 当 i 能被 7 整除时, 执行 continue 语句结束本次循环, 即跳过 printf 语句 ; 只有当 i 不能被 7 整除时才调用 printf 函数 同 break 一样,continue 语句也仅仅影响该语句本身所处的循环层, 而对外层循环没有影响 它们的区别是 :continue 语句用于结束本次循环, 并回到循环入口处, 判断循环条件是否成立, 若成立则继续循环 ; 而 break 语句则是结束整个循环过程, 不再判断执行循环的条件是否成立 应用综合举例 例 3.34 编写程序统计输入的字符串中, 大写字母 小写字母 数字字符和其他字符的个数, 并按 Enter 键结束输入 程序如下 : #include <ctype.h> int m=0,n=0,i=0,j=0; char ch; printf(" 请输入一个字符串, 以回车结束 :\n"); 运行结果为 while((ch=getchar())!= \n ) if(isupper(ch)) m++; else if(islower(ch)) n++; else if(isdigit(ch)) i++; else j++; printf(" 大写字符有 %d 个, 小写字符有 %d 个, 数字字符有 %d 个, 其他字符有 %d 个 \n",m,n,i,j); 科学出版社职教技术出版中心

92 第 3 章程序结构 83 说明 : 1) 题目中循环条件为 (ch=getchar())!= \n, 其作用是从终端接收一个字符赋给变量 ch, 若接收的字符不是 \n, 则进入循环体执行 2) 本题的循环体是一个 if-else if 嵌套结构, 用来对 ch 的值进行判断 3) 本题中, 要用到判断字符类型的 isupper() 等函数, 故要使用包含命令将 ctype.h 文件包含进来 例 3.35 求 s=a+aa+aaa+aaaa+aa...a 的值, 其中 a 是一个数字 例如 ( 此时共有 5 个数相加 ), 几个数相加由键盘输入 这一题关键是计算出每一项的值 假设用 tn 来表示每个加数, 每个加数都是由上一个加数 tn*10+a 计算得到的 设 sn 是 n 个数的和 程序如下 : int a,n,i=1; int sn=0,tn=0; printf(" 请输入 a 与 n 的值 :\n"); scanf("%d,%d",&a,&n); while(i<=n) tn=tn+a; /* tn 为 i 个 a 组成数的值 */ sn=sn+tn; /* 赋值后的 sn 为多项式前 i 项之和 */ tn=tn*10; i++; printf("a+aa+aaa =%d\n",sn); 运行结果为 例 3.36 用迭代法求某正数 a 的平方根 其迭代公式为 a x0 + x1 = x0 2.0 步骤如下 : S1. 先给 x0 赋初值 a/2, 代入迭代公式计算出第一个 x1 该 x1 的值与 a 的平方根还有一定的差距 ; S2. 将 x1 之值作为新的 x0, 用上面的方法再求 x1 的新值, 该值与 a 的平方根的差距会缩小 ;

93 84 程序设计基础 C 语言 S3. 比较前后两次求得的平方根值 x0 和 x1, 若它们之间的误差小于或等于指定的 5 数如 10, 则认为该 x1 之值就是 a 的平方根值, 否则重新执行 S2, 即继续循环迭代 S4. 输出 a 的平方根值 程序如下 : #include <math.h> float i,x0,x1,a; printf(" 请输入一个正数 a:\n" ); scanf("%f",&a); if(a<0) printf(" 错误! 无法计算负数的平方根!\n"); else x0=a/2; x1=(x0+a/x0)/2; do x0=x1 ; x1=(x0+a/x0)/2; while(fabs(x0-x1)>1e-5); printf("sqrt(%f)=%f\n",a,x1); 运行结果为 例 3.37 有一分数序列 :2/1,3/2,5/3,8/5,13/8,21/13,, 求出这个数列 的前 20 项之和 可以看到这个分数序列的规律, 就是前一项的分子与分母之和为下一项的分子, 而 前一项的分子是下一项的分母 程序如下 : int i; float s=0,a=2.0,b=1.0,t; /* 要做除法, 分子分母应定义成实型数 */ 科学出版社职教技术出版中心 for(i=1;i<=20;i++) s=s+a/b; t=a; a=a+b; /* 将前一项分子与分母之和作为下一项的分子 */ b=t; /* 将前一项的分子作为下一项的分母 */

94 第 3 章程序结构 85 printf(" 数列前 20 项之和为 :%.3f\n",s); 运行结果为 例 3.38 在屏幕上显示 100~200 之间所有的素数 采用如下算法 : 如果要判断一个数 m 是否为素数, 只需要用它去除以 2 到 m 之间 的数, 如果能被其间任意一个数整除, 则表明 m 不是素数, 反之是素数 另外, 如果 m 是偶数, 则 m 一定不是素数, 因此对于本题, 只用判断 101~200 之间的奇数是否为素 数即可 程序如下 : #include <math.h> int m,i,k,n=0; for(m=101;m<200;m=m+2) k=sqrt(m); for(i=2;i<=k;i++) if(m%i==0) break; /* m 被整除, 证明它不是素数 */ /* 跳出内层循环, 接着判断 m+2 是否为素数 */ if(i>=k+1) /* m 未被整除, 证明 m 是素数 */ printf("%5d",m); n=n+1; /* n 用来记录一共打印了几个素数 */ if(n%10==0) printf("\n"); /* 每打印 10 个素数就换行 */ printf("\n"); 运行结果为 例 3.39 将一个正整数分解为质因数相乘的形式 例如, 输入 90, 打印出 90=1*2* 3*3*5 对 n 进行分解质因数, 应先找到一个最小的质数 k, 然后按下述步骤完成 S1. 如果这个质数恰等于 n, 则说明分解质因数的过程已经结束, 输出即可 ; S2. 如果 n k, 但 n 能被 k 整除, 则应输出 k 的值, 并用 n 除以 k 的商, 作为新的正整数 n, 重复执行 S1;

95 86 程序设计基础 C 语言 S3. 如果 n 不能被 k 整除, 则用 k+1 作为 k 的值, 重复执行 S1 程序如下 : int n,i; printf(" 请输入正整数 n: "); scanf("%d",&n); printf("%d=1*",n); do for(i=2;i<n;i++) /* 寻找能整除 n 的最小质数 */ if(n%i==0) /* i 能整除 n */ printf("%d*",i); n=n/i; break; while(n!=i); printf("%d\n",n); /* 输出最后一个因子 */ 运行结果为 例 3.40 按要求输出九九乘法表 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 对于此类输出二维表格或图形的题目, 往往要用双重循环解决 循环中设置两个循环变量, 分别控制行列的输出 程序如下 : int i,j; for(i=1;i<=9;i++) /* i 控制行数 */ for(j=1;j<=i;j++) /* 第 i 行一共要输出 i 个乘式 */ 运行结果为 printf("%d*%d=%d\t",j,i,j*i); printf("\n"); 科学出版社职教技术出版中心

96 第 3 章程序结构 本章小结及常见错误列举 1. 本章小结 1)C 语言程序的执行部分是由语句组成的, 程序的功能也是由执行语句实现的 C 语言中的语句可以分为表达式语句 函数调用语句 复合语句 空语句及控制语句五类 其中复合语句就是用一对大括号将合法 C 语句括起来 在控制语句的后面常常会出现复合语句, 它代表括号内的语句是一个整体, 不能被拆分 2) 任何一个 C 语言程序都有零个或多个输入 一个或多个输出 scanf 和 printf 函数就是用于输入和输出的函数 可以利用这两个函数, 配合各类格式字符, 将数据按指定的格式进行输入或者输出 除此之外,C 语言还提供了 getchar 和 putchar 函数, 专门用于字符的输入和输出 无论在程序中用到了上述哪个函数, 都必须在程序的起始位置加上 或者 #include"<stdio.h>" 3) 本章重点介绍了 C 语言程序的结构 任何复杂的 C 语言程序都是由顺序结构 选择结构和循环结构这三种基本结构组成的 这三种基本结构可以在程序中相互嵌套, 从而构造出各种各样的复杂程序 2. 常见错误列举 1)include 后面添加多余分号 例如 : ; 诸如 include define 之类以 # 开头的是 C 语言的预处理命令, 并非语句, 所以不能添加分号 2) 在使用 scanf 函数时, 变量的前面漏写 & 例如: int a; scanf("%d",a); /* 错误 */ scanf 函数是将键盘输入的内容送入变量所在地址, 变量名前面加上 & 符号代表取地址 3)scanf 函数的操作对象只能为变量 例如 : scanf("%d",&(a+b)); /* 错误 */ 因为表达式是没有存储地址的

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

<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言語入門編

新版 明解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

PowerPoint 演示文稿

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

More information

FJXBQ

FJXBQ 高等医学院校选用教材 ( 供成人教育中医药专业 中西医结合专业使用 ) 方剂学 闫润红 主编 2 0 0 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

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

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

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

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

没有幻灯片标题

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

More information

山东师大数学科学学院

山东师大数学科学学院 山东师大数学科学学院 教材 参考书 教材 C 程序设计 ( 第三版 ) 辅导书 C 程序设计实训教程 谭浩强编著 杨杰臧文科 主要内容 第一章 C 语言概述第二章数据类型 运算符与表达式第三章顺序结构程序设计第四章选择结构程序设计第五章循环结构程序设计第六章数组第七章函数第八章指针第九章结构体与共用体第十章文件 上机实习 上机地点 : 上机时间 : 上机内容 (1) 对课堂所讲内容进行验证性实验 ;

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++ - 文件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

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

《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

《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

新・明解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

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

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

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

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

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

More information

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

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

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

Microsoft Word - 正文.doc

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

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

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

( 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

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

网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

《计算概论》课程 第十九讲 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 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

图书在版编目穴 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

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

Microsoft Word - YYCXfm.DOC

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

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

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

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

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

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

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

More information

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

More information

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

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

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

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

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

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

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

Guava学习之Resources

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

More information

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

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

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

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

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

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

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

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

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

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

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

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

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

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

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

Microsoft Word - 第3章.doc

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

More information

期中考试试题讲解

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

More information

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

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

More information

51 C 51 isp 10 C PCB C C C C KEIL

51 C 51 isp 10   C   PCB C C C C KEIL http://wwwispdowncom 51 C " + + " 51 AT89S51 In-System-Programming ISP 10 io 244 CPLD ATMEL PIC CPLD/FPGA ARM9 ISP http://wwwispdowncom/showoneproductasp?productid=15 51 C C C C C ispdown http://wwwispdowncom

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

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

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

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

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

プログラムの設計と実現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

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

More information

PowerPoint 演示文稿

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

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

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

文件

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

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

大侠素材铺

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

More information

test

test C 语言程序设计教案 计算机科学技术学院基础教学部 前言 一. 教学目的 C 语言程序设计是高等学校本专科生计算机基础教学中的一门必修的公共基础课, 也是学习计算机的入门课 教学目的是通过理论教学和实验操作, 使学生掌握 C 程序编写及操作, 使学生具备在信息化社会里工作 学习和生活所必须的计算机编程知识与基本操作技能, 系统地 正确地建立计算机相关概念, 具备独立读写程序的能力, 并使学有余力的同学对

More information

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

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

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

长 安 大 学 硕 士 学 位 论 文 基 于 数 据 仓 库 和 数 据 挖 掘 的 行 为 分 析 研 究 姓 名 : 杨 雅 薇 申 请 学 位 级 别 : 硕 士 专 业 : 计 算 机 软 件 与 理 论 指 导 教 师 : 张 卫 钢 20100530 长安大学硕士学位论文 3 1 3系统架构设计 行为分析数据仓库的应用模型由四部分组成 如图3 3所示

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

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 9 [P.11] : Dev C++ [P.12] : http://c.feis.tw [P.13] [P.14] [P.15] [P.17] [P.23] Dev C++ [P.24] [P.27] [P.34] C / C++ [P.35] 10 C / C++ C C++ C C++ C++ C ( ) C++

More information

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

普通高等教育电气信息类应用型规划教材 程序设计基础 基于问题情境的 C 语言实践教程 张克军主 编 代俊雅副主编 北 京 科学出版社职教技术出版中心 普通高等教育电气信息类应用型规划教材 程序设计基础 基于问题情境的 C 语言实践教程 张克军主 编 代俊雅副主编 北 京 内容简介 本书分为基础 提高和扩展三篇, 共 15 章 我们本着巩固学生基础知识 提升学生编程能力和培养学生程序设计素质的想法设计每一章的内容, 确保学生通过循序渐进的学习, 理解 掌握教学内容 本书主要内容包括 : C 语言的基础知识, 数据类型 运算符与表达式,

More information

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

!#$ %&' '!#$! #$ % %& ' %( ' )* #+,-. 图书在版编目 数据!"#$ $ %&' $&($('%&('&( ( ()( * ) (' +,#-./0 * + 1 & 责任编辑郑鸿特约编辑马健金 一石文化 装帧设计 陆智昌 一石文化 责任校对严道丽责任印制吴晓光出版发行四川出版集团四川教育出版社 地址成都市槐树街 号邮政编码 网址! " # 印 刷 四川福润印务有限责任公司 版 次 年 $ 月第 版 印 次 年 $ 月第 次印刷 成品规格 %##&##

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

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

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

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

More information

Microsoft Word - 文前.doc

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

More information

CHAPTER VC#

CHAPTER VC# 1. 2. 3. 4. CHAPTER 2-1 2-2 2-3 2-4 VC# 2-5 2-6 2-7 2-8 Visual C# 2008 2-1 Visual C# 0~100 (-32768~+32767) 2 4 VC# (Overflow) 2-1 2-2 2-1 2-1.1 2-1 1 10 10!(1 10) 2-3 Visual C# 2008 10! 32767 short( )

More information

Microsoft Word - FM{new}.doc

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

More information