2024年1月30日发(作者:)
计算机二级c语言题库及答案一、选择题(请在【答题】菜单上选择【选择题】命令,启动选择题测试程序,一、选择题(请在【答题】菜单上选择【选择题】命令,启动选择题测试程序,按照题目上的内容进行答题。作答选择题时键盘被封锁,使用键盘无效,考生须使用鼠标答题。选择题部分只能进入一次,退出后不能再次进入。选择题部分不单独计时。)1、结构化程序所要求的基本结构不包括( )。 A.
顺序结构 B. GOTO跳转 C.
选择(分支)结构 D.
重复(循环)结构【答案】B【解析】结构化程序以模块化设计为中心,使用顺序、选择和循环三种基本控制结构就可以实现任何算法功能。结构化程序设计的思想包括自顶向下、逐步求精、模块化、限制使用GOTO语句。答案选择B选项。2、某二叉树有5个度为2的结点,则该二叉树中的叶子结点数是( )。 A. 10 B. 8 C. 6 D. 4【答案】C【解析】由二叉树的性质可知,对于任何一棵二叉树,其终端结点(叶子结点)数等于度为2的结点数加1。所以该二叉树的叶子结点数为5+1=6。答案选择C选项。3、以下叙述中正确的是( )。 A.
在C语言中,预处理命令行都以“#”开头 B.
预处理命令行必须位于C源程序的起始位置 C. #include
int m2(int x,int y){
return x<=y ? y :x;}
int fun(int a,int b){ return a+b;}main(){ int x=2,y=3,z=1; printf("%dn", fun(m1(x,y),m2(y,z)));
}程序的运行结果是( )。 A. 5 B. 6 C. 4 D. 3【答案】A【解析】函数m1()返回两个参数中较小的数值,函数m2()返回两个参数中较大的数值,函数fun()返回两个参数之和,所以fun(m1(x,y), m2(y,z)) = fun(m1(2,3), m2(3,1)) = fun(2,3) = 5,答案选择A选项。5、下面描述中错误的是( )。 A.
系统总体结构图支持软件系统的详细设计 B.
软件设计是将软件需求转换为软件表示的过程 C.
数据结构与数据库设计是软件设计的任务之一 D. PAD图是软件详细设计的表示工具【答案】A【解析】详细设计的任务是为软件结构图中而非总体结构图中的每一个模块确定实现算法和局部数据结构。软件系统的总体结构图是软件架构设计的依据,它并不支持软件的详细设计。支持软件系统的详细设计的有:程序流程N-S图以及PAD图等。答案选择A选项。6、软件按功能可以分为:应用软件、系统软件和支撑软件(工具软件)。下面属于应用软件的是( )。 A.
编译程序 B.
操作系统 C.
教务管理系统 D.
汇编程序【答案】C【解析】系统软件是控制和协调计算机及外部设备,支持应用软件开发和运行的软件,操作系统是系统软件;支撑软件是支撑各种软件的开发与维护的软件,又称为软件开发环境,编译程序、汇编程序、浏览器属于支撑软件;应用软件是用户可以使用的各种程序设计语言,以及用各种程序设计语言编制的应用程序的集合,教务管理软件属于应用软件。答案选择C选项。7、有以下程序:#include
A. 31.5 B. 7.5 C.
程序有错无输出结果 D. 14.0【答案】C【解析】宏定义是预处理命令,不是C语句,结尾不加";",所以程序会出现编译错误,答案选择C选项。8、设有定义:int k=0;以下选项的四个表达式中与其他三个表达式的值不相同的是( )。 A. ++k B. k+=1 C. k++ D. k+1【答案】C【解析】后缀表达式,先赋值,后自增。k++表达式值为k的值0;其余三项为k+1的值,即1。答案选择C选项。9、设有定义:double x=2.12;,以下不能完整输出变量x值的语句是( )。 A. printf("x=%5.0fn",x); B. printf("x=%fn",x); C. printf("x=%lfn",x); D. printf("x=%0.5fn",x);【答案】A【解析】printf函数控制字符%f输出float类型,%lf输出double类型。格式控制%,表示数据输出总的宽度为m位,其中小数部分占n位。当数据的小数位多于指定宽度n时,截去右边多余的小数,并对截去的第一位小数做四舍五入处理;而当数据的小数位少于指定宽度n时,在小数的右边补零;当m小于有效位数时,整数部分输出所有有效数字并且自动对齐,小数部分按照n指定位数输出。A项按照float格式输出数据,宽度为5位,保留小数0位,输出为2,不能完整输出x。B项按照float格式输出数据,输出为2.120000。C项按照double格式输出数据,输出为2.120000。D项按照float格式输出数据,保留小数位数为5,输出为2.12000。答案选择A选项。10、下面结构体的定义语句中,错误的是( )。 A. struct ord {int x;int y;int z;} struct ord a; B. struct ord {int x;int y;int z;}; struct ord a; C. struct ord {int x;int y;int z;} a; D. struct {int x;int y;int z;} a;【答案】A【解析】C语言中结构体变量的定义有三种方法:①定义结构体类型的同时定义结构体变量,如C项;②使用无名结构体类型定义结构体变量,如D项;③先定义结构体类型,后定义结构体变量,如B项,A项错在分别定义结构体类型与结构体变量时需要用“;”隔开。故答案选择A选项。11、有以下程序#include
{ scanf("%d", &b); switch(b) { default: printf("%d,", ++b); case 1: printf("%d,", ++b); case 2: printf("%d,", ++b); } }}执行时输入:1 2 3 <回车>,则输出结果是( )。 A. 2,3,3,4,5,6, B. 2,3,4, C. 2,2,3,4,4,4, D. 2,3,4,3,4,4,【答案】A【解析】考查C语言中的switch-case语句。执行switch-case语句时,一定会先进行匹配,匹配成功则执行当前case语句,再根据是否有break,判断是否继续输出,或是跳出判断。程序中输入1时,与case 1匹配成功,执行后面的输出语句,输出2,且此时b=2,因为后面没有break语句,继续执行下一条输出语句,输出3。继续输入2时,与case 2匹配成功,执行后面的输出语句,输出3。输入3时,没有可匹配的case语句,执行default语句,输出4,b变为4;后面没有break语句,继续执行case 1后的输出语句,输出5,b变为5;同理继续执行case2后面的输出语句,输出6。答案选择A选项。12、有如下程序#include
{ int i, *ptr; int array[5] = {5,3,1}; for (ptr=array, i=0; i<5; i++, ptr++) { if (*ptr == 0) putchar('X'); else putchar('A' + *ptr); } printf("n");}程序运行后的输出结果是( )。 A. ABCDE B. FFFXX C. FDBBB D. FDBXX【答案】D【解析】对数组进行初始化时,如果在说明数组时给出了长度,但没有给所有的元素赋予初始值,而只依次给前面的几个数组元素赋予初值,那么C语言将自动对余下的元素赋初值,即array={5,3,1,0,0}。程序执行过程为:执行for循环,将数组首地址赋给指针ptr,依次遍历每一个元素,如果数组元素为0则输出'X',如果不为0则按照字母表输出字符'A'后第array[i]个字符。程序运行后的输出结果为:FDBXX,答案选择D选项。13、设有定义:int x=0, *p;
紧接着的赋值语句正确的是( )。 A. *p=x; B. *p=NULL;
C. p=x; D. p=NULL;【答案】D【解析】指针赋值的正确写法:①p=&x,表示p指向x的存储单元;②p=NULL,表示p是空指针。③*p=x,表示将p指向的内容赋值为x,但前提是p已进行了初始化。答案选择D选项。14、以下fun函数的功能是将形参s所指字符串内容颠倒过来void fun(char *s){ int i,j,k; for(i=0,j=strlen(s) __________ ;i 语句p=NULL;执行后,指针p指向地址为0的存储单元 B. 指针变量只能通过求地址运算符(&) 来获得地址值 C. 语句p=NULL;与p=0;是等价的语句 D. int* p1; int ** p2; int *p3;都是合法的定义指针变量的语句【答案】D【解析】考查指针变量。指针变量的定义形式为:类型名 *指针变量名,表示指向某一个变量的指针,如果定义形式为:类型名 **指针变量名,则表示指向某一个指针变量的指针,所以D正确。p=NULL;是将空指针赋给指针变量,表示该指针变量当前未指向任何变量,选项A错误。指针变量本身存储的是其指向的变量的地址值,不需要使用求地址运算符(&)来获得地址,选项B错。语句p=0;本身不正确,两者不等,语句p=NULL和p=0是一样的,故选项C错。答案选择D选项。16、以下合法的转义字符是( )。 A. 'x41' B. '0x41' C. 'X41' D. '0X41'【答案】A【解析】转义字符以反斜杠''开头,后面跟一个字符或一个八进制或十六进制数表示。十六进制转义字符是由反斜杠''和字母x及随后的1~2个十六进制数字构成的字符序列。答案选择A选项。17、以下叙述中正确的是( )。 A. 函数调用时,不必区分函数名称的大小写 B. 调用函数时,函数名必须与被调用的函数名完全一致 C. 函数名允许用数字开头 D. 在函数体中只能出现一次return语句【答案】B【解析】调用函数的时候只有保证调用语句的函数名和被调函数的函数名、参数列表一致才能保证调用的正确性,B正确。C语言对大小写敏感,选项A错。用户自定义的函数名需要遵循用户标识符的命名规则,由字母、数字、下划线组成并且第一个字符不能为数字,选项C错。一个函数每次只能使用一个return语句,但是该函数体中可以有多个返回点,也就是有多条return语句,每次只从其中一点返回,选项D错。答案选择B选项。18、有以下程序#include 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。通过两次循环,最后i的值为2,'K'+2='M',所以最后写入文件的字符为'M'。答案选择A选项。19、结构化程序的三种基本控制结构是( )。 A. 顺序、选择和重复(循环) B. 过程、子程序和分程序 C. 顺序、选择和调用 D. 调用、返回和转移【答案】A【解析】结构化程序设计中三种基本控制结构为顺序、选择和重复(循环)。答案选择A选项。20、下面对类-对象主要特征描述正确的是( )。 A. 对象唯一性 B. 对象无关性 C. 类的单一性 D. 类的依赖性【答案】A 【解析】类是对象的抽象具有抽象性、概括性等,对象是类的具体实例,具有标识惟一性、分类性、多态性、封装性、模块独立性。故答案选择A选项。21、以下叙述中错误的是( )。 A. 用typedef定义新的类型名后,原有类型名仍有效 B. 可以用typedef将已存在的类型用一个新的名字来代表 C. 可以通过typedef增加新的类型 D. 用typedef可以为各种类型起别名,但不能为变量起别名【答案】C【解析】关键字typedef的作用只是将C语言中已有的数据类型作置换,并不是增加新的类型,答案选择C选项。22、以下程序中给数组所有元素输入数据,请从选项中选择正确的答案填入下划线处。( )#include 课号,成绩 B. 学号,成绩 C. 学号,课号 D. 学号,姓名,成绩【答案】C【解析】学号是学生表S的主键,课号是课程表C的主键,所以选课表SC的关键字应该是与前两个表能够直接联系且能唯一定义的学号和课号。答案选择C选项。24、设已有定义:float x;则以下对指针变量p进行定义且赋初值的语句中正确的是( )。 A. float *p=&x; B. int *p=(float)x; C. float p=&x; D. float *p=1024;【答案】A 【解析】考查指针变量的初始化。A项正确,p是float类型的指针,指向x的存储单元;B项错误,p是int类型的指针,只能指向int变量的存储单元;C项错误,p的float类型的变量,&x是取变量x的地址,不能把地址赋值给float类型变量;D项错误,p是指向float类型的指针,不能使用常整型赋值。答案选择A选项。25、关于“do{循环体}while(条件表达式)”,以下叙述正确的是( )。 A. 循环体的执行次数总是比条件表达式的执行次数多一次 B. 条件表达式的执行次数总是比循环体的执行次数多一次 C. 条件表达式的执行次数与循环体的执行次数一样 D. 条件表达式的执行次数与循环体的执行次数无关【答案】D【解析】考查do-while循环语句。其执行过程为:先执行do循环体语句,然后判定圆括号内的表达式,如果为真则继续执行do循环体语句,如果为假则结束循环。考虑情况一:即由于条件表达式为假而退出循环,此时二者执行次数一样;情况二:即在循环体中执行了break语句而退出循环,此时条件表达式的执行次数比循环体的执行次数少一次。因此,答案选择D选项。26、有以下程序#include int m2(int x,int y){ return x<=y ? y :x;} int fun(int a,int b){ return a+b;}main(){ int x=2,y=3,z=1; printf("%dn", fun(m1(x,y),m2(y,z))); }程序的运行结果是( )。 A. 5 B. 6 C. 4 D. 3【答案】A【解析】函数m1()返回两个参数中较小的数值,函数m2()返回两个参数中较大的数值,函数fun()返回两个参数之和,所以fun(m1(x,y), m2(y,z)) = fun(m1(2,3), m2(3,1)) = fun(2,3) = 5,答案选择A选项。27、以下叙述中正确的是( )。 A. 如果企图通过一个空指针来访问一个存储单元,将会得到一个出错信息 B. 即使不进行强制类型转换,在进行指针赋值运算时,指针变量的基类型也可以不同 C. 设变量p是一个指针变量,则语句p=0;是非法的,应该使用p=NULL; D. 指针变量之间不能用关系运算符进行比较【答案】A 【解析】空指针意味着该指针没有指向任何具体的变量,所以不能访问一个存储单元,A正确。指针的赋值运算只能在同一数据类型之间进行,故选项B错。语句p=0和p=NULL是一样的,都是把一个空指针赋给指针变量p,故选项C错。指针之间能进行关系运算,比较的是地址值的大小,选项D错。答案选择A选项。28、以下叙述中错误的是( )。 A. C程序对预处理命令行的处理是在程序执行的过程中进行的 B. 预处理命令行的最后不能以分号表示结束 C. #define MAX是合法的宏定义命令行 D. 在程序中凡是以“#”开始的语句行都是预处理命令行【答案】A【解析】在C语言中,编译预处理是在编译程序对C源程序进行编译前执行的,选项A错误。以“#”开头的行都称为“编译预处理命令行”,其中的末尾不得用“;”结束,区别语句的定义和说明语句,选项B、D正确。C项中的宏定义为不带参数的宏命令行,宏名之后可以有替换文本,也可以没有,选项C正确。答案选择A选项。29、结构化程序的三种基本控制结构是( )。 A. 顺序、选择和重复(循环) B. 过程、子程序和分程序 C. 顺序、选择和调用 D. 调用、返回和转移【答案】A【解析】结构化程序设计中三种基本控制结构为顺序、选择和重复(循环)。答案选择A选项。30、有以下程序#include c.p+=2;}void main(){ int i; A a={1,2}; f(a); printf("%d,%dn", a.b, a.p);}程序运行后的输出结果是( )。 A. 2,4 B. 1,2 C. 1,4 D. 2,3【答案】B【解析】考查结构体变量作为函数实参整体传递,也是一种值传参,形参的变化不能影响到实参,所以调用函数f(a)对a中的数据没有影响,输出结果为1,2,答案选择B选项。31、对于 if(表达式)语句,以下叙述正确的是( )。 A. “表达式”的值可以是任意合法的数值 B. 变量不能出现在“表达式”中 C. 常量不能出现在“表达式”中 D. 如果“表达式”的值不是逻辑值,程序会出编译错误【答案】A【解析】if语句中的“表达式”可以是任意合法的C语言表达式,包括关系表达式和逻辑表达式等,也可以是任意的数值类型(包括整型、实型、字符型等),A项正确。“表达式”中可以出现变量或者常量,也不一定必须是逻辑值,B、C、D项错误。答案选择A选项。32、有以下程序#include 结果不确定【答案】A【解析】这是对for循环的基本考查,C语言中for循环的形式:for(表达式1;表达式2;表达式3),本题中表达式1和表达式3为空语句。程序执行过程为:定义整型变量a、b并赋初值,执行for循环,执行控制语句++a,a先自增变为0再使用,不满足控制条件,跳出循环。因此b并未改变,最后输出0,-1。答案选择A选项。33、若有定义语句:int m[][3]={1,2,3,4,5,6,7};,则与该语句等价的是( )。 A. int m[][3]={{1,2,3},{4,5},{6,7}}; B. int m[][3]={{1,2},{3,4},{5,6,7}}; C. int m[][3]={{1,2,3},{4,5,6},{7}}; D. int m[][3]={{1},{2,3,4},{5,6,7}};【答案】C【解析】考查二维数组的初始化。二维数组的初始化有两种方式,①分行初始化,方式为:数据类型数组名[行下标表达式][列下标表达式]={{第0行初值},{第1行初值表},…{最后1行初值表}};,如果初值表只对部分元素赋初值,没有被赋初值的元素将被自动赋值为0。②不分行将所有数据依次列在一个花括号里,即数据类型数组名[行下标表达式][列下标表达式]={初值表};,这种方式的赋值就是将初值表的数据依次赋予数组的每个元素,其中赋值是按照数组元素在内存中的位置进行的。题目中的初始化语句是第二种方法,如果用第一种方法应该是int m[][3] = {{1,2,3}, {4,5,6}, {7}};,这里应该保证除r最后一行,每一行都满列有3个元素,答案选择C选项。34、以下程序段中的变量已正确定义for( i=0; i<4; i++,i++ ) for( k=1; k<3; k++ );printf("*" );该程序段的输出结果是( )。 A. ******** B. **** C. ** D. * 【答案】D【解析】for语句在没有"{}"说明时仅仅是跟随其后的第一条语句,即另外一个for语句,第二个for循环有个";"结束,所以整个双重循环将被视为空语句。然后执行下一个顺序语句,即输出语句,只输出一个"*"。答案选择D选项。35、以下叙述中正确的是( )。 A. 语句p=NULL;执行后,指针p指向地址为0的存储单元 B. 指针变量只能通过求地址运算符(&) 来获得地址值 C. 语句p=NULL;与p=0;是等价的语句 D. int* p1; int ** p2; int *p3;都是合法的定义指针变量的语句【答案】D【解析】考查指针变量。指针变量的定义形式为:类型名 *指针变量名,表示指向某一个变量的指针,如果定义形式为:类型名 **指针变量名,则表示指向某一个指针变量的指针,所以D正确。p=NULL;是将空指针赋给指针变量,表示该指针变量当前未指向任何变量,选项A错误。指针变量本身存储的是其指向的变量的地址值,不需要使用求地址运算符(&)来获得地址,选项B错。语句p=0;本身不正确,两者不等,语句p=NULL和p=0是一样的,故选项C错。答案选择D选项。36、有以下程序#include 下划线 B. 大写字母 C. 数字字符 D. 连接符【答案】D 【解析】C语言中标识符由字母、下划线或数字组成,且开头必须是字母或下划线。答案选择D选项。38、对于函数声明void fun(float array[], int *ptr);以下叙述正确的是( )。 A. 函数参数 array, ptr 都是指针变量 B. 函数声明有语法错误,参数 array 缺少数组大小定义 C. 调用函数时,array数组中将存储从实参中复制来的元素值 D. 调用函数时,array数组的元素和ptr都是按值传送【答案】A【解析】考察函数声明的具体规则。当把数组名作为函数实参时,它会自动被转换为指针,所以array和ptr都是指针,A项正确。用一维数组作为函数的形参时,可以不指定数组具体大小,用二维数组作为函数的形参时,可以忽略数组中一维的大小,但必须指定第二维的大小,B项错误。调用函数时,将实参数组首地址赋给指针array,而不是传递整个数组元素,C项错误。调用函数时,array与ptr都是按地址传送的,D项错误。答案选择A选项。39、有以下程序#include printf("%d %dn",a,b);}程序运行后的输出结果是( )。 A. 5 6 3 4 B. 3 4 5 6 C. 1 2 5 6 D. 5 6 1 2【答案】A【解析】在一个源文件中如果外部变量和局部变量同名,则在该局部变量的作用域内,该外部变量会被"屏蔽",所以函数fun1()输出的为局部变量a、b的值:5 6;fun2()改变的是全局变量a、b的值,输出结果为3 4,答案选择A选项。40、有以下程序#include c.p+=2;}void main(){ int i; A a={1,2}; f(a); printf("%d,%dn", a.b, a.p);}程序运行后的输出结果是( )。 A. 2,4 B. 1,2 C. 1,4 D. 2,3【答案】B【解析】考查结构体变量作为函数实参整体传递,也是一种值传参,形参的变化不能影响到实参,所以调用函数f(a)对a中的数据没有影响,输出结果为1,2,答案选择B选项。二、程序填空题1、给定程序中,函数fun功能是:找出100~999之间(含100和999)所有整数中各位上数字之和为x(x为一正整数)的整数.然后输出;符合条件的整数个数作为函数值返回。 例如,当x值为5时,l00~999之间各位上数字之和为5的整数有:104、113、122、131、140、203、212、221、230、302、311、320、401、410、500。共有15个。当x值为27时,各位数字之和为27的整数是:999。只有1个。 请在程序的下划线处填入正确的内容并把下划线删除.使程序得出正确的结果。 注意:源程序存放在考生文件夹下的BLAIIK1.C中。 不得增行或删行.也不得更改程序的结构!/**********code.c**********/#include s3=t/100; if(s1+s2+s3==③______) { printf("%d ",t); n++; } t++; } return n;}void main(){ int x=-1; while(x<0) { printf("Please input(x>0): "); scanf("%d",&x); } printf("nThe result is: %dn",fun(x));}/**********-code.c**********/ 输入答案内容...【答案】 ①999 ②t/10 ③x【解析】 填空1:题目要求找出100~999之间符合要求的数,所以while语句的循环条件是t<=999。 填空2:变量s2存放三位数的十位,取出三位数十位数值的方法为s2=(t/10)%10。 填空3:题目需要判断各位上数字之和是否为x,所以if语句条件表达式是s1+s2+s3==x。三、程序改错题1、绐定程序MODI1.C中函数fun的功能是:从低位开始取出长整型变量s中偶数位上的数,依次构成一个新数放在t中。高位仍在高位,低位仍在低位。 例如,当s中的数为:7654321时,t中的数为:642。 请改正程序中的错误,使它自能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!/**********code.c**********/#include long sl=10; s /= 10; *t = s % 10; /**********found**********/ while (s < 0) { s = s/100; *t = s%10*sl + *t; sl = sl * 10; }}main(){ long s, t; printf("nPlease enter s:"); scanf("%ld", &s); fun(s, &t); printf("The result is: %ldn", t);}/**********-code.c**********/输入答案内容...【答案】 (1)错误:void fun (long s, long t) 正确:void fun(long s,long *t) (2)错误:while (s < 0) 正确:while(s>0)【解析】 错误1:函数的形参类型应与实参类型相同,主函数中函数fun()的调用方式说明其参数应为指针类型,所以形参t应定义为long *t。 错误2:while循环的功能是,每循环一次就从s中的数上取出一位进行运算,直到取完为止,所以循环条件为s>0。 四、程序设计题1、请编写一个函数fun其功能是:将ss所指字符串中所有下标为奇数位置上的字母转换为大写(若该位置上不是字母,则不转换)。 例如,若输入“abc4EFg”,则应输出“aBe4EF9”。 注意:部分源程序在文件PROG1.C文件中。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。/**********code.c**********/#include if(i%2==1&&ss[i]>='a'&&ss[i]<='z') ss[i]=ss[i]-32;}【解析】本题的设计思路是:①利用循环遍历字符串;②利用if语句判断字符是否为小写字母且其下标为奇数,如果是则把字符减32转换成对应的大写字母。
本文发布于:2024-01-30 13:17:40,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170659186020279.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |