二级C++考试总结及个人感受

前几天查了成绩,笔试2.0  机考3.0 差强人意吧..
10.6.6

 ______________________________________________________________________________________________

本来周六就已经考完了,结果考完当天晚上就感冒得歪歪的,呵呵,不知道是不是像很多YY小说中写的那样,原本就不堪重负的身体终于因为完成了某项伟大的使命而轰然倒下,汗一个。可能最准确的说明来自于大佬:“你的考前神经过敏衰弱无聊…3K字…超级无敌综合症怎么还没好?!”

       言归正传,想起上次PL师兄考完四级后写了那么多感想,我也来想写点。不管说考得怎么样,总算是一种经历 ^_^

       首先要说的是计算机等级考试本身,这个考试的名气其实蛮大的,特别是对于非计算机专业的同学来说,而这个考试本身面对的也就是非计算机专业的学生。就像我买的参考书上写的一样,出题方向偏向于“广而厚”,如果说希望通过这个证证明自己是个计算机高手,显然是选错对象了,思科或者软考可能会更合适一些。就我自己考试的感觉来说,C++部分考察的也只是C++最基础的应用(不过不基础的应用我也不会O(_)O),主要就是语法和控制台常用的几个类的调用。

说实话,我当初报这个考试的时候,首先是听了信管的一个老师的建议开始学习C++,后来又发现自己实在是太懒散了,一个如此漫长的学期下来也才看了三百来页,所以为了有点动力逼自己看书,就报了名。不过效果也达到了,起码寒假的最后的几天我还是看了不少书的(相对之前而言啦= =!!)。

       所以,不必把这考试看的太难,只要去图书馆借本语法书,把语法全都记下来,再背34个常用的类以及相应的函数,最后再做适量的模拟题应该是没问题的。但要注意的是,C++考试的笔试部分总计有100分,其中有30分时二级综合知识,70分是C++的内容。什么是二级综合知识呢?简单说是教育部为了圈钱,又出了一本教材,这本教材的内容占了笔试的30分,这部分的内容很杂,数据结构、数据库、二叉树、软件工程、程序设计等。不要被这一串东西吓到,如果你能把这些内容全部真正学通的话,这个等级考试对你根本就没有意义了。考的只是其中最简单的框架性内容罢了。当然,想拿满分还是很难的。不过建议还是要有所取舍,网上有很多精华版之类的总结,我那份总共27页(PDF),基本上是涵盖了所有的考点。基本上每套笔试题做下来都能涵盖其中80%以上的内容。记得当时我都觉得心理很不平衡,这二十多页的无聊东西居然有足足30分,我那本CPP的基础教程将近1K页啊,而且字还那么密,真是杯具啊。

       二级考试分为笔试和机考,都是以100分为满分,但60分合格。笔试有70分的选择题,共35题每题2分;30分的填空题每题2TOO。上机题有30分的查错题,30分的补充题,40分的程序设计题。上机题和笔试都是90分钟。

       首先说整体复习策略,按照大纲,熟悉所有考点的具体语法和概念是必须的。引用PL师兄的话:“对于英语成绩极端不理想甚至不存在英语成绩的同学,作为一个围观帝,我表示无能为力,你需要的不是我,是春哥~而那些英语成绩特别好的同学,信自己足以~”这个考试考得非常基础而且细致,而且充满着中国考试的特点,就是一切以大纲为准(虽然总是有错别字)。所以一定要注重细节,特别是题号偏后却又看似很简单的题目,里面往往设有不可告人的陷阱。在熟悉的基础上,就是适量做些模拟题和最近几年的真题。一方面熟悉考试的方式和内容,另一方面试着从出题者的角度去看问题。就我个人的经验,考试时间是非常充裕的,所以每道题看仔细一些。

近几年的笔试题(包括我刚刚结束的这次)中,代码量都非常大,像103月的这次我感觉(考试的时候没有仔细算)大概占了一半以上。所以准备学习的过程中,一定不要光看看概念定义还有语法什么的就完了,一定要多些在电脑上进行实际操作,这样才能帮助你快速而且准确的阅读代码。C++是一门实践性的语言,光看其实是很难真正学懂的。代码题应尽可能做到不丢分,因为这部分只要语法懂了,并细心一点基本上都是可以拿下的。此外就是概念题,往往是“以下选项错误/正确的是?”这类,结合排除法也要尽可能的多拿分。最后就是那30分公共基础知识,因为没有真正系统学过,如果时间不是很充裕的话建议选择性放弃,即撇除自己不理解的概念部分,把理解的部分拿到就可以了。

