C语言全国计算机等级(二级)考试指导
第一章二级(C语言程序设计)考试大纲
公共基础知识
基本要求
1.掌握算法的基本概念。
2.掌握基本数据结构及其操作。
3.掌握基本排序和查找算法。
4.掌握逐步求精的结构化程序设计方法。
5.掌握软件工程的基本方法,具有初步应用相关技术进行软件开发的能力。
6.掌握数据库的基本知识,了解关系数据库的设计。
考试内容
一.基本数据结构与算法
1.算法的基本概念;算法复杂度的概念和意义(时间复杂度与空间复杂度)。
2. 数据结构的定义;数据的逻辑结构与存储结构;数据结构的图形表示;线性结构与非线性结构的概念。
3. 线性表的定义;线性表的顺序存储结构及其插入与删除运算。
4. 栈和队列的定义;栈和队列的顺序存储结构及其基本运算。
5. 线性单链表、双向链表与循环链表的结构及其基本运算。
6. 树的基本概念;二叉树的定义及其存储结构;叉树的前序、中序和后序遍历。
7. 顺序查找与二分法查找算法;基本排序算法(交换类排序,选择类排序,插入类排序)。
二、程序设计基础
1. 程序设计方法与风格。
2. 结构化程序设计。
3. 面向对象的程序设计方法,对象,方法,属性及继承与多态性。
三、软件工程基础
1. 软件工程基本概念,软件生命周期概念,软件工具与软件开发环境。
2. 结构化分析方法,数据字典,软件需求规格说明书。
3. 结构化设计方法,总体设计与详细设计。
4. 软件测试的方法,白盒测试与黑盒测试,测试用例设计,软件测试的实施,单元测试、集成测试和系统测试。
5. 程序的测试,静态调试与动态调试。
四、数据库设计基础
1. 数据库的基本概念:数据库,数据库管理系统,数据库系统。
2. 数据模型,实体联系模型及E-R图,从E-R图导出关系数据模型。
3. 关系代数运算,包括集合运算及选择、投影、连接运算,数据库规范化理论。
4. 数据库设计方法和步骤:需求分析、概念设计、逻辑设计核物理设计的相关策略。
考试方法
1. 公共基础知识的考试方法为笔试,与C语言程序设计(C++语言程序设计、Java语言程序设计、Visual Basic语言程序设计、Visual FoxPro数据库程序设计或Access数据
库程序设计)的笔试部分合为一张试卷。公共基础知识部分占全卷的30分。
2.公共基础知识的10道选择题和5道填空题。
C语言程序设计
基本要求
1. 熟悉TURBO C 集成环境。
2. 熟练掌握结构化程序设计的方法,具有良好的程序设计风格。
3. 掌握程序设计中简单的数据结构和算法。
4. TURBO C 的集成环境下,能够编写简单的C程序,并具有基本的纠错和调试程序的能力。
考试内容
一、C语言的结构
1.序的构成,MAIN函数和其他函数。
2.头文件,数据说明,函数的开始和结束标志。
3.源程序的书写格式。
4.C语言的风格。
二、数据类型及其运算
1.C的数据类型(基本类型,指针类型,空类型)及其定义方法。
2.C运算的种类、运算优先级和结合性。
3.不同类型数据间的转换与运算。
4.C表达式类型(赋值表达式,算术表达式,关系表达式,逻辑表达式,条件表达式,逗号表达式)和求值规则。
三、基本语句
1.表达式语句,空语句,复合语句。
2.数据的输入与输出,输入输出函数的调用。
3.复合语句。
4.Goto语句和语句标号的使用。
四、选择结构程序设计
1.用if语句实现选择结构。
2.用switch语句实现多分支选择结构。
3.选择结构的嵌套
五、循环结构程序设计
1.For循环结构。
2.While和do while循环结构。
3.Continue与聚合break语句。
4.循环的嵌套。
六、数组的定义和引用
1.一维数组合多维数组的定义、初始化和引用。
2.字符串与字符数组。
七、函数
1.库函数的正确调用。
2.函数的定义方法。
3.函数的类型和返回值。
4.形式参数与实在参数,参数值得传递。
5.函数的正确调用,嵌套调用,递归调用。
6.局部变量和全局变量。
7.变量的存储类别(自动,静态,寄存器,外部),变量的作用域和生存期。
8.内部函数与外部函数。
八、编译预处理
1.宏定义:不带参数的宏定义;带参数的宏定义。
2.“文件包含”处理。
九、指针
1.指针与指针变量的概念,指针与地址预算符。
2.变量、数组、字符串、函数、结构体的指针以及指向变量、数组、字符串、函数、结构体的指针变量。通过指针引用以上各类型数据。
3.用指针作函数参数。
4.返回指针值得指针函数。
5.指针数组,指向指针的指针,main函数的命令行参数。
十、结构体(即“结构”)与孔用体(即“联合”)
1.结构体和公用体类型数据的定义方法和引用方法。
2.用指针和结构体构成链表,单向链表的建立、输出、删除与插入。
十一、位运算
1.位运算符的含义及使用。
2.简单的位运算。
十二、文件操作
1.只要求缓冲文件系统(即高级磁盘I/O系统),对非标准缓冲文件系统(即低级磁盘I/O系统)不要求。
2.文件类型指针(FILE类型指针)。
3.文件的打开与关闭(FOPEN,FCLOSE)。
4.文件的读写(FPRTC,FGETC,FPUTS,FGETS,FREAD,FWRITE,FPRINTF,FSCANF函数)。5.文件的定位(REWIND,FSEEK函数)。
考试方式
1.笔试:120分钟,满分100分,其中含公共基础知识部分的30分。
2.上机:60分钟,满分100分。
第二章全国计算机等级考试(二级)C语言应试方略
1.怎样学习C语言
很多人对学习C语言感到无从下手,经常问我同一个问题:究竟怎样学习C语言?
我是一个教师,和很多刚刚起步的人一样,学习的第一个计算机语言就是C语言。在多年的教学与编程实践中,我深深的体会到C语言对于一个程序设计人员是多么的重要,如果不懂C语言,你想写底层程序这几乎听起来很可笑,不懂C语言,你想写出优秀高效的程序,这简直就是天方夜谭。为什么C语言如此重要呢?
第一:C语言语法结构很简洁精妙,写出的程序也很高效,便于描述算法,大多数的程序员愿意使用C语言去描述算法本身,所以,如果你想在程序设计方面有所建树,就必须去学它。
第二:C语言能够让你深入系统底层,你知道的操作系统,哪一个不是C语言写的?所有的windows,Unix,Linux,Mac,os/2,没有一个例外,如果你不懂C语言,怎么可能深入到这些操作系统当中去呢?更不要说你去写它们的内核程序了。
第三:很多新型的语言都是衍生自C语言,C++,Java,C#,J#,perl...哪个不是呢?掌握了C语言,可以说你就掌握了很多门语言,经过简单的学习,你就可以用这些新型的语言去开发了,由此可见C语言是程序设计的重要基础。多说一点:即使现在招聘程序员,考试都是考C语言,你想加入IT行业,那么就一定要掌握好C语言。
那么究竟怎样学习C语言呢?
1)工欲善其事,必先利其器
这里介绍几个学习C语言必备的东东:
一个开发环境,例如turbo C 2.0,这个曾经占据了DOS时代开发程序的大半个江山。但是现在windows时代,用turbo C感觉不方便,编辑程序起来很吃力,并且没有拖放,更没有函数变量自动感应功能,查询参考资料也不方便。建议使用Visual C++,这个东西虽然比较大块头,但是一旦安装好了,用起来很方便。
一本学习教程,现在C语言教材多如牛毛,但推荐大家使用《C语言程序设计》谭浩强主编清华大学出版社,此书编写的很适合初学者,并且内容也很精到。
除此以外,还可以借助于辅助学习的软件,毕竟现在是Window时代了,学习软件多如牛毛,不象我们当初学习,只有读书做题这么老套。
2)葵花宝典
学习计算机语言最好的方法是什么?答曰:读程序。
没错,读程序是学习C语言入门最快,也是最好的方法。如同我,现在学习新的J#,C#等其他语言,不再是抱着书本逐行啃,而是学习它们的例程。当然,对于没有学过任何计算机语言的初学者,最好还是先阅读教程,学习完每一章,都要认真体会这一章的所有概念,然后不放过这一章中提到的所有例程,然后仔细研读程序,直到每一行都理解了,然后找几个编程题目,最好是和例程类似的或一样的,自己试图写出这段已经读懂的程序,不要以为例程你已经读懂了,你就可以写出和它一样的程序,绝对不一定,不相信你就试一试吧,如果写不出来,也不要着急,回过头来再继续研究例程,想想自己为什么写不出来,然后再去写这段程序,反反复复,直到你手到擒来为止,祝贺你,你快入门了。
3)登峰造极
写程序的最高境界其实就是掌握各种解决问题的手段(数据结构)和解决问题的方法(算
法)。
是不是写出底层程序就是程序设计高手呢?非也,写底层程序,无非是掌握了硬件的结构,况且硬件和硬件还不一样,要给一个芯片写驱动程序,无非就是掌握这块芯片的各种寄存器及其组合,然后写值读值,仅此而已。这不过是熟悉一些IO函数罢了。那么怎样才算精通程序设计呢?举个例子:你面前有10个人,找出一个叫“张三”的人,你该怎么办?第一种方法:直接对这10个人问:“谁叫张三”。第2种方法:你挨个去问“你是不是张三?”,直到问到的这个人就是张三。第三种方法:你去挨个问一个人“你认不认识张三,指给我看”。不要小看这个问题,你说当然会选第一种方法,没错恭喜你答对了,因为这个方法最快,效率最高,但是在程序设计中找到解决问题的最优方法和你用的手段却是考验一个程序员程序设计水平的重要标志,而且是不容易达到的。刚才这个问题类似于数据结构和算法中的:Map 数据结构,穷举查找和折半查找。所以掌握好数据结构和一些常用算法,是登峰造极的必然之路。最后给大家推荐严尉敏的《数据结构》清华大学出版社,希望每一个想成为程序设计高手的人研读此书。
2.如何应对新大纲二级考试的公共基础知识
从今年初开始,教育部对全国计算机等级考试进行了较大调整。二级考试的笔试包括基础知识和程序设计两部分,其中基础知识占30分。二级基础知识考核内容的大变令相当多的考生措手不及,事实上这次改革将基础知识的内容由计算机常识(一级难度)调整为程序开发基础(三级难度),很多考生由于掌握考试信息不及时因此没有在05年4月份的考试中取得好成绩。
新大纲的二级基础知识分为数据结构与算法、程序设计基础、软件工基础、数据库设计基础四部分,下面分别说一下学习重点和方法:
1)数据结构与算法
数据结构与算法的知识用于提高程序的效率以及对较复杂的问题进行求解。数据结构与算法内容在计算机专业基础课中也属于比较难的一门,学习数据结构与算法的内容必须进行理解,死记硬背是无效的。对于等级考试,数据结构与算法重点的考核点主要在二叉树,同时这也是数据结构与算法的难点,考核形式主要为二叉树的遍历问题(如给图求遍历序列、给前序、中序遍历求后序遍历等)、二叉树的结点问题(如给出一些条件然后求叶子结点个数);还有排序和查找考试中也经常会涉及到,排序主要以计算时间复杂度的形式考核,查找主要以计算最佳/最坏比较次数的方式考核。其余的知识点主要以概念的形式考察,考生需要仔细看书并理解。
2)程序设计基础与软件工程基础
这两部分以概述的形式简介了规范化开发软件的方法。与数据结构不同,这两部分内容主要是记忆性的知识点。程序设计基础的内容与大纲改革前添加了面向对象程序设计的内容,考生可以对数据结构与算法进行几次细读后了解即可;软件工程基础这部分主要考核内容为结构化分析及结构化设计方法(即SA及SD,约占50%),信息量较大,其次是软件测试(约占20%),考生需要将相关的概念及规则背诵,在以后有机会进行程序开发时这些知识可以得到深刻理解。
3)数据库设计基础
数据库是当前软件处理的信息核心,目前大部分软件都是基于数据库的,因此学习一下数据库知识对程序开发也是很有帮助的。数据结构与算法主要的考核点是关系模型、关系代数及数据库系统的基本概念,其余的知识点了解即可,其中数据库的设计和管理可以结合着
软件工程来看,考生会发现这两者有很多相似之处。除了关系代数会考一些简单的计算问题外,其余的都是以概念题的形式考核,考生需要仔细的阅读。
以上为复习二级公共基础的方法,顺便提及一点02年版及其以前的公共基础考试用书已不再适用,因此考生在选购教材的时候应当特别注意,应当购买04年版的二级公共基础知识教程(指定教材由高等教育出版社出版),还有考生在备考时,除了应完成教材中的习题外还应当做一下05年4月的真题,并且用其估计一下自己的知识欠缺以便更好的进行查漏补缺。
3.C语言笔试应试技巧
二级C语言笔试只有选择题和填空题两种题型。这两种题型的解题方法有所不同,考生在备考时要深化对基本概念和知识点的理解,并注重实践,同时要作一些针对性的练习,特别是历年真题,从中找出规律性的东西以及解题技巧。
1)选择题
这种类型的题,要求考生从四个待选答案中选择一个正确答案。考生可综合运用直选法,排除法等多种方法。但是这类题目考的知识点往往都比较多且细,容易出错,考生在做这类题时,切忌不加分析,一看就选,从而漏掉正确的答案。如2003年9月笔试第49题:有以下程序
main( )
{ int a[3][3], p,i;
p=&&a[0][0];
for (i=0;i<9;i++) p[i]=i+1;
printf("%d\n",a[1][2]);
}
程序运行后的输出结果是
(A)3 (B)6 (C)9 (D)2
此题主要考的知识点有:(1)数组与指针的关系;(2)数组的初始化和数组元素的引用。在C语言中,数组与指针有着非常密切的联系。任何能用数组下标完成的操作也都可以用指针来实现。语句“p=&&a[0][0];”使p指向数组中的第0号元素,即a[0][0],指针变量p 中存放了数组元素a[0][0]的地址,由于数组元素在内存中是连续存储的,因此,我们就可以通过指针变量p访问数组中的任何一个元素。本题中通过“for (i=0;i<9;i++) p[i]=i+1;”语句使a[3][3]={1,2,3,4,5,6,7,8,9},所以a[1][2]=6。这里要特别注意C语言中数组的下标从0开始,不要错选a[1][2]=3。
2)填空题
填空题主要考查考生对基础知识的准确理解。对于这类型的题,考生应深刻理解题意,明确题目要求,运用相关知识做出正确回答。在历年考试中,考生这部分试题的得分直接决定考试成绩。由于这部分共20个空,计40分,有的考生能得35~40分,而有的考生却得不到10分,直接拉开了最后成绩。在判卷过程中发现考生常犯的错误有以下几个方面:(1)基础知识掌握不扎实,概念理解不准确。
如2003年9月填空第8题:
main( )
{int a=1,b=3,c=5;
if (c=a+b) printf ("yes\n");
else printf("no");
}
题目问程序运行后的输出结果,答案应是yes。因为“if (c=a+b) printf ("yes\n");”中的条件“c=a+b”是一个赋值语句,c的值为a+b=1+3=4,所以条件为真。而许多考生却把赋值语句“c=a+b”理解为关系表达式“c==a+b”即5=1+3为逻辑假,故答no。
(2)答案表述不准确,会做的题却不得分或少得分。
如第12题:
main( )
{int i,n[ ]={0,0,0,0,0};
for(i=1;i<=4;i++)
{n[i]=n[i-1]*2+1;
printf("%d ",n[i]);
}
}
问程序运行后的输出结果是____。答案是“1 3 7 15”许多考生虽然写对了但却在每个数字后加了标点而不得分如“1,3,7,15”或“1. 3. 7. 15”。
又如第19题:
以下程序的功能是将字符串s中的数字字符放入d数组中,最后输出d中的字符串;例如,输入字符串:abc123edf456gh,执行后输出:123456。请填空:
main( )
{char s[80], d[80]; int i, j;
gets(s);
for(i=j=0;s[i]!='\0' ;i++)
if( ) {d[j]=s[i];j++}
d[j]='\0' ;
puts(d);
}
答案应是s[i]<='9'&&s[i]>='0'或s[i]<=48&&s[i]>=57而许多考生却把“>=”,“<=”写成“≥”,“≤”导致不能得分。
(3)注意答题卡的号码并不是试题卷上的题号,而是填空的顺序号。许多考生答题时将答案张冠李戴,位置写错,白白丢了分。
总之,只要考生能准确理解基本知识点,善于动手动脑多练习,举一反三,触类旁通,就能从中找出规律性的东西,轻松通过笔试。
4.上机考试技巧
1)上机改错题的特点和注意事项
(1)上机改错的试题中通常包含两个(或三个)错误需要修改。
(2)试题中用"/******found******/"来提示在下一行(或下面第二行)有错。
(3)错误的性质基本分语法错和逻辑错两种,也有些试题要求把语句添加在下划线处。
(4)特别要注意的是:只能在出错的行上进行修改,不要改动程序行的顺序,更不要自己另编程序。
2)上机改错测试时,建议按以下步骤进行
(1)首先仔细审题,了解试题的要求,看清楚试题给出的输入和输出例示,以便检验改错后程序运行的结果是否正确。
(2)当在TURBO C环境下调出源程序后,审视"/******found******/"所在函数,根据题义理解程序所采用的基本算法,做到心里有数。
(3)先按F9对测试程序进行检查是否有语法错误。当编译提示有语法错时,可参考编译提示来查找并改正错误。
(4)当不再出现语法错时,使用CTRL+F9执行,按照试题的示例给出的数据进行试算,若试算的结果与给出的输出结果相同时,该题就做对了;若试算的结果与给出的输出结果不同,就应进一步检查程序中的逻辑错误。
(5)当程序存在逻辑错误时,首先应当理解题意、读懂程序的算法,必要时可按步检查数据的流程,以便确定错误所在。例如,题目要求数据按由小到大排序,而结果数据是按由大到小进行了排序,问题可能出现在条件判断上。又如,输出的字符串比预期的短,就有可能字符串的结束标志放错了位置。再如做循环的时候数组上限下限错误了,基数是从0开始而不是1开始的。修改程序中的逻辑错时,要求考生认真读懂程序代码。
(6)修改完成,得到正确结果后,一定不要忘记把修改后的程序存盘。
3)上机编程题的特点和说明
在二级C程序设计上机考试中,要求完成一个独立的函数的编程。目前教育部考试中心已出版了上机考试习题集,这些有助于学习编程,但考生应当在学习过程中理解基本的算法,通过实际上机操作积累经验,才能掌握基本的编程能力。
4)进行编程测试时,建议按以下步骤进行
(1)首先仔细审题,了解试题的要求,记下试题给出的输入和输出例示,以便检验在完成指定的函数后程序运行的结果是否正确。
(2)当在TURBO C环境下调出源程序后,应对照函数首部的形参,审视主函数中调用函数时的实参内容,以便明确在函数中需要处理的数据对象。
(3)理解试题的要求,审视主函数中调用函数的方式,若在表达式中调用函数(如把函数值赋给某个对象),则要求有函数值返回,需注意函数的类型,并在函数中用return语句返回函数值;若主函数中仅用语句形式调用函数,则需要通过形参间接地返回所得结果。
(4)选择适当的算法进行编程,输入程序语句。不要忘记及时存盘!
(5)编译程序,直到没有语法错误。
(6)调试程序,利用试题中给出的例示数据进行输入(若要求输入的话),运行程序,用例示的输出数据检验输出结果,直到结果相同。
5.常见问题分析
(1)书写标识符时,忽略了大小写字母的区别。
main()
{int a=5;
printf("%d",A);
}
编译程序把a和A认为是两个不同的变量名,而显示出错信息。C认为大写字母和小写字母是两个不同的字符。习惯上,符号常量名用大写,变量名用小写表示,以增加可读性。
(2)忽略了变量的类型,进行了不合法的运算。
main()
{float a,b;
printf("%d",a%b);
}
%是求余运算,得到a/b的整余数。整型变量a和b可以进行求余运算,而实型变量则不允许进行“求余”运算。
(3)将字符常量与字符串常量混淆。
char c;
c="a";
在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,字符串常量是一对双引号括起来的字符序列。C规定以“\”作字符串结束标志,它是由系统自动加上的,所以字符串“a”实际上包含两个字符:‘a'和‘\',而把它赋给一个字符变量是不行的。
(4)忽略了“=”与“==”的区别。
在许多高级语言中,用“=”符号作为关系运算符“等于”。如在BASIC程序中可以写if (a=3) then …
但C语言中,“=”是赋值运算符,“==”是关系运算符。如:
if (a==3) a=b;
前者是进行比较,a是否和3相等,后者表示如果a和3相等,把b值赋给a。由于习惯问题,初学者往往会犯这样的错误。
(5)忘记加分号。
分号是C语句中不可缺少的一部分,语句末尾必须有分号。
a=1
b=2
编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一部分,这就会出现语法错误。改错时,有时在被指出有错的一行中未发现错误,就需要看一下上一行是否漏掉了分号。
{ z=x+y;
t=z/100;
printf("%f",t);}
对于复合语句来说,最后一个语句中最后的分号不能忽略不写。
(6)多加分号
对于一个复合语句,如:
{ z=x+y;
t=z/100;
printf("%f",t);
};
复合语句的花括号后不应再加分号,否则将会画蛇添足。
又如:
if (a%3==0);
i++;
本是如果3整除a,则i加1。但由于if (a%3==0)后多加了分号,则if语句到此结束,程序将执行i++语句,不论3是否整除a,i都将自动加1。
再如:
for (i=0;i<5;i++);
{scanf("%d",&x);
printf("%d",x);}
本意是先后输入5个数,每输入一个数后再将它输出。由于for()后多加了一个分号,使循环体变为空语句,此时只能输入一个数并输出它。
(7)输入变量时忘记加地址运算符“&”
int a,b;
scanf("%d%d",a,b);
这是不合法的。scanf函数的作用是:按照a、b在内存的地址将a、b的值存进去。“& a”指a在内存中的地址。
(8)输入数据的方式与要求不符
①scanf("%d%d",&a,&b);
输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法:
3,4
输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键tab。
②scanf("%d,%d",&a,&b);
C规定:如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。下面输入是合法的:
3,4
此时不用逗号而用空格或其它字符是不对的。
3 4 3:4
又如:
scanf("a=%d,b=%d",&a,&b);
输入应如以下形式:
a=3,b=4
(9)输入字符的格式与要求不一致
在用“%c”格式输入字符时,“空格字符”和“转义字符”都作为有效字符输入。
scanf("%c%c%c",&c1,&c2,&c3);
如输入a b c
字符“a”送给c1,字符“”送给c2,字符“b”送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔。
(10)输入输出的数据类型与所用格式说明符不一致
例如,a已定义为整型,b定义为实型
a=3;b=4.5;
printf("%f%d\n",a,b);
编译时不给出出错信息,但运行结果将与原意不符。这种错误尤其需要注意。
(11)输入数据时,企图规定精度
scanf("%7.2f",&a);
这样做是不合法的,输入数据时不能规定精度。
(12)switch语句中漏写break语句。
例如:根据考试成绩的等级打印出百分制数段
switch(grade)
{ case 'A':printf("85~100\n");
case 'B':printf("70~84\n");
case 'C':printf("60~69\n");
case 'D':printf("<60\n");
default:printf("error\n");
由于漏写了break语句,case只起标号的作用,而不起判断作用。因此,当grade值为A时,printf函数在执行完第一个语句后接着执行第二、三、四、五个printf函数语句。正确写法应在每个分支后再加上“break;”。例如:
case 'A':printf("85~100\n");break;
(13)在定义数组时,将定义的“元素个数”误认为是可使的最大下标值
main()
{static int a[10]={1,2,3,4,5,6,7,8,9,10};
printf("%d",a[10]);
}
C语言规定:定义时用a[10],表示a数组有10个元素。其下标值由0开始,所以数组元素a[10]是不存在的。
(14)在不应加地址运算符&的位置加了地址运算符
scanf("%s",&str);
C语言编译系统对数组名的处理是:数组名代表该数组的起始地址,且scanf函数中的输入项是字符数组名,不必要再加地址符&。应改为:
scanf("%s",str);
考试不是目的,仅仅是检验我们学习成效的一种手段。学习也没有捷径,只有我们踏踏实实的学习态度,持之以恒的学习精神才是学习进步的可靠保证。有了这种不断进取的精神,辅之以有效的学习方法,就一定会有所成就。
第三章 2005年考试试卷
2005年4月全国计算机等级考试(二级)C语言笔试试卷
一、选择题((1)~(10)每小题2分,(11)~(50)每小题1分,共60分)
下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确的选项涂写在答题卡相应位置上,答在试卷上不得分。
(1)数据的存储结构是指______。
A)存储在外存中的数据 B)数据所占的存储空间量
C)数据在计算机中的顺序存储方式 D)数据的逻辑结构在计算机中的表示(2)下列关于栈的描述中错误的是______。
A)栈是先进后出的线性表
B)栈只能顺序存储
C)栈具有记忆作用
D)对栈的插入与删除操作中,不需要改变栈底指针
(3)对于长度为n的线性表,在最坏情况下,下列各排序法所对应的比较次数中正确的是______。
A)冒泡排序为n/2 B)冒泡排序为n
C)快速排序为n D)快速排序为n(n-1)/2
(4)对长度为n的线性表进行顺序查找,在最坏情况下所需要的比较次数为______。
A)log2n B)n/2 C)n D)n+1
(5)下列对于线性链表的描述中正确的是______。
A)存储空间不一定是连续,且各元素的存储顺序是任意的
B)存储空间不一定是连续,且前件元素一定存储在后件元素的前面
C)存储空间必须连续,且前件元素一定存储在后件元素的前面
D)存储空间必须连续,且各元素的存储顺序是任意的
(6)下列对于软件测试的描述中正确的是______。
A)软件测试的目的是证明程序是否正确
B)软件测试的目的是使程序运行结果正确
C)软件测试的目的是尽可能多地发现程序中的错误
D)软件测试的目的是使程序符合结构化原则
(7)为了使模块尽可能独立,要求______。
A)模块的内聚程度要尽量高,且各模块间的耦合程度要尽量强
B)模块的内聚程度要尽量高,且各模块间的耦合程度要尽量弱
C)模块的内聚程度要尽量低,且各模块间的耦合程度要尽量弱
D)模块的内聚程度要尽量低,且各模块间的耦合程度要尽量强
(8)下列描述中正确的是______。
A)程序就是软件
B)软件开发不受计算机系统的限制
C)软件既是逻辑实体,又是物理实体
D)软件是程序、数据与相关文档的集合
(9)数据独立性是数据库技术的重要特点之一,所谓数据独立性是指______。
A)数据与程序独立存放
B)不同的数据被存放在不同的文件中
C)不同的数据只能被对应的应用程序所使用
D)以上三种说法都不对
(10)用树形结构表示实体之间联系的模型是______。
A)关系模型 B)网状模型 C)层次模型 D)以上三个都是
(11)算法具有五个特性,以下选项中不属于算法特性的是______。
A)有穷性 B)简洁性 C)可行性 D)确定性
(12)以下选项中可作为C语言合法常量的是______。
A)-80. B) -080 C)-8e1.0 D)-80.0e
(13)以下叙述中正确的是______。
A)用C程序实现的算法必须要有输入和输出操作
B)用C程序实现的算法可以没有输出但必须要输入
C)用C程序实现的算法可以没有输入但必须要有输出
D)用C程序实现的算法可以既没有输入也没有输出
(14)以下不能定义为用户标识符的是______。
A)Main B)_0 C)_int D)sizeof
(15)以下选项中不能作为合法常量的是______。
A)1.234e04 B)1.234e0.4 C)1.234e+4 D)1.234e0
(16)数字字符0的ASCII值为48,若有以下程序
main()
{ char a=′1′,b=′2 ′;
printf("%c,",b++);
printf("%d\n",b-a);}
程序运行后的输出结果是______。
A) 3,2 B)50,2 C)2,2 D)2,50
(17)有以下程序
main()
{ int m=12,n=34;
printf("%d%d",m++,++n);
printf("%d%d\n",n++,++m);}
程序运行后的输出结果是______。
A)12353514 B)12353513 C)12343514 D)12343513
(18)有定义语句:int b;char c[10];,则正确的输入语句是______。
A) scanf("%d%s",&b,&c); B)scanf("%d%s",&b, c);
C) scanf("%d%s",b, c); D) scanf("%d%s",b,&c);
(19)有以下程序
main()
{ int m,n,p;
scanf("m=%dn=%dp=%d",&m,&n,&p);
printf("%d%d%d\n",m,n,p);}
若想从键盘上输入数据,使变量m中的值为123,n中的值为456,p中的值为789,则正确的输入是______。
A)m=123n=456p=789 B) m=123 n=456 p=789
C) m=123,n=456,p=789 D)123 456 789
(20)有以下程序
main()
{ int a,b,d=25;
a=d/10%9;
b=a&&(-1);
printf("%d,%d\n",a,b);}
程序运行后的输出结果是______。
A)6,1 B)2,1 C)6,0 D)2,0
(21)有以下程序
main()
{ int i=1,j=2,k=3;
if(i++==1&&(++j==3||k++==3))
printf("%d %d %d\n",i,j,k); }
程序运行后的输出结果是______。
A)1 2 3 B)2 3 4 C) 2 2 3 D)2 3 3
(22)若整型变量a、b、c、d中的值依次为:1、4、3、2。则条件表达式a
A)1 B)2 C)3 D)4
(23)有以下程序
main()
{ int p[8]={11,12,13,14,15,16,17,18},i=0,j=0;
while(i++<7) if(p[i]%2) j+=p[i];
printf("%d\n",j); }
程序运行后的输出结果是______。
A)42 B)45 C)56 D)60
(24)有以下程序
main()
{ char a[7]="a0\0a0\0"; int i,j;
i=sizeof(a); j=strlen(a);
printf("%d %d\n",i,j); }
程序运行后的输出结果是______。
A)2 2 B)7 6 C)7 2 D)6 2
(25)以下能正确定义一维数组的选项是______。
A)int a[5]={0,1,2,3,4,5}; B)char a[]={0,1,2,3,4,5};
C)char a={′A′,′B′,′C′}; D)int a[5]="0123";
(26)有以下程序
int f1(int x,int y){return x>y?x:y;}
int f2(int x,int y){return x>y?y:x;}
main()
{ int a=4,b=3,c=5,d=2,e,f,g;
e=f2(f1(a,b),f1(c,d)); f=f1(f2(a,b),f2(c,d));
g=a+b+c+d-e-f;
printf("%d,%d,%d\n",e,f,g); }
程序运行后的输出结果是______。
A)4,3,7 B)3,4,7 C)5,2,7 D)2,5,7
(27)已有定义:char a[]="xyz",b[]={′x′,′y′, ′z′};,以下叙述中正确的是______。
A)数组a和b的长度相同 B)a数组长度小于b数组长度
C)a数组长度大于b数组长度D)上述说法都不对
(28)有以下程序
void f(int *x,int *y)
{ int t;
t=*x;*x=*y;*y=t; }
main()
{ int a[8]={1,2,3,4,5,6,7,8},i,*p,*q;
p=a;q=&a[7];
while(p {if(p,q);p++;q--;} for(i=0;i<8;i++)printf("%d,",a[i]);} 程序运行后的输出结果是______。 A)8,2,3,4,5,6,7,1, B)5,6,7,8,1,2,3,4, C)1,2,3,4,5,6,7,8, D)8,7,6,5,4,3,2,1, (29)有以下程序 main() { int a[3][3],*p,i; p=&a[0][0]; for(i=0;i<9;i++) p[i]=i; for(i=0;i<3;i++)printf("%d",a[1][i]); } 程序运行后的输出结果是______。 A)012 B)123 C)234 D)345 (30)以下叙述中错误的是______。 A)对于double类型数组,不可以直接用数组名对数组进行整体输入或输出 B)数组名代表的是数组所占存储区的首地址,其值不可改变 C)当程序执行中,数组元素的下标超出所定义的下标范围时,系统将给出“下标越界”的出错信息 D)可以通过赋初值的方式确定数组元素的个数 (31)有以下程序 #define N 20 fun(int a[],int n,int m) { int i,j; for(i=m;i>=n;i--) a[i+1]=a[i]; } main() { int i,a[N]={1,2,3,4,5,6,7,8,9,10}; fun(a,2,9); for(i=0;i<5;i++) printf("%d",a[i]); } 程序运行后的输出结果是______。 A)10234 B)12344 C)12334 D)12234 (32)有以下程序 main() { int a[3][2]={0},(*ptr)[2],i,j; for(i=0;i<2;i++) {ptr=a+i; scanf("%d",ptr); ptr++; } for(i=0;i<3;i++) { for(j=0;j<2;j++) printf("%2d",a[i][j]); printf("\n"); } } 若运行时输入:1 2 3<回车>,则输出结果是______。 A)产生错误信息B)1 0 C)1 2 D)1 0 (33)有以下程序 prt(int *m,int n) { int i;