注:本人能力有限,所以部分代码借鉴于网络,属于一半原创、一半借鉴,若有侵权,万望海涵
题目
本文所选设计题目为“电子元器件管理系统设计”,基本数据结构有:编号、类型、型号、数目、封装、厂家、价格等。
其中系统的基本功能为:
- 添加新元器件时的信息录入
- 已有元器件信息删除
- 查找元器件(根据编号、类型、型号、价格)
- 排序(根据编号、类型、型号、价格)
- 统计(根据编号、类型、型号、价格)
- 数据文件的保存和加载
另外要求,使用二进制文件方式存储数据,系统以菜单方式工作。
其中实现的附加功能为:
- 进入时需输入管理员密码(密码为:000000)
功能需求分析
本系统为实验室、电子元器件仓库等需要对元器件进行系统管理的场所提供了一个可以在Windows系统上运行的电子元器件管理平台。
(1)菜单功能:系统以菜单方式工作,根据题目要求,提供键盘式菜单选项实现功能选择;
(2)密码保护功能:在进入该系统时,输入管理员密码,以增加该系统地安全性和可靠性;
(3)数据文件的保存和加载功能:该平台的用户为电子元器件管理员,要实现元器件基本信息的初始化,读入存储在文件data.txt中的数据;
(4)元器件信息打印功能:根据需要将所有元器件基本信息进行打印,展示给管理员;
(5)元器件信息录入功能:根据需要从键盘输入元器件基本信息,包括编号、类型、型号、数目、封装、厂家、价格、生产日期;
(6)元器件信息删除功能:根据需要删除元器件基本信息,通过输入元器件类型或厂家或型号,删除包括编号、类型、型号、数目、封装、厂家、价格、生产日期在内的元器件数据;
(7)元器件信息查询功能:根据需要,按照编号对元器件进行查找;
(8)元器件信息统计功能:根据需要,按照编号、类型、型号、价格范围对元器件进行数量统计;
(8)登录密码修改功能:为保证系统安全性,提供了管理员密码修改功能,使系统安全系数更高;
开发与运行环境需求
操作系统:Windows7及以上版本
编程语言:C语言
开发环境:VS2010
概要设计
系统总体结构
根据分析结果,电子元器件管理平台可分为信息载入、添加信息、删除信息、显示、查询并统计及信息保存几个模块。系统总体结构如图1 所示。
图1 系统总体结构框图
注:如上流程图建议采用visio绘制
主要数据结构
本系统采用链表处理数据,根据分析,系统设计了结构体:electronics用来存储电子元器件基本信息。电子元器件基本信息包括编号、类型、型号、数目、封装、厂家、价格、生产日期。具体结构如下:
struct electronics
{
char no[40]; //元器件编号
char type[40]; //元器件类型
char model[40]; //元器件型号
int number; //元器件数目
char encapsulation[40]; //元器件封装
char factory[40]; //元器件厂家
int price; //元器件价格
char date[40]; //元器件生产日期
struct electronics *next; //下一节点指针
};
系统中定义的函数列表
为了实现系统的各项功能,本设计中自定义相关的各个函数,各函数的原型及功能如下:
void load(); //读文件数据,并创建链表
void save(); //将链表中数据写到文件中
void add(ELE *p); //链表中增加元器件结点
void del(char *s); //链表中删除指定型号的元器件结点
void update(); //链表中更新元器件结点中的数据
void browse(); //在屏幕上显示链表中所有结点数据
void menu(); //显示系统主菜单
void delELE(); //删除元器件
void addELE(); //增加元器件
void link_order(STU *p_head); //统计元器件数量
各模板功能实现
主函数
主函数main()函数通过多分支结构switch实现功能的选择,调用不同函数实现不同功能,包括添加电子元器件信息、查询,统计、修改、删除、显示等功能。登录主界面如图2所示,主函数流程图如图3所示。
图2 登录主界面
图3 主函数流程图
主函数代码
void main(void)
{
int op;//operation
int password, k,m;
h =(ELE *)malloc(sizeof(ELE)); //创建链表的头结点
h->next = NULL; //初始化链表头节点中下一节点指针为NULL
/
//添加密码功能///
system("color 9E");
printf("\n\n\n\n");
printf("\t\t\t********************************************************************************************\n");
printf("\n\t\t\t**@ Author : gaohaijing **\n\n");
printf("\t\t\t********************************************************************************************\n");
printf("\n\t\t\t**欢迎进入电子元器件管理系统,本系统初始密码为000000,风险性较高,建议您进入后及时修改密码**\n\n");
printf("\t\t\t********************************************************************************************\n\n");
/*初始界面 输入验证密码*/
for(k=1;k<=3;k++)
{
printf("\t\t\t请输入管理员密码:");
scanf("%d",&password);
printf("\t\t\t****************************************\n");
if(password==000000)
{
menu();
break;
N;
}
else
{
printf("\t\t\t密码错误,请重新输入!\n\n\t\t\t");
scanf("%d",&password);
printf("\t\t\t****************************************\n");
}
}
scanf("%d",&op);
while(op!=0)
{
switch(op)
{
case 1:
load();
break;
case 2:
save();
break;
case 3:
addELE();
break;
case 4:
delELE();
break;
case 5:
update();
break;
case 6:
browse();
break;
case 7:
tongji();
break;
case 8:
link_order(h);
break;
}
scanf("%d",&op);
}
system("pause");
}
/
//显示系统主菜单函数
/
void menu()
{
N;
printf("\n\n\n\n");
printf(" ****************************************************************************************** \n");
printf(" 亲爱的管理员您好,欢迎使用电子元器件管理系统~ 请先调整data.txt文件至“ANSI”编码状态!\n");
printf(" ****************************************************************************************** \n");
printf(" 操作指引:\n");
printf(" ****************************************************************************************** \n");
printf(" 第一步:进入“3”添加元器件信息至文件中,请可以选择复制如下基本信息:\n");
printf(" !分三次添加,注意不要复制到多余空格,系统简单不稳定,容易产生乱码\n");
printf(" A0003 IC LM324 100 SOP-8 国半 1.00 2005-1\n");
printf(" A0001 三极管 9013 1000 TO92 松下 0.50 2006-3\n");
printf(" A0002 二极管 BIV30-200 450 SOD80 PH 0.10 2004-3\n");
printf(" 第二步:进入“2”将链表中的数据保存到文件中\n");
printf(" 第三步:进入“6”打印当前链表中的数据,可以看到第一步的数据被添加进了数据文件\n");
printf(" !!!!!!注意,若打印出的列表后缀存在乱码,不要在意,是txt文件中光标位于新的一行,而新的一行不存\n");
printf(" !!!!!!在数据导致的,您可以选择打开data.txt文件将光标移到最后一行最后,也可以忽略~\n");
printf(" 第四步:进入“5”当有数据需要更新时,可以通过查询编号进行修改操作\n");
printf(" 第五步:进入“6”打印当前链表中的数据,可以看到数据修改成功\n");
printf(" 第六步:进入“4”通过选择类型或编号或价格可以进行选择性删除\n");
printf(" 第七步:进入“6”打印当前链表中的数据,可以看到数据已被删除\n");
printf(" 第八步:进入“7”通过选择类型或编号或价格可以进行数据的统计和查询\n");
printf(" 第九步:进入“8”通过价格高低、数量多少对数据进行排序\n");
printf(" 第十步:选择“2”进行保存,点开data.txt文件查看\n");
printf(" ****************************************************************************************** \n");
printf(" 恭喜您完成新手指引,可以开始您的体验了~:\n");
printf(" ****************************************************************************************** \n");
printf(" * 0:停止程序运行 1 :加载数据文件中数据 * \n");
printf(" * 2:保存数据到数据文件 3 :添加元器件信息 * \n");
printf(" * 4:信息删除 5 :信息更新 * \n");
printf(" * 6:现有信息打印 7 :统计查询 * \n");
printf(" * 8:数据排序 * \n");
printf(" ****************************************************************************************** \n");
printf(" * !使用前注意事项! * \n");
printf(" ****************************************************************************************** \n");
printf(" * PS1:每次进行添加信息或删除信息后,若要永久保存至数据文件中,请选择2选项,进行数据保存 * \n");
printf(" * PS2:若未将数据文件中数据进行加载,则无法将现有信息打印 * \n");
printf(" * PS3:由于程序较简单,操作出错对结果影响较大,所以本程序中数据保存另有选项2代替,以防止 * \n");
printf(" * 不可逆数据丢失或损毁 * \n");
printf(" * PS4:为保证文本文件导入时不产生乱码情况,请确保“data.txt”文件为“ANSI”编码类型 * \n");
printf(" ****************************************************************************************** \n");
}
管理员密码登录模块
为了保证系统数据的安全性,特为此界面系统设计了管理员密码登录界面,管理员需要输入密码000000,才可成功登录。密码界面如图4、5所示。
图4 登录前密码界面(000000)
图5 密码输入错误界面
密码部分代码
/*初始界面 输入验证密码*/
for(k=1;k<=3;k++)
{
printf("\t\t\t请输入管理员密码:");
scanf("%d",&password);
printf("\t\t\t****************************************\n");
if(password==000000)
{
menu();
break;
N;
}
else
{
printf("\t\t\t密码错误,请重新输入!\n\n\t\t\t");
scanf("%d",&password);
printf("\t\t\t****************************************\n");
}
}
信息导入模块
为了提高电子元器件的管理效率,系统中每次对相关数据的操作都能保存到文件中,以便下次进入系统直接获得相关数据,这一功能由导入函数load()。load()读取data.txt文件中电子元器件的基本信息,将数据存入基本信息链表中,流程图如图6所示。
图6 信息导入模块流程图
信息导入部分代码
//
//读文件数据,并创建链表函数
//
void load()
{
int y=1;
FILE *fp;
char ch;
fp = fopen("data.txt","r");
if(fp==NULL)
{
printf("打开文件错误,按任意返回主菜单\n");
getch();//程序停下来,等待输入
return;
}
while(!feof(fp))
{
ELE *node =(ELE *)malloc(sizeof(ELE));
node->next = NULL;
fscanf(fp,"%s%s%s%d%s%s%lf%s",node->no,node->type,node->model,&node->number,node->encapsulation,node->factory,&node->price,node->date);//从文件中读一行元器件信息
add(node); // 调用函数增加链表结点
}
fclose(fp);
printf("读取成功!\n");
printf("\n");
printf("输入0000返回菜单栏");
scanf("%d",&y);
if(y==0000)
{
N;
menu();
}
else
{
printf("输入错误");
printf("输入0000返回菜单栏");
scanf("%d",&y);
if(y==0000)
{
N;
menu();
}
}
}
保存模块
为了保存电子元器件基本信息,系统设计了保存模块,将新录入或者修改后的信息以文件的方式保存,方便日后查询。保存界面如图7所示,保存模块流程图如图8所示。
图7 保存界面
图8 保存模块流程图
保存部分代码
//将链表中数据写到文件中的函数
void save()
{
int x;
FILE *fp;
ELE *node;
fp = fopen("data.txt","w"); //以写的方式打开文件
node = h->next; //node指针指向链表第一个结点
while(node!=NULL)
{ //"%s %s %s %d\n" 格式符之间有空格
fprintf(fp,"%s %s %s %d %s %s %lf %s\n",node->no,node->type,node->model,node->number,node->encapsulation,node->factory,node->price,node->date);
node = node ->next;
}
fclose(fp);
printf("保存成功");
printf("\n");
printf("输入0000返回菜单栏");
scanf("%d",&x);
if(x==0000)
{
N;
menu();
}
else
{
printf("输入错误");
printf("输入0000返回菜单栏");
scanf("%d",&x);
if(x==0000)
{
N;
menu();
}
}
}
电子元器件信息添加模块
电子元器件信息添加模块在原有信息基础上添加新信息,系统中基本信息链表中器件编号具有唯一性,作为添加信息时的重要依据。基本信息添加界面如图9,流程如图10所示。
图9 基本信息添加界面
图10 基本信息添加模块流程图
信息添加模块代码
/
//增加元器件函数
/
void addELE()
{
ELE *node;
node = (ELE *)malloc(sizeof(ELE));
node->next = NULL;
printf("请输入增添元器件详细信息(编号、类型、型号、数目、封装、厂家、价格、生产日期):\n");
scanf("%s%s%s%d%s%s%lf%s",node->no,node->type,node->model,&node->number,node->encapsulation,node->factory,&node->price,node->date);
add(node);
printf("添加成功!");
N;
menu();
}
删除模块
因为元器件编号具有唯一性,所以在该模块中,元器件编号作为基本索引,当输入要删除的元器件时,先在基本信息链表中查找是否存在该编号,如果存在,则删除该元器件的基本信息。删除界面如图11所示,删除基本信息流程图如图12所示。
图11 删除界面
图12 删除基本信息流程图
删除基本信息代码
//
//删除元器件函数
/
void delELE()
{
char type[40];
char factory[40];
char model[40];
int x,y;
printf("请选择删除依据,1--元器件类型,2--元器件厂家,3--元器件型号\n");
scanf("%d",&x);
if(x==1)
{
printf("请输入元器件类型:\n");
scanf("%s",type);
del(type);
}
else if(x==2)
{
printf("请输入元器件厂家:\n");
scanf("%s",factory);
del(factory);
}
else if(x==3)
{
printf("请输入元器件型号:\n");
scanf("%s",model);
del(model);
}
printf("删除成功!");
printf("\n");
printf("输入0000返回菜单栏");
scanf("%d",&y);
if(y==0000)
{
N;
menu();
}
else
{
printf("输入错误");
printf("输入0000返回菜单栏");
scanf("%d",&y);
if(y==0000)
{
N;
menu();
}
}
}
篇幅有限,未完待续