计算机专业学期三课程设计.docx
《计算机专业学期三课程设计.docx》由会员分享,可在线阅读,更多相关《计算机专业学期三课程设计.docx(31页珍藏版)》请在冰豆网上搜索。
计算机专业学期三课程设计
《面向对象程序设计》
课
程
设
计
报
告
姓名小精灵
学号20080808
指导教师徐嘉斌
任务一...............................................................................................................................................1
一、任务内容:
...............................................................................................................1
二、设计思路...................................................................................................................2
三、实现代码...................................................................................................................2
四、运行结果及分析.......................................................................................................3
任务二...............................................................................................................................................4
一、任务内容:
...............................................................................................................4
二、设计思路...................................................................................................................5
三、实现代码...................................................................................................................5
四、运行结果及分析.......................................................................................................6
任务三...............................................................................................................................................6
一、任务内容:
...............................................................................................................6
二、设计思路...................................................................................................................7
三、实现代码...................................................................................................................7
四、运行结果及分析.......................................................................................................9
浙江理工大学科技与艺术学院机电系课程设计报告
任务一
一、任务内容:
完成内容:
按照要求设计类(根据输出设计类)
设计类就是根据数据封装的要求,抽象出适合的类。
有如下测试程序和测试程序的输出结果,要求设计类 Welcome。
(1)测试程序如下:
void main(){
Welcome we;
Welcome you(we);
you.Display();
you.Set(“Thank you.”);
cout<you.talk();
you.Display();
}
(2)测试程序的输出结果如下:
Welcome!
Thank you.
输入:
How about you?
输出:
How about you?
输入:
Fine,thank you.
输出:
Fine,thank you.
输入:
OK
All right
Goodbye!
OK
Goodbye!
Goodbye!
注:
后面 5 行为倒数第 6 行输出后接下去的输出内容。
(3)设计类 Welcome 的原则:
1)在头文件 welcome.h 中声明类
2)在 welcome.cpp 中实现类
3)使用内联函数定义 Display()函数
4)演示文件名用学号作主名。
1
浙江理工大学科技与艺术学院机电系课程设计报告
二、设计思路
由给出的代码来构造此程序。
开头部分,由 Display 输出 Welcome,再用
Get 输出被 Set 存进的 Thankyou。
利用循环函数 While 建立主体部分,输入
OK 时跳出循环。
结尾部分,因为给出的代码中建立了两个对象,所以调用析
构函数时可直接输出两个 Goodbye。
开始
Welcome
输入
OK
Y
d
inline void Display()
void Set(char a[])
char *Get()
N
输出
输出“All right
Goodbye”
void talk()
Welcome()
Welcome(const Welcome
&w)
结束
三、实现代码
//Welcome.h
#include
#include
using namespace std;
class Welcome{
private:
char d[100];
public:
inline void Display(){cout<void Set(char a[]){strcpy(d,a);};
char *Get(){return d;};
void talk();
Welcome(){};
Welcome(const Welcome &a);
~Welcome(){cout<<"Goodbye!
"<};
~Welcome()
//121-2.cpp
#include
#include
#include"Welcome.h"
using namespace std;
void main()
{
Welcome we;
Welcome you(we);
you.Display();
you.Set("Thank you.");
cout<you.talk();
you.Display();
}
2
//121-1.cpp
#include
#include
#include"Welcome.h"
浙江理工大学科技与艺术学院机电系课程设计报告
};
strcpy(d,"OK");
cout<<"All right"<cout<<"Goodbye!
"<void Welcome:
:
talk()
{
cout<<"输入:
";
cin.getline(d,100);
while(strcmp(d,"OK")!
=0)
{
cout<<"输出:
"<cout<<"输入:
";
cin.getline(d,100);
四、运行结果及分析
}
Welcome:
:
Welcome(const Welcome &a)
{
strcpy(d,a.d);
strcpy(d,"Welcome!
");
}
图 1
分析:
前面先自动输出 Welcome!
和 Thank you.,然后利用循环 While 函数重复
用户的输入。
采用了多文件结构,利用构造函数、析构函数和拷贝构造函数将
结果输出。
最后调用析构函数输出“Goodbye!
”
3
浙江理工大学科技与艺术学院机电系课程设计报告
任务二
一、任务内容:
要求:
为分数定义一个类。
分数定义为两个整数之比。
将分数表示为 int 类型
的两个值:
一个表示分子,一个表示分母。
重载输入>>和输出运算符<<,分数以 1/2、-15/29 这样的形式来输入和输
出,注意分子、分母可能包含负号。
在分数类中,还应重载+、-、*、/运算符。
应有一个函数,对分数进行约分与规格化,在规格化之后,分母一定是正
的,并且分子分母的最大分约数为 1,如对 4/-8 正规化之后表示成-1/2。
仿照计算器的运算过程,采用计算器方式进行有关分数运算。
二、设计思路
(1)约分的关键是求分子分母的最大公约数,用 Gcm(m,n)表示求 m 与 n 的
最大公约数:
当 n=0 时,Gcm(m,n)=m
当 n≠0 时,Gcm(m,n)= Gcm(n,m%n)
可用递归编程实现 Gcm(m,n)。
(2)分数的四则运算可按如下方式进行:
(3)利用 Reduction 函数将负号全都归到分子身上。
(4)Operation 函数来实现当运算符输入错误时的提示。
(5)当除数为 0 时,main 函数中有实现显示除数不能为 0 的设置。
开始
分数加法运算
分
数
计
分数减法运算
分数乘法运算
分数除法运算
输入除数、
被除数和除
号
分母为
输出“不能为除
数,请重新输入。
Y
算
异常处理报告
N
0
器
自行约分
负号转到分子
为负数加括号
输出
结束
4
浙江理工大学科技与艺术学院机电系课程设计报告
三、实现代码
#include
#include
void Operation(char &index);
using namespace std;
class Fraction
{
private:
int fz;
int fm;
int Gcm(int m,int n);
public:
Fraction(int n=1,int d=1);
~Fraction(){};
void Reduction();
int GetFz(){return fz;};
int GetFm(){return fm;};
void SetFz(int n);
void SetFm(int d);
Fraction operator+(Fraction &a);
Fraction operator-(Fraction &a);
Fraction operator*(Fraction &a);
Fraction operator/(Fraction &a);
friendostream&operator<<(ostream
&os,Fraction &s);
friendistream&operator>>(istream
&is,Fraction &s);
};
int Fraction:
:
Gcm(int m,int n)
{
if(n==0)
return m;
else return Gcm(n,m%n);
}
void Fraction:
:
Reduction()
{
if(fm<0)
{fz=-fz;fm=-fm;}
int f=Gcm(abs(fz),fm);
fz=fz/f;
fm=fm/f;
}
void Operation(char &index){
for(;;){
cout<<"请输入运算符:
";
cin>>index;
if(index=='+'||index=='-
'||index=='*'||index=='/')
break;
else
cout<<"请输入正确的运算符:
";
}
}
Fraction:
:
Fraction(int n,
int d):
fz(n),fm(d){Reduction();}
void Fraction:
:
SetFz(int n){fz=n;}
void Fraction:
:
SetFm(int d){fm=d;}
istream &operator>>(istream &is,Fraction &s)
{
char ch;
int m,n;
for(;;)
{
cout<<"请输入一个分数:
";
is>>m>>ch>>n;
s.SetFz(m);
s.SetFm(n);
if(ch=='/'&&n!
=0)
break;
else {
try{
if(ch!
='/') throw 1;
if(n==0) throw 2;
}
catch(int i) {
if(i==1)
cout<<"输入格式错误,请重
新输入!
"<
else if(i==2)
cout<<"分母为 0,请重新输入!
"<5
}
}
}
s.Reduction();
return is;
浙江理工大学科技与艺术学院机电系课程设计报告
r.fm=fm*a.fm;
r.Reduction();
return r;
}
Fraction Fraction:
:
operator*(Fraction &a)
}
ostream &operator<<(ostream &os,Fraction
&s)
{
if(s.fz<0)
{
if(abs(s.fz)%s.fm==0)
os<<"("<else if(abs(s.fz)>s.fm)
os<<"("<"<else
os<<"("<}
else{
if(s.fz%s.fm==0)
os<else if(s.fz==0)
os<<0;
else if(s.fz>s.fm)
os<又"<else
os<}
return os;
}
Fraction Fraction:
:
operator+(Fraction &a)
{
Fraction r;
r.fz=fz*a.fm+fm*a.fz;
r.fm=fm*a.fm;
r.Reduction();
return r;
}
Fraction Fraction:
:
operator-(Fraction &a)
{
Fraction r;
r.fz=fz*a.fm-fm*a.fz;
{
Fraction r;
r.fz=fz*a.fz;
r.fm=fm*a.fm;
r.Reduction();
return r;
}
Fraction Fraction:
:
operator/(Fraction &a)
{
Fraction r;
r.fz=fz*a.fm;
r.fm=fm*a.fz;
r.Reduction();
return r;
}
int main(){
Fraction obj1,obj2,r;
char index='+';
int i;
char o='y';
for(;;)
{
if(o=='y')
{
cin>>obj1;
Operation(index);
cin>>obj2;
if(index=='+')
r=obj1+obj2;
else if(index=='-')
r=obj1-obj2;
else if(index=='*')
r=obj1*obj2;
else if(index=='/')
{
6
浙江理工大学科技与艺术学院机电系课程设计报告
for(;;)
{
i=obj2.GetFz();
}
cout<if(i==0)
ndl;
{
cout<<"不能为除数,
cout<<"是否继续(y/n)";
cin>>o;
请重新输入。
"<}
cin>>obj2;
}
else break;
else break;
}
return 0;
}
r=obj1/obj2;
四、运行结果及分析
}
图 2
分析:
第一个加法运算体现了约分的功能,第二个减法运算体现了假分数的自
行转换功能,第三个乘法运算体现了给负数加括号的功能,第四个除法运算体
现了自行将分母的负号提给分子的功能,以及最后五行体现了运算符错误的提
示和分母为 0 的提示。
7
浙江理工大学科技与艺术学院机电系课程设计报告
任务三
一、任务内容:
要求:
能够对文件进行存储和读取。
要求用一个结构记载学生属性,编写一个
学生类以完成各种操作。
具体要求如下:
(1) 有 10 个小学生,每个学生有数学、语文两门课,从键盘输入学生的学号、
姓名及成绩,计算每个学生的平均成绩,将数据存入 stud.dat 中。
(2) 学生的所有属性用一个结构进行描述。
(3) 要求对“<<”、“>>”进行重载。
(4) 选作要求:
可将两门课都不及格的学生信息从链表或数组中删除,并另
存入 bad.dat 中;将学生姓名和平均成绩抽取出来。
(5) 以下程序测试结果供参考(此处不列举)
二、设计思路
建立两个类,并建立一个 for 循环来实现菜单的选择功能。
使用链表储存
输入的信息,当选择查找与删除数据时,通过链表来寻找用户要寻找的数据。
菜
单
菜单功能选择
增加原始记录
显示各种文件
保存原始文件
查找学生成绩
开始
功能选择
输入
学生信息
删除原始记录
输入 0?
N
修改学生信息
Y
结束程序运行
结束
8
浙江理工大学科技与艺术学院机电系课程设计报告
三、实现代码
# include
# include
# include
#include
using namespace std;
class Student
{
public:
char name[20];
char Id[20];
int Cnum;
int Mnum;
int sum;
Student * Next;
void Input()
{
cout<<"\t\t 名字:
"; cin>>name;
cout<<"\t\t 学号:
"; cin>>Id;
cout<<"\t\t 数学:
"; cin>>Cnum;
cout<<"\t\t 语文:
"; cin>>Mnum;
sum=(Cnum+Mnum)/2;
}
void ReadFile(istream & in)
{
in>>name>>Id>>Cnum>>Mnum>>sum; }
void Show()
{
cout<<};
class Studentmassage
{
public:
Studentmassage();
~Studentmassage();
void ShowMenu();
void Find();
void Save();
void ModifyItem();
void RemoveItem();
void Swap(Student *,Student *);
void Sort();
int ListCount();
void Display()
{
cout<<"姓名\t 学号\t 语文\t 数学\t 平均
"<for(Student * p=Head-
>Next;p!
=End;p=p->Next)
p->Show();
cout<<"请按任意键";
getch();
}
void AddItem()
{
End->Input();
End->Next=new Student;
End=End->Next;
cout<<"添加成功!
"<cout<<"请按任意键";
getch();
}
private:
Student * Head,* End;
ifstream in;
ofstream out;
Student *FindItem(char * name)
{
for(Student * p=Head;p-
>Next!
=End;p=p->Next)
if(!
strcmp(p->Next->name,name))return
p;
return NULL;
}
Student *FindID(char * Id)
{
for(Student * p=Head;p-
>Next!
=End;p=p->Next)
if(!
strcmp(p->Next->Id,Id))return p;
9
return NULL;
}
浙江理工大学科技与艺术学院机电系课程设计报告
cout<<"6.修改学生信息"<cout<<"0.结束程序运行"<};
Studentmassage: