[C语言] 商品购物收银台系统,统计购买商品总价

花有再开日,人无再少年,今天我们要学的是如何写一个收银台购物系统,学习不息,奋斗不止

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

头函数


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

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

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

商品结构体


struct commodity
{ /*结点类型声明 */
    char name[30]; /*商品名 */
    char num[10]; /*编号 */
    float cost; /*单价 */
    float sell;/*进价*/
    int total;/*库存*/
    struct commodity* next; /*链接指针定义 */
};

添加商品

接下来就是关键的一步,添加我们的商品进入系统中,这里用到链表的写法,链表的使用,相对与数组来说,插入和删除数据更便捷,效率更高,只需要对相关的结点和指针进行修改便可


void add()
{ /*添加新结点 */
    //char sth[100]; /*预设一个储存输入字符串的数组 */
    newnode = (struct commodity*)malloc(sizeof(struct commdity*));    /*申请新结点的存储空间 */
    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;
            }
            else
                break;
        }
    
        printf("\n 成功添加!");
        currnode->next = NULL; /*使新结点成为尾结点 */
    }
     head  =  newnode; // p和plist是指向一段相同地址空间的两个不同指针。
 while (head  != NULL)
 {
    int q;
    q=head->next;
    free(head);
    head=q;
}
newnode = NULL; // 只是释放了其内存空间,指向链表的指针值并没有被置为空
}

密码验证系统

此时写完一个函数,我们写进主函数里,功能是实现了,但没有什么特色呀,系统能被随便打开吗,那当然不行,怎么办呢,我们给它写一个系统的密码验证登录界面,这里我们使用判断语句,用定义的password来保存输入的密码,用if来和系统设定的pw密码对比,即可实现判断。

在这里也可以实现延时登录的小功能,利用Sleep冻结时间,达到读秒的效果,给用户判断时间。这种用法在日后还可以提高用户容错率,避免误操作的行为,可以及时反应取消操作


void checkLogin()   //密码检测登录
{
    int n;
    int PW = 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("----------------------------------------商品销售系统--------------------------------------");
    char ch;
    int flag = 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();

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

删除商品


void Delete() {
    char name[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");
}

修改商品

修改商品就是通过遍历,在链表中查找这个商品,找得到就进行操作,通过修改指针数据来更改每个商品的值,若找不到,那就理所当然的退出修改商品这个操作,并给出提示


void modify()
{
    int t;
    char i[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;
        }
        else
            currnode = currnode->next;/*以下一节点为当前节点*/
    }
    printf("修改成功");

}

排序

在排序这一块我们可以进行两个选择的设置,一个是通过添加商品时的编号进行排序,另一个是更直观的价格排序。


void order()
{
    struct commodity* p, t;
    if (head == NULL)
        printf("暂时无相关信息!\n");
    int n;
    printf("请选择排序方式:\n1.按编号排序\n2.按价格排序");
    scanf("%d", &n);
    currnode = head;
    switch (n)
    {
    case 1:
    {
        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;
    case 2: {
        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);
}

统计


void statistic() {
    int total = 0;
    int totalPrice = 0;
    int totalsell = 0;
    int profit = 0;
    int totalprofit = 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);
}

显示在售商品


void search()

{
    printf("请输入所查商品的信息关键词\n");
    printf("若按商品名查找请按1\n");
    printf("若按编号查找请按2\n");
    printf("若按单价查找请按3\n");
    printf("若按库存查找请按4\n");

    int a;
    printf("从键盘上输入所选编号:");
    scanf("%d", &a);                  //从键盘上输入所选编号 
    
    char name[50];
    float cost = 0;
    int num = 0, total = 0;
    //定义查询信息时的变量 
    
    if (a >= 1 && a <= 4)
    {
        switch (a)                     //根据编号确定所查信息 
        {
        case 1: {printf("请输入:");scanf("%s", &name);break; }
        case 2: {printf("请输入:");scanf("%d", &num);break;}
        case 3: {printf("请输入:");scanf("%f", &cost);break;}
        case 4: {printf("请输入:");scanf("%d", &total);break;}
        }
    }
    else
        printf("所输入的编号错误,请重新输入\n");
    int i = 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"

struct commodity
{ /*结点类型声明 */
    char name[30]; /*商品名 */
    char num[10]; /*编号 */
    float cost; /*单价 */
    float sell;/*进价*/
    int total;/*库存*/
    struct commodity* next; /*链接指针定义 */
};
/*函数声明 */
void add(); 
void search();
void Delete();
void statistic();
void modify();
void order();
void show();
void checkLogin();
int cnt = 0;
int password;

struct commodity* head = NULL, * currnode, * newnode, * prenode;
/*指向结点的指针声明 */




 //主函数 
int main()
{
     checkLogin();
    printf("----------------------------------------商品销售系统--------------------------------------");
    char ch;
    int flag = 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();
    }
}

void add()
{ /*添加新结点 */
    //char sth[100]; /*预设一个储存输入字符串的数组 */
    newnode = (struct commodity*)malloc(sizeof(struct commdity*));    /*申请新结点的存储空间 */
    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;
            }
            else
                break;
        }
    
        printf("\n 成功添加!");
        currnode->next = NULL; /*使新结点成为尾结点 */
    }
     head  =  newnode; // p和plist是指向一段相同地址空间的两个不同指针。
 while (head  != NULL)
 {
    int q;
    q=head->next;
    free(head);
    head=q;
}
newnode = NULL; // 只是释放了其内存空间,指向链表的指针值并没有被置为空
}

