版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C程序设计(第四版)等级考试复习资料第一、二章知识点一:c语言有9种控制语句、32个关键字和34种运算符。关键字如下autobreakcasecharconstcontinuedefaultdoubleelseenumexternfloatforgotointlongregisterreturnshortsignedsizeofdoifstaticstructswitchtypedefunionunsignedvoidvolatilewhile知识点二:c语言的源程序是由函数构成,c程序可以由多个函数组成,但必须有且只有一个主函数main(),而且每一个函数完成相对独立的功能。知识点三:c程序总是从main()函数开始执行的。知识点四:c语言中每个语句以分号(;)结束,分号是每个语句组成不可缺少的部分。第三章:顺序结构程序知识点一:常量和变量 整型常量实型常量 常量 字符常量符号常量常量和变量 变量常变量标示符详细阐述:(1)实型常量有两种表现形式:一是以十进制小数形式,由数字和小数点组成;二是以指数形式表示,但是需要注意的是e或E之前必须有数字,而且e或E后面必须为整数。(2)字符常量又分为普通字符和转义字符。普通字符:用单撇号括起来的一个字符,单撇号只是界限符,字符常量只能是一个字符,不包括单撇号,单撇号内只能包含一个字符;转义字符:一种特殊形式的字符常量,就是以\开头的字符序列,意思是将“\”后面的字符转换另外的意义。(3)字符串常量:用双撇号把若干个字符括起来,字符常量是双撇号中的全部字符(但不包括双撇号本身),双撇号内可以包括一个字符串。(4)符号常量:用一个符号代表一个常量。(5)变量:为了方便系统给变量分配合适的内存空间,所有的变量必须“先定义,后使用”,在程序运行期间,变量值是可以改变的,注意区分“变量”与“变量名”的区别。(6)标示符:c语言规定标示符只能由字母、数字和下划线3种字符组成,且第1个字符必须为字母或下划线。考点六:结构化程序中规定的3种结构是选择循环、顺序循环、结构循环。C语言中标示符可以分为关键字、用户标示符、预定义标示符。在c语言中,整数可以用十进制、八进制、十六进制表示。知识点二:数据的类型知识点三:整型数据与符号属性整型变量的分类整型int——TC下占2字节,VC下占4字节短整型short或shortint——2字节长整型long或longint——4字节无符号整型unsignedint——TC下占2字节,VC下占4字节无符号短整型unsignedshort——2字节无符号长整型unsignedlong——4字节双长型longlong——8字节无符号双长整型unsignedlonglong——8字节注释:有符号整形数据储存单元中最高为代表符号(0为正,1为负),如果指定unsigned(无符号型)型,存储单元中全部二进位都用于存放数值本身,而没有符号,而由于在存放过程中最左面最高位不再用来表示符号,而是用来表示数值,因此无符号整型变量中可以存放的正数的范围比一般整型变量中正数的范围扩大一倍,如:Shorta;//a为有符号短整型变量Unsignedshortb;//b为无符号短整型变量则范围如下:a(-32768---32767)b(0----65535)说明:(1)只有整型(包括字符型)数据可以加signed或unsigned修饰符,实型数据不能加。(2)对无符号整形数据的输出用“%u”的格式输出。知识点四:字符型数据字符变量用来存放字符常量,字符变量用关键字char来说明,每个字符变量中只能存放一个字符,将一个字符赋给一个字符变量时,并不是将该字符本身储存到内存中,而是将该字符数据对应的ASCII码(0~~127)存储到内存单元中。各种字符集(包括ASCII字符集)的基本集都包括了127个字符,其中包括:大小写字母,数字,专门符号(29个),空格符,不能显示的字符。在输出字符变量时,可以选择十进制也可以选择字符形式(%c)输出。注意:如果将一个负数整数赋给有符号字符型变量是合法的,但它不是代表一个字符,而是作为一字节整型变量储存负数。知识点五:浮点型数据浮点型数据是用来表示具有小数点的实数的,注意规范化的指数形式的表示方法。浮点型数据的分类:float型(单精度浮点型)被分配4个字节,其能够拥有6位有效数字;double型(双精度浮点型)被分配8个字节,其能拥有15位有效数字;longdouble型(长双精度),TC为其分配16个字节,VC仍然为其分配8个字节。区分:类型与变量;每一个变量都属于一个确定的类型,类型是变量的一个重要的属性,变量是占用存储单元的,是具体存在的实体,在其占用的存储单元中可以存放数据,而类型是变量的共性,是抽象的,不占用存储单元,不能用来存放数据。知识点六:运算符基本的算术运算符运算符含义举例结果+正号运算符(单目)+aa的值—负号运算符(单目)—aa的算术负值*乘法运算符a*ba和b的乘积/除法运算符a/ba除以b的商%求余运算符a%ba除以b的余数+加法运算符a+ba和b的和—减法运算符a-ba和b的差注意:%运算符要求参加的运算对象为整数,其结果也一定是整数。除%运算符以外,其它运算符的运算对象都可以是任何算术类型。自增和自减运算符++i,--i,i++,i--.含义:++i表示在使用i之前先对其自加1的操作。--i表示在使用i之前先对其自减1的操作。i++表示使用i之后再对其加1的操作。i--表示使用i之后再对其减1的操作。注意:只有变量才能够使用自增和自减运算符,常量和表达式均不能使用。它们的结合方向都是“自右向左”(如-i++,i的左边是负号运算符,i的右边是自增运算符)。举例:inta=3,b=5,c;c=(a++)*bprintf(“%d%d”,a,c);结果:a=4,c=15.分析:c=(a++)*b中a在++之前,表示在使用a之后再加1,因此c=a*b,所以c=15.使用完a之后再对a加1,于是a现在等于4.知识点七:不同类型间的混合运算运算的数中有float或double型时,结果是double型,将float全部转换为double型,然后运算。如果有int、float或double型数据进行运算时,将int和float转换成double型进行运算。字符(char)型数据与整型数据进行运算,就是把字符的ASCII代码与整型数据进行运算,与实型数据运算时,将ASCII代码转换成double型数据。知识点八:强制类型转换运算符如(int)(x+y)是将(x+y)的类型转换为int型,其一般形式是:(类型名)(表达式);(int)x+y,这里表达式没有用括号括起来,于是这里的意思是将x转换成整型然后与y相加,而不是将(x+y)的类型转换为int型。注意:在强制类型转换时,得到一个一个所需类型的中间数据,但变量的类型未发生变化。如:x为float型,a=(int)x,这里x的类型仍然是float型,它的类型是没有改变的。特别强调的是在(int)(x)这里x的括号可要亦可不要,但是类型名的括号是必须要的,很多考试题会在这里做文章,请注意。知识点九:c语句的作用和分类控制语句:用于完成一定的控制功能,共有9种,如下:语句名称if()…else…条件语句for()…循环语句while()…循环语句do…while()循环语句continue结束本次循环break终止执行switch或循环语句return从函数返回语句goto转向语句,结构化中基本不用空语句:c语言中所有语句必须由一个分号(;)结束,main(){;},这个分号也是一个语句,成为空语句。程序执行时不产生任何动作,但表示存在着一条语句。复合语句:在c语言中花括号“{}”不仅可以用做函数体的开始和结束标志,同时也常用做复合语句的开始和结束标志,复合语句也可称为“语句体”。复合语句中最后一个语句中最后的分号是不能忽略不写的。其他类型语句函数调用语句(由函数调用加一个分号构成),如printf(“thisiscstatement”);表达式语句(由一个表达式;构成一个语句),如:a=b;知识点十:关于赋值赋值运算符与复合的赋值运算符赋值符号=就是赋值运算符,它的作用就是将一个数据赋给一个变量。如a=3,就是把3赋给a这个变量,也可以将一个表达式的值赋给一个变量。注意不要与在后面即将介绍的==混淆,==是关系运算符,是用来进行条件判断的。在赋值符=前加上其他运算符,可以构成复合的运算,凡是二目运算符,都可以与赋值符一起组合成复合运算符,有关算术运算符的复合运算符有+=,-=,*=,/=,%=。举例:a+=b则等价于a=a+b(如果b是包含若干项的表达式,则相当于他有括号),假如b=y+8,则a+=b则等价于a=a+(y+8),其他复合运算符的用法亦是如此。赋值表达式和赋值语句由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”,赋值语句则是在赋值表达式的末尾加一个分号构成。它的一般形式为:变量赋值运算符表达式(a=3*4)赋值运算符左侧应该是可修改的“左值”,左值的值是可以改变的,变量可以作为左值,而算术表达式a+b、赋值表达式、常量等不能作为左值。如(a=b)=3*4就是错误的,因为赋值表达式(a=b)是不能作为左值的。注意赋值表达式与赋值语句的区别:赋值表达式的末尾没有分号,而赋值语句的末尾必须有分号,在一个表达式中可以包含一个或多个赋值表达式,但绝对不能包含赋值语句。赋值过程中的类型转换ⅰ、将浮点型数据赋值给整型变量时,先对浮点数取整,舍去小数部分,然后赋予整型变量。ⅱ、将整形数据赋给浮点型数据时,数值不变,但以浮点形式储存到变量中。ⅲ、将double型数据赋给float变量时,先将双精度数转换为单精度,只取6~7位有效数值,但必须注意的是双精度数值的大小不能超出float型变量的数值范围。ⅳ、字符型数据赋给整型变量时,就是将其ASCII码值赋给整形变量。ⅴ、将一个占字节多整形数据赋给一个占字节少的整形变量或字符变量实时,只将其低字节原封不动的送到被赋值的变量。知识点十:有关数据输入输出的概念C语言本身是不提供输入输出语句,输入和输出操作是由C语言标准函数库中的函数来实现的,在C语言标准函数库中提供了一些输入输出的函数,printf和scanf不是C语言的关键字,而只是库函数的名字。这些标准函数是:putchar(输出一个字符)、getchar(输入一个字符)、printf(格式输出)、scanf(格式输入)、puts(输出字符串)、gets(输入字符串)。使用系统库函数时,要在程序文件的开头用预处理指令#include把有关头文件放在本程序中,如:#include<stdio.h>或#include“stdio.h”。如果在未用预处理指令#include把有关头文件放在本程序中,那么我们将不能够上面所介绍的标准函数,因为环境不能够知道它所意味的含义是什么,表达的什么意思。知识点十一:printf函数printf()函数的一般形式printf(格式控制,输出列表);如:printf(“a=%fb=%d”,a,b);printf是函数名,括号内的解释如下:Ⅰ、“格式控制”:用双引号括起来的字符串是“格式控制”字符窜,它也是包括了两部分信息。⒈格式转换说明,由“%”和和格式字符组成,比如上面的“%f”“%d”,它所表达意思是输出的数据转化成指定的格式将其输出,格式申明总是由“%”开始的,但需要注意的是以“%”开头并不都是格式转换说明,而且格式描述符要与输出列表中的项顺序一一对应而且类型匹配。⒉需要原样输出的字符也写在格式控制内,我们也称为普通字符,通常指的是除了格式转换说明与一些转义字符外的那部分,如字母,空格,换行符,比如上面的“a=b=”就是会原样输出的字符。Ⅱ、“输出列表”是需要输出的一些数据(我们想输出的数据),可以是常量、变量或者表达式。printf(“a=%fb=%d”,a,b);中“a=%fb=%d”是格式转换说明。a,b是输出列表。输出列表的各输出项要用逗号隔开,若a,b的为5,6,那么以上输出的结果就为:a=5b=6需要注意的是在5与b之间有空格,因为在两格式说明符中间有一个空格,即空格也要原样输出(前面说过)。(2)格式符可以根据需要在“%”与格式之间插入“宽度说明”、左对齐符号“-”、前导零符号“0”等d格式符用来输出有符号的十进制数,可以在格式控制中指定输出的域宽(所占的列数),“%md”指定m为输出字段所占用的宽度,注意此时输出的数向右对齐,若“%-md”则输出的数不变,而现在是向左对齐了,“-”改变对齐方向c格式符用来输出一个字符,同样可以指定域宽和使用左对齐符号“-”,如“%5c”、“%-5c”s格式符用来输出一个字符串。printf("%s","name");注意的是name上的“”是不会输出的f格式符将实数以小数形式输出,“%f”也可以指定域宽,“%m.n”表示指定输出数据占m列,其中小数占n列,其也可以用左对齐符号“-”,因为单、双精度浮点数只能保证6、15位有效数字,即使我们指定“%55.50f”也不能保证都是有效数字,因为float型数据储存单元是有限的。e格式符指定以指数形式输出实数,同样可以使用“%m.ne”形式,格式符用e或E时,输出结果大小写与格式符大小写一致i格式符作用域d格式符相同,用的很少x格式符以十六进制形式输出整数o格式符以八进制整数形式输出u格式符以十进制整数形式输出无符号(unsigned)型数据g格式符输出浮点数,系统自动选择f或e格式输出,选择其中较短的格式,不输出无意义的0(3)printf()函数的注意事项格式控制中的格式转换说明与输出项必须从左到右一一对应匹配,如在输出long型数据时,一定要用%ld格式控制,而不能用%d格式控制;格式控制中,格式转换说明与输出项的个数要相等,如果说明个数多于输出项的个数,则对于多余的格式将输出不定值;格式控制中,除了合法格式外,可以包含其他的合法字符,这些字符将被原样输出;如果要输出“%”,则应该在格式控制串中用两个连续的百分号“%%”来表示。前不久发现一道考这个注意事项的题,于是分享如下:inta=2,b=5;printf(“a=%%d,b=%%d\n”,a,b);问输出结果?则输出结果为:a=%d,b=%d知识点十二:scanf()函数scanf函数的一般形式scanf(格式控制,地址列表);其中scanf是函数名,“格式控制”的含义与printf()函数一致,“地址列表”由若干个变量地址组成,即可以是变量地址,也可以是字符串的首地址。举例:scanf(“%d”,&a);printf(“%d”,a);“%d”是格式控制字符串,&a是输入项,“&”是“取地址运算符”,&a指a在内存中的地址。格式说明对unsigned型变量的数据,可以用%d,%o,%x格式输入;在scanf()函数中格式字符前可以用一个整数指定输入数据所占宽度,但对于实行数据则不能指定其小数位的宽度;在格式控制串中,格式说明个数应该与输入项的个数相等,且要类型匹配。注意问题scanf()函数中的输入项只能是地址列表,而不能是变量名或其他内容,即必须是某个存储单元的地址;如果在“格式控制”字串中除了格式说明以外还有其他的字符,那么在输入数据时也要输入这些相同的字符,举例:scanf(“%d,%d”,&a,&b);那么在输入数据时则需输入:3,5假如格式控制中的“,”变成了空格,那么输入时3与5之间就不是逗号而是空格。以“%c”格式输入时,空格字符和转义字符都作为有效字符;输入数据时,遇到“空格”、“回车”、“挑格”键时,系统认为输入结束;在用scanf函数输入双精度实型数据时,不能用“%d”格式声明,而应当用“%ld”格式声明。举例:charstr[10];scanf(“%s”,str);printf(“%s\n”,str);输入字符串:HOWDOYOUDO输出结果为:HOW因为scanf()函数输入时遇到空格结束。第四章:选择结构程序知识点一:关系运算符和关系表达式说明:比较符或比较运算符称为关系运算符,其就是“比较运算”,将两个数值进行比较,判断其比较的结果是否符合给定的条件。关系运算符及其优先次序关系运算符名称<小于<=小于或等于>大于>=大于或等于==等于!=不等于说明:由两个字符组成的运算符之间不可以加空格,关系运算符都是双目运算符,它们的结合性都是自左向右;优先次序:初等运算符>单目运算符>逻辑!>算术运算符(先乘除,后加减)>关系运算符>逻辑运算符>条件运算符>赋值运算符>逗号运算符;关系表达式由关系运算符连接而成的表达式(可以是算术表达式、关系运算符或其他表达式)称为关系表达式;当关系运算符两边的值的类型不一样时,系统将自动转换,然后再进行比较。知识点二:逻辑运算符和逻辑表达式逻辑运算符及其优先次序运算符含义举例说明&&逻辑与a&&b如果a和b都为真,结果为真,否则为假||逻辑或a||b如果a和b有一个以上为真,结果为真,二则都为假时,才为假!逻辑非!a结果为假,则!a为真,如果为真,则!a为假这其实与数学上的“或与非”是一致的,而且优先级!(非)>&&(与)>||(或);“&&”和“||”是双目运算符,它要求有两个运算对象,如(a>b)&&(x>y),(a>b)||(x>y),!是一目运算符,只要求有一个运算对象,如!(a>b)。逻辑表达式ⅰ、逻辑表达式由逻辑运算符和运算对象组成,其中,参与逻辑运算的对象可以是一个具体的值,还可以C语言中人以合法的表达式,逻辑表达式的运算结果为1(真)或者0(假)。ⅱ、在数学中,0<x<10是合法的,可以使用的,表示x的值介于0与10之间,但在C语言中却是不能用的,因为关系运算符是不能够连用的,但可以用逻辑运算符来辅助运算符,表示方法是:0<x&&x<10.ⅲ、在C语言中,由&&或||组成的逻辑表达式,在某些特定的情况会产生“短路”的情况。ⅳ、x&&y&&z,只有当x为真(非0)时,才需要判别y的值;只有x和y都为真时,才需要判别z的值;只要x为假就不必判别y和z,整个表达式的值为0。ⅴ、x||y||z,只要x的值为真(非零),就不必判别y和z的值,整个表达式的值为1,只有x的值为假,才需要判别y的值,只有x和y的值同时为假才需要判别z的值。对于ⅳⅴ知识点例题:(1)设a、b、c、d、m、n均为int型变量,且a=5,b=6,c=7,d=8,m=2,n=2,则逻辑表达式(m=a>b)&&(n=c>d)运算后,n的值为2.(3)inta=0,b=0,c=0;if(++a>0||++b)++c;printf(“a=%d,b=%d,c=%d”,a,b,c);答案:a=1,b=0,c=1知识点三:if语句的几种形式if(表达式)语句(2)、if(表达式1)语句1else语句2(3)、if(表达式)语句1else语句2if(表达式1)语句1elseif(表达式2)语句2elseif(表达式2)语句2…elseif(表达式m)语句melse语句n“语句1”是if子句,“语句2…语句m”是else语句,这些子句都是一条语句,但是要执行多条语句时,则应该使用花括号({})把这些语句括起来组成复合语句。注意:else不能独立成为一条语句,它只是if语句的一部分,是不能够单独出现在语句中的,else必须与if配对;if语句无论写在几行上,都是一个整体,属于同一个语句,不要认为if是一个语句,而else又是一个语句;if语句中要对给定的条件进行检查,判定所给定的条件是否成立,判断的逻辑值只是“是”或“否”(或者“真”“假”)。知识点四:if语句的嵌套使用if()if()语句1else语句2elseif()语句3else语句4注意的是:else总是与他上面的最近的没有与else配对的if配对。特别的注意:关于if-else语句还有一个容易出错的地方就是与空语句的连用。看下面的例子:if(NULL!=p);fun();这里的fun()函数并不是在NULL!=p的时候被调用,而是任何时候都会被调用。问题就出在if语句后面的分号上。在C语言中,分号预示着一条语句的结尾,但是并不是每条C语言语句都需要分号作为结束标志。if语句的后面并不需要分号,但如果你不小心写了个分号,编译器并不会提示出错。因为编译器会把这个分号解析成一条空语句。;知识点五:条件运算符和条件表达式if(a>b)max=a;elsemax=b;可以用:max=(a>b)?a:b;这其中“(a>b)?a:b”是一个“条件表达式”,“?”是条件运算符,条件运算符由两个符号(?和:)组成,必须一起使用,要求有3个操作对象。执行过程:如果(a>b)条件成立,则整个表达式的值取a,否者取b。条件表达式一般形式为:表达式1?表达式2:表达式3;说明:先求表达式1,若为真,则求解表达式2,此时表达式2的值就作为整个表达式的值,若表达式1为假,则求解表达式3,表达式3就是整个条件表达式的值。表达式2和表达式3不仅可以是数值表达式,还可以是赋值表达式或函数表达式。知识点六:switch语句实现多分支选择结构一般形式如下:switch(表达式){case常量1:语句1case常量2:语句2case常量3:语句3……case常量n:语句ndefault:语句n+1}说明:switch是关键字,后面用花括号括起来的部分是switch语句体;switch后面括号的表达式,可以是C语言中认可合法表达式,但是两侧括号不可省;常量表达式的类型必须与switch后面的表达式类型相匹配,且各case语句标号的值各不相同,不能重复;case语句标号后的语句1、语句2等,可以是一条语句,也可以是若干条,在必要的情况下语句还可以省略不写;多个case标号可以共用一组执行语句;一般情况下,在执行一个case语句后,应用break语句使程序跳出去,即终止switch的执行;如果语句中没有break跳出语句,switch表达式的值找到匹配的入口标号,进入后,并不在进行条件检查,在执行完一个case标号后面的语句后,就从此标号开始执行下去,不再进行判断;case与常量间有空格。第五章:循环结构程序知识点一:用while语句实现循环while语句一般形式:while(表达式)语句这其中的“语句”就是循环体,循环体只能是一个语句,可以是一个简单的语句,还可以是一个复合语句(用花括号括起来的若干语句),如果不加花括号,则while语句的范围只到while后面的第一个分号。执行循环体次数是由“表达式”确定的,当“表达式”的值(非0表示)为真时,就执行循环体,若为假(0表示),就不执行循环体语句,即只要当循环条件表达式为真(即条件成立),就执行循环体语句,注意的是要先判断条件表达式,后执行循环体语句。知识点二:用do…while语句实现循环一般形式为:do语句while(表达式);说明:先执行循环体,然后再检查条件是否成立,若成立再执行循环体,若不成立了,就不再执行循环体,它的特点就是无条件的先执行循环体,然后再判断条件是否成立。do是C语言的关键字,必须和while联合使用,while后面的圆括号和分号一定不能丢,“循环体”可以是一个简单的语句,还可以是一个复合语句(用花括号括起来的若干语句)。知识点三:while和do…while的区别while循环的控制出现在循环体之前,只有当while后面的表达式的值为非零时,才可能执行循环体;在do…while构成的循环体中,总是先执行一次循环,然后再求表达式的值,因此无论表达式的值是否为零,循环体至少要执行一次。知识点四:for语句的循环for语句的一般形式是:for(表达式1;表达式2;表达式3)语句可以理解为:for(循环变量赋初值;循环条件;循环变量增值)语句说明:各个表达式之间用“;”隔开,且圆括号不能够省略,循环体只能是一条语句,如需完成多项操作,可以用花括号({})括起来构成复合语句;表达式1、2、3均可省略,但设计者应另外设法保证表达式1、2、3的循环变量赋初值、循环条件、循环变量增值功能已经实现或能够被实现,但是他们之间的分号是不能够省略的;表达式1、3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号隔开。如:for(sum=0,i=1;i<=100;i++)sum=sum+i;知识点五:break语句与continue语句在break后面加上分号就可以构成break语句(break;),break语句可以使流程跳出switch结构,继续执行switch后面的语句,其还可以从循环体内跳出,提前结束循环(理解跳出循环体,提前结束循环);break语句只能出现在循环体及switch语句内,不能用于其他语句;当break语句出现在循环体中的switch语句体内时,其作用只是跳出该switch语句,当break语句出现在循环体,但并没有在switch语句体内时,执行break后,跳出循环,当然也不会在进行条件判断。continue语句一般形式为:continue;其作用是结束本次循环,即跳过循环体中下面尚未执行的语句,转向判定循环条件是否成立,从而确定下一次循环是否继续执行。break语句和continue语句的区别:continue语句只是结束本次循环,而不是终止整个循环的执行,但break语句则是结束整个循环过程,不再判断循环条件是否成立。第六章:数组处理批量数据知识点一:关于数组的一些说明数组是一组同类型数据的集合,其下标代表数据在数组中的序号,用一个数组名(如s)和下标(如10)来唯一确定数组中的元素(如s10可以代表第10个学生成绩),数组中的每一个元素都属于同一个数据类型,不能把不同类型的数据放在同一个数组中,在C语言中规定用方括号中的数字来表示下标,如用s[10]表示s10,即第10个学生的成绩。知识点二:一维数组的定义要使用数组,必须先定义数组,即数组由哪些数据组成,数组中由多少元素,属于哪个数据类型;定义的一般形式是:类型符数组名[常量表达式];如:inta[10];说明:数组名的命名规则遵循标示符命名规则;方括号中的常量表达式用来表示元素的个数,即数组长度,需要注意的是下标是从0开始的,指定inta[10], 则是从a[0]到a[9],不存在数组元素a[10];常量表达式中可以包括常量和符号常量,但C语言规定,不允许对数组的大小作动态定义,就是说数组的大小是不依赖程序运行过程中变量的值。知识点三:一维数组的引用定义数组并且对各元素赋值后就可以引用数组中的元素,但需要注意的是只能引用数组元素而不能够一次整体调用整个数组的值,表现形式为:数组名[下标]需要说明的是定义时用到的“数组名[常量表达式]”和引用时用到的“数组名[下标]”形式相同,但含义不同:inta[10];这是定义数组,指定数组a中有10个元素;b=a[6];这里的a[6]表示引用a数组中序号为6的元素值;知识点四:一维数组的初始化当数组定义后,系统会为该数组在内存中开辟一串连续的存储单元,但这些存储单元暂时还没有确定的值,当然我们可以在定义时对其进行赋初值,比如:inta[5]={0,1,2,3,4};所赋的初值放在一对大花括号中,数值的类型一定要与定义时的类型一样,所赋的初值用“,”隔开,以上语句就是:a[0]=0,a[1]=1,a[2]=2,a[3]=3,a[4]=4.特别注意下标从0开始的,而不是1;不可能跳过前面的元素给后面的元素赋值,但是允许为前面的元素赋值为0,当所赋初值个数少于定义数组的元素个数,系统将自动给后面的元素补初值0,当所赋初值个数少于定义数组的元素个数,则会出现错误;确定已对数组的全部元素均赋初值,则此时数组长度是可以省略的,如:inta[]={1,2,3};知识点五:二维数组的定义与引用二维数组中元素排列的顺序是:按行存放,即在内存中先顺序放第一行的元素,再存放第二行的元素,,其实二维数组的存储与一维数组类似,都是占用的一块连续的类存单元,它定义的一般形式是:类型符数组名[常量表达式][常量表达式];如:inta[2][3];定义a为2×3(2行3列)的数组,我们可以把二维数组当做一种特殊的一维数组,比如可以把a看作是一个一维数组,它有a[0]、a[1]、a[2]这3个元素,每个元素又包含四个一维数组,其实就是把a[0]、a[1]、a[2]看作是3个一维数组的名字。二维数组的引用与一维数组的引用一致的,一般形式是:数组名[下标][下标];如:b=a[1][2];注意定义数组和引用元素的区别:前者是来定义数组的维数和各维的大小,后者代表数组中的某一个元素。在引用数组时,特别注意的是下标值应在已定义的数组大小的范围内,如:inta[3][4];数组a的可用的“行下标”的范围为0到2,“列下标”的范围为0到3(行序号和列序号都是从0开始的)。知识点六:二维数组的初始化分行给二维数组赋初值。inta[2][3]={{1,2,3},{3,4,5}};将所有数据写在一个花括号内,按数组元素在内存中排列顺序各元素赋初值。inta[2][3]={1,2,3,3,4,5};可以对部分元素赋初值或者对各行中的某一元素赋初值。inta[2][3]={{1},{3}};inta[2][3]={{1},{0,0,5}};(4)对全部元素都赋初值,此时可以不指定第1维数组长度,但第2维的长度不能够省略。inta[][3]={1,2,3,3,4,5};(5)在只对部分元素赋初值而省略第1维的长度时,需要分行赋值,如:inta[][3]={{1,2},{},{1,2}};第一维的大小决定规则:当初值的个数能被第二维的常量表达式的值出尽时,所得的商就是第一维的大小。当初值的个数不能被第二维的常量表达式的值除尽时,则:第一维的大小=所得的商+1.知识点六:字符数组的定义用来存放字符数据的数组是字符数组,在字符数组中每一个元素存放一个元素,定义字符数组的方法与定义数值型整型的方法类似,一般形式为:char数组名[元素个数];如:charc[10];c是该数组名,该数组共有11个元素,并且每个元素都为字符型。知识点七:字符数组的初始化与引用对字符初始化,可逐个元素的赋值,即把字符逐个赋给数组元素,如:chara[6]={‘a’,‘b’,‘’,‘c’,‘d’,‘f’};如果花括号中提供的初值个数大于数组长度,则语法错误,如果初值个数小于数组长度,则将这些字符赋给数组中前面的那些元素,其余的元素自动定位空字符(‘\0’)。如果在定义字符数组时不进行初始化,则数组中个元素的值是不可预料的。字符数组的引用与前面的介绍的一样。知识点八:关于字符串的结束标志为了测定字符串的实际长度,C语言规定一个“字符串结束标志”,以字符‘\0’作为结束标志,也就是说在遇到字符‘\0’时,表示字符串结束,把它前面的字符组成一个字符串,在程序中往往依靠检测‘\0’的位置来判断字符串是否结束,而不是根据数组长度来决定字符串的长度,‘\0’代表的是ASCII码为0的字符,ASCII码为0的字符不是一个可以显示的字符,而且组要注意的是字符串的两端使用的双撇号而不是单撇号。知识点九:字符数组的输入输出用“%c”格式符将字符逐个输入或输出。用“%s”格式符将整个字符串一次输入或输出。如:chara[]=“abcdefg”;printf(“%s”,a);用格式符“%s”输出字符串时,printf()函数中的输出项应该是数组名,而不是数组中的某一个值,如“printf(“%s”,c[0]);”是错误的,而应该是“printf(“%s”,c);用用格式符“%s”输入字符串时,scanf()函数中的输入项应该是数组名,而不需要加“&”取址运算符,如“scanf(“%s”,&c);”是不对的,而应该是“scanf(“%s”,c);”,因为数组名c就是首地址,因此不需要加“&”取址运算符;当数组中的字符串的实际长度小于数组定义的实际长度,在输出时也是遇到‘\0’就结束,而且当数组中有多个‘\0’时,遇到第一个‘\0’就结束输出,结束符‘\0’是不被输出的。知识点九:关于字符串处理函数函数名称调用形式作用说明puts()puts(字符数组)将一个字符串(以‘\0’结束)输出来用该函数输出字符串可以包含转义字符gets()gets(字符数组)从终端输入一个字符串到字符数组,并且得到一个函数值puts()和gets()函数只能输入或输出一个字符串,不能写成puts(字符数组1,字符数组2)或gets(字符数组1,字符数组2)strcpy()strcpy(字符数组1,字符数组2)把字符数组2的内容复制到字符数组1所指定的存储空间,函数返回数组1的值,即字符数组1的首地址为保证复制进行,字符数组1必须是一个能够容纳字数数组2的存储空间strcat()strcat(字符数组1,字符数组2)把字符数组2的内容连接到字符数组1所指的字符串的后面,并自动覆盖字符数组1末尾的‘\0’,返回值是字符数组1的地址值字符数组1应该有足够的空间容纳两串合并后的内容strlen()strlen(字符数组)计算出以字符数组为起始地址的字符串的长度并以其作为函数返回值这一长度不包括串尾结束标志‘\0’strcmp()strcmp(字符数组1,字符数组2)比较两字符数组所指字符串的大小,若字符数组1>字符数组2,函数值大于0(为正);若字符数组1=字符数组2,函数值等于0;若字符数组1<字符数组2,函数值小于0(为负)根据字符的ASCII码值依次对字符数组1和字符数组2所指字符串对应位置上的字符进行比较,当出现第一队不同的字符时,即由这两个字符决定所在字符串的大小strlwr()strlwr(字符串)将字符串中的大写字母转换成小写字母strupr()strupr(字符串)将字符串中的小写字母转换成大写字母注意:(1)strcpy()与strncpy()函数中,“字符数组1”必须写成数组名形式(如a),“字符串2”可以是字符数组名,也可以是一个字符串常量;不能用赋值语句将一个字符串常量或字符数组直接一个字符数组,只能用strcpy()函数将一个字符串复制到另一个字符数组中,而赋值语句只能将一个字符赋给一个字符型变量或字符数组元素;可以用strncpy()函数将字符串2中前面n个字符复制到字符数组1中去,如:strncpy(str1,str2,n);第七章:用函数实现模块化程序设计知识点一:关于函数一个C程序中,可以由一个主函数和若干个其它函数构成,并且只能有一个主函数,主函数来调用其他函数,其他子函数之间也可以互相调用,需注意的是不能调用main()函数,因为main()函数是被操作系统调用。C程序总是从main()函数开始,调用其他函数完毕后,程序流程回到main()函数,继续执行主函数中其他语句,直到main()函数结束,则整个程序结束运行。所有函数都是平行的,即函数定义是他们是相互独立的,函数之间并不存在从属关系。函数分类:使用角度:(1)标准函数,即库函数,由系统提供,直接使用。(2)自定义函数,解决用户需要时设计定义的函数。函数形式来分:(1)无参函数(2)有参函数知识点二:函数的定义所有函数必须“先定义,后使用”,定义函数应包括:(1)指定函数的名字,以便以后按名调用。(2)指定函数的类型,,即函数返回值的类型。(3)指定函数的参数的名字和类型,以便在调用函数时向他们传递数据,对于无参函数不需要这项。(4)指定函数应当完成什么操作,即功能。C语言函数定义的一般形式:函数返回值的类型名函数名(类型名形式参数1,类型名形式参数2,…){说明部分;语句部分;}说明:在同一程序中,函数名必须唯一,不能出现重名情况,但形势参数名只要在同一函数中唯一即可,由于形式参数的作用域不同,因此形式参数可以与其他函数中的变量名相同,不能在函数内部在定义函数,说函数不能嵌套定义。注:1、无参函数定义一般形式:类型标识符函数名(){说明部分;语句;}例如:yyy(){printf("Howdoyoudo!\n");}2、有参函数定义一般形式类型标识符函数名(形式参数列表){说明部分;语句;}例如:intmax(intx,inty){intz;z=x>y?x:y;return(z);}注:return语句使函数结束执行,返回主调函数括号的的z值作为函数带回的值(返回值)。3、有返回值函数:例:intmax(intx,inty){intz;z=x>y?x:y;return(z);}4、无返回值函数:例:voidmax(...) { ... }注:类型标识符说明为void,表示函数无返回值,即该函数执行后不返回任何值。知识点三:函数的调用(1)函数调用的一般形式为:函数名(实参列表)若是无参函数,则“实参列表”可以不要,但括号一定要,如果实参列表包含多个实参,则各参数之间用逗号隔开只有函数作为调用语句是才需要分号,如果作为表达式或函数参数,函数本身的调用时不需要分号的,如:printf(“%d”,max(a,b););(2)调用函数间的数据传递在调用有参函数时,主调函数和被调函数之间会有数据传递的。在定义函数时,函数名后面括号中的变量成为“形式参数”,在住调函数中,函数名后面括号中的参数称为“实际参数”。函数调用的过程这里我就不再啰嗦了,主要说说几个比较重要的注意点。实参可以使常量、变量、表达式;在被定义的函数中必须指定形参类型;实参与形参的类型应相同或赋值兼容;实参变量对形参变量的数据传递时“值传递”,即单项传递,只能是由实参传递给形参,而不能够倒过来;在调用函数时,给形参分配储存单元,将实参对应的值传递给实参,函数调用结束后,形参单元被释放,实参单元仍保留并维持原值,特别注意千万不要妄想通过函数去改变实参的值,如果这样就违背了函数值的单一方向值传递的原则。(3)函数调用方式和函数的返回值函数语句,把函数调用作为一个语句,这时该函数只需要完成一定的操作而不必有返回值;函数表达式,当函数出现在一个表达式,该表达式就被称为函数表达式,因为要参与表达式中的计算,所以要求该函数有一个确定的返回值提供给表达式;函数参数,函数调用作为一个函数的实参。函数的返回值就是通过函数调用使主调函数能得到一个确定的值,return语句返回的一般形式:return表达式;或return(表达式);或return;return语句中的表达式的值就是所求的函数值,表达式值的类型必须与函数首部所说明的类型一致,若类型不一致,则以函数值的类型为准,由系统自动进行转换。知识点四:关于函数说明的位置一个函数在所有函数的外部,如在被调用之前说明,则在说明后所有的位置上都可以对该函数进行调用,如果在main()函数内部进行说明,则只能在main()函数内部才能识别该函数。在对函数做声明的时候注意后面是有分号的,而对函数进行定义的时候是没有分号的。知识点五:关于函数的嵌套与递归调用C语言中的函数定义都是相互平行和独立的,C语言不允许嵌套定义函数的,即一个函数内不能定义另一个函数,但是允许嵌套调用函数的,即在调用一个函数的过程中,又调用另一个函数。在一个函数中调用另一个函数,需要具备那些条件:1、被调用的函数必须已经存在。2、调用库函数,必须包含头文件,因为头文件中声明了库函数的原型(函数名、返回值类型及形参类型称为函数的原型)。例如:要使用sqrt()函数,必须加:#include"math.h"3、调用自定义函数,在调用前,一般应声明其原型。例如:intmax(intx,inty);递归调用:一个函数的函数体直接或间接调用该函数本身。如:intf(intx){inty,z;┆z=f(y);/*直接调用该函数本身*/┆return(2*z);}使用递归调用解决问题需注意的条件:(1)可以把需要解决的问题准化成为一个新的问题,而这个新问题的解决方法仍与原来的解决方法相同,只是每一次新问题所处理的对象是有规律的变化。(2)在不断转化的过程中可以使问题得到解决。(3)必须要有一个明确的已知条件来结束递归调用。总的来说,对于递归调用总是分为两个大的过程----回推和递推,从要求的未知量逐步回推到结束递归的已知量,然后在从这个已知量逐步递推所求的未知量。知识点六:数组作为函数参数首先我们先罗列一些比较重要关于数组的知识点:inta[5];1、a[0]、a[1]、a[2]、a[3]、a[4]表示每一个元素的值。2、数组名a表示该数组在内存的起始地址。3、可以用地址运算符&获得某个元素的地址。例如:&a[2]获得元素a[2]的地址,第一个元素a[0]的地址&a[0],即为数组a的起始地址。数组元素可以作为函数的实参,但不能做函数的形参,与用变量作为实参一样,数组用的是元素的值,按照从实参到形参,单向值传递方式进行传递。用数组元素做实参时,向形参变量传递的是数组元素的值,而用数组名作函数实参时,向形参(数组名或指针变量)传递的是数组首元素的地址,用数组名作函数实参时,不是把数组元素的值传给形参,而是把实参数组的首元素的地址传递给形参数组,这样两个数组就共同占用同一段内存单元,形参数组中各元素的值假如发生变化会使实参数组的值同时发生变化。知识点七:全局变量与局部变量局部变量:在函数内部定义的变量,它只在该函数范围内有效,称为“局部变量”。全局变量:在任何函数之外定义的变量,又称“外部变量”,从定义它开始,在整个程序(包括所有函数)内都是有效的(即可以使用的)。局部变量:1、主函数中定义的变量也只能在主函数中有效。2、不同的函数可以使用相同的变量名,互不干扰。3、形式参数也是局部变量。4、在一个函数内部可以在复合语句中定义变量,但这些变量只在本复合句中有效。5、不同的函数中可以使用同名的变量,他们代表不同的对象,互不干扰。全局变量:从定义它开始,在整个程序中均可以使用。因此,对于多个函数需要使用的共同变量,可以设计为全局变量。注意全局不能乱用,不便多用,因为:全局变量在整个程序运行过程中都占内存;局部变量仅在定义局部变量的函数被执行时才占内存,函数执行完释放所占内存。全局变量使各函数互相关联,结构性差。降低程序可读性。因为全局变量的值随时可能被其他位置的程序修改,不便于阅读,使程序容易出错。那么什么时候用“全局变量”呢?在函数中我们知道函数的返回值只有一个,但是在调用函数时我们需要在主函数中输出多个值,那么则可以用“全局变量”使其在主、被调函数中都有意义,从而输出。如果在同一源文件中,全局变量与局部变量同名,那么系统该怎么做呢?认哪一个呢?此时在局部变量的作用范围,全局变量将会被“屏蔽”。知识点八:变量的存储方式怎样描述一个变量???变量的属性:数据类型和数据的存储类别。变量的存储类别:指数据在内存中的存储方法。两大类:静态存储、动态存储,具体包括自动(auto)、静态(static)、寄存器(register)和外部(extern)这四种。详细阐述:auto变量,当在函数内部或符合语句内定义变量时,如果没有指定储存类别,或只用了auto说明符,系统就认为所定义的变量时自动auto类别的,即floata;与autofloata;是等价的;auto分配的内存在动态存储区,这类局部变量的作用域是从定义的位置起,到函数体(或符合语句)结束止;所有自动类局部变量的值不能被保存,随着函数的频繁调用,动态存储区会为某个变量分配的存储单元位置会随程序的运行而改变。register变量,register变量与auto变量的在于:用register说明是将变量的值保留在cpu的寄存器中,而不是像之前学过的变量那样占用内存单元,在运行程序时,访问寄存器内的值要比访问内存中的值快的多,因此当程序对运算速度有高要求时,把频繁引用的少数变量指定为register变量,可以提高程序的效率;CPU中的寄存器数量是有限的,因此只能说明少数的寄存器变量,当没有足够的寄存器来存放指定的变量,或编译系统认为指定的变量不适合放在寄存器中,则自动按auto变量处理;因为register的值是存放在寄存器而不是存放在内存中,所以register变量没有地址,也就不能对它实行求地址运算。静态存储类别static的局部变量,当函数体或符合语句体内部来用static来说明一个变量时,可以称该变量为静态局部变量,他与auto和register变量的区别是:在整个程序运行期间,静态局部变量在内存静态区中永久性的占据着存储单元,即使是退出函数后,下次再进入该函数,静态局部变量仍使用原来的存储单元,由于这些储存单元不会被释放,因此储存单元中的值得以保留,因而可以继续使用储存单元中原来的值,所以静态局部变量的生存期将一直延长到程序运行结束;静态局部变量的初值是在编译时赋予的,在执行过程中不再赋以初值,对未初值的静态局部变量,系统将自动为其赋初值0。用static声明外部变量,在某些程序中我们希望某些外部变量只限于本文件使用,而不能被其他文件引用,这时可以在定义外部变量时加一个static的声明,并不是对外部变量加上static才是静态存储不加static就是动态存储,两种形式的外部变量都是静态存储方式,只是作用范围不同而已。extern的声明外部变量,当一个全局变量定义在后,引用他的函数在前,应该在引用他的函数中用extern对此全局变量进行说明,以便通知编译程序,该变量已在外部定义了全局变量,已经分配存储单元,不要再为他开辟存储单元,这时其作用域从extern说明处起,延伸到函数的末尾。注意全局变量的说明与全局变量定义区别:变量的定义只能出现一次,要开辟存储单元,在定义全局变量时,不可使用extern说明符;但对全局变量的说明,可以多次出现在需要的地方,但必须用extern进行说明。知识点九:内部函数和外部函数内部函数就是只能被本文件中的其他函数所调用的函数。在定义内部函数时,在函数名和函数类型前加static,一般形式为:static类型标识符函数名(形参表)内部函数又称静态函数,只局限于所在文件,在不同的文件中可以有同名的内部函数,互不干扰。在函数定义时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可供其他文件的函数调用,一般形式为:extern类型标识符函数名(形参表)如果在定义函数时省略extern,则隐含为外部函数,在需要调用此函数文件中,用extern声明所用的函数是外部函数。第八章指针的利用知识点
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《接触网施工》课件 3.2.2 横梁安装
- 快速上手ERP系统:2024年培训教程
- 《逃家小兔》课件设计与应用
- 2024年幼儿启蒙:《逃家小兔》课件在早期教育中的妙用
- 2024大学批评通报(5篇)
- 科目四考试技巧口诀表-驾考实操
- 《档案的源流》课件
- 《春之声》教案创新设计:融入2024年教育政策
- 2024年《大小多少》课件:数字与尺寸的理解与应用
- 2024年《弟子规》教案:传统文化与时代精神的结合
- 生活中的工业设计智慧树知到期末考试答案章节答案2024年南开大学
- 化妆品生产工艺验证报告范文模板-新规要求工艺参数及关键控制点验证
- AutoCAD 2018基础教程综合实例
- 服务类验收单
- 城市管理大数据平台 第2部分:数据分级分类
- 工程施工合同履约课件
- 《整式的加减》第1课时 教学设计
- 医院科研工作计划及实施方案
- 桥梁结构健康监测系统实施和验收规范
- 2024安徽交控集团所属企业校园招聘笔试参考题库附带答案详解
- 退休项目经理返聘合同-工程管理
评论
0/150
提交评论