至于上机考,电脑会在题库中抽取一套题给你,也就是说你和你旁边的人所做的题是不一样的。如果RP好的话像我抽到的题刚好很熟悉10分钟就可以交卷了,RP不好像我旁边那个我交卷的时候他连改错题都没做完。还有,上机考一定要注意的一点是,当你打开VC++6.0的时候,它是一个全空的初始界面,一定要学会怎样打开项目窗口并找到main.cpp文件(可能有些还不止一个main.cpp,还需要查看自定义的头文件,我的那道设计题就是这样的)。对VC++6.0的操作也是大纲中规定的考点之一,复习的时候还是先把VS撇开先。要不就像我考试的课室某位仁兄一样,一个劲的跟监考老师反映是程序坏了,没有代码窗口,这就杯具了(这个时候监考老师只是重复:“没错,就是这样的,这就是它要考你的啊!”)。

错误纠正题都不会很难。因为可以利用编译器帮助你快速而且准确的判断错误。题目会告诉你该程序要达成的目的是什么(一般是在屏幕上输出一些字符串和数据),然后会在出错的语句前标注//erro+编号如//erro01。我做这类题的时候一般首先关注main函数,先弄清楚程序中的哪几个语句进行了cout的操作,然后再找出数据中有什么地方出现了算法的错误或者遗漏了什么语句(例如,在#include<iostream>的情况下缺少了using namespace std;或者在调用cout的时候没有std::cout)。而语法错误完全可以由编译器来进行查找。

程序补充题,题目一般是设计一个类,并定义了一系列成员,并实现一些功能。代码中有很多//found+编号后跟着_______下划线。做题的时候把下划线删去并填写代码就可以了。这些题一般我都不会完全通读整个程序代码,因为大部分时候题目对每个下划线的说明都不需要你理解整个程序就可以CODING了。当然,考试的时候还是检查一下比较好。

以上这两种题总计有60分,而且大都比较简单,拿下以后就和格啦。注意答题的时候,不要添加行或者删除行,也不要改动其它代码。机考的评卷是电脑阅卷为主,人工阅卷为辅的所以如果你移动了代码可能就会被误判0分。

最后是程序设计题,40分。一般是要求你设计一个函数,该函数已经有固定的参数了(由题目给出),你要做的就是书写函数的具体内容,并实现题目要求的功能(例如将某数据项插入一个链表中)。这题考察的是综合运用能力,所以可能很难(以前从来没见过,而且一时间也没有好的思路),也可能很简单(刚好做过,或者很快找到解题思路)。这类题没什么太多技巧,只能是平时多练一些。

       以下这部分文字是写给深大的兄弟姐妹们的,在其他地方考试的朋友可以跳过

考试的报名方式非常随机,因为报名海报往往贴出来几个小时后就会被覆盖,所以如果没能在深大找到报名的联系人,可以直接联系深大成教学院报名。每年的报名时间一般在6月和12月,考试时间在9月底和4月初,每年的时间都会有些出入,可以在http://www.51test.net/ncre/guangdong/这里查到。

       深圳的计算机考试是在深圳广播电视大学和深大成教学院进行的,所以考试前一定要看清楚自己准考上写的考试地点。因为这两个学校在同一栋楼里,左边是成教院,右边是电大,而且都以AB座划分。我当时在电大A座考,却走错到了成教院A座,结果差点点就迟到了。所以一定要分清楚,不认识路的话可以问一楼大厅的值班人员。

       交通方式:出深大北门至地铁站,坐到大剧院站(中间不用换乘),从C出口出来,马路斜对面就是了,全程大约50分钟。

       如果上午笔试下午机考的话,中午饭可以去成教院的饭堂(不能用深大的饭卡,可以买饭票),也可以到地王大厦旁的信兴广场,里面有M记,有KFC等等。也可以在周边的快餐店如嘉旺、真功夫等地。中午休息可以在星巴克(信兴广场)、成教饭堂或者我没发现的地方。

囧,啰啰嗦嗦也3K字了,不知道我这些个人的感受到底有没有用。下面是我个人印象比较深的考点和易错点,单纯要背的概念什么的我就不重复了,可能个人的情况不同,没兴趣的同学可以跳过:

       二级公共基础部分:

数据结构与算法

1)二叉树的遍历,包括前序、后序、中序。

       这个遍历在我刚开始做模拟题的时候可真是烦死我了,网上查了不少资料都讲的不是很清楚(可能也是我理解力有问题~囧)。以前序遍历为例(假设根结点的左、右子树存在),首先是根结点,然后遍历左子树,以左子树的根结点(也就是二叉树根结点的左结点)再次进行前序遍历,以此类推。发现这部分是在很难用语言讲清楚,给个实例吧。