//统计商品总量 
void statistic() {
    int total = 0;
    int totalPrice = 0;
    int totalsell = 0;
    int profit = 0;
    int totalprofit = 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);
}



//删除功能 
void Delete() {
    char name[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");
}




//修改功能 
void modify()
{
    int t;
    char i[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;
        }
        else
            currnode = currnode->next;/*以下一节点为当前节点*/
    }
    printf("修改成功");

}


//查找功能
void search()

{
    printf("请输入所查商品的信息关键词\n");
    printf("若按商品名查找请按1\n");
    printf("若按编号查找请按2\n");
    printf("若按单价查找请按3\n");
    printf("若按库存查找请按4\n");

    int a;
    printf("从键盘上输入所选编号:");
    scanf("%d", &a);                  //从键盘上输入所选编号 
    
    char name[50];
    float cost = 0;
    int num = 0, total = 0;
    //定义查询信息时的变量 
    
    if (a >= 1 && a <= 4)
    {
        switch (a)                     //根据编号确定所查信息 
        {
        case 1: {printf("请输入:");scanf("%s", &name);break; }
        case 2: {printf("请输入:");scanf("%d", &num);break;}
        case 3: {printf("请输入:");scanf("%f", &cost);break;}
        case 4: {printf("请输入:");scanf("%d", &total);break;}
        }
    }
    else
        printf("所输入的编号错误,请重新输入\n");
    int i = 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;
    }

}




//排序
void order()
{
    struct commodity* p, t;
    if (head == NULL)
        printf("暂时无相关信息!\n");
    int n;
    printf("请选择排序方式:\n1.按编号排序\n2.按价格排序");
    scanf("%d", &n);
    currnode = head;
    switch (n)
    {
    case 1:
    {
        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;
    case 2: {
        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);
}

void show()//显示商品信息功能 
{
        currnode = head;
    while (currnode != NULL)
    {
    printf("商品名:%s\n 编号:%s \n价格:%f \n数量:%d ", currnode->name, currnode->num, currnode->cost, currnode->total);
        currnode = currnode->next;
    }
}

void checkLogin()   //密码检测登录
{
    int n;
    int PW = 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");
        }
     
    }

} 

  • 14
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小泥人Hyper

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值