1、C程序设计(第五版)程序设计和C语言计算机程序可以被计算机理解并执行的基本操作命令。指令指令与计算机系统操作有关的计算机程序、规程、规则,以及可能有的文件、文档及数据。软件软件一组计算机能识别和执行的指令。一个特定的指令序列用来完成一定的功能。程序程序计算机语言机器语言计算机能直接识别和接受的二进制代码称为机器指机器指令令。机器指令的集合就是该计算机的机器语言机器语言。特点:难学,难记,难检查,难修改,难以推广使用。依赖具体机器难以移植。汇编语言机器语言的符号化。用英文字母和数字表示指令的符号语言符号语言。特点:相比机器语言简单好记,但仍然难以普及。汇编指令需通过汇编程序汇编程序转换为机器指令
2、才能被计算机执行。依赖具体机器难以移植。高级语言高级语言更接近于人们习惯使用的自然语言和数学语言。特点:功能强大,不依赖于具体机器。用高级语言编写的源程序源程序需要通过编编译程序译程序转换为机器指令的目标程序目标程序。B8 7F 01BB 21 0203 D8B8 1F 042B C3MOV AX 383MOV BX 545ADD BX AXMOV AX 1055SUB AX BXS=1055-(383+545)高级语言的发展010203非结构化的语言规定:程序必须由具有良好特性的基本结构(顺序结构、选择结构、循环结构)构成,程序中的流程不允许随意跳转,程序总是由上而下顺序执行各个基本结构。特
3、点:程序结构清晰,易于编写、阅读和维护。面向对象的语言结构化语言C语言的发展D.M.Ritchie19721973年间,美国贝尔实验室的D.M.Ritchie 在B语言的基础上设计出了C语言。最初的C语言只是为描述和实现UNIX操作系统提供一种工作语言而设计的。随着UNIX的日益广泛使用,C语言也迅速得到推广。1978年以后,C语言先后移植到大、中、小和微型计算机上。C语言便很快风靡全世界,成为世界上应用最广泛的程序设计高级语言。以UNIX第7版中的C语言编译程序为基础,1978年,Brian W.Kernighan和Dennis M.Ritchie 合著了影响深远的名著The C Progr
4、amming Language,这本书中介绍的C语言成为后来广泛使用的C语言版本的基础,它是实际上第一个C语言标准。1983年,美国国家标准协会(ANSI),根据C语言问世以来各种版本对C语言的发展和扩充,制定了第一个C语言标准草案(83 ANSI C)。1989年,ANSI公布了一个完整的C语言标准ANSI X3.1591989(常称为ANSI C或C 89)。1990年,国际标准化组织ISO(International Standard Organization)接受C 89作为国际标准ISO/IEC 9899: 1990,它和ANSI的C 89基本上是相同的。1999年,ISO又对C语言
5、标准进行了修订,在基本保留原来的C语言特征的基础上,针对应用的需要,增加了一些功能,尤其是C+中的一些功能,并在2001年和2004年先后进行了两次技术修正,它被称为C 99,C 99是C 89的扩充。目前由不同软件公司所提供的一些C语言编译系统并未完全实现C 99建议的功能,它们多以C 89为基础开发。C语言的特点 语言简洁、紧凑,使用方便、灵活0102030405060708C C语法限制不太严格,程序设计自由度大运算符丰富 数据类型丰富具有结构化的控制语句用函数作为程序的模块单位,便于实现程序的模块化C语言是完全模块化和结构化的语言生成目标代码质量高,程序执行效率高程序可移植性好允许直接
6、访问物理地址能进行位(bit)操作能实现汇编语言的大部分功能可以直接对硬件进行操作因此C语言既具有高级语言的功能,又具有低级语言的许多功能,可用来编写系统软件最简单的C语言程序【例1.1】要求在屏幕上输出:This is a C program.解题思路解题思路: : 在主函数中用printf函数原样输出以上文字。#include /这是编译预处理指令int main()/定义主函数 /函数开始的标志 printf(This is a C program.n);/输出所指定的一行信息 return 0;/函数执行完毕时返回函数值0/函数结束的标志程 序 分 析mainmain是函数的名字,表示
7、“主函数”;每一个C语言程序都必须有一个 main 函数。main前面的intint表示此函数的类型是int类型(整型),即在执行主函数后会得到一个值(即函数值),其值为整型。return 0;return 0;的作用是当main函数执行结束前将整数0作为函数值,返回到调用函数处。函数体由花括号括起来。printfprintf是C编译系统提供的函数库中的输出函数(详见第4章)。printf函数中双引号双引号内的字符串This is a C program.按原样输出。nn是换行符,即在输出This is a C program.后,显示屏上的光标位置移到下一行的开头。每个语句最后都有一个分号分
8、号,表示语句结束。最简单的C语言程序【例1.1】要求在屏幕上输出:This is a C program.解题思路解题思路: : 在主函数中用printf函数原样输出以上文字。#include /这是编译预处理指令int main()/定义主函数 /函数开始的标志 printf(This is a C program.n);/输出所指定的一行信息 return 0;/函数执行完毕时返回函数值0/函数结束的标志最简单的C语言程序#include /这是编译预处理指令int main()/定义主函数 /函数开始的标志 printf(This is a C program.n);/输出所指定的一行信
9、息 return 0;/函数执行完毕时返回函数值0/函数结束的标志程 序 分 析mainmain是函数的名字,表示“主函数”;每一个C语言程序都必须有一个 main 函数。main前面的intint表示此函数的类型是int类型(整型),即在执行主函数后会得到一个值(即函数值),其值为整型。return 0;return 0;的作用是当main函数执行结束前将整数0作为函数值,返回到调用函数处。函数体由花括号括起来。最简单的C语言程序#include /这是编译预处理指令int main()/定义主函数 /函数开始的标志 printf(This is a C program.n);/输出所指定的
10、一行信息 return 0;/函数执行完毕时返回函数值0/函数结束的标志程 序 分 析printfprintf是C编译系统提供的函数库中的输出函数(详见第4章)。printf函数中双引号双引号内的字符串This is a C program.按原样输出。nn是换行符,即在输出This is a C program.后,显示屏上的光标位置移到下一行的开头。每个语句最后都有一个分号分号,表示语句结束。最简单的C语言程序#include /这是编译预处理指令int main()/定义主函数 /函数开始的标志 printf(This is a C program.n);/输出所指定的一行信息 retu
11、rn 0;/函数执行完毕时返回函数值0/函数结束的标志程 序 分 析在使用函数库中的输入输出函数时,编译系统要求程序提供有关此函数的信息,程序第1行“#include #include ”的作用就是用来提供这些信息的。stdio.hstdio.h是系统提供的一个文件名,stdiostdio是standard input & output的缩写,文件后缀.h.h的意思是头文件(header file),因为这些文件都是放在程序各文件模块的开头的。输入输出函数的相关信息已事先放在stdio.h文件中。最简单的C语言程序#include /这是编译预处理指令int main()/定义主函数 /函数开
12、始的标志 printf(This is a C program.n);/输出所指定的一行信息 return 0;/函数执行完毕时返回函数值0/函数结束的标志程 序 分 析/表示从此处到本行结束是“注释”,用来对程序有关部分进行必要的说明。在写C程序时应当多用注释,以方便自己和别人理解程序各部分的作用。在程序进行预编译处理时将每个注释替换为一个空格,因此在编译时注释部分不产生目标代码,注释对运行不起作用。注释只是给人看的,而不是让计算机执行的。注释这种注释可以单独占一行,也可以出现在一行中其他内容的右侧。此种注释的范围从/开始,以换行符结束。如果注释内容一行内写不下,可以用多个单行注释。这种注释
13、可以包含多行内容。它可以单独占一行(在行开头以/*开始,行末以*/结束),也可以包含多行。编译系统在发现一个/*后,会开始找注释结束符*/,把二者间的内容作为注释。以/开始的单行注释以/*开始,以*/结束的块式注释注意:在字符串中的/和/*都不作为注释的开始。而是作为字符串的一部分。/第一行注释/继续注释/*一整块都是注释*/注释#include int main() printf(/how do you do!n); return 0;#include int main() printf(/*how do you do!*/n); return 0;最简单的C语言程序【例1.2】求两个整数之
14、和解题思路解题思路: : 设置3个变量,a和b用来存放两个整数,sum用来存放和数。用赋值运算符“=”把相加的结果传送给sum。#include /这是编译预处理指令 int main( )/定义主函数 /函数开始 int a,b,sum; /本行是程序的声明部分,定义a,b,sum为整型变量 a=123;/对变量a赋值 b=456;/对变量b赋值 sum=a+b;/进行a+b的运算,并把结果存放在变量sum中 printf(sum is %dn,sum); /输出结果 return 0;/使函数返回值为0/函数结束最简单的C语言程序#include /这是编译预处理指令 int main(
15、)/定义主函数 /函数开始 int a,b,sum; /本行是程序的声明部分,定义a,b,sum为整型变量 a=123;/对变量a赋值 b=456;/对变量b赋值 sum=a+b;/进行a+b的运算,并把结果存放在变量sum中 printf(sum is %dn,sum); /输出结果 return 0;/使函数返回值为0/函数结束程 序 分 析printfprintf(sum is %d(sum is %dn,sumn,sum); ); printf函数圆括号内有两个参数。第一个参数是双引号中的内容sum is %dn,它是输出格式字符串,作用是输出用户希望输出的字符和输出的格式。其中sum
16、 is是用户希望输出的字符,d d是指定的输出格式,d d表示用“十进制整数”形式输出。圆括号内第二个参数sum表示要输出变量sum的值。在执行printf函数时,将sum变量的值(以十进制整数表示)取代双引号中的%d。printf(sum is %dn, sum); 输出时用sum的值取代%d最简单的C语言程序【例1.3】求两个整数中的较大者解题思路解题思路: : 用一个函数来实现求两个整数中的较大者。在主函数中调用此函数并输出结果。#include /主函数int main()/定义主函数/主函数体开始int max(int x,int y);/对被调用函数max的声明int a,b,c;
17、/定义变量a,b,cscanf(%d,%d,&a,&b); /输入变量a和b的值c=max(a,b);/调用max函数,将得到的值赋给cprintf(max=%dn,c); /输出c的值return 0;/返回函数值为0/主函数体结束/求两个整数中的较大者的max函数int max(int x,int y)/定义max函数,函数值为整型, 形式参数x和y为整型 int z;/max函数中的声明部分,定义本函数中用到的变量z为整型if(xy)z=x;/若xy成立,将x的值赋给变量zelse z=y;/否则(即xy不成立),将y的值赋给变量zreturn(z); /将z的值作为max函数值,返回到
18、调用max函数的位置最简单的C语言程序#include /主函数int main()/定义主函数/主函数体开始int max(int x,int y);/对被调用函数max的声明int a,b,c;/定义变量a,b,cscanf(%d,%d,&a,&b); /输入变量a和b的值c=max(a,b);/调用max函数,将得到的值赋给cprintf(max=%dn,c); /输出c的值return 0;/返回函数值为0/主函数体结束/求两个整数中的较大者的max函数int max(int x,int y)/定义max函数,函数值为整型, 形式参数x和y为整型 int z;/max函数中的声明部分,
19、定义本函数中用到的变量z为整型if(xy)z=x;/若xy成立,将x的值赋给变量zelse z=y;/否则(即xy不成立),将y的值赋给变量zreturn(z); /将z的值作为max函数值,返回到调用max函数的位置程 序 分 析本程序包括两个函数:主函数main;被调用的函数max。max函数的作用是将x和y中较大者的值赋给变量z,最后通过return语句将z的值作为max的函数值返回给调用max函数的主函数。scanfscanf是输入函数的名字(scanf和printf都是C的标准输入输出函数)。该scanf函数的作用是输入变量a和b的值。max(amax(a,b)b)调用max函数。在
20、调用时将a和b作为max函数的实际参数实际参数的值分别传送给max函数中的形式参数形式参数x和y。最简单的C语言程序#include /主函数int main()/定义主函数/主函数体开始int max(int x,int y);/对被调用函数max的声明int a,b,c;/定义变量a,b,cscanf(%d,%d,&a,&b); /输入变量a和b的值c=max(a,b);/调用max函数,将得到的值赋给cprintf(max=%dn,c); /输出c的值return 0;/返回函数值为0/主函数体结束/求两个整数中的较大者的max函数int max(int x,int y)/定义max函数
21、,函数值为整型, 形式参数x和y为整型 int z;/max函数中的声明部分,定义本函数中用到的变量z为整型if(xy)z=x;/若xy成立,将x的值赋给变量zelse z=y;/否则(即xy不成立),将y的值赋给变量zreturn(z); /将z的值作为max函数值,返回到调用max函数的位置注意:本例程序中两个函数都有return语句,请注意它们的异同。两个函数都定义为整型,都有函数值,都需要用return语句为函数指定返回值。main函数中的return语句指定的返回值一般为0。max函数的返回值是max函数中求出的两数中的最大值z,只有通过return语句才能把求出的z值作为函数的值并
22、返回调用它的main函数中。C语言程序的结构 一个程序由一个或多个源程序文件组成源程序文件包括:预处理指令、全局声明、函数定义 函数时C程序的主要组成部分一个C语言程序是由一个或多个函数组成的,其中必须包含唯一一个main函数程序中被调用的函数可以是系统提供的库函数,也可以是用户根据需要自己编制设计的函数 一个函数包括两个部分:函数首部和函数体,函数体一般包括声明部分和执行部分 程序总是从main函数开始执行 程序中的操作是由函数中的C语句完成的 在每个数据声明和语句的最后必须有一个分号 C语言本身不提供输入输出语句,输入输出操作由函数完成 程序应当包含注释#include int main(
23、) int max(int x,int y);int a,b,c;scanf(%d,%d,&a,&b); c=max(a,b); printf(max=%dn,c); return 0;int max(int x,int y) int z;if(xy)z=x;else z=y; return(z);预处理指令main函数自定义函数库函数调用自定义函数调用intmax(int x,int y) 函数类型 函数名参数类型 参数名参数类型 参数名运行C程序的步骤与方法开始编辑编译有错?连接执行 结果 正确?结束无正确有不正确可执行目标程序f.exe源程序f.c目标程序f.obj库函数和其他目标程序程
24、序设计的任务问题分析问题分析设计算法设计算法编写程序编写程序对源程序进对源程序进行编辑、编行编辑、编译和连接译和连接运行程序运行程序分析结果分析结果编写程序编写程序文档文档算法程序的灵魂数据结构对数据的描述。在程序中要指定用到哪些数据,以及这些数据的类型和数据的组织形式。算法对操作的描述。即要求计算机进行操作的步骤算法+数据结构=程序沃思算法程序员程序员数据结构语言工具程序设计方法算 法广义地说,为解决一个问题而采取的方法和步骤,就称为“算法”。对同一个问题,可以有不同的解题方法和步骤。为了有效地进行解题,不仅需要保证算法正确,还要考虑算法的质量,选择合适的算法。 非数值运算算法数值运算算法算
25、法数值运算的目的是求数值解。由于数值运算往往有现成的模型,可以运用数值分析方法,因此对数值运算的算法的研究比较深入,算法比较成熟。计算机在非数值运算方面的应用远超在数值运算方面的应用。非数值运算的种类繁多,要求各异,需要使用者参考已有的类似算法,重新设计解决特定问题的专门算法。简单的算法举例【例2.1】求12345S1: 先求1乘以2,得到结果2S2: 将步骤1得到的乘积2再乘以3,得到结果6S3: 将6再乘以4,得24S4: 将24再乘以5,得120算法算法步骤步骤S1: 令p=1,或写成1=p(表示将1存放在变量p中)S2: 令i=2,或写成2=i(表示将2存放在变量i中)S3: 使p与i
26、相乘,乘积仍放在变量p中,可表示为: p*i=pS4: 使i的值加1,即i+1=iS5: 如果i不大于5,返回重新执行S3及其后的步骤S4和S5;否则,算法结束。最后得到p的值就是5!的值。算法算法步骤步骤若题目改为: 求13579113=ii+2=i若i11,返回S3;否则,结束或者 若i11,结束;否则,返回S3i=32用这种方法表示的算法具有一般性、通用性和灵活性用这种方法表示的算法具有一般性、通用性和灵活性简单的算法举例【例2.2】有50个学生,要求输出成绩在80分以上的学生的学号和成绩S1: 1=iS2: 如果gi80,则输出ni和gi,否则不输出 S3: i+1=iS4: 如果i5
27、0,返回到S2,继续执行,否则,算法结束算法算法步骤步骤n:表示学生学号下标i:表示第几个学生n1:表示第一个学生的学号ni:表示第i个学生的学号g:表示学生的成绩g1:表示第一个学生的成绩gi:表示第i个学生的成绩简单的算法举例【例2.3】判定20002500年中的每一年是否为闰年,并将结果输出S1: 2000=yearS2: 若year不能被4整除,则输出year 的值和“不是闰年”。然后转到S6,检查下一个年份S3: 若year能被4整除,不能被100整除,则输出year的值和“是闰年”。然后转到S6S4: 若year能被400整除,输出year的值和“是闰年” ,然后转到S6S5: 输
28、出year的值和“不是闰年”S6: year+1=yearS7: 当year2500时,转S2继续执行,否则算法停止算法算法步骤步骤Year被100整除,又能被400整除0101030304040202Year被4整除,但不能被100整除Year不能被4整除其他非闰年非闰年闰年闰年简单的算法举例S1: sign=1S2: sum=1S3: deno=2S4: sign=(-1)signS5: term=sign(1/deno)S6: sum=sum+termS7: deno=deno+1S8: 若deno100返回S4;否则算法结束算法算法步骤步骤sign:表示当前项的数值符号term:表示当
29、前项的值sum:表示当前项的累加和deno:表示当前项的分母简单的算法举例【例2.5】给出一个大于或等于3的正整数,判断它是不是一个素数S1: 输入n的值S2: i=2(i作为除数)S3: n被i除,得余数rS4: 如果r=0,表示n能被i整除,则输出n“不是素数”,算法结束;否则执行S5S5: i+1=iS6: 如果in-1,返回S3;否则输出n的值以及“是素数”,然后结束算法算法步骤步骤解题思路解题思路: : 所谓素数(prime),是指除了1和该数本身之外,不能被其他任何整数整除的数。算法的特性12345有穷性有穷性 一个算法应包含有限的操作步骤,而不能是无限的确定性确定性 算法中的每一
30、个步骤都应当是确定的,而不应当是含糊的、模棱两可的 有零个或多个输入有零个或多个输入所谓输入是指在执行算法时需要从外界取得必要的信息有一个或多个输出有一个或多个输出算法的目的是为了求解,“解” 就是输出有效性有效性算法中的每一个步骤都应当能有效地执行,并得到确定的结果算法的表示伪代码结构化流程图传统流程图自然语言用流程图表示算法起止框输入输出框判断框处理框流程线连接点注释框算法的流程图表示举例【例2.6】将例2.1的算法用流程图表示。 求12345。S1: 1=pS2: 2=iS3: p*i=pS4: i+1=iS5: 如果i5,则返回S3;否则结束算法算法步骤步骤开始1=p2=ip*i=pi
31、+1=i结束YN输出pi5P: 表示被乘数i: 表示乘数算法的流程图表示举例【例2.7】例2.2的算法用流程图表示。 有50个学生,要求输出成绩在80分以上的学生的学号和成绩。S1: 1=iS2: 如果gi80,则输出ni和gi,否则不输出 S3: i+1=iS4: 如果i50,返回到S2,继续执行,否则,算法结束算法算法步骤步骤开始1=ii+1=i1=ii+1=ii5结束YN输入ni、gii50Ygi80Y输出ni、giNn:表示学生学号下标i:表示第几个学生n1:表示第一个学生的学号ni:表示第i个学生的学号g:表示学生的成绩g1:表示第一个学生的成绩gi:表示第i个学生的成绩算法的流程图
32、表示举例【例2.8】例2.3判定闰年的算法用流程图表示。 判定20002500年中的每一年是否为闰年,将结果输出。开始2000=yearNYear不能被4整除Y输出year“是闰年”NYear不能被100整除YYear不能被400整除输出year“不是闰年”N输出year“是闰年”输出year“不是闰年”Year+1=yearYear2500YY结束算法的流程图表示举例S1: sign=1S2: sum=1S3: deno=2S4: sign=(-1)*signS5: term=sign*(1/deno)S6: sum=sum+termS7: deno=deno+1S8: 若deno100返回
33、S4;否则算法结束算法算法步骤步骤sign:表示当前项的数值符号term:表示当前项的值sum:表示当前项的累加和deno:表示当前项的分母开始1=sum1=sign结束输入sumdeno100YN2=deno(-1)*sign=signsign*(1/deno)=termsum+term=sumdeno+1=deno简单的算法举例【例2.10】例2.5判断素数的算法用流程图表示。 对一个大于或等于3的正整数,判断它是不是一个素数。算法算法步骤步骤开始n/i的余数=r结束输出n“是素数”YN2=ii+1=i输入nr=0输出n“不是素数”传统流程图的弊端传统的流程图用流程线指出各框的执行顺序,对
34、流程线的使用没有严格限制。因此,使用者可以不受限制地使流程随意地转来转去,使流程图变得毫无规律,阅读时要花很大精力去追踪流程,使人难以理解算法的逻辑。三种基本结构AB顺序结构顺序结构ABP选择选择结构结构P假真循环循环结构结构A三种基本结构的特点1只有一个入口2只有一个出口3结构内的每一部分都有机会被执行到4结构内不存在“死循环”用N-S流程图表示算法用伪代码表示算法伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。它如同一篇文章一样,自上而下地写下来。每一行(或几行)表示一个基本操作。它不用图形符号,因此书写方便,格式紧凑,修改方便,容易看懂,也便于向计算机语言算法(即程序)过渡
35、。算法的流程图表示举例【例2.16】求5!,用伪代码表示。S1: 1=pS2: 2=iS3: p*i=pS4: i+1=iS5: 如果i5,则返回S3;否则结束算法算法步骤步骤P: 表示被乘数i: 表示乘数begin(算法开始) 1=p 2=I while i5 p*i=p i+1=I print pend(算法结束)伪代码算法的流程图表示举例begin(算法开始) 1=sign 1=sum 2=deno while deno100 (-1)*sign=sign sign*(1/deno)=term sum+term=sum deno+1=deno print sumend(算法结束)伪代码S
36、1: sign=1S2: sum=1S3: deno=2S4: sign=(-1)* signS5: term=sign*(1/deno)S6: sum=sum+termS7: deno=deno+1S8: 若deno100返回S4;否则算法结束算法算法步骤步骤sign:表示当前项的数值符号term:表示当前项的值sum:表示当前项的累加和deno:表示当前项的分母用计算机语言表示算法【例2.18】将例2.16表示的算法(求5!)用C语言表示。S1: 1=pS2: 2=iS3: p*i=pS4: i+1=iS5: 如果i5,则返回S3;否则结束算法算法步骤步骤P: 表示被乘数i: 表示乘数#i
37、nclude int main()int i,p;p=1;i=2;while(i=5)p=p*i;i=i+1;printf(%dn,p);return 0;用计算机语言表示算法#include int main()int sign=1;double deno=2.0,sum=1.0,term;while(deno=100)sign=-sign;term=sign/deno;sum=sum+term;deno=deno+1;printf(%fn,sum);return 0;S1: sign=1S2: sum=1S3: deno=2S4: sign=(-1)* signS5: term=sign*
38、(1/deno)S6: sum=sum+termS7: deno=deno+1S8: 若deno100返回S4;否则算法结束算法算法步骤步骤sign:表示当前项的数值符号term:表示当前项的值sum:表示当前项的累加和deno:表示当前项的分母结构化程序设计方法3241最简单的C程序设计顺序程序设计顺序程序设计举例【例3.2】有人用温度计测量出用华氏法表示的温度(如64F), 今要求把它转换为以摄氏法表示的温度(如17.8)。N-SN-S流程图流程图输入f的值输出c的值#include int main()float f,c;/定义f和c为单精度浮点型变量f=64.0;/指定f的值c=(5.
39、0/9)*(f-32);/利用公式计算c的值printf(f=%fnc=%fn,f,c);/输出c的值return 0; 顺序程序设计举例【例3.2】计算存款利息。有1000元,想存一年。有3种方法可选:(1)活期,年利率为r1;(2)一年期定期,年利率为r2;(3)存两次半年定期,年利率为r3。请分别计算出一年后按3种方法所得到的本息和。N-SN-S流程图流程图输入p0,r1,r2,r3的值输出p1,p2,p3#include int main ()float p0=1000, r1=0.0036, r2=0.0225, r3=0.0198, p1, p2, p3; /定义变量p1=p0*(
40、1+r1);/计算活期本息和p2=p0*(1+r2);/计算一年定期本息和p3=p0*(1+r3/2)*(1+r3/2);/计算存两次半年定期的本息和printf(p1=%fnp2=%fnp3=%fn,p1, p2, p3); /输出结果return 0;在计算机高级语言中,数据的两种表现形式:常量A A变量B B常 量整型常量. 1000,12345,0,-3452实型常量. 小数形式小数形式123.456;指数形式指数形式12.34e3,-34.8E-233字符常量. 普通字符普通字符a,Z,#;转义字转义字符符n,012,h1B4字符串常量. “123”,”boy”5符号常量.#defi
41、ne PI 3.1416 /注意行末没有分号1转义字符表示的字符 转义序列 名称 名称缩写 对应字符的编码值 (十六进制表示) a 响铃 Bel 0 x7 b 退格 BS 0 x8 f 换页 FF 0 xc n 换行 LF 0 xa r 回车符 CR 0 xd t 水平制表符(横向跳格) HT 0 x9 v 垂直制表符(纵向跳格) VT 0 x6 单引号 0 x27 ” 双引号 0 x22 ? 问号 0 x35 反斜线 0 x5c 0 字符串结束符(空) NULL 0 x0 ddd 八进制数 ddd 表示的字符 xhhh 十六进制数 hhh 表示的字符 变 量变量代表一个有名字的、具有特定属性
42、的一个存储单元。变量用来存放数据,也就是存放变量的值。在程序运行期间,变量的值是可以改变的。变量必须先定义,后使用。a a3变量名变量值存储单元常 变 量C o n s tC o n s t i n ti n t a = 3 a = 3常变量与常量的异同是: 常变量具有变量的基本属性: 有类型,占存储单元,只是不允许改变其值。可以说,常变量是有名字的不变量,而常量是没有名字的不变量。有名字就便于在程序中被引用。#define Pi 3.1415926/定义符号常量const float pi=3.1415926;/定义常变量符号常量Pi和常变量pi都代表3.1415926,在程序中都能使用。但
43、二者性质不同: 定义符号常量用#define指令,它是预编译指令,它只是用符号常量代表一个字符串,在预编译时仅进行字符替换,在预编译后,符号常量就不存在了(全置换成3.1415926了),对符号常量的名字是不分配存储单元的。而常变量要占用存储单元,有变量值,只是该值不改变而已。从使用的角度看,常变量具有符号常量的优点,而且使用更方便。有了常变量以后,可以不必多用符号常量。定义a为一个整型变量,指定其值为3,而且在变量存在期间其值不能改变说明: 有些编译系统还未实现C 99的功能,因此不能使用常变量。标 识 符标识符就是一个对象的名字。用于标识变量、符号常量、函数、数组、类型等标识符只能由字母、
44、数字和下划线3种字符组成,且第1个字符必须为字母或下划线注意变量名中区分大小写字母不能使用关键字作为变量名变量的名字应该尽量反映变量在程序中的作用与含义C语言中的关键字Autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatilewhile数据类型所谓类型,就是对数据分配存储单元的安排,包括存储单元的长度(占多少字节)以及数据的存储形式。
45、不同的类型分配不同的长度和存储形式。数据类型基本类型整型类型基本整型 int短整型 short int长整型 long int*双长整型 long long int字符型 char*布尔型 bool浮点类型单精度浮点型 float双精度浮点型 double复数浮点型 float_complex,double_complex,long long _complex枚举类型 enum空类型 void派生类型指针类型 *数组类型 结构体类型 union函数类型计算机中带符号整型数的表示:补码0 00 00 00 00 00 00 00 00 00 00 00 00 01 10 01 1正整数的补码就是
46、此数的二进制形式,5的补码:负整数的补码是将此数绝对值的二进制形式;除最高位符号位外其他数取反;加1。-5的补码:1 10 00 00 00 00 00 00 00 00 00 00 00 01 10 01 11 11 11 11 11 11 11 11 11 11 11 11 11 10 01 10 00 01 11 11 11 11 11 11 11 11 11 11 11 10 01 11 1整型数据整型数据类型整型数据类型缺省形式缺省形式的的整型整型数据类型数据类型字节数字节数取值范围取值范围signed intint4-21474836482147483647(-231231-1)u
47、nsigned intUnsigned404294967295(0232-1)signed short intshort2-3276832767(-215215-1)unsigned short intunsigned short2065535(0216-1)signed long intlong4-21474836482147483647(-231231-1)unsigned long intunsigned long404294967295(0232-1)signed long long intlong long8-9223372036854775808922337203685477580
48、7(-263263-1)unsigned long long intunsigned long long8018446744073709551615(0264-1)说明: C标准没有具体规定各种类型数据所占用存储单元的长度,只要求sizeof(short)sizeof(int)sizeof(long)sizeof(long long),具体由各编译系统自行决定的。sizeof是测量类型或变量长度的运算符。整型数据(1) 只有整型(包括字符型)数据可以加signed或unsigned修饰符,实型数据不能加。(2) 对无符号整型数据用“%u”格式输出。%u表示用无符号十进制数的格式输出。如:在将一
49、个变量定义为无符号整型后,不应向它赋予一个负值,否则会得到错误的结果。如: unsigned short price=50;/定义price为无符号短整型变量printf(%un,price); /指定用无符号十进制数的格式输出unsigned short price = -1; /不能把一个负整数存储在无符号变量中printf(%dn,price);字符型数据ASCII字符集包括:字母: 大写英文字母AZ,小写英文字母az数字: 09专门符号: 29个,包括! # & ( ) * + , - . / : ; ? _ | 空格符: 空格、水平制表符(tab)、垂直制表符、换行、换页(form
50、feed)不能显示的字符: 空(null)字符(以0表示)、警告(以a表示)、退格(以b表示)、回车(以r表示)等ASCII码表注意字符1和整数1是不同的概念。字符1只是代表一个形状为1的符号,在需要时按原样输出,在内存中以ASCII码形式存储,占1个字节。而整数1是以整数存储方式(二进制补码方式)存储的,占2个或4个字节。整数运算1+1等于整数2,而字符1+1并不等于整数2或字符2。0 0 1 1 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1字符变量字符变量是用类型符char定义字符变量。char c=?;/定义c为字符型变量并使初值为字符?。?的ASCII代