<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>阶段项目 on 自学C大纲：从内存到数据库</title><link>https://simgor001.github.io/c-learning-companion/projects/index.html</link><description>Recent content in 阶段项目 on 自学C大纲：从内存到数据库</description><generator>Hugo</generator><language>zh</language><atom:link href="https://simgor001.github.io/c-learning-companion/projects/index.xml" rel="self" type="application/rss+xml"/><item><title>阶段项目1：成绩统计器</title><link>https://simgor001.github.io/c-learning-companion/projects/project-1.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://simgor001.github.io/c-learning-companion/projects/project-1.html</guid><description>&lt;h2 id="这个项目练什么"&gt;这个项目练什么&lt;a class="anchor" href="#%e8%bf%99%e4%b8%aa%e9%a1%b9%e7%9b%ae%e7%bb%83%e4%bb%80%e4%b9%88"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;整合 ch1–ch6 的能力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ch1–2&lt;/strong&gt;：变量、类型、&lt;code&gt;int&lt;/code&gt; 和 &lt;code&gt;char&lt;/code&gt; 数组。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch3&lt;/strong&gt;：&lt;code&gt;while&lt;/code&gt; 循环读入，&lt;code&gt;if&lt;/code&gt; 判断及格。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch4&lt;/strong&gt;：把统计和查找拆成函数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch5&lt;/strong&gt;：用 &lt;code&gt;struct&lt;/code&gt; 数组存一批记录，&lt;code&gt;count&lt;/code&gt; 记录实际数量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch6&lt;/strong&gt;：&lt;code&gt;char name[32]&lt;/code&gt; 存姓名，&lt;code&gt;strcmp&lt;/code&gt; 比较。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="任务要求"&gt;任务要求&lt;a class="anchor" href="#%e4%bb%bb%e5%8a%a1%e8%a6%81%e6%b1%82"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;声明一个固定容量的学生表 &lt;code&gt;struct Student table[100]&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;循环读入：每行输入 &lt;code&gt;学号 姓名 分数&lt;/code&gt;，学号输入 &lt;code&gt;0&lt;/code&gt; 停止。&lt;/li&gt;
&lt;li&gt;输入格式错误（学号非数字、姓名或分数缺失）时，打印提示并跳过，不崩溃。&lt;/li&gt;
&lt;li&gt;容量用满时，打印提示并停止录入，已录入的数据不受影响。&lt;/li&gt;
&lt;li&gt;录入结束后，打印统计：最高分、最低分、平均分（保留 2 位小数）、及格（≥60）人数。&lt;/li&gt;
&lt;li&gt;打印全部学生列表。&lt;/li&gt;
&lt;li&gt;进入按姓名查找循环：输入姓名，打印对应记录；输入 &lt;code&gt;.&lt;/code&gt; 退出查找。&lt;/li&gt;
&lt;li&gt;查找不到时打印友好提示。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="数据与接口约定"&gt;数据与接口约定&lt;a class="anchor" href="#%e6%95%b0%e6%8d%ae%e4%b8%8e%e6%8e%a5%e5%8f%a3%e7%ba%a6%e5%ae%9a"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="course-codeblock course-codeblock-c"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#define MAX_STUDENTS 100
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#define NAME_LEN 32
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; Student {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#9aedfe"&gt;char&lt;/span&gt; name[NAME_LEN];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; score;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;// 打印最高分、最低分、平均分、及格人数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#9aedfe"&gt;void&lt;/span&gt; &lt;span style="color:#57c7ff"&gt;print_stats&lt;/span&gt;(&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; Student &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;table, &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; count);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;// 按姓名查找，返回下标；找不到返回 -1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; &lt;span style="color:#57c7ff"&gt;find_by_name&lt;/span&gt;(&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; Student &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;table, &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; count, &lt;span style="color:#ff6ac1"&gt;const&lt;/span&gt; &lt;span style="color:#9aedfe"&gt;char&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;name);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id="测试输入正常"&gt;测试输入（正常）&lt;a class="anchor" href="#%e6%b5%8b%e8%af%95%e8%be%93%e5%85%a5%e6%ad%a3%e5%b8%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="course-codeblock course-codeblock-text"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ 1001 Alice 85
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ 1002 Bob 92
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ 1003 Carol 55
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ 1004 Dave 73
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ 1005 Eve 68
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ Alice
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ Bob
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ Eve
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id="错误输入"&gt;错误输入&lt;a class="anchor" href="#%e9%94%99%e8%af%af%e8%be%93%e5%85%a5"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="course-codeblock course-codeblock-text"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ abc Alice 85
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ 1002 Bob
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ 1003
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ 1004 Carol 105
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ 0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;上面的输入依次覆盖：学号不是数字、缺少分数、缺少姓名和分数，以及录入 105 分（分数范围由使用者负责校验）。&lt;/p&gt;</description></item><item><title>阶段项目2：可保存的学生表</title><link>https://simgor001.github.io/c-learning-companion/projects/project-2.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://simgor001.github.io/c-learning-companion/projects/project-2.html</guid><description>&lt;h2 id="这个项目练什么"&gt;这个项目练什么&lt;a class="anchor" href="#%e8%bf%99%e4%b8%aa%e9%a1%b9%e7%9b%ae%e7%bb%83%e4%bb%80%e4%b9%88"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;整合 ch7–ch10 的能力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ch7–8&lt;/strong&gt;：&lt;code&gt;struct Student&lt;/code&gt; 和结构体数组。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch9&lt;/strong&gt;：&lt;code&gt;fopen/fclose/fscanf/fprintf&lt;/code&gt;，文件保存与读取。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch10&lt;/strong&gt;：&lt;code&gt;malloc/realloc/free&lt;/code&gt;，动态容量 + 指针传地址。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="任务要求"&gt;任务要求&lt;a class="anchor" href="#%e4%bb%bb%e5%8a%a1%e8%a6%81%e6%b1%82"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;动态学生表：初始容量 4，每次容量不够时 &lt;code&gt;realloc&lt;/code&gt; 翻倍。&lt;/li&gt;
&lt;li&gt;启动时调用 &lt;code&gt;load_students(&amp;quot;students.txt&amp;quot;)&lt;/code&gt; 尝试加载已有文件。
&lt;ul&gt;
&lt;li&gt;文件不存在时，从空表开始，&lt;strong&gt;不报错&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;文件中某行格式错误（字段不足、分数非数字）时，打印行号和原因，跳过该行，继续加载后续行。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;交互菜单：输入 &lt;code&gt;a&lt;/code&gt; 添加、&lt;code&gt;l&lt;/code&gt; 列出、&lt;code&gt;f&lt;/code&gt; 按 id 查找、&lt;code&gt;d&lt;/code&gt; 按 id 删除、&lt;code&gt;q&lt;/code&gt; 保存并退出。&lt;/li&gt;
&lt;li&gt;退出时调用 &lt;code&gt;save_students(&amp;quot;students.txt&amp;quot;)&lt;/code&gt; 保存。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;malloc&lt;/code&gt; 或 &lt;code&gt;realloc&lt;/code&gt; 失败时，打印错误，释放已分配的资源，退出程序。&lt;/li&gt;
&lt;li&gt;删除不存在的 id 时，打印&amp;quot;未找到&amp;quot;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="数据与接口约定"&gt;数据与接口约定&lt;a class="anchor" href="#%e6%95%b0%e6%8d%ae%e4%b8%8e%e6%8e%a5%e5%8f%a3%e7%ba%a6%e5%ae%9a"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="course-codeblock course-codeblock-c"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#include&lt;/span&gt; &lt;span style="color:#78787e"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#78787e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#include&lt;/span&gt; &lt;span style="color:#78787e"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span style="color:#78787e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#include&lt;/span&gt; &lt;span style="color:#78787e"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span style="color:#78787e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#define NAME_LEN 32
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; Student {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#9aedfe"&gt;char&lt;/span&gt; name[NAME_LEN];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; score;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; StudentTable {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; Student &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;students; &lt;span style="color:#78787e"&gt;// 动态数组
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; count;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; capacity;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;// 初始化表，分配初始容量
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; &lt;span style="color:#57c7ff"&gt;table_init&lt;/span&gt;(&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; StudentTable &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;t, &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; init_cap);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;// 销毁表，释放内存
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#9aedfe"&gt;void&lt;/span&gt; &lt;span style="color:#57c7ff"&gt;table_free&lt;/span&gt;(&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; StudentTable &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;t);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;// 添加一条记录，容量不够时自动扩容；返回 0 成功，-1 失败
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; &lt;span style="color:#57c7ff"&gt;table_add&lt;/span&gt;(&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; StudentTable &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;t, &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; id, &lt;span style="color:#ff6ac1"&gt;const&lt;/span&gt; &lt;span style="color:#9aedfe"&gt;char&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;name, &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; score);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;// 按 id 查找，返回下标；找不到返回 -1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; &lt;span style="color:#57c7ff"&gt;table_find&lt;/span&gt;(&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; StudentTable &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;t, &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; id);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;// 按 id 删除；返回 0 成功，-1 未找到
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; &lt;span style="color:#57c7ff"&gt;table_delete&lt;/span&gt;(&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; StudentTable &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;t, &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; id);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;// 列出全部记录
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#9aedfe"&gt;void&lt;/span&gt; &lt;span style="color:#57c7ff"&gt;table_list&lt;/span&gt;(&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; StudentTable &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;t);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;// 从文件加载；返回 0 成功，-1 部分错误
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; &lt;span style="color:#57c7ff"&gt;load_students&lt;/span&gt;(&lt;span style="color:#ff6ac1"&gt;const&lt;/span&gt; &lt;span style="color:#9aedfe"&gt;char&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;filename, &lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; StudentTable &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;t);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;// 保存到文件；返回 0 成功，-1 失败
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; &lt;span style="color:#57c7ff"&gt;save_students&lt;/span&gt;(&lt;span style="color:#ff6ac1"&gt;const&lt;/span&gt; &lt;span style="color:#9aedfe"&gt;char&lt;/span&gt; &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;filename, &lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; StudentTable &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;t);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;文件格式：每行 &lt;code&gt;学号 姓名 分数&lt;/code&gt;，以空格分隔。&lt;/p&gt;</description></item><item><title>阶段项目3：数据结构查找对比器</title><link>https://simgor001.github.io/c-learning-companion/projects/project-3.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://simgor001.github.io/c-learning-companion/projects/project-3.html</guid><description>&lt;h2 id="这个项目练什么"&gt;这个项目练什么&lt;a class="anchor" href="#%e8%bf%99%e4%b8%aa%e9%a1%b9%e7%9b%ae%e7%bb%83%e4%bb%80%e4%b9%88"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;整合 ch11–ch19 的能力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ch11&lt;/strong&gt;：链表节点操作（本项目中 BST 使用左右孩子指针）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch15&lt;/strong&gt;：排序（为二分准备有序数组）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch16&lt;/strong&gt;：二分查找。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch17&lt;/strong&gt;：二叉搜索树的插入和查找。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch18&lt;/strong&gt;：哈希表（链地址法）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch19&lt;/strong&gt;：操作计数、测试不变量。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="任务要求"&gt;任务要求&lt;a class="anchor" href="#%e4%bb%bb%e5%8a%a1%e8%a6%81%e6%b1%82"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;生成 31 个 id（用简单规则生成即可，如 1001 到 1031），作为统一数据集。&lt;/li&gt;
&lt;li&gt;构建 4 种结构：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;无序数组&lt;/strong&gt;：直接把 id 放入数组。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;有序数组&lt;/strong&gt;：对 id 数组排序（用插入排序），然后二分查找。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;二叉搜索树&lt;/strong&gt;：逐个插入 id 构建 BST。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;哈希表&lt;/strong&gt;：用链地址法（&lt;code&gt;HT_SIZE = 7&lt;/code&gt;），冲突时链表追加。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;对一组查询 id（包含存在的和不存在的），分别统计&lt;strong&gt;每次查找的比较次数&lt;/strong&gt;。
&lt;ul&gt;
&lt;li&gt;查找不存在的 id 时，也要统计比较次数：线性要扫完整个数组才算确认不存在。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;打印对比表，表头：id、查询直线次数、二分次数、BST次数、哈希次数。&lt;/li&gt;
&lt;li&gt;可选增强（加分）：扩展到 1000 条随机数据，比较 100 次随机查询，打印各结构的总比较次数。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="数据与接口约定"&gt;数据与接口约定&lt;a class="anchor" href="#%e6%95%b0%e6%8d%ae%e4%b8%8e%e6%8e%a5%e5%8f%a3%e7%ba%a6%e5%ae%9a"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="course-codeblock course-codeblock-c"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#define HT_SIZE 7
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;// 数组结构
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; ArrayData {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; ids[&lt;span style="color:#ff9f43"&gt;100&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; count;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;// BST 节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; BSTNode {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; BSTNode &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;left;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; BSTNode &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;right;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;// 哈希表节点
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; HashNode {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; HashNode &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;next;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;核心函数签名：&lt;/p&gt;</description></item><item><title>阶段项目4：命令行学生数据库</title><link>https://simgor001.github.io/c-learning-companion/projects/project-4.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://simgor001.github.io/c-learning-companion/projects/project-4.html</guid><description>&lt;h2 id="这个项目练什么"&gt;这个项目练什么&lt;a class="anchor" href="#%e8%bf%99%e4%b8%aa%e9%a1%b9%e7%9b%ae%e7%bb%83%e4%bb%80%e4%b9%88"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;整合 ch20–ch29 的能力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ch20–21&lt;/strong&gt;：数组版数据库、动态数据库表。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch22–23&lt;/strong&gt;：链表版存储、稳定的 &lt;code&gt;db_*&lt;/code&gt; 接口。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch24&lt;/strong&gt;：多文件编译、头文件、模块边界——这个项目拆成 6 个文件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch25&lt;/strong&gt;：有序 id 索引，用二分查找定位记录。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch26&lt;/strong&gt;：持久化——把记录保存到文件，启动时加载并重建索引。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch27&lt;/strong&gt;：日志恢复——每次增删先写操作日志，启动时回放，防止崩溃丢数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch28&lt;/strong&gt;：命令协议——&lt;code&gt;INSERT&lt;/code&gt;、&lt;code&gt;SELECT&lt;/code&gt;、&lt;code&gt;DELETE&lt;/code&gt;、&lt;code&gt;LIST&lt;/code&gt;、&lt;code&gt;RANGE&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch29&lt;/strong&gt;：状态机解析——支持带引号的参数，让 &lt;code&gt;Alice Wang&lt;/code&gt; 作为一个整体传入。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;此外加入了 &lt;code&gt;argc/argv&lt;/code&gt; 命令行参数：既可以交互运行，也可以一行命令操作。&lt;/p&gt;
&lt;h2 id="任务要求"&gt;任务要求&lt;a class="anchor" href="#%e4%bb%bb%e5%8a%a1%e8%a6%81%e6%b1%82"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="必须完成"&gt;必须完成&lt;a class="anchor" href="#%e5%bf%85%e9%a1%bb%e5%ae%8c%e6%88%90"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;数据库核心（&lt;code&gt;student_db.c&lt;/code&gt;）：带有序 id 索引的插入、二分查找、删除（维护索引）、列出、范围查询。&lt;/li&gt;
&lt;li&gt;持久化（&lt;code&gt;persistence.c&lt;/code&gt;）：启动时从 &lt;code&gt;db.txt&lt;/code&gt; 加载，退出时保存。加载时对坏行打印行号并跳过。&lt;/li&gt;
&lt;li&gt;日志恢复（&lt;code&gt;recovery.c&lt;/code&gt;）：每次 INSERT/DELETE 写操作日志；启动时回放日志；成功后清空日志。&lt;/li&gt;
&lt;li&gt;命令解析（&lt;code&gt;command.c&lt;/code&gt;）：用状态机分词（支持 &lt;code&gt;&amp;quot;Alice Wang&amp;quot;&lt;/code&gt; 引号参数），把 &lt;code&gt;INSERT&lt;/code&gt;、&lt;code&gt;SELECT&lt;/code&gt;、&lt;code&gt;DELETE&lt;/code&gt;、&lt;code&gt;LIST&lt;/code&gt;、&lt;code&gt;RANGE&lt;/code&gt;、&lt;code&gt;EXPORT&lt;/code&gt; 转成 &lt;code&gt;db_*&lt;/code&gt; 调用。&lt;/li&gt;
&lt;li&gt;主程序（&lt;code&gt;main.c&lt;/code&gt;）：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;交互模式&lt;/strong&gt;：提示符 &lt;code&gt;db&amp;gt; &lt;/code&gt;，输入命令，&lt;code&gt;exit&lt;/code&gt; 退出。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命令行模式&lt;/strong&gt;：&lt;code&gt;./db add 1 Alice 90&lt;/code&gt;、&lt;code&gt;./db list&lt;/code&gt;、&lt;code&gt;./db find 1&lt;/code&gt;、&lt;code&gt;./db export out.csv&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="可选增强"&gt;可选增强&lt;a class="anchor" href="#%e5%8f%af%e9%80%89%e5%a2%9e%e5%bc%ba"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;EXPORT&lt;/code&gt; 输出 CSV 带表头 &lt;code&gt;id,name,score&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;记录重复 id 插入时打印友好提示（已有）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="文件结构"&gt;文件结构&lt;a class="anchor" href="#%e6%96%87%e4%bb%b6%e7%bb%93%e6%9e%84"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="course-codeblock course-codeblock-text"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;student_db.h # 头文件：struct Student、struct DB、API 声明
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;student_db.c # 数据库核心：插入、删除（维护索引）、二分查找、列出、范围
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;persistence.c # 持久化：save_db / load_db
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;recovery.c # 日志恢复：write_log / replay_log
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;command.c # 命令解析：tokenize（状态机）/ run_command
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;main.c # 主程序：交互循环 + argc/argv 分发&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;编译命令：&lt;code&gt;gcc -Wall -o db student_db.c persistence.c recovery.c command.c main.c&lt;/code&gt;&lt;/p&gt;</description></item><item><title>阶段项目5：相似记录查询工具</title><link>https://simgor001.github.io/c-learning-companion/projects/project-5.html</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://simgor001.github.io/c-learning-companion/projects/project-5.html</guid><description>&lt;h2 id="这个项目练什么"&gt;这个项目练什么&lt;a class="anchor" href="#%e8%bf%99%e4%b8%aa%e9%a1%b9%e7%9b%ae%e7%bb%83%e4%bb%80%e4%b9%88"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;整合 ch30–ch34 的能力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ch30&lt;/strong&gt;：把一条记录表示成 &lt;code&gt;float vec[DIM]&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch31&lt;/strong&gt;：欧氏距离、点积、余弦相似度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch32&lt;/strong&gt;：Top-K / KNN，保留距离最小的 K 个。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch33&lt;/strong&gt;：KMeans 按距离自动分组（可选）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ch34&lt;/strong&gt;：线性回归（可选）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="任务要求"&gt;任务要求&lt;a class="anchor" href="#%e4%bb%bb%e5%8a%a1%e8%a6%81%e6%b1%82"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="必须完成"&gt;必须完成&lt;a class="anchor" href="#%e5%bf%85%e9%a1%bb%e5%ae%8c%e6%88%90"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;定义一个向量记录结构体，包含 &lt;code&gt;id&lt;/code&gt;、&lt;code&gt;name&lt;/code&gt;、&lt;code&gt;float vec[DIM]&lt;/code&gt;（&lt;code&gt;DIM&lt;/code&gt; 取 3）。&lt;/li&gt;
&lt;li&gt;内置 8 条示例数据（向量值直接写进代码），启动时加载。&lt;/li&gt;
&lt;li&gt;交互菜单：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;l&lt;/code&gt; 列出所有记录及其向量。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;q&lt;/code&gt; 输入 3 个浮点数作为查询向量，输出 Top-3 最相似记录（按欧氏距离升序）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x&lt;/code&gt; 退出。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Top-K 使用&amp;quot;扫一遍，保留 K 个最小距离&amp;quot;的方式，不对全库排序。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="可选增强"&gt;可选增强&lt;a class="anchor" href="#%e5%8f%af%e9%80%89%e5%a2%9e%e5%bc%ba"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;KMeans：输入分组数 K，迭代打印每轮中心点和分组结果，最多 10 轮。&lt;/li&gt;
&lt;li&gt;线性回归：选两个维度，拟合 &lt;code&gt;y = mx + b&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="数据与接口约定"&gt;数据与接口约定&lt;a class="anchor" href="#%e6%95%b0%e6%8d%ae%e4%b8%8e%e6%8e%a5%e5%8f%a3%e7%ba%a6%e5%ae%9a"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="course-codeblock course-codeblock-c"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e2e4e5;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#define DIM 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#define NAME_LEN 32
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#78787e"&gt;#define MAX_K 3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; VecRecord {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#9aedfe"&gt;char&lt;/span&gt; name[NAME_LEN];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#9aedfe"&gt;float&lt;/span&gt; vec[DIM];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; VecDB {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; VecRecord records[&lt;span style="color:#ff9f43"&gt;100&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; count;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#9aedfe"&gt;float&lt;/span&gt; &lt;span style="color:#57c7ff"&gt;euclidean_dist&lt;/span&gt;(&lt;span style="color:#ff6ac1"&gt;const&lt;/span&gt; &lt;span style="color:#9aedfe"&gt;float&lt;/span&gt; a[DIM], &lt;span style="color:#ff6ac1"&gt;const&lt;/span&gt; &lt;span style="color:#9aedfe"&gt;float&lt;/span&gt; b[DIM]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#9aedfe"&gt;void&lt;/span&gt; &lt;span style="color:#57c7ff"&gt;db_init&lt;/span&gt;(&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; VecDB &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;db);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#9aedfe"&gt;void&lt;/span&gt; &lt;span style="color:#57c7ff"&gt;db_list&lt;/span&gt;(&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; VecDB &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;db);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#9aedfe"&gt;void&lt;/span&gt; &lt;span style="color:#57c7ff"&gt;db_query&lt;/span&gt;(&lt;span style="color:#ff6ac1"&gt;struct&lt;/span&gt; VecDB &lt;span style="color:#ff6ac1"&gt;*&lt;/span&gt;db, &lt;span style="color:#ff6ac1"&gt;const&lt;/span&gt; &lt;span style="color:#9aedfe"&gt;float&lt;/span&gt; query[DIM], &lt;span style="color:#9aedfe"&gt;int&lt;/span&gt; k);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id="测试输入正常"&gt;测试输入（正常）&lt;a class="anchor" href="#%e6%b5%8b%e8%af%95%e8%be%93%e5%85%a5%e6%ad%a3%e5%b8%b8"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;内置数据（示意）：&lt;/p&gt;</description></item></channel></rss>