☰
软件工程课程设计:选课系统数据库设计与界面闭环实战
2026/11/4 9:59:01 网站建设 项目流程

简介:《软件工程课程设计指导书》面向计算机科学与技术专业的软件工程初学者,针对课程设计「从需求分析走到可运行系统」这一实践难点,以选课系统为完整范例,串联面向对象方法、C++ Builder 6.0 与 Access 2000 的开发流程。压缩包内为 1 个 doc 文档,约 539KB,正文覆盖实验目的、先修课程、10 学时上机安排,以及数据字段与功能要求,并逐项给出用例图、序列图、对象模型、状态图和不少于 20 组对象测试序列的提交规范,还附有书面报告的结构框架与成绩考核方式(报告、软件系统与考勤加权)。附录用分步说明讲解 ODBC 数据源建立、工程创建与数据库连接,便于零基础者照着操作。已有 99 人学习,适合需要一套可直接参照的课程设计模板与实验指引的在校学生。

1. 第一次翻开软件工程指导书:为什么它不讲语法,只讲“怎么把事做完”

很多人学完一学期 C++,能默写冒泡排序,能写九九乘法表,自我感觉还不错。然后课程设计任务书发下来:做一个选课系统,要能登录、选课、退课、查成绩,还要交一份报告。人一下就懵了——语法我明明都会,可这些东西怎么拼到一块儿去?

这份软件工程课程设计指导书,回答的正是这个问题。它不教你 for 循环怎么写,它教的是:从一句“做个选课系统”出发,怎么把需求拆成表、把表接到界面上、把界面写成能跑的程序,最后交出一份别人看得懂的文档。它写给刚学完一门高级语言、学过一点数据库、第一次要独立交出一个完整小系统的人。你不需要多聪明,只需要肯按顺序动手。

2. 这份指导书到底给了什么:一个选课系统、两件老工具、四个阶段

先别急着打开编译器。新手最容易犯的错,是任务书扫一眼就开始拖控件,拖到一半发现字段不够用、功能想漏了,只能推倒重来。花二十分钟把这份指导书的结构看明白,后面能省下好几个晚上。

它其实是一份很完整的“施工图”:目标写清楚了,环境写清楚了,要交什么写清楚了,连数据库怎么连都给了操作步骤。你要做的是照着走一遍,而不是自己另起一套。

2.1 先看清任务书:目的、前置课、学时、交付物

把指导书里的关键信息抽出来,大概是这样一张表:

项目内容对新手意味着什么
实验目的按软件工程思想、用面向对象方法开发一个小型系统重点是“过程规范”,不是功能多
先修课程一门高级语言、C++、数据库系统概论语法和 SQL 你都见过,只是没用它们做过完整的东西
上机学时10 学时时间很紧,功能别贪多,六个就够
开发环境Windows 单机、C++ Builder 6.0、Access 2000不用装服务器、不用配网络,一台电脑搞定
交付物能运行的系统 + 书面报告报告和系统一样算分,别只顾着写代码
考核方式报告、系统、考勤三项加权考勤也占分,别翘课

这张表里最容易被忽略的是“10 学时”。很多同学一上来就想做选课 + 排课 + 成绩分析 + 报表导出,结果第十个学时还在改登录框。指导书把功能列得很克制:登录、查询开课情况、查询选课情况、查询成绩、选课、退课,六件事。这六件事里,查询占了三件,说明它真正想让你练的是“查数据、显示数据”,而不是堆业务逻辑。

还有一条常被跳过的:整个开发过程要符合软件工程的要求。这句话听起来很虚,落到评分上就是那几张图和那份报告。它占了相当比重,而且是最好拿的分——因为画图不需要调试。

2.2 为什么是 C++ Builder 6.0 加 Access 2000 这套“老组合”

第一次看到这两个名字,很多人心里会嘀咕:这都什么年代的软件了。血泪经验是,恰恰因为它们老,才适合你现在这个阶段。

C++ Builder 这类工具的核心体验是“拖”:从组件面板上拖一个按钮到窗体上,双击它,光标直接跳到这个按钮的点击事件里,你写几行代码,它就跑起来了。没有构建脚本,没有包管理器,没有“装个依赖卡三小时”的玄学问题。你昨天刚学的 C++ 语法,今天就能挂在一个真实窗口上看到效果,这个正反馈对新手太重要了。

