当前位置: 首页 > news >正文

【100天精通python】Day38:GUI界面编程_PyQt 从入门到实战(中)_数据库操作与多线程编程

目录

  专栏导读 

4 数据库操作

4.1 连接数据库

4.2 执行 SQL 查询和更新:

4.3 使用模型和视图显示数据

 5 多线程编程

5.1 多线程编程的概念和优势

5.2 在 PyQt 中使用多线程

5.3 处理多线程间的同步和通信问题

5.3.1 信号槽机制

5.3.2 线程安全的数据访问

 QMutex 和 QMutexLocker


  专栏导读 

专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12375510.html


4 数据库操作

      

        PyQt6中的数据库操作主要涉及到Qt的SQL模块,该模块提供了用于连接和管理数据库的功能。下面是一个关于PyQt6数据库操作的概述:

  1. 数据库连接: 使用QSqlDatabase类建立与数据库的连接。可以连接到各种数据库引擎,例如SQLite、MySQL、PostgreSQL等。连接需要指定数据库类型、主机、用户名、密码等信息。

  2. 数据库查询: 使用QSqlQuery类执行SQL查询语句,例如SELECT、INSERT、UPDATE等。查询结果可以通过迭代获取。

  3. 模型-视图架构: PyQt6提供了QSqlTableModelQSqlQueryModel等模型类,用于将数据库数据与Qt的视图类(如QTableView)连接起来。这使得在表格视图中展示和编辑数据库中的数据变得更加容易。

  4. 事务管理: 可以使用QSqlDatabase.transaction()QSqlDatabase.commit()来进行数据库事务的管理,确保数据的一致性和完整性。

  5. 数据绑定: 使用bindValue()方法可以将变量绑定到SQL查询,这有助于防止SQL注入攻击。

  6. 错误处理: 数据库操作可能会出现错误,通过检查QSqlQuerylastError()可以获取详细的错误信息。

4.1 连接数据库

使用 Qt 的 QSqlDatabase 类可以连接到数据库。以下是一个简单的示例:

from PyQt6.QtSql import QSqlDatabasedb = QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("my_database.db")
if db.open():print("Connected to database")
else:print("Failed to connect")

4.2 执行 SQL 查询和更新:

你可以使用 QSqlQuery 类来执行 SQL 查询和更新操作。以下是一个示例:

from PyQt6.QtSql import QSqlQueryquery = QSqlQuery()
query.exec("SELECT * FROM employees")
while query.next():name = query.value("name")print("Employee name:", name)

4.3 使用模型和视图显示数据

        Qt 提供了模型-视图架构来显示数据库中的数据。例如,可以使用 QSqlTableModel 来在 QTableView 中显示数据。以下是一个示例:

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QTableView, QVBoxLayout, QWidget, QPushButton, QLineEdit, QDockWidget
from PyQt6.QtSql import QSqlDatabase, QSqlTableModel, QSqlQuery
from PyQt6.QtCore import Qtclass AddDataDialog(QWidget):def __init__(self, model):super().__init__()self.model = modellayout = QVBoxLayout()self.setLayout(layout)# 添加姓名输入框self.name_input = QLineEdit(self)layout.addWidget(self.name_input)# 添加职位输入框self.position_input = QLineEdit(self)layout.addWidget(self.position_input)# 添加 "Add Data" 按钮,并连接到添加数据函数add_button = QPushButton("Add Data", self)add_button.clicked.connect(self.add_data)layout.addWidget(add_button)def add_data(self):# 获取姓名和职位输入框的内容name = self.name_input.text()position = self.position_input.text()# 准备插入数据的SQL查询query = QSqlQuery()query.prepare("INSERT INTO employees (name, position) VALUES (?, ?)")query.bindValue(0, name)query.bindValue(1, position)if query.exec():print("Data added successfully")self.model.select()  # 刷新表格数据else:print("Error adding data:", query.lastError().text())def create_database_connection():# 创建数据库连接db = QSqlDatabase.addDatabase("QSQLITE")db.setDatabaseName("employees.db")if not db.open():print("Error: Could not open database.")return Nonereturn dbdef create_table(db):# 创建表格的SQL查询query = QSqlQuery()query.exec("CREATE TABLE IF NOT EXISTS employees (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, position TEXT)")def setup_model(db):# 设置数据库表格模型model = QSqlTableModel()model.setTable("employees")model.setEditStrategy(QSqlTableModel.EditStrategy.OnManualSubmit)  # 手动提交更改model.select()return modelif __name__ == "__main__":app = QApplication(sys.argv)db = create_database_connection()if not db:sys.exit(1)create_table(db)model = setup_model(db)view = QTableView()view.setModel(model)add_data_dialog = AddDataDialog(model)window = QMainWindow()window.setWindowTitle("Database Table Example")window.setCentralWidget(view)window.setGeometry(100, 100, 800, 600)add_data_button = QPushButton("Add Data", window)add_data_button.clicked.connect(add_data_dialog.show)# 创建 DockWidget 并添加到主窗口的右侧停靠区dock_widget = QDockWidget("Add Data", window)dock_widget.setWidget(add_data_dialog)window.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, dock_widget)window.show()sys.exit(app.exec())

   

 5 多线程编程

