C语言程序设计PPT全套教学完整课件_第1页
C语言程序设计PPT全套教学完整课件_第2页
C语言程序设计PPT全套教学完整课件_第3页
C语言程序设计PPT全套教学完整课件_第4页
C语言程序设计PPT全套教学完整课件_第5页
已阅读5页,还剩347页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计目

录第一章

概述1.1 历史背景1.2 C语言的特点1.3 简单的C程序1.4 C语言字符集、标识符与关键字1.5 C程序的开发环境第二章

算法2.1 概念2.2 表示算法2.3 结构化的程序设计目

录第三章

基本数据类型3.1 常量3.2 变量3.3 变量赋初值3.4 运算符与表达式3.5 不同类型数据间的混合运算第四章

顺序结构程序设计4.1 C语句结构4.2 赋值语句4.3 数据的输入与输出4.4 综合训练目

录第五章

选择结构程序设计5.1 关系运算符和关系表达式5.2 逻辑运算符和逻辑表达式5.3 if语句5.4 switch语句5.5 程序举例第六章

循环控制6.1 概述6.2 goto语句以及用goto语句构成循环6.3 while语句6.4 do-while语句6.5 for语句6.6 循环的嵌套6.7 几种循环的比较6.8 break和continue语句6.9 程序举例目

录第七章

数组7.1 一维数组7.2 二维数组和多维数组7.3 字符数组7.4 数组程序举例第八章

指针8.1 指针的概念8.2 指针变量8.3 指针与数组8.4 指针与字符串8.5 指针与函数8.6 指向指针的指针8.7 综合应用目

录第九章

函数9.1 函数定义9.2 函数的返回值9.3 函数参数9.4 函数调用9.5 函数声明9.6 函数的嵌套调用9.7 函数的递归调用9.8 数组作函数参数9.9 变量的作用域9.10 变量的存储类型第十章

编译预处理10.1 宏定义10.2 文件包含10.3 条件编译命令#ifdef和#ifndef目

录第十一章

位运算11.1 位运算概述11.2 按位与运算11.3 按位或运算11.4 按位取反运算11.5 按位异或运算11.6 按位左移运算11.7 按位右移运算11.8 复合位运算符11.9 位运算的综合应用第十二章

结构体与共用体12.1 概述12.2 定义结构类型变量的方法12.3 结构体变量的引用12.4 结构体变量的初始化12.5 结构体数组12.6 指向结构体类型数据的指针12.7 用指针处理链表12.8 共用体12.9 枚举类型12.10 类型定义符typedef目

录第十三章

文件的操作13.1 C语言中的文件13.2 文件的打开与关闭13.3 文件的读/写13.4 文件的定位函数13.5 文件检测13.6 综合实例第一章

概述1.1 历史背景1.2 C语言的特点1.3 简单的C程序1.4 C语言字符集、标识符与关键字1.5 C程序的开发环境1.1 概述

世界上第一台计算机诞生于1946年的美国,随着时间的推移,计算机的应用从国防和科学计算,发展到日常家庭生活。计算机的英文computer,是由动词compute(计算)加上er后缀得到的,指用于计算的机器。众所周知,计算机所能识别并采用的是机器语言,也就是二进制语言,由0和1组成,如果要求计算机做某些计算,就需要用二进制语言来编写一系列的指令,然后输入计算机,计算机根据这些指令序列进行特定的计算和判断。最早期的计算机语言,常常为了完成一个极其简单的任务或者计算,不得不编写一大串的指令,这项工作无论对编程者还是读程序的人来说,都是一件极其不容易的事情。虽然后面也出现了一些其他的计算机语言,如汇编语言,但是相对来说,其过程还是繁琐的,无法满足人们日益增长的程序开发的需要。为了加快程序开发的进程,人们逐渐设计出一些可以由一条语句就能够完成一个特定任务的高级语言,如C语言、C++、Java等。在这些语言中,C语言可以说是功能最强大、使用最广泛的语言之一。

现在的计算机能够以比人类快几百万甚至几十亿倍的速度来进行计算和逻辑上的判断,这一点是如何实现的呢?事实上,计算机在进行庞大的数据处理时,就是在一系列的指令集下按照程序设计的流程来进行一些列的操作,这些指令的集合,就称之为计算机程序,也就是计算机语言。计算机是由计算机程序来控制的,而人则负责编写这些计算机程序,从而使得计算机最终按照人的意思进行一系列的数据处理和分析判断。C语言是一门计算机语言,更是一个关于程序设计的方法的集合。 在了解C语言之前,我们先来了解一下它的历史。C语言并不是突兀地诞生的,它是从B语言演化而来的,而B语言则起源于BCPL语言。B语言是KenThompson在模拟并且继承了BCPL语言的诸多特点的基础上,经过了进一步的简化,从而开发出来的。B语言诞生之后,它过于简单,所以在应用过程中,它在很多方面的功能受到了限制。1.1 概述

在1972到1973年间,贝尔实验室的DennisRitchie将B语言进行了进一步的优化,从而设计出C语言,C语言的命名取自BCPL的第二个字母。1978年,BrianKernighan和DennisRitchie出版了《TheCProgrammingLanguage》,此书被认定为C语言的非正式的标准说明,从此开始,贝尔实验室正式发布了C语言。后来到了20世纪七八十年代,大型主机和小型微机都广泛地应用了C语言,从而也衍生了不同版本的C语言。1983年,美国国家标准局(ANSI,AmericanNationalStandardsInstitute)成立了一个委员会,专门来制定C语言的标准。后来,随着C语言的发展和越来越广泛的应用,C语言标准也经过了多次的修订和增补,至2011年12月8日,ISO正式公布C语言新的国际标准草案:ISO/IEC9899:2011,即C11。简而言之,C语言从诞生到现在,取得了举世瞩目的成就。C语言不仅仅保留了B语言的很多优点,又克服了B语言过于简单的缺点,增加了数据类型以及其他一些强大的功能,并且采用了结构化的程序设计思想,使得它的结构极其严谨,从而便于把由C语言编写的程序移植到大多数计算机上,因此得到了全世界的认可和欢迎,C语言也因此成为世界上应用最广泛的几种计算机语言之一。

虽然人们此后在C语言的基础上又开发出了C++、Java以及C# 语言等,但是C语言是它们的基础。计算机语言的发展如同一棵大树的成长过程,机器语言、汇编语言是计算机语言的根,C语言是大树的躯干,而其他的高级语言则如同大树的枝叶,只有掌握了基础和躯干,才能以不变应万变,立于不败之地。 我们可以先简单了解一下由C语言衍生出来的几个主要的程序语言。 C++:C++ 语言与C语言有着很深的渊源,C++ 语言基本兼容了C语言的全部语法,当今所流行的C++ 编译器都可以编译C语言,以至于C++ 语言被误认为是C语言的升级版。但是事实上,C++ 语言采用面向对象的程序设计思想,而C语言采用的是结构化的程序设计思想,二者程序设计的思维方式是完全不同的。C++ 里面的“++”表示“ObjectOriented”(面向对象)。通俗的说法是,C语言更贴近低级语言,而C++ 则更符合人类语言的表达习惯。1.1 概述