Access 2000 则是一个单文件数据库:整个库就是一个 .mdb 文件,双击能直接打开看数据,改完保存就行。你不用起服务、不用配账号、不用记端口。建表、填数据、验证结果,全在这一个文件里。

更重要的是,这套老工具里的概念,和你以后用的任何东西都是一一对应的:

  • 数据源(DSN):相当于告诉程序“库在哪儿、叫什么”
  • 连接(Connection):程序和数据源之间那条通道
  • 数据集(Query / Table):一条 SQL 语句执行完拿到的那堆行
  • 字段(Field):一行里的一列,可以按名字取

换成今天任何一个开发工具,这四个词还会原封不动地出现。所以别纠结工具老不老,你要带走的是这套概念。

2.3 把选课系统拆成三块:界面、逻辑、数据

理解一个系统,最省力的办法是把它想成一家小餐厅。

界面是菜单——学生看到的那几个窗口:登录框、开课列表、我的课表。它只负责“显示”和“收集输入”,本身什么都不会算。

逻辑是服务员——你在登录框点“登录”,服务员拿着你给的账号密码跑到后厨去问一句“有这么个人吗”,拿到答案再回来告诉你“进去了”或者“密码不对”。

数据是后厨的仓库——所有的学生、教师、课程、成绩都躺在 Access 的表里,界面不直接碰它,全靠逻辑去取。

三块之间靠什么连?靠那条“连接”。指导书附录里花了大篇幅讲 ODBC 建数据源、讲 ADOConnection 怎么配,就是在修这条路。路不通,菜单再漂亮也点不出菜。新手最常见的情况是:界面画得挺好,一点按钮就弹错误框,八成是这条路没接上,而不是代码写错了。

想清楚这三块,你在写任何一个功能的时候都会先问自己三个问题:这个功能在界面上长什么样?它对应哪条 SQL?这条 SQL 查的是哪张表?问完,代码基本就有轮廓了。

3. 为什么要按软件工程的路子走:不画图也能写代码,但画了少返工

有同学会问:我就想赶紧把代码写出来,那些用例图、序列图、对象模型,是不是形式主义?

先说实话:不画图确实也能写出能跑的程序。但你会付出另外的代价——写到一半发现少了一个字段,加到表里,然后发现界面要改、SQL 要改、报告里的表结构也要改;测试的时候发现某条路根本走不通,因为一开始就没想清楚“退课之后已选人数要不要减”。

软件工程这一套东西,本质是让你把“返工”这件事提前到纸面上完成。纸上改一行字,比代码里改十个文件便宜太多。

3.1 只会写代码的人,通常卡在哪三个地方

第一个卡点是需求没定型就开写。任务书上写着“查询成绩”,你就做了个成绩列表。可到底谁能查?学生查自己的,还是老师查全班的?需不需要按学期筛选?没想清楚,写完发现方向错了。

第二个卡点是字段没想清就建表。指导书列了二十多个字段:学生姓名、学号、登录密码、性别、出生年月、籍贯、地址、学生电话、家庭地址、教师号、教师姓名、教研室、职称、教师电话、课名、课号、学分、先行课号、课时、开课教室、人数限制、选课人数、考试成绩、平时成绩、总评成绩。新手一看就头大,容易一股脑塞进一张表,结果一条记录里一半格子是空的。

第三个卡点是改一处崩一片。因为界面、SQL、字段名散落在十几个地方,改个名字要全局搜索替换,漏一个就编译不过或者运行时报错。

3.2 用例图、序列图、对象模型、状态图,各管一段

这四张图听着吓人,其实各回答一个很朴素的问题。用装修打比方你就懂了。

用例图回答“谁要用哪些功能”。它画的是一堆小人和一堆椭圆,小人连到椭圆上。放到选课系统里,就是“学生”连到“登录、选课、退课、查成绩”,“教师”连到“登录、查开课、录成绩”。这张图逼你想清楚:有没有漏掉一类用户?有没有一个功能谁都用不上?

