C语言学习
第1章 程序设计与C语言
1.1 计算机与程序、程序设计语言
- 计算机的机器语言:一个型号机器语言的指令的集合。它紧密依赖于计算机硬件,称为低级语言。
- 用机器语言写程序难学、难记,难写,难修改、难维护,而且在不同计算机之间互不通用,给计算机的推广应用造成很大困难。
- 高级语言:比较接近与人们习惯使用的自然语言(英文)和数学语言,直观易学,易理解,易修改,易维护,通用性强(不同型号计算机之间通用)。从1954年出现第一个高级语言FORTRAN 以来,全世界先后出现了几千种高级语言,每种高级语言都有其特定的使用领域。其中应用比较广泛的有100多种,影响较大的有FORTRAN(适合数值计算)、BASIC(适合初学者的小型会话语言)、COBOL(适合商业管理)、Pascal(适合教学的结构程序设计语言)、LISP和PROLOG(人工智能语言)、 Visual Basic(支持面向对象程序设计的语言)、C(系统描述语言)、C+(支持面向对象程序设计的大型语言)、Java(适于网络使用的语言)以及近几年使用较多的C# 、Python,R语言等。
- 编译系统:用高级语言编写的程序,计算机是不能直接识别和执行的(计算机只能直接识别二进制的指令),必须事先把用高级语言编写的程序翻译成机器语言程序,这个“翻译”工作是由称为“编译系统”的软件来实现的。
1.2 C语言的出现和发展过程
- C语言是国际上广泛流行的计算机高级语言。最初的C语言只是为编写UNIX操作系统提供一种工作语言而设计的。
- 1973年,Ken Thompson和 Dennis M.Ritchie合作把UNIX的90%以上用C语言改写(原来的UNIX操作系统是用汇编语言编写的)。
- 后来,C语言做了多次改进,但主要还是在贝尔实验室内部使用。随着UNIX的日益广泛使用,C语言也迅速得到推广。C语言和UNIX可以说是一对孪生兄弟,在发展过程中相辅相成。
- 1978年以后,C语言先后移植到大、中、小,微型计算机上。C语言便很快风靡全世界,成为世界上应用最广泛的程序设计高级语言。
- 以1978年发布的UNIX第7版中的C语言编译程序为基础, Brian W.Kernighan和Dennis M.Ritchie(合称K&.R)合著了影响深远的名著The C Programming Language ,这本书中介绍的C语言成为后来广泛使用的C语言版本的基础,它被称为标准的C语言。
- 1983年,美国国家标准化协会(ANSI)根据C语言问世以来各种版本对C语言的发展和扩充,制定了新的标准草案,即 83 ANSI C。ANSI C比原来的标准C有了很大的发展。
- 1989年,ANSI 又公布了一个新的C语言标准--—ANSI X3.159—1989(简称C89)。1990年,国际标准化组织(International Standard Organization,ISO)接受C89,作为国际标准ISO/IEC9899:1990,通常简称为C90。ISO 的C90和ANSI的C89基本上是相同的。
- 1995年,ISO对C90做了一些修订,称为C95。1999 年,ISO 又对C语言标准进行修订,在基本保留原来的C语言特征的基础上,增加了一些面向对象的特征,命名为ISO/IEC9899;1999,简称为C99。但前一时期有的软件公司提供的C语言编译系统并未完全实现C99建议的功能,而是以C89为基础进行开发的。不同的软件公司提供的C编译系统所实现的语言功能和语法规则又略有差别。
- C语言功能强大、使用灵活,既可用于编写应用软件,又能用于编写系统软件。因此C语言问世以后得到迅速推广。
1.3 简单的C语言程序
1 #include <stdio.h> //编译预处理指令 2 3 int main() { //定义主函数 4 printf("This is a C program.\n"); 5 return 0; //函数执行完时返回0 6 }
1 //求两个整数之和 2 #include <stdio.h> //编译预处理指令 3 4 int main() { //定义主函数 5 int a, b, sum; 6 a = 123; 7 b = 456; 8 sum = a + b; 9 printf("sum is %d\n", sum); 10 return 0; 11 }
1 #include <stdio.h> 2 3 int main() { //主函数 4 int max(int x, int y); //对被调用的max函数进行声明 5 int a, b, c; //定义整型变量a,b、c 6 scanf("%d,%d", &a, &b); // 从键盘输入变量a和b的值 7 c = max(a, b); //调用max函数,将得到的值赋给整型变量c 8 printf("max= %d\n", c);//输出c的值 9 return 0; 10 } 11 12 int max(int x, int y) //定义max函数,函数值为整型,形式参数x、y为整型 13 { 14 int z; // max函数中的声明部分, 定义本函数中用到的变量z为整型 15 16 if (x > y) z = x; //如果x> y,则将x的值赋给变量z 17 18 else z = y; //否则,将y的值赋给变量z 19 20 return (z); //将z的值返回到主函数中调用函数的位置 21 22 }
1.4 C语言IDE
本章小结
- (1)计算机是由程序控制的,要使计算机按照人们的意图工.作,必须用计算机语言编写程序。
- (2)机器语言和汇编语言依赖于具体计算机,属于低级语言,难学难用,无通用性。高级语言接近人类自然语言和数学语言,容易学习和推广,不依赖于具体计算机,通用性强。
- (3)C语言是目前在世界上使用最广泛的一种计算机语言,语言简洁紧凑,使用方便灵活,功能很强,既有高级语言的优点,又具有低级语言的功能;既可用于编写系统软件,又可用于编写应用软件。掌握C语言程序设计是程序设计人员的一项基本功。
- (4)一个C语言程序是由一个或多个函数构成的,必须有一个main函数。程序由main函数开始执行。在函数体内可以包括若干个语句,语句以分号结束。一行内可以写多个语句,一个语句可以分写为多行。
- (5)上机运行一个C程序必须经过4个步骤:编辑、编译、连接和执行。要熟练掌握上机技巧。
- (6)用C语言写好程序后,可以用不同的C编译系统对它进行编译。目前所用的编译系统多采用集成环境:把编辑、编译、连接和执行等步骤在一个集成环境中完成。
- (7)目前所用的C++集成环境功能强,使用方便。由于C++和C兼容,可以用C++集成环境对C程序进行编译、连接和运行。
习题
1 #include <stdio.h> 2 int main(){ 3 printf("********************************\n\n"); 4 printf(" Very good!\n\n"); 5 printf("********************************\n\n"); 6 return 0; 7 }
1 #include <stdio.h> 2 3 int main() { 4 int a, b, c, max; 5 printf("please input a,b,c:\n"); 6 scanf("%d,%d,%d,", &a, &b, &c); 7 max = a; 8 if (max < b)max = b; 9 if (max < c)max = c; 10 printf("The largest number is %d\n", max); 11 return 0; 12 }
第2章 数据的存储与计算
2.1.1 数据在计算机中是以二进制形式存储的
众所周知,计算机的工作是基于二进制原理的,计算机内部的信息都是用二进制来表示的。计算机的存储器是由半导体集成电路构成的,它包括几亿个小的脉冲电路单元(二极管元件)。每一个二极管元件如同一个开关,有两种稳定的工作状态:“导通”与“截止”,即电脉冲的“有”与“无”,用1和0表示。如果有相邻的8个二极管元件中第1、3、5、7个元件处于“导通”状态,第2、4、6、8个元件处于“截止”状态(见图2.1(a)),这种状态用10101010表示(见图2.1(b)或图2.1(c))。当用户向计算机输入数据(例如输入整数5)时,计算机先把数据转换为二进制形式(整数5的二进制形式为101),根据其每一位是0或1,使相应的电子元件设置为“截止”或“导通”状态。至于怎样具体实现,用户可不必过虑,是由计算机自动完成的。
一个十进制怎样表示为二进制形式呢?二进制数的特点是“逢二进一”。每一位的值只有0和1两种可能。
表2.1表示最简单的十进制数与二进制数的对应关系。
十进制数10,用二进制表示是1010。它的含义是:
每一个二进位代表不同的幂,最右边一位代表2的0次方,最右边第二位代表2的1次方,以此类推。显然一个很大的整数可能需要几十个“二进制位”来代表。
2.1.2 位、字节和地址
在谈论数据存储时常用到以下一些名词:
- 位,又称为“比特”(bit)。每一个二极管元件称为一个“二进制位”,是存储信息的最小单位。它的值是1或0。
- 字节,又称为“拜特”(byte)。一个存储器包含许许多多个“二进制位”,如果直接用“位”来表示和管理,很不方便。一般将8个“二进制位”组织成一组,称为“字节”。这是人们最常用的存储单位,例如平常说的“占内存125K”,就是指125KB,即约12.5万字节。“内存为256M”,就是指256兆字节,一兆是10°,即 100万。“硬盘容量为40G”,就是指40吉字节,一吉是10”,40GB就是400亿字节。
- 地址。计算机的存储器包含许多存储单元,怎样才能找到所需的存储单元呢?操作系统把所有存储单元以字节为单位编号,如图2.2所示。
图2.2表示:在编号为2001的字节中存放数据3,在编号为2002的字节中存放数据4……,以此类推。2001、2002就是存储单元的地址。也就是说,在地址为2001的存储单元中存放数据3,在地址为2002的存储单元中存放数据4……。请注意,这只是示意性的说明,实际上在计算机中一般不是用一字节存放一个整数﹐而是用2或4字节存放一个整数。这是因为一字节只有8个二进制位,能存放的数据范围比较小,因此为了扩大存储数据的范围,需要用几字节来存放一个数据。
2.1.3 不同类型数据的存储方式
由于在计算机中的存储形式不同,C语言中的数据是分为不同类型的。
1.整数的存储方式
一个十进制整数﹐先转换为二进制形式,如整数10,以二进制形式表示是1010,直接把它存放在存储单元中。如果用一字节来存储,存储单元中的情况如下。
- 一字节共有8个二进制位,左面第1位(即最高位)用来表示符号,当最高位为0时表示是正数。其他7位都用来存放数值,则它的最大值是01111111,即27_1,它相当于十进制的127。如果数值大于127,一字节就放不下了。这显然是不满足要求的。有的C语言编译系统(如Turbo C 2.0)以两字节表示一个整数。这时,它的最大值是0111111111111111,即215一1,它相当于十进制的32767。实际上使用的整数往往超过32767,显然两字节放不下,因此现在的C语言编译系统(如Visual C+)以4字节表示一个整数﹐这时,它的最大值是31位都是1,即231—1,约为21亿。一般情况下能满足使用要求了。
- 数值并不总是正值,往往有负数。那么怎样表示负数呢?是用“补码”表示的。在计算机的存储器中,整数是以补码形式存放的。一个正数的补码和该数的原码(即该数的二进制形式)相同,如整数10的原码和补码都是00001010。对负数,先求出它的补码,再存放到存储单元中。
2.实数的存储形式
- 前面介绍的是整数的存储形式,一个整数可以准确地表示为二进制形式。如果输入的是一个实数,如123.456,就不能采取上面的办法。
- 对于实数,一律采用指数形式存储,例如123.456可以写成标准化指数形式0.123456×103,它包括前后两个部分:前面部分是数值部分,后面部分是指数部分,如下所示。