面向对象的程序设计课程设计报告

更新时间:2023-09-10 05:03:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

面向对象的程序设计

课程设计报告

姓 名: 学 号: 班 级: 院 系:

日 期:

一.设计目的

课程设计是课程教学中的一项重要内容,是完成教学计划达到教学目标的重要环节,是教学计划中综合性较强的实践教学环节,它对帮助学生全面牢固地掌握课堂教学内容、培养学生的实践和实际动手能力、提高学生全面素质具有很重要的意义。

本次课程设计通过设计和实现几个应用程序,达到以下目标: 1.使学生能够比较熟练地掌握C++语言的基本语法规则;

2.熟练掌握基本的面向对象的程序设计方法,如类的实现、创建类的实例—对象、实现类的继承等;

3.掌握各种面向对象的程序设计技术,如继承和派生,虚继承、虚函数、抽象类、多态的实现、运算符重载、使用C++标准库等;

4.掌握在VC++平台上进行程序设计和调试的方法。

二.内容及要求

1.内容与功能要求

题目一:通过组合和派生构成新的类

本设计题目的任务是使用Point类产生Line类。分别通过组合类及派生类两种方法实现,并要求分别给出使用类模板实现的程序。

本设计题的目的是使学生掌握在不同的实现方法中,如何设计相应的构造函数和拷贝构造函数,进一步理解程序调用它们及析构函数的执行顺序,掌握组合类和派生类。另外本设计题目要让学生进一步掌握和理解类模板的技术及其实现方法。

题目二:人员信息管理系统

设计题目:本设计题目的任务是设计一个人员信息管理系统,并使用虚函数实现多态性,完成显示不同人员信息的任务。

设计要求:设计employee类,用来存储雇员的编号,级别,月薪等信息,能够对其进行操作和显示。

以employee为基类派生出technician类,表示兼职技术人员,以及manager类,表示经理,以及salesman类,表示兼职推销员。利用manage类和salesman类派生出salesmanager类,表示销售经理。注意使用虚基类。

2

题目三:学生考勤管理系统

设计题目:在学生考勤管理系统中,考勤信息记录了学生的缺课情况,它包括:缺课日期、第几节课、课程名称、学生姓名、缺课类型(迟到、早退、请假及旷课)。系统功能包括信息录入、修改、查询、统计等。

设计要求:录入学生的缺课记录; 修改某个学生的缺课记录;查询某个学生的缺课情况;统计某段时间内,旷课学生姓名及旷课次数,按旷课次数由多到少排序;间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序;

2.软件开发环境

Windows 7,Visual C++6.0

统计某段时3

第一题 通过组合和派生构成新的类

1.设计思路

本题目的任务是使用Point类产生Line类。分别通过组合类及派生类两种方法实现,并要求分别给出使用类模板实现的程序。

本题目的目的是使学生掌握在不同的实现方法中,如何设计相应的构造函数和拷贝构造函数,进一步理解程序调用它们及析构函数的执行顺序,掌握组合类和派生类。另外本设计题目要让学生进一步掌握和理解类模板的技术及其实现方法。

2.程序详细代码及描述

(1)//cpp1.h头文件

#if !defined(CPP1_H) #define CPP1_H

#include #include class Point{ double X,Y; public: Point(double=0,double=0); Point(Point&); void Display() {cout<<\ double Distance(Point&); double Getx(){return X;} double Gety(){return Y;} ~Point(); };

struct Cow{ int Color; int Width; };

