大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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(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;
}
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) //按编号查询
{
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账号...