C语言超市收银系统

来源:互联网 发布:centos7 php nginx 编辑:程序博客网 时间:2024/05/01 16:22

#include<stdio.h>
#include<stdlib.h>//分配函数
#include<string.h>//字符串操作
#include<conio.h>//getch()

 

struct good//商品结构体
{
char  name[20];//商品名称
float  price;//价格
int   n1;//总件数
int   n2;//已卖出
};

 

struct gnode //商品结构体链表
{
struct good  g;
struct gnode *next;
};

 

 

struct gnode *ghead=NULL,*gi=NULL;

 


void initial_g()
{
FILE *fp;
if((fp=fopen("good.text","r"))==NULL)  printf("产商品信息为空!");
else {

fseek(fp,0,SEEK_END);
int i,j;
i=ftell(fp)/sizeof(struct good);
rewind(fp);

for(j=0;j<i;j++)
{
struct gnode *p;
p=(struct gnode *)malloc(sizeof(struct gnode));
p->next=NULL;
fread(&p->g,sizeof(struct good),1,fp);
if(ghead==NULL)ghead=gi=p;
else{ gi->next=p;gi=gi->next; }
}


fclose(fp);

//printf("/n/n/t/t初始化%d个商品信息成功!",i);
}

}

 


void inrank()
{
struct gnode *p=ghead;
if(p==NULL)  printf("商品利润信息为空!");
else {
 printf("/n/n/n/n                 █商品利润信息排名█/n"); 
int n=0;
int i,j;
while(p)
{n++;
p=p->next; }

p=ghead;
struct good *p1;
p1=(struct good *)calloc(n,sizeof(struct good));
for(i=0;i<n;i++)
{*(p1+i)=p->g;
p=p->next;
}


struct good  t;
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
if(p1[j].n2*p1[j].price<p1[j+1].n2*p1[j+1].price)
{  t= p1[j];p1[j]=p1[j+1];  p1[j+1]=t;     }


printf("/n|-----------------------------------------------------------------------------|");
for(j=0;j<n;j++)
{printf("/n[%d]|商品名: %s  利润总金额:%f   单价: %f 总数: %d 已卖数: %d  ",j+1,p1[j].name ,p1[j].n2*p1[j].price,p1[j].price,p1[j].n1,p1[j].n2,p1[j].n2*p1[j].price);
printf("/n|-----------------------------------------------------------------------------|");}

}

printf("/n/n/n/n/n");
}


void sellrank()
{
struct gnode *p=ghead;
if(p==NULL)  printf("商品销售信息为空!");
else {
 printf("/n/n/n/n                    █商品销售排名█/n"); 
int n=0;
int i,j;
while(p)
{n++;
p=p->next; }

p=ghead;
struct good *p1;
p1=(struct good *)calloc(n,sizeof(struct good));
for(i=0;i<n;i++)
{*(p1+i)=p->g;
p=p->next;
}


struct good  t;
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
if(float(p1[j].n2)/p1[j].n1<float(p1[j+1].n2)/p1[j+1].n1)
{  t= p1[j];p1[j]=p1[j+1];  p1[j+1]=t;     }


printf("/n|-----------------------------------------------------------------------------|");
for(j=0;j<n;j++)
{printf("/n[%d]|商品名: %s  销售量:%.1f%%   单价: %f 总数: %d 已卖数: %d  ",j+1,p1[j].name ,float(p1[j].n2)/p1[j].n1*100,p1[j].price,p1[j].n1,p1[j].n2,p1[j].n2*p1[j].price);
printf("/n|-----------------------------------------------------------------------------|");}

}

printf("/n/n/n/n/n");
}

 

void newg()
{
loop1:
struct gnode *p,*p1;

p=(struct gnode *)malloc(sizeof(struct gnode));
 printf("/n/n/n/n                █创建新商品█/n"); 
    loop:
 printf("/n/n请输入商品名/n/n");
    scanf("%s",p->g.name);
    p1=ghead; 
    while(p1)
 {
  if(strcmp(p->g.name,p1->g.name)==0){ printf("/n/n错误,商品名重复!/n"); goto loop;}
     p1=p1->next;
 }
 printf("/n请输入价格/n/n");
 scanf("%f",&p->g.price);
 printf("/n请输入商品总数/n/n");
 scanf("%d",&p->g.n1);
    p->g.n2=0;
   p->next=NULL;
if(ghead==NULL)ghead=gi=p;
else{ gi->next=p;gi=gi->next; }
 printf("/n商品新建成功!/n/n");
 
 printf("/n/n/n|-------------------------|");
printf("/n|您想继续查找商品信息吗? |/n|    是(Y)        否(N)   |");
                             printf("/n|-------------------------|");
char y;
y=getch();
if(y=='Y'||y=='y')  goto  loop1;

}


void saveg()
{


FILE *fp;
if((fp=fopen("good.text","w"))==NULL)  printf("文件打开失败!");

if(ghead==NULL)printf("产商品信息为空!");

else
{
int i=0;

struct gnode *p=ghead;
while(p)
{

fwrite(&p->g,sizeof(struct good),1,fp);
p=p->next;
i++;
 }

//printf("/n/n/t/t保存%d个商品信息成功!",i);


}
fclose(fp);

}

 


void showall()
{  
if(ghead==NULL)printf("产商品信息为空!");
else
{
 printf("/n/n/n/n               █商品价目信息█/n"); 
int i=0;
struct gnode *p=ghead;
printf("/n|--------------------------------------------------------------------------------|");
while(p)
{
if(p->g.n1-p->g.n2>0)
{printf("/n|商品名: %s /t单价: %f    总数: %d  已卖数: %d  剩余数:%d",p->g.name ,p->g.price,p->g.n1,p->g.n2,p->g.n1-p->g.n2);
printf("/n|--------------------------------------------------------------------------------|");}
if(p->g.n1-p->g.n2<=0)
{printf("/n|商品名: %s /t单价: %f /t总数: %d  已卖数: %d  剩余数:%d:/n/n注意,货源为零。请及时进货!",p->g.name ,p->g.price,p->g.n1,p->g.n2,p->g.n1-p->g.n2);
printf("/n|--------------------------------------------------------------------------------|");}

p=p->next;
i++;
 }

printf("/n|商品种类数:%d  /t|",i);        
printf("/n|---------------|/n");

}

}

 

 

 

void lookg()
{  
if(ghead==NULL)printf("产商品信息为空!");
else
{  printf("/n/n/n/n             █查找商品信息█/n"); 
loop:
int y=1;
struct gnode *p=ghead;

printf("/n请输入商品名:  "); 
char n[20]; 
scanf("%s",n);

while(p)
{
 if(strcmp(n,p->g.name)==0)
 {
printf("/n|---------------------------------------------------------------------------------|");
printf("/n|商品名: %s /t单价: %f/t总数: %d /t已卖数: %d /t剩余数:%d",p->g.name ,p->g.price,p->g.n1,p->g.n2,p->g.n1-p->g.n2);
printf("/n|---------------------------------------------------------------------------------|");
     y=0;
 }
p=p->next;

 }
if(y)printf("/n错误,无该商品! "); 

}
printf("/n/n/n|-------------------------|");
printf("/n|您想继续查找商品信息吗? |/n|    是(Y)        否(N)   |");
                             printf("/n|-------------------------|");
char y;
y=getch();
if(y=='Y'||y=='y')  goto  loop;

}

 

void  sellg()
{ printf("/n/n/n/n            █超市收银█/n"); 
int num,y1=0;
float sum=0;
char n[20];
 struct gnode *p;
loop:
p=ghead;
printf("/n商品名称:  "); 
scanf("%s",n);
loop1:
printf("/n购买数量:  "); 
scanf("%d",&num);
while(p)
{
 if(strcmp(n,p->g.name)==0)
 {
  if(num>(p->g.n1-p->g.n2)){printf("/n/n错误,货源不够!/n");goto loop1;}
printf("/n|------------------------------------------------------------------------|");
printf("/n|商品名: %s    单价: %f   购买数量  %d请付款:¥:%f",p->g.name ,p->g.price,num,p->g.price*num);p->g.n2+=num;
printf("/n|------------------------------------------------------------------------|");
    sum+=p->g.price*num;
 y1++;
 }
p=p->next;

 }
 


printf("/n/n/n|-------------------------|");
printf("/n还有购买物品? |/n|    是(Y)        否(N)   |");
                             printf("/n|-------------------------|");
char y;
y=getch();
if(y=='Y'||y=='y')  goto  loop;

printf("/n/n您好!/n/n一共购买%d种商品:一共需付¥%f元/n/n",y1,sum); 

}

 

 

 

 

 


void modifyg()
{  
if(ghead==NULL)printf("产商品信息为空!");
else
{ printf("/n/n/n/n            █修改商信息█/n"); 
loop:
int y=1;
struct gnode *p=ghead;


printf("/n请输入要修改的商品名:  "); 
char n[20];
int n3;
scanf("%s",n);

while(p)
{
 if(strcmp(n,p->g.name)==0)
 {
    printf("/n请修改价格[原价格:%f]/n/n",p->g.price);
 scanf("%f",&p->g.price);
loop1:
 printf("/n请修改商品总数[原总数:%d]/n/n",p->g.n1);
 scanf("%d",&n3);
 if(n3<p->g.n2){printf("/n/n错误,修改后的商品总数必须大于或等于已经卖出商品数!");goto  loop1;}
    p->g.n1=n3;

     y=0;
 }
p=p->next;

 }
if(y)printf("/n错误,无该商品! "); 

}
printf("/n/n/n|-------------------------|");
printf("/n|您想继续修改商品信息吗? |/n|    是(Y)        否(N)   |");
                             printf("/n|-------------------------|");
char y;
y=getch();
if(y=='Y'||y=='y')  goto  loop;

}

 

 


