用C语言写一个商品购物收银台系统,统计购买商品总价

简介: 要制作一个“系统”,就得先把一个个小功能逐一实现,然后将其整合,我们用C语言只需把它们写成一个个函数即可,直接进入正题,我们列出今天所需的头文件,一共五个。

要制作一个“系统”,就得先把一个个小功能逐一实现,然后将其整合,我们用C语言只需把它们写成一个个函数即可,直接进入正题,我们列出今天所需的头文件,一共五个

头函数

#include "stdio.h"#include "stdlib.h"#include "string.h"#include "conio.h"#include "windows.h"

我们先写主函数,还是那段int main(){ }

接着我们想一下,开店需要什么,肯定是要进货呀,没有商品就没有买卖对吧,那我们进货商品肯定不能买了就算了,得先统计一下我们需要的内容,二话不说先建个结构体,保存多项数据

商品结构体

structcommodity{ /*结点类型声明 */charname[30]; /*商品名 */charnum[10]; /*编号 */floatcost; /*单价 */floatsell;/*进价*/inttotal;/*库存*/structcommodity*next; /*链接指针定义 */};

添加商品

接下来就是关键的一步,添加我们的商品进入系统中,这里用到链表的写法

voidadd()
{ /*添加新结点 *///char sth[100]; /*预设一个储存输入字符串的数组 */newnode= (structcommodity*)malloc(sizeof(structcommdity*));    /*申请新结点的存储空间 */if (head==NULL)
head=newnode; /*原商品为空,新结点就是头结点 */else    { /*原商品不为空 */currnode=head; /*当前结点为头结点 */while (currnode->next!=NULL) /*从当前开始找到尾结点 */currnode=currnode->next;
currnode->next=newnode;
    }
/*将新结点链接到链表尾结点成为新的尾结点 */currnode=newnode; /*指针指向新结点,进行数据输入 */    {
printf("\n 输入商品名:");
scanf("%s", currnode->name);
printf("\n 输入编号:");
scanf("%s", currnode->num);
printf("\n 输入单价:");
scanf("%f", &currnode->cost);
printf("\n 输入进价:");
scanf("%f", &currnode->sell);
while (1)
        {
printf("\n 输入商品库存量:");
scanf("%d", &currnode->total);
if ((currnode->total) <0) { /*判断库存量是否出错 */printf("库存量出错!");
fflush(stdin);
continue;
            }
elsebreak;
        }
printf("\n 成功添加!");
currnode->next=NULL; /*使新结点成为尾结点 */    }
head=newnode; // p和plist是指向一段相同地址空间的两个不同指针。while (head!=NULL)
 {
intq;
q=head->next;
free(head);
head=q;
}
newnode=NULL; // 只是释放了其内存空间,指向链表的指针值并没有被置为空}

密码验证系统

此时写完一个函数,我们写进主函数里,功能是实现了,但没有什么特色呀,系统能被随便打开吗,那当然不行,怎么办呢,我们给它写一个系统的密码验证登录界面

voidcheckLogin()   //密码检测登录{
intn;
intPW=123456;        //密码printf("请输入系统密码:");
for(cnt=0;cnt!=3;)
    {
scanf("%d",&password);
if(password==PW)
        {
n=1;
printf("登录成功,3秒后自动进入系统\n");
Sleep(1000);
printf("登录成功,2秒后自动进入系统\n");
Sleep(1000);
printf("登录成功,1秒后自动进入系统\n");
Sleep(1000);
system("cls");
break;
        }
else        {
cnt++;
while(cnt==3)
        {
printf("系统锁定,无法输入密码,3秒后系统自动关闭\n");
Sleep(2000);
system("cls");
printf("系统锁定,无法输入密码,2秒后系统自动关闭\n");
Sleep(1200);
system("cls");
printf("系统锁定,无法输入密码,1秒后系统自动关闭\n");
Sleep(1200);
system("cls");
exit(0);
        }
printf("密码错误,再次输入密码(你只有三次机会):\n");
        }
    }
}

网络异常,图片无法展示
|

主界面菜单

那登录界面写好了,我们进去一看,哎,里面空荡荡的,得给它加点特色,把我们要设置的界面预制设出来,还能提醒我们还有哪些功能没写

