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

数据结构课程设计–实验室设备管理系统(c语言)[通俗易懂]#include<stdio.h>//标准输入输出函数库#include<stdlib.h>//标准函数库#include<string.h>//字符串函数库#include<conio.h>//屏幕操作函数库#defineHEADER1″——————————-实验室…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

#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();
	
}

}

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 史上最全的Android基础教程+入门实战训练+处理技巧(建议收藏)|寻找C站宝藏

    史上最全的Android基础教程+入门实战训练+处理技巧(建议收藏)|寻找C站宝藏有个专栏包含了Android基础教程和入门实战训练的Android项目,还有各种Android处理技巧。没错,就是我从一年前开始做的Android王国专栏。为什么叫王国呢?因为我觉得接触任何领域的第一步都是先打好基础,然后再实战演练建筑高楼,最后学会各种技巧建筑围墙,这样你的知识王国就建好了,当然这座王国还在不断更新加固。赶紧收藏起来吧,在这里,0基础学会做app!

  • 详解JVM常量池、Class常量池、运行时常量池、字符串常量池(心血总结)

    详解JVM常量池、Class常量池、运行时常量池、字符串常量池(心血总结)写在前面:博主是一位普普通通的19届二本大学生,平时最大的爱好就是听听歌,逛逛B站。博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事,做自己以后不会留有遗憾的事,做自己觉得有意义的事,不浪费这大好的青春年华。博主写博客目的是记录所学到的知识并方便自己复习,在记录知识的同时获得部分浏览量,得到更多人的认可,满足小小的成就感,同时在写博客的途中结交更多志同道合的朋友,让自己在技术的路上并不孤单。目录:1.常量池与Class常量池2.运.

  • @Mapper 与 @MapperScan 的区别[通俗易懂]

    @Mapper 与 @MapperScan 的区别[通俗易懂]文章目录1、@Mapper注解2、@MapperScan2.1、@MapperScan扫描多个包2.2、@MapperScan使用表达式,来扫描的包和其子包下面的类3、总结:1、@Mapper注解作用:用在接口类上,在编译之后会生成相应的接口实现类位置:对应的某个接口类上面@MapperpublicinterfaceEmployeeMapper{publicEm…

  • kong安装与部署

    kong安装与部署Centos7单机部署kong文档步骤 前置步骤:已安装jdk1.8和tomcat部署环境:centos7目标任务:kong:v0.14.x,postgresql:v10.5(注意:psql版本必须与kong版本对应)耗时任务:nodejs的安装(40+分钟) 安装依赖包安装gcc编译环境$yuminstall-ygccgcc-c++pcr…

  • Nginx+DNS负载均衡「建议收藏」

    Nginx+DNS负载均衡「建议收藏」今天看了很多关于nginx负载均衡的博客,人家推荐的都是自己的ip来做负载,但是同样有说DNS负载均衡,刚开始我也是一头雾水,慢慢的分析才知道真正意义上的Nginx+DNS负载均衡。1.nginx负载均衡的5种策略(先了解这个后面的才好懂)轮询策略(默认)这种策略下每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。upstreambackserver{server192.168.0.14;server192.168.0.15;}指定

  • 2021idea激活码【中文破解版】

    (2021idea激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号