SQL工资管理系统课程设计报告

时间:2024.4.20

设 计 报 告

课题名称: 工资管理系统

学    院:

专业班级:

学    号:

学    生:

指导教师:

青岛理工大学琴岛学院教务处

    2009  年  7 月  3日


第二篇:高校工资管理系统课程设计报告


课程设计任务书

高校工资管理系统课程设计报告

课程设计报告

课程:面向对象程序设计

教师:

计算机科学与技术学院

课程设计名称: 高校工资管理系统

1.设计内容:

问题的描述(功能要求):

高校有五类职工:教师,实验员,行政人员,教师兼职实验员,行政人员兼职教师。为了实现工资发放的自动功能,现要求编写程序来自动完成此功能。同时注意生成的相关数据结果以文件方式存放在硬盘中。程序应具备从键盘录入,文件的可继续录入,任意职工的工资查询(可由职工编号和职工姓名来实现),若有职工由于工作调动,则可进行相对应的调整动作。

相关信息:

每一学期将学校职工的本学期任职情况及上学期工作的相关情况输入计算机,则本学期职工的月工资按程序处理后的结果发放,其中职工的工资计算方法如下:

其中工资的基本构成如下:

教师: 基本工资+课时费;

实验员: 基本工资+实验室补助;

行政人员: 基本工资+行政补贴;

教师兼职实验员: 基本工资+课时费+实验室补助;

行政人员兼职教师:基本工资+行政补贴+课时费;

其中:

1.课时费:教师每一学期的基本工作量为120,实验员每学期基本工作量为70,行政人员没有基本工作量,每节课时费为20元;课时费=(上学期工作量-基本工作量)*20;

注意:如果上学期基本工作量没完成,则其(上学期工作量-基本工作量)*20为负值。

2.基本工资:教师800元,实验员650元,行政人员750元。

3.行政补贴:250元。

2.设计目的与要求:

2.1设计目的

达到熟练掌握C++语言的基本知识和技能;

基本掌握面向对象程序设计的基本思路和方法;

能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。

2.2设计要求

要求利用面向对象的方法以及C++的编程思想来完成系统的设计;

要求在设计的过程中,建立清晰的类层次;

在系统的设计中,至少要用到面向对象的一种机制。

3.系统分析与设计

3.1主要知识点

本程序共有三个文件组成,分别是Salary.h, Salary.cpp和main.cpp; Salary.h中定义了程序所需的类,全局函数,以及要用到的标准头文件。用到的知识主要有类的继承与派生,纯虚函数,头文件的组织,链表操作,程序菜单选择和处理函数的组织和编写,文件的读写操作。

3.2关键技术

程序中每一种数据类型用一个类来实现,共设计了6个类。人员类 Person,教师类Teacher,实验员类Assistant,行政人员类 Manager,教师兼实验员类Teacher_Manager,行 3

政人员兼教师类Manager_Teacher以及工资信息管理类Salary_Management。每一种类都定义了相应的成员函数。具体定义如下所示:

(1)类Person

类Person为抽象类,为另外五个类的基类,在类Person中,成员变量ID表示职工编号,name表示职工姓名,duty表示岗位类别,salary表示职工工资以及next表示Person类的指针域。两个input()成员函数,无参成员函数input()为纯虚函数用来从键盘输入职工数据,有参成员函数input(ifstream& infile)用来从文件读入职工数据;两个output()成员函数,无参成员函数output()用来向屏幕输出职工信息,有参成员函数output(ofstream& outfile)向指定文件Salary.txt中输出职工信息以及成员函数incoming()用来计算职工工资。类中还将将Salary_Management类声明为友员类,将Work_type(int duty)函数声明为友元函数,用来将职工类别标志转换为相应的类别名称,以便显示职工岗位类别名称。

(2)类Teacher

类Teacher中,在继承基类数据成员的基础上增加了成员变量hours用来存放教师的上课课时数,并重新定义了成员函数input()和output()分别用来输入和输出职工信息,incoming()用来计算教师类的人员工资。

(3)类Assistant

类Assistant中,,在继承基类数据成员的基础上增加了成员变量hours用来存放教师的上课课时数和Allowance用来存放试验室补助,并重新定义了成员函数input()和output()分别用来输入和输出职工信息,incoming()用来计算教师类的人员工资。

(4)类Manager

类Manager中,在继承基类数据成员的基础上增加了成员变量Allowance用来存放行政补贴,并重新定义了成员函数input()和output()分别用来输入和输出职工信息,incoming()用来计算教师类的人员工资。

(5)类Teacher_Assistant

类Teacher_Assistant以Teacher类和Assistant类为直接基类,重新定义了成员函数input()和output()分别用来输入和输出职工信息,incoming()用来计算教师类的人员工资。

(6)类Manager_Teacher

类Manager_Teacher以Teacher类和Assistant类为直接基类,重新定义了成员函数input()和output()分别用来输入和输出职工信息,incoming()用来计算教师类的人员工资。

(7)类Salary_Management