5.1 多线程编程的概念和优势

        PyQt6中的多线程编程允许你在应用程序中同时执行多个任务,以提高性能、响应速度和资源利用率。在使用多线程时,你需要注意线程之间的同步和通信,以避免数据竞争和其他并发问题。以下是PyQt6多线程编程的概述:

  1. 线程类(QThread): QThread 是 PyQt6 提供的线程基类,用于创建和管理线程。你可以继承 QThread 并实现 run() 方法来定义线程的执行逻辑。

  2. 线程安全性: 在多线程环境中,多个线程可能同时访问和修改共享资源。确保对共享资源的访问是线程安全的是很重要的,可以使用互斥锁(QMutex)来控制对共享资源的访问。

  3. 信号和槽机制: 在多线程中,通常不能直接在非主线程中更新用户界面。可以使用信号和槽机制,通过在主线程中处理信号来更新界面,从而避免线程间的界面更新问题。

  4. 多线程的应用场景: 多线程在以下情况下特别有用:

    • 执行耗时操作,如文件读写、网络请求等,以避免主线程阻塞。
    • 实现实时数据刷新,如传感器数据、图表数据等。
    • 并发处理多个任务,提高程序的整体性能。
  5. 线程同步和通信: 多线程编程需要考虑线程之间的同步和通信。合适的同步机制(如互斥锁、信号量、条件变量等)和通信机制(如队列、信号槽等)可以确保线程间的正确协作。

  6. 避免死锁和线程饥饿: 死锁和线程饥饿是多线程编程中常见的问题。确保正确地设计和组织线程同步和通信,以避免出现这些问题。

总之,多线程编程可以显著提高应用程序的性能和响应能力,但也需要仔细考虑线程安全性和正确的同步机制。PyQt6提供了一些类和工具来帮助你实现多线程应用程序,但需要小心处理潜在的并发问题。

5.2 在 PyQt 中使用多线程

        在 PyQt 中,你可以使用 QThread 类来创建和管理线程。以下是一个示例,演示如何在一个线程中执行一个耗时的任务:

from PyQt6.QtCore import QThread, pyqtSignalclass WorkerThread(QThread):result_ready = pyqtSignal(str)def run(self):# 执行耗时任务result = "Task result"self.result_ready.emit(result)thread = WorkerThread()
thread.result_ready.connect(lambda result: print("Result:", result))
thread.start()

5.3 处理多线程间的同步和通信问题

        在多线程编程中,处理线程间的同步和通信问题是至关重要的,以确保数据的一致性和应用程序的稳定性。PyQt 提供了一些机制来帮助解决这些问题,其中最重要的是信号槽机制和线程安全的数据访问。

5.3.1 信号槽机制

        信号槽机制是 PyQt 中用于线程间通信的重要工具。它允许一个对象(信号的发出者)发出信号,而另一个对象(槽函数的接收者)将信号连接到槽函数,从而在信号触发时执行相应的操作。这在多线程环境下特别有用,因为它避免了直接的线程间共享数据。

以下是一个简单的示例,演示如何在多线程中使用信号槽机制:

import sys
from PyQt6.QtCore import QThread, pyqtSignal
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButtonclass WorkerThread(QThread):result_ready = pyqtSignal(str)def run(self):result = "Task result"self.result_ready.emit(result)class MyWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("Thread Communication Example")self.setGeometry(100, 100, 400, 300)self.button = QPushButton("Start Task", self)self.button.setGeometry(150, 150, 100, 30)self.button.clicked.connect(self.start_thread)def start_thread(self):self.thread = WorkerThread()self.thread.result_ready.connect(self.handle_result)self.thread.start()def handle_result(self, result):print("Result:", result)if __name__ == "__main__":app = QApplication(sys.argv)window = MyWindow()window.show()sys.exit(app.exec())

  

5.3.2 线程安全的数据访问

        当多个线程同时访问共享数据时,很容易出现竞争条件和数据不一致的问题。为了避免这些问题,你需要使用互斥锁(mutex)来保护共享数据的访问。PyQt 中的 QMutex 和 QMutexLocker 可以帮助你实现线程安全的数据访问。

以下是一个简单的示例,演示如何在多线程中安全地访问共享数据:

import sys
from PyQt6.QtCore import QThread, QMutex, QMutexLockerclass SharedData:def __init__(self):self.mutex = QMutex()  # 用于保护共享数据的互斥锁self.data = 0def increment(self):locker = QMutexLocker(self.mutex)  # 加锁self.data += 1class WorkerThread(QThread):def __init__(self, shared_data):super().__init__()self.shared_data = shared_datadef run(self):for _ in range(10):self.shared_data.increment()if __name__ == "__main__":shared_data = SharedData()  # 创建共享数据对象threads = [WorkerThread(shared_data) for _ in range(4)]  # 创建多个工作线程for thread in threads:thread.start()  # 启动工作线程for thread in threads:thread.wait()  # 等待所有工作线程完成print("Shared data:", shared_data.data)  # 打印最终共享数据的值

输出: 

         在这个示例中,每个工作线程在循环中执行10次的增量操作,使用互斥锁确保在任何时候只有一个线程可以访问和修改SharedData对象的data属性。这样可以避免数据竞争和不一致的情况。

        注意,这个示例使用了Python中的多线程和互斥锁,与Qt中的线程和互斥锁略有不同。确保你的环境中同时存在Qt库和Python的线程支持(例如PyQt6.QtCorethreading库),以便代码可以正确运行。

5.4 避免死锁和线程饥饿

        避免死锁和线程饥饿是多线程编程中的关键问题。死锁指的是多个线程彼此等待对方释放锁,导致程序无法继续执行。线程饥饿是指某个线程长时间无法获得所需的资源或锁,导致其他线程占用资源,使得该线程无法继续执行。以下是在PyQt6中避免死锁和线程饥饿的详解和示例:

避免死锁:

  1. 有序获取锁: 当多个线程需要获取多个锁时,确保它们按照相同的顺序获取锁,这可以减少死锁的风险。

  2. 超时机制: 在获取锁时使用超时机制,如果无法在一定时间内获取锁,就放弃并释放已有的锁。

避免线程饥饿:

  1. 公平性: 使用公平的锁和资源分配策略,确保所有线程都有平等的机会获得资源,避免某个线程长时间无法获得所需资源。

  2. 优先级: 在某些情况下,可以通过为线程设置不同的优先级,确保高优先级线程不会长时间无法获得资源。

以下是一个简单的示例,展示如何在PyQt6中使用QMutex来避免死锁和线程饥饿:

import sys
from PyQt6.QtCore import QThread, QMutex, QMutexLocker# 共享资源类,用于展示互斥锁的使用来避免死锁和线程饥饿
class SharedResource:def __init__(self):self.mutex1 = QMutex()  # 第一个互斥锁self.mutex2 = QMutex()  # 第二个互斥锁def process1(self):with QMutexLocker(self.mutex1):  # 获取第一个锁print("Process 1: Mutex 1 locked")QThread.msleep(100)  # 模拟处理时间with QMutexLocker(self.mutex2):  # 获取第二个锁print("Process 1: Mutex 2 locked")def process2(self):with QMutexLocker(self.mutex2):  # 获取第二个锁print("Process 2: Mutex 2 locked")QThread.msleep(100)  # 模拟处理时间with QMutexLocker(self.mutex1):  # 获取第一个锁print("Process 2: Mutex 1 locked")class WorkerThread(QThread):def __init__(self, shared_resource, process_func):super().__init__()self.shared_resource = shared_resourceself.process_func = process_funcdef run(self):self.process_func()if __name__ == "__main__":shared_resource = SharedResource()thread1 = WorkerThread(shared_resource, shared_resource.process1)thread2 = WorkerThread(shared_resource, shared_resource.process2)thread1.start()  # 启动线程1thread2.start()  # 启动线程2thread1.wait()  # 等待线程1完成thread2.wait()  # 等待线程2完成print("Main thread exited")  # 主线程退出

         在这个示例中,两个线程分别尝试获取两个不同的锁(mutex1和mutex2)。通过始终以相同的顺序获取锁,可以避免死锁。同时,通过在获取锁时使用QMutexLocker,可以确保线程在离开作用域时释放锁。

        需要注意的是,死锁和线程饥饿是复杂的问题,可能在更复杂的场景中出现。避免死锁和线程饥饿需要仔细的设计和测试,以确保线程在协同工作时能够正确地进行同步和协调。

 QMutexQMutexLocker