printf("----------------------------------------商品销售系统--------------------------------------");
charch;
intflag=1;
while (flag)
    {
printf("\n--------------------------");
printf("\n[1]添加商品\n[2]查找商品\n[3]删除商品\n[4]修改\n[5]排序\n[6]统计\n[7]显示当前在售商品\n[8]退出\n");
fflush(stdin); /*刷新缓冲区,过滤回车 */printf("-----------------------------------------------------------------------------------------------------\n");
printf("请输入");

网络异常,图片无法展示
|

从图中我们透露给大家一共有八个功能,现在已经实现了一个添加商品,很有意思的是,第八个,有进入系统,那肯定也要能退出才行,不能强买强卖是吧。

同时我们要选择功能,就一定要用到一个循环体,那就是我们的switch—case,设置多个目标函数,输入一个对应的数字,就进入到对应的函数里实现其功能

scanf("%c", &ch);
switch (ch)
        {
case'1':
/*输入1为添加商品*/add();
break;
case'2':
search();
break;
case'3':
Delete();
break;
case'4':
modify();
break;
case'5':
order();
break;
case'6':
statistic();
break;
case'7':
show();
break;
default:
flag=0; /*其他按键结束操作 */        }
getchar();

接下来就是要实现一下删除功能,毕竟一不小心卖断货,这件商品成了绝版,那系统里也没必要存这个商品了,咱把它从系统里清除

删除商品

voidDelete() {
charname[100];
printf("请输入你要删除的商品的名称: ");
scanf("%s", name);
prenode=NULL;
currnode=head; /*当前结点为头结点 */while (currnode!=NULL) {
if (strcmp(name, currnode->name) ==0) {
if (prenode==NULL) {
printf("删除成功!\n");
head=head->next;
return;
            }
else {
prenode->next=currnode->next;
printf("删除成功\n");
return;
            }
        }
    }
printf("不存在!\n");
}

修改商品

voidmodify()
{
intt;
chari[10];
printf("请输入你要修改的商品的编号:\n");
scanf("%s", &i);
currnode=head;  /*以头结点为当前节点*/while (currnode!=NULL)
    {
if (strcmp(currnode->num,i)==0)
        {
printf("商品名:%s\n    编号:%s\n        单价:%f\n    售价:%f\n  \n", currnode->name, currnode->num, currnode->cost,
currnode->sell);
printf("确定要修改吗?确定请输入1,取消请输入0\n");
scanf("%d", &t);
if (t)
            {
printf("\n 输入修改后的商品名:");
scanf("%s", currnode->name);
printf("\n 输入修改后的编号:");
scanf("%s", currnode->num);
printf("\n 输入修改后的单价:");
scanf("%f", &currnode->cost);
printf("\n 输入修改后的进价");
scanf("%f", &currnode->sell);
            }
break;
        }
elsecurrnode=currnode->next;/*以下一节点为当前节点*/    }
printf("修改成功");
}

排序

voidorder()
{
structcommodity*p, t;
if (head==NULL)
printf("暂时无相关信息!\n");
intn;
printf("请选择排序方式:\n1.按编号排序\n2.按价格排序");
scanf("%d", &n);
currnode=head;
switch (n)
    {
case1:
    {
while (currnode->next!=NULL)//将所有商品编号从小到大排序         {
p=currnode->next;
while (p!=NULL)                  //每一个p与currnode比较从中逐个进行排序             {
if (currnode->num>p->num)
                {
t=*currnode;  //交换结构体 *currnode=*p;
*p=t;
t.next=currnode->next; //重新排列链表 currnode->next=p->next;
p->next=t.next;
                }
p=p->next;
            }
currnode=currnode->next;
        }
    }
break;
case2: {
while (currnode->next!=NULL) {   //将所有的价格从小到大排序并且逐个排序 p=currnode->next;
while (p!=NULL)      //每一个p与currnode比较从中逐个进行排序             {
if (currnode->cost>p->cost)
                {
t=*currnode;  //交换结构体 *currnode=*p;
*p=t;
t.next=currnode->next; //重新排列链表 currnode->next=p->next;
p->next=t.next;
                }
p=p->next;
            }
currnode=currnode->next;
        }
    }
break;
    }
printf("排序结果如下:\n");
while (currnode!=NULL)
    {
printf("商品名:%s\n 编号:%s \n    价格:%f 数量:%d ", currnode->name, currnode->num, currnode->cost, currnode->total);
currnode=currnode->next;
    }
printf("商品名:%s\n 编号:%s \n    价格:%f 数量:%d ", currnode->name, currnode->num, currnode->cost, currnode->total);
}

统计

