[tkinter实现]汉字笔顺小软件

软件简介

本软件旨在帮助小学生通过互动式学习掌握汉字的基本笔画和笔顺。软件采用Tkinter库构建,提供了一个用户友好的图形界面,适合小学生使用。

主要功能:

  1. 汉字展示:软件能够展示单个汉字,并以动画形式演示其标准笔画顺序。
  2. 笔顺学习:通过动态图示,学生可以学习每个汉字的正确笔顺,加强记忆。
  3. 读音练习:软件提供汉字的标准读音。
  4. 笔画数统计:展示每个汉字的笔画数,加深学生对汉字结构的认识。

技术实现:

  • 本软件使用Python语言开发,利用Tkinter库创建图形用户界面。
  • 汉字笔顺动画和读音数据来源于汉字数据库,确保信息的准确性。
  • 软件设计注重用户体验,界面简洁,操作直观。

效果展示:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

源码

class WinGUI(tk.Tk):
    def __init__(self):
        super().__init__()
        self.__win()
        self.tk_tabs_menu = self.__tk_tabs_menu(self)
        self.tk_text_koujue = self.__tk_text_koujue(self.tk_tabs_menu_4)
        self.tk_text_ext_rule = self.__tk_text_ext_rule(self.tk_tabs_menu_3)
        self.tk_text_common_rule = self.__tk_text_common_rule(self.tk_tabs_menu_2)
        self.tk_label_bihua_name_image = self.__tk_label_bihua_name_image(self.tk_tabs_menu_1)
        self.tk_text_title = self.__tk_text_title(self.tk_tabs_menu_0)
        self.tk_input_search_chinese = self.__tk_input_search_chinese(self.tk_tabs_menu_0)
        self.tk_button_search_btn = self.__tk_button_search_btn(self.tk_tabs_menu_0)
        self.tk_text_bihua_num = self.__tk_text_bihua_num(self.tk_tabs_menu_0)
        self.tk_text_pinyin = self.__tk_text_pinyin(self.tk_tabs_menu_0)
        self.tk_label_bishun_img = self.__tk_label_bishun_img(self.tk_tabs_menu_0)
        self.tk_button_pre_img = self.__tk_button_pre_img(self.tk_tabs_menu_0)
        self.tk_button_next_img = self.__tk_button_next_img(self.tk_tabs_menu_0)
        self.bihua_num = 0
        self.current_tile = -1

    def __win(self):
        self.title("汉字笔画工具")
        # 设置窗口大小、居中
        width = 500
        height = 400
        screenwidth = self.winfo_screenwidth()
        screenheight = self.winfo_screenheight()
        geometry = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2)
        self.geometry(geometry)

        self.resizable(width=False, height=False)

    def scrollbar_autohide(self, vbar, hbar, widget):
        """自动隐藏滚动条"""

        def show():
            if vbar: vbar.lift(widget)
            if hbar: hbar.lift(widget)

        def hide():
            if vbar: vbar.lower(widget)
            if hbar: hbar.lower(widget)

        hide()
        widget.bind("<Enter>", lambda e: show())
        if vbar: vbar.bind("<Enter>", lambda e: show())
        if vbar: vbar.bind("<Leave>", lambda e: hide())
        if hbar: hbar.bind("<Enter>", lambda e: show())
        if hbar: hbar.bind("<Leave>", lambda e: hide())
        widget.bind("<Leave>", lambda e: hide())

    def v_scrollbar(self, vbar, widget, x, y, w, h, pw, ph):
        widget.configure(yscrollcommand=vbar.set)
        vbar.config(command=widget.yview)
        vbar.place(relx=(w + x) / pw, rely=y / ph, relheight=h / ph, anchor='ne')

    def h_scrollbar(self, hbar, widget, x, y, w, h, pw, ph):
        widget.configure(xscrollcommand=hbar.set)
        hbar.config(command=widget.xview)
        hbar.place(relx=x / pw, rely=(y + h) / ph, relwidth=w / pw, anchor='sw')

    def create_bar(self, master, widget, is_vbar, is_hbar, x, y, w, h, pw, ph):
        vbar, hbar = None, None
        if is_vbar:
            vbar = Scrollbar(master)
            self.v_scrollbar(vbar, widget, x, y, w, h, pw, ph)
        if is_hbar:
            hbar = Scrollbar(master, orient="horizontal")
            self.h_scrollbar(hbar, widget, x, y, w, h, pw, ph)
        self.scrollbar_autohide(vbar, hbar, widget)

    def __tk_tabs_menu(self, parent):
        frame = Notebook(parent)
        self.tk_tabs_menu_0 = self.__tk_frame_menu_0(frame)
        frame.add(self.tk_tabs_menu_0, text="笔画")
        self.tk_tabs_menu_1 = self.__tk_frame_menu_1(frame)
        frame.add(self.tk_tabs_menu_1, text="笔画名称表")
        self.tk_tabs_menu_2 = self.__tk_frame_menu_2(frame)
        frame.add(self.tk_tabs_menu_2, text="笔顺一般规则")
        self.tk_tabs_menu_3 = self.__tk_frame_menu_3(frame)
        frame.add(self.tk_tabs_menu_3, text="笔顺补充规则")
        self.tk_tabs_menu_4 = self.__tk_frame_menu_4(frame)
        frame.add(self.tk_tabs_menu_4, text="笔顺口诀")
        frame.place(x=0, y=0, width=500, height=400)
        return frame

    def __tk_frame_menu_0(self, parent):
        frame = Frame(parent)
        frame.place(x=0, y=0, width=500, height=400)
        return frame

    def __tk_frame_menu_1(self, parent):
        frame = Frame(parent)
        frame.place(x=0, y=0, width=500, height=400)
        return frame

    def __tk_frame_menu_2(self, parent):
        frame = Frame(parent)
        frame.place(x=0, y=0, width=500, height=400)
        return frame

    def __tk_frame_menu_3(self, parent):
        frame = Frame(parent)
        frame.place(x=0, y=0, width=500, height=400)
        return frame

    def __tk_frame_menu_4(self, parent):
        frame = Frame(parent)
        frame.place(x=0, y=0, width=500, height=400)
        return frame

    def __tk_text_koujue(self, parent):
        """
        笔顺口诀
        """
        text = tk.Text(parent, spacing2=25, bd=0, wrap="word", font=("微软雅黑", 14))
        text.place(x=0, y=0, width=500, height=400)
        text.insert(tk.END, "从上到下为主,从左到右为辅。\r\n上下左右俱全,根据层次分组;\r\n横竖交叉先横,撇捺交叉先撇;\r\n中间突出先中,右上有点后补;\r\n上包下时先外,下包上时先内;\r\n"
                            "三框首横末折,大囗最后封底;\r\n分歧遵照《规范》,做到流畅美观。")
        text.config(state='disabled')
        return text

    def __tk_text_ext_rule(self, parent):
        text = tk.Text(parent, spacing2=25, bd=0, wrap="word", font=("微软雅黑", 14))
        text.place(x=0, y=0, width=500, height=400)
        text.insert(tk.END,
                    "1.点在上部或左上,先写点:衣 立 为\r\n2.点在右上或在字里,后写点:发 瓦 我\r\n3.上右和上左包围结构的字,先外后里:厅 座 屋\r\n4.左下包围结构的字,先里后外:远 "
                    "建 廷\r\n5.左下右包围结构的字,先里后外:凶 画\r\n6.左上右包围结构的字,先里后外:同 用 风\r\n7.上左下包围结构的字,先上后里在左下:医 巨 匠 区")
        text.config(state='disabled')
        return text

    def __tk_text_common_rule(self, parent):
        text = tk.Text(parent, spacing2=25, bd=0, wrap="word", font=("微软雅黑", 14))
        text.place(x=0, y=0, width=500, height=400)
        text.insert(tk.END,
                    "1.先撇后捺 : 人 八 入\r\n2.先横后竖:十 王 干\r\n3.从上到下:三 竟 音\r\n4.从左到右:理 利 礼 明 湖\r\n5.先外后里: 问 同 "
                    "司\r\n6.先外后里在封口:国 圆 园 圈\r\n7.先中间后两边:小 水\r\n")
        text.config(state='disabled')
        return text

    def __tk_label_bihua_name_image(self, parent):
        global img  # 使用全局变量来保持对图片对象的引用
        try:
            # 打开图片文件
            img = Image.open("bihua.png")
            # 获取Label的宽度和高度
            label_width = 500
            label_height = 400

            # 计算图片的原始宽高比
            original_ratio = img.size[0] / img.size[1]

            # 根据Label的尺寸和图片的宽高比计算新的图片尺寸
            if original_ratio >= 1:  # 宽度大于高度
                new_width = label_width
                new_height = int(new_width / original_ratio)
            else:  # 高度大于宽度
                new_height = label_height
                new_width = int(new_height * original_ratio)

            # 调整图片尺寸以适应Label的尺寸,同时保持宽高比
            img = img.resize((new_width, new_height - 35), )

            # 将PIL图片对象转换为Tkinter的PhotoImage对象
            img = ImageTk.PhotoImage(img)

            # 创建Label,并设置图片和位置
            label = Label(parent, image=img, anchor="center")
            label.place(x=(label_width - new_width) // 2, y=(label_height - new_height) // 2, width=new_width,
                        height=new_height)

            return label
        except IOError:
            logging.error("图片文件bihua.png未找到或无法打开。")

    def __tk_text_title(self, parent):
        ipt = Entry(parent, justify="center", font=("微软雅黑", 18), foreground="red")
        ipt.place(x=175, y=12, width=150, height=53)
        ipt.insert(tk.END, "汉字笔画工具")
        ipt.config(state='disabled')
        return ipt

    def __tk_input_search_chinese(self, parent):
        ipt = Entry(parent, justify="center", font=("微软雅黑", 24))
        ipt.place(x=20, y=116, width=59, height=58)
        return ipt

    def __tk_button_search_btn(self, parent):
        btn = Button(parent, text="搜索", takefocus=False, command=self.tk_button_search_click)
        btn.place(x=91, y=117, width=66, height=57)
        return btn

    def tk_button_search_click(self):
        # 清除数据
        self.bihua_num = 0
        self.current_tile = -1
        self.tk_text_bihua_num = self.__tk_text_bihua_num(self.tk_tabs_menu_0)
        self.tk_text_pinyin = self.__tk_text_pinyin(self.tk_tabs_menu_0)

        chinese = self.tk_input_search_chinese.get()
        if not chinese:
            messagebox.showerror("提示", message="搜索汉字不能为空")
            return
        elif len(chinese) > 1:
            messagebox.showerror("提示", message="搜索汉字不能超过1个")
            return

        assets = './assets'
        if not os.path.exists(assets):
            os.mkdir(assets)

        chinese_dir = os.path.join(assets, chinese)
        if not os.path.exists(chinese_dir):
            # 创建目录
            os.mkdir(chinese_dir)
            # 假设chinese是单个汉字字符,chinese_ord是其Unicode编码
            chinese_ord = ord(chinese)

            # 构造汉字笔顺动画图片和笔顺规范图片的URL
            hanzi_url = f'https://bishun.net/hanzi/{chinese_ord}'
            donghua_url = f'https://bishun.net/assets/bishun/donghua/bishundonghua-{chinese_ord}.gif'
            fenbu_url = f'https://bishun.net/assets/bishun/fenbu/bishun-{chinese_ord}.png'

            try:
                # 请求汉字信息页面
                response = requests.get(hanzi_url)
                if response.status_code == 200:
                    # 解析网页内容
                    soup = BeautifulSoup(response.content, 'html.parser')

                    # 这里需要根据网页结构来定位笔画数和读音的元素
                    # 例如,如果它们位于具有特定class的元素内,可以使用soup.find()或soup.select()
                    # 以下代码仅为示例,需要根据实际网页结构进行调整
                    bi_shu = soup.select('.bishun-hanzi-info-right')[1].text
                    du_yin = soup.select('.bishun-hanzi-info-right')[2].text
                    print(f"笔画数:{bi_shu},读音:{du_yin}")
                    with open(os.path.join(chinese_dir, f'{chinese}.txt'), 'w', encoding='utf-8') as f:
                        f.write(f"{bi_shu}\n{du_yin}")

                    # 请求并下载笔顺动画图片
                    donghua_response = requests.get(donghua_url)
                    if donghua_response.status_code == 200:
                        with open(os.path.join(chinese_dir, f'{chinese}.gif'), 'wb') as f:
                            f.write(donghua_response.content)

                    # 请求并下载笔顺规范图片
                    fenbu_response = requests.get(fenbu_url)
                    if fenbu_response.status_code == 200:
                        with open(os.path.join(chinese_dir, f'{chinese}.png'), 'wb') as f:
                            f.write(fenbu_response.content)

            except requests.exceptions.RequestException as e:
                logging.error(f"请求失败:{e}")

        # 读取汉字信息文件
        with open(os.path.join(chinese_dir, f'{chinese}.txt'), 'r', encoding='utf-8') as f:
            lines = f.readlines()
            bi_shu = lines[0].strip()
            self.tk_text_bihua_num.insert(tk.END, f'笔画: {bi_shu}')
            self.tk_text_bihua_num.config(state='disabled')

            du_yin = lines[1].strip()
            self.tk_text_pinyin.insert(tk.END, f'读音: {du_yin}')
            self.tk_text_pinyin.config(state='disabled')

            self.bihua_num = int(bi_shu)

        # 显示完整字图片gif self.tk_label_bishun_img
        global img1  # 使用全局变量来保持对图片对象的引用
        # 打开图片文件
        img1 = Image.open(os.path.join(chinese_dir, f'{chinese}.gif'))
        # 获取Label的宽度和高度
        label_width = 137
        label_height = 138

        # 计算图片的原始宽高比
        original_ratio = img1.size[0] / img1.size[1]

        # 根据Label的尺寸和图片的宽高比计算新的图片尺寸
        if original_ratio >= 1:  # 宽度大于高度
            new_width = label_width
            new_height = int(new_width / original_ratio)
        else:  # 高度大于宽度
            new_height = label_height
            new_width = int(new_height * original_ratio)

        # 调整图片尺寸以适应Label的尺寸,同时保持宽高比
        img1 = img1.resize((new_width - 15, new_height - 15), )

        # 将PIL图片对象转换为Tkinter的PhotoImage对象
        img1 = ImageTk.PhotoImage(img1)
        self.tk_label_bishun_img.config(image=img1)

        # 提前加载笔顺规范
        global tiles
        tiles = self.load_and_split_image(os.path.join(chinese_dir, f'{chinese}.png'), self.bihua_num)

    def __tk_text_bihua_num(self, parent):
        ipt = Entry(parent, justify="left", font=("微软雅黑", 16))
        ipt.place(x=169, y=115, width=91, height=60)
        return ipt

    def __tk_text_pinyin(self, parent):
        ipt = Entry(parent, justify="left", font=("微软雅黑", 14))
        ipt.place(x=272, y=116, width=220, height=58)
        return ipt

    def __tk_label_bishun_img(self, parent):
        label = Label(parent, text="", anchor="center", )
        label.place(x=180, y=215, width=137, height=138)
        return label

    def __tk_button_pre_img(self, parent):
        btn = Button(parent, text="上一笔", takefocus=False, command=lambda: self.__pre_img_click())
        btn.place(x=80, y=257, width=77, height=56)
        return btn

    def __tk_button_next_img(self, parent):
        btn = Button(parent, text="下一笔", takefocus=False, command=lambda: self.__next_img_click())
        btn.place(x=337, y=254, width=82, height=59)
        return btn

    def __pre_img_click(self):
        if 0 < self.current_tile < self.bihua_num:
            self.current_tile -= 1
        else:
            self.current_tile = 0
        self.tk_label_bishun_img.config(image=tiles[self.current_tile])

    def __next_img_click(self):
        if self.current_tile < 0:
            self.current_tile = 0
        elif self.current_tile == self.bihua_num - 1:
            self.current_tile = self.bihua_num - 1
        else:
            self.current_tile += 1
        self.tk_label_bishun_img.config(image=tiles[self.current_tile])

    # 加载图片并分割成多个部分
    def load_and_split_image(self, image_path, bi_shu):
        img = Image.open(image_path)
        width, height = img.size
        const_per_row = 5  # 每一行最多5笔
        total_row = math.ceil(bi_shu / const_per_row)  # 向上取整,不能四舍五入
        tile_width, tile_height = (width // const_per_row, height // total_row)
        tiles = []
        for y in range(0, height, tile_height):
            for x in range(0, width, tile_width):
                tile = img.crop((x, y, x + tile_width, y + tile_height))
                tile = tile.resize((tile_width - 35, tile_height - 35), )
                tiles.append(ImageTk.PhotoImage(tile))
        return tiles

适用人群:

本软件特别适合刚开始学习汉字书写的小学生,也适用于对外汉语学习者了解汉字笔画。

开发者信息:

联系方式:liuchangng@163.com

下载地址(可执行)

链接: https://pan.baidu.com/s/1tfrJwEMaGm0k3AvPFPlP_Q?pwd=52pj 提取码: 52pj 复制这段内容后打开百度网盘手机App,操作更方便哦

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/581036.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAP SALV研究

1.SALV SALV用的是类cl_salv_table下的相关方法,一般用于对话框或者功能要求比较简单的数据显示,比如明细数据显示,不能单元格编辑或者某行某列编辑,可以实现全部数据编辑(实用性不强),如要实现编辑可参考这篇博文 https://mp.weixin.qq.com/s?__biz=MzU1MDAzMDY3MQ==…

车载系统的 加减串器应用示意

overview 车载系统上使用加减串器来实现camera&#xff0c; led液晶显示屏等 图像数据的远距离传输&#xff0c;将原先在短距离传输视频信号的mipi csi&#xff0c;dsi 等的TX&#xff0c;RX中间&#xff0c;插入加减串器&#xff0c;实现长距离的可靠传输。 示意图如下 往往…

开发 Chrome 浏览器插件入门

前言 简介 Chrome 插件是扩展 Chrome 浏览器的功能的软件程序。它们可以执行各种任务&#xff0c;例如阻止广告、增强隐私、添加新功能等等。 要开始编写 Chrome 插件&#xff0c;你需要掌握以下&#xff1a; 1.JavaScript语言 2.html 3.css 4.会使用chrome扩展开发手册…

C#设计树形程序界面的方法:创建特殊窗体

目录 1.TreeView控件 2.实例 &#xff08;1&#xff09;Resources.Designer.cs &#xff08;2&#xff09;Form1.Designer.cs &#xff08;3&#xff09;Form1.cs &#xff08;4&#xff09;生成效果 以树形来显示程序的菜单&#xff0c;可以更直观、更快捷地对窗体进行…

PostgreSQL大版本如何升级?

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

算法训练营day25

零、回溯算法理论 参考链接13.1 回溯算法 - Hello 算法 (hello-algo.com) 1.尝试与回退 之所以称之为回溯算法&#xff0c;是因为该算法在搜索解空间时会采用“尝试”与“回退”的策略。当算法在搜索过程中遇到某个状态无法继续前进或无法得到满足条件的解时&#xff0c;它会…

vue使用海康控件开发包——浏览器直接查看海康监控画面

1、下载控件开发包 2、安装插件&#xff08;双击/demo/codebase/HCWebSDKPlugin.exe进行安装&#xff09; 3、打开/demo/index.html文件 4、在页面上输入你的海康监控的登录信息进行预览 如果有监控画面则可以进行下面的操作 注意&#xff1a;以下操作都在Vue项目进行 5、复…

【Unity】shader中参数传递

1、前言 unity shader这个对于我来说是真的有点难&#xff0c;今天这篇文章主要还是总结下最近学习到的一些东西&#xff0c;避免过段时间忘记了&#xff0c;可能有不对&#xff0c;欢迎留言纠正。 2、参数传递的两种方式 2.1 语义传递 语义传递这个相对来说是简单的 shad…

ENVI不同版本个人使用对比

ENVI不同版本个人使用对比 文章目录 ENVI不同版本个人使用对比前言对比5.3学习版5.6学习版6.0试用版 总结 前言 目前来看&#xff0c;流传较广的可供大家免费获取的ENVI版本主要是5.3学习版 5.6学习版 6.0学习版这三个版本&#xff0c;不同的版本有不同特色&#xff0c;在此做…

21.7K Star力荐!跨平台的开源免费可视化爬虫,让数据采集不再是难题!

朋友们!你是否曾梦想着轻松地从网上抓取数据,却苦于编程技能的门槛?现在,有了EasySpider,这一切都变得触手可及!这不仅仅是一个工具,它是一个革命性的网络爬虫神器,让你能够像专业人士一样,无需编写一行代码,就能轻松设计和执行爬虫任务。无论是动态内容还是复杂页面…

【介绍下分布式系统】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

Spring Boot框架强大的事件驱动模型(ApplicationEvent)

文章目录 前言应用场景异步处理事务边界外的操作跨微服务通信系统监控与日志聚合UI更新生命周期管理工作流或业务流程缓存同步 小试牛刀定义事件实现事件处理器注册事件处理器发布事件测试事件 写在最后 前言 在Spring Boot应用中&#xff0c;事件处理器是指那些处理特定类型事…

实时采集麦克风并播放(springboot+webscoekt+webrtc)

项目技术 springbootwebscoektwebrtc 项目介绍 项目通过前端webrtc采集麦克风声音&#xff0c;通过websocket发送后台&#xff0c;然后处理成g711-alaw字节数据发生给广播UDP并播放。 后台处理项目使用线程池(5个线程)接受webrtc数据并处理g711-alaw字节数组放到Map容器中&…

将针孔模型相机 应用到3DGS

Motivation 3DGS 的 投影采用的是 CG系的投影矩阵 P P P, 默认相机的 principal point (相机光心) 位于图像的中点处。但是 实际应用的 绝大多数的 相机 并不满足这样一个设定&#xff0c; 因此我们 需要根据 f , c x , c y {f,c_x, c_y} f,cx​,cy​ 这几个参数重新构建3D …

Linux 安装 nvm,并使用 Jenkins 打包前端

文章目录 nvm是什么nvm下载nvm安装设置 nvm 环境变量设置 Jenkins 打包命令 nvm是什么 nvm全英文也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm和n都是node.js版本管理工具&#xff0c;为了解决node.js各种版本存在不兼容现象可以通过它可以安装…

电脑提示msvcp100.dll丢失的解决方法,多种有效的解决方法分享

在日常使用电脑进行工作的时候&#xff0c;我们常常依赖于各种高效软件来辅助完成任务&#xff0c;提升工作效率。然而&#xff0c;当你满怀期待地双击启动某个至关重要的办公软件时&#xff0c;屏幕上却弹出了一个令人措手不及的错误提示&#xff1a;“msvcp100.dll文件丢失”…

二. 搭建Nginx 直播流程服务器

目录 1. 前言 2. 安装 Nginx 依赖 3.下载源码 4. 编译安装 5.配置 rtmp 服务 6.验证配置 1. 前言 服务器由 NGINXRTMP 构成。 NGINX 是 HTTP 服务器&#xff0c; RTMP 是附加模块。 其中 NGINX 我选择的是用 源码编译方式 进行安装&#xff0c;因为这种方式可以自定义…

基于python语言气象水文数据处理及精美科研绘图实践技术

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;Python能够运行在Linux、Windows、Macintosh、AIX操作系统上及不同平台&#xff08;x86和arm&#xff09;&#xff0c;Python简洁的语法和对动态输入的支持&#xff0c;再加上解释性语言的本质&…

C语言中的三大循环

C语言中为我们提供了三种循环语句&#xff0c;今天我就来与诸君细谈其中之奥妙。循环这一板块总结的内容较多&#xff0c;而且&#xff0c;很重要&#xff01;&#xff08;敲黑板&#xff01;&#xff01;&#xff01;)&#xff0c;所以诸君一定要对此上心&#xff0c;耐住性子…

修复所有 bug 并不能解决所有问题

原文&#xff1a;jeffpsherman - 2024.04.08 在软件领域&#xff0c;如同在制造业&#xff0c;有些问题是由于 bug 或“特殊原因”引发的&#xff0c;而有些则是“常见原因”&#xff0c;这是由于系统设计和实现的性质所导致的。修复 bug 就是移除特殊原因&#xff0c;消除 bu…