Java:Java语言诞生于1995年,是由Sun公司开发出来的,纯面向对象、与平台无关且易学易用。它全面照搬了C++ 的语法,并且去掉C++ 里面不常用和不成功的部分,做到化繁为简,从而获得越来越多用户的支持。

C#:C# 语言是由微软公司于2000年推出的,完全照搬了C/C++ 的语法特点,同时又吸收了Java的成功之处,从而变成了一个似Java非Java,在某些地方又胜于Java的语言。

在程序语言的世界里,C/C++、Java、C#呈三足鼎立之势,并且都在不断完善、不断发展且极力排它,以至于其他语言只能在其专属领域里发展。C语言是一种高级语言,但是它同时还具备了一些低级语言的特点,也有人戏称C语言为“中级语言”。作为一种比较广泛流行的热门语言,C语言有着其不可忽视的优点和特点。通过本书的学习,读者将了解到C语言的特性,并且能够读懂并且编译一些简单的C程序,为以后程序语言的学习打下良好的基础。1.2 C语言的特点

C语言能够得到如此广泛的应用,必然是有着其他程序语言所不可比拟的优点。C语言的主要特点如下:

(1)表达方式灵活。它只规定了32个关键字和9种控制语句,C语言所使用的9种流程控制语句,每一种都可以完成一个特定的任务,并且书写的形式也相对自由。对于编写程序和读程序的人来说,都显得简洁明快,一目了然。

(2)数据类型丰富。与机器语言相比,C语言增加了数据类型,定义了整型、实型、字符型等数据类型,又引入了指针的概念。这些特点足以实现各种复杂的数据运算和逻辑判断,使程序的运行效率更高。

(3)运算符丰富。C语言不仅仅采用了数学里面常用的加减乘除等运算符,还把括号、问号、逗号等符号引用到运算符里面去,从而扩大了其运算的类型,也使得各种运算符和各种数据类型组成的表达式呈现多样化,可以实现难度较大的运算。这是其他的高级语言不可比拟的。

(4)结构化的语言。结构化的语言的特点在于代码及数据的分隔化,也就是说,程序的各个部分除了必要的数据交流外,彼此之间是相互独立的。因为C程序语言把函数作为其基础单元,每个函数都可以进行单独的设计,也就是实现了程序的模块化设计,这样使得编程更自由灵活,同时程序的层次也更清晰,便于使用、维护和调试。 (5)可移植性好。因为C语言可以实现汇编的一些优点,也就是能够对硬件进行操作,例如,C语言可以对位、字节和地址进行操作,这是低级语言的特点;同时其可以编写系统软件,又可用来开发应用软件,已成为一种通用的程序设计语言;同时C语言适合于多种操作系统,如Windows、DOS、UNIX等,支持多种显示屏和驱动器。这些显著的优点,使得它的适用范围远远超过了其他语言。1.2 C语言的特点

(6)语法限制不太严格。程序设计的自由度是由语法限制来决定的,如果语法限制得太严格了,那么自由度就小了,也就失去了灵活性,但是如果完全强调灵活,那么程序则变得毫无章法,没有了意义。C语言的语法限制相对宽松,如对整型量与字符型数据及逻辑型数据可以通用等,就是给了程序员相对较大的自由度,由程序员在编写的时候自己控制,但是对程序员的熟练度的要求就更高了。

(7)生成目标代码高。与汇编语言相比,C语言描述问题的工作量小并且可读性高,更易于调试、修改和移植,所生成的代码质量却与汇编语言相当。一般情况下,C语言只比汇编语言生成的目标代码低10%~20%。也就是处理同样的问题,C语言更简洁易行一些。

C语言的缺点主要表现在数据的封装性上,这是C语言数据安全性上所存在的最大的缺陷。同时由于C语言的运算法过于丰富,从而造成优先级太多;以及C语言的语法限制不太严格,书写过于自由,可读性下降;还有对变量的类型约束也不严格,从而影响了程序的安全性。此外,C语言对算法正确与否和数组下标越界都不做检查等,使得C语言在编辑、编译和运行中产生了一些不必要的错误。从应用的角度来看,C语言确实比其他的高级语言更难掌握一些。因此,对C语言的运用者来说,C语言的这些特点也就是要求他们对程序设计更加熟练一些。1.3 简单的C程序

下面介绍两个简单的C程序,然后了解一下C语言的特点。

【例1-1】一个只包含输出语句的小程序。

#include<stdio.h> /* 预处理命令 */

main() /* 主函数 */

{

printf("O.K!\n"); /* 输出语句 */

}

程序运行结果如图1.1所示。

这是一个完整的C程序。 第一行是预处理命令 #include,用来调用函数库里面的标准函数。C语言中不存在输入/输出语句,若要用到输入/输出,就需要预先调用C语言函数库里的输入/输出库函数,stdio是标准输入/输出(standardinput&output)的英文缩写,后面的 .h是head的缩写,.h是头文件的扩展名。 第二行是主函数main。在C程序中,至少有一个main 函数,main 函数中包含一个小括号。 第三行至第五行是函数体,由大花括号 {} 括起来,函数体里只有一个输出语句,由printf()函数和分号组成。printf()就是预处理命令所调用的输入/输出库函数里面的输出函数;而C语言的每一个语句都以分号作为语句的结束,这条语句的作用就是输出printf() 的小括号里面的引号里的内容。在引号里面,还有一个“\n”,它是一个换行符,意义就是在输出O.K!之后回车换行。图1.1例1-1运行结果1.3 简单的C程序

【例1-2】求两个数之差的绝对值。

#include<stdio.h> /* 预处理命令 */

main()

{

intx,y,z;

scanf("%d,%d",&x,&y); /* 输入函数语句 */

z=tbs(x-y); /* 计算x - y的值并取绝对值后赋给变量z */

printf("z=%d\n",z); /* 输出函数语句 */

}

inttbs(inta) /* 变量声明 */

{

intb;

if(a>=0)b=a;

elseb=-a;

return(b);

}

例1-2的C程序包含了两个函数:一个主函数main(),一个自定义函数tbs() 。tbs() 函数的意义是对数值进行取绝对值运算。 程序的前两行是预处理命令,调用标准输入/输出库函数。1.3 简单的C程序

第三行是主函数main() 函数。

第四行定义了三个整型变量:x,y,z。

第五行是输入函数语句,输入函数scanf() 的作用是要求以十进制整数的形式给变量x和y赋值,也就是从键盘输入两个整数分别送到变量x和y的存储单元中去。“&”是取地址运算符,它的作用是得到变量x和y的存储单元的首地址,这些知识点我们会在以后的章节里陆续学到。

第六行是调用tbs() 函数,在调用时,将 (x - y) 的值传给tbs() 函数里的形式参量a,经过执行tbs() 函数,得到一个返回值,最终赋给变量z。

第七行是输出程序运行的结果,printf() 中引号内的普通字符“z=”原样输出,“%d”是要求在输出z的值时以十进制整数的形式输出。

第八行至第十三行是tbs() 函数的具体内容。

下面来看一下程序运行的情况:

3,5↙(输入3,5,按回车读入,分别赋给x,y)

程序运行结果如图1.2所示。图1.2例1-2运行结果1.3 简单的C程序

