描述
开 本: 32开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302458531丛书名: 21世纪高等学校规划教材·计算机应用
全书直接采用C 的cin和cout进行输入输出,摒弃了C语言中的printf和scanf函数调用。在三部分内容之间两次集中讲解典型题和难题的解题思路,增加了相当篇幅的动态调试内容,非常有利于学习者上机实践以及有效地提高编程、调试能力。
本书适合作为高等学校非计算机专业学生C/C 程序设计教材,也可作为工程技术人员的自学和参考资料。
目录
第1章C/C 语言概述
1.1计算机组成
1.1.1计算机的硬件系统
1.1.2计算机的软件系统
1.2计算机语言及其执行方式
1.3C/C 语言的发展简史与重要性
1.3.1C/C 语言的发展简史
1.3.2C的优点
1.3.3C程序设计是非常重要的基本训练
1.4简单的C/C 程序示例
1.5在VC 6.0中实现C程序
1.5.1基本概念
1.5.2VC 6.0集成环境介绍
1.5.3C/C 单文件应用程序的实现过程
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.1if…else…语句
2.3.2if语句
2.4循环结构——三大结构之三
2.4.1while循环语句
2.4.2do…while循环语句
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 全国高校计算机水平考试迫切需要一本适合的教材,于是有了这本C/C 结合的书。本教材所有例题的输入和输出直接采用C 的cin和cout,摒弃了C语言中的printf和scanf函数调用。仍愿意使用printf和scanf函数的学习者也可以选用本书,将例题中的输入输出换回C语言的函数,也是一个很好的训练。本教材的特色之一在于面向现在的年轻人。众所周知,现在的90后学习者已经是“读图”一代了。他们对于传统教材的大段文字描述很不耐烦,故而本书从内容上加了阴影和警示,适时提出问题,版面上讲究编排,尽量将程序、运行结果和相关解释组织在一起,增加重点概念的图解,以便更好地帮助学习者理解C/C 程序设计。本教材的特色之二是章节的全新组织。前5章打破C语言教材按内容体系组织的传统,三大结构一起介绍,以“编程基础Ⅰ、Ⅱ”和“编程进阶”3章从简到难、循序渐进地增加学习难度,这样安排非常有利于尽早上机实践: 从第1章的学习开始就可以辅以上机练习,使计算机这个程序设计好的老师全程伴随学习者,发挥其的作用!对于后面繁难的内容,尽量系统化: 函数和类以三部曲的方式介绍; 指针部分以4个强大功能为线索串起来; 构造类型从数组引出结构体、共用体,进而引出类; 面向对象以三大特性为线索来组织,条理清晰,使学习者感受到知识的连贯性、系统性,更容易掌握这些比较烦琐的内容。教材的特色之三是增加了大量例题和解题思路,引导学生自己学会如何编程: 两次集中总结典型题目。次在三大结构讲完后的第5章增加了主要算法题目的总结; 第二次在函数之后专设了第8章,本着“授人以鱼不如授人以渔”的思想,将编程思想、逐步完善和单步调试形象地称为“三根鱼竿”,根鱼竿: 编程思想——顺杆“爬”,对一些感到无从下手的难题,如何去思考?第二根鱼竿: 大程序的逐步完善——犹如鱼竿一节节加长,逐步完善程序代码,以及化繁为简,逐步完成复杂题目的编程技巧; 第三根鱼竿: 程序单步调试——如盲者用竿儿步步试探,查找程序的逻辑错误和运行错误。这样对学习者的编程、上机、调试等各方面都有促进作用。教材还有另外两个特色。一个是强调动态调试,书中在第5章和第8章两处给出单步跟踪实例,有心的学习者可以模仿这些实例自己上机实践,自学动态调试; 另一个是在大多数章后将该章的常见错误列成表格,以便学习者仔细阅读并作为上机参考,可透彻理解各个知识点,很快成为编程高手。全书由张正明主编并编写第7、9章,第10~12章由卢晶琦编写,第1、6、8章由王丽娟编写,第2~5章由孟庆元编写。在本书成书的过程中,受到电子科技大学中山学院领导及清华大学出版社编辑们的大力支持,在此一并表示感谢。选用本书的教师可免费索取电子教案、所有例题代码及作业和模拟题的答案。如对本书有疑问和建议,可与编者联系,QQ: 704393383。希望本书能给注重实践的学习者以切实的帮助。由于编者水平有限,时间仓促,书中可能有不足之处,殷切盼望读者提出宝贵意见。编者2016年1月
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。VC 6.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)、0x3H(H不是有效的十六进制基数)。计算机内所有的信息都用0和1来表示,在表示数值时用二进制表示。二进制只有两个基数0和1,运算规则是逢二进一。由于二进制数位数太长,不易使用,习惯上用十进制、八进制或十六进制来表示。0~15这16个数的4种进制的对应关系如表33所示,不同的进制可表达同一大小的数值。阴影两列是4位二进制数与1位十六进制数的对应,可以理解为互换关系: 计算机内是二进制,编程时写成十六进制或其他进制,方便了人们的书写与阅读。
表334种进制对照表
十进制二进制十 六 进 制八 进 制
00000000100011012001020230011303401004045010150560110606701117078100081091001911101010A12111011B13121100C14131101D15141110E16151111F17
2) 实型常量实型常量就是平常所说的带小数点的常数,按其存储方式的不同分为单精度实型常量和双精度实型常量。单精度实数在内存中占4个字节,其数值范围是: 0及1.4×10-45≤|x|≤3.4×1038,当值小于1.4×10-45时按0对待,而大于3.4×1038时发生溢出错误。它的十进制有效位数多有7位。双精度实数在内存中占8个字节,取值范围是0及4.9×10-324≤|x|≤1.8×10308,范围大,精度高。它的十进制有效位数多有16位。一个实数的范围很大,但是它的有效数字位数是有限的,超过其有效位数时则不能精确表达,会带来一定误差。单、 双精度数在表示时都有小数形式和指数形式两种。(1) 小数形式。一个实数可以是正、负号开头,有若干位整数部分,后跟一个小数点,再有若干位小数部分,如123.456、-21.37,常数12用实数表示时必须写成12.或12.0。
(2) 指数形式。一个实数可以表示成a×10n形式,这个指数形式在C语言中就是aEn或aen,a称为尾数,n称为指数。尾数部分可以是整数形式或小数形式,指数部分是一个整数。例如,以下是合法的指数形式: 2.1E5(等于2.1×105)、3.7E-2(等于3.7×10-2)、0.5E7(等于0.5×107)、-2.8E-2(等于-2.8×10-2); 以下是不合法的指数形式: E7(E前无尾数)、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响铃(BEL)7\b退格(BS)8\f换页(FF)12
\n换行(LF)10\r回车(CR)13\t水平制表(HT)9\v垂直制表(VT)11\\反斜杠92\?问号字符63\’单引号字符39\”双引号字符34\0空字符(NULL)0\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和VC 6.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<cout<cout<
f1=0.6e-45; //f1比小的非零单精度数一半还小些,系统将它当做0
f2=0.8e-45; //f1比小的非零单精度数一半稍大些,系统将它当做小非零单精度数
f3=2.e 38;//f3设为接近单精度数值
f4=f3*2;//f4是f3的2倍,超过值,系统输出为正无穷大
cout<cout<cout<
d1=2.4e-324; //d1比小的非零双精度数一半还小些,系统将它当做0
d2=2.5e-324; //d2比小的非零双精度数一半稍大些,系统将它当做小非零双精度数
d3=-1.0e308; //d3设为接近双精度数小负值
d4=d3*2;//d4是d3的2倍,小于双精度小负值,系统输出为负无穷大
cout<cout<cout<
ch1=’a’; //ch1设为小写字母a
ch2=ch1 2;//ch2在ch1基础上2,变成小写字母c
c1=ch1;//将ch1送给c1,c1值为ch1的ASCII码值97
c2=ch2;//将ch2送给c2,c2值为ch2的ASCII码值99
cout<cout<cout<}
运行结果:
给出此例的另一个目的是要提醒大家,在编程时一定要知道每个数都是有精度和范围的,选择合适的类型,就可以得到正确的结果。比如f4是float型时会出错,如选择double型,出错的机会就小得多。3.3.3变量的初始化有时,程序中需要对一些变量预先设置初始值,C可以在定义变量的同时给变量设初值,称为初始化。初始化是在编译阶段完成的,程序中形式如下:
数据类型 变量名=常量表达式;
例如:
char ch=’a’;
intfirst=1, sum=0;
floatx=3.1415926/2;
以变量sum为例,在定义为整型变量的同时,将初值设为0,这是实际意义的,如前面的例29和例210等,因为累加和变量开始时应该等于0,犹如选举箱要先清空。变量不一定非要在定义变量时初始化,也可以在定义以后,在程序中再进行赋值,其区别如表36所示。
表36变量初始化与赋值语句的区别
变量的初始化变量的赋值
变量定义的同时完成赋值变量定义之后赋值不允许连续赋初值允许连续赋值
示例代码:
int a=b=c=5;//错误的初始化
int a=5,b=5,c=5; //正确的初始化
示例代码:
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) ,-,*,/与数学中的运算类似,先乘除后加减。改变运算顺序要加圆括号。除法运算符“/”在用于两个整型数运算时,其运算结果也是整数,余数总是被截掉,如1/2得到的不是0.5而是0; 1/3得到的也不是0.33333,而是0,至少有一边是实数或实型变量时,结果才是实数,如10.0/3,结果是实数3.33333,使用时要特别注意。(2) 求余运算符(取模运算符)“%”仅用于整型数据,不能用于实数。它的作用是取整数除法后的余数,余数的正负号与被除数一致。如,9%2的结果是1(如图32所示),3%(-8)的结果是3,-15%8的结果是-7。“/”和“%”两个运算符在整数处理程序中很有用,如判断某整数x的奇偶性可以用“x%2”判断; 取出某数x的个位用“x%10”,取出除个位以外的高位数可以用“x/10”,如图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;//先自加,再赋值cout<#include void main(){ int x, y; x=10; y=x ;//先赋值,再自加cout<运行结果: 运行结果:
【例33】“输出”即为“引用”。
//先自加,再输出#include void main(){ intx=10;cout<< x<void main(){ intx=10;cout<运行结果: 运行结果:
【例34】没有任何引用操作。
#include void main(){ intx=10; x; cout<void main(){ intx=10;x ;cout<运行结果: 运行结果:
例34中的“ x; ”或“x ; ”自成语句,执行过这个语句(过了分号),自加就都完成了,即 符号在前在后都一样了。自加1和自减1运算在一个语句或表达式中好只使用一次,不要连续使用。3.4.2关系运算符和逻辑运算符当比较两个数的大小关系时,需用到关系运算符; 当两个逻辑量进行与、或、非逻辑运算时,需要用到逻辑运算符。C语言的关系和逻辑运算符如表38所示。
表38关系和逻辑运算符
运算符作用运算对象个数优先级结 合 方 向
关系
>大于26>=大于等于26
==等于27!=不等于27自左向右
逻辑!逻辑非12自右向左&&逻辑与211自左向右||逻辑或212自左向右
说明: (1) 当关系运算符两边的值满足关系时结果为1,也称为真; 当关系不满足时,结果为0,称为假。例如:
x=10;
cout<=9);//”10>=9″成立,结果为1,输出1
字符比较按其ASCII码值进行,与字典顺序一致,如’A’>’B’为0(假)。小写字母的ASCII码比大写字母的大,所以’a’>’A’为1(真)。(2) ==是比较二者是否相等的符号,很容易与赋值号=混淆,要特别注意。例如,想表达如果x是否等于10,错写成while(x=10),不管x具体是多少,条件都为真,因为10赋给x后,x非0,为真,永远满足条件,可能造成死循环。正确的写法应该是while(x== 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的>、>=、y>z”的计算步骤如下: ①“ !x”,x=2参与逻辑运算,因其非0,当成逻辑真,取非,即为假,得0; ② “!x>y”即“0>3”,为假,结果是0; ③ “0>z”,即0再与z比较(0>4),后得出逻辑值为0(假)。写成“cout<y>z); ”,上机运行结果为0。3.4.3条件运算符条件运算符是的三目运算符,一般形式是:
表达式1 ?表达式2:表达式3
功能是: 先求表达式1的值,如果为真(非零),则求表达式2的值,并把它作为整个表达式的值,否则求表达式3的值,并把它作为整个表达式的值。例如,“x=10; y=x>9 ? 100:200; ”运行后y值为100。它可以看作是if…else…语句的简短形式,以上语句也可以写成
if (x>9)
y=100;
else
y=200;
有多个条件运算符时,自右至左结合,如“a>b?a:c>d?c:d”相当于“a>b?a:(c>d?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及指针等数据类型。位运算符有&(与)、|(或)、~(非)、^(异或)、>>(右移)、<&11011111
p7p60p4p3p2p1p0
就达到了p5位清零的目的了。例如,要检测变量p5位是否为1: sign=p&0x20(0x20的二进制表示是0010 0000),运算结果用竖式表示: p7p6p5p4p3p2p1p0
00100000
00p500000上例中,若sign的结果是0x20,则p5就是1,否则sign的结果为0,说明p5位是0。2. 按位或(OR)逻辑运算符“|”位或运算是对两个整数的二进制形式的对应位分别进行“或运算”,运算规则还是“见1为1,否则为0”,其结果还是一个多位二进制数。可用于指定某些位为1。如要使10011100的低4位全为1,只要取00001111和原数按位相或,p=p|0x0F,即得10011111,其他位不变。 3. 按位异或( XOR)逻辑运算符“^”位异或运算是对两个整数的二进制形式的对应位分别进行“异或运算”,运算规则是“相异为1,相同为0”,其结果还是一个多位二进制数。作用: (1) 使特定位反转,只要将该位与1异或即可。如要将10011101低两位都反转,只要取00000011与其按位异或,p=p^ 0x03,即得10011110。(2) 整个数清零,只要本身异或一次即可,如x为10011100,则x^x得000 0000。(3) 交换两个非浮点型变量的值,不用临时变量,“a=a^b; b=b^a; a=a^b; ”三条语句后,就完成了a、b值的交换,如a=3,b=4,则三条运算语句运行后a变成4,b变成3。4. 按位取反(NOT)逻辑运算符“~”这个运算符对数的每一位都取反。如若有“char cc=1;cc=~cc;”,则cc变成了1111 1110,而不是0。5. 左移运算符“<
整型表达式<
设有“char a=0x0F;”,则a的值为15,运行“a=a<<2;”后,a左移两位,变成00111100,即十进制数60。在正常值范围内,每左移一位相当于乘以2。 6. 右移运算符“>>”右移运算符“>>”使整型表达式值二进制形式中的每一位向右移动若干位,符号位不变,移出的位将丢失,数值位位以符号位填充。右移表达式的形式为:
整型表达式>>移位的位数
设有“char a=15;”,运行“a=a>>2;”后,即a右移两位,变为00000011,即十进制数3。在正常值范围内,每右移一位相当于除以2,取整数部分。左移和右移运算符还可以构成扩展赋值运算符“<<=”和“>>=”。其他运算符就不一一介绍了。各种运算符混合运算时,要特别注意它们的优先级,自然排列的优先级如表310所示,应记住大概次序: 括号,其次是单运算符目,然后是算术→关系→逻辑→条件→赋值→逗号。
表310运算符的功能、优先级、运算结合方向
优先级运算符结合规则
1[ ]( )->.从左至右2!~ —*&sizeof从右至左3*/%从左至右4 -从左至右5<<>>从左至右6<<=>>=从左至右7==!=从左至右8&从左至右9^从左至右10|从左至右11&&从左至右12||从左至右13? :从右至左14= =-=*=/=%=&=^=|=>>=<<=从右至左15,从左至右
3.5表达式
运算符、常量以及变量构成表达式,表达式是这些成分的有效组合。C语言的表达式非常丰富,也有人称C语言为表达式语言。在C语言中有算术表达式、关系表达式、逻辑表达式、条件表达式、逗号表达式、赋值表达式等。这里介绍前三种常用的表达式。1. 算术表达式算术表达式是由算术运算符、变量和常量等组成的,基本满足代数运算规则,如“a b* 2-d/3”。这类表达式要注意括号“( )”的使用,在运算对象和运算顺序容易混淆的情况下可以加括号“()”加以限定,其用法与数学中的一样。2. 关系表达式关系表达式由关系运算符、变量和常量等组成,其结果为0或者1。如“3>2”,结果为1。学习者常犯的错误是多项关系的连续表达,如想表示“x大于3并且小于6”,用数学关系式33)&&(x<6)。(2) 判断字符变量ch是否是数字的表达式是ch>=’0′ && ch <=’9’,其实质是ch>=48 && ch <=57,而不是ch>=0 && ch <=9。(3) 判断字符变量ch是否是英文字母的表达式应既包含“与”运算,又包含“或”运算,可以写成(ch>=’a’&&ch<=’z’)|| (ch>=’A’&&ch<=’Z’)。“&&”和“||”运算时,根据逻辑,计算机会“偷懒”,在从左到右的计算过程中,一旦能够确定表达式的值,就不再继续运算下去了。如有“x=0; y=1;”,计算表达式“x&&(x y)&&y; ”时,在计算机知道项x是0时,就已经知道其后的任何数与之相“与”的结果都是0,就根本不进行x y运算,更不再与y相与了; “或”的处理一样: “x||y||y |x ;”在知道第二项y是1后就得出结果1了,不再作后面的自加运算。下面几行程序的执行结果是什么?
intm=1,n=1,x,y;
x=–m && –n;//执行完本行后,m=? n=?x=?
y= m || n–; //执行完本行后,m=? n=? y=?
4. 混合运算当不同数据类型的常量和变量在表达式中混合使用时,每一步运算的数据都被自动转换成同一类型数据。在自动类型转换时采用向“大数”类型“靠拢”的原则,也就是转换成内存字节较多、数据范围较大的那个数据类型,因为结果的存储要满足所有类型的数据都得到正确的保存。举例如下:
inti=10,j;
floatx,y=3.5;
doubledx=2.5,dy;
j=i 10 ;//i是整型数,加10的结果还是整型的
dy= dx * y; //dx是double型,相乘后的结果仍然是double型的
x=1/2*40.5; //”1/2″都是int型运算,为int型值0,然后转换成double型
//和double型40.5相乘,结果为double型,再赋给float型x,x=0.0
x=40.5*1/2; // “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;”,则“(float)x/2”得到0.5,“(float)(x/2)”得到0.0。
3.6应用举例
【例35】输入三角形的三条边长,求三角形的面积。提示: (1) 利用海伦公式求面积: area=s(s-a)(s-b)(s-c),其中s=(a b c)/2。(2) 要判断a、b、c能否构成三角形(任意两边和要大于第三边)。(3) 求平方根可以调用系统提供的库函数sqrt(),文件开始加“include ”即可。
#include
#include//用到数学函数时一定要包含头文件math.h
void main()
{ float a,b,c,area,s;
cin>>a;
cin>>b;
cin>>c;
if(a<=0||b<=0||c<=0||a b<=c || a c<=b|| b c<=a)//判断a、b、c能否构成三角形
{ cout<}
else
{ s=(a b c)/2; //此处有多条语句, {}不可省略
area=sqrt(s*(s-a)*(s-b)*(s-c));
cout<}
}
运行结果:
此例具有经典意义的是对输入数据有效性的检查,这是应用系统开发必须考虑的,值得学习者模仿。此例变量可否都定义成整型变量?结果会怎样?【例36】鸡兔同笼问题,已知笼子里共有20个头、60只脚,编程求鸡、兔各多少只。分析: 本例可以按数学上传统思路,列线性方程,然后给出线性方程解的表达式,后代入系数,求出解。用计算机来求解,可以不用这种数学方法,而是利用计算机能够循环处理,穷尽所有可能性的长处,一一去试验,对所有可能的情况进行检验,找出后的答案。设i代表鸡的数量,则兔有20-i只,i小是0,是20。编程从i=0开始,逐一检验脚的数量是否满足要求,如果满足,则i和20-i就分别是鸡和兔的数量。
#include
void main()
{
int i=0;
while(i<=20)//i 代表鸡的数量
{if( 2*i 4*(20-i)==60) //判断脚的数量是否是60只
cout<
i ;
}
}
运行结果:
【例37】循环输入若干个字符,用$作为输入结束符,统计其中小写字母的个数。程序首先要循环输入字符,循环体内对输入的每个字符进行判断,满足条件的就计数,遇到$则不再处理,输出统计结果。请注意输出结果中$后面的已经不再处理,因为$是输入结束符。
#include
void main()
{ int n=0;
char cha;
do
{cin>>cha;//读入一个字符,送入变量cha
if(cha>=’a’&&cha<=’z’) //判断字符是否为小写字母
n ;
} while(cha!=’$’); //输入字符不是结束符时,继续循环
cout<< “输入字符中有 “<}
运行结果:
把例中do…while语句换成while语句是否可以?有什么问题?怎样解决?【例38】从键盘输入一个整数,判断能不能被5和7都整除,输出相应信息。程序首先设3个整型变量,分别表示输入整数i、i除以5的余数m和i除以7的余数n,然后根据m和n的情况判断i是否都能被5和7整除。
#include void main(){ int i,m,n;cin>>i;m=i%5;n=i%7;if(m==0 && n==0)cout<void main(){ int i,m,n;cin>>i;m=i%5;n=i%7;if(m || n)cout<
运行结果: 运行结果:
上面左右两个程序的功能是等价的,左边的更直观。还可以有多种写法,请读者自己多用几种方法实现。此例中的变量m和n可省去否?编程熟悉后在保证程序易读的前提下可酌情减少变量。
3.7本章知识要点和常见错误列表
(1) 本章主要介绍了C语言中的基本数据类型及常量、变量和表达式。在C语言的初学阶段,首先要掌握4种基本也是常用的数据类型: int、float、double和char。在熟悉了C编程的基本技巧之后,读者完全可以根据需要去使用各种类型的数据。(2) 标识符是C中所有名称的总称,一定要按规则取名。(3) C语言编程中有特定含义的32个关键字和12个保留字,不能再作为表示其他含义的标识符。(4) 常量是程序运行过程中其值固定不变的量,有数值常量(整数、实数)、字符常量和字符串常量三大类型。(5) 变量是程序运行过程中其值可变的量,常用的变量有整型(int)、单精度实型(float)、双精度实型(double)和字符型变量(char)。(6) 运算符及表达式是编程者实现编程要求的基本手段,读者要在充分掌握各类运算符的情况下,综合运用它们以达到自己的编程目的。本章常见错误列表如表311所示。
表311本章常见错误列表
序号常 见 错 误错 误 举 例分析
1不注意程序的书写格式除以“#”开头的预处理命令不是C语句外; C的每个单语句均以分号“; ”结束,否则会有“missing ;”错误提示将程序代码逐行输入计算机时,多使用Tab、Home、End键,模仿例题每行的语句认真输入,并注意各行之间的对齐方式,凡包含在内部的,一定要用缩进式2标识符不规范随意起名为111或aaa应该不与系统内保留字重名,并“见名知意”: 通常,整型变量用i、j、k、m、n等,实型变量用f、x、y,字符型变量用ch,字符串型常用str、string这些约定成俗的名字,初学者不宜乱改。另外,C中常用一个小写单词作标识符,如和用sum,平均值用average或ave,个数cnt或n; C 则用多个单词间以大写字母组成标识符,如curLen代表当前长度(current length),用maxLen代表长度,用maxStr代表长字符串等3定义变量数据类型的时候出错
float i,j; k;
l,m,n;
在同时定义多个变量的时候,中间要用“,”进行间隔。若是变量比较多,要换行,就必须重新定义,第二行也要有数据类型定义符4变量在使用之前没有定义
int m;
m=n 1;
这里n没有定义是不能够使用的,在编译的时候会有“undeclared identifier”的错误提示。
所有变量都要“先定义、后使用”5变量在使用之前没有赋值
int m,n;
m=n 1;
这里n有定义但是没有赋值,在编译的时候会提示警告,但不提示出错,运行结果会是一个不确定的数,比如-8589934586除号使用错误
float x
int m=5,n;
x=2/m 3/m 4/m;
这里的每一项都是0,如2/m的结果是0而不是0.4…,所以此语句执行之后,x为0。不是实际需要的结果。
一边有实数时,即2.0/m 3.0/m 4.0/m才能算出实际的实数结果赋给x7关系表达式写错
3C中不能如此表示,需借助于逻辑运算符x>3 && x<10。
这一点在if、while、do…while语句中尤其重要8在表达式中的表达方式不能够达到自己想要的结果
x1=-b sqrt(dlt)/(2*a);
或
x1=-b sqrt(dlt)/2*a;
正确的表达式应该是
x1=(-b sqrt(dlt))/(2*a);
要正确使用括号“( )”续表
序号常 见 错 误错 误 举 例分析
9if语句条件不正确if(score=100) n ;
本意是想统计得100分的同学的个数
if (score>60)
cout<else
cout<错用赋值号“=”代替了相等比较号“==”。编译系统不会“错想”,它忠实地将100先赋给score,然后判断它不是0,就执行其后的n ,不管原来的score是多少,都被冲掉了,并使n值加了1,这是学习者常犯的错误
条件应该写成if (score>=60)
否则60分的同学就被统计成不及格的了10不注意数据类型的值域比如求阶乘,若阶乘结果定义为短整型变量,只能是32767阶乘的结果应该定义成长整型或实型,否则结果很容易溢出11变量未初始化或while语句前未做好准备工作
void main()
{ int i,sum;
i=1;
while(i<=3)
{ sum=sum i;
i ;
}
…
}
这是初学者易犯的错,结果出错,不是6,原因是和变量sum忘记初始化了,犹如选票箱在选举前未清空,即求和时的基数是内存中的随机数,所以结果可能是一个不确定的数,如-858993460
习题
一、 选择题1. 合法的可显示字符常量是()。
A. ‘\t’ B. “A” C. ‘a’ D. ‘\0’2. ()是C语言提供的合法的数据类型关键字。A. float B. Double C. integer D. Char3. 若t为double型变量,表达式(t=1, t 5, t 1)的值是()。A. 1.0 B. 2.0 C. 6.0 D. 7.04. 下面选项中,不是合法整型常量的是()。A. 160 B. -1 C. 0x48h D. 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*y)/(m*n)不等价的C语言表达式是()。A. x*y/m*n B. x*y/m/n C. x*y/(m*n) D. x/(m*n)*y8. 在标准C中,为了计算阶乘,结果变量好定义为()。A. int B. unsigned int C. unsigned long D. unsigned short9. 设变量x为float型,m为int型,则能实现将x中的数值保留小数点后两位,第三位进行四舍五入运算的表达式是()(加0.5再取整是常用的整型变量四舍五入的方法)。A. x=(x*100.0 0.5)/100.0 B. m=x*100 0.5,x=m/100.0C. x=x*100 0.5/100.0 D. x=(x/100 0.5)*100.010. 在以下一组运算符中,优先级的运算符是()。
A. <= B. = C. % D. &&11. 在C语言中,下列表达式能正确表示a≥10或a≤0的是()。A. a>=10 or a<=0 B. a>=10 | a<=0 C. a>=10 || a<=0 D. a>=10 && a<=012. 下列表达式中,x为整型,不满足“当x的值为偶数时值为真,为奇数时值为假”要求的是()。A. x%2==0 B. x%2!=0C. (x/2*2-x)==0 D. !( x%2)13. 若有条件表达式(exp)?x : y–,则以下表达式中能完全等价于(exp)的是()。A. (exp==0) B. (exp!=1) C. (exp==1) D. (exp!=0)14. 下面程序的输出结果是()。
#include
void main()
{ int x, y, z;
x=y=1; z=x , y , y;
cout<}
A. 2,3,1 B. 2,3,3 C. 2,3,2 D. 1,1,115. 下面程序的运行结果为()。
#include
void main()
{ int i=0, sum=1;
do
{sum =i ;
}while(i<6);
cout<}
A. 15 B. 16 C. 17 D. 18二、 运算题(此题建议先书面做完后,再编程上机验证结果)1. 若x、y为double型,x=1,则表达式y=x 3/2的值是。2. 设a=2,b=3,x=3.5,y=2.5,则(float)(a b)/2 (int)x%(int)y为。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) (a(a=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 c/2) (5) a !=11 && b<47. 设整型变量x=y=z=-1,则执行逻辑表达式 x || y && z后,x、y、z的值分别为。8. 设整型变量x=y=z=1,执行逻辑表达式 x && y– || z后,x、y、z的值分别为。9. 设整型变量a=1,b=2,c=3,d=4,x=1,y=1,则执行逻辑表达式(x=a>b) && (y=c>d)后,x、y的值分别为。10. 若a、b均为int型变量,设a=1,b=2,若c=a>b?a:b;,则c的值为。三、 判断题1. 在C程序中对用到的所有变量都必须指定其数据类型。()2. 一个变量在内存中占据一定的存储单元。()3. 一个实型变量的值肯定是精确的。()4. 对几个变量在定义时赋初值可以写成: int a=b=c=3;。()5. 自增运算符( )或自减运算符(–)既能用于变量,又能用于常量或表达式。()6. 在C程序的表达式中,为了明确表达式的运算次序,常使用括号“()”。()7. %运算符要求运算数必须是整数。()8. 已知int i, j;,则i/j的结果一定是整型的。()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 1×2 1×2×3 … 1×2×3×…×n。(运行程序,分别将n的值2、3、4从键盘输入,验证结果正确与否)。7. 循环输入若干个字符,以$作为结束符,将其中小写字母转换为大写字母输出,其他字符不变输出。8. 求1000之内能够被13和17同时整除的数。9. 求一元二次方程ax2 bx c=0的实数根(a、b、c从键盘输入,且a不等于0)。10. 编写一个程序,输入一个三位整数,在窗口打印输出其个位数、十位数和百位数。
评论
还没有评论。