序列图回答“一次操作里,几个东西按什么顺序互相喊话”。比如“学生点选课”这件事:界面收到点击 → 问数据库这门课还有名额吗 → 有就在选课表插一行 → 把课程表的已选人数加一 → 回头刷新界面。横着画几条竖线,每条线代表一个对象,箭头从上往下排。画完你会发现很多坑:名额满了怎么办?已经选过了怎么办?

对象模型回答“系统里有哪些东西,它们怎么关联”。学生、教师、课程、选课记录,各自有哪些属性,一个学生对应多条选课记录,一门课对应一个教师。这张图基本就是你建表的草稿。

状态图回答“某个东西有几种状态,怎么切换”。指导书要求至少画一个重要对象的状态图。最自然的选择是“课程”:待开课 → 可选 → 已满 → 已停开。想清楚这个,“人数限制”和“已选人数”这两个字段为什么必须存在,就不用别人解释了。

这四张图加起来,画得粗糙也就一两个小时。但它们能帮你提前发现八成的问题。

3.3 字段先定死:20 多个字段归成 4 张表

把那串长长的字段清单归类,思路很简单:谁身上的属性,就放谁的表里。

  • 学生表:学号、姓名、登录密码、性别、出生年月、籍贯、地址、电话
  • 教师表:教师号、姓名、教研室、职称、性别、电话
  • 课程表:课号、课名、学分、先行课号、课时、开课教室、人数限制、已选人数、任课教师号
  • 选课表:学号、课号、平时成绩、考试成绩、总评成绩

注意“已选人数”这个字段。它不在原始字段清单里,但从“人数限制”和状态图能推出来,你必须有个地方记当前选了多少人,否则每次都要去数选课表有几行,慢而且容易错。

落到 Access 里,建表语句大概长这样(Access 里可以直接用查询设计器建,也可以用 SQL 视图):

-- 学生表:一个学生一行,学号做主键 CREATE TABLE student ( sid TEXT(12) PRIMARY KEY, -- 学号,唯一,登录用它 sname TEXT(20) NOT NULL, -- 姓名 login_pwd TEXT(20) NOT NULL, -- 登录密码,课程设计先存明文 gender TEXT(2), -- 性别 birth DATETIME, -- 出生年月 native TEXT(30), -- 籍贯 addr TEXT(60) -- 地址 ); -- 课程表:一门课一行,课号做主键 CREATE TABLE course ( cid TEXT(10) PRIMARY KEY, -- 课号 cname TEXT(40) NOT NULL, -- 课名 credit DOUBLE, -- 学分 pre_cid TEXT(10), -- 先行课号,没有就留空 hours INTEGER, -- 课时 room TEXT(20), -- 开课教室 capacity INTEGER, -- 人数限制 enrolled INTEGER DEFAULT 0, -- 已选人数,选课退课都要动它 tid TEXT(10) -- 任课教师号 ); -- 选课表:一个学生选一门课一行 CREATE TABLE enroll ( sid TEXT(12), -- 学号 cid TEXT(10), -- 课号 usual DOUBLE, -- 平时成绩 exam DOUBLE, -- 考试成绩 total DOUBLE, -- 总评成绩 PRIMARY KEY (sid, cid) -- 两个字段一起做主键 );

这段 SQL 里有三处值得说清楚。

第一,选课表用 (sid, cid) 两个字段一起做主键。主键的意思是这个组合不能重复。这样一来,“同一个学生选同一门课两次”这种事在数据库层面就被挡住了,你连判断代码都省了。这比在代码里写 if 判断靠谱得多。

第二,course 表里单独存了一个 enrolled。它其实是 enroll 表里某门课的行数,属于“冗余”字段。新手会问:为什么不每次 count 一下?因为在列表页里,一屏显示十门课,count 十次数据库就查十次;而且显示“已选 38/40”这种信息,本来就需要一个现成的数。

第三,login_pwd 存的是明文密码。这只能出现在课程设计里。真实项目里密码必须加密存储,这条现在记不住没关系,但心里要有个数:这里是为了让你能直接打开表看数据、方便调试。