例1-2程序比例1-1程序复杂了一点,用到了数据类型中的整型变量、实际参数、形式参数等,这些内容将在以后的章节中详细讲解,我们就不再做进一步的解释了。通过这两个例子,读者应该对C语言程序的组成和形式有了一个初步的认识。下面我们总结一下C语言程序的基本结构。

(1) C源程序中包含头文件。头文件可以是对程序中所用变量的说明,也可以是引用的库函数。我们统一称之为预处理命令;如上面两个例子中的所用的include命令。除此之外,头文件还有可能包含ifdef命令、define命令等。预处理命令一般放在源文件或者源程序的最前面。

(2) C程序是由函数构成的。每一个C语言源程序可以由一个或多个源文件组成,而每一个源文件则由一个或者多个函数组成。但是不管一个源程序由多少个文件组成,这个源程序里面有且只有一个main() 函数,即主函数。而C程序总是从main() 函数开始整个程序的执行,并且终止于主函数main(),与主函数main() 所在程序中的位置无关。除了main()函数之外,C程序还可以包含零个到多个用户自定义的函数,但是main() 函数有且只有一个。函数是C语言的最基本的组织结构单元。 (3)函数由两部分组成。每一个函数都是由两部分组成的,即函数的首部和函数体。在例1-2里,inttbs(inta) 就是函数的首部,它包含了函数名(tbs())、函数类型(int)、函数参数名(a)、函数参数类型(int),这些都是对函数的返回值类型、函数名及参数类型的定义和说明。当然,函数也可以没有形式参数,但是函数名后面的小括号是不能省略的(如main()函数)。函数体指的是紧跟在函数首部下面的最外层的大花括号里面的内容。函数体还可以分成两部分:变量的定义和执行语句。在例1-2里面,main()函数的函数体是从第四行到第八行的部分,由一个大花括号括起来。在这个函数体里面:第一行是变量的声明语句,后面三行则可以统称为执行语句。1.3 简单的C程序

变量的声明是对函数中所要使用的变量进行数据类型的定义,在这个例子里面,是将变量x与y定义为整型数据。而执行语句则是函数算法的体现,也就是函数要实行的“动作”的描述,这也是这个程序的意义所在。

除此之外,还有几点需要特别注意的书写规则:

(1) C语言的每一个语句都是由表达式加上分号构成。只有表达式而无分号,则不是一条语句,分号是一条语句的结束标志。但是在预处理命令、函数头和大花括号“}”之后不能加分号。(结构体、联合体、枚举型的声明的大花括号“}”之后要加“;”。)

(2) C语言的书写是比较自由的。可以一个语句写一行,也可以多条语句写在一行,甚至还可以将一条语句写成多行(在流程控制语句中体现),且不需要加任何标识符。但是为了程序的可读性和可执行性,建议读者养成一行内只写一条语句的习惯,这样比较规范,也便于阅读和纠错。

(3)标识符、关键字之间一般加一个空格以示间隔。如果已经有了明显的间隔符,则也可以不加空格。

(4)每一行都对应相应的注释部分。注释部分放在 /*……*/ 内,可以用自然语言来书写,一行写不完,可以写到下一行。注释部分是为了提高程序的可读性,便于程序员检查和纠错。

(5)低层次的语句最好比高层次的语句缩进若干格后书写,这样看起来结构更加清晰,也增加了程序的可读性,同时方便程序员在编译中纠错。

通过上面的例子,我们简单地了解了C程序的基本结构和C程序的组成单元函数,同时还有一些书写方面的特征,这些仅仅是C程序的入门知识,在以后的章节里面我们还将具体到每个细节,更详细地介绍其相关要点。1.4 C语言字符集、标识符与关键字1.4.1 C语言字符集 C程序作为一种计算机语言,必定有其所使用的固定字符,并且所使用的字符还会受到硬件设备的限制。要编写一个能够在计算机上运行的C程序,就只能使用符合C语言规定的合法的字符。C语言所使用的基本字符可分为六大类:运算符、分隔符、常量、注释符、标识符、关键字等。组成基本字符的字符集包括英文字母(大小写字母共52个)、阿拉伯数字(0~9)及其他一些特殊符号(下划线等)。特殊符号如下所示: +-*/%++——

>=

<=

==!= !||&&,?:;.\ ()[]{}&′″∧

~∣<<

>>1.4 C语言字符集、标识符与关键字1.4.2 C语言标识符与关键字1.标识符 C语言中的标识符是指用来表示函数、类型以及变量的名称的字符,是编程者自己为函数、类型、变量所起的名称,一般由数字、字母和下划线组成,并且开头必须是字母或者下划线,后面可以跟若干个(或者0个)字母、数字和下划线。 由于在C语言里面,大小写是有区别的,所以在定义标识符时,大小写不同的则是不同的标识符,如SUM与sum是两个不同的标识符。并且在定义标识符时,每个标识符最好有相应的意义,以便读者可以“顾名思义”,从而增加程序的可读性。还有需要注意的一点是标识符的长度,虽然标准C不限制标识符的长度,但是由于存在各种版本的C语言编译系统的限制,标识符一般不要超过8个字符。所以在定义标识符时,标识符的字符个数不要取得太长,以免出现不必要的错误。 下面给出一些合法的标识符: AB13EF_3XY4__DC6 下面是一些不合法的标识符: 4CGB.C.Jon#A73if1.4 C语言字符集、标识符与关键字 第一个不合法的标识符是以数字开头的,这不符合标识符的命名规则,同样的道理,第二个运用了“.”这个符号,第三个则用到了“#”,这些都不属于标识符命名所能采用的符号,因为标识符命名只限定是字母、数字和下划线,其他的特殊符号一概不能用到标识符里面去。最后一个是关键字,关键字是不能重新命名为标识符的,原因在下面会讲解的比较清楚。2.关键字 关键字是C语言中已经规定了有其特殊意义的标识符,不允许用户再进行自定义使用。也就是说,用户只可以根据规定使用,而不可以使用其作为函数名或变量名。关键字都采用小写字母。C语言中有32个关键字,如下所示: ifelsefordowhilegotointlongshortcharautobreakconst continuedefaultcasedoubleenumexternfloatregisterreturnsigned sizeofstaticstructswitchtypedefunionunsignedvolatile1.5 C程序的开发环境 当一个C程序写好之后,就要将其放到编译系统里面进行编辑(输入)、编译和连接,只有在完成了上面一系列步骤之后,一个C程序才变成一个可执行的程序,然后在计算机上运行,从而得到结果。C语言程序的上机过程如图1.3所示。 当前有很多种编译系统可以对C语言程序进行编译,本书着重介绍VisualC++6.0语言集成环境,读者可以了解C语言程序在此环境下是如何进行编辑、编译、连接和运行的。同时还将简单地介绍一下TurBoC2.0集成环境,它是DOS环境下的一款C语言集成环境,作为了解即可。图1.3C语言的上机过程1.5 C程序的开发环境1.5.1 VisualC++6.0简介 VisualC++6.0,简称VC或VC6.0,是微软推出的一款将高级语言翻译为机器语言的,并且是针对C++ 面向对象程序设计语言的开发环境。由于C++ 语言是在C语言的基础上扩展而成的,所以C语言也能在VC6.0上运行。VC6.0不仅仅是一个C++ 编译器,而且是一个基于Windows操作系统的可视化集成开发环境。VC6.0是一个功能强大的可视化软件开发工具,以其拥有“语法高亮”、自动编译功能和高级除错功能而著称。在VC6.0上对C程序进行编辑和编译时,由于它允许用户进行远程调试、单步执行,并且允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序,再加上其编译及创建预编译头文件、最小重建功能及累加连接等特点,从而大大缩短了程序编辑、编译及连接所花费的时间,使其成为专业程序员软件开发的首选工具。1.启动VC6.0 单击“开始 | 程序 | MicrosoftVisualstudio |MicrosoftVisualC++6.0”,启动VC6.0,在电脑屏幕上将显示如图1.4所示的窗口。图1.4VC6.0窗口1.5 C程序的开发环境 在此窗口的上面,我们可以看到有菜单项,单击每一个菜单项,都有相应的下拉菜单,在下拉菜单里面可以执行相应的操作。如在图1.5和图1.6所示的File的下拉菜单中,如果要新建一个源程序,就可以选择New选项来新建源文件。图1.5菜单栏图1.6新建源文件窗口1.5 C程序的开发环境2.新建C源程序

