C计算机实践报告.doc

  • 格式:doc
  • 大小:31.50 KB
  • 文档页数:7

C计算机实践报告

中南大学 本科生课程设计实践任务书、设计报告 (C课程设计) 题 目 职工工资管理系统 学生学号 学生姓名指导教师 学 院 物理学院 专业班级 指导老师 计算机基础教学实验中心 2010年 07 月 08 日 职工工资管理系统

摘要经过近两周24学时的C计算机实践,我基本上完成了对所要求的熟悉使用MFC类库编程和使用C编写一个关于企业职工工资管理系统的程序。

对于使用C面向对象的编程思想也有了更深的体会。

关键词职工工资、系统、指针、链表、增加删除信息、结构体、类成员函数使用、全局变量 1、职工工资管理系统的开发设计思想 1、职工工资管理系统可以通过输入输出某一职工的一些信息,如月份、编号、基本工资、补贴等进行对职工信息的处理。

2、为了更方便地表示一个职工的基本信息,可以先定义一个结构体(Emp_info),在这个结构体中包含了一个职工的所有基本信息。

3、定义一个类(Employee),在类中定义必要的成员函数,用这些函数可以对结构体中的职工信息进行需要的处理,如添加职工信息函数(AddItem)、删除职工信息函数(RemoveItem)、查找职工信息函数(Search)等。

然后通过调用成员函数来实现系统的功能。 4、用类Employee定义一个全局变量employee,设计主函数及其所调用的函数,通过employee来使用类中的成员函数达到处理数据的目的。

2、职工工资管理系统功能及系统设计介绍 1、系统的功能 职工工资管理系统能根据已输入的数据信息进行必要的数据处理,然后可以根据提示添加或删除职工信息,还可以对有误信息进行修改。

出于发工资时的需要可以对某些或全部的职工信息进行输出。

系统的总的功能如图所示职工工资管理系统 输出主菜单 输入选项 添加职工工资信息 删除职工工资信息 修改职工工资信息 输出指定职工工资信息 输出全体职工工资信息 退出 结束 是 否 为完成这些功能首先需要一个可以存储数据的数据单元,即一个结构体Emp_info,在这个结构体中定义必要的变量pay[5]、gpay、tax、ded、apay。

其所对应的具体变量如下表所示。

pay[0] pay[1] pay[2] pay[3] pay[4] gpay tax ded apay 基本 工资 补贴 房租 会费 储蓄 应发数 个人所得税 应扣数 实发数 定义了结构体后需要定义一个类Employee,在类中定义了两个私有成员函数Find和Print用来查找和输出职工工资信息,六个公有成员函数分别为ListCount、AddItem()、RemoveItem()、AmendItem()、List()、Search()、PayInfo()。

然后根据不同的功能分别编写成员函数。

2、系统主要模块设计 ⑴类成员函数的设计 ①、AddItem()成员函数的设计 添加信息是所有功能实现的一个必要条件,因此十分重要。

在AddItem()之前还有一个统计此前链表数目的函数ListCount(),然后返回一个链表数值。

在AddItem()成员函数实现之初需要先判断当前链表是否为空,这可以通过之前的ListCount()函数的返回值是否为零来判断。

若没有直接添加信息,若有,还需考虑输入的是否为之前存储过的,若是存储过的需返回一个通知的消息,否则可以用结构体Emp_info开辟(new Emp_info)一个新的数据域存储所输入的数据,并将其地址赋给上一个结点的next,这样就完成了添加信息的目的。

②RemoveItem()成员函数的设计 定义p1为num的链表、p为num前一个链表的地址,p1-nextp-next,删除p1 是否 存在num 输入一个num 删除职工信息 Num是否是第一个链表 phead headhead-next删除p 结束删除 调用查找函数

删除成员函数是在之前输入的信息有误时对原数据作一定的纠正,这增加了系统的功能和可用性,给使用者也带来一定便利之处。 此处删除是按照使用者数的学号进行查找删除的,具体实现步骤如图。

通过图示方法能成功删除一些无使用价值的信息。

③、AmendItem函数的设计 修改函数的作用与删除函数相似,其设计较前两个成员函数容易。

先调用一个查找函数,查找到这个链表的位置,然后调用输入输出函数重新对链表中的变量赋值。

④Search函数的设计 处于显示页面的优化的需要,在查找之前先输出〝Search......〞。

