软件工程课程设计:C++ Builder 6.0与Access选课系统开发全解析
发布时间:2026/10/23 3:10:17 锦皓数字建站

简介软件工程课程设计指导书是一份面向计算机科学与技术专业学生的实践指南重点服务软件工程新手引导其在课程设计中运用软件工程思想和面向对象方法完成选课系统这类小型软件。资源为单个doc文档大小约539KB目前已有97人学习。文档系统说明了实验目的、面向专业、先修课程、10学时上机安排以及Windows下C Builder 6.0与Access 2000的实验环境并针对数据字段、登录/查询/选课/退课/成绩管理等基本功能提出具体要求。同时文档规定了需求分析、软件设计、软件测试、源代码和总结等书面报告结构要求绘制用例图、序列图、对象模型与状态图。附录还给出通过ODBC和BDE Administrator建立数据源、C Builder新手上路及连接数据库的逐步操作指南。这份指导书完整覆盖课程设计从任务布置到考核评分的流程明确成绩按书面报告、软件系统、考勤加权计算能帮助读者规范完成课设、编写工程文档并提升实践素养。1. 软件工程课程设计指导书把选课系统从零写到答辩通过第一次做软件工程课程设计的人最常见的卡点不是写代码而是打开 C Builder 6.0 之后面对空白的 Form1 不知道从哪一步开始。这份指导书正是为解决这个场景准备的它没有给你一份可以直接编译的完整源码而是把“选课系统”从 Access 2000 建库开始到 ODBC 数据源配置、C Builder 连接数据库、再到写完课程设计报告拆成了一条可以照着走的操作链路。适合计算机专业学生、想补软件工程流程的人也适合接到老式桌面项目需要快速上手 C Builder 和 Access 的开发者。它的真正价值在于环境配置和数据库连接你几乎不用再花时间排查能把全部精力留给业务设计和报告交付。2. 技术选型与系统边界C Builder 6.0 Access 2000 的小型桌面选课系统2.1 为什么是 C Builder 6.0 和 Access 2000指导书把开发环境定在 Windows 单机模式开发工具是 C Builder 6.0数据库是 Access 2000。这个组合放在今天看起来复古但它其实是课程设计场景下最不容易翻车的搭配。C Builder 6.0 是 RAD 工具VCL 组件库能让你把窗体、按钮、表格拖拽完成新手不需要先啃完 C 语法才能做界面Access 2000 是单机文件型数据库一个 .mdb 文件就能承载学生、教师、课程、成绩四类数据安装成本几乎为零。相比 MySQL 加后端服务的方案这套组合把“环境”这件事对课程设计的干扰降到了最低。BDE 和 ADO 的双链路是另一个值得注意的点。C Builder 6.0 自带 BDEBorland Database EngineBDE 需要通过 BDE Administrator 配置别名同时它也支持 ADO 组件ADO 可以直接连接 ODBC 数据源。指导书采用的方法是先在 BDE Administrator 里建立一个指向 Microsoft Access Driver 的 ODBC 别名再在窗体上放 ADOConnection通过“使用数据源名称”的方式连接同一个 DSN。这中间多了一层转换但好处是以后就算把数据库换成 SQL Server只需要改 DSN 指向程序里的连接字符串不用大改。需要强调选这套技术栈不是因为它最先进而是因为它最符合“单机加小规模加教学演示”的约束。选课系统的数据量通常只有几百条记录Access 完全吃得下C Builder 的组件模型又天然贴近界面开发学生能够把时间花在需求分析和业务规则上而不是折腾部署。如果你在二次开发里想换掉它也不是因为这套选型老旧而是因为你要面对多用户并发、跨平台或 Web 访问那是另一个层面的问题。2.2 数据表设计指导书字段清单背后的关系模型指导书给出的字段清单非常具体按业务角色把它们归位就形成了选课系统的核心数据模型。学生、教师、课程、选课成绩这四类实体基本覆盖了一个小型教务系统的全部骨架。下面这张表是我按常见做法整理的字段归属名称不完全等同于指导书但业务含义是一致的实体关键字段说明学生表学号、姓名、登录密码、性别、出生年月、籍贯、地址、学生电话学号作主键登录密码单独存储教师表教师号、教师姓名、教研室、职称、性别、教师电话教师号作主键课程表课号、课名、学分、先行课号、课时、开课教室、人数限制、选课人数先行课号指向课程表自身选课成绩表学号、课号、考试成绩、平时成绩、总评成绩学号加课号联合主键这里最值得玩味的是“先行课号”字段。很多初学者把选课系统当成单纯的插入删除但先修课约束是选课业务里真正的规则所在。如果一门课有先行课课程表里就该出现“先行课号”指向另一门课选课时首先要判断学生是否已经通过先修课。这个字段的存在把“选课”从一个增删改查的壳子里拉出来变成了一个带业务规则的流程。对象模型上学生、教师、课程、选课记录各是一个类。学生可以和选课记录形成一对多课程和选课记录也是一对多教师和课程则是一对多因为一个老师可以开多门课但课程设计范围里不需要做多个老师合上一门课的复杂建模。状态图建议围绕“选课记录”画状态可以定义为“待选、已选、已退、成绩已录、已结课”每次状态迁移对应界面上的一个操作。指导书要求至少一个重要对象的状态图画选课记录是收益最高的选择。2.3 功能模块登录、查询、选课、退课如何串起来指导书要求的功能至少是登录、查询开课情况、查询选课情况、查询成绩、选课、退课。这六个功能按照使用流程可以分成三组。登录是入口用学号加密码完成身份验证用户角色是学生查询开课情况对应课程表列表学生可以在选课前查看课程名称、学分、课时、人数限制和当前选课人数查询选课情况和查询成绩则是对选课记录的读操作前者返回当前学生选了什么课后者返回成绩表里的平时分、考试分和总评。选课和退课是写操作也是整个系统里最容易出 bug 的地方。选课功能不能简单当作“往选课表里 insert”它背后有三个判断是否重复选课、课程是否已满、先修课是否满足。我在实际项目中一般会把这三个判断写成一个 CheckAndSelect 方法先查询选课表判断是否已有记录再比较课程表的“选课人数”和“人数限制”最后根据“先行课号”判断学生成绩表里有没有对应记录且通过。三个条件全部通过才执行插入。退课则是反向操作删除选课记录并把课程表的“选课人数”减一。注意退课不能无条件执行如果这门课已经录入了考试成绩则应该禁止退课。2.4 软件工程文档为什么用例图和序列图不能省指导书的报告要求里需求分析部分要有用例图和序列图设计部分要有对象模型、用例图、序列图和状态图测试部分要有至少 20 个不同的对象测试序列。我的经验是这些图不是画给老师看的装饰品而是代码结构的先行表达。比如用例图要画出学生、教师两个角色和“登录、选课、退课、查询成绩”几个用例序列图要画一个“学生选课”的完整消息往返从界面层到业务层再到数据库层这个图一旦画清楚后面写代码时调用的先后顺序基本就定了。对象模型和状态图的价值更高。对象模型可以直接映射到类定义比如选课记录类至少要包含学号、课号、平时成绩、考试成绩、总评成绩和状态字段状态图则能让你把“选课人数满了不能选”“退课了选课人数要回退”这类分支逻辑可视化。很多同学把图留到最后补结果图和代码完全对不上。更合理的做法是先画图再写代码写完代码再回头校正图这样报告和程序才能相互印证。3. 实操链路从 Access 建库到 C Builder 跑通选课系统3.1 先建数据库文件还是先写代码指导书的操作顺序是先建立 Access 数据库再配 ODBC最后进 C Builder 连数据库。这个顺序是对的因为数据库文件是数据源DSN 要指向它代码要通过 DSN 访问它。我建议你在一开始就把库文件路径固定下来不要在写了一半代码的时候再移动 mdb 文件。把库文件放在项目根目录比如选课系统目录下的选课.mdb后续所有连接路径都围绕这个固定路径处理避免从学生机拷贝到教师机时路径失效。Access 2000 的建表操作很简单新建一个空数据库用“使用设计器创建表”定义字段名、数据类型、主键。要注意几个细节学号不要设成“自动编号”因为学号是业务主键要允许手工输入选课表要把学号和课号一起设为主键否则同一学生同一课程可以插入多条记录课程表的“人数限制”用数字类型“选课人数”也必须是数字类型不能存成文本否则比较大小会出问题。字段类型上学号和课号建议用文本类型因为可能出现前导零学分用单精度数字成绩用数字类型允许小数。3.2 配置 ODBC 数据源指导书那套长步骤到底在干什么指导书花了很大篇幅讲 BDE Administrator 的操作新建 odbc1、右键调出 ODBC Administrator、添加 Microsoft Access Driver、填数据源名、选择 mdb 文件、回到 BDE 里 Apply、Open、Close。这套流程初看非常绕但拆开看就是三步第一步让操作系统知道选课.mdb 可以通过 Access 驱动访问第二步给这个 mdb 起一个逻辑名比如“选课数据源”第三步让 BDE 的别名 odbc1 指向这个逻辑名。你在 BDE 里看到的 odbc1 只是一个通道数据源名才是你真正要记住的东西。配置完成后可以在 ODBC 管理器里点击“测试连接”如果显示“连接成功”说明 DSN 已经生效。这个环节很值得花时间仔细做因为我见过太多人跳过 BDE 的 Apply 和 Close直接在 C Builder 里测试 ADOConnection结果报“未指定的错误”。其实问题就出在 ODBC 数据源根本没有建立成功。如果 DSN 配置正常但 ADO 仍然连不上可以先在 C Builder 里新建一个 ADOConnection双击后在“连接”页选择“使用数据源名称”下拉框里如果能看见你刚建的 DSN就说明 ODBC 层没问题。连接字符串的等价写法如下ProviderMSDASQL.1;Persist Security InfoFalse;Data Source选课数据源这里 Provider 用的是 MSDASQL也就是 OLEDB Provider for ODBCData Source 就是 ODBC 数据源的名称。如果你不想走 ODBC也可以直接把 Provider 换成 Microsoft.Jet.OLEDB.4.0并且把 Data Source 指向 Access 文件名这样能省掉 ODBC 层。但指导书是教学目的建议按 ODBC 方式走一遍毕竟 BDE 也是从 ODBC 派生出来的理解了这一层以后连 SQL Server 也是同一个套路。3.3 在 C Builder 里搭建界面和数据访问组件进入 C Builder 后File 菜单下 New 一个 Application 新建项目把 ADOConnection 放到 Form1 上设置它的 ConnectionString再放 ADOQuery、DataSource、DBGrid形成一个最简单的查询链路。我的习惯是把 ADOConnection 放在单独的 DataModule 里而不是和界面混在同一个 Form这样多个窗体可以共用同一个连接。课程设计规模小不这样做也行但复用性会好很多。需要分清三类组件的职责ADOConnection 负责连接和事务ADOQuery 负责执行 SQL 并返回结果集DataSource 是 ADOQuery 和 DBGrid 之间的桥梁。ADOTable 也可以直接用但它的灵活性比 ADOQuery 差查询条件变化多的时候不建议用。界面组件里 DBGrid 只负责显示DBNavigator 提供上一条、下一条按钮你也可以不用 DBNavigator自己写按钮调用 ADOQuery 的 First、Next、Prior、Last 方法逻辑更清晰。一个最简查询示例在登录后的主窗体里查询开课情况// 双斜杠后面是说明ADOQuery1 的 Connection 已指向 ADOConnection1 ADOQuery1-Close(); ADOQuery1-SQL-Clear(); ADOQuery1-SQL-Add(SELECT 课号, 课名, 学分, 人数限制, 选课人数); ADOQuery1-SQL-Add(FROM 课程); ADOQuery1-Open(); // Open 执行查询并返回结果集这里“人数限制”和“选课人数”是课程表里的字段名如果你建表时用了别的名称SQL 里就要改成对应的字段。Open 用于 SELECT 语句返回结果集可以显示在 DBGrid如果是 INSERT、UPDATE、DELETE 语句要改用 ExecSQL否则会报“数据集未打开”之类的错误。这是 C Builder 新手常踩的坑记住一个规则查询用 Open增删改用 ExecSQL。3.4 写选课和退课事务是这堂课的隐形重点选课和退课是写操作也是最需要讲事务的地方。单机版系统看起来不需要并发控制但事务的作用不只是并发当一次操作要同时修改选课表和课程表时事务能保证这两步要么都成功要么都失败。比如选课时先插入选课记录再给课程表的“选课人数”加一如果插入成功但更新课程表失败选课人数会滞后后续选课就会产生超选。加上事务失败时回滚数据保持一致。选课逻辑用伪代码描述如下if (选课表已存在相同学号和课号) return 不能重复选课; if (课程.选课人数 课程.人数限制) return 该课程人数已满; if (课程.先行课号非空 成绩表中无该先修课记录) return 未满足先修课条件; begin transaction; insert into 选课表(学号, 课号) values(...); update 课程表 set 选课人数 选课人数 1 where 课号 ...; commit;对应到 C Builder 里使用 ADOConnection 的 BeginTrans、CommitTrans 和 RollbackTrans 承接事务。代码结构如下try { ADOConnection1-BeginTrans(); // 插入选课记录 ADOQuery1-SQL-Text INSERT INTO 选课表(学号, 课号) VALUES(:xh, :kh); ADOQuery1-Parameters-ParamByName(xh)-Value StudentID; ADOQuery1-Parameters-ParamByName(kh)-Value CourseID; ADOQuery1-ExecSQL(); // 更新课程表选课人数 ADOQuery1-SQL-Text UPDATE 课程 SET 选课人数 选课人数 1 WHERE 课号 :kh; ADOQuery1-Parameters-ParamByName(kh)-Value CourseID; ADOQuery1-ExecSQL(); ADOConnection1-CommitTrans(); } catch (...) { ADOConnection1-RollbackTrans(); throw; }逻辑说明先开启事务插入选课表再更新课程表人数最后提交。代码里使用参数化查询用 Parameters 的 ParamByName 给 :xh 和 :kh 赋值避免直接把用户输入拼进 SQL 造成中文乱码或引号问题。需要注意 ADOQuery 在执行 ExecSQL 时如果 SQL 里有参数参数类型默认可能被推断为字符串当字段是数值类型时建议显式设置 DataType否则某些情况下会报类型不匹配。退课逻辑相对简单删除选课表里学号和课号对应的记录同时把课程表的选课人数减一。但要加一个前提如果成绩表里已经有了这门课的成绩则不允许再退课。这个判断可以和“查询成绩”功能共享同一个查询方法。4. 避坑清单与报告交付五个最容易丢分的细节4.1 数据库连接和中文乱码问题现象一BDE Administrator 里右击 odbc1Open 时弹出 Database Login 对话框无论怎么输密码都报连接失败回到 C Builder 的 ADOConnection 测试连接也显示“未指定的错误”。原因ODBC 数据源并没有真正配置成功常见于用户 DSN 和系统 DSN 混用。C Builder 以当前登录用户运行读的是用户 DSN但你在 ODBC 管理器里把数据源加到了系统 DSN两者没有对齐。解决在控制面板的 ODBC 数据源管理器里先看“用户 DSN”和“系统 DSN”两个页签确认你加的 DSN 在哪个页签下。建议直接加到“系统 DSN”然后在 C Builder 的 ADOConnection 连接界面里选择“使用数据源名称”看下拉框里能否看到该名称能看到就一定能连上。现象二通过 ADOQuery 向 Access 表写入中文数据库里显示成问号或乱码。原因C Builder 6.0 默认字符串是 ANSI 编码Access 2000 内部使用 Unicode老版本 ODBC 驱动在字符集转换上不完善另外直接在 SQL 文本里拼接中文字符串也可能因为编码不一致而出错。解决尽量用参数化查询避免拼接中文字面量连接字符串中可以尝试加入字符集相关选项但这个选项在老版本驱动里不一定生效。最稳妥的方式是SQL 语句里不出现中文字符中文数据都通过参数传进去字段列表和条件用英文列名。这个方法我用了很多年极少再遇到乱码。现象三ADOQuery 执行 SELECT 后DBGrid 显示正常但双击编辑或提交后报“无法为可更新的查询设置游标”。原因C Builder 默认会为 ADOQuery 的结果集打开可更新的游标如果查询涉及多表连接或 SQL 里带聚合函数、GROUP BY结果集变成只读更新就会失败。解决对于这种查询可以把 CursorLocation 设为 clUseServer或者把 LockType 设为 ltReadOnly业务上的增删改单独用 ExecSQL 完成不走 DBGrid 的内置编辑功能。很多“成绩汇总”查询都会踩到这个坑记住只读查询就不要做编辑。4.2 业务规则和报告文档的质量陷阱现象四同一位学生可以重复选同一门课系统居然没有拦截。原因选课表没有设置学号加课号的联合主键程序端也只在界面上做了提示没有在数据库层约束。这种缺陷在答辩时被老师一演示就会翻车。解决建表时就把选课表的主键设为学号和课号的复合主键插入前先用 SELECT 检查是否存在再执行插入。两道防线都要有因为复合主键能在数据库层兜底程序检查能提供友好的提示信息。现象五报告里放了用例图、序列图但状态图和对象模型缺失或者画的状态图与代码完全对不上。原因很多人把 UML 图当作事后补交的素材先写代码再画图导致图是“编”出来的和程序行为脱节。特别是状态图如果要画选课记录的状态至少需要有“可选、已选、已退、成绩已录”几个状态每个状态都必须对应代码里一个可观察的分支。解决调整工作流先用表格把对象的状态和触发事件列出来再画图。比如选课记录初始状态是“可选”学生执行“选课”后变成“已选”执行“退课”后变成“已退”老师录入成绩后变成“成绩已录”。把这个表画成图再对照代码里的 insert、delete、update 分支状态图就能和代码一一对应。还有一类问题是测试数据不足。指导书要求提交至少 20 个不同的对象测试序列意思是不能只写几条选课记录要覆盖各种场景重复选课、课程已满、先修课未修、退已录成绩的课、学号不存在、密码错误等。把这些边界情况列成一个表格每个用例写明输入数据、预期结果、实际结果、是否通过就是一份很扎实的测试报告。相比堆砌几十条一模一样的记录边界用例更有说服力。5. 二次开发思路把选课系统改造成可扩展的教学管理骨架选课系统最大的改进空间不在界面而在数据访问层。指导书里的 ADOQuery 直接写在窗体上查询逻辑和界面耦合在一起。如果要做二次开发我一般会把数据库操作单独封装成一个类把选课、退课、查询成绩封装成三个函数bool TCourseDB::SelectCourse(const String xh, const String kh); bool TCourseDB::DropCourse(const String xh, const String kh); TDataSet* TCourseDB::QueryScore(const String xh);这样改造以后界面按钮只负责调用函数和弹提示SQL 和事务全部收拢到数据访问层后面换成 MySQL 或 SQLite只需要改这一个类界面基本不动。更具体的改进方向有三个。第一把 Access 换成 SQLite连接方式从 ODBC 改成原生组件数据库文件仍是单文件但并发和编码会好很多。第二在选课逻辑里增加冲突检测比如同一时间不能选多门课这需要给课程表增加一个“上课时间”字段在选课前查一遍。第三把登录密码从明文升级为摘要存储Access 里存摘要值验证时重新计算再比较安全性和实现难度都不高。验证的方法也很简单先跑一遍原系统把选课、退课、成绩查询的每一个按钮操作记录下来再在改造后的系统里复现同样的操作序列对比两张选课表的最终数据。只要最终数据一致改造就是成功的。从那以后我每次做这类课程设计拆解都会先列出一份“操作序列加预期结果”清单再动代码这个方法帮我避开过很多次答辩时才发现数据不完整的尴尬。希望帮到你。本文还有配套的精品资源点击获取
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。