以下图为例,作出它的中序遍历。根节点是A,先遍历其左子树,对于T来说,它没有左子树,它本身是一个“相对的”根结点,所以中序遍历的第一个字母是T。再遍历它的右子树。对于B而言,先遍历左子树,也就是Z。而此时B是其“相对的”根节点,所以第三个字母是Z,第四个字母是B。此时A的左子树已经遍历完了,A是根结点所以有一半的中序遍历:TZBA。继续遍历右子树,根据相同的原则可以得出后半部分的结果是:CTXP。所以整个遍历结果为TZBACTXP。不知道我讲清楚没有,实在不理解的话再上网查查资料吧。

 

       除了直接给出一棵树让你进行遍历外,也可能有给出一棵树的其中两种遍历让你求第三种,其实原则都是一样的,解题思路估计我是讲不清的,各位看看就好了,看不懂就算了。首先给出的遍历中至少有一个是前序遍历或者后序遍历,所以可以马上得到二叉树的根节点,即前序遍历的第一个字母或者后续遍历的最后一个字母。然后结合另一个遍历可以很轻松的判断出那些字母是左子树的,哪些是右子树的。然后对右子树进行同样的操作,不断递归下去就能还原整棵右子树,同理可以得到左子树。

 

2)叶子结点、度、深度等二叉树中的变量之间的关系和计算。

 

3)冒泡排序法、选择排序法、插入排序法、堆排序法的原理及最坏情况。

 

4)链表、队列及其中关于指针的运用。

 

5)算法的复杂度。

 

6)二分查找法及其最坏情况。

 

程序设计基础和软件工程

1)注意区分“对象”的特性和“面向对象的设计思想”的特性。

 

2)软件工程中最花时间的是软件的维护。

 

3)结构化分析的常用工具和过程设计的常用工具(注意区分)。

 

4)软件测试与软件调试的区别与作用。

 

数据库

这部分我觉得基本上是背的……

1)注意把ER模型和结构/过程化分析的常用工具区分开来。

 

2)投影是针对列的操作,选择是针对行的操作。

 

3)数据库的发展特点:共享越来越多,冗余越来越小。

 

       二级C++部分

1)熟悉VC++6.0的操作,一定要熟悉!最好要重新安装一次,因为考试的时候用的VC++是处于初始状态的,连文件列表都没有。

2)变量的命名,数字不能作为开头,保留字不能作为变量名。

3)各种转义符的作用。

4)指针类型的定义及调用。

5)自增符与自减符一定要弄清楚。

6switch语句中小心每个分支后是否有break;

7)因为0或者NULL(其实NULLACII码的编号就是0)在逻辑上可以理解成false。所以在条件语句中可以用来作为条件。例如while(i--){……},当i = 0 的时候循环就终止了。这个功能很实用,在后面我会再举一个例子。

8do……while语句和while语句的循环次数是不同的,前者是先运行一次再判断,后者是先判断在运行。

9goto语句是限制使用,但不是说绝对不可以用;continue的意思是结束当前次的循环(continue后面的语句都不执行了),进入下一轮循环;break的意思是跳出当前循环(即不再循环了)。

10)数组的变量名其实是指向第一个元素的指针,反之同。

12)虽然C++中增加了专用的字符串类型string,但不知道为什么总是考字符数组形式(char*str)的字符串,所以字符串函数strlen,strcpy,streat,strcmp,strstr要清楚(这些函数的调用需要头文件<cstring>

13)指针。可能是C++中最让人头晕的东西,没什么好方法,多写代码吧。)

14)类的默认成员默认继承都是私有的。

15)类模板和多态性的问题一定要弄清楚。

16)重载运算符中哪些是可以重载的,哪些不行;哪些必须用友元函数,哪些不用。

17)构造函数和析构函数的调用顺序(先基类的构造函数,如果有多个基类则按顺序调用。然后是成员对象的构造函数,然后才是本身的构造函数;析构函数的顺序相反,即先构造后析构,后构造先析构)。

18)值参、形参的使用;指针变量在函数中的调用。

19)虚函数的作用,纯虚函数的写法,什么是抽象类。

20)输入/输出流的相关概念及参数。(ios::binary是二进制、cin是一个对象等)

     上机考试

纠错题和填空题一般都比较简单,主要是弄清楚什么时候调用的是什么对象(函数)就可以了。程序设计题是难点,一般考察的是字符串的运用或者链表的运用。我把一些比较常用的算法列出来,基本上考的都是这几种算法的组合。当然,理解思路是最重要的,具体操作方式要灵活处理。