voidstatistic() {
inttotal=0;
inttotalPrice=0;
inttotalsell=0;
intprofit=0;
inttotalprofit=0;
currnode=head; /*当前结点为头结点 */while (currnode!=NULL) {
total+=currnode->total;
totalPrice+=currnode->cost*currnode->total;
totalsell+=currnode->sell*currnode->total;
profit=currnode->cost-currnode->sell;
totalprofit+=profit*currnode->total;
currnode=currnode->next;
    }
printf("商品数量为:%d\n", total);
printf("商品总价为:%d\n", totalPrice);
printf("商品总进价为:%d\n",totalsell);
printf("商品总利润为:%d\n", totalprofit);
}

显示在售商品

voidsearch()
{
printf("请输入所查商品的信息关键词\n");
printf("若按商品名查找请按1\n");
printf("若按编号查找请按2\n");
printf("若按单价查找请按3\n");
printf("若按库存查找请按4\n");
inta;
printf("从键盘上输入所选编号:");
scanf("%d", &a);                  //从键盘上输入所选编号 charname[50];
floatcost=0;
intnum=0, total=0;
//定义查询信息时的变量 if (a>=1&&a<=4)
    {
switch (a)                     //根据编号确定所查信息         {
case1: {printf("请输入:");scanf("%s", &name);break; }
case2: {printf("请输入:");scanf("%d", &num);break;}
case3: {printf("请输入:");scanf("%f", &cost);break;}
case4: {printf("请输入:");scanf("%d", &total);break;}
        }
    }
elseprintf("所输入的编号错误,请重新输入\n");
inti=0;
currnode=head;
while (currnode!=NULL)
    {
if (strcmp(currnode->name, name) ==0||currnode->num||currnode->cost==cost||currnode->total==total)
printf("\n\n\n\n您要寻找的信息如下\n商品名:%s\n 编号:%s \n   价格:%f \n  库存:%d", currnode->name, currnode->num, currnode->cost, currnode->total);
currnode=currnode->next;
    }
}

全部代码

#include "stdio.h"#include "stdlib.h"#include "string.h"#include "conio.h"#include "windows.h"structcommodity{ /*结点类型声明 */charname[30]; /*商品名 */charnum[10]; /*编号 */floatcost; /*单价 */floatsell;/*进价*/inttotal;/*库存*/structcommodity*next; /*链接指针定义 */};
/*函数声明 */voidadd(); 
voidsearch();
voidDelete();
voidstatistic();
voidmodify();
voidorder();
voidshow();
voidcheckLogin();
intcnt=0;
intpassword;
structcommodity*head=NULL, *currnode, *newnode, *prenode;
/*指向结点的指针声明 *///主函数 intmain()
{
checkLogin();
printf("----------------------------------------商品销售系统--------------------------------------");
charch;
intflag=1;
while (flag)
    {
printf("\n--------------------------");
printf("\n[1]添加商品\n[2]查找商品\n[3]删除商品\n[4]修改\n[5]排序\n[6]统计\n[7]显示当前在售商品\n[8]退出\n");
fflush(stdin); /*刷新缓冲区,过滤回车 */printf("-----------------------------------------------------------------------------------------------------\n");
printf("请输入");
scanf("%c", &ch);
switch (ch)
        {
case'1':
/*输入1为添加商品*/add();
break;
case'2':
search();
break;
case'3':
Delete();
break;
case'4':
modify();
break;
case'5':
order();
break;
case'6':
statistic();
break;
case'7':
show();
break;
default:
flag=0; /*其他按键结束操作 */        }
getchar();
    }
}
voidadd()
{ /*添加新结点 *///char sth[100]; /*预设一个储存输入字符串的数组 */newnode= (structcommodity*)malloc(sizeof(structcommdity*));    /*申请新结点的存储空间 */if (head==NULL)
head=newnode; /*原商品为空,新结点就是头结点 */else    { /*原商品不为空 */currnode=head; /*当前结点为头结点 */while (currnode->next!=NULL) /*从当前开始找到尾结点 */currnode=currnode->next;
currnode->next=newnode;
    }
/*将新结点链接到链表尾结点成为新的尾结点 */currnode=newnode; /*指针指向新结点,进行数据输入 */    {
printf("\n 输入商品名:");
scanf("%s", currnode->name);
printf("\n 输入编号:");
scanf("%s", currnode->num);
printf("\n 输入单价:");
scanf("%f", &currnode->cost);
printf("\n 输入进价:");
scanf("%f", &currnode->sell);
while (1)
        {
printf("\n 输入商品库存量:");
scanf("%d", &currnode->total);
if ((currnode->total) <0) { /*判断库存量是否出错 */printf("库存量出错!");
fflush(stdin);
continue;
            }
elsebreak;
        }
printf("\n 成功添加!");
currnode->next=NULL; /*使新结点成为尾结点 */    }
head=newnode; // p和plist是指向一段相同地址空间的两个不同指针。while (head!=NULL)
 {
intq;
q=head->next;
free(head);
head=q;
}
newnode=NULL; // 只是释放了其内存空间,指向链表的指针值并没有被置为空}
//统计商品总量 voidstatistic() {
inttotal=0;
inttotalPrice=0;
inttotalsell=0;
intprofit=0;
inttotalprofit=0;
currnode=head; /*当前结点为头结点 */while (currnode!=NULL) {
total+=currnode->total;
totalPrice+=currnode->cost*currnode->total;
totalsell+=currnode->sell*currnode->total;
profit=currnode->cost-currnode->sell;
totalprofit+=profit*currnode->total;
currnode=currnode->next;
    }
printf("商品数量为:%d\n", total);
printf("商品总价为:%d\n", totalPrice);
printf("商品总进价为:%d\n",totalsell);
printf("商品总利润为:%d\n", totalprofit);
}
//删除功能 voidDelete() {
charname[100];
printf("请输入你要删除的商品的名称: ");
scanf("%s", name);
prenode=NULL;
currnode=head; /*当前结点为头结点 */while (currnode!=NULL) {
if (strcmp(name, currnode->name) ==0) {
if (prenode==NULL) {
printf("删除成功!\n");
head=head->next;
return;
            }
else {
prenode->next=currnode->next;
printf("删除成功\n");
return;
            }
        }
    }
