C语言教务管理系统:顺序表、二叉排序树与快速排序的实战剖析
简介这份资源是华南理工大学数据结构大作业“教务管理系统”的完整项目包面向正在完成同类课程设计的高校学生可用于理解数组、链表、树、栈、队列及哈希表在真实业务场景中的组织方法。压缩包共含56个文件整体仅1.92MB其中23个C源码与20个头文件构成教师端、学生端、教务员端三套程序主体9个文本文件提供课程、学生、教师等模拟数据3个exe可免环境直接运行另附1份实验报告文档方便对照分析系统架构。系统覆盖学籍存储、课程先修关系、操作撤销回溯、选课请求排队等典型功能并利用散列查找提升检索效率同时实现文件持久化读写完整呈现了从数据结构选型到算法优化的实践路径。资源附带的测试数据与说明能帮助快速验证各模块运行效果。目前已有699人学习/下载适合作为大作业选题、架构设计或答辩准备的实用范本。1. 从期末大作业说起教务管理系统为什么不能只用数组糊弄期末交课设时很多同学拿到“教务管理系统”的第一反应是不就是增删改查吗但真正动手拆完需求才发觉学生、课程、成绩三份数据怎么关联按学号查学生用什么结构按分数排名走什么算法处处都在考数据结构。这套源码是某高校数据结构期末大作业的一个完整实现C 语言写成把顺序表、二叉排序树、成绩链表、快速排序和文件持久化全部揉进一个可交互的控制台系统。它能解决的现实问题是几千个学生、上万条选课记录下怎样保证学号查询不线性扫描怎样保证退出程序后数据还能原样恢复。这篇解析围绕“结构怎么选、代码怎么组织、跑起来怎么验证、二次开发从哪下手”展开适合直接下载源码跑一遍验证也适合当课程设计的起点。2. 架构设计一张成绩单背后的三种数据结构2.1 需求建模先把大作业翻译成数据操作大作业的功能清单看起来很多实际归纳下来就四类一是学生档案的维护涉及录入、修改、按学号或姓名查询、按班级列出二是课程信息的维护涉及开课、删课、改学分三是选课与成绩涉及给某个学号录成绩、改分数、退选以及按课程统计平均分和挂科名单四是持久化程序启动时把上次保存的数据读回内存退出时把内存写回文件。数据规模按课程设计的常例来估算学生几千名选课记录上万条单机运行不需要并发。这四类需求落到数据结构上对应的其实是三种操作按主键定位一条记录、按一对多关系遍历子表、按某字段重排输出。主键定位服务于“输入学号立刻拿到这个学生的档案”一对多关系服务于“查某门课有多少人选了、每个人考了多少分”重排服务于“按总分排名、按单科排名、找出不及格名单”。只要这三个操作想清楚后面选型就不会跑偏。这里有个容易踩的思维误区一上来就纠结“链表还是数组”而不是先问“我的数据量是多少、操作频率最高的是哪种”。这门课设里最频繁的操作是按学号找人和遍历输出成绩单而不是随机插入一堆记录所以选型的天平从一开始就倾向连续存储。2.2 数据结构选型为什么顺序表打底、二叉排序树做索引学生和课程这两类主数据我用的都是顺序表成绩用的单链表学号索引用的二叉排序树。有人会问既然是数据结构大作业为什么不全部用链表显得“更有技术含量”我的习惯是反过来想哪个结构对当前操作代价最低就用哪个。学生档案的数量最多几千操作里出现频率最高的是按学号查人和遍历输出。顺序表在这两个场景上都有天然优势数组连续存储遍历时 CPU 缓存命中率远高于链表的 node 跳转按下标访问是 O(1)尾部追加也只需要在容量满时 realloc。代价是删除中间元素要搬数据但本项目删除后会用二叉排序树重建索引数组有序性根本不影响查询所以删除可以直接用“尾部元素覆盖被删位置”的办法把代价压成 O(1)。成绩记录是一对多的子表选课数无法提前预估一个学生退学要撤掉他名下所有成绩。单链表在这里比顺序表好伺候新成绩头插 O(1)按学生遍历自然走 next 指针按学号删除只需要维护一个移动指针这比在数组里反复 memmove 简单。学号索引选二叉排序树而不是哈希表是因为大作业通常要演示“树”这个考点同时 BST 支持顺序遍历将来做“按学号范围输出学生名单”这类需求不需要额外排序中序遍历一次就够。2.3 代码目录与模块边界头文件就是接口整个工程按编译单元拆成六个方向main.c 只做菜单循环和命令分发data.h 放结构体定义和公共常量list.c 管学生顺序表bst.c 管学号索引score.c 管成绩链表和统计sort.c 管排名用的排序file.c 管三个数据文件的读写。每个 .c 配一个同名 .h头文件里只暴露对外的函数签名结构体内部细节用 typedef 藏起来。文件职责对外关键符号data.h结构体、宏、返回码Student / Course / ScoreNodelist.c学生与课程的顺序表list_append / list_remove_by_indexbst.c学号索引bst_insert / bst_search / bst_rebuildscore.c成绩链表与统计score_add / score_remove_by_student / stat_coursesort.c快速排序与名次输出quick_sort_rangefile.c二进制持久化save_all / load_all这样分层的好处是菜单回调里不会出现“遍历链表找节点再 malloc”这种细节每个命令只调一个公开接口。二次开发想换存储格式只动 file.c想把学生索引从 BST 换成哈希只动 bst.c 的接口实现菜单一行不用改。data.h 里还会把所有接口的返回码定义成枚举比如 0 表示成功、-1 表示参数非法、-2 表示内存不足调用侧拿到返回码后统一提示而不是各自打印一段含糊的字符串。3. 核心模块实现结构体、索引、排序与落盘的代码细节3.1 数据模型三个结构体如何互相关联先看 data.h 里的三张主表#define MAX_NAME_LEN 32 #define MAX_CLASS_LEN 16 #define MAX_COURSE_LEN 32 typedef struct Student { long id; // 学号主键 char name[MAX_NAME_LEN]; // 姓名 char class[MAX_CLASS_LEN]; // 班级 } Student; typedef struct Course { int course_id; // 课程编号主键 char name[MAX_COURSE_LEN]; double credit; // 学分 } Course; typedef struct ScoreNode { long student_id; // 外键指向 Student.id int course_id; // 外键指向 Course.course_id double score; // 成绩 struct ScoreNode *next; // 下一门选课记录 } ScoreNode;设计上的关键点有三处。第一学号统一用 long 不用 int课程设计里学号可能长达九到十位int 在部分 32 位平台上一旦超过 21 亿就直接溢出成负数用 long 把余量留足。第二学生姓名用定长数组虽然比 char* 多占一点内存但换来的是结构体可以直接 fwrite 落盘不用单独处理字符串的内存释放和深拷贝。第三ScoreNode 用两个外键字段关联另外两张表关联的是整数而不是字符串就是为了避开“改名后成绩对不上号”的问题。3.2 顺序表管理学生档案的追加、删除与动态扩容学生表封装成 StuList底层是一个带容量和大小的动态数组typedef struct { Student *data; // 动态数组 int size; // 当前记录数 int capacity; // 当前容量 } StuList; void list_init(StuList *list, int cap); void list_destroy(StuList *list); int list_append(StuList *list, const Student *stu) { if (list NULL || stu NULL) return -1; if (list-size list-capacity) { int new_cap list-capacity * 2; // 倍增扩容 if (new_cap 8) new_cap 8; Student *tmp (Student *)realloc(list-data, new_cap * sizeof(Student)); if (tmp NULL) return -2; // 内存不足 list-data tmp; list-capacity new_cap; } list-data[list-size] *stu; return 0; }扩容用倍增而不是每次加一理由很现实反复 realloc 会把内存搬来搬去从几个学生增长到几千个学生时倍增值可以让 realloc 的次数降到十几次均摊到每次 append 上接近 O(1)。这里 realloc 的返回值没有直接覆盖原指针而是先存进 tmp只有成功后才更新 list-data这个习惯能避免 realloc 失败时原数据指针被置空导致的内存丢失事故。删除操作选择“覆盖尾部”来保持 O(1)int list_remove_by_index(StuList *list, int idx) { if (list NULL || idx 0 || idx list-size) return -1; list-data[idx] list-data[list-size - 1]; list-size--; return 0; }代价是学生顺序会乱但前面说过本项目的查询全部走 BST 索引删除后重建索引就能恢复一致数组本身无需保持有序。如果将来要做“按班级连续输出学号段”再改成前移式删除也不难这就是“性能换语义”的取舍。3.3 二叉排序树索引pos 字段如何指挥顺序表BST 节点里除了学号还要存一个 pos 字段它指向这个学生在顺序表里的下标相当于索引的“书签”typedef struct BSTNode { long id; // 学号 int pos; // 对应 StuList.data[] 的下标 struct BSTNode *left; struct BSTNode *right; } BSTNode; BSTNode* bst_insert(BSTNode *root, long id, int pos) { if (root NULL) { BSTNode *node (BSTNode *)malloc(sizeof(BSTNode)); node-id id; node-pos pos; node-left node-right NULL; return node; // 挂到父节点的左或右 } if (id root-id) root-left bst_insert(root-left, id, pos); else if (id root-id) root-right bst_insert(root-right, id, pos); else root-pos pos; // 学号重复更新位置 return root; } int bst_search(BSTNode *root, long id) { while (root) { if (id root-id) return root-pos; if (id root-id) root root-left; else root root-right; } return -1; // 查不到 }bst_search 的返回值就是顺序表下标调用方拿到下标后直接 list-data[pos] 就能读档案复杂度从线性扫描的 O(n) 降到平均 O(log n)。这里有个大作业里常见的耦合问题顺序表删除学生后被删下标之后所有元素的位置都变了BST 节点里的 pos 就成了过时数据。解决思路是在公共接口里约定“删除后统一重建索引”BSTNode* bst_rebuild(const StuList *list) { BSTNode *root NULL; for (int i 0; i list-size; i) root bst_insert(root, list-data[i].id, i); return root; }第一次写这套代码时我直接把新 root 覆盖旧 root结果内存泄漏。这里要记得先遍历旧树 free 所有节点再重建或者在调用侧把旧树句柄交给 bst_destroy。另外如果想给索引增加“按学号段输出学生”的能力可以加一个中序遍历接口BST 天然有序中序遍历输出出来的就是升序学号序列。3.4 成绩链表与统计排序一对多关系下的遍历与排名成绩记录全部挂在一条单链表上新增记录用头插void score_add(ScoreNode **head, long sid, int cid, double sc) { ScoreNode *node (ScoreNode *)malloc(sizeof(ScoreNode)); node-student_id sid; node-course_id cid; node-score sc; node-next *head; // 新节点成为链表头 *head node; }按学号删除成绩是常见的级联操作删除学生时必须同时清掉他名下的所有选课记录void score_remove_by_student(ScoreNode **head, long sid) { ScoreNode *prev NULL, *cur *head; while (cur) { if (cur-student_id sid) { ScoreNode *dead cur; if (prev) prev-next cur-next; else *head cur-next; cur cur-next; free(dead); } else { prev cur; cur cur-next; } } }这段代码有两个细节值得抠。一是入参用二级指针 ScoreNode **head因为删除头节点时函数内部要改写链表头本身只传一级指针改不了调用方的 head二是删除节点后 cur 要继续往后走但 prev 要保持不变因为同一个学生可能有多门课不能漏删我在初版里把 cur 提前 next 了导致挂在后面的同学生成绩记录全部悬空后来加测试数据才抓出来。成绩统计需要把某个课程的学生成绩单独抽出来排序排序目标用轻量结构体数组装typedef struct { long student_id; double score; } ScoreItem; void quick_sort_range(ScoreItem *arr, int left, int right, int asc) { if (left right) return; int i left, j right; double pivot arr[(left right) / 2].score; while (i j) { while (asc ? arr[i].score pivot : arr[i].score pivot) i; while (asc ? arr[j].score pivot : arr[j].score pivot) j--; if (i j) { ScoreItem t arr[i]; arr[i] arr[j]; arr[j] t; i; j--; } } quick_sort_range(arr, left, j, asc); quick_sort_range(arr, i, right, asc); }这个写法是取区间中点作为 pivot 的快速排序原地交换空间上只有递归栈。asc 参数控制升序降序asc1 时找分界用的是小于号和大于号成绩从低到高排asc0 时比较方向反过来从高到低排。对几百条成绩来说排序时间在毫秒级即使上万条也扛得住要是换成选择排序排名操作在数据量上来后会明显卡顿。需要注意快速排序是不稳定排序成绩并列时名次先后不保证如果课设要求“相同分数按学号升序”排序前要把学号作为次要条件比较函数里写成先比 score 再比 student_id。3.5 文件持久化断电后如何把数据原样找回来学生和课程是顺序表直接“先写数量、再写数组”就行int save_students(const StuList *list, const char *path) { FILE *fp fopen(path, wb); if (fp NULL) return -1; fwrite(list-size, sizeof(int), 1, fp); // 先写记录数 fwrite(list-data, sizeof(Student), list-size, fp); // 再写数组 fclose(fp); return 0; } int load_students(StuList *list, const char *path) { FILE *fp fopen(path, rb); int n 0; if (fp NULL) return -1; fread(n, sizeof(int), 1, fp); if (n 0 || n 100000) { fclose(fp); return -2; } // 脏数据保护 list-capacity n * 2; list-data (Student *)malloc(sizeof(Student) * list-capacity); fread(list-data, sizeof(Student), n, fp); list-size n; fclose(fp); return n; }读入时的 n 必须做合法性检查否则一个损坏文件可能让 malloc 申请几个 G 内存然后直接崩溃。成绩链表不能直接 fwrite 整条链表因为 ScoreNode 里的 next 是指针写进文件的是内存地址下次进程启动读回来就是悬空指针。常见做法是像下面这样先铺平成数组再落盘加载时逐条头插重建int save_scores(const ScoreNode *head, const char *path) { FILE *fp fopen(path, wb); int cnt 0; for (const ScoreNode *p head; p; p p-next) cnt; fwrite(cnt, sizeof(int), 1, fp); for (const ScoreNode *p head; p; p p-next) { long sid p-student_id; int cid p-course_id; double sc p-score; fwrite(sid, sizeof(long), 1, fp); fwrite(cid, sizeof(int), 1, fp); fwrite(sc, sizeof(double), 1, fp); } fclose(fp); return 0; }字段逐个写而不是写整个结构体就是为了把 next 指针隔离在文件之外。三条数据文件都建议放在 data/ 目录下路径在 data.h 里用宏定义这样二次开发换目录只需要改一处。4. 避坑记录文件持久化与索引维护的五个教训4.1 数据落盘的两处翻车现场现象一程序退出时明明调了保存函数成绩文件也确实生成了第二天双击运行想继续录成绩程序一启动就段错误。原因初版 save_scores 直接把 ScoreNode 链表从头 fwrite 到文件把 next 指针的内存地址也写进去了加载时反序列化出来的 next 指向一个根本不存在的地址。解决改成上文那种“不写指针、逐字段铺平”的格式加载时从文件读出 sid/cid/score 三个值后重新 malloc 并头插。现象二学号录入后反复换环境编译换了个编译器结果控制台显示学号变成负数。原因学号在 data.h 里一度定义成 int九位数的学号在部分平台 int 直接溢出或者 printf 用了 %d 去打印 long 型。解决统一用 long 存学号所有格式化输出用 %ld且在 load 端检查 n 必须大于 0 且小于 100000防止脏文件把大小读成一个天文数字导致崩溃。4.2 索引与删除的关联问题现象三删除一个学生后按学号查询偶尔还能查出已删除的档案或者查出来的学生名字跟学号对不上。原因删学生只动了顺序表没动 BST索引里残留的 pos 指向了删除后被覆盖的新学生。解决删除接口签名设计成返回新的 BST 根节点在删除函数末尾调用一次 bst_rebuild代价是几千条记录的全量遍历对课设数据量来说可以忽略。现象四统计某课程成绩时人数永远比选课名单多出几条多出来的是已退学学生的残留记录。原因remove_student 只删了学生表成绩链表里该学号对应的节点还在。解决把成绩清理动作放进删除学生的业务流程里先调 score_remove_by_student 再调 list_remove_by_index顺序不能反因为成绩链表长度一变学生下标才能重新确定。这个场景大作业验收时经常被当场抓包属于最容易翻车的业务逻辑。4.3 运行环境的坑中文乱码与路径问题现象五源码文件保存成 UTF-8在 Windows 控制台编译运行所有中文菜单全变乱码但换到 Linux 终端又正常。原因Windows 控制台默认代码页是 GBK而 GCC/MinGW 默认把源码字符串按 UTF-8 编码编译两边编码不一致。解决在 main 函数开头调用 SetConsoleOutputCP(65001) 切到 UTF-8 输出或者源码另存为 GBK 编码。前者更适合保持工程文件统一 UTF-8后者只影响当前机器我一般推荐前者。还有一个容易被忽略的是路径Windows 下如果 data 目录不存在fopen 的路径中含 data/ 时会直接失败保存时不会立刻报错但加载时 fileNULL 就被当成“首次运行”用户以为数据丢了。解决main 里先调用一次 EnsureDataDir用 mkdir(data) 建目录再进菜单循环。5. 运行与验证从源码到可以演示的完整流程5.1 编译环境与构建命令这套代码只依赖 C 标准库没有第三方包。Linux/macOS 下直接用 gcc 或 clangWindows 下装 MinGW-w64 后也能编过。下载工程后在源码目录直接执行gcc -stdc11 -Wall -Wextra -o edu main.c list.c bst.c score.c sort.c file.c-Wall -Wextra 打开之后初版代码会暴露几个“变量声明未使用”和“符号隐式声明”的警告建议一条都别放过。如果目录下已经放了 Makefile直接 make ./edu 即可没有 Makefile 就手动敲上面的 gcc 命令注意顺序目标文件 edu 放在前面后面按依赖关系列出全部 .c 文件。注意Windows 下如果控制台中文乱码先按第 4 章第 3 条的方法在 main 里设置代码页再重新编译。编译成功后启动进程会先由 load_all 尝试从 data/ 下读取三个 .dat 文件读不到就按空数据初始化不阻塞用户录入。5.2 菜单主循环与命令分发main.c 不做任何业务只负责把命令号翻译成各个模块的调用int main(void) { StuList students; ScoreNode *scores NULL; list_init(students, 8); load_all(students, scores); // 恢复上次会话 BSTNode *idx bst_rebuild(students); // 重建索引 int running 1, cmd 0; while (running) { print_menu(); printf(请选择1-90 退出: ); if (scanf(%d, cmd) ! 1) break; // 非法输入直接退出 switch (cmd) { case 1: add_student(students, idx); break; case 2: remove_student(students, scores, idx); break; case 3: query_student(students, idx); break; case 4: add_score(scores); break; case 5: stat_course(scores); break; case 6: rank_students(students, scores); break; case 0: save_all(students, scores); running 0; break; } } bst_destroy(idx); list_destroy(students); score_destroy(scores); return 0; }注意看两个设计点。第一remove_student 的入参同时带了 students、scores 和 idx因为删除操作涉及顺序表、成绩链表、索引三处联动函数内部自己保证一致性第二保存动作只挂在 0 号退出命令上用户如果强行关终端数据确实会丢到上一轮保存点这是控制台课设最常见的行为演示时一定要提醒自己走菜单退出。5.3 整链验证从录入到重启拿到代码后不要急着通读全部源码先用一组可控数据跑通主链路验证点用表格列清楚步骤操作预期结果1添加学生学号输入 20240001菜单切回主界面2添加课程课程号 101课程列表出现该课程3为 20240001 录入课程 101 成绩 88成绩链表新增一条记录4按学号查询 20240001显示姓名、班级、课程成绩 885按课程 101 统计输出平均分 88人数 16选 0 退出再 ./edu 启动直接按学号查能查到同一份档案和成绩第六步是这条链路里最关键的一步它验证的是文件持久化的完整性学生表走的是数组整体读写成绩表走的是逐字段铺平重建两者加载路径不同只要启动后能查到昨天录入的数据就说明两份文件的序列化都没写错。接着再做删除测试删除 20240001再查成绩统计人数应该是 0这一步能验证级联删除是否生效。最后可以往学生表里塞 2000 条学号连续递增的记录手动感受一下 BST 在数据几乎有序时的性能退化这就是紧接着要聊的改造点。想快速造批量数据的话写个 for 循环调 list_append 就好不必真的在菜单里按两千次回车。6. 二次开发把大作业改造成可维护项目的三条路线6.1 索引改造学号索引从 BST 换成哈希表如果查询性能是首要目标把 bst.c 的接口实现整体替换成哈希表即可。学号用 long 做 key哈希函数用除留余数法id % table_size冲突用链表法解决。接口函数保持 bst_insert / bst_search / bst_rebuild 三个签名不动菜单和调用侧一行不改。table_size 取大于学生容量两倍的质数装填因子维持在 0.5 上下平均查找 O(1)。改造后的对比实验很好写同一批 5000 条学号BST 退化时可能要两千次比较哈希表只会触发零星几次冲突。6.2 存储升级从自定义二进制文件到 SQLite自定义二进制格式最怕两个问题结构体布局依赖编译器的字节对齐换编译器可能读不了旧文件成绩、选课等关联数据一旦遗漏级联删除整个库的引用完整性就崩了。升级路径是引入 SQLite把三张表建成真正的数据库表外键约束交给数据库层。迁移思路是先用现成的 save_all 导出一份 CSV再写个小脚本把 CSV 灌进 SQLite 新表。代价是工程里多了一个 sqlite3 的库文件构建命令要补 -lsqlite3但对后续扩展相当值得。6.3 分层重构把菜单回调里的业务规则搬进模块接口最后一条路线针对的是代码可维护性。初版的菜单回调里有不少“边读链表边打印”的代码统计平均分、判断是否及格这类业务规则散落在 main.c 里。重构时把规则收回到 score.c 的公开接口例如 stat_course 直接返回平均分和挂科名单rank_students 直接输出完整排名表菜单函数只管调用。再把每个接口的返回码整理成 data.h 里的常量枚举调用侧统一做错误提示。做完这层改造就可以开始给 stat_course 这类纯函数补单元测试输入一组成绩断言平均值大作业阶段就算迈入工程化门槛了。这套代码我前后拆过两遍第一遍只顾着跑通菜单第二遍才意识到“删除学生必须连带清成绩和索引”这种一致性问题的分量。从那以后每次拿到课设源码我都会先做一遍“录入-重启-再查询”的持久化闭环测试再动手改任何一行。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

