《程序设计基础》课件第2章_第1页
《程序设计基础》课件第2章_第2页
《程序设计基础》课件第2章_第3页
《程序设计基础》课件第2章_第4页
《程序设计基础》课件第2章_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

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

文档简介

第2章C语言基础2.1标识符与关键字

2.2简单数据类型

2.3简单计算

习题

要使用C程序来处理任何实际问题,首先要做的工作就是将该问题转换成计算机C程序可以理解的形式。通常问题的转换就是用某种描述方法将这个实际问题的特性用某种类型数据的组织形式表示出来,这就是数据结构。

C程序中用来描述实际问题的数据类型如图2-1所示。图2-1C语言数据类型 2.1标识符与关键字

正如以上所讲,要想让C程序处理任何实际问题,都需要将这个问题用程序可以理解的方式表示出来,这就需要使用C语言的标识符。

标识符是用来标识变量、常量、类型、函数、标号、宏、参数、文件名等实体的按一定规律组织起来的字符序列。C语言的标识符允许为字母、数字和下划线的组合。

C语言的标识符定义应注意以下几点:

(1)标识符的第一个字符必须是字母或下划线,而不能为数字。

(2) C语言中是严格区分大小写字母的,例如下面三个标识符各不相同:AVG、Avg、avg。

(3)有些字符串在语法上虽符合标识符的要求,但是已经被C语言系统占用作特殊用途,因此不能作为用户标识符使用。这些字符串称为关键字,例如main、int、if、for等等。

2.2简单数据类型

2.2.1常量与变量

1.常量

在将现实的问题用计算机程序描述时,描述对象的某些量在程序对其进行处理过程中不发生任何变化,这些量通常称为常量。

有些常量,例如,18、-3、0等为整形常量,3.1415、-9.8等为实型常量,'A'、'B' 等为字符型常量。这些常量可以称为直接常量,即是可以直接从其形式判别出的常量。还有些常量可以用一个标示符来代表,称其为符号常量。符号常量在使用前必须先定义,且一般采用大写字母表示。其定义形式如下:

#define常量标示符值

例如,在进行圆的相关计算中会经常用到π,这时就可以定义π为符号常量,其定义形式如下:

#definePI3.1415

定义后,PI在这个C程序文件中就代表3.1415这个实型数值,PI就可当做常量直接参与其他运算了。符号常量的使用如下例所示。/*源程序2-1*/

#definePI3.1415 /*定义符号常量PI代表实型数据3.1415*/

#include<stdio.h>

main()

{

floatr,s;

r=4.0; /*圆半径为4*/

s=2*PI*r; /*计算该圆的周长*/

printf(''此圆的周长为:%f'',s);

}程序运行结果如下:使用符号常量有以下好处:

(1)常量意义表示清楚。一般来说,定义符号常量的时候要求“见名知意”,这样在浏览程序时看到常量的名字就可以知道它代表什么意义。例如上例中的PI,看到常量名就很容易想到它代表的是 p 值。

(2)易于改变该常量的值。在一段程序中,同一符号常量可能被多次使用,在某些情况下这个符号常量的值很可能需要变化,那么只需在定义该符号常量的地方将其值改变,则程序中用到该常量的地方值都相应改变了。

2.变量

相对常量而言,C程序处理实际问题的时候有些数据量可能依据程序的需要发生变化,这样的量称为变量。变量通常用来存放一些程序处理过程的中间量或者处理结果。

变量一般有三要素,即变量名、变量的存储单元和变量值,如图2-2所示。变量名就是此变量的名称(即代号);变量的存储单元就是此变量在计算机存储设备中所占的存储单元;变量值就是此变量中存储的内容。图2-2变量名、变量值和变量的存储单元正如图2-2所示,在程序中若要使用变量中存储的值,则需先找到该值存储的位置,即变量的存储单元。变量名就是给此存储单元所起的名称,用这个名称就可以找到变量值在计算机中存储单元的位置。

