


摘 要: 從實踐層面上看,關系模型應用極其廣泛;從理論層面上看,關系模型是眾多計算機分支的交匯處,專門的研究和提煉很有必要。針對關系模型的基本操作,本文給出了部分底層的算法及代碼,通過對編程思想方法的解析,強調教學中思維訓練的重要性,期待對相關課程教學及人才培養有一定的實用價值。
關鍵詞: 關系模型;? 二維表格;? C語言;? 編程;? 教學
中圖分類號: TP 311; G 642文獻標志碼: A
Basic Programming Analysis of Relational Model
JIAO Hua
(College of Computer and Information Engineering, Guizhou University of Commerce, Guiyang, Guizhou 550014, China)
Abstract: From the practical level, relational model is widely used; from the theoretical level, relational model is the intersection of many branches of computer, so it is necessary to study and refine it. In view of the basic operation of the relational model, this paper gives some bottom-level algorithms and codes. Through the analysis of programming ideas and methods, it emphasizes the importance of thinking training in teaching, and expects to have a certain practical value for the teaching of relevant courses and personnel training.
Key words: relational model; 2-D table; C language; programming; teaching
0 引言
表格管理無時不在、無處不在,因此可以說世界是表格的世界[1]。使用表格是為了對數
據進行直觀有效的管理,任何復雜的表格都可由標準的二維表格生成。二維表格用數據庫語言[2]可表述為:從縱向看由一個個字段(域)組成;從橫向看除第一行(表頭)外,由一條條記錄構成。在數據庫管理系統中要創建一個數據表,步驟是先建立表結構(表頭),再錄入一條條記錄。二維表格是三大數據模型之一的關系模型,這是它應用極其廣泛的根源[3]。上個世紀七十年代初Edgar Frank Codd開發了一個關系型的數據管理模型,被譽為“關系模型之父”。根據他設計構建的關系模型數據庫成為了眾多行業、企業運行的基礎:銀行使用關系數據庫跟蹤資金的流動、零售商依賴它們對庫存水平進行監控、人力資源部門應用它們對員工檔案進行管理;政府機構、學校和圖書館在其中存儲千萬上億條記錄;應當說世界上幾乎所有的企事業單位都在使用關系模型數據庫[4]。自Codd公布其理論成果之后的30年中,關系數據庫據統計已成為年收入達到130億美元的產業。在有堅實數學基礎的關系模型提出以后,之前的兩大數據模型——層次模型與網狀模型的系列數據庫產品迅速走向衰敗、消亡,眾多商業化關系數據庫管理系統很快被開發并占領了市場,其除舊布新之徹底、交替速度之快在軟件史上是罕見的。Codd的杰出貢獻使他在1981年獲得了計算機界最高獎——圖靈獎。
在高等院校計算機類課程中,有多門課程與二維表格模型——關系模型有關:《計算機應用基礎》中的Excel、Access;《SQL Server數據庫》中的數據表操作;《C語言程序設計》中的數組、結構體;《數據結構》中的三大結構——線性結構、樹型結構、圖及網狀結構其實就是《數據庫原理》中的三大數據模型——關系模型、層次模型、網狀模型[5]。如同眾多河流的交匯處,關系模型是多門計算機課程聚集點,專門的研究和提煉很有必要。目前對計算機教育教學的研究論文很多,但都比較宏觀和中觀,而計算機科技方面的論文又很傲慢地不談教育教學,這里折衷以關系模型作為出發點,剖析其基礎編程的方法和代碼,期待對相關課程教學及人才培養有一定的實用價值。
1 關系模型的基礎算法及代碼解析
二維表格的輸入、輸出、橫向運算、縱向運算、排序是最基本的操作,這些操作用Excel、Access或其他數據庫軟件都很容易實現,但若要了解底層的算法及代碼,則需要用C語言等過程化高級語言較困難地進行綜合程序設計[6]。這一點在教學中要對學生講清楚:前者的容易是因為“站在巨人肩上”;后者的困難是因為一切都要“刀耕火種”。但從“知其然且知其所以然”的角度講,必須掌握后者,而且后者也是較好的編程思維訓練素材。二維表格模型從本質上可描述為若干個結構相同的數據元素排列構成的有限序列,每個數據元素由若干個有關聯性的數據項組成。比如職工工資表中,除表頭外每一行是一個數據元素,反映的是某個職工相關聯的編號、姓名、基本工資、工齡工資、津貼、資金、應發合計等。為了將抽象的分析討論具體化,后面將圍繞以下的二維表格實例展開[7]。如表1所示。
實例:已知某班有N個學生,其學號、姓名、各科課程成績如下(數據省略):
要求設計一個C語言的菜單程序,完成以下功能:
① 輸入學號、姓名及各科成績(原始成績的錄入);
② 輸出學號、姓名、各科成績及總分;
③ 輸出學號、姓名、各科成績、總分及名次;
④ 退出程序。
如何設計主菜單?在C語言課程的教學中,教師總是諄諄教導學生:在程序設計中要注意避免死循環,在循環體中要有改變循環條件的語句存在,沒有死循環的C程序運行完后將返回到對應的C編譯系統。這種傳統的教導是必須的,但會使學生對死循環產生恐懼,萬事萬物都有雙面性,死循環其實是編程中的大智慧!因為讓程序一直運行的手段就是一邊采用死循環,一邊在循環體中安排好必備出口。比如電腦開機后Windows一直在運行,而在開始菜單中有關機按扭,其功能是關閉所有打開的程序、關閉Windows、關閉電腦。運行一個基于Windows平臺的應用程序將打開一個窗口,如果不選擇窗口中的關閉按扭或菜單中的退出項,它將一直運行下去。因此這里是用死循環設計主菜單,其流程圖[8]如圖1所示。
編程過程中除了掌握C語言扎實的語法知識外,繪制流程圖是程序員的基本功[9]。程序設計的思路用圖的形式來表達,繪圖過程就是思考的過程,由于圖形的直觀性,繪制過程中又啟發、促進了思考。在具體教學中,針對上圖讓學生描述在菜單中依次選擇1、2、3、4的流程執行線路,是一種極佳的編程思維訓練選擇。因為當中有順序、有分支、有循環、有函數調用回返這四種基本程序結構[8],把握流程點的狀態和走向是程序員的基本功。需要指出的是:通常情況下初學者不能正確描述上面的流程執行線路。
完整的程序代碼[10]如下:
#include
#include
#define N 6
struct st
{int xh; char xm[20]; int yy;
int gs; int zydl; int zf; int mc;};
struct st bj[N];
void cjlr(); void cjxs();void cjmc();
int main()
{ char ch;
while(1)
{system("cls");
printf("歡迎使用本系統!\n");
printf("1:輸入學號,姓名,英語、高數及專業導論成績\n");
printf("2:輸出學號,姓名,各科成績、總分\n");
printf("3:輸出學號,姓名,各科成績、總分、名次\n");
printf("4:退出程序\n");
printf("請選擇1——4:");
ch=getchar();
if(ch=='1') cjlr();
if(ch=='2') cjxs();
if(ch=='3') cjmc();
if(ch=='4') {printf("退出本系統!");getch();break;}
}
return 0;
}
void cjlr()
{int i;
printf("*輸入學號,姓名,英語、高數及專業導論成績*\n");
for(i=0;i<=N-1;i++)
scanf("%d%s%d%d%d",&bj[i].xh,bj[i].xm,&bj[i].yy,&bj[i].gs,&bj[i].zydl);
system("pause");
}
void cjxs()
{int i;
for(i=0;i<=N-1;i++)
bj[i].zf=bj[i].yy+bj[i].gs+bj[i].zydl;
printf("*輸出學號,姓名,各科成績,總分*\n");
for(i=0;i<=N-1;i++)
printf("%d %10s %4d %4d %4d %4d\n",bj[i].xh,bj[i].xm,bj[i].yy,bj[i].gs,bj[i].zydl,bj[i].zf);
system("pause");
}
void cjmc()
{int i,j,k; struct st temp;
for(i=0;i {k=i; for(j=i+1;j<=N-1;j++) if(bj[j].zf>bj[k].zf) k=j; temp=bj[k];bj[k]=bj[i];bj[i]=temp; } bj[0].mc=1; for(i=1;i<=N-1;i++)???? /* 確定名次 */ if(bj[i].zf==bj[i-1].zf) bj[i].mc=bj[i-1].mc; else bj[i].mc=bj[i-1].mc+1; printf("*輸出學號,姓名,各科成績,總分,名次*\n"); for(i=0;i<=N-1;i++) printf("%d %10s %4d %4d %4d %4d %4d\n",bj[i].xh,bj[i].xm,bj[i].yy,bj[i].gs,bj[i].zydl,bj[i].zf,bj[i].mc); system("pause"); }? [10] 基礎編程中有一個著名的沃思公式:“算法+數據結構=程序”,上面除了流程圖表示的主算法外,還有選擇排序算法等,在數據描述方面,一開始就定義了一個全局的結構體數組,所有函數都可以使用,這個全局量將各函數的操作結果聯系在一起。因此雖然函數調用時沒有參數傳遞,回返時不帶回結果,但全局結構體數組將這些函數串起來了。 選擇菜單項1——菜單項4運行情況圖如圖2~圖5所示。 注意主函數中的程序段: if (ch=='1') cjlr(); if(ch=='2') cjxs(); if(ch=='3') cjmc(); if(ch=='4') {printf("退出本系統!");getch();break;} 可用下面的程序段代替 switch(ch) { case '1':cjlr();break; case '2':cjxs();break; case '3':cjmc();break; case '4':printf("退出本系統!");getch();exit(0); } 注意:exit(0)不能用break替代,這里使用break只能退出switch分支結構,不能退出while循環結構;而exit(0)則可強行退出主程序。這一點也是編程者易犯的錯誤。 程序說明:(1)、成績錄入函數cjlr()用于得到最原始的二維表格,因此可以合并到主函數中去。(2)、成績顯示函數cjxs()在計算出總分欄的基礎上,可顯示從學號欄到總分欄的二維表格。因為bj是一開始就設置為全局變量的結構體數組,因此可應用cjlr()函數的結果。(3)、函數cjmc()用于排序、填入名次、顯示從學號欄到名次欄的二維表格,它用到了函數cjxs()得到的總分。(4)、子程序3依賴于子程序2的結果,而子程序2依賴于子程序1的結果,如果主程序中的菜單選擇不分前后,為增強子程序的獨立性,勢必添加重復代碼。(5)、函數cjmc()由于排序、填入名次已將學號順序打亂,若要恢復可對學號按冒泡排序或選擇排序還原。(6)圖4顯示的并列名次驗證了名次算法的正確性。(7)為了避免每次運行都要輸入原始二維表格數據,可用C語言中的文件類型將原始數據存盤,運行需要時再調入,這樣的解決方案更完美。 2 總結 前面提到的二維表格模型——關系模型應用非常廣泛,是高等院校計算機課程中多門課程的交匯點[11],按課程開設的順序,基礎編程的入門課是“C語言程序設計”。C/C++被譽為高級語言之母,幾乎所有高級編程語言追根溯源它們的底層都是C/C++,學好了C/C++,其他都是“小菜一碟”,因此本文的實例是用C語言來寫代碼的。基礎編程教學通常圍繞語法和算法兩條線索展開,傳統的教學內容及期末試卷考核最大的弊端是以語法為中心,打破常規、注重算法、注重編程思想,用綜合程序設計驅動基礎編程教學的改革意義重大[12]!將關系模型問題的程序設計作為期末考核內容,既綜合運用了C語言各章節的知識,在課程體系上也能夠承上啟下,最關鍵是訓練了學生的編程素質,這是優秀程序員的必經之路。 參考文獻 [1] 劉云翔. 計算機應用基礎[M]. (第3版). 北京:清華大學出版社, 2017. [2] 劉麗. Access數據庫基礎教程[M]. (2010版).北京:清華大學出版社, 2014. [3] 胡孔法. 數據庫原理及應用[M]. 北京:機械工業出版社, 2011. [4] 卓廣平. 數據挖掘開發及應用研究[J]. 軟件,2015(5):81-83. [5] 嚴蔚敏. 數據結構(C語言版)[M]. 北京:清華大學出版社, 2018. [6] 石蕓. 微課在《SQL Server數據庫》課程教學中的應用[J]. 信息與電腦(理論版), 2017(13):107-108. [7] 許真珍. 編程基礎課程漸進式項目驅動教學法研究[J]. 實驗室科學,2018(4):123-125. [8] 焦華. 基礎編程的思考方法[J]. 軟件,2018(3):57-62. [9] 安光勇. 以數學算法為基礎的C程序編程技巧[J]. 電子測試,2017(7):37-40. [10] 譚浩強. C程序設計[M]. (第5版).北京:清華大學出版社, 2017. [11] 岳清. SQL Server數據庫完整性教學案例探析[J]. 電腦知識與技術, 2017(19):61-63. [12] 臺海江.《C語言程序設計》課程教學改革探討 [J]. 現代計算機(專業版), 2018(32):33-36. (收稿日期: 2019.06.22) 基金項目:貴州省教育廳2016年本科教學工程項目(SJ-JXGC-KC-003;SJ-JXGC-KC-002) 作者簡介:焦華(1964-),男,碩士,副教授,研究方向:算法與程序。