equipment.h
#ifndef H_EQUIPMENT_HH //如果没有定义H_EQUIPMENT_HH,继续执行
#define H_EQUIPMENT_HH//定义H_EQUIPMENT_HH,可避免重复包含宏定义#include
#include
#include
#include
//头文件包含
#define INITIAL_SIZE 5//100 // 数组初始大小
#define INCR_SIZE 5//0 // 数组每次增加的大小
//可根椐系统使用需要的常量定义
struct equipment_info
{
char number[20]; //设备编号
char name[20]; // 设备名称
char factory[20];//生产厂家
char year[20];//购进年代
float price; // 设备单价
int quantity;//数量
int useable;//可用数
};
typedef struct equipment_info QuipInfo;//定义一个类型名StuInfo代
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
定义的结构体student_info
extern int numEquip; // 记录的学生数
extern QuipInfo* records; // 记录学生信息的数组指针
extern char savedTag; // 信息是否已保存的标志,0为已保存,1为未保存extern int arraySize; // 数组大小
//共享的全局变量定义
void handle_menu(void);
int menu_select(void);
void addRecord(void);
void modifyRecord(void);
void display(void);
void queryInfo(void);
void removeRecord(void);
void decRecord();
int saveRecords(void);
int loadRecords(void);
void quit(void);
void showTable(void);
int findRecord(char* target, int targetType, int from);
void copyRecord(QuipInfo*src, QuipInfo*dest);
//函数申明,注意()里必须包含对应函数形参类型
1
#endif // H_EQUIPMENT_HH
equipment.c
#include"equipment.h"
/**************************
* 初始化
**************************/
int numEquip=0; // 记录的设备数
char ch1[15],ch2[15]={"LIANGJIPEI"};
QuipInfo *records = NULL; // 记录设备信息的数组
char savedTag = 0; // 信息是否已保存的标志,1为未保存,0为已保存
int arraySize; // 数组大小
/**************************
* 主函数
**************************/
int main()
{
// 初始化数组
records = (QuipInfo*)malloc(sizeof(QuipInfo)*INITIAL_SIZE);
//给数组分配StuInfo分配INITIAL_SIZE个记录空间大小
if (records == NULL)
{
printf("memory fail!");
exit(-1);
//如果内存空间不够分配,退出程序
}
arraySize = INITIAL_SIZE;
printf("\n");
printf("\t**************************************\n");
printf("\t*这是一个单位仪器设备基本信息管理系统*\n");
printf("\t*******可以对仪器设备进行管理*********\n");
printf("\t**********欢迎使用管理程序************\n");
printf("\t*********** O(∩_∩)O **************\n");
for(;;)
{printf("\n\n进入系统的密码是:");
gets(ch1);
if(strcmp(ch1,ch2)==0)break;
else printf("\nSORRY!密码错误╮(╯_╰)╭请重新输入....");
}
printf("\n\t\t欢迎使用设备管理系统! \\(^o^)/\n");
handle_menu();
}
/**************************
* 菜单处理函数
**************************/
void handle_menu(void)
{
for ( ; ; )
{
switch(menu_select())
{
case 1:
addRecord();
break;
case 2:
decRecord();
break;
case 3:
queryInfo();
break;
case 4:
display();
break;
case 5:
removeRecord();
break;
case 6:
modifyRecord();
break;
case 7:
saveRecords();
break;
case 8:
loadRecords();
break;
case 9:
quit();
}
}
}
/****************************
* 菜单选择函数menu_selected
****************************/
int menu_select( )
{
char s[2];
int cn=0;
printf("\n");
printf ( "\t1. 购入设备****\n" );
printf ( "\t2. 设备报废****\n" );
printf ( "\t3. 查询设备信息\n" );
printf ( "\t4. 统计设备信息\n" );
printf ( "\t5. 删除设备信息\n" );
printf ( "\t6. 修改设备信息\n" );
printf ( "\t7. 保存设备信息至记录文件\n" );
printf ( "\t8. 从记录文件读取设备信息\n" );
printf ( "\t9. 结束运行\n" );
printf ( "\n\t左边数字对应功能选择,请选择1-9:" );
//常用功能的提示应当放前面,对整个的功能排列作了对应调整
for(; ;)
{
gets(s);
cn = atoi (s);
if(cn<1|| cn>9 ) printf("\n\t输入错误,重选1-9:");
else {printf("\n");break;}
}
return cn;
}
/***************************************
*结束运行,退出*
*参数量void
***************************************/
void quit(void)
{
char str[5];
if (savedTag==1)
{printf("是否保存原来的记录?(Y/n)");
gets(str);
if(str[0]!='n'&&str[0]!='N')
saveRecords();
}
free(records);
printf("\n goodbye~\n\n");
exit(0);
}
add_disp.c
#include"equipment.h"
/********************
* 打印表头
********************/
void showTable(void)
{
printf("编号\t名称\t单价\t购进年代\t生产厂家\t该设备数量\t可用数\n");
}
/***********************
* 显示所有设备信息
***********************/
void display(void)
{
int i;
if (numEquip == 0)
{
printf("*****没有可供显示的记录*****\n");
return;
}
showTable();
for (i=0; i=arraySize) // 现在的数组空间不足,需要重新申请空间
{
records = realloc(records,(arraySize+INCR_SIZE)*sizeof(QuipInfo));//新空间大小变为(arraySize+INCR_SIZE)记录//大小,即在原来基础上增加INCR_SIZE个记录大小
if (records == NULL)
{
printf("memory failed!");
exit(-1);
}
arraySize = arraySize+INCR_SIZE; //arraySize修改为新空间可保存的记录数
}
printf("\n\n请输入设备名称:");gets(str);
type=1;i=findRecord(str,type,0);
if(i!=-1)
{
printf("已有该设备,请输入购入数量");
gets(str);
quantity=(int)atof(str);
records[i].quantity+=quantity;
}
else
{
strcpy(records[numEquip].name,str);
printf("请输入设备编号:");
gets(records[numEquip].number);
printf("请输入设备单价:");
gets(str);
price=(float)atof(str);
records[numEquip].price=price;
printf("请输入购进年代:");
gets(records[numEquip].year);
printf("请输入生产厂家:");
gets(records[numEquip].factory);
printf("请输入购进设备数量:");
gets(str);
quantity = (int)atof(str);
records[numEquip].quantity=quantity;
records[numEquip].useable=records[numEquip].quantity;
numEquip++;printf("购入成功!!!\n"); count++;
}
}
printf("\n现在一共有%d条设备信息\n",numEquip);
savedTag = 1;
}
/********************************************************
* 设备报废
********************************************************/
void decRecord(void)
{
char str[10];
int type,i,quantity;
if(numEquip==0)
{
printf("*****没有任何设备的记录*****\n");
return;
}
while(1)
{
loop:printf("请输入如何找到欲报废设备的记录的方式:\n");
printf("1. 按设备编号\n");
printf("2. 按设备名称\n");
gets(str);
if (str[0] == '1')
{
printf("\n请输入该设备的编号:");
gets(str);
type = 0;
}
else if (str[0] == '2')
{
printf("请输入该设备的名称:");
gets(str);
type = 1;
}
else
{
printf("输入错误,请重新输入\n");goto loop;
}
i=findRecord(str,type,0);
if (i==-1) printf("没有符合条件的学生!\n");
if (i!=-1)
{printf("请输入报废数量");
gets(str);
quantity = (int)atof(str);
records[i].useable-=quantity;
}printf("\n是否继续报废设备?(Y/N)");
for(; ;)
{
gets(str);
if(str[0]!='n'&&str[0]!='N'&&str[0]!='y'&&str[0]!='Y') printf("\n\t输入错误,请重新输入Y/N....");
else {printf("\n");break;
}
}if (str[0] == 'y'||str[0] == 'Y') goto loop;else break; }
}
que_remv_modi.c
#include "equipment.h"
/************************************************************** * 查找指定的记录
* 参数:target:欲查找记录的某一项与target相同
* targetType:表明通过哪一项来查找,0为学号,1为姓名,2为名次
* from:从第from个记录开始找
* 返回:找到的记录的序号,若找不到则返回-1
**************************************************************/
int findRecord(char* target, int targetType, int from)
{
int i;
for (i=from; inumber,src->number);
strcpy(dest->name,src->name);
strcpy(dest->year,src->year);
strcpy(dest->factory,src->factory);
dest->price=src->price;
dest->useable=src->useable;
dest->quantity=src->quantity;
}
/*************************
* 修改指定学生的信息
*************************/
void modifyRecord()
{
char str[10];
char target[20];
int type;
int i;
int quantity;
float price;
int count = 0;
if(numEquip==0)
{
printf("\n没有可供修改的记录...");
return;
}
while(1)
{
printf("请输入如何找到欲修改的记录的方式:(直接输入回车则结束移除操作)\n");
printf("1. 按设备编号\n");
printf("2. 按设备名称\n");
gets(str);
if (strlen(str) == 0) break;
if (str[0] == '1')
{
printf("请输入该设备编号:");
gets(target);
type = 0;
}
else if (str[0] == '2')
{
printf("请输入该设备名称:");
gets(target);
type = 1;
}
else
{printf("输入错误,结束");break;
}
i = findRecord(target,type,0);
if (i==-1) printf("没有符合条件的学生!\n");
while(i != -1)
{
showTable();
printf("%s %s %.2f %s %s %d %d",records[i].number,records[i].name,records[i].price,records[i].year,records[i]. factory,records[i].quantity,records[i].useable);
printf("\n确定要修改这个设备的信息吗?(y/N)");
gets(str);
if (str[0]=='y' || str[0]=='Y')
{
printf("下面请重新输入该设备的信息:\n");
printf("请输入设备编号:");
gets(records[i].number);
printf("请输入设备名称:");
gets(records[i].name);
printf("请输入设备单价:");
gets(str);
price=(float)atof(str);
records[i].price=price;
printf("请输入购进年代:");
gets(records[i].year);
printf("请输入生产厂家:");
gets(records[i].factory);
printf("\n 请输入设备数量:");
gets(str);
quantity = (int)atof(str);
records[i].quantity=quantity;
i=findRecord(target,type,i+1);
}
else break;
}
}savedTag = 1;}
sav_load.c
#include "equipment.h"
/**********************************
* 文件存储操作函数
* 结果:数组records被保存至指定文件
* 返回:成功0,失败-1
**********************************/
int saveRecords()
{
FILE *fp;
char fname[30];
if (numEquip == 0)
{
printf("没有记录可存!");
return -1;
}
printf("请输入要存入的文件名(直接回车选择文件equip_info):"); gets(fname);
if (strlen(fname) == 0)
strcpy(fname,"equip_info");
if ((fp=fopen(fname,"wb"))==NULL)
{
printf("不能存入文件!\n");
return -1;
}
printf("\n存文件...\n");
fwrite(records,sizeof(QuipInfo)*numEquip,1,fp);
fclose(fp);
printf("%d条记录已经存入文件,请继续操作。\n",numEquip); savedTag = 0; // 更新是否已保存的标记
return 0;
}
/*******************************************
* 文件读取操作函数
* 结果:records将为从指定文件中读取出的记录
* 返回:成功0,失败-1
*******************************************/
int loadRecords(void)
{
FILE *fp;
char fname[30];
char str[5];
if (numEquip!=0 && savedTag==0)//如果内存记录的学生数非0且已保存
{
printf("请选择您是要覆盖现有记录(Y),还是要将读取的记录添加到现有记录之后(n)?\n");
printf("直接回车则覆盖现有记录\n");
gets(str);
if (str[0]!='n' && str[0]!='N')
numEquip = 0;
}
if (numEquip!=0&& savedTag==1) //如果内存记录的学生数非0且没有保存
{
printf("读取文件将会更改原来的记录,是否保存原来的记录?(Y/n)");
printf("直接回车则保存原来记录\n");
gets(str);
if (str[0]!='n' && str[0]!='N')
saveRecords();
printf("请选择您是要覆盖现有记录(Y),还是要将读取的记录添加到现有记录之后(n)?\n");
printf("直接回车则覆盖现有记录\n");
gets(str);
if (str[0]!='n' && str[0]!='N')
numEquip = 0;
}
printf("请输入要读取的文件名(直接回车选择文件equip_info):");
gets(fname);
if (strlen(fname) == 0)
strcpy(fname,"equip_info");
if ((fp=fopen(fname,"rb"))==NULL)
{
printf("打不开文件!请重新选择\n");
return -1;
}
printf("\n取文件...\n");
while(!feof(fp))
{
// 现在的数组空间不足,需要重新申请空间
if (numEquip >= arraySize)
{
records = realloc(records,(arraySize+INCR_SIZE)*sizeof(QuipInfo));
if (records == NULL)
{
printf("memory failed!");
exit(-1);
}
arraySize = arraySize+INCR_SIZE;
}
if(fread(&records[numEquip],sizeof(QuipInfo),1,fp) != 1) break;
//读取一条新记录,保存到records[numEquip],
numEquip++;//记录数加1
}
fclose(fp);
printf("现在共有%d条记录。",numEquip);
return 0;
}
16