中大实践考核面向对象(C)程序设计试题和答案 (上机考试)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
面向对象(C++)程序设计 (上机考试)
样题1.下列Shape类是一个表示形状的抽象类,Area()为求图形面积的函数,Total()则是一个通用的用以求不同形状的图形面积总和函数。
请从Shape类派生三角形类(triangle)、矩形类(rectangle),并给出具体的求面积函数。
编写程序验证求面积函数的正确性。
Shape、total的定义如下所示。
Class shape{
Pubilc:
Virtual float area()=0
};
float total (shape *s[ ], int n)
{
float sum=0.0;
for(int i=0; i<n; i++)
sum += s [ I ] ->area ();
return sum;
}
解答: #include <iostream.h>
class shape{
public:
virtual float area()=0;
};
float total(shape *s[], int n)
{
float sum=0;
for(int i=0; i<n; i++)
sum += s[i] -> area();
return sum;
}
class triangle : public shape{
protected:
float H, W;
public:
triangle(float h, float w) { H=h; W=w;}
float area() { return H*W*0.5;}
};
class rectangle : public triangle{
public:
rectangle(float h, float w) : triangle(h, w) {}
float area() { return H*W;}
};
void main()
{
shape *s[4];
s[0] = new triangle( 3.0, 4.0 );
s[1] = new rectangle( 2.0, 4.0 );
s[2] = new triangle( 5.0, 8.0 );
s[3] = new rectangle( 6.0, 8.0 );
float sum = total(s,4);
cout << "The total area is:" << sum << endl;
}
样题2. 以面向对象的概念设计一个类,此类包括3个私有数据,unlead(无铅汽油), lead
有铅汽油, total (当天总收入)。
其中,无
铅汽油价格是¥17/升,有铅汽油价格是
¥16/升,请以构造函数的方式建立此值,
并编写程序,该程序能够根据加油量,
自动计算出油站当天的总收入。
解答: #include <iostream.h>
class income {
private:
float unlead, lead, total;
public:
income(float ul, float l){unlead=ul;
lead=l; total=0.0;}
float calculate(float, float);
};
float income :: calculate(float
unleadcontent, float leadcontent)
{
total = unlead*unleadcontent +
lead*leadcontent;
return total;
}
void main()
{
float unleadcontent, leadcontent, total;
income account(17, 16);
cout << "Please input unlead content:"
<< endl;
cin >> unleadcontent;
cout << "Please input lead content:" <<
endl;
cin >> leadcontent;
total = account.calculate(unleadcontent,
leadcontent);
cout << "The total income is:" << total
<< endl;
}
样题3.编写一个计算两个给定长方形的面积的程序,要求长方形用一个类(Rectangle)
来表示,在该类中增加定义一个成员函
数add_area(), 该成员函数使用对象作
为参数,用来计算两个给定长方形的面
积。
解答: #include <iostream.h>
class Rectangle {
private:
float H, W;
public:
Rectangle(float h, float w){H=h;
W=w;}
float area(){ return H*W; }
float add_area(Rectangle &);
};
float Rectangle :: add_area(Rectangle
&Rec)
{
return area() + Rec.area();
}
void main()
{
float h1, w1, h2, w2, totalarea;
cout << "Please input the 1st rectangle
H & W:" << endl;
cin >> h1 >> w1;
Rectangle rec1(h1,w1);
cout << "Please input the 2st rectangle
H & W:" << endl;
cin >> h2 >> w2;
Rectangle rec2(h2,w2);
totalarea = rec1.add_area(rec2);
cout << "The total area of the two rectangle is:" << totalarea << endl;
}
样题 4.定义一个复数类COMPLEX,该类至少提供加、减、赋值、输出等操作,所有
操作均以友元形式实现。
编写程序验证
其功能。
解答: #include <iostream.h>
class complex{
private:
float real;
float imag;
public:
complex(){};
complex(int r, int i) {real=r;
imag=i;}
friend complex operator + (complex &, complex &);
friend complex operator - (complex &, complex &);
void show();
};
complex operator + (complex & a,
complex & b)
{
float r, i;
r=a.real+b.real;
i=a.imag+b.imag;
return complex(r,i);
}
complex operator - (complex & a,
complex & b)
{
float r, i;
r=a.real-b.real;
i=a.imag-b.imag;
return complex(r,i);
}
void complex :: show()
{
if (imag>0)
{
if (imag == 1)
cout << real << "+i";
else cout << real << "+" << imag << "i";
}
else if (imag<0)
{
if (imag == -1)
cout << real << "-i";
else cout << real << imag <<
"i";
}
else cout << real;
}
void main()
{
complex a(4,5), b(2,3), x, y;
x=a+b;
y=a-b;
a.show();
cout << "+";
b.show();
cout << "=";
x.show();
cout << endl;
a.show();
cout << "-";
b.show();
cout << "=";
y.show();
cout << endl;
}
样题 5.定义一个平面几何中点的位置类POSITION, 它应该包含有移动、计算两
点间的距离(包括到原点的距离),求X
坐标、Y坐标等操作,其中计算两点间
的距离以友元函数形式实现。
编写程序
验证其功能。
解答: #include <iostream.h>
#include <math.h>
class Position{
private:
float X, Y;
public:
Position(float xi, float yi){ X=xi, Y=yi;}
void Move(float xo, float yo){ X+=xo, Y+=yo;}
float GetX(){return X;}
float GetY(){return Y;}
float distanceToOrigin();
friend float distance(Position &, Position &);
};
float Position :: distanceToOrigin()
{
return sqrt( X*X + Y*Y );
}
float distance(Position & a, Position & b)
{
float dx = a.X - b.X;
float dy = a.Y - b.Y;
return sqrt( dx*dx + dy*dy);
}
void main()
{
Position p1(1.5, 3.5), p2(4.5, 6.5);
p1.Move(3.5, 5.5);
float dis0 = p1.distanceToOrigin();
float dis = distance( p1, p2 );
cout << "The distance p1(" << p1.GetX() << "," << p1.GetY()
<< ") to origin is: " << dis0 << endl;
cout << "The distance between p1(" << p1.GetX() << "," << p1.GetY()
<< ") and p2(" << p2.GetX() << "," << p2.GetY() << ") is "
<< dis << endl;
}
样题6.利用类和对象,编制出一个卖瓜的程序。
每卖一个瓜要计出该瓜的重量,还要计
算所卖出瓜的总重量及总个数,同时卖
瓜时还允许退瓜。
(提示:将每个瓜设为
对象;用静态成员变量分别统计卖出瓜
的总重量和总个数; 卖瓜行为用构造
函数模拟,退瓜行为用析构函数模拟。
) 解答: #include <iostream.h>
class Watermelon{
private:
static int n;
static float totalWeight;
float weight;
public:
Watermelon(float w)
{
n++;
weight=w;
totalWeight += w;
}
Watermelon(Watermelon & wa)
{
n++;
weight=wa.weight;
totalWeight += weight;
}
~Watermelon()
{
n--;
totalWeight -= weight;
}
int getWeight()
{
return weight;
}
static int getNum()
{
return n;
}
static int getTotal()
{
return totalWeight;
}
};
int Watermelon :: n = 0;
float Watermelon :: totalWeight = 0;
void main()
{
float w;
cout << "The initial weight of watermelon: "
<< Watermelon :: getTotal() << endl;
cout << "Please input weight of watermelon:" << endl;
cin >> w;
Watermelon wa1(w);
cout << "Please input weight of watermelon:" << endl;
cin >> w;
Watermelon wa2(w);
cout << "Please input weight of watermelon:" << endl;
cin >> w;
Watermelon wa3(w);
cout << Watermelon :: getNum() <<
"Nos. watermelons were sold." << endl;
cout << "The total weight is: " <<
Watermelon :: getTotal() << endl;
wa3.Watermelon::~Watermelon();
cout << "Now one watermelon was
withdrawed!" <<endl;
cout << Watermelon :: getNum() <<
"Nos. watermelons were sold." << endl;
cout << "The total weight is: " <<
Watermelon :: getTotal() << endl;
}
样题 6.编写一个程序,用于计算三角形、矩形和圆的总面积。
(提示:由于尚不能确定
该程序计算的具体形状,可以先定义一
个抽象的类shape, 对于具体种类的形
状,通过从shape派生一个类来对其进
行描述。
)
解答: #include <iostream.h>
class shape{
public:
virtual float area()=0;
};
float total(shape *s[], int n)
{
float sum=0;
for(int i=0; i<n; i++)
sum += s[i] -> area();
return sum;
}
class triangle : public shape{
protected:
float H, W;
public:
triangle(float h, float w) { H=h;
W=w;}
float area() { return H*W*0.5;}
};
class rectangle : public triangle{
public:
rectangle(float h, float w) : triangle(h, w) {}
float area() { return H*W;}
};
class circle : public shape{
protected:
float radius;
public:
circle(float r) { radius=r; }
float area() { return radius*radius*3.14; }
};
void main()
{
shape *s[4];
s[0] = new triangle( 3.0, 4.0 );
s[1] = new rectangle( 2.0, 4.0 );
s[2] = new circle( 5.0 );
s[3] = new circle( 8.0 );
float sum = total(s,4);
cout << "The total area is:" << sum << endl;
}
题样7.编写一个程序,可以输入3个学生的总分,并按总分从高到低排序,要求设计
一个学生类STUDENT, 并编写
其所有成员函数的代码,类STUDENT
的定义如下:
class STUDENT {
int total; // 总分成绩
pubic:
void get_score(); //获取一个学生的成绩
void display(); //显示一个学生的成绩
void sort (STUDENT *); //将若干学生成绩按总分从高到低排序
}
解答: #include <iostream.h>
#include <iomanip.h>
class Student{
int total;
public:
Student(int m){total=m;}
int get_score();
void display();
void sort(Student *s[3]);
};
int Student :: get_score()
{
return total;
}
void Student :: display()
{
cout << setw(6) << total << endl;
}
void Student :: sort(Student * s[3])
{
Student * t;
for (int i=0; i<3; i++)
{
for (int j=2; j>i; j--)
{
if (s[j]->get_score() > s[j-1]->get_score())
{
t=s[j];
s[j]=s[j-1];
s[j-1]=t;
}
}
}
cout << "The sorted score is: ";
for (int k=0; k<3; k++)
cout << setw(6) << s[k]->get_score();
cout << endl;
}
void main()
{
int s0, s1, s2;
cout << "Please input 3 score:" << endl;
cin>>s0>>s1>>s2;
Student *s[3];
s[0]=new Student(s0);
s[1]=new Student(s1);
s[2]=new Student(s2);
s[0]->sort(s);
}
样题8.设计一个栈操作类,该类包含入和出栈成员函数,编写程序,入栈一组数据:
(5, 2, 6, 7, 3),然后屏幕显示出栈结果。
解答: #include <iostream.h>
#include <iomanip.h>
const int size=20;
class stack{
private:
int data[size];
int top;
public:
stack(){ top=-1; }
void push(int);
int pop();
};
void stack :: push( int c)
{
if (top>=19)
cout << "stack overflow!" << endl;
else
data[++top]=c;
}
int stack :: pop()
{
if (top<=-1)
{
cout << "stack underflow!" << endl;
return NULL;
}
else
return data[top--];
}
void main()
{
stack s;
s.push(5);
s.push(2);
s.push(6);
s.push(7);
s.push(3);
for (int i=0; i<5; i++)
cout << setw(6) << s.pop();
cout << endl;
}
样题9.编写一个输入、显示学生(用类student 表示)和教师(用类teacher表示)数据的程
序,学生的数据包括:编号(NO)、姓名
(NAME)和班号(CLASS),教师的数据
包括:编号(NO)、姓名(NAME)和部门
(DEPT)。
要求将编号、姓名的输入和显
示两项操作设计成一个类person,并将
它作为student类和teacher类的基类。
解答: #include <iostream.h>
#include <string.h>
class person{
protected:
char No[5];
char Name[10];
public:
virtual void input();
virtual void show();
};
class student : public person{
private:
char Class[3];
public:
virtual void input();
virtual void show();
};
class teacher : public person{
private:
char Dept[3];
public:
virtual void input();
virtual void show();
};
void person :: input()
{
cout << "Please input NO.:" << endl;
cin >> No;
cout << "Please input NAME:" << endl;
cin >> Name;
}
void person :: show()
{
cout.setf(ios::left);
cout.width(8);
cout << "NO.:" << No << endl;
cout.width(8);
cout << "NAME:" << Name << endl;
}
void student :: input()
{
person :: input();
cout << "Please input CLASS:" << endl;
cin >> Class;
}
void student :: show()
{
person :: show();
cout.setf(ios::left);
cout.width(8);
cout << "CLASS:" << Class << endl; }
void teacher :: input()
{
person :: input();
cout << "Please input DEPT:" << endl;
cin >> Dept;
}
void teacher :: show()
{
person :: show();
cout.setf(ios::left);
cout.width(8);
cout << "DEPT:" << Dept << endl;
}
void main()
{
student stu1, stu2;
teacher tea1;
cout << "Please input 1st student's information:" << endl;
stu1.input();
cout << "Please input 2st student's information:" << endl;
stu2.input();
cout << "Please input teacher's information:" << endl;
tea1.input();
cout << endl << "STUDENT:" << endl;
stu1.show();
stu2.show();
cout << endl << "TEACHER:" << endl;
tea1.show();
}
样题10.编写一个可以删除文本文件中所有以“//”开头字符串的C++程序。
要求必
须使用C++的I/O流成员函数来完成。
解答: #include <iostream.h>
#include <fstream.h>
void main(int argc, char * argv[])
{
char ch;
if (argc!=3){
cout << "Error, You shall use this programs as: \n\t"
<< "purgefile filename1 filename2" << endl;
return;
}
ifstream myin(argv[1]);
if (!myin){
cout << "Can't open file " << argv[1] << endl;
return;
}
ofstream myout(argv[2]);
if(!myout){
cout << "Can't create file " << argv[2] << endl;
return;
}
while (myout && myin.get(ch)){
if ( ch == '/' ){
myin.get(ch);
if ( ch == '/'){
do{
} while (myin.get(ch) && ((ch!=' ')&&(ch!='\n')));
}
else {
myout.put('/');
myout.put(ch);
myin.get(ch);
do{
myout.put(ch);
} while (myin.get(ch) && ((ch !=' ')&&(ch!='\n')));
if ((ch == ' ')||(ch == '\n')){
myout.put(ch);
}
}
}
else if ((ch==' ')||(ch=='\n')) {
myout.put(ch);
}
else {
myout.put(ch);
myin.get(ch);
do{
myout.put(ch);
} while (myin.get(ch) && ((ch!=' ')&&(ch!='\n')));
if ((ch == ' ')||(ch == '\n')) {
myout.put(ch);
}
}
}
myin.close();
myout.close();
cout << "purge completed." << endl;
}
样题11.己知类test含有整型私有数据成员num,编写主程序,要求:
1) 写出test的完整定义,并含有必要的函数成员;
2) 建立长度为9、元素类型为Test的动态数组且初值为0;
3) 将各元素的值均设置为0x7FF;
4) 显示各元素的值;
5) 删除动态数组;
解答: #include <iostream.h>
#include <iomanip.h>
class test{
private:
int num;
public:
test() { num=0; }
test(int n) { num=n; }
void SetNum(int n) { num=n; }
int GetNum() { return num; }
};
void main()
{
test *ptr=new test[9];
int i;
for (i=0; i<9; i++)
ptr[i].SetNum(0x7FF);
for (i=0; i<9; i++)
cout << setw(8) << hex << ptr[i].GetNum();
cout << endl;
delete []ptr;
}“从加到乘”评析
静安区教育学院特级教师曹培英
万航渡路小学副校长张敏
万航渡路小学罗杰
张:“从加到乘”这节课,罗杰老师上得比较轻松,感觉效果蛮好的。
我们发现罗老师的教学设计很有特色,把教材用活了。
你能不能介绍一下,这节课的教学设计思路和教学活动安排的意图。
罗:“从加到乘”是数学新教材第三册第二单元中“乘法的引入”的第二课时。
这节课的主要教学目标是在上节课初步接触了几个几,会写连加算式的基础上,让学生懂得同数连加用乘法简便,会把同数连加的
算式改写成乘法算式。
知道乘法算式怎么写、怎么读,以及乘法算式中各部分的名称。
这节课的教学设计,
首先是进一步加工教材内容。
新课程理念强调不要一味地“教教材”,而是“用教材”。
“乘法的引入”这部分教材是由游乐园、几个几和从加到乘三部分组成的。
我将游乐园作为一个贯穿全课的情境,利用这个情境展开从加到乘的教学。
为此,我适当处理并拓展了教材内容。
在引入环节,借助课件让学生观察游乐园里划船的项目,数几个3来引出同数连加。
教材中是6个3,但现在的学生计算水平还是比较容易算出答案的。
于是,我一边引导学生数数有几个3,一边把6个3拓展到了10个3来进一步感知几个几。
这样,当学生要一口气报出10个3连加的算式时,当他们看到长长的板书时,明显地感到同数连加太繁了,造成一种强烈的冲突,他们迫切地想去找到用何种方法使同数连加的算式简便,为乘法的引入打好了基础。
其次是采用了自学的方法。
这节课中有关乘法的认识、读法、写法和各部分的名称,都是需要学生理解并掌握的。
我是用了看书自学的方式,让课本来告诉学生。
虽然,他们只有二年级,但是通过新教材一年多的学习,完全有能力独立看书理解。
通过课堂实际反馈,学生也的确具备了基本的自学能力。
还有就是让学生尝试把同数连加改写
成乘法。
学生看书自学后,他们是否真正理解了呢?这时,关键是让学生交流,通过表达把这些知识内化。
反馈后再通过进一步应用,引导学生把引入部分几个几的同数连加算式,改写成乘法算式。
这个过程既是一种展现数学思维的互动的过程,也是一种数学文化的渗透过程。
这个过程始终紧扣课题,帮助学生更好地理解了加号和乘号、加法和乘法的关系。
张:从实际教学效果看,你的设计思路和安排意图,得到了较好的体现。
请你再介绍一下这节课的练习设计是怎样考虑的。
特别是谈谈你在用好、用足教材方面的经验。
罗:如果认真钻研教材,找到教材内容之间的关系,我们会发现新教材中有些内容的设计是可以反复使用的。
例如,我在巩固练习层次中引导学生“找找还有什么内容求总数也可以用同数连加来表示的?”学生回到游乐园这幅图中找到了:有4个小朋友,每个小朋友手中有5个气球。
4个5,4×5=20。
后面,判断是不是同数连加的香肠图、馒头图的题目和最后把12个小圆点圈一圈,说说有几个几,并用乘法算式表示的这些题目,都是课本前面一课时几个几中的内容。
我充分利用课本资源,进行了运用和拓展。
比如,由馒头图引出了3个0。
张:这些练习设计都收到了很好的效果。
我们还是请曹老师对这节课作一些更深
入的分析。
曹:“从加到乘”这节课的成功经验,罗杰老师刚才自己总结了四点:
第一,对教材进行适当的加工,也就是在理解了教材编写意图的基础上,从教学实际出发,对教学内容作出进一步的加工、处理。
第二,采用了让学生阅读课本的方法,培养学生的学习能力。
第三,让学生尝试把同数连加改写成乘法,以此检验学生的阅读成效,是不是真正看懂了。
第四,充分利用课本资源,一题多用,一图多用,而且用的比较自然,比较有效。
这些都是其他老师可以借鉴的。
我再谈三点。
首先,从教学目标的达成来看:
这节课的主要目标是初步认识乘法,具体地说,就是初步理解乘法的含义,会写、会读乘法算式,以及知道乘法算式中各部分的名称。
其中最重要的是乘法的含义,包括对引进乘法必要性的认识,即为什么要引进乘法。
怎样让学生获得这些认识,当然,最好是让学生自己体会、感悟,而不是简单的办法就是教师讲,学生听。
那么,怎样才能让学生自己感悟呢?一个行之有效的办法就是让学生经历从加到乘的过程。
这正是这段教材和罗老师这节课最重要的一个特点。
它反映了新的课程观,即课程应当给学生提供丰富的学习经历。
由此可以看出,教材的这个课题取得非常好,凸现了学习的过程性。
老师对教材的加工,把6只小船增加到10只,可以说也是为了让学生经历更为强烈的认知冲突,便于学生感悟乘法的简便。
老师对教学的处理,引领学生边观察边数,一个3,两个3……一直到十个3,也起到了强化同数连加概念的效果。
其次,从学生的思维活动过程来看:
在这节课中,学生经历了由具体到抽象的思维过程,也就是由直观的小船,抽象成连加算式,再抽象成乘法算式。
还经历了由一般到特殊的思维过程,即由一般的几个几到几个。
再次,从数学的人文性来看:
教师采用话外音的方式,介绍了乘号的来历,乘号为什么用一个×来表示,原来,发明者认为,既然乘法是一种特殊的加法,那就把加号旋转45 °,用来表示乘,不是很好吗。
介绍这个背景知识,也可以帮助学生理解乘法与加法的关系。
可以说结合教学内容,有机地渗透数学的人文性,是这节课与众不同的一个亮点。
罗:我感到自己这节课中还有不少可以改进的地方。
例如在学生理解了同数连加可以用乘法来表示时,我原先的设计是让学生把2个3、3个3、10个3的连加算式改写成乘法算式后,一起来考虑1个3可以写成1×3,更有利于学生体会数学知识的完整性。
可当时在拍摄课堂实录的时候,一紧张把这个环节给漏了,我觉得挺遗憾的。
曹:不必遗憾。
因为认识不能一次完成。
在今天这节课上,已经出现了3个0的特殊情况。
可以了。
过分追求一节课内容上的完整,有时利少弊多。
不过在今天这节课上,如果提出1个3怎么用乘法表示,估计学生能回答。
但即使解决了这个问题,整数乘法的概念也还需要补充:0个3怎么用乘法表示。
这个问题就不适合在今天这节课上解决了。
其实,在数学的理论中,整数乘法定义为同数连加,则相同加数的个数至少是2,一个几、零个几都需要经过补充定义,才能成立。
罗:另外,由于新教材规定的“6个3”用乘法“6乘3”来表示。
这样一来,几个几的个数写在×前面,相同的加数写在×后面,用乘法表示几个几的读、写顺序都一样了。
但是,这对学生来说是全新的知识,这个内容,我感到由老师来讲,效果不太理想,但是教师不讲,学生有的就是看不出来。
这也是我在教学中遇到的问题,希望能和各位老师探讨。
张:本来可以采用画外音的方式讲出来,感觉会好一点。
总的来说,今天这节课,老师讲的是多了一些。
曹老师,你看呢?
曹:罗老师的有些语言是还可以再精练一点。
但评价一节课,并不是教师讲得越少越好。
一般来说,学生自己能理解的,就让学生讲;需要教师讲的,教师也应该讲。
同时,我们还应该考虑,该讲的,怎样讲效果更好。
以乘法的书写顺序为例,完整地大段讲解,小学生不一定能听进去。
不如改成提问。
比如,这样问:小朋友,请仔细看,写乘法算式时,6乘3与6个3,它们的顺序一样吗?必要时,还可以指着算式再问一遍。
这样比较容易使全班同学都注意到几个几的读、写顺序是一致的。
当然也可以采用画外音的方式提出问题。