数据结构课程设计--实验室设备管理系统(c语言)

#include <stdio.h> //标准输入输出函数库
#include <stdlib.h> //标准函数库
#include <string.h> //字符串函数库
#include <conio.h> //屏幕操作函数库
#define HEADER1 " -------------------------------实验室设备管理---------------------------------------- \n"
#define HEADER2 “| 编号 | 名称 | 型号 | 价格 | 厂家 | 购买日期 | \n”
#define HEADER3 “|-----------|-------------|-----------|-----------|-----------|---------------| \n”
#define FORMAT “| %s | %s | %s | %f | %s | %s | \n”
#define DATA p->num,p->name,p->model,p->price,p->factory,p->buydate
#define END “-------------------------------------------------------------------------------- \n”
#define N 60
int saveflag=0; //是否需要存盘的标志变量
char mima[20]=“123”;//密码

typedef struct equipment//设备结构体类型
{
char num[10]; //编号
char name[20]; //名称
char model[20]; //型号
double price ;//价格
char factory[20]; //厂家
char buydate[20]; //购买日期
char repair_time[20];//维修日期
}Equipment;

void menu() //主菜单
{system(“cls”); //调用DOS命令,清屏

printf(" 实验室设备管理系统\n");

printf(" ************************* 菜单 *********************\n");

printf(" * 1 增加设备信息 2 删除设备信息 *\n");

printf(" * 3 查找设备信息 4 更改设备信息 *\n");

printf(" * 5 显示设备信息 6 维护设备信息 *\n");

printf(" * 7 更改显示颜色 8 修改密码信息 *\n");

printf(" * 9 保存设备信息 0 退出系统 *\n");

printf(" *******************************************************\n");

}

void printheader() //格式化输出表头
{
printf(HEADER1);
printf(HEADER2);
printf(HEADER3);
}

void printdata(Equipment pp) //格式化输出表中数据
{
Equipment * p;//定义指针变量 p
p=&pp;//将取得的值给p
printf(FORMAT,DATA);//以表格形式输出数据
}

