C语言用链表实现电脑配件管理系统
第一次发表Blog,有些问题处理的不是很好,望体谅,同学们可以在评论区询问我相关的问题并指出我的不足。
本人在某偏远地区末流985大学(就是这样:自己的学校只允许自己人喷)软件工程专业学习,大一第一个学期学习了C语言,第二个学期前两个月要求编写C语言完整的管理系统,这个管理系统主要由我和我的一个队友用<CodeBlocks17.02>完成。(第一次编写完整的C语言程序,题目要求接近完成,但我自己对这个系统还有很多不满意的地方,关注我Blog,我以后会只用C语言对此系统一直修改完善,强迫症,莫得办法。。)
发一下大体要求:(具体要求未征询出题老师同意,不方便透露)
补充:
1.我们设定批发时,规定数量50,规定额度5000,如果超过就会出现赠品。
2.在统计金额时,默认初始资金为5,000,000。
遇到的问题有很多,大部分都尝试解决了。下面分享一下编写电脑配件管理系统的要注意的地方与我们的代码,希望对同学们有帮助。
1.(重点)首先一定要仔细读题,理解题目。把题目中的每一个要求都读懂,不要和我们一样,在编程中期时发现我们写的函数有些与题目中的要求不一样,才修改,而且因为程序是一个整体,所以大改会有些麻烦。但是,即使我们又理解了一遍题意,仍然有些地方没有处理好。例如:按照(4)中要求题目中暗示要将配件按照大小型分类,但我们完全没有考虑到这个问题。
2.(重点)一定要先写好主函数,然后在编写每一个分函数,思路要清晰。我发一下我写的主函数,大家可以借鉴一下。
//主函数
int main(int argc, char *argv[]){
system("color F5");//背景颜色
SetConsoleTitle("计算机配件管理系统");//标题
login();//登入函数
while(1)//无限循环
{
switch(menu())//选择函数
{
case 0:
system("CLS");
rewrite();//密码修改函数
break;
case 1:
system("CLS");
gotoxy(55,1);//光标移动函数
printf("*------------------------------计算机配件信息添加-----------------------------*");
add();//添加函数
break;
case 2:
system("CLS");
money();//可以实时改变的统计金额函数
gotoxy(55,6);
printf("*------------------------------计算机配件信息修改-----------------------------*");
revise();//修改函数
break;
case 3:
system("CLS");
gotoxy(55,6);
printf("*------------------------------计算机配件信息删除-----------------------------*");
Delete();//删除函数
break;
case 4:
system("CLS");
money();
gotoxy(55,6);
printf("*-------------------------按照顺序排序生成目前库存报表-----------------------*");
queryone();//库存函数
break;
case 5:
system("CLS");
money();
gotoxy(55,6);
printf("*-------------------------按照时间排序成目前库存报表-----------------------*");
querytwo();//按照时间排序
break;
case 6:
system("CLS");
money();
gotoxy(55,6);
printf("*-------------------------计算机配件信息查询(顺序排序)-----------------------*");
choice();//查询函数
break;
case 7:
system("CLS");
money();
gotoxy(55,2);
printf("*------------------------------计算机配件统计赠品-----------------------------*");
statisticsfour();//统计赠品函数
break;
case 8:
system("CLS");
money();
gotoxy(55,1);
printf("*---------------------------计算机配件进货时间查询----------------------------*");
timequery();//时间查询函数
break;
case 9:
system("CLS");
end();//结束函数
break;
}
}
return 0;
}
3.程序中出现名称的地方尽量用英语来表示,用汉语拼音来表示感觉有点难受(个人观点)。(我们写到大概三分之一时,发现了这个问题,改的时候也比较麻烦)
4.一定要写注释,有的同学为了省事,注释写的很少,这会影响程序的可读性,而且以后自己想要修改也会有些麻烦。我们也做的不好,前期写的还挺多,后期也懒得写了。(但我会在我的博客上慢慢增加的)
完整代码
(分函数按照在主函数中出现的顺序排列)
下面分享一下我们写的完整代码与运行过程图片,再之后会在之后我的Blog中对我感觉重要的函数进行讲解。(按照具体要求,我们不需要在程序中创建文本文件,所以要求我们提前在外部C语言程序所在文件中创建好txt文件,而且要在不同的txt文件中按照规定的格式(在写入文件函数中寻找)输入至少一条信息,当然,这些样本文件我也会上传到我的Blog上【估计两三天以后就会审核通过】,如果大家想直接运行程序,可以先下载并将其移动其到正确位置即可运行)
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#include<ctype.h>
#include<time.h>
#include <stdbool.h>
//密码
char passport[99]="123456";//初始密码为123456
//时间结构体
struct time{
char month[20];
char day[20];
char hour[20];
char minute[20];
};
//配件结构体
struct buygoods{
struct time in;
char name[20];
char type[20];
char creat[20];//制造商
char unitprice[20];//单价
char amount[20];
char totalprice[20];//总价
char supplier[20];
struct buygoods*next;
};
//配件+赠品结构体
struct giftgoods{
struct time in;
char name[20];
char type[20];
char creat[20];//制造商
char unitprice[20];//单价
char amount[20];
char totalprice[20];//总价
char supplier[20];//供货商
char present[20];//赠品
struct giftgoods*next;
};
void login();//登入函数
bool is_pass();//密码函数
int menu();//菜单函数
void money();//统计营业额、盈利额
void gotoxy();//光标移动函数
void add();//添加函数
void Time(char*,char*,char*,char*);//时间函数
void jd(char*);//时间完善函数
void jd1(char*);//检验回车函数
int judge(char*);//检验字符函数
void surplus(char*,char*,char*,char*,char*,char*);//剩余输入
void rewrite();//修改密码
int deal(struct buygoods *,int*);//库存检验函数
void writefileone(struct buygoods*h);//写入进货记录文件函数
void writefiletwo(struct buygoods*h);//写入批发销售文件函数
void writefilethree(struct buygoods*h);//写入零售销售入文件函数
void writefilefour(struct giftgoods*h);//写入批发赠品函数
struct buygoods*readfileone();//读入进货记录函数
struct buygoods*readfiletwo();//读批发销售入函数
struct buygoods*readfilethree();//读入零售销售函数
struct giftgoods*readfilefour();//读入批发赠品函数
void revise();//修改函数
void Delete();//删除函数
void queryone();//按照顺序排序生成目前的库存报表
void statisticsone();//统计进货记录函数
void statisticstwo();//统计批发销售货物函数
void statisticsthree();//统计零售销售函数
void statisticsfour();//统计批发赠品函数
void querytwo();//按照时间排序生成目前的库存报表
void choice();//查询函数
int menutwo();//选择录入菜单
void choiceone();//排序配件函数
void choicetwo();//排序供货商函数
void choicethree();//排序客户历史采购信息函数
void timequery();//按照时间查询函数
void end();//结束界面
//主函数
int main(int argc, char *argv[]){
system("color F5");
SetConsoleTitle("计算机配件管理系统");
login();
while(1)
{
switch(menu())
{
case 0:
system("CLS");
rewrite();
break;
case 1:
system("CLS");
gotoxy(55,1);
printf("*------------------------------计算机配件信息添加-----------------------------*");
add();
break;
case 2:
system("CLS");
money();
gotoxy(55,6);
printf("*------------------------------计算机配件信息修改-----------------------------*");
revise();
break;
case 3:
system("CLS");
gotoxy(55,6);
printf("*------------------------------计算机配件信息删除-----------------------------*");
Delete();
break;
case 4:
system("CLS");
money();
gotoxy(55,6);
printf("*-------------------------按照顺序排序生成目前库存报表-----------------------*");
queryone();
break;
case 5:
system("CLS");
money();
gotoxy(55,6);
printf("*-------------------------按照时间排序成目前库存报表-----------------------*");
querytwo();
break;
case 6:
system("CLS");
money();
gotoxy(55,6);
printf("*-------------------------计算机配件信息查询(顺序排序)-----------------------*");
choice();
break;
case 7:
system("CLS");
money();
gotoxy(55,2);
printf("*------------------------------计算机配件统计赠品-----------------------------*");
statisticsfour();
break;
case 8:
system("CLS");
money();
gotoxy(55,1);
printf("*---------------------------计算机配件进货时间查询----------------------------*");
timequery();
break;
case 9:
system("CLS");
end();
break;
}
}
return 0;
}
//登入函数
void login(){
gotoxy(60,14);
puts("---------------------------------------------------------------");
gotoxy(60,18);
puts("------------欢 迎 来 到 计 算 机 配 件 管 理 系 统-------------");
gotoxy(60,22);
puts("---------------------------------------------------------------");
gotoxy(60,24);
puts("---------------------请按任意键继续!--------------------------");
gotoxy(85,28);
getch();
system("cls");
char pas[99999];
int i;
i=5;
int length,length1;
while(i>0)
{
gotoxy(60,15);
puts("-----------------------------------------------------------------------");
gotoxy(60,18);
printf("--------------请输入密码:(密码为6位,错误次数还剩%i次)----------------\n",i);
gotoxy(60,21);
puts("-----------------------------------------------------------------------");
gotoxy(85,24);
int q=0;
while((pas[q]=getch())!='\r')
{
if(pas[q]=='\b')
{
printf("\b \b");
q--;
}
else
{
printf("*");
q++;
}
}
pas[q]='\0';
length=strlen(pas);
length1=strlen(passport);
if(is_pass(pas)&&length==length1)
{
break;
}
else
{
gotoxy(82,28);
puts("密码错误,请重新输入");
gotoxy(82,31);
puts("请按任意键继续!");
gotoxy(82,33);
getch();
i--;
if(i>0)
system("cls");
continue;
}
}
if(i==0)
{
system("cls");
gotoxy(60,15);
puts("------------------------------------------------------------------------");
gotoxy(60,19);
puts("--------------您输入密码错误次数已达5次,无法使用该程序!---------------");
gotoxy(60,23);
puts("-------------------------------------------------------------------------");
exit(0);
}
}
//密码函数
bool is_pass(char *ch){
int i;
for(i=0; i<6; i++)
{
if(passport[i]!=*(ch+i))
return 0;
}
return 1;
}
//菜单函数
int menu(){
char n;
do
{
system("cls");
gotoxy(55,6);
printf("*------------------------------计算机配件管理系统-----------------------------*");
gotoxy(55,10);
printf("\t\t\t|-------------------------------------------------|\n");
gotoxy(55,11);
printf("\t\t\t| |\n");
gotoxy(55,12);
printf("\t\t\t| *欢迎使用 |\n");
gotoxy(55,13);
printf("\t\t\t| |\n");
gotoxy(50,14);
printf("\t\t\t|-------------------------------------------------|\n");
gotoxy(55,15);
printf("\t\t\t| |\n");
gotoxy(50,16);
printf("\t\t\t| 0.修改密码 |\n");
gotoxy(55,17);
printf("\t\t\t| |\n");
gotoxy(50,18);
printf("\t\t\t| 1.添加信息 |\n");
gotoxy(55,19);
printf("\t\t\t| |\n");
gotoxy(50,20);
printf("\t\t\t| 2.修改信息 |\n");
gotoxy(55,21);
printf("\t\t\t| |\n");
gotoxy(50,22);
printf("\t\t\t| 3.删除信息 |\n");
gotoxy(55,23);
printf("\t\t\t| |\n");
gotoxy(50,24);
printf("\t\t\t| 4.按照顺序排序生成交易信息报表 |\n");
gotoxy(55,25);
printf("\t\t\t| |\n");
gotoxy(50,26);
printf("\t\t\t| 5.按照时间排序生成交易信息报表 |\n");
gotoxy(55,27);
printf("\t\t\t| |\n");
gotoxy(50,28);
printf("\t\t\t| 6.查询(按照顺序排序) |\n");
gotoxy(55,29);
printf("\t\t\t| |\n");
gotoxy(50,30);
printf("\t\t\t| 7.统计赠品信息 |\n");
gotoxy(55,31);
printf("\t\t\t| |\n");
gotoxy(50,32);
printf("\t\t\t| 8.打印某段时间范围内的交易信息 |\n");
gotoxy(55,33);
printf("\t\t\t| |\n");
gotoxy(50,34);
printf("\t\t\t| 9.退出 |\n");
gotoxy(55,35);
printf("\t\t\t| |\n");
gotoxy(50,36);
printf("\t\t\t|-------------------------------------------------|\n");
gotoxy(35,38);
printf("\t\t\t 请选择0-9:");
n=getch();
}while(n<'0'||n>'9');
return (n-48);
}
//统计营业额、盈利额
void money(){
struct buygoods*h,*p;
float businessvolume=0,purchasevolume=0,salesvolume=0,i;
h=readfiletwo();
for(p=h;p->next!=NULL;p=p->next)
{
i=atof(p->totalprice);
businessvolume+=i;
}
h=readfilethree();
for(p=h;p->next!=NULL;p=p->next)
{
i=atof(p->totalprice);
businessvolume+=i;
}
gotoxy(130,40);
printf("%10s","营业额(销售总额)");
gotoxy(130,41);
printf("----------------------------------");
gotoxy(130,42);
printf("%10f",businessvolume);
h=readfileone();
for(p=h;p->next!=NULL;p=p->next)
{
i=atof(p->totalprice);
purchasevolume+=i;
}
salesvolume=businessvolume-purchasevolume;
gotoxy(130,43);
printf("%10s\n","盈利额(销售额-进货额)");
gotoxy(130,44);
printf("----------------------------------");
gotoxy(130,45);
printf("%10f",salesvolume);
gotoxy(130,46);
printf("%10s\n","流动资金");
gotoxy(130,47);
printf("----------------------------------");
gotoxy(130,48);
printf("%10f",5000000+salesvolume);
gotoxy(0,0);
}
//光标移动函数
void gotoxy(int x,int y){
COORD pos= {x,y}; //一个坐标结构体,代表窗口的点阵
HANDLE hOutput;
/*将调用的参数读入结构体,编译得到窗口上一个具体的坐标*/
hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput,pos);
/*句柄操作,实现对光标的移动*/
}
//时间完善函数
void jd(char *a){
int length;
char y[3];
length=strlen(a);
if(length==0)
{
strcpy(a,"未知");
}
if(length==1)
{
y[0]='0';
y[1]=a[0];
strcpy(a,y);
}
}
//检验字符函数
void jd1(char *a){
int length;
length=strlen(a);
if(length==0)
{
strcpy(a,"未知");
}
}
//添加函数
void add(){
gotoxy(55,1);
printf("*------------------------------计算机配件信息添加-----------------------------*");
money();
int kucun;
int kuc[16],kn;
FILE *fk;
if((fk=fopen("计算机配件库存数量信息.txt","r"))==NULL)
{
printf("\t\t文件出错,按任意键退出!");
getch();
exit(1);
}
for(kn=0;kn<16;kn++)
{
fscanf(fk,"%8d",&kuc[kn]);
}
fclose(fk);
struct buygoods *h,*t;
char a;
int l1,l2,l3,l4;
printf("\n\n");
gotoxy(0,4);
printf("\t\t_____________________________________\n");
gotoxy(0,5);
printf("\t\t| |\n");
gotoxy(0,6);
printf("\t\t| *输入1添加进货记录 |\n");
gotoxy(0,7);
printf("\t\t| *输入2添加批发销售 |\n");
gotoxy(0,8);
printf("\t\t| *输入3添加零售销售 |\n");
gotoxy(0,9);
printf("\t\t|______________按0返回_______________|\n");
gotoxy(200,4);
printf("\n\t\t |--------------------------------------当前库存--------------------------------------------------------------------------|\n");
gotoxy(200,5);
printf("\n\t\t | A.A型 %8d个 A.A型 %8d个 A.A型 %8d个 A.A型 %8d个 |\n",kuc[0],kuc[4],kuc[8],kuc[12]);
gotoxy(200,6);
printf("\n\t\t | 1.键盘 B.B型 %8d个 2.鼠标 B.B型 %8d个 3.显卡 B.B型 %8d个 4.移动硬盘 B.B型 %8d个 |\n",kuc[1],kuc[5],kuc[9],kuc[13]);
gotoxy(200,7);
printf("\n\t\t | C.C型 %8d个 C.C型 %8d个 C.C型 %8d个 C.C型 %8d个 |\n",kuc[2],kuc[6],kuc[10],kuc[14]);
gotoxy(200,8);
printf("\n\t\t | D.D型 %8d个 D.D型 %8d个 D.D型 %8d个 D.D型 %8d个 |\n",kuc[3],kuc[7],kuc[11],kuc[15]);
gotoxy(200,9);
printf("\n\t\t |-----------------------------------------------------------------------------------------------------------------------|\n");
gotoxy(200,10);
printf("\n\t\t|--------您所需要添加的信息------|");
gotoxy(200,11);
printf("\n\t\t| (输入)时间:月 日 时 分 |");
gotoxy(200,12);
printf("\n\t\t| (选择)配件种类 |");
gotoxy(200,13);
printf("\n\t\t| (选择)配件型号 |");
gotoxy(200,14);
printf("\n\t\t| (选择)配件数量 |");
gotoxy(200,15);
printf("\n\t\t| (输入)供货商/客户信息 |");
gotoxy(200,16);
printf("\n\t\t|--------------------------------|\n");
while(a!='1'&&a!='2'&&a!='3'&&a!='0')
{
a=getch();
}
if(a=='0')
{
return;
}
if(a=='1')
{
h=readfileone();
printf("\n添加进货记录:");
}
else if(a=='2')
{
h=readfiletwo();
printf("\n添加批发记录:");
}
else if(a=='3')
{
h=readfilethree();
printf("\n添加零售记录:\n");
}
printf("\n\t\t_____________________________________________________\n");
printf("\t\t|________________添加配件信息_______________________|\n");
printf("\t\t|___________________________________________________|\n");
printf("\n\t*注意事项:若您不知道所让输入的信息,直接按回车键跳过(月、日输入0会默认为未知时间)!\n");
t=(struct buygoods*)malloc(sizeof(struct buygoods));
Time(t->in.month,t->in.day,t->in.hour,t->in.minute);
surplus(t->name,t->type,t->creat,t->unitprice,t->amount,t->totalprice);
float i=atof(t->totalprice);
if(i-10000000>0)
{
printf("\n\t\t超过最高额度,无法录入,按任意键直接返回!");
getch();
return;
}
printf("\n");
int lengthc,n,n1;
int flag=0;
if(a=='1')
{
printf("\n\t\t*请输入供货商:"); gets(t->supplier); jd1(t->supplier);
lengthc=strlen(t->supplier); n1=lengthc;
while(flag==0)
{
flag=1;
for(n=0;n<lengthc;n++)
{
if(t->supplier[n]==' ')
{
n1--;
flag=0;
break;
}
}
if(n1!=lengthc)
{
printf("\n\t\t*输入不合理,请重新输入(不能包含空格)");
printf("\n\n\t\t*请输入供货商:"); gets(t->supplier);jd1(t->supplier);
lengthc=strlen(t->supplier);n1=lengthc;
}
}
if(strcmp(t->name,"键盘")==0&&strcmp(t->type,"A型")==0) kuc[0]+=atoi(t->amount);
else if(strcmp(t->name,"键盘")==0&&strcmp(t->type,"B型")==0) kuc[1]+=atoi(t->amount);
else if(strcmp(t->name,"键盘")==0&&strcmp(t->type,"C型")==0) kuc[2]+=atoi(t->amount);
else if(strcmp(t->name,"键盘")==0&&strcmp(t-&