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.

337 lines
7.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>
#define N 50
struct worker
{
char id[50];
char name[20];
char sex[10];
char age[10];
char edu[20];
char salary[10];
char address[20];
char tel[20];
}worker[N];
void save(int n) //保存函数保存n个记录
{ FILE *fp;
int i;
if((fp=fopen("worker.txt","wb+"))==NULL) //以读,写方式为输出打开一个二进制文件
{ printf("\nCannot open file\n");
}
for(i=0;i<n;i++)
if(fwrite(&worker[i],sizeof(struct worker),1,fp)!=1)//将输入的数据写入文件中
printf("file write error\n");
fclose(fp);
}
int load() //加载函数
{ FILE *fp;
int i;
if((fp=fopen("worker.txt","rb"))==NULL)
{printf("\nCannot open file\n");
return NULL;
}
for(i=0;!feof(fp);i++)
fread(&worker[i],sizeof(struct worker),1,fp);//从文件中读取出职工的数据
fclose(fp);
return(i-1);
}
void no_input(int i,int n) //工号输入函数i表示第i个职工的信息n表示比较到第n个职工
{ int j,k,w1;
do
{w1=0;
printf("工号:");
scanf("%s",worker[i].id);
for(j=0;worker[i].id[j]!='\0';j++)
if(worker[i].id[j]<'0'||worker[i].id[j]>'9') //判断工号是否为数字
{puts("请重新输入!\n");
w1=1;break;
}
if(w1!=1)
for(k=0;k<n;k++) //比较到第N个职工
if(k!=i&&strcmp(worker[k].id,worker[i].id)==0) //判断职工号是否有雷同
{puts("请重新输入!\n");
w1=1;break;
}
}
while(w1==1);
}
void input(int i) //输入一个记录的函数
{ no_input(i,i); //输入工号后继续输入其他数据
printf("姓名:");scanf("%s",worker[i].name);
printf("性别:");scanf(" %s",&worker[i].sex);
printf("年龄:");scanf("%s",&worker[i].age);
printf("工资:");scanf("%s",worker[i].salary);
printf("学历:");scanf("%s",&worker[i].edu);
printf("住址:");scanf("%s",worker[i].address);
printf("电话:");scanf("%s",worker[i].tel);
}
void printf_one(int i) //显示一个记录的函数
{
printf("%10s %10s %5s %5s %8s %6s %10s %10s\n",
worker[i].id,worker[i].name,worker[i].sex,worker[i].age,
worker[i].salary,worker[i].edu,worker[i].address,worker[i].tel);
}
void printf_back() //一个任务结束后选择是好似浏览还是返回
{ int k,w;
printf("\n\n\tSuccessful^-^.\n\n");
printf("接下来做什么?\n\n\t1).浏览全部\t2).返回: [ ]\b\b");
scanf("%d",&w);
if(w==1)browse();
else menu();
}
modify_data(int i,int n) //修改函数
{ int c,w1;
do
{puts("\nmodify by=>\n\n 1).工号 2).姓名 3).性别 4).年龄 5).工资 6).学历 7).地址 8).电话 9).取消");
printf("请选择?:[ ]\b\b");
scanf("%d",&c);
if(c>9||c<1)
{
puts("\nChoice error!please again!");
getchar();
}
}
while(c>9||c<1);
do
{switch(c) //通过switch结构选择要修改的内容
{case 1:no_input(i,n);break;
case 2:printf("name:");scanf("%s",worker[i].name);break;
case 3:printf("sex:");scanf("%s",worker[i].sex);break;
case 4:printf("age:");scanf("%s",worker[i].age);break;
case 5:printf("salary:");scanf("%s",worker[i].salary);break;
case 6:printf("edu:");scanf("%s",worker[i].edu);break;
case 7:printf("address:");scanf("%s",worker[i].address);break;
case 8:printf("tel:");scanf("%s",worker[i].tel);break;
case 9:menu();break;
}
puts("\nNow:\n");
printf_face();
printf_one(i);
printf("\n确定?\n\n\t1).是 2).否,重新修改 3).不保存退出 [ ]\b\b");
scanf("%d",&w1);
if(w1==1)save(n);
}
while(w1==2);
return(w1);
}
printf_face() //显示数据结构项目
{ printf("\n\t工号 姓名 性别 年龄 工资 学历 地址 电话号码\n"); }
void enter() //输入模块
{ int i,n;
printf("输入多少个职工信息(0-%d):",N-1);
scanf("%d",&n);
printf("\n 请输入职工信息\n\n");
for(i=0;i<n;i++)
input(i); //跳转输入数据的函数
if(i!=0)
save(n); //跳转保存至文件的函数
printf_back();
}
browse() //浏览模块
{ int i,j,n;
n=load();
printf_face();
for(i=0;i<n;i++)
{
if((i!=0)&&(i%10==0))
{printf("\n\n按任意键显示下一页...");
getch();
puts("\n\n");
}
printf_one(i);
}
printf("\t这里有 %d 条记录.\n",n);
printf("\n按任意键返回...");
getch();
menu();
}
modify() //修改模块
{
struct worker s;
FILE *fp;
int i,n,k,w0=1,w1,w2=0;
n=load();
do
{
k=-1;
printf_face();
for(i=0;i<n;i++)
{
if((i!=0)&&(i%10==0)) //目的是分屏显示
{printf("\n\n记住要修改的工号.按任意键显示下一页");
getch();
puts("\n\n");
}
printf_one(i); //调用显示一个记录的函数
}
do
{
printf("\n\n输入要修改的职工工号! 工号:");
scanf("%s",s.id); //输入要修改的ID
for(i=0;i<n;i++) //查找要修改的数据
if(strcmp(s.id,worker[i].id)==0)
{
k=i; //找到要修改的记录
s=worker[i]; //把worker[i]备份,以便恢复
}
if(k==-1)
printf("\n\n未找到 请重输");
}
while(k==-1); //当k=-1表示没有找到
printf_face(); //调用显示数据结构项目的函数
printf_one(k); //调用显示一个记录的函数
w1=modify_data(k,n); //修改记录并返回保存控制值w1w1=1表示用户已确认修改
if(w1==1)
{
printf("\Successful^_^.\n\n修改另一个?\n\n\t1).是 2).否,保存退出\t[ ]\b\b");
scanf("%d",&w0);
w2=1; //用来控制保存使w2=1是标记已有过修改
}
else
{
w0=0;
if(w2==1)
worker[k]=s;
}
if(w0!=1&&w2==1)
save(n);
}while(w0==1);
menu();
}
search() //查询模块
{ int c,w1;
do
{puts("\nsearch by=>\n\n1).工号 2}.学历 3).取消并返回");
printf("Which you needed?:[ ]\b\b");
scanf("%d",&c);
if(c>3||c<1)
{ puts("\nchoice error!please again!");
getchar();
}
}
while(c>3||c<1);
{switch(c)
{case 1:search1();break;
case 2:search2();break;
case 3:menu();break;
}
}
}
search1() //按工号查询模块
{int i,n,k,w1=1,w2,w3,w4;
struct worker s;
n=load();
do
{
do
{k=-1;
printf("\n\n输入要查询的工号! id:");
scanf("%s",s.id);
printf_face();
for(i=0;i<n;i++)
if(strcmp(s.id,worker[i].id)==0)
{k=i;
printf_one(k);break;
}
if(k==-1)
{printf("\n\nNo exit!please");
printf("\n\n继续查找?\n\t1).是 2).否,返回 [ ]\b\b");
scanf("%d",&w1);
if(w1==2) menu();
}
}
while(k==-1&&w1==1);
w4=0;w3=0;
if(k!=-1)
{printf("\n\n接下来干什么?\n\t1).查找另一个 2).修改 3).返回菜单 [ ]\b\b");
scanf("%d",&w2);
switch(w2)
{
case 1:search1();break;
case 2:w3=modify_data(k,n);break;
case 3:{menu();break;}
}
}
}
while(w2==1);
menu();
}
search2() //按学历查询模块
{
int i,n,k,w1=1,w2,w3,w4;
struct worker s;
n=load();
do
{
do
{k=-1;
printf("\n\n请输入你要查询的学历:\n");
scanf("%s",s.edu);
printf_face();
for(i=0;i<n;i++)
if(strcmp(s.edu,worker[i].edu)==0) //运用strcmp函数来比较学历从而找到学历所属职工
{k=i;
printf_one(k);
}
if(k==-1)
{printf("\n\nNo exit!please");
printf("\n\n继续查找?\n\t1).是 2).否,返回 [ ]\b\b");
scanf("%d",&w1);
if(w1==2) menu();
}
}
while(k==-1&&w1==1);
w4=0;w3=0;
if(k!=-1)
{printf("\n\n接下来干什么?\n\t1).查找另一个 2).修改 3).返回菜单 [ ]\b\b");
scanf("%d",&w2);
switch(w2)
{case 1:search2();break;
case 2:w3=modify_data(k,n);break;
case 3:{menu();
break;
}
}
}
}
while(w2==1);
menu();
}
menu()
{
int n,w1;
do
{
puts("\t\t*******************菜单*******************\n\n");
puts("\t\t\t\t1.录入职工信息");
puts("\t\t\t\t2.浏览职工信息");
puts("\t\t\t\t3.查询职工信息");
puts("\t\t\t\t4.修改职工信息");
puts("\t\t\t\t5.退出");
puts("\t\t****************************************\n\n");
printf("请选择(1~5): [ ]\b\b");
scanf("%d",&n);
if(n<1||n>5) //对选择的数字作判断
{w1=1;getchar();}
else w1=0;
} while(w1==1);
switch(n)
{case 1:enter();break; //录入
case 2:browse();break; //浏览
case 3:search();break; //查询
case 4:modify();break; //修改
case 5:exit(0); //退出
}
}
main()
{
menu();
}