数据结构课程设计–实验室设备管理系统(c语言)[通俗易懂]

2022-11-18 15:17:04 浏览数 (2)

#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(“nn”); printheader(); //输出表格头部 i=0; while(i<n) //逐条输出数组中存储的设备信息 { printdata(tp[i]);//逐条将数组中存储的设备信息输入给表格 i ; printf(HEADER3);//打印HEADER3 } getchar();//接收任意键 }

void Wrong() //输出按键错误信息 { printf(“nnnnn***********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

代码语言:javascript复制
}

}

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(“tt 修改密码 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(); }

代码语言:javascript复制
}
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 ; }

代码语言:javascript复制
	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(sel1) { 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(); }

代码语言:javascript复制
	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(select1) //按编号查询 {

代码语言:javascript复制
	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,表明已经找到该数组元素 {

代码语言:javascript复制
	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) {

代码语言:javascript复制
	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(“nn===>保存成功,保存文件数%dn”,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用于判断密码验证结果

代码语言:javascript复制
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==>打开文件成功,总共记录数是: %dn",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();
	
}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/183393.html原文链接:https://javaforall.cn

0 人点赞