有了表,查询就好写了。比如“查某个学生选了哪些课、还剩多少名额”:

-- 参数 :sid 由程序传进来,比如学号 2023001 SELECT c.cname, c.credit, c.capacity, c.enrolled, c.capacity - c.enrolled AS leftover -- 剩余名额,算出来给界面显示 FROM enroll e INNER JOIN course c ON e.cid = c.cid -- 用课号把两张表接起来 WHERE e.sid = :sid;

这里用了 INNER JOIN,意思是只保留两张表都能对上的行。参数 :sid 是占位符,程序执行前会把真实学号填进去,而不是把字符串拼进 SQL——拼字符串是新手最容易踩的安全坑,后面章节还会讲。

3.4 最小闭环:先让一条线跑通,再铺开功能

十个学时真的很短,所以顺序很重要。新手最容易的做法是按界面顺序做:先把登录框画完,再做选课界面,再做退课。结果中间任何一环卡住,整个系统都跑不起来,很打击人。

更稳的顺序是先打通一条最细的线,从界面穿到数据库再穿回来:

第一步,数据库里只建 student 表,手工塞两三条学生记录,包括你知道密码的那一条。

第二步,做一个只有一个窗体的小程序,上面放两个输入框(账号、密码)和一个按钮。

第三步,配好数据源,接上连接,写那个按钮的点击事件,执行一条带参数的查询。

第四步,点按钮,账号密码对的时候弹出“欢迎,某某”,不对的时候弹出“账号或密码不对”。

这四步做完,你就拥有了一个能跑通的完整闭环:界面收集输入 → 逻辑执行 SQL → 数据库返回数据 → 界面显示结果。剩下所有功能,都只是这条线的变体。选课是把 SELECT 换成 INSERT 加 UPDATE,退课是 DELETE 加 UPDATE,查成绩就是换个 WHERE 条件。

先通一条线,再横向复制,这个习惯比任何语法知识都值钱。

4. 第一步怎么迈:从建库、建数据源到第一个窗口跑起来

前面都是纸上的事,到这儿开始动手。这一章按你真实操作的顺序走,每一步做完都有一个“怎么确认我做对了”的标志,对不上就停下来查,别硬着头皮往下走。

4.1 动手前的三件准备:路径、工具、心态

第一件事是路径。把你的项目目录、Access 数据库文件放在一个纯英文、无空格的路径下,比如 D:\course_design\。听起来像老一辈的迷信,但这套工具链对中文路径和空格真的很敏感,报的错还特别含糊——常见的是“找不到文件”或者干脆没反应。这种问题排查起来纯属浪费时间,一开始避开就好。

第二件事是工具确认。打开 Access 建一个空库,能保存成 .mdb 格式;打开 C++ Builder,能看到组件面板。两个都能启动,环境就没问题。

第三件事是心态。这套工具的操作方式和今天的软件很不一样:很多功能藏在右键菜单和对话框里,没有搜索框,帮助文档也是本地 chm。第一次用会觉得别扭,这很正常,按步骤走就行,别一边摸索一边改需求。

4.2 用 Access 建库:字段怎么归、主键怎么定

新建一个空数据库,命名成 course.mdb,放在刚才那个纯英文目录里。

然后按 3.3 里的四张表建结构。这里有一个新手常犯的错:把学号设成“数字”类型。学号看起来是数字,但你不会拿它做加减法,而且数字类型会把前导零吃掉(00123 变成 123)。所以学号、课号、教师号这类“编号”,一律用文本类型。

主键的设置很关键。学生表用 sid,课程表用 cid,选课表用 (sid, cid) 联合主键。设置方法是在设计视图里选中字段,点工具栏上的小钥匙图标。设完主键,Access 会自动禁止重复值,这就是你要的效果。

数据先手工填几条进去:三个学生、三门课、一个教师。别嫌少,调试阶段数据越少越容易看出问题。你可以专门造一条“已选人数等于人数限制”的课,用来测试选满的情况。

做完的标志:双击表名,能看到你填的那几行数据,字段顺序和类型都对。

4.3 建 ODBC 数据源:13 步压成 6 步

