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.

411 lines
12 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 <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;
}
}
}