在C程序中,标示符就可以用来标识变量名,即变量名的命名规则依照标示符的命名原则进行。以下列出的变量名都是合法的:

Student,teacher,_sum,Class,a1

而以下列出的变量名是不合法的:

?a,2sum,%a_1,b-b此外,在C程序中若要使用变量,则必须满足以下原则:

(1)先定义,后使用。在C程序中,若要使用某一变量,则必须在使用该变量之前定义该变量,否则程序在编译时就会出现该变量未经定义的错误提示。

(2)在程序中使用的变量都必须为其指定某一种确定的数据类型。确定了变量的类型,系统编译时就能为该变量分配相应大小的存储单元。2.2.2整型

1.整型常量

C程序中整型常量有三种表示形式。

十进制形式:数码范围为0~9,数前无前缀,例如123、-45、0。

八进制形式:数码范围为0~7,数前以0前缀,例如017(其十进制数为1×81+7×80=15)、0101(其十进制数为1×82+0×81+1×80=65)。

十六进制形式:数码范围为0~9和A~F,数前缀以0X或0x前缀,例如0X1F(其十进制数为1×161+15×160=31)、0XA0(其十进制数为10×161+0×160=160)。

2.整型变量

数据在内存中都是以二进制的形式存放的,整形数据在内存中是以其二进制补码的形式存放的。整形数据二进制补码按以下规则计算:

(1)如果是正数,则其补码就是其二进制形式。

(2)如果是负数,则其补码应该这样计算:先将该数的绝对值转换成二进制,然后按位取反,最后再给这个二进制数的最低位加一,计算出来的二进制数就是该负数的补码。

例如20,其补码就是将其转换成二进制形式,10100;而-20,先计算其绝对值20的二进制数10100,按位取反得01011,最低位加一得01100,即-20的补码为01100。

3.整型变量分类

整型变量的基本类型为int。通过加上修饰符,可定义更多的整型数据类型。

按照整型变量的数值范围,可将其分为基本整型(int)、短整型(short)和长整型(long)。

按照是否有符号,可将整型变量分为有符号整型(signed,默认)和无符号整型(unsigned)。

将其组合,就有以下六种类型的整形变量,即:

有符号基本整型[signed]int

无符号基本整型unsigned[int]

有符号短整型[signed]short[int]

无符号短整型unsignedshort[int]

有符号长整型[signed]long[int]

无符号长整型unsignedlong[int]

以上各种无符号类型量所占的内存空间字节数与其相应的有符号类型量相同。但是,由于省去了符号位,因而不能表示负数。

有符号整型变量最大表示数为32767,即二进制数0111111111111111;而无符号整型变量最大表示数为65535,即二进制数1111111111111111。

各种整型变量所占的内存空间字节数及其所能表示的数值范围如表2-1所示。表2-1各种整型变量所占的内存空间字节数及其所能表示的数值范围以18为例,在TurboC环境中,此整型量在内存中以各种类型存储所占空间形式如下:

int

shortint

longint

unsignedint

unsignedshortint

unsignedlongint

4.整型变量定义

变量定义的一般形式如下:

类型说明符变量名标示符1,变量名标示符2,…;

例:定义三个基本整数类型变量,变量名标示符为a、b、c,则定义语句为:

inta,b,c;

例:定义两个带符号短整数类型变量,变量名标示符为p、q,则定义语句为:

signedshortintp,q;注意:

(1)变量必须先定义再使用;

(2)允许同时定义多个相同类型的变量,变量名间用逗号分隔,最后一个变量名标示符后用分号结束。

5.整型变量的溢出

整型数最大表示值加一或者最小表示值减一,数据会出现与数学运算结果不同的现象,这就是数据的溢出。例如:根据数学知识,32767+1=32768,-32768-1=-32769。但是,TurboC环境下整型数据在内存中存储形式如下:①32767在内存中存储形式为:

②-32768在内存中存储形式为:

