话不多说,直接上代码,大学生最懂大学生
这是用.h文件对我们的函数定义和结构体定义进行一个汇总
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
#pragma once
//要求使用文件、链表,系统以菜单方式工作。
//某商店每天有进货、售货、统计销售额、计算毛利率、查看商品剩余量等业务。设计一个菜单,实现下述功能
//创建商品档案。每一个商品信息包括编号、品名、进价、售价、进货量、销售量、销售额、剩余数、毛利;考虑商品信息的存储。
//编辑商品信息。例如向商品档案添加新商品,修改商品信息,删除原有商品、处理原有商品的新进货量、新销售量、报废量;
//统计销售情况。在此项中统计每种商品的销售额、剩余数、毛利(毛利 = 销售额 - 进价 * 销售量);
//查询商品信息。如:根据商品名、剩余数(小于5或大于20)进行查询;
//显示商品信息。显示方式有3种:即按原来商品顺序显示、按销售额高到低的顺序显示、按毛利高到低的顺序显示。由于商品较多,所以要求分屏显示。
//退出系统
typedef int DataType;
//编号、品名、进价、售价、进货量、销售量、销售额、剩余数、毛利
typedef struct Good
{
char name[11];
char BianHao[11];
DataType JinJia;
DataType ShouJia;
DataType Input;
DataType OutPut;
DataType Selling;
DataType KuCun;
float Profit;
struct Good* next;
}Good;
void Init(Good** L);
void InPut(Good** L,int n);
//编辑商品信息
void GoodAdd(Good** L);
void GoodChange(Good** L);
void GoodDelete(Good** L);
void GoodNewInput(Good** L, Good* node);
void GoodNewOutput(Good** L,Good*node);
void GoodUseLessness(Good** L);
//统计销售情况
void GoodSelling(Good** L);
void GoodKucun(Good** L);
void GoodProfit(Good** L);
//查询商品信息
Good* NameSearch(Good** L,char* s);
Good* KucunSearch(Good** L,int m,int n);//n为库存
//显示商品信息
void GoodShow(Good** L);
Good* GoodProfitShow(Good** L);
Good* GoodSellingShow(Good** L);
bool GoodIsEmpty(Good** L);
Good* SortList(Good** L);
void ScorePreserve(Good** L);
void ScoreDocfin(Good** L);
下面是主函数部分,也就是菜单部分
#define _CRT_SECURE_NO_WARNINGS 1
#include"shop.h"
//要求使用文件、链表,系统以菜单方式工作。
//某商店每天有进货、售货、统计销售额、计算毛利率、查看商品剩余量等业务。设计一个菜单,实现下述功能
//创建商品档案。每一个商品信息包括编号、品名、进价、售价、进货量、销售量、销售额、剩余数、毛利;考虑商品信息的存储。
//编辑商品信息。例如向商品档案添加新商品,修改商品信息,删除原有商品、处理原有商品的新进货量、新销售量、报废量;
//统计销售情况。在此项中统计每种商品的销售额、剩余数、毛利(毛利 = 销售额 - 进价 * 销售量);
//查询商品信息。如:根据商品名、剩余数(小于5或大于20)进行查询;
//显示商品信息。显示方式有3种:即按原来商品顺序显示、按销售额高到低的顺序显示、按毛利高到低的顺序显示。由于商品较多,所以要求分屏显示。
//退出系统
//printf("请选择操作:1-修改商品价格 2-增加商品库存 3-增加新商品种类 4-显示所有商品信息 5-新建文本文件保存今日库存 6-退出 ");
//printf("请选择操作:1-卖商品 2-查询某种商品信息 3-显示所有商品信息 4-退出 ");
//printf("请选择操作:1-采购商品 2-查询某种商品信息 3-显示所有商品信息 4-退出 ");
//void test1()
//{
// FILE* fp = fopen("score.txt", "w");
// fprintf(fp, "%s", "");
// fclose(fp);
//}
int main()
{
//test1();
Good* head = (Good*)malloc(sizeof(Good));
head->next = NULL;
int m;
do {
printf("请选择你要进行的操作:\n");
printf("-------------------------\n");
printf("------1.创建商品档案-----\n");
printf("------2.编辑商品信息-----\n");
printf("------3.统计销售情况-----\n");
printf("------4.查询商品信息-----\n");
printf("------5.显示商品信息-----\n");
printf("------6.保存商品信息-----\n");
printf("------7.读取文件信息-----\n");
printf("------0.退出菜单---------\n");
printf("-------------------------\n");
scanf("%d", &m);
switch (m)
{
case 1:
{
printf("请输入您要创建的商品档案个数:");
Init(&head);
int n;
scanf("%d", &n);
InPut(&head, n);
break;
}
case 2:
{
if (!GoodIsEmpty(&head))
{
printf("未录入任何商品,请重新选择。\n");
continue;
}
int a;
do
{
printf("请选择你要进行的操作:\n");
printf("-------------------------------\n");
printf("------1.添加新商品-------------\n");
printf("------2.修改商品信息-----------\n");
printf("------3.删除原有商品-----------\n");
printf("------0.退出编辑---------------\n");
printf("-------------------------------\n");
scanf("%d", &a);
switch (a)
{
case 1:
{
GoodAdd(&head);
break;
}
case 2:
{
if (!GoodIsEmpty(&head))
{
printf("未录入任何商品,请重新选择。\n");
continue;
}
GoodChange(&head);
break;
}
case 3:
{
if (!GoodIsEmpty(&head))
{
printf("未录入任何商品,无法删除,请重新选择。\n");
continue;
}
GoodDelete(&head);
break;
}
}
} while (a);
if (a == 0)
{
printf("退出编辑\n");
}
break;
}
case 3:
{
if (!GoodIsEmpty(&head))
{
printf("未录入任何商品,请重新选择。\n");
continue;
}
GoodSelling(&head);
GoodKucun(&head);
GoodProfit(&head);
break;
}
case 4:
{
if (!GoodIsEmpty(&head))
{
printf("未录入任何商品,请重新选择。\n");
continue;
}
int n;
do
{
printf("-------------------------------\n");
printf("请选择你要查询的信息:\n");
printf("------1.根据名字查询------------\n");
printf("------2.根据库存查询------------\n");
printf("------0.退出查询----------------\n");
printf("-------------------------------\n");
scanf("%d", &n);
if (n == 1)
{
printf("请输入您要查询的商品名称:\n");
char s[11];
scanf("%s", s);
Good* node = NameSearch(&head, s);
if (node == NULL)
{
printf("没有对应商品,请重新输入。\n");
continue;
}
printf("-------------------------\n");
printf("-----标号:%s------------\n", node->BianHao);
printf("-----名称:%s------------\n", node->name);
printf("-----进价:%d------------\n", node->JinJia);
printf("-----售价:%d------------\n", node->ShouJia);
printf("-----进货量:%d----------\n", node->Input);
printf("-----销售量:%d----------\n", node->OutPut);
printf("-----销售额:%d----------\n", node->Selling);
printf("-----库存:%d------------\n", node->KuCun);
printf("-----毛利:%f------------\n", node->Profit);
printf("-------------------------\n");
}
else if (n == 2)
{
printf("请输入您要查询的商品库存范围:\n");
int b,d;
scanf("%d %d", &b,&d);
Good* node = KucunSearch(&head, b,d);
GoodShow1(&node);
if (node == NULL)
{
printf("没有对应库存商品,请重新输入。\n");
continue;
}
}
} while (n);
break;
}
case 5:
{
if (!GoodIsEmpty(&head))
{
printf("未录入任何商品,无法显示商品信息,请重新选择。\n");
continue;
}
int r;
do
{
printf("----------------------------------------------\n");
printf("请选择你要显示的顺序:\n");
printf("------1.按照原顺序显示------------------------\n");
printf("------2.按照销售额从高到低的顺序显示----------\n");
printf("------3.按照利润从高到低的顺序显示------------\n");
printf("------0.退出----------------------------------\n");
printf("----------------------------------------------\n");
scanf("%d", &r);
if (r == 1)
GoodShow(&head);
else if (r == 2)
head->next = GoodSellingShow(&head);
else if (r == 3)
head->next = GoodProfitShow(&head);
}
while (r);
break;
}
case 6:
{
GoodPreserve(&head);
break;
}
case 7:
{
GoodDocfin(&head);
break;
}
}
}
while (m);
if (m == 0)
{
printf("退出操作系统\n");
}
//GoodAdd(&head);
//GoodShow(&head);
//GoodChange(&head, '1');
//GoodDelete(&head);
//oodProfitShow(&head);
//GoodShow(&head);
return 0;
}
这里就是我们的各种函数实现部分
我已尽力做到每个函数都非常易懂
最难的部分应该是排序部分用到了归并排序
#define _CRT_SECURE_NO_WARNINGS 1
#include"shop.h"
void Init(Good** L)
{
(*L)->next = NULL;
}
void InPut(Good** L,int n)
{
assert(L);
printf("请输入待录入商品信息\n");
while (n--)
{
Good* newGood = (Good*)malloc(sizeof(Good));
newGood->next = NULL;
printf("-------------------------\n");
printf("输入商品编号:");
scanf("%s", newGood->BianHao);
printf("输入商品名称:");
scanf("%s", newGood->name);
printf("输入商品进价:");
scanf("%d", &newGood->JinJia);
printf("输入商品价格:");
scanf("%d", &newGood->ShouJia);
printf("输入商品进货量:");
scanf("%d", &newGood->Input);
//printf("输入商品库存:");
//scanf("%d", &newGood->KuCun);
printf("-------------------------\n");
newGood->KuCun = newGood->Input;
newGood->OutPut = 0;
newGood->Selling = 0;
newGood->Profit = 0;
if ((*L) == NULL)
{
(*L)->next = newGood;
}
else
{
Good* p = (*L);
while (p->next)
{
p = p->next;
}
p->next = newGood;
}
}
}
//编号、品名、进价、售价、进货量、销售量、销售额、剩余数、毛利
void GoodAdd(Good** L)
{
Good* newGood = (Good*)malloc(sizeof(Good));
newGood->next = NULL;
printf("-------------------------\n");
printf("输入新商品编号:");
scanf("%s", newGood->BianHao);
printf("输入新商品名称:");
scanf("%s", newGood->name);
printf("输入新商品进价:");
scanf("%d", &newGood->JinJia);
printf("输入新商品价格:");
scanf("%d", &newGood->ShouJia);
printf("输入新商品进货量:");
scanf("%d", &newGood->Input);
//printf("输入新商品库存:");
//scanf("%d", &newGood->KuCun);
printf("-------------------------\n");
newGood->KuCun = newGood->Input;
newGood->OutPut = 0;
newGood->Selling = 0;
newGood->Profit = 0;
Good* phead = *L;
Good* ptail = *L;
if (phead == NULL)
{
phead->next = newGood;
}
else
{
while (ptail->next)
{
ptail = ptail->next;
}
ptail->next = newGood;
}
}
//编号、品名、进价、售价、进货量、销售量、销售额、剩余数、毛利
void GoodChange(Good** L)
{
assert(L);
int n;
char s[11];
printf("请输入你要修改的商品名称\n");
scanf("%s", s);
Good* node = NameSearch(L, s);
if (node == NULL)
{
printf("没有对应商品!");
return;
}
//scanf("%d", &n);
do
{
printf("请选择你要修改的对应商品信息\n");
printf("------1:进价--------2:售价----\n");
printf("------3:进货量-----4:销售量---\n");
printf("-----------0:退出--------------\n");
scanf("%d", &n);
if (n == 1)
{
printf("请输入你要修改的新的进价:");
scanf("%d", &node->JinJia);
}
else if (n == 2)
{
printf("请输入你要修改的新的售价:");
scanf("%d", &node->ShouJia);
}
else if (n == 3)
{
GoodNewInput(L, node);
}
else if(n==4)
{
GoodNewOutput(L, node);
}
printf("-------------------------\n");
}
while (n);
printf("退出修改操作");
}
void GoodDelete(Good** L)
{
assert(L);
assert(GoodIsEmpty(L));
char s[11];
printf("请输入你要删除的商品名称:");
scanf("%s", s);
Good* node=NameSearch(L, s);
if (node == NULL)
{
printf("无对应商品");
return;
}
Good* p = (*L);
while (p->next != node)
{
p = p->next;
}
p->next = node->next;
free(node);
node = NULL;
}
void GoodNewInput(Good** L,Good*node)
{
assert(L);
printf("-------------------------\n");
printf("请输入你要修改的新的进货量:");
scanf("%d", &node->Input);
}
void GoodNewOutput(Good** L,Good*node)
{
assert(L);
printf("-------------------------\n");
int prev1 = node->Selling;
int prev2 = node->OutPut;
printf("请输入你要添加的新的销售量:");
int a;
scanf("%d", &a);
if ((a+node->OutPut) > node->Input)
{
printf("库存不足,现有库存为:%d\n", node->KuCun);
return;
}
node->OutPut += a;
node->Selling += node->ShouJia * a;
node->KuCun = node->Input - node->OutPut;
node->Profit += (node->ShouJia - node->JinJia) * a;
}
void GoodUseLessness(Good** L)
{
assert(L);
printf("-------------------------\n");
printf("请输入你要修改报废量的商品名称:");
char s[11];
scanf("%s", s);
Good* node = NameSearch(L, s);
if (node == NULL)
{
printf("没有对应商品!");
return;
}
printf("请输入你要修改的新的报废量:");
int n = 0;
scanf("%d", &n);
if (n > node->KuCun)
{
printf("报废量超过库存\n");
node->KuCun = 0;
return;
}
node->KuCun -= n;
}
//统计销售情况
void GoodSelling(Good** L)
{
assert(L);
Good* p = (*L)->next;
printf("-------------------------\n");
while (p)
{
printf("%s的销售额为:%d\n", p->name,p->Selling);
p = p->next;
}
printf("-------------------------\n");
}
void GoodKucun(Good** L)
{
assert(L);
Good* p = (*L)->next;
printf("-------------------------\n");
while (p)
{
printf("%s的剩余量为:%d\n", p->name, p->KuCun);
p = p->next;
}
printf("-------------------------\n");
}
void GoodProfit(Good** L)
{
assert(L);
Good* p = (*L)->next;
printf("-------------------------\n");
while (p)
{
printf("%s的利润为:%f\n", p->name, p->Profit);
p = p->next;
}
printf("-------------------------\n");
}
//查询商品信息
Good* NameSearch(Good** L, char* s)
{
assert(L);
//assert(!GoodIsEmpty(*L);
Good* p = (*L);
while (p)
{
if (strcmp(s, p->name) == 0)
{
return p;
}
p = p->next;
}
return NULL;
}
Good* KucunSearch(Good** L, int m,int n)//n为库存
{
assert(L);
if (m > n)
{
int tmp = m;
m = n;
n = tmp;
}
Good* p = (*L);
while (p)
{
if (p->KuCun>=m&& p->KuCun<=n)
{
printf("%s的库存为:%d", p->name, p->KuCun);
}
p = p->next;
}
return NULL;
}
//显示商品信息
void GoodShow(Good** L)
{
assert(L);
if ((*L) == NULL)
{
printf("-------------------------\n");
printf("未录入商品信息\n");
printf("-------------------------\n");
}
Good* p = (*L)->next;
while (p)
{
printf("-------------------------\n");
printf("-----标号:%s-------------\n", p->BianHao);
printf("-----名称:%s-------------\n", p->name);
printf("-----进价:%d-------------\n", p->JinJia);
printf("-----售价:%d-------------\n", p->ShouJia);
printf("-----进货量:%d-----------\n", p->Input);
printf("-----销售量:%d-----------\n", p->OutPut);
printf("-----销售额:%d-----------\n", p->Selling);
printf("-----库存:%d-------------\n", p->KuCun);
printf("-----毛利:%f-------------\n", p->Profit);
printf("-------------------------\n");
p = p->next;
}
}
//归并排序
Good* merge(Good*head1,Good*head2)
{
Good* tmpHead = malloc(sizeof(Good));
Good* temp = tmpHead, * temp1 = head1, * temp2 = head2;
while (temp1 != NULL && temp2 != NULL)
{
if (temp1->Profit >= temp2->Profit)
{
temp->next = temp1;
temp1 = temp1->next;
}
else
{
temp->next = temp2;
temp2 = temp2->next;
}
temp = temp->next;
}
if (temp1 == NULL)
{
temp->next = temp2;
}
else if (temp2 == NULL)
{
temp->next = temp1;
}
return tmpHead->next;
}
Good* toSortList(Good* head,Good* tail)
{
if (head == NULL)
{
return head;
}
if (head->next == tail)
{
head->next = NULL;
return head;
}
Good* slow = head, * fast = head;
while (fast != tail)
{
slow = slow->next;
fast = fast->next;
if (fast != tail)
{
fast = fast->next;
}
}
Good* mid = slow;
return merge(toSortList(head, mid), toSortList(mid, tail));
}
Good* SortList(Good** L)
{
return toSortList((*L)->next, NULL);
}
void GoodShow1(Good** L)
{
assert(L);
if ((*L) == NULL)
{
printf("-------------------------\n");
printf("未录入商品信息\n");
printf("-------------------------\n");
}
Good* p = *L;
while (p)
{
printf("-------------------------\n");
printf("-----标号:%s------------\n", p->BianHao);
printf("-----名称:%s------------\n", p->name);
printf("-----进价:%d------------\n", p->JinJia);
printf("-----售价:%d------------\n", p->ShouJia);
printf("-----进货量:%d----------\n", p->Input);
printf("-----销售量:%d----------\n", p->OutPut);
printf("-----销售额:%d----------\n", p->Selling);
printf("-----库存:%d------------\n", p->KuCun);
printf("-----毛利:%f------------\n", p->Profit);
printf("-------------------------\n");
p = p->next;
}
}
Good* GoodProfitShow(Good** L)
{
Good*tmp=SortList(L);
GoodShow1(&tmp);
return tmp;
}
Good* merge1(Good* head1, Good* head2)
{
Good* tmpHead = malloc(sizeof(Good));
Good* temp = tmpHead, * temp1 = head1, * temp2 = head2;
while (temp1 != NULL && temp2 != NULL)
{
if (temp1->Selling >= temp2->Selling)
{
temp->next = temp1;
temp1 = temp1->next;
}
else
{
temp->next = temp2;
temp2 = temp2->next;
}
temp = temp->next;
}
if (temp1 == NULL)
{
temp->next = temp2;
}
else if (temp2 == NULL)
{
temp->next = temp1;
}
return tmpHead->next;
}
Good* toSortList1(Good* head, Good* tail)
{
if (head == NULL)
{
return head;
}
if (head->next == tail)
{
head->next = NULL;
return head;
}
Good* slow = head, * fast = head;
while (fast != tail)
{
slow = slow->next;
fast = fast->next;
if (fast != tail)
{
fast = fast->next;
}
}
Good* mid = slow;
return merge1(toSortList1(head, mid), toSortList1(mid, tail));
}
Good* SortList1(Good** L)
{
return toSortList1((*L)->next, NULL);
}
Good* GoodSellingShow(Good** L)
{
Good* tmp = SortList1(L);
GoodShow1(&tmp);
return tmp;
}
bool GoodIsEmpty(Good** L)
{
assert(L);
return (*L)->next;
}
void GoodPreserve(Good** L)
{
assert(L);
if (!GoodIsEmpty(L))
{
printf("无商品信息信息,请先录入信息。");
return;
}
FILE* fp = fopen("shop.txt", "w");
if (fp == NULL)
{
printf("fopen fail");
return;
}
fprintf(fp, "%s", "");
//fprintf(fp, "标号 名字 进价 售价 进货量 销售量 销售额 库存 利润\n");
Good* p = (*L)->next;
while (p)
{
//fprintf(fp, "%-9s %-9s %-9d %-9d %-14d %-13d %-11d %-8d %-8.2f\n",p->BianHao,p->name,p->JinJia,p->ShouJia,p->Input,p->OutPut,p->Selling,p->KuCun,p->Profit);
fprintf(fp, " %s %s %d %d %d %d %d %d %.2f\n",p->BianHao,p->name,p->JinJia,p->ShouJia,p->Input,p->OutPut,p->Selling,p->KuCun,p->Profit);
p = p->next;
}
fclose(fp);
}
void GoodDocfin(Good** L)
{
assert(L);
FILE* fin = fopen("shop.txt", "r");
if (fgetc(fin) == EOF)
{
printf("文件为空,请先将信息录入文件。");
return;
}
int flag = 1;
//printf("请输入待录入商品信息\n");
Good* newGood = (Good*)malloc(sizeof(Good));
newGood->next = NULL;
while (fscanf(fin, " %s %s %d %d %d %d %d %d %f", newGood->BianHao, newGood->name, &newGood->JinJia, &newGood->ShouJia, &newGood->Input, &newGood->OutPut, &newGood->Selling, &newGood->KuCun, &newGood->Profit) != EOF)
{
//fscanf(fin, "%s %s %d %d %d %d %d %d %f", newGood->BianHao, newGood->name, &newGood->JinJia, &newGood->ShouJia, &newGood->Input, &newGood->OutPut, &newGood->Selling, &newGood->KuCun, &newGood->Profit);
//printf("输入商品库存:");
//scanf("%d", &newGood->KuCun);
printf("-------------------------\n");
if ((*L)->next == NULL)
{
(*L)->next = newGood;
}
else
{
Good* p = (*L);
while (p->next)
{
p = p->next;
}
p->next = newGood;
}
Good* newGood1 = (Good*)malloc(sizeof(Good));
newGood1->next = NULL;
newGood = newGood1;
}
fclose(fin);
}