一敲OneKnock
总有你不知道的

全国计算机二级C语言备考指南

去年(2016)九月份考的二级C语言,现在看到周围很多人都在准备计算机二级C语言的考试,写这篇文章希望可以帮到考计算机二级的同学。

我考试的时候大概只用了四十几分钟,考了89分,差了一点。因为二级C语言的考试题型都比较固定,比未来教育的模拟软件还要简单。

如果你发现文章哪里有错误,欢迎联系我或者评论告诉我,谢谢。

希望你以学习为目的将此篇文章分享给需要的同学。

选择题(40道题40分)

选择题分为两大部分:

计算机公共知识基础(10题10分)和C语言基本知识(30题30分)

我是学的是网络工程专业,之前上过C语言基础,但是这部分知识是属于数据结构并没有上到,二级考的大都是记忆性知识。

1.1 计算机公共知识基础:

上面这张图不用全都记下来,做题遇到比较时间复杂度空间复杂度时,可以看这张表,不用刻意死记硬背。

  • 结构化程序设计的思想包括:自顶向下逐步求精模块化限制使用goto语句
  • 软件设计中模块划分应遵循的准则是高内聚低耦合
  • 算法的有穷性算法程序的运行时间是有限的

 

  • 排序比较次数:

例:对长度为n的线性表排序,在最坏情况下,比较次数不是n(n-1)/2的排序方法是(  )。

A) 快速排序

B) 冒泡排序

C) 直接插入排序

D) 堆排序

这里的时间复杂度O(n2)代表的是n(n-1)/2的数量级,只要知道最好情况最坏情况那些是不同的。堆排序的最坏情况是O(log2n),选D

  • 栈按”先进后出”组织数据,数据的插入和删除都在栈顶进行操作
  • 栈与队列都是线性结构
  • 队列按“先进先出”组织数据, 数据的插入在队尾(rear)删除在队头(front)
  • 线性表的链式存储结构所需要的存储空间一般要多于顺序存储结构
  • 数据库设计中反映用户对数据要求的模式外模式

 

  • 关系的集合运算

例:有三个关系R、S和T如下:
则由关系R和S得到关系T的操作是(  )。

A) 自然连接
B) 差
C) 交
D) 并

一行为一个元素,所以R有三个元素,S有两个元素。

R与S差运算即在R中去除S元素剩下的元素构成的集合:

R与S交运算即两个集合中相同的元素运算后为S

R与S并运算即两个集合元素不重复运算后为R

自然连接一般不会考,还有一个常考的笛卡尔积,百度找到一张图表:

  • 二叉树

如果上过数据结构二叉树应该很好理解,没有听说过的同学基础知识必须要看因为这类题型必考涉及少量的计算,但最多两三分。

结点的度:结点拥有的子树的数目。
叶子:度为零的结点。
分支结点:度不为零的结点。
树的度:树中结点的最大的度。

性质1:二叉树第i层上的结点数目最多为 2{i-1} (i≥1)。
性质2:深度为k的二叉树至多有2{k}-1个结点(k≥1)。
性质3:包含n个结点的二叉树的高度至少为log2 (n+1)
性质4:在任意一棵二叉树中,若叶子结点的个数为n0,度为2的结点数为n2,则n0=n2+1

例:一棵二叉树中共有80个叶子结点与70个度为1的结点,则该二叉树中的总结点数为

A) 219
B) 229
C) 230
D) 231

由性质4,度为2的节点数:n2=n0-1=79,所以总结点数=n0+n1+n2=80+70+79=229 答案为B

1.2 C语言基础知识

这部分选择题常给一程序段,然后判断输出数值。题型变化较多,都是基础知识点,需要多做题。常考数组,指针 ,输出格式。

例:

1.21 以下四个程序中,完全正确的是(  )。

A) #include <stdio.h>
main();
{/*/ programming /*/
printf(“programming!\n”);}

B) #include <stdio.h>
main()
{/* programming */
printf(“programming!\n”); }

C) #include <stdio.h>
main()
{/*/* programming */*/
printf(“programming!\n”); }

D) include <stdio.h>
main()
{/* programming */
printf(“programming!\n”); }

注释不能嵌套,A,C错误,D头文件没有预编译#符号,所以选B

 

1.22 有以下程序段:

#include <stdio.h>

int a, b, c;
a=10; b=50; c=30;
if (a>b) a=b, b=c; c=a;
printf(“a=%d b=%d c=%d\n”, a, b, c);
程序的输出结果是(  )。

A) a=10 b=50 c=30

B) a=10 b=50 c=10

C) a=10 b=30 c=10

D) a=50 b=30 c=50

程序题多注意判断语句和结束语句分号。if里的判断语句不成立,且分号在b=c,所以a=b, b=c不执行,a赋值给c。答案选 B

1.23 以下叙述中正确的是

A) C语言程序所调用的函数必须放在main函数的前面
B) C语言程序总是从最前面的函数开始执行
C) C语言程序中main函数必须放在程序的开始位置
D) C语言程序总是从main函数开始执行

 