printf("不存在!\n");
}
//修改功能 voidmodify()
{
intt;
chari[10];
printf("请输入你要修改的商品的编号:\n");
scanf("%s", &i);
currnode=head;  /*以头结点为当前节点*/while (currnode!=NULL)
    {
if (strcmp(currnode->num,i)==0)
        {
printf("商品名:%s\n    编号:%s\n        单价:%f\n    售价:%f\n  \n", currnode->name, currnode->num, currnode->cost,
currnode->sell);
printf("确定要修改吗?确定请输入1,取消请输入0\n");
scanf("%d", &t);
if (t)
            {
printf("\n 输入修改后的商品名:");
scanf("%s", currnode->name);
printf("\n 输入修改后的编号:");
scanf("%s", currnode->num);
printf("\n 输入修改后的单价:");
scanf("%f", &currnode->cost);
printf("\n 输入修改后的进价");
scanf("%f", &currnode->sell);
            }
break;
        }
elsecurrnode=currnode->next;/*以下一节点为当前节点*/    }
printf("修改成功");
}
//查找功能voidsearch()
{
printf("请输入所查商品的信息关键词\n");
printf("若按商品名查找请按1\n");
printf("若按编号查找请按2\n");
printf("若按单价查找请按3\n");
printf("若按库存查找请按4\n");
inta;
printf("从键盘上输入所选编号:");
scanf("%d", &a);                  //从键盘上输入所选编号 charname[50];
floatcost=0;
intnum=0, total=0;
//定义查询信息时的变量 if (a>=1&&a<=4)
    {
switch (a)                     //根据编号确定所查信息         {
case1: {printf("请输入:");scanf("%s", &name);break; }
case2: {printf("请输入:");scanf("%d", &num);break;}
case3: {printf("请输入:");scanf("%f", &cost);break;}
case4: {printf("请输入:");scanf("%d", &total);break;}
        }
    }
elseprintf("所输入的编号错误,请重新输入\n");
inti=0;
currnode=head;
while (currnode!=NULL)
    {
if (strcmp(currnode->name, name) ==0||currnode->num||currnode->cost==cost||currnode->total==total)
printf("\n\n\n\n您要寻找的信息如下\n商品名:%s\n 编号:%s \n   价格:%f \n  库存:%d", currnode->name, currnode->num, currnode->cost, currnode->total);
currnode=currnode->next;
    }
}
//排序voidorder()
{
structcommodity*p, t;
if (head==NULL)
printf("暂时无相关信息!\n");
intn;
printf("请选择排序方式:\n1.按编号排序\n2.按价格排序");
scanf("%d", &n);
currnode=head;
switch (n)
    {
case1:
    {
while (currnode->next!=NULL)//将所有商品编号从小到大排序         {
p=currnode->next;
while (p!=NULL)                  //每一个p与currnode比较从中逐个进行排序             {
if (currnode->num>p->num)
                {
t=*currnode;  //交换结构体 *currnode=*p;
*p=t;
t.next=currnode->next; //重新排列链表 currnode->next=p->next;
p->next=t.next;
                }
p=p->next;
            }
currnode=currnode->next;
        }
    }