定义一个p指针存放用Find函数找到的满足要求的数据域的地址,然后调用输出函数将所得数据域内变量值一一对应输出即可。

⑤、Find函数的设计 前面的几个函数几乎无不调用了Find函数,因此Find函数也是个功能实现的重要的一个部分。

查找时首先需要判断是否当前列表为空,如果为空查找将无意义,不为空时才对链表中的数据进行查找。

当链表不为空时,先用Emp_info结构体定义一个指向head的指针,然后使用while循环(由于链表数未知,因此此处选用while语句)来进行查找符合条件的数据域。

当p指向数据域中num值与所给定的num值一致,则停止,并返回这个指针,否则返回一个无法找到的消息。 ⑥Print()、List()、PayInfo()函数的设计 ift800 { ift

using namespace std; struct Emp_info { int month,num; float

pay[5],gpay,tax,ded,apay; //gpay-应发数;tax-个人所得税;ded-应扣数(房租个人所得税会费);apay-实发数 Emp_info

*next; }; class Employee { private Emp_info *head; void

PrintEmp_info *; Emp_info *Findint; public

Employee{headNULL;} int ListCount; void AddItemint

month,int num,float pay[5]; //添加一个对象到表尾 void

RemoveItemint; //删除指定对象信息 void AmendItemint; //修改指定对象的信息 void List; //列出所有职工的信息 void

Searchint; //查找指定编号职工的信息 void PayInfo; //职工的应发数、个人所得税、应扣数、实发数的计算 }; int

EmployeeListCount //统计链表数,并返回一个整数

{ ifheadreturn 0; Emp_info *phead; int n0; whilep{n;pp-next;}

return n; } void EmployeeAddItem int month,int num,float

pay[5] //增加一个职工信息 { ifhead { headnew Emp_info;

forint i0;ipay[i]pay[i]; head-monthmonth; head-numnum;

head-nextNULL; return; } Emp_info *thead; whilet ift

{ coutnext pp-next; Emp_info *p1new Emp_info; p1-numnum;

p1-monthmonth; forint i0;ipay[i]pay[i]; p1-nextNULL; p-nextp1;

return; } void EmployeeRemoveItemint num //删除指定职工编号的记录 { Emp_info *tFindnum; ift return; Emp_info *phead; ifheadt //如果第一个记录即是要删除的记录 { headhead-next;

delete p; coutnexttpp-next; Emp_info *p1p-next; p-nextp1-next;

delete p1; coutabcdefg; p-montha; p-numb; p-pay[0]c; p-pay[1]d;

p-pay[2]e; p-pay[3]f; p-pay[4]g; return; } void

EmployeePrintEmp_info *p //输出指定职工编号的记录

{ cout.setfiosleft; //设置左对齐 cout.width6; //设置域宽为6

cout.precision6; //设置显示有6位有效数字

coutmonthnumpay[0]pay[1]pay[2]pay[3]pay[4]gpaytaxdedapaynext;} coutnumnum break; pp-next; } ifp { coutpay[0]p-pay[1];

tp-pay[0]; ift800 { iftpay[2]p-pay[3]; ym-x; p-gpaym; p-taxk;

p-dedx; p-apayy; pp-next; n; } return; } Employee employee; //定义一个全局变量 int Menu //主菜单 { cout“select; return

select; } char Exit //退出 { char s; couts; return s; } void

Inputint *month,int *num,float pay[5] //输入信息

{ cout*month; if*month-1return;

cin*numpay[0]pay[1]pay[2]pay[3]pay[4]; return; } void

AddNew //增加一个新的记录 { int num0,month0; float

pay[5]{0,0,0,0,0}; coutnum; ifnum-1continue;

employee.Searchnum; }whilenum-1; return; } void DoDelete //删除记录 { coutnum; ifnum-1continue;

employee.RemoveItemnum; }whilenum-1; return; } void

AmendItem //修改记录 { coutnum; ifnum-1continue; employee.AmendItemnum; employee.PayInfo; }whilenum-1;

return; } void List //列出所有记录 { employee.List; } int main

//主函数 { system“color 0G“; //设置显示字体颜色

cout“ Welcome\n 职工工资管理系统\n 版本Wjh7.0版权所有,翻版必究\n“; int select; char s; while1 { selectMenu;