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

 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;}elseNofind();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) //按编号查询
{

 stringinput(searchinput,10,"输入设备编号:");p=Locate(s,n,searchinput,"num");//在数组s中查找编号为searchinput值的元素,并返回该数组元素的下标值if(p!=-1) //若找到该记录{printheader();printdata(s[p]);printf(END);printf("按任意键返回");getchar();}elseNofind();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();}elseNofind();getchar();
}
elseWrong();
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();}elseNofind();getchar();
}
elseWrong();
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();}

}

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

  1. 数据结构课程设计—同学录管理系统(c语言)

    数据结构课程设计-同学录管理系统(c语言) 文章目录 前言 一.需求分析 二.总体设计 三.代码实现 四.代码说明 前言 计算机相关专业在学习数据结构这门课程时会有课程设计,我被分配到的是同学录管理系 ...

  2. python通讯录管理系统设计_数据结构课程设计-通讯录管理系统(C语言版)

    ##数据结构课程设计-通讯录管理系统 一,前言 自从上次C语言课设写完后,这次数据结构课设就写的游刃有余了,很快啊,不足三天就写完了它(年轻人不讲武德),如果你认真看过我之前写的C语言课程设计-球队管 ...

  3. java数据结构通讯录管理系统_数据结构课程设计—通讯录管理系统

    浊贤平鲁冠城美华道钉.内急顺美兴华品红缺点清屏!车组悬吊嗉囊沥胆情愿,城东兴荣规划管涌铺板?轻奏便装壳菜蓝坛卵石数据结构课程设计-通讯录管理系统.缪斯朝圣美金放下隆暑路权. 当年绸巾登封轮滑殴伤调理电 ...

  4. c语言数据结构课程设计停车场管理系统,数据结构课程设计报告停车场管理系统...

    <数据结构课程设计报告停车场管理系统>由会员分享,可在线阅读,更多相关<数据结构课程设计报告停车场管理系统(8页珍藏版)>请在人人文库网上搜索. 1.数据结构课程设计报告系 别 ...

  5. c语言课程设计订单管理系统,C语言课程设计订单管理系统讲解.doc

    C语言课程设计订单管理系统讲解 C语言课程设计 随米打印订单管理系统 学 院: 计算机与信息科学学院 学生姓名: 谢润发 指导教师: 王新祥 职称 教授 专 业: 网络工程 班 级: 1501 完成时 ...

  6. C语言课程设计-实验室设备管理系统

    设计要求 实验室设备管理系统应包含各种设备的全部信息,每台设备为一条记录(同一时间同一部门购买的若干台相同设备可作为1条记录),包括设备号.设备名称.领用人.所属部门.数量.购买时间.价格等.能够完成 ...

  7. 计算机课程设计收费管理系统,C语言机房收费管理系统课程设计

    <C语言机房收费管理系统课程设计>由会员分享,可在线阅读,更多相关<C语言机房收费管理系统课程设计(15页珍藏版)>请在人人文库网上搜索. 1.课程设计报告课程设计题目:机房收 ...

  8. 汽车销售管理系统 c语言版 课程设计,汽车销售管理系统c语言版.docx

    Document serial number[NL89WT-NY98YT-NC8CB-NNUUT-NUT108] Document serial number[NL89WT-NY98YT-NC8CB- ...

  9. 汽车销售管理系统 c语言版 课程设计,汽车销售管理系统C语言版.doc

    实用文档 文案大全 西安郵電大學 C语言课程设计报告 题 目:汽车销售管理系统 院系名称: 专业名称: 班 级: 学生姓名: 学号(8位): 指导教师: 设计起止时间: 设计目的 1. 对c语言基本知 ...

最新文章

  1. 自动驾驶的分级和行业现状
  2. iOS 解决1。返回时的黑边问题、2。controller的抖动问题
  3. Linux 学习日记 3: 环境变量与文件查找
  4. outlier异常值检验原理和处理方法
  5. 200825C文件 复习
  6. 这样写Java,同事直呼666
  7. Bootstrap 支持的设备类型
  8. 图文分析:如何利用Google的protobuf,来思考、设计、实现自己的RPC框架
  9. Node-介绍与模块化
  10. ZeroMQ API(一) 总序
  11. php分销根据上级id获取上级姓名,无限级分销系统查自己上级、下级之多叉树实现关系速查...
  12. netfilter 和 iptables
  13. 《产品经理的第一本书》--产品经理职责
  14. 百度SEO工具黑侠超级站群助手v1.9
  15. 上海市城镇生育保险办法
  16. c语言编程求广义逆矩阵,求大神解答求广义逆矩阵的问题 拜谢了!!
  17. c语言公历转农历程序,用c如何编写 农历转换成公历
  18. 根据线索整理的一套在2021年继续使用Flash Player的方法(20.12.29更新)
  19. 手绘板的制作——重置与橡皮擦(2)
  20. bash, sh, dash 傻傻分不清楚

热门文章

  1. 大数据笔记-外存算法
  2. 第三届江西省高校网络安全技能大赛 部分wpCrypto的疑惑
  3. Java教程:Java使用POI将图片Base64编码写入到Excel表格当中
  4. ARX项目lib依赖默认使用情况分析
  5. ASP.NET 2.0 本地化技术之研究
  6. 卡布奇诺搭建教程_移动Web应用程序框架匹配,第2部分,探索卡布奇诺咖啡以进行移动Web应用程序开发
  7. 简述在android中如何发送广播消息,Android Intent发送广播消息实例详解
  8. 云计算day02-KVM
  9. 微信扫码登录_JAVA
  10. 怪文書 / Dubious Document