关系模型的基础编程解析
2020-07-29焦华
摘 要: 从实践层面上看,关系模型应用极其广泛;从理论层面上看,关系模型是众多计算机分支的交汇处,专门的研究和提炼很有必要。针对关系模型的基本操作,本文给出了部分底层的算法及代码,通过对编程思想方法的解析,强调教学中思维训练的重要性,期待对相关课程教学及人才培养有一定的实用价值。
关键詞: 关系模型; 二维表格; 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-),男,硕士,副教授,研究方向:算法与程序。