类Salary_Management用来为管理职工信息提供相关功能函数,有私有数据成员PL是链表的头指针,私有成员函数clear清除所有职工结点,私有成员函数QueryRec用来查询职工记录。共有成员函数AddRec用来增加职工记录,DelRec用来删除职工记录,Modify用来修改职工记录,display用来显示职工记录,Save用来保存职工信息,FindRecID按职工编号查找职工记录,FindRecName按职工姓名查找职工记录,Load用来从键盘录入职工信息,Build用来从文件读取职工信息,Statistics提供职工信息统计功能,可以实现分别按职工类别、职工工资、要发工资总数、职工人数的统计功能,MenuSelect菜单功能选择函数,显示程序主功能菜单并接收用户的选择,返回用户选择提供给Handle_menu函数,Handle_menu菜单处理函数,用来处理用户的功能选择,并调用相应的功能函数实现用户所要求实现的功能。

(8)全局函数

duty_to_string函数用来将岗位类别标识转换为相应的名称。

print_worktype_menu函数用来显示人员类别选择菜单。

dis_mainmenu函数用来选择程序主功能菜单。

(9)调用的系统库函数

system("pause"); //在屏幕上输出:press any key to quit,意思是停留,看程序的输出结果

system("cls"); 清屏

(10)头文件说明

本程序有一个Salary.h头文件,该头文件包含程序所需包含的标准头文件和定义的类以及全局函数。为了防止头文件重复包含,采用如下格式:

#if !defined (宏)

#define 宏

?? //头文件具体内容

#endif

这样可以使源文件中只要包含Salary.h一个头文件即可,使文件头变得简洁。

(11)程序的主要功能函数及相关算法

本程序共定义六个类,分别是Person类、Teacher类、Assistant类、 Manager类、 Teacher_Assistant类、Manager_Teacher类和Salary_Management类。Person类为抽象类作为Teacher类、Assistant类和Manager类直接基类。Teacher_Assistant类以Teacher类和Assistant类作为直接基类,多重继承,Manager_Teacher类以Manager类和Teacher类作为直接基类多重继承。Salary_Management类是为职工信息管理提供功能函数。

Salary_Management类中主要的成员函数有:

AddRec函数用来提供添加职工信息的功能。该函数先调用print_worktype_menu函数打印职工类别选择菜单供用户选择,程序再根据用户的不同选择分别调用Teacher类、Assistant类、 Manager类、 Teacher_Assistant类、Manager_Teacher类的input函数实现添加职工信息。

Build函数的功能是从文件读取职工信息来实现程序的初始化,该函数使用文件指针操作函数tellg和seekg函数来不断调整文件指针,以实现从文件读取职工信息供程序初始化的功能。再该函数中,先定义buf临时空间,用infile>>buf>>buf>>Duty;语句先读取职工信息中的duty的值,然后在根据duty的值分别调用Teacher类、Assistant类、 Manager类、 Teacher_Assistant类、Manager_Teacher类的input(ifstream&)函数来实现从文件输入职工信息的功能。

DelRec函数的功能是根据用户输入的编号来删除指定的职工记录。该函数先调用QueryRec函数查找与用户输入的编号相对应的职工记录,然后从链表中删除对应的结点,实现职工记录的删除,同样也会相应的输出文件中的信息。

display函数的功能是显示所用的职工记录。

Search函数功能是通过调用FindRecID函数和FindRecName函数来实现按职工编号或按姓名来查找相应的职工信息,如果能查找到则输出相应的职工信息,没找到会给出” 找不到你要查找的职工信息!”的提示信息。该函数具有循环查找功能。

Load函数的功能是录入职工信息。该函数先要求用户输入要录入的职工数,然后调用print_worktype_menu函数提示用户输入职工的类别,程序再根据用户输入的职工类别duty来调用相应类的input函数实现职工信息的键盘录入功能。

Handle_menu函数的功能是处理用户的功能选择。该函数通过调用MenuSelect函数获取用户的功能选择序号来给select变量赋值,然后再用switch语句根据select的值调用相应的功能函数来实现用户选择的功能。

Save函数的功能是将职工信息已成功保存到Salary.txt文件中。

Statistics函数的是职工信息的统计。共提供四种不同方式的统计功能:

1、统计各职工类别职工的人数

2、根据用户输入的工资范围统计并输出该范围内的职工信息

3、统计要发工资总数

4、统计职工的总人数

Modify函数的功能是修改指定职工的信息;但不能修改职工的类别信息。函数先要求用户输入要修改的职工编号,然后调用QueryRec函数查找到相应职工的记录,然后调用该职工所属类的input函数来时用户信息的重新赋值。

3.3基本功能要求

(1)功能选择可以用菜单来实现

例如:

请选择您的计算内容:

1、 数据录入

2、 查询职工信息

3、 查询职工信息

4、 增加职工记录

5、 删除职工信息

6、 统计职工信息

7、 显示所有信息

8、 退出系统

