药店的药品销售统计系统详解加源代码
1、作为一名徘徊在课设边缘不能自拔的编程学习者,思路很关键,因为编程思想并不是一朝一夕就能培养出来的,所以临阵磨枪,思路优先
要达到排序的目的,首先要建立排序对象,要建立一个对象,就要确定他的数据元素结构以及存储方式,所以在看到题目后,大家应该有形如下图一样清晰的编程思路,先做什么,再做什么。

2、头文件应该懂得可以跳过本步

3、一,建立第一个结构体,应包含数据元素的各种数据项,比如,编号,销售额,销售量一类数据项,小编做了这样几个数据项。

4、建立第二个结构体,第二个结构体是为了确定存储结构,小编采用了顺序表,你也可以采用其他的方法。

5、初始化结构体,一般是数字的话呢直接复制就可以,如果是字符串的话呢,就要用到strcpy函数,自己拟定几个数据项一一赋值就可以了,一般我们会用一个函数吧他包裹起来,主函数直接调用,显得规范一些,当然了直接在主函数里赋值也是ok的。
void SetData(SequenList &S)
{
strcpy(S.r[1].num, "A001");
strcpy(S.r[10].name,"脑白金");
S.r[1].price = 9.8;
S.r[1].count = 1056;
S.r[1].sale = S.r[1].price*(double)S.r[1].count;
}
这是第一个,同样输入,一般输入5,6个就够调试了
6、做一个输出函数
一般用for循环就ok了很简单的
\t是空格的意思

7、int Partition(SequenList &L,int low,int high)//快排法,关键字为count
{
L.r[0] = L.r[low];//设r[0]为哨兵,储存第一个关键字,low和high指向表的两头
int pivotkey = L.r[low].count;//用pivotkey存储第一个关键字
DataType q;
while (low<high)//当头和尾还没有相遇时
{
while (low < high&&L.r[high].count >= pivotkey)//当头尾未相遇且表尾所指元素大于等于表头时
--high;// 尾指针前移
q = L.r[low];//保存第一个元素
L.r[low] = L.r[high];//用表尾元素覆盖表头
L.r[high] = q;//将预先保存的表头赋值给表尾
while (low < high&&L.r[low].count <= pivotkey)//当表头表尾未相遇且表尾所指元素大于等于表头时
++low;//表头后移
q = L.r[low];//保存第一个元素
L.r[low] = L.r[high];//用表尾元素覆盖表头
L.r[high] = q;//将预先保存的表头赋值给表尾
}
cout << endl;
return low;//返回表头指针
}
void QSort(SequenList &L, int low, int high)
{
int pivotloc;
if (low < high)
{
pivotloc = Partition(L, low, high);
QSort(L, low, pivotloc - 1);
QSort(L, pivotloc + 1, high);
}
}
8、void PopSort(SequenList &L)//冒泡排序法
{
DataType q;
for (int i = 1; i <= L.length; ++i)//退位继续排序
{
for (int j = 1; j <= L.length-1; ++j)//j位和他的下一位做比较,所以length-1
{
if (L.r[j].price>L.r[j + 1].price)
{
q = L.r[j];
L.r[j] = L.r[j + 1];//两者换位
L.r[j + 1] = q;
}
}
}
}
9、void HeapAdjust(SequenList &H,int s,int m)//堆排序
{
DataType rc = H.r[s];
for (int j = 2 * s-1; j < m; j *= 2)
{
if (j < m&&H.r[j].sale<H.r[j + 1].sale)
++j;
if (rc.sale > H.r[j].sale)
break;
H.r[s] = H.r[j];
s = j;
}
H.r[s] = rc;
}
void HeapSort(SequenList &H)//堆排序
{
int i;
DataType q;
for (i = H.length / 2; i > 0; --i)
HeapAdjust(H, i, H.length);
for (i = H.length; i >1; --i)
{
q = H.r[1];
H.r[1] = H.r[i];
H.r[i] = q;
HeapAdjust(H, 1, i - 1);
}
}
10、void Distribute(DataType *r, int i, int *f, int *e)
{
int j, p;
for (j = 0; j <= 26; j++)
f[j] = 0;
for (p = r[0].next; p; p = r[p].next)
{
if (i>0)
{
j = r[p].num[i] - '0';
if (!f[j])
f[j] = p;
else r[e[j]].next = p;
e[j] = p;
}
else
{
j = r[p].num[i] - 'A';
if (!f[j])
f[j] = p;
else r[e[j]].next = p;
e[j] = p;
}
}
}
void Collect(DataType *r, int i, int *f, int *e)
{
int j, t;
for (j = 0; !f[j]; j++);
r[0].next = f[j];
t = e[j];
while (j<26)
{
for (j = j + 1; j<25 && !f[j]; ++j);
if (f[j])
{
r[t].next = f[j];
t = e[j];
}
}
r[t].next = 0;
}
void RadixSort(SequenList &L)//基排序
{
int f[27], e[26];
int i;
for (i = 0; i<=L.length ; i++)
L.r[i].next = i + 1;
L.r[L.length].next = 0;
for (i = 3; i >= 0; i--)
{
Distribute(L.r, i, f, e);
Collect(L.r, i, f, e);
}
}
11、主函数
int _tmain(int argc, _TCHAR* argv[])
{
SequenList L;
SetData(L);
int choice,radix=0;
for (;;)
{
cout<<"************欢迎进入药品销售管理系统************"<<endl;
cout<<"菜单:"<<endl;
cout << "\t\t1--展示药品排序情况\n\t\t2--对销售量排序\n\t\t3--对药品单价排序\n\t\t4--对商品销售额排序\n\t\t5--对药品编号排序\n请输入您的选择:";
cin >> choice;
switch (choice)
{
case 1:
{
Show(L,radix);
break;
}
case 2:
{
radix = 0;
QSort(L, 1, L.length );//快排
break;
}
case 3:
{
radix = 0;
PopSort(L);//冒泡
break;
}
case 4:
{
radix = 0;
HeapSort(L);//堆排序
break;
}
case 5:
{
radix = 1;
RadixSort(L);//基数排序
break;
}
default:break;
}
cout << endl << endl;
}
return 0;
}
12、运行界面,小编已经运行过了,基本没有明显bug
