资源描述
中央广播电视大学计算机科学与技术专业
面向对象程序设计课程考核说明(2003年版)
一、考核说明
《面向对象程序设计》课程是电大系统计算机科学与技术专业本科生(专科起点)的一门必修课程。本课程是数据结构、操作系统、计算机网络、软件工程等的先修课程,在整个专业教学体系中占据非常重要的基础地位。本课程主要介绍C++语言的基本语法规则,各种数据类型的定义、表示和使用,各种流程控制语句的定义与作用,类和对象的定义与应用,面向过程和面向对象的程序设计方法等内容。
面向对象的思想是需要在实践中不断摸索和体会的,学生们在后续课的学习和以后的工作中要主动去运用和实践。教学的主要目标是让学生能够建立起思考问题的方法,指导以后的软件开发实践。
现将该课程考核的有关问题说明如下:
1. 考核对象 全国电大系统开放教育试点计算机科学与技术专业(专科起点本科)学生。
2.教学媒体
文字主教材《C++面向对象程序设计》 王萍编著 清华大学出版社出版
实验教材《面向对象程序设计实验》 徐孝凯等编 中央广播电视大学出版社出版
录象教材 16讲 王萍主讲 中央广播电视大学音像出版社出版
复习资料 《面向对象程序设计期末复习指导》中央电大教育杂志社出版发行
作业练习 《面向对象程序设计形成性考核作业册》 中央电大教育杂志社出版发行
网上辅导 在电大在线计算机科学与技术《面向对象程序设计》课程网页上发表
3. 命题依据
本考核说明以电大计算机科学与技术专业《面向对象程序设计教学大纲》为依据编制。本考核说明是考试命题的依据。
4. 考核要求
本课程是以实用为最终目的,主要考核学生对C++语言的掌握程度和对解决一般问题的程序设计能力。不要死记硬背,注重理解和运用。考核分为以下几个层次:
理解:要求学生理解面向过程和面向对象程序设计的基本思想和方法,理解C++语言程序的基本结构,理解各种C++语法成分定义、表示和作用。
应用:要求学生能够根据所学的C++语言知识和程序设计知识,分析和理解一般的程序或函数模块或类模块,能够根据处理简单问题的要求编写出较规范的并且可读性好的面向过程或面向对象的函数模块或程序。
综合应用:要求学生能够综合运用多个知识点进行比较复杂的程序(函数模块)分析和设计,考察学生综合运用知识的能力和实际解决问题的能力。
5. 命题原则
(1) 在教学大纲和考核说明所规定的知识范围内命题。在教学知识范围之内,需要灵活运用才能够解决问题的试题不属于超纲。
(2) 试题的考察要求覆盖面广、区分度高。
(3) 试题兼顾各个能力层次,理解约占40%,应用约占40%,综合应用约占20%。
(4) 试题的难易程度和题量适当,按难易程度分为四个层次:容易占20%,较易占30%,较难占30%,难占20%。题量安排以平时能够独立完成作业者,能在规定的考试时间内做完并有一定时间检查为原则。
6. 试题题型
单项选择题:根据题意,从四种可选择的答案中选择合适的一种答案。
填空题:根据题意,在画有横线或空白处填写合适内容。
程序填充题:根据C++程序或函数(类)模块,及相应的功能描述,在画有横线或空白处填写合适内容。
理解问答题:根据C++程序或函数(类)模块,回答一些问题。如写出程序运行结果或函数调用结果,写出程序或函数所能实现的功能,按题意要求指出错误位置并改正。
编程题:给出编程要求和函数原型,编写出相应的程序或函数模块。
7. 考核形式:
采用期末考核与形成性考核相结合的方式。形成性考核分为两种,一种视作业完成情况和实验完成情况而定,占总成绩的15%;另一种为期末上机考核,占总成绩的15%,完成一个指定题目的程序开发和调试,由各省级电大在省内统一命题,时间为60分钟。期末考核占总成绩的70%,为闭卷考试,由中央电大统一命题,时间为150分钟。总成绩满分为100分,合成成绩达60分及以上者可获得该课程规定的4学分,否则不获得该课程学分。
二、考核内容和要求
第一部分 程序设计基础
考核目的:
考核学生对C++程序结构、程序运行过程、各种数据类型的作用、数据常量表示、表达式构成、运算符含义、简单语句和复合语句格式等的掌握程度。
考核的知识点:
C++语言特点和程序的基本结构。
上机输入、编辑、连接、运行一个C++程序的过程。
整数、字符、实数、逻辑等标准数据类型的含义。
各种常量的字面表示和符号表示,变量的定义与使用。
常用运算符的表示、优先级与结合性。
表达式的分类和使用。
考核要求:
理解:C++语言的有关基本概念、程序结构、数据类型的分类与作用、常量和变量的表示、运算符含义、表达式构成与运算等内容。
应用:能够编写简单的程序,能完成简单数据和表达式的输入和输出,能利用变量存放输入数据、临时数据和计算结果,能利用符号常量存放固定数据,能根据数值计算和数据处理的要求选择合适的常量或变量表示,能利用运算符进行算术、比较(即关系)和逻辑运算,能把一般数学算式、不等式或条件表示成相应的C++表达式。
第二部分 流程控制语句与程序模块的基本结构
考核目的:
考核学生对各种分支语句、循环语句和跳转类语句的理解和掌握程度,对程序模块的顺序、分支和循环这三种基本结构的理解程度,对运用流程控制语句编写程序解决实际问题的能力。
考核的知识点:
下列各种控制语句的定义格式、执行过程与作用:
if语句、switch语句、for语句、while语句、do语句、break语句、continue语句、return语句等。
各种分支和循环语句相互嵌套的作用和执行过程。
考核要求:
理解:各种语句的格式、执行过程与作用,语句之间相互嵌套的概念。
应用:
(1) 能够分析含有if和switch分支类语句的程序模块并给出功能或执行结果,能够按照分支处理的要求编写出相应的分支程序。
(2) 能够分析含有for、while和do循环类语句的程序模块并给出功能或执行结果,能够按照循环处理的要求编写出相应的循环程序,如累加计算、数据统计、求最大值、求平均值等程序。
(3) 能够实现if和switch语句之间的转换,能够实现for、while和do循环语句之间的转换。
综合应用:运用各种流程控制语句和其他语句等已有知识进行比较复杂的程序分析与设计,如双重或三重循环的程序分析与设计。
第三部分 函数
考核目的:
考核学生对变量作用域的理解程度,对函数定义与调用格式的掌握程度,对形式参数和实在参数的使用与结合的理解程度,对模块化程序设计方法的掌握程度。
考核的知识点:
模块化程序设计的概念,多文件结构的程序。
函数的定义、声明与调用格式,静态函数的含义。
函数定义中值参数、指针参数、数组参数、引用参数、常量参数的声明格式及作用;
函数中带默认值参数的说明与作用。
函数调用中的实参与函数定义中的形参之间的结合过程。
函数返回值的一般类型、指针类型和引用类型的作用。
变量的作用域和生存期,静态变量的特点。
内联函数的定义格式及作用。
递归函数的设计方法和调用过程。
函数重载的含义和作用。
函数模板的定义格式及作用。
考核要求:
理解:
(1) 模块化程序设计与函数的关系,函数的定义格式与声明格式,函数调用表达式的格式及执行过程,带默认值参数的含义与用法。
(2) 全局变量、局部变量、静态变量的含义。
(3) 内联函数和函数模板的定义与声明格式,函数模板的实例化,重载函数的作用。
应用:
(1) 能够分析已知函数,给出所能实现的功能或运行结果。
(2) 能够根据处理问题的需要合理地设置函数参数、函数的返回值类型以及编写出函数体。
(3) 利用递归函数来简化程序设计。
(4) 利用函数重载来优化程序设计。
(5) 利用函数模板来设计能够处理任何数据类型的程序。
第四部分 数组、结构、指针和引用
考核目的:
考核学生对数组、字符串、结构、指针、引用等数据类型的理解和掌握程度。
考核的知识点:
一维数组的概念、定义和初始化。
二维及多维数组的概念、定义和初始化。
一维和二维数组元素的下标访问方式。
字符串与字符数组的区别与联系,字符串的输入与输出。
常用字符串函数(如strlen,strcpy,strcmp,strcat等)的调用格式与作用。
结构类型的定义格式和作用,结构变量的定义格式和初始化。
结构成员的表示和使用。
指针的概念、定义及初始化。
针对指针的各种运算操作。
数组名的指针含义,数组元素的下标与指针方式的表示及转换。
数组形参与指针形参之间的等价表示与转换。
引用的定义和初始化,引用参数与值参数的区别。
一般变量与数组的存储空间的动态分配与释放。
考核要求:
理解:
(1) 数组、字符串、结构、指针、引用等的概念、表示和作用。
(2) 数组的存储空间分配,数组元素的地址计算,数组元素的下标访问方式和指针访问方式。
(3) 字符串的存储格式,字符串的输入输出方式,字符串函数的调用。
(4) 数据空间的动态分配与释放,链表的结构与访问结点的过程。
应用:
(1) 能够分析和设计在一维数组上的顺序查找、选择排序、插入排序等算法。
(2) 能够分析和设计在二维数组上的矩阵加、减、转置、乘等运算的算法。
(3) 能够分析和设计利用字符串函数进行字符串处理的算法。
(4) 能够分析和设计动态生成的链表,在链表头或尾插入或删除结点的算法,以及遍历链表的算法。
(5) 能够分析和设计对顺序或链接表示的栈或队列进行插入或删除元素(结点)的算法。
(6) 能够使用引用类型作为函数的参数类型和返回值类型。
综合应用:运用数组、字符串、结构、指针、引用等数据类型进行程序设计。
第五部分 类与对象
考核目的:
考核学生对类这种复杂数据类型的理解和运用程度,对面向对象程序设计方法的掌握程度。
考核的知识点:
面向对象程序设计的概念。
类的定义,类与结构的区别和联系。
类成员的访问控制与访问方式。
内联与非内联成员函数的声明与定义。
对象的生成和初始化。
类的作用域。
类的构造函数与析构函数。
类的拷贝构造函数和赋值重载函数。
静态数据成员和静态成员函数。
对象成员和一般成员的初始化方式。
友元函数与友元类。
this指针。
用数组和链表实现队列类和栈类。
考核要求:
理解:
(1) 面向对象程序设计的有关概念。
(2) 类的定义,类成员的访问权限,构造函数与析构函数的定义格式及作用。
(3) 静态数据成员定义、初始化与作用,静态函数成员的定义格式与特性。
(4) 友元函数和友元类的声明与作用。
应用:
(1) 能够分析和设计含有简单类定义的程序。
(2) 能够使用数组或链表建立队列类和栈类。
综合应用:
(1) 能够根据程序要求构造满足要求的类。在构造过程中充分考虑构造函数和析构函数的使用、成员访问控制的运用、内联函数的运用、静态成员的选用。
(2) 能够根据要求构造多个类完成所要求的程序设计任务,多个类之间可以发生一定的关系,如一个类作为另一个类的成员或友元、一个类使用另一个类的服务等。
第六部分 继承与多态性
考核目的:
考核学生对面向对象机制(封装、继承和多态)的理解和掌握程度。
考核的知识点:
结构化程序设计和面向对象程序设计思想的不同。
继承(单继承与多继承)的含义,派生类的定义和使用。
派生类中构造函数和析构函数的执行过程。
对派生类和基类中同名成员的访问方式。
静态联编与动态联编的各自的含义和区别。
静态联编与函数重载,动态联编与虚函数,多态性。
虚基类,抽象类,纯虚函数。
考核要求:
理解:
(1) 类继承的概念和作用,派生类的定义格式。
(2) 派生类对基类的继承方式,派生类对基类成员的访问权限。
(3) 静态联编和动态联编的含义,函数重载和虚函数的作用。
应用:
(1) 能分析含有派生类的程序。
(2) 能够根据要求构造类的继承层次,并完成一定的程序设计。
综合应用:能够利用继承、虚函数、动态联编(即多态性)等机制完成面向对象的程序设计。
第七部分 运算符重载
考核目的:
考核学生对运算符重载的理解和掌握程度。
考核的知识点:
运算符重载的概念与函数定义格式。
一般函数的运算符重载和成员函数的运算符重载。
引用在运算符重载中的作用。
作为友元函数的运算符重载。
单目和双目算术运算符的重载。
增1和减1运算符的重载。
插入运算符和抽取运算符的重载。
圆括号运算符和中括号运算符作为成员函数的重载。
考核要求:
理解:
(1) 运算符重载的概念及作用。
(2) 引用在运算符重载中的作用。
(3) 运算符重载作为一般函数和成员函数在参数上的区别。
应用:能够分析和设计带有运算符重载的函数或类。
三、期末考核试题样例及解答
一、单项选择(每小题1分,12小题,共12分)
1. C++源程序文件的缺省扩展名为( )。
A. cpp B. exe C. obj D. lik
2. x>0 || y==5的相反表达式为( )。
A. x<=0 || y!=5 B. x<=0 && y!=5
C. x>0 || y!=5 D. x>0 && y==5
3. 在下面的字符数组定义中,有语法错误的是( )。
A. char a[20]=“abcdefg”; B. char a[]=“x+y=55.”;
C. char a[15]; D. char a[10]=’5’;
4. 以下正确的函数原型语句是( )。
A. double fun(int x,int y)
B. double fun(int x;int y)
C. double fun(int,int);
D. double fun(int x,y);
5. 在下面存储类中,( )的对象不是局部变量。
A. 外部静态类 B. 自动类 C. 函数形参 D. 寄存器类
6. 假定有“struct BOOK{char title[40]; float price;}; BOOK *book=new BOOK;”,则正确的语句是( )。
A. strcpy(book->title,”Wang Tao”); B. strcpy(book.title,”Wang Tao”);
C. strcpy(*book.title,”Wang Tao”); D. strcpy((*book)->title,”Wang Tao”);
7. 软件产品所具有的全部或部分地再用于新的应用的能力称为该软件的( )。
A. 可维护性 B. 可复用性 C. 兼容性 D. 正确性
8. 在多文件结构的程序中,通常把含有main()函数的文件称为( )。
A. 主文件 B. 实现文件 C. 程序文件 D. 头文件
9. 在一个用链表实现的队列类中,假定每个结点包含的值域用elem表示,包含的指针域用next表示,链队的队首指针用elemHead表示,队尾指针用elemTail表示,若链队为空,则进行插入时必须把新结点的地址赋给( )。
A. elemHead B. elemTail
C. elemHead和elemTail D. elemHead或elemTail
10. 假定AB为一个类,则执行 “AB a, b(2), c[3], *p=&a;”语句时共调用该类无参构造函数的次数为( )。
A. 5 B. 6 C. 3 D. 4
11. 引入友元的主要目的是为了( )。
A. 增强数据安全性 B. 提高程序的可靠性
C. 提高程序的效率和灵活性 D. 保证类的封装性
12. 如果是类B在类A的基础上构造,那么,就称( )。
A. 类A为基类或父类,类B为超类或子类
B. 类A为基类、父类或超类,类B为派生类或子类
C. 类A为派生类,类B为基类
D. 类A为派生类或子类,类B为基类、父类或超类
二、填空(每空1分,15小题,共18分)
1. C++语言是在_________语言的基础上发展起来的。
2. 假定x=5,y=6,则执行表达式y*=x++计算后,x和y的值分别为__________和__________。
3. 假定x是一个逻辑量,则x && false的值为__________。
4. 在if语句中,每个else关键字与它前面同层次并且最接近的________关键字相配套。
5. 一个二维字符数组a[10][20]能够存储________个字符串,每个字符串的长度至多为________。
6. 局部变量具有局部生存期,存放在内存的____________区中。
7.假定p所指对象的值为25,p+1所指对象的值为42,则执行*(p++)或*p++运算后,p所指对象的值为________。
8. 已知语句“cout<<s;”的输出是“apple”,则执行语句“cout<<s+2;”的输出结果为__________。
9. 面向对象软件开发的生命周期分为三个阶段,即分析、__________和__________。
10. 若采用p->abc(y)表达式调用一个成员函数,在成员函数中使用的________就代表了类外的p指针。
11.当用户为一个类定义有____________时,则系统不会为该类再自动生成一个默认构造函数。
12.假定用户为类AB定义了一个构造函数"AB(int aa, int bb):a(aa),b(bb){}",则定义该类的对象时,有________种定义格式。
13.假定用户只为类AB定义了一个构造函数"AB(int aa, int bb=0) {a=aa; b=bb;}",则定义该类的对象时,其实参表中至少带有_________个实参。
14. 在重载一个单目运算符时,参数表中没有参数,说明该运算符函数只能是类的_____________。
15. 若要保证一个公共的基类在派生类中只产生一个基类子对象,则必须都以____________的方式继承它。
三、程序填充。对程序、函数或类中划有横线的位置,根据题意按标号把合适的内容填写到程序下面相应标号的后面(每小题6分,3小题,共18分)
1. 把从键盘上输入的一个大于等于3的整数分解为质因子的乘积。如输入24时得到的输出结果为“2 2 2 3”,输入50时得到的输出结果为“2 5 5”,输入37时得到的输出结果为“37”。
#include<iostream.h>
void main()
{
int x;
cout<<"请输入一个整数,若小于3则重输:";
do cin>>x; while(___(1)___);
int i=2;
do{
while(___(2)___) {
cout<<i<<' ';
x/=i;
}
___(3)___;
}while(i<x);
if(x!=1) cout<<x;
cout<<endl;
}
(1)
(2)
(3)
2. 假定有定义为“struct NODE{int data; NODE* next;};”,下面算法根据table数组中的n个元素建立一个表头指针为L的链表,链表中结点值的顺序与数组元素值的顺序正好相反。
void f6(NODE*& L, int table[], int n)
{
L=NULL;
if(n<=0) return;
int i=0;
NODE* p;
while(___(1)___) {
p=new NODE;
p->data=___(2)___;
p->next=L;
___(3)___;
i++;
}
}
(1)
(2)
(3)
3. 已知一个利用数组实现栈的类定义如下:
const int ARRAY_SIZE=10;
class Stack {
public:
void Init() {top=-1;} //初始化栈为空
void Push(int newElem); //向栈中压入一个元素
int Pop(); //从栈顶弹出一个元素
bool Empty() { //判栈空
return top==-1;
}
int Depth() {return top+1;} //返回栈的深度
void Print(); //按照后进先出原则依次输出栈中每个元素,
//直到栈空为止
private:
int elem[ARRAY_SIZE]; //用于保存栈元素的数组
int top; //指明栈顶元素位置的指针
};
void Stack::Push(int newElem) {
if(___(1)___) {
cout<<"栈满!"<<endl;
exit(1); //中止运行
}
___(2)___;
elem[top]=___(3)___;
}
(1)
(2)
(3)
四、写出程序或程序段的运行结果(每小题6分,3小题,共18分)
1. #include<iostream.h>
void main()
{
int x=5;
switch(2*x-3) {
case 4: cout<<x<<’ ’;
case 7: cout<<2*x+1<<’ ’;
case 10: cout<<3*x-1<<’ ’; break;
default: cout<<"default"<<endl;
}
cout<<"switch end."<<endl;
}
2. #include<iostream.h>
void main()
{
int i,j,len[3];
char a[3][8]={"year","month","day"};
for(i=0;i<3;i++) {
for(j=0;j<8;j++)
if(a[i][j]=='\0') {
len[i]=j;break;
}
cout<<a[i]<<":"<<len[i]<<endl;
}
}
3. #include <iostream.h>
#include <string.h>
class Point {
int x,y;
public:
Point(int x1=0, int y1=0) :x(x1), y(y1) {
cout<<"Point:"<<x<<' '<<y<<'\n';
}
~Point() {
cout<<"Point des!\n";
}
};
class Text {
char text[100]; //文字内容
public:
Text(char * str) {
strcpy(text,str);
cout<<"Text con!\n";
}
~Text() {cout<<"Text des!\n";}
};
class CircleWithText : public Point,public Text {
public:
CircleWithText(int cx,int cy, char *msg):
Point(cx,cy),Text(msg) {
cout<<"Point with Text con!\n";
}
~CircleWithText() {cout<<"Point with Text des\n";}
};
void main()
{
CircleWithText cm(3,4,"hello");
}
五、指出程序或函数的功能(每小题6分,2小题,共12分)
1. double f1(double a, double b, char op) {
switch(op) {
case ’+’: return a+b;
case ’-’: return a-b;
case ’*’: return a*b;
case ’/’: if(b==0) {
cout<<"divided by 0!"<<endl;
exit(1);
}
else return a/b;
default: cout<<"operator error!"<<endl;
exit(1);
}
}
功能:
2. IntNode* FindMax(IntNode *f)
{
if(!f) return NULL;
IntNode *p=f;
f=f->next;
while(f) {
if(f->data>p->data) p=f;
f=f->next;
}
return p;
}
假定IntNode的类型定义为:
struct IntNode {
int data; //结点值域
IntNode* next; //结点指针域
};
功能:
六、程序改错。请根据程序或函数模块的功能改写个别地方的错误(每小题6分,共6分)。
在下面的定义中,NODE是链表结点的结构,appendToList则是一函数,其功能是:在list所指向的链表的末尾添加一个新的值为x的结点,并返回表头指针。函数中有两处错误,指出错误所在行的行号并提出改正意见。
struct NODE{
int data;
NODE *next;
};
NODE* appendToList(NODE *list, int x){ //1行
NODE *p=new int; //2行
p->data=x; //3行
p->next=NULL; //4行
if(list==NULL) return p; //5行
NODE *p1=list; //6行
while(p1->next!=NULL) p1=p1->next; //7行
p1=p; //8行
return list;
}
错误行的行号为______和________。
分别改正为______________和______________。
七、编程(每小题8分,2小题,共16分)
1. 编一程序求出满足不等式的最小n值并输出。
2. 根据下面类中MaxMin 函数成员的原型和注释写出它的类外定义。
class AA {
int* a;
int n;
int MS;
public:
void InitAA(int aa[], int nn, int ms) {
if(nn>ms) {cout<<"Error!"<<endl; exit(1);}
MS=ms;
n=nn;
a=new int[MS];
for(int i=0; i<MS; i++) a[i]=aa[i];
}
int MaxMin(int& x, int& y); //从数组a的前n个元素中求出
//最大值和最小值,并分别由引用参数x和y带回,
//同时若n大于0则返回1,否则返回0。
};
试题参考解答:
一、单项选择
1. A 2. B 3. D 4. C 5. A 6. A 7. B 8. A
9. C 10. D 11. C 12. B
二、填空
1. C 2. 6 30 3. false (或0) 4. if
5. 10 19 6. 栈 7. 25 8. ple
9. 设计 实现 10. this 11. 构造函数 12. 1
13. 1 14. 成员函数 15. 虚基类
三、程序填充
1. (1) x<3 (或x<=2)
(2) x%i==0
(3) i++ (或++i或i=i+1或i+=1)
2. (1) i<n
(2) table[i]
(3) L=p
3. (1) top==ARRAY_SIZE-1 (或Depth()==ARRAY_SIZE)
(2) top++(或++top)
(3) newElem
四、写出程序或程序段的运行结果
1. 11 14 switch end.
2. year:4
month:5
day:3
3. Point:3 4
Text con!
Point with Text con!
Point with Text des
Text des!
Point des!
五、指出程序或函数的功能
1. 以参数a和b为运算对象,以参数op为四则算术运算符,求出运算结果并返回。
2. 从表头指针f指向的、由IntNode类型的结点所构成的链表中查找出data域的值最大的结点并返回指向该结点的指针。
六、程序改错。请根据程序或函数模块的功能改写个别地方的错误。
错误行的行号: 2 8
分别改正为: NODE *p=new NODE; p1->next=p;
七、编程
#include<iostream.h>
void main()
{
int i=0; double s=0;
展开阅读全文