文档视界 最新最全的文档下载
当前位置:文档视界 › 程序设计基础课程设计报告

程序设计基础课程设计报告

程序设计基础课程设计报告
程序设计基础课程设计报告

《程序设计基础》

课程设计报告

题目:员工工资管理系统

院(系):信息科学与工程学院

专业班级:

学生姓名:

学号:

指导教师:

20 16 年 12 月 12 日至20 16 年 12 月 23 日

武昌首义学院制

程序设计基础课程设计任务书

目录

1需求与总体设计 (1)

2详细设计 (1)

3编码实现 (4)

4运行结果 (21)

总结 (24)

1需求与总体设计

1.1需求描述

设计一个利用文件处理方式实现对员工工资(包括员工编号、员工姓名、年月、岗位工资、奖金、扣款和实发)进行管理,具有增加数据、更新数据、查询数据、删除数据、列表显示数据以及重组文件的功能。

1.2总体设计

先以登陆函数登陆,再进入主菜单,菜单中显示各个要实现的操作,以菜单将各个函数联系起来,对菜单操作以实现系统的目的。

1.3数据结构

struct user //登陆者信息

{

char un[10];

char up[10];

}us[3] = { "aaa","111","bbb","222","ccc","333" };

struct yg //员工结构体

{

short zt; //数据状态

long bh; //编号

char name[20]; //名字

char time[11]; //时间

long money; //基本工资

long jj; //奖金

long kk; //扣款

long sf; //实发工资

};

整个程序只运用了结构体的数据结构,结构体运用于登陆者信息和员工信息,将员工信息封装在一个结构体里,再创建结构体数组,将多个员工信息储存在结构体数组中。

2详细设计

2.1 系统功能设计

主函数和子函数:

系统包含一个主函数,和子函数,分别有登陆子函数,菜单子函数,增加数据子函数,更新数据子函数,查询数据子函数,删除数据子函数,统计数据子函数,重组文件子函数,排序数据子函数,最后两个分别是读取文件和写入文件子函数。

各个函数的功能:

主函数是一个入口程序从这里进入,再进入登陆函数,实现登陆操作。

登陆函数,只有拥有正确账号密码,正确的操作才可以进入菜单界面进行下一步的操作,并且输入错误三次后将会提示并强制退出。

菜单界面利用switch()函数将各个函数联系起来实现真正的菜单,输入正确的序号可以进行后续的各个操作。

读取函数,将特定文件中的信息,以特定的方式读取到正在运行的程序中,实现读写操作。

写入函数,在添加、更新、删除、重组操作过后进行写入操作,将变换后的数据重新写入文件中。注:每次写入都是将程序中的所有数据重新写入文件。

增加函数,可以新添员工,并将员工的数据输入,并利用写入函数,写入文件中。在增加后会提示是否继续增加,提供了方便。并且如果原数据中有相同编号的员工,会在输入编号后提示有相同的编号的员工,并重新输入编号。增加了程序的健全性。

更新数据函数,以编号来确定更新的员工,更新将重新输入该编号员工的信息,并在更新后执行写入。

删除函数,执行该函数后,将有两种选择,按编号删除,或按名字删除,正确输入后将会将该编号或姓名的数据中的一项zt的值更改为1,使其在其他操作时不被识别,以达到不删除数据,但达到相同的效果的逻辑删除。

显示函数,有两种显示方式,按学号显示或按名字显示,学号显示为从小到大显示。

重组函数,将文件中逻辑删除的数据物理删除,用来节省储存空间,并可以加快运算速度。

统计数据,将文件中的数据统计、计算,并输出,给人以直观的方式显示数据。

排序函数,将数据以实发工资从大到小排序。

2.2 系统流程设计

3编码实现

#define MAX 100

#include

#include

#include

struct user //登陆者信息

{

char un[10];

char up[10];

}us[3] = { "aaa","111","bbb","222","ccc","333" };

struct yg //员工结构体

{

short zt; //数据状态

long bh; //编号

char name[20]; //名字

char time[11]; //时间

long money; //基本工资

long jj; //奖金

long kk; //扣款

long sf; //实发工资

};

yg y[MAX]; //定义数据体数组

int r = 0; //全局变量,人数,包括逻辑删除人数

