用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月前
|
存储 安全 数据管理
C语言之考勤模拟系统平台(千行代码)
C语言之考勤模拟系统平台(千行代码)
51 4
|
1月前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别
pymalloc 和系统的 malloc 有什么区别
|
15天前
|
IDE 编译器 开发工具
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
在本文中,我们系统地讲解了常见的 `#pragma` 指令,包括其基本用法、编译器支持情况、示例代码以及与传统方法的对比。`#pragma` 指令是一个强大的工具,可以帮助开发者精细控制编译器的行为,优化代码性能,避免错误,并确保跨平台兼容性。然而,使用这些指令时需要特别注意编译器的支持情况,因为并非所有的 `#pragma` 指令都能在所有编译器中得到支持。
92 41
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
|
10天前
|
存储 编译器 C语言
【C语言】C语言的变量和声明系统性讲解
在C语言中,声明和定义是两个关键概念,分别用于告知编译器变量或函数的存在(声明)和实际创建及分配内存(定义)。声明可以多次出现,而定义只能有一次。声明通常位于头文件中,定义则在源文件中。通过合理组织头文件和源文件,可以提高代码的模块化和可维护性。示例包括全局变量、局部变量、函数、结构体、联合体、数组、字符串、枚举和指针的声明与定义。
40 12
|
21天前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
39 1
|
21天前
|
人工智能 安全 算法
基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。
本文深入探讨了基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。C语言因其高效、可移植、灵活及成熟度高等特点,在嵌入式系统开发中占据重要地位。文章还介绍了从系统需求分析到部署维护的完整开发流程,以及中断处理、内存管理等关键技术,并展望了嵌入式系统在物联网和人工智能领域的未来发展。
44 1
|
1月前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别?
pymalloc 和系统的 malloc 有什么区别?
|
2月前
|
存储 编译器 C语言
【C语言】学生管理系统:完整模拟与实现(一)
【C语言】学生管理系统:完整模拟与实现
|
2月前
|
存储 C语言
手把手教你用C语言实现通讯录管理系统
手把手教你用C语言实现通讯录管理系统
|
2月前
|
测试技术 C语言
【C语言】学生管理系统:完整模拟与实现(三)
【C语言】学生管理系统:完整模拟与实现