数据源的作用,是给这个 .mdb 文件起一个“程序能认得的名字”。程序里不写文件路径,只写这个名字,以后挪了文件只要改数据源,程序不用动。

指导书附录里给了很细的步骤,中间还绕了一段 BDE Administrator。对新手来说,核心其实只有六步:

  1. 打开控制面板,找到“ODBC 数据源管理器”(32 位系统里可能在“管理工具”下面)。
  2. 切到“用户 DSN”或“系统 DSN”标签页,点“添加”。
  3. 在驱动列表里选 Microsoft Access Driver (*.mdb),点完成。
  4. 在“数据源名”里填一个好记的名字,比如 course_dsn。这个名字后面要在程序里用到,记下来。
  5. 点“数据库”区域的“选择”,浏览到 D:\course_design\course.mdb,确定。
  6. 一路确定退出来,回到 ODBC 管理器,列表里应该能看到 course_dsn。

做完的标志:ODBC 管理器列表里出现你起的那个名字。如果点了确定却什么都没出现,八成是第 5 步的文件没选中,回去重选一次。

至于附录里提到的 BDE Administrator,那是这套老工具管理数据库连接的另一种方式。你可以先跳过它——用 ADO 走 ODBC 这条路更直接,也更接近今天的做法。

4.4 新建项目,让第一个窗口先跑起来

打开 C++ Builder,菜单 File → New → Application,会同时出现一个空白窗体和一个代码窗口。

先别急着拖控件,先保存:File → Save Project As,选到 D:\course_design\ 目录下,给项目起个名字(比如 CourseSys),它会让你保存两个文件,一个是单元文件,一个是项目文件,都放在同一个目录里。

然后编译并运行:Project → Build All Projects,再 Run → Run。屏幕上会弹出一个什么都没有的灰窗口。看到这个窗口,说明工具链是通的,这一步很重要——很多人后面所有的错,其实是环境本身就没配好。

接着做第一个控件。在组件面板的 Standard 页找到 Label,点一下,然后在窗体上点一下,标签就放上去了。用左边的 Object Inspector 改它的 Caption 属性,把文字改成“选课系统”。旁边可以再放两个 Edit(输入框)和两个 Label,分别标“账号”“密码”。

做完的标志:按 F9 运行,窗口里能看到你放的文字和输入框,能在输入框里打字。

4.5 连上数据库:ADOConnection 的三下点击

现在修那条“路”。在组件面板切到 ADO 页(如果没有 ADO 页,说明安装时没勾选相关组件,需要回去补装),找到 TADOConnection,拖到窗体上。它会显示成一个没有大小的小图标,不影响界面。

双击这个图标,会弹出一个连接字符串的对话框。点 Build 按钮,在提供程序列表里选 Microsoft Jet 4.0 OLE DB Provider(对应 .mdb 文件),然后在使用数据源名称的下拉框里选你刚才建的 course_dsn。点“测试连接”,弹“测试连接成功”就对了,一路确定退出来。

回到窗体,再拖一个 TADOQuery 上去,把它的 Connection 属性设成刚才那个 ADOConnection 的名字。这个 Query 就是你以后执行 SQL 的地方。

最后收个尾:把 ADOConnection 的 LoginPrompt 属性改成 False。不改的话,每次运行程序都会先弹一个要你输密码的框,很烦。

做完的标志:把 ADOConnection 的 Connected 属性设成 True,不报错。如果报错,回到 4.3 检查数据源,或者检查数据库文件是不是被 Access 独占打开了——Access 打开着文件时,程序是连不上的,这个坑很多人踩过。

到这里,环境、数据、通道三样齐了。下一步就是把 3.4 里那条闭环用代码写出来:

// “登录”按钮的点击事件:拿输入框的账号密码去 student 表里比对 void __fastcall TForm1::btnLoginClick(TObject *Sender) { qryLogin->Close(); // 先关掉上一次查询,重复 Open 会报错 qryLogin->SQL->Clear(); // 清空上一次拼进去的 SQL qryLogin->SQL->Add("SELECT sid, sname FROM student WHERE sid = :sid AND login_pwd = :pwd"); qryLogin->Parameters->ParamByName("sid")->Value = edtUser->Text; // 账号输入框 qryLogin->Parameters->ParamByName("pwd")->Value = edtPwd->Text; // 密码输入框 qryLogin->Open(); // 执行查询 if (qryLogin->Eof) // 结果集空了 = 没查到人 ShowMessage("账号或密码不对"); else ShowMessage("欢迎," + qryLogin->FieldByName("sname")->AsString); }

