还剩18页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
C语言程序设计基础知识期末复习
1、C语言与算法
1.程序一组计算机能识别和执行的指令
2.C语言的特点运算符丰富共有34种运算符、数据类型丰富、具有结构化的控制语句
3.C语言程序的结构特点
(1).一个程序由一个或多个源程序文件组成一个源程序文件中可以包括三个部分预处理指令、全局声明、函数定义
(2).函数是C程序的主要组成部分一个C程序是由一个或多个函数组成的必须包含一个__in函数(只能有一个);每个函数都用来实现一个或几个特定功能;被调用的函数可以是库函数,也可以是自己编制设计的函数
(3).一个函数包括两个部分函数首部和函数体(声明部分定义在本函数中所用到的变量;对本函数所调用函数进行声明;执行部分由若干个语句组成,指定在函数中所进行的操作)
(4).程序总是从__in函数开始执行
(5).C程序对计算机的操作由C语句完成(
6.)数据声明和语句最后必须有分号(
7.)C语言本身不提供输入输出语句(
8.)程序应当包含注释,增加可读性
4、算法
(1)算法+数据结构=程序
(2)顺序结构、选择结构、循环结构是表示一个良好算法的基本结构
(3)算法的特性有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性
(4)算法流程图一个流程图包括以下几部分表示相应操作的框;带箭头的流程线;框内外必要的文字说明流程线不要忘记画箭头,否则难以判定各框的执行次序算法流程图的结构特点只有一个入口;只有一个出口(一个判断框有两个出口;一个选择结构只有一个出口)结构内的每一部分都有机会被执行到也就是说,对每一个框来说,都应当有一条从入口到出口的路径通过它;结构内不存在“死循环”
2、顺序结构设计
5、标识符用来标识变量名、符号常量名、数组名、类型名、函数名等的有效字符序列C语言对标识符的规定
(1)只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线
(2)长度在TC中最多允许32个字符,建议不要超过8个如果系统规定标识符长度为8,那么x1234567A和x1234567B会被视为同一标识符
(3)在C语言中,标识符大小写敏感如ABC、aBC、abc分别代表3种不同的标识符
(4)标识符不能与C语言的保留字、系统标准库函数同名programto__tofile_2ab1_c3为合法标识符非法字符举例yes含有不合法字符“?”123第一个字符不能为数字goto标识符中不允许有空格)a_80%出现非法字符“%”if与关键字相同)
6、常量与变量注意以下变量定义形式是错误的intaintb;inta;b;
(1)整型常量·十进制整型能出现数字0~9,可带正负号如0,11,95,-2·八进制整型以数字0开头的数字串,能出现数字0~7如011(十进制9),0111(十进制73)·十六进制整型以0x开头的,能出现数字0~9,字母a~f或A~F如0x11十进制17,0xa5十进制165
(2)整型变量基本类型int
(3)浮点型·浮点型常量十进制小数形式由数字与小数点组成(必须有小数点)如
1.23,-
123.,
0.0123,.0,
0.指数形式,如123e3或123E3都代表123×103注意字母e或E之前必须有数字,后面必须是整数E-5,.1234e
1.2,
6.5E为非法的浮点型常量·浮点型变量floatdouble
(4)字符型1)字符常量分为两类·用单撇号括起来的一个字符如’a’,’9’,’’(空格)是合法字符常量”a”,’99’是非法字符常量·转义字符以\(反斜杠)开头的特殊形式的字符如’\n’’\r’’\123’’\x__’2)字符变量char,占1个字节空间,只能存放一个字符存储特点在字符变量中实际上存储的是字符的ASCII码,其存储形式与整数的存储形式相同注意I.字符数据与整型数据可相互赋值,直接运算II.大小写字母转换小写字母减32得到相应的大写字母,如‘a’-32得到‘A’大写字母加32得到相应的小写字母如‘B’+32得到‘b’
(5)字符串常量定义用一对双撇号””括起来的字符序列如”hello””__ry””\\aaa\’\n”存储每个字符串尾自动加一个‘\0’作为字符串结束标志
(6)变量赋初值格式类型说明符变量1=常数1[,变量2=常数2[,···]];intx=1y=1z=1;intx=y=z=1;(语法错误)
7、算数运算符和算术表达式
(1)运算符的注意事项·除法运算符“/”进行求商运算对于不同类型的运算对象,除法表达式计算结果的类型也会不同如果xy是整型,则结果为整型,小数部分被略去如果xy其中一个为浮点型量,则结果为浮点型·“%”是求余运算a%b计算a除以b后的余数,也是a模b的值它要求两个运算对象必须是整型,其结果也是整型量
(2)书写算术表达式的注意事项·将方括号改成圆括号,即算术表达式内所有的括号均为圆括号,*(乘法)不能省略·其中π为非字母字符,要用浮点型常量代替·其中不能出现分数,改用除法运算符,圆括号不能缺少
(3)算数运算符的优先级优先级高-----*/%-----+-低注意:可以用来改变运算的顺序.
2348、自增、自减运算符后缀i++(i--)先使用i的值,再使i的值加减1前缀++i(--i)先使i的值加减1,再使用i的值自增、自减运算只能用于变量,不能用于常量和表达式自增、自减运算符高于基本算术运算符
9、赋值运算符
(1)简单赋值运算符运算符=表达式格式变量=表达式·赋值运算符左边必须是变量而不能是表达式;·赋值表达式的值是赋值号左边变量被赋值后的值;
(2)算术运算符“+—*/%”和赋值运算符“=”结合起来,形成复合赋值运算符+=加赋值运算符;如a+=3,等价于a=a+3-=、*=、/=、%=与此类似·复合运算符在书写时,两个运算符之间不能有空格·复合运算符右边的表达式计算完成后才参与复合赋值运算;
10、当表达式中的数据类型不同时,要进行类型转换转换方式自动(隐式)转换系统自动把数据由低级类型向高级转换强制转换将表达式的运算结果强制转换成指定的数据类型自动转换规则强制转换格式(目标类型名)(表达式)double←long←unsigned←int↑↑float高←低charshort逗号运算符与逗号表达式运算优先级最低为15级求解过程先求表达式1的值,再求表达式2的值,···,直至求出表达式n的值整个表达式的值为表达式n的值x=5*86+9先把x赋值为40,表达式的值为
1511、字符数据的简单输入和输出
(1)putchar函数(字符输出函数)形式putcharc·c可以是字符常量、字符变量或整型变量putchar100;·用putchar函数也可输出转义字符putchar‘\n’;/*输出一个换行符*/putchar‘\\’;/*输出一个反斜杠\*/·该函数包含在stdio.h库中,因此应在使用该函数的程序开头加入#includestdio.h
(2)getchar作用从终端(如键盘)输入一个字符形式getchar无参数说明该函数只能接收一个字符,其函数值可以赋给一个字符变量或整型变量,也可作为表达式的一部分,该函数包含在stdio.h中
(3)格式输出函数格式printf(格式控制,输出表列)格式控制是用双撇号括起来的字符串,也称“转换控制字符串”,包括2种信息1)格式说明%[附加格式字符]格式字符将输出列表中的数据转换为指定格式输出2)普通字符原样输出输出表列需要输出的数据列表,彼此间用逗号分隔它可是任意合法的表达式printf(a+b=%
5.2fc)
(4)格式字符1)d格式符,用来输出十进制整数%d按整型数据的实际长度输出%mdm代表某个数字,指定输出数据的最小宽度若数据的位数小于m,则左侧补空格(右对齐),若大于m则按实际位数输出%-md与%md类似,只是左对齐2)c格式符用来输出一个字符%c%mc%-mc3)f格式符用来以十进制小数形式输出实数(floatdouble)%m.nf输出数据最小占m列,其中包括n位小数和1位小数点,右对齐小数点也算占一列%-m.nf与上面类似,只是左对齐4)S格式符用来输出一个字符串%s按字符串原长输出%ms输出字符串最小占m列,右对齐,左补空格%-ms输出字符串最小占m列,左对齐,右补空格%m.ns字符串占m列,但只取左端n个字符,右对齐%-m.ns字符串占m列,但只取左端n个字符,左对齐使用说明1)格式控制中的格式说明符,必须按从左到右的顺序,与输出表中的每个数据一一对应,否则出错printf“f=%di=%f\n”
5.63;显示f=1717986918i=
0.0000002)格式字符紧跟在“%”后面就作为格式字符,否则将作为普通字符使用(原样输出)printf”c=%cf=%ff\n“‘a’
1.5;其中的第一个c和f第三个f,都是普通字符
(5)scanf函数scanf(格式控制字符串,地址列表)格式控制与printf函数类似地址列表是由若干个地址组成的表列以逗号隔开),可以是变量的地址,或字符串的首地址scanf“%d%d%d”abc;1)格式符中无普通字符时,可用空格、Tab键、回车键作分隔符最后的回车键代表输入结束2)用c格式符输入字符时,空格、回车、转义字符等均为有效字符例charabc;scanf(%c%c%cabc);正确的输入方法键入ABC则a=‘A’,b=‘B’,c=‘C’若键入ABC则a=‘A’,b=‘’空格,c=‘B’若键入ABC未送,系统已经认为输入结束了则a=‘A’,b=‘\n’(换行符),c=‘B’若不同类型输入则综合上述规则3)在格式控制中除格式说明符外若还有其它字符则应按顺序原样输入4)可以指定输入数据所占列数,系统自动按它截取所需数据5)%后的“*”附加说明符,用来表示跳过相应的数据如:scanf“%2d%*3d%2d”ab;输入1234567则将12↔a,67↔b,345被跳过6)输入数据时不能规定精度如scanf“%
7.2f”a;错误7)double类型的变量输入时要用%lf%le必须记住!!!)如:doublex;scanf“%lf”x;
3、选择结构程序设计
1、if语句实现选择if表达式语句1表达式可以是关系表达式、逻辑表达式、数值表达式else语句2最常用的3种if语句形式
(1)if表达式语句1没有else子句
(2).if表达式语句1
(3)else语句2有else子句
(4)if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3┆elseif(表达式m)语句melse语句m+1在else部分又嵌套了多层的if语句说明
(1)整个if语句可写在多行上,也可写在一行上但都是一个整体,属于同一个语句
(2)“语句1”…“语句m”是if中的内嵌语句内嵌语句也可以是一个if语句
(3)“语句1”…“语句m”可以是简单的语句,也可以是复合语句
2、关系运算符
(1)关系运算符用来对两个数值进行比较的比较运算符C语言提供6种关系运算符
①<小于
②<=小于或等于
③>大于
④>=大于或等于优先级高
⑤==等于
⑥!=不等于优先级低
(2)关系表达式用关系运算符将两个数值或数值表达式连接起来的式子关系表达式的值是一个逻辑值,即“真”或“假”在C的逻辑运算中,以“1”代表“真”,以“0”代表“假”
3、逻辑运算符与逻辑表达式3种逻辑运算符(逻辑与)||(逻辑或)!(逻辑非)判断年龄在13至17岁之内?age=13age=17逻辑运算符的优先次序!→→||(!为三者中最高)逻辑表达式的值应该是逻辑量“真”或“假”编译系统在表示逻辑运算结果时以数值1代表“真”,以0代表“假”但在判断一个量是否为“真”时以0代表“假”,以非0代表“真”注意将一个非零的数值认作为“真”在进行逻辑表达式的求解中,并不是所有的逻辑运算都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的值时,才执行该运算符
4、条件运算符与条件表达式条件表达式的一般形式为表达式1?表达式2:表达式3条件运算符的执行顺序求解表达式1若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值条件运算符的结合方向为“自右至左”
5、switch语句switch语句的作用是根据表达式的值,使流程跳转到不同的语句switch语句的一般形式switch(表达式)整数类型包括字符型{case常量1语句1;breakcase常量2语句2┇┇┇case常量n语句ndefault:语句n+1}优先级顺序赋值运算符→和||→关系运算符→算术运算符→!
4、循环结构程序设计
1、用while语句实现循环while语句的一般形式如下while表达式语句→循环体↓循环条件表达式“真”时执行循环体语句“假”时不执行while循环的特点是先判断条件表达式,后执行循环体语句while循环的作用实现“当型”循环使用说明在while的循环体中一定要有使循环趋于结束的语句;否则将形成死循环;注意循环操作的范围、花括号、分号的使用;注意给循环变量赋初值的位置及初值的正确性
2、用do...while语句实现循环do---while语句的特点先无条件地执行循环体,然后判断循环条件是否成立do---while语句的一般形式为do语句while表达式;while和do...while语句的比较当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同;否则不相同
(1).循环体内必须有使循环趋于终止的条件whilei=100do{sum=sum+i;{sum=sum+i;i++;i++;}}whilei=100;
(2)注意循环初值与循环条件i=1;i=0;whilei=100whilei100{sum=sum+i;{i++;i++;sum=sum+i;}}
(3)do_while循环的循环体至少执行一次while循环的循环体可能一次也不执行
(4)在循环体至少执行一次的前提下,do_while与while循环等价
3、for语句实现循环for语句的一般形式为for表达式1;表达式2;表达式3语句表达式1设置初始条件,只执行一次可以为零个、一个或多个变量设置初值执行表达式2循环条件表达式,用来判定是否继续循环在每次执行循环体前先执行此表达式,决定是否继续执行循环表达式3作为循环的调整器,例如使循环变量增值,它是在执行完循环体后才进行的for语句说明1)表达式1可省略,但分号不能省;如inti=1sum=0;for;i=100;i++sum=sum+i;2)若表达式2省略,循环条件永远为真;如:fori=1;;i++printf“%d”i;死循环自己编程序时不建议采用,3)表达式3也可省略,但应设法保证循环正常结束;但要能看懂别人的程序如fori=1;i=100;{sum=sum+i;i++;}4)可只给循环条件;i=1;for;i=100;{sum=sum+i;i++;}5)三个表达式都可省;for;;相当于while16)表达式1和表达式3可以是逗号表达式;如fori=1sum=0;i=100;i++sum=sum+i;7)表达式2一般为关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值为非零就执行循环体如for;c=getchar!=\n;printf%cc;注:尽量避免用实型变量控制循环次数
4、改变循环的执行状态
(1)用break语句提前终止循环break语句作用1从循环体内跳出,即提前结束循环,接着执行循环下面的语句;2break语句只能用于循环语句和switch语句注意在循环中使用了break语句后,循环语句的结束可能有两种
1.正常结束(正常出口):由于循环条件表达式为假
2.非正常结束(异常出口):由break语句引起
(2)continue语句提前结束本次循环结束本次循环,即跳过循环体语句中下面尚未执行的语句,接着执行下一次是否执行循环的判定forn=100;n=200;n++{ ifn%3==0continue; printf”%d”n;这段程序等价于ifn%3!=0printf”%d”n;}for语句中执行的是表达式3
(3)break语句和continue语句的区别continue语句只结束本次循环,而不是终止整个循环的执行break语句结束整个循环过程,不再判断执行循环的条件是否成立
4、利用数组处理批量数据
1、一维数组
(1)定义一维数组定义一维数组的一般形式为类型符数组名[常量表达式];说明类型符数组元素的类型数组名即数组的名称,其命名方法同变量名在定义数组时,需要指定数组中元素的个数,方括弧中的常量表达式用来表示元素的个数,即数组长度注意:1在定义数组时只能使用整常量表达式表明数组的大小即数组元素的个数不能是变量也就是说,C语言不允许对数组的大小作动态定义.注意:intn=10;intarr[n];错误,n不是常量而是变量数组说明中其他常见的错误
①floata
[0];/*数组大小为0没有意义*/
②intb23;/*不能使用圆括号*/
③intka[k];/*不能用变量说明数组大小*/一维数组的存储方式每个元素都有一个编号(从0开始)称为下标
(2)引用一维数组一次只能引用一个数组元素不能引用整个数组所有元素!也不能引用多个元素引用数组元素的表示形式为数组名[下标]一个数组元素就是一个普通变量,跟普通变量一样使用a
[3]=a
[2]%4注意引用数组元素时,下标可以是整型常量、变量或整型表达式对数组中所有元素逐个引用时,通常可使用循环结构
(3)一维数组的初始化数组的初始化在定义数组的同时,给各数组元素赋值格式类型符数组名[表达式]={初值表};给部分元素赋初值例inta
[8]={01234};后面的用0补齐给全部元素赋初值时可不指定数组的长度inta[]={01234};注意只有在初始化时[]中可以空着其他情况不行,例如inta[]b[];是错误的
2、二维数组1定义二维数组二维数组定义的一般形式为类型符数组名[常量表达式][常量表达式];
(2)引用二维数组数组名[行下标][列下标]行、列下标都是从0开始二维数组的存储方式二维数组在内存中按行存放
(3)二维数组的初始化二维数组初始化通常是按行进行的类型符数组名[表达式1][表达式2]={初值表};给全部元素赋初值例inta
[3]
[4]={{0123}{4567}{891011}};或写成:inta
[3]
[4]={01234567891011}给二维数组的全部元素赋初值,可以不指定第一维的长度,但第二维的长度不能省略#defineN10#defineM6若有定义inta[N][M];二维数组按行输入标准模板fori=0;iN;i++forj=0;jM;j++scanf%da[i][j];二维数组按行输出标准模板fori=0;iN;i++{forj=0;jM;j++printf%da[i][j];printf\n;}
3、字符数组
(1)字符数组的定义定义字符数组的方法与定义数值型数组的方法相同,使用关键字char格式char数组名[常量表达式],···;
(2)字符数组的初始化一维字符数组初始化1)逐个字符赋给数组中的各元素2)用字符串常量初始化数组中的各元素字符串在实际存储时,是用字符数组存储的,系统会自动的在其尾部添加一个结束标志’\0’二维字符组初始化二维字符数组的初始化,可以采用逐个字符式或者字符串常量的方式
(3)引用字符数组引用字符数组中的元素,与引用其他类型数组元素相同只能是一个一个字符地引用
(4)字符数组的输入输出
1、利用getchar、putchar逐个处理(用循环结构)利用格式符%c逐个输入、输出字符fori=0;i9;i++scanf%c,str[i];当字符数组存字符串时可利用格式符%s,可以一次输入、输出整个字符串(不用循环结构)scanf“%s”字符数组名;用于输入一个字符串printf“%s”字符数组名;用于输出一个字符串如果一个字符数组中包含多个’\0’,则遇第一个’\0’时输出就结束scanf函数中的输入项是已定义的字符数组名,输入的字符串应短于已定义的字符数组的长度charstr
[10];scanf%s,str;printf%s\nstr;用字符数组名不要加,遇空格、TAB、回车结束输入自动加1个‘\0’,输入串长度小于数组长度怎样输入带空格的字符串?使用%c格式符fori=0;c=getchar!=‘\n’;i++str[i]=c;使用字符串处理函数getsstr;利用字符串输入输出函数字符串输入函数gets格式gets字符数组名功能从键盘接收一个字符串放入字符数组中,自动加‘\0’只以回车符作为输入的结束说明输入串长度应小于字符数组元素的个数字符串输出函数puts格式puts字符数组名或字符串常量功能向显示器输出一个字符串(输出完,自动换行)说明字符数组必须以‘\0’结束gets函数可以接收包含空格、tab的字符串scanf“%s”…不能接收空格puts函数一次输出一个字符串,并自动换行printf“%s”…函数可以同时输出多个字符串,并且能灵活控制是否换行strcat函数----字符串连接函数其一般形式为strcat字符数组1,字符串2其作用是把两个字符串连接起来,把字符串2接到字符串1的后面,结果放在字符数组1中字符串拷贝函数strcpy格式strcpy字符数组1,字符串2 作用将字符串2__到字符数组1中注意
(1)字符数组1必须足够大,以便容纳字符串2的内容
(2)字符串2可以是字符数组名或者字符串常量当字符串2为字符数组名时,只__第一个’\0’前面的内容(含’\0’),其后内容不__
(3)不能使用赋值语句为一个字符数组赋值strcmp函数----字符串比较函数一般形式:strcmp字符串1,字符串2作用:比较字符串1和字符串2strcmpstr1str2;strcmp”China””Korea”;strcmpstr1”Bei___g”;比较的结果由函数值带回如果字符串1=字符串2,则函数值为0如果字符串1字符串2,则函数值为一个正整数如果字符串1字符串2,则函数值为一个负整数注意字符串比较不能用“==”、“”、“等关系运算符直接比较,要用strcmp函数进行比较if“ad””ac”printf“ad”;strlen函数----测字符串长度的函数一般形式strlen字符串作用:它是测试字符串长度的函数函数的值为字符串中的实际长度它的返回值是字符串中字符的个数(不包含’\0’)strlwr函数----转换为小写的函数一般形式:strlwr字符串函数的作用:将字符串中大写字母换成小写字母strupr函数----转换为大写的函数一般形式:strupr字符串函数的作用:将字符串中小写字母换成大写字母
6、用函数实现模块化程序设计
1、可以使用哪些函数?一个C程序由两种函数构成标准函数(库函数)系统提供的,实现各种不同的功能如printfscanfsqrtfabs,strlen等等使用它们要包含相应的头文件自定义函数用户自己定义的函数用户可以把一些具有__功能的代码定义成函数,有利于程序的模块化和代码的“重用”
2、说明
(1)一个C程序由一个或多个程序模块组成,每一个程序模块作为一个源程序文件
(2)一个源程序文件由一个或多个函数以及其他有关内容(如预处理指令、数据声明与定义等)组成
(3)C程序的执行是从__in函数开始的,如果在__in函数中调用其他函数,在调用后流程返回到__in函数,在__in函数中结束整个程序的运行
(4)所有函数都是平行的,即在定义函数时是分别进行的,是互相__的即函数不能嵌套定义
3、定义函数
(1)C语言要求,在程序中用到的所有函数,必须先定义,后使用指定函数的名字,以便以后按名调用指定函数类型,即函数返回值的类型指定函数参数的名字和类型,以便在调用函数时向它们传递数据指定函数的功能这是最重要的,这是在函数体中解决的
(2)定义方法[函数的类型]函数名称(形式参数列表)函数首部{数据说明部分可执行语句函数体}定义无参函数 定义无参函数的一般形式为:类型名函数名类型名函数名void{{函数体函数体}}定义有参函数 定义有参函数的一般形式为:类型名函数名形式参数表列{函数体}
4、函数的调用调用一般形式函数名实参表
(1)函数调用语句把函数调用单独作为一个语句如printf_star;这时不要求函数带回值,只要求函数完成一定的操作
(2)函数表达式函数调用出现在另一个表达式中如c=__xab+2;m=jiecheng4*2;这时要求函数带回一个确定的值以参加表达式的运算
(3)函数参数函数调用作为另一函数调用时的实参如m=__xa__xbc;printf“%f”jiecheng9;其中__xbc是一次函数调用,它的值作为__x另一次调用的实参当用不到函数的返回值时用函数调用语句当要使用函数的返回值时用函数表达式或函数参数
(4)函数调用时的数据传递.形式参数和实际参数形参(形式参数)是函数定义时,参数表中的参数形式参数只能是变量例如float__xfloatx,floaty{···}floatftocfloattemp{···}在函数定义时,参数表中的形参并没有具体的值,系统也不为其分配存储单元实参(实际参数)是函数调用时主调函数传送给被调用函数形参的实际值实参可以是常量、变量和表达式,实参必须有确定的值实参和形参间的数据传递在调用函数过程中,系统会把实参的值传递给被调用函数的形参,或者说,形参从实参得到一个值,该值在函数调用期间有效,可以参加被调函数中的运算,从实参到形参的值传递是单向的!没有返回的过程!单向值传递!实、形参个数相同,类型应一致(相同或赋值兼容)例intn;n=__x420;n=__x
3.
57.3;转化为n=__x37;
(5)函数的调用过程在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元在发生函数调用时,函数的形参被临时分配内存单元调用结束,形参单元被释放实参单元仍保留并维持原值,没有改变如果在执行一个被调用函数时,形参的值发生改变,不会改变主调函数的实参的值!
(6)函数的返回值希望通过函数调用使主调函数能得到一个确定的值这就是函数值函数的返回值函数的返回值是通过函数中的return语句获得的return语句后面的括号可以不要一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个语句起作用return后面的值可以是一个表达式例如:__xintx,inty{ returnxy?x:y;}在定义函数时指定的函数类型一般应该和return语句中的表达式类型一致如果函数值的类型和return语句中表达式的值不一致,则以函数类型为准对数值型数据,可以自动进行类型转换即函数类型决定返回值的类型
5、对被调用函数的声明和函数原型
(1)在一个函数中调用另一个函数需要具备如下条件被调用函数必须是已经定义的函数(是库函数或用户自己定义的函数)如果使用库函数,应该在本文件开头加相应的#include指令如果使用自己定义的函数,而该函数的位置在调用它的函数后面,应该进行函数声明
(2)函数声明作用告诉编译系统函数类型、参数个数及类型,以便检查形式函数类型函数名(类型1形参1,类型2形参2,…..);函数类型函数名(类型1,类型2,…..);函数类型函数名();传统方法函数声明位置主调函数内部开头或整个文件的开头(所有函数之前)
6、函数的嵌套调用
7、函数的递归调用
(1)直接调用本函数
(2)间接调用本函数应使用if语句控制结束调用
8、数组作为函数的参数除了可以用数组元素作为函数参数外,还可以用数组名作函数参数包括实参和形参用数组元素作实参时,向形参变量传递的是数组元素的值单向值传递用数组名作函数实参时,向形参传递的是数组首元素的地址说明在主调函数与被调函数分别定义数组且类型应一致形参数组大小可不指定C编译系统不检查形参数组的大小最好设计一个参数,来指定形参数组大小,也方便确定数组元素个数数组名做参数,参数传递的是地址形参数组名只是获得了实参数组的首地址注意:数组名做函数参数时可以用来存储函数的返回值当一个函数有多个同类型的结果时,可用数组做参数来保存结果
9、局部变量和全局变量
(1)局部变量·在一个函数内部定义的变量只在本函数范围内有效·在复合语句__义的变量只在本复合语句范围内有效·在函数内部或复合语句内部定义的变量称为“局部变量”说明·__in中定义的变量,只在__in中有效·函数形参是函数的局部变量·不同函数中可以定义同名的变量,它们互不干扰
(2)全局变量在函数__义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量也称全程变量全局变量可以为本文件中其他函数所共用;有效范围为从定义变量的位置开始到本源文件结束全局变量没有赋初值时,系统自动赋为0同一个.c文件中,全局与局部变量同名时,外部变量被屏蔽,即局部优先
10、变量的存储方式和生存期从变量值存在的时间即生存期观察,变量的存储有两种不同的方式静态存储方式和动态存储方式静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方式程序开始执行时给全局变量分配存储区,程序执行完毕就释放在程序执行过程中占据固定的存储单元函数调用开始时分配,函数结束时释放在程序执行过程中,这种分配和释放是动态的不要误认为对外部变量加static声明后才采取静态存储方式,而不加static的是采取动态存储声明局部变量的存储类型和声明全局变量的存储类型的含义是不同的对于局部变量来说,声明存储类型的作用是指定变量存储的区域以及由此产生的生存期的问题,而对于全局变量来说,声明存储类型的作用是变量作用域的扩展问题用static声明一个变量的作用是对局部变量用static声明,把它分配在静态存储区,该变量在整个程序执行期间不释放,其所分配的空间始终存在对全局变量用static声明,则该变量的作用域只限于本文件模块即被声明的文件中注意用auto、register、static声明变量时,是在定义变量的基础上加上这些关键字,而不能单独使用
7、善于利用指针
1、指针的定义内存单元的编号也叫做地址既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针内存单元的指针和内存单元的内容是两个不同的概念对于一个内存单元来说,单元的地址即为指针,其中存放的数据才是该单元的内容在C语言中,允许用一个变量来存放指针,这种变量称为指针变量因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针
2、变量的访问直接访问根据变量名直接访问变量inti;i=3;printf“%d”i;间接访问通过变量的地址(即指针)来访问该变量如何获得一个变量的地址取地址运算符inta;则a获得变量的地址如何保存一个变量的地址将变量的地址放在另一个内存单元(变量)中指针一个变量的地址,称为该变量的指针指针变量专门用来存放另一变量的地址(指针)的变量,称为指针变量指向指针变量指向变量
3、指针变量
(1)指针变量的定义一般形式类型标识符*标识符;例如float*pf;int*p1*p2;说明定义时,标识符前面的“*”表示该变量为指针变量,上例中变量名为p1p2类型标识符指出p
1、p2所指向的变量的类型
(2)指针变量的引用在引用指针变量时,可能由三种情况给指针变量赋值如p=a把a的地址赋给指针变量p,指针变量p的值是变量a的地址,p指向a引用指针变量指向的变量如果已执行“p=a;”,即指针变量p指向了整型变量a,则printf(“%d”,*p);其作用是以整数形式输出指针变量p所指向的变量的值,即变量a的值如有以下赋值语句*p=1;表示将整数1赋给p当前所指向的变量,如果p指向变量a,则相当于把1赋给了a,即“a=1;”引出指针变量的值如printf(“%o”,p);作用是以八进制数形式输出变量p的值,如果p指向了a,就是输出了a的地址,即a取地址运算符*指针运算符间接访问运算符*pt为指针变量pt所指向的变量.*pt等价于a*pt=10;相当于a=10注意指针变量必须先赋值,再使用只能保存地址例如int*p,*p1,a=10;*p=20;printf(”%d”*p1;×一个指针变量只能指向同一类型的变量inta*p;floatf;p=f;×和*运算符互为逆运算若inta=10*pt=a;则:a、pt、*pt是等价的则:*a、*pt、a是等价的
(3)指针变量做函数参数实参→形参传去的是地址值,分占不同空间指针变量作形参,在函数内部可以改变函数外部变量的值指针变量作形参,可以用来保存函数的返回值(输出型形参)
4、通过指针引用数组
(1)指向数组元素的指针说明c语言规定数组名(不包括形参数组名),代表数组中首元素(下标为0的元素)的地址p=a
[0];则等价于p=a;注意数组名a不代表整个数组,上述“p=a;”的作用是把a数组的首元素的地址赋给指针变量p,而不是把数组a各元素的值赋给p;在定义指针变量时可以对它赋予初值int*p=a
[0];或int*p=a;等效于下面两行int*p;p=a
[0];或p=a;/*不是*p=a
[0];*/
(2)通过指针引用数组元素C中规定若p=a
[0]则p+1指向下一个元素,不是简单的加1因此,如果inta
[10]*p;p=a;则有以下关系1p+ia+ia[i]2*p+i*a+ia[i]3指向数组元素的指针变量也可带下标p[i]*p+i即有*p+i*a+ia[i]p[i]在使用指针变量时应注意的几个问题数组名是数组的首地址,因此p=a
[0]与p=a等价指针变量可以实现使本身的值改变,数组名不可以例:p++正确a++不正确要注意指针变量的当前值,指针变量可以指到数组后的内存单元即指针变量的越界问题4注意指针变量的运算,若先使p指向数组a即p=a,则1p++或p+=1指向下一个元素2*p++等价于*p++先得到p指向的变量的值,p再加13*p++与*++p作用不同,前者先取*p,后使p加1;后者相反4*p++表示p所指向的元素值加1若p当前指向a数组第i个元素,则*p--相当于a[i--],先取p值作*运算,再使p自减;*++p相当于a[++i],先使p自加,再作*运算;*--p相当于a[--i],先使p自减,再作*运算
(3)用数组名作函数的参数实参传递给形参是实参数组的首地址实际上,形参数组名就是一个指针变量intsumintarr[]intn等价于intsumint*arrintn指针变量与一维数组的关系int*p与inta
[10]数组名是指针(地址)常量p=a;p+i是a[i]的地址数组元素的表示方法:下标法和指针法,即若p=a则p[i]a[i]*p+i*a+i形参数组实质上是指针变量,即intq[]int*q系统只给p分配能保存一个指针值的内存区一般4字节);而给q分配4*10字节的内存区
(4)通过指针引用__数组1a+ia[i]第i行的首地址(按行变化)*a+ia[i]是a[i]元素2)a[i]元素本身又是一个一维数组,a[i]相当于一维数组名,即a[i]中保存一个地址,是a[i]
[0]的地址,即a[i]
[0]a[i]a[i]
[0]3a[i]+ja[i][j]a[i][j]的地址4a[i][j]元素可以表示为*a[i]+j**a+i+ja[i][j]即:*a+i+ja[i][j]1int*p
[4]表示p指向一个包含4个元素的一维数组.2p+1使指针__4*4个字节*p+1使指针的指向由横向转向纵向.3*p+i+j使指针__4*4*i+4*j.
5、通过指针引用字符串字符指针变量与字符数组的区别1)字符指针变量中存放的是地址,决不是将字符串放到字符指针变量中2)赋初值的方式对数组可以在变量定义时整体赋初值,但不能在赋值语句中整体赋值3)指针变量可以指向一个字符型数据,但如果未对它赋以一个地址值,则它并未具体指向哪一个字符数据char*a;scanf%sa;×4)指针变量的值是可以改变的,而数组名所指的地址是固定的如__in{char*a=IloveChina!;a=a+7;printf%sa;运行结果}China!字符指针变量与字符数组的区别字符指针基类型是char类型的指针,可以指向一个字符串,即保存字符串首字符的地址
八、结构体(链表与共用体___考试重点)
1、定义结构体变量结构体类型定义的一般形式struct结构体名{成员表列};成员表列的写法类型标识符成员名;注意
(1)这只是定义一种类型的方法,尚未定义变量
(2)struct–––关键词保留字,表示定义一种结构体类型structstudent结构体名{intnum;charname
[20];char___;成员表列intage;floatscore;charaddr
[30];};有三种方法可用来定义结构体变量1)先定义结构体类型再定义结构体变量struct结构体名structstudent{{intnum;成员表列char___;}charname
[20];floatscore;}structstudentx1x2;—x1,x2结构体变量将一个变量定义为标准类型(基本数据类型)与定义为结构体类型不同之处在于后者不仅要求指定变量为结构体类型,而且要求指定为某一特定的结构体类型如structstudent,因为可以定义出许许多多种具体的结构体类型2)在定义结构体类型的同时定义变量定义形式struct结构体名{成员表列}变量名表列;structstudent{intnum;charname
[20];char___;intage;charaddr
[30];}x1x2;3)直接定义结构类型变量定义形式struct{成员表列}变量名表列;不出现结构体类型名如struct{intnum;charname
[20];char___;intage;charaddr
[30];}x1x2;·类型与变量是不同的概念只能对变量赋值、存取或运算在编译时,对类型是不分配空间的,只对变量分配空间·成员也可以是一个结构体变量·对结构体中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量·成员名可以与程序中的变量名相同二者不代表同一对象·结构体类型的成员还可以是结构体类型结构体的嵌套定义
2、结构体变量的初始化和引用
(1)结构体变量的引用结构体变量名.成员名1)不能整体引用,只能对各个成员分别引用结构体变量的引用实质上是引用其成员printf%d%c%s%fstud12)只能对最低级的成员进行赋值、存取或运算3)成员变量与普通变量的用法一样stud
1.num++;s=s+stud
1.score;4)可以引用结构体变量成员的地址,也可以引用结构体变量的地址
(2)结构体变量的初始化在定义结构体变量时对每个成员赋初值结构定义与变量定义及初始化合二为一structstudent{longintnum;char___name
[20];floatscore;}stud1={993201mzhaoyi__};
3、结构体数组与定义结构体变量相仿
4、结构体指针引用结构变量中的成员有三种方法1结构体变量名.成员名stud
1.num2用指针变量*p.成员名*p.num3用指向运算符-成员名p-num注意指针变量p必须是结构指针型,且有p=stud1;指向数组元素的指针1如果p的初值为stu,即指向第一个元素,则p加1后p就指向下一个元素例如:++p-num 先使p自加1,然后得到它指向的元素中的num成员值(即10102)p++-num 先得到p-num的值(即10101),然后使p自加1,指向stu
[1]2程序已定义了p是一个指向structstudent类型数据的指针变量,它用来指向一个structstudent类型的数据不应用来指向stu数组元素中的某一成员例如:p=stu
[1].name;如果要将某一成员的地址赋给p,可以用强制类型转换,先将成员的地址转换成p的类型例如p=structstudent*stu
[0].name;
九、文件
1、C文件分类按数据的组织形式,可分为1ASCII文件文本文件)2二进制文件
2、文件的打开fopen函数FILE*fp;fp=fopen文件名使用文件方式;例如fp=fopena
1.datr;若执行不成功,则函数的返回值是NULL
3、fgetc函数从指定的文件读入一个字符,该文件必须是以读或读写方式打开的一般形式为fgetcfp;注:
1.fputc和fgetc一般用于文本文件
2.可以用putc代替fputc;getc代替fgetc,因为在stdio.h中定义过#definegetcchfpfgetcchfp#defineputcfpfputcfpfgets(str,n,fp)的功能是从文件fp中读取长度不超过n-1的字符串存入str指向的内存文件结束函数feof文件指针遇文件结束标志该函数值为1否则为
0.
4、fread函数和fwrite函数一般形式:freadbuffersizecountfp;fwritebuffersizecountfp;可把整型数以二进制形式存放到文件中其中buffer是一个指针;读入/输出数据的起始地址size要读写的字节数;count要进行读写多少个size字节的数据项;fp文件型指针
5、rewind函数作用使位置指针重新返回文件的开头,无返回值
6、fseek函数和随机读写作用实现改变文件的位置指针调用形式fseek文件类型指针位移量起始点起始点用
0、1或2代替0为“文件开始”;1为“当前位置”;2为“文件末尾”位移量指以“起始点”为基点,向前__的字节数,位移量是long型
7、f____函数返回流式文件位置指针当前值,用相对于文件开头的位移量来表示若返回值为-1L,表示出错
1、利用)。