引用文本
#ifndef L_MACHINE_LL
#define L_MACHINE_LL
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#define initial_size 5 //数组的初始大小
#define incr_size 5 //数组每次增加的大小
struct machine_info{
char serial_number[15]; //编号
char name[20]; //名称
int price; //单价
int year; //购进年代
char home[25]; //厂家
int number; //数量
char use[2]; //可用性
char unuse[2]; //不可用性
};
typedef struct machine_info MacInfo;//定义一个类型名McaInfo代表定义的结构体machine_info
extern int numMac;//记录设备种数
extern MacInfo *record; //记录设备信息的指针
extern int saveTag;
extern int arraySize;//数组大小
int menu_select();
void handle__menu();
void quit();
void showTable();
void addRecord();
void display();
void removeRecord();
int findRecord(char *target,int type,int from);
void queryRecord();
void copyRecord();
void modifyRecord();
void rejectRecord();
void buyRecord();
int Save();
int Load();
void handle_menu1();
void handle_menu2();
#endif
/*
**初始化
*/
int numMac=0;//记录设备种数
int saveTag=0;//1表示未保存,0表示已保存
MacInfo *record=NULL; //记录设备信息的指针
int arraySize=0;
/***
*主函数
*/
void main()
{ char s[2];
int mima;
int count=0;
printf(" * * * * * * * * * * * \n");
printf(" * * * * * * * * * \n");
printf(" * * * * * * * * * * \n");
printf(" * * * * * * \n");
printf(" * * * * * * \n");
printf(" * * * * * * * \n");
printf(" * * * * * * * \n");
printf(" * * * * * \n");
printf("\n\n “);
printf(“管理员能进行所有操作,一般人员只能进行1.显示设备信息,4.查找指定的设备,5.修改指定的设备信息,8.对设备进行排序,9/10储存和读取记录,11退出”);
printf(“请输入密码:”);
while(1)
{
scanf(”%s",s);
mima=atoi(s);
if(mima1234)
{
handle_menu1();
break;
}
if(mima4321)
{
handle_menu2();
break;
}
if((mima!=1234)&&(mima!=4321))
if((mima!=1234)&&(mima!=4321))
{
printf("请输入正确的密码:");
count++;
if(count==3)
{
printf("输入错误密码超过3次强行退出,请重新启动");
break;
}
}
}
}
/**************
*菜单处理函数1
*/
void handle_menu1()
{
for(;?{
switch(menu_select())
{
case 1:
display();
break;
case 2:
addRecord();
break;
case 3:
printf(“请输入在权限范围内的数字”);
continue;
case 4:
queryRecord();
break;
case 5:
modifyRecord();
break;
case 6:
printf(“请输入在权限范围内的数字”);
continue;
case 7:
printf(“请输入在权限范围内的数字”);
continue;
case 8:
Save();
break;
case 9:
Load();
break;
case 10:
quit();
}
}
}
/**************
*菜单处理函数2
*/
void handle_menu2()
{
for(;?{
switch(menu_select())
{
case 1:
display();
break;
case 2:
addRecord();
break;
case 3:
removeRecord();
break;
case 4:
queryRecord();
break;
case 5:
modifyRecord();
break;
case 6:
rejectRecord();
break;
case 7:
buyRecord();
break;
case 8:
Save();
break;
case 9:
Load();
break;
case 10:
quit();
}
}
}
/******
**菜单选择函数menu_slect
/
int menu_select()
{
char s[2];
int cn=0;
record=(MacInfo)malloc(sizeof(MacInfo)*initial_size);//给数组分配MacInfo分配initial_size个记录空间大小。
if(record==NULL)
{
printf(“出错!”);
exit(-1);
}
arraySize=initial_size;
printf("\n");
printf("1.显示设备信息\n");
printf("2.在表尾追加设备信息\n");
printf("3.删除指定的设备信息\n");
printf("4.对指定的设备按设备名或编号进行查找\n");
printf("5.修改指定的设备信息\n");
printf("6.对指定的记录或全部记录进行报废\n");
printf("7.对指定的记录进行购买\n");
printf("8.对设备进行排序\n");
printf("9.文件储存记录\n");
printf("10.文件读取记录\n");
printf("11.退出\n");
printf("\n\t请选择1~11 ");
for(;;)
{
gets(s);
cn=atoi(s);
if(cn<1||cn>11)printf("\n输入错误,重选1~11");
else
break;
}
return cn;
}
/**
**结束运行退出
*/
void quit()
{
char str[5];
if(saveTag==1)
{
printf(“是否保存原来的记录?(Y/N)”);
gets(str);
if(str[0]!=‘n’||str[0]!=‘N’)
Save();
}
free(record);
exit(0);
}
/**
*打印表头
**/
void showTable()
{
printf(“编号\t名称\t单价\t购进年代\t生产家\t该设备数量\t可用\t不可用\n”);
}
/*
*显示设备信息
*/
void display()
{
int i;
if(numMac0)
{
printf(“没有可以显示的数据信息!”);
return;
}
showTable();
for(i=0;i<numMac;i++)
{
printf("%s\t%s\t%d\t%d\t%s\t%d\t%s\t%s\n",record[i].serial_number,record[i].name,record[i].price,record[i].year,record[i].home,record[i].number,record[i].use[2],record[i].unuse[2]);
if(i%200&&i!=0)
{
printf(“输入任一字符后继续。。\n”);
getch();
printf("\n\n");
showTable();
}
}
}
/**
*新建或添加信息
*/
void addRecord()
{
char str[20];
if(numMac==0)
printf(“当前还没有记录,现在建立新表\n”);
else
printf(“当前已经有数据,现在在表末尾添加新记录\n”);
while(1)
{
printf("现在要新增一组信息,sure?(Y/N)\n");
scanf("%s",str);
if(str[0]=='n'||str[0]=='N')
break;
if(numMac>=arraySize)
{
record=(MacInfo*)realloc(record,(arraySize+initial_size)*sizeof(MacInfo));
if(record==NULL)
{
printf("memory failed!");
exit(-1);
}
arraySize=arraySize+incr_size;
}
printf("请输入设备编号:");
scanf("%s",record[numMac].serial_number);
printf("请输入设备名称:");
scanf("%s",record[numMac].name);
printf("请输入设备单价:");
scanf("%d",&record[numMac].price);
printf("请输入设备购进年代:");
scanf("%d",&record[numMac].year);
printf("请输入设备厂家:");
scanf("%s",record[numMac].home);
printf("请输入设备数量:");
scanf("%d",&record[numMac].number);
printf("请输入设备的不可用台数:");
scanf("%s",record[numMac].unuse);
printf("请输入设备的可用台数:");
scanf("%s",record[numMac].use);
numMac++;
}
printf("现在共有%d条信息",numMac);
saveTag=1;//输入一个新的学生后,信息保存标志为1,表示未保存。
}
/*
*查找指定的记录
*参数:target:要查找的记录的某一项与target相同
type: 通过那一项来查找 0通过编号查找 1通过名称查找
from: 从第from项开始查找
*返回查找到的记录的序号,否则则返回-1
*/
int findRecord(char *target,int type,int from)
{
int i;
for(i=from;i<numMac;i++)
{
if((type==0&&strcmp(target,record[i].serial_number)0)||
(type1&&strcmp(target,record[i].name)==0))
return i;
}
return -1;
}
/*
*查询指定的设备信息
*/
void queryRecord()
{
char target[20];
int type;
int i;
char str[20];
int count;
if(numMac==0)
{
printf(“无记录可以查询,可以增加功能增添信息>.<”);
return;
}
while(1)
{
printf(“1.按设备编号查询\n”);
printf(“2.按设备名称查询\n”);
gets(str);
if(str[0]==1)
{
printf(“请输入要查询的设备编号:”);
gets(target);
type=0;
}
if(str[0]==2)
{
printf(“请输入要查询的设备名称:”);
gets(target);
type=1;
}
i=findRecord(target,type,0);
if(i!=-1)
{
showTable();
}
count=0;
while(i!=-1)
{
count++;
printf("%s\t%s\t%d\t%d\t%s\t%d\t%s\t%s\n",record[i].serial_number,record[i].name,record[i].price,record[i].year,record[i].home,record[i].number,record[i].use[2],record[i].unuse[2]);
i=findRecord(target,type,i+1);
}
if(count==0)
printf("没有找到符合条件的设备\n");
else
printf("一共找到%d条信息\n\n",count);
}
}
/*
*将one指向的一条记录赋给two
*/
void copyRecord(MacInfo *one,MacInfo *two)
{
strcpy(two->serial_number,one->serial_number);
strcpy(two->name,one->name);
two->price=one->price;
two->year=one->year;
strcpy(two->home,one->home);
two->number=one->number;
two->use[2]=one->use[2];
two->unuse[2]=one->unuse[2];
}
/*
*删除指定的记录
*/
void removeRecord()
{
char target[20];
int type;
int i,j;
char str[2];
if(numMac==0)
{
printf(“没有可供删除的信息”);
return;
}
printf("1.按编号查找要删除的记录\n");
printf("2.按名称查找要删除的记录\n");
gets(str);
if(str[0]==1)
{
printf("请输入设备编号:");
gets(target);
type=0;
}
if(str[0]==2)
{
printf("请输入设备名称:");
gets(target);
type=1;
}
i=findRecord(target,type,0);
if(i!=-1)
{
showTable();
}
while(i!=-1)
{
printf("%s\t%s\t%d\t%d\t%s\t%d\t%s\t%s\n",record[i].serial_number,record[i].name,record[i].price,record[i].year,record[i].home,record[i].number,record[i].use[2],record[i].unuse[2]);
printf("确定要删除该信息吗(Y/N)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
{
numMac--;
for(j=i;j<numMac;j++)
{
copyRecord(&record[j+1],&record[j]);
}
}
i=findRecord(target,type,i+1);
}
}
/*
*修改指定的设备记录
*/
void modifyRecord()
{
char target[20];
int type;
char str[5];
int i;
if(numMac==0)
{
printf(“没有可供修改的信息”);
return;
}
printf(“1.按编号查找要修改的信息”);
printf(“2.按名称查找要修改的信息”);
gets(str);
if(str[0]==1)
{
printf(“请输入要修改的设备的原始编号:”);
gets(target);
type=0;
}
if(str[0]==2)
{
printf(“请输入要修改的设备的原始名称:”);
gets(target);
type=1;
}
i=findRecord(target,type,0);
if(i=-1)
{
printf(“查无此记录”);
return;
}
while(i!=-1)
{
showTable();
printf("%s\t%s\t%d\t%d\t%s\t%d\t%s\t%s\n",record[i].serial_number,record[i].name,record[i].price,record[i].year,record[i].home,record[i].number,record[i].use[2],record[i].unuse[2]);
printf("确定要修改该信息吗(Y/N)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
{
printf("请输入新的设备编号:");
scanf("%s",record[i].serial_number);
printf("请输入新的设备名称:");
scanf("%s",record[i].name);
printf("请输入新的设备单价:");
scanf("%d",&record[i].price);
printf("请输入新的设备购进年代:");
scanf("%d",&record[i].year);
printf("请输入新的设备厂家:");
scanf("%s",record[i].home);
printf("请输入新的设备数量:");
scanf("%d",&record[i].number);
printf("请输入新的设备的不可用台数:");
scanf("%s",&record[i].unuse[2]);
printf("请输入新的设备的可用台数:");
scanf("%s",&record[i].use[2]);
}
i=findRecord(target,type,i+1);
}
saveTag=1;
}
/*
*对指定的记录或全部记录进行报废
*/
void rejectRecord()
{
char str[5];
char s[5];
char a[5];
int sign=0;//检测有无不可用的设备的标准
char target[20];
int type;
int i;
if(numMac==0)
{
printf(“无相关的设备信息可以报废”);
return;
}
for(i=0;i<numMac;i++)//检查所有设备是否有不可用的
{
if(record[i].use[0]!=0)
sign=1;//若sign为1则有不可用的设备,可进行报废
}
if(sign==0)//sign为0,没有不可用的设备,不能报废
{
printf("所有设备都可用,没有不可用的设备,不能报废!");
return;
}
printf("1.按指定的设备进行报废\n");
printf("2.对全部设备进行报废\n");
gets(str);
if(str[0]==1)
{
printf("1.按编号查找要报废的设备\n");
printf("2.按名称查找要报废的设备\n");
gets(s);
if(s[0]==1)
{
printf("请输入设备编号");
gets(target);
type=0;
}
if(s[0]==2)
{
printf("请输入设备的名称");
gets(target);
type=1;
}
i=findRecord(target,type,0);
while(i!=-1)
{
showTable();
printf("%s\t%s\t%d\t%d\t%s\t%d\t%s\t%s\n",record[i].serial_number,record[i].name,record[i].price,record[i].year,record[i].home,record[i].number,record[i].use[2],record[i].unuse[2]);
printf("确定要对该设备进行报废吗?(Y/N)");
gets(a);
if(a[0]=='n'||a[0]=='N')
return;
if(a[0]=='y'||a[0]=='Y')
{
record[i].number=record[i].number-atoi(record[i].unuse);
record[i].unuse[2]='0';
}
i=findRecord(target,type,i+1);
}
}
if(str[0]==2)
{
printf("确定对全部设备进行报废吗?(Y/N)");
gets(str);
if(str[0]=='n'||str[0]=='N')
return;
if(str[0]=='y'||str[0]=='Y')
{
for(i=0;i<numMac;i++)
{
record[i].number=record[i].number-atoi(record[i].unuse);
record[i].unuse[2]='0';
}
}
}
}
/*
*对指定的设备进行购买
*/
void buyRecord()
{
char str[5];
char target[20];
int type;
char s[10];
int i;
if(numMac==0)
{
printf("无设备信息,无法购买");
return;
}
printf("1.按编号查找要购买的设备\n");
printf("2.按名称查找要购买的设备\n");
gets(str);
if(str[0]==1)
{
printf("请输入设备编号:");
gets(target);
type=0;
}
if(str[0]==2)
{
printf("请输入设备的名称:");
gets(target);
type=1;
}
i=findRecord(target,type,0);
if(i!=-1)
{
showTable();
}
while(i!=-1)
{
printf("%s\t%s\t%d\t%d\t%s\t%d\t%s\t%s\n",record[i].serial_number,record[i].name,record[i].price,record[i].year,record[i].home,record[i].number,record[i].use[2],record[i].unuse[2]);
printf("确定该设备种类进行够买吗?(Y/N)");
gets(str);
if(str[0]=='n'||str[0]=='N')
return;
if(str[0]=='y'||str[0]=='Y')
{
printf("请输入购买的数量:");
gets(s);
if(atoi(s)<0)
{
printf("输入错误!");
continue;
}
if(atoi(s)>=0)
{
record[i].number=record[i].number+atoi(s);
strcpy(record[i].use,s);
}
printf("购买成功!");
}
i=findRecord(target,type,i+1);
}
saveTag=1;
}
/**
- 文件储存操作函数
*结果:数组record保存至指定文件
*返回:成功0,失败-1
*/
int Save()
{
FILE *fp;
char fname[30];
if(numMac==0)
{
printf("没有记录可以保存!");
return -1;
}
printf("请输入要保存至的文件名(按回车选择文件mac_info):");
gets(fname);
if(strlen(fname)==0)
strcpy(fname,"mac_info");
if((fp=fopen(fname,"w"))==NULL)
{
printf("该文件打不开,不能存入文件!\n");
return -1;
}
printf("正在存文件》》》》\n");
fwrite(record,sizeof(MacInfo)*numMac,1,fp);
fclose(fp);
printf("%d条数据已经存入该文件,请继续操作。\n",numMac);
saveTag=0;
return 0;
}
/*
*文件读取操作函数
*结果:record将为从指定文件中读取出记录
*返回:成功0,失败-1
*/
int Load()
{
FILE *fp;
char fname[30];
char str[5];
if(numMac!=0&&saveTag==0)
{
printf("请选择是否覆盖原来的记录(Y),还是将读取的记录添加到原有的记录之后(N)?\n");
printf("按回车直接覆盖原有的记录\n");
gets(str);
if(str[0]!='n'||str[0]!='N')
numMac=0;
}
if(numMac!=0&&saveTag==1)
{
printf("原来的记录没有保存,是否保存原来的记录?(Y/N)");
printf("按回车则保存原来的记录");
gets(str);
if(str[0]!='n'||str[0]!='N')
Save();
printf("请选择是否覆盖原来的记录(Y),还是将读取的记录添加到原有的记录之后(N)?\n");
printf("按回车直接覆盖原有的记录\n");
gets(str);
if(str[0]!='n'||str[0]!='N')
numMac=0;
}
printf("请输入要读取的文件名(按回车直接选择文件mac_info):");
gets(fname);
if(strlen(fname)==0)
strcpy(fname,"mac_info");
if((fp=fopen(fname,"rb"))==NULL)
{
printf("该文件打不开!请重新选择\n");
return -1;
}
printf("\n读取文件》》》\n");
while(!feof(fp))
{
if(numMac>=arraySize)
{
record=(MacInfo*)realloc(record,sizeof(MacInfo)*(arraySize+incr_size));
if(record==NULL)
{
printf("memory failed!");
exit(-1);
}
arraySize=arraySize+incr_size;
}
if((fread(&record[numMac],sizeof(MacInfo),1,fp)!=1))break;
numMac++;
}
fclose(fp);
printf("现在有%d条记录。",numMac);
return 0;
}