有是一年課設季,原始碼雖好找,課設卻難過,看小編為你詳解課設,附贈原創原始碼
設計一系統,實現醫藥公司定期對銷售各藥品的記錄進行統計,可按藥品的編號、單價、銷售量或銷售額做出排名。
工具/原料
vc2010
電腦
方法/步驟
作為一名徘徊在課設邊緣不能自拔的程式設計學習者,思路很關鍵,因為程式設計思想並不是一朝一夕就能培養出來的,所以臨陣磨槍,思路優先
要達到排序的目的,首先要建立排序物件,要建立一個物件,就要確定他的資料元素結構以及儲存方式,所以在看到題目後,大家應該有形如下圖一樣清晰的程式設計思路,先做什麼,再做什麼。
標頭檔案應該懂得可以跳過本步
一,建立第一個結構體,應包含資料元素的各種資料項,比如,編號,銷售額,銷售量一類資料項,小編做了這樣幾個資料項。
建立第二個結構體,第二個結構體是為了確定儲存結構,小編採用了順序表,你也可以採用其他的方法。
初始化結構體,一般是數字的話呢直接複製就可以,如果是字串的話呢,就要用到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個就夠除錯了
做一個輸出函式
一般用for迴圈就ok了很簡單的
\t是空格的意思
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
{
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);
}
}
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;
}
}
}
}
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
++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);
}
}
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);
}
}
主函式
int _tmain(int argc, _TCHAR* argv[])
{
SequenList L;
SetData(L);
int choice,radix=0;
for (;;)
{
cout<<"************歡迎進入藥品銷售管理系統************"<
cout<<"選單:"<
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;
}
執行介面,小編已經執行過了,基本沒有明顯bug