#include
#include
#include
#include
#define LEN sizeof(struct worker)
#define N 3
int n;
typedef struct worker //定义结构体
{
long num;
char name[20];
char bm[20];
int gwgz;
int gwjt;
int bfgz;
int ylbx;
int sds;
int sdf;
int yfgz;
int sfgz;
struct worker*next;
}YZY;
int*tzz()//创建头指针
{
YZY*head;
head = (YZY*)malloc(LEN);
return (head);
}
void create(YZY*head)//创建链表函数
{
YZY*p1;
YZY*p2;
p2 = (YZY*)malloc(LEN);
p1 = head;
p2 = head;
for(n = 1; n < N; n++)
{
p1 = (YZY*)malloc(LEN);
p2->next = p1;
p2 = p1;
}
p2->next = NULL;
}
void save(YZY*head) //保存函数
{
FILE*fp;
YZY*p1;
p1 = head;
if ((fp = fopen("stu.txt", "wb")) == NULL)
{
printf("can not open file\n");
}
do
{
fwrite(p1, sizeof(LEN), 1, fp);
p1 = p1->next;
}while (p1 != NULL);
fclose(fp);
return;
}
void add(YZY*head) //添加原始信息函数
{
YZY*p1;
p1 = head;
n = 1;
do
{
printf("请输入第%d个职工的初始信息:\n", n);
printf("请输入员工的职工号:\n");
scanf("%d", &p1->num);
printf("请输入员工的姓名:\n");
scanf("%s", p1->name);
printf("请输入员工的所属部门\n");
scanf("%s", p1->bm);
printf("请输入员工的岗位工资\n");
scanf("%d", &p1->gwgz);
printf("请输入员工的岗位津贴\n");
scanf("%d", &p1->gwjt);
printf("请输入员工的补发工资\n");
scanf("%d", &p1->bfgz);
printf("请输入员工的医疗保险\n");
scanf("%d", &p1->ylbx);
printf("请输入员工的水电费\n");
scanf("%d", &p1->sdf);
p1->yfgz = p1->gwgz + p1->gwjt + p1->bfgz + p1->ylbx;
p1 = p1->next;
system("cls");
n++;
} while (p1 != NULL);
save(head);
}
void load(YZY*head)//读取函数
{
FILE*fp;
YZY*p;
p = head;
if ((fp = fopen("stu.txt", "rb")) == NULL)
{
printf("error\n");
exit(0);
}
do
{
fread(p, sizeof(LEN),1, fp);
printf("%d", p->num);
p = p->next;
} while (p != NULL);
fclose(fp);
return;
}
void print(YZY*head)//输出所有员工信息
{
YZY*p;
printf("全体职工信息如下:\n");
/*load(head);*/
p = head;
do
{
printf("员工号为:%d\n", p->num);
printf("姓名:%s\n", p->name);
printf("所属部门:%s\n", p->bm);
printf("岗位工资为:%d\n", p->gwgz);
printf("岗位津贴为:%d\n", p->gwjt);
printf("医疗保险为:%d\n", p->ylbx);
printf("补发工资为:%d\n", p->bfgz);
printf("所得税为:%d\n", p->sds);
printf("水电费为:%d\n", p->sdf);
printf("应发工资为%d\n", p->yfgz);
printf("实发工资为:%d\n", p->sfgz);
p = p->next;
} while (p != NULL);
}
void del(YZY*head) //删除函数
{
YZY*p;
YZY*q;
q = (YZY*)malloc(LEN);
p = head;
int ch;
int a;
printf("请输入您要删除的职工的职工号\n");
scanf("%d", &ch);
printf("请确认是否删除员工号为%d的员工\n", ch);
printf("1(确认删除) 2(退出主菜单)");
scanf("%d", &a);
if (a == 2)
{
menu();
}
if (a == 1)
{
if (head->num == ch)
{
head = p->next;
free(head);
printf("删除成功按任意键返回 主菜单\n");
system("pause");
menu();
}
for (p = p->next; p->num != ch; p = p->next)
{
p = q;
if (p->num = ch)
{
q->next = p->next;
free(p);
return;
printf("删除成功按任意键返回主菜单\n");
system("pause");
menu();
}
}
if (p->num != ch)
{
printf("对不起查无此人 将返回主菜单\n");
menu();
}
}
save(head);
}
void insert(YZY*head) //增添函数
{
YZY*p;
YZY*q;
q = head;
p = (YZY*)malloc(LEN);
printf("请输入您要增加的员工的员工号:\n");
scanf("%d", &p->num);
for (; q != NULL; q = q->next)
{
if (q->num == p->num)
printf("对不起 该工号已经被占用 请重新输入\n");
else
{
printf("输入成功 请完成其它信息的输入\n");
printf("请输入员工的姓名:\n");
scanf("%s", p->name);
printf("请输入员工的所属部门\n");
scanf("%s", p->bm);
printf("请输入员工的岗位工资\n");
scanf("%d", &p->gwgz);
printf("请输入员工的岗位津贴\n");
scanf("%d", &p->gwjt);
printf("请输入员工的补发工资\n");
scanf("%d", &p->bfgz);
printf("请输入员工的医疗保险\n");
scanf("%d", &p->ylbx);
printf("请输入员工的水电费\n");
scanf("%d", &p->sdf);
p->yfgz = p->gwgz + p->gwjt + p->bfgz + p->bfgz + p->ylbx;
p->next = head->next;
head->next = p;
save(head);
}
break;
}
}
void search(YZY*head)
{
int ch;
int i;
YZY m;
YZY*p;
p = head;
printf("请选择您要查询的方式: 1、按职工号查找 2、按职工姓名查找\n");
scanf("%d", &ch);
if (ch == 1)
{
printf("请输入您要查找的职工号\n");
scanf("%d", &i);
if (p->num == i)
{
printf("该员工的信息如下\n");
printf("该员工的员工号为:%d\n", p->num);
printf("该员工的姓名为:%s\n", p->name);
printf("该员工所属的部门是:%s\n", p->bm);
printf("该员工的岗位工资为:%d\n", p->gwgz);
printf("该员工的岗位津贴为:%d\n", p->gwjt);
printf("该员工的补发工资为:%d\n", p->bfgz);
printf("该员工的医疗保险为:%d\n", p->ylbx);
printf("该员工的所得税为:%d\n", p->sds);
printf("该员工的水电费为:%d\n", p->sdf);
printf("该员工的应发工资为:%d\n", p->yfgz);
printf("该员工的实发工资为:%d\n", p->sfgz);
}
for (p = p->next; p != NULL; p = p->next)
{
if (p->num == i)
{
printf("该员工的信息如下\n");
printf("该员工的员工号为:%d\n", p->num);
printf("该员工的姓名为:%s\n", p->name);
printf("该员工所属的部门是:%s\n", p->bm);
printf("该员工的岗位工资为:%d\n", p->gwgz);
printf("该员工的岗位津贴为:%d\n", p->gwjt);
printf("该员工的补发工资为:%d\n", p->bfgz);
printf("该员工的医疗保险为:%d\n", p->ylbx);
printf("该员工的所得税为:%d\n", p->sds);
printf("该员工的水电费为:%d\n", p->sdf);
printf("该员工的应发工资为:%d\n", p->yfgz);
printf("该员工的实发工资为:%d\n", p->sfgz);
goto loop;
}
}
if (p == NULL)
{
printf("输入的职工号错误\n");
}
loop:i = 0;
}
if (ch == 2)
{
printf("请输入要查找的的员工姓名\n");
scanf("%s", m.name);
if (strcmp(p->name, m.name) == 0)
{
printf("该员工的信息如下\n");
printf("该员工的员工号为:%d\n", p->num);
printf("该员工的姓名为:%s\n", p->name);
printf("该员工所属的部门是:%s\n", p->bm);
printf("该员工的岗位工资为:%d\n", p->gwgz);
printf("该员工的岗位津贴为:%d\n", p->gwjt);
printf("该员工的补发工资为:%d\n", p->bfgz);
printf("该员工的医疗保险为:%d\n", p->ylbx);
printf("该员工的所得税为:%d\n", p->sds);
printf("该员工的水电费为:%d\n", p->sdf);
printf("该员工的应发工资为:%d\n", p->yfgz);
printf("该员工的实发工资为:%d\n", p->sfgz);
}
menu();
}
if (p = NULL)
{
printf("你输入的的名字错误\n");
}
menu();
}
void modify(YZY*head)
{
YZY*p1;
int ch;
printf("请输入您要改的员工的工号:\n");
scanf("%d", &ch);
p1 = head;
for (; p1->num != ch; p1 = p1->next)
{
if (p1->num == ch)
{
printf("请输入新员工的初始信息:\n");
printf("请输入新的职工号:\n");
scanf("%d", &p1->num);
printf("请输入新的姓名:\n");
scanf("%s", p1->name);
printf("请输入新的所属部门\n");
scanf("%s", p1->bm);
printf("请输入新的岗位工资\n");
scanf("%d", &p1->gwgz);
printf("请输入新的岗位津贴\n");
scanf("%d", &p1->gwjt);
printf("请输入新的补发工资\n");
scanf("%d", &p1->bfgz);
printf("请输入新的医疗保险\n");
scanf("%d", &p1->ylbx);
printf("请输入新的水电费\n");
scanf("%d", &p1->sdf);
p1->yfgz = p1->gwgz + p1->gwjt + p1->bfgz + p1->bfgz + p1->ylbx;
/*count(p1);*/
save(head);
}
if (p1 == NULL)
{
printf("对不起查无此人 将返回主菜单\n");
}
}
}
int menu()
{
printf(" ****************欢迎进入南天职工工资管理系统******************** \n");
printf(" 1.录入员工基本信息 2.输出所有员工初始数据 \n");
printf(" 3.查询员工工资明细 4.增加员工工资信息 \n");
printf(" 5.修改员工工资信息 6.删除员工工资信息 \n");
printf(" 7.读出原始数据 制作人:姚智瀛");
printf(" (请选择输入1-6选择您的操作 ) \n");
return 0;
}
int main()
{
int m;
m = 0;
int button;
YZY*head;
head = tzz();
create(head);
menu();
while (m != 1)
{
printf("请根据提示选择您要使用的功能\n");
scanf("%d", &button);
switch (button)
{
case 1: add(head); break;
case 2:print(head); break;
case 3:search(head); break;
case 4:insert(head); break;
case 5:modify(head); break;
case 6:del(head); break;
case 7:load(head); break;
case 8:
case 9:printf("输入错误 请依照提示重新输入\n"); break;
default: break;
}
menu();
}
}
请把错误提示也一起粘贴出来
求各位大佬指点。 我知道这样每次重新运行后 地址都是重新分配的。 但是为啥却又能读出员工职工号来 其他的都是乱码。。。。 该怎么改 新手 还望大佬们讲详细点
推荐你用list或者vector 或者map容器做数据的多层储存,你只需要做一个成员的完整信息记录加到容器里储存就行了,我空间有list 和map的实现代码可以做参考。
文件读写时,读写长度出错了,既然已经定义 #define LEN sizeof(struct worker) 了,读写时直接用LEN就可以了,干嘛使用sizeof(LEN) 呢????
void save(YZY*head) //保存函数
{
FILE*fp;
YZY*p1;
p1 = head;
if ((fp = fopen("stu.txt", "wb")) == NULL)
{
printf("can not open file\n");
}
do
{
fwrite(p1, LEN, 1, fp); //这里要用LEN
p1 = p1->next;
}while (p1 != NULL);
fclose(fp);
return;
}
void load(YZY*head)//读取函数
{
FILE*fp;
YZY*p;
p = head;
if ((fp = fopen("stu.txt", "rb")) == NULL)
{
printf("error\n");
exit(0);
}
do
{
fread(p, LEN,1, fp); //这里也要有LEN!
printf("%d", p->num);
p = p->next;
} while (p != NULL);
fclose(fp);
return;
}
重新运行是读取出来是乱码,那多半都是写入的问题咯
你这个程序是没有问题的,你说的乱码问题是初始化的里的内存随机乱码产生的,你需要先添加员工信息。我验证是对的
同学你解决这个问题了吗,我也出现这个问题!明明和同学代码一样,可是我的就是乱码
#include "record.h"
//文件存储操作函数
void save(const BOOK *top)
{
const BOOK *p;
FILE *fp;
if(count==0)
{
printf("没有记录可存!");
return;
}
if((fp=fopen("BOOK.txt","wb"))==NULL)
{
printf("不能打开文件!\n");
exit(1);
}
printf("\n存文件\n");
p=top;
while(p)
{
fwrite(p,LEN,1,fp);
p=p->next;
}
fclose(fp);
printf("%d条记录已经存入文件,请继续操作。\n",count);
}
//文件读取操作函数
BOOK *load(BOOK *top)
{
FILE *fp;
BOOK *p,*old;
count=0;
if((fp=fopen("BOOK.txt","rb"))==NULL)
{
printf("打不开文件!\n");
exit(1);
}
printf("\n取文件...\n");
ASK(p);
top=p;
old=top;
while(!feof(fp))
{
if(1!=fread(p,LEN,1,fp)) break;
count=count+1;
ASK(p->next);
old=p->next;
old=p;
p=p->next;
}
old->next=NULL;
fclose(fp);
printf("取入%d条记录。",count);
return(top);
}
/*
#include "record.h"
void writeToFile(){
FILE *out;
out = fopen( "BOOK.txt", "wb" );
if(out==NULL){
printf("无法打开文件!\n");
return;
}
p=head;
while(p!=NULL){
fwrite(p,LEN,1,out);
p=p->next;
printf("输出文件!\n");
}
fclose(out);
}
void readFromFile(){
FILE in;
in = fopen( "BOOK.txt", "rb" );
if(in==NULL){
printf("无法打开文件!\n");
return;
}
count=0;
head=NULL;
p=NULL;
old=NULL;
ASK(p);
while(!feof(in)){
if(fread(p,LEN,1,in)!=1)
break;
if(head==NULL){
head=p;
}else{
old->next=p;
}
old=p;
count++;
printf("读入文件!\n");
ASK(p);
}
old->next=NULL;
printf("readin count:%d\n",count);
fclose(in);
}/