花有再开日,人无再少年,今天我们要学的是如何写一个收银台购物系统,学习不息,奋斗不止
要制作一个“系统”,就得先把一个个小功能逐一实现,然后将其整合,我们用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密码对比,即可实现判断。
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");
}
}
}