数据结构课程设计霍夫曼编码实验报告,包含源码基本要求:一个完整的系统应具有以下功能:(1)I:初始化(Initialization)。
从终端读入字符集大小n及n个字符和m个权值,建立哈夫曼树,并将它存于文件hfmtree中。
(2)C:编码(Coding)。
利用已建好的哈夫曼树(如不在内存,则从文件hfmtree中读入),对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中。
(3)D:解码(Decoding)。
利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入文件textfile中。
(4)P:打印代码文件(Print)。
将文件codefile以紧凑格式显示在终端上,每行50个代码。
同时,将此字符形式的编码文件写入文件codeprint中。
(5)T:打印哈夫曼树(Treeprinting)。
将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。
###霍夫曼编码器知识点解析####一、霍夫曼编码基础概念**霍夫曼编码**是一种广泛应用于数据压缩领域的编码方法。
它采用了一种变长编码技术,使得出现频率高的字符可以用较短的编码表示,而出现频率低的字符则使用较长的编码表示。
这样做的好处是可以有效地减少数据的整体存储空间或传输所需的时间。
####二、霍夫曼树的构建霍夫曼树的构建是霍夫曼编码的基础。
构建过程大致分为以下几个步骤:1.**初始化**:首先读取字符集大小`n`及`n`个字符和它们的权重(出现次数),通常权重越大的字符出现的频率越高。
这部分操作可以通过用户输入或者从文件中读取完成。
2.**创建节点**:对于每一个字符及其权重,创建一个节点,该节点包含字符信息和权重信息。
这些节点可以被看作是一个优先队列,其中优先级由权重决定,权重越小的节点优先级越高。
3.**构造霍夫曼树**:不断地从优先队列中选取权重最小的两个节点作为新的节点的左右子树,并且新节点的权重等于其两个子节点的权重之和。
重复这一过程,直到所有的节点都合并成一个根节点为止,此时便得到了一棵完整的霍夫曼树。
4.**编码赋值**:从根节点开始,按照左子树为0、右子树为1的原则为每个叶子节点赋值编码。
叶子节点代表的是原始的字符集合,这样每个字符都有了一个与之对应的编码。
####三、编码与解码-**编码**:对于给定的文本,通过查找霍夫曼树中对应字符的路径,获取其霍夫曼编码,并将其替换为原文本中的字符,从而得到编码后的文件。
编码后的文件通常会比原始文件占用更少的空间。
-**解码**:解码过程则是编码过程的逆向操作。
根据霍夫曼树,从编码文件中读取编码序列,沿着霍夫曼树逐位判断,当遇到叶子节点时,即可确定对应的字符,从而恢复出原始文本。
####四、打印功能-**打印编码文件**:将编码后的文件内容以紧凑格式输出,每行50个编码。
此外,还需要将这些编码保存到另一个文件中,便于后续查看或处理。
-**打印霍夫曼树**:将霍夫曼树以直观的形式(例如树形结构或凹入表格形式)展示出来。
同时,将树的图形化表示保存到文件中,方便用户理解霍夫曼树的具体结构。
####五、实验环境搭建与运行**硬件环境**:实验中提到了具体的硬件配置,比如IntelCorei5-4258UCPU,这意味着实验是在一台具有足够计算能力的计算机上进行的。
**软件环境**:实验使用了MicrosoftVisualC++6.0进行编程。
这是一个广泛使用的C++集成开发环境(IDE),适合初学者和专业人士使用。
####六、实验过程与调试-**实验过程**:根据上述流程,可以实现霍夫曼编码器的基本功能。
在编写代码的过程中,需要注意细节处理,确保每个功能模块都能正确执行。
-**调试**:通过编写测试文档`tobetrans`,并运行程序,检查编码、解码等功能是否能够正常工作。
可以使用简单的测试用例来进行初步验证,如含有全部英文字母的文档等。
####七、实现代码示例实验报告中虽然只给出了部分代码框架,但可以想象实际的代码应该包含了霍夫曼树节点定义、霍夫曼树构建函数、编码函数、解码函数、打印函数等关键部分。
具体的实现逻辑需要结合上述理论知识进行编写。
通过上述解析,我们可以了解到霍夫曼编码器的设计思路和技术要点,这对于深入理解和应用霍夫曼编码具有重要的意义。
2025/8/17 10:34:16 78KB 霍夫曼编码
1
操作系统接口:兼容Unix/Linux命令接口。
为Windows操作系统建立一个兼容Unix命令的命令接口;
实现命令包括ls,cat,cp,mv,md/mkdir,rd/rmdir,cd,sort,more,print,命令的内容与详细格式请查阅unix命令手册;
可以字符形式接收命令,执行命令,然后显示命令执行结果。
2025/8/16 7:31:25 1.88MB 接口 linux 命令
1

