You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

369 lines
9.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
void xitong ( );//系统总体框架
void shuru(FILE *);//实现输入数据
void xianshi(FILE *);//实现显示数据
void chazhao(FILE *);//实现查找数据
void shanchu(FILE *,char *s);//实现删除数据
void tongji(FILE *);//实现统计
void xiugai(char *);//实现修改数据
struct tongjishuju {//用于统计的数组
double pjgz1;//基本工资平均值
double pjgz2;//职务工资平均值
double pjgz3;//津贴平均值
double pjgz4;//医疗保险
double pjgz5;//公积金
double pjzgz;//总工资
};
struct zhigong {//职工数组
char id[3];//序号
char name[8];//名字
int jibengongzi;//基本工资
int zhiwugongzi;//职务工资
int jintie;//津贴
int yiliaobaoxian;//医疗保险
int gongjijin;//公积金
int zonggongzi;//总工资
};
void xitong( ) {//框架函数
int a,x;//a用来选择功能x用来选择打开旧文件还是新建新文件
system("mode con cols=100 lines=40");
system("color bc");
printf("\t\t\t\t ☆欢迎使用职工工资系统☆\n");
char s[20];//存储文件名字
FILE *fp=NULL;
printf("是否需要新建一个文件\n");
printf("1:是 2:否\n");
scanf("%d",&x);//选择打开旧文件还是新建新文件
TTTT://实现重新输入
if(x==2) {
printf("请输入您需要打开的文件名\n");
scanf("%s",s);
if((fp=fopen(s,"a+"))==NULL) { //判断文件是否正确打开
printf("文件打开错误,请重新输入\n");
goto TTTT; //实现重新输入
}
}
if(x==1) {
printf("请输入您需要新建的文件名\n");
scanf("%s",s);
if((fp=fopen(s,"w+"))==NULL) { //判断文件是否正确打开
printf("文件打开错误,请重新输入\n");
goto TTTT; //实现重新输入
}
}
system("cls");
printf(" 请选择您所需要的功能\n");
printf("1.输入信息 2.显示信息\n");
printf("3.修改信息 4.查找信息\n");
printf("5.删除信息 6.统计信息\n");
printf("输入其他,关闭程序\n");
scanf("%d",&a);
switch(a) { //实现各个功能
case 1://输入
system("cls");
shuru(fp);
break;
case 2://显示
system("cls");
xianshi(fp);
break;
case 3://修改
system("cls");
xiugai(s);
fclose(fp);
break;
case 4://查找
system("cls");
chazhao(fp);
break;
case 5://删除
system("cls");
shanchu(fp,s);
break;
case 6://统计
system("cls");
tongji(fp);
break;
default://关闭
exit(1);
}
}
void shuru(FILE *fp) {
int c;//实现继续和返回主菜单
printf("请输入您所需要增加的数据\n");
printf("ID号\t姓名\t基本工资\t职务工资\t津贴\t医疗保险\t公积金\n");
struct zhigong a;
scanf("%s%s%d%d%d%d%d",a.id,a.name,&a.jibengongzi,&a.zhiwugongzi,&a.jintie,&a.yiliaobaoxian,&a.gongjijin);
a.zonggongzi=a.jibengongzi+a.gongjijin+a.jintie+a.yiliaobaoxian+a.zhiwugongzi;
fprintf(fp,"%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",a.id,a.name,a.jibengongzi,a.zhiwugongzi,a.jintie,a.yiliaobaoxian,a.gongjijin,a.zonggongzi);//将内容输入到文件中
printf("输入1:返回主界面 输入2:继续输入 输入其他:关闭程序\n");
scanf("%d",&c);
if(c==1) {
fclose(fp);
xitong( );
} else if(c==2) {
shuru(fp);
} else
fclose(fp);
}
void chazhao(FILE *fp) {
int l;//实现继续和返回主菜单
char c[20];
printf("请输入您所需要查找的数据的姓名\n");
struct zhigong a;
scanf("%s",c);//输入查找的名字
while(1) {
if(fscanf(fp,"%s%s%d%d%d%d%d%d",a.id,a.name,&a.jibengongzi,&a.zhiwugongzi,&a.jintie,&a.yiliaobaoxian,&a.gongjijin,&a.zonggongzi)==EOF)
break;
if(strcmp(c,a.name)==0) {//已找到
printf("\t%d\t%d\t%d\t%d\t%d\t%d\n",a.jibengongzi,a.zhiwugongzi,a.jintie,a.yiliaobaoxian,a.gongjijin,a.zonggongzi);
break;
}
}
if(feof(fp)!=0) {//未找到
printf("没能找到有关数据\n");
}
printf("输入1:返回主界面 输入2:继续查找 输入其他:关闭程序\n");
scanf("%d",&l);
if(l==1) {
fclose(fp);
xitong( );
} else if(l==2) {
rewind(fp);
chazhao(fp);
} else
fclose(fp);
}
void xianshi(FILE *fp) {
int l,n;//l实现继续和返回主菜单,n计人数
char c[20][8];//姓名
struct zhigong a;
int i,f=0;//i实现循环,f算总和
printf("ID号 姓名 基本工资 职务工资 津贴 医疗保险 公积金 总工资\n");
for(i=0; i<100; i++) {//一一显示
if(fscanf(fp,"%s%s%d%d%d%d%d%d",a.id,a.name,&a.jibengongzi,&a.zhiwugongzi,&a.jintie,&a.yiliaobaoxian,&a.gongjijin,&a.zonggongzi)!=EOF)
printf("%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",a.id,a.name,a.jibengongzi,a.zhiwugongzi,a.jintie,a.yiliaobaoxian,a.gongjijin,a.zonggongzi);
else
break;
}
tttt://前面的功能不需要重复实现
printf("请输入您所需要查找的数据的数目\n");
scanf("%d",&n);
printf("请输入您所需要查找的数据的姓名\n");
for(i=0; i<n; i++) {
rewind(fp);//指针回到文件开始处
scanf("%s",c[i]);
while(1) {
if(fscanf(fp,"%s%s%d%d%d%d%d%d",a.id,a.name,&a.jibengongzi,&a.zhiwugongzi,&a.jintie,&a.yiliaobaoxian,&a.gongjijin,&a.zonggongzi)==EOF)
break;
if(strcmp(c[i],a.name)==0) {
printf("\t%d\t%d\t%d\t%d\t%d\t%d\n",a.jibengongzi,a.zhiwugongzi,a.jintie,a.yiliaobaoxian,a.gongjijin,a.zonggongzi);
f+=a.zonggongzi;//计数
break;
}
}
if(feof(fp)!=0) {
printf("没能找到有关数据\n");
}
}
if(n==0)
printf("平均总工资是0\n");
else
printf("平均总工资是%lf\n",(double)f/n);//算平均值
printf("输入1:返回主界面 输入2:继续查找 输入其他:关闭程序\n");
scanf("%d",&l);
if(l==1) {
fclose(fp);
xitong( );
} else if(l==2) {
rewind(fp);
goto tttt;
} else
fclose(fp);
}
void tongji(FILE *fp) {
int c,f;//f计数c实现继续和返回主菜单
int sum=0,i,q,m1=0,m2=0,m3=0;//实现循环和做和
struct tongjishuju a;
struct zhigong b[100];//收集文件的内容
printf("请选择您需要的功能\n");
printf("1,输出符合职工工资前三项之和在3000元以上、3000~2000元、2000~1000元的职工百分比\n");
printf("2.输出工资信息表及平均工资\n");
for(i=0; i<100; i++) {
if(fscanf(fp,"%s%s%d%d%d%d%d%d",b[i].id,b[i].name,&b[i].jibengongzi,&b[i].zhiwugongzi,&b[i].jintie,&b[i].yiliaobaoxian,&b[i].gongjijin,&b[i].zonggongzi)==EOF)
break;
}
f=i;
for(i=0; i<f; i++)//计算基本工资平均值
sum+=b[i].jibengongzi;
a.pjgz1=(double)sum/(f);
sum=0;
for(i=0; i<f; i++)//计算职务工资平均值
sum+=b[i].zhiwugongzi;
a.pjgz2=(double)sum/(f);
sum=0;
for(i=0; i<f; i++)//计算津贴平均值
sum+=b[i].jintie;
a.pjgz3=(double)sum/(f);
sum=0;
for(i=0; i<f; i++)//计算医疗保险平均值
sum+=b[i].yiliaobaoxian;
a.pjgz4=(double)sum/(f);
sum=0;
for(i=0; i<f; i++)//计算公积金平均值
sum+=b[i].gongjijin;
a.pjgz5=(double)sum/(f);
sum=0;
for(i=0; i<f; i++)//计算总工资平均值
sum+=b[i].zonggongzi;
a.pjzgz=(double)sum/(f);
scanf("%d",&q);
switch(q) {
case 1://计数实现统计3000元以上占比3000~2000元占比2000元~1000元占比
for(i=0; i<f; i++) {
if((b[i].jibengongzi+b[i].zhiwugongzi+b[i].jintie)>=3000)
m1++;
if((b[i].jibengongzi+b[i].zhiwugongzi+b[i].jintie)>=2000&&(b[i].jibengongzi+b[i].zhiwugongzi+b[i].jintie)<3000)
m2++;
if((b[i].jibengongzi+b[i].zhiwugongzi+b[i].jintie)<2000&&(b[i].jibengongzi+b[i].zhiwugongzi+b[i].jintie)>=1000)
m3++;
}
printf("3000元以上占%lf\n3000~2000元占%lf\n2000元~1000元占%lf\n",(double)m1/f,(double)m2/f,(double)m3/f);
break;
case 2://实现平均数计算
for(i=0; i<f; i++)
printf("%d\t%d\t%d\t%d\t%d\t%d\n",b[i].jibengongzi,b[i].zhiwugongzi,b[i].jintie,b[i].yiliaobaoxian,b[i].gongjijin,b[i].zonggongzi);
printf("各项平均数为:");
printf("%lf\t%lf\t%lf\t%lf\t%lf\t%lf\n",a.pjgz1,a.pjgz2,a.pjgz3,a.pjgz4,a.pjgz5,a.pjzgz);
}
printf("输入1:返回主界面 输入2:继续 输入其他:关闭程序\n");
scanf("%d",&c);
if(c==1) {//实现返回主菜单等功能
fclose(fp);
xitong( );
} else if(c==2) {
rewind(fp);
tongji(fp);
} else
fclose(fp);
}
void shanchu(FILE *fp,char *s) {
int d,l,i,m,z=0;//d控制循环时间l实现功能反复实现i实现循环,m实现记住删除数的数据,z判断是否找到数据
struct zhigong a[100];
char c[20];
printf("请输入您所需要删除的数据的姓名\n");
scanf("%s",c);
for(i=0; i<100; i++) {
if(fscanf(fp,"%s%s%d%d%d%d%d%d",a[i].id,a[i].name,&a[i].jibengongzi,&a[i].zhiwugongzi,&a[i].jintie,&a[i].yiliaobaoxian,&a[i].gongjijin,&a[i].zonggongzi)==EOF) {
d=i;
break;
}
if(strcmp(c,a[i].name)==0) {
m=i;
z=1;
continue;
}
}
if(z==0)
printf("没能找到有关数据\n");
if(z==1) {//重新创造一个文件,然后将除了删除的数据写入,然后将原文件删除,将新文件改名
fclose(fp);
remove(s);//删除
fp=NULL;
fp=fopen("a.txt","a+");
for(i=0; i<d; i++) {
if(i!=m)
fprintf(fp,"%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\t",a[i].id,a[i].name,a[i].jibengongzi,a[i].zhiwugongzi,a[i].jintie,a[i].yiliaobaoxian,a[i].gongjijin,a[i].zonggongzi);
}
rename("a.txt",s);//改名
}
printf("输入1:返回主界面 输入2:继续删除 输入其他:关闭程序\n");
scanf("%d",&l);
if(l==1) {
fclose(fp);
xitong( );
} else if(l==2) {
rewind(fp);
shanchu(fp,s);
} else
fclose(fp);
}
void xiugai(char *s) {
int l,i,z=0;
long int f=0;
struct zhigong a[100];
FILE *fp;
fp=fopen(s,"r+");
char c[20];
printf("请输入您所需要修改的数据的姓名\n");
scanf("%s",c);
for(i=0; i<100; i++) {
if(i==0)
f=0;
else
f=(ftell(fp)+2);
if(fscanf(fp,"%s%s%d%d%d%d%d%d",a[i].id,a[i].name,&a[i].jibengongzi,&a[i].zhiwugongzi,&a[i].jintie,&a[i].yiliaobaoxian,&a[i].gongjijin,&a[i].zonggongzi)==EOF) {
break;
}
if(strcmp(c,a[i].name)==0) {
z=1;
break;
}
}
if(feof(fp)!=0)
printf("没能找到有关数据\n");
if(z==1) {
printf("请输出你已经修改的信息\n");
printf("请输出工号\n");
scanf("%s",a[i].id);
printf("请输出姓名\n");
scanf("%s",a[i].name);
printf("请输出基本工资\n");
scanf("%d",&a[i].jibengongzi);
printf("请输出职务工资\n");
scanf("%d",&a[i].zhiwugongzi);
printf("请输出医疗保险数额\n");
scanf("%d",&a[i].yiliaobaoxian);
printf("请输出津贴\n");
scanf("%d",&a[i].yiliaobaoxian);
printf("请输出公积金\n");
scanf("%d",&a[i].gongjijin);
a[i].zonggongzi=a[i].jibengongzi+a[i].gongjijin+a[i].jintie+a[i].yiliaobaoxian+a[i].zhiwugongzi;
rewind(fp);
fseek(fp,f,SEEK_SET);
fprintf(fp,"%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d",a[i].id,a[i].name,a[i].jibengongzi,a[i].zhiwugongzi,a[i].jintie,a[i].yiliaobaoxian,a[i].gongjijin,a[i].zonggongzi);
}
printf("输入1:返回主界面 输入2:继续修改 输入其他:关闭程序\n");
scanf("%d",&l);
if(l==1) {
fclose(fp);
xitong( );
} else if(l==2) {
rewind(fp);
xiugai(s);
} else
fclose(fp);
}