C语言笔试总结.docx
- 文档编号:10304792
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:34
- 大小:40.89KB
C语言笔试总结.docx
《C语言笔试总结.docx》由会员分享,可在线阅读,更多相关《C语言笔试总结.docx(34页珍藏版)》请在冰豆网上搜索。
C语言笔试总结
C语言笔试总结
1)合法的用户标识符考查:
合法的要求是由字母,数字,下划线组成。
,并且第一个必须为字母或则是下划线.
关键字不可以作为用户标识符号。
main define scanf printf都不是关键字。
迷惑你的地方If是可以做为用户标识符。
因为If中的第一个字母大写了,所以不是关键字。
例1.下面各选项中,均是C于语言合法标志符的选项是()
A)33weauto
B)_23me_3ew
C)_433e_else
D)ER-DF32
详解:
选B。
A项33错误并且第一个必须为字母或则是下划线.C项else是关键字不能作为用户标识符;D项ER-DF有下划线不能作为用户标识符。
例2.下列可用于C语言用户标识符的一组是()
A)voiddefineWORD
B)a3_3123Car
C)For-abcIFCase
D)2aDOsizeof
详解:
选B。
A项有关键字,关键字不能作为用户标识符;B项正确;C项-abc错误,用户标识符应该有字母,数字以及下划线组成;D项2a开头应该是下划线或字母。
总结:
笔试中一定有一道此类题目。
希望大家务必牢记用户标识符的规定。
C语言中用户标识符只能是字母(A-Z,a-z),数字(0-9),下划线(_)组成的字符串,并且其第一个字母必须是字母或下划线。
关键字是c语言规定的具有特定意义的标识符。
C语言中关键字如下
auto,double,int,Struct,break,else,long,switch,Case,enum,register,typedef,char,Extern,returnUnion,const,Float,short,unsigned,Continue,for,Signed,void,Default,goto:
无条件跳转语句,sizeof:
计算数据类型长度,volatile:
说明变量在程序执行中可被隐含地改xia变,do,while,staticif:
条件语句
练习题
1.以下选项中不合法的标识符是
Aprint
BFOR
C&a
D_00
2.下列用户标识符合法的一组是
Avoid123BBNBaa_abccas
Cas+b3-123IfD6fDoSIG
3.下列关于标识符的说法中错误的是
A合法的标识符是由字母、数字、下划线组成
BC语言的标识符中,大写字母和小写字母被认为是不同的字符
CC语言的标识符可以分为三类,即关键字、预定义标识符、和用户标识符
D用户标识符与关键字不同时,程序在执行时将给出出错信息
1.C2.B3.D
2)数据的合法形式
这种题型考察的是C程序中数据的表示方法
C语言中数据有两种形式常量和变量
八进制整形常量必须是以0开头,即以0作为八进制的前缀。
1。
整型常量十六进制整型常量前缀是OX或ox。
十进制整形常量没有前缀。
其数码为0—9。
(十进制常量的后缀有L或l,U或u,LU或lu)
小数形式
2.浮点常量指数形式有尾数加阶码标志e以及阶码(只能是整数,可以是符号)组成(也就是e后面的是整数)。
直接形式在单引号内直接书写字符
常量八进制形式'\ddd'
3.单字符常量十六进制形式'\xhh'
转义字符形式(\n,\t,\v,\b,\”,\r)
4.字符串常量
5.标号常量
对于常量笔试题目中经常考到关于整型常量和浮点常量的合法表示。
我们要分清的是0开头的是八进制,ox开头的是十六进制它们都是属于整型常量,而'\ddd','\xhh'它们是字符型常量,对于浮点型常量经常考到关于e后面的数必须是整数或字符,考试中经常遇到e后面是小数的情况,但是e前面的数可以是小数如2.1X105可以表示为2.1E5.
例1以下选项中可作为C语言合法常量的是
A)-80
B)-080
C)-8e1.0
D)-80.0e
详解:
选A。
A项正确;B项0开头是八进制数,而八进制数的取值范围是0-7,所以-080是不合法的;C和D项中,e后面的指数必须是整数,所以也不合法。
例2.以下选项中不属于字符常量的是
A'c'
B"c"
C'\xCC'
D'\072'
详解:
选B。
A项为单字符常量;B项为字符串常量,不是字符常量;C项为单字符常量是用十六进制表示,D项是八进制表示。
例3若有说明语句:
charc='\72';则变量c
A包含一个字符
B包含两个字符
C包含三个字符
D说明不合法
详解:
选A。
'\72'是用八进制表示的字符常量,它表示的是ASIC值是2X80+7X81=58也就是c所代表的是ASIC是58的字符所以是一个单字符。
例4以下选项中,不能作为合法常量的是
A1.23e04
B1.23e0.4
C1.23e+4
D1.234e0
详解:
A项合法,C语言中浮点指数形式输出时是按规范指数形式输出浮点数的指数形式:
+/-x.xxxxxe+/-xxx所以在e后面的整数中4和004,04是一样的
练习题
1.下列正确的字符型常量是
A'\r'
B"a"
C'\897'
D296
2.下面选项中,均是不正确的八进制数或十六进制数的选项是
A016Ox8f018
B0abc017Oxa
C010-Ox11Ox16
D0a127ff-123
3.下列不是字符常量的是
A'\v'B'\x2a'C'a'D"\0"
4.以下选项能表示合法常量的是
A整数:
1,200B.实数:
1.5E2.0
C字符斜杠:
"\"D字符串:
"\007"
1.选D
2.选A注意D项中296超过了字符的0--128范围所以不能表示字符,整型常量和字符可以相互转化2.选D3.选D4.选DA项不能用逗号;B项2.0错误C为'\\'
表达式的考查
例1表达式3.6-5/2+1.2+5%2的值
A4.3B4.8C3.3D3.8
详解:
选D注意优先级5/2=25%2=1原式=3.6-2+1.2+1=3.8
例2有以下定义:
inta;longb;doublex,y;则以下选项正确的表达式是
Aa%(intx-y)Ba=x!
=y
C(a*y)%bDy=x+y=x
详解:
选B(待考虑)选项A、C,取模运算符(%)用于计算两个整数相除所得的余数,intx-y与a*y的结果是双精度,因此不能使用取模运算符;选项D等号左边必须是确定的值而题中并没有说给X赋了值。
例3现有定义inta;doubleb;floatc;chark;则表达式a/b+c-k的值的类型是
Aint
Bdouble
Cfloat
Dchar
详解:
选B
例4设变量已正确定义并赋值,以下正确的表达式是
Ax=y*5=x+z
Bint(15.8%5)
Cx=y+z+5,++y
Dx=25%5.0
详解:
选C。
A项第二赋值运算符的右边是是一个表达式而不是变量;B和D选项%两边必须是整型常量。
C语言中表达式的考察有算术表达式,赋值表达式,逗号表达式和自增自减表达式。
算术表达式中要明确的是它们都是左结合的(所谓左结合就是当一个数字左右的运算符的优先级相同时这个数先和左边的运算符结合,比如2+3-4中这个3就会和+j结合而不会和-结合);算数运算符的考察还有就是混合运算类型的考察我们需要记住的是当某一运算对象类型不同时,应该进行类型的转换,转换的依据低数据类型转换为高类型依次为int→unsignedint→long→unsignedlongint→double;还有就是对算数运算符的考察%取余运算符的两个运算对象必须是整形数据如7%3结果为1,7.5%3就是非法运算,/除法运算如果有一个运算对象是float型那么结果就是double型。
赋值表达式抓住一点变量=确定的值,也就是说等号的左边必须是变量,不能是常量或表达式,右边的表达式可以使一个赋值表达式。
如a=b=7+1,。
并且“=”是右结合的(关于右结合前面已经讲了),同时赋值表达式也是一个有值表达式,可以作为一个运算对象来处理如(x=a)+(b=3),对于+=,—=一类的赋值运算符和=的优先级一样。
逗号表达式逗号运算是优先级最低的,特别的逗号表达式的值是最后一个式的值,如表达式1,表达式2,表达式3这个逗号表达式的值是表达式3的值
练习题
1.设变量a是int型,f是float型,i是double型,则表达式10+'a'+i*f值的数据类型为
Aint
Bfloat
Cdouble
D不确定
2.若变量已正确定义并赋值,以下符合C语言语法的表达式是
Aa:
=b+1
Ba=b=c+2
Cint18.5%3
Da=a+7=c+b
3..若变量已正确定义,在if(W)printf(“%d\n,k”);中,以下不可替代W的是
A.a<>b+c
B.ch=getchar()
C.a==b+c
D.a++
4.若有定义语句:
intx=10;则表达式x-=x+x的值是
A-20
B-10
C0
D10
5.以下叙述错误的是
A在程序中凡是以“#”开始的语句行都是预处理命令行
B预处理命令行的最后不能以分号结束
C#defineMAX是合法的宏定义命令行
DC程序对预处理命令行的处理是在程序执行的过程中进行的
1.选C2.选B。
D项中“=”左边必须是变量不能是表达式,第二个赋值运算符的左边是表达式所以不合法3.选AB项赋值表达式是一个有值表达式,所以可以作为W,C项是一个判断表达式;D项是一个自增表达式。
4..选B这个表达式喜欢i先算x+x的值后就变成x-=20所以选B5.选D
自增自减运算
宏定义
例1有以下程序
#include
#defineN5
#defineMN+1
#definef(x)(x*M)
main()
{inti1,i2;
i1=f
(2);
i2=f(1+1);
Printf("%d%d\n",i1,i2);
}
程序运行结果是
A1212
B117
C1111
D127
详解:
选B。
f
(2)=(2*M)=(2*N+1)=(2*5+1)=11,f(1+1)=(1+1*M)=(1+1*N+1)=7
例2执行下列语句后,a的值为:
inta;
#defineM(x,y)(x*y)
a=M(1+2,3);
A.9B.7
C.5D.以上均不是
详解:
选B。
M(1+2,3)=(1+2*3)=7
例3
(1)设有以下宏定义:
#defineWIDTH80
#defineLENGTHWIDTH+40
执行赋值语句:
v=LENGTH*2;v的值为()
(2)设有以下宏定义:
#defineWIDTH80
#defineLENGTH(WIDTH+40)
执行赋值语句:
n=LENGTH*2;v的值为()
详解:
(1)160.v=LENGTH*2=WTDTH+40*2=80+80=160
(2)240v=LENGTH*2=(WIDTH+40)*2=240
宏定义的题目实际上非常简单,要注意的是它和数学中的代换不一样,只要我们按那定义一步一步的像机器一样的算就行,不要加括号。
练习题
1.#defineADD(x)x+x
main()
{
intm=1,n=2,k=3;
intsum=ADD(m+n)*k;
printf("sum=%d",sum);
}
上面运行的结果是
Asum=9Bsum=10Csum=12Dsum=18
2.在宏定义#defineMAX30中,用宏名代替一个
A常量B字符串C整数D长整数
1.选B2.选B
定义的作用是在程序编译以前,把宏定义的内容(如题中MAX)用事先安排好的内容(如题中30)代替,然后在进行编译,也就是说宏定义的作用就有点像是我们人在编程序,然后写上了30这个字符串。
只不过这个写的过程有一部分工作是编译器帮助我们完成的。
所以宏定义可以理解为用一个字符串特定且一定的代替另一个字符串,宏定义是不允许重复定义的。
指针的考察
函数形参与实参
函数的形参与实参主要考的是关于形参的改变有没有改变实参,只要传递给函数的如果是指针的话,那么改变指针的值就是改变了实参的值,如果没有提到指针那么久可能没有改变实参的值
例1.若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是
A函数的实参和其对应的形参共占统一存储单元
B形参只是形式上的存在,不占用具体存储单元
C同名实参和形参占同意存储单元
D函数的形参和实参分别占用不同的存储单元
详解:
选D。
在定义函数是,系统并不给形参分配存储单元。
实参和形参分别属于主调函数和被调函数,具有不同的内存单元,所以在函数调用是形参发生改变,不会影响到实参
例2.
几种不类型的变量的作用域和生命期
这种题一般考的就是那几种,下面总结为“变量在哪里定义的就在哪里有效”我们看变量是首先看的是它所处的位置然后判定它的作用域和生命周期,若果在主函数中已经定义了一个变量设为a,那么如果在函数中在定义变量是没有用a,那么如果a在这个函数中使用它是作为主函数中的a来使用的,如果在函数中又定义了变量a,那么在函数内部这个a是重新定义的a,与外面得a毫不相干,因为这两个a根本就是不同的,它们所占的存储空间也不一样,只是名字一样罢了。
例1.以下程序的运行结果是
Intk;
voidfun(intm)
{m+=k,k+=m;printf("m=%dk=%d",m,k++);}
main()
{inti=4;
Fun(i++);printf("i=%dk=%d\n");}
Am=4k=5i=5k=5
Bm=4k=4i=5k=5
Cm=4k=4i=5k=5
Dm=4k=5i=5k=5
详解:
选B。
由于k是全局变量所以它在整个程序中一直有用。
所以在函数中出现的k就和外面的是一样的。
明白这个这个题就好做了
例2.
初始化的几种考法
数组的初始化有两种方法
(1)按行对二位数组初始化。
如intx[2][3]={{1,2,1},{3,4,2}};2按二维数组的存储顺序赋值存储如。
如intb[2][3]={1,2,3,4};初始化有几点注意的地方①对部分元素初始化那么其他的元素就是0如int[3][3]={{1},{1},{1}}中c
[0][0],c[1][0],c[2][0]为1外其他的都是0,这个很好理解,在未初始化是所有的元素所占的内存里储存的都是二进制表示的16个0所以没有定义的话就是0了
②注意区分初始化和赋值,初始化说简单一点就是在数组定义时给数组赋值这叫初始化但是如果数组定义完后给数组赋值就是不允许的,只能一个一个的赋值,因为数组也是一种指针,但是它们常量指针不能一起赋值,以为在一起赋值时这个常量指针始终是指在第一个元素的位置上
③行长度可以省略(原因在指针那部分讲)
例1以下数组定义中错误的是
Aintx[][3]={0}
Bintx[2][3]={{1,2},{3,4},{5,6}}
Cintx[][3]={{1,2,3},{4,5,6}}
Dintx[2][3]={1,2,3,4,5,6}
详解:
选B.二维数组的初始化1按行对二位数组初始化;2按二维数组的存储顺序赋值存储。
初始化就只有这两种。
B项就错在以行来初始化时出现了3行但是定义数组是只有两行
例2:
下列二维书组初始化语句中,正确且与语句floata[][3]={0,3,8,0,9};等价的是
A、floata[2][]={{0,3,8},{0,9}};
B、floata[][3]={0,3,8,0,9,0};
C、floata[][3]={{0,3},{8,0},{9,0}};
D、floata[2][]={{0,3,8},{0,9,0}};
函数的几个要点
printf函数
这个函数主要考的就是它的集中输出格式%d是整型,%c是字符型,%o是八进制输出,%x是十六进制,%u是无符号整型输出,%s是字符串输出,%f是单精度或双精度浮点输出,%e是以指数形式输出
例1.有以下程序段
Charch;intk;
Ch='a';k=12;
Printf("%c,%d,",ch,ch,k);printf("k=%d\n",k);
则执行上述程序段后的输出结果是
A因变量类型与格式描述符的类型不匹配输出无定植
B输出项与格式描述符个数不符,输出为凌或不定值
Ca,97,,12k=12
Da,97,k=12
详解:
选D。
Printf函数的输出结果就是按照格式描述符来输出的所以有一个逗号,又由于C语言中字符可以当做整型来进行处理所以就可以%d输出,输出的是asic码值,D项中多出的一个k没有对应的所以就没有输出
关于或和与
或和与的题目在笔试中是非常的简单只有那一种形式只要能明白字符可以作为整型来处理就可以搞定这方面的题目
例1.若变量kk为char型,以下不能正确判断除kk中的值为大写字母的表达式是
Akk>='A'&&kk=='Z'
B!
(kk='A'||kk<='Z')
C(kk+32)>='a'&&(kk+32)<='Z'
Disalpha(kk)&&(kk<91)
详解:
选B。
练习
1.当变量c的值不为2,4,6时,值也为“真”的表达式是
A(c==2)||(c==4)||(c==6)
B(c>=2&&c<=6)||(c!
=3)||(c!
=5)
C(c>=2&&c>=6)&&!
(c%2)
D(c>=2&&C<=6)&&(c%2!
=1)
等于的等价
例1.若有条件表达式(exp)?
a++:
b--,则以下表达式中能完全等价于表达式(exp)的是
A(exp==0)
B(exp!
=0)
C(exp==1)
D(exp!
=1)
详解:
选B。
在c语言中是用非0表示逻辑真的,用0表示逻辑假的
几个函数与指针结合的理解
例1设有定义语句int(*f)(int);则以下叙述正确的是
Af是基类型为int的指针变量
Bf是指向函数的指针变量,该函数具有一个int类型的形参
Cf是指向int类型以为数组的指针变量
Df是函数名,该函数的返回值是基类型为int类型的地址
详解:
选B
int(*p)[4]定义了一个指向包含有4个整型元素的以为数组指针
int*p[4]表示是一个具有4个元素的指针数组
这两种的区别在于int(*p)[4]表示指向的是一个数组这个数组有4个整型元素,
int*p[4]biaoshi的是一个数组有4个元素,元素是整型元素的指针
int(*pf)(int)定义了一个指向形参为int类型的,返回值为int类型的函数的指针变量pf
Int*pf(int)返回指针的函数
综合这四个我们可以看到当没有括号时那么就将int与*一起来看,int*是一种指针的定义方式,int*pf(int)返回值是指针,int*p[4]的元素是指针。
(1)有以下程序:
intadd(inta,intb){return(a+b);}
Main()
{intk,(*f)(),a=5,b=10;
f=add;
…
}
则以下函数调用与错误的是
A、k=(*f)(a,b);
B、k=add(ab,);
C、k=*f(a,b);
D、k=f(a,b);
详解选C指向函数的指针pf和*pf是完全一样的,没有区别。
二级公共基础知识总结
第一章数据结构与算法
1.1算法
算法:
是指解题方案的准确而完整的描述。
算法不等于程序,也不等计算机方法,程序的编制不可能优于算法的设计。
算法的基本特征:
是一组严谨地定义运算顺序的规则,每一个规则都是有效的,是明确的,此顺序将在有限的次数下终止。
特征包括:
(1)可行性;
(2)确定性,算法中每一步骤都必须有明确定义,不充许有模棱两可的解释,不允许有多义性;
(3)有穷性,算法必须能在有限的时间内做完,即能在执行有限个步骤后终止,包括合理的执行时间的含义;
(4)拥有足够的情报。
算法的基本要素:
一是对数据对象的运算和操作;二是算法的控制结构。
指令系统:
一个计算机系统能执行的所有指令的集合。
基本运算包括:
算术运算、逻辑运算、关系运算、数据传输。
算法的控制结构:
顺序结构、选择结构、循环结构。
算法基本设计方法:
列举法、归纳法、递推、递归、减斗递推技术、回溯法。
算法复杂度:
算法时间复杂度和算法空间复杂度。
算法时间复杂度是指执行算法所需要的计算工作量。
(用执行算法时所需要的基本元素按次数来衡量)
算法空间复杂度是指执行这个算法所需要的内存空间。
1.2数据结构的基本基本概念
数据结构研究的三个方面:
(1)数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构;
(2)在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构;
(3)对各种数据结构进行的运算。
数据结构是指相互有关联的数据元素的集合。
数据结构分为:
逻辑结构和存储结构
逻辑结构就是数据间本身的性质,存储结构是数据在电脑中的存储状态。
数据的逻辑结构包含:
(1)表示数据元素的信息;(描述数据本身)
(2)表示各数据元素之间的前后件关系。
(描述数据之间的关系)
数据的存储结构有顺序、链接、索引等。
数据的逻辑结构分为线性结构和非线性结构
线性结构条件:
(1)有且只有一个根结点;
(2)每一个结点最多有一个前件,也最多有一个后件。
非线性结构:
不满足线性结构条件的数据结构。
1.3线性表及其顺序存储结构
线性表是由一组数据元素构成,数据元素的位置只取决于自己的序号,元素之间的相对位置是线性的。
在复杂线性表中,由若干项数据元素组成的数据元素称为记录,而由多个记录构成的线性表又称为文件。
非空线性表的结构特征:
(1)且只有一个根结点a1,它无前件;
(2)有且只有一个终端结点an,它无后件;
(3)除根结点与终端结点外,其他所有结点有且只有一个前件,也有且只有一个后件。
结点个数n称为线性表的长度,当n=0时,称为空表。
线性表的顺序存储结构具有以下两个基本特点:
(1)线性表中所有元素的所占的存储空间是连续的;(也就是说线性表是存储结构)
(2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。
ai的存储地址为:
ADR(ai)=ADR(a1)+(i-1)k,,ADR(a1)为第一个元素的地址,k代表每个元素占的字节数。
顺序表的运算:
插入、删除。
1.4栈和队列
栈是限定在一端进行插入与删除的线性表,允许插入与删除的一端称为栈顶,不允许插入与删除的另一端称为栈底。
栈按照“先进后出”(FILO)或“后进先出”(LIFO)组织数据
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 笔试 总结