在本文中,我们将深入探讨如何使用Python来实现一个二级登录菜单以及Python的安装步骤。
我们来看一下二级登录菜单的实现。
一个二级登录菜单通常包含多个子菜单,供用户根据其需求进行选择。
在给出的代码示例中,我们可以看到一个简单的三级菜单结构:1. 注册2. 登录3. 注销用户可以根据输入的数字选择相应的功能。
当用户选择1时,系统将提示他们输入账号和密码进行注册。
注册信息会被存储在字典`user_item`中。
如果用户选择2,系统会要求他们输入登录信息,并与已注册的账户进行匹配。
选择3则表示用户想要退出系统,系统会询问用户是否确认退出。
以下是一些关键代码片段的解释:```pythoninput_choice = int(input(Please enter your choice:1:Registration 2:login 3:logout:))```这一行代码用于获取用户的输入选择,将其转换为整型,并根据不同的选择执行相应的操作。
```pythonif input_choice == 1: user = input(Please enter your account number:) pwd = input(please enter your password:) user_item[user] = user user_item[pwd] = pwd```这部分代码处理用户注册,接收账号和密码,并存储在`user_item`字典中。
```pythonelif input_choice == 2: login_user = input(Please enter your login account number:) login_pwd = input(please enter your login password:) if login_user == user_item[user] and login_pwd == user_item[pwd]: print(Welcome sir:{}.format(login_user)) else: print(Sorry, your account or password is incorrect. Please confirm and come back)```这里处理用户登录,验证输入的账号和密码是否与已注册的信息匹配。
```pythonelif input_choice == 3: logout_input = input(Do you really want to quit this system?,y or n) if logout_input == y: break elif logout_input == n: input_choice = int(input(Please enter your choice:1:Registration 2:login 3:logout:)) else: print(Your input is incorrect)```这部分代码处理用户注销,询问用户是否确定退出,如果输入y则退出程序,否则重新显示菜单。
接下来,我们关注Python的安装过程。
在Windows上,Python的安装步骤通常包括:1. 访问官方网站下载最新版本的Python安装包:[https://www.python.org/downloads/](https://www.python.org/downloads/)。
2. 或者从其他可靠的源(如百度云盘)下载安装包。
3. 运行安装程序,选择自定义安装并勾选“Add Python to PATH”选项,这样会自动将Python安装路径添加到系统的PATH环境变量中。
4. 如果没有自动添加,需要手动进行设置: - 右键点击“计算机”,选择“属性” > “高级系统设置” > “高级” > “环境变量”。
- 在“系统变量”区域找到名为“Path”的变量,双击编辑,将Python的安装目录添加到路径列表中,各路径之间用分号(;)分隔。
5. 检查Python是否安装成功:按Win+R打开运行对话框,输入`cmd`,然后在命令行窗口输入`python`,如果能看到Python的交互式界面,说明安装成功。
通过这个文章,读者可以学习到如何使用Python编写一个简单的二级登录菜单程序,并了解Python在Windows上的安装过程。
这些基础知识对于初学者来说非常实用,有助于进一步掌握Python编程。
2025/6/16 5:24:20 260KB
1
简介:
### 计算机二级等级考试知识点解析#### 1. HTML 中引入外部 CSS 文件的方式在 HTML 中,可以通过 `<link>` 标签引入外部 CSS 文件。
正确的格式是使用 `rel` 属性指定链接类型为 “stylesheet”,并通过 `href` 属性指向 CSS 文件的位置。
**示例代码**:```html<link rel="stylesheet" href="mystyle.css">```正确选项为 **B**。
#### 2. Python 中列表操作与异常处理在 Python 中,列表是一个有序的元素集合,支持多种操作,如添加、删除等。
此外,Python 支持异常处理机制来捕获并处理程序运行时可能出现的错误。
**示例代码**:```pythontry: num = eval(input("请输入一个列表:")) num.reverse() print(num)except: print("输入的不是列表")```在这个例子中,用户输入了一个逗号分隔的序列(例如 `1,2,3`),但是 `eval` 函数期望得到的是一个列表。
因此,该代码会抛出异常,并输出 “输入的不是列表”。
正确选项为 **D**。
#### 3. 操作系统与语言处理系统操作系统和语言处理系统(如编译器和解释器)都属于系统软件。
操作系统负责管理计算机硬件资源,为用户提供接口;
语言处理系统则负责将高级语言转换成机器码。
**知识点**:- **操作系统**: 管理硬件资源,提供用户接口。
- **语言处理系统**: 将高级语言翻译成机器码。
**结论**: 正确。
#### 4. 数据库表的基本属性数据库表是存储数据的基本单元,具有一定的结构特征。
**知识点**:- **表的记录与实体**: 每个表代表一类实体,表中的每一行对应一个实体。
- **关键字**: 用于唯一标识表中的记录。
- **索引**: 用于提高数据检索速度。
**结论**: 每个表都要有一个关键字以确保表中记录的唯一性。
正确选项为 **D**。
#### 5. ASP.NET 验证控件的特点ASP.NET 提供了多种验证控件来简化前端数据验证过程。
**知识点**:- **客户端验证与服务器端验证**: ASP.NET 验证控件可以在客户端进行初步验证,在服务器端进行最终验证。
- **多个验证控件**: 可以在一个页面中使用多个验证控件,确保数据的有效性。
- **兼容性**: 不同的浏览器可能对 JavaScript 的支持程度不同。
**结论**: ASP.NET 的验证控件仅能在服务器端进行验证。
正确选项为 **A**。
#### 6. VB 窗体文件扩展名VB (Visual Basic) 是一种广泛使用的编程语言,用于创建 Windows 应用程序。
**知识点**:- **窗体文件**: 包含窗体设计界面。
- **扩展名**: `.frm` 用于窗体文件。
**结论**: 正确选项为 **A**。
#### 7. 计算机处理的数据类型计算机处理的数据可以根据其性质和用途进行分类。
**知识点**:- **数值型数据**: 用于表示具体的数字,如整数、浮点数等。
**结论**: 正确选项为 **B**。
#### 8. 列表框和组合框中获取选中项的方法在编程中,列表框和组合框是用来显示多个选项的控件。
**知识点**:- **Text 属性**: 返回当前选中的列表项文本。
**结论**: 正确选项为 **C**。
#### 9. C++ 源程序文件扩展名C++ 是一种广泛使用的编程语言,支持面向对象编程。
**知识点**:- **源程序文件**: 含有 C++ 代码的文件。
- **扩展名**: `.cpp` 用于 C++ 源程序文件。
**结论**: 正确选项为 **A**。
#### 10. 客户机/服务器架构在计算机网络中,客户机/服务器架构是一种常见的通信模型。
**知识点**:- **客户机**: 发起请求的一方。
- **服务器**: 响应请求的一方。
**结论**: 错误,应该是客户机发起请求,服务器响应请求。
#### 11. VFP 中 AVERAGE 命令的使用Visual FoxPro (VFP) 是一种基于 SQL 的数据库管理系统。
**知识点**:- **AVERAGE 命令**: 计算平均值。
- **COPY STRUCTURE TO**: 复制表结构。
**结论**: 正确选项为 **B**。
#### 12. 建立表之间临时关系的要求在数据库中,表可以通过关系相互关联。
**知识点**:- **主控索引**: 用于建立表间关系的主要索引。
**结论**: 子表的主控索引用于建立临时关系。
正确选项为 **D**。
#### 13. Java 类的访问控制Java 是一种面向对象的编程语言,支持类的封装和继承。
**知识点**:- **访问控制**: 控制类的可见性。
**结论**: 如果一个类没有访问控制符,默认情况下它只在同一个包中可见。
正确选项为 **错误**。
#### 14. Java 条件语句的逻辑Java 支持多种条件语句,包括 if-else 和 switch-case。
**知识点**:- **条件判断**: 根据条件的不同分支执行不同的代码块。
**结论**: x 的取值范围为 `-3`。
正确选项为 **C**。
#### 15. 循环语句的种类循环语句用于重复执行一段代码直到满足特定条件为止。
**知识点**:- **for 循环**: 用于已知循环次数的情况。
- **while 循环**: 用于未知循环次数的情况。
**结论**: for 语句和 while 语句都属于循环语句。
正确选项为 **AC**。
#### 16. Python 中 divmod 函数的使用Python 提供了多种内置函数来简化编程任务。
**知识点**:- **divmod**: 返回除法的商和余数。
**结论**: 正确选项为 **D**。
#### 17. 面向对象编程的重要概念面向对象编程 (OOP) 是一种编程范式,强调对象的概念。
**知识点**:- **继承**: 允许创建一个类来继承另一个类的特性。
**结论**: 正确选项为 **C**。
#### 18. 对象属性的存在性在编程中,对象是一组属性和方法的集合。
**知识点**:- **Caption 属性**: 显示在对象上的文本。
**结论**: Timer 控件没有 Caption 属性。
正确选项为 **D**。
#### 19. Visual FoxPro 数组的定义与使用Visual FoxPro 支持数组,用于存储一组相关的数据。
**知识点**:- **数组定义**: 使用 `DIMENSION` 或 `DECLARE` 定义数组。
- **数据类型**: 数组中的元素可以是不同数据类型。
**结论**: 数组中的元素可以有不同的数据类型。
正确选项为 **C**。
#### 20. Visual FoxPro 中 SET EXACT OFF 的用法Visual FoxPro 中的 SET EXACT OFF 用于设置字符串比较模式。
**知识点**:- **字符串比较**: 控制字符串比较时是否区分大小写。
**结论**: 最后一条命令的输出结果为 `ABCD`。
正确选项为 **D**。
#### 21. Java 异常处理中的 catch 子句Java 提供了异常处理机制来处理程序中的错误情况。
**知识点**:- **异常处理**: 使用 try-catch-finally 结构。
- **catch 子句**: 捕获特定类型的异常。
**结论**: 应该将更具体的异常类放在前面。
正确选项为 **错误**。
#### 22. 字符串处理函数在编程中,经常需要对字符串进行操作,如去除空格等。
**知识点**:- **Trim 函数**: 删除字符串前后的空格。
**结论**: 正确选项为 **D**。
#### 23. C 语言中字符串长度的计算C 语言提供了一系列字符串处理函数。
**知识点**:- **strlen**: 计算字符串长度。
**结论**: 正确选项为 **C**。
#### 24. C 语言中的函数与返回值C 语言是一种广泛使用的编程语言,支持函数定义和调用。
**知识点**:- **return 语句**: 用于退出函数并返回结果。
- **函数调用**: 可以嵌套调用函数。
**结论**: 函数不一定必须有返回值。
正确选项为 **C**。
#### 25. 综合分析以上题目涵盖了计算机基础知识、编程语言特点、数据库管理和网络通信等多个方面,旨在全面测试考生的计算机应用能力。
2025/6/15 20:02:01 42KB
1
简介:
MAC0321_2018_StarWars MAC0321-成对作品-星球大战-玛丽亚·爱德华达·科拉迪尼·托利诺和塔米·塔卡拉·亚兹(Tamy Takara Yatsu)完成的作品注意:正如在课堂上所评论的,我们忘了给最后一次PUSH提交涉及战斗练习2的提交。
但是,按照约定,我们从文件夹中打印了lt -ltr(dir / od),并附加了名称“ print.png”,表明所做的更改一直持续到5月25日。
对于该项目的建设,其依据是Alair Pereira do Lago教授在2018年第一学期就MAC0321提交的文档,材料为“ MAC0321-小组工作-星球大战”。
建模是由材料制成的。
人们认为,无论是绝地还是西斯,所有角色都会是中毒氯氰菊酯含量很高的生物。
所有生物都有独特的密码,并根据您的最佳判断,选择姓名,出生年月,您的出生星球以及受过培训的学院。
为了战斗的目的,所
2025/6/15 19:58:54 64KB
1
经典算法java实现部分代码//系统拥有的初始资源数publicstaticintAVAILABLE[]={10,5,7};//系统已给每个进程分配的资源数publicstaticintALLOCATION[][]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};//每个进程还需要的资源数publicstaticintNEED[][]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};//每次申请的资源数publicstaticintRequest[]={0,0,0};//进程数与资源数publicstaticintM=5,N=3;intFALSE=0;intTRUE=1;publicvoidshowdata(){inti,j;System.out.print("系统可用的资源数为:/n");for(j=0;j<N;j++){System.out.print("资源"+j+":"+AVAILABLE[j]+"");}System.out.println();System.out.println("各进程还需要的资源量:");for(i=0;i<M;i++){System.out.print("进程"+i+":");for(j=0;j<N;j++){System.out.print("资源"+j+":"+NEED[i][j]+"");}System.out.print("/n");}System.out.print("各进程已经得到的资源量:/n");for(i=0;i<M;i++){System.out.print("进程");System.out.print(i);for(j=0;j<N;j++){System.out.print("资源"+j+":"+ALLOCATION[i][j]+"");}System.out.print("/n");
2025/6/9 19:32:55 7KB 银行家算法 java
1
第一部分Python语言第1章Python简介1.1运行Python1.2变量和算术表达式1.3条件语句1.4文件输入和输出1.5字符串1.6列表1.7元组1.8集合1.9字典1.10迭代与循环1.11函数1.12生成器1.13协程1.14对象与类1.15异常1.16模块1.17获得帮助第2章词汇和语法约定2.1行结构和缩进2.2标识符和保留字2.3数字字面量2.4.字符串字面量2.5容器2.6运算符、分隔符及特殊符号2.7文档字符串2.8装饰器2.9源代码编码第3章类型与对象3.1术语3.2对象的身份与类型3.3引用计数与垃圾收集3.4引用与复制3.5第一类对象3.6表示数据的内置类型3.6.1None类型3.6.2数字类型3.6.3序列类型3.6.4映射类型3.6.5集合类型3.7表示程序结构的内置类型3.7.1可调用类型3.7.2类、类型与实例3.7.3模块3.8解释器内部使用的内置类型3.8.1代码对象3.8.2帧对象3.8.3跟踪对象3.8.4生成器对象3.8.5切片对象3.8.6Ellipsis对象3.9对象行为与特殊方法3.9.1对象的创建与销毁3.9.2对象字符串表示3.9.3对象比较与排序3.9.4类型检查3.9.5属性访问3.9.6属性包装与描述符3.9.7序列与映射方法3.9.8迭代3.9.9数学操作3.9.10可调用接口3.9.11上下文管理协议3.9.12对象检查与dir()第4章运算符与表达式4.1数字操作4.2序列操作4.3字符串格式化4.4高级字符串格式化4.5字典操作4.6集合操作4.7增量赋值4.8属性(.)运算符4.9函数调用()运算符4.10转换函数4.11布尔表达式与真值4.12对象的比较与身份4.13运算优先级4.14条件表达式第5章程序结构与控制流5.1程序结构与执行5.2执行条件语句5.3循环与迭代5.4异常5.4.1内置异常5.4.2定义新异常5.5上下文管理器与with语句5.6断言与__debug__第6章函数与函数编程6.1函数6.2参数传递与返回值6.3作用域规则6.4函数对象与闭包6.5装饰器6.6生成器与yield6.7协程与yield表达式6.8使用生成器与协程6.9列表包含6.10生成器表达式6.11声明式编程6.12lambda运算符6.13递归6.14文档字符串6.15函数属性6.16eval()、exec()和compile()函数第7章类与面向对象编程7.1class语句7.2类实例7.3范围规则7.4继承7.5多态动态绑定和鸭子类型7.6静态方法和类方法7.7特性7.8描述符7.9数据封装和私有属性7.10对象内存管理7.11对象表示和属性绑定7.12__slots__7.13运算符重载7.14类型和类成员测试7.15抽象基类7.16元类7.17类装饰器第8章模块、包与分发8.1模块与import语句8.2从模块导入选定符号8.3以主程序的形式执行8.4模块搜索路径8.5模块加载和编译8.6模块重新加载和卸载8.7包8.8分发Python程序和库8.9安装第三方库第9章输入与输出9.1读取命令行选项9.2环境变量9.3文件和文件对象9.4标准输入、输出和错误9.5print语句9.6print()函数9.7文本输出中的变量插入9.8生成输出9.9Unicode字符串处理9.10UnicodeI/O9.10.1Unicode数据编码9.10.2Unicode字符特性9.11对象持久性与pickle模块第10章执行环境10.1解释器选项与环境10.2交互式会话10.3启动python应用程序10.4站点配置文件10.5用户站点包10.6启用新功能10.7程序终止第11章测试、调试、探查与调优11.1文档字符串和doctest模块11.2单元测试和unittest模块11.3Python调试器和pdb模块11.3.1调试器命令11.3.2从命令行进行调试11.3.3配置调试器11.4程序探查11.5
2025/4/25 17:28:21 26.74MB python django web 参考
1
1.虚函数是可以[New一个对象的时候要根据虚函数的函数体来填虚表;
而内联函数没有函数体,只是在预编译阶段展开]内联的,这样就可以减少函数调用的开销,提高效率(错误)2.一个类里可以同时存在[同一个类里无论什么函数都不能函数名和参数完全一样]参数和函数名都相同的虚函数与静态函数(错误)3.父类的析构函数是非虚的,但是子类的析构函数是虚的,delete子类指针(指向该子类对象)[特殊情况,参见题5],会调用父类的析构函数(正确)//任何情况下删除子类都会调用到父类的析构函数4.对于下面的类CA,sizeof(CA)=_B_:A.4B.8C.12D.16classCA{public:CA();virtual~CA();//因为有虚函数,所以会有4个字节的虚表指针private:intm_iTime;//成员变量4个字节public:intGetTime();intSetTime(intiTime);};5.下面这段程序,打印结果是_A_:A.1B.2C.3D.以上都不对intg_iCount=0;classCParent{public:CParent(){}~CParent(){g_iCount+=1;}};classCSon:publicCParent{public:CSon(){}~CSon(){g_iCount+=2;}};main(){CParent*p=newCSon();deletep[由于p被声明成父类指针,并且父类和子类的析构函数都非虚,因此delete操作只能根据p指针声明的类型来调用父类的析构函数];std::coutPrint();[由于父类和子类的Print函数都非虚,所以根据指针类型决定调用关系]}8.请问下面这段程序的输出结果是_C_:A.2,1,B.2,2,C.1,2,D.1,1,classCP
2025/3/28 16:17:55 392KB 华为 C++ 笔试题
1
对于循环介绍编程就是让事情变得动态和高效,对吧?那么,使我们的代码更高效,更动态的是循环,很大一部分!它们使我们可以遍历集合中的每个元素,例如列表。
也许我们可以通过为集合中的每个元素写一行代码来做到这一点,但这不是很有效,是吗?一点都不。
使用循环,我们可以编写一行代码,对集合中的每个元素进行操作。
太酷了吧?让我们开始吧!学习目标了解如何编写for循环查看可以使用不同的循环方式什么是for循环,我该怎么写?Python中的for循环主要用于一个列表的元素一个接一个的循环。
我们将以一个包含4个元素0,1,2,3的简单集合为例。
没有循环,如果我们要打印列表中的每个元素,就必须像下面那样将其写出:zero_to_three=[0,1,2,3]print(zero_to_three[0])print(zero_to_thr
2025/3/28 4:53:32 154KB JupyterNotebook
1
智能小车超声波避障实验+源码(有舵机)接线示意图.程序中电脑打印数值部分在试验时要屏蔽,这样不会影响小车遇到障碍物的反应速度。
//调试时可以打开屏蔽内容Serial.print,打印测到的距离//本实验控制速度的pwm值和延时均有调节,但还是配合实际情况,实际电量调节数值
2025/1/22 6:50:49 321KB arduino
1
共 74 条记录 首页 上一页 下一页 尾页
在日常工作中,钉钉打卡成了我生活中不可或缺的一部分。然而,有时候这个看似简单的任务却给我带来了不少烦恼。 每天早晚,我总是得牢记打开钉钉应用,点击"工作台",再找到"考勤打卡"进行签到。有时候因为工作忙碌,会忘记打卡,导致考勤异常,影响当月的工作评价。而且,由于我使用的是苹果手机,有时候系统更新后,钉钉的某些功能会出现异常,使得打卡变得更加麻烦。 另外,我的家人使用的是安卓手机,他们也经常抱怨钉钉打卡的繁琐。尤其是对于那些不太熟悉手机操作的长辈来说,每次打卡都是一次挑战。他们总是担心自己会操作失误,导致打卡失败。 为了解决这些烦恼,我开始思考是否可以通过编写一个全自动化脚本来实现钉钉打卡。经过一段时间的摸索和学习,我终于成功编写出了一个适用于苹果和安卓系统的钉钉打卡脚本。
2024-04-09 15:03 15KB 钉钉 钉钉打卡