非合作博弈与ADMM:多产消者分布式能量共享优化调度

非合作博弈与ADMM:多产消者分布式能量共享优化调度

1. 从“用电户”到“产消者”:这个题目到底在解决什么问题先说结论:这个题目研究的是一群既装光伏、又带储能、还有灵活负荷的家庭或微网用户,在彼此之间进行电能共享时,如何通过博弈找到一个让所有参与者都满意的交易方案。传统的…

2026/10/17 12:59:12 阅读更多 →
农业数字化落地难?关键在于既懂农艺又懂数据的复合型人才

农业数字化落地难?关键在于既懂农艺又懂数据的复合型人才

农业现代化喊了很多年,数字农业也不是新词,但说实话,真正落到田埂上、大棚里、养殖场里,能让人眼前一亮、愿意拍大腿说"这玩意儿真管用"的案例,还是太少了。很多数字化项目搞成了"领导参观时的演示屏&q…

2026/10/17 12:59:12 阅读更多 →
RedisInsight可视化工具深度解析:实时内存分析与集群拓扑管理

RedisInsight可视化工具深度解析:实时内存分析与集群拓扑管理

1. 项目概述:为什么RedisInsight成了我每天打开三次的工具RedisInsight不是那种装完就吃灰的“可视化玩具”,它是我在某跨平台系统性能调优阶段,从第7个备选方案里最终留下的唯一主力工具。核心关键词就三个:RedisInsight、Redis可…