void  deleteg()
{
if(ghead==NULL)printf("产商品信息为空!");
else
{
printf("/n/n/n/n            █删除商信息█/n"); 
loop:
int y=0,y1=1;
struct gnode *p=ghead,*p1=ghead;


printf("/n请输入要删除的商品名:  "); 
char n[20];
int n3;
scanf("%s",n);

while(p)
{

 if(strcmp(n,p->g.name)==0)
 {
if(p==ghead)ghead=ghead->next;
else {p1->next=p->next;
free(p);break;}
    y1=0;
 }
 y++;
     p=p->next;
  if(y>1) p1=p1->next;

 }
if(y1)printf("/n错误,无该商品! "); 

}
printf("/n/n/n|-------------------------|");
printf("/n|您想继续删除商品信息吗? |/n|    是(Y)        否(N)   |");
                             printf("/n|-------------------------|");
char y;
y=getch();
if(y=='Y'||y=='y')  goto  loop;

}

 


void release()
{
ghead=gi=NULL;

}

 

 

 

 

 

 

void show1()

 

printf("/n /n/n/n/n |----------------------------------------|");
printf("/n |       █ 主        菜       单█       |");             
printf("/n |----------------------------------------|");
printf("/n |          A  超   市   收   银          |"); 
printf("/n |----------------------------------------|");
printf("/n |          B  商   品   查   询          |"); 
printf("/n |----------------------------------------|");
printf("/n |          C  数   据   分   析          |");
printf("/n |----------------------------------------|");
printf("/n |          D  管   理   维   护          |");
printf("/n |----------------------------------------|");
printf("/n |          E  清   空   数   据          |");
printf("/n |----------------------------------------|");
printf("/n |          F  退   出   程   序          |");             
printf("/n |----------------------------------------|");
printf("/n |             请您选择一个任务           |");
printf("/n |----------------------------------------|/n/n/n");
}

 

void show2()
{
printf("/n |-----------------------------|");
printf("/n |    █查  询  菜   单█      |");             
printf("/n |-----------------------------|");
printf("/n |  A   查  找  商  品         |"); 
printf("/n |-----------------------------|");
printf("/n |  B   查  询  所  有         |"); 
printf("/n |-----------------------------|"); 
printf("/n |  C   退  出  程  序         |");
printf("/n |-----------------------------|");
printf("/n |      请您选择一个任务       |");
printf("/n |-----------------------------|/n/n/n");
}

void show3()
{
printf("/n |-----------------------------|");
printf("/n |    █分  析  菜   单█      |");             
printf("/n |-----------------------------|");
printf("/n |  A   金  额  排  名         |"); 
printf("/n |-----------------------------|");
printf("/n |  B   销  售  排  名         |"); 
printf("/n |-----------------------------|"); 
printf("/n |  C   退  出  程  序         |");
printf("/n |-----------------------------|");
printf("/n |      请您选择一个任务       |");
printf("/n |-----------------------------|/n/n/n");
}


void show4()
{


printf("/n |-----------------------------|");
printf("/n |    █管  理  菜   单█      |");             
printf("/n |-----------------------------|");
printf("/n |  A   新  建  商  品         |"); 
printf("/n |-----------------------------|");
printf("/n |  B   删  除  商  品         |"); 
printf("/n |-----------------------------|");
printf("/n |  C   修  改  商  品         |"); 
printf("/n |-----------------------------|"); 
printf("/n |  D   退  出  程  序         |");
printf("/n |-----------------------------|");
printf("/n |     请您选择一个任务        |");
printf("/n |-----------------------------|/n/n/n");
}

 

 

 

 

void main()
{

initial_g();
char c1;
do {

 


show1();

c1=getch();

 

switch ( c1 )
{

case 'a':
case 'A':sellg();break;

 


case 'b':
case 'B':
 { char c2;

 do{
  show2();
 
       c2=getch();

switch ( c2 )
 
{case 'a':
case 'A':lookg();break;

case 'b':
case 'B':showall();break;

case 'c':
case 'C':break;

}
 }while(c2!='c'&&c2!='C');
 
 
 }break;
 
 


 
case 'c':
case 'C':
 { char c3;

 do{
  show3();
 
       c3=getch();

switch ( c3 )
 
{case 'a':
case 'A':inrank();break;

case 'b':
case 'B':sellrank();break;

case 'c':
case 'C':break;

}
 }while(c3!='c'&&c3!='C');
 
 
 }break;
  
 

 

 

case 'd':
case 'D':
 {
  char c4;

 do{
  show4();
 
       c4=getch();

switch ( c4)
 
{case 'a':
case 'A':newg();break;

case 'b':
case 'B':deleteg();break;

case 'c':
case 'C':modifyg();break;}

 }while(c4!='D'&&c4!='d');

 }break;
 
 
 


case 'e':
case 'E':
release();break;
 
 

}

 

saveg();

}while(c1!='F'&&c1!='f');

printf("/n/n  ★ 谢谢您的使用!★");

}