用户通过输入不同的数字进入不同的菜单。次级菜单主要显示本程序的功能,主要的功能有录入职工信息、查询信息、添加职工记录、删除职工记录、统计职工信息、显示所有信息。

(2)运行时给出明确的提示信息。

比如,在选择主功能菜单是选择范围是(1-8),如果用户输入的选项不在可选择范围之内,程序会给出输入选项不在可选范围之内的提示,并要求用户且知道输入选项在可选范围内才执行相应的功能。本程序有较友好的用户交互界面,每进入或离开一个功能界面时都会有相应的提示信息,方便用户操作。

4.系统总体设计(确定程序功能模块)

本程序的类继承关系如1所示:

注意图中的箭头方向,箭头表示继承的方向,从派生类指向基类。

图1.程序中类的继承关系

高校工资管理系统课程设计报告

Salary_Management类中成员函数调用关系如图所示:

图2、Salary_Management类中成员函数调用关系图

5、程序文件组成及各文件中的源代码

高校工资管理系统课程设计报告

本程序由一个Salary.h头文件和两个源文件Salary.cpp和main.cpp组成。各文件的源代码如下:

(1) Salary.h文件代码

/**********************************************************************/ #if !defined (H_Salary_H)

#define H_Salary_H

#include <iostream>

#include <string>

#include <fstream>

#include <iomanip>

using namespace std;

class Person //人员信息类 (抽象基类)