class Line{ Point a,b; Cow cw; public: Line(Point&,Point&,Cow&);

double Display(Line&); Line(Line&);

4

~Line();

#endif

(2)//cpp1.cpp文件 #include \

Point::Point(double a,double b):X(a),Y(b) {cout<<\调用Point的构造函数\Point::Point(Point&a)

{X=a.X;Y=a.Y;cout<<\调用Point复制函数\Point::~Point()

{cout<<\double Point::Distance(Point&a) { return sqrt((X-a.X)*(X-a.X)+(Y-a.Y)*(Y-a.Y)); }

Line::Line(Point&a1,Point&a2,Cow&a3):a(a1),b(a2),cw(a3) {cout<<\调用Line的构造函数\Line::Line(Line&s):a(s.a),b(s.b),cw(s.cw)

{cout<<\调用Line的复制构造函数\Line::~Line()

{cout<<\double Line::Display(Line&a) { a.a.Display(); a.b.Display(); cout<<\ double x=a.a.Getx()-a.b.Getx(); double y=a.a.Gety()-a.b.Gety(); return sqrt(x*x+y*y); }

void main() { Point a; Point b(5.2,11.8),c(38.9,85.6) a=c; cout<<\两点之距为:\ Cow cw={3,5}; Line s(a,b,cw); Line s1(s); cout<

使用模板的方法 (1)//cpp11.h文件 #if !defined(cpp11_H)

5

#define cpp11_H

#include #include //声明Point类 template class Point{ T X,Y; public: Point(T=0,T=0); Point(Point&); void Display() {cout<<\ T Distance(Point&); ~Point(); T Getx(){return X;} T Gety(){return Y;} };

//声明结构 struct Cow{ int Color; int Width; };

//实现Point类 template

Point::Point(T a,T b):X(a),Y(b){cout<<\调用Point的构造函数\template

Point::Point(Point&a)

{X=a.X;Y=a.Y;cout<<\调用Point的复制构造函数\template

T Point::Distance(Point&a) { return sqrt((X-a.X)*(X-a.X)+(Y-a.Y)*(Y-a.Y)); }

template Point::~Point() { cout<<\}

//声明Line类

template class Line

6

{ Point a,b; Cow cw; public: Line(Point&,Point&,Cow&); Line(Line&); T Display(Line&); ~Line(); };//实现Line类

template

Line::Line(Point&a1,Point&a2,Cow&a3):a(a1),b(a2),cw(a3) {cout<<\调用Line的构造函数\

template

Line::Line(Line&s):a(s.a),b(s.b),cw(s.cw) {cout<<\调用Line的复制构造函数\

template Line::~Line()

{cout<<\

template

T Line::Display(Line&a) { a.a.Display(); a.b.Display(); T x=a.a.Getx()-a.b.Getx(); T y=a.a.Gety()-a.b.Gety(); return sqrt(x*x+y*y); }

#endif

(2)//cpp11.cpp文件 #include \void main() { Point a;

Point b(5.2,11.8),c(38.9,85.6) a=c; cout<<\两点之距为:\ Cow cw={3,5}; Lines(a,b,cw); Line s1(s); cout<

7

}

使用继承的方法 (1)cpp13.h文件

#if !defined(PP13_H) #define CPP13_H #include #include //using namespace std; class Point{ double X,Y; public:

Point(double=0,double=0); Point(Point&);

void Display(){cout<<\double Distance(Point&);

~Point(){cout<<\ \double Getx(){return X;} double Gety(){return Y;} };

struct Cow{ int Color; int Width; };

class Line:public Point {

double X2,Y2; Cow cw; public:

Line(double,double,double,double,Cow&); Line(Line&);

double Display(Line&);

~Line(){cout<<\}; #endif

(2)cpp13.cpp文件 #include\

Point::Point(double a,double b):X(a),Y(b) {cout<<\调用Point的构造函数\Point::Point(Point&a)

{X=a.X;Y=a.Y;cout<<\调用Point的复制构造函数\inline double Point::Distance(Point&a) {

return sqrt((X-a.X)*(X-a.X)+(Y-a.Y)*(Y-a.Y));

8

}

Line::Line(double a1,double a2,double a3,double a4,Cow&c):Point(a1,a2),X2(a3), Y2(a4),cw(c) {

cout<<\调用Line的构造函数\}

Line::Line(Line&s):Point(s),X2(s.X2),Y2(s.Y2),cw(s.cw) {

cout<<\调用Line的复制构造函数\}

double Line::Display(Line&a) {

Point::Display();

cout<<\

cout<<\double x=X2-Getx(); double y=Y2-Gety(); return sqrt(x*x+y*y); }

void main() {

Point a;

Point b(5.2,11.8),c(38.9,85.6); a=c;

cout<<\两点之距为:\Cow cw={3,5};

Line s(5.2,11.8,38.9,85.6),cw); Line s1(s);

cout<

cout<<\基类对象的属性\a.Display(); a=s;

cout<<\派生类的对象赋给基类对象\a.Display();

cout<<\派生类的对象赋给基类的指针:\Point &d=s1; d.Display(); }

使用模板继承的方法 (1)cpp14.h文件 #if !defined(CPP14_H) #define CPP14_H #include

9

#include template class Point {

T X,Y; public:

Point(T=0,T=0); Point(Point&);

void Display(){cout<<\double Distance(Point&); T Getx(){return X;} T Gety(){return Y;}

~Point(){cout<<\};

template

Point::Point(T a,T b):X(a),Y(b)

{cout<<\调用Point的构造函数\template

Point::Point(Point&a)

{X=a.X;Y=a.Y;cout<<\调用Point的复制构造函数\template

double Point::Distance(Point&a) {

return sqrt((X-a.X)*(X-a.X)+(Y-a.Y)*(Y-a.Y)); }

struct Cow{ int Color; int Width; };

template

class Line:public Point{ T X2,Y2; Cow cw; public:

Line(T,T,T,T,Cow&); Line(Line&);

double Display(Line&);

~Line(){cout<<\};

template

Line::Line(T a1,T a2,T a3,T a4,Cow&c):Point(a1,a2),X2(a2),Y2(a4),cw(c) {

cout<<\调用Line的构造函数\}

10

template

Line::Line(Line&s):Point(s),X2(s.X2),Y2(s.Y2),cw(s.cw) {

cout<<\调用Line的复制构造函数\}

template

double Line::Display(Line&a) {

Point::Display();

cout<<\

cout<<\double x=X2-Getx(); double y=Y2-Gety(); return sqrt(x*x+y*y); }

#endif

(2)cpp14.cpp文件 #include \void main() {

Pointa;

Point b(7.8,9.8),c(34.5,67.8); a=c;

cout<<\两点之距为:\Cow cw={3,5};

Lines(7.8,9.8,34.5,67.8,cw); Lines1(s);

cout<

cout<<\基类的对象属性:\a.Display(); a=s;

cout<<\派生类对象赋给基类对象:\a.Display();

cout<<\派生类指针赋给基类指针:\Point*p=&s1; p->Display();

cout<<\基类对象引用派生类对象:\Point &d=s1; d.Display(); }

4.运行结果及分析

11

(1)用包含的方法构成的新类

(2)使用模板的方法构成的新类

(3)通过继承的方法构成的新类

12

(4)通过模板继承的方法构成的新类

程序完成了实验要求。

13

第二题 人员信息管理系统

1.设计思路

本题目的任务是设计一个人员信息管理系统,并使用虚函数实现多态性,完成显示不同人员信息的任务。

设计employee类,用来存储雇员的编号,级别,月薪等信息,能够对其进行操作和显示。

以employee为基类派生出technician类,表示兼职技术人员,以及manager类,表示经理,以及salesman类,表示兼职推销员。利用manage类和salesman类派生出salesmanager类,表示销售经理。注意使用虚基类。

2.程序详细代码及描述 #include #include #include #include

//全局数据,对象 double ManagerSalary; //经理固定月薪 double SalesManagerSalary; //销售经理固定月薪 double SalesManagerPercent; //销售经理提成% double SalesPercent; //兼职推销员提成% double WagePerHour; //兼职技术人员小时工资 int ID; //员工标识

class Employee //员工类 {

protected:

int No; //编号 char Name[20]; //姓名 int Birthday; //生日 char Specialty[20]; //特长 char Bloodtype; //血型

int Attend; //加入公司时间 int Duty; //岗位 double Earning; //收入 Employee *next; public:

Employee(char ID,char *Name,int Duty) {

14

this->Duty=Duty;

strcpy(this->Name,Name); this->No=ID; }

virtual void CalcSalary()=0; virtual void Output()=0; friend class Company; };

class Manager:public Employee //经理类 {

public:

Manager(char ID,char *Name,int Duty):Employee(ID,Name,Duty){} void CalcSalary(){Earning=ManagerSalary;} void Output() {

CalcSalary();

cout<

class SalesManager:public Employee //销售经理类 {

private:

double Amount; public:

SalesManager(char ID,char *Name,int Duty):Employee(ID,Name,Duty){} void SetAmount(double s) {

Amount=s; }

void CalcSalary() {

Earning=SalesManagerSalary+Amount*SalesManagerPercent/100; }

void Output() {

CalcSalary();

cout<

class Technician:public Employee //兼职技术人员类 {

15

private: double t; public:

Technician(char ID,char *Name,int Duty,double T):Employee(ID,Name,Duty) {

this->t=T; }

double GetT() {

return t; }

void SetT(double T) {

this->t=T; }

void CalcSalary() {

Earning=WagePerHour*t; }

void Output() {

CalcSalary();

cout<

class Salesman:public Employee //兼职推销员类 {

private:

double Amount; public:

Salesman(char ID,char *Name,int Duty,double Amount):Employee(ID,Name,Duty) {

this->Amount=Amount; }

double GetAmount() {

return Amount; }

void SetAmount(double Amount) {

this->Amount=Amount; }

void CalcSalary()

16

{

Earning=SalesPercent/100*Amount; }

void Output() {

CalcSalary();

cout<

class Company //{

private:

Employee *Worker; // void Clear(); //public: Company() {

Worker=0; Load(); }

~Company() {

Employee *p; p=Worker; while(p) {

p=p->next; delete Worker; Worker=p; }

Worker=0; }

void Add(); // void Delete(); // void Modify(); // void Query(); // void Set(); // void Save(); // void Load(); //};

void Company::Clear() //{

公司类 员工表 清除内存中数据 增加人员 删除人员 修改人员 查询人员 基础数据设置 数据存盘 数据载入 清除内存中人员数据 17

Employee *p=Worker; while(p) {

Worker=p->next; delete p; p=Worker; } }

void Company::Add() {

Employee *p; //新结点指针 int Duty; char Name[20]; int Birthday;

char Specialty[20]; char Bloodtype; int Attend;

double Amount,T;

cout<<\新增员工 ##\\n\输入员工信息

ID++;

cout<<\输入岗位(1-经理2-销售经理3-兼职推销员4-兼职技术人员):\ cin>>Duty;

cout<<\输入姓名:\ cin>>Name;

cout<<\输入生日:\ cin>>Birthday; cout<<\输入特长:\ cin>>Specialty; cout<<\输入血型:\ cin>>Bloodtype;

cout<<\输入加入公司时间:\ cin>>Attend; if(Duty==3) {

cout<<\本月销售额:\ cin>>Amount; }

else if(Duty==4) {

cout<<\本月工作小时数(0-174):\

18

cin>>T; }

//创建新员工结点 switch(Duty) {

case 1:p=new Manager(ID,Name,Duty); break;

case 2:p=new SalesManager(ID,Name,Duty); break; case 3:p=new Salesman(ID,Name,Duty,Amount); break; case 4:p=new Technician(ID,Name,Duty,T); break; }

p->next=0;

// if(Worker) // {

Employee *p2; p2=Worker;

while(p2->next) // {

p2=p2->next; }

p2->next=p; // }

else // {

Worker=p; // } }

void Company::Delete() //{

int No;

cout<<\删除员工 ##\\n\ cout<<\

// Employee *p1,*p2; p1=Worker; while(p1) {

if(p1->No==No) break; else {

员工结点加入链表 若已经存在结点 查找尾结点 连接 若不存在结点(表空) 连接 删除人员 查找要删除的结点 19

p2=p1;

p1=p1->next; } }

//删除结点 if(p1!=NULL) //若找到结点,则删除 {

if(p1==Worker) //若要删除的结点是第一个结点 {

Worker=p1->next; delete p1; }

else // {

p2->next=p1->next; delete p1; }

cout<<\找到并删除\\n\ }

else // cout<<\未找到此员工!\\n\}

void Company::Modify() {

int No,Duty; char Name[20]; int Birthday;

char Specialty[20]; char Bloodtype; int Attend;

double Amount,T;

cout<<\修改员工 ##\\n\ cout<<\ cin>>No;

// Employee *p1,*p2; p1=Worker; while(p1) {

if(p1->No==No)

若要删除的结点是后续结点 未找到结点 查找要修改的结点 20

}

else if(yn=='n') exit(0); else

goto c3;

3.运行结果及分析 (1)主界面

(2)显示全部学生记录(这个记录可提前保存在命名为“data”的文本文件中)

(3)录入学生缺课记录

(3)寻找学生考勤记录

41

(4)修改学生考勤记录

(5)删除学生考勤记录

42

(6)查看一段时间学生考勤统计

程序完成了题目说要求实现的功能。

43

三.C++课程设计总结

通过这次实训,增加了我学习软件技术的兴趣,虽然还不明确软件技术包含的具体内容,但从C语言这门课程开始,已发现程序设计的乐趣,在学习C语言的过程中也学到了许多计算机应用基础知识,对计算机的机体也有了一个大体的了解。

以我现在的水平来编写这样一个“大”程序,如果是刚学C++时我绝对不敢相信我能完成。但经过对编程的这么长时间的学习和实践,以及对C的了解和对C++的掌握我发现C++其功能丰富、运用灵活、兼具低高级语言与面向对象程序设计方法的优点,具有繁多的数据类型和复杂、灵活多变的语法结构,常言道,万事开头难。C++程序设计是一门高度抽象的课程,很多内容只可意会,很难言传。在学习过程中是很枯燥无味的,没有一定的毅力与恒心很难坚持下去。这需学生很好地入门,要认知该课程的重要性与实用性,提高学习的兴趣,培养自己的自信心。这样我们才会有兴趣、有信心去学好它,在学习过程中既要有不屈不挠的精神,勇攀高峰的勇气,持久的恒心,又要有不怕失败毅力,只有这样我们在学习过程中不断成长。

比如说在写学生考勤管理系统时,遇到了修改方面的问题。程序不能判断使用者输入信息在格式上的正确形式,这样造成了修改信息时格式的错误,使查询信息时得到错误信息。所以在改进时想了很久,最终想出了一条判断时间格式的语句“bool timechk(string t1)”,避免了使用者不小心输入错误日期格式的错误。在进行第二题设计时遇到了很大的难题,比如员工信息查询不能很好的解决,我对这个系统的功能不断地进行完善,使它可以实现更多的功能。 虽然刚开始当然会遇到很大的阻力和困难,而且在实际操作过程中难免还会犯很多错误,但是,自己也从中获得了不小的收获,使自己的知识更加巩固。当程序运行成功的那一刻,我品尝到了那久违的喜悦,也许这就是成功吧,这也成为了我不断前进的动力,使我一步步向前走去。

44

在编写程序的过程中,痛苦与喜悦交织,让我很难忘记这段记忆。在具体操作中对这学期所学的C,C++的理论知识得到巩固,达到实训的基本目的,也发现许多自己的不足之处,在以后的上机中应更加注意,同时体会到C,C++语言具有的语句简洁,使用灵活,执行效率高等特点。编程时,需要不断地查阅各种相关书籍,在这翻阅书籍的过程中,进一步的了解了C与C++的联系与区别,让自己运用这两种编程语言时更加的得心应手,大大的提高了编写程序的效率,同时也缩短了编写时间。发现上机实训的重要作用,特别是对循、链表、函数调用、指针、结构体应用、字符串等有了更加深刻的认识和理解。通过实际操作,学会运用 C、C++语言程序编程的基本步骤、基本方法,运用多种算法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。深刻体会到“没有做不到的,只有想不到的”, “实践是检验真理的标准”,“不耻下问”??的寓意。

我希望以后能够多进行类似的实训,延长时间,让我们能够学以致用,多编写一些小巧而实用的程序,使我们能够更加发挥出自己的实力,培养学生独立思考问题并解决问题的能力,开拓学生思维,提高实际操作水平。

四.参考文献

【1】董正言,面向程序对象设计(C++版)

【2】刘燕君,刘振安,张一叶 C++程序设计,课程设计

45

break; else {

p2=p1;

p1=p1->next; } }

//修改结点 if(p1!=NULL) //若找到结点 {

p1->Output();

cout<<\调整岗位(1-经理2-销售经理3-兼职推销员4-兼职技术人员):\ cin>>Duty;

if(p1->Duty!=Duty) //若岗位发生变动 {

cout<<\输入姓名:\修改其它数据 cin>>Name; if(Duty==3) {

cout<<\本月销售额:\ }

else if(Duty==4) {

cout<<\本月工作小时数(0-174):\ cin>>T; }

//创建新员工结点 Employee *p3; switch(Duty) {

case 1:p3=new Manager(p1->No,Name,Duty); break;

case 2:p3=new SalesManager(p1->No,Name,Duty); break; case 3:p3=new Salesman(p1->No,Name,Duty,Amount); break; case 4:p3=new Technician(p1->No,Name,Duty,T); break; }

//员工结点替换到链表 p3->next=p1->next;

if(p1==Worker) //若要替换的结点是第一个结点 Worker=p3;

else //若要删除的结点是后续结点 p2->next=p3;

21

//删除原来的员工结点 delete p1; }

else //若岗位没有变动 {

cout<<\输入姓名:\ cin>>p1->Name; cin>>p1->Birthday; cin>>p1->Specialty; cin>>p1->Bloodtype; cin>>p1->Attend; if(Duty==3) {

cout<<\本月销售额:\ cin>>Amount;

((Salesman *)p1)->SetAmount(Amount); }

else if(Duty==4) {

cout<<\本月工作小时数(0-174):\ cin>>T;

((Technician *)p1)->SetT(T); } }

cout<<\修改成功!\\n\ }

else // cout<<\未找到!\\n\}

void Company::Query() {

cout<<\查询人员本月销售信息 ##\\n\

double sum=0; // Employee *p=Worker; while(p) {

if(p->Duty==3)sum+=((Salesman *)p)->GetAmount(); p=p->next; }

p=Worker;

未找到结点 销售额总和 22

double sum2=0; //工资总和 while(p) {

if(p->Duty==2)((SalesManager *)p)->SetAmount(sum); p->Output();

sum2+=p->Earning; p=p->next; }

cout<<\本月盈利:\ cout<<\按照30%利润计算)\\n\}

void Company::Set() {

cout<<\设置基础数据 ##\\n\

cout<<\经理固定月薪[\元]:\cin>>ManagerSalary;

cout<<\销售经理固定月薪[\元]:\cin>>SalesManagerSalary;

cout<<\销售经理提成[\%]:\cin>>SalesManagerPercent;

cout<<\兼职推销员提成[\%]:\cin>>SalesPercent;

cout<<\兼职技术人员小时工资[\元/小时)]:\cin>>WagePerHour;

cout<<\员工标识[>=\cin>>ID; }

void Company::Save() //{

ofstream fEmployee,fBase; char c;

cout<<\保存人员和基础数据,是否继续?[Y/N]:\ if(toupper(c)!='Y')return;

//号、姓名、岗位

fEmployee.open(\ Employee *p=Worker; while(p) {

数据存盘 保存人员编23

fEmployee<No<<\ if(p->Duty==3)

fEmployee<<((Salesman*)p)->GetAmount()<<\ else if(p->Duty==4)

fEmployee<<((Technician *)p)->GetT()<<\ fEmployee<next; }

fEmployee.close();

//保存基础数据 fBase.open(\

fBase<<\经理固定月薪\\t\

fBase<<\销售经理固定月薪\\t\ fBase<<\销售经理提成%\\t\ fBase<<\兼职推销员提成%\\t\ fBase<<\兼职技术人员小时工资\\t\ fBase<<\ fEmployee.close();

cout<<\保存人员和基础数据已经完成...\\n\}

void Company::Load() //数据载入 {

//基础数据装入 ifstream fBase;

char buf[80]; //buf用于保存数据文件中的注释字符串 fBase.open(\

fBase>>buf>>ManagerSalary; //经理固定月薪 fBase>>buf>>SalesManagerSalary; //销售经理固定月薪 fBase>>buf>>SalesManagerPercent; //销售经理提成% fBase>>buf>>SalesPercent; //兼职推销员提成% fBase>>buf>>WagePerHour; //兼职技术人员小时工资 fBase>>buf>>ID; //员工标识 fBase.close();

//清除内存人员数据 Clear();

//人员数据数据装入 ifstream fEmployee; Employee *p=Worker;

int No; char Name[20]; int Duty; double Amount,T;

24

fEmployee.open(\

//读一条记录 fEmployee>>No>>Name>>Duty; if(Duty==3)fEmployee>>Amount; else if(Duty==4)fEmployee>>T;

while(fEmployee.good()) {

// switch(Duty) {

case 1:p=new Manager(No,Name,Duty); break;

case 2:p=new SalesManager(No,Name,Duty); break; case 3:p=new Salesman(No,Name,Duty,Amount); break; case 4:p=new Technician(No,Name,Duty,T); break; }

p->next=0;

// if(Worker) // {

Employee *p2; p2=Worker;

while(p2->next) // {

p2=p2->next; }

p2->next=p; // }

else // {

Worker=p; // }

// fEmployee>>No>>Name>>Duty; if(Duty==3)fEmployee>>Amount; else if(Duty==4)fEmployee>>T; }

fEmployee.close();

cout<<\人员和基础数据已经载入...\\n\

创建员工结点 员工结点加入链表 若已经存在结点 查找尾结点 连接 若不存在结点(表空) 连接 读下一条记录 25

}

void main() {

char c; Company a; do {

cout<<\ cout<<\公司人员信息管理系统+++++++ \\n\ cout<<\基础数据设置\\n\ cout<<\增加人员\\n\ cout<<\修改人员\\n\ cout<<\删除人员\\n\ cout<<\查询本月经营情况\\n\ cout<<\数据载入\\n\ cout<<\数据存储\\n\ cout<<\退出\\t请选择(1-8):\

cin>>c; switch(c) {

case '1': a.Set(); break; case '2': a.Add();break; case '3': a.Modify();break; case '4': a.Delete(); break; case '5': a.Query(); break; case '6': a.Load(); break; case '7': a.Save(); break; }

}while(c!='8'); }

3.运行结果及分析 (1)进入界面

26

(2)基础数据设置

(3)增加人员

(4)修改人员

(5)查询本月经营情况

27

程序完成了设计的要求。

第三题 学生考勤管理系统

1.设计思路

在学生考勤管理系统中,考勤信息记录了学生的缺课情况,它包括:缺课日期、第几节课、课程名称、学生姓名、缺课类型(迟到、早退、请假及旷课)。系统功能包括信息录入、修改、查询、统计等。

28

本题设计的程序功能包括:录入学生的缺课记录; 修改某个学生的缺课记录;查询某个学生的缺课情况;统计某段时间内,旷课学生姓名及旷课次数,按旷课次数由多到少排序; 统计某段时间内,有学生旷课的课程及旷课人次,按旷课人次由多到少排序;

2.详细代码及描述 #include #include #include #include #include using namespace std;

const int max=100; //声明一个常量型变量

class record //创建record类 {

public: //类的公有成员 void set(string d,int cno,string c,string s,int type) {

date.assign(d); cname.assign(c); sname.assign(s); this->cno=cno; this->type=type; }

void set(record re) {

date.assign(re.date); cname.assign(re.cname); sname.assign(re.sname); this->cno=re.cno; this->type=re.type; }

string tostr() {

string s; //创建并初始化一个字符串 char tmp[3]; s.assign(date); itoa(cno,tmp,10); s.append(\ s.append(tmp); s.append(\

29

s.append(cname); s.append(\ s.append(sname); itoa(type,tmp,10); s.append(\ s.append(tmp); return s; }

string date,cname,sname; int cno,type; };

class records {

public:

records() {

r=new record[max]; n=0; }

void order_s() // {

string *s=new string[n]; int *c=new int [n];

s[0].assign(r[0].sname); c[0]=1;

int k=1,flag;

for(int i=1;i

flag=0;

for(int j=0;j

c[j]++; flag=1; break; } if(!flag) {

s[k]=r[i].sname; c[k++]=1; } }

for(i=1;i

统计一段时间内学生旷课的名字及次数 30

for(int j=i;j>0;j--) {

if(c[j]>c[j-1]) {

int tmp=c[j]; c[j]=c[j-1]; c[j-1]=tmp;

string stmp=s[j]; s[j]=s[j-1]; s[j-1]=stmp; } }

cout<<\学生名字 次数\ for(i=0;i

cout<

void order_c() //统计一段时间内旷课课程的名字及人数 {

string *s=new string[n]; int *c=new int [n];

s[0].assign(r[0].cname); c[0]=1;

int k=1,flag;

for(int i=1;i

flag=0;

for(int j=0;j

c[j]++; flag=1; break; } if(!flag) {

s[k]=r[i].cname; c[k++]=1; } }

for(i=1;i

for(int j=i;j>0;j--) {

if(c[j]>c[j-1])

31

{

int tmp=c[j]; c[j]=c[j-1]; c[j-1]=tmp;

string stmp=s[j]; s[j]=s[j-1]; s[j-1]=stmp; } }

cout<<\课程名称 人数\ for(i=0;i

cout<

record *r; int n; };

void wt(records *r) {

ofstream outf(\打开data.txt文件并可以向文件里写入内容 for(int i=0;in;i++)

outf<r[i].tostr()<

void rd(records *r) //寻找某个学生的考勤记录 {

ifstream inf(\读取data.txt文件内容 if(inf.eof()) {

cout<<\这个记录是空的!\ return; }

string t1,t3,t4; char tmp[30]; int t2,t5; r->n=0;

while(true) //如果寻找的这个记录存在,则根据下面形式读取 {

inf.getline(tmp,10,'#'); if(tmp[0]=='!') break;

t1.assign(tmp);

32

inf.getline(tmp,3,'#'); t2=atoi(tmp);

inf.getline(tmp,30,'#'); t3.assign(tmp);

inf.getline(tmp,30,'#'); t4.assign(tmp); inf.getline(tmp,3); t5=atoi(tmp);

r->r[r->n++].set(t1,t2,t3,t4,t5); } }

bool timechk(string t1) //判断日期的格式 {

int year=atoi(t1.substr(0,2).c_str()); int month=atoi(t1.substr(2,2).c_str()); int day=atoi(t1.substr(4,2).c_str());

if(!(t1.length()==6&&year>0&&year<99&&month>0&&month<13&&day>0&&day<32)) {

cout<<\日期没有被输入正确,请再输入一遍.\ return false; } else

return true; }

void input(records *r) //新录入缺勤学生的记录 {

string t1,t3,t4; int t2,t5,flag=0; char yn;

cout<<\录入学生的缺课记录:\m1:

cout<<\请输入日期,比如 100912:\ cin>>t1;

if(!(timechk(t1))) //判断日期是否输入正确,错误则重新输入 goto m1; m2:

cout<<\请输入节次:\ cin>>t2;

if(t2<1||t2>10) //判断节次是否正确输入 {

cout<<\节次没有被输入正确,请重新输入.\ goto m2;

33

}

cout<<\请输入课程名称:\ cin>>t3;

cout<<\请输入学生的名字:\ cin>>t4; m3:

cout<<\请输入缺席的类型:\\n(1.迟到 2.早退 3.请假 4.旷课) \ cin>>t5;

if(t5<1||t5>4) {

cout<<\类型没有被输入正确,请重新输入. \ goto m3; }

for(int i=0;in;i++)

if(r->r[i].date==t1&&r->r[i].cno==t2&&r->r[i].cname==t3&&r->r[i].sname==t4&&r->r[i].type==t5) {

cout<<\这个数据已经存在记录中,是否保存新的记录: (y/n) \n1:

cin>>yn; if(yn=='y') break;

else if(yn=='n') goto n2; else

goto n1; }

r->r[r->n++].set(t1,t2,t3,t4,t5); n2:

cout<<\是否继续录入学生考勤记录? (y/n) \n3:

cin>>yn; if(yn=='y') goto m1; else if(yn=='n') {

cout<<\保存? (y/n) \ cin>>yn;

if(yn=='y')wt(r); else

return; } else

34

goto n3; }

void prione(record r) //修改考勤记录中的类型 {

cout<

<

case 1:

cout<<\迟到\ break; case 2:

cout<<\早退\ break; case 3:

cout<<\请假\ break; case 4:

cout<<\旷课\ break; default:; } }

void pri(records *r) //{

if(r->n==0) {

cout<<\这个记录不存在!\ return; }

cout<<\日期 节次 课程名称\\t for(int i=0;in;i++) {

cout<r[i]); } }

void edt(records *r) //{

显示已有的记录 学生名字\\t 类型 \修改某个学生的考勤记录 35

if(r->n==0) {

cout<<\记录不存在!\ return; }

cout<<\请输入你想改变学生的名字: \ string t1,t3,t4; char tmp[30]; int t2,t5,flag=0; cin>>tmp;

t1.assign(tmp);

for(int i=0;in;i++) if(r->r[i].sname==t1) {

flag=7; break; } if(!flag) {

cout<<\这个学生的名字不在记录中.\ return; }

t1=r->r[i].date; t2=r->r[i].cno; t3=r->r[i].cname; t4=r->r[i].sname; t5=r->r[i].type;

cout<<\请输入你想要改变的属性:\\n(1.日期 2.第几节课 3.课程名称 4.学生的名字 5.类型 6.全部) \e0:

cin>>flag; switch(flag) {

case 1:

goto e1; case 2:

goto e2; case 3:

goto e3; case 4:

goto e4; case 5:

goto e5; case 6:

36

goto e1; default: goto e0; } e1:

cout<<\请输入日期,比如101225 :\ cin>>t1;

if(!(timechk(t1))) goto e6; e2:

cout<<\请输入第几节课 :\ cin>>t2; if(flag!=6) goto e6; e3:

cout<<\请输入课程的名字 :\ cin>>t3; if(flag!=6) goto e6; e4:

cout<<\请输入学生的名字 :\ cin>>t4; if(flag!=6) goto e6; e5:

cout<<\请输入缺席的类型 (1.迟到 2.早退 3.请假 4.旷课) \ cin>>t5; e6:

r->r[i].set(t1,t2,t3,t4,t5); char yn;

cout<<\保存? (y/n) \ cin>>yn;

if(yn=='y')wt(r); else

return; }

void del(records *r) //删除已有的考勤记录 {

if(r->n==0) {

cout<<\这个记录不存在!\ return; }

37

pri(r);

cout<<\请输入你要删除的记录数:\\n(输入 -1 删除全部记录) \ int flag; cin>>flag;

if(flag>r->n-1&&flag<-1) {

cout<<\你想要删除的数据不在记录中.\ return; }

else if(flag==-1) r->n=0; else {

for(int i=flag;in-1;i++) r->r[i].set(r->r[i+1]); r->n--; }

char yn;

cout<<\保存? (y/n) \ cin>>yn; if(yn=='y') wt(r); else

return; }

void search(records *r) //{

if(r->n==0) {

cout<<\这个记录不存在!\ return; }

cout<<\请输入你想要查询学生的姓名 :\ string str; int j=0,flag=0; cin>>str;

for(int i=0;in;i++) if(r->r[i].sname==str) {

if(!flag)cout<<\日期 节次\

cout<r[i]);

寻找某个学生的考勤记录 课程名称\\t学生名字\\t 类型38

flag=1; }

if(!flag)cout<<\找不到该学生的记录.\}