单击VC6.0窗口上的“文件 | New”命令,弹出“New”对话框,如图1.7所示。单击对话框中的“Files”选项卡,单击“C++SourceFile”,然后单击“OK”按钮,就进入了编辑窗口,输入源程序,这时候源程序名及路径都是系统给的默认值。 如果想要事先设定文件名及保存路径,可以在单击“C++SourceFile”后,在“New”的对话框右边的文件小方框内给源程序命名为“名字.c”。在位置小方框处,可以选择设置此源程序的路径,然后单击“OK”按钮即可,如图1.8所示。图1.7系统默认的程序名 图1.8新程序命名路径1.5 C程序的开发环境3.保存程序

如果在新建源程序时,没有设定其路径,那么源程序就保存在VC6.0设定的默认目录下。如果在输入源程序同时设定了源程序的名字和存放的路径,也就是在位置小方框处设定了保存的路径,那么源程序就保存在设定的路径下,如图1.9所示。4.执行程序

要执行一个C源程序,首先应当将其生成可执行文件。执行“Compile | Build”命令,也可以使用功能键F7,然后在弹出的对话框里单击“OK”按钮,即完成了此C源程序的编译。此时在VisualC++ 中会生成一个与源文件同名的工作区,如果源程序没有错误,则工作区的显示如图1.10所示。图1.9新程序保存路径 图1.10程序编辑工作区1.5 C程序的开发环境

如果源程序有错误,则工作区的显示如图1.11所示。 双击某行出错信息,系统会在程序窗口中指出出错的位置,用户可以根据此信息分别进行纠正。 如图1.12显示的程序出错提示是:在printf()输出语句后面少了一个“;”。 如果编译连接正确,即执行“Compile | Run”命令,运行此程序,并得到运行结果,如图1.13所示。图1.11程序窗口显示的错误数图1.12程序窗口显示的出错信息图1.13图1.10运行结果1.5 C程序的开发环境

除此之外,VC6.0还提供了一组工具按钮,如图1.14所示,用户可以利用这些按钮快捷地执行程序。

除了工具按钮,还有一些快捷键,如表1-1所示。图1.14工具按钮Ctrl

+

NNew新建工程Ctrl

+

U将选定区域转换成小写Ctrl

+

OOpen打开文件Ctrl

+ Shift

+

U将选定区域转换成大写Alt

+

F3/Ctrl

+

F弹出查找对话框Alt

+

F8自动格式重排F3查找下一个F7Build(编译并连接成exe文件)Shift

+

F3查找上一个Ctrl

+

F7Compile(编译)Ctrl

+

F3向下查找下一个Ctrl

+

F5编译 + 连接 + 运行Ctrl

+ Shift

+

F3查找上一个Ctrl

+ Shift

+

F5重新运行程序Ctrl

+

E寻找下一半括弧Ctrl

+

Break停止编译F4寻找下一个错误/警告F5顺序执行Shift

+

F4寻找上一个错误/警告Shift

+

F5停止调试Ctrl

+

T显示变量类型F10顺序执行,不进入循环或函数Ctrl

+ Shift

+

Space显示函数参数F11顺序执行,进入循环或函数F9在当前行插入/去掉断点Ctrl

+

F9应用断点表1-1常用的快捷键1.5 C程序的开发环境5.退出VC6.0

程序运行完毕,点击VC6.0窗口上的关闭键即可关闭VC6.0。如果程序进入死循环,无法通过关闭键关闭VC6.0,则可以将鼠标放在屏幕下方的蓝色任务窗上,单击鼠标右键启动任务管理器,单击任务管理器窗口中的“应用”,将运行的VC6.0结束任务即可。6.注意事项

在VC6.0上进行C源程序的建立和调试的过程中,还有几点需要注意:

(1)当一个程序编译连接后,VC6.0会自动生成相应的工作区,以完成程序的运行和调试。如果想要执行下一个C源程序,则需要先关掉前一个程序的工作区,然后通过新的编译和连接,从而执行第2个C源程序,否则VC6.0将一直运行前一个程序。

(2)在新建C源程序时,给C源程序命名必须将文件的扩展名命名为“.C”,如果不指定其扩展名为“.C”,则VC6.0将会把扩展名命名为“.CPP”,也就是将文件作为C++ 源程序保存。

(3)当一个C源程序编译后,如果出现致命性错误,单击某行出错信息找不到错误所在,则有可能错误在出错行的上面几行,可以按照从下往上的顺序依次检查和纠错。

(4)在上机运行过程中,有时候程序会进入死循环,这时就需要打开任务管理器关闭VC6.0中进入死循环的上一个程序,然后新程序才能够正常运行,并得到结果。1.5 C程序的开发环境1.5.2 TurBoC2.0集成环境 TurBoC2.0是美国Borland公司于1988年推出的一个C语言集成环境,它具有功能强大的交互式全屏幕文本编译程序,并且易学易用,操作全自动,支持六种存储模式,提供常规命令行版本,是在微机上广泛使用的一个编译程序,下面我们将其简称为TC2.0。虽然现在大部分人都在VC6.0上进行C源程序的编辑、编译和调试,但是TurBoC2.0还是有其不可忽视的优点。下面我们来简单地了解一下如何在TC2.0上进行一个C源程序的编辑、编译及运行。 在TurBoC所在的目录下,直接键入TC,就可以打开TC2.0集成开发环境,如图1.15所示。图1.15TC2.0集成开发环境1.5 C程序的开发环境

在TC集成开发环境中,有一行主菜单,包含File、Edit、Run、Compile、Project、Options、Debug、Break/watch等8个菜单项,编程者可以进行选择使用。几个比较常用的主菜单及其分别代表的含义如表1-2所示。

如果要在此环境下运行一个新的C源程序,打开File下拉菜单,选择“New”命令后,TC集成开发环境就会打开编辑窗口,可以在此编辑窗口里面输入C源程序。编辑结束后,可以对此C源程序进行编译,使之生成可执行文件,也就是打开Compile下拉菜单,选择“CompiletoOBJ”命令,生成目标文件,然后再选择“LinkEXEfile”命令,将之连接目标文件。如果源程序没有语法和语义上的错误,此源程序就可以生成一个扩展名为“.exe”的可执行文件。

如果在编译和连接时出现了错误,也就是出现了“出错信息”,则需要重新编辑修改源程序。修改之后,再次进行编译和连接,没有错误之后,再运行此程序。这是一个需要动手反复练习的过程,这里不再累述。表1-2常用主菜单及其含义主菜单含义操作File对文件进行操作,包括装载文件、建立新文件、存储文件等按Alt + F组合键可以打开File主菜单Edit编辑

Run生成可执行文件Alt + R组合键、Ctrl + F9组合键Compile编译连接Alt + C组合键第二章

算法2.1 概念2.2 表示算法2.3 结构化的程序设计2.1 概念

著名的计算机科学家沃思(Niklaus.Wirth)曾经提出过一个关于程序的经典公式,如下:数据结构 + 算法 = 程序

在这个公式里面,我们知道数据结构就是数据的描述和组织形式,那什么是算法呢?准确地说,算法是为了解决某一特定问题而采用的确定的有限的操作步骤。生活中的每一件事情的完成都是需要一个步骤的,也就可以认为成一个算法。我们可以举一个简单的例子来说明什么是算法:如果你要从北京到上海,首先,你要确定自己要采用什么方式去,坐飞机还是坐火车,也就是说在这里你要做一个分析和判断,确定自己是坐飞机还是火车,假如你确定了是坐火车,那么就需要去买火车票,可以网上购票,也可以去火车站排队买票,此时你又需要做一个分析和判断,确定哪种购票方式更便捷,买完票之后,你就可以拿着车票在预订的时间里面乘车去上海。上面这一系列的分析、判断和执行的步骤就是算法,通常认为,算法是方法和步骤的集合。

算法是很灵活的,多种多样的,同样一个问题可以用无数种算法来进行求解,然而并不是所有的算法都有意义,只有满足了以下几点特性,一个算法才可以认为是有价值的。 (1)确定性。算法的每一步都必须有确定的含义,不允许存在歧义。如执行“1 + 1 = ?”这个算法,执行结果是2,不存在其他任何结果。理论上,一个有歧义的算法是无法正确解决问题的。 (2)有效性。算法的每一步都是计算机能够执行的,并且在执行后可以得到确定的结果。如果一个算法超出了计算机的功能,那么这个算法是无法运行的。如编程“计算机,倒水”这个算法,计算机做不到,那么类似于这种超出了计算机的功能的算法就属于无效算法。2.1 概念

(3) 有零个或者多个输入。任何一个算法都有一个赋初值的过程,也就是给出算法运行的初始量。可以在编程过程中直接给出算法运行的初始量,那么在程序运行中,就不用临时输入数据,这种赋初值的方式称之为零个输入。当然,也可以在程序运行过程中从外部设备给算法送值,这种赋初值的方式称之为多个输入。不管采用哪种方法,都是给算法赋初值,都是可行的。

(4)有一个或者多个输出。每一个有意义的算法都是有结果的,没有结果的算法是无意义的。因为编程是为了解决问题,如果程序运行完之后,没有输出结果,那么问题就没有得到解决,也就是说这个程序采用的算法是无效且无意义的。所以,一个有效的算法至少有一个输出结果,当然,也可以有多个输出结果。

(5)有穷性。任何一个有实际意义的算法必须是可以执行完的,即它的运算步骤是有限的,而不是无限的循环执行下去,没有终结。事实上,一个真正有实际意义的算法,都应该是在人类可以接受的时间范围内完成,也就是有一个解决问题的期限,否则失去了实用价值,算法也就无意义了。总而言之,算法必须是在有限的时间内完成,并且对于同样的输入,应该得到同样的输出。在C语言中,算法在程序上的运用,是在计算机的功能范围之内,是计算机执行有限个确定性的指令的集合。一个算法的正确与否,关系到一个程序能否可以执行及执行结果的正确与否,也就关系到我们所要求解的问题是否得到一个正确的结果。2.2 表示方法

2.2 表示方法

如果我们要比较两个数A、B的大小,若A大于B就输出数A,反之则输出数B,用流程图表示如图2.1所示。表2-1标准的流程图符号符号说明符号说明起止框流程线特定处理框虚线判断框准备框输入输出框处理框连接点

图2.1比较两数大小的流程图2.2 表示方法3.N-S结构化流程图

N-S结构化流程图是在普通的流程图的基础上进行进一步优化后诞生的。它是由美国学者I.Nassi和B.Schneiderman于1973年提出的,所以它的命名也就是采用二位学者的名字的首字母。N-S流程图最突出的特点在于它取消了传统流程图中的流程线,使算法被迫的按照从上到下的顺序进行,这种改进避免了由于流程线太多并且任意转向而带来的困扰,使得算法的描述更加简洁明了,从而保证了程序的质量。N-S流程图采用了结构化的特点,使得一个算法整体看起来形象直观,同时节省了空间,而且更适合C这种结构化的程序语言。如把上面标准流程图改为N-S流程图后,如图2.2所示。4.伪码

伪码(Pseudocode)是介于自然语言和计算机语言之间的一种代码。程序员之所以运用伪码,是因为它可以帮程序员制定算法的智能化语言,它很灵活,没有固定的格式和规范,只要程序员能够写出来,或者读者可以看懂即可。虽然它不能在计算机上运行,但是与计算机语言相比较,还是更易于转换成程序的。在这里就不再举例说明了。图2.2比较两数大小的N-S结构化流程图2.3 结构化的程序设计

结构化程序的概念,首先是从以往编程过程中无限制地使用转移语句而提出的。而转移语句则指的是可以使程序的控制流程强制性的转向程序的任何一处,在上面所讲到的传统流程图中,已经了解到这种流程控制语句的一些特点,就是用“很随意”的流程线来描述转移功能。如果在一个程序中多处出现这种转移情况,将会导致程序流程无序可寻,程序结构则变得杂乱无章,这样的程序设计是令人费解且难以接受的,而且由于流程线的随意转向,使得程序容易出错。

针对这些问题,1966年,Bohra和Jacopini提出了以下三种基本结构:顺序结构、选择结构和循环结构,从而解决了上述问题,使得程序的可读性和可修改性大大提高。任何复杂的算法,都可以由顺序结构、选择(分支)结构和循环结构这三种基本结构组成。这样在构造算法时,仅以这三种结构作为基本单元,同时规定了遵循这种结构的程序只有一个输入口和一个输出口,并且基本结构之间可以并列和互相包含,但是不允许交叉和从一个结构直接转到另一个结构的内部去。采用这种程序设计的方法,使得整个程序结构清晰、易于正确性验证和纠正程序中的错误,这就是结构化程序设计方法,我们把遵循这种方法的程序设计称之为结构化程序设计。

下面介绍这三种基本的结构。1.顺序结构 顺序结构是最简单的一种基本结构,它是按照解决问题的顺序写出相应的语句,并且其执行顺序也是自上而下的依次执行,如图2.3所示。图中就是采用的顺序结构,其中A和B是按照算法的描述依次写出的,并且执行的时候,先执行A,然后再执行B,不能调换顺序,更不能逆序执行。图2.3顺序结构2.3 结构化的程序设计2.选择结构