{

public:

virtual void input()=0; //从键盘输入职工数据

virtual void input(ifstream& infile)=0; //从文件读入职工数据 virtual void output()=0; //向屏幕输出职工信息 virtual void output(ofstream& outfile)=0; //向指定文件输出职工信息 virtual double incoming()=0; // 计算职工收入函数 Person() //Person基类构造函数 {next=0; } //指针赋值为空

virtual ~Person(){}

protected:

char name[15]; //职工姓名

string ID; //职工编号

int duty; /*岗位类别 :1:教师 2:实验员 3:行政人员 4:教师兼实验员 5:行政人员兼教师*/

double salary; //职工薪水 Person *next; //指针成员

friend bool isexist(string id);

friend class Salary_Management; //将Salary_Management类声明为友员类 };

class Teacher :virtual public Person

{

protected:

int hours; //上学期工作量

public:

Teacher() { salary=800; //教师基本工资800元 8

duty=1; //岗位类别为1

}

void input();

void input(ifstream& infile);

void output();

void output(ofstream& outfile);

double incoming();

};

class Assitant :virtual public Person

{

public:

Assitant()

{

salary=650; //实验员基本工资650元 duty=2; //岗位类别为2

allowance=150; //实验室补助为150元 };

void input();

void input(ifstream& infile);

void output();

void output(ofstream& outfile);

double incoming();

protected:

int hours;

double allowance;

};

class Manager :virtual public Person

{

public:

Manager()

{

salary=750; //行政人员基本工资为750元 duty=3; //岗位类别为3

allowance=250; //行政补贴

}

void input();

void input(ifstream& infile);

void output();

void output(ofstream& outfile);

double incoming();

protected:

double allowance; //行政补贴

};

class Teacher_Assistant : public Teacher,public Assitant {

public:

Teacher_Assistant()

{

Teacher::salary=800; //基本工资800元 duty=4; //岗位类别为4 Assitant::allowance=150; //实验室补助150元 }

void input();

void input(ifstream& infile);

void output();

void output(ofstream& outfile);

double incoming();

};

class Manager_Teacher :public Manager,public Teacher {

public:

Manager_Teacher()

{

salary=750; //基本工资750元 duty=5; //岗位类别为5 Manager::allowance=250; //行政补贴250元 }

void input();

void input(ifstream& infile);

void output();

void output(ofstream& outfile);

double incoming();

};

class Salary_Management

{

public:

Salary_Management(); //构造函数

~Salary_Management(); //析构函数

void AddRec(); //增加职工记录

void DelRec(); //删除职工记录

void Modify(); //修改职工记录

void display(); //显示职工记录

void Save(); //保存职工信息

10

void FindRecID(); //按职工编号查找职工记录

void FindRecName(); //按职工姓名查找职工记录

void Load(); //职工信息装入

void Build(); //引导

void Statistics(); //职工信息统计

int MenuSelect(); //菜单功能选择

void Handle_menu(); //菜单处理函数

private:

Person *PL; //链表头指针

void clear(); //清除所有职工结点,仅保留头结点

bool QueryRec(string ID,Person** p1,Person** p2 ); //查找职工结点 };

string Work_type(int duty);

void print_worktype_menu();

void dis_mainmenu();

#endif

(2) Salary.cpp文件中的代码

/******************************************************************/ #include "Salary.h"

void Teacher::input() //从键盘补充其他数据

{

cout<<"\t编号: "; cin>>ID;

cout<<"\t姓名: "; cin>>name;

cout<<"\t教师上学期课时: "; cin>>hours;

salary=incoming();

}

void Teacher::input(ifstream& infile)

{

infile>>ID;

infile>>name;

infile>>duty;

infile>>hours>>salary;

}

void Teacher::output()

{

cout<<"\t编号: "<<ID<<endl;

cout<<"\t姓名: "<<name<<endl;

cout<<"\t人员类别: "<<Work_type(duty)<<endl;

cout<<"\t上学期上课课时: "<<hours<<endl;

cout<<"\t工资: "<<salary<<" 元"<<endl;

11

}

void Teacher::output(ofstream& outfile)

{

outfile<<ID<<"\t"<<name<<"\t"<<duty<<"\t"<<hours<<"\t"<<salary<<endl; }

double Teacher::incoming()

{

if(hours>120)

return salary+(hours-120)*20;

else return salary;

}

void Assitant::input()

{

cout<<"\t编 号: "; cin>>ID;

cout<<"\t姓 名: "; cin>>name;

cout<<"\t实验员上学期试验课时: "; cin>>hours;

salary=incoming();

}

void Assitant::input(ifstream& infile)

{

infile>>ID>>name>>duty>>hours>>salary;

}

void Assitant::output()

{

cout<<"\t编 号: "<<ID<<endl;

cout<<"\t姓 名: "<<name<<endl;

cout<<"\t人员类别: "<<Work_type(duty);

cout<<"\t上学期试验课时: "<<hours<<endl;

cout<<"\t工 资: "<<salary<<" 元"<<endl;

}

void Assitant::output(ofstream& outfile)

{

outfile<<ID<<"\t"<<name<<"\t"<<duty<<"\t"<<hours<<"\t"<<salary<<endl; }

double Assitant::incoming()

{

if(hours>70)

return salary+(hours-70)*20+allowance;

else return salary+allowance;

}

void Manager::input()

{

cout<<"\t编 号: "; cin>>ID;

cout<<"\t姓 名: "; cin>>name;

12

salary=incoming();

}

void Manager ::input(ifstream& infile)

{

infile>>ID>>name>>duty>>salary;

}

void Manager::output()

{

cout<<"\t编 号: "<<ID<<endl;

cout<<"\t姓 名: "<<name<<endl;

cout<<"\t人员类别: "<<Work_type(duty)<<endl;

cout<<"\t工 资: "<<salary<<" 元"<<endl;

}

void Manager::output(ofstream& outfile)

{

outfile<<ID<<"\t"<<name<<"\t"<<duty<<"\t"<<salary<<endl; }

double Manager::incoming()

{

return salary+allowance;

}

void Teacher_Assistant::input()

{

cout<<"\t编 号: ";cin>>ID;

cout<<"\t姓 名: ";cin>>name;

cout<<"\t教师上学期上课课时: ";

cin>>Teacher::hours;

salary=incoming();

}

void Teacher_Assistant::input(ifstream& infile)

{

infile>>ID>>name>>duty>>Teacher::hours>>salary; }

void Teacher_Assistant::output()

{

cout<<"\t编 号: "<<ID;

cout<<"\t姓 名: "<<name;

cout<<"\t人员类别: "<<Work_type(duty);

13

}

cout<<"\t教师上学期上课课时: "<<Teacher::hours; cout<<"\t工资: "<<salary<<" 元"<<endl;

void Teacher_Assistant::output(ofstream& outfile) {

}

double Teacher_Assistant::incoming()

{

} if(Teacher::hours>120) return salary+allowance+(Teacher::hours-120)*20; else return salary+allowance; outfile<<ID<<"\t"<<name<<"\t"<<duty<<"\t"<<Teacher::hours<<"\t"<<salary<<endl;

void Manager_Teacher::input()

{

cout<<"\t编 号: "; cin>>ID;

cout<<"\t姓 名: "; cin>>name;

cout<<"\t上学期上课课时: "; cin>>Teacher::hours;

}

salary=incoming();

void Manager_Teacher::input(ifstream& infile) {

}

infile>>ID>>name>>duty>>Teacher::hours>>salary;

void Manager_Teacher::output()

{

cout<<"\t编 号: "<<ID<<endl;

cout<<"\t姓 名: "<<name<<endl;

}

void Manager_Teacher::output(ofstream& outfile) {

}

cout<<"\t人员类别: "<<Work_type(duty); cout<<"\t上学期上课课时: "<<Teacher::hours<<endl; cout<<"\t工资: "<<salary<<" 元"<<endl; outfile<<ID<<"\t"<<name<<"\t"<<duty<<"\t"<<Teacher::hours<<"\t"<<salary<<endl; 14

double Manager_Teacher::incoming()

{

return salary+Teacher::hours*20+allowance;

}

Salary_Management::Salary_Management()

//构造函数 (创建一个头结点的链表)

{

Person* p=new Teacher;

PL=p;

Build();

}

Salary_Management::~Salary_Management()

//析构函数(仅保留一个结点)

{

Person* p=PL;

while (p)

{

PL=p->next; delete p; p=PL;

}

PL=0;

}

void print_worktype_menu()

{

cout<<"\t\t请选择人员类别: "<<endl;

cout<<"\t\t\t1、教 师: "<<endl;

cout<<"\t\t\t2、实 验 员: "<<endl;

cout<<"\t\t\t3、行 政 人 员: "<<endl;

cout<<"\t\t\t4、教师兼实验员: "<<endl;

cout<<"\t\t\t5、行政 兼 教师: "<<endl;

cout<<"\n\t\t请选择要添加的相应的人员类别分类码: "; }

void Salary_Management::AddRec()

{

char ch='y';

//创建新结点,录入数据,连接到链表

Teacher* pt;

Assitant* pa;

Manager* pm;

Teacher_Assistant* pta;

Manager_Teacher* pmt;

while (ch=='y'||ch=='Y')

15

{ cout<<"\t*******************增加职工**********************"<<endl;

Person* p=PL;

while (p->next)p=p->next; //查找尾结点

print_worktype_menu();

char select;

cin>>select;

switch(select)

{

case '1': pt=new Teacher;

pt->input();

p->next=pt;

break;

case '2' : pa=new Assitant;

pa->input();

p->next=pa;

break;

case '3' : pm=new Manager;

pm->input();

p->next=pm;

break;

case '4' : pta=new Teacher_Assistant;

pta->input();

p->next=pta;

break;

case '5' : pmt=new Manager_Teacher;

pmt->input();

p->next=pmt;

break;

default : return;

}

cout<<"\t是否继续添加职工信息(Y/N): "; cin>>ch;

system("cls");

system("pause");

}

}

void Salary_Management::clear() //清除所有的职工结点(仅保留头结点)

{

Person* p=PL->next;

while (p)

{

PL->next=p->next;

delete p;

16

p=PL->next;

}

}

void Salary_Management::FindRecID()

//按职工编号查找相应的人员信息

{

string id;

Person* p1;

}

bool Salary_Management::QueryRec(string id,Person** p1,Person** p2 )

//查找职工结点,找到返回1,未找到返回0,结点指针由p1返回,p2为前看指针 {

Person* p2; cout<<"\t请输入你要查找的职工编号: "; cin>>id; p1=PL->next; p2=PL; while (p1) { if (p1->ID==id) break; //找到 else { p2=p1; //继续向后查找 p1=p1->next; } } if (!p1) { cout<<"\n\t找不到你要查找的职工信息!"<<endl; cout<<"\t请确认你输入的编号是否正确!!!\n"<<endl; } return; else{ cout<<"\n"; p1->output();} *p1=PL->next; *p2=PL; while (*p1) { if ((*p1)->ID==id) break; else { 17

} *p2=*p1; *p1=(*p1)->next; } } return *p1?true:false;

void Salary_Management::FindRecName() //按职工姓名查找相应的人员信息 {

}

void Salary_Management::DelRec()

//删除职工信息

{

string NAME; Person* p1; Person* p2; cout<<"\t请输入你要查找的职工姓名: "; cin>>NAME; p1=PL->next; p2=PL; while (p1) { } if (p1->name==NAME) break; //找到 else { } p2=p1; //继续向后查找 p1=p1->next; if (!p1) { cout<<"\n\t\t找不到你要查找的职工信息!"<<endl; cout<<"\n\t\t请确认你输入的姓名是否正确!!!\n"<<endl; return; } else p1->output(); cout<<"\t*********************删除职工信息***********************"<<endl; string id; Person *p1,*p2; cout<<"\t\t输入要删除的职工编号: "; cin>>id; if (QueryRec(id,&p1,&p2)) { p2->next=p1->next; //连接,准备删除接点 p1 18

delete p1; cout<<"\n\t\t指定要删除的人员信息已成功删除!!!"<<endl; } else cout<<"\n\t\t没找到要删除的职工信息!"<<endl<<"请确认您的输入无误!"<<endl;

system("pause");

Save(); //保存信息

}

void Salary_Management::Modify()

{

} system("cls"); cout<<"\n\t***********************修改职工信息*******************"<<endl; string id; Person *p1,*p2; cout<<"\t\t\n请输入要修改的职工编号: "; cin>>id; if(QueryRec(id,&p1,&p2)) { p1->output(); //输出原来的职工信息 p1->input(); //输入新的职工信息 cout<<"\n\t**********************修改完成********************"<<endl; } else { cout<<"\t\t没找到要删除的职工信息!"<<endl<<"请确认您的输入无误!"<<endl; system("pause"); } Save();

void Salary_Management::display()

{

system("cls");

cout<<"\n\t**********************职工信息表**********************\n"<<endl; Person* p=PL->next;

if (!p)

{

cout<<"\n\t*******************无职工信息记录******************"<<endl;

system("pause"); system("cls"); return ; 19

}

while (p) //遍历链表,输出职工信息

{

p->output();

cout<<"\n";

p=p->next;

}

cout<<"\n\t******************信息显示完毕 !**********************\n"<<endl; system("pause");

}

void Salary_Management::Save()//职工信息存盘

{

ofstream oufile("Salary.txt"); //打开文件

//遍历所有记录输出至文件Salary.txt中

Person* p=PL->next;

while (p)

{

p->output(oufile);

p=p->next;

}

oufile.close();

cout<<"\t\t职工信息已成功保存到Salary.txt文件中!"<<endl;

}

void Salary_Management::Build()

{

char buf[81]; //临时空间

int Duty; //人员类型

Person *p2; //新建结点的指针

long t; //读写位置

//清除现有结点(保留头结点)

clear();

//打开文件

ifstream infile("Salary.txt",ios::in);

//建立结点,读数据

Person *p=PL; //尾结点指针

while(1)

{ //读取人员类型

t=infile.tellg();

infile>>buf>>buf>>Duty;

20

if(infile)

{

//根据人员类型创建新结点

switch(Duty)

{

case 1: p2=new Teacher; break;

case 2: p2=new Assitant; break;

case 3: p2=new Manager; break;

case 3: p2=new Teacher_Assistant; break;

case 5: p2=new Manager_Teacher; break;

default:infile.close(); return;

}

p->next=p2;

p=p->next;

infile.seekg(t);

p->input(infile);

}

else break;

}

//关闭文件

infile.close();

}

void Salary_Management::Load()

{

char ch='y';

int count;

cout<<"\n\t*************************职工信息**************************\n"<<endl;

while (ch=='y'||ch=='Y')

{

cout<<"\t\t请输入要录入职工的人数: "; cin>>count;

for (int i=1;i<=count;i++)

{

//查找尾结点

Person* p=PL;

while(p->next)p=p->next;

int answer;

print_worktype_menu();

cin>>answer; //创建新结点,录入数据,连接到链表 Teacher* pt;

Assitant* pa;

Manager* pm;

Teacher_Assistant* pta; 录入

21

Manager_Teacher* pmt;

switch(answer)

{

case 1: pt=new Teacher;

pt->input();

p->next=pt;

break;

case 2: pa=new Assitant;

pa->input();

p->next=pa;

break;

case 3: pm=new Manager;

pm->input();

p->next=pm;

break;

case 4: pta=new Teacher_Assistant;

pta->input();

p->next=pta;

p->next=pta;

break;

case 5: pmt=new Manager_Teacher;

pmt->input();

p->next=pmt;

break;

default: return;

}

}

cout<<"\n";

Save();

cout<<"\n\t\t是否继续录入职工信息?(Y/N)"; cin>>ch; }

cout<<"\n\t***********************职工信息************************\n";

system("pause");

}

void Salary_Management::Statistics()

{

Person* p1;

Person* p2;

double Sa=0;

int a,b,i=0;

double c,d;

system("cls"); 录入完成

22

char ch='y';

while(ch=='y'||ch=='Y')

{cout<<"\n\t*********************统计职工信息*********************\n"<<endl; cout<<"\t\t请选择你要统计的类别:\n"<<endl;

cout<<"\t\t\t1、职工类别"<<endl;

cout<<"\t\t\t2、职工工资\n";

cout<<"\t\t\t3、要发工资总数"<<endl;

cout<<"\t\t\t4、总的人数\n"<<endl;

cout<<"\t\t请选择相应的序号: "; cin>>a;

while (a>4||a<1)

{

cout<<"\n\t\t您的输入有误! 请重新选择(1-4)\n"<<endl;

cin>>a;

}

switch(a)

{

case 1: {print_worktype_menu();

cin>>b;

p1=PL->next;

p2=PL;

while (p1)

{

if (p1->duty==b)

{

i++;

p2=p1;

p1=p1->next;

}

else

{

p2=p1;

p1=p1->next;

}

}

cout<<"\t\t"<<Work_type(b)<<"\t\t类职工人数为: "<<i<<endl;

break;

}

case 2: {cout<<"\n\t\t输入工资下限: "; cin>>c;

cout<<"\n\t\t输入工资上限: "; cin>>d;

p1=PL->next;

p2=PL;

while (p1)

{

23

}

} } if (p1->salary>=c && p1->salary<=d) { } else { } p2=p1; //继续查找 p1=p1->next; p1->output(); //找到 p2=p1; //继续查找 p1=p1->next; break; } case 3: {Person* p=PL->next; while (p) //遍历链表 { Sa=Sa+p->salary; p=p->next; } cout<<"\n\t\t工资总数是: "<<Sa<<endl; break; } case 4: {Person* p=PL->next; while (p) { i++; p=p->next; } cout<<"\n\t\t总人数为: "<<i<<endl; break; } } cout<<"\n\t************************统计完成!********************\n"<<endl; cout<<"\t是否继续统计?(Y/N)";cin>>ch; system("cls"); // system("pause");

string Work_type(int duty) {

string worktype; switch(duty) 24

} { case 1: worktype="教师"; break; case 2: worktype="实验员";break; case 3: worktype="行政人员";break; case 4: worktype="教师兼实验员" ;break; case 5: worktype="行政人员兼教师";break; } return worktype;

int Salary_Management::MenuSelect()

//显示主菜单,接受选择,并分支调用职工工资管理类的相应功能

{

int ch; dis_mainmenu(); cin>>ch; while(ch<=1&&ch>=8) { cout<<"\t\t你输入的序号不在可选范围之内,\n\t请重新选择1-8 :"; cin>>ch; } return ch;

}

void dis_mainmenu()

{

cout<<"\n\t***********************************************************\n"; cout<<"\n\t * 高校工资管理系统 * \n";

cout<<"\n\t***********************************************************\n"; cout<<"\n\t\t\t1、数据录入 "<<endl; cout<<"\t\t\t2、查询职工信息"<<endl; cout<<"\t\t\t3、修改职工信息"<<endl; cout<<"\t\t\t4、增加职工记录"<<endl; cout<<"\t\t\t5、删除职工信息"<<endl; cout<<"\t\t\t6、统计职工信息"<<endl; cout<<"\t\t\t7、显示所有信息"<<endl;

cout<<"\t\t\t8、退出系统"<<endl;

cout<<"\n\t\t请输入序号实现相应的功能: ";

}

void Salary_Management::Handle_menu()

{

int select;

while(1)

{

system("cls");

select=MenuSelect();

25

switch(select)

{

case 4: system("cls");

AddRec();break;

case 2: {

char ch='y'; while(ch=='y'||ch=='Y') { system("cls"); cout<<"\n\t*******************查询职工信息******************"<<endl; cout<<"\n\t\t1、按职工编号查找\n"; cout<<"\n\t\t2、按职工姓名查找\n"; cout<<"\n\t\t0、返回主功能菜单\n\n"; cout<<"\t请选择查找方式: ";cin>>select; while(select<0 || select>2) { cout<<"\t你输入的序号不在可选范围之内,\n\t请重新选择0-2 :"; cin>>select; } if(select==1) { FindRecID(); cout<<"\n\t***********************查询完成!********************\n"<<endl;} else if(select==2) { FindRecName(); cout<<"\n\t*********************查询完成!**********************\n"<<endl; } else break; system("pause"); } break; } case 1: system("cls"); Load();break; case 3: Modify();break; case 5: DelRec();break; case 6: Statistics();break; case 7: display();break;

case 8: exit(0);

}

}

}

(3)main.cpp文件中的代码

/**************************************************************************/ #include "Salary.h"

26

int main()

{

Salary_Management sm;

sm.Handle_menu();

}

return 0;

6.运行结果

程序运行时,首先出现主界面菜单,由用户进行功能选择,选择不同的数字,进入不同的功能区。如图3所示。

高校工资管理系统课程设计报告

图3 程序运行主界面

选择1,则进入职工信息录入界面,如图4所示。

27

图4 职工信息录入界面

选择2,进行职工信息查询次级菜单,如图5所示。

高校工资管理系统课程设计报告

图5查询职工信息界面 按3进入职工信息修改界面

高校工资管理系统课程设计报告

图6职工信息修改界面

28

高校工资管理系统课程设计报告

按7

高校工资管理系统课程设计报告

进入职工信息表界面显示所有职工信息

图7职工信息表界面

按8保存信息并退出管理系统

高校工资管理系统课程设计报告

图8保存并退出系统

29

7.设计体会

试验过程中出现了很多令人意想不到的问题,首先就是拿到问题不知该如何分析问题,可以说没啥思路。但是决不能因此就轻易放弃,于是我就上网搜集相关问题的资料,很幸运,找到了相同问题的答案。但是有了答案不等于我就不必花时间去编代码了,我应该做的是学习答案中的编程思想,弄懂答案中的每行代码。

抱着这种正确的态度,我开始认真体会他人的解题思路。后在将这些思想融入自己的解题分析过程中。我花了整整两天的时间才完成代码的编写。我之前认为编写完代码,问题不就解决了吗?情况不如我想的那么简单,下面还有很多的事情没完成。其中调试程序就是一项很艰苦的工作,由于程序刚开始能实现的功能很少而且程序界面也缺少良好的用户交互性。随着代码量的增加,我感觉到程序调试变得越来越困难,由于实验课上没有接触到更多的程序调试方面的操作方法,如今也只能自己摸索了。但最终还是没能掌握调试方法,我只感觉到VC++的编程工具非常强大,自己的专业知识真是太肤浅,要学习的东西还有很多很多。

我编写的代码足足将近1000多行,这对我来说可是前所未有呀!这都是因为扩充功能和改善交互界面的结果。

在程序调试过程中,为了能实现清屏的功能,我可是上网查找了很长时间。功夫不负苦心人那,最后终于让我搜到了一个system(“cmd命令”),这个函数是在标准库头文件stdlib.h中,但要想实现清屏的效果,还要会用能实现该功能的cmd命令。还好我以前对DOS命令挺感兴趣的,也经常在cmd窗口下执行一些Windows窗口不便完成的操作,当然清屏命令"cls"更是相当常用啦!于是我就组合一下,得到了system(“cls”);语句,在VC中运行果真能达到清屏的效果。这条清屏语句可为改善我的程序界面贡献不小啊! 此外,经过联想我得出另外一条语句system(“pause”);作用是:在屏幕上输出“按任意键继续??”,并使程序暂停执行,等候用户做出响应,这个命令我主要用在输出结果时,使程序暂停,以便用户查看输出结果。

还有的较为困难问题是关于链表的操作,由于上学期这方面的知识掌握的不是很牢靠,只能把上学期的书拿过来再温习一下。另一个较困难的问题是关于文件的操作。我的问题是只能使程序往文件中存放数据,但我想添加的想从文件中读取的功能没能实现。

本程序可扩展的功能:统计职工信息功能(已实现);从文件读取数据(已实现) 在输出数据时选择保存文件名称及保存路径功能(没能实现);从文件输入数据时,姓名读写支持带空格的名字输入功能(没能实现)??

通过这次课程设计,说实在,感觉与软件开发人员的水平还相差深远,自己的水平还很差,要学的编程知识还很多。编程不是件容易的事情。不过,我想通过付出辛勤的劳动,成为编程高手是不会遥不可及的。我会为此付出必要的劳动。

8.参考书目

【1】C++面向对象程序设计 谭浩强 编著 清华大学出版社

【2】C语言程序设计(第三版) 谭浩强 著 清华大学出版社

【3】C++语言课程设计 刘振安 刘燕君 孙忱 编著 机械工业出版社

P32-52 第四章 多文件与菜单设计 头文件编写

P150-172 第11章 使用链表和文件

【4】相同问题源代码/u13572321/d88271866.htm

30

设计成绩: 教师签名:年 月 31 日

更多相关推荐:
工资管理系统课程设计报告

目录摘要错误未定义书签绪论错误未定义书签第一章需求分析211系统功能需求简介212功能需求描述213目标系统要求214系统平台选择215数据流图3第二章概念模型设计421概念模型设计4第三章逻辑模型设计531数...

工资管理系统 数据库课程设计报告

目录一开发背景1二功能描述2三数据流分析331数据流图332数据字典4四概念模型设计6五逻辑结构设计和优化9六应用程序设计10七心得体会12参考文献13附录13一开发背景随着经济的发展企业正向着大型化规模化发展...

SQL工资管理系统课程设计报告

SQL工资管理系统课程设计报告课题名称:工资管理系统学院:专业班级:学号:学生:指导教师:青岛理工大学琴岛学院教务处20##年7月3日

c语言课程设计报告 职工工资管理系统

课程设计报告课程设计报告题目职工工资管理系统设计者专业班级学号指导教师所属院系20xx年6月29日一设计需求说明一职工工资管理系统功能设计要求1输入记录将每一个职工的姓名ID号以及基本工资职务工资岗位津贴医疗保...

工资管理系统课程设计报告

工资管理系统课程设计报告工资管理系统课程设计报告编写人同组成员课程设计负责人0922305022完成日期辅导教师批阅日期分数11页共4页第工资管理系统课程设计报告1功能描述本程序主要的数据结构是单链表它由四大模...

高校工资管理系统C++课程设计报告

课程设计报告课程名称面向对象程序设计课题名称高校工资管理系统专业通信工程班级1001班学号姓名指导教师20##年12月26日湖南工程学院课程设计任务书课程名称面向对象程序设计课题高校工资管理系统专业班级通信工程…

SQL工资管理系统课程设计报告

设计报告课题名称:工资管理系统学院:专业班级:学号:学生:指导教师:

工资管理系统(论文范文JSPJAVA毕业设计)

摘要我们小组的课程设计是某公司的工资管理系统在这个计算机快速发展的世界里计算机为信息处理提供了物美价廉的手段对于推动我国管理信息处理现代化起到了重要作用工资管理是一项琐碎复杂而又十分细致的工作工资计算发放核算的...

工资管理系统(论文范文_JSP_JAVA_毕业设计)

需要本论文完整程序源代码答辩PPT或者更多毕业论文联系文库上传者QQ即可摘要我们小组的课程设计是某公司的工资管理系统在这个计算机快速发展的世界里计算机为信息处理提供了物美价廉的手段对于推动我国管理信息处理现代化...

工资管理系统_毕业设计论文_开题报告

毕业论文设计开题报告

人事管理系统_毕业设计论文_开题报告

人事工资系统开题报告目录一选题的背景11人事工资系统的功能及特点12人事工资系统的局限性13课题的提出意义二人事档案管理的现状三人事工资系统的设计方法和技术线路四系统设计进度按排五参考资料一选题的背景11人事工...

C++课程设计 职工工资管理系统(报告内含程序完整清单)

目录目录i1概述111程序的基本功能112其它功能113扩展功能12课题的分析2212223243会员登入系统模块即SYSTEMHEAD静态全局函数模块2查询功能模块即SEARCH函数模块2职务信息匹配及处理模...

工资管理系统课程设计报告(25篇)