C语言所调用的函数可以放在调用它的函数前,也可以放在调用它的函数后,所以A错误。C语言程序总是从main函数开始执行,所以B错误。main函数的位置可以放在开始,也可以放在中间,也可以放在最后,所以C错误。

选择题后面30题分两种:一考察C语言基础知识点例1.23,二考察程序执行结果选择例1.21,1.22。

操作题(3道题60分)

前面40分说了那么多,多刷题记住知识点知道就行。接下来部分才是此篇文章的重点,也是考试的重点,需要一定的理解,掌握操作题才是及格的关键。

一、填空题(18)

考二级C语言的同学,应该都会买一本C语言试题书,网上几乎都是“未来教育”出版的,我当时也是用的未来教育,除了前10道选择题(计算机公共基础知识没学过)做题有点费力外,后面的选择题都感觉比较简单。但是当我打开操作题第一题的源代码时我和你们一样也是懵逼的。。

2.1 文件操作函数

例:程序通过定义学生结构体变量,存储了学生的学号、姓名和三门课的成绩。所有学生数据均以二进制方式输出到文件中。函数fun的功能是重写形参filename所指文件中最后一个学生的数据,即用新的学生数据覆盖该学生原来的数据,其他学生的数据不变。
请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。
注意:部分源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构!


#include <stdio.h>
#define N 5
typedef struct student {
long sno;
char name[10];
float score[3];
} STU;
void fun(char *filename, STU n)
{ FILE *fp;
/**********found**********/
fp = fopen(__1__, “rb+”);
/**********found**********/
fseek(__2__, -(long)sizeof(STU), SEEK_END);
/**********found**********/
fwrite(&n, sizeof(STU), 1, __3__);
fclose(fp);
}
main()
{ STU t[N]={ {10001,”MaChao”, 91, 92, 77}, {10002,”CaoKai”, 75, 60, 88},
{10003,”LiSi”, 85, 70, 78}, {10004,”FangFang”, 90, 82, 87},
{10005,”ZhangSan”, 95, 80, 88}};
STU n={10006,”ZhaoSi”, 55, 70, 68}, ss[N];
int i,j; FILE *fp;
fp = fopen(“student.dat”, “wb”);
fwrite(t, sizeof(STU), N, fp);
fclose(fp);
fp = fopen(“student.dat”, “rb”);
fread(ss, sizeof(STU), N, fp);
fclose(fp);
printf(“\nThe original data :\n\n”);
for (j=0; j<N; j++)
{ printf(“\nNo: %ld Name: %-8s Scores: “,ss[j].sno, ss[j].name);
for (i=0; i<3; i++) printf(“%6.2f “, ss[j].score[i]);
printf(“\n”);
}
fun(“student.dat”, n);
printf(“\nThe data after modifing :\n\n”);
fp = fopen(“student.dat”, “rb”);
fread(ss, sizeof(STU), N, fp);
fclose(fp);
for (j=0; j<N; j++)
{ printf(“\nNo: %ld Name: %-8s Scores: “,ss[j].sno, ss[j].name);
for (i=0; i<3; i++) printf(“%6.2f “, ss[j].score[i]);
printf(“\n”);
}
}


因为我们C语言文件操作函数最后没有上,当时为了这道题把书本上的文件操作函数预习了一遍,主要知道几个文件操作函数的功能和用法也就是知道每个地方改填什么。

第一步审题,主要看fun函数功能介绍。程序阅读一般从main函数开始,做题目可以直接从问题处开始看:fp = fopen(__1__, “rb+”);

了解fopen()函数:fopen(指针函数名,打开方式);知道第一个空处应该填的是一个指针文件,或者指地址指针名。

void fun(char *filename, STU n)
{ FILE *fp;
/**********found**********/
fp = fopen(__1__, “rb+”);
/**********found**********/
fseek(__2__, -(long)sizeof(STU), SEEK_END);
/**********found**********/
fwrite(&n, sizeof(STU), 1, __3__);
fclose(fp);
}

接着看问题的上下部分,看到fun函数段只传入了一个filename指针文件,那1空只有填filename。

下面fseek,fwrite函数都是对已打开的函数进行编辑,

fseek(__2__, -(long)sizeof(STU), SEEK_END);

fwrite(&n, sizeof(STU), 1, __3__);

且两个函数都没有操作的文件名,这时你可以大胆猜了。。两个空填fp或者filename。到这里我主函数并没有看,如果你从主函数一行一行看的话时间肯定是不够用的,而且题目并不一定能看的懂,只要你的运行出正确的结果,那就是答案。

答案:1.filename 2.fp 3.fp

2.2 数组操作函数