选择结构主要是应用于判断给定的条件,依据判断的结果来控制程序的流程。选择结构存在的前提是有一个给定的判断条件,只有在判断之后,才选择性的去执行相应的结果,如图2.4所示。 图中最上面的菱形框里的C是条件判断语句,先判断C是否成立,如果成立,则执行A,否则执行B。不存在A和B同时执行的情况,也就是说,所给定的C这个条件要么成立,要么不成立,不能含糊不清的。当然,A和B二者之中可以有任何一个是空的,也就是不执行任何操作。这钟情况就是选择结构里面的单分支结构,A、B同时存在的情况是选择结构的双分支结构,还有多分支结构,在后续的学习中会依次了解到。图2.4选择结构2.3 结构化的程序设计3.循环结构 循环结构可以看成是一个条件判断语句和一个有向回转语句的组合,可分为两种结构:当型循环结构和直到型循环结构。 如图2.5所示是当型循环结构,C1是条件判断语句,先判断C1是否成立,如果成立,则执行A语句,执行完A语句后,再判断C1是否成立,成立的话再执行A语句,反复执行这一过程,直到C1不成立,才结束此循环结构。之所以称之为当型循环,也就是当C1成立时,这一循环不会结束,只有当C1不成立时,才能跳出此循环。 如图2.6所示是直到型循环结构。它的功能是先执行A语句,执行完之后判断条件语句C2是否成立,如果C2不成立,则回转过来执行语句A,执行完再判断C2,如果C2不成立,则还执行语句A,如此反复的执行语句A,直到判断C2成立为止。顾名思义,直到型循环结构也就是直到C2成立时,此循环才终止,否则一直循环下去。图2.5当型循环结构 图2.6直到型循环结构2.3 结构化的程序设计

1996年,计算机科学家Bohm和Jacopini证明了这样的事实:任何简单或复杂的算法都可以由顺序结构、选择结构和循环结构这三种基本结构组合而成。所以,这三种结构就被称为程序设计的三种基本结构,也是结构化程序设计必须采用的结构。同时,以上三种结构有几个共同点:

(1)只有一个入口。图2.3、图2.4、图2.5、图2.6中的a点均为入口点,有且只有一个。

(2)只有一个出口。四个图中的b点均为出口点,虽然选择结构有两个出口点,但是在程序执行中,非A即B,二者只能执行其一,那么我们就可以认定选择结构也是只有一个出口。

(3)结构中的每一部分都有机会被执行到。即在三种基本结构中,不存在多余无用的部分,每一部分都有一条从入口到出口的流线经过,也就有可能被执行。

(4)程序不会出现死循环。死循环就是不会终止的循环。三种基本结构都有程序结束的条件,顺序结构不用说了,选择结构有给定的条件判断部分,循环结构有循环判断的语句,所以都不会出现死循环。结构化程序中的任意基本结构都具有唯一入口和唯一出口,在程序的静态形式与动态执行流程之间具有良好的对应关系。 结构化程序设计(StructuredProgramming)是进行以模块功能和处理过程设计为主的详细设计的基本原则。1965年,E.W.Dijikstra提出了结构化程序设计的概念,这是软件发展的一个重要的里程碑。结构化程序设计的主要观点是采用自顶向下、逐步细化及模块化的程序设计方法,也就是使用三种基本控制结构作为任何程序的基本构造。结构化程序设计是软件发展中的第三个里程碑,主要强调的是程序的易读性。其设计方法如下:2.3 结构化的程序设计

(1)自顶向下。在进行程序设计时,首先应先考虑总体规划,然后再考虑细节问题,也就是先考虑全局目标,后考虑局部目标。而不是一开始就过多考虑到众多的细节,从而使得整个程序设计变得繁琐无序、无章可循。只有从最上层总目标开始设计,才能逐步使问题具体化。这就如同我们要写一篇文章,先确定文章主旨,要表述一个什么样的观点,或者传达一个什么样的理念,确定了文章的中心思想,然后根据中心思想开始写出文章的总提纲,总提纲里面的内容一般包含作者想要分几段来写作,每段文字的段落大意等等。这就是一个自顶向下的文章设计思路。同样,我们要书写程序,也要求按照这样的思路,这样整个程序才能准确的描述并且解决相应的问题。

(2)逐步细化。对一些复杂问题而言,我们还应设计一些子目标作为过渡,进行逐步细化。这就是上面所说的分段问题,确定每段分别表述什么样的段落大意,然后再来思考怎样来表述每段的内容,每一段就像是一个总提纲下面的一些小提纲,需要逐个逐步处理。例如第一段怎么写?是开篇点题、直抒胸臆,还是故弄玄虚、引人注意。对每一小段的分析和处理,就如同把每一个C程序分成一个个的小程序,然后单个的对每个小程序进行编写和修改,这就是细化的过程。 (3)模块化设计。一个复杂问题一般是由若干个简单的问题构成的。只有解决了各个小问题,这个复杂的问题才能得以解决。而模块化就是把程序要解决的总目标分解为子目标,再进一步分解为更具体的小任务,每一个小任务里面又包含若干个函数。在这里,把每一个小目标称为一个模块。这就如同我们写文章,如何写好每一段的问题,每一段都有其段落大意,而每一段内容又是由句子组成,句子就相当于C程序的基本组成单元函数,我们可以根据其段落大意来分别处理每一段,采用相应的写作方法来书写每一句,句子组成段落,也就是每一段先是独立的完成,最后将其组合起来,这样整篇文章也就完成了。这就是模块化处理的基本理念。第三章

基本数据类型3.1 常量3.2 变量3.3 变量赋初值3.4 运算符与表达式3.5 不同类型数据间的混合运算3.1 常量3.1.1 标识符 标识符是用来标识变量名、符号常量名、函数名、数组名、类型名、文件名等的有效字符序列。在C语言中,构成标识符的命名规则如下: (1)标识符只能由字母、数字和下划线三种字符构成。 (2)标识符的有效长度为1~32个字符。 (3)标识符的首字符必须是字母或下划线,其余字符可以是字母、数字或下划线。 (4)标识符中区分大写字母与小写字母。如circle、Circle、CIRCLE是3个不同的标识符。 (5)标识符不能与任何关键字相同。 此外,为标识符取具有助记性质的名称是非常好的编程习惯,它可以提高程序的可读性,增强程序的文档信息。 注意:以下划线开头的标识符可能与系统内部所使用的名称冲突。如_iob这个标识符常常被定义为stdio.h中一个结构数组的名称,如果程序员试图将_iob用作其他用途,编译器可能会报错,或者程序会出现错误的行为。因此,编写程序时,程序员应该避免使用以下划线开头的标识符。3.1 常量3.1.2 常量 常量是指在程序执行过程中其值不发生改变的量。如程序中的具体数字、字符等。通常常量分为以下五种类型。1.整型常量 整型常量就是整常数。在C语言中,使用的整常数有八进制、十六进制和十进制三种。 (1)十进制整常数:十进制整常数没有前缀,其数码为0~9,有正有负。如123、-456、65 535是合法的十进制整常数;012(不能有前导0)、56D(含有非十进制数码)不是合法的十进制整常数。在程序中是根据前缀来区分各种进制数的。因此,在书写常数时,不要把前缀弄错造成结果不正确。 (2)八进制整常数:八进制整常数必须以0开头,即以0作为八进制数的前缀。数码取值为0~7,通常是无符号数。如017(十进制为15)、0101(十进制为65)、0177777(十进制为65 535)是合法的八进制整常数;123(无前缀0)、03A(包含了非八进制数码)、-0127(出现了负号)是非法的八进制整常数。 (3)十六进制整常数:十六进制整常数的前缀为0X或0x。其数码取值为0~9,A~F或a~f。如0X1D(十进制为29)、0XF2(十进制为242)、0XFFFF(十进制为65 535)为合法的十六进制整常数;B2(无前缀0X)、0X4H(含有非十六进制数码)为非法的十六进制整常数。3.1 常量此外,由于在16位字长的机器上,基本整型的长度也为16位,所以表示的数的范围是有限的。十进制无符号整常数的范围为0~65 535,有符号数为 -32 768~+32 767。八进制无符号数的表示范围为0~0177777。十六进制无符号数的表示范围为0X0~0XFFFF或0x0~0xFFFF。如果使用的数超过了上述范围,就必须用长整型数来表示。长整型数是用后缀“L”或“l”来表示的,例如,

十进制长整常数:158L(十进制为158)、358000L(十进制为358 000);

八进制长整常数:012L(十进制为10)、077L(十进制为63)、0200000L(十进制为65 536);

十六进制长整常数:0X15L(十进制为21)、0XA5L(十进制为165)、0X10000L(十进制为65 536)。

长整数158L和基本整常数158在数值上并无区别。但对于158L,因为是长整型量,C编译系统将为它分配4个字节的存储空间,而基本整型158,只分配2个字节的存储空间。因此,在运算和输出格式上要予以注意,避免出错。无符号数也可用后缀表示,整型常数的无符号数的后缀为“U”或“u”。如358u、0x38Au、235Lu均为无符号数。前缀、后缀可同时使用以表示各种类型的数。如0XA5Lu表示十六进制无符号长整型数A5,其十进制为165。2.实型常量

实型常量也称为实数或者浮点数。在C语言中,实数只采用十进制,主要有小数表示形式和指数表示形式两种。 (1)小数形式:由数码0~9和小数点组成。如0.0、25.0、5.678、0.13、5.0、-267.890等均为合法的实数。 注意:必须有小数点。3.1 常量

3.1 常量3.字符常量

字符常量包括普通字符常量和转义字符常量。

(1)字符常量是由一对单引号括起来的单个字符,它可以是ASCII码字符集里的任一个字符。如“a”、“A”、“5”、“+”、“”等。

在C语言中,字符常量有以下特点:①字符常量只能用单引号括起来,不能用双引号或其他括号。②字符常量只能是单个字符,不能是字符串。③字符可以是字符集中任意字符。但数字被定义为字符型之后就不能参与数值运算。如 '7' 和7是不同的。'7' 是字符常量,不能参与运算。

(2)转义字符常量又叫控制字符常量,转义字符以反斜线“\”开头,后跟一个或几个字符。转义字符具有特定的含义,不同于字符原有的意义,故称“转义”字符。表3-1列出了C语言中常用的转义字符及含义。转义字符序列转义字符的意义ASCII代码\n回车换行10\t横向跳到下一制表位置9\b退格8\r回车13\'单引号‘39\"双引号“34\\反斜杠\92\ddd1~3位八进制数所代表的字符—\xhh1~2位十六进制数所代表的字符—\a鸣铃7\f走纸换页12表3-1常用的转义字符及含义3.1 常量4.字符串常量

字符串常量是由一对双引号括起的字符序列。如“CHINA”、“Howareyou”等都是合法的字符串常量。

注意:

字符串常量和字符常量是不同的量,它们之间主要有以下区别:

(1)字符常量由单引号括起来,字符串常量由双引号括起来。

(2)字符常量只能是单个字符,字符串常量则可以含一个或多个字符。

(3)可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在C语言中没有相应的字符串变量,但是可以用一个字符数组来存放一个字符串常量。

(4)字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加1。增加的一个字节中存放字符 "\0" (ASCII码为0),这是字符串结束的标志。3.1 常量

【例3-1】字符变量的输出。

#include<stdio.h>

main()

{

chara,b;

a=97;

b=98;

printf("%c,%c\n",a,b);

printf("%d,%d\n",a,b);

}

程序运行结果如图3.1所示。 分析:本程序中定义a、b为字符型,但在赋值语句中赋以整型值。从结果看,a、b值的输出形式取决于printf函数格式串中的格式符,当格式符为“c”时,对应输出的变量值为字符,当格式符为“d”时,对应输出的变量值为整数。图3.1例3-1运行结果3.1 常量5.符号常量

在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。符号常量在使用之前必须先定义,其一般形式为:

#define标识符常量

其中,#define是一条预处理命令(预处理命令都以“#”开头),称为宏定义命令,其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符的地方均代之以该常量值。

习惯上,符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。

【例3-2】符号常量的使用。

#include<stdio.h>

#definePI3.14159

main()

{

doubled;

d=PI;

printf("a=%f\n",d);

}程序运行结果如图3.2所示。图3.2例3-2运行结果3.2 变量

变量是在程序运行中其值可以被修改的量。变量具有三个基本要素:变量说明、变量类型和变量值。一个变量应该有一个名字,在内存中占据一定的存储单元,在该存储单元中存储该变量的值。变量名和变量值是两个不同的概念,变量名实际是一个符号地址,在对程序连接编译时由系统给每一个变量名分配一个内存地址,而变量值则是其对应内存单元中所存放的数据。程序执行过程中从变量取值时,实际上是通过变量名找到相应的内存地址,再从其内存单元中读取数据。

在C语言中,所有的变量在使用之前必须声明。一般的定义形式为:

数据类型变量名列表;

其中,数据类型是指C语言的有效数据类型,基本包括整形(int)、字符型(char)和浮点型(float)。变量名列表中,变量与变量之间用逗号隔开。例如,

inti,j,k;

float x,y;

在C语言中,变量名的命名要符合标识符的命名规则。此外,为了提高程序的可读性,变量名应该取得尽量有意义,具有“见名知义”的效果。3.2 变量

【例3-3】变量的使用。

#include<stdio.h>

main()

{

inta,b=5; // 定义并给整型变量赋值

floatx,y=5.4,z=-7.9; // 定义并给浮点型变量赋值

charch1='a';

// 定义并给字符型变量赋值

printf("Inputtwointegers:");

scanf("%d",&b);

a=b;

printf("a=%d\n",a);

printf("y,z=%f%f\n",y,z);

printf("ch1=%c\n",ch1);

}程序运行结果如图3.3所示。图3.3例3-3运行结果3.2 变量3.2.1 整型变量1.整型变量的定义 变量定义的一般形式为: 类型说明符变量名标识符,变量名标识符,...; 例如, intx,y; /*定义整型变量x、y*/ longa,b,c; /*定义长整型变量a、b、c*/ unsignedp,q; /*定义无符号整型变量p、q*/ 在书写变量定义时,应注意以下几点: (1)允许在一个类型说明符后定义多个相同类型的变量,各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。 (2)最后一个变量名之后必须以“;”号结尾。 (3)变量定义必须放在变量使用之前。一般放在函数体的开头部分。3.2 变量2.整型变量的分类

