<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>浅草物语</title>
    <link>https://www.chillg.de/</link>
    
    <atom:link href="https://www.chillg.de/atom.xml" rel="self" type="application/rss+xml"/>
    
    <description>浅草物语，一个记录生活、学习、思考的地方。分享技术文章、生活感悟、学习笔记，与你一起成长。</description>
    <pubDate>Wed, 29 Oct 2025 14:45:31 GMT</pubDate>
    <generator>http://hexo.io/</generator>
    
    <item>
      <title>为什么你的浏览器会提示“不安全”？</title>
      <link>https://www.chillg.de/posts/f7cfef5e.html</link>
      <guid>https://www.chillg.de/posts/f7cfef5e.html</guid>
      <pubDate>Mon, 22 Sep 2025 13:27:36 GMT</pubDate>
      
      <description>揭秘浏览器“不安全”提示背后的HTTPS原理。一文读懂从HTTP的“裸奔”到HTTPS加密，了解SSL、数字证书与CA机构如何防止数据被窃取，以及如何通过证书透明度技术保障你的上网安全。</description>
      
      
      
      <content:encoded><![CDATA[<h1 id="为什么你的浏览器会提示“不安全”？一文带你揭秘-HTTPS-的爱恨情仇"><a href="#为什么你的浏览器会提示“不安全”？一文带你揭秘-HTTPS-的爱恨情仇" class="headerlink" title="为什么你的浏览器会提示“不安全”？一文带你揭秘 HTTPS 的爱恨情仇"></a>为什么你的浏览器会提示“不安全”？一文带你揭秘 HTTPS 的爱恨情仇</h1><p>在过去的十多年里，你一定遇到过各种各样“不安全”的网页提示。每当这时，是选择“小心驶得万年船”默默退出，还是“猛击”一下继续访问？</p><p>但无论你怎么选，有没有想过：<strong>这些烦人的提示到底是怎么来的？</strong> 如果我硬要访问，提示里说的风险真的会发生吗？</p><p><img src="https://file.8888998.xyz/2025/09/22/1758547944487-34gdqv.webp" alt="01不安全"></p><p>你可能简单搜了一下，了解到这和 <code>HTTPS</code> 有关。可惜搜到的结果里夹杂着一些难懂的名词，比如 <code>SSL</code>、<code>CA</code> 机构等等，让人头大。甚至还有一些“大聪明”的帖子，教你如何手动关掉这些提示。但是<strong>去除了提示，可不等于去除了风险</strong>，这跟掩耳盗铃没啥区别。</p><p>要想真正提升网上冲浪的体验和安全感，就有必要搞懂 <code>HTTPS</code> 是如何保护我们的，以及数字证书在其中扮演了什么角色。更有趣的是，深挖下去，你会发现这与<strong>区块链技术</strong>也颇有渊源。</p><h2 id="HTTP：那个在互联网上“裸奔”的协议"><a href="#HTTP：那个在互联网上“裸奔”的协议" class="headerlink" title="HTTP：那个在互联网上“裸奔”的协议"></a>HTTP：那个在互联网上“裸奔”的协议</h2><p>访问一个网站很简单，在浏览器输入网址，回车，搞定。但你想过吗？数据在你和网站服务器之间，经历了几十上百次的路由跳发。</p><p>比如，一个上海的用户访问北京的服务器，数据包中间可能要经过好多个路由器节点。在这么大的地理跨度下，谁能保证中间会不会有黑客在<strong>窃听</strong>，甚至<strong>篡改</strong>你的数据呢？</p><p>这就好比你给远方的朋友寄快递，路上谁都可能偷看一眼，甚至把你买的手办换成一块板砖。</p><p><img src="https://file.8888998.xyz/2025/09/22/1758548089081-2b4p98.webp" alt="02窃听"><br><em>图片来源：gemini Banana 模型生成，仅供参考</em></p><p>这背后的根本原因，是 <code>HTTP</code> 协议本身就是“裸奔”的——它压根没考虑安全问题，所有数据都以<strong>明文</strong>的形式传来传去。这让攻击者几乎不费吹灰之力就能监听和篡改。</p><p>更有甚者，早些年一些不讲武德的网络运营商，还会利用职务之便搞<strong>数据劫持</strong>，在你访问的网页里强行插入广告弹窗。所以那几年我们经常会看到，不管打开哪个网站，右下角总有那么些“狗皮膏药”广告。</p><h2 id="HTTPS：给数据穿上“金钟罩”"><a href="#HTTPS：给数据穿上“金钟罩”" class="headerlink" title="HTTPS：给数据穿上“金钟罩”"></a>HTTPS：给数据穿上“金钟罩”</h2><p>上世纪 90 年代中期，互联网的价值越来越大，大家终于意识到，得给 <code>HTTP</code> 这个“裸奔”的协议加点安全保障了。</p><p>第一个吃螃蟹的是当时的大佬——<strong>网景公司（Netscape）</strong>。他们在 1994 年率先在自家浏览器里实现了 <code>HTTPS</code> 协议，这个 <code>S</code> 就代表 <strong>安全（Secure）</strong>。</p><p>实现方法也很直接：<strong>加密</strong>。先对数据加密再传输，对方收到后解密再用。这样一来，数据虽然还是要走过千山万水，但攻击者看到的只是一堆乱码，无可奈何。</p><h3 id="加密的烦恼：密钥怎么悄悄给？"><a href="#加密的烦恼：密钥怎么悄悄给？" class="headerlink" title="加密的烦恼：密钥怎么悄悄给？"></a>加密的烦恼：密钥怎么悄悄给？</h3><p>我们知道的加密算法有很多，从凯撒密码到二战时期的恩尼格玛机，再到现代的 <code>DES</code> 算法。但它们都有一个棘手的问题：<strong>都需要密钥</strong>。</p><p>加密和解密必须用同一个密钥，这叫<strong>对称加密</strong>。</p><p><img src="https://file.8888998.xyz/2025/09/22/1758548345855-mqp76k.webp" alt="03明文密文"></p><p>问题来了：浏览器和服务器怎么才能安全地商量出一个只有他俩知道的密钥呢？如果一方生成了密钥，直接明文发给对方，那中间的攻击者不就也轻松截获了吗？这加密不就成了个寂寞？</p><p>总不能每次上网，都坐火车去和网站站长线下接头对暗号吧？这显然不现实。</p><h3 id="神来之笔：非对称加密"><a href="#神来之笔：非对称加密" class="headerlink" title="神来之笔：非对称加密"></a>神来之笔：非对称加密</h3><p>更实际的办法是<strong>非对称加密</strong>。</p><p>跟对称加密用同一个密钥不同，非对称加密的密钥总是<strong>成对出现</strong>的，一个叫<strong>公钥</strong>，一个叫<strong>私钥</strong>。</p><p>它们的规则是：</p><ul><li>用公钥加密的数据，<strong>只能</strong>用对应的私钥解密。</li><li>用私钥加密的数据，<strong>只能</strong>用对应的公钥解密。</li></ul><p>这个过程是不对称的，非常奇妙！</p><p>有了这个神器，密钥交换问题就迎刃而解了：</p><ol><li>服务器先把自己的<strong>公钥</strong>发给浏览器（公钥是公开的，谁拿到都无所谓）。</li><li>浏览器随机生成一个用于对称加密的密钥（我们叫它“会话密钥”）。</li><li>浏览器用服务器的公钥，把这个“会话密钥”加密，再发给服务器。</li><li>服务器收到后，用自己的<strong>私钥</strong>解密，就得到了“会话密钥”。</li></ol><p>这样，浏览器和服务器就有了一个共同的、谁也偷不走的密钥。在这个过程中，就算攻击者截获了服务器的公钥和被加密后的会话密钥，也白搭，因为他没有服务器的私钥，根本解不开！</p><p>用非对称加密来协商出一个对称加密的密钥，然后再用这个密钥进行真正的数据传输，这就是 <code>HTTPS</code> 协议里那个 <code>S</code> 的大致实现原理。这套独立于 <code>HTTP</code> 的流程，也被称为 <strong>SSL（安全套接字层）</strong>，而这个密钥协商的过程，就是大名鼎鼎的 <strong>SSL 握手</strong>。</p><blockquote><p><strong>小插曲：从 SSL 到 TLS</strong></p><p>从 1994 年到 1996 年，<code>SSL</code> 经历了 1.0 到 3.0 的升级。后来，互联网工程任务组（IETF）决定把它标准化，于 1999 年发布了一个新名字 <code>TLS</code>。所以很多人也把 <code>TLS 1.0</code> 看作是 <code>SSL 3.1</code>。这两个名字后来也经常混用。顺便一说，改名也让当时和网景打得不可开交的微软显得不那么 loser 了（笑）。</p><p>后来 <code>TLS</code> 也一路升级到 1.3，主要是修补安全细节，比如在 <code>TLS 1.2</code> 中淘汰了逐渐不安全的 <code>MD5</code> 和 <code>SHA-1</code> 哈希算法，换上了更强的 <code>SHA-256</code>。</p></blockquote><h2 id="道高一尺，魔高一丈：中间人攻击"><a href="#道高一尺，魔高一丈：中间人攻击" class="headerlink" title="道高一尺，魔高一丈：中间人攻击"></a>道高一尺，魔高一丈：中间人攻击</h2><p>问题似乎完美解决了，但仅仅是“似乎”。</p><p>这里面还有一个致命的漏洞：如果在第一步，服务器给浏览器发公钥的时候，攻击者就把它<strong>拦截下来，换成自己的公钥</strong>，再发给浏览器，会怎么样？</p><p>浏览器并不知道公钥被掉了包，于是开心地用攻击者的公钥加密了会话密钥。攻击者截获后，用自己的私钥轻松解密，就拿到了会话密钥！然后，他再用之前截获的服务器的真公钥，把会话密钥加密一遍发给服务器。</p><p><img src="https://file.8888998.xyz/2025/09/22/1758548974410-l5oiwm.webp" alt="05中间人攻击"></p><p>在这个过程中，浏览器和服务器都以为自己在和对方安全通信，但其实他俩的密钥，攻击者也一清二楚。后续所有的加密，都成了皇帝的新衣。</p><h2 id="网站的“身份证”：数字证书与-CA-机构"><a href="#网站的“身份证”：数字证书与-CA-机构" class="headerlink" title="网站的“身份证”：数字证书与 CA 机构"></a>网站的“身份证”：数字证书与 CA 机构</h2><p>这个问题的根本在于，一个公钥本身，并不能证明它属于谁。</p><p>解决方案是引入一个权威的<strong>第三方</strong>。现在，服务器不直接给公钥了，而是把自己的<strong>公钥、域名、公司信息</strong>等打包，去找一个叫 <code>CA</code>（Certificate Authority，证书颁发机构）的第三方。</p><p><code>CA</code> 机构在严格核实了服务器的身份后，会用自己的<strong>私钥</strong>对这份数据包进行加密（这个过程叫<strong>签名</strong>）。最后，这个“被签了名的数据包”就是<strong>数字证书</strong>。</p><p>现在，服务器传递给浏览器的，就是这份能证明自己身份的证书。</p><p>浏览器拿到证书后，不会直接相信，而是要先验证：</p><ol><li>浏览器内置了所有受信任的 <code>CA</code> 机构的<strong>公钥</strong>。</li><li>浏览器找到证书里写的那个 <code>CA</code> 机构，用它对应的公钥去解密证书里的签名。</li><li>如果解密后的数据和证书里的明文数据对得上，并且证书里的域名和当前访问的域名也一致，验证通过！</li></ol><p>这样一来，浏览器就能百分百确定，证书里的公钥确实是这个网站的，而不是攻击者伪造的。中间人攻击的“偷天换日”大戏就演不下去了。</p><h3 id="谁是-CA？我们为什么信它？"><a href="#谁是-CA？我们为什么信它？" class="headerlink" title="谁是 CA？我们为什么信它？"></a>谁是 CA？我们为什么信它？</h3><p>能成为 <code>CA</code> 机构的，都是像微软、谷歌、<code>Symantec</code>、<code>DigiCert</code> 这样有影响力的权威机构或专业的安全公司。原则上，它们没有动机去颁发假证书，因为这会砸了自己的金字招牌。</p><p>你的操作系统和浏览器出厂时，就已经内置了一份<strong>“受信任的根证书颁发机构”列表</strong>。只有这个列表里的 <code>CA</code> 签发的证书，才会被承认。前些年有些网站自己给自己发证书（自签名证书），浏览器压根不认，就会弹出安全警告。</p><h2 id="中心化的软肋：当权威不再权威"><a href="#中心化的软肋：当权威不再权威" class="headerlink" title="中心化的软肋：当权威不再权威"></a>中心化的软肋：当权威不再权威</h2><p>到这里，事情好像真的解决了。但你有没有发现，<code>CA</code> 机构的权力和责任实在太大了，导致整个安全体系都建立在对它的<strong>信任</strong>之上，这其实很脆弱。</p><p><code>达摩克里斯之剑</code>并未消失，只是向旁边挪了几寸。</p><p>证书的颁发最终还是要靠人来判断，是人就可能犯错，也可能被收买。</p><ul><li><strong>2015 年，谷歌 vs 赛门铁克</strong>：谷歌发现 <code>CA</code> 巨头赛门铁克偷偷给谷歌的域名签发了错误的测试证书。虽然赛门铁克解释说是内部测试，但谁能保证这种证书不会泄露出去呢？</li><li><strong>2017 年，信任危机</strong>：谷歌在调查后，宣称赛门铁克错误地颁发了至少 3 万个证书，并最终在 Chrome 浏览器中全面“拉黑”了赛门铁克的证书。</li><li><strong>棱镜门</strong>：虽然没有直接证据，但人们有理由担心，政府机构可以利用权力强迫 <code>CA</code> 机构颁发假证书，以用于监控。</li></ul><p>这些事件暴露了中心化 <code>CA</code> 机制的困境：利益、人为因素，都是无法根除的问题。</p><h2 id="终极方案？证书透明度（CT）"><a href="#终极方案？证书透明度（CT）" class="headerlink" title="终极方案？证书透明度（CT）"></a>终极方案？证书透明度（CT）</h2><p>正是在这样的背景下，<strong>证书透明度（Certificate Transparency, CT）</strong>方案应运而生。</p><p>这个机制的核心逻辑，一句话概括就是：<strong>引入公开的、可审计的、去中心化的日志</strong>。</p><ol><li>现在，<code>CA</code> 机构每次颁发一个证书，都必须强制性地向一个公开的<strong>日志服务器</strong>提交证书信息。</li><li>日志服务器记录下来，并返回给 <code>CA</code> 一个<strong>SCT</strong>（Signed Certificate Timestamp，签名证书时间戳）。</li><li><code>CA</code> 必须把这个 <code>SCT</code> 也打包进最终的证书里。</li><li>当浏览器收到证书后，除了验证 <code>CA</code> 的签名，还要拿着 <code>SCT</code> 去日志服务器验证，确认这份证书确实被公开记录过。</li></ol><p>你可能会问，这不就是套娃吗？<code>CA</code> 会出错，日志服务器就不会吗？</p><p>这就是 <code>CT</code> 机制最妙的地方：<strong>去中心化</strong>和<strong>防篡改</strong>，而这背后用到的正是类似<strong>区块链</strong>的技术——<strong>默克尔树（Merkle Tree）</strong>。</p><p><img src="https://file.8888998.xyz/2025/09/22/1758549144501-lnjqxp.webp" alt="06默克尔树"></p><p>简单来说，日志服务器把所有证书记录通过哈希运算，构建成一棵“哈希树”。任何一条记录的微小改动，都会像蝴蝶效应一样，层层传导，最终导致树顶的<strong>根哈希值</strong>发生巨大变化。</p><p>这个账本是<strong>只能添加、无法篡改</strong>的，而且<strong>完全公开</strong>。任何人，包括域名所有者（可以扮演“监视者”的角色），都可以随时查询这个公开账本，检查有没有人背着自己，给自己的域名申请了可疑的证书。</p><p>从 2018 年开始，Chrome 和 Safari 等主流浏览器已经强制要求证书必须包含 <code>SCT</code> 信息，否则一律标为不安全。这样，所有 <code>CA</code> 机构都被纳入了这个公开的监管体系，再也不能“暗箱操作”了。</p><h2 id="结语：永不消失的达摩克里斯之剑"><a href="#结语：永不消失的达摩克里斯之剑" class="headerlink" title="结语：永不消失的达摩克里斯之剑"></a>结语：永不消失的达摩克里斯之剑</h2><p>至此，<code>HTTPS</code> 的安全机制，在加入了 <code>CT</code> 之后，基本上算是最接近完美的方案了。</p><p>但和所有安全问题一样，<strong>完美就像一个极限，只能无限趋近，却无法真正到达</strong>。<code>CT</code> 机制本身也存在一些理论上的风险，比如日志服务器作恶、监视者失职等等。</p><p>网络安全就是一场永无止境的攻防博弈。或许，那把悬在头顶的达摩克里斯之剑永远无法彻底消失，但经过这么多年的努力，一代代技术先驱们，已经成功地将它安放到了一个相对安全的距离之外。</p><p>而我们作为用户，下一次再看到“不安全”的提示时，或许能多一份理解和从容。</p><hr><p><strong>参考文献</strong><br>[1] Wikipedia. Transport Layer Security [EB&#x2F;OL]. [2023-03-05]. <a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">https://en.wikipedia.org/wiki/Transport_Layer_Security</a>.<br>[2] transparency.dev. How CT fits into the wider WebPKI ecosystem [EB&#x2F;OL]. [2023-03-12]. <a href="https://certificate.transparency.dev/howctworks/">https://certificate.transparency.dev/howctworks/</a>.<br>[3] Google. How CT Works [EB&#x2F;OL]. [2023-03-10]. <a href="https://sites.google.com/site/certificatetransparency/how-ct-works">https://sites.google.com/site/certificatetransparency/how-ct-works</a>.<br>[4] 张婕, 王伟, 马迪, 等. 数字证书透明性 CT 机制安全威胁研究[J]. 计算机系统应用, 2018(10).</p>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E6%9D%82%E8%B0%88/">杂谈</category>
      
      
      <category domain="https://www.chillg.de/tags/%E6%9D%82%E8%B0%88/">杂谈</category>
      
      <category domain="https://www.chillg.de/tags/%E8%AE%A1%E7%BD%91/">计网</category>
      
      
      <comments>https://www.chillg.de/posts/f7cfef5e.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>正则表达式实用指南：从零到一的上手攻略</title>
      <link>https://www.chillg.de/posts/d345b195.html</link>
      <guid>https://www.chillg.de/posts/d345b195.html</guid>
      <pubDate>Mon, 21 Jul 2025 09:18:23 GMT</pubDate>
      
      <description>这是一篇为正则表达式初学者量身打造的实用入门指南。文章旨在消除你对正则表达式的恐惧，从零开始，用通俗易懂的语言和生动的实例，系统讲解了正则表达式的核心语法与常用技巧。内容涵盖限定符、字符类、分组，以及至关重要的“贪婪与懒惰”匹配模式，并通过匹配颜色值、IP地址等真实场景进行实战演练，帮助读者快速掌握这一强大的文本处理工具，轻松解决工作中常见的匹配难题</description>
      
      
      
      <content:encoded><![CDATA[<h1 id="解密正则表达式：程序员的文本匹配利器"><a href="#解密正则表达式：程序员的文本匹配利器" class="headerlink" title="解密正则表达式：程序员的文本匹配利器"></a>解密正则表达式：程序员的文本匹配利器</h1><p>如果你和曾经的我一样，每次看到正则表达式都头皮发麻，那这篇文章就是为你准备的。</p><p>别怕，正则表达式没那么玄乎。说白了，它就是一种超强的文本“查找与替换”工具。小到检查用户输入的邮箱格式是否正确，大到从上万行日志里捞出你想要的那条信息，都离不开它。它就是程序员处理文本的瑞士军刀。</p><p>这篇指南不会讲得天花乱坠，只讲最常用、最核心的那些部分，保证你能快速上手，解决掉 80%的日常问题。</p><hr><h3 id="热身运动：找个好用的“游乐场”"><a href="#热身运动：找个好用的“游乐场”" class="headerlink" title="热身运动：找个好用的“游乐场”"></a>热身运动：找个好用的“游乐场”</h3><p>在正式开干前，你需要一个能随时测试你想法的地方。别总是在 IDE 或代码里<code>print</code>调试，效率太低。</p><p>强烈推荐 **<a href="https://regex101.com/">regex101.com</a>**。</p><p>这网站好在哪？它不光能告诉你匹配对了没，还会在右边把你的表达式拆开来，告诉你每一步都是什么意思。对于新手来说，这简直是神仙功能。后面我们的所有例子，你都可以直接复制进去自己试试看。</p><hr><h3 id="核心招式：基础语法"><a href="#核心招式：基础语法" class="headerlink" title="核心招式：基础语法"></a>核心招式：基础语法</h3><p>掌握下面这几招，你就已经入门了。</p><h4 id="1-限定符：控制出现的次数"><a href="#1-限定符：控制出现的次数" class="headerlink" title="1. 限定符：控制出现的次数"></a>1. 限定符：控制出现的次数</h4><p>这是正则表达式最基本的功能。</p><ul><li><code>?</code> <strong>问号</strong>：代表“可有可无”，也就是出现 0 次或 1 次。比如<code>colors?</code>可以同时匹配<code>color</code>和<code>colors</code>。</li><li><code>*</code> <strong>星号</strong>：代表“随便来”，出现 0 次、1 次或很多次都行。比如<code>ab*c</code>可以匹配<code>ac</code>、<code>abc</code>、<code>abbbbc</code>。</li><li><code>+</code> <strong>加号</strong>：和星号很像，但代表“至少要有一个”，也就是出现 1 次或很多次。<code>ab+c</code>就没法匹配<code>ac</code>了。</li><li><code>&#123;&#125;</code> <strong>花括号</strong>：让你精确控制次数。<ul><li><code>a&#123;3&#125;</code>：不多不少，必须是 3 个 a。</li><li><code>a&#123;2,5&#125;</code>：最少 2 个，最多 5 个 a。</li><li><code>a&#123;2,&#125;</code>：最少 2 个，上不封顶。</li></ul></li></ul><h4 id="2-分组与分支：处理组合与多选"><a href="#2-分组与分支：处理组合与多选" class="headerlink" title="2. 分组与分支：处理组合与多选"></a>2. 分组与分支：处理组合与多选</h4><ul><li><code>()</code> <strong>括号</strong>：把一堆东西包起来，当成一个整体。比如你想匹配好几个连续的<code>ab</code>，就要用<code>(ab)+</code>，这样<code>+</code>才会作用于整个<code>ab</code>。</li><li><code>|</code> <strong>竖线</strong>：代表“或者”。<code>I love (cats|dogs)</code>就能匹配<code>I love cats</code>和<code>I love dogs</code>。注意括号是必须的，不然就变成<code>I love cats</code>或者<code>dogs</code>了，意思全变了。</li></ul><h4 id="3-字符类：指定一个范围"><a href="#3-字符类：指定一个范围" class="headerlink" title="3. 字符类：指定一个范围"></a>3. 字符类：指定一个范围</h4><p><code>[]</code>方括号允许你自定义一个“字符集合”，只要字符属于这个集合，就能匹配。</p><ul><li><code>[abc]</code>：匹配 a、b、c 中的任意一个。</li><li><code>[a-z]</code>：匹配所有小写字母。</li><li><code>[a-zA-Z0-9]</code>：匹配所有字母和数字。</li><li><code>[^0-9]</code>：开头的<code>^</code>表示“取反”，所以这个是匹配所有<strong>非</strong>数字的字符。</li></ul><h4 id="4-元字符：常用的“简写”"><a href="#4-元字符：常用的“简写”" class="headerlink" title="4. 元字符：常用的“简写”"></a>4. 元字符：常用的“简写”</h4><p>正则表达式的设计者早就为我们准备好了一些常用的字符类简写，省得我们每次都写方括号。</p><ul><li><code>\d</code>：任意数字，相当于<code>[0-9]</code>。</li><li><code>\w</code>：任意“单词”字符，包括字母、数字和下划线，相当于<code>[a-zA-Z0-9_]</code>。</li><li><code>\s</code>：任意空白，包括空格、Tab、换行符。</li><li><code>.</code> (英文句点)：这是个大杀器，能匹配<strong>除了换行符之外</strong>的任何单个字符。</li><li><code>\D</code>, <code>\W</code>, <code>\S</code>：用大写字母表示对应小写版本的“取反”。比如<code>\D</code>就是匹配任意非数字字符。</li></ul><h4 id="5-定位符：锚定位置"><a href="#5-定位符：锚定位置" class="headerlink" title="5. 定位符：锚定位置"></a>5. 定位符：锚定位置</h4><p>这些符号不匹配任何字符，而是匹配一个“位置”。</p><ul><li><code>^</code>：锚定一行的开始。<code>^Hello</code>只会匹配以 Hello 开头的行。</li><li><code>$</code>：锚定一行的结束。<code>world$</code>只会匹配以 world 结尾的行。</li><li><code>\b</code>：锚定一个单词的边界。用<code>\bcat\b</code>就能只匹配单词<code>cat</code>，而不会匹配到<code>concatenate</code>里面的 cat。</li></ul><hr><h3 id="进阶心法：贪婪与懒惰"><a href="#进阶心法：贪婪与懒惰" class="headerlink" title="进阶心法：贪婪与懒惰"></a>进阶心法：贪婪与懒惰</h3><p>这是很多人刚开始会踩的坑。默认情况下，正则表达式是“贪婪”的。</p><p>什么意思？比如你有这么一段文本：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">span</span>&gt;</span><span class="tag">&lt;<span class="name">a</span>&gt;</span>link<span class="tag">&lt;/<span class="name">a</span>&gt;</span><span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br></pre></td></tr></table></figure><p>你想用<code>&lt;.+&gt;</code>来匹配 HTML 标签。你以为它会匹配出<code>&lt;span&gt;</code>和<code>&lt;a&gt;</code>和<code>&lt;/a&gt;</code>和<code>&lt;/span&gt;</code>。但结果是，它会从第一个<code>&lt;</code>一直匹配到最后一个<code>&gt;</code>，把整个字符串全给你。</p><p>这就是“贪婪”，<code>+</code>和<code>*</code>会尽可能多地吞掉字符。</p><p><strong>解决方法很简单：在<code>+</code>或<code>*</code>后面加个<code>?</code>，让它变得“懒惰”。</strong></p><p>用<code>&lt;.+?&gt;</code>，正则表达式就会在找到第一个匹配的<code>&gt;</code>时立刻停下来。这在处理 HTML、XML 这类成对标签的文本时，几乎是必备技巧。</p><hr><h3 id="实战演练"><a href="#实战演练" class="headerlink" title="实战演练"></a>实战演练</h3><p>理论讲完了，来点实际的。</p><h4 id="场景一：提取十六进制颜色值"><a href="#场景一：提取十六进制颜色值" class="headerlink" title="场景一：提取十六进制颜色值"></a>场景一：提取十六进制颜色值</h4><p>比如，从一堆 CSS 代码里找出所有像<code>#ff6600</code>这样的颜色值。</p><ol><li>颜色以<code>#</code>开头。</li><li>后面跟着 6 个十六进制字符，也就是<code>0-9</code>或<code>a-f</code>（大小写不限）。</li><li>我们希望它是个独立的单位，不希望匹配到<code>#ff66000</code>里面去。</li></ol><p>组合起来就是：<code>#([0-9a-fA-F]&#123;6&#125;)\b</code></p><ul><li><code>#</code>匹配井号。</li><li><code>[0-9a-fA-F]</code>定义了十六进制字符集。</li><li><code>&#123;6&#125;</code>表示要 6 个。</li><li><code>\b</code>定义了单词边界。</li></ul><h4 id="场景二：校验-IP-地址"><a href="#场景二：校验-IP-地址" class="headerlink" title="场景二：校验 IP 地址"></a>场景二：校验 IP 地址</h4><p>这个需求很常见，但也更复杂。一个简单的<code>\d&#123;1,3&#125;\.\d&#123;1,3&#125;\.\d&#123;1,3&#125;\.\d&#123;1,3&#125;</code>能匹配上格式，但它也会让<code>999.999.999.999</code>这样的鬼东西通过，因为 IP 地址每一段的范围是 0-255。</p><p>要精确匹配，表达式会变得有点吓人。别怕，我们拆开看。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">\b((25[0-5]|2[0-4]\d|1\d&#123;2&#125;|[1-9]?\d)\.)&#123;3&#125;(25[0-5]|2[0-4]\d|1\d&#123;2&#125;|[1-9]?\d)\b</span><br></pre></td></tr></table></figure><p>这个表达式的核心就是用<code>|</code>把 0-255 分成了几个区间来匹配：</p><ul><li><code>25[0-5]</code>：匹配 250-255</li><li><code>2[0-4]\d</code>：匹配 200-249</li><li><code>1\d&#123;2&#125;</code>：匹配 100-199</li><li><code>[1-9]?\d</code>：匹配 0-99</li></ul><p>然后用分组和<code>&#123;3&#125;</code>把它重复三次，再跟上最后一段。这个例子有点劝退，看不懂没关系，先理解思路，需要用的时候再回来查就行。</p><hr><h3 id="总结与展望"><a href="#总结与展望" class="headerlink" title="总结与展望"></a>总结与展望</h3><p>到这里，你已经掌握了正则表达式的绝大部分精华。下面这张表可以当做你的备忘录。</p><table><thead><tr><th align="left">类型</th><th align="left">语法</th><th align="left">描述</th></tr></thead><tbody><tr><td align="left"><strong>限定符</strong></td><td align="left"><code>*</code>, <code>+</code>, <code>?</code>, <code>&#123;&#125;</code></td><td align="left">控制数量</td></tr><tr><td align="left"><strong>分支</strong></td><td align="left"><code>(a|b)</code></td><td align="left">A 或 B</td></tr><tr><td align="left"><strong>字符类</strong></td><td align="left"><code>[...]</code>, <code>[^...]</code></td><td align="left">集合与排除</td></tr><tr><td align="left"><strong>元字符</strong></td><td align="left"><code>\d</code>, <code>\w</code>, <code>\s</code>, <code>.</code></td><td align="left">常用简写</td></tr><tr><td align="left"><strong>定位符</strong></td><td align="left"><code>^</code>, <code>$</code>, <code>\b</code></td><td align="left">匹配位置</td></tr><tr><td align="left"><strong>模式</strong></td><td align="left"><code>+</code>, <code>*</code> (贪婪) vs <code>+?</code>, <code>*?</code> (懒惰)</td><td align="left">匹配策略</td></tr></tbody></table><p>正则表达式能做的远不止这些，还有捕获组、反向引用、零宽断言等更高级的玩法，那些可以让你写出更精妙、更高效的表达式。不过饭要一口一口吃，先把今天学的这些在实际项目中用起来，你会发现处理字符串的效率大大提升。如果感兴趣的话后续可能会在出几篇相关的博客。</p><p>如果你想继续深入，下面这几个资源质量非常高：</p><ul><li>**<a href="https://deerchao.cn/tutorials/regex/regex.htm">正则表达式 30 分钟入门教程</a>**：中文启蒙经典，作者 deerchao。</li><li>**<a href="https://www.regular-expressions.info/tutorial.html">Regular Expressions Tutorial </a>**：英文世界的百科全书，极其详尽。</li></ul><p>去动手试试吧，这才是掌握一门技术的最好方式。</p>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E6%95%99%E7%A8%8B/">教程</category>
      
      
      <category domain="https://www.chillg.de/tags/%E6%95%99%E7%A8%8B/">教程</category>
      
      <category domain="https://www.chillg.de/tags/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/">正则表达式</category>
      
      
      <comments>https://www.chillg.de/posts/d345b195.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>从钢炼到芙莉莲：我们的青春编年史，50部动画带你重温二十年感动</title>
      <link>https://www.chillg.de/posts/8f2dd1cc.html</link>
      <guid>https://www.chillg.de/posts/8f2dd1cc.html</guid>
      <pubDate>Thu, 17 Jul 2025 14:08:35 GMT</pubDate>
      
        
        
      <description>&lt;h1 id=&quot;50-部必看动漫：2003-年至-2025-年的经典推荐&quot;&gt;&lt;a href=&quot;#50-部必看动漫：2003-年至-2025-年的经典推荐&quot; class=&quot;headerlink&quot; title=&quot;50 部必看动漫：2003 年至 2025 年的经典推荐&quot;&gt;&lt;/a&gt;50</description>
        
      
      
      
      <content:encoded><![CDATA[<h1 id="50-部必看动漫：2003-年至-2025-年的经典推荐"><a href="#50-部必看动漫：2003-年至-2025-年的经典推荐" class="headerlink" title="50 部必看动漫：2003 年至 2025 年的经典推荐"></a>50 部必看动漫：2003 年至 2025 年的经典推荐</h1><h2 id="导言"><a href="#导言" class="headerlink" title="导言"></a>导言</h2><p>无论你是追番多年的老粉，还是刚入坑的新手，这篇文章将带你穿越 2003 年至 2025 年的动漫时光隧道，探索 50 部经典之作。这些作品不仅定义了时代，还为观众带来了欢笑、泪水和深刻思考。准备好纸巾和爆米花，一起开启这场动画盛宴！</p><p>这份榜单基于个人喜好，每部作品因其独特的故事、角色或情感共鸣入选。如果你的心头好未上榜，可能是尚未欣赏，或留待未来推荐。动漫的魅力在于多样性，无论是热血战斗还是温馨日常，总有一部能触动你。让我们放下成见，共同探索！</p><h2 id="2003-年"><a href="#2003-年" class="headerlink" title="2003 年"></a>2003 年</h2><h3 id="《钢之炼金术师》（2003-版）"><a href="#《钢之炼金术师》（2003-版）" class="headerlink" title="《钢之炼金术师》（2003 版）"></a>《钢之炼金术师》（2003 版）</h3><p><img src="https://lain.bgm.tv/pic/cover/l/3f/e9/316_gwpqW.jpg" alt="钢之炼金术师"><br>2003 版的《钢之炼金术师》以原创剧情脱颖而出。由于漫画未完结，动画中期走上原创道路，呈现黑暗、成人的基调。爱德华和阿尔冯斯兄弟为复活母亲付出沉重代价，一个失去四肢，一个灵魂寄宿盔甲。故事深入探讨“等价交换”的残酷真相，人造人的悲剧设定和孤独旅途令人动容，结局引人深思，留下“意难平”。<br><strong>观看建议</strong>：搭配 2009 版《钢之炼金术师 FA》观看，两种风格各有千秋。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/273">钢之炼金术师 (2003) </a></p><h2 id="2006-年"><a href="#2006-年" class="headerlink" title="2006 年"></a>2006 年</h2><h3 id="《死亡笔记》"><a href="#《死亡笔记》" class="headerlink" title="《死亡笔记》"></a>《死亡笔记》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/89/5a/34414_QSic5.jpg" alt="死亡笔记"><br>《死亡笔记》是智斗动画巅峰，讲述自诩“新世界之神”的夜神月与侦探 L 的惊心动魄对决。剧情扣人心弦，“薯片计谋”和网球赛场景将紧张感拉满。作品不仅是悬疑动画，更是对人性、正义和傲慢的深刻思辨，挑战权力边界。<br><strong>观看建议</strong>：极为烧脑，建议专注观看，避免分心。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/239">死亡笔记 </a></p><h2 id="2007-年"><a href="#2007-年" class="headerlink" title="2007 年"></a>2007 年</h2><h3 id="《Clannad》"><a href="#《Clannad》" class="headerlink" title="《Clannad》"></a>《Clannad》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/28/38/51_6PN42.jpg" alt="Clannad"><br>《Clannad》表面是校园后宫喜剧，实为关于成长、家庭和失去的深刻作品。第一季通过冈崎朋也与女孩的互动，串联小镇与家族温馨主题。第二季《Clannad: After Story》描绘从校园到社会、从恋人到夫妻的现实人生，以温柔又残忍的方式讲述责任与亲情，让人泪流满面。<br><strong>观看建议</strong>：第一季为第二季铺垫，务必完整观看，备好纸巾。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/51">Clannad </a></p><h2 id="2009-年"><a href="#2009-年" class="headerlink" title="2009 年"></a>2009 年</h2><h3 id="《轻音少女》"><a href="#《轻音少女》" class="headerlink" title="《轻音少女》"></a>《轻音少女》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/48/9d/1424_q8FMQ.jpg" alt="轻音少女"><br>京都动画的《轻音少女》以五位性格迥异的女孩和濒临废部的轻音社团为主线，定义“日常系”动画。故事围绕喝茶、吃蛋糕、卖萌和偶尔排练，捕捉青春期独一无二的闪光感，传递与朋友做喜欢的事的幸福。<br><strong>观看建议</strong>：放松心情，享受青春的下午茶。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/1424">轻音少女 </a></p><h3 id="《钢之炼金术师：兄弟情》"><a href="#《钢之炼金术师：兄弟情》" class="headerlink" title="《钢之炼金术师：兄弟情》"></a>《钢之炼金术师：兄弟情》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/4f/b8/4923_rg33v.jpg" alt="钢之炼金术师：兄弟情"><br>《钢之炼金术师：兄弟情》（FA）是忠于漫画的少年热血完全体。故事从爱德华兄弟寻宝之旅扩展到国家阴谋，角色饱满，智商在线，战斗燃爆，情感感人，结局酣畅淋漓，堪称“六边形战士”。<br><strong>观看建议</strong>：适合热血和深度剧情爱好者，直接入坑。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/4923">钢之炼金术师 </a></p><h3 id="《化物语》"><a href="#《化物语》" class="headerlink" title="《化物语》"></a>《化物语》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/64/7c/1671_vQ2W9.jpg" alt="化物语"><br>《化物语》是新房昭之与西尾维新联手的奇特作品，围绕阿良良木历帮助被怪异附身的少女。信息量爆炸的对话、文字游戏台词和 45 度倾斜镜头带来震撼体验，非传统打怪升级。<br><strong>观看建议</strong>：开启弹幕或 0.5 倍速，跟上密集对话。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/1671">化物语 </a></p><h2 id="2011-年"><a href="#2011-年" class="headerlink" title="2011 年"></a>2011 年</h2><h3 id="《命运石之门》"><a href="#《命运石之门》" class="headerlink" title="《命运石之门》"></a>《命运石之门》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/a9/79/10380_YwP4R.jpg" alt="命运石之门"><br>《命运石之门》需耐心，前期中二对话为后期惊天反转铺垫。第 12 集起剧情急转，探讨时间悖论和冈部伦太郎的痛苦抉择，成长从逗比到英雄，堪称教科书级剧情。<br><strong>观看建议</strong>：坚持前 12 集，迎接过山车剧情。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/10380">命运石之门 </a></p><h3 id="《我们仍未知道那天所看见的花的名字。》"><a href="#《我们仍未知道那天所看见的花的名字。》" class="headerlink" title="《我们仍未知道那天所看见的花的名字。》"></a>《我们仍未知道那天所看见的花的名字。》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/6c/e8/10440_8HP6O.jpg" alt="我们仍未知道那天所看见的花的名字。"><br>“面码找到你了！”这句台词让无数观众泪崩。《未闻花名》讲述因童年伙伴面码去世而疏远的朋友，在面码幽灵出现后解开心结，精准捕捉青春期敏感友情，治愈又催泪。<br><strong>观看建议</strong>：适合情感深度爱好者，准备被感动。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/10440">未闻花名 </a></p><h2 id="2012-年"><a href="#2012-年" class="headerlink" title="2012 年"></a>2012 年</h2><h3 id="《冰菓》"><a href="#《冰菓》" class="headerlink" title="《冰菓》"></a>《冰菓》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/cd/38/27364_1ZFmr.jpg" alt="冰菓"><br>《冰菓》将日常推理做到极致，千反田爱瑠的好奇心让折木奉太郎的高中生活多姿多彩。京都动画以神级演出赋予平凡小事悬念和美感，男女主暧昧互动心动不已。<br><strong>观看建议</strong>：适合细腻剧情和青春氛围爱好者。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/27364">冰菓 </a></p><h3 id="《刀剑神域》"><a href="#《刀剑神域》" class="headerlink" title="《刀剑神域》"></a>《刀剑神域》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/2e/c8/23686_e36x9.jpg" alt="刀剑神域"><br>2012 年的《刀剑神域》开创“困在游戏世界”热潮。桐人双刀流和与亚丝娜的爱情感动无数观众，死亡游戏紧张感至今无人超越，是许多人入宅之作。<br><strong>观看建议</strong>：适合冒险和浪漫爱好者，感受虚拟世界魅力。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/23686">刀剑神域 </a></p><h3 id="《中二病也要谈恋爱！》"><a href="#《中二病也要谈恋爱！》" class="headerlink" title="《中二病也要谈恋爱！》"></a>《中二病也要谈恋爱！》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/3d/fd/29648_wtWzN.jpg" alt="中二病也要谈恋爱！"><br>《中二病也要谈恋爱！》将“中二病”化为笑中带泪的恋爱喜剧。前中二患者勇太与“邪王真眼”六花碰撞出笑料和感动，恋爱如打副本，羞耻又甜蜜。<br><strong>观看建议</strong>：适合轻松浪漫喜剧爱好者，准备笑到捶床。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/29648">中二病也要谈恋爱！ </a></p><h2 id="2013-年"><a href="#2013-年" class="headerlink" title="2013 年"></a>2013 年</h2><h3 id="《玉子市场》"><a href="#《玉子市场》" class="headerlink" title="《玉子市场》"></a>《玉子市场》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/f8/7f/55113_TR5Is.jpg" alt="玉子市场"><br>《玉子市场》是京都动画温馨日常之作，围绕饼店女孩玉子和会说话的胖鸟，充满生活气息和奇妙幻想，商店街人情味如热可可般治愈。<br><strong>观看建议</strong>：看完 TV 版，务必看剧场版《玉子的爱情故事》。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/55113">玉子市场 </a></p><h2 id="2014-年"><a href="#2014-年" class="headerlink" title="2014 年"></a>2014 年</h2><h3 id="《乒乓》"><a href="#《乒乓》" class="headerlink" title="《乒乓》"></a>《乒乓》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/1e/63/93739_TZ9dS.jpg" alt="乒乓"><br>汤浅政明的《乒乓》以狂放画风和张力分镜，讲述乒乓球背后的天赋、努力和友情。角色挣扎真实可感，“英雄登场”令人热泪盈眶。<br><strong>观看建议</strong>：勿被画风劝退，适合深度体育番爱好者。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/93739">乒乓 </a></p><h3 id="《月刊少女野崎君》"><a href="#《月刊少女野崎君》" class="headerlink" title="《月刊少女野崎君》"></a>《月刊少女野崎君》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/a0/20/100449_d101j.jpg" alt="月刊少女野崎君"><br>《月刊少女野崎君》是反套路恋爱喜剧，元气少女千代告白却得签名，作品将少女漫画浪漫桥段沙雕演绎，全员活宝，笑点密集。<br><strong>观看建议</strong>：适合放松大笑的观众，准备被逗乐。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/100449">月刊少女野崎君 </a></p><h3 id="《寄生兽》"><a href="#《寄生兽》" class="headerlink" title="《寄生兽》"></a>《寄生兽》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/e3/14/88433_5Jl4M.jpg" alt="寄生兽"><br>《寄生兽》通过泉新一与寄生生物米奇的共生，探讨生命与人性。新一从胆小少年成长为冷酷战士，引发“恶魔”与“人类”思考。<br><strong>观看建议</strong>：适合哲学与动作结合爱好者，准备三观重塑。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/88433">寄生兽 </a></p><h3 id="《四月是你的谎言》"><a href="#《四月是你的谎言》" class="headerlink" title="《四月是你的谎言》"></a>《四月是你的谎言》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/ec/c7/100444_96r3J.jpg" alt="四月是你的谎言"><br>《四月是你的谎言》以音乐为媒介，讲述天才钢琴少年有马公生遇小提琴手宫园薰，找回色彩。音乐与画面天衣无缝，每场演奏是情感爆发。<br><strong>观看建议</strong>：适合音乐与青春故事爱好者，准备甜虐切换。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/100444">四月是你的谎言 </a></p><h2 id="2015-年"><a href="#2015-年" class="headerlink" title="2015 年"></a>2015 年</h2><h3 id="《干物妹！小埋》"><a href="#《干物妹！小埋》" class="headerlink" title="《干物妹！小埋》"></a>《干物妹！小埋》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/41/2c/120187_nXjYb.jpg" alt="干物妹！小埋"><br>《干物妹！小埋》外是完美美少女，回家变沉迷游戏薯片的“干物妹”，反差萌击中内心，纯粹解压喜剧。<br><strong>观看建议</strong>：适合放松大脑，享受欢乐。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/120187">干物妹！小埋 </a></p><h3 id="《鲁邦三世》（2015）"><a href="#《鲁邦三世》（2015）" class="headerlink" title="《鲁邦三世》（2015）"></a>《鲁邦三世》（2015）</h3><p><img src="https://lain.bgm.tv/pic/cover/l/b5/50/115661_f2yzy.jpg" alt="鲁邦三世"><br>2015 年《鲁邦三世》以意大利为舞台，融合盗宝与悬疑。新角色瑞贝卡带来化学反应，爵士乐带来浪漫与不羁。<br><strong>观看建议</strong>：适合冒险与风格化动画爱好者。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/115661">鲁邦三世 Part IV </a></p><h3 id="《一拳超人》"><a href="#《一拳超人》" class="headerlink" title="《一拳超人》"></a>《一拳超人》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/8c/a2/127563_nl66u.jpg" alt="一拳超人"><br>《一拳超人》以埼玉一拳解决敌人的设定解构英雄主义，烦恼不是怪人而是超市特卖。Madhouse 顶级作画带来双重享受。<br><strong>观看建议</strong>：适合热血与幽默爱好者，准备被爽到。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/127563">一拳超人 </a></p><h2 id="2016-年"><a href="#2016-年" class="headerlink" title="2016 年"></a>2016 年</h2><h3 id="《Re-从零开始的异世界生活》"><a href="#《Re-从零开始的异世界生活》" class="headerlink" title="《Re:从零开始的异世界生活》"></a>《Re:从零开始的异世界生活》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/cb/78/140001_Ew1mo.jpg" alt="Re:从零开始的异世界生活"><br>《Re:从零开始的异世界生活》重新定义穿越残酷。昴仅靠“死亡回归”，用无数死亡换取拯救机会，绝望与勇气交织，雷姆不可错过。<br><strong>观看建议</strong>：适合情感冲击爱好者，准备被虐心。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/140001">Re:从零开始的异世界生活 </a></p><h3 id="《在下坂本，有何贵干？》"><a href="#《在下坂本，有何贵干？》" class="headerlink" title="《在下坂本，有何贵干？》"></a>《在下坂本，有何贵干？》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/7c/01/165829_cwSZV.jpg" alt="在下坂本，有何贵干？"><br>《在下坂本，有何贵干？》将“装酷”化为艺术，坂本以匪夷所思方式化解一切，剧情离谱但爽快，纯粹搞笑佳作。<br><strong>观看建议</strong>：适合轻松一笑，喝水时慎看。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/165829">在下坂本，有何贵干？ </a></p><h3 id="《3-月的狮子》"><a href="#《3-月的狮子》" class="headerlink" title="《3 月的狮子》"></a>《3 月的狮子》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/a7/86/147068_60GJJ.jpg" alt="3月的狮子"><br>《3 月的狮子》讲述孤独职业将棋手桐山零在川本三姐妹温暖下走出阴霾。Shaft 天马行空画面具象化抑郁，治愈又深刻。<br><strong>观看建议</strong>：适合心理描写爱好者，感受温柔与坚韧。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/147068">3 月的狮子 </a></p><h2 id="2017-年"><a href="#2017-年" class="headerlink" title="2017 年"></a>2017 年</h2><h3 id="《小林家的龙女仆》"><a href="#《小林家的龙女仆》" class="headerlink" title="《小林家的龙女仆》"></a>《小林家的龙女仆》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/e9/15/179949_c2j50.jpg" alt="小林家的龙女仆"><br>《小林家的龙女仆》讲述龙女托尔为报恩成社畜小林女仆，带来性格各异龙伙伴。京都动画细腻作画展现跨越种族温馨日常，康娜萌点无法抗拒。<br><strong>观看建议</strong>：适合治愈与奇幻爱好者，享受家庭温暖。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/179949">小林家的龙女仆 </a></p><h3 id="《来自深渊》"><a href="#《来自深渊》" class="headerlink" title="《来自深渊》"></a>《来自深渊》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/f7/bf/203526_q2P6P.jpg" alt="来自深渊"><br>《来自深渊》以童话画风掩盖残酷世界观，莉可和雷格探索充满奇幻与诅咒的深渊，每步伴随血腥代价，震撼人心。<br><strong>观看建议</strong>：适合硬核冒险爱好者，深夜慎看。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/203526">来自深渊 </a></p><h2 id="2018-年"><a href="#2018-年" class="headerlink" title="2018 年"></a>2018 年</h2><h3 id="《紫罗兰永恒花园》"><a href="#《紫罗兰永恒花园》" class="headerlink" title="《紫罗兰永恒花园》"></a>《紫罗兰永恒花园》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/1e/e2/183878_Fef1o.jpg" alt="紫罗兰永恒花园"><br>京都动画的《紫罗兰永恒花园》被誉为“写给世界的情书”。前战争机器薇尔莉特通过书写信件理解“爱”，每集如电影般精良，催泪又治愈。<br><strong>观看建议</strong>：适合情感深度爱好者，准备被感动。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/183878">紫罗兰永恒花园 </a></p><h3 id="《灵能百分百》"><a href="#《灵能百分百》" class="headerlink" title="《灵能百分百》"></a>《灵能百分百》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/2b/85/158316_gz1mM.jpg" alt="灵能百分百"><br>《灵能百分百》讲述超能力少年影山茂夫成长故事，顶级打斗作画包裹温柔内核，强调善良与勇气。<br><strong>观看建议</strong>：适合动作与成长主题爱好者，享受视觉盛宴。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/158316">灵能百分百 </a></p><h3 id="《碧蓝之海》"><a href="#《碧蓝之海》" class="headerlink" title="《碧蓝之海》"></a>《碧蓝之海》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/1f/13/235130_suy3s.jpg" alt="碧蓝之海"><br>《碧蓝之海》是爆笑青春喜剧，表面讲潜水，实为大学生喝酒与沙雕日常，无下限搞笑展现大学生活荒诞乐趣。<br><strong>观看建议</strong>：适合放松大笑，准备笑出腹肌。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/235130">碧蓝之海 </a></p><h3 id="《强风吹拂》"><a href="#《强风吹拂》" class="headerlink" title="《强风吹拂》"></a>《强风吹拂》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/d0/e0/248154_D8z6D.jpg" alt="强风吹拂"><br>《强风吹拂》是群像体育剧，十个背景各异大学生为箱根驿传奋斗，细腻描绘坚持与目标。<br><strong>观看建议</strong>：适合励志故事爱好者，看完想穿跑鞋。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/248154">强风吹拂 </a></p><h3 id="《青春猪头少年不会梦到兔女郎学姐》"><a href="#《青春猪头少年不会梦到兔女郎学姐》" class="headerlink" title="《青春猪头少年不会梦到兔女郎学姐》"></a>《青春猪头少年不会梦到兔女郎学姐》</h3><p><img src="https://lain.bgm.tv/r/400/pic/cover/l/b9/45/240038_b5j7g.jpg" alt="青春猪头少年不会梦到兔女郎学姐"><br>《青春猪头少年不会梦到兔女郎学姐》以量子力学与青春期综合症为内核，梓川咲太帮助患怪病的樱岛麻衣，机智对话和深刻人物塑造令人印象深刻。<br><strong>观看建议</strong>：适合浪漫与超自然爱好者，享受智商在线剧情。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/240038">青春猪头少年不会梦到兔女郎学姐 </a></p><h2 id="2019-年"><a href="#2019-年" class="headerlink" title="2019 年"></a>2019 年</h2><h3 id="《辉夜大小姐想让我告白》"><a href="#《辉夜大小姐想让我告白》" class="headerlink" title="《辉夜大小姐想让我告白》"></a>《辉夜大小姐想让我告白》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/2a/f7/248175_2w4zT.jpg" alt="辉夜大小姐想让我告白"><br>《辉夜大小姐想让我告白》将恋爱拍成史诗战争片，白银御行与四宫辉夜为让对方先告白展开高能智斗，藤原千花混沌加入笑点翻倍。<br><strong>观看建议</strong>：搭配弹幕，吐槽比正片精彩。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/248175">辉夜大小姐想让我告白 </a></p><h3 id="《鬼灭之刃》"><a href="#《鬼灭之刃》" class="headerlink" title="《鬼灭之刃》"></a>《鬼灭之刃》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/9d/d1/245665_5an54.jpg" alt="鬼灭之刃"><br>《鬼灭之刃》凭飞碟社变态级制作成现象级作品，第 19 集“火之神神乐”震撼视听，炭治郎为救妹妹踏上斩鬼之路，感人至深。<br><strong>观看建议</strong>：适合热血与感动爱好者，准备被燃到。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/245665">鬼灭之刃 </a></p><h3 id="《-石纪元》"><a href="#《-石纪元》" class="headerlink" title="《 石纪元》"></a>《 石纪元》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/08/3a/266794_imVve.jpg" alt="石纪元"><br>《 石纪元》让观众爱上科学，千空从石器时代重建文明，充满探索乐趣和创造豪情，知识量暴增。<br><strong>观看建议</strong>：适合科普与冒险爱好者，感受科学魅力。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/261431"> 石纪元 </a></p><h3 id="《冰海战记》"><a href="#《冰海战记》" class="headerlink" title="《冰海战记》"></a>《冰海战记》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/31/8f/240386_6Q62q.jpg" alt="冰海战记"><br>《冰海战记》是史诗级作品，第一季聚焦托尔芬复仇，第二季转向赎罪与和平，立意深刻，令人震撼。<br><strong>观看建议</strong>：适合历史与深度爱好者，两季不可错过。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/227995">冰海战记 </a></p><h2 id="2020-年"><a href="#2020-年" class="headerlink" title="2020 年"></a>2020 年</h2><h3 id="《别对映像研出手！》"><a href="#《别对映像研出手！》" class="headerlink" title="《别对映像研出手！》"></a>《别对映像研出手！》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/5f/18/282433_9wDx9.jpg" alt="别对映像研出手！"><br>汤浅政明的《别对映像研出手！》是献给动画爱好者的情书，三位少女凭热情与想象力创造动画，画面天马行空，展现创作魅力。<br><strong>观看建议</strong>：适合创意与艺术爱好者，感受动画魔力。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/282433">别对映像研出手！ </a></p><h3 id="《咒术回战》"><a href="#《咒术回战》" class="headerlink" title="《咒术回战》"></a>《咒术回战》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/60/fe/294993_JrrzK.jpg" alt="咒术回战"><br>《咒术回战》是新时代少年漫标杆，MAPPA 精良制作带来时髦人设与流畅打斗，五条悟“无量空处”燃爆全场，角色魅力十足。<br><strong>观看建议</strong>：适合动作与幽默爱好者，入坑首选。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/294993">咒术回战 </a></p><h2 id="2021-年"><a href="#2021-年" class="headerlink" title="2021 年"></a>2021 年</h2><h3 id="《赛马娘-第二季》"><a href="#《赛马娘-第二季》" class="headerlink" title="《赛马娘 第二季》"></a>《赛马娘 第二季》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/1c/6b/315574_tLgrT.jpg" alt="赛马娘 第二季"><br>《赛马娘 第二季》以东海帝皇为主角，讲述传奇赛马起伏人生，永不放弃精神令人动容，热血催泪奇迹之作。<br><strong>观看建议</strong>：无需看第一季，直接入坑，准备被感动。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/315574">赛马娘 第二季 </a></p><h3 id="《无职转生》"><a href="#《无职转生》" class="headerlink" title="《无职转生》"></a>《无职转生》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/8b/00/277554_z999u.jpg" alt="无职转生"><br>《无职转生》是异世界题材集大成者，34 岁废人转生后弥补遗憾，细腻世界观和真实角色塑造令人印象深刻。<br><strong>观看建议</strong>：适合深度异世界爱好者，忽略前期争议。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/277554">无职转生 </a></p><h3 id="《86-不存在的战区-》"><a href="#《86-不存在的战区-》" class="headerlink" title="《86-不存在的战区-》"></a>《86-不存在的战区-》</h3><p><img src="https://lain.bgm.tv/r/400/pic/cover/l/a4/b3/302189_SfN7e.jpg" alt="86-不存在的战区-"><br>《86》以机甲战争为外衣，探讨种族歧视与人性救赎，“86”与雷娜羁绊感人，泽野弘之配乐催泪神器。<br><strong>观看建议</strong>：适合深刻剧情爱好者，准备被震撼。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/302189">86-不存在的战区- </a></p><h2 id="2022-年"><a href="#2022-年" class="headerlink" title="2022 年"></a>2022 年</h2><h3 id="《更衣人偶坠入爱河》"><a href="#《更衣人偶坠入爱河》" class="headerlink" title="《更衣人偶坠入爱河》"></a>《更衣人偶坠入爱河》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/9c/4d/333158_PA0F4.jpg" alt="更衣人偶坠入爱河"><br>《更衣人偶坠入爱河》讲述热爱 cosplay 的喜多川海梦与内向五条新菜因共同爱好擦出火花，对 cosplay 文化尊重令人感动，甜度爆表。<br><strong>观看建议</strong>：适合浪漫与青春爱好者，准备被甜到。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/333158">更衣人偶坠入爱河 </a></p><h3 id="《间谍过家家》"><a href="#《间谍过家家》" class="headerlink" title="《间谍过家家》"></a>《间谍过家家》</h3><p><img src="https://lain.bgm.tv/r/400/pic/cover/l/de/4a/329906_hmtVD.jpg" alt="间谍过家家"><br>《间谍过家家》是现象级合家欢作品，洛伊德、约尔和阿尼亚组成临时家庭，融合紧张与搞笑，温暖治愈。<br><strong>观看建议</strong>：适合全年龄观众，享受欢乐与感动。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/329906">间谍过家家 </a></p><h3 id="《夏日重现》"><a href="#《夏日重现》" class="headerlink" title="《夏日重现》"></a>《夏日重现》</h3><p><img src="https://lain.bgm.tv/r/400/pic/cover/l/d9/f5/326895_j1S2n.jpg" alt="夏日重现"><br>《夏日重现》是高能悬疑片，慎平因青梅竹马葬礼卷入时间循环与影子传说，节奏快，反转多，智斗精彩。<br><strong>观看建议</strong>：适合悬疑与智斗爱好者，一口气看完最爽。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/326895">夏日重现 </a></p><h3 id="《异世界舅舅》"><a href="#《异世界舅舅》" class="headerlink" title="《异世界舅舅》"></a>《异世界舅舅》</h3><p><img src="https://lain.bgm.tv/r/400/pic/cover/l/1a/75/339326_v466V.jpg" alt="异世界舅舅"><br>2022 年的《异世界舅舅》是反套路异世界喜剧，主角是穿越者外甥，舅舅带魔法和 90 年代宅文化归来，回忆真实冒险，笑点密集，吐槽精准。<br><strong>观看建议</strong>：适合搞笑和吐槽文化爱好者，准备笑到捶地。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/339326">异世界舅舅 </a></p><h3 id="《孤独摇滚！》"><a href="#《孤独摇滚！》" class="headerlink" title="《孤独摇滚！》"></a>《孤独摇滚！》</h3><p><img src="https://lain.bgm.tv/r/400/pic/cover/l/e2/e7/328609_2EHLJ.jpg" alt="孤独摇滚！"><br>2022 年的《孤独摇滚！》（Bocchi the Rock!）是年度黑马，讲述社恐吉他天才少女后藤一里渴望组建乐队。天马行空演出展现社恐内心，爆笑中感同身受，音乐动听，制作精良。<br><strong>观看建议</strong>：适合社恐人士和音乐爱好者，享受视听盛宴。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/328609">孤独摇滚！ </a></p><h2 id="2023-年"><a href="#2023-年" class="headerlink" title="2023 年"></a>2023 年</h2><h3 id="《别当欧尼酱了！》"><a href="#《别当欧尼酱了！》" class="headerlink" title="《别当欧尼酱了！》"></a>《别当欧尼酱了！》</h3><p><img src="https://lain.bgm.tv/r/400/pic/cover/l/7e/ca/378862_24TnR.jpg" alt="别当欧尼酱了！"><br>2023 年的《别当欧尼酱了！》（Onimai: I’m Now Your Sister!）由动画工坊制作，将“萌”发挥极致。技术宅哥哥被妹妹药物变可爱女孩，顶级丝滑作画，细节丰富，表情生动，被誉为“作画厨天堂”。<br><strong>观看建议</strong>：适合可爱画风和轻松喜剧爱好者，享受视觉盛宴。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/378862">别当欧尼酱了！ </a></p><h3 id="《我心里危险的东西》"><a href="#《我心里危险的东西》" class="headerlink" title="《我心里危险的东西》"></a>《我心里危险的东西》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/01/ee/394260_VMqvV.jpg" alt="我心里危险的东西"><br>2023 年的《我心里危险的东西》是出人意料纯爱故事，中二少年市川京太郎幻想“干掉”美少女山田杏奈，逐渐揭示暗恋，细腻描绘青春期敏感与纠结，后期甜度爆表。<br><strong>观看建议</strong>：适合校园恋爱和情感细腻爱好者，准备被甜到。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/394260">我心里危险的东西 </a></p><h3 id="《【我推的孩子】》"><a href="#《【我推的孩子】》" class="headerlink" title="《【我推的孩子】》"></a>《【我推的孩子】》</h3><p><img src="https://lain.bgm.tv/r/400/pic/cover/l/98/5e/386809_1yR81.jpg" alt="【我推的孩子】"><br>2023 年的《【我推的孩子】》（Oshi no Ko）以 90 分钟超长首集开场，融合偶像、转生、悬疑与复仇，揭示娱乐圈黑暗面，节奏紧凑，话题性强，引发广泛讨论。<br><strong>观看建议</strong>：适合悬疑与社会议题爱好者，准备被震撼。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/386809">【我推的孩子】 </a></p><h3 id="《BanG-Dream-It’s-MyGO-》"><a href="#《BanG-Dream-It’s-MyGO-》" class="headerlink" title="《BanG Dream! It’s MyGO!!!!!》"></a>《BanG Dream! It’s MyGO!!!!!》</h3><p><img src="https://lain.bgm.tv/r/400/pic/cover/l/e7/a7/428735_1v11n.jpg" alt="BanG Dream! It&#39;s MyGO!!!!!"><br>2023 年的《BanG Dream! It’s MyGO!!!!!》是能让你看偶像番看出胃疼的“奇药”。它抛弃阳光套路，描绘五个性格沉重的少女如何因误会、逃避、嫉妒而分崩离析，又因无法割舍的感情重新走到一起。剧情扭曲，台词经典，人物关系剪不断理还乱，看得人又爱又恨。<br><strong>观看建议</strong>：中文名《迷途羔羊》，适合扭曲情感爱好者，准备迎接下一部“母鸡卡”的洗礼。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/428735">BanG Dream! It’s MyGO!!!!! </a></p><h3 id="《葬送的芙莉莲》"><a href="#《葬送的芙莉莲》" class="headerlink" title="《葬送的芙莉莲》"></a>《葬送的芙莉莲》</h3><p><img src="https://lain.bgm.tv/r/400/pic/cover/l/13/c5/400602_ZI8Y9.jpg" alt="葬送的芙莉莲"><br>《葬送的芙莉莲》像诗和散文般的治愈系奇幻番。活了上千年的精灵魔法使芙莉莲，在勇者同伴逝去后，才踏上了解人类的旅途。她沿着旧日足迹回忆点滴，在平淡中感受时光流逝与情感重量，不刻意煽情却能让人潸然泪下。<br><strong>观看建议</strong>：适合静心欣赏，感受生命短暂而耀眼。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/400602">葬送的芙莉莲 </a></p><h2 id="2024-年"><a href="#2024-年" class="headerlink" title="2024 年"></a>2024 年</h2><h3 id="《迷宫饭》"><a href="#《迷宫饭》" class="headerlink" title="《迷宫饭》"></a>《迷宫饭》</h3><p><img src="https://lain.bgm.tv/r/400/pic/cover/l/c5/88/395378_jztpO.jpg" alt="迷宫饭"><br>《迷宫饭》将硬核奇幻 RPG 与严谨美食烹饪结合，主角莱欧斯小队为省钱救妹妹，走上以魔物为食的道路。史莱姆、蛇尾鸡、宝箱怪皆可食，设定离谱但看得人口水直流，构建了真实可信的奇幻世界。<br><strong>观看建议</strong>：深夜慎看，以免饿到啃枕头。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/395378">迷宫饭 </a></p><h3 id="《败犬女主太多了！》"><a href="#《败犬女主太多了！》" class="headerlink" title="《败犬女主太多了！》"></a>《败犬女主太多了！》</h3><p><img src="https://lain.bgm.tv/r/400/pic/cover/l/e4/dc/464376_NsZRw.jpg" alt="败犬女主太多了！"><br>《败犬女主太多了！》标题即核心，当故事里全是恋爱喜剧中的败犬女主角时会发生什么？路人男主温水和彦与败犬们产生交集，充满自嘲和解构精神，疯狂吐槽恋爱番套路。<br><strong>观看建议</strong>：适合看腻传统党争的观众，准备会心一笑。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/464376">败犬女主太多了！ </a></p><h3 id="《胆大党》"><a href="#《胆大党》" class="headerlink" title="《胆大党》"></a>《胆大党》</h3><p><img src="https://lain.bgm.tv/r/400/pic/cover/l/44/7d/467461_HHw4K.jpg" alt="胆大党"><br>《胆大党》是混沌高速神经病佳作。信奉幽灵的少女与信奉外星人的宅男因赌约闯入彼此领域，开启被追着打的刺激冒险。想象力和画面表现力炸裂，剧情快到飞起，纯粹追求感官刺激。<br><strong>观看建议</strong>：适合追求爽快与邪道剧情的观众。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/467461">胆大党 </a></p><h2 id="2025-年"><a href="#2025-年" class="headerlink" title="2025 年"></a>2025 年</h2><h3 id="《末日后酒店》"><a href="#《末日后酒店》" class="headerlink" title="《末日后酒店》"></a>《末日后酒店》</h3><p><img src="https://lain.bgm.tv/pic/cover/l/6e/1a/509986_99qsc.jpg" alt="末日后酒店"><br>《银河楼福地》设定在人类离开后的废土地球，东京银座的“银河楼”酒店却持续营业，由机器人等待人类重返。设定新颖，在感人升华时突然转为喜剧，是一部值得期待的黑马。<br><strong>观看建议</strong>：适合喜欢新颖设定和治愈喜剧的观众。<br><strong>参考链接</strong>： <a href="https://bangumi.tv/subject/509986">银河楼福地 </a></p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>从 2003 年到 2025 年，这趟穿越了二十多年的动漫之旅暂时告一段落。我们一起见证了“等价交换”的沉重，感受了“轻音少女”的悠闲；我们为“石头门”的选择而揪心，也为“芙莉莲”的千年孤寂而感叹。</p><p>对于我们来说，动画早已不是简单的娱乐，它是一代人的青春，是另一个世界的梦想，是我们疲惫生活里的英雄梦。它教会我们羁绊、成长、爱与勇气。或许我们终将长大，但心中那份对二次元的热爱永远不会褪色，因为正是这些闪闪发光的故事，构成了我们人生中不可或缺的一部分。</p><p>感谢你的阅读，希望这份片单能为你带来美好的观影体验。如果你有特别喜欢的作品，也欢迎在评论中分享！</p>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E5%8A%A8%E6%BC%AB/">动漫</category>
      
      
      <category domain="https://www.chillg.de/tags/%E5%8A%A8%E6%BC%AB/">动漫</category>
      
      <category domain="https://www.chillg.de/tags/%E6%9D%82%E8%B0%88/">杂谈</category>
      
      
      <comments>https://www.chillg.de/posts/8f2dd1cc.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>翻译质量大比拼：微软、谷歌、硅基流动与DeepLX的较量</title>
      <link>https://www.chillg.de/posts/f30e404b.html</link>
      <guid>https://www.chillg.de/posts/f30e404b.html</guid>
      <pubDate>Mon, 14 Jul 2025 14:38:10 GMT</pubDate>
      
      <description>在数字时代，翻译工具不仅是语言沟通的桥梁，更是文化交流的纽带。沉浸式翻译（Immersive Translate）浏览器插件通过整合多种翻译接口，让用户在浏览网页或阅读文档时轻松获取双语内容。然而，不同翻译接口的质量差异可能显著影响用户体验。本文通过12个测试用例，深入比较微软翻译、谷歌翻译、硅基流动和DeepLX自建API在技术、文学、商务、文化和对话场景中的表现，旨在找出最佳翻译接口。</description>
      
      
      
      <content:encoded><![CDATA[<h1 id="翻译工具擂台赛：微软、谷歌、硅基流动和-DeepLX-谁更懂人话？"><a href="#翻译工具擂台赛：微软、谷歌、硅基流动和-DeepLX-谁更懂人话？" class="headerlink" title="翻译工具擂台赛：微软、谷歌、硅基流动和 DeepLX 谁更懂人话？"></a>翻译工具擂台赛：微软、谷歌、硅基流动和 DeepLX 谁更懂人话？</h1><p>在数字时代，翻译工具不仅是语言沟通的桥梁，更是文化交流的纽带。沉浸式翻译（Immersive Translate）浏览器插件通过整合多种翻译接口，让用户在浏览网页或阅读文档时轻松获取双语内容。然而，不同翻译接口的质量差异可能显著影响用户体验。本文通过 12 个测试用例，深入比较微软翻译、谷歌翻译、硅基流动和 DeepLX 自建 API 在技术、文学、商务、文化和对话场景中的表现，旨在找出最佳翻译接口。</p><h2 id="背景介绍"><a href="#背景介绍" class="headerlink" title="背景介绍"></a>背景介绍</h2><p>沉浸式翻译是一款广受欢迎的浏览器扩展，支持网页、PDF 和字幕的实时双语翻译。它通过智能识别网页主要内容区域，提供逐段翻译，保留原文布局，极大提升阅读体验（<a href="https://immersivetranslate.com/">Immersive Translate 官网</a>）。该插件支持多种翻译引擎，包括微软翻译、谷歌翻译、硅基流动和 DeepLX 自建 API。以下是各接口简介：</p><ul><li><strong>微软翻译</strong>：微软提供的翻译服务，集成于其产品生态，覆盖多种语言，但在文学和习语翻译上可能稍逊。</li><li><strong>谷歌翻译</strong>：全球最广泛使用的翻译工具，凭借神经机器翻译技术，支持 130+种语言，适合通用场景（<a href="https://translate.google.com/">Google Translate</a>）。</li><li><strong>硅基流动</strong>：一家专注于 AI 基础设施的中国公司，提供包括 Qwen2 和 GLM-4 在内的开源模型 API，免费且高效，适合技术性翻译（<a href="https://siliconflow.cn/">SiliconFlow 官网</a>）。</li><li><strong>DeepLX 自建 API</strong>：可能是基于 DeepL 技术的自定义 API，以高精度和语境准确性著称，尤其在欧洲语言和中文翻译中表现优异（<a href="https://www.deepl.com/">DeepL 官网</a>）。</li></ul><p>我们将通过五大类测试用例，评估这些接口在准确性、流畅性、语气保持和特殊术语处理方面的表现。</p><h2 id="测试方法"><a href="#测试方法" class="headerlink" title="测试方法"></a>测试方法</h2><p>我们设计了 12 个测试用例，涵盖以下类别：</p><ol><li><strong>技术与科学文本</strong>：测试术语准确性和逻辑清晰度。</li><li><strong>文学与描述文本</strong>：评估语言的美感和意象保留。</li><li><strong>商务与正式沟通</strong>：检查正式语气和专业术语的翻译。</li><li><strong>文化与习语表达</strong>：分析习语和文化概念的处理。</li><li><strong>对话与营销文本</strong>：关注日常用语的自然性和营销语言的吸引力。</li></ol><p>每个用例提供原始英文文本和四种接口的中文翻译，评估标准包括：</p><ul><li><strong>准确性</strong>：翻译是否准确传达原文意思。</li><li><strong>流畅性</strong>：翻译是否自然，符合中文表达习惯。</li><li><strong>语气与风格</strong>：是否保留原文的语气（如正式、诗意）。</li><li><strong>特殊用例处理</strong>：对习语、文化术语或歧义句的处理能力。</li></ul><h2 id="测试用例与分析"><a href="#测试用例与分析" class="headerlink" title="测试用例与分析"></a>测试用例与分析</h2><h3 id="1-技术与科学文本"><a href="#1-技术与科学文本" class="headerlink" title="1. 技术与科学文本"></a>1. 技术与科学文本</h3><h4 id="测试用例-1：CRISPR-Cas9-系统"><a href="#测试用例-1：CRISPR-Cas9-系统" class="headerlink" title="测试用例 1：CRISPR-Cas9 系统"></a>测试用例 1：CRISPR-Cas9 系统</h4><p><strong>原文</strong>：<br>“The CRISPR-Cas9 system enables precise genome editing by utilizing a guide RNA to target specific DNA sequences. This revolutionary technology, albeit controversial, holds promise for treating genetic disorders.”</p><p><strong>翻译</strong>：</p><ul><li><strong>微软翻译</strong>：CRISPR-Cas9 系统利用向导 RNA 靶向特定 DNA 序列，从而实现精确的基因组编辑。这项革命性的技术尽管存在争议，但有望治疗遗传疾病。</li><li><strong>谷歌翻译</strong>：CRISPR-Cas9 系统利用向导 RNA 靶向特定 DNA 序列，实现精准的基因组编辑。这项革命性的技术虽然存在争议，但在治疗遗传疾病方面却前景光明。</li><li><strong>硅基流动</strong>：CRISPR-Cas9 系统通过利用向导 RNA 靶向特定 DNA 序列，实现精准的基因编辑。尽管这项革命性技术存在争议，但它有望用于治疗遗传性疾病。</li><li><strong>DeepLX</strong>：CRISPR-Cas9 系统利用引导 RNA 靶向特定 DNA 序列，实现精确的基因组编辑。这项革命性的技术虽然饱受争议，但却为治疗遗传疾病带来了希望。</li></ul><p><strong>参考译文</strong></p><blockquote><p>CRISPR-Cas9 基因编辑系统通过向导 RNA 靶向特定 DNA 序列，实现精准基因组编辑。这项突破性技术虽存争议，但为治疗遗传性疾病带来希望。</p></blockquote><p><strong>评估</strong>：<br>科学领域中，“guide RNA”标准译名为“引导 RNA”，DeepLX 正确使用此术语，而微软翻译、谷歌翻译、硅基流动使用“向导 RNA”，不够准确。硅基流动将“genome editing”译为“基因编辑”，而非更精确的“基因组编辑”。DeepLX 的翻译准确且流畅，是最佳选择。</p><p><strong>最佳</strong>：DeepLX</p><h4 id="测试用例-2：量子纠缠"><a href="#测试用例-2：量子纠缠" class="headerlink" title="测试用例 2：量子纠缠"></a>测试用例 2：量子纠缠</h4><p><strong>原文</strong>：<br>“Quantum entanglement demonstrates non-local correlations exceeding classical Bell inequalities.”</p><p><strong>翻译</strong>：</p><ul><li><strong>微软翻译</strong>：量子纠缠证明了超过经典贝尔不等式的非局部相关性。</li><li><strong>谷歌翻译</strong>：量子纠缠表现出超越经典贝尔不等式的非局部相关性。</li><li><strong>硅基流动</strong>：量子纠缠展示了超越经典贝尔不等式的非局域相关性。</li><li><strong>DeepLX</strong>：量子纠缠显示了超越经典贝尔不等式的非局部相关性。</li></ul><p><strong>参考译文</strong></p><blockquote><p>量子纠缠现象展现出超越经典贝尔不等式的非局域关联性。</p></blockquote><p><strong>评估</strong>：<br>物理学中，“非局域”是标准术语，硅基流动正确使用，而微软翻译、谷歌翻译、DeepLX 使用“非局部”。“demonstrates”更适合译为“展示”，硅基流动的“展示了”优于微软翻译的“证明了”。硅基流动在术语和语义上最准确。</p><p><strong>最佳</strong>：硅基流动</p><h4 id="测试用例-3：智能手机规格"><a href="#测试用例-3：智能手机规格" class="headerlink" title="测试用例 3：智能手机规格"></a>测试用例 3：智能手机规格</h4><p><strong>原文</strong>：<br>“The new HyperEdge X2000 smartphone features a 7.2-inch AMOLED display, octa-core processor clocked at 3.1 GHz, 12 GB of LPDDR5 RAM, and a 5,000 mAh battery with 65 W fast charging. Its neural processing unit (NPU) accelerates on-device AI tasks such as real-time language translation and image recognition.”</p><p><strong>翻译</strong>：</p><ul><li><strong>微软翻译</strong>：新款 HyperEdge X2000 智能手机配备 7.2 英寸 AMOLED 显示屏、主频为 3.1 GHz 的八核处理器、12 GB LPDDR5 RAM 和 5,000 mAh 电池，可进行 65 W 快速充电。其神经处理单元（NPU）可加速设备上的 AI 任务，例如实时语言翻译和图像识别。</li><li><strong>谷歌翻译</strong>：新款 HyperEdge X2000 智能手机配备 7.2 英寸 AMOLED 显示屏、3.1 GHz 八核处理器、12 GB LPDDR5 RAM 以及支持 65 W 快速充电的 5,000 mAh 电池。其神经处理单元 (NPU) 可加速设备上的 AI 任务，例如实时语言翻译和图像识别。</li><li><strong>硅基流动</strong>：新发布的 HyperEdge X2000 智能手机配备了一块 7.2 英寸的 AMOLED 显示屏，八核处理器主频为 3.1 GHz，12 GB 的 LPDDR5 内存，以及 5000mAh 电池和 65W 快充。其神经处理单元（NPU）可加速设备上的 AI 任务，如实时语言翻译和图像识别。</li><li><strong>DeepLX</strong>：新发布的 HyperEdge X2000 智能手机配备了一块 7.2 英寸的 AMOLED 显示屏，八核处理器主频为 3.1 GHz，12 GB 的 LPDDR5 内存，以及 5000mAh 电池和 65W 快充。其神经处理单元（NPU）可加速设备上的 AI 任务，如实时语言翻译和图像识别。</li></ul><p><strong>参考译文</strong></p><blockquote><p>新款 HyperEdge X2000 智能手机配备 7.2 英寸 AMOLED 显示屏、3.1 GHz 八核处理器、12 GB LPDDR5 内存以及 5000 mAh 电池，支持 65 W 快充。其神经处理单元（NPU）可加速实时语言翻译、图像识别等设备端 AI 任务。</p></blockquote><p><strong>评估</strong>：<br>微软翻译的“可进行 65 W 快速充电”措辞生硬，硅基流动和 DeepLX 使用“65W 快充”更简洁自然。硅基流动和 DeepLX 将“RAM”译为“内存”，符合中文习惯。两者在清晰度和准确性上并列最佳。</p><p><strong>最佳</strong>：硅基流动，DeepLX</p><h3 id="2-文学与描述文本"><a href="#2-文学与描述文本" class="headerlink" title="2. 文学与描述文本"></a>2. 文学与描述文本</h3><h4 id="测试用例-1：日落描述"><a href="#测试用例-1：日落描述" class="headerlink" title="测试用例 1：日落描述"></a>测试用例 1：日落描述</h4><p><strong>原文</strong>：<br>“The amber sunset bled across the horizon, casting long shadows that danced upon the cobblestone streets. A whisper of wind carried the scent of petrichor – that earthy fragrance after rain.”</p><p><strong>翻译</strong>：</p><ul><li><strong>微软翻译</strong>：琥珀色的夕阳在地平线上流血，投下长长的影子，在鹅卵石街道上跳舞。一阵风吹拂着 petrichor 的香味——雨后泥土的香味。</li><li><strong>谷歌翻译</strong>：琥珀色的夕阳洒落在地平线上，长长的影子在鹅卵石街道上舞动。微风轻拂，带来雨后泥土的芬芳——那是泥土的清香。</li><li><strong>硅基流动</strong>：夕阳的琥珀色余晖蔓延至地平线，长长的影子在鹅卵石街道上跳跃起舞。微风中带着雨后泥土的芬芳——那特有的大地香气。</li><li><strong>DeepLX</strong>：琥珀色的夕阳划过地平线，投下长长的影子，在鹅卵石街道上飞舞。一阵风拂过，带着雨后泥土的芬芳。</li></ul><p><strong>参考译文</strong></p><blockquote><p>琥珀色暮霭浸染天际，在鹅卵石街道上投下摇曳的长影。微风轻拂，带来雨后泥土的芬芳——那便是”petrichor”（雨久土香）。</p></blockquote><p><strong>评估</strong>：<br>微软翻译的“流血”虽保留“bled”的意象，但过于直白。谷歌翻译的“洒落”较为平淡，硅基流动的“蔓延”更贴合“bled across”的意境，且“特有的大地香气”对“petrichor”的翻译富有诗意。硅基流动在文学性上最佳。</p><p><strong>最佳</strong>：硅基流动</p><h4 id="测试用例-2：黎明描述"><a href="#测试用例-2：黎明描述" class="headerlink" title="测试用例 2：黎明描述"></a>测试用例 2：黎明描述</h4><p><strong>原文</strong>：<br>“At dawn, the mist hung low over the rolling hills, each blade of grass shimmering with dewdrops like a field of diamonds. A solitary lark broke the silence, its song cascading through the valley, heralding the promise of a new day.”</p><p><strong>翻译</strong>：</p><ul><li><strong>微软翻译</strong>：黎明时分，薄雾低低地笼罩着连绵起伏的山丘，每一片草叶上都闪耀着露珠，就像一片钻石田。一只孤独的百灵鸟打破了寂静，它的歌声在山谷中倾泻而下，预示着新的一天的到来。</li><li><strong>谷歌翻译</strong>：黎明时分，薄雾低垂，笼罩着连绵起伏的山峦，每一片草叶都闪耀着露珠的光芒，宛如一片璀璨的钻石田。一只孤独的云雀打破了寂静，它的歌声回荡在山谷间，宣告着新一天的到来。</li><li><strong>硅基流动</strong>：黎明时分，薄雾低垂在起伏的山丘上，每片草叶上都闪烁着露珠，犹如一片钻石的田野。一只孤独的云雀打破了寂静，它的歌声回荡在山谷中，预示着新一天的希望。</li><li><strong>DeepLX</strong>：黎明时分，薄雾低垂，笼罩着连绵起伏的群山，每一片草叶上都闪烁着露珠，宛如一地钻石。一只孤独的百灵鸟打破了寂静，它的歌声在山谷中回荡，预示着新一天的到来。</li></ul><p><strong>参考译文</strong></p><blockquote><p>拂晓时分，薄雾低垂于起伏的山丘，草叶上的露珠闪烁如一片钻石田野。一只孤独的云雀打破了寂静，它的歌声在山谷中回旋，为新一天带来希望的序曲。</p></blockquote><p><strong>评估</strong>：<br>“Lark”应译为“云雀”，谷歌翻译和硅基流动正确，而微软翻译和 DeepLX 使用“百灵鸟”不够准确。谷歌翻译的“歌声回荡在山谷间”比微软翻译的“倾泻而下”更自然，且“山峦”与“山丘”同义。谷歌翻译在准确性和诗意上最佳。</p><p><strong>最佳</strong>：谷歌翻译（谷歌翻译）</p><h3 id="3-商务与正式沟通"><a href="#3-商务与正式沟通" class="headerlink" title="3. 商务与正式沟通"></a>3. 商务与正式沟通</h3><h4 id="测试用例-1：财务报告邮件"><a href="#测试用例-1：财务报告邮件" class="headerlink" title="测试用例 1：财务报告邮件"></a>测试用例 1：财务报告邮件</h4><p><strong>原文</strong>：<br>“Per our teleconference, please find attached the Q3 financial report for your review. We recommend a phased implementation strategy to mitigate potential operational disruptions.”</p><p><strong>翻译</strong>：</p><ul><li><strong>微软翻译</strong>：根据我们的电话会议，请找到随附的第 3 季度财务报告供您查看。我们建议分阶段实施策略，以减少潜在的运营中断。</li><li><strong>谷歌翻译</strong>：根据我们的电话会议安排，附件中的第三季度财务报告供您查阅。我们建议采取分阶段实施策略，以减少潜在的运营中断。</li><li><strong>硅基流动</strong>：根据我们电话会议的内容，请查收附件中的第三季度财务报告供您审阅。我们建议采取分阶段实施的策略以减轻潜在的运营中断风险。</li><li><strong>DeepLX</strong>：根据我们的电话会议，随函附上第三季度财务报告，供您审阅。我们建议采取分阶段实施战略，以减少潜在的运营中断。</li></ul><p><strong>参考译文</strong></p><blockquote><p>根据电话会议讨论，随函附上第三季度财报供您审阅。建议采用分阶段实施策略，以降低运营中断风险。</p></blockquote><p><strong>评估</strong>：<br>微软翻译的“请找到”不正确，应为“请见附件”。硅基流动添加“风险”一词，原文无此含义，降低准确性。DeepLX 使用“随函附上”和“战略”，语气正式且准确，是最佳选择。</p><p><strong>最佳</strong>：DeepLX</p><h3 id="4-文化与习语表达"><a href="#4-文化与习语表达" class="headerlink" title="4. 文化与习语表达"></a>4. 文化与习语表达</h3><h4 id="测试用例-1：“Break-a-leg-”与“小康社会”"><a href="#测试用例-1：“Break-a-leg-”与“小康社会”" class="headerlink" title="测试用例 1：“Break a leg!”与“小康社会”"></a>测试用例 1：“Break a leg!”与“小康社会”</h4><p><strong>原文</strong>：<br>““Break a leg!” she called out, a quintessential Western idiom that baffled non-native speakers. Meanwhile, the Chinese concept of “小康社会” (xiǎokāng shèhuì) embodies social harmony.”</p><p><strong>翻译</strong>：</p><ul><li><strong>微软翻译</strong>：她喊道：“打断一条腿！”，这是典型的西方成语，让非母语人士感到困惑。同时，中国的“小康社会”（xiǎokāng shèhuì）概念体现了社会和谐。</li><li><strong>谷歌翻译</strong>：她喊道：“Break a leg！”这句典型的西方习语让非英语母语人士感到困惑。而中文里“小康社会”的概念则体现了社会和谐。</li><li><strong>硅基流动</strong>：她喊道：“祝你好运！”这是一个典型的西方惯用语，让非母语者感到困惑。与此同时，“小康社会”（xiǎokāng shèhuì）这一概念则体现了社会和谐。</li><li><strong>DeepLX</strong>：”打断一条腿！”她喊道，这个典型的西方成语让非母语人士感到困惑。与此同时，中国的 “小康社会”（xiǎokāng shèhuì）概念体现了社会和谐。</li></ul><p><strong>参考译文</strong></p><blockquote><p>“Break a leg!”（祝好运！）她喊道——这个典型的西方习语常令非母语者困惑。而中国”小康社会”的理念则体现了社会和谐。</p></blockquote><p><strong>评估</strong>：<br>硅基流动将“Break a leg!”译为“祝你好运”，虽传达意思但丢失习语形式。微软翻译和 D 直译“打断一条腿”，可能让中文读者困惑。谷歌翻译保留英文原句，结合上下文解释，清晰且忠于原文意图。</p><p><strong>最佳</strong>：谷歌翻译</p><h4 id="测试用例-2：习语与谚语"><a href="#测试用例-2：习语与谚语" class="headerlink" title="测试用例 2：习语与谚语"></a>测试用例 2：习语与谚语</h4><p><strong>原文</strong>：<br>“He’s a wolf in sheep’s clothing; still waters run deep.”</p><p><strong>翻译</strong>：</p><ul><li><strong>微软翻译</strong>：他是一只披着羊皮的狼;大智若愚。</li><li><strong>谷歌翻译</strong>：他是披着羊皮的狼；静水流深。</li><li><strong>硅基流动</strong>：他貌狼心羊；静水深流。</li><li><strong>DeepLX</strong>：他是披着羊皮的狼；静水流深。</li></ul><p><strong>参考译文</strong></p><blockquote><p>他是个披着羊皮的狼；静水流深（表面平静却深藏不露）。</p></blockquote><p><strong>评估</strong>：<br>硅基流动的“貌狼心羊”错误，应为“披着羊皮的狼”。微软翻译的“大智若愚”与“still waters run deep”不符。谷歌翻译和 D 正确翻译两个习语为“披着羊皮的狼”和“静水流深”，并列最佳。</p><p><strong>最佳</strong>：谷歌翻译，DeepLX</p><h4 id="测试用例-3：日常对话中的习语"><a href="#测试用例-3：日常对话中的习语" class="headerlink" title="测试用例 3：日常对话中的习语"></a>测试用例 3：日常对话中的习语</h4><p><strong>原文</strong>：<br>““Could you pass the salt? Oh, never mind – I spilled the beans already!””</p><p><strong>翻译</strong>：</p><ul><li><strong>微软翻译</strong>：“你能把盐传出去吗？哦，没关系——我已经把豆子洒了！</li><li><strong>谷歌翻译</strong>：“你能把盐递过来吗？哦，没关系——我已经说漏嘴了！”</li><li><strong>硅基流动</strong>：“能把盐递给我吗？哦，算了——我已经不小心说漏嘴了！”</li><li><strong>DeepLX</strong>：”能把盐递给我吗？哦，算了–我已经说漏嘴了！”</li></ul><p><strong>参考译文</strong></p><blockquote><p>“能递下盐吗？哦不用了——我刚刚说漏嘴了！” （注：”spilled the beans”译为”说漏嘴”而非直译”打翻豆子”）</p></blockquote><p><strong>评估</strong>：<br>微软翻译将“spilled the beans”直译为“把豆子洒了”，错误。谷歌翻译、硅基流动、DeepLX 正确使用“说漏嘴了”。微软翻译的“传出去”不自然，谷歌翻译和 DeepLX 更简洁，硅基流动的“不小心”虽可接受但非必要。谷歌翻译和 DeepLX 并列最佳。</p><p><strong>最佳</strong>：谷歌翻译，DeepLX</p><h3 id="5-对话与营销文本"><a href="#5-对话与营销文本" class="headerlink" title="5. 对话与营销文本"></a>5. 对话与营销文本</h3><h4 id="测试用例-1：歧义句"><a href="#测试用例-1：歧义句" class="headerlink" title="测试用例 1：歧义句"></a>测试用例 1：歧义句</h4><p><strong>原文</strong>：<br>“The man saw the woman with binoculars.”</p><p><strong>翻译</strong>：</p><ul><li><strong>微软翻译</strong>：男人用双筒望远镜看到了那个女人。</li><li><strong>谷歌翻译</strong>：男人用望远镜看见了那个女人。</li><li><strong>硅基流动</strong>：那人用望远镜看到了那个女人。</li><li><strong>DeepLX</strong>：男人用望远镜看到了那个女人。</li></ul><p><strong>参考译文</strong></p><blockquote><p>男子看见了那位拿着望远镜的女子。&#x2F; 男子用望远镜看见了那位女子。（需保留双重含义）</p></blockquote><p><strong>评估</strong>：<br>原文有歧义（可能是“用望远镜看”或“看到带望远镜的女人”），但所有翻译都解为“用望远镜看”，丢失歧义。硅基流动用“那人”不如微软翻译、谷歌翻译、DeepLX 的“男人”具体。谷歌翻译简洁且使用标准术语“望远镜”。</p><p><strong>最佳</strong>：无</p><h4 id="测试用例-2：体育比赛对话"><a href="#测试用例-2：体育比赛对话" class="headerlink" title="测试用例 2：体育比赛对话"></a>测试用例 2：体育比赛对话</h4><p><strong>原文</strong>：<br>“Alice: “Hey, Tom! Did you catch the game last night? It was epic—overtime, last-second three-pointer, the whole nine yards!” Tom: “Absolutely! I couldn’t believe how the crowd went wild. Truly a nail-biter.””</p><p><strong>翻译</strong>：</p><ul><li><strong>微软翻译</strong>：爱丽丝：“嘿，汤姆！你昨晚看比赛了吗？那真是史诗般的——加时赛，最后一秒的三分球，整整九码！ 汤姆：“当然！我简直不敢相信人群是怎么疯狂的。真是个令人毛骨悚然的人。”</li><li><strong>谷歌翻译</strong>：爱丽丝：“嘿，汤姆！你昨晚看比赛了吗？真是精彩绝伦——加时赛，最后一秒的三分球，精彩绝伦！” 汤姆：“绝对精彩！我简直不敢相信观众竟然如此疯狂。真是扣人心弦。”</li><li><strong>硅基流动</strong>：Alice: “嘿，汤姆！你昨晚看了比赛吗？太精彩了——加时赛，最后一秒的三分球，一切都有了！” Tom: “当然！我简直不敢相信现场观众的热情。真是悬念重重。”</li><li><strong>DeepLX</strong>：爱丽丝:”嘿，汤姆！你看了昨晚的比赛吗？太精彩了，加时赛，最后一秒三分球，太精彩了！” 汤姆:”当然！我简直不敢相信观众是多么疯狂。真是扣人心弦啊！”</li></ul><p><strong>参考译文</strong></p><blockquote><p>爱丽丝（Alice）：“嗨，汤姆！你昨晚看比赛了吗？简直太精彩了——加时赛、压哨三分，真是一应俱全！”<br>汤姆（Tom）：“当然看了！观众们的狂热让我难以置信，真是扣人心弦。”</p></blockquote><p><strong>评估</strong>：<br>微软翻译将“the whole nine yards”直译为“整整九码”，错误，且“nail-biter”译为“令人毛骨悚然的人”不正确。硅基流动将“the whole nine yards”译为“一切都有了”，较好地传达意思，且“nail-biter”译为“悬念重重”准确。硅基流动在习语和语气上最佳。</p><p><strong>最佳</strong>：硅基流动</p><h4 id="测试用例-3：营销文案（ZenFocus）"><a href="#测试用例-3：营销文案（ZenFocus）" class="headerlink" title="测试用例 3：营销文案（ZenFocus）"></a>测试用例 3：营销文案（ZenFocus）</h4><p><strong>原文</strong>：<br>“Unlock your potential with “ZenFocus”—the productivity app that adapts to your workflow. From smart reminders to distraction-blocking modes, ZenFocus helps you achieve more in less time. Sign up today and get a 14-day free trial!”</p><p><strong>翻译</strong>：</p><ul><li><strong>微软翻译</strong>：使用“ZenFocus”释放您的潜力 - 适应您的工作流程的生产力应用程序。从智能提醒到分散注意力的模式，ZenFocus 可帮助您在更短的时间内实现更多目标。立即注册并获得 14 天免费试用！</li><li><strong>谷歌翻译</strong>：使用“ZenFocus”——一款适应您工作流程的生产力应用，释放您的潜能。从智能提醒到干扰屏蔽模式，ZenFocus 助您事半功倍。立即注册，即可享受 14 天免费试用！</li><li><strong>硅基流动</strong>：使用“ZenFocus”解锁你的潜力——这款适应你工作流程的生产力应用。从智能提醒到防干扰模式，ZenFocus 帮助你在更短的时间内完成更多任务。今天注册，享受 14 天免费试用期！</li><li><strong>DeepLX</strong>：用 “ZenFocus “释放你的潜能–一款能适应你的工作流程的生产力应用程序。从智能提醒到分心阻断模式，ZenFocus 帮助你在更短的时间内实现更多目标。立即注册，获得 14 天免费试用！</li></ul><p><strong>参考译文</strong></p><blockquote><p>解锁你的潜能，用“ZenFocus”——一款能适应你工作流程的效率应用。从智能提醒到阻断干扰模式，ZenFocus 助你用更少的时间完成更多任务。立即注册，享受 14 天免费试用！</p></blockquote><p><strong>评估</strong>：<br>微软翻译将“distraction-blocking modes”误译为“分散注意力的模式”，意思相反。B 使用“干扰屏蔽模式”正确，且“事半功倍”是一个吸引人的成语，增强营销效果。B 在准确性和吸引力上最佳。</p><p><strong>最佳</strong>：谷歌翻译</p><h2 id="结果总结"><a href="#结果总结" class="headerlink" title="结果总结"></a>结果总结</h2><p>以下是各测试用例最佳接口的汇总表：</p><table><thead><tr><th>测试用例类型</th><th>最佳接口</th></tr></thead><tbody><tr><td>技术与科学文本</td><td></td></tr><tr><td>- CRISPR-Cas9 系统</td><td>DeepLX</td></tr><tr><td>- 量子纠缠</td><td>硅基流动</td></tr><tr><td>- 智能手机规格</td><td>硅基流动，DeepLX</td></tr><tr><td>文学与描述文本</td><td></td></tr><tr><td>- 日落描述</td><td>硅基流动</td></tr><tr><td>- 黎明描述</td><td>谷歌翻译</td></tr><tr><td>商务与正式沟通</td><td></td></tr><tr><td>- 财务报告邮件</td><td>DeepLX</td></tr><tr><td>文化与习语表达</td><td></td></tr><tr><td>- “Break a leg!”与“小康社会”</td><td>谷歌翻译</td></tr><tr><td>- 习语与谚语</td><td>谷歌翻译，DeepLX</td></tr><tr><td>- 日常对话中的习语</td><td>谷歌翻译，DeepLX</td></tr><tr><td>对话与营销文本</td><td></td></tr><tr><td>- 歧义句</td><td>无</td></tr><tr><td>- 体育比赛对话</td><td>硅基流动</td></tr><tr><td>- 营销文案（ZenFocus）</td><td>谷歌翻译</td></tr></tbody></table><p>为确定总体最佳接口，我们为独占最佳分配 1 分，共享最佳分配 0.5 分：</p><ul><li><strong>谷歌翻译</strong>：独占最佳（4、5、黎明描述、营销文案）4 分，共享最佳（习语与谚语、日常对话）1 分，总计 5 分。</li><li><strong>硅基流动</strong>：独占最佳（量子纠缠、日落描述、体育比赛对话）3 分，共享最佳（智能手机规格）0.5 分，总计 3.5 分。</li><li><strong>DeepLX</strong>：独占最佳（CRISPR-Cas9、财务报告）2 分，共享最佳（智能手机规格、习语与谚语、日常对话）1.5 分，总计 3.5 分。</li><li><strong>微软翻译</strong>：无最佳，0 分。</li></ul><h2 id="结论与推荐"><a href="#结论与推荐" class="headerlink" title="结论与推荐"></a>结论与推荐</h2><p>谷歌翻译以 5 分的总分成为最均衡的翻译接口，适合通用翻译需求，尤其在文化习语、歧义句和营销文案中表现出色。其神经机器翻译技术支持 130+种语言，广泛适用于网页浏览和日常使用（<a href="https://translate.google.com/">Google Translate</a>）。</p><p>DeepLX 在技术性和商务文本中表现突出，可能是由于其基于 DeepL 的技术，DeepL 以高精度和语境准确性著称（<a href="https://www.deepl.com/">DeepL 官网</a>）。对于需要专业术语的场景，如学术论文或正式文档，DeepLX 是优选。</p><p>硅基流动在科学术语和文学描述方面表现优异，可能得益于其使用 Qwen2 或 GLM-4 等先进模型（<a href="https://siliconflow.cn/">SiliconFlow 官网</a>）。对于科学或艺术性文本，硅基流动是不错的选择。</p><p>微软翻译在测试中表现较弱，尤其在习语和文学翻译中，可能是由于其在语境处理上的局限性。</p><p><strong>推荐</strong>：</p><ul><li><strong>通用需求</strong>：选择谷歌翻译以获得均衡表现。</li><li><strong>技术与商务</strong>：优先考虑 DeepLX 以确保高精度。</li><li><strong>科学与文学</strong>：硅基流动适合专业或艺术性翻译。</li></ul><p>沉浸式翻译插件的灵活性允许用户根据具体需求切换接口，最大化翻译效果。未来，随着 AI 模型的进步，硅基流动和 DeepLX 可能进一步挑战谷歌翻译的霸主地位。</p>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E6%9D%82%E8%B0%88/">杂谈</category>
      
      
      <category domain="https://www.chillg.de/tags/%E6%9D%82%E8%B0%88/">杂谈</category>
      
      <category domain="https://www.chillg.de/tags/%E5%B7%A5%E5%85%B7/">工具</category>
      
      <category domain="https://www.chillg.de/tags/%E5%AE%9E%E7%94%A8/">实用</category>
      
      <category domain="https://www.chillg.de/tags/%E6%A8%AA%E5%B1%8F/">横屏</category>
      
      <category domain="https://www.chillg.de/tags/%E7%BF%BB%E8%AF%91/">翻译</category>
      
      
      <comments>https://www.chillg.de/posts/f30e404b.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>C++项目实战——职工管理系统</title>
      <link>https://www.chillg.de/posts/7bbd8d3a.html</link>
      <guid>https://www.chillg.de/posts/7bbd8d3a.html</guid>
      <pubDate>Sun, 10 Nov 2024 13:25:19 GMT</pubDate>
      
      <description>这篇文章详细介绍了一个基于C++实现的职工管理系统，涵盖了职工的增、删、改、查、排序、文件清空等功能。通过使用面向对象的设计思路和多态性，本文展示了如何实现灵活的职工管理，并附有完整的代码示例及运行效果截图，帮助读者理解系统的实现过程和技术细节。</description>
      
      
      
      <content:encoded><![CDATA[<h1 id="职工管理系统"><a href="#职工管理系统" class="headerlink" title="职工管理系统"></a>职工管理系统</h1><p>在进一步深入学习 C++的过程中，我们探索了面向对象编程的思想，并掌握了类和对象的核心概念。我们了解了如何使用封装来保护数据、对象的初始化和清理机制、C++对象模型和<code>this</code>指针的作用。此外，我们还学习了友元、运算符重载、继承、多态以及文件操作。这些知识点将帮助我们构建更复杂的系统，提升编程的结构化和模块化。</p><p>为了实践这些新知识，本项目将基于多态性来实现一个常见的期末大作业项目——<strong>职工管理系统</strong>。这个管理系统可以帮助公司管理所有员工的信息，记录职工的基本情况并简化人事操作流程。</p><p>在本教程中，我们将利用 C++的面向对象特性来设计和实现一个多态的职工管理系统。系统中，公司职工分为三类：普通员工、经理和老板，每类职工的职责各不相同，具体如下：</p><ul><li><strong>普通员工职责</strong>：完成经理分配的任务。</li><li><strong>经理职责</strong>：执行老板布置的任务，同时将任务下发给普通员工。</li><li><strong>老板职责</strong>：管理公司所有事务，确保公司正常运作。</li></ul><p>在此管理系统中，我们需要实现以下核心功能：</p><ul><li><strong>增加职工信息</strong>：实现批量添加职工功能，将每个职工的编号、姓名和部门编号记录到文件中。</li><li><strong>显示职工信息</strong>：展示公司所有职工的基本信息。</li><li><strong>删除离职职工</strong>：根据职工编号删除指定的职工记录。</li><li><strong>修改职工信息</strong>：根据编号修改职工的个人信息。</li><li><strong>查找职工信息</strong>：支持根据职工编号或姓名进行查询，快速定位相关人员信息。</li><li><strong>按照编号排序</strong>：对职工按照编号进行排序，用户可选择不同的排序规则。</li><li><strong>清空所有文档</strong>：清空文件中记录的职工信息，删除前需确认，以防误删。</li><li><strong>退出管理程序</strong>：结束当前的管理系统，退出程序。</li></ul><p>系统的界面效果图如下所示：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/3ac481.png" alt="1"></p><p>用户可以通过不同的选项来操作系统，执行相应的功能。</p><h2 id="1、创建管理类"><a href="#1、创建管理类" class="headerlink" title="1、创建管理类"></a>1、创建管理类</h2><p>在本项目中，我们将采用分文件的结构来构建整个职工管理系统，这种方式比将所有代码放在单一 <code>.cpp</code> 文件中更有优势。分文件法便于代码维护，每个文件专注于不同的功能模块，使项目结构更清晰、逻辑更分明。</p><p>管理类负责的内容如下：</p><ul><li>展示菜单界面，与用户进行交互</li><li>实现对职工的增、删、改、查操作</li><li>处理文件的读写，保存和加载职工信息</li></ul><p>首先，我们在项目中创建两个文件夹：一个用于存放头文件，另一个用于存放源文件。在头文件目录中，创建<code>workerManager.h</code>，在源文件目录中创建<code>workerManager.cpp</code>，分别定义和实现管理类。</p><p>以下是<code>workerManager.h</code>中管理类的初始定义：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">pragma</span> once</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">WorkerManager</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"></span><br><span class="line"><span class="comment">//构造函数</span></span><br><span class="line"><span class="built_in">WorkerManager</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">//析构函数</span></span><br><span class="line">~<span class="built_in">WorkerManager</span>();</span><br><span class="line"></span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>此处，<code>WorkerManager</code>类包含构造函数和析构函数的声明，用于初始化和清理管理类的实例。</p><p>源文件实现:</p><p>在<code>workerManager.cpp</code>中，我们为构造函数和析构函数提供空实现，以便为后续功能扩展提供基础。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;workerManager.h&quot;</span></span></span><br><span class="line"></span><br><span class="line">WorkerManager::<span class="built_in">WorkerManager</span>()</span><br><span class="line">&#123;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">WorkerManager::~<span class="built_in">WorkerManager</span>()</span><br><span class="line">&#123;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>至此，职工管理类的基本结构已完成。</p><h1 id="2、菜单功能"><a href="#2、菜单功能" class="headerlink" title="2、菜单功能"></a>2、菜单功能</h1><p>功能描述：与用户的沟通界面，如图所示：<img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/3ac481.png" alt="1"></p><h3 id="2-1-添加成员函数"><a href="#2-1-添加成员函数" class="headerlink" title="2.1 添加成员函数"></a>2.1 添加成员函数</h3><p>在管理类 workerManager.h 中添加成员函数 <code>void Show_Menu();</code></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">WorkerManager::Show_Menu</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;********************************************&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;*********  欢迎使用职工管理系统！ **********&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;*************  0.退出管理程序  *************&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;*************  1.增加职工信息  *************&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;*************  2.显示职工信息  *************&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;*************  3.删除离职职工  *************&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;*************  4.修改职工信息  *************&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;*************  5.查找职工信息  *************&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;*************  6.按照编号排序  *************&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;*************  7.清空所有文档  *************&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;********************************************&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; endl;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="3、创建职工类"><a href="#3、创建职工类" class="headerlink" title="3、创建职工类"></a>3、创建职工类</h1><p>在职工管理系统中，职工分为三类：普通员工、经理和老板。我们将这三种类型的职工抽象成一个基类（<code>Worker</code>），并通过多态来管理不同类型的职工。每种职工类型将拥有各自的岗位职责和工作描述，从而实现灵活的扩展性和可维护性。</p><h2 id="3-1-创建职工抽象类"><a href="#3-1-创建职工抽象类" class="headerlink" title="3.1 创建职工抽象类"></a>3.1 创建职工抽象类</h2><p>职工的分类为：普通员工、经理、老板</p><p>将三种职工抽象到一个类（worker）中,利用多态管理不同职工种类</p><p>职工的属性为：职工编号、职工姓名、职工所在部门编号</p><p>职工的行为为：岗位职责信息描述，获取岗位名称</p><p>我们将<code>Worker</code>类作为抽象基类，定义职工的基本属性和行为：</p><ul><li><strong>属性</strong>：职工编号、职工姓名、职工所在部门编号</li><li><strong>行为</strong>：显示个人信息、获取岗位名称（纯虚函数）</li></ul><p>在头文件文件夹下创建<code>worker.h</code>文件，代码如下：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// worker.h</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> once</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 职工抽象基类</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Worker</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">    <span class="comment">// 显示个人信息</span></span><br><span class="line">    <span class="function"><span class="keyword">virtual</span> <span class="type">void</span> <span class="title">showInfo</span><span class="params">()</span> </span>= <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 获取岗位名称</span></span><br><span class="line">    <span class="function"><span class="keyword">virtual</span> string <span class="title">getDeptName</span><span class="params">()</span> </span>= <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">    <span class="type">int</span> m_Id;       <span class="comment">// 职工编号</span></span><br><span class="line">    string m_Name;  <span class="comment">// 职工姓名</span></span><br><span class="line">    <span class="type">int</span> m_DeptId;   <span class="comment">// 职工所在部门编号</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>该基类的纯虚函数<code>showInfo</code>和<code>getDeptName</code>要求子类必须实现具体的行为描述和岗位名称获取功能。</p><h2 id="3-2-创建普通员工类"><a href="#3-2-创建普通员工类" class="headerlink" title="3.2 创建普通员工类"></a>3.2 创建普通员工类</h2><p>普通员工类<strong>继承</strong>自<code>Worker</code>抽象类，并实现父类中的纯虚函数。普通员工的职责是完成经理分配的任务。</p><p>在头文件和源文件文件夹下分别创建<code>employee.h</code>和<code>employee.cpp</code>文件。</p><p>employee.h 中代码如下：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// employee.h</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> once</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;worker.h&quot;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Employee</span> : <span class="keyword">public</span> Worker</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">    <span class="built_in">Employee</span>(<span class="type">int</span> id, string name, <span class="type">int</span> dId);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 显示个人信息</span></span><br><span class="line">    <span class="function"><span class="keyword">virtual</span> <span class="type">void</span> <span class="title">showInfo</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 获取岗位名称</span></span><br><span class="line">    <span class="function"><span class="keyword">virtual</span> string <span class="title">getDeptName</span><span class="params">()</span></span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><code>employee.cpp</code>代码：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// employee.cpp</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;employee.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line">Employee::<span class="built_in">Employee</span>(<span class="type">int</span> id, string name, <span class="type">int</span> dId)</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">this</span>-&gt;m_Id = id;</span><br><span class="line">    <span class="keyword">this</span>-&gt;m_Name = name;</span><br><span class="line">    <span class="keyword">this</span>-&gt;m_DeptId = dId;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 显示个人信息</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">Employee::showInfo</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;姓名：&quot;</span> &lt;&lt; <span class="keyword">this</span>-&gt;m_Name</span><br><span class="line">         &lt;&lt; <span class="string">&quot;\t职工编号：&quot;</span> &lt;&lt; <span class="keyword">this</span>-&gt;m_Id</span><br><span class="line">         &lt;&lt; <span class="string">&quot;\t岗位：&quot;</span> &lt;&lt; <span class="keyword">this</span>-&gt;<span class="built_in">getDeptName</span>()</span><br><span class="line">         &lt;&lt; <span class="string">&quot;\t\t职责：完成经理的任务&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取岗位名称</span></span><br><span class="line"><span class="function">string <span class="title">Employee::getDeptName</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">string</span>(<span class="string">&quot;员工&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="3-3-创建经理类"><a href="#3-3-创建经理类" class="headerlink" title="3.3 创建经理类"></a>3.3 创建经理类</h2><p>经理类<strong>继承</strong>自<code>Worker</code>抽象类，并实现父类中的纯虚函数。经理的职责是执行老板布置的任务，并将任务下发给普通员工。</p><p>在头文件和源文件文件夹下分别创建<code>manager.h</code>和<code>manager.cpp</code>文件。</p><p><code>manager.h</code>代码：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// manager.h</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> once</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;worker.h&quot;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Manager</span> : <span class="keyword">public</span> Worker</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">    <span class="built_in">Manager</span>(<span class="type">int</span> id, string name, <span class="type">int</span> dId);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 显示个人信息</span></span><br><span class="line">    <span class="function"><span class="keyword">virtual</span> <span class="type">void</span> <span class="title">showInfo</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 获取岗位名称</span></span><br><span class="line">    <span class="function"><span class="keyword">virtual</span> string <span class="title">getDeptName</span><span class="params">()</span></span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><code>manager.cpp</code>代码：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// manager.cpp</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;manager.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line">Manager::<span class="built_in">Manager</span>(<span class="type">int</span> id, string name, <span class="type">int</span> dId)</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">this</span>-&gt;m_Id = id;</span><br><span class="line">    <span class="keyword">this</span>-&gt;m_Name = name;</span><br><span class="line">    <span class="keyword">this</span>-&gt;m_DeptId = dId;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 显示个人信息</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">Manager::showInfo</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;姓名：&quot;</span> &lt;&lt; <span class="keyword">this</span>-&gt;m_Name</span><br><span class="line">         &lt;&lt; <span class="string">&quot;\t职工编号：&quot;</span> &lt;&lt; <span class="keyword">this</span>-&gt;m_Id</span><br><span class="line">         &lt;&lt; <span class="string">&quot;\t岗位：&quot;</span> &lt;&lt; <span class="keyword">this</span>-&gt;<span class="built_in">getDeptName</span>()</span><br><span class="line">         &lt;&lt; <span class="string">&quot;\t\t职责：完成老板的任务并下发给员工&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取岗位名称</span></span><br><span class="line"><span class="function">string <span class="title">Manager::getDeptName</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">string</span>(<span class="string">&quot;经理&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="3-4-创建老板类"><a href="#3-4-创建老板类" class="headerlink" title="3.4 创建老板类"></a>3.4 创建老板类</h2><p>老板类<strong>继承</strong>自<code>Worker</code>抽象类，并实现父类中的纯虚函数。老板的职责是管理公司所有事务，确保公司运作顺利。</p><p>在头文件和源文件文件夹下分别创建<code>boss.h</code>和<code>boss.cpp</code>文件。</p><p><code>boss.h</code>代码：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// boss.h</span></span><br><span class="line"><span class="meta">#<span class="keyword">pragma</span> once</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;worker.h&quot;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Boss</span> : <span class="keyword">public</span> Worker</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">    <span class="built_in">Boss</span>(<span class="type">int</span> id, string name, <span class="type">int</span> dId);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 显示个人信息</span></span><br><span class="line">    <span class="function"><span class="keyword">virtual</span> <span class="type">void</span> <span class="title">showInfo</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 获取岗位名称</span></span><br><span class="line">    <span class="function"><span class="keyword">virtual</span> string <span class="title">getDeptName</span><span class="params">()</span></span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><code>boss.cpp</code>代码：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// boss.cpp</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;boss.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line">Boss::<span class="built_in">Boss</span>(<span class="type">int</span> id, string name, <span class="type">int</span> dId)</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">this</span>-&gt;m_Id = id;</span><br><span class="line">    <span class="keyword">this</span>-&gt;m_Name = name;</span><br><span class="line">    <span class="keyword">this</span>-&gt;m_DeptId = dId;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 显示个人信息</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">Boss::showInfo</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;姓名：&quot;</span> &lt;&lt; <span class="keyword">this</span>-&gt;m_Name</span><br><span class="line">         &lt;&lt; <span class="string">&quot;\t职工编号：&quot;</span> &lt;&lt; <span class="keyword">this</span>-&gt;m_Id</span><br><span class="line">         &lt;&lt; <span class="string">&quot;\t岗位：&quot;</span> &lt;&lt; <span class="keyword">this</span>-&gt;<span class="built_in">getDeptName</span>()</span><br><span class="line">         &lt;&lt; <span class="string">&quot;\t职责：管理公司的所有事务&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取岗位名称</span></span><br><span class="line"><span class="function">string <span class="title">Boss::getDeptName</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">string</span>(<span class="string">&quot;首席执行官&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>至此，我们已经成功创建了包含普通员工、经理和老板的职工类体系，每个子类都继承了<code>Worker</code>抽象类，并实现了岗位职责的描述方法。这种基于多态的设计使得管理系统可以灵活扩展，方便添加新的职工类型或调整现有类型的职责。</p><h2 id="3-5-测试多态"><a href="#3-5-测试多态" class="headerlink" title="3.5 测试多态"></a>3.5 测试多态</h2><p>在<code>职工管理系统.cpp</code>中添加测试函数<code>test()</code>，用于验证职工管理系统中的多态功能是否能够正常运行。通过创建不同类型的职工对象（普通员工、经理和老板）并调用各自的<code>showInfo()</code>方法，我们可以观察到多态的效果。</p><p>测试代码如下：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;worker.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;employee.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;manager.h&quot;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;boss.h&quot;</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">test</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    Worker* worker = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 创建普通员工对象并展示信息</span></span><br><span class="line">    worker = <span class="keyword">new</span> <span class="built_in">Employee</span>(<span class="number">1</span>, <span class="string">&quot;张员工&quot;</span>, <span class="number">1</span>);</span><br><span class="line">    worker-&gt;<span class="built_in">showInfo</span>();</span><br><span class="line">    <span class="keyword">delete</span> worker;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 创建经理对象并展示信息</span></span><br><span class="line">    worker = <span class="keyword">new</span> <span class="built_in">Manager</span>(<span class="number">2</span>, <span class="string">&quot;李经理&quot;</span>, <span class="number">2</span>);</span><br><span class="line">    worker-&gt;<span class="built_in">showInfo</span>();</span><br><span class="line">    <span class="keyword">delete</span> worker;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 创建老板对象并展示信息</span></span><br><span class="line">    worker = <span class="keyword">new</span> <span class="built_in">Boss</span>(<span class="number">3</span>, <span class="string">&quot;王老板&quot;</span>, <span class="number">3</span>);</span><br><span class="line">    worker-&gt;<span class="built_in">showInfo</span>();</span><br><span class="line">    <span class="keyword">delete</span> worker;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>在<code>test()</code>函数中，我们通过将<code>Worker*</code>指针指向不同类型的职工对象，并调用各自的<code>showInfo()</code>方法，实现了多态调用。每个对象根据其具体类型展示了不同的岗位职责描述，验证了多态的功能。</p><p>运行该测试函数后，终端或控制台应输出每个职工的详细信息，包括姓名、职工编号、岗位和职责描述。运行效果如下图所示：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/a0789f.png" alt="2多态测试"></p><p>测试成功后，您可以选择将<code>test()</code>函数的代码注释保留，方便日后测试或调试；或者选择删除该函数，以保持代码的简洁性。</p><h1 id="4、添加职工"><a href="#4、添加职工" class="headerlink" title="4、添加职工"></a>4、添加职工</h1><p>在本节中，我们实现一个批量添加职工的功能，并将新添加的职工数据保存到文件中。通过该功能，用户可以一次性添加多个职工，并将不同职工类别（普通员工、经理、老板）存储在统一的职工数组中。</p><h2 id="4-1-功能分析"><a href="#4-1-功能分析" class="headerlink" title="4.1 功能分析"></a>4.1 功能分析</h2><p>需求分析：</p><p>用户在批量创建职工时，可以选择不同类别的职工（普通员工、经理、老板）。为了方便管理和存储所有职工信息，我们将使用一个动态数组来存放职工对象的指针，动态扩展数组容量以适应新增数据。</p><p>技术实现：</p><p>为了实现动态管理不定长度的职工数组，我们将数组定义在堆区，并使用<code>Worker**</code>类型的指针来维护该数组，以便在需要时动态调整数组的大小。</p><h2 id="4-2-功能实现"><a href="#4-2-功能实现" class="headerlink" title="4.2 功能实现"></a>4.2 功能实现</h2><p>在 <code>WorkerManager.h</code> 中添加成员属性</p><p>在<code>WorkerManager</code>类中添加以下两个成员属性，用于记录当前职工人数和职工数组：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 记录文件中的职工人数</span></span><br><span class="line"><span class="type">int</span> m_EmpNum;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 职工数组指针，用于存放所有职工的指针</span></span><br><span class="line">Worker** m_EmpArray;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>初始化成员属性</p><p>在 <code>WorkerManager</code> 的构造函数中，初始化职工人数和职工数组指针：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">WorkerManager::<span class="built_in">WorkerManager</span>()</span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">// 初始化职工人数</span></span><br><span class="line">    <span class="keyword">this</span>-&gt;m_EmpNum = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 初始化职工数组指针为空</span></span><br><span class="line">    <span class="keyword">this</span>-&gt;m_EmpArray = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>添加职工函数声明</p><p>在<code>WorkerManager.h</code>头文件中声明<code>Add_Emp()</code>成员函数，用于添加职工：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 增加职工</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">Add_Emp</span><span class="params">()</span></span>;</span><br></pre></td></tr></table></figure><p>实现 <code>Add_Emp()</code> 函数</p><p>在 <code>workerManager.cpp</code> 中实现 <code>Add_Emp()</code> 函数，具体步骤如下：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">WorkerManager::Add_Emp</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;请输入需要增加的职工数量：&quot;</span> &lt;&lt; endl;</span><br><span class="line">    <span class="type">int</span> addNum = <span class="number">0</span>;</span><br><span class="line">    cin &gt;&gt; addNum;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (addNum &gt; <span class="number">0</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment">// 计算新增后的职工总数</span></span><br><span class="line">        <span class="type">int</span> newSize = m_EmpNum + addNum;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 创建一个新数组，大小为 newSize，用于存放新职工</span></span><br><span class="line">        Worker** newSpace = <span class="keyword">new</span> Worker*[newSize];</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 将原有职工数组的数据拷贝到新数组中</span></span><br><span class="line">        <span class="keyword">if</span> (<span class="keyword">this</span>-&gt;m_EmpArray != <span class="literal">NULL</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="keyword">this</span>-&gt;m_EmpNum; i++)</span><br><span class="line">            &#123;</span><br><span class="line">                newSpace[i] = <span class="keyword">this</span>-&gt;m_EmpArray[i];</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 开始添加新职工</span></span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; addNum; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="type">int</span> id;</span><br><span class="line">            string name;</span><br><span class="line">            <span class="type">int</span> dSelect;</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 确保输入的职工编号唯一</span></span><br><span class="line">            <span class="keyword">while</span> (<span class="literal">true</span>)</span><br><span class="line">            &#123;</span><br><span class="line">                cout &lt;&lt; <span class="string">&quot;请输入第&quot;</span> &lt;&lt; i + <span class="number">1</span> &lt;&lt; <span class="string">&quot;名新职工的编号：&quot;</span> &lt;&lt; endl;</span><br><span class="line">                cin &gt;&gt; id;</span><br><span class="line">                <span class="type">int</span> index = <span class="keyword">this</span>-&gt;<span class="built_in">isExist</span>(id);</span><br><span class="line">                <span class="keyword">if</span> (index == <span class="number">-1</span>) <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">else</span> cout &lt;&lt; <span class="string">&quot;该职工编号已存在，请重新输入：&quot;</span> &lt;&lt; endl;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            cout &lt;&lt; <span class="string">&quot;请输入第&quot;</span> &lt;&lt; i + <span class="number">1</span> &lt;&lt; <span class="string">&quot;名新职工的姓名：&quot;</span> &lt;&lt; endl;</span><br><span class="line">            cin &gt;&gt; name;</span><br><span class="line">            cout &lt;&lt; <span class="string">&quot;请选择第&quot;</span> &lt;&lt; i + <span class="number">1</span> &lt;&lt; <span class="string">&quot;名新职工的职工类型：&quot;</span> &lt;&lt; endl;</span><br><span class="line">            cout &lt;&lt; <span class="string">&quot;1、普通职工&quot;</span> &lt;&lt; endl;</span><br><span class="line">            cout &lt;&lt; <span class="string">&quot;2、经理&quot;</span> &lt;&lt; endl;</span><br><span class="line">            cout &lt;&lt; <span class="string">&quot;3、老板&quot;</span> &lt;&lt; endl;</span><br><span class="line">            cin &gt;&gt; dSelect;</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 创建对应类型的职工对象并添加到数组中</span></span><br><span class="line">            Worker* worker = <span class="literal">NULL</span>;</span><br><span class="line">            <span class="keyword">switch</span> (dSelect)</span><br><span class="line">            &#123;</span><br><span class="line">            <span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line">                worker = <span class="keyword">new</span> <span class="built_in">Employee</span>(id, name, dSelect);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line">                worker = <span class="keyword">new</span> <span class="built_in">Manager</span>(id, name, dSelect);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">case</span> <span class="number">3</span>:</span><br><span class="line">                worker = <span class="keyword">new</span> <span class="built_in">Boss</span>(id, name, dSelect);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">default</span>:</span><br><span class="line">                cout &lt;&lt; <span class="string">&quot;无效的职工类型&quot;</span> &lt;&lt; endl;</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 将新职工对象指针存入数组</span></span><br><span class="line">            newSpace[<span class="keyword">this</span>-&gt;m_EmpNum + i] = worker;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 释放旧的职工数组内存</span></span><br><span class="line">        <span class="keyword">delete</span>[] <span class="keyword">this</span>-&gt;m_EmpArray;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 更新指针和人数</span></span><br><span class="line">        <span class="keyword">this</span>-&gt;m_EmpArray = newSpace;</span><br><span class="line">        <span class="keyword">this</span>-&gt;m_EmpNum = newSize;</span><br><span class="line"></span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;成功添加&quot;</span> &lt;&lt; addNum &lt;&lt; <span class="string">&quot;名新职工&quot;</span> &lt;&lt; endl;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 更新文件标志并保存新数据到文件</span></span><br><span class="line">        <span class="keyword">this</span>-&gt;m_FileEmpty = <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">this</span>-&gt;<span class="built_in">save</span>();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;输入非法，添加失败&quot;</span> &lt;&lt; endl;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line">    <span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>在 <code>WorkerManager</code> 析构函数中释放内存</p><p>为了避免内存泄漏，我们在析构函数中释放<code>m_EmpArray</code>数组的内存：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">WorkerManager::~<span class="built_in">WorkerManager</span>()</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">if</span> (<span class="keyword">this</span>-&gt;m_EmpArray != <span class="literal">NULL</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">delete</span>[] <span class="keyword">this</span>-&gt;m_EmpArray;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="4-3-测试添加职工功能"><a href="#4-3-测试添加职工功能" class="headerlink" title="4.3 测试添加职工功能"></a>4.3 测试添加职工功能</h2><p>在主程序的菜单选项中，调用 <code>Add_Emp()</code> 函数，并根据用户输入展示添加职工的结果。运行程序后，终端将显示添加的职工信息，如下图所示：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/10e760.png" alt="03添加员工"></p><p>至此，职工添加功能已完成，实现了批量添加不同类别的职工并将信息保存至文件。</p><h2 id="5、文件交互-写文件"><a href="#5、文件交互-写文件" class="headerlink" title="5、文件交互 - 写文件"></a>5、文件交互 - 写文件</h2><p>在实现职工信息添加后，为了确保数据的持久化，我们需要将数据写入文件中，并在程序启动时从文件中读取这些数据。文件交互的流程可以分为两个步骤：<strong>文件写入</strong>和<strong>文件读取</strong>。</p><h2 id="5-1-文件写入"><a href="#5-1-文件写入" class="headerlink" title="5.1 文件写入"></a>5.1 文件写入</h2><p>在职工管理系统中，当新职工添加完成后，数据会写入文件以实现持久化。写文件的功能如下：</p><h3 id="5-1-1-文件路径设定"><a href="#5-1-1-文件路径设定" class="headerlink" title="5.1.1 文件路径设定"></a>5.1.1 文件路径设定</h3><p>在<code>workerManager.h</code>文件中定义文件路径常量，并包含<code>fstream</code>头文件：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;fstream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> FILENAME <span class="string">&quot;empFile.txt&quot;</span></span></span><br></pre></td></tr></table></figure><h3 id="5-1-2-成员函数声明"><a href="#5-1-2-成员函数声明" class="headerlink" title="5.1.2 成员函数声明"></a>5.1.2 成员函数声明</h3><p>在 <code>WorkerManager</code> 类中声明 <code>save()</code> 函数，用于将职工数据写入文件：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">WorkerManager::save</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    ofstream ofs;</span><br><span class="line">    ofs.<span class="built_in">open</span>(FILENAME, ios::out);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="keyword">this</span>-&gt;m_EmpNum; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        ofs &lt;&lt; <span class="keyword">this</span>-&gt;m_EmpArray[i]-&gt;m_Id &lt;&lt; <span class="string">&quot; &quot;</span></span><br><span class="line">            &lt;&lt; <span class="keyword">this</span>-&gt;m_EmpArray[i]-&gt;m_Name &lt;&lt; <span class="string">&quot; &quot;</span></span><br><span class="line">            &lt;&lt; <span class="keyword">this</span>-&gt;m_EmpArray[i]-&gt;m_DeptId &lt;&lt; endl;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    ofs.<span class="built_in">close</span>();</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="5-1-3-保存文件功能测试"><a href="#5-1-3-保存文件功能测试" class="headerlink" title="5.1.3 保存文件功能测试"></a>5.1.3 保存文件功能测试</h3><p>在成功添加职工后，调用<code>save()</code>函数，将职工信息写入文件：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">this</span>-&gt;<span class="built_in">save</span>();</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>测试程序：运行程序添加职工，验证生成的<code>empFile.txt</code>文件中是否记录了新职工的信息。</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/83abd2.png" alt="04写文件"></p><h2 id="5-2-文件读取"><a href="#5-2-文件读取" class="headerlink" title="5.2 文件读取"></a>5.2 文件读取</h2><p>在程序启动时，从文件中加载职工数据到内存中，便于进行后续操作。文件读取功能将包括文件状态判断、数据读取和内存初始化。</p><h3 id="5-2-1-文件状态判断"><a href="#5-2-1-文件状态判断" class="headerlink" title="5.2.1 文件状态判断"></a>5.2.1 文件状态判断</h3><p>文件状态分为以下三种情况：</p><ol><li>文件未创建：即文件不存在。</li><li>文件存在但无数据：文件存在但内容为空。</li><li>文件存在并包含数据：文件存在且包含职工数据。</li></ol><p>在 <code>workerManager.h</code> 中添加标志属性 <code>m_FileIsEmpty</code>，用于判断文件是否为空：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//标志文件是否为空</span></span><br><span class="line"><span class="type">bool</span> m_FileIsEmpty;</span><br></pre></td></tr></table></figure><p>在构造函数 <code>WorkerManager::WorkerManager</code> 中，根据文件状态初始化数据：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">WorkerManager::<span class="built_in">WorkerManager</span>()</span><br><span class="line">&#123;</span><br><span class="line">    ifstream ifs;</span><br><span class="line">    ifs.<span class="built_in">open</span>(FILENAME, ios::in);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (!ifs.<span class="built_in">is_open</span>())</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment">// 文件不存在</span></span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;文件不存在&quot;</span> &lt;&lt; endl;</span><br><span class="line">        <span class="keyword">this</span>-&gt;m_EmpNum = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">this</span>-&gt;m_FileIsEmpty = <span class="literal">true</span>;</span><br><span class="line">        <span class="keyword">this</span>-&gt;m_EmpArray = <span class="literal">NULL</span>;</span><br><span class="line">        ifs.<span class="built_in">close</span>();</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 文件存在，但内容为空</span></span><br><span class="line">    <span class="type">char</span> ch;</span><br><span class="line">    ifs &gt;&gt; ch;</span><br><span class="line">    <span class="keyword">if</span> (ifs.<span class="built_in">eof</span>())</span><br><span class="line">    &#123;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;文件为空!&quot;</span> &lt;&lt; endl;</span><br><span class="line">        <span class="keyword">this</span>-&gt;m_EmpNum = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">this</span>-&gt;m_FileIsEmpty = <span class="literal">true</span>;</span><br><span class="line">        <span class="keyword">this</span>-&gt;m_EmpArray = <span class="literal">NULL</span>;</span><br><span class="line">        ifs.<span class="built_in">close</span>();</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">this</span>-&gt;m_FileIsEmpty = <span class="literal">false</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>在成功添加职工后，将文件标志更新为非空：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">this</span>-&gt;m_FileIsEmpty = <span class="literal">false</span>;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="5-2-2-获取职工记录数"><a href="#5-2-2-获取职工记录数" class="headerlink" title="5.2.2 获取职工记录数"></a>5.2.2 获取职工记录数</h3><p>在文件读取前，需要获取文件中职工的数量以便初始化数组。定义<code>get_EmpNum</code>函数：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">int</span> <span class="title">WorkerManager::get_EmpNum</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="function">ifstream <span class="title">ifs</span><span class="params">(FILENAME, ios::in)</span></span>;</span><br><span class="line">    <span class="type">int</span> id, dId, num = <span class="number">0</span>;</span><br><span class="line">    string name;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> (ifs &gt;&gt; id &amp;&amp; ifs &gt;&gt; name &amp;&amp; ifs &gt;&gt; dId)</span><br><span class="line">    &#123;</span><br><span class="line">        num++;</span><br><span class="line">    &#125;</span><br><span class="line">    ifs.<span class="built_in">close</span>();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> num;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>在构造函数中调用此函数，获取职工数量并初始化数组：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> num = <span class="keyword">this</span>-&gt;<span class="built_in">get_EmpNum</span>();</span><br><span class="line"><span class="keyword">this</span>-&gt;m_EmpNum = num;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;文件中职工数量为：&quot;</span> &lt;&lt; num &lt;&lt; endl;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="5-2-2-获取职工记录数-1"><a href="#5-2-2-获取职工记录数-1" class="headerlink" title="5.2.2 获取职工记录数"></a>5.2.2 获取职工记录数</h3><p>在文件读取前，需要获取文件中职工的数量以便初始化数组。定义<code>get_EmpNum</code>函数：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">int</span> <span class="title">WorkerManager::get_EmpNum</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="function">ifstream <span class="title">ifs</span><span class="params">(FILENAME, ios::in)</span></span>;</span><br><span class="line">    <span class="type">int</span> id, dId, num = <span class="number">0</span>;</span><br><span class="line">    string name;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> (ifs &gt;&gt; id &amp;&amp; ifs &gt;&gt; name &amp;&amp; ifs &gt;&gt; dId)</span><br><span class="line">    &#123;</span><br><span class="line">        num++;</span><br><span class="line">    &#125;</span><br><span class="line">    ifs.<span class="built_in">close</span>();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> num;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>在构造函数中调用此函数，获取职工数量并初始化数组：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> num = <span class="keyword">this</span>-&gt;<span class="built_in">get_EmpNum</span>();</span><br><span class="line"><span class="keyword">this</span>-&gt;m_EmpNum = num;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;调试代码：文件中职工数量为：&quot;</span> &lt;&lt; num &lt;&lt; endl;</span><br><span class="line"><span class="keyword">this</span>-&gt;m_EmpArry = <span class="keyword">new</span> Worker * [num];</span><br><span class="line"><span class="keyword">this</span>-&gt;<span class="built_in">init_Emp</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; num; i++)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;调试代码:&quot;</span>;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;职工号：&quot;</span> &lt;&lt; <span class="keyword">this</span>-&gt;m_EmpArry[i]-&gt;m_Id</span><br><span class="line">&lt;&lt; <span class="string">&quot; 姓名：&quot;</span> &lt;&lt; <span class="keyword">this</span>-&gt;m_EmpArry[i]-&gt;m_Name</span><br><span class="line">&lt;&lt; <span class="string">&quot; 部门编号：&quot;</span> &lt;&lt; <span class="keyword">this</span>-&gt;m_EmpArry[i]-&gt;m_DeptId &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>手动添加一些职工数据，测试获取职工数量函数</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/bacea7.png" alt="05读文件测试"></p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/59ea7c.png" alt="05读文件测试2"></p><h3 id="5-2-3-初始化职工数组"><a href="#5-2-3-初始化职工数组" class="headerlink" title="5.2.3 初始化职工数组"></a>5.2.3 初始化职工数组</h3><p>在<code>WorkerManager</code>类中定义<code>init_Emp()</code>函数，根据文件中的数据初始化<code>m_EmpArray</code>数组：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">//初始化员工</span><br><span class="line">void init_Emp();</span><br></pre></td></tr></table></figure><p>在 WorkerManager.cpp 中实现</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">WorkerManager::init_Emp</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="function">ifstream <span class="title">ifs</span><span class="params">(FILENAME, ios::in)</span></span>;</span><br><span class="line">    <span class="type">int</span> id, dId, index = <span class="number">0</span>;</span><br><span class="line">    string name;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> (ifs &gt;&gt; id &amp;&amp; ifs &gt;&gt; name &amp;&amp; ifs &gt;&gt; dId)</span><br><span class="line">    &#123;</span><br><span class="line">        Worker* worker = <span class="literal">NULL</span>;</span><br><span class="line">        <span class="keyword">if</span> (dId == <span class="number">1</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            worker = <span class="keyword">new</span> <span class="built_in">Employee</span>(id, name, dId);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span> (dId == <span class="number">2</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            worker = <span class="keyword">new</span> <span class="built_in">Manager</span>(id, name, dId);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">        &#123;</span><br><span class="line">            worker = <span class="keyword">new</span> <span class="built_in">Boss</span>(id, name, dId);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">this</span>-&gt;m_EmpArray[index++] = worker;</span><br><span class="line">    &#125;</span><br><span class="line">    ifs.<span class="built_in">close</span>();</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>在构造函数中调用<code>init_Emp()</code>初始化数据：</p><pre><code>//根据职工数创建数组this-&gt;m_EmpArray = new Worker *[this-&gt;m_EmpNum];//初始化职工init_Emp();//测试代码for (int i = 0; i &lt; m_EmpNum; i++)&#123;    cout &lt;&lt; &quot;职工号： &quot; &lt;&lt; this-&gt;m_EmpArray[i]-&gt;m_Id        &lt;&lt; &quot; 职工姓名： &quot; &lt;&lt; this-&gt;m_EmpArray[i]-&gt;m_Name        &lt;&lt; &quot; 部门编号： &quot; &lt;&lt; this-&gt;m_EmpArray[i]-&gt;m_DeptId &lt;&lt; endl;&#125;</code></pre><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/59ea7c.png" alt="05读文件测试2"></p><p>至此，实现了完整的文件交互功能，包括<strong>文件写入</strong>和<strong>文件读取</strong>。测试代码可注释或删除。</p><h1 id="6、显示职工"><a href="#6、显示职工" class="headerlink" title="6、显示职工"></a>6、显示职工</h1><p>功能描述：显示当前所有职工信息</p><h2 id="6-1-显示职工函数声明"><a href="#6-1-显示职工函数声明" class="headerlink" title="6.1 显示职工函数声明"></a>6.1 显示职工函数声明</h2><p>在 <code>workerManager.h</code> 中添加成员函数 <code>void Show_Emp();</code>，用于显示所有职工信息。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//显示职工</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">Show_Emp</span><span class="params">()</span></span>;</span><br></pre></td></tr></table></figure><h2 id="6-2-显示职工函数实现"><a href="#6-2-显示职工函数实现" class="headerlink" title="6.2 显示职工函数实现"></a>6.2 显示职工函数实现</h2><p>在 <code>workerManager.cpp</code> 中实现成员函数 <code>void Show_Emp();</code>，该函数负责根据文件内容判断是否为空，并显示所有职工的详细信息。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">WorkerManager::Show_Emp</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="comment">// 判断文件是否为空</span></span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">this</span>-&gt;m_FileEmpty)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;文件不存在或为空！&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// 文件非空，逐个显示职工信息</span></span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="keyword">this</span>-&gt;m_EmpNum; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">this</span>-&gt;m_EmpArray[i]-&gt;<span class="built_in">showInfo</span>();  <span class="comment">// 调用职工的 showInfo() 方法显示信息</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);  <span class="comment">// 暂停屏幕显示</span></span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);    <span class="comment">// 清空控制台</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 根据职工编号查询职工是否存在</span></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">WorkerManager::isExist</span><span class="params">(<span class="type">int</span> id)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="type">int</span> index = <span class="number">-1</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="keyword">this</span>-&gt;m_EmpNum; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">this</span>-&gt;m_EmpArray[i]-&gt;m_Id == id)  <span class="comment">// 如果职工编号匹配</span></span><br><span class="line">&#123;</span><br><span class="line">index = i;  <span class="comment">// 记录职工位置</span></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 调试信息：返回职工的位置</span></span><br><span class="line"><span class="comment">// cout &lt;&lt; &quot;调试代码：index=&quot; &lt;&lt; index &lt;&lt; endl;</span></span><br><span class="line"><span class="keyword">return</span> index;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 删除职工</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">WorkerManager::Del_Emp</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="comment">// 判断文件是否为空</span></span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">this</span>-&gt;m_FileIsEmpty)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;文件不存在或为空，删除失败！&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;请输入要删除的职工编号：&quot;</span> &lt;&lt; endl;</span><br><span class="line"><span class="type">int</span> id;</span><br><span class="line">cin &gt;&gt; id;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 查找职工是否存在</span></span><br><span class="line"><span class="type">int</span> index = <span class="keyword">this</span>-&gt;<span class="built_in">isExist</span>(id);</span><br><span class="line"><span class="keyword">if</span> (index == <span class="number">-1</span>)  <span class="comment">// 职工不存在</span></span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;职工不存在，删除失败！&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// 删除职工，移动数组元素</span></span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = index; i &lt; <span class="keyword">this</span>-&gt;m_EmpNum - <span class="number">1</span>; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">this</span>-&gt;m_EmpArray[i] = <span class="keyword">this</span>-&gt;m_EmpArray[i + <span class="number">1</span>];  <span class="comment">// 将下一个职工信息前移</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">this</span>-&gt;m_EmpNum--;  <span class="comment">// 更新职工数量</span></span><br><span class="line"><span class="keyword">this</span>-&gt;<span class="built_in">save</span>();      <span class="comment">// 保存文件，确保删除后的数据被存储</span></span><br><span class="line">cout &lt;&lt; <span class="string">&quot;删除成功！期待与ta的再次见面~&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);  <span class="comment">// 暂停屏幕显示</span></span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);    <span class="comment">// 清空控制台</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="6-3-测试显示职工"><a href="#6-3-测试显示职工" class="headerlink" title="6.3 测试显示职工"></a>6.3 测试显示职工</h2><p>在 <code>main</code> 函数中的分支 2 选项中，调用 <code>Show_Emp()</code> 接口进行显示职工功能测试。测试时分别考虑文件为空和文件不为空两种情况。</p><p>测试 1 - 文件不存在或为空情况</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/b195fd.png" alt="06显示职工测试1"></p><p>测试效果：当文件为空或不存在时，程序会显示“文件不存在或为空”。</p><p>测试 2 - 文件存在且有记录情况</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/4830b7.png" alt="06显示职工测试2"></p><p>测试效果：当文件存在并且有职工记录时，程序将显示职工的详细信息。</p><p>至此，<strong>显示所有职工信息功能</strong>已完整实现。测试代码可以在调试完成后进行注释或删除。</p><h1 id="7、删除职工"><a href="#7、删除职工" class="headerlink" title="7、删除职工"></a>7、删除职工</h1><p>功能描述：按照职工的编号进行删除职工操作</p><h2 id="7-1-删除职工函数声明"><a href="#7-1-删除职工函数声明" class="headerlink" title="7.1 删除职工函数声明"></a>7.1 删除职工函数声明</h2><p>在 <code>workerManager.h</code> 中添加成员函数 <code>void Del_Emp();</code>，用于删除职工。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//删除职工</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">Del_Emp</span><span class="params">()</span></span>;</span><br></pre></td></tr></table></figure><h2 id="7-2-职工是否存在函数声明"><a href="#7-2-职工是否存在函数声明" class="headerlink" title="7.2 职工是否存在函数声明"></a>7.2 职工是否存在函数声明</h2><p>为了支持删除职工、修改职工、查找职工等功能，添加一个判断职工是否存在的函数，以便后续调用。</p><p>在 <code>workerManager.h</code> 中添加成员函数 <code>int IsExist(int id);</code>，用于判断职工是否存在。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 按照职工编号判断职工是否存在, 若存在返回职工在数组中的位置，不存在返回-1</span></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">IsExist</span><span class="params">(<span class="type">int</span> id)</span></span>;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="7-3-职工是否存在函数实现"><a href="#7-3-职工是否存在函数实现" class="headerlink" title="7.3 职工是否存在函数实现"></a>7.3 职工是否存在函数实现</h2><p>在 <code>workerManager.cpp</code> 中实现成员函数 <code>int IsExist(int id);</code>，该函数负责判断职工是否存在。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">int</span> <span class="title">WorkerManager::isExist</span><span class="params">(<span class="type">int</span> id)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="type">int</span> index = <span class="number">-1</span>;  <span class="comment">// 初始化为-1，表示未找到职工</span></span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="keyword">this</span>-&gt;m_EmpNum; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// 如果职工编号匹配，则返回该职工在数组中的位置</span></span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">this</span>-&gt;m_EmpArray[i]-&gt;m_Id == id)</span><br><span class="line">&#123;</span><br><span class="line">index = i;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 调试信息：返回职工的位置</span></span><br><span class="line"><span class="comment">// cout &lt;&lt; &quot;调试代码：index=&quot; &lt;&lt; index &lt;&lt; endl;</span></span><br><span class="line"><span class="keyword">return</span> index;  <span class="comment">// 若未找到，返回-1</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="7-4-删除职工函数实现"><a href="#7-4-删除职工函数实现" class="headerlink" title="7.4 删除职工函数实现"></a>7.4 删除职工函数实现</h2><p>在 <code>workerManager.cpp</code> 中实现成员函数 <code>void Del_Emp();</code>，该函数实现删除职工操作。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">WorkerManager::Del_Emp</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="comment">// 判断文件是否为空</span></span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">this</span>-&gt;m_FileIsEmpty)  <span class="comment">// 注意：原文中为 m_FileEmpty，修改为 m_FileIsEmpty 更符合命名规范</span></span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;文件不存在或为空，删除失败！&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;请输入要删除的职工编号：&quot;</span> &lt;&lt; endl;</span><br><span class="line"><span class="type">int</span> id;</span><br><span class="line">cin &gt;&gt; id;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 查找职工是否存在</span></span><br><span class="line"><span class="type">int</span> index = <span class="keyword">this</span>-&gt;<span class="built_in">isExist</span>(id);</span><br><span class="line"><span class="keyword">if</span> (index == <span class="number">-1</span>)  <span class="comment">// 职工不存在</span></span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;职工不存在，删除失败！&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// 删除职工，移动数组元素</span></span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = index; i &lt; <span class="keyword">this</span>-&gt;m_EmpNum - <span class="number">1</span>; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// 将下一个职工信息前移</span></span><br><span class="line"><span class="keyword">this</span>-&gt;m_EmpArray[i] = <span class="keyword">this</span>-&gt;m_EmpArray[i + <span class="number">1</span>];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">this</span>-&gt;m_EmpNum--;  <span class="comment">// 更新职工数量</span></span><br><span class="line"><span class="keyword">this</span>-&gt;<span class="built_in">save</span>();      <span class="comment">// 保存文件，确保删除后的数据被存储</span></span><br><span class="line">cout &lt;&lt; <span class="string">&quot;删除成功！期待与ta的再次见面~&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);  <span class="comment">// 暂停屏幕显示</span></span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);    <span class="comment">// 清空控制台</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="7-5-测试删除职工"><a href="#7-5-测试删除职工" class="headerlink" title="7.5 测试删除职工"></a>7.5 测试删除职工</h2><p>在 <code>main</code> 函数中的分支 3 选项中，调用 <code>Del_Emp()</code> 接口进行删除职工功能的测试。测试时分别考虑删除不存在职工和删除已存在职工两种情况。</p><p>测试 1 - 删除不存在职工情况</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/0ebe5b.png" alt="07删除测试1"></p><p>测试效果：当输入不存在的职工编号时，程序会输出“职工不存在，删除失败”提示。</p><p>测试 2 - 删除存在的职工情况</p><p>删除成功提示图：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/92d588.png" alt="07删除测试2"></p><p>测试效果：当输入存在的职工编号时，程序会成功删除该职工，并提示“删除成功！期待与 ta 的再次见面~”。</p><p>再次显示所有职工信息，确保已经删除</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/3db608.png" alt="07删除测试3"></p><p>测试效果：删除职工后，调用显示职工信息接口，确认职工已被成功删除。</p><p>至此，<strong>删除职工功能</strong>已完整实现。测试代码可以在调试完成后进行注释或删除。</p><h1 id="8、修改职工"><a href="#8、修改职工" class="headerlink" title="8、修改职工"></a>8、修改职工</h1><p>功能描述：能够按照职工的编号对职工信息进行修改并保存。</p><h2 id="8-1-修改职工函数声明"><a href="#8-1-修改职工函数声明" class="headerlink" title="8.1 修改职工函数声明"></a>8.1 修改职工函数声明</h2><p>在 <code>workerManager.h</code> 中添加成员函数 <code>void Mod_Emp();</code>，用于修改职工信息。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//修改职工</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">Mod_Emp</span><span class="params">()</span></span>;</span><br></pre></td></tr></table></figure><h2 id="8-2-修改职工函数实现"><a href="#8-2-修改职工函数实现" class="headerlink" title="8.2 修改职工函数实现"></a>8.2 修改职工函数实现</h2><p>在 <code>workerManager.cpp</code> 中实现成员函数 <code>void Mod_Emp();</code>，该函数用于修改指定职工的个人信息。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">WorkerManager::Mod_Emp</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="comment">// 判断文件是否为空</span></span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">this</span>-&gt;m_FileEmpty)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;文件不存在或者为空，无法修改！&quot;</span> &lt;&lt; endl;</span><br><span class="line"><span class="keyword">return</span>;  <span class="comment">// 若文件为空，则退出函数</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 输入需要修改的职工编号</span></span><br><span class="line">cout &lt;&lt; <span class="string">&quot;请输入需要修改的职工的编号：&quot;</span> &lt;&lt; endl;</span><br><span class="line"><span class="type">int</span> id;</span><br><span class="line">cin &gt;&gt; id;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 查找职工是否存在</span></span><br><span class="line"><span class="type">int</span> index = <span class="keyword">this</span>-&gt;<span class="built_in">isExist</span>(id);</span><br><span class="line"><span class="keyword">if</span> (index == <span class="number">-1</span>)  <span class="comment">// 职工不存在</span></span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;查无此人，修改失败！&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// 显示职工信息</span></span><br><span class="line"><span class="keyword">this</span>-&gt;m_EmpArray[index]-&gt;<span class="built_in">showInfo</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// 删除原职工对象并准备创建新对象</span></span><br><span class="line"><span class="keyword">delete</span> <span class="keyword">this</span>-&gt;m_EmpArray[index];</span><br><span class="line"></span><br><span class="line"><span class="comment">// 输入新的职工信息</span></span><br><span class="line"><span class="type">int</span> NewId, NewSelect;</span><br><span class="line">string NewName;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 确保新的职工ID不重复</span></span><br><span class="line"><span class="keyword">while</span> (<span class="literal">true</span>)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;请输入新的职工号：&quot;</span> &lt;&lt; endl;</span><br><span class="line">cin &gt;&gt; NewId;</span><br><span class="line"><span class="type">int</span> index = <span class="keyword">this</span>-&gt;<span class="built_in">isExist</span>(NewId);</span><br><span class="line"><span class="keyword">if</span> (index == <span class="number">-1</span>)  <span class="comment">// 新ID未被占用</span></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">cout &lt;&lt; <span class="string">&quot;此职工ID已存在，请重新输入：&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 输入新的职工姓名</span></span><br><span class="line">cout &lt;&lt; <span class="string">&quot;请输入新的职工姓名：&quot;</span> &lt;&lt; endl;</span><br><span class="line">cin &gt;&gt; NewName;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 输入新的职工岗位</span></span><br><span class="line">cout &lt;&lt; <span class="string">&quot;请选择新的职工岗位：&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;1、普通职工&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;2、经理&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;3、老板&quot;</span> &lt;&lt; endl;</span><br><span class="line">cin &gt;&gt; NewSelect;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 创建新的职工对象</span></span><br><span class="line">Worker* worker = <span class="literal">NULL</span>;</span><br><span class="line"><span class="keyword">switch</span> (NewSelect)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line">worker = <span class="keyword">new</span> <span class="built_in">Employee</span>(NewId, NewName, NewSelect);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line">worker = <span class="keyword">new</span> <span class="built_in">Manager</span>(NewId, NewName, NewSelect);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">case</span> <span class="number">3</span>:</span><br><span class="line">worker = <span class="keyword">new</span> <span class="built_in">Boss</span>(NewId, NewName, NewSelect);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">default</span>:</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 更新职工数组中的信息</span></span><br><span class="line"><span class="keyword">this</span>-&gt;m_EmpArray[index] = worker;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;修改成功！&quot;</span> &lt;&lt; endl;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 保存修改后的数据</span></span><br><span class="line"><span class="keyword">this</span>-&gt;<span class="built_in">save</span>();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 暂停并清屏</span></span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="8-3-测试修改职工"><a href="#8-3-测试修改职工" class="headerlink" title="8.3 测试修改职工"></a>8.3 测试修改职工</h2><p>在 <code>main</code> 函数的分支 4 选项中，调用 <code>Mod_Emp()</code> 接口进行修改职工功能的测试。测试时分别考虑修改不存在职工和修改已存在职工两种情况。</p><p>测试 1 - 修改不存在职工情况</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/eca58b.png" alt="08修改测试1"></p><p>测试效果：当输入不存在的职工编号时，程序会输出“查无此人，修改失败”提示。</p><p>测试 2 - 修改存在职工情况，例如将职工 “张三” 改为 “张新三”</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/d2535d.png" alt="08修改测试2"></p><p>测试效果：修改成功后，系统会显示“修改成功！”并保存修改后的职工信息。</p><p>改后再次查看所有职工信息，并确认修改成功</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/925a33.png" alt="08修改测试3"></p><p>确认文件中的信息同步更新</p><p>测试效果：打开文件，确认修改后的职工信息已正确更新，保存的数据与程序中的显示一致。</p><p>至此，<strong>修改职工功能</strong>已完整实现。测试代码可以在调试完成后进行注释或删除。</p><h1 id="9、查找职工"><a href="#9、查找职工" class="headerlink" title="9、查找职工"></a>9、查找职工</h1><p>功能描述：提供两种查找职工方式，一种按照职工编号查找，一种按照职工姓名查找。</p><h2 id="9-1-查找职工函数声明"><a href="#9-1-查找职工函数声明" class="headerlink" title="9.1 查找职工函数声明"></a>9.1 查找职工函数声明</h2><p>在 <code>workerManager.h</code> 中添加成员函数 <code>void Find_Emp();</code>，用于查找职工信息。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">//查找职工</span><br><span class="line">void Find_Emp();</span><br></pre></td></tr></table></figure><h2 id="9-2-查找职工函数实现"><a href="#9-2-查找职工函数实现" class="headerlink" title="9.2 查找职工函数实现"></a>9.2 查找职工函数实现</h2><p>在 <code>workerManager.cpp</code> 中实现成员函数 <code>void Find_Emp();</code>，该函数根据用户选择的方式查找职工。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">WorkerManager::Find_Emp</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="comment">// 判断文件是否为空</span></span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">this</span>-&gt;m_FileEmpty)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;文件不存在或者为空，查找失败！&quot;</span> &lt;&lt; endl;</span><br><span class="line"><span class="keyword">return</span>;  <span class="comment">// 若文件为空，则退出函数</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;请选择你的查找方式：&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;1、按职工编号查找&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;2、按职工姓名查找&quot;</span> &lt;&lt; endl;</span><br><span class="line"><span class="type">int</span> select;</span><br><span class="line">cin &gt;&gt; select;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 按照职工编号查找</span></span><br><span class="line"><span class="keyword">if</span> (select == <span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;请输入需要查找的职工id：&quot;</span> &lt;&lt; endl;</span><br><span class="line"><span class="type">int</span> id;</span><br><span class="line">cin &gt;&gt; id;</span><br><span class="line"><span class="type">int</span> index = <span class="keyword">this</span>-&gt;<span class="built_in">isExist</span>(id);</span><br><span class="line"><span class="keyword">if</span> (index == <span class="number">-1</span>)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;查无此人！&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">this</span>-&gt;m_EmpArray[index]-&gt;<span class="built_in">showInfo</span>();  <span class="comment">// 显示查找到的职工信息</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 按照职工姓名查找</span></span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (select == <span class="number">2</span>)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;请输入需要查找的职工姓名：&quot;</span> &lt;&lt; endl;</span><br><span class="line">string name;</span><br><span class="line">cin &gt;&gt; name;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> index = <span class="number">-1</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="keyword">this</span>-&gt;m_EmpNum; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">this</span>-&gt;m_EmpArray[i]-&gt;m_Name == name)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">this</span>-&gt;m_EmpArray[i]-&gt;<span class="built_in">showInfo</span>();  <span class="comment">// 显示所有与该姓名匹配的职工信息</span></span><br><span class="line">index = <span class="number">0</span>;  <span class="comment">// 标记查找结果</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (index == <span class="number">-1</span>)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;查无此人！&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 暂停并清屏</span></span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="9-3-测试查找职工"><a href="#9-3-测试查找职工" class="headerlink" title="9.3 测试查找职工"></a>9.3 测试查找职工</h2><p>在 <code>main</code> 函数的分支 5 选项中，调用 <code>Find_Emp()</code> 接口进行查找职工功能的测试。测试时分别考虑按职工编号和按职工姓名查找的不同情况。</p><p>测试 1 - 按照职工编号查找 - 查找不存在职工</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/c82126.png" alt="09查找测试01"></p><p>测试效果：当输入不存在的职工编号时，程序会输出“查无此人！”的提示。</p><p>测试 2 - 按照职工编号查找 - 查找存在职工</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/40ccbc.png" alt="09查找测试02"></p><p>测试效果：当输入存在的职工编号时，程序会显示该职工的详细信息。</p><p>测试 3 - 按照职工姓名查找 - 查找不存在职工</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/df2640.png" alt="09查找测试03"></p><p>测试效果：当输入不存在的职工姓名时，程序会输出“查无此人！”的提示。</p><p>测试 4 - 按照职工姓名查找 - 查找存在职工（如果出现重名，也一并显示，在文件中可以添加重名职工）</p><p>例如，添加两个名为“张三”的职工，并按照姓名查找“张三”。</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/7358d7.png" alt="09查找测试04-重名"></p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/a4480e.png" alt="09查找测试04-重名2"></p><p>测试效果：当存在重名职工时，程序会显示所有匹配的职工信息，确保用户能够看到所有与输入姓名匹配的职工。</p><p>至此，<strong>查找职工功能</strong>已完整实现。测试代码可以在调试完成后进行注释或删除。</p><h1 id="10、排序"><a href="#10、排序" class="headerlink" title="10、排序"></a>10、排序</h1><p>功能描述：根据职工编号进行排序，排序的顺序由用户指定。</p><h2 id="10-1-排序函数声明"><a href="#10-1-排序函数声明" class="headerlink" title="10.1 排序函数声明"></a>10.1 排序函数声明</h2><p>在 <code>workerManager.cpp</code> 中实现成员函数 <code>void Sort_Emp();</code>，该函数将根据用户的选择对职工编号进行排序。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//排序职工</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">Sort_Emp</span><span class="params">()</span></span>;</span><br></pre></td></tr></table></figure><h2 id="10-2-排序函数实现"><a href="#10-2-排序函数实现" class="headerlink" title="10.2 排序函数实现"></a>10.2 排序函数实现</h2><p>在 workerManager.cpp 中实现成员函数 <code>void Sort_Emp();</code></p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">WorkerManger::Sort_Emp</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="comment">// 判断文件是否为空</span></span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">this</span>-&gt;m_FileEmpty)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;文件不存在或者为空，排序失败！&quot;</span> &lt;&lt; endl;</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="type">int</span> select;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;请选择需要的排序方式：&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;1、降序排序&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;2、升序排序&quot;</span> &lt;&lt; endl;</span><br><span class="line">cin &gt;&gt; select;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 根据选择的排序方式进行排序</span></span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="keyword">this</span>-&gt;m_EmpNum; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="type">int</span> minOrMax = i;</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> j = i; j &lt; <span class="keyword">this</span>-&gt;m_EmpNum; j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (select == <span class="number">1</span>)  <span class="comment">// 降序排序</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">this</span>-&gt;m_EmpArry[j]-&gt;m_Id &gt; <span class="keyword">this</span>-&gt;m_EmpArry[minOrMax]-&gt;m_Id)</span><br><span class="line">minOrMax = j;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span>  <span class="comment">// 升序排序</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">this</span>-&gt;m_EmpArry[j]-&gt;m_Id &lt; <span class="keyword">this</span>-&gt;m_EmpArry[minOrMax]-&gt;m_Id)</span><br><span class="line">minOrMax = j;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 交换职工信息</span></span><br><span class="line"><span class="keyword">if</span> (minOrMax != i)</span><br><span class="line">&#123;</span><br><span class="line">Worker* temp = <span class="keyword">this</span>-&gt;m_EmpArry[i];</span><br><span class="line"><span class="keyword">this</span>-&gt;m_EmpArry[i] = <span class="keyword">this</span>-&gt;m_EmpArry[minOrMax];</span><br><span class="line"><span class="keyword">this</span>-&gt;m_EmpArry[minOrMax] = temp;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 保存排序后的信息并显示</span></span><br><span class="line"><span class="keyword">this</span>-&gt;<span class="built_in">save</span>();</span><br><span class="line"><span class="keyword">this</span>-&gt;<span class="built_in">Show_Emp</span>();</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">WorkerManger::Clear_File</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">this</span>-&gt;m_FileEmpty)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;文件为不存在或为空，无需操作！&quot;</span> &lt;&lt; endl;</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;确认清空？此操作无法恢复！文件将会永久删除！&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;1、确认清空，文件永久删除&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;任意键取消&quot;</span> &lt;&lt; endl;</span><br><span class="line">string select;</span><br><span class="line">cin &gt;&gt; select;</span><br><span class="line"><span class="keyword">if</span> (select == <span class="string">&quot;1&quot;</span>)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;确认清空操作请输入“清空”,输入任意内容取消&quot;</span> &lt;&lt; endl;</span><br><span class="line">cin &gt;&gt; select;</span><br><span class="line"><span class="keyword">if</span> (select == <span class="string">&quot;清空&quot;</span>)</span><br><span class="line">&#123;</span><br><span class="line">ofstream ofs;</span><br><span class="line">ofs.<span class="built_in">open</span>(FILENAME, ios::trunc);  <span class="comment">// 清空文件</span></span><br><span class="line">ofs.<span class="built_in">close</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// 清空职工数组</span></span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">this</span>-&gt;m_EmpArry != <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="keyword">this</span>-&gt;m_EmpNum; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">delete</span> <span class="keyword">this</span>-&gt;m_EmpArry[i];  <span class="comment">// 删除职工对象</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">this</span>-&gt;m_EmpNum = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">this</span>-&gt;m_FileEmpty = <span class="literal">true</span>;</span><br><span class="line"><span class="keyword">delete</span>[] <span class="keyword">this</span>-&gt;m_EmpArry;  <span class="comment">// 删除职工数组</span></span><br><span class="line"><span class="keyword">this</span>-&gt;m_EmpArry = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;已清空！&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">cout &lt;&lt; <span class="string">&quot;已取消！&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">cout &lt;&lt; <span class="string">&quot;已取消！&quot;</span> &lt;&lt; endl;</span><br><span class="line"></span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="10-3-测试排序功能"><a href="#10-3-测试排序功能" class="headerlink" title="10.3 测试排序功能"></a>10.3 测试排序功能</h2><p>在 <code>main</code> 函数的分支 6 选项中，调用排序职工接口进行排序功能的测试。</p><p>添加无序职工</p><p>首先我们添加一些职工，职工编号是无序的。例如：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/a52df6.png" alt="10排序测试1"></p><p>测试 - 升序排序</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/7b039b.png" alt="10排序测试2"></p><p>选择升序排序后，职工会根据编号从小到大进行排序。</p><p>排序后的文件同步更新：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/8e8d68.png" alt="10排序测试2-1"></p><p>测试 - 降序排序</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/c9e5a2.png" alt="10排序测试3"></p><p>选择降序排序后，职工会根据编号从大到小进行排序。</p><p>文件同步更新</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/7a983f.png" alt="10排序测试3-2"></p><p>至此，<strong>职工编号排序功能</strong>已实现并经过测试，能够按照用户指定的顺序对职工进行升序或降序排序，并且排序结果会同步保存到文件中。</p><h1 id="11、清空文件"><a href="#11、清空文件" class="headerlink" title="11、清空文件"></a>11、清空文件</h1><p>功能描述：清空文件中记录的职工数据。</p><h2 id="11-1-清空函数声明"><a href="#11-1-清空函数声明" class="headerlink" title="11.1 清空函数声明"></a>11.1 清空函数声明</h2><p>在 <code>workerManager.cpp</code> 中实现 <code>void Clean_File();</code>，该函数将删除文件中的所有数据，并清空职工记录。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//清空文件</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">Clean_File</span><span class="params">()</span></span>;</span><br></pre></td></tr></table></figure><h2 id="11-2-清空函数实现"><a href="#11-2-清空函数实现" class="headerlink" title="11.2 清空函数实现"></a>11.2 清空函数实现</h2><p>在 <code>workerManager.cpp</code> 中实现 <code>void Clean_File();</code>，该函数将删除文件中的所有数据，并清空职工记录。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">WorkerManger::Clear_File</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">this</span>-&gt;m_FileEmpty)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;文件为不存在或为空，无需操作！&quot;</span> &lt;&lt; endl;</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;确认清空？此操作无法恢复！文件将会永久删除！&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;1、确认清空，文件永久删除&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;任意键取消&quot;</span> &lt;&lt; endl;</span><br><span class="line">string select;</span><br><span class="line">cin &gt;&gt; select;</span><br><span class="line"><span class="keyword">if</span> (select == <span class="string">&quot;1&quot;</span>)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;确认清空操作请输入“清空”，输入任意内容取消&quot;</span> &lt;&lt; endl;</span><br><span class="line">cin &gt;&gt; select;</span><br><span class="line"><span class="keyword">if</span> (select == <span class="string">&quot;清空&quot;</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">// 打开文件进行清空操作</span></span><br><span class="line">ofstream ofs;</span><br><span class="line">ofs.<span class="built_in">open</span>(FILENAME, ios::trunc);  <span class="comment">// 清空文件内容</span></span><br><span class="line">ofs.<span class="built_in">close</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// 删除职工数组内容</span></span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">this</span>-&gt;m_EmpArry != <span class="literal">NULL</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="keyword">this</span>-&gt;m_EmpNum; i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">delete</span> <span class="keyword">this</span>-&gt;m_EmpArry[i];  <span class="comment">// 删除每个职工对象</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">this</span>-&gt;m_EmpNum = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">this</span>-&gt;m_FileEmpty = <span class="literal">true</span>;</span><br><span class="line"><span class="keyword">delete</span>[] <span class="keyword">this</span>-&gt;m_EmpArry;  <span class="comment">// 删除职工数组</span></span><br><span class="line"><span class="keyword">this</span>-&gt;m_EmpArry = <span class="literal">NULL</span>;</span><br><span class="line">&#125;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;已清空！&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">cout &lt;&lt; <span class="string">&quot;已取消！&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">cout &lt;&lt; <span class="string">&quot;已取消！&quot;</span> &lt;&lt; endl;</span><br><span class="line"></span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="11-3-测试清空文件"><a href="#11-3-测试清空文件" class="headerlink" title="11.3 测试清空文件"></a>11.3 测试清空文件</h2><p>在 <code>main</code> 函数的分支 7 选项中，调用清空文件接口进行测试。</p><p>测试 - 确认清空文件</p><p>在执行清空文件操作时，系统会询问是否确认清空文件数据，并要求输入确认内容。</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/7744e8.png" alt="11测试清空2"></p><p>清空操作成功后，文件中的数据将被清除，可以通过打印文件内容来确认。</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/7744e8.png" alt="11测试清空2"></p><p>再次查看文件中数据，记录已为空</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/11/10/441577.png" alt="11测试清空1"></p><p>手动打开文件查看，文件内容已被完全清空：</p><ul><li>文件数据已确保清空，该功能需要慎用！</li></ul><p>随着<strong>清空文件功能</strong>的实现，本项目的基于多态的职工管理系统已经完整实现！至此，所有主要功能（增加、删除、修改、查找、排序、清空文件等）已经完成，可以满足基本的职工管理需求。</p><h1 id="3、退出功能"><a href="#3、退出功能" class="headerlink" title="3、退出功能"></a>3、退出功能</h1><p>在本节中，我们展示了完整的<code>main</code>函数代码，该代码是整个职工管理系统的入口。<code>main</code>函数通过循环和用户输入来控制系统的操作，支持添加、显示、删除、修改、查找、排序职工，以及清空文件等功能。代码中的各个功能通过<code>switch</code>语句进行选择，并对应调用<code>WorkerManger</code>类中的相应成员函数。</p><h2 id="3-1-提供功能接口"><a href="#3-1-提供功能接口" class="headerlink" title="3.1 提供功能接口"></a>3.1 提供功能接口</h2><p>在 main 函数中提供分支选择，提供每个功能接口</p><p>代码：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;workerManger.h&quot;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义操作菜单的选项</span></span><br><span class="line"><span class="keyword">enum</span> <span class="title class_">choice</span> &#123; Exit, Add, Show, Del, Modify, Find, Sort, Clean &#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="comment">// 创建一个WorkerManger对象 wm，用于管理职工信息</span></span><br><span class="line">    WorkerManger wm;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 进入主菜单，用户可以根据输入选择操作</span></span><br><span class="line">    <span class="keyword">while</span> (<span class="literal">true</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        wm.<span class="built_in">Show_Menu</span>();  <span class="comment">// 显示系统菜单</span></span><br><span class="line">        <span class="type">int</span> choice;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;请输入您的选择：&quot;</span> &lt;&lt; endl;  <span class="comment">// 提示用户输入操作选择</span></span><br><span class="line">        cin &gt;&gt; choice;  <span class="comment">// 获取用户选择</span></span><br><span class="line"></span><br><span class="line">        <span class="comment">// 根据用户的选择执行不同的功能</span></span><br><span class="line">        <span class="keyword">switch</span> (choice)</span><br><span class="line">        &#123;</span><br><span class="line">        <span class="keyword">case</span> Exit:    <span class="comment">// 退出系统</span></span><br><span class="line">            wm.<span class="built_in">EsixSystem</span>();  <span class="comment">// 调用退出系统函数</span></span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> Add:    <span class="comment">// 添加职工</span></span><br><span class="line">            wm.<span class="built_in">Add_Emp</span>();  <span class="comment">// 调用添加职工函数</span></span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> Show:    <span class="comment">// 显示职工信息</span></span><br><span class="line">            wm.<span class="built_in">Show_Emp</span>();  <span class="comment">// 调用显示职工信息函数</span></span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> Del:    <span class="comment">// 删除职工</span></span><br><span class="line">            wm.<span class="built_in">Del_Emp</span>();  <span class="comment">// 调用删除职工函数</span></span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> Modify:    <span class="comment">// 修改职工信息</span></span><br><span class="line">            wm.<span class="built_in">Mod_Emp</span>();  <span class="comment">// 调用修改职工信息函数</span></span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> Find:    <span class="comment">// 查找职工</span></span><br><span class="line">            wm.<span class="built_in">Find_Emp</span>();  <span class="comment">// 调用查找职工函数</span></span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> Sort:    <span class="comment">// 排序职工</span></span><br><span class="line">            wm.<span class="built_in">Sort_Emp</span>();  <span class="comment">// 调用排序职工函数</span></span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> Clean:    <span class="comment">// 清空文件数据</span></span><br><span class="line">            wm.<span class="built_in">Clear_File</span>();  <span class="comment">// 调用清空文件函数</span></span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">default</span>:</span><br><span class="line">            <span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);  <span class="comment">// 如果输入无效，清屏</span></span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;  <span class="comment">// 程序结束</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="代码说明："><a href="#代码说明：" class="headerlink" title="代码说明："></a>代码说明：</h3><ol><li><strong>菜单选择与操作</strong>：通过<code>enum choice</code>定义了所有可能的菜单选项，并使用<code>switch</code>语句根据用户输入的选择执行相应的功能。每个<code>case</code>语句对应一个功能模块，如添加职工、显示职工、删除职工等。</li><li><strong>循环运行</strong>：程序通过<code>while(true)</code>进入一个无限循环，用户输入选择后，系统根据选择执行操作，直到用户选择退出系统。</li><li><strong>操作执行</strong>：每个功能模块调用<code>WorkerManger</code>类中的成员函数来实现具体操作。例如，<code>wm.Add_Emp()</code>表示调用<code>Add_Emp</code>函数来添加职工。</li><li><strong>退出系统</strong>：当用户选择退出时，调用<code>wm.EsixSystem()</code>来终止程序。</li></ol><p>通过这种结构，<code>main</code>函数实现了职工管理系统的菜单化控制，使得程序的操作更加直观和易于扩展。</p><h2 id="3-2-实现退出功能"><a href="#3-2-实现退出功能" class="headerlink" title="3.2 实现退出功能"></a>3.2 实现退出功能</h2><p>在 workerManager.h 中提供退出系统的成员函数 <code>void exitSystem();</code></p><p>在 workerManager.cpp 中提供具体的功能实现</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">WorkerManger::EsixSystem</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;正在安全退出…… 欢迎下次使用！&quot;</span> &lt;&lt; endl;</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line"><span class="built_in">exit</span>(<span class="number">0</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="13、-总结"><a href="#13、-总结" class="headerlink" title="13、 总结"></a>13、 总结</h1><p>在本次职工管理系统的开发过程中，我们实现了基于 C++的面向对象管理系统，通过类和多态的组合，实现了职工信息的管理。各个功能模块的实现使得职工的管理操作非常灵活，并且系统支持文件的持久化存储，能够在程序关闭后仍保留职工数据。</p><ul><li><strong>面向对象设计</strong>：我们通过继承和多态实现了不同职工类型的统一管理，使得系统结构更清晰，易于扩展。每个职工类型（如员工、经理、老板）都继承自一个基类<code>Worker</code>，并根据岗位需求修改或添加特有的行为。</li><li><strong>模块化设计</strong>：各个功能如职工增加、删除、修改、查找等，都封装成独立的函数，并且与文件操作结合紧密，确保数据的一致性和持久性。这种模块化设计不仅保证了系统的可维护性，也便于后续功能的扩展。</li><li><strong>灵活性与健壮性</strong>：在各个功能的实现中，我们考虑了不同的异常情况处理。例如，在删除职工时检查职工是否存在，在修改职工时避免重复编号，在排序职工时确保排序的准确性。这些细节保证了系统的稳定性和可靠性。</li></ul><p>通过这次开发，我们实现了一个完整的职工管理系统，涵盖了职工的增、删、改、查、排序和文件管理等基本功能。这个系统不仅展示了如何使用 C++中的面向对象编程（OOP）思想，还通过文件操作确保了数据的持久化存储。系统的实现为以后开发更复杂的管理系统奠定了基础。</p><p>致谢：</p><p>感谢 ChatGPT 对本文<strong>文本</strong>部分的指导与修改！这大大节省了本文的创作时间。</p><p>感谢 ChatGPT 对本文部分代码<strong>注释</strong>的补充！为代码的阅读提供了更佳的便利与体验。</p><p>代码原创，需要本项目源码请通过评论区、我的-留言板或邮箱联系免费获取。</p>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E5%AD%A6%E4%B9%A0/">学习</category>
      
      
      <category domain="https://www.chillg.de/tags/C-C/">C/C++</category>
      
      <category domain="https://www.chillg.de/tags/%E5%AD%A6%E4%B9%A0/">学习</category>
      
      <category domain="https://www.chillg.de/tags/%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE/">实战项目</category>
      
      
      <comments>https://www.chillg.de/posts/7bbd8d3a.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>C++项目实战——通讯录管理系统</title>
      <link>https://www.chillg.de/posts/20d5ca9e.html</link>
      <guid>https://www.chillg.de/posts/20d5ca9e.html</guid>
      <pubDate>Tue, 13 Aug 2024 08:55:01 GMT</pubDate>
      
      <description>通讯录管理系统几乎是我们学习C++的道路上遇到的第一个“大项目”了，几乎每个学校都会拿他当做一次大作业，最近想要重新熟悉C++，不妨来试试这个经典项目</description>
      
      
      
      <content:encoded><![CDATA[<h1 id="通讯录管理系统"><a href="#通讯录管理系统" class="headerlink" title="通讯录管理系统"></a>通讯录管理系统</h1><p>通讯录管理系统几乎是我们学习 C++的道路上遇到的第一个“大项目”了，几乎每个学校都会拿他当做一次大作业，最近想要重新熟悉 C++，不妨来试试这个经典项目。</p><p>本次我们不使用链表，而是单纯地使用结构体来实现项目的所有功能。</p><h2 id="1、系统需求"><a href="#1、系统需求" class="headerlink" title="1、系统需求"></a>1、系统需求</h2><p>通讯录是一个可以记录亲人、好友信息的工具。</p><p>本教程主要利用 C++来实现一个通讯录管理系统</p><p>系统中需要实现的功能如下：</p><ul><li>添加联系人：向通讯录中添加新人，信息包括（姓名、性别、年龄、联系电话、家庭住址）最多记录 1000 人</li><li>显示联系人：显示通讯录中所有联系人信息</li><li>删除联系人：按照姓名进行删除指定联系人</li><li>查找联系人：按照姓名查看指定联系人信息</li><li>修改联系人：按照姓名重新修改指定联系人</li><li>清空联系人：清空通讯录中所有信息</li><li>退出通讯录：退出当前使用的通讯录</li></ul><h2 id="2、项目的实现"><a href="#2、项目的实现" class="headerlink" title="2、项目的实现"></a>2、项目的实现</h2><p>根据需求，我们可以设计两个结构体来实现这些需求。首先是联系人结构体，包含姓名、年龄、性别、手机号码、家庭住址等信息。其次是一个通讯录结构体，包含联系人结构体数组，以及记录联系人数量的参数。然后，我们绘制菜单输出样式，最后依次实现各个功能函数。</p><h3 id="2-1-菜单功能"><a href="#2-1-菜单功能" class="headerlink" title="2.1 菜单功能"></a>2.1 菜单功能</h3><p><strong>功能描述：</strong> 用户选择功能的界面</p><p>菜单界面效果如下图：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/08/13/1887df.png" alt="系统需求"></p><p><strong>步骤：</strong></p><ul><li>封装函数显示该界面 如 <code>void showMenu()</code></li><li>在 <code>main</code> 函数中调用封装好的函数</li></ul><p>代码：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 显示菜单界面的函数</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">showMenu</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;***************************&quot;</span> &lt;&lt; endl;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;*****  1、添加联系人  *****&quot;</span> &lt;&lt; endl;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;*****  2、显示联系人  *****&quot;</span> &lt;&lt; endl;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;*****  3、删除联系人  *****&quot;</span> &lt;&lt; endl;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;*****  4、查找联系人  *****&quot;</span> &lt;&lt; endl;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;*****  5、修改联系人  *****&quot;</span> &lt;&lt; endl;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;*****  6、清空联系人  *****&quot;</span> &lt;&lt; endl;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;*****  0、退出通讯录  *****&quot;</span> &lt;&lt; endl;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;***************************&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="2-2-添加联系人"><a href="#2-2-添加联系人" class="headerlink" title="2.2 添加联系人"></a>2.2 添加联系人</h3><p>功能描述：</p><p>实现添加联系人功能，联系人上限为 1000 人，联系人信息包括（姓名、性别、年龄、联系电话、家庭住址）</p><p>添加联系人实现步骤：</p><ul><li>设计联系人结构体</li><li>设计通讯录结构体</li><li><code>main</code> 函数中创建通讯录</li><li>封装添加联系人函数</li><li>测试添加联系人功能</li></ul><h4 id="2-2-1-设计联系人结构体"><a href="#2-2-1-设计联系人结构体" class="headerlink" title="2.2.1 设计联系人结构体"></a>2.2.1 设计联系人结构体</h4><p>联系人信息包括：姓名、性别、年龄、联系电话、家庭住址</p><p>设计如下：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 定义联系人结构体</span></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">Person</span></span><br><span class="line">&#123;</span><br><span class="line">    string m_Name;   <span class="comment">// 姓名</span></span><br><span class="line">    <span class="type">int</span> m_Sex;       <span class="comment">// 性别：1-男，2-女</span></span><br><span class="line">    <span class="type">int</span> m_Age;       <span class="comment">// 年龄</span></span><br><span class="line">    string m_Phone;  <span class="comment">// 联系电话</span></span><br><span class="line">    string m_Addr;   <span class="comment">// 家庭住址</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="2-2-2-设计通讯录结构体"><a href="#2-2-2-设计通讯录结构体" class="headerlink" title="2.2.2 设计通讯录结构体"></a>2.2.2 设计通讯录结构体</h4><p>在通讯录结构体中，维护一个容量为 1000 的联系人数组，并记录当前通讯录中的联系人数量。</p><p>设计如下</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 定义通讯录结构体</span></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">Addressbooks</span></span><br><span class="line">&#123;</span><br><span class="line">    Person personArray[MAX];  <span class="comment">// 存储联系人信息的数组</span></span><br><span class="line">    <span class="type">int</span> m_Size;               <span class="comment">// 当前通讯录中联系人数量</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>记得先定义宏定义 <code>MAX</code> 值。</p><h4 id="2-2-3-main-函数中创建通讯录"><a href="#2-2-3-main-函数中创建通讯录" class="headerlink" title="2.2.3 main 函数中创建通讯录"></a>2.2.3 main 函数中创建通讯录</h4><p>添加联系人函数封装好后，在 <code>main</code> 函数中创建一个通讯录变量，这个就是我们需要一直维护的通讯录。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 在main函数中创建通讯录</span></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">Addressbooks</span> abs;</span><br><span class="line">abs.m_Size = <span class="number">0</span>;  <span class="comment">// 初始化通讯录中联系人数量为0</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="2-2-4-封装添加联系人函数"><a href="#2-2-4-封装添加联系人函数" class="headerlink" title="2.2.4 封装添加联系人函数"></a>2.2.4 封装添加联系人函数</h4><p><strong>思路：</strong> 添加联系人前，先判断通讯录是否已满，如果满了就不再添加；未满情况下，将新联系人信息逐个加入到通讯录。</p><p>添加联系人代码：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 添加联系人函数</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">addPerson</span><span class="params">(Addressbooks *abs)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="comment">// 判断通讯录是否已满</span></span><br><span class="line">    <span class="keyword">if</span> (abs-&gt;m_Size == MAX)</span><br><span class="line">    &#123;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;通讯录已满，无法添加&quot;</span> &lt;&lt; endl;</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 输入联系人信息</span></span><br><span class="line">    string name;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;请输入姓名：&quot;</span> &lt;&lt; endl;</span><br><span class="line">    cin &gt;&gt; name;</span><br><span class="line">    abs-&gt;personArray[abs-&gt;m_Size].m_Name = name;</span><br><span class="line"></span><br><span class="line">    <span class="type">int</span> sex = <span class="number">0</span>;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;请输入性别：&quot;</span> &lt;&lt; endl;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;1 --- 男&quot;</span> &lt;&lt; endl;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;2 --- 女&quot;</span> &lt;&lt; endl;</span><br><span class="line">    <span class="keyword">while</span> (<span class="literal">true</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        cin &gt;&gt; sex;</span><br><span class="line">        <span class="keyword">if</span> (sex == <span class="number">1</span> || sex == <span class="number">2</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            abs-&gt;personArray[abs-&gt;m_Size].m_Sex = sex;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;输入有误，请重新输入&quot;</span> &lt;&lt; endl;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;请输入年龄：&quot;</span> &lt;&lt; endl;</span><br><span class="line">    <span class="type">int</span> age = <span class="number">0</span>;</span><br><span class="line">    cin &gt;&gt; age;</span><br><span class="line">    abs-&gt;personArray[abs-&gt;m_Size].m_Age = age;</span><br><span class="line"></span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;请输入联系电话：&quot;</span> &lt;&lt; endl;</span><br><span class="line">    string phone;</span><br><span class="line">    cin &gt;&gt; phone;</span><br><span class="line">    abs-&gt;personArray[abs-&gt;m_Size].m_Phone = phone;</span><br><span class="line"></span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;请输入家庭住址：&quot;</span> &lt;&lt; endl;</span><br><span class="line">    string address;</span><br><span class="line">    cin &gt;&gt; address;</span><br><span class="line">    abs-&gt;personArray[abs-&gt;m_Size].m_Addr = address;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 更新通讯录中的联系人数量</span></span><br><span class="line">    abs-&gt;m_Size++;</span><br><span class="line"></span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;添加成功！&quot;</span> &lt;&lt; endl;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 暂停并清屏</span></span><br><span class="line">    <span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line">    <span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="2-2-5-测试添加联系人功能"><a href="#2-2-5-测试添加联系人功能" class="headerlink" title="2.2.5 测试添加联系人功能"></a>2.2.5 测试添加联系人功能</h4><p>选择界面中，如果玩家选择了 1，代表添加联系人，我们可以测试下该功能</p><p>在 <code>switch case</code> 语句中， <code>case 1</code> 里添加：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">case</span> <span class="number">1</span>:  <span class="comment">// 添加联系人</span></span><br><span class="line">    <span class="built_in">addPerson</span>(&amp;abs);  <span class="comment">// 调用添加联系人函数</span></span><br><span class="line">    <span class="keyword">break</span>;</span><br></pre></td></tr></table></figure><p>测试效果如图：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/08/13/0ec82f.png" alt="02添加联系人"></p><p>成功添加联系人后，再次显示通讯录，确认联系人信息已被正确添加。</p><h3 id="2-3-显示联系人"><a href="#2-3-显示联系人" class="headerlink" title="2.3 显示联系人"></a>2.3 显示联系人</h3><p><strong>功能描述：</strong> 实现显示通讯录中所有联系人信息的功能。</p><p>显示联系人实现步骤：</p><ul><li>封装显示联系人函数</li><li>测试显示联系人功能</li></ul><h4 id="2-3-1-封装显示联系人函数"><a href="#2-3-1-封装显示联系人函数" class="headerlink" title="2.3.1 封装显示联系人函数"></a>2.3.1 封装显示联系人函数</h4><p><strong>思路：</strong> 判断通讯录是否为空，如果为空则提示无信息可显示；否则遍历通讯录数组，显示每个联系人的信息。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 显示联系人函数</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">showPerson</span><span class="params">(<span class="type">const</span> Addressbooks *abs)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="comment">// 判断通讯录是否为空</span></span><br><span class="line">    <span class="keyword">if</span> (abs-&gt;m_Size == <span class="number">0</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;当前记录为空！&quot;</span> &lt;&lt; endl;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment">// 遍历通讯录并显示信息</span></span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; abs-&gt;m_Size; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            cout &lt;&lt; <span class="string">&quot;姓名：&quot;</span> &lt;&lt; abs-&gt;personArray[i].m_Name &lt;&lt; <span class="string">&quot;\t&quot;</span>;</span><br><span class="line">            cout &lt;&lt; <span class="string">&quot;性别：&quot;</span> &lt;&lt; (abs-&gt;personArray[i].m_Sex == <span class="number">1</span> ? <span class="string">&quot;男&quot;</span> : <span class="string">&quot;女&quot;</span>) &lt;&lt; <span class="string">&quot;\t&quot;</span>;</span><br><span class="line">            cout &lt;&lt; <span class="string">&quot;年龄：&quot;</span> &lt;&lt; abs-&gt;personArray[i].m_Age &lt;&lt; <span class="string">&quot;\t&quot;</span>;</span><br><span class="line">            cout &lt;&lt; <span class="string">&quot;电话：&quot;</span> &lt;&lt; abs-&gt;personArray[i].m_Phone &lt;&lt; <span class="string">&quot;\t&quot;</span>;</span><br><span class="line">            cout &lt;&lt; <span class="string">&quot;住址：&quot;</span> &lt;&lt; abs-&gt;personArray[i].m_Addr &lt;&lt; endl;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line">    <span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="2-3-2-测试显示联系人功能"><a href="#2-3-2-测试显示联系人功能" class="headerlink" title="2.3.2 测试显示联系人功能"></a>2.3.2 测试显示联系人功能</h4><p>在 <code>switch case</code> 语句中， <code>case 2</code> 里添加：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">case</span> <span class="number">2</span>:  <span class="comment">// 显示联系人</span></span><br><span class="line">    <span class="built_in">showPerson</span>(&amp;abs);  <span class="comment">// 调用显示联系人函数</span></span><br><span class="line">    <span class="keyword">break</span>;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>测试效果如图：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/08/13/acae76.png" alt="03显示联系人"></p><h3 id="2-4-删除联系人"><a href="#2-4-删除联系人" class="headerlink" title="2.4 删除联系人"></a>2.4 删除联系人</h3><p><strong>功能描述：</strong> 实现删除联系人功能，根据姓名删除指定联系人。</p><p>删除联系人实现步骤：</p><ul><li>封装检测联系人是否存在</li><li>封装删除联系人函数</li><li>测试删除联系人功能</li></ul><h4 id="2-4-1-封装检测联系人是否存在"><a href="#2-4-1-封装检测联系人是否存在" class="headerlink" title="2.4.1 封装检测联系人是否存在"></a>2.4.1 封装检测联系人是否存在</h4><p><strong>设计思路</strong>：</p><p>删除联系人前，我们需要先判断用户输入的联系人是否存在，如果存在删除，不存在提示用户没有要删除的联系人</p><p>因此我们可以把检测联系人是否存在封装成一个函数中，如果存在，返回联系人在通讯录中的位置，不存在返回-1</p><p>检测联系人是否存在代码：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 删除联系人函数</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">deletePerson</span><span class="params">(Addressbooks *abs)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;请输入要删除的联系人姓名：&quot;</span> &lt;&lt; endl;</span><br><span class="line">    string name;</span><br><span class="line">    cin &gt;&gt; name;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 查找联系人</span></span><br><span class="line">    <span class="type">int</span> index = <span class="number">-1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; abs-&gt;m_Size; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (abs-&gt;personArray[i].m_Name == name)</span><br><span class="line">        &#123;</span><br><span class="line">            index = i;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 找到联系人并执行删除操作</span></span><br><span class="line">    <span class="keyword">if</span> (index != <span class="number">-1</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = index; i &lt; abs-&gt;m_Size - <span class="number">1</span>; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            abs-&gt;personArray[i] = abs-&gt;personArray[i + <span class="number">1</span>];</span><br><span class="line">        &#125;</span><br><span class="line">        abs-&gt;m_Size--;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;删除成功！&quot;</span> &lt;&lt; endl;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;未找到联系人！&quot;</span> &lt;&lt; endl;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line">    <span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="2-4-2-封装删除联系人函数"><a href="#2-4-2-封装删除联系人函数" class="headerlink" title="2.4.2 封装删除联系人函数"></a>2.4.2 封装删除联系人函数</h4><p>根据用户输入的联系人判断该通讯录中是否有此人</p><p>查找到进行删除，并提示删除成功</p><p>查不到提示查无此人。代码如下：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">delectPenson</span><span class="params">(Addressbooks* abs)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">string name;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;请输入需要删除的联系人姓名：&quot;</span> &lt;&lt; endl;</span><br><span class="line">cin &gt;&gt; name;</span><br><span class="line"><span class="type">int</span> ret = <span class="built_in">isExist</span>(abs, name);</span><br><span class="line"><span class="keyword">if</span> (ret == <span class="number">-1</span>)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;联系人不存在，删除失败！&quot;</span> &lt;&lt; endl;</span><br><span class="line"></span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = ret; i &lt; abs-&gt;m_Size; i++)</span><br><span class="line">&#123;</span><br><span class="line">abs-&gt;personArray[i] = abs-&gt;personArray[i + <span class="number">1</span>];</span><br><span class="line">&#125;</span><br><span class="line">abs-&gt;m_Size--;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;删除成功！&quot;</span> &lt;&lt; endl;</span><br><span class="line"></span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="2-4-3-测试删除联系人功能"><a href="#2-4-3-测试删除联系人功能" class="headerlink" title="2.4.3 测试删除联系人功能"></a>2.4.3 测试删除联系人功能</h4><p>在 <code>switch case</code> 语句中， <code>case 3</code> 里添加：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">case</span> <span class="number">3</span>:  <span class="comment">// 删除联系人</span></span><br><span class="line">    <span class="built_in">deletePerson</span>(&amp;abs);  <span class="comment">// 调用删除联系人函数</span></span><br><span class="line">    <span class="keyword">break</span>;</span><br></pre></td></tr></table></figure><p>测试效果如图：</p><p>1、联系人不存在：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/08/13/c7eb98.png" alt="04删除失败"></p><p>2、联系人存在：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/08/13/60cc2b.png" alt="04删除成功"></p><h3 id="2-5-查找联系人"><a href="#2-5-查找联系人" class="headerlink" title="2.5 查找联系人"></a>2.5 查找联系人</h3><p><strong>功能描述：</strong> 实现查找联系人功能，根据姓名查找指定联系人。</p><p>查找联系人实现步骤</p><ul><li>封装查找联系人函数</li><li>测试查找指定联系人</li></ul><h4 id="2-5-1-封装查找联系人函数"><a href="#2-5-1-封装查找联系人函数" class="headerlink" title="2.5.1 封装查找联系人函数"></a>2.5.1 封装查找联系人函数</h4><p><strong>思路：</strong> 遍历通讯录，找到与输入姓名匹配的联系人并显示其信息，如果未找到则提示不存在。</p><p>查找联系人代码：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 查找联系人函数</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">findPerson</span><span class="params">(<span class="type">const</span> Addressbooks *abs)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;请输入要查找的联系人姓名：&quot;</span> &lt;&lt; endl;</span><br><span class="line">    string name;</span><br><span class="line">    cin &gt;&gt; name;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 遍历通讯录查找联系人</span></span><br><span class="line">    <span class="type">int</span> index = <span class="number">-1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; abs-&gt;m_Size; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (abs-&gt;personArray[i].m_Name == name)</span><br><span class="line">        &#123;</span><br><span class="line">            index = i;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 找到联系人并显示其信息</span></span><br><span class="line">    <span class="keyword">if</span> (index != <span class="number">-1</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;姓名：&quot;</span> &lt;&lt; abs-&gt;personArray[index].m_Name &lt;&lt; <span class="string">&quot;\t&quot;</span>;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;性别：&quot;</span> &lt;&lt; (abs-&gt;personArray[index].m_Sex == <span class="number">1</span> ? <span class="string">&quot;男&quot;</span> : <span class="string">&quot;女&quot;</span>) &lt;&lt; <span class="string">&quot;\t&quot;</span>;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;年龄：&quot;</span> &lt;&lt; abs-&gt;personArray[index].m_Age &lt;&lt; <span class="string">&quot;\t&quot;</span>;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;电话：&quot;</span> &lt;&lt; abs-&gt;personArray[index].m_Phone &lt;&lt; <span class="string">&quot;\t&quot;</span>;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;住址：&quot;</span> &lt;&lt; abs-&gt;personArray[index].m_Addr &lt;&lt; endl;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;未找到联系人！&quot;</span> &lt;&lt; endl;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line">    <span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="2-5-2-测试查找指定联系人"><a href="#2-5-2-测试查找指定联系人" class="headerlink" title="2.5.2 测试查找指定联系人"></a>2.5.2 测试查找指定联系人</h4><p>在 <code>switch case</code> 语句中， <code>case 4</code> 里添加：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">case</span> <span class="number">4</span>:  <span class="comment">// 查找联系人</span></span><br><span class="line">    <span class="built_in">findPerson</span>(&amp;abs);  <span class="comment">// 调用查找联系人函数</span></span><br><span class="line">    <span class="keyword">break</span>;</span><br></pre></td></tr></table></figure><p>测试效果如图：</p><p>1、联系人不存在：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/08/13/bbad33.png" alt="05查找失败"></p><p>2、联系人存在：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/08/13/7ec351.png" alt="05查找成功"></p><h3 id="2-6-修改联系人"><a href="#2-6-修改联系人" class="headerlink" title="2.6 修改联系人"></a>2.6 修改联系人</h3><p><strong>功能描述：</strong> 实现修改联系人信息功能，根据姓名修改指定联系人的信息。</p><p>修改联系人实现步骤</p><ul><li>封装修改联系人函数</li><li>测试修改联系人功能</li></ul><h4 id="2-6-1-封装修改联系人函数"><a href="#2-6-1-封装修改联系人函数" class="headerlink" title="2.6.1 封装修改联系人函数"></a>2.6.1 封装修改联系人函数</h4><p><strong>思路：</strong> 先查找联系人，如果找到则提示用户输入新的联系人信息并覆盖原来的数据。</p><p>修改联系人代码：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 修改联系人函数</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">modifyPerson</span><span class="params">(Addressbooks *abs)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    cout &lt;&lt; <span class="string">&quot;请输入要修改的联系人姓名：&quot;</span> &lt;&lt; endl;</span><br><span class="line">    string name;</span><br><span class="line">    cin &gt;&gt; name;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 查找联系人</span></span><br><span class="line">    <span class="type">int</span> index = <span class="number">-1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; abs-&gt;m_Size; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (abs-&gt;personArray[i].m_Name == name)</span><br><span class="line">        &#123;</span><br><span class="line">            index = i;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 找到联系人并执行修改操作</span></span><br><span class="line">    <span class="keyword">if</span> (index != <span class="number">-1</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;请输入修改后的姓名：&quot;</span> &lt;&lt; endl;</span><br><span class="line">        string newName;</span><br><span class="line">        cin &gt;&gt; newName;</span><br><span class="line">        abs-&gt;personArray[index].m_Name = newName;</span><br><span class="line"></span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;请输入修改后的性别：&quot;</span> &lt;&lt; endl;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;1 --- 男&quot;</span> &lt;&lt; endl;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;2 --- 女&quot;</span> &lt;&lt; endl;</span><br><span class="line">        <span class="type">int</span> sex;</span><br><span class="line">        cin &gt;&gt; sex;</span><br><span class="line">        abs-&gt;personArray[index].m_Sex = sex;</span><br><span class="line"></span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;请输入修改后的年龄：&quot;</span> &lt;&lt; endl;</span><br><span class="line">        <span class="type">int</span> age;</span><br><span class="line">        cin &gt;&gt; age;</span><br><span class="line">        abs-&gt;personArray[index].m_Age = age;</span><br><span class="line"></span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;请输入修改后的电话：&quot;</span> &lt;&lt; endl;</span><br><span class="line">        string phone;</span><br><span class="line">        cin &gt;&gt; phone;</span><br><span class="line">        abs-&gt;personArray[index].m_Phone = phone;</span><br><span class="line"></span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;请输入修改后的住址：&quot;</span> &lt;&lt; endl;</span><br><span class="line">        string addr;</span><br><span class="line">        cin &gt;&gt; addr;</span><br><span class="line">        abs-&gt;personArray[index].m_Addr = addr;</span><br><span class="line"></span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;修改成功！&quot;</span> &lt;&lt; endl;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    &#123;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;未找到联系人！&quot;</span> &lt;&lt; endl;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line">    <span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="2-6-2-测试修改联系人功能"><a href="#2-6-2-测试修改联系人功能" class="headerlink" title="2.6.2 测试修改联系人功能"></a>2.6.2 测试修改联系人功能</h4><p>在 <code>switch case</code> 语句中， <code>case 5</code> 里添加：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">case</span> <span class="number">5</span>:  <span class="comment">// 修改联系人</span></span><br><span class="line">    <span class="built_in">modifyPerson</span>(&amp;abs);  <span class="comment">// 调用修改联系人函数</span></span><br><span class="line">    <span class="keyword">break</span>;</span><br></pre></td></tr></table></figure><p>测试效果如图：</p><p>1、查不到指定联系人：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/08/13/02d6d7.png" alt="06修改失败"></p><p>2、查找到联系人并修改成功：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/08/13/a83d94.png" alt="06修改成功"></p><p>再次查看通讯录，确认修改完毕：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/08/13/2da673.png" alt="06确认修改成功"></p><h3 id="2-7-清空联系人"><a href="#2-7-清空联系人" class="headerlink" title="2.7 清空联系人"></a>2.7 清空联系人</h3><p><strong>功能描述：</strong> 实现清空通讯录功能。</p><p>清空联系人实现步骤</p><ul><li>封装清空联系人函数</li><li>测试清空联系人</li></ul><h4 id="2-7-1-封装清空联系人函数"><a href="#2-7-1-封装清空联系人函数" class="headerlink" title="2.7.1 封装清空联系人函数"></a>2.7.1 封装清空联系人函数</h4><p><strong>思路</strong>： 将通讯录所有联系人信息清除掉，只要将通讯录记录的联系人数量置为 0，做逻辑清空即可。</p><p>清空联系人代码：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">cleanPenson</span><span class="params">(Addressbooks* abs)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span> (abs-&gt;m_Size == <span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;通讯录为空！无需清空&quot;</span> &lt;&lt; endl;</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;警告：您是否需要清除整个通讯录？&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;确认清空请输入 0 || 其他任意数字退出 &quot;</span> &lt;&lt; endl;</span><br><span class="line"><span class="type">int</span> select;</span><br><span class="line">cin &gt;&gt; select;</span><br><span class="line"><span class="keyword">if</span> (select != <span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;已取消清空操作！&quot;</span> &lt;&lt; endl;</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;您是否了解清空后所有联系人均被删除且无法恢复？&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;了解请输入 1 ||  其他任意数字退出 &quot;</span> &lt;&lt; endl;</span><br><span class="line">cin &gt;&gt; select;</span><br><span class="line"><span class="keyword">if</span> (select != <span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;已取消清空操作！&quot;</span> &lt;&lt; endl;</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;这将是你最后一次反悔机会，如还要清空操作请输入&quot;</span> &lt;&lt; endl;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;确认清空&quot;</span> &lt;&lt; endl;</span><br><span class="line">string input;</span><br><span class="line">cin &gt;&gt; input;</span><br><span class="line"><span class="keyword">if</span> (input == <span class="string">&quot;确认清空&quot;</span>)</span><br><span class="line">&#123;</span><br><span class="line">abs-&gt;m_Size = <span class="number">0</span>;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;清空成功！&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">cout &lt;&lt; <span class="string">&quot;已取消清空操作！&quot;</span> &lt;&lt; endl;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line"><span class="built_in">system</span>(<span class="string">&quot;cls&quot;</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="2-7-2-测试清空联系人"><a href="#2-7-2-测试清空联系人" class="headerlink" title="2.7.2 测试清空联系人"></a>2.7.2 测试清空联系人</h4><p>在 <code>switch case</code> 语句中， <code>case 6</code> 里添加：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">case</span> <span class="number">6</span>:  <span class="comment">// 清空联系人</span></span><br><span class="line">    <span class="built_in">cleanPerson</span>(&amp;abs);  <span class="comment">// 调用清空联系人函数</span></span><br><span class="line">    <span class="keyword">break</span>;</span><br></pre></td></tr></table></figure><p>测试效果如图：</p><p>清空通讯录：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/08/13/236672.png" alt="07清空"></p><p>再次查看信息，显示记录为空：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/08/13/8692aa.png" alt="08清空后查看"></p><h3 id="2-8-退出功能"><a href="#2-8-退出功能" class="headerlink" title="2.8 退出功能"></a>2.8 退出功能</h3><p><strong>功能描述：</strong> 实现退出通讯录系统的功能。</p><p><strong>思路：</strong> 在主菜单中，根据用户的选择，执行不同的功能。当用户选择 <code>0</code> 时，程序将退出；选择其他选项则进入对应的功能。通过 <code>switch</code> 分支结构来控制程序的流程，当用户选择 <code>0</code> 时退出系统，选择其他选项时继续执行程序。</p><p>代码：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="type">int</span> select;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 创建通讯录</span></span><br><span class="line">    <span class="keyword">struct</span> <span class="title class_">Addressbooks</span> abs;</span><br><span class="line">    abs.m_Size = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> (<span class="literal">true</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">showMenu</span>();  <span class="comment">// 显示主菜单</span></span><br><span class="line">        cin &gt;&gt; select;  <span class="comment">// 用户输入选择</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">switch</span> (select)</span><br><span class="line">        &#123;</span><br><span class="line">        <span class="keyword">case</span> <span class="number">1</span>:  <span class="comment">// 添加联系人</span></span><br><span class="line">            <span class="built_in">addPerson</span>(&amp;abs);</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="number">2</span>:  <span class="comment">// 显示联系人</span></span><br><span class="line">            <span class="built_in">showPerson</span>(&amp;abs);</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="number">3</span>:  <span class="comment">// 删除联系人</span></span><br><span class="line">            <span class="built_in">deletePerson</span>(&amp;abs);</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="number">4</span>:  <span class="comment">// 查找联系人</span></span><br><span class="line">            <span class="built_in">findPerson</span>(&amp;abs);</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="number">5</span>:  <span class="comment">// 修改联系人</span></span><br><span class="line">            <span class="built_in">modifyPerson</span>(&amp;abs);</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="number">6</span>:  <span class="comment">// 清空联系人</span></span><br><span class="line">            <span class="built_in">cleanPerson</span>(&amp;abs);</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        <span class="keyword">case</span> <span class="number">0</span>:  <span class="comment">// 退出通讯录</span></span><br><span class="line">            cout &lt;&lt; <span class="string">&quot;欢迎下次使用！&quot;</span> &lt;&lt; endl;</span><br><span class="line">            <span class="keyword">return</span> <span class="number">0</span>;  <span class="comment">// 退出程序</span></span><br><span class="line">        <span class="keyword">default</span>:  <span class="comment">// 处理无效输入</span></span><br><span class="line">            cout &lt;&lt; <span class="string">&quot;无效选择，请重新输入！&quot;</span> &lt;&lt; endl;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">system</span>(<span class="string">&quot;pause&quot;</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>效果图：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/08/13/d25546.png" alt="09退出"></p><h2 id="3、总结"><a href="#3、总结" class="headerlink" title="3、总结"></a>3、总结</h2><p>通过这个通讯录管理系统的项目，我们不仅复习了 C++的基础知识，还学会了如何将多个功能模块结合起来实现一个完整的系统。我们使用结构体管理数据，并通过函数分解任务，使代码更加清晰易懂。尽管这个项目看起来比较简单，但它涵盖了 C++编程的很多基本概念，是一个非常好的实践机会。</p><p>在实际编写过程中，我们也可以发现改进的空间，比如可以增加输入数据的校验功能、优化用户体验，或者扩展通讯录的功能等等。这个项目可以作为一个基础，后续可以进一步丰富和优化。</p>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E5%AD%A6%E4%B9%A0/">学习</category>
      
      
      <category domain="https://www.chillg.de/tags/C-C/">C/C++</category>
      
      <category domain="https://www.chillg.de/tags/%E5%AD%A6%E4%B9%A0/">学习</category>
      
      <category domain="https://www.chillg.de/tags/%E5%AE%9E%E6%88%98%E9%A1%B9%E7%9B%AE/">实战项目</category>
      
      
      <comments>https://www.chillg.de/posts/20d5ca9e.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>HEXO重装日记</title>
      <link>https://www.chillg.de/posts/a480a265.html</link>
      <guid>https://www.chillg.de/posts/a480a265.html</guid>
      <pubDate>Mon, 08 Apr 2024 13:26:24 GMT</pubDate>
      
      <description>折腾pwa把hexo搞坏了，索性备份好，直接删库重装，本文记录最速重装过程（事后回忆版）</description>
      
      
      
      <content:encoded><![CDATA[<h1 id="备份完整文件"><a href="#备份完整文件" class="headerlink" title="备份完整文件"></a>备份完整文件</h1><p>最最最最最重要的是，一定要备份好完整的文件，建议把整个原本的博客文件夹全部归档备份，一遍后续复制粘贴还原相关配置</p><h1 id="Hexo-安装"><a href="#Hexo-安装" class="headerlink" title="Hexo 安装"></a>Hexo 安装</h1><p>新建博客目录，安装 hexo</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-cli -g</span><br></pre></td></tr></table></figure><h2 id="Hexo-初始化配置"><a href="#Hexo-初始化配置" class="headerlink" title="Hexo 初始化配置"></a>Hexo 初始化配置</h2><p>初始化 hexo</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo init</span><br><span class="line">npm install hexo-deployer-git --save</span><br></pre></td></tr></table></figure><h2 id="安装主题"><a href="#安装主题" class="headerlink" title="安装主题"></a>安装主题</h2><p>安装博客主题，比如知名主题<code>Butterfly</code> 或本站使用的安知鱼主题</p><ul><li><p><code>Butterfly</code></p><ul><li>git clone -b master <a href="https://github.com/jerryc127/hexo-theme-butterfly.git">https://github.com/jerryc127/hexo-theme-butterfly.git</a> themes&#x2F;butterfly</li></ul></li><li><p>安知鱼</p><ul><li>git clone -b main <a href="https://github.com/anzhiyu-c/hexo-theme-anzhiyu.git">https://github.com/anzhiyu-c/hexo-theme-anzhiyu.git</a> themes&#x2F;anzhiyu</li></ul></li></ul><p>建议参考相关文档完成安装与配置</p><p>建议讲<code>主题配置</code>放置在更目录中，以防止更新主题文件导致配置文件丢失，具体做法是：讲主题目录下的_config.yml 复制到根目录中并重命名为<code>_config.butterfly.yml</code> 或<code>_config.anzhiyu.yml</code> 具体名称需要以你的主题为准。</p><p>以后如果修改任何主题配置，都只需修改 _config.主题名.yml 的配置即可。</p><p>注意：</p><ul><li>只要存在于 <code>_config.主题名.yml</code> 的配置都是高优先级，修改原 <code>_config.yml</code> 是无效的。</li><li>每次更新主题可能存在配置变更，请注意更新说明，可能需要手动对 <code>_config.主题名.yml</code> 同步修改。</li><li>想查看覆盖配置有没有生效，可以通过 <code>hexo g --debug</code> 查看命令行输出。</li><li>如果想将某些配置覆盖为空，注意不要把主键删掉，不然是无法覆盖的</li></ul><h3 id="安装-pug-和-stylus-渲染插件"><a href="#安装-pug-和-stylus-渲染插件" class="headerlink" title="安装 pug 和 stylus 渲染插件"></a>安装 pug 和 stylus 渲染插件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-renderer-pug hexo-renderer-stylus --save</span><br></pre></td></tr></table></figure><p>或</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-renderer-pug hexo-renderer-stylus --save --registry=http://registry.npmmirror.com</span><br></pre></td></tr></table></figure><h2 id="配置文件"><a href="#配置文件" class="headerlink" title="配置文件"></a>配置文件</h2><p>打开 Hexo Configuration 文件：<code>_config.yml</code></p><p>修改 title、subtitle、description、keywords、author、language、timezone、url 等，具体请参考之前备份的配置文件或<a href="https://hexo.io/zh-cn/docs/index.html">hexo 官方中文文档</a></p><p>打开主题配置文件<code>_config.主题名.yml</code></p><p>修改相关配置。</p><p>至此 Hexo 框架安装完成，理论上此时可以直接启动 Hexo 渲染文章</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hexo cl</span><br><span class="line">hexo g</span><br><span class="line">hexo s</span><br></pre></td></tr></table></figure><p>但我们是迁移博客，所以继续完善配置。</p><h1 id="插件安装"><a href="#插件安装" class="headerlink" title="插件安装"></a>插件安装</h1><h2 id="SEO-优化类"><a href="#SEO-优化类" class="headerlink" title="SEO 优化类"></a>SEO 优化类</h2><p>SEO 是“Search Engine Optimization”（搜索引擎优化）或“Search Engine Optimizer”（搜索引擎优化服务商）的首字母缩写。聘用 SEO 是一项重大决定，这有可能改善您的网站并节省时间，但也存在破坏网站和声誉受损的风险。在调研聘用 SEO 带来的潜在益处的同时，也请务必评估，如果 SEO 不负责，可能给您的网站带来哪些损害。很多 SEO 及其他代理机构和顾问会为网站所有者提供实用的服务，包括：</p><ul><li>网站内容或结构审核</li><li>网站开发技术建议：如托管、重定向、错误页、JavaScript 的使用</li><li>内容开发</li><li>线上业务发展活动管理</li><li>关键字研究</li><li>SEO 培训</li><li>有关特定市场和地理区域的专业知识。</li></ul><p>以上来自于谷歌对 SEO 的解释，具体来说就是关乎你的网站是否被谷歌收录、以及展示位置排名等。一下方法仅为提高其概率，并不保证一定收录或一定前排展示。</p><h3 id="配置文章链接转数字或字母"><a href="#配置文章链接转数字或字母" class="headerlink" title="配置文章链接转数字或字母"></a>配置文章链接转数字或字母</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-abbrlink --save</span><br></pre></td></tr></table></figure><p>这是个 Hexo 插件，可以根据帖子前面的标题和数据生成静态帖子链接，不再是年月日，优化 SEO 收录。</p><p>并在 hexo 配置文件内将<code>permalink</code>修改为如下：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">permalink:</span> <span class="string">posts/:abbrlink.html</span></span><br></pre></td></tr></table></figure><p>并添加</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">abbrlink:</span></span><br><span class="line">  <span class="attr">alg:</span> <span class="string">crc32</span> <span class="comment">#support crc16(default) and crc32</span></span><br><span class="line">  <span class="attr">rep:</span> <span class="string">hex</span> <span class="comment">#support dec(default) and hex</span></span><br></pre></td></tr></table></figure><p>注意缩进</p><p>具体请参考原作者仓库：<a href="https://github.com/rozbo/hexo-abbrlink">https://github.com/rozbo/hexo-abbrlink</a></p><h3 id="站地图的生成"><a href="#站地图的生成" class="headerlink" title="站地图的生成"></a>站地图的生成</h3><p>安装 sitemap 插件，来生成文章站点地图</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-generator-sitemap --save</span><br><span class="line">npm install hexo-generator-baidu-sitemap --save-dev</span><br></pre></td></tr></table></figure><p>并在 Hexo 配置文件内添加：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 谷歌、百度站点地图生成</span></span><br><span class="line"><span class="attr">Plugins:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">hexo-generator-baidu-sitemap</span></span><br><span class="line">  <span class="bullet">-</span> <span class="string">hexo-generator-sitemap</span></span><br><span class="line"></span><br><span class="line"><span class="attr">baidusitemap:</span></span><br><span class="line">  <span class="attr">path:</span> <span class="string">baidusitemap.xml</span></span><br><span class="line"><span class="attr">sitemap:</span></span><br><span class="line">  <span class="attr">path:</span> <span class="string">sitemap.xml</span></span><br></pre></td></tr></table></figure><h2 id="美化插件类"><a href="#美化插件类" class="headerlink" title="美化插件类"></a>美化插件类</h2><h3 id="看板娘"><a href="#看板娘" class="headerlink" title="看板娘"></a>看板娘</h3><p>请参考本站发表于 2024-01-08 字数总计:1.9k 阅读时长:9 分钟的文章：<a href="https://chillg.top/posts/8d352e14.html">为你的博客添加看板娘（HEXO 框架）</a></p><p>此篇博文详尽的介绍了安装方法以及本人对其做的优化改动和自定义配置文件</p><p><img src="https://file.8888998.xyz/2025/09/14/1757838092927-5nat9b.png" alt="看板娘文章"></p><h3 id="留言板：薇尔莉特信封"><a href="#留言板：薇尔莉特信封" class="headerlink" title="留言板：薇尔莉特信封"></a>留言板：薇尔莉特信封</h3><p>安装</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-butterfly-envelope --save</span><br></pre></td></tr></table></figure><p>在 hexo 配置文件中添加如下配置：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># envelope_comment</span></span><br><span class="line"><span class="comment"># see https://akilar.top/posts/e2d3c450/</span></span><br><span class="line"><span class="comment"># envelope_comment</span></span><br><span class="line"><span class="comment"># see https://akilar.top/posts/e2d3c450/</span></span><br><span class="line"><span class="attr">envelope_comment:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span> <span class="comment">#控制开关</span></span><br><span class="line">  <span class="attr">custom_pic:</span></span><br><span class="line">    <span class="attr">cover:</span> <span class="string">https://cdn.cbd.int//hexo-butterfly-envelope/lib/violet.jpg</span> <span class="comment">#信笺头部图片</span></span><br><span class="line">    <span class="attr">line:</span> <span class="string">https://cdn.cbd.int/hexo-butterfly-envelope/lib/line.png</span> <span class="comment">#信笺底部图片</span></span><br><span class="line">    <span class="attr">beforeimg:</span> <span class="string">https://cdn.cbd.int/hexo-butterfly-envelope/lib/before.png</span> <span class="comment"># 信封前半部分</span></span><br><span class="line">    <span class="attr">afterimg:</span> <span class="string">https://cdn.cbd.int/hexo-butterfly-envelope/lib/after.png</span> <span class="comment"># 信封后半部分</span></span><br><span class="line">  <span class="attr">message:</span> <span class="comment">#信笺正文，多行文本，写法如下</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">有什么想问的？</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">有什么想说的？</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">有什么想吐槽的？</span></span><br><span class="line">    <span class="bullet">-</span> <span class="string">哪怕是有什么想吃的，都可以告诉我哦~</span></span><br><span class="line">  <span class="attr">bottom:</span> <span class="string">自动书记人偶竭诚为您服务！</span> <span class="comment">#仅支持单行文本</span></span><br><span class="line">  <span class="attr">height:</span> <span class="comment">#1050px，信封划出的高度</span></span><br><span class="line">  <span class="attr">path:</span> <span class="comment">#【可选】comments 的路径名称。默认为 comments，生成的页面为 comments/index.html</span></span><br><span class="line">  <span class="attr">front_matter:</span> <span class="comment">#【可选】comments页面的 front_matter 配置</span></span><br><span class="line">    <span class="attr">title:</span> <span class="string">留言板</span></span><br><span class="line">    <span class="attr">comments:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>别忘了在主题文件导航中开启对应页面，例如：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">留言板:</span> <span class="string">/comments/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-envelope</span></span><br></pre></td></tr></table></figure><h3 id="电子钟"><a href="#电子钟" class="headerlink" title="电子钟"></a>电子钟</h3><p>安装安知鱼提供的电子钟</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-butterfly-clock-anzhiyu --save</span><br></pre></td></tr></table></figure><p>预览图：<br><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/04/08/739885.png" alt="电子钟预览图"></p><p>在主题配置中添加如下配置：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># electric_clock</span></span><br><span class="line"><span class="comment"># see https://blog.anheyu.com/posts/fc18.html</span></span><br><span class="line"><span class="attr">electric_clock:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span> <span class="comment"># 开关</span></span><br><span class="line">  <span class="attr">priority:</span> <span class="number">5</span> <span class="comment">#过滤器优先权</span></span><br><span class="line">  <span class="attr">enable_page:</span> <span class="string">all</span> <span class="comment"># 应用页面</span></span><br><span class="line">  <span class="attr">exclude:</span></span><br><span class="line">  <span class="comment"># - /posts/</span></span><br><span class="line">  <span class="comment"># - /about/</span></span><br><span class="line">  <span class="attr">layout:</span> <span class="comment"># 挂载容器类型</span></span><br><span class="line">    <span class="attr">type:</span> <span class="string">class</span></span><br><span class="line">    <span class="attr">name:</span> <span class="string">sticky_layout</span></span><br><span class="line">    <span class="attr">index:</span> <span class="number">0</span></span><br><span class="line">  <span class="attr">loading:</span> <span class="string">https://cdn.cbd.int/hexo-butterfly-clock-anzhiyu/lib/loading.gif</span> <span class="comment">#加载动画自定义</span></span><br><span class="line">  <span class="attr">clock_css:</span> <span class="string">https://cdn.cbd.int/hexo-butterfly-clock-anzhiyu/lib/clock.min.css</span></span><br><span class="line">  <span class="attr">clock_js:</span> <span class="string">https://cdn.cbd.int/hexo-butterfly-clock-anzhiyu/lib/clock.min.js</span></span><br><span class="line">  <span class="attr">ip_api:</span> <span class="string">https://widget.qweather.net/simple/static/js/he-simple-common.js?v=2.0</span></span><br><span class="line">  <span class="attr">qweather_key:</span> <span class="comment"># 和风天气key</span></span><br><span class="line">  <span class="attr">gaud_map_key:</span> <span class="comment"># 高得地图web服务key</span></span><br><span class="line">  <span class="attr">default_rectangle:</span> <span class="literal">false</span> <span class="comment"># 开启后将一直显示rectangle位置的天气，否则将获取访问者的地理位置与天气</span></span><br><span class="line">  <span class="attr">rectangle:</span> <span class="number">112.982279</span><span class="string">,28.19409</span> <span class="comment"># 获取访问者位置失败时会显示该位置的天气，同时该位置为开启default_rectangle后的位置</span></span><br></pre></td></tr></table></figure><table><thead><tr><th>参数</th><th>备选值&#x2F;类型</th><th>释义</th></tr></thead><tbody><tr><td>priority</td><td>number</td><td>【可选】过滤器优先级，数值越小，执行越早，默认为 10，选填</td></tr><tr><td>enable</td><td>true&#x2F;false</td><td>【必选】控制开关</td></tr><tr><td>enable_page</td><td>path&#x2F;all</td><td>【可选】填写想要应用的页面的相对路径（即路由地址）,如根目录就填’&#x2F;‘,分类页面就填’&#x2F;categories&#x2F;‘。若要应用于所有页面，就填’all’，默认为 all</td></tr><tr><td>exclude</td><td>path</td><td>【可选】填写想要屏蔽的页面，可以多个。写法见示例。原理是将屏蔽项的内容逐个放到当前路径去匹配，若当前路径包含任一屏蔽项，则不会挂载。</td></tr><tr><td>layout.type</td><td>id&#x2F;class</td><td>【可选】挂载容器类型，填写 id 或 class，不填则默认为 id</td></tr><tr><td>layout.name</td><td>text</td><td>【必选】挂载容器名称</td></tr><tr><td>layout.index</td><td>0 和正整数</td><td>【可选】前提是 layout.type 为 class，因为同一页面可能有多个 class，此项用来确认究竟排在第几个顺位</td></tr><tr><td>loading</td><td>URL</td><td>【可选】电子钟加载动画的图片</td></tr><tr><td>clock_css</td><td>URL</td><td>【可选】电子钟样式 CDN 资源</td></tr><tr><td>clock_js</td><td>URL</td><td>【可选】电子钟执行脚本 CDN 资源</td></tr><tr><td>ip_api</td><td>URL</td><td>【可选】获取时钟 IP 的 API</td></tr><tr><td>qweather_key</td><td>text</td><td>【可选】和风天气 key</td></tr><tr><td>gaud_map_key</td><td>text</td><td>【可选】高得地图 web 服务 key</td></tr><tr><td>default_rectangle</td><td>text</td><td>【可选】开启后将一直显示 rectangle 位置的天气，否则将获取访问者的地理位置与天气</td></tr><tr><td>rectangle</td><td>text</td><td>【可选】获取访问者位置失败时会显示该位置的天气，同时该位置为开启 default_rectangle 后的位置</td></tr></tbody></table><p>（感谢安知鱼提供）</p><h3 id="安装字数统计"><a href="#安装字数统计" class="headerlink" title="安装字数统计"></a>安装字数统计</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-wordcount --save</span><br></pre></td></tr></table></figure><h1 id="主题进阶配置"><a href="#主题进阶配置" class="headerlink" title="主题进阶配置"></a>主题进阶配置</h1><p>安知鱼主题进阶配置，内容参考与<a href="https://docs.anheyu.com/%EF%BC%8C%E5%BB%BA%E8%AE%AE%E7%9B%B4%E6%8E%A5%E5%89%8D%E5%BE%80%E4%BD%9C%E8%80%85%E6%96%87%E6%A1%A3%E4%B8%AD%E9%85%8D%E7%BD%AE%E3%80%82">https://docs.anheyu.com/，建议直接前往作者文档中配置。</a></p><h2 id="Footer-设置"><a href="#Footer-设置" class="headerlink" title="Footer 设置"></a>Footer 设置</h2><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Footer Settings</span></span><br><span class="line"><span class="comment"># --------------------------------------</span></span><br><span class="line"><span class="attr">footer:</span></span><br><span class="line">  <span class="attr">owner:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">since:</span> <span class="number">2020</span></span><br><span class="line">  <span class="attr">custom_text:</span></span><br><span class="line">  <span class="attr">runtime:</span></span><br><span class="line">    <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">    <span class="attr">launch_time:</span> <span class="number">04</span><span class="string">/01/2021</span> <span class="number">00</span><span class="string">:00:00</span> <span class="comment"># 网站上线时间</span></span><br><span class="line">    <span class="attr">work_img:</span> <span class="string">https://npm.elemecdn.com/anzhiyu-blog@2.0.4/img/badge/安知鱼-上班摸鱼中.svg</span></span><br><span class="line">    <span class="attr">work_description:</span> <span class="string">距离月入25k也就还差一个大佬带我~</span></span><br><span class="line">    <span class="attr">offduty_img:</span> <span class="string">https://npm.elemecdn.com/anzhiyu-blog@2.0.4/img/badge/安知鱼-下班啦.svg</span></span><br><span class="line">    <span class="attr">offduty_description:</span> <span class="string">下班了就该开开心心的玩耍，嘿嘿~</span></span><br><span class="line">  <span class="comment"># 徽标部分配置项 https://shields.io/</span></span><br><span class="line">  <span class="comment"># https://img.shields.io/badge/CDN-jsDelivr-orange?style=flat&amp;logo=jsDelivr</span></span><br><span class="line">  <span class="attr">bdageitem:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">link:</span> <span class="string">https://hexo.io/</span> <span class="comment">#徽标指向网站链接</span></span><br><span class="line">      <span class="attr">shields:</span> <span class="string">https://npm.elemecdn.com/anzhiyu-blog@2.1.5/img/badge/Frame-Hexo.svg</span> <span class="comment">#徽标API</span></span><br><span class="line">      <span class="attr">message:</span> <span class="string">博客框架为Hexo_v5.4.0</span> <span class="comment">#徽标提示语</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">link:</span> <span class="string">https://blog.anheyu.com/</span></span><br><span class="line">      <span class="attr">shields:</span> <span class="string">https://pan.anheyu.com/d/anzhiyu/svg/Theme-AnZhiYu-2E67D3.svg</span></span><br><span class="line">      <span class="attr">message:</span> <span class="string">本站使用AnZhiYu主题</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">link:</span> <span class="string">https://www.dogecloud.com/</span></span><br><span class="line">      <span class="attr">shields:</span> <span class="string">https://npm.elemecdn.com/anzhiyu-blog@2.2.0/img/badge/CDN-多吉云-3693F3.svg</span></span><br><span class="line">      <span class="attr">message:</span> <span class="string">本站使用多吉云为静态资源提供CDN加速</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">link:</span> <span class="string">https://github.com/</span></span><br><span class="line">      <span class="attr">shields:</span> <span class="string">https://npm.elemecdn.com/anzhiyu-blog@2.1.5/img/badge/Source-Github.svg</span></span><br><span class="line">      <span class="attr">message:</span> <span class="string">本站项目由Github托管</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">link:</span> <span class="string">http://creativecommons.org/licenses/by-nc-sa/4.0/</span></span><br><span class="line">      <span class="attr">shields:</span> <span class="string">https://npm.elemecdn.com/anzhiyu-blog@2.2.0/img/badge/Copyright-BY-NC-SA.svg</span></span><br><span class="line">      <span class="attr">message:</span> <span class="string">本站采用知识共享署名-非商业性使用-相同方式共享4.0国际许可协议进行许可</span></span><br></pre></td></tr></table></figure><table><thead><tr><th align="left">参数</th><th align="left">解释</th></tr></thead><tbody><tr><td align="left">owner</td><td align="left">页脚网站所有者@2020-当前年份</td></tr><tr><td align="left">owner.enable</td><td align="left">页脚网站所有者是否启用</td></tr><tr><td align="left">owner.since</td><td align="left">页脚年份，控制台中打印的运行时间也来自这里</td></tr><tr><td align="left">runtime</td><td align="left">运行时间</td></tr><tr><td align="left">runtime.enable</td><td align="left">运行时间是否启用</td></tr><tr><td align="left">runtime.launch_time</td><td align="left">网站上线时间</td></tr><tr><td align="left">runtime.work_img</td><td align="left">页脚上班时间的徽标</td></tr><tr><td align="left">runtime.work_description</td><td align="left">页脚上班时间的 title 描述</td></tr><tr><td align="left">runtime.offduty_img</td><td align="left">页脚下班时间的徽标</td></tr><tr><td align="left">runtime.offduty_description</td><td align="left">页脚下班时间的 title 描述</td></tr><tr><td align="left">bdageitem</td><td align="left">徽标配置项</td></tr><tr><td align="left">bdageitem.link</td><td align="left">徽标配置链接</td></tr><tr><td align="left">bdageitem.shields</td><td align="left">徽标配置徽标</td></tr><tr><td align="left">bdageitem.message</td><td align="left">徽标配置徽标 title</td></tr></tbody></table><h2 id="侧边栏设置"><a href="#侧边栏设置" class="headerlink" title="侧边栏设置"></a>侧边栏设置</h2><p>可自行决定哪个项目需要显示，可决定位置，也可以设置不显示侧边栏。</p><p>修改 <code>主题配置文件</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"># aside (侧边栏)</span><br><span class="line"># --------------------------------------</span><br><span class="line"></span><br><span class="line">aside:</span><br><span class="line">  enable: true</span><br><span class="line">  hide: false</span><br><span class="line">  button: true</span><br><span class="line">  mobile: true # display on mobile</span><br><span class="line">  position: right # left or right</span><br><span class="line">  display: # 控制对应详情页面是否显示侧边栏</span><br><span class="line">    archive: true</span><br><span class="line">    tag: true</span><br><span class="line">    category: true</span><br><span class="line">  card_author:</span><br><span class="line">    enable: true</span><br><span class="line">    description: &lt;div style=&quot;line-height:1.38;margin:0.6rem 0;text-align:justify;color:rgba(255, 255, 255, 0.8);&quot;&gt;这有关于&lt;b style=&quot;color:#fff&quot;&gt;产品、设计、开发&lt;/b&gt;相关的问题和看法，还有&lt;b style=&quot;color:#fff&quot;&gt;文章翻译&lt;/b&gt;和&lt;b style=&quot;color:#fff&quot;&gt;分享&lt;/b&gt;。&lt;/div&gt;&lt;div style=&quot;line-height:1.38;margin:0.6rem 0;text-align:justify;color:rgba(255, 255, 255, 0.8);&quot;&gt;相信你可以在这里找到对你有用的&lt;b style=&quot;color:#fff&quot;&gt;知识&lt;/b&gt;和&lt;b style=&quot;color:#fff&quot;&gt;教程&lt;/b&gt;。&lt;/div&gt;</span><br><span class="line">    name_link: /about</span><br><span class="line">  card_announcement:</span><br><span class="line">    enable: false</span><br><span class="line">    content: 欢迎来看我的博客鸭~</span><br><span class="line">  card_weixin:</span><br><span class="line">    enable: true</span><br><span class="line">    face: https://img02.anheyu.com/adminuploads/1/2022/09/11/631ddb7c9b250.png</span><br><span class="line">    backFace: https://img02.anheyu.com/adminuploads/1/2022/09/11/631ddeb0900b7.png</span><br><span class="line">  card_recent_post:</span><br><span class="line">    enable: true</span><br><span class="line">    limit: 5 # if set 0 will show all</span><br><span class="line">    sort: date # date or updated</span><br><span class="line">    sort_order: # Don&#x27;t modify the setting unless you know how it works</span><br><span class="line">  card_categories:</span><br><span class="line">    enable: false</span><br><span class="line">    limit: 8 # if set 0 will show all</span><br><span class="line">    expand: none # none/true/false</span><br><span class="line">    sort_order: # Don&#x27;t modify the setting unless you know how it works</span><br><span class="line">  card_tags:</span><br><span class="line">    enable: true</span><br><span class="line">    limit: 40 # if set 0 will show all</span><br><span class="line">    color: false</span><br><span class="line">    sort_order: # Don&#x27;t modify the setting unless you know how it works</span><br><span class="line">    highlightTags:</span><br><span class="line">      - Hexo</span><br><span class="line">      - 前端</span><br><span class="line">  card_archives:</span><br><span class="line">    enable: true</span><br><span class="line">    type: monthly # yearly or monthly</span><br><span class="line">    format: MMMM YYYY # eg: YYYY年MM月</span><br><span class="line">    order: -1 # Sort of order. 1, asc for ascending; -1, desc for descending</span><br><span class="line">    limit: 8 # if set 0 will show all</span><br><span class="line">    sort_order: # Don&#x27;t modify the setting unless you know how it works</span><br><span class="line">  card_webinfo:</span><br><span class="line">    enable: true</span><br><span class="line">    post_count: true</span><br><span class="line">    last_push_date: false</span><br><span class="line">    sort_order: # Don&#x27;t modify the setting unless you know how it works</span><br></pre></td></tr></table></figure><h2 id="访问人数-busuanzi"><a href="#访问人数-busuanzi" class="headerlink" title="访问人数 busuanzi"></a>访问人数 busuanzi</h2><p>访问 busuanzi 的<a href="http://busuanzi.ibruce.info/">官方网站</a>查看更多的介绍。</p><p>修改 <code>主题配置文件</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">busuanzi:</span></span><br><span class="line">  <span class="attr">site_uv:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">site_pv:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">page_pv:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><h2 id="运行时间"><a href="#运行时间" class="headerlink" title="运行时间"></a>运行时间</h2><p>现实网站运行时间，预览图<img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/04/08/73c36b.png" alt="建站天数"></p><h2 id="评论"><a href="#评论" class="headerlink" title="评论"></a>评论</h2><p>推荐：</p><ul><li><p>Twikoo</p></li><li><p>Valine</p></li><li><p>Waline</p></li></ul><p>配置方法请自行进入其官方文档进行配置，这里不在过多赘述。</p><h2 id="标签卖萌"><a href="#标签卖萌" class="headerlink" title="标签卖萌"></a>标签卖萌</h2><p>主题配置文件中</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 标签卖萌</span></span><br><span class="line">diytitle:</span><br><span class="line">  <span class="built_in">enable</span>: <span class="literal">true</span></span><br><span class="line">  leaveTitle: w(ﾟДﾟ)w 不要走！再看看嘛！</span><br><span class="line">  backTitle: ♪(^∇^*)欢迎肥来！</span><br></pre></td></tr></table></figure><h2 id="友情链接配置"><a href="#友情链接配置" class="headerlink" title="友情链接配置"></a>友情链接配置</h2><p>新建 link 文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo new page <span class="built_in">link</span></span><br></pre></td></tr></table></figure><p>打开<code>source/link/index.md</code> 这个文件</p><p>修改为：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">title:</span> <span class="string">link</span></span><br><span class="line"><span class="attr">date:</span> <span class="number">2024-04-08 22:19:45</span></span><br><span class="line"><span class="attr">type:</span> <span class="string">&quot;link&quot;</span></span><br><span class="line"><span class="meta">---</span></span><br></pre></td></tr></table></figure><p>新建文件<code>source\_data\link.yml</code>,没有<code>_data</code>文件夹的话也请自己新建。</p><p>打开，新增：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">class_name:</span> <span class="string">推荐博客</span></span><br><span class="line">  <span class="attr">class_desc:</span> <span class="string">优质内容，独家推荐</span></span><br><span class="line">  <span class="attr">flink_style:</span> <span class="string">telescopic</span></span><br><span class="line">  <span class="attr">hundredSuffix:</span> <span class="string">&quot;&quot;</span></span><br><span class="line">  <span class="attr">link_list:</span></span><br><span class="line">    <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">浅草物语</span></span><br><span class="line">      <span class="attr">link:</span> <span class="string">https://chillg.top/</span></span><br><span class="line">      <span class="attr">avatar:</span> <span class="string">https://pic.imgdb.cn/item/658d4715c458853aeff01cad.png</span></span><br><span class="line">      <span class="attr">descr:</span> <span class="string">清净的一亩三分地</span></span><br><span class="line">      <span class="attr">siteshot:</span> <span class="string">https://pic.imgdb.cn/item/658d62d1c458853aef4ebecd.png</span></span><br><span class="line">      <span class="attr">color:</span> <span class="string">vip</span></span><br><span class="line">      <span class="attr">tag:</span> <span class="string">推荐</span></span><br></pre></td></tr></table></figure><h1 id="PWA-配置"><a href="#PWA-配置" class="headerlink" title="PWA 配置"></a>PWA 配置</h1><p>首先极其不推荐配置 pwa，配置的繁琐和 bug 与其带来的收益完全不成正比，若要配置，请三思后做好备份后再安装。</p><p>PWA 是 web 优化的一种手段，安知鱼主题做了一定的适配，但是依然需要进行配置。要为 AnZhiYu 配上 PWA 特性, 你可以进行选择以下两种方式来进行适配，<code>hexo-offline</code>适合初学者，<code>hexo-swpp</code>适合已经对<code>service worker</code>有一定解决问题能力的进阶使用。</p><p>本文直接介绍<code>hexo-swpp</code></p><p>主题版本大于 1.5.2 支持，这种加载办法为极其迅速，由 sw 控制其缓存，实现原理以及配置请查看以下三篇文章</p><p><a href="https://github.com/EmptyDreams/hexo-swpp#readme">hexo-swpp</a></p><p><a href="https://github.com/EmptyDreams/swpp-backends">swpp-backends</a></p><p><a href="https://kmar.top/posts/b70ec88f/">Swpp Backends 官方文档</a></p><p>配置方法：</p><ol><li><p>安装 hexo-swpp 插件和 swpp-backends，在博客根目录执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-swpp --save</span><br><span class="line">npm install swpp-backends --save</span><br></pre></td></tr></table></figure></li><li><p>在<code>主题配置文件</code>中开启 pwa 选项。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># PWA</span></span><br><span class="line"><span class="comment"># See https://github.com/JLHwung/hexo-offline</span></span><br><span class="line"><span class="comment"># ---------------</span></span><br><span class="line"><span class="attr">pwa:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">startup_image_enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">manifest:</span> <span class="string">/manifest.json</span></span><br><span class="line">  <span class="attr">theme_color:</span> <span class="string">var(--anzhiyu-main)</span></span><br><span class="line">  <span class="attr">mask_icon:</span> <span class="string">/img/siteicon/apple-icon-180.png</span></span><br><span class="line">  <span class="attr">apple_touch_icon:</span> <span class="string">/img/siteicon/apple-icon-180.png</span></span><br><span class="line">  <span class="attr">bookmark_icon:</span> <span class="string">/img/siteicon/apple-icon-180.png</span></span><br><span class="line">  <span class="attr">favicon_32_32:</span> <span class="string">/img/siteicon/32.png</span></span><br><span class="line">  <span class="attr">favicon_16_16:</span> <span class="string">/img/siteicon/16.png</span></span><br></pre></td></tr></table></figure></li><li><p>在 hexo 的配置文件中添加如下内容即可启用插件：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">swpp:</span></span><br><span class="line">  <span class="comment"># 是否启用插件</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="comment"># 是否在发布前自动执行脚本</span></span><br><span class="line">  <span class="comment"># auto_exec: true</span></span><br></pre></td></tr></table></figure></li><li><p>在创建<code>source/</code>目录中创建<code>manifest.json</code>文件。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">&quot;name&quot;:</span> <span class="string">&quot;浅草物语&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;short_name&quot;:</span> <span class="string">&quot;浅草&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;theme_color&quot;:</span> <span class="string">&quot;#3b70fc&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;background_color&quot;:</span> <span class="string">&quot;#3b70fc&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;display&quot;:</span> <span class="string">&quot;fullscreen&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;scope&quot;:</span> <span class="string">&quot;/&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;start_url&quot;:</span> <span class="string">&quot;/&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;id&quot;:</span> <span class="string">&quot;/&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;icons&quot;:</span> [</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">&quot;src&quot;:</span> <span class="string">&quot;img/siteicon/manifest-icon-192.maskable.png&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;sizes&quot;:</span> <span class="string">&quot;192x192&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;type&quot;:</span> <span class="string">&quot;image/png&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;purpose&quot;:</span> <span class="string">&quot;any&quot;</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">&quot;src&quot;:</span> <span class="string">&quot;img/siteicon/manifest-icon-192.maskable.png&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;sizes&quot;:</span> <span class="string">&quot;192x192&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;type&quot;:</span> <span class="string">&quot;image/png&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;purpose&quot;:</span> <span class="string">&quot;maskable&quot;</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">&quot;src&quot;:</span> <span class="string">&quot;img/siteicon/manifest-icon-512.maskable.png&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;sizes&quot;:</span> <span class="string">&quot;512x512&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;type&quot;:</span> <span class="string">&quot;image/png&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;purpose&quot;:</span> <span class="string">&quot;any&quot;</span></span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="attr">&quot;src&quot;:</span> <span class="string">&quot;img/siteicon/manifest-icon-512.maskable.png&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;sizes&quot;:</span> <span class="string">&quot;512x512&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;type&quot;:</span> <span class="string">&quot;image/png&quot;</span>,</span><br><span class="line">      <span class="attr">&quot;purpose&quot;:</span> <span class="string">&quot;maskable&quot;</span></span><br><span class="line">    &#125;</span><br><span class="line">  ],</span><br><span class="line">  <span class="attr">&quot;splash_pages&quot;:</span> <span class="literal">null</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>你也可以通过 <a href="https://app-manifest.firebaseapp.com/">Web App Manifestopen</a> 快速创建<code>manifest.json</code>。（Web App Manifest 要求至少包含一个 512*512 像素的图标）</p></li><li><p>可以通过<code>Chrome</code>插件<code>Lighthouse</code>检查 PWA 配置是否生效以及配置是否正确。 打开博客页面启动<code>Lighthouse</code>插件 (Lighthouse 插件要求至少包含一个 512*512 像素的图标) 关于 PWA（渐进式增强 Web 应用）的更多内容请参考 <a href="https://developers.google.com/web/tools/lighthouse/audits/address-bar">Google Tools for Web Developersopen</a></p></li><li><p>生成 pwa 启动图 安装<code>pwa-asset-generator</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install pwa-asset-generator</span><br></pre></td></tr></table></figure><p>hexo 根目录执行<code>hexo g</code>然后执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npx pwa-asset-generator ./public/img/512.png ./public/img/siteicon --padding <span class="string">&quot;calc(50vh - 20%) calc(50vw - 40%)&quot;</span> -s <span class="literal">false</span> -h <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>这条命令会使用<code>themes/anzhiyu/source/img/512.png</code>这张图片来生成 siteicon 到目录<code>/public/img/siteicon</code>中，由于<code>hexo cl</code>会清除<code>/public</code>目录中的文件，所以每次<code>hexo d</code>之前都需要执行，如果不想每次<code>hexo d</code>之前都执行的话，可以将主题中的<code>themes/anzhiyu/source/img/512.png</code>图片复制移动到<code>根目录``/source/img</code>中，然后将生成后的<code>/public/img/siteicon</code>文件夹复制到<code>根目录``/source/img</code>中，这样<code>根目录``/source/img</code>中就会一直有<code>siteicon</code>，以后执行<code>hexo g</code>时，也会将<code>siteicon</code>生成到<code>public</code>目录中。</p></li><li><p>在 hexo g 以后执行一次<code>hexo  </code>命令 如果你的网站使用了 CDN 且启用了 CDN 端缓存，请务必将 CDN 缓存时间调整至最大值，然后每次更新网页内容后手动刷新 CDN 缓存。 因为本插件的更新方案要求<code>update.json</code>更新时，其它所有需要更新的资源均已更新，否则客户端拉取时会误以为拉取到了最新的内容，从而导致部分资源“错过”更新。 简而言之，就是<code>update.json</code>必须与需要缓存的资源共享同样的 CDN 缓存周期，但是目前市面上我知道的 CDN 无法做到这一点，所以只能从下列选项中二选一</p><ul><li>把所有资源的 CDN 缓存时间拉满，每次更新网站时刷新 CDN 缓存</li><li>CDN 不缓存所有需要在客户端缓存的资源</li></ul><p>安知鱼主题适配 hexo-swpp3.2+，swpp-backends2.0+更多内容请参考 <a href="https://kmar.top/posts/b70ec88f/">Swpp Backends 官方文档</a><a href="https://github.com/EmptyDreams/hexo-swpp#readme">hexo-swpp</a><a href="https://github.com/EmptyDreams/swpp-backends">swpp-backends</a><a href="https://kmar.top/posts/bcfe8408/">解剖 SW 原理暨博主 SW 实现</a><a href="https://kmar.top/posts/73014407/">小白也能用的 SW 构建插件</a></p><p>主题默认内置了一份 sw-rules.js 规则，位于<code>themes/anzhiyu/sw-rules.js</code>可以开箱即用，如需自定义缓存规则可以复制该文件至 hexo 根目录然后修改根目录的 sw-rules.js。</p></li></ol><p>(感谢安知鱼为 pwa 安装提供便利)</p><h1 id="导入文章-远程部署"><a href="#导入文章-远程部署" class="headerlink" title="导入文章 远程部署"></a>导入文章 远程部署</h1><p>导入之前的文章至<code>\source\_posts</code>中</p><p>执行三件套(外加 swpp)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">hexo cl</span><br><span class="line">hexo g</span><br><span class="line">hexo sw</span><br><span class="line">hexo se</span><br></pre></td></tr></table></figure><p>没问题后推送至仓库，等待部署生效</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo d</span><br></pre></td></tr></table></figure><h1 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h1><p>至此完成了整个博客的迁移，本文仅供参考，诸如仓库密钥私钥等配置本文并未提及，请读者自行配置。</p><p>本文基于重装博客回忆版，只能说能用就别折腾，本文同样适用于博客迁移，再次感谢安知鱼提供技术支持。</p>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E6%95%99%E7%A8%8B/">教程</category>
      
      
      <category domain="https://www.chillg.de/tags/HEXO/">HEXO</category>
      
      <category domain="https://www.chillg.de/tags/%E6%95%99%E7%A8%8B/">教程</category>
      
      <category domain="https://www.chillg.de/tags/%E5%89%8D%E7%AB%AF/">前端</category>
      
      <category domain="https://www.chillg.de/tags/%E7%BE%8E%E5%8C%96/">美化</category>
      
      
      <comments>https://www.chillg.de/posts/a480a265.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>感冒自救指南</title>
      <link>https://www.chillg.de/posts/afedb525.html</link>
      <guid>https://www.chillg.de/posts/afedb525.html</guid>
      <pubDate>Sun, 10 Mar 2024 08:17:56 GMT</pubDate>
      
      <description>感冒快速用药说明，感冒自救指南，感冒常见知识科普</description>
      
      
      
      <content:encoded><![CDATA[<h1 id="引言"><a href="#引言" class="headerlink" title="引言"></a>引言</h1><p>感冒，作为常见的呼吸道传染病之一，是我们在生活中难以避免的小烦恼。无论是在寒冷的冬日还是变幻莫测的春秋季节，感冒都可能悄然袭来，给我们的生活带来不便与困扰。因此，了解如何有效地自救是非常重要的。</p><p>本指南旨在为大家提供一份简单易懂的感冒自救指南，介绍常见的感冒症状及相应的用药知识，帮助大家更好地应对感冒。首先，我们将对感冒进行简要的科普，包括感冒的定义、传播途径以及预防措施，让大家对这一常见疾病有更全面的了解。接下来，我们将重点介绍感冒常用的药物，包括退烧药、咳嗽药、流鼻涕药等，帮助大家在感冒时选择适合的药物进行自我治疗。</p><p>让我们一起来了解如何应对感冒，让生活变得更加舒适与轻松。</p><p>（注：<strong>免责声明</strong>：本文内容仅供科普参考，不构成医疗建议或诊疗方案。任何健康问题请务必咨询专业医师，并遵医嘱进行治疗。）</p><h2 id="什么是感冒"><a href="#什么是感冒" class="headerlink" title="什么是感冒"></a>什么是感冒</h2><p>普通感冒（英语：common cold），俗称伤风，医学上还称为急性上呼吸道感染或急性鼻咽炎，是一种上呼吸道的病毒性感染，主要原发于鼻腔，但也可能进犯喉咙以及鼻窦。症状一般于暴露病原后两天内开始出现，包含咳嗽、喉咙痛、流鼻水、打喷嚏、头痛、发热等。大部分症状通常在七到十天内会缓解，但某些症状可能会持续三个星期以上。有其他健康问题者患感冒时可能会并发肺炎。</p><h2 id="病征与症状"><a href="#病征与症状" class="headerlink" title="病征与症状"></a>病征与症状</h2><p>普通感冒的典型症状，包括咳嗽、流鼻涕、鼻塞和喉咙痛，有时还伴有肌肉酸痛、疲劳、头痛以及食欲不振。喉咙痛大约 40％的普通感冒患者会出现，咳嗽则占病患的 50％左右，肌肉酸痛也有半数的人会感受到。大多数成人感染普通感冒后不会有发热的症状，但在婴幼儿身上经常发生。普通感冒所造成咳嗽的症状比流行性感冒缓和许多。意味着成人如果同时有发热与咳嗽的症状感染流行性感冒的可能性大增，而发热与严重咳嗽是流行性感冒的典型症状。某些造成普通感冒的病毒也可能引起无症状的感染。痰或鼻腔分泌物的颜色可能有透明、黄色或接近绿色，但并不能预知是哪种病毒所造成的感染或感染的严重程度。除此之外，普通感冒感染消化系统称做胃肠型普通感冒，可能产生恶心、呕吐、腹痛、腹泻等症状。</p><h1 id="感冒自救用药指南"><a href="#感冒自救用药指南" class="headerlink" title="感冒自救用药指南"></a>感冒自救用药指南</h1><h2 id="发烧"><a href="#发烧" class="headerlink" title="发烧"></a><strong>发烧</strong></h2><h3 id="发烧的判断和处理"><a href="#发烧的判断和处理" class="headerlink" title="发烧的判断和处理"></a><strong>发烧的判断和处理</strong></h3><p><strong>不建议</strong>根据网传的“38.5℃ 以下不吃药，38.5℃ 以上才吃药”这种机械方式判断是否需要退烧。因为不同人的免疫性（敏感程度）和耐受性不同，每个人对发烧的感受也不一样。</p><p><strong>正确的做法是：</strong></p><ul><li>当您开始感到身体不适，例如发烧、头痛、肌肉酸痛等，<strong>立即休息</strong>。</li><li>首先尝试<strong>物理降温</strong>，如果体温没有下降，再考虑服用退烧药。</li></ul><p><strong>物理降温方法</strong></p><ul><li><strong>传导散热</strong>：将冰袋敷在额头、大腿根部、人鱼线等血管丰富的地方，帮助散热。注意垫毛巾等物品避免冻伤皮肤。</li><li><strong>蒸发散热</strong>：当您感到身体发冷时，盖上厚被子睡一觉，待出汗后擦干汗液，即可帮助降温。注意出汗后要保暖，并补充水分和电解质。</li></ul><p><strong>注意事项</strong></p><ul><li><strong>避免</strong>在已经出汗的情况下继续捂汗，以免体温再次升高。</li><li><strong>不要</strong>通过跑步、蒸桑拿等方式发汗，以免消耗体力，加重不适。</li></ul><h3 id="退烧药的选择和使用"><a href="#退烧药的选择和使用" class="headerlink" title="退烧药的选择和使用"></a><strong>退烧药的选择和使用</strong></h3><p><strong>常用退烧药</strong></p><ul><li>布洛芬：适用于 6 个月以上儿童和成人，退烧效果好，副作用相对较少。</li><li>对乙酰氨基酚：适用于 3 个月以上儿童和成人，退烧效果好，副作用相对较少。</li></ul><p><strong>不同退烧药的区别</strong></p><ul><li>布洛芬和对乙酰氨基酚都有退烧和止痛的作用，但布洛芬还具有抗炎作用。</li><li>布洛芬的起效时间约为 1 小时，持续时间约为 6-8 小时；对乙酰氨基酚的起效时间约为 30 分钟，持续时间约为 4-6 小时。</li></ul><p><strong>退烧药的使用方法</strong></p><ul><li>严格按照说明书服用，不要超过推荐剂量。</li><li>两种退烧药不要交替使用，以免增加药物过量的风险。</li><li>如果服用退烧药后 2 小时体温仍未下降，或出现其他严重症状，请及时就医。</li></ul><p><strong>温馨提示</strong></p><ul><li>发烧是人体的一种防御机制，可以帮助抵抗病毒和细菌的侵袭。</li><li>一般来说，体温超过 38.5℃ 才建议服用退烧药。</li><li>儿童、孕妇、老年人和有基础疾病的人群，应在医生或药师的指导下使用退烧药。</li></ul><h3 id="常用退烧药"><a href="#常用退烧药" class="headerlink" title="常用退烧药"></a><strong>常用退烧药</strong></h3><p><strong>常用退烧药</strong></p><ul><li><strong>布洛芬</strong>：适用于 6 个月以上儿童和成人，退烧效果好，副作用相对较少。</li><li><strong>对乙酰氨基酚</strong>：适用于 3 个月以上儿童和成人，退烧效果好，副作用相对较少。</li></ul><p><strong>其他解热镇痛药</strong></p><ul><li>阿司匹林（处方药）</li><li>双氯芬酸（处方药）</li><li>吡罗昔康（处方药）</li><li>美洛昔康（处方药）</li><li>萘丁美酮（处方药）</li><li>舒林酸（处方药）</li></ul><p><strong>推荐布洛芬和对乙酰氨基酚的原因</strong></p><ul><li>相对安全，副作用较少</li><li>适合儿童和成人</li><li>容易买到</li></ul><p>常见药物特点以及副作用见如下表格。<strong>请按药品说明书或者在医生&#x2F;药师指导下购买和使用</strong></p><table><thead><tr><th align="left"><strong>药物名称</strong></th><th><strong>适用人群</strong></th><th><strong>特点</strong></th><th><strong>副作用</strong></th></tr></thead><tbody><tr><td align="left">布洛芬</td><td>6 个月以上儿童和成人</td><td>解热镇痛抗炎一线药</td><td>常见恶心等胃肠反应；长期致胃出血；偶见头痛、眩晕</td></tr><tr><td align="left">对乙酰氨基酚</td><td>3 个月以上儿童和成人</td><td>主要退热镇痛；抗炎极弱</td><td>常见恶心、呕吐；偶见过敏；过量则肝损伤</td></tr><tr><td align="left">阿司匹林</td><td>成人</td><td>解热镇痛抗风湿；影响血小板</td><td>胃肠：刺激胃黏膜，恶心呕吐；水杨酸反应：头痛、眩晕等；<br />出血：凝血障碍，严重肝&amp;出血倾向病、孕产妇禁用，术前 1 周停；<br />过敏：荨麻疹、血管神经性水肿等</td></tr><tr><td align="left">双氯芬酸</td><td>成人</td><td>中强效抗炎镇痛</td><td>不良反应轻，同阿司匹林；偶见肝功异常</td></tr><tr><td align="left">呲罗昔康</td><td>成人</td><td>风湿及类风湿关节炎；缓解疼痛炎症</td><td>偶见头晕、水肿、胃部不适、腹泻或便秘等；长期致胃溃疡</td></tr><tr><td align="left">美洛昔康</td><td>成人</td><td>风湿及类风湿关节炎；缓解疼痛炎症</td><td>过量或长期致消化道出血；溃疡</td></tr><tr><td align="left">萘丁美酮</td><td>成人</td><td>解热作用显著；类风湿关节炎；肝脏激活</td><td>不良反应较轻；常见恶心、呕吐等；偶见头痛、眩晕；过敏</td></tr><tr><td align="left">舒林酸</td><td>成人</td><td>体内转磺基代谢物发挥解热镇痛抗炎作用</td><td>不良反应中等；常见恶心、呕吐等；偶见头痛、眩晕；过敏</td></tr></tbody></table><p><strong>请按药品说明书或者在医生&#x2F;药师指导下购买和使用</strong></p><p><strong>注意事项</strong></p><ul><li>一定要按照说明书或在医师指导下用药。</li><li>不要超过推荐剂量。</li><li>两种退烧药不要交替使用，以免增加药物过量的风险。</li><li>儿童、孕妇、老年人和有基础疾病的人群，应慎用退烧药。</li></ul><p><strong>温馨提示</strong></p><ul><li>退烧药只是帮助缓解发烧症状，不能根治疾病。</li><li>如果发烧超过 38.5℃，或出现其他严重症状，请及时就医。</li></ul><h3 id="各种布洛芬的区别是什么？"><a href="#各种布洛芬的区别是什么？" class="headerlink" title="各种布洛芬的区别是什么？"></a>各种布洛芬的区别是什么？</h3><p>关于布洛芬片、布洛芬缓释胶囊、布洛芬混悬液、布洛芬颗粒的区别网传的“姿势不同代表治疗不同部位”和“缓释胶囊针对止痛，普通片才是退热”的说法都是不准确的。<img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/03/10/24e9c2.png" alt="图片"></p><p>不同布洛芬剂型的主要区别在于：</p><ul><li><strong>起效时间:</strong><ul><li>普通片：起效最快，约 1 小时</li><li>缓释胶囊：起效较慢，约 2-3 小时</li><li>混悬液：起效快，约 15-30 分钟</li><li>颗粒：起效快，约 15-30 分钟</li></ul></li><li><strong>持续时间:</strong><ul><li>普通片：持续时间约 6-8 小时</li><li>缓释胶囊：持续时间长，约 8-12 小时</li><li>混悬液：持续时间短，约 4-6 小时</li><li>颗粒：持续时间短，约 4-6 小时</li></ul></li><li><strong>成分含量:</strong><ul><li>普通片：成分含量较高</li><li>缓释胶囊：成分含量较高</li><li>混悬液：成分含量较低</li><li>颗粒：成分含量较高</li></ul></li></ul><p><strong>适用人群:</strong></p><ul><li><strong>普通片:</strong> 适合需要快速退烧的成人和儿童</li><li><strong>缓释胶囊:</strong> 适合需要持续止痛的成人和儿童</li><li><strong>混悬液:</strong> 适合 6 个月以上儿童</li><li><strong>颗粒:</strong> 适合需要快速退烧的儿童</li></ul><p><strong>注意事项:</strong></p><ul><li>不同布洛芬剂型的具体用法用量请参考说明书或咨询医生或药师。</li><li>不要超过推荐剂量。</li><li>儿童、孕妇、老年人和有基础疾病的人群，应慎用布洛芬。</li></ul><p><strong>以下是一些补充说明:</strong></p><ul><li>布洛芬缓释胶囊虽然起效较慢，但退烧效果也很好，且持续时间长，因此也可以用于退烧。</li><li>布洛芬混悬液和颗粒剂型由于成分含量较低，因此不适合用于重度疼痛或高烧。</li><li>不同品牌的布洛芬剂型可能存在细微差异，具体用药信息请参考说明书。</li></ul><p>希望以上信息能够帮助您更好地了解不同布洛芬剂型的区别。如果您还有其他问题，欢迎在评论区进行交流。</p><h2 id="嗓子疼"><a href="#嗓子疼" class="headerlink" title="嗓子疼"></a><strong>嗓子疼</strong></h2><p>嗓子疼的缓解方法</p><p><strong>1. 喝水</strong></p><ul><li>前两天：喝常温或微凉的水，避免刺激咽喉，加重肿痛。</li><li>第三天起：喝温水，加速血液循环，帮助消炎。</li></ul><p><strong>2. 蒸汽熏喉</strong></p><ul><li>使用刚烧开的水蒸气熏喉，可以缓解咽喉肿痛。</li></ul><p><strong>3. 含片</strong></p><ul><li>使用各类喉宝、含片，但要注意含糖量不要太高，以免加重咽喉不适。</li></ul><p><strong>4. 服药</strong></p><ul><li>如果症状严重，可以服用对乙酰氨基酚等非甾体抗炎药，帮助消炎。</li></ul><p><strong>注意事项</strong></p><ul><li>避免辛辣、油炸、刺激性食物，以免加重咽喉刺激。</li><li>多休息，保证充足的睡眠，增强免疫力。</li><li>如果症状持续或加重，请及时就医。</li></ul><p><strong>以下是一些补充说明:</strong></p><ul><li>嗓子疼的原因有很多，包括病毒感染、细菌感染、过敏等。</li><li>针对不同的原因，可以采取不同的治疗措施。</li><li>如果您不确定嗓子疼的原因，建议咨询医生或药师。</li></ul><h2 id="浑身疼"><a href="#浑身疼" class="headerlink" title="浑身疼"></a>浑身疼</h2><p><strong>浑身疼的原因</strong></p><ul><li>发烧引起的炎症</li><li>高热引起的乳酸堆积</li></ul><p><strong>缓解浑身疼的方法</strong></p><ul><li><strong>多喝水</strong>：促进新陈代谢，帮助排出体内代谢废物。</li><li><strong>服用非甾体抗炎药</strong>：如对乙酰氨基酚，可以帮助消炎，缓解疼痛。</li><li><strong>拉伸肌肉</strong>：如果还能活动，可以对疼痛的肌肉群进行简单的拉伸，帮助缓解疼痛。</li></ul><p><strong>注意事项</strong></p><ul><li>服药时注意药物的副作用。</li><li>如果疼痛严重或持续时间长，请及时就医。</li></ul><p><strong>以下是一些补充说明:</strong></p><ul><li>浑身疼是一种常见的症状，可能由多种原因引起。</li><li>除了上述方法外，还有一些其他方法可以缓解浑身疼，例如：<ul><li>按摩：按摩可以促进血液循环，缓解肌肉酸痛。</li><li>热敷或冷敷：热敷可以促进血液循环，缓解肌肉酸痛；冷敷可以减轻炎症，缓解疼痛。</li><li>充足的休息：充足的休息可以帮助身体恢复，缓解疼痛。</li></ul></li></ul><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/03/10/47dc28.png" alt="图片"></p><h2 id="咳嗽"><a href="#咳嗽" class="headerlink" title="咳嗽"></a>咳嗽</h2><p>首先，要判断是无痰咳嗽还是有痰咳嗽。</p><ul><li><strong>无痰咳嗽</strong>：表现为干咳，无痰或痰量很少，常伴有咽喉痒痛。</li><li><strong>有痰咳嗽</strong>：表现为咳痰，痰量多，可呈白色、黄色或绿色。</li></ul><p>针对不同类型咳嗽的治疗方法</p><ul><li><strong>无痰咳嗽</strong>：可使用镇咳药，如氢溴酸右美沙芬。</li><li>有痰咳嗽<ul><li>痰多咳不出：先使用祛痰药，如氨溴索、溴己新、乙酰半胱氨酸等，帮助稀释痰液，促进排痰。</li><li>痰少或无痰：再使用止咳药，如氢溴酸右美沙芬</li></ul></li></ul><p><strong>不同药物的特点及注意事项</strong></p><table><thead><tr><th>药物</th><th>适用症状</th><th>作用机制</th><th>起效时间</th><th>持续时间</th><th>副作用</th></tr></thead><tbody><tr><td>氨溴索</td><td>痰多粘稠，不易咳出</td><td>促进痰液分泌，降低粘稠度</td><td>30 分钟-1 小时</td><td>4-6 小时</td><td>恶心、呕吐、腹泻</td></tr><tr><td>溴己新</td><td>痰多粘稠，不易咳出</td><td>促进痰液分泌，降低粘稠度</td><td>30 分钟-1 小时</td><td>4-6 小时</td><td>恶心、呕吐、腹泻</td></tr><tr><td>乙酰半胱氨酸</td><td>痰多粘稠，不易咳出</td><td>裂解痰液中的二硫键，降低粘稠度</td><td>30 分钟-1 小时</td><td>4-6 小时</td><td>恶心、呕吐、腹泻</td></tr></tbody></table><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/03/10/6a04b8.png" alt="图片"></p><p><strong>注意事项</strong></p><ul><li>一定要根据说明书或在医师指导下用药。</li><li>不要超过推荐剂量。</li><li>两种类型的咳嗽药不要交替使用，以免增加药物过量的风险。</li><li>儿童、孕妇、老年人和有基础疾病的人群，应慎用咳嗽药。</li></ul><p>待卡痰问题解决后就可以使用止咳药了，出于安全性的考虑，只推荐<strong>氢溴酸右美沙芬</strong>这个成分，但<strong>痰还多的朋友慎用，妊娠三个月内的朋友禁用</strong>。其次，如果有躺下咳嗽难以入睡的朋友，可以尝试侧卧位，或者在上背部垫个垫子的半卧位，可能会起到一定的缓解作用。</p><p><strong>缓解咳嗽的小方法</strong></p><ul><li>适当增加室内湿度，可使用加湿器或在室内晾晒湿毛巾。</li><li>多喝温水，帮助稀释痰液，促进排痰。</li><li>避免吸烟和接触二手烟，以及其他刺激性气体。</li><li>充足的休息，保证睡眠质量。</li></ul><p><strong>咳嗽的误区</strong></p><ul><li>“咳嗽是证明要好了！是身体在往外排毒呢”：这种说法是错误的。咳嗽是一种防御机制，保护性反射。</li><li>“咳的时间越长越好，说明身体在排毒”：这种说法也是错误的。咳的时间越长，只能证明炎症越严重，且咳的越严重越有加重病情的可能。</li></ul><p><strong>温馨提示</strong></p><ul><li>咳嗽是一种常见的症状，可能是由多种原因引起的。</li><li>如果咳嗽症状持续或加重，请及时就医。</li></ul><p><strong>以下是一些补充说明:</strong></p><ul><li>咳嗽是呼吸道的一种防御机制，可以帮助排出呼吸道中的分泌物和异物。</li><li>咳嗽的原因有很多，包括病毒感染、细菌感染、过敏、慢性呼吸道疾病等。</li><li>针对不同的原因，可以采取不同的治疗措施。</li><li>如果您不确定咳嗽的原因，建议咨询医生或药师。</li></ul><h2 id="腹泻"><a href="#腹泻" class="headerlink" title="腹泻"></a>腹泻</h2><p>腹泻的治疗方法</p><p><strong>1. 补充水分和电解质</strong></p><ul><li>喝盐水、电解质水、运动饮料等。</li><li>对于儿童，可以使用口服补液盐（ORS）。</li></ul><p><strong>2. 饮食调整</strong></p><ul><li>少量多餐，避免暴饮暴食。</li><li>吃富含谷氨酰胺的食物，如鱼类、肉类、鸡蛋、白菜等。</li><li>避免食用辛辣、油腻、刺激性食物。</li></ul><p><strong>3. 药物治疗</strong></p><ul><li>腹泻严重时，可以考虑使用止泻药。</li><li>常用的止泻药包括：<ul><li>吸附剂：蒙脱石散、药用炭、硅炭银片等。</li><li>收敛剂：鞣酸蛋白等。</li></ul></li></ul><p><strong>不同止泻药的特点及禁忌</strong></p><table><thead><tr><th>药物</th><th>作用机制</th><th>适用人群</th><th>禁忌人群</th><th>副作用</th></tr></thead><tbody><tr><td>蒙脱石散</td><td>吸附肠道毒物和液体</td><td>急性、慢性腹泻</td><td>肠梗阻</td><td>便秘</td></tr><tr><td>药用炭</td><td>吸附肠道毒物和液体</td><td>腹泻、胃肠胀气</td><td>肠梗阻</td><td>便秘</td></tr><tr><td>硅炭银片</td><td>吸附肠道毒物和液体</td><td>腹泻、胃肠胀气</td><td>肠梗阻</td><td>便秘</td></tr><tr><td>鞣酸蛋白</td><td>收敛肠黏膜</td><td>急性肠炎及非细菌性腹泻</td><td>肠梗阻</td><td>便秘</td></tr></tbody></table><p><strong>注意事项</strong></p><ul><li>按照说明书用药，或在医师指导下使用止泻药。</li><li>儿童、孕妇、老年人和有基础疾病的人群，应慎用止泻药。</li><li>腹泻症状持续或加重，请及时就医。</li></ul><p><strong>温馨提示</strong></p><ul><li>腹泻是一种常见的症状，可能是由多种原因引起的。</li><li>针对不同的原因，可以采取不同的治疗措施。</li><li>如果您不确定腹泻的原因，建议咨询医生或药师。</li></ul><h2 id="其他常见问题总结"><a href="#其他常见问题总结" class="headerlink" title="其他常见问题总结"></a>其他常见问题总结</h2><p><strong>头疼怎么办？</strong></p><ul><li>根源还是炎症，如果实在头痛难忍，可以尝试吃对乙酰氨基酚。</li><li>要重视副作用，不能连续三天吃。</li></ul><p><strong>流鼻涕怎么办？</strong></p><ul><li>生理盐水+洗鼻器洗，鼻子可能会好受一些。</li></ul><p><strong>没有味觉怎么办？</strong></p><ul><li>平时味觉不灵敏的人要注意，更容易失去味觉。</li><li>味觉对于 20-30℃ 的食物比较敏感，尝试吃温乎的菜可以增强味觉的敏感性，增加味觉记忆。</li><li>味觉强度与唾液分泌有关，吃前漱漱口，把唾液咽干净，可增加味觉记忆。</li></ul><p><strong>没有胃口怎么办？</strong></p><ul><li>吃饺子、吃包子，都是又有碳水、又有蛋白质的食物。</li><li>不爱吃带馅的怎么办？喝点粥，粥里面放点菜、肉吧。</li></ul><p><strong>胃口大开怎么办？会干吃不胖吗？</strong></p><ul><li>干吃不胖倒是不可能，发烧太消耗体力和加速代谢了，热量会比之前消耗大一些。如果有胃口就多吃点吧，身体缺能量呢~</li></ul><p><strong>发烧可以洗澡吗？</strong></p><ul><li>千万别！</li><li>消耗体力、血管扩张，体内的热量都散出去了，特别容易着凉…刚退烧了又烧起来了…</li></ul><p><strong>发烧并发症都有什么？</strong></p><ul><li>轻症：胃肠道疾病、恶心呕吐、食欲不振。</li><li>重症：急性肝损伤、胆囊炎、胰腺炎、肠梗阻。</li></ul><p><strong>姨妈期发烧了会有什么影响？</strong></p><ul><li>可能存在经期紊乱和出血异常，并且疼痛加倍。</li><li>因为姨妈期本来就会刺激更多的前列腺素合成。</li></ul><p><strong>为什么晚上生病会更严重？</strong></p><ul><li>主要原因就是累一天了，免疫力下降了。</li><li>再加上劳累会使交感神经兴奋，身体更容易“敏感”导致。</li><li>如果你是黑白颠倒型这种，我相信这种影响对你会少一点，但也要考虑到夜晚温度、心情等因素。</li></ul><p><strong>为什么发烧之后会放屁？</strong></p><ul><li>放屁是因为肠道的菌群分解食物残渣而生成的。</li><li>新冠病毒是可以攻击全身各个地方的，也包括胃肠道。</li><li>炎症涉及肠道，肠道的菌群发生变化，分解食物残渣的能力就变了。有的人变强了，屁就多了…</li><li>另外，放出来的屁确实有一定概率可以传播病毒，但前提是得把“屁罩”脱了，所以在上公共厕所的时候，记得戴口罩。</li></ul><h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><p>以上就是针对感冒的一些常见症状的自我治疗方法。希望能够帮助大家在感冒时能够有效缓解症状，早日康复。</p><p><strong>注意事项</strong></p><ul><li>本文仅供参考，不构成医疗建议。</li><li>用药时请务必遵循说明书的指示，或在医师指导下使用。</li><li>如果症状严重或持续时间长，请及时就医。</li></ul><p><strong>免责声明</strong></p><p>本文内容仅供科普参考，不构成医疗建议或诊疗方案。任何健康问题请务必咨询专业医师，并遵医嘱进行治疗。</p><p><strong>其他</strong></p><ul><li>保持良好的生活习惯，如均衡饮食、充足睡眠、适度运动等，可以帮助增强抵抗力，预防感冒。</li><li>在流感季节，可以接种流感疫苗，降低感染流感的风险。</li></ul><p><strong>希望大家都能拥有一个健康的身体！</strong></p>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E7%A7%91%E6%99%AE/">科普</category>
      
      
      <category domain="https://www.chillg.de/tags/%E7%A7%91%E6%99%AE/">科普</category>
      
      <category domain="https://www.chillg.de/tags/%E5%8C%BB%E5%AD%A6/">医学</category>
      
      
      <comments>https://www.chillg.de/posts/afedb525.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>为你的博客添加看板娘（HEXO框架）</title>
      <link>https://www.chillg.de/posts/8d352e14.html</link>
      <guid>https://www.chillg.de/posts/8d352e14.html</guid>
      <pubDate>Mon, 08 Jan 2024 15:43:51 GMT</pubDate>
      
      <description>如何给你的博客加入看板娘，优化看板娘，自定义看板娘模型，自定义看板娘大小，位置等</description>
      
      
      
      <content:encoded><![CDATA[<h1 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h1><blockquote><p>看板娘一词源自日语“看板娘（かんばんむすめ）”。其中的“看板”指的是店面招牌，或者是为了宣传、打广告而制作的宣传牌。“看板娘”也就是店面的招牌姑娘，亦即能够提升店面人气和顾客流量的女服务生、女店员等。也就是说，看板娘本身就是一块“活看板”，其本身的魅力就能够起到宣传、拉人气的作用。英语又称之为“Yuru-chara”</p></blockquote><p>看板娘一词并不是正式的职业名称，而是一种习惯称呼，多用于饮食行业的餐馆、咖啡店等，有时也用于超市、小卖店等店面。该概念上的看板娘是狭义的看板娘，从职业上讲，属于女服务生、女店员等的范畴。</p><blockquote></blockquote><p>另外，有时也把店面外树立的等身大的人型牌子的角色称作看板娘。</p><p>本项目使用到GitHub开源项目<a href="https://github.com/stevenjoezhang/live2d-widget">live2d-widget|把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ</a>，我对原项目做出如下优化：</p><ul><li>添加更多模型，自定义模型大小，位置</li><li>将项目放入hexo主题文件内，不再使用远程调用的方式获取，提升模型加载速度（大概）</li></ul><h1 id="自定义看板娘教程"><a href="#自定义看板娘教程" class="headerlink" title="自定义看板娘教程"></a>自定义看板娘教程</h1><h2 id="1-下载live2d"><a href="#1-下载live2d" class="headerlink" title="1.下载live2d"></a>1.下载live2d</h2><p>首先进入原作者GitHub仓库，下载整个项目文件，放入主题文件夹下的\source\<strong>live2d-widget-master</strong> 内（新建文件夹）,如下图所示：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/01/09/9e4d9a.png" alt="依赖放入主题内"></p><p>然后将live2d-widget-master文件夹内的<strong>autoload.js</strong>代码替换为如下：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// live2d_path 参数建议使用绝对路径</span></span><br><span class="line"><span class="comment">//const live2d_path = &quot;https://fastly.jsdelivr.net/gh/stevenjoezhang/live2d-widget@latest/&quot;;</span></span><br><span class="line"><span class="keyword">const</span> live2d_path = <span class="string">&quot;/live2d-widget-master/&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 封装异步加载资源的方法</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">loadExternalResource</span>(<span class="params">url, type</span>) &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Promise</span>(<span class="function">(<span class="params">resolve, reject</span>) =&gt;</span> &#123;</span><br><span class="line"><span class="keyword">let</span> tag;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (type === <span class="string">&quot;css&quot;</span>) &#123;</span><br><span class="line">tag = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&quot;link&quot;</span>);</span><br><span class="line">tag.<span class="property">rel</span> = <span class="string">&quot;stylesheet&quot;</span>;</span><br><span class="line">tag.<span class="property">href</span> = url;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (type === <span class="string">&quot;js&quot;</span>) &#123;</span><br><span class="line">tag = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&quot;script&quot;</span>);</span><br><span class="line">tag.<span class="property">src</span> = url;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (tag) &#123;</span><br><span class="line">tag.<span class="property">onload</span> = <span class="function">() =&gt;</span> <span class="title function_">resolve</span>(url);</span><br><span class="line">tag.<span class="property">onerror</span> = <span class="function">() =&gt;</span> <span class="title function_">reject</span>(url);</span><br><span class="line"><span class="variable language_">document</span>.<span class="property">head</span>.<span class="title function_">appendChild</span>(tag);</span><br><span class="line">&#125;</span><br><span class="line">&#125;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 加载 waifu.css live2d.min.js waifu-tips.js</span></span><br><span class="line"><span class="keyword">if</span> (screen.<span class="property">width</span> &gt;= <span class="number">768</span>) &#123;</span><br><span class="line"><span class="title class_">Promise</span>.<span class="title function_">all</span>([</span><br><span class="line"><span class="title function_">loadExternalResource</span>(live2d_path + <span class="string">&quot;waifu.css&quot;</span>, <span class="string">&quot;css&quot;</span>),</span><br><span class="line"><span class="title function_">loadExternalResource</span>(live2d_path + <span class="string">&quot;live2d.min.js&quot;</span>, <span class="string">&quot;js&quot;</span>),</span><br><span class="line"><span class="title function_">loadExternalResource</span>(live2d_path + <span class="string">&quot;waifu-tips.js&quot;</span>, <span class="string">&quot;js&quot;</span>)</span><br><span class="line">]).<span class="title function_">then</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line"><span class="comment">// 配置选项的具体用法见 README.md</span></span><br><span class="line"><span class="title function_">initWidget</span>(&#123;</span><br><span class="line"><span class="attr">waifuPath</span>: live2d_path + <span class="string">&quot;waifu-tips.json&quot;</span>,</span><br><span class="line"><span class="comment">//apiPath: &quot;https://live2d.fghrsh.net/api/&quot;,</span></span><br><span class="line"><span class="attr">cdnPath</span>: <span class="string">&quot;/live2d_api/&quot;</span>,</span><br><span class="line"><span class="attr">tools</span>: [<span class="string">&quot;hitokoto&quot;</span>, <span class="string">&quot;asteroids&quot;</span>, <span class="string">&quot;switch-model&quot;</span>, <span class="string">&quot;photo&quot;</span>, <span class="string">&quot;info&quot;</span>, <span class="string">&quot;quit&quot;</span>]</span><br><span class="line">&#125;);</span><br><span class="line">&#125;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="2-下载Live2D看板娘插件上使用的后端-API"><a href="#2-下载Live2D看板娘插件上使用的后端-API" class="headerlink" title="2.下载Live2D看板娘插件上使用的后端 API"></a>2.下载Live2D看板娘插件上使用的后端 API</h2><p>下载<a href="https://github.com/fghrsh/live2d_api">live2d_api</a>完整项目，放入主题文件夹下的\source\<strong>live2d_api</strong>中（新建文件夹），如下图所示：<br><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/01/09/4ee85c.png" alt="下载后端api"></p><h2 id="3-修改主题配置文件"><a href="#3-修改主题配置文件" class="headerlink" title="3.修改主题配置文件"></a>3.修改主题配置文件</h2><p>打开主题配置文件，添加如下代码：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">live2d:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>并在inject的head中插入如下代码，引入js文件</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">defer</span> <span class="string">src=&quot;/live2d-widget-master/autoload.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure><p>如下图所示：</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2024/01/09/4f5e1a.png" alt="图片"></p><p>此时重新部署hexo即可看见效果</p><h1 id="自定义配置"><a href="#自定义配置" class="headerlink" title="自定义配置"></a>自定义配置</h1><h2 id="更换模型"><a href="#更换模型" class="headerlink" title="更换模型"></a>更换模型</h2><p>将看板娘模型放入主题文件内的\source\live2d_api\model文件夹内，并按照如下推荐修改大小，位置。</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;width&quot;</span><span class="punctuation">:</span> <span class="number">1.8</span></span><br></pre></td></tr></table></figure><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;center_x&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"><span class="attr">&quot;center_y&quot;</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br></pre></td></tr></table></figure><p>添加如下代码；</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;hit_areas_custom&quot;</span><span class="punctuation">:</span><span class="punctuation">&#123;</span></span><br><span class="line"><span class="attr">&quot;head_x&quot;</span><span class="punctuation">:</span><span class="punctuation">[</span><span class="number">-0.35</span><span class="punctuation">,</span> <span class="number">0.6</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"><span class="attr">&quot;head_y&quot;</span><span class="punctuation">:</span><span class="punctuation">[</span><span class="number">0.19</span><span class="punctuation">,</span> <span class="number">-0.2</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"><span class="attr">&quot;body_x&quot;</span><span class="punctuation">:</span><span class="punctuation">[</span><span class="number">-0.3</span><span class="punctuation">,</span> <span class="number">-0.25</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"><span class="attr">&quot;body_y&quot;</span><span class="punctuation">:</span><span class="punctuation">[</span><span class="number">0.3</span><span class="punctuation">,</span> <span class="number">-0.9</span><span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>如果按照上述推荐修改好，应该能解决部分模型过大导致的超出屏幕边界问题</p><h2 id="修改欢迎语"><a href="#修改欢迎语" class="headerlink" title="修改欢迎语"></a>修改欢迎语</h2><p>每个模型都可以设置自己的欢迎语，打开主题文件内的\source\live2d_api\model_list.json文件</p><p>该文件语法如下：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;models&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="string">&quot;模型1文件名&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="string">&quot;模型2文件名&quot;</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;messages&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="string">&quot;模型1欢迎语&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="string">&quot;模型2欢迎语&quot;</span></span><br><span class="line">    </span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h2 id="将看板娘放置在右侧"><a href="#将看板娘放置在右侧" class="headerlink" title="将看板娘放置在右侧"></a>将看板娘放置在右侧</h2><p>看板娘默认是在网页左侧，如果想修改为网页右侧打开主题文件内的source\live2d-widget-master\waifu.css</p><p>修改为：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#waifu-toggle</span> &#123;</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#fa0</span>;</span><br><span class="line"><span class="attribute">border-radius</span>: <span class="number">5px</span>;</span><br><span class="line"><span class="attribute">bottom</span>: <span class="number">66px</span>;</span><br><span class="line"><span class="attribute">color</span>: <span class="number">#fff</span>;</span><br><span class="line"><span class="attribute">cursor</span>: pointer;</span><br><span class="line"><span class="attribute">font-size</span>: <span class="number">12px</span>;</span><br><span class="line"><span class="attribute">left</span>: <span class="number">0</span>;</span><br><span class="line"><span class="attribute">margin-left</span>: -<span class="number">100px</span>;</span><br><span class="line"><span class="attribute">padding</span>: <span class="number">5px</span> <span class="number">2px</span> <span class="number">5px</span> <span class="number">5px</span>;</span><br><span class="line"><span class="attribute">position</span>: fixed;</span><br><span class="line"><span class="attribute">transition</span>: margin-left <span class="number">1s</span>;</span><br><span class="line"><span class="attribute">width</span>: <span class="number">60px</span>;</span><br><span class="line"><span class="attribute">writing-mode</span>: vertical-rl;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#waifu-toggle</span><span class="selector-class">.waifu-toggle-active</span> &#123;</span><br><span class="line"><span class="attribute">margin-left</span>: -<span class="number">50px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#waifu-toggle</span><span class="selector-class">.waifu-toggle-active</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line"><span class="attribute">margin-left</span>: -<span class="number">30px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#waifu</span> &#123;</span><br><span class="line"><span class="attribute">bottom</span>: -<span class="number">1000px</span>;</span><br><span class="line"><span class="attribute">right</span>: <span class="number">0</span>;</span><br><span class="line"><span class="attribute">line-height</span>: <span class="number">0</span>;</span><br><span class="line"><span class="attribute">margin-bottom</span>: -<span class="number">10px</span>;</span><br><span class="line"><span class="attribute">position</span>: fixed;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translateY</span>(<span class="number">3px</span>);</span><br><span class="line"><span class="attribute">transition</span>: transform .<span class="number">3s</span> ease-in-out, bottom <span class="number">3s</span> ease-in-out;</span><br><span class="line"><span class="attribute">z-index</span>: <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#waifu</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translateY</span>(<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#waifu-tips</span> &#123;</span><br><span class="line"><span class="attribute">animation</span>: shake <span class="number">50s</span> ease-in-out <span class="number">5s</span> infinite;</span><br><span class="line"><span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">236</span>, <span class="number">217</span>, <span class="number">188</span>, .<span class="number">5</span>);</span><br><span class="line"><span class="attribute">border</span>: <span class="number">1px</span> solid <span class="built_in">rgba</span>(<span class="number">224</span>, <span class="number">186</span>, <span class="number">140</span>, .<span class="number">62</span>);</span><br><span class="line"><span class="attribute">border-radius</span>: <span class="number">12px</span>;</span><br><span class="line"><span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">3px</span> <span class="number">15px</span> <span class="number">2px</span> <span class="built_in">rgba</span>(<span class="number">191</span>, <span class="number">158</span>, <span class="number">118</span>, .<span class="number">2</span>);</span><br><span class="line"><span class="attribute">font-size</span>: <span class="number">14px</span>;</span><br><span class="line"><span class="attribute">line-height</span>: <span class="number">24px</span>;</span><br><span class="line"><span class="attribute">margin</span>: -<span class="number">30px</span> <span class="number">20px</span>;</span><br><span class="line"><span class="attribute">min-height</span>: <span class="number">70px</span>;</span><br><span class="line"><span class="attribute">opacity</span>: <span class="number">0</span>;</span><br><span class="line"><span class="attribute">overflow</span>: hidden;</span><br><span class="line"><span class="attribute">padding</span>: <span class="number">5px</span> <span class="number">10px</span>;</span><br><span class="line"><span class="attribute">position</span>: absolute;</span><br><span class="line"><span class="attribute">text-overflow</span>: ellipsis;</span><br><span class="line"><span class="attribute">transition</span>: opacity <span class="number">1s</span>;</span><br><span class="line"><span class="attribute">width</span>: <span class="number">250px</span>;</span><br><span class="line"><span class="attribute">word-break</span>: break-all;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#waifu-tips</span><span class="selector-class">.waifu-tips-active</span> &#123;</span><br><span class="line"><span class="attribute">opacity</span>: <span class="number">1</span>;</span><br><span class="line"><span class="attribute">transition</span>: opacity .<span class="number">2s</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#waifu-tips</span> <span class="selector-tag">span</span> &#123;</span><br><span class="line"><span class="attribute">color</span>: <span class="number">#0099cc</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#live2d</span> &#123;</span><br><span class="line"><span class="attribute">cursor</span>: grab;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">300px</span>;</span><br><span class="line"><span class="attribute">position</span>: relative;</span><br><span class="line"><span class="attribute">width</span>: <span class="number">300px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#live2d</span><span class="selector-pseudo">:active</span> &#123;</span><br><span class="line"><span class="attribute">cursor</span>: grabbing;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#waifu-tool</span> &#123;</span><br><span class="line"><span class="attribute">color</span>: <span class="number">#aaa</span>;</span><br><span class="line"><span class="attribute">opacity</span>: <span class="number">0</span>;</span><br><span class="line"><span class="attribute">position</span>: absolute;</span><br><span class="line"><span class="attribute">left</span>: -<span class="number">10px</span>;</span><br><span class="line"><span class="attribute">top</span>: <span class="number">70px</span>;</span><br><span class="line"><span class="attribute">transition</span>: opacity <span class="number">1s</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#waifu</span><span class="selector-pseudo">:hover</span> <span class="selector-id">#waifu-tool</span> &#123;</span><br><span class="line"><span class="attribute">opacity</span>: <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#waifu-tool</span> <span class="selector-tag">span</span> &#123;</span><br><span class="line"><span class="attribute">display</span>: block;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">30px</span>;</span><br><span class="line"><span class="attribute">text-align</span>: center;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#waifu-tool</span> svg &#123;</span><br><span class="line">fill: <span class="number">#7b8c9d</span>;</span><br><span class="line"><span class="attribute">cursor</span>: pointer;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">25px</span>;</span><br><span class="line"><span class="attribute">transition</span>: fill .<span class="number">3s</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-id">#waifu-tool</span> svg<span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">fill: <span class="number">#0684bd</span>; <span class="comment">/* #34495e */</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">@keyframes</span> shake &#123;</span><br><span class="line"><span class="number">2%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(.<span class="number">5px</span>, -<span class="number">1.5px</span>) <span class="built_in">rotate</span>(-.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">4%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(.<span class="number">5px</span>, <span class="number">1.5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">6%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">1.5px</span>, <span class="number">1.5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">8%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">2.5px</span>, <span class="number">1.5px</span>) <span class="built_in">rotate</span>(.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">10%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(.<span class="number">5px</span>, <span class="number">2.5px</span>) <span class="built_in">rotate</span>(.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">12%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">1.5px</span>, <span class="number">1.5px</span>) <span class="built_in">rotate</span>(.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">14%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(.<span class="number">5px</span>, .<span class="number">5px</span>) <span class="built_in">rotate</span>(.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">16%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">1.5px</span>, -.<span class="number">5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">18%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(.<span class="number">5px</span>, .<span class="number">5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">20%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">2.5px</span>, <span class="number">2.5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">22%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(.<span class="number">5px</span>, -<span class="number">1.5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">24%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">1.5px</span>, <span class="number">1.5px</span>) <span class="built_in">rotate</span>(-.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">26%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">1.5px</span>, .<span class="number">5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">28%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-.<span class="number">5px</span>, -.<span class="number">5px</span>) <span class="built_in">rotate</span>(-.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">30%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">1.5px</span>, -.<span class="number">5px</span>) <span class="built_in">rotate</span>(-.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">32%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">2.5px</span>, -<span class="number">1.5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">34%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">2.5px</span>, <span class="number">2.5px</span>) <span class="built_in">rotate</span>(-.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">36%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(.<span class="number">5px</span>, -<span class="number">1.5px</span>) <span class="built_in">rotate</span>(.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">38%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">2.5px</span>, -.<span class="number">5px</span>) <span class="built_in">rotate</span>(-.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">40%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-.<span class="number">5px</span>, <span class="number">2.5px</span>) <span class="built_in">rotate</span>(.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">42%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">1.5px</span>, <span class="number">2.5px</span>) <span class="built_in">rotate</span>(.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">44%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">1.5px</span>, <span class="number">1.5px</span>) <span class="built_in">rotate</span>(.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">46%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">1.5px</span>, -.<span class="number">5px</span>) <span class="built_in">rotate</span>(-.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">48%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">2.5px</span>, -.<span class="number">5px</span>) <span class="built_in">rotate</span>(.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">50%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">1.5px</span>, <span class="number">1.5px</span>) <span class="built_in">rotate</span>(.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">52%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-.<span class="number">5px</span>, <span class="number">1.5px</span>) <span class="built_in">rotate</span>(.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">54%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">1.5px</span>, <span class="number">1.5px</span>) <span class="built_in">rotate</span>(.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">56%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(.<span class="number">5px</span>, <span class="number">2.5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">58%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">2.5px</span>, <span class="number">2.5px</span>) <span class="built_in">rotate</span>(.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">60%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">2.5px</span>, -<span class="number">1.5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">62%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">1.5px</span>, .<span class="number">5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">64%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">1.5px</span>, <span class="number">1.5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">66%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(.<span class="number">5px</span>, <span class="number">2.5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">68%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">2.5px</span>, -<span class="number">1.5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">70%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">2.5px</span>, <span class="number">2.5px</span>) <span class="built_in">rotate</span>(.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">72%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-.<span class="number">5px</span>, -<span class="number">1.5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">74%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">1.5px</span>, <span class="number">2.5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">76%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">1.5px</span>, <span class="number">2.5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">78%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">1.5px</span>, <span class="number">2.5px</span>) <span class="built_in">rotate</span>(.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">80%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">1.5px</span>, .<span class="number">5px</span>) <span class="built_in">rotate</span>(-.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">82%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">1.5px</span>, .<span class="number">5px</span>) <span class="built_in">rotate</span>(-.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">84%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-.<span class="number">5px</span>, .<span class="number">5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">86%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">2.5px</span>, <span class="number">1.5px</span>) <span class="built_in">rotate</span>(.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">88%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">1.5px</span>, .<span class="number">5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">90%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">1.5px</span>, -.<span class="number">5px</span>) <span class="built_in">rotate</span>(-.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">92%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">1.5px</span>, -<span class="number">1.5px</span>) <span class="built_in">rotate</span>(<span class="number">1.5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">94%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(.<span class="number">5px</span>, .<span class="number">5px</span>) <span class="built_in">rotate</span>(-.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">96%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">2.5px</span>, -.<span class="number">5px</span>) <span class="built_in">rotate</span>(-.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">98%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(-<span class="number">1.5px</span>, -<span class="number">1.5px</span>) <span class="built_in">rotate</span>(-.<span class="number">5deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="number">0%</span>, <span class="number">100%</span> &#123;</span><br><span class="line"><span class="attribute">transform</span>: <span class="built_in">translate</span>(<span class="number">0</span>, <span class="number">0</span>) <span class="built_in">rotate</span>(<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h1 id="一些模型下载链接"><a href="#一些模型下载链接" class="headerlink" title="一些模型下载链接"></a>一些模型下载链接</h1><p>这里将放置一些开源的或免费的模型下载地址，欢迎评论区补充</p><ul><li><a href="https://gitee.com/rao_she/live2d_models_collect">https://gitee.com/rao_she/live2d_models_collect</a></li><li><a href="https://github.com/xiaoski/live2d_models_collection">https://github.com/xiaoski/live2d_models_collection</a></li></ul><p>注意检查模型内的json文件是为名为：index.json ，如果不是请将它改为index.json再放入模型文件夹内。</p>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E6%95%99%E7%A8%8B/">教程</category>
      
      
      <category domain="https://www.chillg.de/tags/%E6%95%99%E7%A8%8B/">教程</category>
      
      <category domain="https://www.chillg.de/tags/%E5%89%8D%E7%AB%AF/">前端</category>
      
      <category domain="https://www.chillg.de/tags/%E7%BE%8E%E5%8C%96/">美化</category>
      
      <category domain="https://www.chillg.de/tags/hexo/">hexo</category>
      
      
      <comments>https://www.chillg.de/posts/8d352e14.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>浅谈易学（二）之梅花易数</title>
      <link>https://www.chillg.de/posts/eea852d2.html</link>
      <guid>https://www.chillg.de/posts/eea852d2.html</guid>
      <pubDate>Wed, 27 Dec 2023 06:51:43 GMT</pubDate>
      
      <description>介绍详细介绍了什么是梅花易数、如何起卦、先天八卦后天八卦的区别。</description>
      
      
      
      <content:encoded><![CDATA[<blockquote><p>《梅花易数》是中国古代占卜法之一。现在的<a href="https://baike.baidu.com/item/%E6%A2%85%E8%8A%B1%E5%BF%83%E6%98%93/7322342?fromModule=lemma_inlink">梅花心易</a>就是梅花易数的别称。相传为<a href="https://baike.baidu.com/item/%E5%AE%8B%E4%BB%A3/9860122?fromModule=lemma_inlink">宋代</a>易学家<a href="https://baike.baidu.com/item/%E9%82%B5%E9%9B%8D/3832?fromModule=lemma_inlink">邵雍</a>所著，梅花易数起源于<a href="https://baike.baidu.com/item/%E6%B1%89%E6%98%93/62306579?fromModule=lemma_inlink">汉易</a>，是一部以易学中的<a href="https://baike.baidu.com/item/%E6%95%B0%E5%AD%A6/107037?fromModule=lemma_inlink">数学</a>为基础，结合易学中的“象学”进行占卜的书，相传邵雍运用时每卦必中，屡试不爽。</p><p>梅花易数依<a href="https://baike.baidu.com/item/%E5%85%88%E5%A4%A9%E5%85%AB%E5%8D%A6/3222080?fromModule=lemma_inlink">先天八卦</a>数理，即乾一，兑二，离三，震四，巽五，坎六，艮七，坤八，随时随地皆可<a href="https://baike.baidu.com/item/%E8%B5%B7%E5%8D%A6/9427764?fromModule=lemma_inlink">起卦</a>，取卦方式多种多样。（介绍来自<a href="https://baike.baidu.com/item/%E6%A2%85%E8%8A%B1%E6%98%93%E6%95%B0/779052">百度百科</a>）</p></blockquote><h1 id="先天八卦与后天八卦之争"><a href="#先天八卦与后天八卦之争" class="headerlink" title="先天八卦与后天八卦之争"></a>先天八卦与后天八卦之争</h1><h2 id="先天八卦"><a href="#先天八卦" class="headerlink" title="先天八卦"></a>先天八卦</h2><blockquote><p>先天八卦，相传来自于河图。它是乾坤定南北，坎离定东西，是天南地北为序，上为天为乾，下为地为坤，左为东为离，右为西为坎。故先天八卦数是：乾一、兑二、离三、震四、巽五、坎六、艮七、坤八。它的中间数为 0，以代表五或十。0 象征着宇宙的元气。它的序数对宫相加之和为九数。先天八卦演变过程中，首先是太极，其次是两仪，接着是四象，最后是八卦，它们是宇宙形成的过程。（介绍来自<a href="https://baike.baidu.com/item/%E5%85%88%E5%A4%A9%E5%85%AB%E5%8D%A6/3222080">百度百科</a>）</p></blockquote><p>先天八卦顺序为：乾一、兑二、离三、震四、巽五、坎六、艮七、坤八。</p><p><img src="https://file.8888998.xyz/2025/09/20/1758354662482-x73irj.jpeg" alt="先天八卦"></p><p><em>图片来源：国易堂，谷歌搜索引擎收录，非商业使用，如有侵权联系邮件删除</em></p><p>它的中间数为 0，以代表五或十。0 象征着宇宙的元气。它的序数对宫相加之和为九数。先天八卦演变过程中，首先是太极，其次是两仪，接着是四象，最后是八卦，它们是宇宙形成的过程。</p><h3 id="区分"><a href="#区分" class="headerlink" title="区分"></a>区分</h3><p>​ 关于先天八卦，《系辞下》中有记载</p><blockquote><p>古者包牺氏之王天下也，仰则观象于天，俯则观法于地，观鸟兽之文，与地之宜，近取诸身，远取诸物，于是始作八卦，以通神明之德，以类万物之情</p></blockquote><p>通过记载，我们可以得知，人祖爷伏羲通过<strong>仰则观象于天</strong>，<strong>俯则观法于地</strong>，即对于天地的观察得出<strong>八卦</strong>。而对于天地的观察最直观简单的无非是一年四季温度变化。根据一年四季天地万物的变化现象可以把寒热的温度变化对于万物的影响分为春夏秋冬四个季节即为<strong>四时</strong>。四时即为<strong>四象</strong>，易得：</p><ul><li>春 -&gt; 少阳</li><li>夏 -&gt; 太阳</li><li>秋 -&gt; 少阴</li><li>冬 -&gt; 太阴</li></ul><p>而对四时再做细分就得出<strong>八正</strong>，分别是<strong>立春</strong>、<strong>春风</strong>、<strong>立夏</strong>、<strong>夏至</strong>、<strong>立秋</strong>、<strong>秋分</strong>、<strong>立冬</strong>、<strong>冬至</strong>。</p><p>八正正好对应上洛书九宫的八方，无论是八分、八方、八卦都是取象比类，都代表气的能量聚散流变的状态。四时生八正，四象生八卦异曲同工。而气就是中国文化的底层逻辑。“气”是宇宙万物构成的最基础元素，气按照聚散流变采用二分法即为阴与阳；一分为三即为天、地、人；一分为四即为四象：太阴、太阳、少阴、少阳。<del>（这就是知识串起来的感觉吗？）</del></p><p>回到辨析先天八卦，知道上述前置知识，不难理解，先天八卦是伏羲根据天地阴阳之气的能量变化画出来的，反应的是从书简属性上天地之间的能量循环变化图景</p><h2 id="后天八卦"><a href="#后天八卦" class="headerlink" title="后天八卦"></a>后天八卦</h2><blockquote><p>八卦分为先天与后天。后天八卦图，也有人将其与周文王联系起来，称为文王八卦图。</p></blockquote><p>后天八卦的顺序为：坎一、坤二、震三、巽四、五为中宫，乾六、兑七、艮八、离九</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2023/12/27/b55811.png" alt="后天八卦"></p><p><em>图片来源：国易堂，谷歌搜索引擎收录，非商业使用，如有侵权联系邮件删除</em></p><h3 id="区别"><a href="#区别" class="headerlink" title="区别"></a>区别</h3><p>后天八卦与先天八卦在位置上有所变动，对于周文王为何要对此改变，目前已经无法考究。但我们可以站在对这两个八卦已有的了解上倒推分析。我们都知道先天八卦只是从时间层面去研究事物的变化对于空间的比较少，因此会有很多的问题无法解决。猜测周文王为了解决这个不足，从而引入了空间上的概念。至于后人所传的把两个八卦叠加是因为一个三爻代表时间另一个代表空间，叠加后的 64 卦既有时间又有空间，比八卦更能深入广泛地研究事物之间的不同联系和变化个人见解周文王可能有这方面考量，但具体的原因以及不得而知。</p><p>回到区别辨析，河图相生的五行结构是再说明天道左旋代表代表的是天上的能量变化。<img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2023/12/27/9e812a.png" alt="天道左旋"></p><p>而洛书相克的五行结构则在说明地道右转，代表的是气在地上的能量变化</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2023/12/27/6b6e9c.png" alt="地道右转"></p><p>先天八卦的时间属性与洛书地上能量的变化相结合可以得出其在空间上的能量变化。空间的属性就是后天八卦，先天八卦与洛书结合即可得出后天八卦。</p><h2 id="先天八卦后天八卦区分总结"><a href="#先天八卦后天八卦区分总结" class="headerlink" title="先天八卦后天八卦区分总结"></a>先天八卦后天八卦区分总结</h2><ul><li>后天八卦：具有空间属性，也称为九宫八卦</li><li>先天八卦：具有时间属性</li></ul><p>时间与空间结合的六十四卦是更加深入广泛的研究气的聚散流变状态。</p><h1 id="梅花易数"><a href="#梅花易数" class="headerlink" title="梅花易数"></a>梅花易数</h1><p>知道了前天八卦与后天八卦区分，我们不难得出梅花易数起卦用的是先天八卦和后天八卦根本就没有准确答案。如果用的时间起卦就应该使用后天八卦，如果用的方位、端法等起卦，就应该用后天八卦。</p><h2 id="八卦"><a href="#八卦" class="headerlink" title="八卦"></a>八卦</h2><p>我们一直在聊先天八卦、后天八卦，可八卦都代表什么呢？</p><p>以梅花易数常用的先天八卦举例：乾　 兑　 离　 震　 巽　 坎　 艮　 坤</p><ul><li>乾 ☰ 乾为天。五行属性为金。代表天，也代表金属或具有金属性质的东西。 速记口诀：{乾为天}{乾一}{乾三连}</li><li>兑 ☱ 兑为泽，五行属性为金。代表沼泽，水性物，也代表金属或具有金属性质的东西。 速记口诀：{兑为泽}{兑二}{兑上缺}</li><li>离 ☲ 离为火，五行属性为火。代表火、或具有火性的东西。 速记口诀：{离为火}{离三}{离中虚}</li><li>震 ☳ 震为雷，五行属性为木。代表雷，也代表树木、或具有木性的东西，大木。 速记口诀：{ 震为雷}{震四}{震仰盂}</li><li>巽 ☴ 巽为风，五行属性为木。代表风，也代表草、藤或具有木性的东西，小木。 速记口诀：{巽为风}{巽五}{巽下断}</li><li>坎 ☵ 坎为水，五行属性为水。代表水、或具有水性或流动性质的东西。 速记口诀：{坎为水}{坎六}{坎中满}</li><li>艮 ☶ 艮为山，五行属性为土。代表山，也代表具有土性的东西。 速记口诀：{艮为山}{艮七}{艮覆碗}</li><li>坤 ☷ 坤为地，五行属性为土。代表地、大地，也代表具有土性的东西。 速记口诀：{坤为地}{坤八}{坤六断}</li></ul><p><strong>八卦口诀：乾三连，坤六断，震仰盂，艮覆碗，离中虚，坎中满，兑上缺，巽下断。</strong></p><p><strong>八卦与数：乾一，兑二，离三，震四，巽五，坎六，艮七，坤八。</strong></p><p>五行生克：金生水，水生木，木生火，火生土，土生金。金克木，木克土，土克水，水克火，火克金。</p><p>十二地支五行属相：子水鼠；丑土牛；寅木虎；卯木兔；辰土龙；巳火蛇；午火马；未土羊；申金猴；酉金鸡；戌土狗；亥水猪。</p><h2 id="梅花易数起卦方法"><a href="#梅花易数起卦方法" class="headerlink" title="梅花易数起卦方法"></a>梅花易数起卦方法</h2><p>梅花易数起卦方法非常自由，常见的有<strong>年月日时起卦</strong>、<strong>直接以数起卦</strong>、<strong>按声音起卦</strong>、<strong>按字的笔划数或字数起卦</strong>等等</p><h3 id="年月日时起卦"><a href="#年月日时起卦" class="headerlink" title="年月日时起卦"></a>年月日时起卦</h3><p>即以农历之年月日总和除以八，以余数为卦数求上卦;以年月日时总和除以八，以余数为卦数求下卦，再以年月日时总和除以六，以余数为动爻。</p><p>更数学一点即为：</p><ul><li>上卦：（年+月+日）%8</li><li>下卦： （年+月+日+时）%8</li><li>动爻：（年+月+日+时）%6</li></ul><p>十二个时辰：子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。</p><p>其中对于关系为：</p><ul><li>子时：23 点到 1 点</li><li>丑时：1 点到 3 点</li><li>寅时：3 点到 5 点</li><li>卯时：5 点到 7 点</li><li>辰时：7 点到 9 点</li><li>巳时：9 点到 11 点</li><li>午时：11 点到 13 点</li><li>未时：13 点到 15 点</li><li>申时：15 点到 17 点</li><li>酉时：17 点到 19 点</li><li>戌时：19 点到 21 点</li><li>亥时：21 点到 23 点</li></ul><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2023/12/27/10cb4c.png" alt="十二地支"></p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2023/12/27/79e92d.png" alt="十二时辰"></p><p>例如以此刻的时间起卦，时间为 2023&#x2F;12&#x2F;27 16：17。转化为农历为癸卯年十一月十五日申时。卯为 4 数，申为 9 数</p><p>上卦为：（4+11+15）%8&#x3D;6，即为坎卦</p><p>下卦为：（4+11+15+9）%8&#x3D;7，即为艮卦</p><p>动爻数为：（4+11+15+9）%6&#x3D;3 即为 3 爻</p><p>因此我们得到了 周易第 39 卦 蹇卦 水山蹇</p><blockquote><p><strong>蹇卦原文</strong><br>蹇。利西南，不利东北。利见大人，贞吉。<br>象曰：山上有水，蹇。君子以反身修德。</p></blockquote><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2023/12/27/41a6fe.png" alt="图片"></p><p>此篇文章我们不对卦象做解读，也不深究<strong>本卦</strong>、<strong>互卦</strong>、<strong>错卦</strong>、<strong>综卦</strong></p><p>结合动爻数 <strong>九三爻</strong>：</p><p><strong>九三爻辞</strong>：</p><blockquote><p>九三。往蹇来反。<br>象曰：往蹇来反，内喜之也。</p></blockquote><p><strong>白话文解释</strong>：</p><blockquote><p>九三：出门困难重重，归来笑逐颜开。<br>《象辞》说：出门困难重重，归来笑逐颜开，这是发自内心的喜悦。</p></blockquote><p><strong>北宋易学家邵雍解</strong>：</p><blockquote><p>平：得此爻者，不宜进取，或有妻子之喜。做官的位高者会晋升。<br>台湾国学大儒傅佩荣解<br>时运：前进不易，且先退守。<br>财运：货物不畅，转销内地。<br>家宅：团聚之喜；重逢有缘。<br>身体：多加保养。</p></blockquote><p>此篇文章我们不对卦象做解读，占卦容易解卦难，未来<del>可能</del>回更新教大家如何简单的解卦，以及介绍讲解何为<strong>本卦</strong>、<strong>互卦</strong>、<strong>错卦</strong>、<strong>综卦</strong>。</p><h3 id="直接以数起卦"><a href="#直接以数起卦" class="headerlink" title="直接以数起卦"></a><strong>直接以数起卦</strong></h3><p>这是一种极为简便且准确率尚可的起卦方法，当有人求算某事时，我们可以让其随意说出两个数，第一个数取上卦，第二个数取下卦，两数之和对 6 取模即为动爻。也可以用翻书、翻看日历、脑海中突然涌现的数字来起卦。因为过于简单不在举例说明</p><h3 id="其他方式起卦"><a href="#其他方式起卦" class="headerlink" title="其他方式起卦"></a>其他方式起卦</h3><p>梅花易数起卦方法非常自由，还有</p><ul><li><strong>按声音起卦</strong>：听到声音，我们可以选择声音数量做上卦，声音数量+时辰做下卦和动爻。鸡鸭鹅鸟叫，人说话声，叩门声所闻的声音都可以用来起卦，并无限制。若所闻声音有明显间隔，我们可以把第一段声音数量做上卦，第二段声音数量做下卦，两段声音总和加时辰做动爻。</li><li><strong>按字的笔划数或字数起卦</strong>：例如，我们想占卜时，盯着一个字或一段字。若时一个字或几个字，我们可以用该字的左右结构、上下结构来取上下卦，动爻即为二者和加时辰。若字数很多，我们可以用字的数量做上下卦。如这段文字有明显分段或句号隔断我们可以将其分为上下两卦，加上时辰做动爻。若无明显隔断，我们数总数平分，若不能均分（即和为奇数）我们取少一字为上卦，多一字为下卦，意为天轻清、地重浊。</li></ul><p>由于篇幅有限，未能列举所有起卦方法，还有别的请大家自行查阅相关资料，不在额外说明。</p><h2 id="番外"><a href="#番外" class="headerlink" title="番外"></a>番外</h2><p>关于梅花易数和易学术数有很多的小故事小传闻，可以帮助大家更好的理解占卜术数。大家对其真实性不必太过计较，可以理解为教学理解用例，如果你也有有趣的小故事能让我们更好的理解术数，可以发送至评论区或作者邮箱，将为您署名添加！</p><h3 id="邵雍算花瓶"><a href="#邵雍算花瓶" class="headerlink" title="邵雍算花瓶"></a>邵雍算花瓶</h3><blockquote><p>北宋有一位著名的理学家、易学大师，邵雍。一日，邵雍算出他的花瓶会在某年某月某日的午时碎掉。他很诧异：我的花瓶放在桌上又没人去动它，咋会碎呢？于是，到了那一天临近正午时分，他全神贯注地盯着花瓶，不让任何人接近，心想：“我守着你怎么还会碎呢”。因为太专注了，老婆喊他吃午饭喊了好多次，他都没听到，老婆气愤地说：“犯傻了吧，一个花瓶有什么好看的！”说罢，一怒之下，把花瓶砸了。邵雍哈哈大笑：“原来是这么碎掉的！”</p></blockquote><p>这个小故事告诉我们介入因果即是因果，邵雍再给花瓶起卦时，就已经介入到了花瓶的因果之中。<strong>窥探命运，本身便是命运闭环的一部分。</strong></p><h3 id="五次结婚"><a href="#五次结婚" class="headerlink" title="五次结婚"></a>五次结婚</h3><p>这个故事名字和出处都已经找不到了，还是作者当初学占卜时听老师所讲，本人稍微用自己的语言叙述出吧</p><p>某天，一位大师为一名中年女子算命，中年女子想问自己的婚姻是否幸福。大师简单询问生辰八字后便眉头一皱说姑娘，你这几年婚姻坎坷不幸啊。还没等大师说完女子便破口大骂，说大师是个骗子，算的根本不准，说自己结了五次婚了，一次比一次幸福，老公一次比一次有钱。怎么会坎坷呢。说罢便离开了。</p><p>这个故事告诉我们呢，占卜终究只能占事，不能占人。你的得到的永远是现象，事情的发展规律，而不是对你怎么样，不是对你来说的好与坏而是事物本身的客观评价。大师算到了你结了五次婚意味着离了四次，此乃大师口中的坎坷。而女子不但不会离婚感到伤心反而认为每次结婚的老公都在越来越优秀，反而是自己更加幸福上升。</p>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E5%91%A8%E6%98%93/">周易</category>
      
      
      <category domain="https://www.chillg.de/tags/%E6%9D%82%E8%B0%88/">杂谈</category>
      
      <category domain="https://www.chillg.de/tags/%E5%91%A8%E6%98%93/">周易</category>
      
      
      <comments>https://www.chillg.de/posts/eea852d2.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>giffgaff激活与使用指南</title>
      <link>https://www.chillg.de/posts/7h810e8z.html</link>
      <guid>https://www.chillg.de/posts/7h810e8z.html</guid>
      <pubDate>Sun, 01 Oct 2023 08:07:22 GMT</pubDate>
      
      <description>文章详细介绍了英国手机卡运营商giffgaff的激活与使用指南，包括可选套餐、漫游资费、注意事项、激活流程、关闭语音信箱以及查询话费的操作步骤。如果您计划在英国使用手机卡，这篇指南将帮助您轻松上手giffgaff，享受其低成本的移动网络服务。</description>
      
      
      
      <content:encoded><![CDATA[<h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><hr><p>giffgaff 成立于 2009 年 11 月 25 日，是一家总部位于英国伦敦的移动虚拟网络运营商，为 O2 全资子公司，因此 giffgaff 使用 O2 的网络，享有 O2 相同的 99% 网络覆盖率，且可访问英国 193 个城镇的 5G 网络。</p><p>相比于 O2，giffgaff 提供每月 6 英镑 1GB 的低成本手机移动网络服务</p><p>本文将带您了解以下内容：</p><ul><li>可选套餐 (goodybag)</li><li>漫游资费</li><li>注意事项</li><li>激活流程</li><li>如何关闭语音信箱</li><li>如何快捷查询话费</li></ul><h1 id="可选套餐"><a href="#可选套餐" class="headerlink" title="可选套餐"></a>可选套餐</h1><p>giffgaff 提供两种类型的套餐可供选择，Golden goodybag 必须绑定自动扣费方式且设置自动续费才可购买，相较于普通套餐包，在同样的价格下它提供了更多的数据流量。</p><p>需要注意的是，套餐包所包含的流量<strong>仅限英国境内以及欧盟国家境内漫游时有限制地使用</strong>。</p><p>可以前往 <a href="https://www.giffgaff.com/roaming-charges">https://www.giffgaff.com/roaming-charges</a> 进行查询，以下为截至发稿时中国大陆地区的漫游资费。20p 即 20 pence，等于 GBP 0.2。</p><h1 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h1><h2 id="一、以下操作均会造成扣费："><a href="#一、以下操作均会造成扣费：" class="headerlink" title="一、以下操作均会造成扣费："></a>一、以下操作均会造成扣费：</h2><ol><li><strong>短信、通话、上网</strong>。资费见上文。</li><li><strong>手动拒接任何来电</strong>。由于 giffgaff 默认开通了语音信箱功能，拒接来电后将会自动接入语音信箱产生费用，如需要避免，请参见后文手动关闭来电转接功能。</li><li><strong>激活 FaceTime 与 iMessage 服务</strong>。如不需要 iOS 提供的 FaceTime 与 iMessage 服务，请在系统弹出以下对话框时点击取消按钮。<img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2023/10/02/919d83.png" alt="图片"></li></ol><h2 id="二、保号"><a href="#二、保号" class="headerlink" title="二、保号"></a>二、保号</h2><p>激活后的号卡需要每 180 天内进行一次消费以进行保号，若长时间未消费，会收到警告邮件，请按邮件提示进行操作，不予理会将被销号</p><h1 id="激活流程"><a href="#激活流程" class="headerlink" title="激活流程"></a>激活流程</h1><ol><li>将 SIM 卡插入手机，入网后稍等片刻，会收到一条来自 43432 的短信，点击短信中的链接进入激活页面。<img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2023/10/02/70eb3c.png" alt="短信"></li><li>如在上一步中未收到短信，请手动打开 <a href="https://www.giffgaff.com/activate">https://www.giffgaff.com/activate</a> ，并输入卡片上的激活码进行激活。</li><li>选择适合自己的套餐，前文中我们已经了解过了套餐的区别，如果暂时没有使用需求，可以将页面拉至最下方，选择 <strong>Pay as you go</strong> ，激活后可以正常接收短信。 <img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2023/10/02/cc8d1e.png" alt="套餐"></li><li>首次充值需要至少充值 10 英镑，仅支持使用 VISA &#x2F; MasterCard 的借记卡或信用卡进行付款（如没有指定银行卡，可以选择淘宝购买充值卡密，点击 <strong>Or redeem a top-up voucher</strong> 进行激活）。<img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2023/10/02/9ee991.png" alt="充值"></li><li>使用卡密充值：可以去某宝或飞猪直接搜索 giffgaff 代充，10 英镑即可。<strong>使用银行卡激活</strong>请跳过本段直接看第六步。</li><li>使用银行卡充值：部分银行付款时需要进行 3DS 验证，加载较慢需要耐心等待。<strong>使用充值卡密激活</strong>请跳过本段直接看第七步。<img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2023/10/02/b075c0.png" alt="银行卡"></li><li>付款成功后，页面上将出现 giffgaff 分配给您的电话号码。如申请卡时填写了他人邀请码，则会收到赠送的 5 英镑余额。至此，您已完成了整个激活流程。</li></ol><h1 id="如何关闭语音信箱"><a href="#如何关闭语音信箱" class="headerlink" title="如何关闭语音信箱"></a>如何关闭语音信箱</h1><p>参考 <a href="https://www.giffgaff.com/help/articles/how-do-i-turn-voicemail-on-or-off">https://www.giffgaff.com/help/articles/how-do-i-turn-voicemail-on-or-off</a> ，在手机拨号盘输入</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">##002#</span><br></pre></td></tr></table></figure><p>并拨打，即可关闭语音信箱。</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2023/10/02/5e071c.png" alt="关闭信箱"></p><h1 id="如何快捷查询话费"><a href="#如何快捷查询话费" class="headerlink" title="如何快捷查询话费"></a>如何快捷查询话费</h1><p>在手机拨号盘输入</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">*100#</span><br></pre></td></tr></table></figure><p>并拨打，即可快捷查询到话费余额。</p><h1 id="其他常用快捷指令"><a href="#其他常用快捷指令" class="headerlink" title="其他常用快捷指令"></a>其他常用快捷指令</h1><ul><li>查询 SIM 号码：<br>发送<code>NUMBER</code>到<code>43430</code></li><li>查询话费余额：<br>直接拨打 <code>*100#</code></li><li>关闭语音信箱：<br>直接拨打 <code>##002#</code></li><li>打开语音信箱：<br>直接拨打<code>**61*443*10*20#</code></li></ul>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E6%95%99%E7%A8%8B/">教程</category>
      
      
      <category domain="https://www.chillg.de/tags/%E6%95%99%E7%A8%8B/">教程</category>
      
      <category domain="https://www.chillg.de/tags/giffgaff/">giffgaff</category>
      
      <category domain="https://www.chillg.de/tags/%E5%A2%83%E5%A4%96%E5%8D%A1/">境外卡</category>
      
      
      <comments>https://www.chillg.de/posts/7h810e8z.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>浅谈易学（一）之小六壬</title>
      <link>https://www.chillg.de/posts/26792416.html</link>
      <guid>https://www.chillg.de/posts/26792416.html</guid>
      <pubDate>Wed, 28 Sep 2022 08:41:35 GMT</pubDate>
      
      <description>本文简单介绍小六壬相关知识，如何起卦，每个卦代表什么。</description>
      
      
      
      <content:encoded><![CDATA[<h1 id="小六壬基础知识（一）"><a href="#小六壬基础知识（一）" class="headerlink" title="小六壬基础知识（一）"></a>小六壬基础知识（一）</h1><h2 id="小六壬的介绍"><a href="#小六壬的介绍" class="headerlink" title="小六壬的介绍"></a>小六壬的介绍</h2><h3 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h3><p>​ 小六壬因有六种格局，又因用手指掐算因此得名。传说为三国诸葛孔明所创，为行军打仗时在马前掐算占卜战事。</p><p>​ 此方法占卜简单，且应验率极高，预测广泛，是一种简便准确的预测方法。</p><h3 id="内容"><a href="#内容" class="headerlink" title="内容"></a>内容</h3><p>以大安为起点， 依次为大安，留连，速喜，赤口，小吉，空亡。<strong>大安即为起点也为终点</strong></p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2022/09/28/32bd43.png" alt="手掌图解"></p><h2 id="起卦"><a href="#起卦" class="headerlink" title="起卦"></a>起卦</h2><p>起卦规则为对应数字对 6 取模，依次掐诀推算。</p><h3 id="时间起卦"><a href="#时间起卦" class="headerlink" title="时间起卦"></a>时间起卦</h3><p>以日期的农历的月份、日辰、时辰来起卦。最为推荐的起卦方式</p><ol><li>月份：正月、二月、三月、四月、五月、六月、七月、八月、九月、十月、十一月、十二月。</li><li>日辰：初一、初二 …… 三十。</li><li>时辰：十二支表示，<strong>子丑寅卯辰巳午未申酉戌亥</strong>。每一支代表两个小时，凌晨一点开始从丑时开始计。即凌晨一点到三点为丑时，三点到五点为寅时。整点交接建议转换为当地时间（经纬计算大概，东早西晚）。</li></ol><p>例：现在为为公元 2022 年 9 月 28 日 17：04 即农历九月初三 酉时 数字分别是 9 3 10 依次对应为<strong>速喜 小吉 大安留连 <strong>最终结果为</strong>留连</strong>。</p><h3 id="时分起卦"><a href="#时分起卦" class="headerlink" title="时分起卦"></a>时分起卦</h3><p>以时间的小时和分钟起卦。</p><p>例如现在为 17：09 可以取 17 0 9 这三个数字。0 看自身所学派别。邵一尘、天干六壬以十，部分民间以 6，两大主流。个人倾向于以 10 计算。依次对应为<strong>小吉 留连 赤口</strong> 最终结果为<strong>赤口</strong>。</p><h3 id="报数取卦"><a href="#报数取卦" class="headerlink" title="报数取卦"></a>报数取卦</h3><p>为别人占卜时，可让别人随口报出三组数字，不太推荐。</p><h2 id="阴阳-五行-六宫-八卦-简谈"><a href="#阴阳-五行-六宫-八卦-简谈" class="headerlink" title="阴阳 五行 六宫 八卦 简谈"></a>阴阳 五行 六宫 八卦 简谈</h2><h3 id="阴阳"><a href="#阴阳" class="headerlink" title="阴阳"></a>阴阳</h3><p>阴阳是一个简朴而博大的中国古代哲学。<br>阴阳哲理自身具有三个特点：统一、对立和互化。在思维上它是算筹（算数）和占卜（逻辑）不可分割的玄节点。自然界中生物的基因，人工智能中的二进制都充分彰显了阴阳的生命力。<br>阴阳是中国古代文明中对蕴藏在自然规律背后的、推动自然规律发展变化的根本因素的描述，是各种事物孕育、发展、成熟、衰退直至消亡的原动力，是奠定中华文明逻辑思维基础的核心要素。概括而言，按照易学思维理解，其所描述的是宇宙间的最基本要素及其作用，是伏羲易的基础概念之一。<br>阴阳相冲化万物，世间万物，皆有阴阳之道。即可从万物万事之间领悟到一丝阴阳之理。古人与后人都对其领悟，拥有不同的见解，因其万物存于阴阳之道，所以古今在各个学术中都有其影。</p><p>阴阳，代表一切事物的最基本对立面</p><p>阴　为寒，为暗，为聚，为实体化</p><p>阳　为热，为光，为化，为气化</p><p>中医里表里、寒热、虚实都是疾病过程中所表现的一组组既对立而又统一的正反现象——阴阳。从每组正反两方面对立的意义来说，表证、热证、实证可归属于阳证范畴；里证、寒证、虚证可归属于阴证的范畴。因此，阴阳八纲中总纲，一切病证都可以归之为阴证或阳证的大原则中。<br>阴证：面色暗淡，精神萎靡，身倦肢冷，气短懒言，口不渴，尿清便溏，舌淡，脉沉细无力。<br>阳证：面红身热，神烦气粗，声大多言，口渴饮冷，尿赤便干，苔黄，脉数有力。此外，临床上还有阴虚和阳虚、亡阴和亡阳等证。<br>阴虚：由于阴液不足，“阴虚生内热”所致。主证为低热颧红，手足心热，盗汗，口燥咽干，尿少而黄，大便秘结，舌红无苔，脉细而浮有力，重取则无脉。<br>阳虚：由于阳气不足，“阳虚则生寒”所致。主证为畏寒肢冷，疲倦乏力，自汗，小便清长，夜间尿多，大便溏薄，苔白，舌质淡，脉细无力。<br>亡阴：烦躁不安，口渴欲饮，气喘，汗出如油而热，四肢温和，舌红而干，脉洪实或躁疾，按之无力。<br>亡阳：冷汗出，恶寒，手足厥冷，气息微弱，喜热饮，舌淡，脉微欲绝。多见于休克的病人。</p><p>其中结合六壬来看，<strong>大安速喜小吉</strong>为阳 <strong>留连赤口空亡</strong>为阴。</p><h3 id="五行"><a href="#五行" class="headerlink" title="五行"></a>五行</h3><p>五行，也叫五行学说，是认识世界的基本方式， [5] 五行的意义包涵借着阴阳演变过程的五种基本动态：金（代表敛聚）、木（代表生长）、水（代表浸润）、火（代表破灭）、土（代表融合）。中国古代哲学家用五行理论来说明世界万物的形成及其相互关系。它强调整体，旨在描述事物的运动形式以及转化关系。阴阳是古代的对立统一学说，五行是原始的系统论。</p><p>金——金属</p><p>木——植物</p><p>水——液体</p><p>火——热能</p><p>土——土地</p><p>木，具有生发、条达的特性，属东方。</p><p>火，具有炎热、向上的特性，属南方。</p><p>土，具有长养、化育的特性，属中央。</p><p>金，具有清静、收杀的特性，属西方。</p><p>水，具有寒冷、向下的特性，属北方。</p><p>五脏中心属火，肺属金，肝属木，脾属土，肾属水。</p><p>凡具有生长、升发、条达舒畅等作用或性质的事物，均归属于木；</p><p>具有温热、升腾作用或性质的机制，均归属于火；</p><p>具有承载、生化、受纳作用的机制，均归属于土；</p><p>具有清洁、肃降、收敛作用的机制，均归属于金；</p><p>具有寒凉、滋润、向下运行的机制，均归属于水。</p><h3 id="八卦"><a href="#八卦" class="headerlink" title="八卦"></a>八卦</h3><blockquote><p>八卦，见于《周易·系辞下》云：“古者包牺氏之王天下也，仰则观象于天，俯则观法于地；观鸟兽之文与地之宜；近取诸身，远取诸物，于是始作八卦，以通神明之德，以类万物之情。” 八卦生自太极、两仪、四象中，“四象生八卦”。<br>它也是中国古老文化的深奥概念，是一套用三组阴阳组成的形而上的哲学符号。其深邃的哲理解释自然、社会现象。八卦成列，象在其中矣；因而重之，爻在其中矣；刚柔相推，变在其中矣；系辞焉而命之，动在其中矣。八卦成列的基础是易象，重卦的基础则在于爻变，“爻在其中矣”便是易道周流的内在动因。八卦表示事物自身变化的阴阳系统，用“一”代表阳，用“- -”代表阴，用这两种符号，按照大自然的阴阳变化平行组合，组成八种不同形式，叫做八卦。八卦其实是最早的文字表述符号。<br>它在中国文化中与“阴阳五行”一样用来推演世界空间时间各类事物关系的工具。每一卦形代表一定的事物。乾代表天，坤代表地，巽（xùn）代表风，震代表雷，坎代表水，离代表火，艮（gèn）代表山，兑代表泽。八卦就像八只无限无形的大口袋，把宇宙中万事万物都装进去了，八卦互相搭配又变成六十四卦，用来象征各种自然现象和人事现象，基于当今社会人事物繁多；八卦在中医里指围绕掌心周围八个部位的总称。八卦代表易学文化，渗透在东亚文化的各个领域。 (<a href="https://baike.baidu.com/item/%E5%85%AB%E5%8D%A6/166475">来源于百度百科</a>)</p></blockquote><p>一代表坎卦，位居正北方；<br>二代表坤卦，位居西南方；<br>三代表震卦，位居东方；<br>四代表巽卦，位居东南方；<br>五代表中宫；<br>六代表乾卦，位居西北方；<br>七代表兑卦，位居西方；<br>八代表艮卦，位居东北方；<br>九代表离卦，位居南方。</p><p><strong>小六壬的六宫类象也是从八卦内拓展而来，主要用先天八卦乾兑离震巽坎艮坤</strong></p><p>记忆方法：<strong>乾三连，坤六断，震仰盂，艮覆碗，离中虚，坎中满，兑上缺，巽下断</strong></p><p>​ <strong>乾一，兑二，离三，震四，巽五，坎六，艮七，坤八</strong></p><h3 id="六宫"><a href="#六宫" class="headerlink" title="六宫"></a>六宫</h3><p>六宫万万不可单宫论断，初学者建议多多查阅资料。简单放张图。</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2022/09/28/157799.png" alt="liugong"></p>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E5%91%A8%E6%98%93/">周易</category>
      
      
      <category domain="https://www.chillg.de/tags/%E6%9D%82%E8%B0%88/">杂谈</category>
      
      <category domain="https://www.chillg.de/tags/%E5%91%A8%E6%98%93/">周易</category>
      
      
      <comments>https://www.chillg.de/posts/26792416.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>MySQL数据库学习笔记（一）</title>
      <link>https://www.chillg.de/posts/9e299c6e.html</link>
      <guid>https://www.chillg.de/posts/9e299c6e.html</guid>
      <pubDate>Sat, 26 Mar 2022 12:32:13 GMT</pubDate>
      
      <description>初学MySQL第一次学习笔记整理</description>
      
      
      
      <content:encoded><![CDATA[<h1 id="MySQL-数据库学习笔记"><a href="#MySQL-数据库学习笔记" class="headerlink" title="MySQL 数据库学习笔记"></a>MySQL 数据库学习笔记</h1><h2 id="写在前面"><a href="#写在前面" class="headerlink" title="写在前面"></a>写在前面</h2><p>随着专业课的深入学习，我们学院在大二下学年终于开了“新”课：数据库。这是不同于 C 语言，C++，数据结构这种”编程语言“相关，对于我来说属于全新的方向，未曾了解过的全新课程，而恰好我们老师布置了作业，要求整理近一个月以来的对 MySQL 数据库的笔记，<del>正好可以水一篇博客。</del></p><h2 id="关于-MySQL"><a href="#关于-MySQL" class="headerlink" title="关于 MySQL"></a>关于 MySQL</h2><p><img src="https://file.8888998.xyz/2025/10/29/1761749119643-awgyby.webp" alt="MySQL"></p><blockquote><p>MySQL 是一个**<a href="https://baike.baidu.com/item/%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F/696511">关系型数据库管理系统</a>****，**由瑞典[MySQL AB](<a href="https://baike.baidu.com/item/MySQL">https://baike.baidu.com/item/MySQL</a> AB&#x2F;2620844) 公司开发，属于 <a href="https://baike.baidu.com/item/Oracle">Oracle</a> 旗下产品。MySQL 是最流行的<a href="https://baike.baidu.com/item/%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F/696511">关系型数据库管理系统</a>之一，在 <a href="https://baike.baidu.com/item/WEB/150564">WEB</a> 应用方面，MySQL 是最好的 [RDBMS]) (Relational Database Management System，关系数据库管理系统) 应用软件之一。</p><p>MySQL 是一种关系型数据库管理系统，关系数据库将数据保存在不同的表中，而不是将所有数据放在一个大仓库内，这样就增加了速度并提高了灵活性。</p><p>MySQL 所使用的 SQL 语言是用于访问<a href="https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E5%BA%93/103728">数据库</a>的最常用标准化语言。MySQL 软件采用了双授权政策，分为社区版和商业版，由于其体积小、速度快、总体拥有成本低，尤其是<a href="https://baike.baidu.com/item/%E5%BC%80%E6%94%BE%E6%BA%90%E7%A0%81/7176422">开放源码</a>这一特点，一般中小型网站的开发都选择 MySQL 作为网站数据库。~~~（以上资料来源于百度百科）~~~</p></blockquote><p>总之，MySQL 就是最最最最最好用的数据库！</p><h2 id="什么是数据库"><a href="#什么是数据库" class="headerlink" title="什么是数据库"></a>什么是数据库</h2><blockquote><p>数据库（Database）是按照数据结构来组织、存储和管理数据的仓库。</p><p>每个数据库都有一个或多个不同的 API 用于创建，访问，管理，搜索和复制所保存的数据。</p><p>我们也可以将数据存储在文件中，但是在文件中读写数据速度相对较慢。</p><p>所以，现在我们使用关系型数据库管理系统（RDBMS）来存储和管理大数据量。所谓的关系型数据库，是建立在关系模型基础上的数据库，借助于集合代数等数学概念和方法来处理数据库中的数据。~~~（来源于互联网）~~~</p></blockquote><p>所谓数据库就是存放数据的东西，比如教务会把我们的姓名学号选课成绩等数据存入一个数据库中。</p><p>另外还有几个概念。</p><ul><li>数据库管理系统：所谓管理系统就是管理数据库的，用于创建和管理数据库。</li><li>数据库应用程序：提供可视化界面来让用户去管理数据库，更加方便的去操作数据。</li></ul><h2 id="数据库相关术语"><a href="#数据库相关术语" class="headerlink" title="数据库相关术语"></a>数据库相关术语</h2><p>在学习数据库中，遇到了非常多的专业术语，这些属于有的就是字面意思，有些却晦涩难懂，后续有增加也会补充到这里。</p><ul><li><strong>列:</strong> 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。</li><li><strong>行：</strong>一行（&#x3D;元组，或记录）是一组相关的数据，例如一条用户订阅的数据。</li><li><strong>键</strong>: 键的值在当前列中具有唯一性。</li><li><strong>主键</strong>：主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。</li><li><strong>外键：</strong>外键用于关联两个表。</li></ul><h2 id="常用数据库命令总结"><a href="#常用数据库命令总结" class="headerlink" title="常用数据库命令总结"></a>常用数据库命令总结</h2><ul><li><p>创建数据库</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CREATE DATABASE</span><br></pre></td></tr></table></figure><p>其中可以添加<code>IF NOT EXISTS</code>，作用是如果创建的这个数据库不存在则创建，另外默认状态下数据库不支持中文，需要改成 utf-8 编码，下面是创建名为 Demo 数据库的实例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CREATE DATABASE IF NOT EXISTS Demo DEFAULT CHARSET utf8 COLLATE utf8_general_ci;</span><br></pre></td></tr></table></figure></li><li><p>删除数据库</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">drop database &lt;数据库名&gt;;</span><br></pre></td></tr></table></figure><p>例如删除名为 Demo 的数据库</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">drop database Demo;</span><br></pre></td></tr></table></figure></li></ul><p>​ 使用该项命令应该格外注意，删除的数据会永久消失，操作不可逆，~~~删除跑路~~~</p><ul><li><p>查看当前服务器下已有的数据库</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SHOW DATABLES;</span><br></pre></td></tr></table></figure><p>该命令会查找所有数据库</p></li><li><p>指定某数据库为当前活动数据库</p><p>当我们有多个数据库时，想要操作指定数据库就需要将该数据库指定为活动数据库</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">use &lt;数据库名&gt;;</span><br></pre></td></tr></table></figure><p>例如我们将 Demo 数据库指定为活动数据库</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">use Demo;</span><br></pre></td></tr></table></figure></li><li><p>创建数据表</p><p>有了数据库，我们还需要创建数据表来存放数据，可以用命令</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CREATE TABLE 表名 (列名 列类型);</span><br></pre></td></tr></table></figure><p>具体的数据类型见下方笔记</p><p>创建的数据表也可以添加<code>IF NOT EXISTS</code>来防止重复创建的报错</p></li><li><p>查看当前数据库下已有的数据表</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">show tables;</span><br></pre></td></tr></table></figure></li><li><p>查看数据表的字段信息</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">desc 数据表名</span><br></pre></td></tr></table></figure><p>或者查看某字段也可以加入字段名</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">desc 数据表名 字段名</span><br></pre></td></tr></table></figure></li><li><p>新增字段</p><p>对于已经创建好的数据表，也可以根据需求去添加字段</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ALTER 数据表名 ADD 新增字段名 数据类型 [FIRST|AFTER 字段名]</span><br></pre></td></tr></table></figure></li></ul><p>​ 其中 FIRST 是将新增字段插入表的第一行,AFTER 是插入在某个字段名后面</p><p>​ 还可以使用如下命令来批量添加新字段</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ALTER 数据表名 ADD (新字段名1类型1，新字段名2 类型2，……)</span><br></pre></td></tr></table></figure><ul><li><p>删除字段</p><p>既然能新增，也一定能删除</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ALTER TABLE 数据表名 DROP 字段名</span><br></pre></td></tr></table></figure></li><li><p>删除数据表</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">DROP TABLE 数据表名</span><br></pre></td></tr></table></figure><p>同样可以使用 IF EXISTS 来防止删除不存的数据表而报错，另外删除命令谨慎使用，数据表一旦删除，存放的数据也会消失。</p></li><li><p>向表中插入数据</p><p>有了完整的数据表，肯定要用来存放数据，下面命令可以向表中插入数据</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">INSERT 数据表名 （值1，值2，值3……）</span><br></pre></td></tr></table></figure><p>如果数据允许 NULL,也可用只添加指定列</p></li><li><p>查询表中已有的数据</p><p>查询数据表中所有字段的数据，可以用*通配符来代替所有字段名</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELTCT * FROM 数据表名</span><br></pre></td></tr></table></figure><p>当然也可以只查询部分数据</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELECT &#123;字段名1，字段名2……&#125; FROM 数据表名</span><br></pre></td></tr></table></figure><p>甚至你可以设置查询条件，比如条件为某字段为特定值</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SELECT * FROM 数据表名 WHERE 字段名 = 值;</span><br></pre></td></tr></table></figure></li><li><p>更新表中某一行的数据</p><p>数据的增删查改，最后一个操作改也可以通过一下命令实现</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">UPDATE 数据表名 SET 字段名1 = 值1;</span><br></pre></td></tr></table></figure><p>删除数据：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">DELECT FROM 数据表名;</span><br></pre></td></tr></table></figure><p>以上的命令都可以在后面加上 WHERE 条件表达式去操作一系列满足条件的数据。</p></li></ul><h2 id="常见数据类型（MySQL）"><a href="#常见数据类型（MySQL）" class="headerlink" title="常见数据类型（MySQL）"></a>常见数据类型（MySQL）</h2><p>附上 MySQL 中常见的数据类型，<del>图片来源于互联网仅做学习记录使用，侵权联系删除</del></p><ul><li><p>数值类型</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2023/12/19/a9dada.png" alt="数值类型"></p></li><li><p>日期和时间类型</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2023/12/19/fef529.png" alt="日期和时间按类型"></p></li><li><p>字符串类型</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2023/12/19/7f1f52.png" alt="字符串"></p><h2 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a>写在最后</h2><p>以上就是这一个月学习数据库的部分笔记，新学的命令也许会很多，但大多数也只是几个表达改操作含义的单词的的组合，并不会想程序设计课和算法课需要去盘逻辑，总体来说数据库这门课还是比较简单，学起来也比较轻松，期待后续的学习，当然本系列博客会持续更新<del>如果后续老师还布置相关作业的话</del>。</p><p>本篇最后修改时间为第一版 2022.03.26 22：24，后续会补充上实机演示截图<del>（大概）</del>。</p></li></ul><p>本文除相关资料来源于百度百科，数据类型图片来源于菜鸟教程其余全为原创，非商用转载请注明出处和作者，互联网因你规范分享而更加精彩！</p>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E5%AD%A6%E4%B9%A0/">学习</category>
      
      
      <category domain="https://www.chillg.de/tags/%E7%AC%94%E8%AE%B0/">笔记</category>
      
      <category domain="https://www.chillg.de/tags/MySQL/">MySQL</category>
      
      
      <comments>https://www.chillg.de/posts/9e299c6e.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>初学JAVA</title>
      <link>https://www.chillg.de/posts/38ff98f8.html</link>
      <guid>https://www.chillg.de/posts/38ff98f8.html</guid>
      <pubDate>Thu, 15 Jul 2021 09:26:45 GMT</pubDate>
      
      <description>JAVA的第一次学习笔记</description>
      
      
      
      <content:encoded><![CDATA[<h1 id="JAVA-学习笔记（一）"><a href="#JAVA-学习笔记（一）" class="headerlink" title="JAVA 学习笔记（一）"></a>JAVA 学习笔记（一）</h1><h2 id="我的第一段代码"><a href="#我的第一段代码" class="headerlink" title="我的第一段代码"></a>我的第一段代码</h2><p>按照国际惯例，学习一种新的编程语言必然先”Hello World”</p><h3 id="输出"><a href="#输出" class="headerlink" title="输出"></a>输出</h3><p>在 java 中，输出的语句为<code>System.out.println(&quot;Hello World&quot;);</code></p><p>此时完整代码为</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.myjava.java;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">HelloWorld</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        System.out.println(<span class="string">&quot;Hello World&quot;</span>);</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>输出结果</p><p><code>Hello World</code></p><p><code> Process finished with exit code 0</code></p><h3 id="输入"><a href="#输入" class="headerlink" title="输入"></a>输入</h3><p>JAVA 中输入的实现也非常简单</p><p>首先先构造一个 Scanner 对象，其传入参数为 System.in，具体代码为：</p><p><code>Scanner in = new Scanner(System.in);</code></p><p>结合输出所学，我们在输出输入的内容，具体代码为：</p><p><code>System.out.println(in.nextLine());</code></p><p>完整代码为：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.myjava.java;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">HelloWorld</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        System.out.println(<span class="string">&quot;Hello World&quot;</span>);</span><br><span class="line">        <span class="type">Scanner</span> <span class="variable">in</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line">        System.out.println(in.nextLine());</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>结合实际意义稍加修改得到最终代码为：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.myjava.java;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">HelloWorld</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        System.out.println(<span class="string">&quot;Hello World&quot;</span>);</span><br><span class="line">        <span class="type">Scanner</span> <span class="variable">in</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line">        System.out.println(<span class="string">&quot;Hello&quot;</span> + in.nextLine());</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>运行结果为：</p><p>输出</p><p><code>Hello World</code></p><p>输入</p><p><code>梦之翼</code></p><p>输出</p><p><code>Hello梦之翼</code><br><code>Process finished with exit code 0</code></p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/07/15/485bad.png" alt="运行结果"></p><p>至此，我的第一个 JAVA 程序大功告成。</p><hr><h2 id="变量及赋值"><a href="#变量及赋值" class="headerlink" title="变量及赋值"></a>变量及赋值</h2><p>在 java 中，有一下几种基本数据类型：</p><p><code>int</code> <code>long</code> <code>float</code> <code>double</code> <code>short</code> <code>char</code> <code>boolean</code>(布尔） 这几中 C 语言中都有，不在说明。</p><p>此外 还有：</p><p><code>byte</code> :</p><ul><li>byte 数据类型是 8 位、有符号的，以二进制补码表示的整数；</li><li>最小值是 <strong>-128（-2^7）</strong>；</li><li>最大值是 <strong>127（2^7-1）</strong>；</li><li>默认值是 <strong>0</strong>；</li><li>byte 类型用在大型数组中节约空间，主要代替整数，因为 byte 变量占用的空间只有 int 类型的四分之一；</li><li>例子：byte a &#x3D; 100，byte b &#x3D; -50。</li></ul><h3 id="定义变量"><a href="#定义变量" class="headerlink" title="定义变量"></a>定义变量</h3><p>和 C 语言一样，JAVA 在使用变量前也需要先定义类型和变量名，后使用，且一旦定义好类型后不可改变。</p><p>定义一个<code>int</code>类似的 a</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> a;</span><br></pre></td></tr></table></figure><h3 id="赋值"><a href="#赋值" class="headerlink" title="赋值"></a>赋值</h3><p>与 C 语言一样，复制即为<code>=</code> 连接变量于值，也可以在定义时就复制</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> a;</span><br><span class="line"><span class="type">int</span> <span class="variable">b</span> <span class="operator">=</span> <span class="number">2</span>;</span><br><span class="line">a = <span class="number">3</span>;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="实例"><a href="#实例" class="headerlink" title="实例"></a>实例</h3><p>编写一个 java 程序输入两个数字计算相加结果并输出。</p><p>代码如下：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.myjava.java;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">HelloWorld</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        <span class="type">Scanner</span> <span class="variable">in</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line">        <span class="type">int</span> a,b;</span><br><span class="line">        a=in.nextInt();</span><br><span class="line">        b=in.nextInt();</span><br><span class="line">        System.out.println(a+<span class="string">&quot;+&quot;</span>+b+<span class="string">&quot;=&quot;</span>+(a+b));</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>输入</p><p><code>2</code></p><p><code>3</code></p><p>输出</p><p><code>2+3=5</code><br><code>Process finished with exit code 0</code></p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/07/15/9e054b.png" alt="输出"></p><hr><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>第一篇 JAVA 学习笔记至此，JAVA 笔记讲持续更新……</p><p>结尾壁纸放送</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/07/15/34e973.png" alt="bizhi"></p>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E5%AD%A6%E4%B9%A0/">学习</category>
      
      
      <category domain="https://www.chillg.de/tags/%E7%AC%94%E8%AE%B0/">笔记</category>
      
      <category domain="https://www.chillg.de/tags/%E5%AD%A6%E4%B9%A0/">学习</category>
      
      <category domain="https://www.chillg.de/tags/Java/">Java</category>
      
      
      <comments>https://www.chillg.de/posts/38ff98f8.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>IDEA入门使用</title>
      <link>https://www.chillg.de/posts/e5432e20.html</link>
      <guid>https://www.chillg.de/posts/e5432e20.html</guid>
      <pubDate>Sun, 11 Jul 2021 09:16:20 GMT</pubDate>
      
      <description>IntelliJ IDEA入门使用，胎教级使用说明</description>
      
      
      
      <content:encoded><![CDATA[<h1 id="IntelliJ-IDEA-入门使用"><a href="#IntelliJ-IDEA-入门使用" class="headerlink" title="IntelliJ IDEA 入门使用"></a>IntelliJ IDEA 入门使用</h1><h2 id="首次启动该"><a href="#首次启动该" class="headerlink" title="首次启动该"></a>首次启动该</h2><p>首次启动界面</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/07/11/b328d9.png" alt="第一次启动"><code>NEW Projet</code>:这个就是我们创建新项目的地方，一般出在第一次安装或者没有项目时出现这个</p><p><code>Open</code>:打开现有项目，别人拿 IDE 开发的，也能打开</p><p><code>Get from VSC</code>里面下拉框有：CVS , Git,TFS,Mercurial,Subversion 五个选项，这是版本控制功能，很强大，可以和对应的相关网站上的项目直接克隆到本地，很是强大</p><h2 id="创建第一个项目"><a href="#创建第一个项目" class="headerlink" title="创建第一个项目"></a>创建第一个项目</h2><h3 id="第一步：我们点击-New-Projec"><a href="#第一步：我们点击-New-Projec" class="headerlink" title="第一步：我们点击 New Projec"></a>第一步：我们点击 <code>New Projec</code></h3><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/07/11/9f736b.png" alt="2"></p><p>注意一下 SDK 的路径是否正确</p><p>NEXT-&gt;NEXT</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/07/11/1d13d9.png" alt="MAJAVA"></p><p>Finish 即可</p><h3 id="新建包"><a href="#新建包" class="headerlink" title="新建包"></a>新建包</h3><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/07/11/827509.png" alt="新建包"></p><h4 id="新建类"><a href="#新建类" class="headerlink" title="新建类"></a>新建类</h4><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/07/11/dec192.png" alt="新建类"></p><p>新建<code>HelloWord</code>类</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/07/11/0748b8.png" alt="新建HelloWord类"></p><h3 id="Helloword"><a href="#Helloword" class="headerlink" title="Helloword"></a>Helloword</h3><p>代码：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.myjava.java;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">HelloWorld</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        System.out.println(<span class="string">&quot;Hello World&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/07/11/96526f.png" alt="DAIIMA"></p><h3 id="运行"><a href="#运行" class="headerlink" title="运行"></a>运行</h3><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/07/11/b82e62.png" alt="RUN"></p><p>如图点击绿色右三或使用快捷键 RUN</p><h3 id="运行结果"><a href="#运行结果" class="headerlink" title="运行结果"></a>运行结果</h3><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/07/11/82a5bb.png" alt="JIEGUO"></p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>IDEA 功能远不止这些，作为一个初学者也仅仅掌握于此，关于 Java 和 IEDA 的深入学习我还在继续，此笔记未完待续…………</p>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E5%AD%A6%E4%B9%A0/">学习</category>
      
      
      <category domain="https://www.chillg.de/tags/%E7%AC%94%E8%AE%B0/">笔记</category>
      
      <category domain="https://www.chillg.de/tags/%E5%AD%A6%E4%B9%A0/">学习</category>
      
      <category domain="https://www.chillg.de/tags/%E6%95%99%E7%A8%8B/">教程</category>
      
      <category domain="https://www.chillg.de/tags/Java/">Java</category>
      
      
      <comments>https://www.chillg.de/posts/e5432e20.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>无论世界多么崩坏，我都只想再见到她的笑颜</title>
      <link>https://www.chillg.de/posts/7821dc39.html</link>
      <guid>https://www.chillg.de/posts/7821dc39.html</guid>
      <pubDate>Tue, 15 Jun 2021 08:54:28 GMT</pubDate>
      
      <description>明明是她拯救了他啊！</description>
      
      
      
      <content:encoded><![CDATA[<h1 id="无论世界多么崩坏，我都只想再见到她的笑颜"><a href="#无论世界多么崩坏，我都只想再见到她的笑颜" class="headerlink" title="无论世界多么崩坏，我都只想再见到她的笑颜"></a>无论世界多么崩坏，我都只想再见到她的笑颜</h1><h2 id="影片介绍"><a href="#影片介绍" class="headerlink" title="影片介绍"></a>影片介绍</h2><p>《<strong>HELLO WORLD</strong>》（日语：ハロー・ワールド）是 2019 年 9 月 20 日于日本上映的日本原创动画电影。此外本作有出外传短篇三篇，每集约 10 分钟。</p><h3 id="剧情"><a href="#剧情" class="headerlink" title="剧情"></a>剧情</h3><p>在 2027 年的京都，科技发达的电子化时代，男主角是整天都埋首在书堆中的一名高中生坚书直实，对自己一向都没有自信，有天一只三只脚的乌鸦出现在直实的面前，把直实吓得手上的袋子掉落一地，里头的书也掉了出来，这时那只乌鸦把书咬起便飞走了，飞到一处神社)前的鸟居下，男主也追了过来捡起了书，这时突然出现了向电玩般的线条正在围着直实，一名白衣成年男子出现，且喃喃自语说“成功了吗？”并询问直实现在是西元几年，直实看到就吓跑了，没想到白衣男子很快得就追到了，并说“我是十年后的坚书直实”，这时小直实喊“我要报警䁖”，刚好一位男孩走了过去。隔日乌鸦逼迫小直实去找十年后的直实，十年后的直实就带小直实参观“阿尔塔拉”，解释完一切后，他们上了公车，照着大直实说的做就遇到了女主角一行瑠璃，但小直实说“她不是我的菜，她不可爱……”。大直实就气得带小直实去看看瑠璃，不料大直实竟落下了眼泪。经过一番解释后，才得知大直实跟瑠璃交往三个月后一齐去看烟火，没想到一道轰天巨雷落下打中了瑠璃，从此她在大直实的 α 时空线昏迷了 10 年，所以大直实要做的是把她从 β 时空线（一行瑠璃存活的世界）和 α 时空线做结合，原因是只为了“再看一次瑠璃的一次笑容”，之后展开了为期三个月的训练，从橡皮擦橡皮擦到铁再到黑洞，之后男主一步一步揭穿大直实的计划……。</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/06/15/dd29d1.png" alt="电影海报"></p><h2 id="观后所思"><a href="#观后所思" class="headerlink" title="观后所思"></a>观后所思</h2><p><strong>即使时光流转，科技进步，量子世界瞬息万变，即使在你的世界已经失去了我，我依旧愿化作你为我找回的书签，不会说话的乌鸦，一直陪在你的身边。就算梦中的南天门可能永远都不会出现，我依旧不会放弃。拼上一切也要将你拯救，只为了在看一眼你的笑容。</strong></p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/06/15/fe0e0a.png" alt="拥抱"></p><p><strong>十年恍过，爱你如初</strong></p><p><strong>在坚书沉睡的那十年</strong></p><p><strong>琉璃从不会使用智能机</strong></p><p><strong>到为坚书创造新世界</strong></p><p><strong>从恐高小姑娘</strong></p><p><strong>到登上月球</strong></p><p><strong>爱给了坚书勇气挡下雷霆</strong></p><p><strong>爱也给了琉璃力量</strong></p><p><strong>创造一个有坚书的世界</strong></p><p><strong>“无论世界多么崩坏，我都只想再见到她的笑颜”</strong></p><p><strong>“终于做到了，坚书同学！”</strong></p><p><strong>某一天</strong></p><p><strong>你发现最痞的同学做了老师</strong></p><p><strong>最老实的同学成了痞子</strong></p><p><strong>最花心的学姐做起了全职妈妈</strong></p><p><strong>最美好的初恋做起了酒吧前台</strong></p><p><strong>当你发现曾经最好的兄弟聚在一块</strong></p><p><strong>他颤颤微微地敬你一杯酒还加了一个“您”字</strong></p><p><strong>你会不会觉得</strong></p><p><strong>这世界变得莫名其妙</strong></p><p><strong>这个世界在变，而我们，也在变。</strong></p><p><strong>我懂得最深刻的思念</strong></p><p><strong>不是难过到酒后哭喊着对方的名字</strong></p><p><strong>也不是整日整夜地想痛苦到失眠</strong></p><p><strong>而是这种感觉一直伴随着你</strong></p><p><strong>如影随形</strong></p><p><strong>渗透进生活的点点滴滴</strong></p><p><strong>仿佛早已不存在</strong></p><p><strong>却依然于午夜深入你梦揭穿你辛苦掩饰的太平</strong></p><p><strong>或是一个转身一个回眸</strong></p><p><strong>熟悉的场景让你压抑到喘不过气来</strong></p><p><strong>哭不出来</strong></p><p><strong>咽不下去</strong></p><p><strong>经久不散</strong></p><p><strong>我想你了啊</strong></p><p><strong>我好想奔赴有你的未来啊</strong></p><p><strong>喜欢清晨的美好与舒适</strong></p><p><strong>看霞光慢慢地升起</strong></p><p><strong>如音乐跳动在心湖里</strong></p><p><strong>是一日初始的新意</strong></p><p><strong>这世间幸福的事</strong></p><p><strong>莫过于清晨醒来便和阳光撞了个满怀</strong></p><p><strong>走在花开的陌上</strong></p><p><strong>看阳光穿过稠密的枝叶照在大地上</strong></p><p><strong>叽叽喳喳的小鸟在林中欢唱</strong></p><p><strong>田野里花儿草儿在朝阳中舒展</strong></p><p><strong>心中便藏着欢喜</strong></p><p><strong>只要你有一颗感知的心</strong></p><p><strong>便能沐浴阳光雨露</strong></p><p><strong>体味更多的幸福</strong></p><p><strong>生活最美的</strong></p><p><strong>是把普通的烟火过成精致</strong></p><p><strong>让每一个平凡的日子</strong></p><p><strong>都溢满欢喜</strong></p><p><strong>生活无需那么拥挤</strong></p><p><strong>柴米油盐酱醋茶</strong></p><p><strong>一半烟火</strong></p><p><strong>一半诗意</strong></p><p><strong>把平淡琐碎的日子</strong></p><p><strong>打理成喜欢的样子</strong></p><p><strong>也是一种能力</strong></p><p><strong>岁月渐深</strong></p><p><strong>别急着让心老去</strong></p><p><strong>无论岁月如何变迁</strong></p><p><strong>要保持年轻的心态</strong></p><p><strong>从容的过好生命的每一天</strong></p><p><strong>生活</strong></p><p><strong>或平淡</strong></p><p><strong>或绚烂</strong></p><p><strong>都装点着季节的诗行</strong></p><p><strong>面向太阳</strong></p><p><strong>内心安祥</strong></p><p><strong>立足于脚下</strong></p><p><strong>便能看到更美的远方</strong></p><p><strong>做一颗向阳的小草</strong></p><p><strong>默默的生长在角落里</strong></p><p><strong>虽平凡却无忧无虑</strong></p><p><strong>任凭风吹雨打</strong></p><p><strong>我自伫立</strong></p><p><strong>不依附</strong></p><p><strong>不攀爬</strong></p><p><strong>给这个世界带来了明亮的色调</strong></p><p><strong>和积极向上的力量</strong></p><p><strong>今天是新的一天</strong></p><p><strong>将温暖和善意</strong></p><p><strong>写在每一个清晨和黄昏</strong></p><p><strong>将光阴的花朵别在衣襟上</strong></p><p><strong>愿每一天都是生命中最美好的一天</strong></p><p><strong>即便岁月老去</strong></p><p><strong>心永远年轻</strong></p><p><strong>你好，世界。</strong></p><p><strong>你好，曾经，和未来的我们。</strong></p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/06/15/bd49fb.png" alt="end"></p>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E5%8A%A8%E6%BC%AB/">动漫</category>
      
      
      <category domain="https://www.chillg.de/tags/%E5%8A%A8%E6%BC%AB/">动漫</category>
      
      <category domain="https://www.chillg.de/tags/%E6%9D%82%E8%B0%88/">杂谈</category>
      
      
      <comments>https://www.chillg.de/posts/7821dc39.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>原神米游社自动签到</title>
      <link>https://www.chillg.de/posts/15a3aa2a.html</link>
      <guid>https://www.chillg.de/posts/15a3aa2a.html</guid>
      <pubDate>Fri, 28 May 2021 07:51:04 GMT</pubDate>
      
      <description>利用腾讯云函数实现米游社自动签到，微博超话签到</description>
      
      
      
      <content:encoded><![CDATA[<h1 id="原神社区自动签到"><a href="#原神社区自动签到" class="headerlink" title="原神社区自动签到"></a>原神社区自动签到</h1><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>有一说一，原神社区签到给的是真的少，而且还是签到与游戏分离，需要单独下载米游社 app，这就导致很容易忘签或根本不想签。奈何蚊子肉也是肉，如果能实现自动签到每个月也能得到少量原石、摩拉和紫色经验书。</p><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>本项目原为 GitHub 上开源项目，但前段时间 GitHub 不让用 aictions 挂脚本，于是本项目孕育而生。</p><p>项目作者<a href="https://www.yindan.me/cross.html">@yindan</a></p><h2 id="特性"><a href="#特性" class="headerlink" title="特性"></a>特性</h2><ul><li><strong>米游社原神每日签到</strong></li><li><strong>米游社国际版(HoYoLAB)原神每日签到</strong></li><li><strong>微博超话签到</strong> 支持任意 IP 签到</li><li><strong>原神超话功能</strong> 活动监测 + 领兑换码 + 多方推送</li><li><strong>支持订阅推送</strong> 可选多种订阅方式，每天将签到结果推送给用户</li><li><strong>支持多个账号</strong> 不同账号的 Cookie 值之间用<code>#</code>分隔，如：<code>&lt;cookie1&gt;#&lt;cookie2&gt;#&lt;cookie3&gt;</code></li><li><strong>支持多个角色</strong> 支持绑定官服和 B 站服的米游社账号</li></ul><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>本项目支持<code>Docker</code>、<code>PyPI</code>和云函数三种安装方式，本文选择云函数。</p><h3 id="下载必要文件"><a href="#下载必要文件" class="headerlink" title="下载必要文件"></a>下载必要文件</h3><p>首先先下载<a href="https://link.jscdn.cn/sharepoint/aHR0cHM6Ly9jb29sYXBrMjUwLW15LnNoYXJlcG9pbnQuY29tLzp1Oi9nL3BlcnNvbmFsL2FzYWt1c2hlbl96enl5Y2NfdG9wL0VZTkdRVjhUWnZ0THVfcmRSSXA4c2RBQncyOFNzQ2JlRndRZTFjTllBQWlEMFE_ZT1UVDJ0SWc.zip">genshinhelper-xxx-serverless.zip，点击次数可下载</a>压缩包备用。</p><h2 id="抓取必要参数"><a href="#抓取必要参数" class="headerlink" title="抓取必要参数"></a>抓取必要参数</h2><p>进入<a href="https://bbs.mihoyo.com/ys/">米游社 web 官网</a>，退出登陆的账号重新登录，按 F12 打开开发者，选择<code>Network</code>按 f5<img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/05/28/69691c.png" alt="抓包"></p><p>刷新页面，打开<code>ys\</code>后复制<code>cookies</code>所有内容备用</p><h2 id="部署云函数环境"><a href="#部署云函数环境" class="headerlink" title="部署云函数环境"></a>部署云函数环境</h2><h4 id="初始化"><a href="#初始化" class="headerlink" title="初始化"></a>初始化</h4><p>本文以<a href="https://cloud.tencent.com/product/scf">腾讯云</a>举例，先登陆后点击<a href="https://console.cloud.tencent.com/scf/">云函数控制台</a>，首次使用需要授权，扫码同意即可。</p><h4 id="新建函数服务"><a href="#新建函数服务" class="headerlink" title="新建函数服务"></a>新建函数服务</h4><ol><li>函数服务-&gt;新建<br><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/05/28/2169eb.png" alt="函数服务-&gt;新建"></li></ol><p>2 .自定义创建<br>选择自定义创建 名称自填其他默认即可</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/05/28/70a757.png" alt="自定义创建"></p><ol start="3"><li><p>上传 zip<br>按图所示上传刚刚下载的 zip 压缩包 执行方法默认</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/05/28/5c9d8e.png" alt="上传zip"></p></li><li><p>点击完成后自动跳转到云函数管理 等待部署完成</p></li></ol><h4 id="编辑函数配置"><a href="#编辑函数配置" class="headerlink" title="编辑函数配置"></a>编辑函数配置</h4><ol><li>编辑配置文件 点击图中编辑</li></ol><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/05/28/d5acfa.png" alt="编辑"></p><ol start="2"><li><p>修改执行超时时间为 300 秒</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/05/28/1c6b42.png" alt="运行时间"></p></li><li><p>再环境变量中添加之前抓的参数</p><p>key:<code>COOKIE_MIHOYOBBS</code> value 为之前抓取的 cookies</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/05/28/f59727.png" alt="环境变量"></p></li><li><p>提交保存</p></li></ol><h4 id="触发管理设置"><a href="#触发管理设置" class="headerlink" title="触发管理设置"></a>触发管理设置</h4><ol><li><p>打开触发管理</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/05/28/e2f419.png" alt="触发器"></p></li><li><p>如图创建定时触发器，名称随意，cron 为每日 00：01：00 执行，填写内容为<code>1 0 17 * * * *</code>Cron 当前以 UTC +8 中国标准时间 （China Standard Time）运行，即北京时间。</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/05/28/9aa901.png" alt="触发器设置"></p></li></ol><h4 id="至此全部配置完成"><a href="#至此全部配置完成" class="headerlink" title="至此全部配置完成"></a>至此全部配置完成</h4><h2 id="推送"><a href="#推送" class="headerlink" title="推送"></a>推送</h2><p>本项目支持多种推送方法，本文以 Server 酱的企业微信推送为例，将 Server 酱企业微信 SendKey 复制后以填入环境变量，key 为<code>SCTKEY</code></p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>再次感谢原作者<a href="https://www.yindan.me/cross.html">@yindan</a></p><p>感谢 XiaoMiku01 的 <a href="https://github.com/XiaoMiku01/miyoubiAuto">miyoubiAuto</a>.<br>感谢所有为此项目贡献代码的大佬们以及使用过该项目的小可爱：<br>@PomeloWang<br>@Celeter<br>@Arondight<br>@chenkid999<br>@xe5700<br>@Renari<br>@journey-ad<br>@aflyhorse<br>@thesadru<br>@PeterPanZH<br>@cainiaowu<br>@alwaysmiddle<br>@qianxu2001</p>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E6%95%99%E7%A8%8B/">教程</category>
      
      
      <category domain="https://www.chillg.de/tags/%E6%95%99%E7%A8%8B/">教程</category>
      
      <category domain="https://www.chillg.de/tags/%E5%8E%9F%E7%A5%9E/">原神</category>
      
      
      <comments>https://www.chillg.de/posts/15a3aa2a.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>哔哩哔哩助手</title>
      <link>https://www.chillg.de/posts/c079e252.html</link>
      <guid>https://www.chillg.de/posts/c079e252.html</guid>
      <pubDate>Mon, 21 Dec 2020 07:52:26 GMT</pubDate>
      
      <description>哔哩哔哩(B站)自动完成每日任务， 投币，点赞，直播签到，自动兑换银瓜子为硬币，自动送出即将过期礼物，漫画App签到，大会员领取B币卷等。每天获得65点经验，助你快速升级到Lv6</description>
      
      
      
      <content:encoded><![CDATA[<h1 id="Bilibili-助手"><a href="#Bilibili-助手" class="headerlink" title="Bilibili 助手"></a>Bilibili 助手</h1><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>哔哩哔哩(B 站)自动完成每日任务， 投币，点赞，直播签到，自动兑换银瓜子为硬币，自动送出即将过期礼物，漫画 App 签到，大会员领取 B 币卷等。每天获得 65 点经验，助你快速升级到 Lv6。</p><h2 id="功能"><a href="#功能" class="headerlink" title="功能"></a>功能</h2><ul><li><input checked="" disabled="" type="checkbox"> 自动获取经验(投币、点赞、分享视频)</li><li><input checked="" disabled="" type="checkbox"> 直播辅助(直播签到，自动送出即将过期的礼物)</li><li><input checked="" disabled="" type="checkbox"> 自动兑换银瓜子为硬币</li><li><input checked="" disabled="" type="checkbox"> 自动领取年度大会员每月权益(每月 1 号领取 B 币劵、权益礼包)</li><li><input checked="" disabled="" type="checkbox"> 月底自动用 B 币卷给自己充电(每月 28 号)</li><li><input checked="" disabled="" type="checkbox"> 月底自动用 B 币卷兑换金瓜子(每月 28 号)</li><li><input checked="" disabled="" type="checkbox"> 漫画辅助脚本(漫画 APP 签到)</li><li><input checked="" disabled="" type="checkbox"> 支持功能自定义(自定义投币数量，银瓜子兑换硬币开关等)</li><li><input checked="" disabled="" type="checkbox"> 账户失效提醒(发送到你的微信或者钉钉提醒、邮箱提醒)</li><li><input checked="" disabled="" type="checkbox"> 支持多种方式推送运行结果(钉钉、微信)本文介绍微信推送</li></ul><h2 id="使用方法"><a href="#使用方法" class="headerlink" title="使用方法"></a>使用方法</h2><h3 id="1-介绍"><a href="#1-介绍" class="headerlink" title="1.介绍"></a>1.介绍</h3><p>本项目是<a href="https://github.com/srcrs">@srcrs</a>在 GitHub 上的开源项目（原作者也有使用手册，本篇博客也大量引用参考原作者的使用手册，但面向纯新手，对于 GitHub 也不知道的用户也能按照本文做出自己的助手。）所以需要先注册 GitHub 账号，<a href="https://github.com/join?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=/&source=header-home">点击此处前往注册</a></p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/05/02/4f5b13.png" alt="注册.png"><br>按照图片进行注册，稍后会收到邮箱确认后登录即可，不需要额外操作。</p><h3 id="2-fork"><a href="#2-fork" class="headerlink" title="2.fork"></a>2.fork</h3><p>先点击项目地址<a href="https://github.com/srcrs/BilibiliTask">BilibiliTask</a><br>进去后点击右上角 fork<img src="https://jsd.cdn.zzko.cn/gh/Asakushen/pic/2021/05/02/6173ca.png" alt="FORK.png"><br>稍作等待会进入到跟刚才差不多的界面 但左上角是你的名字 就是图片中的蓝色打码区域<br><img src="https://jsd.cdn.zzko.cn/gh/Asakushen/pic/2021/05/02/6608dc.png" alt="fork后.png"></p><h3 id="3-设置参数"><a href="#3-设置参数" class="headerlink" title="3.设置参数"></a>3.设置参数</h3><h4 id="抓取参数"><a href="#抓取参数" class="headerlink" title="抓取参数"></a>抓取参数</h4><p>电脑登陆哔哩哔哩后再任意界面抓包获得 cookie 中的 BILI_JCT DEDEUSERID SESSDATA 这三个参数，具体操作方法如下：</p><p>再 b 站任意界面按按 F12→Application→Cookies 具体的参考下图<img src="https://jsd.cdn.zzko.cn/gh/Asakushen/pic/2021/05/02/688ae4.png" alt="抓包.png"></p><p>其中 name 就是参数名，后面的 value 就是我们需要的参数值，挨个复制备用即可。</p><h4 id="填写参数"><a href="#填写参数" class="headerlink" title="填写参数"></a>填写参数</h4><p>点击蓝框中的 setting<img src="https://jsd.cdn.zzko.cn/gh/Asakushen/pic/2021/05/02/69bf98.png" alt="setting.png"></p><p>再点击 Srcrets 进去后创建参数</p><p><img src="https://jsd.cdn.zzko.cn/gh/Asakushen/pic/2021/05/02/0976d7.png" alt="secr.png"></p><p>黑色框框你们应该是没有的，这是我填完参数后才出现的，按照图片中顺序点击即可。</p><p>分别创建三个 secrets</p><p><img src="https://jsd.cdn.zzko.cn/gh/Asakushen/pic/2021/05/02/8e3d6e.png" alt="参数.jpg"></p><p>按照作者给的名字命名，按照你刚刚抓到的的值填入即可。</p><h3 id="4-开启-actions"><a href="#4-开启-actions" class="headerlink" title="4.开启 actions"></a>4.开启 actions</h3><p>点击 actions<img src="https://jsd.cdn.zzko.cn/gh/Asakushen/pic/2021/05/02/46312e.png" alt="act.png"></p><p>然后再点击绿色的长条按钮即可，由于我这边已经开启了所以没配图。</p><h3 id="5-进行一次-push-操作"><a href="#5-进行一次-push-操作" class="headerlink" title="5.进行一次 push 操作"></a>5.进行一次 push 操作</h3><p>默认 push 操作会触发工作流运行。打开 README.md，将里面的 😄 删除一个即可</p><p>这里引用作者文档里的 gif</p><p><img src="https://jsd.cdn.zzko.cn/gh/Asakushen/pic/2021/05/02/c464fa.png" alt="进行一次push操作.gif">查看 actions，显示对勾就说明运行成功了。以后会在每天的<code>10：30</code>执行，自动完成每日任务。</p><p><img src="https://jsd.cdn.zzko.cn/gh/Asakushen/pic/2021/05/02/22e458.png" alt="运行结果.gif"></p><h2 id="进阶教程（见作者文档）"><a href="#进阶教程（见作者文档）" class="headerlink" title="进阶教程（见作者文档）"></a>进阶教程（见作者文档）</h2><h3 id="1-更改配置文件"><a href="#1-更改配置文件" class="headerlink" title="1.更改配置文件"></a>1.更改配置文件</h3><h3 id="2-将运行结果推送到微信"><a href="#2-将运行结果推送到微信" class="headerlink" title="2.将运行结果推送到微信"></a>2.将运行结果推送到微信</h3><h3 id="3-自定义程序运行时间"><a href="#3-自定义程序运行时间" class="headerlink" title="3.自定义程序运行时间"></a>3.自定义程序运行时间</h3><p>（本文部分图文来自于原作者文档，图片除特别声明外均原创）</p>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E6%95%99%E7%A8%8B/">教程</category>
      
      
      <category domain="https://www.chillg.de/tags/%E6%95%99%E7%A8%8B/">教程</category>
      
      <category domain="https://www.chillg.de/tags/%E5%93%94%E5%93%A9%E5%93%94%E5%93%A9/">哔哩哔哩</category>
      
      
      <comments>https://www.chillg.de/posts/c079e252.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>C语言学习（一）</title>
      <link>https://www.chillg.de/posts/8bf9a11e.html</link>
      <guid>https://www.chillg.de/posts/8bf9a11e.html</guid>
      <pubDate>Thu, 19 Nov 2020 11:38:04 GMT</pubDate>
      
      <description>某菜鸟的C语言学习日志</description>
      
      
      
      <content:encoded><![CDATA[<h1 id="C语言学习笔记"><a href="#C语言学习笔记" class="headerlink" title="C语言学习笔记"></a>C语言学习笔记</h1><p>C语言也学习了一个多月了，从最开始的什么都不会到现在能简单写一些简单代码，感觉收获很多，也来总结一下最近遇到的一些题目吧。</p><h2 id="数组的删除"><a href="#数组的删除" class="headerlink" title="数组的删除"></a>数组的删除</h2><p>[问题描述]<br>有5个整型数据存储在数组中，再输入一个数值key，删除数组中第1个等于key的元素，并将剩余的4个数据输出。如果key不是数组中的元素，则显示not found。</p><h4 id="分析"><a href="#分析" class="headerlink" title="分析"></a>分析</h4><p>本题中查找第一个重复元素并删除它，显然我们不能直接删除数组中的某个元素，但可以移动它，把目标移动到数组末尾，最后的输出不输出它即可。</p><h4 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="type">int</span> a[<span class="number">5</span>],k,i,j,temp,index=<span class="number">0</span>;<span class="comment">//temp为中间变量，index为初始值赋为0</span></span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;<span class="number">5</span>;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>,&amp;a[i]);</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>,&amp;k);</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;<span class="number">5</span>;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(a[i]==k)<span class="comment">//判断k值与数组中是否有重复</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(j=i;j&lt;<span class="number">5</span>;j++)</span><br><span class="line">&#123;</span><br><span class="line">a[j]=a[j+<span class="number">1</span>];<span class="comment">//依次往后移动一个位置</span></span><br><span class="line">index=<span class="number">-1</span>;<span class="comment">//改变初始值用于判断是否进入该循环</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">break</span>;<span class="comment">//跳出第一个循环，因为只删除第一个重复的数值</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(index==<span class="number">0</span>)</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;not found&quot;</span>);</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;<span class="number">4</span>;i++)<span class="comment">//最多只输出到a[3]</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;%d &quot;</span>,a[i]);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="斐波拉契数列（数组）"><a href="#斐波拉契数列（数组）" class="headerlink" title="斐波拉契数列（数组）"></a>斐波拉契数列（数组）</h2><p>[问题描述]<br>如果1对兔子第三月开始每月能生一对小兔子，而每对小兔子在它出生后的第3个月开始，又能生1对小兔子，假定在不发生死亡的情况下，n个月后有多少对兔子？ n值通过键盘输入。<br>‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪ [输入输出示例]<br>  输出在一行，每个数字占6位宽度。</p><h4 id="分析-1"><a href="#分析-1" class="headerlink" title="分析"></a>分析</h4><p>根据问题描述可知斐波拉契数列a1&#x3D;a2&#x3D;1，a3&#x3D;2 a4&#x3D;3 a5&#x3D;5 a6&#x3D;8……<br>经观察易得，从第三项起，每一项是前两项之和，即a3&#x3D;a2+a1，a4&#x3D;a3+a2，a5&#x3D;a4+a3，根据这个规律即可用数组写出本题。</p><h4 id="代码-1"><a href="#代码-1" class="headerlink" title="代码"></a>代码</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="type">int</span> n,i;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>,&amp;n);</span><br><span class="line"><span class="type">int</span> a[<span class="number">100</span>];</span><br><span class="line">a[<span class="number">0</span>]=a[<span class="number">1</span>]=<span class="number">1</span>; <span class="comment">//a1=a2=1</span></span><br><span class="line"></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">2</span>; i&lt;n; i++) <span class="comment">//从第三项起开始进入循环，直到i=n-1时退出循环</span></span><br><span class="line">&#123;</span><br><span class="line">a[i]=a[i<span class="number">-2</span>]+a[i<span class="number">-1</span>]; <span class="comment">//每一项都是前两项之和</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;n;i++)<span class="comment">//从第一项开始进入循环</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;%6d &quot;</span>,a[i]);<span class="comment">//打印所有项</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="查找数组的最大值与最小值"><a href="#查找数组的最大值与最小值" class="headerlink" title="查找数组的最大值与最小值"></a>查找数组的最大值与最小值</h2><h4 id="分析-2"><a href="#分析-2" class="headerlink" title="分析"></a>分析</h4><p>想要找出数组中最大值最小值我们可以先将max,min赋值成任意数组内一个数，然后进入循环开始比较每一项，如果任意一项大于等于max，则重新将此时的数赋值给max，min同理直到比较完数组最后一个数时退出循环。</p><h4 id="代码-2"><a href="#代码-2" class="headerlink" title="代码"></a>代码</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"> <span class="meta">#<span class="keyword">include</span><span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"> <span class="type">int</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line"> &#123;</span><br><span class="line"> <span class="type">int</span> a[<span class="number">10</span>],i,max,min;</span><br><span class="line"> <span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;<span class="number">10</span>;i++)</span><br><span class="line"> <span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>,&amp;a[i]); <span class="comment">//输入数字存入数组</span></span><br><span class="line"> max=min=a[<span class="number">0</span>]; <span class="comment">//将数组第一个数赋值给max和min</span></span><br><span class="line"> <span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;<span class="number">10</span>;i++) <span class="comment">//进入循环逐个比较与max,min大小关系</span></span><br><span class="line"> &#123;</span><br><span class="line"> <span class="keyword">if</span>(max&lt;=a[i])</span><br><span class="line"> max=a[i]; <span class="comment">//如果某一项大于等于max，则重新赋值给max</span></span><br><span class="line"> <span class="keyword">if</span>(min&gt;=a[i])</span><br><span class="line"> min=a[i];<span class="comment">//如果某一项小于等于min,重新赋值</span></span><br><span class="line"> &#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;max=%d\nmin=%d&quot;</span>,max,min)</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125; </span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="约瑟夫问题"><a href="#约瑟夫问题" class="headerlink" title="约瑟夫问题"></a>约瑟夫问题</h2><p>[问题描述]</p><p>模拟这个游戏。有n个人围成一圈，从第一个人开始沿顺时针方向报数（从1到3报数），   凡报到3的人退出圈子，问最后留下的是原来第几号的那个人?</p><h4 id="分析-3"><a href="#分析-3" class="headerlink" title="分析"></a>分析</h4><p>本题需要一个”计数”变量来计数，我们考虑用计数到3时把此时的a[i]赋值成0，下次计数时跳过0，不断循环直到数组中只有一个非零数时，该数的下标就是我们需要的。</p><h4 id="代码-3"><a href="#代码-3" class="headerlink" title="代码"></a>代码</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span> </span><br><span class="line">&#123;</span><br><span class="line"><span class="type">int</span> n,a[<span class="number">100</span>],i,count=<span class="number">0</span>,x;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>,&amp;n);</span><br><span class="line">x=n;<span class="comment">//x判断最终数组内还有几个非零元素</span></span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">&#123;</span><br><span class="line">a[i]=i;<span class="comment">//让数组按照123456排好</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">while</span>(x&gt;<span class="number">1</span>)</span><br><span class="line">    &#123;</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">&#123;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(a[i]!=<span class="number">0</span>)<span class="comment">//跳过0</span></span><br><span class="line">count++;<span class="comment">//计数</span></span><br><span class="line"><span class="keyword">if</span>(count==<span class="number">3</span>) </span><br><span class="line">&#123;</span><br><span class="line">a[i]=<span class="number">0</span>;<span class="comment">//每次到3时就“删除”这个数组</span></span><br><span class="line">count=<span class="number">0</span>;<span class="comment">//计数归零</span></span><br><span class="line">x--;<span class="comment">//数组非零元素-1，最终循环到x=1时结束。</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">1</span>; i&lt;=n; i++) </span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(a[i]!=<span class="number">0</span>)</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;%d&quot;</span>,i);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="选择排序法（升序）"><a href="#选择排序法（升序）" class="headerlink" title="选择排序法（升序）"></a>选择排序法（升序）</h2><p>交换排序发顾名思义就是不断交换从而排序</p><h4 id="分析-4"><a href="#分析-4" class="headerlink" title="分析"></a>分析</h4><p>若干个数，若想排序我们可以只考虑相邻两个数的大小，如果所有相邻的俩个数都是小数在前大数在后那么整个数组都是按照升序排列了。</p><h4 id="代码-4"><a href="#代码-4" class="headerlink" title="代码"></a>代码</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="type">int</span> a[<span class="number">10</span>],i,j,temp;<span class="comment">//temp为中间值，目的是交换两个数组</span></span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;<span class="number">10</span>;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>,&amp;a[i]);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;<span class="number">10</span>;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(j=i+<span class="number">1</span>;j&lt;<span class="number">10</span>;j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(a[i]&gt;a[j])<span class="comment">//前后两个数进行比较，如果后面的数大就交换他们</span></span><br><span class="line">&#123;</span><br><span class="line">temp=a[j];</span><br><span class="line">a[j]=a[i];</span><br><span class="line">a[i]=temp;<span class="comment">//用temp值做中间值</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;<span class="number">10</span>;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;%d &quot;</span>,a[i]);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="冒泡排序法"><a href="#冒泡排序法" class="headerlink" title="冒泡排序法"></a>冒泡排序法</h2><p><del>待补充</del></p><h2 id="快速排序法"><a href="#快速排序法" class="headerlink" title="快速排序法"></a>快速排序法</h2><p><del>待补充</del></p><h2 id="杨辉三角（二维数组）"><a href="#杨辉三角（二维数组）" class="headerlink" title="杨辉三角（二维数组）"></a>杨辉三角（二维数组）</h2><p>杨辉三角在我们高中时已经学习过，我们都知道它是个类金字塔型，但为了简单化我们将其变形为等腰直角三角形，此时的图形如下图所示。<br><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/05/02/30ff95.png" alt="杨辉三角"></p><h4 id="分析-5"><a href="#分析-5" class="headerlink" title="分析"></a>分析</h4><p>观察可知，这个等腰直角三角形的竖直的腰和斜边都是1，剩下的数总是它上方的及上方左边数之和，根据次规律考虑使用二维数组来进行编程。</p><h4 id="代码-5"><a href="#代码-5" class="headerlink" title="代码"></a>代码</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="type">int</span> a[<span class="number">100</span>][<span class="number">100</span>],n,i,j;<span class="comment">//n为键盘输入，限定杨辉三角的腰长</span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>,&amp;n);</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(j=<span class="number">0</span>;j&lt;=i;j++)<span class="comment">//小于等于是因为最后一行和第一竖列个数相等</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(i==j||j==<span class="number">0</span>)<span class="comment">//判断竖直的腰和斜边</span></span><br><span class="line">a[i][j]=<span class="number">1</span>;<span class="comment">//赋值为1</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">a[i][j]=a[i<span class="number">-1</span>][j]+a[i<span class="number">-1</span>][j<span class="number">-1</span>];<span class="comment">//其余的为上方数加上方左边数</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(j=<span class="number">0</span>;j&lt;=i;j++)</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;%4d&quot;</span>,a[i][j]);<span class="comment">//打印</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="九九乘法表"><a href="#九九乘法表" class="headerlink" title="九九乘法表"></a>九九乘法表</h2><p>小学我们一定背过九九乘法表，我们用已学知识将其打印出来也是件非常有意思的事情。</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/05/02/7610f8.png" alt="九九乘法表"></p><h4 id="分析-6"><a href="#分析-6" class="headerlink" title="分析"></a>分析</h4><p>观察上图可知竖列从1X1一直到1x9，横列从1xa一直到aXa.</p><h4 id="代码-6"><a href="#代码-6" class="headerlink" title="代码"></a>代码</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="type">int</span> a[<span class="number">9</span>],i,j,s,n; <span class="comment">//s为a*b的和，n为最高输入到n*n结束</span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>,&amp;n);</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">1</span>;i&lt;=n;i++)<span class="comment">//从1开始，因为是1*a</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(j=<span class="number">1</span>;j&lt;=i;j++)</span><br><span class="line">&#123;</span><br><span class="line">s=i*j;<span class="comment">//求出和方便后面输出</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;%d*%d=%d&quot;</span>,j,i,s);</span><br><span class="line"><span class="keyword">if</span>(j!=i)<span class="comment">//每一行最后一个不需要空格</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot; &quot;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(i!=n)<span class="comment">//最后一行下面没有换行。</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;\n&quot;</span>); </span><br><span class="line">&#125;</span><br><span class="line"> &#125; </span><br></pre></td></tr></table></figure><h2 id="顺序查找法"><a href="#顺序查找法" class="headerlink" title="顺序查找法"></a>顺序查找法</h2><p> 在含有10个数的数列{11,22,5,16,8,3,19,20,23,52}中查找key值，若找到key则输出其在数组中对应的下标，否则输出not found</p><h4 id="分析-7"><a href="#分析-7" class="headerlink" title="分析"></a>分析</h4><p>顺序查找顾名思义就是按照顺序挨个查找数组中的每一个元素，直到找到时输出即可，若找完整个数组还没找到就是not found。</p><h4 id="代码-7"><a href="#代码-7" class="headerlink" title="代码"></a>代码</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="type">int</span> a[<span class="number">10</span>]=&#123;<span class="number">11</span>,<span class="number">22</span>,<span class="number">5</span>,<span class="number">16</span>,<span class="number">8</span>,<span class="number">3</span>,<span class="number">19</span>,<span class="number">20</span>,<span class="number">23</span>,<span class="number">52</span>&#125;,i,k,index=<span class="number">-1</span>; <span class="comment">//k为需要查找的值，index为初始值，方便后面判断</span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>,&amp;k);</span><br><span class="line"><span class="keyword">for</span>(i=<span class="number">0</span>;i&lt;<span class="number">10</span>;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(a[i]==k)<span class="comment">//判断数组每个元素与k值是否相等</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;%d&quot;</span>,i);<span class="comment">//判断成立输出数组下标</span></span><br><span class="line">index=<span class="number">0</span>;<span class="comment">//改变初始值，代表判断成立已经找到</span></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(index!=<span class="number">0</span>)<span class="comment">//仅当上方判断语句从未成立时，代表数组中不存在要查找的值</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;not found&quot;</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="二分（折半）查找法"><a href="#二分（折半）查找法" class="headerlink" title="二分（折半）查找法"></a>二分（折半）查找法</h2><p>接着我们学习了效率更高的二分（折半）查找法，假如有1，3，5，7，11，13，17，19，23，29，31，37，41，43，47，53，56这么一组数，我们尝试使用该方法查找。注意，二分查找只能用于<strong>有序</strong>的数组进行查找。这里用升序数组举例，降序也是一个道理。</p><p>二分查找原理用文字很难讲清楚，我引用网络上的一张动图方便理解，也可以对比一下顺序查找和二分查找效率。</p><p><img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/05/02/d0067c.png" alt="二分查找"></p><p>​                                                                                                <em>图片来源于水印，仅用于学习交流，不用于商业用途，如侵权请联系我删除。</em></p><h4 id="分析-8"><a href="#分析-8" class="headerlink" title="分析"></a>分析</h4><p>按照动图为例查找37；刚开始不确定37在哪，所以整个数组都是查找区，low&#x3D;0，high&#x3D;16，mid&#x3D;8；因为8对应的a[8]&#x3D;23&lt;37,所以37在a[8]右边，此时low&#x3D;mid+1&#x3D;9，查找区由整个数组变为a[9]-a[16]；mid&#x3D;12*（mid为整型）*，a[12]&#x3D;41&gt;37;所以high变成了11；查找区也变成了a[9]-a[11];mid&#x3D;10；a[10]&#x3D;31&lt;37，low&#x3D;11，mid&#x3D;11,a[11]&#x3D;37,，于是我们就找到了查找数37.处于数组11号。</p><h4 id="代码-8"><a href="#代码-8" class="headerlink" title="代码"></a>代码</h4><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="type">int</span> a[<span class="number">17</span>]= &#123;<span class="number">1</span>，<span class="number">3</span>，<span class="number">5</span>，<span class="number">7</span>，<span class="number">11</span>，<span class="number">13</span>，<span class="number">17</span>，<span class="number">19</span>，<span class="number">23</span>，<span class="number">29</span>，<span class="number">31</span>，<span class="number">37</span>，<span class="number">41</span>，<span class="number">43</span>，<span class="number">47</span>，<span class="number">53</span>，<span class="number">56</span>&#125;,k,low,mid,high,index;<span class="comment">//k值为需要查找的值，low,mid,high分别为查找区最小,中间,最大下标。index为初始值方面后面判断是否查找到。</span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>,&amp;k);<span class="comment">//输入需要查找的数</span></span><br><span class="line">low = <span class="number">0</span>;</span><br><span class="line">high = <span class="number">15</span>;<span class="comment">//刚开始是查找区为整个数组，所以最小和最大为0与1</span></span><br><span class="line">index = <span class="number">-1</span>;<span class="comment">//初始值赋值为-1防止与下标冲突</span></span><br><span class="line"><span class="keyword">while</span>(low&lt;=high)<span class="comment">//当low个high值错位时，退出循环（此时查找区为空，要么找到了要么不存在）</span></span><br><span class="line">&#123;</span><br><span class="line">mid=(low+high) / <span class="number">2</span>;<span class="comment">//计算中间下标</span></span><br><span class="line"><span class="keyword">if</span> (a[mid]==k)<span class="comment">//如果查找区的中间的那个数等于k说明已经找到</span></span><br><span class="line">&#123;</span><br><span class="line">index = mid;<span class="comment">//初始值赋值成找到的那个数组下标</span></span><br><span class="line"><span class="keyword">break</span>;<span class="comment">//跳出循环</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (a[mid]&gt;k)<span class="comment">//如果查找区中间值的数大于查找的数，说明查找数在中间值左侧，考虑缩小查找区进一步确定查找数位置</span></span><br><span class="line">high = mid - <span class="number">1</span>;<span class="comment">//缩小查找区</span></span><br><span class="line"><span class="keyword">if</span> (a[mid]&lt;k)<span class="comment">//如果查找区中间值的数小于查找的数，说明查找数在中间值右侧，考虑缩小查找区进一步确定查找数位置</span></span><br><span class="line">low = mid + <span class="number">1</span>;<span class="comment">//缩小查找区</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span> (index!=<span class="number">-1</span>)<span class="comment">//如果初始值一直都为-1。说明上方判断语句不成立，说明待查找的数不在数组中，输出not found，如果不等于-1。，说明判断语句成立，此时index值就为数组中该查找数的下标 </span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;%d&quot;</span>,mid);</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;not found&quot;</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E5%AD%A6%E4%B9%A0/">学习</category>
      
      
      <category domain="https://www.chillg.de/tags/%E7%AC%94%E8%AE%B0/">笔记</category>
      
      <category domain="https://www.chillg.de/tags/C-C/">C/C++</category>
      
      
      <comments>https://www.chillg.de/posts/8bf9a11e.html#disqus_thread</comments>
      
    </item>
    
    <item>
      <title>Markdown教程</title>
      <link>https://www.chillg.de/posts/31604.html</link>
      <guid>https://www.chillg.de/posts/31604.html</guid>
      <pubDate>Tue, 10 Nov 2020 05:00:14 GMT</pubDate>
      
      <description>0基础带你入门Markdown语法，实现高效文本录入</description>
      
      
      
      <content:encoded><![CDATA[<h1 id="Markdown-语法"><a href="#Markdown-语法" class="headerlink" title="Markdown 语法"></a>Markdown 语法</h1><p>本博客网站所有内容均以 Markdown 编写。</p><blockquote><p>Markdown 是一种轻量级标记语言，创始人为约翰·格鲁伯（英语：John Gruber）。 它允许人们使用易读易写的纯文本格式编写文档，然后转换成有效的 XHTML（或者 HTML）文档。这种语言吸收了很多在电子邮件中已有的纯文本标记的特性。</p></blockquote><p>所以非常受欢迎。<br>首先是是标题，标题用</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># 内容</span></span><br></pre></td></tr></table></figure><p>例如:</p><h1 id="标题-1"><a href="#标题-1" class="headerlink" title="标题 1"></a>标题 1</h1><p>当然你最多可以输入 6 个#<br>例如:</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">###### 标题 6</span></span><br></pre></td></tr></table></figure><h6 id="标题-6"><a href="#标题-6" class="headerlink" title="标题 6"></a>标题 6</h6><hr><p>当然你会发现上面多了 2 个奇怪的框框，这个框框是代码框，这也很容易实现。只需要在不想输入代码的前后分别加上&#96;&#96;&#96;，记得换行（回车）<br>就像这样</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"></span><br></pre></td></tr></table></figure><p>这句话上下分别都有<br>​&#96;&#96;&#96;</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"></span><br></pre></td></tr></table></figure><h2 id="引用"><a href="#引用" class="headerlink" title="引用"></a>引用</h2><p>md 也可以做出引用，在引用文前输入&gt;和空格</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="quote">&gt; 这句话是引用</span></span><br></pre></td></tr></table></figure><blockquote><p>这句话是引用</p></blockquote><p>当然你可以在一个&gt;下方多加一个&gt;可以实现缩进。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="quote">&gt; 这是第一个引用</span></span><br><span class="line"><span class="quote">&gt;</span></span><br><span class="line"><span class="quote">&gt; &gt; 这是第二个引用</span></span><br></pre></td></tr></table></figure><blockquote><p>这是第一个引用</p><blockquote><p>这是第二个引用</p></blockquote></blockquote><hr><p>上方这个分割线只需要加三个减号即 - 即可</p><h2 id="斜体-加粗-斜体加粗-删除线"><a href="#斜体-加粗-斜体加粗-删除线" class="headerlink" title="斜体&amp;加粗&amp;斜体加粗&amp;删除线"></a>斜体&amp;加粗&amp;斜体加粗&amp;删除线</h2><p>文字的<em>斜体</em>和<strong>加粗</strong>以及 <strong><em>斜体并加粗</em></strong> 只需要在文字前后分别加一个、二个和三个*</p><p><del>删除线</del>只需要加在文字前后加上两个~</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="emphasis">_斜体_</span> <span class="strong">**加粗**</span> <span class="strong">**<span class="emphasis">_斜体加粗_</span>**</span> ~~删除~~</span><br></pre></td></tr></table></figure><p><em>斜体</em> and <strong>加粗</strong> and <strong><em>斜体加粗</em></strong> and <del>删除</del></p><h2 id="超链接"><a href="#超链接" class="headerlink" title="超链接"></a>超链接</h2><p>md 也可以实现超链接，比如<a href="http://2333.fit/">我的博客</a></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">点击[<span class="string">百度</span>](<span class="link">http://www.baidu.com</span>)跳转搜索</span><br></pre></td></tr></table></figure><p>点击<a href="http://www.baidu.com/">百度</a>跳转搜索</p><h2 id="插入图片"><a href="#插入图片" class="headerlink" title="插入图片"></a>插入图片</h2><p>md 支持三种插入图片的方式，分别是相对路径，绝对路径，网络图片。<br>我主要说一下网络图片的插入方式，本地同理。<img src="https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/05/02/56e345.png" alt="img"></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">![<span class="string"> img</span>](<span class="link">https://cdn.jsdmirror.com/gh/Asakushen/pic/2021/05/02/56e345.png</span>))</span><br></pre></td></tr></table></figure><p>这里括号里的是图片的直链，推荐使用<a href="https://pic.2333.fit/">浅草图床</a>或<a href="https://sm.ms/">sm.ms</a>两个图床。</p><h2 id="排序"><a href="#排序" class="headerlink" title="排序"></a>排序</h2><ol><li>有序排序</li><li>无序排序</li><li>就像这样</li></ol><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">1.</span> 第一行</span><br><span class="line"><span class="bullet">2.</span> 第二行</span><br></pre></td></tr></table></figure><p>后面直接按回车就行。<br>还有一中无序排序</p><ul><li>这就是无序排序</li></ul><ul><li>就像这样</li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> 这就是无序排序</span><br><span class="line"></span><br><span class="line"><span class="bullet">*</span> 就像这样</span><br></pre></td></tr></table></figure><p>这里+和-都可以，两种排序都可以缩进</p><h2 id="任务清单"><a href="#任务清单" class="headerlink" title="任务清单"></a>任务清单</h2><ul><li><input disabled="" type="checkbox"> 未完成</li><li><input checked="" disabled="" type="checkbox"> 已完成</li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> [ ] 未完成</span><br><span class="line"><span class="bullet">-</span> [x] 已完成</span><br></pre></td></tr></table></figure>]]></content:encoded>
      
      
      <category domain="https://www.chillg.de/categories/%E6%95%99%E7%A8%8B/">教程</category>
      
      
      <category domain="https://www.chillg.de/tags/%E6%95%99%E7%A8%8B/">教程</category>
      
      <category domain="https://www.chillg.de/tags/Markdown/">Markdown</category>
      
      
      <comments>https://www.chillg.de/posts/31604.html#disqus_thread</comments>
      
    </item>
    
  </channel>
</rss>