给定程序中,函数fun的功能是:计算形参x所指数组中N个数的平均值(规定所有数均为正数),将所指数组中小于平均值的数据移至数组的前部,大于等于平均值的数据移至x所指数组的后部,平均值作为函数值返回,在主函数中输出平均值和移动后的数据。
例如,有10个正数:47、30、32、40、6、17、45、15、48、26,其平均值为30.500000。
移动后的输出为:30、6、17、15、26、47、32、40、45、48。
请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。
注意:部分源程序在文件BLANK1.C中。
不得增行或删行,也不得更改程序的结构!


#include <stdlib.h>
#include <stdio.h>
#define N 10
double fun(double x[],double *av)
{ int i,j; double d,s;
s=0;
for(i=0; i<N; i++) s = s +x[i];
/**********found**********/
__1__=s/N;
d=32767;
for(i=0; i<N; i++)
if(x[i]<*av && *av – x[i]<=d){
/**********found**********/
d=*av-x[i];
j=__2__;
}
/**********found**********/
return __3__;
}
main()
{ int i; double x[N],av,m;
for(i=0; i<N; i++){ x[i]=rand()%50; printf(“%4.0f “,x[i]);}
printf(“\n”);
m=fun(x,&av);
printf(“\nThe average is: %f\n”,av);
printf(“m=%5.1f “,m);
printf(“\n”);
}


题目意思是求十个数的平均数,最后输出是十个数中不大于且最接近平均数的那个数。

第一空__1__=s/N;由上面的for循环知道s是十个数的和(sum);N是全局变量10,那么1是平均数(average)由主函数定义处int i; double x[N],av,m;av代表平均数,但由 fun(double x[],double *av)知道av平均数用指针传入,所以1处填*av。

第二空j=__2__;if里的判断语句:当数组的数小于平均数且平均数与数组的数的差小于等于d(这里的d是上个平均数与数组的数的差值)则执行if里的语句。最外层的for功能让数组里的十个数字都与平均数比较一遍。d存储的是*av-x[i],那j肯定存储的是当时与平均数最接近的x[i],等十个数比较完后返回给fun。所以2填x[i],3填j。

二、改错题(18)

改错题大都出一个简单的问题用C语言解决,比如:两个数a,b的交换、大小写字母转换、进制的转换,用C语言表示函数计算公式等等

例:
下列给定程序中,函数fun的功能是:将十进制正整数m转换成k(2≤k≤9)进制数,并按位输出。例如,若输入8和2,则应输出1000(即十进制数8转换成二进制表示是1000)。
请改正程序中的错误,使它能得出正确的结果。
注意:部分源程序在文件MODI1.C中,不要改动main函数,不得增行或删行,也不得更改程序的结构!


#include <stdio.h>
#include <conio.h>
/*************found**************/
void fun(int m,int k);
{ int aa[20], i;
for(i=0;m;i++)
{
/*************found**************/
aa[i]=m/k;
m/=k;
}
for(;i;i–)
/*************found**************/
printf(“%d”,aa[i]);
}
main()
{
int b,n;
printf(“\nPlease enter a number and a base:\n”);
scanf(“%d%d”,&n,&b);
fun(n,b);
printf(“\n “);
}


这题是一个进制转换题,输入8 2 输出1000。这题一般有一空是程序错误,不是代码逻辑错误,所以首先编译程序。

往上拖动控制栏的滚动条,找到错误提示第一行代码双击。

void fun(int m,int k);后面多了一个分号。删除继续编译发现没有提示,接下就要认真看看程序,主要看需要改错的地方(注视下面的一行代码),考试的时候也会有标注。

aa[i]=m/k;进制转换是8除以2取余数,所以这里改成 aa[i]=m%k;

printf(“%d”,aa[i]);由上面的for循环知道最后m=0 for循环语句不执行,判断m=0后i++多执行了一次,所以改成printf(“%d”,aa[i-1]);

三、编程题(24)

这题是变化最多的一题,各种类型的小题目都会考,但考的内容都很简单,比如:设计程序求10的阶乘、大小写字母转换、数组的排序、数组中改错别字等等。

编程题只有自己从零写出来才算会。

总结:

因为操作题的题型太多,没有一一列举,所以操作题的篇幅不是很长,但是及格的关键是后面60分操作题。选择题公共知识基础知识点比较多但只有10分,不用花太多的时间(如果你时间比较充裕还是建议多看看),二级考试文件操作函数不会考太多,你只需要了解常用的几个文件操作函数功能和用法,比如:fopen();fwrite();等等。指针,数组,输出格式化做重点看。

祝考试都通过。。

(完)

Like
Like Love Haha Wow Sad Angry
1911
转载请署名作者:一敲 » 全国计算机二级C语言备考指南
分享到: 更多 (0)

评论 4

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    我已经看不懂

    美莉1年前 (2017-09-02)回复
    • 你都考了多久了,是我我也忘的差不多

      李启安1年前 (2017-09-02)回复
  2. #2

    还有半小时开考!

    某高校1年前 (2017-09-23)回复
    • 稳定发挥

      李启安1年前 (2017-09-23)回复

一只鸽子 已经飞到了前头

Github微博