由以上存储形式可知,在TurboC环境中,32767+1得到的存储结果就是-32768,而-32768-1得到的存储结果就是32767。这种现象就称为数据的溢出。2.2.3实型

1.实型常量

实型也称为浮点型,实型常量也称为实数或浮点数。实型有以下两种形式:

(1)十进制小数形式,由数码(范围为0~9)及小数点组成,例如3.14、-35.74、0.25。

(2)指数形式,由十进制数加上阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。一般形式为aEn。其中,a为十进制数;n为十进制整数,可以带符号。其表示的值为a×10n。例如:3.14E5(其值为3.14×105)、-2.8E-2(其值为-2.8×10-2)。以下是不合法的实数指数形式:

E7(阶码标志E前无数字)

-5(无阶码标志)

2.7E(无阶码)

2.实型变量

实型数据在内存中一般占4B(32b)位。实型数据是按照指数形式存储的。系统将实型数据分为小数部分和指数部分,分别存放。例如实数3.14159在内存中存放形式如下:

数符小数部分指数部分

标准C没有规定小数部分和指数部分所占字节数,由编译系统自定。显然,小数部分所占位数多,则其表示的实型数据的精度高;指数部分所占位数多,则其表示的实型数据的数值范围大。

3.实型变量分类

实型变量根据其表示数据范围和精度分为单精度(float)、双精度(double)和长双精度(longdouble)三种。TurboC中各种实型所占内存字节数和所表示的数值范围如表2-2所示。表2-2TurboC中各实型所占内存字节数和所表示的数值范围

4.实型变量定义

实型变量的定义格式与整型相同。

例:定义两个单精度变量,变量名标示符为x、y,则定义格式为:

floatx,y;

5.实型变量的舍入误差

实型变量在内存中的存储总是由有限个存储单元存储的,因此提供的有效数字的位数是有限的。将一个实型数据存入内存单元,超出有效位数以外的数字就会被舍去,从而数据就会产生误差,即为舍入误差。

如下例就会出现实型数据的舍入误差。/*源程序2-2*/

#include<stdio.h>

main()

{

floata,b; /*定义两个单精度型变量a、b*/

a=123456.789e5;

b=a+20; /*给变量a、b赋值*/

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

printf("b=%f\n",b);

}程序运行结果如下:

由上例可以看出,变量a+20在变量b中并没有反映,这就是由于舍入误差造成的。

6.实型常数的类型

许多C编译系统将实型常数作为双精度数来处理。如果只需要系统将实型常数作为单精度数来处理,那么只需在该常数后加上字符f或F,如3.14f、5.2F,编译系统就会将此数按单精度数据处理。2.2.4字符型

1.字符型常量

字符型常量就是用单引号引起的一个字符,如 'a'、'k'、'+' 等都是字符常量。

在C语言中,字符常量具有以下特点:只能由单引号引起;只能为一个字符;字符可以是C字符集中的任意字符。

2.转义字符

转义字符是一种特殊的字符常量,通常以反斜线(\)开头,后面跟一个或几个合法字符组成。因其具有特殊含义,故称为转义字符。常用的转义字符如表2-3所示。表2-3常用的转义字符

3.字符变量

在C系统中,一个字符变量通常占用一个字节,其类型说明符为char。字符变量的定义形式与整型数据相同。

字符变量在内存中是以ASCII码的形式存放的。例如,字符 'A' 的十进制ASCII码为65,将其存入对应字符变量a中,存放的格式为:

因此,也可把字符变量看成是整型变量。C语言中允许对整型变量赋字符值,也允许对字符变量赋整型值。在输出时,也可按照需要进行整型值或字符值输出。/*源程序2-3*/

#include<stdio.h>

main()

{

chara,b; /*定义字符型变量a、b*/

a=120;

b=121; /*给变量a、b赋初值*/

printf(''%c,%c\n'',a,b); /*变量a、b以字符的形式输出*/

printf(''%d,%d\n'',a,b); /*变量a、b以整型的形式输出*/

}程序运行结果如下:2.2.5不同类型数据的混合运算

1.数据间的混合运算与类型转换

在进行数据处理时,经常会遇到类型不同的数据间进行混合运算的情况。在C语言中,允许进行整型、实型(单、双精度型)以及字符型数据的混合运算。

不同数据类型的数据进行混合运算时,必须将不同类型数据转换成同一类型,C程序方可进行处理。这一转换过程由编译系统自动完成,转换遵循的原则如图2-3所示。图2-3数据自动转换次序

(1)遇到图2-3所示水平位置类型数据的运算,必须进行转换。例如,两个char类型数据进行运算时,必须先转换成int型数据再进行计算;两个float类型数据进行运算时,同样必须都转换成double型再进行运算。

(2)如果进行了水平位置数据类型的转换后依然存在不同类型数据,则按照图示剪头由低向高的方向将级别较低的数据全部转换成混合运算中级别最高的数据,再进行运算。

设x为double型数据,y为float型数据,z为int型数据,有以下式子:

10+'A'+x*y+z显然这是一个多类型数据混合运算的例子,此式的运算顺序为:先将y转换成double型数据与x进行x*y运算,结果为double型;再将 'A' 转换成int型与10进行加运算,结果为int型;而后将10+'A' 运算的int型结果转换成与x*y运算的double型结果相同的类型,再进行加运算,得到的结果也为double型;最后再int型变量z转换成与上步得到的double型结果相同的类型,再进行加运算。最后这个式子得到的结果应为double型。

2.强制类型转换

强制类型转换就是利用强制类型转换运算符将一个表达式转换为程序设计所需数据类型的数据处理方式,通常称其为显示类型转换。其一般形式为:

(类型说明符)(表达式)

其含义为将表达式运算结果的数据类型转换成其前类型说明符指定的数据类型。例如:

(double)(x+y) //将表达式x+y的值强制转换成double类型

(int)a //将变量a的值强制转换成int类型

注意:强制转换类型说明符必须用括号()括起来,并且需要强制转换类型的表达式也需要用括号()括起(单个变量可以不加括号)。/*源程序2-4*/

#include<stdio.h>

main()

{

floata; /*定义float型变量a*/

a=3.14;

/*变量a强制转换成int型输出,再输出变量a*/

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

}程序运行结果如下:

说明:此源程序中定义了float型变量a,先将其强制类型转换成int型输出,再将变量a输出。不难发现,强制类型转换不改变原变量a的值,即a依然为float类型,且其值不发生任何变化。

2.3简单计算

2.3.1算术运算与算术表达式

1.常用的算术运算符

加法运算符(+):双目运算符,即此运算符要求有两个运算对象参加加法运算。具有左结合性。

减法运算符(-):双目运算符,即此运算符要求有两个运算对象参加减加法运算。具有左结合性。

乘法运算符(*):双目运算符,即此运算符要求有两个运算对象参加乘法运算。具有左结合性。除法运算符(/):双目运算符,即此运算符要求有两个运算对象参加除法运算。具有左结合性。C程序中除法运算符与数学的除法运算符具有以下区别:当参与运算的对象均为整型数据时,得到的结果也为整型;若结果不为整型数据,则直接舍去小数部分。例如,5/2,两个数均为整数,则结果舍去小数部分即为2,而不是2.5。如果参与运算的对象中有一个为实型数据,则运算结果为双精度型。

求余运算符(%):双目运算符,即此运算符要求有两个运算对象参加求余运算。具有左结合性。该运算符要求参与运算的两个对象必须为整型数据,运算结果为两数相除后的余数。例如,100%3,得到结果为1。

2.算术表达式

算术表达式就是用算术运算符和括号将运算对象连接起来构成的表达式。其中的运算对象可以是常量、变量和函数等。

C语言的算术表达式和数学表达式书写中有以下区别:

(1) C程序表达式中乘法符号(*)不能省略;