(1)基本型:类型说明符为int,在内存中占2个字节。

(2)短整量:类型说明符为shortint或short,所占字节和取值范围均与基本型相同。

(3)长整型:类型说明符为longint或long,在内存中占4个字节。

(4)无符号型:类型说明符为unsigned。

无符号型又可与上述三种类型匹配而构成如下几种类型:·无符号基本型:类型说明符为unsignedint或unsigned。·无符号短整型:类型说明符为unsignedshort。·无符号长整型:类型说明符为unsignedlong。

各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。但由于省去了符号位,故不能表示负数。有符号整型变量最大表示32 767。

无符号整型变量最大表示65 535。011111111111111111111111111111113.2 变量 表3-2中列出了TurboC中各类整型数据所分配的内存字节数及数的表示范围。类型说明符数 的 范 围字节数int-32768~32767即 -215~(215 - 1)2unsignedint0~65 535即0~(216 - 1)2shortint-32 768~32 767即 -215~(215 - 1)2unsignedshortint0~65 535即0~(216 - 1)2longint-2 147 483 648~2 147 483 647即 -231~(231 - 1)4unsignedlong0~4 294 967 295即0~(232 - 1)4表3-2整型数据分类表3.2 变量

【例3-4】整型变量的定义与使用。

#include<stdio.h>

main()

{

inta;

shortintb;

unsignedc;

a=32767;

b=a+1;

c=a+1;

printf("%d,%d,%d\n",a,b,c);

}

程序运行结果如图3.4所示。 分析:程序中定义a为整型变量,表示的数据范围是 -32 768~32 767,b为短整型变量,表示的数据范围也是 -32 768~32 767,c为无符号整型变量,表示的数据范围是0~65 535。A + 1结果是32768,超出变量b的表示范围,出现了数据溢出,在内存中表示为:因此结果为 -32 768。没有超出变量c的表示范围,所以c的输出是32 768。1000000000000000图3.4例3-4运行结果3.2 变量3.2.2 实型变量1.实型变量的分类 实型变量分为单精度、双精度和长双精度三种类型,分别使用关键字float、double和longdouble表示。表3-3中列出了TurboC中各类实型数据所分配的内存字节数及数的表示范围。 定义的格式如下: floatx,y; /* 定义单精度实型变量x,y */ doublea,b,c; /* 定义双精度实型变量a,b,c */类型说明符比特数(字节数)有效数字数的范围float32(4)6~710-37~1038double64(8)15~1610-307~10308longdouble128(16)18~1910-4931~104932表3-3实型数据分类表3.2 变量2.实型数据的舍入误差

由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的。其中,float型数据的有效位数为7位,double型数据的有效位数为15~16位。如果结果超出了各数据类型的有效位数,超出的部分四舍五入。

【例3-5】浮点数的有效位实例。

#include<stdio.h>

main()

{

floatx;

x=0.1234567890;

printf("%f\n",x);

}

程序运行结果如图3.5所示。

分析:在本例中,x被赋值一个有效位数为11的数字,但由于x为float类型,所以x只能接收7位有效数字,因此小数位最多保留六位,其余部分四舍五入。图3.5例3-5运行结果3.2 变量3.2.3 字符变量 字符变量用来存储字符,每个字符变量只能存放一个字符。字符变量的类型说明符是char,如charx,y。 在C语言中,每个字符变量被分配一个字节的内存空间,将一个字符赋给一个变量时,并不是将该字符本身存储到内存中,而是将该字符的ASCII码存储到内存单元中。 如a的十进制ASCII码是97,b的十进制ASCII码是98。给字符变量x、y赋予'a'和'b'值:x='a';y='b';而x、y对应的内存单元中存放的是97和98的二进制代码:

所以,也可以把它们看成是整型量。C语言允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在输出时,允许把字符变量按整型量输出,也允许把整型量按字符量输出。整型量为二字节量,字符量为单字节量,当整型量按字符型量处理时,只有低八位字节参与处理。a:01100001b:011000103.3 变量赋初值

在程序中常常需要对变量赋初值,以便使用变量。语言程序中可有多种方法为变量赋初值。本小节先介绍在作变量定义的同时给变量赋以初值的方法,这种方法称为初始化。在变量定义中赋初值的一般形式为:

类型说明符变量1=值1,变量2=值2,…;

例如,

intx,y=10;

floata=12.345;

charch1='A',ch2='a';

注意:在定义中不允许连续赋值,如x=y=z=6是不合法的。3.4 运算符与表达式

运算符也称为操作符,它是对程序中的数据进行运算的标志符号,参与运算的数据称为操作数或运算对象。由运算符和操作数组成的符合语法规则的序列称为表达式,表达式经运算后得到一个结果。

在C语言中,如果运算符的运算对象是一个,就称为“单目运算符”,如“-a”中的“-”;如果运算对象是两个,就称为“双目运算符”,如“a+b”中的“+”;如果运算对象是三个,就称为“三目运算符”,如“a<b?a:b”中的“? :”。

表达式是由常量、变量、函数和运算符组合起来的式子。一个表达式有一个值及其类型,它们等于计算表达式所得结果的值和类型。表达式求值按运算符的优先级和结合性规定的顺序进行。单个的常量、变量、函数可以看作是表达式的特例。3.4.1 算术运算符与算术表达式1.算术运算符 C语言的算术运算符共有7个,对应9种运算,基本运算符如下: (1)加法运算符“+”:加法运算符为双目运算符,即应有两个量参与加法运算,如x+y、5+3等。 (2)减法运算符“-”:减法运算符为双目运算符,但“-”也可作负值运算符,此时为单目运算,如 -x、x-5等。3.4 运算符与表达式

(3)乘法运算符“*”:双目运算,如5*9、a*b等。

(4)除法运算符“/”:双目运算具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。如8/4、12.5/2等。

(5)求余运算符(模运算符)“%”:双目运算,具有左结合性。要求参与运算的量均为整型。求余运算的结果等于两数相除后的余数。如9%5、x%3等。2.算术运算符的优先级和结合性

C语言的算术运算符具有一般数学运算的特性,具有运算优先级和结合性,如表3-4所示。优先级运算符结合性1()由内向外2++自左向右---

(取负)3*自左向右/%4+自左向右表3-4算术运算符的优先级和结合性3.4 运算符与表达式3.自增自减运算符

在C语言中,还有两个很有用的运算符,即增1和减1运算符。其中,运算符“++”是将变量值自增1,运算符“--”是将变量值自减1。自增/自减运算符属于单目运算符,只能用于变量自加或自减,不能用于常量。

增1和减1这两个运算符既可以放在操作数之前,也可以放在其后。如x++,也可以写成 ++x。但是这两种写法是有区别的,如果运算符在操作数后面,则先引用该操作数,然后再对其进行加1或减1运算;如果运算符在操作数前面,则在引用该操作数之前,先对其进行加1或减1运算。归纳如下:

(1) x++:先引用变量x的值,再将x的值加1。

(2) x--:先引用变量x的值,再将x的值减1。

(3) ++x:先将x的值加1,再引用变量x。

(4) --x:先将x的值减1,再引用变量x。4.算术表达式

算术表达式是由算术运算符和括号连接起来的式子,例如,

x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论