1)获取字符串数组的长度。

       for ( int length = 0 ; str[length] ; length ++ ){}

       注意这个时候的length是字符串的长度,而字符串的下标是从0开始的,所以最后一个元素应该是str[length-1]

       2)排序法中交换typeName类型的数组tN的某两个元素。

       typeName temp;

       temp = tN[i] ;

       tN[i] = tN[j] ;

       tN[j] = temp;

       这个算法常和for语句联合使用。

       3)将某数组中的元素顺序倒置(逆序),len已知。

       for ( int j = 0 ; j < len ; j ++ , len --)

{

typeName temp;

              temp = tN[j] ;

              tN[j] = tN[len] ;

              tN[len] = temp;

}

4)将int类型的数num转化为二进制的字符串str

       if ( num%2 )

              str[i]=’1’+NULL;

       else

              str[i]=’0’+NULL;

除二取余法,还需要将所得结果逆序,详细代码我就不写了。

5)查找数组中的某个元素key,已知长度len

for ( int i = 0 ; i < len ; i ++ )

{

       if ( s[i] == key )

              //找到以后需要进行的操作

}

6)链表中的操作

orderedNodeType.h

 

template<class Type>
class orderedLinkedListType : public linkedListType<Type>
{
public:
 bool search(const Type& searchItem) const ;//查找固定项目
 void insertNode(const Type& newItem) const ;//将项目插在有序列表的适当位置(保证插入后列表仍然有序)
 void deleteNode ( const Type& deleteItem) ;//删除一个节点
};

 

 

/ranNodeType.h


template<class Type>
struct ranNodeType
{
 Type info ;
 ranNodeType<Type> *link ;
};

template<class Type>
class linkedListType
{
public:
 const linkedListType<Type> & operator = ( const linkedListType<Type>& ); //重定义赋值函数
 void initializeList () ; //初始化类
 bool isEmpty () const ; //判定列表是否为空
 void print (ostream & ) const ; //输出列表
 int length () const ; //返回列表长度
 void destroyList() ; //销毁列表
 Type front () const ; //返回第一个节点的值
 Type back () const ; //返回最后一个节点的值
 bool search ( const Type& searchItem ) const ;//查找列表中的给定项
 void insertFirst ( const Type& newItem ) ; //在开头插入一个新项
 void insertLast (const Type& newItem ); //在末尾插入一个新项
 void deleteNode (const Type& deleteItem ); //删除一项
 linkedListType();//构造函数
 linkedListType( const linkedListType <Type>& otherList);//复制构造函数
 ~linkedListType() ;//析构函数
 ranNodeType<Type> *first , *last ;

protected :
 int count ;

private:
 void copyList(const linkedListType<Type>& otherList);
};

/orderNodeType.cpp

 

template<class Type>
bool orderedLinkedListType<Type>::search(const Type& searchItem) const //查找固定项目
{
 ranNodeType<Type> *temp ;
 bool found = false ;

 while ( temp->info > searchItem && first !=NULL )
  temp = temp->link ;

 if ( temp->info == searchItem )
 {
  found = true ;
 }
 return found;
}

template<class Type>
void orderedLinkedListType<Type>::insertNode(const Type& newItem) const//将项目插在有序列表(从大到小)的适当位置(保证插入后列表仍然有序)
{
 ranNodeType<Type> *temp , *trailTemp , *newNode ;
 temp = first ;

 if ( first == NULL)
  temp->info = newItem ;

 newNode = new ranNodeType<Type> ;
 newNode ->info = newItem ;
 newNode ->link = NULL ;

 while ( temp->info > newItem )
 {
  trailTemp = temp ;
  temp = temp->link ;
 }

 if ( temp != NULL )
 {
  newNode -> link = temp ;
  trailTemp -> link = newNode ;
 }
 else
  trailTemp -> link = newNode ;

 count ++;
}

 


template<class Type>
void orderedLinkedListType<Type>::deleteNode ( const Type& deleteItem)//删除一个节点
{
 if ( !search( deleteItem ) )
  cout << "Can not found the deleteItem .";
 else if ( !isEmpty() )
 {
  ranNodeType<Type> *temp ;

  while ( temp->info > deleteItem )
   temp = temp->link ;

  delete temp ;
  count -- ;
 }
}

 

//ranNodeType.cpp

template<class Type>
bool linkedListType<Type>::isEmpty () const  //判定列表是否为空
{
 return ( first == NULL );
}

template<class Type>
linkedListType<Type>::linkedListType()//构造函数
{
 first = NULL;
 last = NULL ;
 count = 0 ;
}

template<class Type>
void linkedListType<Type>::destroyList()  //销毁列表
{
 ranNodeType<Type> *temp ;
 
 while ( first !=NULL )
 {
  temp = first ;
  first = first->link ;
  delete temp ;
 }
 last = NULL ;
 count = 0 ;
}

template<class Type>
void linkedListType<Type>::initializeList ()  //初始化列表
{
 destroyList ();
}

template<class Type>
void linkedListType<Type>::print ( ostream & outdata ) const  //输出列表
{
 ranNodeType<Type> *temp ;
 temp = first ;
 while ( temp != NULL )
 {
  outdata << temp->info << "  ";
  temp = temp->link ;
 }
}

template<class Type>
int linkedListType<Type>::length () const  //返回列表长度
{
 return count ;
}

template<class Type>
Type linkedListType<Type>::front () const  //返回第一个节点的值
{
 assert( first != NULL );
 return first->link ;
}

template<class Type>
Type linkedListType<Type>::back () const  //返回最后一个节点的值
{
 assert( last != NULL );
 return last->link ;
}

template<class Type>
bool linkedListType<Type>::search ( const Type& searchItem ) const //查找列表中的给定项
{
 ranNodeType<Type> * temp;
 bool found = false ;

 temp = first ;
 while ( found != true && temp !=NULL )
 {
  if ( searchItem == temp ->info )
  found = true ;
  else
   temp = temp-> link ;
 }
 return found ;
}

template<class Type>
void linkedListType<Type>::insertFirst ( const Type& newItem )  //在开头插入一个新项
{
 ranNodeType<Type> *newNode ;
 newNode = new ranNodeType<Type> ;

 assert ( newNode != NULL );

 newNode->info = newItem ;
 newNode->link = first ;
 first = newNode;

 count ++ ;
 
 if ( last == NULL )
 last = newNode ;
}

template<class Type>
void linkedListType<Type>::insertLast (const Type& newItem ) //在末尾插入一个新项
{
 ranNodeType<Type> *newNode ;
 newNode = new ranNodeType<Type> ;

 assert ( newNode != NULL );

 newNode->info = newItem ;
 newNode->link = NULL;

 if ( first == NULL )
 {
  first = newNode ;
  last = newNode ;
 }
 else
 {
  last->link = newNode ;
  last = newNode;
 }
 count ++ ;
}

template<class Type>
void linkedListType<Type>::deleteNode (const Type& deleteItem ) //删除一项
{
 ranNodeType<Type> *temp , *trailTemp;
 bool found ;

 if ( first == NULL )
  cout << "Can not delete an empty list."
  << endl ;
 else
 {
  if ( first->info == deleteItem )
  {
   temp = first ;
   first = first->link ;
   count -- ;
   if ( first == NULL )
    last = NULL;
   delete temp ;
  }
  else
  {
   found = false ;
   temp = first->link ;
   trailTemp = first ;

   while ( temp != NULL && !found )
   {
    if ( temp ->info != deleteItem )
    {
     trailTemp = temp ;
     temp = temp ->link ;
    }
    else
    found = true ;
   }

   if ( found )
   {
    trailTemp->link = temp ->link ;
    if ( last == temp )
    {
     last = trailTemp ;
    }
    count--;
    delete temp ;
   }
   else
    cout << "Can not found the deleteItem ." << endl ;
  }
 }
}

template<class Type>
const linkedListType<Type> & linkedListType<Type>::operator =
                        ( const linkedListType<Type>& otherList ) //重定义赋值函数
{
 if ( this != &otherList )
 {
 copyList ( otherList ) ;
 }
 return this ;
}

template<class Type>
linkedListType<Type>::linkedListType( const linkedListType <Type>& otherList)//复制构造函数
{
 first = NULL;
 copyList ( otherList );
}

template<class Type>
linkedListType<Type>::~linkedListType() //析构函数
{
 destroyList () ;
}

//private:
template<class Type>
void linkedListType<Type>::copyList(const linkedListType<Type>& otherList)
{
 ranNodeType<Type> *newNode , *temp ;
 
 if ( first != NULL )
  destroyList ();

 if ( otherList.first ==NULL )
 {
  first = NULL;
  last = NULL ;
  count = 0 ;
 }
 else
 {
  temp = otherList.first ;
  while ( temp !=NULL )
  {
   insertLast ( temp -> info );
   temp = temp->link ;
  }
 }
}

 

 OK把链表补充完了..

啰嗦完了,总之,希望我能考过吧。。。TEL哥保佑!淘气

10.03.31

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值