void Disp(Equipment tp[],int n) //显示数组tp[]中存储的记录,内容为Equipment 结构中定义的内容
{
int i;
if(n0) //表示没有设备信息记录
{
printf("\n
===>没有设备信息记录!\n");
getchar();
return;
}
printf("\n\n");
printheader(); //输出表格头部
i=0;
while(i<n) //逐条输出数组中存储的设备信息
{
printdata(tp[i]);//逐条将数组中存储的设备信息输入给表格
i++;
printf(HEADER3);//打印HEADER3
}
getchar();//接收任意键
}

void Wrong() //输出按键错误信息
{
printf("\n\n\n\n\n***********Error:输入错误 press any key to continue**********\n");
getchar();
}

void Nofind() //输出未查找此设备的信息
{
printf("\n=====>未查找此设备的信息!\n");
}

int Locate(Equipment tp[],int n,char findmess[],char nameornum[])//查询函数,findmess接收值, nameornum接收设备编号或名称
{
int i=0;
if(strcmp(nameornum,“num”)==0) //按设备编号查询
{
while(i<n)
{
if(strcmp(tp[i].num,findmess)==0) //若找到findmess值的设备编号
return i;
i++;
}
}
else if(strcmp(nameornum,“name”)==0) //按设备名称查询
{
while(i<n)
{
if(strcmp(tp[i].name,findmess)==0) //若找到findmess值的名称
return i;
i++;
}
}
return -1; //若未找到,返回一个整数-1
}

void stringinput(char *t,int lens,char *notice)//输入字符串,并进行长度验证(长度<lens)
{
char n[255];//设置输入字符串
do{
printf(notice); //显示提示信息
scanf("%s",n); //输入字符串
if(strlen(n) > lens) printf("\n 超出长度 \n"); //进行长度校验,超过lens值重新输入
}while(strlen(n)>lens);//超出长度,退出循环
strcpy(t,n); //将输入的字符串拷贝到字符串t中
}

float numberinput(char *notice)//输入数值,0<=数值)
{
float t=0.00;
do{
printf(notice); //显示提示信息
scanf("%f",&t); //输入如价格等数值型的值
if(t<0) printf("\n 价格必须 >=0! \n"); //进行数值校验
}while(t<0);//小于0,退出循环
return t;//将t的值返回
}

void Color()//颜色调节板块
{
int select;//存放选择(1~9)
printf("\t------------请在 1~9 中任意选择-----------\n");
printf("\t*********************\n");
printf("\t* 1.深蓝色 \n");
printf("\t
2.绿色 \n");
printf("\t
3.红色 \n");
printf("\t
4.紫色 \n");
printf("\t
5.黄色 \n");
printf("\t
6.亮白色 \n");
printf("\t
7.灰色 \n");
printf("\t
8.浅绿色 \n");
printf("\t
9.淡蓝色 \n");
printf("\t
********************\n");
scanf("\t%d",&select);
switch(select)
{
case 1:system(“color 1e”);break;
case 2:system(“color 2e”);break;
case 3:system(“color 4e”);break;
case 4:system(“color 5e”);break;
case 5:system(“color 6e”);break;
case 6:system(“color 7e”);break;
case 7:system(“color 8e”);break;
case 8:system(“color 3e”);break;
case 9:system(“color 9e”);;break;
default: Wrong();getchar();break; //按键有误,必须为数值0-9

}

}

int Mima()//密码验证板块
{
char temp[20];//用于存放输入的密码
printf(“请输入密码”);
scanf("%s",&temp);
if(strcmp(temp,mima)==0)//将temp与mima比较
return 1;
else
return 0;
}

void Mimaguanli()
{
char temp_mima[20],temp1[20],temp2[20];//temp_mima[20]存放用户输入密码,temp1[20],temp2[20]分别存放用户两次修改密码;
printf("\n");
printf("\t\t 修改密码 \n");
printf(END);
printf(" 请输入原始密码: “);
scanf(”\t%s",&temp_mima);
getchar();
if(strcmp(temp_mima,mima)==0)
{
printf("\t请输入新密码:");
scanf("%s",&temp1);
getchar();
printf("\t请再输入一次:");
scanf("%s",&temp2);
if(strcmp(temp1,temp2)==0)
{
printf("\t修改密码成功!!请牢记密码,任意键返回…");
strcpy(mima,temp1);
getchar();
}
else
{
printf("\t 输入两次密码不一致,修改失败!按任意键返回…");
getchar();
}

}
else
{
	printf("\t密码错误!您不能进行密码修改!请按任意键返回...");
	getchar();
	
}

}

int Add(struct equipment s[],int n )//增加记录板块
{ char ch,num[10];
int i,flag=0;
system(“cls”);//清屏
Disp(s,n); //先打印出已有的设备信息
while(1) //一次可输入多条记录,直至输入设备编号为0的记录才结束添加操作
{
while(1) //输入设备编号,保证该编号没有被使用,若输入编号为0,则退出添加记录操作
{
stringinput(num,10,“输入0返回菜单:”); //格式化输入编号并检验
flag=0;
if(strcmp(num,“0”)==0) //输入为0,则退出添加操作,返回主界面
{return n;}
i=0;
while(i<n) //查询该编号是否已经存在,若存在则要求重新输入一个未被占用的编号
{
if(strcmp(s[i].num,num)==0)
{
flag=1;
break;
}
i++;
}

	if(flag==1) //提示用户是否重新输入
	{  getchar();
	printf("这个编号 %s 已被占用,是否重新输入(y/n):",num);
	scanf("%c",&ch);
	if(ch=='y'||ch=='Y')
		continue;
	else
		return n;
	}
	else
	{break;}
}

strcpy(s[n].num,num); //将字符串num拷贝到s[n].num中
stringinput(s[n].num,15,"编号:");//检验并存放编号
stringinput(s[n].name,15,"名称:");//检验并存放名称
stringinput(s[n].model,20,"型号:");//检验并存放型号
s[n].price=numberinput("价格:");//检验并存放价格
stringinput(s[n].factory,20,"厂家:");//检验并存放厂家
stringinput(s[n].buydate,20,"购买日期:");//检验并存放购买日期
saveflag=1;
n++;

}
return n;
}

int Delete(struct equipment s[],int n )
{
int sel;//选择编号1,2
char choice;//存放Y/y N/n
char findmess[20];//存放输入名称
int p=0,i=0;
if(n<=0)//若数组为空
{ system(“cls”);
printf("\n=====>没有該设备记录!\n");
getchar();
return n;
}
system(“cls”);
Disp(s,n);//显示已有设备信息
printf("\n =>1 按编号删除 =>2 按名称删除 \n");
printf(" please choice[1,2]?;
scanf("%d",&sel);
if(sel
1)
{
stringinput(findmess,10,“输入设备编号”);
p=Locate(s,n,findmess,“num”);
getchar();
printf(“是否确定删除 是(Y/y) 否(N/n)”);
scanf("%s",&choice);
if(choice
’Y’||choice
’y’)
{
if(p!=-1)
{
for(i=p+1;i<n;i++) //删除此记录,后面记录向前移,并进行拷贝
{
strcpy(s[i-1].num,s[i].num);
strcpy(s[i-1].name,s[i].name);
s[i-1].price=s[i].price;
strcpy(s[i-1].model,s[i].model);
strcpy(s[i-1].factory,s[i].factory);
strcpy(s[i-1].buydate,s[i].buydate);
}
printf("\n
>删除成功\n");
n–;
getchar();
saveflag=1;
}
else
Nofind();
getchar();
}

	else if(choice=='N'||choice=='n')
	{
		printf(END);
		printf("按任意键返回");
		getchar();
		
	}
}

if(sel==2) //先按名称查询到该记录所在的数组元素的下标值
{
	stringinput(findmess,15,"输入设备名称:");
	p=Locate(s,n,findmess,"name");
	getchar();
	printf("是否确定删除    是(Y/y)   否(N/n)");
	scanf("%s",&choice);
	if(choice=='Y'||choice=='y')
	{
		if(p!=-1)
		{
			for(i=p+1;i<n;i++)   //删除此记录,后面记录向前移,并进行拷贝
			{ 
				strcpy(s[i-1].num,s[i].num);
				strcpy(s[i-1].name,s[i].name);
				s[i-1].price=s[i].price;
				strcpy(s[i-1].model,s[i].model);
				strcpy(s[i-1].factory,s[i].factory);
				strcpy(s[i-1].buydate,s[i].buydate);
			}
			printf("\n=====>delete success!\n");
			n--;
			getchar();
			saveflag=1;
		}
		else
			Nofind();
		getchar();
	}
	else if(choice=='N'||choice=='n')
	{
		printf(END);
		printf("按任意键返回");
		getchar();
	}
}
return n;

}

/按职工编号或姓名,查询记录/
void Search(struct equipment s[],int n)
{
int select; //1:按编号查,2:按姓名查,其他:返回主界面(菜单)
char searchinput[20]; //保存用户输入的查询内容
int p=0;
if(n<=0) //若数组为空
{
system(“cls”);
printf("\n=====>没有此设备记录!\n");
getchar();
return;
}
system(“cls”);
printf("\n =====>1 按编号查找 ===>2 按名称查找\n");
printf(" please choice[1,2]?;
scanf("%d",&select);
if(select
1) //按编号查询
{

	stringinput(searchinput,10,"输入设备编号:");
	p=Locate(s,n,searchinput,"num");//在数组s中查找编号为searchinput值的元素,并返回该数组元素的下标值
	if(p!=-1) //若找到该记录
	{
		printheader();
		printdata(s[p]);
		printf(END);
		printf("按任意键返回");
		getchar();
	}
	else
		Nofind();
	getchar();
}
else if(select==2) //按姓名查询
{
	stringinput(searchinput,15,"输入设备名称·:");
	p=Locate(s,n,searchinput,"name");//在数组s中查找编号为searchinput值的元素,并返回该数组元素的下标值
	if(p!=-1)
	{
		printheader();
		printdata(s[p]);
		printf(END);
		printf("按任意键返回");
		getchar();
	}
	else
		Nofind();
	getchar();
}
else
	Wrong();
getchar();

}

/修改记录。先按输入的设备编号查询到该记录,然后提示用户修改编号之外的值,编号不能修改/
void Alter(struct equipment s[],int n)
{
char findmess[20];
int p=0;
int choice;
if(n<=0)
{ system(“cls”);
printf("\n=====>没有设备记录\n");
getchar();
return ;
}
system(“cls”);
printf(“修改设备记录”);
Disp(s,n);
stringinput(findmess,10,“输入设备号码”); //输入并检验该编号
p=Locate(s,n,findmess,“num”); //查询到该数组元素,并返回下标值
if(p!=-1) //若p!=-1,表明已经找到该数组元素
{

	printf("\t请选择修改内容\n");
	printf("\t*********************\n");
	printf("\t*       1.编号      *\n");
	printf("\t*       2.名称      *\n");
	printf("\t*       3.价格      *\n");
	printf("\t*       4.型号      *\n");
	printf("\t*       5.厂家      *\n");
	printf("\t*       6.购买日期  *\n");
	printf("\t*********************\n");
	
	scanf("%d",&choice);
	switch(choice){
	case 1:printf("编号:%s,\n",s[p].num);
		stringinput(s[p].num,15,"输入新编号:");break;
	case 2:
		printf("名称:%s,",s[p].name);
		stringinput(s[p].name,15,"输入新名称:");break;
	case 3:
		printf("价格:%f,",s[p].price);
		s[p].price=numberinput("输入新价格:");break;
	case 4:printf("型号:%s",s[p].model);
		stringinput(s[p].model,15,"输入新型号:");break;
	case 5:	printf("厂家:%s",s[p].factory);
		stringinput(s[p].factory,50,"输入新厂家:");break;
	case 6:printf("购买日期:%s",s[p].buydate);
		stringinput(s[p].buydate,50,"输入新购买日期:");break;
	default: Wrong();getchar();break;    
		
	}
	
	printf("\n=====>修改成功\n");
	getchar();
	Disp(s,n);
	getchar();
	printf("按任意键返回");
	saveflag=1;
}
else //若p==-1,表明没找到该数组元素,退出
{Nofind();
getchar();
}
return ;

}

//维修信息管理
void repairEquipment(struct equipment s[],int n){
int oper;
int p=0;
char searchinput[20]; //保存用户输入的查询内容
printf(“请输入维修操作(1~2):\n1.记录\t2.查找\n”);
scanf("%d",&oper);
getchar();
if(oper==1)
{

	printf("请输入维修设备编号:");
	stringinput(s[n].num,15,"编号:");
	printf("请输入维修时间(xxxx-xx-xx):");
	stringinput(s[n].repair_time,20,"维修时间:");
	getchar();
	printf("按任意键返回");
	saveflag=1;	
}
else if(oper==2){
	
	stringinput(searchinput,10,"输入维修设备编号:");
	p=Locate(s,n,searchinput,"num");
	if(p!=-1) //若找到该记录
	{
		
		printf(s[n].repair_time);
		printf("\n");
		printf(END);
		printf("按任意键返回");
		getchar();
	}
	else
		Nofind();
	getchar();
}
else
	Wrong();
getchar();

}

void Save(struct equipment s[],int n)
{
FILE* fp;//文件指针
int i=0;
fp=fopen(“d:\keshe”,“wb”);//以只写方式打开二进制文件
if(fpNULL) //打开文件失败
{
printf("\n
===>open file error!\n");
getchar();
return ;
}
for(i=0;i<n;i++)
{
if(fwrite(&s[i],sizeof(equipment),1,fp)1)//每次写一条记录或一个结构数组元素至文件
//fwrite()是一个写文件操作的函数,
//从文件指针fp读取一个size为sizeof(equipment)的数据,存入equip[count]
{
continue;
}
else
{
break;
}
}
if(i>0)
{
getchar();
printf("\n\n
===>保存成功,保存文件数%d\n",i);
getchar();
saveflag=0;
}
else
{system(“cls”);
printf(“没有记录被保存\n”);
getchar();
}
fclose(fp); //前面曾把打开文件(用fopen函数)时函数返回的指针赋给了fp,
//现在把fp指向的文件夹关闭,此后fp不再指向该文件夹
}

void main()
{
equipment equip[N]; //定义equipment结构体
FILE *fp; //文件指针
int select; //保存选择结果变量
char ch; //保存(y,Y,n,N)
int count=0; //保存文件中的记录条数(或元素个数)
int s; //s用于判断密码验证结果

s=Mima();
if(s==1)
{	fp=fopen("d:\\keshe","ab+");
//以追加方式打开二进制文件d:\\keshe,可读可写,若此文件不存在,会创建此文件
if(fp==NULL)
{
	printf("\n=====>不能打开文件\n");
	exit(0);
}

while(!feof(fp))//没有到达文件末,则继续循环
{
	if(fread(& equip[count],sizeof(equipment),1,fp)==1) //一次从文件中读取一条设备记录
		//fread()是一个读文件操作的函数,
		//从文件指针fp读取一个size为sizeof(equipment)的数据,存入equip[count]
		count++;
}
fclose(fp); 
printf("\n==>打开文件成功,总共记录数是: %d\n",count);
getchar();
menu();
while(1)
{
	system("cls");
	menu();
	printf("\n              请选择(0~9):");    //显示提示信息
	scanf("%d",&select);
	
	if(select==0)
	{
		if(saveflag==1) //若对数组的数据有修改且未进行存盘操作,则此标志为1
		{ getchar();
		printf("\n==>是否保存文件?(y/n):");
		scanf("%c",&ch);
		if(ch=='y'||ch=='Y')
			Save(equip,count);
		}
		printf("\n===>谢谢你的使用!");
		getchar();
		break;
	}
	
	switch(select)
	{
	case 1:count=Add( equip,count);break;       //增加设备资记录
	case 2:count=Delete( equip,count);break;      //删除设备记录
	case 3:Search( equip,count);break;           //查询设备记录
	case 4:Alter( equip,count);break;            //修改设备记录
	case 5:system("cls");Disp(equip,count);break; //显示设备记录
	case 6:system("cls");repairEquipment(equip,count);break;//维修日期记录
	case 7:system("cls");Color();  break;  //更改显示颜色 
	case 8:system("cls");Mimaguanli();break;//密码管理
	case 9:Save(equip,count);break;        //保存设备记录
		
		
	default: Wrong();getchar();break;        //按键有误,必须为数值0-9
	}
}
}
else {
	printf("\t 密码有误!请按任意键返回...");
	getchar();
	
}

}

  • 21
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据表结构说明 4 1、基础字典 4 1.1设备分类字典sb_zd_class 4 1.2折旧方法字典sb_zd_depreciation(暂时没用到) 4 1.3折旧率字典sb_zd_depreciation_rate 4 1.4折旧类型字典sb_zd_depreciation_type 5 1.5设备名称字典sb_zd_equipname 5 1.6设备入出库类型字典sb_zd_in_out_type 5 1.7 设备库帐号字典sb_zd_kzh 6 1.8设备维修单位字典sb_zd_maintenance_unit 6 1.9设备制造厂商字典sb_zd_manufacture 6 1.10设备计量单位类型字典 sb_zd_measure_type 7 1.11设备计量单位字典 sb_zd_measurer 7 1.12设备调配原因字典sb_zd_move_cause 8 1.13设备状态字典sb_zd_state 8 1.14设备供应商字典 sb_zd_supplyer 8 1.15设备单位字典sb_zd_unit 9 1.16设备用途字典sb_zd_usage 9 1.17设备维修类型sb_zd_maintenance_kind 9 1.18设备内部帐号字典sb_zd_inner_acct_no 9 2、业务数据表 10 2.1设备现有附件表sb_appendix 10 2.2设备附件使用表sb_appendix_use 11 2.3设备成本效益信息表sb_cost_benefit 11 2.4设备折旧变更记录表sb_depreciation_alter_record 12 2.5设备折旧记录表sb_depreciation_record 12 2.6设备进口说明表sb_import_comment 12 2.7设备贷款记录表sb_in_credit(暂时没用到) 13 2.8设备购进明细表sb_in_detl 13 2.9主设备表sb_main_equipment 14 2.10设备维修计划单sb_maintenance_plan(暂时没用到) 15 2.11设备维修记录sb_maintenance_record 15 2.12设备计量记录sb_measure_record 16 2.13设备调配明细sb_move_detl 16 2.14设备付款明细sb_pay_detl 17 2.15设备服务计划sb_service_plan(暂时没用到) 17 2.16设备服务记录sb_service_record(暂时没用到) 18 2.17设备增值表sb_value_increment 18 2.18设备销减表sb_waste 19 2.19设备月结信息sb_report 19 2.20设备配置表sb_config 20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值