break;
case2: {
while (currnode->next!=NULL) {   //将所有的价格从小到大排序并且逐个排序 p=currnode->next;
while (p!=NULL)      //每一个p与currnode比较从中逐个进行排序             {
if (currnode->cost>p->cost)
                {
t=*currnode;  //交换结构体 *currnode=*p;
*p=t;
t.next=currnode->next; //重新排列链表 currnode->next=p->next;
p->next=t.next;
                }
p=p->next;
            }
currnode=currnode->next;
        }
    }
break;
    }
printf("排序结果如下:\n");
while (currnode!=NULL)
    {
printf("商品名:%s\n 编号:%s \n    价格:%f 数量:%d ", currnode->name, currnode->num, currnode->cost, currnode->total);
currnode=currnode->next;
    }
printf("商品名:%s\n 编号:%s \n    价格:%f 数量:%d ", currnode->name, currnode->num, currnode->cost, currnode->total);
}
voidshow()//显示商品信息功能 {
currnode=head;
while (currnode!=NULL)
    {
printf("商品名:%s\n 编号:%s \n价格:%f \n数量:%d ", currnode->name, currnode->num, currnode->cost, currnode->total);
currnode=currnode->next;
    }
}
voidcheckLogin()   //密码检测登录{
intn;
intPW=123456;        //密码printf("请输入系统密码:");
for(cnt=0;cnt!=3;)
    {
scanf("%d",&password);
if(password==PW)
        {
n=1;
printf("登录成功,3秒后自动进入系统\n");
Sleep(1000);
printf("登录成功,2秒后自动进入系统\n");
Sleep(1000);
printf("登录成功,1秒后自动进入系统\n");
Sleep(1000);
system("cls");
break;
        }
else        {
cnt++;
while(cnt==3)
        {
printf("系统锁定,无法输入密码,3秒后系统自动关闭\n");
Sleep(2000);
system("cls");
printf("系统锁定,无法输入密码,2秒后系统自动关闭\n");
Sleep(1200);
system("cls");
printf("系统锁定,无法输入密码,1秒后系统自动关闭\n");
Sleep(1200);
system("cls");
exit(0);
        }
printf("密码错误,再次输入密码(你只有三次机会):\n");
        }
    }
}
相关文章
|
1月前
|
存储 SQL 网络协议
C语言C/S架构PACS影像归档和通信系统源码 医院PACS系统源码
医院影像科PACS系统,意为影像归档和通信系统。它是应用在医院影像科室的系统,主要的任务是把日常产生的各种医学影像(包括核磁、CT、超声、各种X光机、各种红外仪、显微仪等设备产生的图像)通过各种接口(模拟、DICOM、网络)以数字化的方式海量保存起来,并在需要的时候在一定授权下能够快速地调回使用。同时,PACS系统还增加了一些辅助诊断管理功能。
51 11
|
1月前
|
监控 网络协议 API
C语言系统编程
C语言系统编程
|
1月前
|
存储 编译器 C语言
初识C语言——详细入门(系统性学习day4)
初识C语言——详细入门(系统性学习day4)
|
1月前
|
C语言
精准统计C语言中的行数
精准统计C语言中的行数
精准统计C语言中的行数
|
24天前
|
C语言
C语言——通讯录系统—基于 VS2022
C语言——通讯录系统—基于 VS2022
|
1天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的C语言在线评测系统的详细设计和实现
基于SpringBoot+Vue+uniapp的C语言在线评测系统的详细设计和实现
29 16
|
9天前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的C语言在线评测系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的C语言在线评测系统附带文章和源代码部署视频讲解等
7 0
|
22天前
|
人工智能 物联网 数据处理
C语言在嵌入式系统中的应用
该文探讨了C语言在嵌入式系统中的应用,强调其优势,如可移植性、高效性、灵活性及社区支持,并列举了在RTOS开发、驱动程序、通信协议实现和简单GUI开发中的应用场景。文中通过LED闪烁程序示例展示了C语言如何控制硬件。结论指出,C语言在嵌入式系统中扮演重要角色,随着技术发展,开发者需不断学习以适应新需求。
|
23天前
|
C语言
C语言期末习题之统计大写字母,数字和其他字符的个数
C语言期末习题之统计大写字母,数字和其他字符的个数
21 0
|
1月前
|
C语言 C++
C语言利用ASCII码表统计字符串每个字符出现的次数
C语言利用ASCII码表统计字符串每个字符出现的次数
21 0