几处关键点解释一下。

qryLogin 就是你拖上去的那个 TADOQuery 组件的名字(在 Object Inspector 的 Name 属性里改)。Close 和 Open 是配对使用的:一个查询对象执行完一次后,要关掉才能再执行下一次,否则会报“数据集已打开”这类错。

SQL->Clear 之后再用 SQL->Add 追加语句。如果不 Clear,第二次点按钮时 SQL 会在旧语句后面再拼一遍,变成两条语句,直接报语法错。这是新手调试时最常见的“第一次能跑,第二次就崩”。

: sid 和 : pwd 是参数占位符,靠 Parameters->ParamByName 按名字赋值。这样做的好处是:输入框里哪怕输了单引号、分号,也只会被当成一段普通文字,不会破坏 SQL 结构。如果你图省事拼字符串,账号里输一个单引号就能让语句崩掉,这是安全课上必讲的第一课。

Eof 表示“到了结果集末尾”。查不到任何行时,记录指针一开始就处于末尾,所以判 Eof 就等于判“没这个人”。FieldByName 按字段名取值,AsString 把它转成字符串。

跑通这一段,你就能体会到 3.4 说的那条闭环长什么样了。后面的选课、退课、查成绩,全都是把这条 SELECT 换成别的语句,再加上界面刷新而已。

5. 新手避坑:这 5 个地方翻车概率最高

上一章的路走完,很多人已经能点出“欢迎,某某”了。接下来做完整功能的两三个星期里,你会反复撞上下面这几个问题。提前知道,能省下大量瞎试的时间。

5.1 数据源明明建好了,程序还是连不上

现象:ODBC 管理器里那个名字明明在,测试连接也成功,但程序一运行就报连接失败,或者弹出登录框要密码。

原因:三个常见根源。一是数据源建在了“用户 DSN”下,而程序以别的身份跑,看不到这个用户的数据源,换成“系统 DSN”就正常。二是 Access 正开着那个 .mdb 文件,文件被独占,程序连不进去。三是把 32 位和 64 位搞混了——Access 驱动装的是 32 位版本,程序也是 32 位,但你打开的是 64 位那个 ODBC 管理器,看到的列表和程序看到的不是同一份。

解决:先关掉 Access 再运行程序;把数据源建在“系统 DSN”下;确认你打开的是和编译器位数一致的那个 ODBC 管理器。还有个小技巧:把 ADOConnection 的 LoginPrompt 设成 False,能排除掉“其实是在等密码”这种假故障。

5.2 数据没错,界面却是乱码或者一片空白

现象:在 Access 里看数据一切正常,程序里显示出来是问号、方块,或者干脆一列都不显示。

原因:编码和字段名两件事。这套老工具默认的字符集对中文支持不是天生就好的,Access 的新版本默认用 Unicode 压缩格式,老驱动不一定认得,就会出现乱码。另一种情况是 SQL 里写的字段名和表里的对不上(大小写、有没有空格),查询本身没报错但一个字段都取不到,界面自然空白。

解决:数据库存成 Access 2000 的 .mdb 格式,别用更新的 .accdb;字段名统一用英文小写加下划线,避免中文和空格;在 SQL 里用 SELECT * 先测一次,确认能取到行,再逐个换成具体字段名。如果只是中文显示乱,检查一下显示控件的字体设置,换成常见的中文字体试试。

5.3 一张表塞了所有字段,改一次崩三处

现象:刚开始写得很顺,做到第三个功能时发现要加一个“学期”字段,结果表要改、界面要改、三条 SQL 都要改,改完还有两条忘了改,运行时报“字段不存在”。

原因:建表的时候图省事,把学生、课程、成绩全塞进一张大表,造成大量重复和空值。一条选课记录里,学生的地址、电话重复存了好几遍,改一个学生的地址要改十几行。