int p = 0; //登陆的次数,用全局变量能在登陆三次失败时退出程序

void read() //读取文件函数

{

FILE *fp;

char b;

int i;

b = '0';

printf("即将读取文件员工信息.dat\n");

if ((fp = fopen("员工信息.dat", "rb")) == NULL) //读取文件

{

printf("员工信息.dat 文件不存在\n");

printf("是否重新创建该文件?\n");

printf("创建(y) 员工信息.dat 或退出(n)\n");

getchar();

b = getchar();

while (getchar() != '\n')

if (b == 'Y' || b == 'N')

b += 32;

while (b != 'y'&&b != 'n')

{

printf("输入错误!请重新输入!\n");

b = getchar();

while (getchar() != '\n')

if (b == 'Y' || b == 'N')

b += 32;

}

if (b == 'y')

if ((fp = fopen("员工信息.dat", "wb")) == NULL) //文件不存在则创建文件

{

printf("创建文件失败!\n");

printf("按下任意键以退出程序!\n");

getchar();

exit(1);

}

}

if (b == '0')

{

fread(&r, 4, 1, fp);

printf("读取成功!\n");

}

else

printf("创建文件成功!\n");

if (r != 0)

for (i = 0; i < r; i++)

fread(&y[i], sizeof(yg), 1, fp);

fclose(fp);

}

void save() //保存文件函数

{

FILE *fp;

int i;

if ((fp = fopen("员工信息.dat", "wb")) == NULL)

{

printf("保存文件失败!\n");

printf("按下任意键以退出程序!\n");

getchar();

exit(1);

}

else

{

fwrite(&r, 4, 1, fp);

if (r != 0)

for (i = 0; i < r; i++)

fwrite(&y[i], sizeof(yg), 1, fp);

}

fclose(fp);

}

void zj_data() //增加数据函数

{

yg yuangong;

char b;

int i;

int k = 0;

yuangong.zt = 0; //新建员工信息时,状态为0 do //用循环来寻找、避免相同编号的员工{

printf("编号:(例如:123456)\n");

scanf("%d", &yuangong.bh);

for (i = 0; i < r; i++)

if (y[i].bh == yuangong.bh&&y[i].zt==0)

{

printf("已有同编号员工无法添加!\n");

printf("请重新输入!\n");

k = 1;

break;

}

else if (i == r - 1)

k = 0;

} while (k == 1);

printf("姓名:(例如:张三(or tom))\n");

scanf("%s", https://www.docsj.com/doc/ab10819362.html,);

printf("年月:(例如:2015.11.11)\n");

scanf("%s", yuangong.time);

printf("岗位工资:(例如:50000)\n");

scanf("%d", &yuangong.money);

printf("奖金:(例如:2000)\n");

scanf("%d", &yuangong.jj);

printf("扣款:(例如:100)\n");

scanf("%d", &yuangong.kk);

printf("实发工资为:(岗位工资+奖金-扣款)\n");

yuangong.sf = yuangong.money + yuangong.jj - yuangong.kk;

printf("%d\n", yuangong.sf);

y[r] = yuangong;

r++; //新建员工信息时人数r++ save();

printf("添加成功!\n");

getchar(); //防止下面一个%c读取到上一个的回车printf("是否继续添加员工?(y/n)\n");

b = getchar();

while (getchar() != '\n');

if (b == 'Y' || b == 'N')

b += 32;

while (b != 'y'&&b != 'n')

{

printf("输入错误!请重新输入!\n");

b = getchar();

while (getchar() != '\n')

if (b == 'Y' || b == 'N')

b += 32;

}

if (b == 'y')

zj_data();

}

void gx_data() //更新数据{

yg yuangong;

long num;

int i;

printf("\n请输入要更新的员工的编号!\n");

scanf("%d", &num);

for (i = 0; i < r; i++)

if (y[i].bh == num&&y[i].zt == 0)