QMutexQMutexLocker 是 PyQt 中用于线程同步的两个重要类。它们帮助确保多个线程在访问共享资源时的正确同步,以避免竞争条件和数据不一致。下面是关于它们的详解和示例:

QMutex(互斥锁): 互斥锁是一种线程同步机制,用于控制多个线程对共享资源的访问。在多线程环境中,一个线程可以获得互斥锁的所有权,从而可以安全地访问共享资源。其他线程在获取互斥锁之前必须等待,以确保同一时间只有一个线程可以访问共享资源。

示例代码:

from PyQt6.QtCore import QMutexmutex = QMutex()def thread_function():mutex.lock()# 访问共享资源mutex.unlock()# 创建多个线程,每个线程执行 thread_function

QMutexLocker(互斥锁锁定器): QMutexLockerQMutex 的一个辅助类,它在创建时自动锁定 QMutex,并在销毁时释放锁。这样可以确保在一个作用域内,线程在获取锁后能够正确地释放锁,从而避免忘记释放锁而导致的死锁。

示例代码:

from PyQt6.QtCore import QMutex, QMutexLockermutex = QMutex()def thread_function():with QMutexLocker(mutex):  # 进入作用域时自动锁定,离开作用域时自动释放# 访问共享资源# 创建多个线程,每个线程执行 thread_function

        在使用 QMutexLocker 时,当线程离开作用域(例如使用 with 语句),会自动释放锁,无论是否发生异常。

相关文章:

【100天精通python】Day38:GUI界面编程_PyQt 从入门到实战(中)_数据库操作与多线程编程

目录 专栏导读 4 数据库操作 4.1 连接数据库 4.2 执行 SQL 查询和更新: 4.3 使用模型和视图显示数据 5 多线程编程 5.1 多线程编程的概念和优势 5.2 在 PyQt 中使用多线程 5.3 处理多线程间的同步和通信问题 5.3.1 信号槽机制 5.3.2 线程安全的数据访问 Q…...

STM32--TIM定时器(3)

文章目录 输入捕获简介频率测量输入捕获通道输入捕获基本结构PWMI的基本结构输入捕获模式测量PWM频率和占空比代码 编码器接口正交编码器工作模式接口基本结构TIM编码接口器测速代码: 输入捕获简介 输入捕获IC(Input Capture),是处理器捕获外部输入信号…...

爬虫框架- feapder + 爬虫管理系统 - feaplat 的学习简记

文章目录 feapder 的使用feaplat 爬虫管理系统部署 feapder 的使用 feapder是一款上手简单,功能强大的Python爬虫框架 feapder 官方文档 文档写的很详细,可以直接上手。 基本命令: 创建爬虫项目 feapder create -p first-project创建爬虫 …...

设计模式详解-享元模式

类型:结构型模式 实现原理:尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象 目的:减少创建对象的数量以减少内存占用和提高性能。 解决的问题:大量的对象可能造成的内存溢出问题 解决方法&a…...

BDA初级分析——用SQL筛选数据

一、用SQL对数据分组 GROUP BY Group by,按...分组 作用:根据给定字段进行字段的分组,通常和聚合函数配合使用,实现分组的分析 写法:select ...from ...group by 字段名 (也可以是多个字段) GROUP BY的逻辑 SELECT gender,COUNT(user_id) …...

(成功踩坑)electron-builder打包过程中报错