void search_s(records *r) //查询并统计某段时间内考勤记录 {

if(r->n==0) {

cout<<\这个记录不存在!\ return; }

records *r1=new records(); g1:

cout<<\请输入你想查询的时间,比如 100901-101225 :\ string tmp,ld,hd; cin>>tmp;

ld.assign(tmp.substr(0,6)); hd.assign(tmp.substr(7,6)); if(!timechk(ld)||!timechk(hd)) goto g1;

for(int i=0;in;i++)

if(r->r[i].date.compare(ld)>=0&&r->r[i].date.compare(hd)<=0&&r->r[i].type==4)

r1->r[r1->n++].set(r->r[i]);

cout<<\请选择统计模式 : (1.旷课学生名字及次数 2.旷课课程及旷课人数)\g2:

cin>>i; switch(i) {

case 1:

cout<<\从 \到 \ r1->order_s(); break; case 2:

cout<<\从 \到 \ r1->order_c(); break; default: goto g2; } }

39

void main() //主菜单 { c1:

cout<<\学生考勤管理系统\ <

<<\菜单:\

<<\显示全部学生的记录\ <<\录入学生的缺课记录\ <<\寻找学生考勤记录\ <<\修改学生考勤记录\ <<\删除学生考勤记录\

<<\查看一段时间学生考勤统计\ <<\退出\

<<\选择 (1/2/3/4/5/6/7) \ int cho; c2:

cin>>cho; if(cho==7) exit(0);

records *r=new records(); rd(r);

switch(cho) {

case 1:pri(r); break;

case 2:input(r); break;

case 3:search(r); break; case 4:edt(r); break; case 5:del(r); break;

case 6:search_s(r); break; default: goto c2; }

cout<<\返回列表? (y/n) \ char yn; c3:

cin>>yn; if(yn=='y') goto c1;

40

本文来源:https://www.bwwdw.com/article/s7lh.html

Top