(2) C程序表达式中只能出现字符集允许的字符;

(3) C程序表达式中书写分子分母形式不能写成,而应写为(a+b)/(x+y);

(4) C程序表达式中可以使用()来改变运算的优先级,但是不可以使用{}和[]。

3.运算符的优先级和结合性

在C语言表达式中进行求值,各种运算应按照其优先级和结合性进行。求值按以下规则进行:

(1)在进行表达式求值时,先按运算符的优先级(见表2-4)由高至低的顺序执行。表2-4算术运算符优先级

(2)若一个运算对象两侧运算符优先级顺序相同,则按运算符的结合性进行。

①左结合性(自左向右结合):运算对象先与左侧的运算符结合;

②右结合性(自右向左结合):运算对象先与右侧的运算符结合。

例如:a+b-c,b对象左右侧运算符优先级相同,则应该按照结合性进行。由于+和-的结合性均为左结合性,则b应先与左侧运算符结合,所以,a+b-c等价于(a+b)-c。

在书写多个运算符表达式时,为了清楚地表达出各个运算的优先顺序,可以使用()强制规定顺序,以确保计算结果正确。2.3.2赋值运算符与赋值表达式

1.赋值运算符及其表达式

简单的赋值运算符为“=”,具有右结合性。由“=”连接的表达式称为赋值表达式。赋值表达式的一般形式如下:

变量=表达式

其含义为:将赋值运算符右侧表达式的值赋予左侧的变量。

例如:sum=a+b,含义为将表达式a+b的值赋予变量sum。

例如:x=y=8,根据其右结合性,其应被理解为x=(y=8)。

2.赋值类型转换

在使用赋值运算符时,经常会遇到赋值运算符左右两侧对象数据类型不一致的情况,此时系统将自动进行类型转换,即将赋值运算符右侧对象的数据类型转换成左侧对象的数据类型,然后再进行赋值。具体规则如表2-5所示。表2-5赋值类型转换总之,不同类型整型数据间的赋值归根结底是按存储单元的存储形式直接传送。

3.复合的赋值运算符

在简单的赋值运算符“=”之前加上其它双目运算符,就构成了复合的赋值运算符。例如,+=、-=、*= 等等。其一般形式如下:

变量双目运算符= 表达式

它可以被理解为等效形式:

变量=变量双目运算符表达式

例如:x*=6,等效形式为x=x*6;a*=b-3,等效形式为a=a*(b-3)。2.3.3自加、自减和逗号运算

1.自加、自减运算

在程序设计中,经常会遇见将变量的值加1或减1的运算,即变量的自加和自减运算。

自加运算符,记为“++”,其功能为使变量值加1。

自减运算符,记为“--”,其功能为使变量值减1。

自加和自减运算符为单目运算符,均具有右结合性。一般常见的几种使用形式如下:

①++i:变量i自增1后,再参与其他运算;

②--i:变量i自减1后,再参与其他运算;

③i++:变量i参与其他运算后,再自增1;

④i--:变量i参与其他运算后,再自减1。/*源程序2-5*/

#include<stdio.h>

main()

{

inti=8;

printf("%d\n",++i);

printf("%d\n",--i);

printf("%d\n",i++);

printf("%d\n",i--);

}程序运行结果如下:

i的初值为8;第2行,i先自加1后再输出9;第3行,i自减1后再输出8;第4行,先输出8,i再自加1,其值变为9;第5行先输出9,i再自减1,其值变为8。/*源程序2-6*/

#include<stdio.h>

main()

{

inti=5,j=5,p,q;

p=(++i)+(++i)+(++i);

q=(j++)+(j++)+(j++);

printf("%d,%d,%d,%d\n",p,q,i,j);

}程序运行结果如下:

注意:不同的编译系统处理表达式(++i)+(++i)+(++i)时的顺序不同,因此相同的算式可能得到的结果不同。

2.逗

温馨提示

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

评论

0/150

提交评论