|
|
#include <stdio.h>
|
|
|
#include <stdlib.h>
|
|
|
#include <string.h>
|
|
|
#include <conio.h>
|
|
|
struct device
|
|
|
{
|
|
|
char num[10]; //设备编号
|
|
|
char kind[15]; //设备种类
|
|
|
char name[15]; //设备名称
|
|
|
char price[10]; //设备价格
|
|
|
char buydata[10]; //设备购买日期
|
|
|
char whether_scrap[10]; //是否报废
|
|
|
char scrapdata[15]; //报废日期
|
|
|
char whether_damage[5]; //是否损坏
|
|
|
char mendcost[10]; //维修价格
|
|
|
char handleway[5]; //处理方式
|
|
|
};
|
|
|
typedef struct node
|
|
|
{
|
|
|
struct device data;
|
|
|
struct node *next; //建立一个链表。
|
|
|
}Node;
|
|
|
void Add(Node *equip) //设备的录入
|
|
|
{
|
|
|
Node *p,*r,*s;
|
|
|
char id[10]; //先用于输入num,也用于判断是否跳出循环
|
|
|
r=equip;
|
|
|
s=equip->next; //使s为第一个有用的结点
|
|
|
while(r->next!=NULL) //这个循环的作用是使r为最后一个有用的结点
|
|
|
r=r->next; //将指针置于最末尾
|
|
|
while(1)
|
|
|
{
|
|
|
printf("\t\t >>>>>>>>>>提示:输入0则返回主菜单!<<<<<<<<<<\n");
|
|
|
printf("\n请你输入设备num号:");
|
|
|
scanf("%s",id);
|
|
|
if(strcmp(id,"0")==0) break;
|
|
|
p=(Node *)malloc(sizeof(Node)); //申请空间
|
|
|
strcpy(p->data.num,id);
|
|
|
printf("\n请输入设备种类:");
|
|
|
scanf("%s",p->data.kind);
|
|
|
printf("\n请输入设备名称:");
|
|
|
scanf("%s",p->data.name);
|
|
|
printf("\n请输入设备价格:");
|
|
|
scanf("%s",&p->data.price);
|
|
|
printf("\n请输入设备购买时间:");
|
|
|
scanf("%s",&p->data.buydata);
|
|
|
printf("\n请输入设备是否报废:");
|
|
|
scanf("%s",&p->data.whether_scrap);
|
|
|
printf("\n请输入报废日期:");
|
|
|
scanf("%s",&p->data.scrapdata);
|
|
|
strcpy(p->data.whether_damage,"-");
|
|
|
strcpy(p->data.mendcost,"-");
|
|
|
strcpy(p->data.handleway,"-");
|
|
|
printf("\t\t>>>>>>>>>>提示:已经完成一条记录的添加。<<<<<<<<<<\n\n");
|
|
|
p->next=NULL;
|
|
|
r->next=p; //这一步是必需的,将p与先前的链表连起来构成一条新链表
|
|
|
r=p; //也是必需的.将r 又重设为新链的最后一个有用结点
|
|
|
}
|
|
|
}
|
|
|
void Modify(Node *equip)//设备的修改
|
|
|
{
|
|
|
Node *p;
|
|
|
char find[20];
|
|
|
if(!equip->next)
|
|
|
{
|
|
|
printf("\n\t\t>>>>>>>>>>提示:没有数据可以修改!<<<<<<<<<\n\n\n");
|
|
|
return;
|
|
|
}
|
|
|
printf("请输入要修改的设备num号:");
|
|
|
scanf("%s",find);
|
|
|
p=equip->next;
|
|
|
while(p!=NULL)
|
|
|
{
|
|
|
if(strcmp(p->data.num,find)==0) //如果找到的话返回的是符合要求
|
|
|
break;
|
|
|
p=p->next;
|
|
|
}
|
|
|
if(p) //若找到
|
|
|
{
|
|
|
int x;
|
|
|
while(1)
|
|
|
{
|
|
|
printf("完成修改请输入0,否则输入任意数再进行修改:");
|
|
|
scanf("%d",&x);
|
|
|
if(x==0)
|
|
|
{break;}
|
|
|
printf("请输入新设备号(原来是 %s ):",p->data.num);
|
|
|
printf("请输入新设备名称(原来是 %s ):",p->data.name);
|
|
|
scanf("%s",p->data.name);
|
|
|
printf("请输入新设备设备种类名称(原来是 %s ):",p->data.kind);
|
|
|
scanf("%s",p->data.kind);
|
|
|
printf("请输入新设备报废日期名称(原来是 %s ):",p->data.scrapdata);
|
|
|
scanf("%s",p->data.scrapdata);
|
|
|
printf("请输入新设备是否报废(原来是 %s ):",p->data.whether_scrap);
|
|
|
scanf("%s",p->data.whether_scrap);
|
|
|
printf("请输入新设备购买时间(原来是 %s ):",p->data.buydata);
|
|
|
scanf("%s",p->data.buydata);
|
|
|
printf("请输入新设备价格(原来是 %s ):",p->data.price);
|
|
|
scanf("%s",p->data.price);
|
|
|
printf("\n\t\t>>>>>>>>>>提示:该项记录数据已经成功修改!<<<<<<<<<<\n");
|
|
|
}
|
|
|
}
|
|
|
else printf("\n\t\t>>>>>>>>>>提示:你要修改的信息不存在!<<<<<<<<<<\n");
|
|
|
}
|
|
|
void Disp(Node *equip)//输出记录
|
|
|
{
|
|
|
Node *p,*p1;
|
|
|
p=equip->next;
|
|
|
if(!p)
|
|
|
{
|
|
|
printf("\n\t\t>>>>>>>>>>提示:没有数据可以显示!<<<<<<<<<\n\n\n");
|
|
|
return;
|
|
|
}
|
|
|
printf("┌──┬───┬────┬──┬─────┬──┬─────┬──┬──┬──┐");
|
|
|
printf("│设备│ 设备 │设备名称│设备│ 设备购入 │是否│ 报废日期 │是否│破损│处理│");
|
|
|
printf("│编号│ 种类 │ │价格│ 日期 │报废│ │损坏│耗费│方式│");
|
|
|
printf("├──┼───┼────┼──┼─────┼──┼─────┼──┼──┼──┤");
|
|
|
int count=0,count1=0;
|
|
|
p1=equip;
|
|
|
while(p1!=NULL)
|
|
|
{
|
|
|
count++;
|
|
|
p1=p1->next;
|
|
|
while(p)
|
|
|
{
|
|
|
printf("│%4s│%6s│%8s│%4s│%10s│%4s│%10s│%4s│%4s│%4s│",p->data.num,p->data.kind,p->data.name,p->data.price,p->data.buydata,p->data.whether_scrap,p->data.scrapdata,p->data.whether_damage,p->data.mendcost,p->data.handleway);
|
|
|
printf("├──┼───┼────┼──┼─────┼──┼─────┼──┼──┼──┤");
|
|
|
count1++;
|
|
|
p=p->next;
|
|
|
}
|
|
|
}
|
|
|
printf("└──┴───┴────┴──┴─────┴──┴─────┴──┴──┴──┘\n\n\n\n\n");
|
|
|
}
|
|
|
void Statistics(Node *equip)//设备的分类统计
|
|
|
{
|
|
|
Node *p;
|
|
|
int sel;int flag2=0,ha=0;
|
|
|
p=equip->next;
|
|
|
char find[20];
|
|
|
if(!p) //若链表为空
|
|
|
{
|
|
|
printf("\n\t\t>>>>>>>>>>提示:没有数据可以统计分类!<<<<<<<<<<\n");
|
|
|
return;
|
|
|
}
|
|
|
printf("\t提示:\n\t0:退出\n\t1:按设备种类统计\n\t2:按设备名称统计\n");
|
|
|
scanf("%d",&sel);
|
|
|
if(sel==1)
|
|
|
{
|
|
|
printf("\n输入你要统计分类的设备种类:");
|
|
|
scanf("%s",find);
|
|
|
while(p)
|
|
|
{
|
|
|
if(strcmp(p->data.kind,find)==0) //计算符合条件的个数
|
|
|
{
|
|
|
flag2++;
|
|
|
}
|
|
|
p=p->next;
|
|
|
}
|
|
|
p=equip->next;
|
|
|
if(flag2)
|
|
|
{
|
|
|
printf("┌──┬───┬────┬──┬─────┬──┬─────┬──┬──┬──┐");
|
|
|
printf("│设备│ 设备 │设备名称│设备│ 设备购入 │是否│ 报废日期 │是否│破损│处理│");
|
|
|
printf("│编号│ 种类 │ │价格│ 日期 │报废│ │损坏│耗费│方式│");
|
|
|
printf("├──┼───┼────┼──┼─────┼──┼─────┼──┼──┼──┤");
|
|
|
|
|
|
while(p)
|
|
|
{
|
|
|
if(strcmp(p->data.kind,find)==0)
|
|
|
{
|
|
|
printf("│%4s│%6s│%8s│%4s│%10s│%4s│%10s│%4s│%4s│%4s│",p->data.num,p->data.kind,p->data.name,p->data.price,p->data.buydata,p->data.whether_scrap,p->data.scrapdata,p->data.whether_damage,p->data.mendcost,p->data.handleway);
|
|
|
printf("├──┼───┼────┼──┼─────┼──┼─────┼──┼──┼──┤");
|
|
|
}
|
|
|
p=p->next;
|
|
|
}
|
|
|
printf("└──┴───┴────┴──┴─────┴──┴─────┴──┴──┴──┘");
|
|
|
}
|
|
|
if(flag2)
|
|
|
{
|
|
|
printf("\n\t\t\t按设备种类%s统计分类的有%d条记录:\t\t\t\n\n\n\n\n",find,flag2);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
printf("\n\t\t\t按设备种类%s统计的结果为0个\t\t\n\n\n\n",find);
|
|
|
}
|
|
|
}
|
|
|
else if(sel==2)
|
|
|
{
|
|
|
printf("\n输入你要统计分类的设备名称:");
|
|
|
scanf("%s",find);
|
|
|
while(p)
|
|
|
{
|
|
|
if(strcmp(p->data.name,find)==0) //计算符合条件的个数
|
|
|
{
|
|
|
flag2++;
|
|
|
}
|
|
|
p=p->next;
|
|
|
}
|
|
|
p=equip->next;
|
|
|
if(flag2)
|
|
|
{
|
|
|
printf("┌──┬───┬────┬──┬─────┬──┬─────┬──┬──┬──┐");
|
|
|
printf("│设备│ 设备 │设备名称│设备│ 设备购入 │是否│ 报废日期 │是否│破损│处理│");
|
|
|
printf("│编号│ 种类 │ │价格│ 日期 │报废│ │损坏│耗费│方式│");
|
|
|
printf("├──┼───┼────┼──┼─────┼──┼─────┼──┼──┼──┤");
|
|
|
while(p)
|
|
|
{
|
|
|
if(strcmp(p->data.name,find)==0)
|
|
|
{
|
|
|
printf("│%4s│%6s│%8s│%4s│%10s│%4s│%10s│%4s│%4s│%4s│",p->data.num,p->data.kind,p->data.name,p->data.price,p->data.buydata,p->data.whether_scrap,p->data.scrapdata,p->data.whether_damage,p->data.mendcost,p->data.handleway);
|
|
|
printf("├──┼───┼────┼──┼─────┼──┼─────┼──┼──┼──┤");
|
|
|
}
|
|
|
p=p->next;
|
|
|
}
|
|
|
printf("└──┴───┴────┴──┴─────┴──┴─────┴──┴──┴──┘");
|
|
|
}
|
|
|
if(flag2)
|
|
|
{
|
|
|
printf("\n\t\t\t按设备名称%s统计分类的有%d条记录:\t\t\t\n\n\n\n\n",find,flag2);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
printf("\n\t\t\t按设备名称%s统计的结果为0个\t\t\n\n\n\n",find);
|
|
|
}
|
|
|
}
|
|
|
else if(sel==0) return;
|
|
|
}
|
|
|
void Cost_handleway(Node *equip) //设备的破损耗费和遗损处理
|
|
|
{
|
|
|
Node *p;
|
|
|
char find[20];
|
|
|
if(!equip->next)
|
|
|
{
|
|
|
printf("\n\t\t>>>>>>>>>>提示:没有资料可以修改!<<<<<<<<<<\n");
|
|
|
return;
|
|
|
}
|
|
|
printf("请输入要修改破损耗费和遗损处理的设备num号:");
|
|
|
scanf("%s",find);
|
|
|
p=equip->next;
|
|
|
|
|
|
while(p!=NULL)
|
|
|
{
|
|
|
if(strcmp(p->data.num,find)==0) //如果找到的话返回的是符合要求
|
|
|
break;
|
|
|
p=p->next;
|
|
|
}
|
|
|
if(p) //若找到
|
|
|
{
|
|
|
int x;
|
|
|
printf("┌──┬───┬────┬──┬─────┬──┬─────┬──┬──┬──┐");
|
|
|
printf("│设备│ 设备 │设备名称│设备│ 设备购入 │是否│ 报废日期 │是否│破损│处理│");
|
|
|
printf("│编号│ 种类 │ │价格│ 日期 │报废│ │损坏│耗费│方式│");
|
|
|
printf("├──┼───┼────┼──┼─────┼──┼─────┼──┼──┼──┤");
|
|
|
printf("│%4s│%6s│%8s│%4s│%10s│%4s│%10s│%4s│%4s│%4s│",p->data.num,p->data.kind,p->data.name,p->data.price,p->data.buydata,p->data.whether_scrap,p->data.scrapdata,p->data.whether_damage,p->data.mendcost,p->data.handleway);
|
|
|
printf("└──┴───┴────┴──┴─────┴──┴─────┴──┴──┴──┘");
|
|
|
while(1)
|
|
|
{
|
|
|
printf("完成修改请输入0否则输入任意数再进行修改:");
|
|
|
scanf("%d",&x);
|
|
|
if(x==0)
|
|
|
{break;}
|
|
|
printf("请输入该设备是否损坏(原来是 %s ):",p->data.whether_damage);
|
|
|
scanf("%s",p->data.whether_damage);
|
|
|
printf("请输入该设备的破损耗费(原来是 %s ):",p->data.mendcost);
|
|
|
scanf("%s",p->data.mendcost);
|
|
|
printf("请输入该设备的处理方式(原来是 %s ):",p->data.handleway);
|
|
|
scanf("%s",p->data.handleway);
|
|
|
printf("\n\t >>>>>>>>>>提示:该设备的破损耗费和遗损处理修改成功!<<<<<<<<<<\n");
|
|
|
}
|
|
|
}
|
|
|
else printf("\n\t\t>>>>>>>>>>提示:你要修改的信息不存在!<<<<<<<<<<\n");
|
|
|
}
|
|
|
void Query(Node *equip) //设备的查询
|
|
|
{
|
|
|
Node *p;
|
|
|
char find[20];
|
|
|
if(!equip->next)
|
|
|
{
|
|
|
printf("\n\t\t>>>>>>>>>>提示:没有数据可以查询!<<<<<<<<<<\n");
|
|
|
return;
|
|
|
}
|
|
|
printf("查询完成后输入0退到主界面...\n");
|
|
|
printf("请输入要查询的设备num号:");
|
|
|
scanf("%s",find);
|
|
|
p=equip->next;
|
|
|
while(1)
|
|
|
{
|
|
|
if(find==0)
|
|
|
{break;}
|
|
|
while(p!=NULL)
|
|
|
{
|
|
|
if(strcmp(p->data.num,find)==0) //如果找到的话返回的是符合要求
|
|
|
break;
|
|
|
p=p->next;
|
|
|
}
|
|
|
if(p) //若找到
|
|
|
{
|
|
|
printf("┌──┬───┬────┬──┬─────┬──┬─────┬──┬──┬──┐");
|
|
|
printf("│设备│ 设备 │设备名称│设备│ 设备购入 │是否│ 报废日期 │是否│破损│处理│");
|
|
|
printf("│编号│ 种类 │ │价格│ 日期 │报废│ │损坏│耗费│方式│");
|
|
|
printf("├──┼───┼────┼──┼─────┼──┼─────┼──┼──┼──┤");
|
|
|
printf("│%4s│%6s│%8s│%4s│%10s│%4s│%10s│%4s│%4s│%4s│",p->data.num,p->data.kind,p->data.name,p->data.price,p->data.buydata,p->data.whether_scrap,p->data.scrapdata,p->data.whether_damage,p->data.mendcost,p->data.handleway);
|
|
|
printf("└──┴───┴────┴──┴─────┴──┴─────┴──┴──┴──┘");
|
|
|
break;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
printf("\n\t\t>>>>>>>>>>提示:你要修改的信息不存在!<<<<<<<<<<\n");
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
void save(Node *equip) //二进制保存到文本
|
|
|
{
|
|
|
Node *p1,*p2;
|
|
|
p1=equip->next;
|
|
|
FILE *fp1;
|
|
|
if((fp1=fopen("d:/设备管理系统.txt","wb"))==NULL)
|
|
|
{return;}
|
|
|
else
|
|
|
{
|
|
|
while(p1!=NULL)
|
|
|
{
|
|
|
fwrite(p1,sizeof(p1->data),1,fp1); //将文件的内容放入接点中
|
|
|
p2=p1;
|
|
|
p1=p1->next;
|
|
|
free(p2);
|
|
|
}
|
|
|
}
|
|
|
fclose(fp1); //关闭文件
|
|
|
}
|
|
|
Node *load() //载入二进制文本
|
|
|
{
|
|
|
Node *p,*pNode;
|
|
|
FILE *fp1;
|
|
|
pNode = NULL;
|
|
|
if((fp1=fopen("d:/设备管理系统.txt","rb"))==NULL)
|
|
|
{
|
|
|
printf("硬盘中未存有数据!!\n\n");
|
|
|
return pNode;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
int bFirst=1;
|
|
|
long rs = 1;
|
|
|
while (rs)
|
|
|
{
|
|
|
Node *p1 = (Node*)malloc(sizeof(Node));
|
|
|
memset(p1,0,sizeof(Node)); // 将新的空间清0
|
|
|
rs = fread(&p1->data,sizeof(p1->data),1,fp1); //将文件的内容放入接点中
|
|
|
if (rs)
|
|
|
{
|
|
|
if (bFirst)
|
|
|
{// pNode 记录了链表的首位置
|
|
|
bFirst=0;
|
|
|
pNode=p1;
|
|
|
p=p1;
|
|
|
}
|
|
|
else
|
|
|
{//p指向当前的最后一项,读取了数据就加到链表尾,然后再将p指向当前的尾
|
|
|
p->next=p1;
|
|
|
p=p1;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
fclose(fp1);//关闭文件
|
|
|
return pNode;
|
|
|
}
|
|
|
int main()//主函数
|
|
|
{
|
|
|
Node *equip;
|
|
|
Node *p;
|
|
|
int flag;
|
|
|
equip=(Node*)malloc(sizeof(Node));
|
|
|
equip->next=NULL;
|
|
|
p=equip;
|
|
|
equip->next=load();
|
|
|
while(1)
|
|
|
{
|
|
|
printf("\t\t******************************************\n");
|
|
|
printf("\t\t* *\n");
|
|
|
printf("\t\t* 实验设备管理系统*\n");
|
|
|
printf("\t\t* *\n");
|
|
|
printf("\t\t* [1] 查看所有设备信息 *\n");
|
|
|
printf("\t\t* [2] 设备的录入 *\n");
|
|
|
printf("\t\t* [3] 设备的修改 *\n");
|
|
|
printf("\t\t* [4] 设备的分类统计 *\n");
|
|
|
printf("\t\t* [5] 设备的破损耗费和遗损处理 *\n");
|
|
|
printf("\t\t* [6] 设备的查询 *\n");
|
|
|
printf("\t\t* [0] 退出 *\n");
|
|
|
printf("\t\t* *\n");
|
|
|
printf("\t\t******************************************\n");
|
|
|
|
|
|
printf("\n\n请输入你要操作的序号:");
|
|
|
scanf("%d",&flag);
|
|
|
switch(flag)
|
|
|
{
|
|
|
case 0: {printf("\n\t\t>>>>>>>>>>提示:已经退出系统,ByeBye!<<<<<<<<<<\n\n\n"); save(equip); exit(0);}break; //退出系统并保存数据
|
|
|
case 1: Disp(equip); break;//显示所有记录信息
|
|
|
case 2: Add(equip); break; //设备的录入
|
|
|
case 3: Modify(equip); break;//设备的修改
|
|
|
case 4: Statistics(equip); break;//设备的分类统计
|
|
|
case 5: Cost_handleway(equip); break;//设备的破损耗费和遗损处理
|
|
|
case 6: Query(equip); break;//设备的查询
|
|
|
default: printf("\n\t\t>>>>>>>>>>提示:输入错误!<<<<<<<<<<\n"); break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|