{

yuangong = y[i];

printf("当前该员工信息为:\n");

printf("编号:%d\n", yuangong.bh);

printf("姓名:%s\n", https://www.docsj.com/doc/ab10819362.html,);

printf("年月:%s\n", yuangong.time);

printf("岗位工资:%d\n", yuangong.money);

printf("奖金:%d\n", yuangong.jj);

printf("扣款:%d\n", yuangong.kk);

printf("实发工资:%d\n", yuangong.sf);

printf("按下任意键输入更新后的信息!\n");

getchar();

getchar();

printf("编号:(例如:123456)\n");

scanf("%d", &yuangong.bh);

printf("姓名:(例如:张三(or tom))\n");

scanf("%s", https://www.docsj.com/doc/ab10819362.html,);

printf("年月:(例如:2015.11.11)\n");

scanf("%s", yuangong.time);

printf("岗位工资:(例如:50000)\n");

scanf("%d", &yuangong.money);

printf("奖金:(例如:2000)\n");

scanf("%d", &yuangong.jj);

printf("扣款:(例如:100)\n");

scanf("%d", &yuangong.kk);

printf("实发工资为:(岗位工资+奖金-扣款)\n");

yuangong.sf = yuangong.money + yuangong.jj - yuangong.kk;

printf("%d\n", yuangong.sf);

y[i] = yuangong;

save();

printf("更新成功!\n");

break;

}

else if (i == r - 1)

printf("查无此人!\n");

}

void cz_data() //查询数据

{

yg yuangong;

int a, i;

long num;

char na[10];

printf("\n请选择查询方式!\n"); //分为按编号查询和姓名查询

printf(" *******************\n");

printf(" * 1、编号查询 *\n");

printf(" * 2、姓名查询 *\n");

printf(" * 3、返回菜单 *\n");

printf(" *******************\n");

scanf("%d", &a);

if (a == 1)

{

printf("请输入查询员工的编号:");

scanf("%d", &num);

for (i = 0; i < r; i++) //编号查询则循环r次,查找状态为0且编号与所输入的数字相同的数据

if (y[i].zt == 0 && y[i].bh == num)

{

yuangong = y[i];

printf("当前该员工信息为:\n");

printf("编号:%d\n", yuangong.bh);

printf("姓名:%s\n", https://www.docsj.com/doc/ab10819362.html,);

printf("年月:%s\n", yuangong.time);

printf("岗位工资:%d\n", yuangong.money);

printf("奖金:%d\n", yuangong.jj);

printf("扣款:%d\n", yuangong.kk);

printf("实发工资:%d\n", yuangong.sf);

break;

}

else if (i == r - 1)

printf("查无此人!\n");

}

else if (a == 2)

{

printf("请输入查询员工的姓名:");

scanf("%s", na);

for (i = 0; i < r; i++) //姓名查询则循环r次,查找状态为0且编号与所输入的字符串相同的数据

if ((strcmp(y[i].name, na) == 0) && y[i].zt == 0)

{

yuangong = y[i];

printf("当前该员工信息为:\n");

printf("编号:%d\n", yuangong.bh);

printf("姓名:%s\n", https://www.docsj.com/doc/ab10819362.html,);

printf("年月:%s\n", yuangong.time);

printf("岗位工资:%d\n", yuangong.money);

printf("奖金:%d\n", yuangong.jj);

printf("扣款:%d\n", yuangong.kk);

printf("实发工资:%d\n", yuangong.sf);

break;

}

else if (i == r - 1)

printf("查无此人!\n");

}

else if (a == 3)

{

}

else

{

printf("输入错误!\n");

cz_data();

}

}

void sc_data() //删除数据{

yg yuangong;

long num;

int a, i, b;

char na[10];

printf("\n请选择!\n"); //删除也按编号删除和姓名删除

printf(" *********************\n");

printf(" * 1、按编号删除 *\n");

printf(" * 2、按姓名删除 *\n");

printf(" * 3、返回主菜单 *\n");

printf(" *********************\n");

scanf("%d", &a);

if (a == 1)

{

printf("请输入要删除员工的编号:");

scanf("%d", &num);

for (i = 0; i < r; i++)

if (y[i].zt == 0 && y[i].bh == num)

{

yuangong = y[i];

printf("当前该员工信息为:\n");

printf("编号:%d\n", yuangong.bh);

printf("姓名:%s\n", https://www.docsj.com/doc/ab10819362.html,);

printf("年月:%s\n", yuangong.time);

printf("岗位工资:%d\n", yuangong.money);

相关文档