资源描述
- .
C语言程序设计报告
课程名称:C语言程序设计
院 系: 管理与经济学院
专业班级: 工业工程2012142班
学 号:201214217
学生XX:海蛟
指导教师:雪青
完成时间:2013-06-20
报告成绩:
目录
1、设计题目--------------------------------------------------------------------------2
2、设计要求〔包括设计容描述〕--------------------------------------------2
3、设计作用与目的-----------------------------------------------------------------3
4、所用软件--------------------------------------------------------------------------3
5、系统设计--------------------------------------------------------------------------4
5.1 系统构造----------------------------------------------------------------------4
5.2 程序程序图-------------------------------------------------------------------4
5.3 产生源程序----------------------------------------------------------------------6
6、实验调试结果〔附运行效果图〕--------------------------------------------36
7、设计中的问题及解决方法-----------------------------------------------------39
8、设计心得--------------------------------------------------------------------------40
9、参考文献--------------------------------------------------------------------------41
职工工资管理系统的设计与实现
1.设计题目
题目:工资管理系统
工资管理系统是企业不可缺少的一局部,它利用计算机对员工工资进展统一管理,实现工资管理系统的系统化、规化和自动化,为企业提高工作效率。本程序旨在训练读者的根本编程能力,了解管理信息系统的开发流程,熟悉C语言的文件和构造数组的各种根本操作。本程序中涉及构造体、数组、文件等方面的知识。
2.设计要求
1、启动软件时,进展密码校验。假设出错三次,那么自动退出系统。
2、实现简易的提示菜单界面,刚运行时应显示版本信息。用所学的知识尽量实现良好的、美观的“人机界面〞,便于软件的操作使用。
3、要求把所有录入的数据以文件的形式,保存在硬盘上。
4、系统包含以下根本功能:登陆功能、显示主菜单功能、职工信息输入信息输出、职工信息查询、职工信息修改、工资排序、工资统计、导出数据、导入数据、退出等。
5、职工信息输入信息输出要求一个职工的根本信息(编号、XX、根本工资)的录入,以文件形式保存——输入。
6、职工工资表浏览工资功能——输出。
7、计算职工的工资〔输入根本工资、扣款、奖金后,马上算出应发工资、税金、实发工资、总工资〕。
8、查询、排序功能——算法。
1) 按编号查询、排序。
2) 按XX查询。
3) 按工资排序。
4) 根本信息的删除与修改〔可选项〕。
3.设计作用与目的
1、通过这次专题实习,稳固和加深对所学相关知识点的理解。
2、进一步熟悉根本流程控制构造——实现分支的if…else语句、switch语句和实现循环的for、while…、do…while语句、break、continue等。
3、根本数据类型、数组、构造体、自定义类、函数的应用。
4、加强对模块化程序设计和面向对象程序设计的理解。
5、掌握C语言程序设计的根本思想,了解简单的系统分析和
6、了解数据库系统的理论
7、掌握数据库设计的根本方法,熟悉数据库设计的步骤;
8、学习根本数据库编程方法。
9、进一步稳固、加深学生所学专业课程?C语言程序设计?的根本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。
10全面考核学生所掌握的根本理论知识及其实际业务能力,从而到达提高学生素质的最终目的。
11利用所学知识,开发小型应用系统,掌握运用C语言编写调试应用系统程序,训练独立开发应用系统,进展数据处理的综合能力。
12对于给定的设计题目,如何进展分析,理清思路,并给出相应的数学模型。
13掌握面向对象的程序设计方法。
14进一步掌握在集成环境下如何调试程序〔单步调试,设置断点、观察表达式,分块调试〕、修改程序和程序的测试。
4.运行环境及工具软件
Windows XP;
Visual C++ 6.0〔完整绿色版〕;
5.系统设计
5.1 程序逻辑图
职工工资管理系统
登陆功能
用户管理
职工信息输入
职工信息输出
职工工资信息查询
计算
职工信息修改
工资排序
工资统计
导出数据
导入数据
工资计算
退出
图1:系统构造框图
5.2 程序流程图
选择2
选择1
开场
系统登录
主页面
初始化双链表
录入职工工资
修改职工工资
选择操作
查询职工工资
选择3
浏览职工工资
选择4
选择6
选择9
选择8
选择7
选择5
删除职工工资
删插入职工工资
职工工资排序
保存职工工资
平安退出系统
按编号删除
完毕
6.源程序代码
#include <stdio.h> //标准输入输出
#include <stdlib.h> //处理杂乱
#include <windows.h> //Sleep()
#include <string.h> //字符串操作
#include <conio.h> //系统输入输出
#include <time.h> //时间相关
/**********************下面是对用到的全局常量声明*************************/
#define NAME 10 //职工职工XX长度
#define PASSWORD "123" //系统登陆密码
int shuru=0; //全局变量标记当前录入职工个数
FILE *fp; //声明一个文件指针
/**************************构造体定义************************************/
struct person{ //职工工资的构造体
char name[NAME]; //职工职工XX
int num; //职工编号
float paid; //职工根本工资
float discount; //扣款
float extra; //奖金
float fare;//税金
float gotpaid;//应发工资
float realpaid; //实发工资
float sum; //总工资
}*pp; //声明一个构造指针
/**********************下面是对用到的函数声明*****************************/
void Password(); //密码验证函数
void Save(struct person per[]); //保存信息函数
void Inputper(struct person per[]); //录入信息函数
void Delper(struct person per[]); //删除信息函数
void Modifyper(struct person per[]); //修改信息函数
void Findper(struct person per[]); //查找信息函数
void Insertper(struct person per[]); //插入信息函数
void Sortper(struct person per[]); //排 序 函 数
void Listper(struct person per[]); //显示职工信息
void fare(struct person per[],int n);//计算税金函数
void Menu();
void Help();
//**************************程序主体**************************************
void main() //程序入口
{
system("color 027"); //设置当前窗口的背风光和前风光
Password(); //调用密码验函数
Help(); //调用系统信息函数
Menu(); //调用菜单函数
}
void Inputper(struct person per[]) //录入职工工资函数原形
{
pp=per; //指针指向构造
system("cls"); //清屏
int i;
printf("请问你要输入几个职工的信息:");
scanf("%d",&shuru);
if((fp=fopen("inputdata","wb+"))==NULL) //当前目录下是否存在INPUTDATA文件
{ //"wb+":读写翻开或建立一个二进制文件,允许读和写
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
fprintf(fp,"职工编号 职工XX 根本工资 扣款 奖金 应发工资 税金 实发工作 总工资\n");
for(i=0;i<shuru;i++)
{
printf("输入职工编号:"); //输入职工编号
fflush(stdin);
scanf("%d",&per[i].num);
printf("输入职工XX:"); //输入职工XX
fflush(stdin);
gets(per[i].name);
printf("输入职工的工资信息\n");
printf("------------------------------\n");
printf("\n根本工资: "); //根本工资
fflush(stdin);
scanf("%f",&per[i].paid);
printf("\n扣款: "); //扣款
fflush(stdin);
scanf("%f",&per[i].discount);
printf("\n奖金: "); //奖金
fflush(stdin);
scanf("%f",&per[i].extra);
printf("\n税金: "); //税金
printf("------------------------------\n");
per[i].sum=per[i].paid-per[i].discount+per[i].extra;
per[i].realpaid=per[i].paid-per[i].discount;
fprintf(fp," %6d %8s %5.1f\t %5.1f\t %3.1f\t %5.1f\t %4.1f\t\n",per[i].num,per[i].name,per[i].paid,per[i].discount,per[i].extra,per[i].realpaid,per[i].sum);
}
}
void Modifyper(struct person per[])
{
pp=per;
int id,i=0; //id为接收用户输入的职工编号
if((fp=fopen("modifydata.sys","wb+"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
fprintf(fp,"职工编号 职工XX 根本工资 扣款 奖金 应发工资 税金 实发工资 总工资\n");
printf("\n请输入你要修改的职工的编号:");
scanf("%d",&id);
Sleep(500);
printf("\n\t查找相关数据.");
for(i=0;i<=15;i++)
{
Sleep(250);
printf(".");
}
for(i=0;i<shuru;i++)
{
if(per[i].num==id) //如果找到了就执行下面语句 ,找不到直接回主界面
{
printf("\n输入新职工编号:"); //输入职工编号
fflush(stdin);
scanf("%d",&per[i].num);
printf("\n输入新职工XX:"); //输入职工XX
fflush(stdin);
gets(per[i].name);
printf("输入职工的工资信息\n");
printf("------------------------------\n");
printf("\n根本工资: ");
scanf("%f",&per[i].paid);
fflush(stdin);
printf("\n扣款: ");
scanf("%f",&per[i].discount);
fflush(stdin);
printf("\n 奖金: ");
scanf("%f",&per[i].extra);
printf("------------------------------\n");
per[i].sum=per[i].paid-per[i].discount+per[i].extra;
per[i].realpaid=per[i].paid-per[i].discount;
fprintf(fp," %6d %8s %5.1f\t %5.1f\t %3.1f\t %5.1f\t %4.1f\t\n",per[i].num,per[i].name,per[i].paid,per[i].discount,per[i].extra,per[i].realpaid,per[i].sum);
}
}
}
void Findper(struct person per[]) //查询职工工资信息
{
int i=0,j=0,id; //循环变量和用于接收职工编号
printf("请输入你要查询的职工编号:");
scanf("%d",&id);
for(i=0;i<shuru;i++)
{
if (per[i].num==id) //如果找到你查询的数据就执行下面语句
{ //如果找不到。直接回程序主界%
per[i].sum=per[i].paid-per[i].discount+per[i].extra;
per[i].realpaid=per[i].paid-per[i].discount;
printf("\n职工编号 职工XX 根本工资 扣款 奖金 应发工资 税金 实发工资 总工资 \n");
printf("\n%6d %8s %5.1f\t %5.1f\t %3.1f\t %5.1f\t %5.1f\t %5.1f\t %4.1f\t \n\n",per[i].num,per[i].name,per[i].paid,per[i].discount,per[i].extra,per[i].gotpaid,per[i].fare,per[i].realpaid,per[i].sum);
system("pause");
}
}
}
void Insertper(struct person per[]) //插入职工工资信息
{
int flag=1;
pp=per;
int i,id;
if((fp=fopen("insertdata.sys","wb+"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
fprintf(fp,"职工编号 职工XX 根本工资 扣款 奖金 应发工资 税金 实发工资 总工资\n");
printf("输入你插入的职工编号:");
scanf("%d",&id);
for(i=0;i<shuru;i++)
{
if(per[i].num==id) //判断职工编号信息否存在?
{
printf("职工编号信息已经存在!\n");
flag=0;
getch();
break;
}
}
if (flag!=0)
{
shuru++; //插入一个,原来的总数增加1
printf("请确认输入要插入职工编号:");
scanf("%d",&per[shuru-1].num); //如果不存在..那么就把插入的信息放到构造数组最后
printf("输入职工XX:");
fflush(stdin);
gets(per[shuru-1].name);
printf("输入职工的工资信息\n");
printf("------------------------------\n");
printf("\n根本工资: ");
fflush(stdin);
scanf("%f",&per[shuru-1].paid);
printf("\n扣款: ");
fflush(stdin);
scanf("%f",&per[shuru-1].discount);
printf("\n奖金: "); //奖金
fflush(stdin);
printf("\n税金: "); //税金
fflush(stdin);
printf("------------------------------\n");
per[i].sum=per[i].paid-per[i].discount+per[i].extra;
per[i].realpaid=per[i].paid-per[i].discount;
fprintf(fp," %6d %8s %5.1f\t %5.1f\t %3.1f\t %5.1f\t %4.1f\t\n",per[shuru-1].num,per[shuru-1].name,per[shuru-1].paid,per[shuru-1].discount,per[shuru-1].extra,per[i].realpaid,per[shuru-1].sum);
Sleep(500);
printf("插入数据成功!\n");
getch();
}
}
void Listper(struct person per[]) //浏览所有职工工
{
int i=0;
for(i=0;i<shuru;i++)
{ per[i].gotpaid=per[i].paid-per[i].discount;
if (per[i].gotpaid<2000)
per[i].fare=0;
else if (per[i].gotpaid>=2000&&per[i].gotpaid<4999)
per[i].fare=per[i].gotpaid*0.05;
else if (per[i].gotpaid>=5000&&per[i].gotpaid<10000)
per[i].fare=per[i].gotpaid*0.1;
else if (per[i].gotpaid>=10000&&per[i].gotpaid<99999)
per[i].fare=per[i].gotpaid*0.25;
else if (per[i].gotpaid>=100000)
per[i].fare=per[i].gotpaid*0.3;
per[i].sum=per[i].paid-per[i].discount+per[i].extra;
per[i].realpaid=per[i].paid-per[i].discount;
}
printf("\n职工编号 职工XX 根本工资 扣款 奖金 应发工资 税金 实发工资 总工资\n");
for(i=0;i<shuru;i++)
{
printf("\n %6d %8s %5.1f\t %5.1f\t %3.1f\t %5.1f\t %5.1f\t %4.1f\t %5.1f\t",per[i].num,per[i].name,per[i].paid,per[i].discount,per[i].extra,per[i].gotpaid,per[i].fare,per[i].realpaid, per[i].sum);
}
getch();
}
void Delper(struct person per[]) //删除职工信息函数
{
pp=per;
struct person temp;
int delnum;
char ask;
int i,j;
if((fp=fopen("Deldata.sys","wb+"))==NULL)
{
printf("Cannot open file strike any key exit!");
getch();
exit(1);
}
fprintf(fp,"职工编号 职工XX 根本工资 扣款 奖金 应发工资 税金 实发工资 总工资\n");
system("cls");
printf("\n\n\t请输入你要删除的职工的职工编号:");
fflush(stdin);
scanf("%d",&delnum);
printf("\n\t是否确认删除职工%d的信息(y/n)",delnum);
fflush(stdin);
ask = getchar();
if(ask != 'n')
{
for(i=0;i<shuru;i++)
{
if(per[i].num == delnum)
break;
}
if(i > shuru)
printf("\n\t没有你要删除的职工!\n");
else
{
for(j=i;j<shuru;j++)
{
temp = per[j];
per[j] = per[j+1];
per[j+1] = temp;
}
shuru--; //删掉一个职工信息后职工总数相应-1
system("cls");
printf("\n\n删除成功!\n");
}
per[i].sum=per[i].paid-per[i].discount+per[i].extra;
per[i].realpaid=per[i].paid-per[i].discount;
fprintf(fp," %6d %8s \t%5.1f \t%5.1f \t%5.1f \t%5.1f \t%4.1f\n",per[i].num,per[i].name,per[i].paid,per[i].discount,per[i].extra,per[i].realpaid,per[i].sum);
getch();
}
}
void Sortper(struct person per[]) //排序函数
{
int i,j,chose; //i,j为循环变量 chose为接收用户输入的排序方式
struct person temp;
printf("排序前的数据为\n");
printf("\n职工编号 职工XX 根本工资 扣款 奖金 应发工资 税金 实发工资 总工资\n");
for(i=0;i<shuru;i++)
{
printf("\n %6d %8s %5.1f\t %5.1f\t %3.1f\t %5.1f\t %4.1f\t\n",per[i].num,per[i].name,per[i].paid,per[i].discount,per[i].extra,per[i].realpaid,per[i].sum);
}
printf("\n1.按职工编号排序\t2.按总工资(高→低)排序\n");
printf("\n请您正确选择:");
fflush(stdin);
scanf("%d",&chose);
if(chose==1)
{
for(i=0;i<shuru-1;i++)
{
for(j=i+1;j<shuru;j++)
{
if(per[i].num>per[j].num)
{
temp=per[i];
per[i]=per[j];
per[j]=temp;
}
}
}
printf("\n职工编号 职工XX 根本工资 扣款 奖金 应发工资 税金 实发工资 总工资\n");
for(i=0;i<shuru;i++)
{
printf("\n %6d %8s %5.1f\t %5.1f\t %3.1f\t %5.1f\t %4.1f\t\n",per[i].num,per[i].name,per[i].paid,per[i].discount,per[i].extra,per[i].realpaid,per[i].sum);
}
system("pause");
}
else if(chose==2)
{
for(i=0;i<shuru-1;i++)
{
for(j=i+1;j<shuru;j++)
{
if(per[i].sum<per[j].sum)
{
temp=per[i];
per[i]=per[j];
per[j]=temp;
}
}
}
printf("\n职工编号 职工XX 根本工资 扣款 奖金 应发工资 税金 实发工资 总工资\n");
for(i=0;i<shuru;i++)
{
printf("\n %6d %8s %5.1f\t %5.1f\t %3.1f\t %5.1f\t %4.1f\n",per[i].num,per[i].name,per[i].paid,per[i].discount,per[i].extra,per[i].realpaid,per[i].sum);
}
system("pause");
}
}
void Password() //密码验证函数
{
char *pass=NULL; //初始化指针
int i,count;
time_t start,end; //时间函数
pass=(char *)malloc(255*sizeof(char)); //分配存
while(1)
{
count=0;
printf("\n\n\n\n\n\t\t\t职 工 工 资 管 理 系 统 \n");
printf("\n\t\t UserName:海蛟 \n");
printf("\n\t\t PassWord:");
while((count>=0)&&(pass[count++]=getch())!=13) //密码输入
{
if(pass[0]=='\b')
{
count=0;
continue;
}
else if(pass[count-1]=='\b')
{
printf("%c%c%c",'\b','\0','\b');
count-=2;
}
else
putchar('*');
}
pass[--count]='\0';
if(!strcmp(pass,PASSWORD)) //开场验证
{
printf("\n\n\t\t\t\t\t\tLogining");
for(i=0;i<=25;i++)
{
Sleep(250);
printf(".");
}
system("cls");
printf("\n\n\n\n\n\n\n\n\n\t\t\t");
printf(" 欢 迎 登 陆 职 工 工 资 管 理 系 统 !\n\n");
start=time(NULL);
end=time(NULL);
while(end-start<2) //延时2秒执行以下程序
{
end=time(NULL);
}
system("cls");
free(pass); //释放储存密码的存
return ;
}
free(pass); //释放密码错误的那块存
pass=(char *)malloc(255*sizeof(char)); //重新分配储存密码存
system("cls");
printf("\a\n\n\n\n\n\n\n\n\t\t\t\t密 码 错 误 !");
getch();
system("cls");
}
}
void Menu()
{
struct person per[50]; //最大职工人数
struct person *p; //声明一个构造指针
p=per; //指针指向构造变量per
int i,in; //接收用户的选择
char ch; //用于判断是否继续
do
{
system("cls");
printf("\n\n");
printf("\t\t =============================================\n");
printf("\t\t * 职 工 工 资 管 理 系 统 *\n");
printf("\t\t *===========================================*\n");
printf("\t\t * 1. 录入职工工资 *\n");
printf("\t\t * *\n");
printf("\t\t * 2. 修改职工工资 *\n");
printf("\t\t * *\n");
printf("\t\t * 3. 查询职工工资 *\n");
printf("\t\t * *\n");
printf("\t\t * 4. 浏览职工工资 *\n");
printf("\t\t * *\n");
printf("\t\t * 5. 删除职工工资 *\n");
printf("\t\t * *\n");
printf("\t\t * 6. 插入职工工资 *\n");
printf("\t\t * *\n");
printf("\t\t * 7. 职工工资排序 *\n");
printf("\t\t * *\n");
printf("\t\t * 8. 保存职工工资 *\n");
printf("\t\t * *\n");
printf("\t\t * 9. 平安退出系统 *\n");
printf("\t\t =============================================\n");
printf("\t\t 请您正确选择: ");
if(!(scanf("%d",&in)==1))
{
while((ch=getchar())!='\n')
putchar(ch);
printf(" 没有此选项,请正确选择!");
getch();
continue;
}
fflush(stdin);
switch(in)
{
case 1:
Inputper(per); //调用录入职工工资函数
break;
case 2:
Modifyper(per); //调用修改职工工资函函数
break;
case 3:
Findper(per); //调用查询职工工资函数
break;
case 4:
Listper(per); //调用浏览职工工资函数
break;
case 5:
Delper(per); //调用删除职工工资函数
break;
case 6:
Insertper(per); //插入职工工资信息
break;
case 7:
Sortper(per); //调用职工工资排序函数
break;
case 8:
Save(per); //保存职工工资函数
break;
case 9: //退出系统
break;
default:
printf("没有此选项,请正确选择!");
getch();
break;
}
}while(in!=9);
system("cls");
printf("\n\n\n\n\n\n\n\n\t\t\t");
printf("谢 谢 使 用 本 系 统 !\n\n");
printf("\n\n\t\t\t\t\tEnding");
for(i=0;i<=30;i++)
{
Sleep(300);
printf(".");
}
printf("\n");
}
void Help()
{
printf("====================================================================\n");
printf("\n\n\t\t\t\t系 统 信 息\n");
printf("====================================================================\n");
printf("\n\n\t\t本系统是职工工资管理系统,在职工的XX栏可以输入汉字");
printf("\n\t\t如果在输入中没看到任何信息那么是因为输入错误或无信息");
printf("\n\t\t系统中的 :实发工资 = 根本工资 - 扣款 ,不需要输入");
pri
展开阅读全文