资源描述
程序设计基础(C),第2章程序设计基础与程序结构,C程序基础,1.C语言的发展历程2.C语言程序的基本结构3.C程序运行过程4.C语言基本语法成分5.C语言数据类型6.数据的输入与输出7.C语言中的宏定义8.C语言中的文件包含9.C语言中的条件编译10.位运算及其应用,1.C语言的产生、发展及特点,C语言的产生及发展ALGOL60CPLBCPCBC标准CANSICISOC,常见的C语言版本有:Borland公司:TurboC,TurboC+,BorlandC+,C+BuilderMicrosoft公司:MicrosoftC,VisualC+,自学,1.C语言的产生、发展及特点,C语言的特点1.C语言的语言成分简洁、紧凑、书写形式自由。2.C语言拥有丰富的数据类型。3.C语言的运算符丰富、功能更强大。4.C语言是结构化程序设计语言。5.C语言对语法限制不严格,程序设计灵活。6.C语言编写的程序具有良好的可移植性。7.C语言可以实现汇编语言的大部分功能。8.C语言编译后生成的目标代码小,质量高,程序的执行效率高。,自学,2.C语言程序的基本结构,认识C语言程序,例1-1在屏幕上输出一行信息,#include/*预处理命令*/voidmain()/*主函数*/printf(ThisisaCprogram!n);,文件包含命令,其功能是将头文件stdio.h的内容包含到用户当前的源程序中。,每个C程序必须有主函数main。main是函数名,main后的圆括号不能省略,void是一种数据类型,说明该函数没有返回值。,printf是标准输出函数,因为要调用它所以前面必须加#include命令。printf函数的作用是将双引号中的内容输出到显示器屏幕上,其中n是换行符,它使光标跳到下一行行首,2.C语言程序的基本结构,#includevoidmain()intx,y,a,b;x=5;y=3;a=x+y;b=x-y;printf(a=%dn,a);printf(b=%dn,b);,输出结果:a=8b=2,例1-2求两数之和与两数之差,这是4个赋值语句,x=5;的作用是将5赋给变量x,即变量x的值变为5;a=x+y;的作用是将x,y变量的值相加,再将结果赋值给变量a,/*变量声明,声明了4个整数类型的变量,C语言的变量必须先声明再使用*/,/*双引号中的a=是原样输出的,%d为格式控制符,在这个位置将对应输出整型变量a的数值*/,2.C语言程序的基本结构,例1-3输入两个数,求两数中较大的数并输出,#includevoidmain()inta,b,c;scanf(%d%d,scanf是标准输入函数,%d表示输入十进制整数,voidmain()inta,b,c;scanf(%d%d,例1-4,/*这个程序由2个函数组成,一个是main函数,一个是用户自己定义的max函数*/,这是函数声明,它的作用是告诉编译系统该程序要使用一个max函数,/*调用max函数,求出a和b中较大的数,然后将结果赋值给变量c*/,/*max函数的定义,max前的int表示该函数最后会返回一个整数值,max后括号中定义了2个整型参数x和y,参数的作用是在函数调用时传递数据*/,/将计算结果返回(返回到main中调用max的位置),2.C语言程序的基本结构,C语言程序的基本结构,编译预处理命令函数声明部分/声明用户自己定义的函数voidmain()/主函数的定义声明部分/包括变量的声明和函数的声明执行部分/主要是C语句其他函数定义/可能有多个函数定义声明部分执行部分,思考?,2.C语言程序的基本结构,1、函数是C程序的基本单位一个C源程序一般由一个主函数和若干其他函数构成,注意一个C程序必须包含且只能包含一个main函数。C程序从main函数开始执行,调用其他函数后再返回到main函数。main函数可以调用其他函数,其他函数之间也可以互相调用,注意其他函数不能调用main函数C函数分为标准函数和用户自定义函数两种形式在调用标准函数时,要注意加文件包含命令用户自定义函数是用户根据程序需要,自己编写的函数,C程序结构的简要说明:,2.C语言程序的基本结构,C程序结构的简要说明:2、函数的基本结构intmax(intx,inty)intz;if(xy)z=x;elsez=y;return(z);,函数首部定义格式:返回值类型函数名(参数列表),函数体函数首部下面用一对括起来的部分。函数体一般包括声明部分和执行部分。声明部分:定义本函数中所使用的变量。执行部分:由若干条语句组成。,2.C语言程序的基本结构,C语言的语句,1.控制语句(9种):完成一定的控制功能if()else条件语句(双分支选择语句)switch多分支选择语句for()while()循环语句dowhile()continue结束本次循环语句break中止语句goto转向语句return从函数返回语句,2.C语言程序的基本结构,2.函数调用语句:由一个函数调用加一个分号构成例:printf(ThisisaCprogram!n);scanf(%d%d,3.表达式语句:由表达式加分号构成例:x=5(赋值表达式)加;x=5;(赋值表达式语句),变量赋值:变量表达式(1)=是赋值运算符(又称赋值号)(2)表达式包括:常量,变量,函数,其他合法的C语言表达式(3)赋值运算符为右结合性,先计算赋值号右边的表达式的值,再将值赋给左边的变量,例:intx,y,z,a,b,c;x=5;y=3;z=x;a=abs(y-x);b=x+y;c=b=a;,先算b=a;再算c=b;,2.C语言程序的基本结构,变量赋值的特点:变量必须先定义,后使用。,变量被赋值前,值是不确定的。,对变量的赋值过程是“覆盖”过程,即用新值去替换旧值。,例:intx,y;x=6;y=23;z=y-x;,例:inti;while(iy)inttemp;temp=x;x=y;y=temp;,注意:1.复合语句是一个整体,相当于一个语句2.一个复合语句中可以包含其他复合语句3.在复合语句的花括号后不要加分号4.复合语句中可定义变量,但此变量只在该复合语句内有效,3.C程序运行过程,程序的有关概念,程序:程序是一组计算机可以识别和执行的指令,每一条指令使计算机执行特定的操作。,源程序:用高级语言或汇编语言编写的程序称为源程序。源程序不能直接在计算机上执行,需要经过“编译”将其翻译为二进制形式的代码。,目标程序:源程序经过“编译”所得到的二进制代码为目标程序。其扩展名为“.OBJ”。目标代码尽管已经是机器指令,但是还不能运行,因为它还没有解决函数调用问题。,可执行程序:目标程序与库函数进行连接,形成完整的可在操作系统下独立执行的程序称为可执行程序。其扩展名为“.EXE”,3.C程序运行过程,编辑:将源程序输入到计算机中,并将源程序保存在磁盘文件中(注意BC环境下的扩展名为.cpp)编译:将源程序翻译成二进制的目标代码,同时对源程序进行语法检查,如果有错误则修改源程序,然后再编译,反复该过程直到没有错误位置(注意将正确的源程序再保存一遍)连接:将各模块的二进制目标代码与系统标准模块连接处理后,得到一个可执行文件(*.exe文件)执行:运行可执行文件,检查结果是否正确,如果有错误则应修改源程序,再重复以上步骤,直至程序运行正确,编辑,编译,连接,执行,C程序的运行步骤,编写简单的C语言程序,例1-5a瓶装酱油,b瓶装醋,请将酱油和醋进行交换,即a瓶装醋,b瓶装酱油,方法:拿一个空瓶c,先将a瓶中的酱油倒入c瓶,再将b瓶中的醋倒入a瓶,最后将c瓶中的酱油倒入b瓶,编程思路:a、b、c瓶可以认为是3个变量,酱油和醋假设用整数表示,用整数8表示酱油,5表示醋,a瓶的酱油倒入c瓶可以认为是将变量a的值赋给变量c,#includevoidmain()inta=8,b=5,c;c=a;a=b;b=c;printf(“a=%d,b=%dn”,a,b);,编写简单的C语言程序,#includevoidmain()inta,b,c;floatave;/变量定义scanf(“%d%d%d”,/输出平均值,例1-6求任意三个整数的平均值,编程思路:首先要有3个整数,这3个数可以用a、b、c3个整型变量存放其次平均值应该用一个变量保存,该变量应该是实数类型求任意3个整数的平均值,所以这3个数应该从键盘输入计算平均值:(a+b+c)/3.0,因为C语言中两个整数相除得到的结果也是整数(去掉小数部分),为保证结果正确必须用实数3.0,编写简单的C语言程序,例1-7计算圆柱体的表面积,计算公式如下:s=s1+2*s2/s表示圆柱体的表面积s1=2*r*h/s1表示侧面积s2=*r*r/s2表示底面积,编程思路:首先要定义几个变量,应该定义r、h、s(s1和s2可以不定义)其次r和h应该具有数据,才能进行计算,因此先输入r和h怎么处理?定义一个符号常量,令其值为3.1415926按公式计算:s=2*r*h+2*r*r输出结果,#include#definePI3.1415926/定义一个符号常量PIvoidmain()floatr,h,s;/定义3个实数类型的变量printf(“inputr,h:n”);/提示用户输入r,hscanf(“%f%f”,/输出表面积,4.C语言基本语法,1、C语言字符集字符是C语言最基本的元素,C语言字符集由字母、数字、空白、标点符号和特殊字符组成,C程序是用下列字符所组成的字符集写成的:(1)字母:A-Z,a-z(2)数字:0-9(3)标点符号、特殊字符(28个):!#%:?(),(4)空白符:空格,制表符(Tab跳格健),换行符的总称。空白符除了在字符、字符串中有意义外,在程序中只起间隔作用,编译系统会忽略其它位置的空白符。,4.C语言基本语法,2、标识符标识符是给程序中的实体所起的名字,标识符的命名规则以字母或下划线开头,由字母,数字和下划线组成的字符序列标识符不能与C语言的关键字重名建议用户定义标识符时尽量不用下划线开头注意标识符的有效长度在bc31中有效长度为31个字符标识符中区分大,小写字母如:sum和SUM是不同的标识符,定义标识符应遵循的原则尽量做到见名知义一般习惯上变量名、函数名用小写,而符号常量用大写应尽量避免使用容易认错的字符如:数字1和小写字母l,4.C语言基本语法,3、关键字关键字是C语言预先定义的、具有特定意义的标识符,也称为保留字。C语言包括32个关键字:,注意:C语言的关键字都是小写,不能重新定义关键字,4.C语言基本语法,4、运算符运算符是用于描述某种运算功能的符号,如+-*/等,运算符可以由一个或多个字符组成。根据参与运算的操作数个数,可分为:单目(一元)运算符、双目(二元)运算符和三目(三元)运算符,逗号运算符:,指针和地址运算符:*中的空格和逗号都起着分隔符的作用,如果没有空格程序就会出错,少了逗号xy就会被认为是一个变量。,6、其他符号花括号通常用于标识函数体或一个复合语句。/*/构成一组注释符。编译时系统将忽略注释。(1)注释在程序中起提示、解释作用。(2)在程序调试过程中使用注释可以暂时屏蔽一些语句。,5.C语言数据类型,在c语言中,每个数据都属于一个确定的数据类型。不同的数据类型在数据表示形式、取值范围、占用内存空间大小、可参与的运算种类等方面都有所不同。,数据类型,5.C语言数据类型,#include#definePI3.14voidmain()intr;floatc,s,v;r=3;c=2*PI*r;s=PI*r*r;printf(“%f,%f”,c,s);,例1-9:计算圆的周长和面积,什么是常量和符号常量?,什么是变量、怎样进行变量声明?什么是整型数据、实型数据?,整型常量、变量、实型变量的使用?,如何使用printf输出函数?,5.C语言数据类型,常量:在程序执行期间值不发生变化的量,1、直接常量:15,2.4,f,“asd”,#include#definePI3.14voidmain()intr;floatc,s,v;r=3;c=2*PI*r;s=PI*r*r;printf(“%f,%f”,c,s);,2、符号常量:在程序中用标识符代表的常数定义符号常量的格式:#define标识符常数,3、使用符号常量的优点(1)含义清楚(2)修改方便,3.14159,5.C语言数据类型,1.变量的声明格式:数据类型变量名列表;,如:intr;floatc,s,v;,变量名,变量值,存储空间,说明:进行变量声明后,计算机系统会为声明的变量分配存储空间,用以存放数据.变量的存储空间可能由一个或多个字节组成,内存中的每个字节都有自己的地址,变量名实际上是一个符号地址,在程序中对变量的赋值和取值操作实际上是通过变量名找到相应的内存地址,然后从对应的存储空间中读取数据,变量:在程序执行期间值可以变化的量,5.C语言数据类型,整型数据1、整型常量的表示方法(1)十进制整数56,-23,0(2)八进制整数以零开头034,012(3)十六进制整数以0 x开头0 x28,0 x1fa9,5.C语言数据类型,例1-10:#includevoidmain()intx,y,z;x=10;y=010;z=0 x10;printf(“x=%d,y=%d,z=%dn”,x,y,z);printf(“x=%d,y=%o,z=%xn”,x,y,z);y=017;z=0 x2b;printf(“y=%d,z=%dn”,y,z);printf(“y=%o,z=%xn”,y,z);,输出结果:x=10,y=8,z=16x=10,y=10,z=10y=15,z=43y=17,z=2b,%o按八进制形式输出数据%x按十六进制形式输出数据,5.C语言数据类型,2、整型变量在内存的存放形式数据在内存中以二进制形式存放,一个整型变量在内存中占用2个字节,每个字节有8个比特(比特只能取0或1),例:intx=10;,说明:内存中存放的实际是数据的补码正数的补码为其二进制形式;负数的补码是将该负数绝对值的二进制形式按位取反再加1,例:intx=-10;,x的存放形式:,10的二进制形式:,-10在内存中的存放形式:,取反,+1,5.C语言数据类型,3、整型变量的分类有符号基本整型signedint无符号基本整型unsignedint有符号短整型signedshortint无符号短整型unsignedshortint有符号长整型signedlongint无符号长整型unsignedlongint,说明:括起来的为可选项,说明变量时可以省略不写,例:intx,y;shorta,b;unsignedlongm;,5.C语言数据类型,(1)带符号整数:存储时最高位表示符号,0为正,1为负正数的补码为其二进制数,(计算214+213+22+21+20=16384+8192+4+2+1=32767),int型的正数最大值为32767,负数的补码:用二进制表示其绝对值,然后按位取反,再加1,由二进制补码求十进制负数:补码先减1,再按位取反,将二进制数化为十进制数,最后加上负号,int型的负数的最小值为32768,5.C语言数据类型,(2)无符号整数:最高位与其他位一起表示数值,只能存放正数它与同样长度带符号整数相比,所能表示的正数值扩大一倍范围是:0000000000000000-1111111111111111即0-65535(215+214+21+20),4、整型数据的溢出例:inta,b,c;a=32767;b=a+1;c=b+3;,-32768,-32765,+1,+11,供参考,5.C语言数据类型,1、实型常量的表示方法小数形式:2.4,-9.6,3.,.75指数形式:3.14e0,31.4E1,2、实型数据在内存中的存放形式一个实型数据(float型)在内存中占4个字节,实型数据按指数形式存储,系统把实型数据分成小数部分和指数部分。常用的C编译系统多用1位表示符号,用8位表示指数部分,用23位表示小数部分,实型数据,小数点前后的0可以省略,E前面必须有数,且后面的数必须为整数,5.C语言数据类型,3、实型变量的分类单精度float双精度double长双精度longdouble,4、实型数据的舍入误差由于不同类型的实型数据在计算机中有效数字的位数不同,有时不能精确表示某个实数,只能近似表示,所以应避免将一个很大的数和一个很小的数直接相加减。,例:#includevoidmain()floatx,y;x=123456.789e5;y=x+20;printf(x=%f,y=%fn,x,y);,我们认为x=12345678900.00但因为有效数字位数的原因计算机上输出的是:x=12345678848.000000y=12345678848.000000,一个实型常数默认为double型;要表示float型数,必须在实数后加字母f或F;要表示longdouble型数,必须在实数后加字母l或L。,5.C语言数据类型,1、字符常量:用单引号括起来的一个字符如:s,*,6,说明:1.a和A是两个不同的字符2.单引号内不能是单引号或反斜杠3.转义字符如:n,表示反斜杠,表示单引号,2、字符变量例:chara,b,c;a=g;b=$;c=6;,3、字符数据在内存中的存储形式及使用方法(1)字符数据在内存中以相应的ASCII码存放,占1个字节,如:字符A,其ASCII码为65,内存中存放为,字符型数据,详见表1.4,5.C语言数据类型,(2)字符数据和整数在一定范围内互相通用,#includevoidmain()charch;ch=a;printf(“%cn”,ch);printf(“%dn”,ch);,输出:a97,#includevoidmain()charch;intx;ch=A;x=ch+32;printf(“x=%d,ch=%cn”,x,ch);printf(“%cn”,x);,输出:x=97,ch=Aa,字符数据与整数进行算术运算,字符数据用整数形式输出,5.C语言数据类型,4、字符串常量:由一对双引号括起来的字符序列如:“abcd”,“w123”,“k”,“”,注意:k与“k”是不同的k是字符常量,在内存中占1个字节,“k”是字符串常量,在内存中占2个字节,字符串常数在存储时计算机系统会自动在字符串末尾加一个结束标志0,因此字符串的实际长度为字符个数加1,6.数据的输入输出,一、printf函数格式:printf(格式控制,输出表列);如:printf(“%f,%f”,c,s);printf(“x=%d,y=%d,z=%dn”,x,y,z);,1、格式控制:用“”括起来的字符串,包括如下两个部分(1)普通字符(包括转义字符):需要原样输出的字符如:printf(“x=%d,y=%d,z=%dn”,x,y,z);,(2)格式说明:由%和格式字符及附加格式说明字符组成%-0m.nl格式字符其作用是将输出数据按指定的格式输出,C语言的输入/输出均由函数来实现,在使用输入输出函数时,应在程序开头写预编译命令:#include,6.数据的输入输出,格式字符:指定输出项的数据类型和输出格式长度修正符:输出长整型和double型必须加l域宽及精度描述符m.n(m控制域宽,n控制小数位数)数0用以在指定数字前的空位是否用0填补(对整型,实型可用)负号用以指定输出项是否为左对齐方式,%-0m.nl格式字符,例3:floatx=6.85;printf(“x=%fn”,x);printf(“x=%4.2fn”,x);printf(“x=%8.4fn”,x);printf(“x=%08.4fn”,x);printf(“x=%-8.4fn”,x);,输出结果:x=6.850000 x=6.85x=6.8500 x=006.8500 x=6.8500,6.数据的输入输出,例:inta=123,b=-1;floatx=12.34;charch=65;printf(“a=%d,b=%dn”,a,b);printf(“a=%x,b=%xn”,a,b);printf(“a=%o,b=%on”,a,b);printf(“a=%u,b=%un”,a,b);,输出结果:a=123,b=-1a=7B,b=ffffa=173,b=177777a=123,b=65535,6.数据的输入输出,例:inta=123;floatx=12.345;printf(“a=%5dn”,a);printf(“a=%-5dn”,a);printf(“a=%2dn”,a);printf(“a=%-5Xn”,a);printf(“x=%7.2fn”,x);printf(“x=%.2fn”,x);printf(“x=%10.2en”,x);printf(“x=%2en”,x);printf(“%5.3sn”,”computer”);printf(“%3sn”,”computer”);,输出结果:a=123a=123a=123a=7Bx=12.35x=12.35x=1.23e+001x=1.234500e+001comcomputer,6.数据的输入输出,2、输出表列:输出项可以是常量,变量,表达式,例:intx=8,y=-2;printf(“%dn”,25);printf(“x=%dn”,x);printf(“x*y=%dn”,x*y);printf(“|y|=%dn”,fabs(y);,输出结果:25x=8x*y=-12|y|=2,6.数据的输入输出,二、scanf函数的格式scanf(格式控制,变量地址表列);,1、格式控制(1)格式说明%*ml格式字符m用以指定输入数据的宽度*是赋值抑制符:表示相应的输入数据不赋给对应变量,例:inta,b;scanf(“%d%3d”,若输入:453896则输出:a=45,b=389,例:floatx,y;scanf(“%f%4f”,若输入:3.48.962则输出:x=3.400000,y=8.960000,6.数据的输入输出,例:charm,n;scanf(“%3c%c”,若输入:abcde则输出:m=a,n=d,例:inta,b;scanf(“%d%*d%d”,若输入:453896则输出:a=45,b=96,(2)格式控制中的其他字符:输入数据时要输入与其相同的字符如scanf(“a=%d,b=%d”,则输入必须是:a=12,b=45,2、变量地址表列:由变量地址组成变量地址是在变量名前加地址运算符“b=O;putchar(a);putchar(b);putchar(Y);,输出:BOY,注意:putchar函数只能有一个参数,6.数据的输入输出,供参考,四、字符输入函数(getchar函数)格式:getchar()(注意它是无参函数)功能:从键盘输入一个字符,例:#includevoidmain()charch;ch=getchar();putchar(ch);putchar(n);putchar(getchar();printf(“*n”);,输入:ABC输出:AB*,注意:一般要连续输入可显示字符若中间有空格、回车等字符在输出时是不可见的,输入:ABC输出:A*,输出空格符,6.数据的输入输出,供参考,Classisover,
展开阅读全文