解决:老老实实按 3.3 那样分成四张表,用学号、课号这些“编号”把它们连起来。判断标准很简单:如果某几列总是同时出现、且描述的是同一个东西(比如姓名、性别、电话总是在一起),它们就该待在自己的表里。改表结构的时候,养成一个习惯:先改数据库,再全局搜索一下字段名,把程序里所有出现的地方都过一遍。

5.4 报告留到最后一晚

现象:系统能跑了,很兴奋,觉得报告就是个流水账,最后一晚通宵写完。结果被打回来:用例图没有,序列图画错了,测试数据不足 20 条,源代码里贴了一堆自动生成的代码。

原因:报告在考核里占的比重不小,而它要求的内容(需求分析、设计、测试、源代码、总结)恰恰是“过程中”产生的,不是事后能回忆出来的。尤其是测试那部分,要求用不同方法设计测试数据,书面提交至少 20 个不同的对象测试序列——这个数量不是拍脑袋能编的。

解决:从第一天就记账。建表的时候顺手把表结构截图存下来;每画完一张图就贴进报告草稿;每修好一个 bug,在测试记录里加一行“输入什么、期望什么、实际什么”。到期末你手里已经有一份八成完成的报告,只要整理排版。源代码部分只贴手写的代码,自动生成的那些可以省略掉。

5.5 测试只走“正常流程”

现象:演示的时候一路顺畅,老师上来点了几下:选一门已经满员的课、退一门没选过的课、账号输错三次,程序当场翻车——要么没反应,要么直接把已选人数减成了负数。

原因:自己测的时候潜意识里只走“正确路径”,从不故意输错。而真实的评分和答辩,专门挑边界情况。

解决:列一张边界清单照着测:名额刚好满了再选、重复选同一门课、退一门没选的课、密码输错、什么都不输直接点按钮、学号里输入空格和单引号。每一条都对应一个判断:选课前先查已选人数是否小于人数限制,插入前先查是否已存在记录,退课前先查记录是否存在。这几个 if 加起来不到二十行,但能救你一整个答辩。

6. 做完这份设计之后:下一步先学什么、按什么顺序练

系统能跑、报告交上去,这门课就算结束了。但如果你真的把那条闭环走通了,手上其实已经攒下了一些很值钱的东西:知道一个系统怎么从需求变成表、从表变成界面、从界面变成能跑的程序。接下来往哪走,取决于你想补哪块。

方向先学什么为什么是这个顺序
想把界面做得更像样换一个现代的开发工具,重做同一个选课系统的界面业务逻辑你已经会了,换工具只学界面部分,负担最小
想把数据这块弄扎实SQL 的增删改查、多表连接、事务你已经在用 SELECT 和 INSERT 了,系统学一遍能把零散经验串起来
想搞懂“面向对象”到底怎么落地把学生、课程写成类,让界面只调用类的方法这一步做完,你会突然明白为什么教材上要讲封装

具体怎么练,我给一个可以马上做的练习:把现在的代码重写一遍,但加一条规矩——界面上任何按钮的点击事件里,不许出现 SQL 语句。所有 SQL 都收进一个单独的数据访问单元,按钮只调用类似 FindStudent(id)、Enroll(sid, cid) 这样的函数。

这个改动很小,但效果很直接。改完之后,如果哪天数据库从 Access 换成别的,你只需要改那一个单元;如果哪天要加一个“批量导入学生”的功能,直接调现成的函数就行。这就是“分层”最朴素的样子,也是软件工程这门课真正想让你体会到的东西。

我第一次带人做这类设计的时候,吃过一个亏:觉得图画不画无所谓,先写代码要紧。结果做到第七个学时,发现课程表里没地方放“开课学期”,加字段、改界面、改三条 SQL,一个晚上就没了。从那以后我每次动手前都强制走一遍:先把字段清单列全,画一遍对象模型,确认每张表都有主键,再打开编译器。这个习惯后来帮我省下的时间,远远超过画图花的那两个小时。

希望这份拆解能帮你少走点弯路,顺利把第一个完整的小系统跑起来。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询