目录 注意:文中的解决方法2,一定全部看完,再进行操作,有坑 背景 报错1: 报错2: 1.原因:网络连接失败 2.解决方法1: 3.解决方法2: 3.1查看缺少什么资源文件 3.2去淘…...

【STM32】 工程

🚩 WRITE IN FRONT 🚩 🔎 介绍:"謓泽"正在路上朝着"攻城狮"方向"前进四" 🔎🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2022博客之星TO…...

Git概述

目录 一、什么是Git 二、什么是版本控制系统 三、Git和SVN对比 SVN集中式 SVN优缺点 Git分布式 Git优缺点 四、Git工作流程 四个工作区域 工作流程 五、Git下载与安装 一、什么是Git 很多人都知道,林纳斯托瓦兹在1991年创建了开源的Linux,从…...

ubuntu 编译安装nginx及安装nginx_upstream_check_module模块

如果有帮助到你,麻烦点个赞呗~ 一、下载安装包 # 下载nginx_upstream_check_module模块 wget https://codeload.github.com/yaoweibin/nginx_upstream_check_module/zip/master# 解压 unzip master# 下载nginx 1.21.6 wget https://github.com/nginx/…...

近 2000 台 Citrix NetScaler 服务器遭到破坏

Bleeping Computer 网站披露在某次大规模网络攻击活动中,一名攻击者利用被追踪为 CVE-2023-3519 的高危远程代码执行漏洞,入侵了近 2000 台 Citrix NetScaler 服务器。 研究人员表示在管理员安装漏洞补丁之前已经有 1200 多台服务器被设置了后门&#x…...

MySQL MVCC的详解之Read View

文章目录 概要一、基于UNDO LOG的版本链1.1、行记录结构1.2、了解UNDO LOG1.3、版本链 二、Read View2.1、判定机制 三、参考 概要 在上文中,我们提到了MVCC(Multi-Version Concurrency Control)多版本并发控制,是通过undo log来实现的。那具…...

基于springboot+vue的考研资讯平台(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

学习网络编程No.3【socket理论实战】

引言: 北京时间:2023/8/12/15:32,自前天晚上更新完文章,看了一下鹅厂新出的《扫毒3》摆烂至现在,不知道是长大了,还是近年港片就那样,给我的感觉不是很好,也可能是国内市场对港片不…...

Linux学习之ssh和scp

ls /etc/ssh可以看到这个目录下有一些文件,而/etc/ssh/ssh_config是客户端配置文件,/etc/ssh/sshd_config是服务端配置文件。 cat -n /etc/ssh/sshd_config | grep "Port "可以看一下sshd监听端口的配置信息,发现这个配置端口是22…...

录制游戏视频的软件有哪些?分享3款软件!

“有录制游戏视频的软件推荐吗?最近迷上了网游,想录制点自己高端操作的游戏画面,但是不知道用什么软件录屏比较好,就想问问大家,有没有好用的录制游戏视频软件。” 在游戏领域,玩家们喜欢通过录制游戏视频…...

每日一题——螺旋矩阵

题目 给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。 数据范围:0≤n,m≤10,矩阵中任意元素都满足 ∣val∣≤100 要求:空间复杂度 O(nm) ,时间复杂度 O(nm)…...

前端面试的性能优化部分(12)每天10个小知识点

目录 系列文章目录前端面试的性能优化部分(1)每天10个小知识点前端面试的性能优化部分(2)每天10个小知识点前端面试的性能优化部分(3)每天10个小知识点前端面试的性能优化部分(4)每天…...

SAP BTEs 业务交易事件/增强(Business Transaction Event)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、BTEs是什么? 二、使用步骤 1.查找BTE event 2.处理FM 总结 前言 SAP BTEs是一种新型的增强方式,可以通过事务代码FIFB打开&#…...

leetcode做题笔记90. 子集 II

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。 思路一:回溯 int comp(const void* a, cons…...

“开发和运维”只是一个开始,最终目标是构建高质量的软件工程

随着技术的飞速发展,软件行业不断寻求改进和创新的方法来提供更高质量的产品。在这方面,DevOps已经展现出了巨大的潜力。通过打破开发和运维之间的壁垒,DevOps将持续集成、持续交付和自动化流程引入到软件开发中,使团队能够更快地…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...