资源描述
《面向对象程序设计课程设计》任务书
一、课程设计的目的与要求
1、教学目的
综合运用所学过的知识进行实际程序设计。
2、教学要求
从课程设计的目的出发,用C++编写简单的的程序,程序要求如下:
(1)算法正确,容错性能好;
(2)完成从用户需求分析、到上机编程、调试和应用等全过程。
二、课程设计的题目、内容及要求
Part 1: 小程序练习(必须全部完成)
1 函数重载
定义重载函数max3用于计算三个数的最大值(参数类型分别为int和double)。
#include <iostream>
using namespace std;
int max3(int a,int b,int c)
{
if(b>a) a=b;
if(c>a) a=c;
return a;
}
double max3(double a,double b,double c)
{
if(b>a) a=b;
if(c>a) a=c;
return a;
}
int main( )
{
int max3(int a,int b,int c);
double max3(double a,double b,double c);
int i1,i2,i3,i;
cout<<”请输入三个数:”<<endl;
cin>>i1>>i2>>i3;
i=max3(i1,i2,i3);
cout<<"i.max3="<<i<<endl;
double d1,d2,d3,d;
cin>>d1>>d2>>d3;
d=max3(d1,d2,d3);
cout<<"d.max3="<<d<<endl;
}
2 类的组合
定义point类,数据成员包括x,y,成员函数包括构造函数,拷贝构造函数和析构函数,以及setx,getx,sety,gety四个属性函数。定义line类,端点由两个point类的对象组成,包括构造函数,析构函数以及计算线段长度的函数getlength。在main函数中,定义line的对象,并输出其长度。
#include<iostream>
#include<cmath>
using namespace std;
class point
{private:
int x,y;
public:
point(int x,int y):x(x),y(y){}
point(point &p);
int getx()
{return x;}
void setx(int x)
{this->x=x;}
int gety()
{return y;}
void sety(int y)
{this->y=y;}
~point(){}
};
point::point(point &p)
{x=p.x;
y=p.y;}
class line
{private:
point p1,p2;
double len;
public:
line(point pt1,point pt2);
line(line &l);
double getlen()
{return len;}
~line(){}
};
line::line(point pt1,point pt2):p1(pt1),p2(pt2)
{double x=p1.getx()-p2.getx();
double y=p1.gety()-p2.gety();
len=sqrt(x*x+y*y);
}
line::line(line &l):p1(l.p1),p2(l.p2)
{len=l.len;}
int main()
{point po1(1,2),po2(3,4);
line line(po1,po2);
cout<<"the length of line is:"<<endl;
cout<<line.getlen()<<endl;
}
3 对象数组和函数
定义student类,数据成员包括姓名name和成绩score,成员函数包括构造函数,拷贝构造函数和析构函数。定义函数void highestscore(student s[]),输出分数最高的学生姓名和分数。在main函数中定义student s[N],调用highestscore函数,输出分数最高的学生姓名和分数。
#include<iostream>
#include<string>
const int N=3;
using namespace std;
class student
{private:
string name;
int score;
public:
student(string n="",int s=0):name(n),score(s){}
student(student &stu)
{
name=stu.name;
score=stu.score;
}
~student(){}
friend istream &operator>>(istream &is,student &stu)
{is>>stu.name>>stu.score;
return is;
}
friend void highestscore(student s[]);
};
void highestscore(student stu[])
{int i,h,t;
t=stu[0].score;
for(i=0;i<N;i++)
{if(t<stu[i].score)
{t=stu[i].score;
h=i;
}
}
cout<<"name:"<<stu[h].name<<"score:"<<stu[h].score<<endl;
}
void main()
{student s1[N];
for(int i=0;i<N;i++)
cin>>s1[i];
highestscore(s1);
}
4 静态数据成员
设计一个书类,能够保存书名、定价,所有书的本数和总价。(将书名和定价设计为普通数据成员;将书的本数和总价设计为静态数据成员)
#include<iostream>
#include<string>
using namespace std;
class book
{private:
string name;
int price,num;
static int count,sum;
public:
book(string na,int p,int n):name(na),price(p),num(n)
{
count+=num;
sum+=num*price;
}
void display()
{
cout<<"书名:"<<name<<endl;
cout<<"价格:"<<price<<endl;
cout<<"所有书的本数:"<<num<<endl;
cout<<"总价:"<<sum<<endl;
}
~book(){}
};
int book::count=0;
int book::sum=0;
void main()
{book a("c grammer",100,10),b("c++ grammer",50,6);
a.display();
b.display();
}
5 动态内存分配
定义point类,数据成员包括x,y,成员函数包括构造函数,拷贝构造函数和析构函数,以及setx,getx,sety,gety四个属性函数。在main函数中,用new和delete分配和释放N个point的数组。(N是const常量,N=10)
#include<iostream>
using namespace std;
class point
{private:
int x,y;
void setx(int x)
{this->x=x;}
void sety(int y)
{this->y=y;}
public:
point(int x=0,int y=0);
point(const point &p)
{
x=p.x;
y=p.y;
}
void setxy(int x,int y)
{setx(x);
sety(y);}
int getx()
{return x;}
int gety()
{return y;}
void showpoint()
{
cout<<"x="<<x<<" y="<<y<<endl;
}
~point(){}
};
inline point::point(int x,int y)
{
this->x=x;
this->y=y;
}
void main()
{point *pt=new point[10];
(*pt).setxy(1,2);
(*pt).showpoint();
delete []pt;
}
6 类的继承
定义一个point类,包含私有数据成员x,y,成员函数包括无参构造函数,带参构造函数,set和get属性函数。定义circle类,从point类公有派生,增加数据成员半径r,成员函数包括无参构造函数,带参构造函数,计算面积函数getarea。在main函数中定义一个circle的对象,并计算其面积。
#include<iostream>
using namespace std;
class point
{private:
int x,y;
public:
point():x(0),y(0){}
point(int x,int y):x(x),y(y){}
int getx()
{return x;}
void setx(int x)
{this->x=x;}
int gety()
{return y;}
void sety(int y)
{this->y=y;}
~point(){}
};
class circle:public point
{private:
int r;
public:
circle(int x,int y,int r):point(x,y),r(r){}
int getr()
{return r;}
void setr(int r)
{this->r=r;}
void getarea()
{cout<<"area:"<<r*r*3.14<<endl;}
};
int main()
{circle c(1,2,3);
c.getarea();
}
7 虚基类
定义vehicle类,数据成员包括私有的weight,公有的构造函数,析构函数和输出函数dispaly;从vehicle类公有派生car类,增加数据成员载人数personnum,公有的构造函数,析构函数和输出display;从vehicle类公有派生truck类,增加数据成员载货量laod,公有的构造函数,析构函数和输出函数display;从car类和truck类共同公有派生出pickup类,包括公有的构造函数和输出函数。在main函数中,定义pickup类对象,并输出其基本信息。
#include<iostream>
using namespace std;
class vehicle
{private:
int weight;
public:
vehicle(int w):weight(w){}
void display()
{
cout<<"weight:"<<weight<<endl;
}
~vehicle(){}
};
class car:virtual public vehicle
{private:
int personnum;
public:
car(int p,int w):vehicle(w),personnum(p){}
void display()
{
cout<<"personnum:"<<personnum<<endl;
}
~car(){}
};
class truck:virtual public vehicle
{private:
int load;
public:
truck(int w,int l):vehicle(w),load(l){}
void display()
{
cout<<"load:"<<load<<endl;
}
~truck(){}
};
class pickup:virtual public car,public truck
{public:
pickup(int w,int l,int p,int w1,int w2):vehicle(w),car(w1,p),truck(w2,l){}
void display(){}
};
void main()
{pickup p(10,20,30,40,50);
p.vehicle::display();
p.car::display();
p.truck::display();
p.pickup::display();
}
8 运算符重载,友元函数和this指针
定义一个计数器类counter,具备自增,自减功能(前后缀);输入输出>>,<<功能。在main函数里测试该类。
#include<iostream>
using namespace std;
class counter
{private:
double number;
public:
counter(double num=0):number(num){}
friend counter operator ++(counter &c,int);
friend counter operator --(counter &c,int);
friend counter operator ++(counter &c);
friend counter operator --(counter &c);
friend istream &operator>>(istream &is,counter &c)
{is>>c.number;
return is;
}
friend ostream &operator<<(ostream &os,counter &c)
{os<<c.number;
return os;
}
~counter(){}
};
counter operator ++(counter &c)
{ c++;
return c;
}
counter operator --(counter &c)
{ c--;
return c;
}
counter operator ++(counter &c,int)
{
counter ctemp;
ctemp=c.number;
c.number++;
return ctemp;
}
counter operator --(counter &c,int)
{counter ctemp;
ctemp=c.number;
c.number--;
return ctemp;
}
int main()
{ counter c1,c2;
cin>>c1;
c2=operator++(c1,2);
cout<<"count before:"<<c2<<" count after:"<<c1<<endl;
}
9 虚函数和抽象类
定义一个抽象类shape,包括公有的计算面积area函数,计算体积volume函数,输出基本信息函数printinfo(三个函数均为纯虚函数)。从shape公有派生point类,增加私有数据成员x,y坐标,以及构造函数,析构函数。从point公有派生circle类,增加私有数据成员半径r,以及构造函数,析构函数。从circle公有派生cylinder类,增加私有数据成员高度h,以及构造函数,析构函数。(在定义三个派生类的过程中,自己考虑需要重定义哪个虚函数)。在main函数中,定义shape类的指针,指向派生类的对象,输出三类对象的基本信息,面积,体积;(将shape指针改为引用再尝试)。
#include<iostream>
using namespace std;
class shape
{public:
virtual double area()=0;
virtual double volume()=0;
virtual void printinfo()=0;
};
class point:public shape
{ private:
int x,y;
public:
point(int x,int y):x(x),y(y){}
double area()
{return 0;}
double volume()
{return 0;}
void printinfo()
{cout<<"point:x="<<x<<",y="<<y<<endl;}
~point(){}
};
class circle:public point
{private:
int r;
public:
circle(int x,int y,int r):point(x,y),r(r){}
double area()
{return 3.14*r*r;}
void printinfo()
{cout<<"area:"<<area<<endl;}
~circle(){}
};
class cylinder:public circle
{private:
int h;
public:
cylinder(int x,int y,int r,int h):circle(x,y,r),h(h){}
double volume()
{return circle::area()*h;}
void printinfo()
{cout<<"volume:"<<volume<<endl;}
~cylinder(){}
};
void fun(shape *p)
{
p->printinfo();
}
void main()
{point p(1,1);
circle c(1,1,3);
cylinder C(1,1,3,4);
/*p.printinfo();
c.printinfo();
C.printinfo();*/
fun(&p);
fun(&c);
fun(&C);
}
10 模板
设计一个堆栈的类模板Stack,在模板中用类型参数T表示栈中存放的数据,用非类型参数MAXSIZE代表栈的大小。
#include<iostream.h>
const int Maxsize=5;
template<typename T>
class stack
{private:
T elem[Maxsize];
int top;
public:
stack()
{top=0;}
void push(T e)
{if (top==Maxsize)
{cout<<"栈已满!"<<endl;
return ;
}
elem[top]=e;
top++;
}
T pop()
{if(top==0)
{cout<<"栈空!"<<endl;
return -1;}
top --;
return elem[top];
}
};
void main()
{stack <int> s;
s.push(1);
s.push(2);
s.push(3);
s.push(4);
s.push(5);
s.push(6);
cout<<s.pop()<<endl;
}
11 文件读写
定义学生类数组,有N个人(N=5),包括姓名和语数外三名课的成绩,通过重载<<和>>运算符实现学生数组的文件读写。(姓名用string name;)
#include<iostream>
#include<fstream>
using namespace std;
class stu
{private:
char name[10];
int chi,mat,eng;
public:
stu(char s[]="",int c=0,int m=0,int e=0)
{strcpy(name,s);
chi=c;
mat=m;
eng=e;
}
friend ostream&operator<<(ostream &os,stu &s)
{os<<s.name<<" "<<s.chi<<" "<<s.mat<<" "<<s.eng<<endl;
return os;
}
friend istream&operator>>(istream &is,stu &s)
{is>>s.name>>s.chi>>s.mat>>s.eng;
return is;
}
};
const int N=5;
void main()
{ stu s[N];
int i=0;
fstream iof("c:\\student.txt",ios::out|ios::binary);
if(!iof.is_open ())
{cout<<"file open failed"<<endl;
return ;
}
else
{for(int i=0;i<N;i++)
{cin>>s[i];
cout<<s[i];
iof.write((char *)&s[i],sizeof(stu)) ;
}
iof.close ();
}
stu s1[N];
iof.open("c:\\student.txt",ios::out|ios::binary);
if(!iof.is_open())
{
return ;
}
else
{ int i=0;
iof.read((char *)&s1[i],sizeof(stu));
while(!iof.eof())
{cout<<s1[i];
i++;
iof.read((char *)&s1[i],sizeof(stu));
}
iof.close();}
}
Part 2: 小型软件的开发(选做一题,且由个人独立开发完成)
1教师通信录的设计
基本要求:
定义教师(teacher)类,其中至少包括姓名、性别、电话、地址、邮政编码、邮箱、QQ号和类别(例如:同学、朋友等)。
功能要求:
1、设计菜单实现功能选择;
2、输入功能:输入人员信息,并保存到文件中;
3、查询功能:
1)能够根据姓名、电话精确查询人员信息;
2)能够根据地址进行模糊查询人员信息;
3)根据人员类别查询人员信息
4、根据姓名对人员信息排序输出
5、能根据姓名、电话修改人员信息
6、能根据姓名、电话删除人员信息
2职工工资管理
基本要求:
定义职工(employee )类,其中至少包括姓名、性别、工号、电话、所在科室和工资。
功能要求:
1、设计菜单实现功能选择;
2、输入功能:输入职工信息,并保存到文件中;
3、查询功能:
1)能够根据工号精确查询职工信息;
2)能够根据姓名、科室查询职工信息
3)分科室进行工资统计,计算各科室的平均工资
4、根据职工的工资排序输出
5、根据工号修改职工信息
6、根据工号删除职工信息
#include<iostream>
#include<string>
using namespace std;
class employee
{private:
string name,sex,office;
int id,phone number,salary;
public:
employee()
3公司员工管理系统
基本要求:
设计一个虚基类Staff(员工),包括编号、姓名和年龄保护数据成员以及相关的成员函数;由Staff派生出工程师类Engineer包含专业和职称保护数据成员以及相关的成员函数,再由Staff派生出领导类Leader,包括职务和部门保护数据成员以及相关的成员函数;然后由Engineer和Leader类派生出主任工程师类Chairman。
功能要求:
1、增加员工数据信息
2、更新员工数据信息
3、查询员工数据信息
4、删除员工数据信息
5、良好的人际交互界面、方便操作
4三角形的种类与面积
基本要求:
定义点(point)类,包含点的坐标x和y;通过继承点类派生出线段(line)类;通过线段(line)类的组合定义三角形(triangle )类。
功能要求:
1、设计菜单实现功能选择;
2、输入三角形的三个顶点坐标;
3、判断三角形的种类(一般三角形、等腰三角形、等边三角形、直角三角形和不能构成三角形);
4、计算并输出三角形的面积 。
5字符串类的设计
基本要求:
定义点字符串(string)类,包含存放字符串的字符数组和字符串中字符的个数。
功能要求:
1、设计菜单实现功能选择;
2、字符串的输入与赋值;
3、字符串的运算,包括:
1)连接 2)复制 3)查找
4)交换 5)求子串 6)比较
4、字符串的输出
6学生成绩管理
基本要求:
定义学生(student)类,其中至少包括姓名、性别、学号、班级和四门功课的成绩。
功能要求:
1、设计菜单实现功能选择;
2、输入功能:输入学生信息,并保存到文件中;
3、计算每个学生的总分与平均分并排序
4、能根据学号修改学生信息
5、能根据学号删除学生信息
6、查询功能:
1)能够根据学号查询学生信息;
2)能够根据姓名、班级查询学生信息
3)统计学生成绩,按照班级和科目计算平均分。
7几何体的表面积与体积
基本要求:
定义一个抽象类形状(shape),包含输入基本图形的信息函数input()、显示基本图形信息函数disp()、计算表面积的函数area()、计算体积的函数volume(),它们均为纯虚函数。通过继承形状类派生出球体类、正方体类、长方体类、圆柱体类。
功能要求:
1、设计菜单实现功能选择;
2、输入各种形状信息;
3、显示各种形状信息;
4、计算各种形状的表面积;
5、计算各种形状的体积;
8学生信息管理
基本要求:
定义学生(student)类,其中至少包括姓名、性别、学号、班级和联系电话。
功能要求:
1、设计菜单实现功能选择;
2、输入功能:输入学生信息,并保存到文件中;
3、能按照学生的学号排序
4、能根据学号修改学生信息
5、能根据学号删除学生信息
6、查询功能:
1)能够根据学号查询学生信息;
2)能够根据姓名、学号、班级等查询学生信息
3)按照班级统计学生人数。
9教职工信息管理
基本要求:
定义职工(employee )类,其中至少包括姓名、性别、工号、电话、所在系部和职称。
功能要求:
1、设计菜单实现功能选择;
2、输入功能:输入职工信息,并保存到文件中;
3、查询功能:
1)能够根据工号精确查询职工信息;
2)能够根据姓名、科室查询职工信息
3)分系部进行职称统计,计算各职称的人数
4、根据职工的职称排序输出
5、根据工号修改职工信息
6、根据工号删除职工信息
10复数计算器
基本要求:
定义复数(complex )类,其中至少包括实部和虚部,对复数类实现尽可能丰富的运算。
功能要求:
1)建立复数类
2)复数信息的初始化
3)复数信息的输出
4)将复数信息保存为文件
5)求复数的绝对值
6)实现复数的加、减、乘、除、乘方、自加、自减等运算
三、源程序清单和执行结果:源程序清单中应有足够的注释。
四、课程设计完成时间:二周。
五、课程设计的成绩评定
1、 程序设计结果(30%)
2、 课程设计报告(40%)
3、 平时表现 (30%)
附:课程设计实习报告的书写格式
一、 设计题目
二、 运行环境(软、硬件环境)
三、 算法设计的思想
四、 算法的流程图
五、 算法设计分析
六、 源代码
七、 运行结果分析
八、 收获及体会
六、上机时间安排表
课程设计的时间及教师安排
专业
班级
周次
机房安排
上机时间
指导老师
软件工程
1421813-15
第16-17周
核工楼308
周三(1,2,3,4)
周四(1,2,3,4)
周五(1,2,3,4,5,6,7,8)
魏振华
许志文
15
展开阅读全文