C语言程序设计Copyer:Vigiking第一章计算机语言与C语言概述1.1计算机语言概念■计算机语言定义计算机能够识别和接受的语言。要使计算机按自己的意图工作,必须使用计算机所能接受、理解和执行的指令指挥计算机工作。■计算机语言的种类机器语言低级语言汇编语言(面向计算机)BASIC入门语言F77科学计算高级语言Foxpro数据库管理(面向问题)C多用途计算机语言…………•机器语言最早问世,用二进制代码构成指令。如:100000(+)110000(-)用机器语言编程的缺点:─繁琐、不直观、不易调试。如计算y=2x2+3x-1需要七八条指令。─移植性差。依赖于计算机。•汇编语言用符号构成指令,如:MOV、ADD用汇编语言编程:相对直观,但仍繁琐,仍是面向计算机的语言。汇编语言是计算机间接接受的语言•高级语言与低级语言相比,有根本性的区别:是面向问题的语言。高级语言的一条指令(语句):y=2*x*x+3*x-1;对应于:y=2x2+3x-1y=sin(x);对应于:y=sinx用高级语言编程:直观、易懂、移植性好(不依赖于具体计算机)上机运行高级语言程序需经过编译:编译执行要上机完成一个计算问题,主要的任务就是用高级语言编写出相应的源程序。即至少要学会一种计算机语言。高级语言源程序机器指令目的程序结果编译程序1.2C语言的特点集高级语言和低级语言的优点于一身:●能实现低级语言的大部分功能(如直接访问内存物理地址、进行位操作等)。●图形功能强。●运算符和数据结构丰富。●语法限制不太严格,程序设计自由度大。●生成目标代码质量高,程序执行效率高。1.3简单的C程序介绍例1:main()主函数说明{程序框架printf(“abcdef”);函数体}语句程序的功能是输出字符串:abcdef例2:求两数之和。main(){inta,b,c;aa=100;b=50;bc=a+b;cprintf(“\nc=%d”,c);}程序运行结果:c=150例3:求两数中的最大值。函数类型函数名形参main()intmax(intx,inty){inta,b,c;{intz;scanf(“%d,%d”,&a,&b);if(xy)z=x;c=max(a,b);elsez=y;printf(“\nmaxis:%d”,c);return(z);}}axbycz(两个函数组成)353555总结上例可知:(1)C程序由函数构成。(2)函数由两部分组成:函数说明部分:函数名、函数类型、形参名、形参类型。函数体:实现函数的具体操作;由语句构成。(3)程序总是从main函数开始执行。(4)书写格式自由。(5)语句必须有分号。:第二章算法2.1算法的概念要利用计算机处理问题,光学习语言的语法规则还不够,最重要的是要学会针对各类型的问题,拟定出有效的解题方法和步骤。解题方法和步骤就是算法。算法:为了解决一个问题而采取的有限步骤。计算机算法:如何使计算机一步一步地工作的具体过程。利用计算机处理问题的步骤:1)设计好算法——算法设计;2)用计算机语言实现算法——程序设计。算法必须是“有效”的。算法设计还要充分考虑算法的好坏。衡量算法好坏的主要标准:①程序简练。②执行速度快。③占空间少。例:考虑的算法。算法①:直接表达。直接用语句s=1+2+3+4+5+6+7+8+9+10当项数较多时该算法不适用s=∑i110算法②:迭代法(累加求和法)s=1+2+3+4+5+6+7+8+9+10算法步骤:si①使s=0+②使i=1累加器记数器③s+i→s④i+1→i⑤若i≤10转③,否则转⑥⑥输出s01123364105该算法通用,是好算法2.2算法的表示算法需要有统一的表示方法常用的表示方法有:自然语言流程图结构化流程图N-S流程图.1、自然语言对于计算s=1+2+3+4+5+6+7+8+9+10用自然语言表示为:①使s=0(s为累加器)②使i=1(i为计数器)③s+i→s(累加求和公式)④i+1→i(计数器加1)⑤若i≤10转③,否则转⑥⑥输出s的值特点:通俗易懂、文字冗长、含义不大严格。2、流程图用流程图符号表示算法。常用的流程图符号起止框输入输出框处理框流程线判断框对于计算s=1+2+3+4+5+6+7+8+9+10用流程图表示为:s+i→si+1→iS+i→sS+i→si≤10输出s0→s1→i直观形象,易于理解,次序清楚YN3、结构化流程图传统的流程图有一个弊端:对流程线没有严格的限制,对于较复杂的算法可能会变成乱麻一般(BS型算法)。为克服这一弊端,提出了由三个基本结构组成算法流程图的思想:结构化流程图三个基本结构:①顺序结构按固定顺序(从上到下或从左到右)执行的结构。ABab②选择结构根据条件P选择执行哪一个分支。成立不成立pABab成立不成立例:计算y=1/x当x≠0时y=10000当x=0时的算法流程图图:选择结构输入xX=0?10000→y1/x→y输出yYN③循环结构重复执行某些操作的结构。分为两种:当型循环和直到型循环。当型循环直到型循环P1AAP2aabbYYNN可以看出,每个基本结构都只有一个入口和一个出口,因此,用三个基本结构构成的流程图不会象乱麻一般,用三个基本结构构成的流程图就成为结构化流程图,用结构化流程图描述的算法称为结构化算法,相应的程序设计就称为结构化程序设计。观察前例:0→s1→iS+i→si+1→ii≤10输出s顺序结构循环结构yn4N-S流程图N-S流程图的三个基本结构:ABP成立不成立ABAB当P1直到P2顺序结构选择结构循环结构例:计算y=1/x当x≠0时y=10000当x=0时的N-S流程图:输入xX=0?是否10000→y1/x→y输出y例:计算s=1+2+3+4+5+6+7+8+9+10的N-S流程图:i≤10直到i10直到型当型0→s1→i输出s1→i0→ss+i→si+1→is+i→si+1→i输出s第三章数据类型、运算符与表达式3.1C的数据类型●基本类型(整型、实型、字符型、枚举型)●构造类型(略)●指针类型(略)●空类型各类型包含常量与变量3.2常量与变量■常量与符号常量常量在程序运行过程中其值保持不变的量。符号常量用来代表一个常量的标识符。#definePI3.1415926例:#definePI3.1415926main(){floatr=2,c;c=2*PI*r;printf(“%f”,c);}■变量其值可以改变的量。变量的三要素:①变量名每个变量有一个名字,作为识别该变量的标识符。②变量的值每个变量有一个值,变量的值是随时可以改变的。③变量的存储单元每个变量占据一个内存单元,用于存放变量的值。变量名a变量值存储单元3变量的命名规则:由字母、数字和下划线组成以字母或下划线开头a、x1、y_2、_b1、_1c合法1x、a+2、Ф、Ω不合法变量必须先定义后使用。程序中何时使用常量?何时使用变量?3.3整型数据■整型常量即整常数,c的整常数有三种形式:①十进制整数与数学中的整数一致,如:100,123,15等。②八进制整数以0开头的整数,如:010,07,020等。③十六进制整数以0x开头的整数,如:0x10,0xff,0x2a等。■整型变量用于存放整数的变量。分4种类型:①基本型:inta16位,可表示的数值范围:-32768—32767②短整型:shortintb16位,可表示的数值范围:-32768—32767③长整型:longintc32位,数值范围:-2147483648—2147483647④无符号型:加上unsigned只存放正数。如:unsignedintx变量x为无符号整数,16位全表示数码,数值范围:0—65535在程序设计中,如果要使用整型变量,必须首先选择以上类型符来定义变量,然后才能使用;例:main()定义{inta,b,c;a=100;b=50;使用c=a+b;printf(“%d”,c);}一般根据什么原则选择变量的类型?3.4实型数据■实型常量可使用两种形式表示:①小数形式:如1.23,3.141592615.48②指数形式:如1e-201.23e5■实型变量用于存放实数的变量分单精度和双精度两种:floata,b定义a和b为单精度型变量32位,7位有效数字,10-38—1038doublex,y定义x和y为双精度型变量64位,15位有效数字,10-308—10308例:main(){floatr,c;doubler,c;r=5;c=2*3.1415926*r;printf(“%f”,c);}3.5字符型数据■字符常量用单引号括起来的一个字符。’a’,’x’,’*’,’1’等除此外,以’\’开头的字符如’\n’,’\t’等称为转义字符,祥见书表3.3■字符型变量用于存放字符的变量。charc1,c2定义c1和c2为字符型变量c1=’a’;c2=’b’;字符赋值字符型变量存放一个字符,占据一个字节■字符型数据的存储形式存放ASCII码不是而是如字符’a’在内存中存放97,’b’存放98。与整数的存储形式一致,它们之间可以通用一个字符数据既可以作字符用,也可以作整数用(取其ASCII代码)。如:32+’a’相当于32+97若intx;charc;则x=’a’;c=97;x=97;c=’a’;都允许a97■字符串常量用双引号括起来的字符序列。如:”abcde”,”china””a”也属字符串。注意”a”与’a’的区别。对于:charc;c=”a”;用法错误字符串中每个字符各占一个字节,并且在字符串结尾加上一个结束标记’\0’如:”china”在内存中占6个字节。china\0C语言中专门的字符串变量,可用字符数组存放(以后介绍)。3.6变量赋初值在定义变量的同时给相应的变量赋初值。如:inta=3;afloatb=5.2;charc=’a’;intx=y=z=6;效果:在给变量分配内存单元的同时在相应的单元中存放初值。33.7各数值型数据间的混合运算整型、实型、字符型数据间可以进行混合运算,如:10-‘a’*1.5运算时,参加运算的两个数据如果类型不同,则首先将其类型转换成一致再运算,转换规则是:将优先级低的类型转换到优先级高的类型数据类型的优先级:高doublefloatlongunsignde低intchar3.8算术运算符与算术表达式■基本的算术运算符+-*/%■算术表达式用算术运算符将运算对象连接起来的式子用于表达数学公式的式子如:2*x+y-1/a表达式经过运算最终得到一个值:算术表达式的值■运算符的优先级与结合性优先级:在对表达式求值时,如果存在多个运算符,则运算的先后次序按运算符的优先级别从高到底进行。运算符的优先级关系为:高:*/%低:+-如:a-2*x先算*2*(a+2)有括号的情况?结合性:如果在一个运算对象两边的运算符的优先级相同,则按规定的“结合方向”处理。如:a-b+cb与-结合是从左到右,称“左结合性”。b与+结合是从右到左,称“右结合性”。每个运算符都有相应的优先级和结合性。基本算术运算符都是左结合性。计算表达式例:2+’A’-1/2.01+3/2-1构造表达式例2x2+3x-1a+ba-ba+ba-bx+yx-ya+b/a-b?(a+b)/(a-b)2*x*x+3*x-1(*不能省)(a+b)/(a-b)/(x+y)/(x-y)(a+b)/(a-b)/((x+y)/(x-y))(a+b)/(a-b)/(x+y)*(x-y)■强制类型转换可以用强制类型转换运算符将一个表达式的值转换成所需类型:如:(int)(x+y)(float)(7%3)应用举例:inta=200,b=300,c;c=a*b/100;?可知,有自动转换和强制转换,当自动转换达不到目的时,可用强制转换。c=(long)a*b/100;c=(long)(a*b)/100;■自增、自减运算符自增运算符:++使变量值加1自减运算符:--使变量值减1两种用法:++i,--i先加(减)后用i++,i--先用后加(减)两种用法对i效果一样,但表达式的值不同。例:假设i的原值为5:j=++i;j