新書推薦:
《
世界文明中的作物迁徙:聚焦亚洲、中东和南美洲被忽视的本土农业文明
》
售價:NT$
454.0
《
无端欢喜
》
售價:NT$
347.0
《
股票大作手操盘术
》
售價:NT$
245.0
《
何以中国·何谓唐代:东欧亚帝国的兴亡与转型
》
售價:NT$
398.0
《
一间只属于自己的房间 女性主义先锋伍尔夫代表作 女性精神独立与经济独立的象征,做自己,比任何事都更重要
》
售價:NT$
203.0
《
泉舆日志 幻想世界宝石生物图鉴
》
售價:NT$
611.0
《
养育女孩 : 官方升级版
》
售價:NT$
230.0
《
跨界:蒂利希思想研究
》
售價:NT$
500.0
|
編輯推薦: |
本教材以面向应用型人才培养为目标,以非传统的组织结构为创新点,以全程伴随上机实践为特色,简洁、通俗、直观、易懂地讲述CC程序设计。1-5章讲述了C语言的基础知识,包括数据类型、变量和表达式以及顺序、分支、循环三大结构语句及其编程。6-9章介绍C语言的重点部分,包括数组、函数和指针。10-12章是提高部分,第10章从结构体引出类,接着两章为C的基础知识和文件,以适应学完本书后直接参加全国高校计算机水平考试(二级C)的需要。
|
內容簡介: |
本教材以面向应用型人才培养为目标,以非传统的组织结构为创新点,以全程伴随上机实践为特色,简洁、通俗、直观、易懂地讲述CC程序设计。第1~5章讲述了C语言的背景知识、上机环境以及基础知识,包括数据类型、变量和表达式以及顺序、分支、循环三大结构语句及其编程。第6~9章介绍C语言的重点部分,包括数组、函数和指针。第10~12章是提高部分,从结构体引出类,介绍C的基础知识和文件,以适应学完本书后直接参加全国高校计算机水平考试二级C的需要。 全书直接采用C的cin和cout进行输入输出,摒弃了C语言中的printf和scanf函数调用。在三部分内容之间两次集中讲解典型题和难题的解题思路,增加了相当篇幅的动态调试内容,非常有利于学习者上机实践以及有效地提高编程、调试能力。 本书适合作为高等学校非计算机专业学生CC程序设计教材,也可作为工程技术人员的自学和参考资料。
|
目錄:
|
目录
第1章CC语言概述
1.1计算机组成
1.1.1计算机的硬件系统
1.1.2计算机的软件系统
1.2计算机语言及其执行方式
1.3CC语言的发展简史与重要性
1.3.1CC语言的发展简史
1.3.2C的优点
1.3.3C程序设计是非常重要的基本训练
1.4简单的CC程序示例
1.5在VC 6.0中实现C程序
1.5.1基本概念
1.5.2VC 6.0集成环境介绍
1.5.3CC单文件应用程序的实现过程
1.5.4程序中的两类错误
1.5.5培养严谨的逻辑思维和工作作风
1.6本章知识要点和常见错误列表
习题
第2章编程基础Ⅰ
2.1结构化程序设计及C语句综述
2.1.1结构化程序设计
2.1.2C语言中的语句
2.2顺序结构三大结构之一
2.2.1赋值语句
2.2.2C中的数据输入与输出
2.2.3C中的数据输入与输出
2.2.4程序设计举例
2.3分支结构三大结构之二
2.3.1ifelse语句
2.3.2if语句
2.4循环结构三大结构之三
2.4.1while循环语句
2.4.2dowhile循环语句
2.5本章知识要点和常见错误列表
习题
第3章C语言的基础知识
3.1C语言的标识符与关键字
3.1.1标识符
3.1.2关键字
3.2基本数据类型
3.3常量与变量
3.3.1常量
3.3.2变量
3.3.3变量的初始化
3.4运算符
3.4.1算术运算符和赋值运算符
3.4.2关系运算符和逻辑运算符
3.4.3条件运算符
3.4.4逗号运算符
3.4.5位运算符
3.5表达式
3.6应用举例
3.7本章知识要点和常见错误列表
习题
第4章编程基础Ⅱ
4.1C中的条件判断
4.2复杂的分支结构
4.2.1分支结构的嵌套
4.2.2else if语句
4.2.3if语句注意事项
4.2.4多分支结构switch语句
4.3for循环语句
4.3.1for循环语句的一般形式
4.3.2for语句使用注意事项
4.3.3三种循环语句的比较
4.4C中的输出格式控制
4.5好程序的标准与算法的选择
4.5.1好程序的标准
4.5.2选择合适的算法
4.6本章知识要点和常见错误列表
习题
第5章编程进阶
5.1复杂的循环结构
5.1.1循环的嵌套
5.1.2循环控制语句break和continue
5.1.3无限循环的应用
5.2典型题目的编程
5.2.1累加与累乘
5.2.2穷举搜索法
5.2.3数位提取问题
5.2.4递推与迭代
5.3程序的动态调试
5.3.1单步调试的过程
5.3.2单步调试的实例
5.4本章知识要点
习题
第6章数组批量数据的处理
6.1数组的概念
6.2一维数组
6.2.1一维数组的定义和引用
6.2.2一维数组的初始化
6.2.3数组的越界问题
6.2.4应用举例
6.3二维数组
6.3.1二维数组的定义和引用
6.3.2二维数组的初始化
6.3.3应用举例
6.4字符数组和字符串
6.4.1字符数组的定义和初始化
6.4.2字符串
6.4.3字符数组的输入和输出
6.4.4应用举例
6.5本章知识要点和常见错误列表
习题
第7章函数及变量存储类型
7.1为什么要用函数
7.1.1模块化的优越性及C的实现
7.1.2函数概述
7.2函数三部曲
7.2.1函数声明函数三部曲之一
7.2.2函数定义函数三部曲之二
7.2.3函数调用函数三部曲之三
7.2.4实参到形参的单向值传递
7.2.5函数的返回值
7.3变量的存储类型
7.3.1变量的作用域和生存期
7.3.2变量的动态存储和静态存储
7.4函数的嵌套与递归
7.4.1函数的嵌套调用
7.4.2函数的递归调用
7.5本章知识要点和常见错误列表
习题
第8章编程深入
8.1授人以鱼不如授人以渔
8.1.1编程思想顺杆儿爬
8.1.2大程序逐步完善鱼竿一节节加长
8.1.3程序单步调试用竿儿步步试探
8.1.4单步调试的三大功能及其他调试手段
8.2典型题目的编程思路及优化
8.2.1分解质因数
8.2.2数字字符转换成十进制数
8.2.3数组插入
8.2.4数组元素排序
8.3常用字符串处理函数及其应用
8.4编译预处理
8.4.1宏定义
8.4.2文件包含
8.5关于全国高校计算机水平考试
8.6本章知识要点
习题
第9章指针
9.1指针的概念与定义
9.1.1内存地址的概念
9.1.2指针变量的概念与定义
9.2指针的使用
9.2.1指针的两个运算符
9.2.2指针变量的初始化与安全性
9.2.3指针运算
9.3间接访问指针的强大功能之一
9.3.1利用指针变量间接访问某一个单元
9.3.2利用指针变量访问一片连续的存储区
9.4指针形参返回函数多个数值指针的强大功能之二
9.4.1普通变量作函数参数
9.4.2指针变量作函数参数
9.5灵活引用数组指针的强大功能之三
9.5.1数组元素的4种表示方法
9.5.2数组作函数参数
9.5.3指向字符串的指针
9.5.4字符数组与字符指针变量比较
9.6动态分配内存指针的强大功能之四
9.7复杂指针简介
9.7.1指针数组
9.7.2指针与函数
9.7.3复杂指针
9.8本章知识要点和常见错误列表
习题
第10章结构体和类
10.1结构体
10.1.1结构体类型的定义
10.1.2结构体变量的定义
10.1.3结构体变量及其成员的引用
10.1.4结构体变量的初始化
10.1.5应用举例
10.2结构体嵌套
10.3结构体数组
10.3.1结构体数组的定义与引用
10.3.2结构体型数组的初始化
10.3.3应用举例
10.4结构体指针
10.4.1结构体指针的定义
10.4.2结构体指针的使用
10.5共用体
10.6从结构体过渡到类
10.6.1结构体类型的局限性及类的引出
10.6.2类的声明类三部曲之一
10.6.3类的成员函数定义类三部曲之二
10.6.4类的应用类三部曲之三
10.6.5类之实例
10.7本章知识要点和常见错误列表
习题
第11章C基础
11.1面向对象的程序设计
11.1.1面向过程与面向对象
11.1.2面向对象的三大特性
11.2封装性特性之一
11.2.1构造函数
11.2.2析构函数
11.3函数的重载
11.4继承性特性之二
11.4.1类的层次结构
11.4.2继承的访问控制
11.4.3派生类的构造和析构函数
11.4.4多重继承与虚基类
11.4.5继承之综合实例
11.5多态性特性之三
11.5.1多态性
11.5.2虚函数
11.5.3多态之综合实例
11.6本章知识要点及常见错误列表
习题
第12章C流文件
12.1文件和流
12.2文件的打开和关闭
12.2.1打开文件
12.2.2关闭文件
12.3文件的读写
12.3.1文本文件的读写
12.3.2二进制文件的读写
12.3.3随机文件的读写
12.4本章知识要点和常见错误
习题
附录AASCII码表
附录BVC 6.0常见错误列表
附录CC语言常用库函数表
附录D各章习题部分答案
附录E模拟题训练
参考文献
|
內容試閱:
|
前言
C语言程序设计的重要性本毋庸赘言,但在多年高校的教学工作中,编者深切体会到,对学习者而言,学习C程序设计的过程不仅是非常重要的专业基础训练,更应该是锻炼自己的耐心和毅力,培养独立思考、严谨缜密的逻辑思维方式,提高发现问题、解决问题的实践能力的大好时机。好好学习、认真实践,其意义远大于学会一种程序设计语言,对后续课程的学习和今后的工作都大有裨益!本教材面向应用型人才培养,内容安排由易到难,逐步深入,免得学习者失去学习信心。另外,一开始就使学习者可以上机实践,之后全程理论和实践互补学习,有利于掌握程序设计的技巧,提高编程能力。扎实地掌握好C语言的编程后,自然过渡到C编程。鉴于C全国高校计算机水平考试迫切需要一本适合的教材,于是有了这本CC结合的书。本教材所有例题的输入和输出直接采用C的cin和cout,摒弃了C语言中的printf和scanf函数调用。仍愿意使用printf和scanf函数的学习者也可以选用本书,将例题中的输入输出换回C语言的函数,也是一个很好的训练。本教材的特色之一在于面向现在的年轻人。众所周知,现在的90后学习者已经是读图一代了。他们对于传统教材的大段文字描述很不耐烦,故而本书从内容上加了阴影和警示,适时提出问题,版面上讲究编排,尽量将程序、运行结果和相关解释组织在一起,增加重点概念的图解,以便更好地帮助学习者理解CC程序设计。本教材的特色之二是章节的全新组织。前5章打破C语言教材按内容体系组织的传统,三大结构一起介绍,以编程基础Ⅰ、Ⅱ和编程进阶3章从简到难、循序渐进地增加学习难度,这样安排非常有利于尽早上机实践: 从第1章的学习开始就可以辅以上机练习,使计算机这个程序设计最好的老师全程伴随学习者,发挥其最大的作用!对于后面繁难的内容,尽量系统化: 函数和类以三部曲的方式介绍; 指针部分以4个强大功能为线索串起来; 构造类型从数组引出结构体、共用体,进而引出类; 面向对象以三大特性为线索来组织,条理清晰,使学习者感受到知识的连贯性、系统性,更容易掌握这些比较烦琐的内容。教材的特色之三是增加了大量例题和解题思路,引导学生自己学会如何编程: 两次集中总结典型题目。第一次在三大结构讲完后的第5章增加了主要算法题目的总结; 第二次在函数之后专设了第8章,本着授人以鱼不如授人以渔的思想,将编程思想、逐步完善和单步调试形象地称为三根鱼竿,第一根鱼竿: 编程思想顺杆爬,对一些感到无从下手的难题,如何去思考?第二根鱼竿: 大程序的逐步完善犹如鱼竿一节节加长,逐步完善程序代码,以及化繁为简,逐步完成复杂题目的编程技巧; 第三根鱼竿: 程序单步调试如盲者用竿儿步步试探,查找程序的逻辑错误和运行错误。这样对学习者的编程、上机、调试等各方面都有促进作用。教材还有另外两个特色。一个是强调动态调试,书中在第5章和第8章两处给出单步跟踪实例,有心的学习者可以模仿这些实例自己上机实践,自学动态调试; 另一个是在大多数章最后将该章的常见错误列成表格,以便学习者仔细阅读并作为上机参考,可透彻理解各个知识点,很快成为编程高手。全书由张正明主编并编写第7、9章,第10~12章由卢晶琦编写,第1、6、8章由王丽娟编写,第2~5章由孟庆元编写。在本书成书的过程中,受到电子科技大学中山学院领导及清华大学出版社编辑们的大力支持,在此一并表示感谢。选用本书的教师可免费索取电子教案、所有例题代码及作业和模拟题的答案。如对本书有疑问和建议,可与编者联系,QQ: 704393383。希望本书能给注重实践的学习者以切实的帮助。由于编者水平有限,时间仓促,书中可能有不足之处,殷切盼望读者提出宝贵意见。编者2016年1月
第3章C语言的基础知识本章讲述C程序设计的基础知识,内容比较多,但有了前两章的铺垫,本章的内容完全可以编程上机体会。对于第2章已经反复用到的变量、表达式等重要概念,本章会详细讲述。如此两相补充: 学会了第1、2两章的编程基础,可以上机运行体会、帮助理解第3章的各种知识和概念; 而第3章的具体概念理解透了,又可以更深入地理解第2章的程序,如分支、循环语句中作为条件的关系表达式等,请学习者多多上机,细心体会。学习程序设计,计算机本身就是最好的老师。
3.1C语言的标识符与关键字
3.1.1标识符在C语言中,所谓标识符,就是用一串字符起一个名字用来标识和识别变量、常量、函数等。ANSI C规定有效标识符的构成规则如下:1 第一个字符必须是字母或下画线_。2 后跟字母、下画线_或数字。3 标识符中的大小写字母有区别。如sum、Sum、SUM代表三个不同的标识符。C程序中基本上都采用小写字母,大写字母只用来定义宏名等,用得不多。C中名字偏长,单词间用大写字母分辨,如curLen代表当前长度current length,用maxLen代表最大长度等。4 不同的C语言系统对标识符的长度有不同的限制,有的要求最多为6个字符,有的允许使用最多8个字符,而VC系统下的有效长度为1~32个字符。5 不能与C编译系统的保留标识符即3.1.2节所讲的32个关键字同名。表31所示是正确标识符和错误标识符的举例。
表31标识符举例
正确的标识符错误的标识符
count1 counttest123hi!therehigh_balancehigh..balancePIa ba_1a=1
请思考表31右列中的标识符的错误之处。在程序编写时,标识符的命名原则是见名知意,看到名字就可以联想到它所代表的意思,建议采用相应英文或者汉语拼音首字母等,如代表姓名的标识符可以起名为name或xm,而不要随便取名abc。无意思的名字虽然不会产生语法错误,但会降低程序的可读性,不是一个良好的编程习惯。3.1.2关键字关键字也叫保留字,是ANSI C规定的用于C编程中有特定含义的名字,不能再用来表示其他含义。下面列出32个关键字:auto,break,case,char,const,continue,default,do,double,else,enum,extern,float,for,goto,if,int,long,register,return,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile,while。它们用来表示C语言本身的特定作用,每个都有自己特定的含义。阴影部分是比较常用的,应该首先掌握。C语言还使用下列12个保留字作为编译预处理命令:define,endif,error,if,else,ifdef,ifndef,include,line,pragma,undef。这些命令使用时前面应加#并有一定的格式,如#define PI 3.1415 。读者开始时不必全部去理解和记忆,遇到例题时明白即可。
3.2基本数据类型
在前两章中已经看到,在C程序中,所有变量都应先定义、后使用。对变量的定义可以包括两个方面: 存储类型、数据类型。本章先介绍数据类型的说明,存储类型将在第7章介绍。数据类型是按计算机内数据的表示形式、占据存储空间的多少、构造和运算特点等来划分的。在C语言中,数据类型可分为基本类型,构造类型,指针类型三大类。图31是数据类型的分类。
数据类型基本类型字符型char整型int
实型单精度实型float
双精度实型double无值型void
构造类型枚举型enum数组结构体struct(含位段)共用体union
指针类型
图31C数据类型
不同类型的数据占用内存单元的字节数不同,表32说明了不同类型数据的字节数和取值范围值域。
表32标准C主要数据类型占用内存情况和取值范围
数 据 类 型字节数二进制位数值域
char18-128~127int216-32768~32767float4320,1.4e-45~3.4e 38绝对值double8640,4.9e-324~1.8e 308绝对值
下面从常量和变量两个角度介绍C编程中常用的基本数据类型。
3.3常量与变量
3.3.1常量在C语言中,常量具有固定的值,且在程序运行过程中保持不变。下面介绍常用的数值常量、字符常量和字符串常量。1. 数值常量数值常量就是我们平时所称的常数,有整型常量和实型常量。1 整型常量整型常量也称为整型常数或整数。整型常量按进制可分为十进制整数、八进制整数和十六进制整数。在程序中后两者是用前缀来区分的。详述如下。1 十进制整数。十进制整数是人们最熟悉的,也是最常用的。在C语言中的表示方法与数学中一样,以正(常省略)、负号开头,后跟若干位0~9的数字,如123、-459、0等。0~9共10个数称为基数,其运算规则是逢十进一。一个整数在内存中存储时要占一定数量的内存单元。若占用二进制位数为n,则该整数的取值范围为-2n-1~2n-1-1。标准C中用2个字节来表示一个整数,即16位二进制数,则其取值范围是-32768~32767。VC6.0里用4个字节来表示整数,范围要大得多。2 八进制整数。八进制整数用8个基数0~7来表示,运算规则是逢八进一。在C中用数字0作前缀,作为八进制数的标志,后面跟若干位0~7的数字。如,015十进制为13、0101十进制为65是合法的八进制数; 但256无前缀0、03A2包含非八进制数字是非法的八进制数。3 十六进制整数。十六进制整数有16个基数0,1,,9,A,B,C,D,E,F其中A代表10,B代表11,以此类推,运算规则是逢十六进一。在C中用0x作前缀,后面跟若干位0~F。0x2A十进制为42、0xA0十进制为160、0xFFFF十进制为65 535是合法的十六进制数; 以下各数是非法的十六进制数: 5A无前缀0x、0x3HH不是有效的十六进制基数。计算机内所有的信息都用0和1来表示,在表示数值时用二进制表示。二进制只有两个基数0和1,运算规则是逢二进一。由于二进制数位数太长,不易使用,习惯上用十进制、八进制或十六进制来表示。0~15这16个数的4种进制的对应关系如表33所示,不同的进制可表达同一大小的数值。阴影两列是4位二进制数与1位十六进制数的对应,可以理解为互换关系: 计算机内是二进制,编程时写成十六进制或其他进制,方便了人们的书写与阅读。
表334种进制对照表
十进制二进制十 六 进 制八 进 制
00000000100011012001020230011303401004045010150560110606701117078100081091001911101010A12111011B13121100C14131101D15141110E16151111F17
2 实型常量实型常量就是平常所说的带小数点的常数,按其存储方式的不同分为单精度实型常量和双精度实型常量。单精度实数在内存中占4个字节,其数值范围是: 0及1.410-45|x|3.41038,当绝对值小于1.410-45时按0对待,而大于3.41038时发生溢出错误。它的十进制有效位数最多有7位。双精度实数在内存中占8个字节,取值范围是0及4.910-324|x|1.810308,范围大,精度高。它的十进制有效位数最多有16位。一个实数的范围很大,但是它的有效数字位数是有限的,超过其有效位数时则不能精确表达,会带来一定误差。单、 双精度数在表示时都有小数形式和指数形式两种。1 小数形式。一个实数可以是正、负号开头,有若干位整数部分,后跟一个小数点,再有若干位小数部分,如123.456、-21.37,常数12用实数表示时必须写成12.或12.0。
2 指数形式。一个实数可以表示成a10n形式,这个指数形式在C语言中就是aEn或aen,a称为尾数,n称为指数。尾数部分可以是整数形式或小数形式,指数部分是一个整数。例如,以下是合法的指数形式: 2.1E5等于2.1105、3.7E-2等于3.710-2、0.5E7等于0.5107、-2.8E-2等于-2.810-2; 以下是不合法的指数形式: E7E前无尾数、53.-E3负号位置不对、2.7E无指数。对于实型常量,在系统中默认是双精度型的,如要声明为单精度型的则要在数字后加f或F,比如2.1f、3.14159F、2.1E5f、-3.4E-5f等。2. 字符常量''a'',''A'','' '',''7'',''?''等用单引号括起来的一个字符是字符常量,它们以其ASCII码形式存储在内存中,每个字符在内存中占一个字节。ASCII码是由美国国家标准委员会制定的一种包括数字、字母、通用符号、控制符号在内的字符编码集,全称为美国国家信息交换标准码American Standard Code for Information Interchange,被国际标准化组织ISO指定为国际标准。ASCII码表如附录A所示,是一种7位二进制编码,能表示27=128种国际上最通用的西文字符。它常用于输入输出设备。如从键盘输入字符''0'',在计算机内存储的是其ASCII码值48; 输出ASCII码值为65的字符到显示器,显示的是字母A,97就显示字母a。 ''A''和''a''是不同的字符常量。记住这三个字符的ASCII码,自然可以推出其他数字和字母的ASCII码。注意: 字符常量表示显示字符时,在单引号内只能是一个字符,多于一个字符,如''ab''、''a ''或''a''都引起错误。C的字符常量除了用单引号括起来的一个字符外,还有一类称为控制字符常量或转义字符常量,在单引号内以\开头后跟转义字符或八进制数或十六进制数来表示。\表示后面的字符不是原来的含义,是C语言中表示字符的一种特殊形式,常用的如表34所示。
表34常用的转义字符及含义
符号意义ASCII码值十进制
\a响铃BEL7\b退格BS8\f换页FF12
\n换行LF10\r回车CR13\t水平制表HT9\v垂直制表VT11\\反斜杠92\?问号字符63\''单引号字符39\"双引号字符34\0空字符NULL0\ddd任意字符三位八进制\xhh任意字符两位十六进制
3. 字符串常量当要使用一个字符序列时,就要使用字符串常量。字符串常量是用一对双引号括起来的字符序列。如"A","x y=6","How do you do?","1234"等都是字符串常量。3.3.2变量在程序运行过程中,其值可以改变的量称为变量。如前所述,变量可以形象地理解为一个盒子,盒子的名字和其中装的数值就是变量的两个要素。一个是变量名,用标识符来表示,一般由小写字母组成,另一个是变量的值,内存中几个单元的数值。在C语言中,程序待处理的数据、中间结果、最终结果等一般都放在变量中,所有的变量都需要先定义,后使用,并在同一层次中不能与其他标识符重名。变量定义的一般形式如下:
数据类型 变量名表;
这里的数据类型是C语言的数据类型,如图3.1所示数据类型的英文形式。变量名表可以是一个变量名,也可以是多个变量名,有多个变量时,中间用逗号分隔。最后以分号结束。以下是一些变量定义的例子:
inti,j,num; 定义了三个整型变量 i,j,num
charch,ch1; 定义了两个字符型变量ch,ch1
float f,a; 定义了两个单精度实型变量f和a
doublex,y,total; 定义了三个双精度实型变量x,y,total
说明:1 变量名应当是C语言中允许的合法标识符,不要与系统的保留字重名,用户定义时应尽量遵循见名知意的原则,例如保存分数的变量可以命名为score,fenshu或fshu,长度用length或len而不用l,因为它看起来又像1、2、3中的1,又像大写的I,容易混淆今后所有标识符均如此,不再重复。另外,命名标识符时,初学者应该模仿例题,按照传统的命名习惯,不要自己杜撰、创造不合习惯的标识符,这样编写的程序才易读,也方便编程者间的合作交流。如i、j、k、m和n一般用于标识整型变量,尤其是循环控制变量; x、y、z和f一般用于标识实型变量等。2 计算机中因为要用存储单元来放置数据,所以数据类型的概念比数学中重要得多。为此必须先定义变量,并确定它的数据类型,在内存中为它分配相应字节的存储单元。如标准C中,char型为1字节,int型为2字节,float型为4字节,double型为8字节不同的系统可能有所差异。这样就可以保证程序中变量的正确使用。若还没有定义变量就使用它,编译器就不知道要为这个变量开辟几个字节单元,会出错。3 变量可以在程序内的三个地方定义: 在函数内部、在函数的参数形参中或在所有函数的外部。前6章只学习在main函数中定义变量,第7章将详细说明其他两种位置定义变量的方法。C语言中基本数据类型变量有如下几种。1. 整型变量整型变量用来存放整型数值。整型变量可分为整型int、短整型short int或short、长整型long int或long和相应的无符号整型unsigned int,unsigned short,unsigned long。以上不同的标识符定义了不同整型数的类型和范围,比如unsigned int,代表其后定义的是无符号整型变量,也就是此变量存储单元的所有位均表示数值,比如16位时,最小的数是0x0000整数0,最大的数是0xFFFF整数65 535。用int定义整型变量,这个变量可以存放正整数、0或负整数,用补码形式表示。正负数的符号用存储单元的最高位来表示,0代表正数,1代表负数,16位二进制的另外15位表示数值,数的范围是-32768~ 32767。整型变量的数值范围如表35所示,超过该变量允许的使用范围将导致错误的结果。
表35整型量所分配的内存字节数及数的表示范围
类型标识符标准C分配的字节数标准C中数的范围VC中分配的字节数
int2-32768~327674unsigned int20~655354short int2-32768~327672unsigned short20~655352long int4-2147483648~21474836474unsigned long40~42949672954
从表中可以看出: 标准C的长整型数范围要大得多,所以当处理的数较大如大于3万时,可选长整型变量。如果要说明一个整型常量是长整型,要在数值后加字母L,如158L 长整型十进制158、358000L长整型十进制358000。在VC中,只有short型为两个字节,其他都是4个字节。2. 实型变量实型变量也称为浮点型变量,分为单精度型float和双精度型double两类。标准C和VC6.0中,单精度变量占4个字节内存单元,有6~7位十进制有效数字,其绝对值范围为0及1.4e-45~3.4e 38。双精度变量占有8个字节内存单元,可提供15~16位十进制有效数字,数值精度高,数值范围大,其绝对值是0及4.9e-324~1.8e 308。一个实型常量可以赋给单精度型变量,也可赋给双精度型变量,在选择使用哪一种实型变量的时候,主要看要求的精度和范围。3. 字符型变量字符型char变量存放字符型数值,在内存中仅占一个字节,存放的是字符的ASCII码,可以是-128~127之间的整型常数。在某些运算中把字符型变量直接当作整型变量进行处理。【例31】用程序说明各种变量的范围及其精度。为了让读者对各种主要类型变量的数值范围和精度有一个大致了解,例子中设置了short型、float型和double型三种变量,请对照程序中的数值、注释和输出结果,理解数据的精度和范围。还设置了char型变量,演示字符型变量的运算以及从字符型变量向整型变量赋值的现象。
#include
void main
{ short int m1,m2,m3,m4,c1,c2;
float f1,f2,f3,f4;
double d1,d2,d3,d4;
char ch1,ch2;
m1=-32768;m1设为最小的short数
m2=m1-1; m2在m1基础上再减1,结果出错
m3=32767;m3设为最大的short数
m4=m4 1; m4在m3基础上再加1,结果出错
cout正确的初始化
示例代码:
int a,b,c;变量的定义
a=5; 一个变量的赋值
b=c=6; 变量的连续赋值
若只定义了一个变量,却没有初始化,它的值是多少呢?
3.4运算符
运算符是执行某种操作的特定符号。C语言的运算符很丰富,除了控制语句和输入输出以外,几乎所有的语句都可用运算符实现。C语言的运算符有以下几类。1 算术运算符 ,-,*,,%,,--。2 关系运算符,=,==,!=。3 逻辑运算符&&,||,!。4 位运算符,&,|,~,^。5 赋值运算符=及其扩展赋值运算符 =、-=等。6 条件运算符? :。7 逗号运算符,。8 指针运算符*,&。9 求字节数运算符sizeof。10 强制数据类型转换运算符数据类型。11 成员运算符.,-。12 下标运算符[]。13 圆括号运算符 。3.4.1算术运算符和赋值运算符算术运算符和赋值运算符是最常用也是最重要的一类运算符,如表37所示,赋值运算符的含义与人们熟悉的数学上的等号含义不同,要特别注意。
表37算术运算符和赋值运算符
操作符作用运算对象个数优先级结 合 方 向
自增,加112--自减,减112-负号12自右向左
*乘23
除23%取余取模23自左向右
加24-减24自左向右
=赋值214自右向左
说明:1,-,*,与数学中的运算类似,先乘除后加减。改变运算顺序要加圆括号。除法运算符在用于两个整型数运算时,其运算结果也是整数,余数总是被截掉,如12得到的不是0.5而是0; 13得到的也不是0.33333,而是0,至少有一边是实数或实型变量时,结果才是实数,如10.03,结果是实数3.33333,使用时要特别注意。2 求余运算符取模运算符%仅用于整型数据,不能用于实数。它的作用是取整数除法后的余数,余数的正负号与被除数一致。如,9%2的结果是1如图32所示,3%(-8)的结果是3,-15%8的结果是-7。和%两个运算符在整数处理程序中很有用,如判断某整数x的奇偶性可以用x%2判断; 取出某数x的个位用x%10,取出除个位以外的高位数可以用x10,如图33所示。
图32与%运算示例
图33与%运算妙用
3 赋值运算符=是将右边表达式的值送给左边的变量。赋值运算符左边必须是变量,而不能是常量或表达式。如x=x 1;是合法的,而x 1=x;是非法的,赋值号不同于数学中的等号。4、-、*、和%可以与赋值号=组成扩展赋值运算符,如 =、-=、*=、=和%=。这样a=a b;可以写成a =b;,a=a*b; 可以写成a*=b;,以此类推。这样书写简练,指令效率高,运行速度快。5 和--的功能是在变量原值上加1或减1后再赋给该变量,不能作用于常量,只能作用于变量。和--是单目只有一个操作数运算符,既可出现在变量前,也可出现在变量后,运算符号位置不同,结果也不同。如果运算符在变量前面,如i,就先对变量作加1运算,然后再引用,即使用该变量加1以后的值。如果运算符在变量之后,如i,则先引用,然后再对它作加1运算,即使用该变量未加1之前的值。在很多题目中容易混淆视听,使学习者产生混乱,这是学习难点之一。掌握了以不变应万变的原则,就容易正确处理,原则是先加1还是后加1,顺其自然。请对比下面三个例子中左右两个程序的输出结果,体会、--的用法。【例32】赋值即为引用。
#include void main{ int x, y;x=10;y=x;先自加,再赋值coutvoid main{ int x, y;x=10;y=x;先赋值,再自加coutvoid main{ intx=10;coutvoid main{ intx=10;coutvoid main{ intx=10;x;coutvoid main{ intx=10;x;cout大于26=大于等于26=9;"10=9"成立,结果为1,输出1
字符比较按其ASCII码值进行,与字典顺序一致,如''A''''B''为0假。小写字母的ASCII码比大写字母的大,所以''a''''A''为1真。2 ==是比较二者是否相等的符号,很容易与赋值号=混淆,要特别注意。例如,想表达如果x是否等于10,错写成whilex=10,不管x具体是多少,条件都为真,因为10赋给x后,x非0,为真,永远满足条件,可能造成死循环。正确的写法应该是whilex== 10。3 逻辑运算是除算术运算之外的一类重要运算形式,它表示事物间的因果关系,它在现代数字系统设计中具有重要的作用。基本逻辑运算有与、或、非三种。参与逻辑运算的数据称为逻辑量,又称为布尔量。在C语言中,没有专门的布尔量,所以进行逻辑运算时就很灵活,各种类型数据或表达式均可当成逻辑量参与运算,C把所有的非0当成1真,只有0才是0假。逻辑运算的结果只有1和0两个值1为真,0为假。逻辑运算的真值表如表39所示,逻辑值只有两个值1真和0假。与 AND运算&&: 当两个条件都满足时结果才成立,运算规则是见0为0,否则为1。或 OR运算||: 当两个条件中的任意一条满足时结果就成立,运算规则是见1为1,否则为0。非NOT运算!: 当条件不满足时结果就成立,表达否定的意思。运算规则是1变成0,0变成1,
表39逻辑运算真值表
pqp&&qp||q!p
00001010111001011110
4 注意表38中各运算符的优先级,通常单目运算符级别高,如逻辑非!级别是2,高于优先级为6的、=、yz的计算步骤如下: ① !x,x=2参与逻辑运算,因其非0,当成逻辑真,取非,即为假,得0; ② !xy即03,为假,结果是0; ③ 0z,即0再与z比较04,最后得出逻辑值为0假。写成coutyz; ,上机运行结果为0。3.4.3条件运算符条件运算符是唯一的三目运算符,一般形式是:
表达式1 ?表达式2:表达式3
功能是: 先求表达式1的值,如果为真非零,则求表达式2的值,并把它作为整个表达式的值,否则求表达式3的值,并把它作为整个表达式的值。例如,x=10; y=x9 ? 100:200; 运行后y值为100。它可以看作是ifelse语句的简短形式,以上语句也可以写成
if x9
y=100;
else
y=200;
有多个条件运算符时,自右至左结合,如ab?a:cd?c:d相当于ab?a:cd?c:d。3.4.4逗号运算符逗号运算符,也称顺序求值运算符,其运算优先级是最低的,结合方向是自左至右,也就是从左向右依次计算各表达式的值。用逗号运算符连接多个表达式时,逗号运算符左边表达式的值总是不返回的,只将最右边表达式的值作为整个表达式的值。例如,x=y=3, y 1,y;的运算过程是: 先将3赋给y,y值为3,然后计算表达式y 1,其值为4,但最后是将最右边的y的值3赋给x。由于逗号运算符的级别最低,所以整体求值时一般均需加圆括号。3.4.5位运算符C语言和其他高级语言不同,它完全支持位运算。C语言可用来代替汇编语言完成针对硬件的编程工作,其中位运算功不可没。位运算是对字节或字中的实际二进制位进行运算,完成检测、设置或移位等功能。这些字节或字必须是字符、整型数据或它们的变体,不能用于float、double、void及指针等数据类型。位运算符有&与、|或、~非、^异或、右移、右移运算符使整型表达式值二进制形式中的每一位向右移动若干位,符号位不变,移出的最低位将丢失,数值位最高位以符号位填充。右移表达式的形式为:
整型表达式移位的位数
设有char a=15;,运行a=a2;后,即a右移两位,变为00000011,即十进制数3。在正常值范围内,每右移一位相当于除以2,取整数部分。左移和右移运算符还可以构成扩展赋值运算符=。其他运算符就不一一介绍了。各种运算符混合运算时,要特别注意它们的优先级,自然排列的优先级如表310所示,应记住大概次序: 括号最高,其次是单运算符目,然后是算术关系逻辑条件赋值逗号。
表310运算符的功能、优先级、运算结合方向
优先级运算符结合规则
1[ ] -.从左至右2!~---*&sizeof从右至左3*%从左至右4 -从左至右5从左至右6=从左至右7==!=从左至右8&从左至右9^从左至右10|从左至右11&&从左至右12||从左至右13? :从右至左14= =-=*==%=&=^=|==2,结果为1。学习者常犯的错误是多项关系的连续表达,如想表示x大于3并且小于6,用数学关系式33&&x=''0'' && ch =48 && ch =0 && ch =''a''&&ch=''A''&&ch "12"都是int型运算,为int型值0,然后转换成double型
和double型40.5相乘,结果为double型,再赋给float型x,x=0.0
x=40.5*12; "40.5*1"是double型运算,结果为double型,然后除以2
结果为double型,再赋给float型x,x=20.25
若强行将存储单元多、数值范围大的数据类型赋值给存储单元少、数值范围小的变量,就有可能出错,如上例若加i= dx-y;会出现警告提示:
conversion from ''double'' to ''int'', possible loss of data
一个大数double型放进一个小盒子里int型变量,可能截掉数据,导致错误。但当处理的数据不是很大时,对此警告可以忽略。还可以强制进行数据类型转换,强迫表达式的值转换为某一特定的数据类型,这是使用C语言中的数据类型强制转换运算符来实现的:
数据类型标识符 变量或表达式
假如有int x=1;,则floatx2得到0.5,floatx2得到0.0。
3.6应用举例
【例35】输入三角形的三条边长,求三角形的面积。提示:1 利用海伦公式求面积: area=s(s-a)(s-b)(s-c),其中s=a b c2。2 要判断a、b、c能否构成三角形任意两边和要大于第三边。3 求平方根可以调用系统提供的库函数sqrt,文件开始加include 即可。
#include
#include用到数学函数时一定要包含头文件math.h
void main
{ float a,b,c,area,s;
cina;
cinb;
cinc;
ifa
void main
{
int i=0;
whilei
i;
}
}
运行结果:
【例37】循环输入若干个字符,用$作为输入结束符,统计其中小写字母的个数。程序首先要循环输入字符,循环体内对输入的每个字符进行判断,满足条件的就计数,遇到$则不再处理,输出统计结果。请注意输出结果中$后面的已经不再处理,因为$是输入结束符。
#include
void main
{ int n=0;
char cha;
do
{cincha;读入一个字符,送入变量cha
ifcha=''a''&&chavoid main{int i,m,n;cini;m=i%5;n=i%7;ifm==0 && n==0coutvoid main{int i,m,n;cini;m=i%5;n=i%7;ifm || ncout3 && x60
cout=60
否则60分的同学就被统计成不及格的了10不注意数据类型的值域比如求阶乘,若阶乘结果定义为短整型变量,最大只能是32767阶乘的结果应该定义成长整型或实型,否则结果很容易溢出11变量未初始化或while语句前未做好准备工作
void main
{ int i,sum;
i=1;
whileiB. "A"C. ''a''D. ''\0''2. 是C语言提供的合法的数据类型关键字。A. floatB. Double C. integerD. Char3. 若t为double型变量,表达式t=1, t 5, t 1的值是。A. 1.0 B. 2.0C. 6.0 D. 7.04. 下面选项中,不是合法整型常量的是。A. 160 B. -1C. 0x48hD. 0x48a5. 在C语言中,要求参加运算的数必须是整数的运算符是。A. B. * C. %D. =6. 下列各组中不全是字符常量的是。A. ''2'', ''%'', ''\x43''B. ''x'', '''', ''0''C. ''4'', ''\t'', ''y''D. ''#'', ''\01'', ''K''7. 如x、y、m、n都是实型变量,与代数式x*ym*n不等价的C语言表达式是。A. x*ym*n B. x*ymn C. x*ym*nD. xm*n*y8. 在标准C中,为了计算阶乘,结果变量最好定义为。A. int B. unsigned intC. unsigned long D. unsigned short9. 设变量x为float型,m为int型,则能实现将x中的数值保留小数点后两位,第三位进行四舍五入运算的表达式是加0.5再取整是常用的整型变量四舍五入的方法。A. x=x*100.0 0.5100.0B. m=x*100 0.5,x=m100.0C. x=x*100 0.5100.0D. x=x100 0.5*100.010. 在以下一组运算符中,优先级最高的运算符是。
A. B. =C. %D. &&11. 在C语言中,下列表达式能正确表示a10或a0的是。A. a=10 or aB. a=10 | a=10 || aD. a=10 && aB. x%2!=0C. x2*2-x==0 D. ! x%213. 若有条件表达式exp?x: y--,则以下表达式中能完全等价于exp的是。A. exp==0B. exp!=1C. exp==1D. exp!=014. 下面程序的输出结果是。
#include
void main
{ int x, y, z;
x=y=1; z=x, y, y;
coutB. 2,3,3C. 2,3,2D. 1,1,115. 下面程序的运行结果为。
#include
void main
{ int i=0, sum=1;
do
{sum =i;
}whileiB. 16C. 17D. 18二、 运算题此题建议先书面做完后,再编程上机验证结果1. 若x、y为double型,x=1,则表达式y=x 32的值是。2. 设a=2,b=3,x=3.5,y=2.5,则floata b2 intx%inty为。3. 已知int a=12;,下列表达式运算后a的值各为多少?每个表达式分别独立,不相关。
a =a;
a-=2;
a*=2 3;
a=a a;
a%=a=2;
a =a-=a*=a;
4. 定义intm=5,n=3;,则表达式m=n 4的值是,表达式m=m=1,n=2,n-m的值是,表达式m =m-=m=1*n=2的值是。5. 设整型变量a=1,b=2,c=3,写出下列关系表达式的值。1 aa=c6. 设整型变量a=1,b=2,c=3,d=4,写出下列逻辑表达式的值。1 a && b && c 2 a || !b || !c 3 a || b && c || d 4 !a b c-1&& b c2 5 a !=11 && bb && y=cd后,x、y的值分别为。10. 若a、b均为int型变量,设a=1,b=2,若c=ab?a:b;,则c的值为。三、 判断题1. 在C程序中对用到的所有变量都必须指定其数据类型。2. 一个变量在内存中占据一定的存储单元。3. 一个实型变量的值肯定是精确的。4. 对几个变量在定义时赋初值可以写成: int a=b=c=3;。5. 自增运算符或自减运算符--既能用于变量,又能用于常量或表达式。6. 在C程序的表达式中,为了明确表达式的运算次序,常使用括号。7. %运算符要求运算数必须是整数。8. 已知int i, j;,则ij的结果一定是整型的。9. 在C语言程序中,逗号运算符的优先级最低。10. C语言不允许混合类型数据进行运算。四、 编程题1. 输入整数a和b,若a、b同为正数或负数时,输出二者之和,否则输出0。2. 输入一个字符,判断其是字母,还是其他字符。3. 用迭代法求x=a。求平方根的迭代公式为xn 1=12xn axn,要求前后两次求出的x的差的绝对值小于10-5。4. 求100以内的自然数中能被14整除的所有数之和。5. 编程实现从键盘读入任意三个数,并按从小到大的顺序打印出来。6. 编程求下列表达式的值: s=1 12 123 123n。运行程序,分别将n的值2、3、4从键盘输入,验证结果正确与否。7. 循环输入若干个字符,以$作为结束符,将其中小写字母转换为大写字母输出,其他字符不变输出。8. 求1000之内能够被13和17同时整除的数。9. 求一元二次方程ax2 bx c=0的实数根a、b、c从键盘输入,且a不等于0。10. 编写一个程序,输入一个三位整数,在窗口打印输出其个位数、十位数和百位数。
|
|