2026/10/17 12:59:12 阅读更多 →

最新新闻

三相电信号采集电路设计:从互感器选型到ADC同步采样与相位校准

三相电信号采集电路设计:从互感器选型到ADC同步采样与相位校准

简介:《三相电信号采集电路设计》是一份面向电能质量监测、电力电子装置应用及供电系统运维等场景的技术资料,适合从事电网信号采集、嵌入式硬件设计的工程师与相关专业学生阅读。资源围绕三相电压电流信号的精密采集展开,涵盖互感器选型、频…

2026/10/17 19:27:40 阅读更多 →
SCAS与REPNE/REPE前缀全解:汇编字符串扫描的核心机制

SCAS与REPNE/REPE前缀全解:汇编字符串扫描的核心机制

写汇编的人都知道,字符串处理是这门语言最带劲的领域之一。而SCASB/SCASW这两条指令,配合REPNE/REPE重复前缀,能让你只用一条指令就把“在内存里找个字符 / 找个值 / 找到某个不匹配的位置”这种循环给干完。说实话,当年我第一次在…

2026/10/17 19:27:40 阅读更多 →
用友NC65安装全流程:Oracle表空间与数据源配置实战

用友NC65安装全流程:Oracle表空间与数据源配置实战

简介:这是一份面向用友NC65及NCC高版本实施顾问的完整安装操作手册,专为自学搭建测试环境的新手设计,能解决官网资料零散、上手门槛高的问题。资源为单个doc文档,压缩包仅933KB,便于携带和查阅,内容覆盖从O…

2026/10/17 19:27:40 阅读更多 →
SQL Server 2008误删恢复:简单模式下无备份数据抢救方案

SQL Server 2008误删恢复:简单模式下无备份数据抢救方案

简介:本资源是一份面向SQL Server数据库管理员与运维工程师的实战型数据恢复指南,聚焦SQL Server 2008环境下误删除数据的紧急抢救方案。内容系统梳理了基于事务日志恢复的三大典型场景:当具备完整备份且恢复模式为“完全(Full&am…

2026/10/17 19:27:40 阅读更多 →
DeepSeek Harness插件机制详解:从安装配置到开发实战

DeepSeek Harness插件机制详解:从安装配置到开发实战

1. 插件机制到底解决了什么问题1.1 从“一个能跑的壳”到“一个能干活的工具”DeepSeek Harness(后面我统一叫 dsh)刚装好的时候,它本质上就是一个能加载模型、能对话、能读本地文件的命令行壳子。你问它问题它能答,你让它读个文件…

2026/10/17 19:27:40 阅读更多 →
2026年最新全球AI大模型深度研究报告:用TaoToken统一Key实测主流模型能力边界

2026年最新全球AI大模型深度研究报告:用TaoToken统一Key实测主流模型能力边界

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 19:26:40 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →