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

基于Android的记事本APP设计与实现:从需求分析到功能实现(超级简单记事本,附源码+文档报告)

基于Android的记事本APP设计与实现:从需求分析到功能实现

(以前大学课堂作业,抄在这里当个回忆吧)

引言

随着社会的不断进步,信息化建设不断发展,电子文字输入在生活、学习、工作中占有越来越重要的作用。相比于传统的手动记录方式,电子记事本因其便捷性和高效性,逐渐成为人们记录事件的首选工具。本文将详细介绍一款基于Android平台的记事本APP的设计与实现过程,涵盖需求分析、总体方案设计、功能实现、数据库设计等内容,帮助读者全面了解如何从零开始开发一款简单的记事本应用。

1. 需求分析

随着生活节奏的加快,人们越来越依赖电子设备来记录日常事务。传统的纸质记事本虽然有其独特的优势,但在便捷性和存储容量上已经无法满足现代人的需求。因此,开发一款简单、易用的记事本APP显得尤为重要。

1.1 用户需求

  • 记录事件:用户可以通过APP快速记录日常事务,避免遗忘重要事项。
  • 查看事件:用户可以随时查看已记录的事件,了解待办事项。
  • 删除事件:已完成的事件可以及时删除,保持界面整洁。
  • 简单易用:APP界面简洁,操作简单,用户无需复杂的学习成本即可上手。

1.2 市场需求

目前市场上已有许多记事本类APP,功能丰富且界面华丽,但大多数用户更关注的是能否快速记录事件,而不是过多的花哨功能。因此,开发一款功能简单、界面简洁的记事本APP,能够更好地满足用户的实际需求。

2. 总体方案设计

2.1 设计方案

本次设计的主要目标是锻炼动手操作能力和实践能力,积累项目开发经验。通过本次APP开发,能够更好地掌握Android开发的相关知识和技能,提升职业素养,为未来的工作打下基础。

2.2 设计内容

2.2.1 页面设计

APP主要设计了三个页面:主页面、添加事件页面和删除事件页面。用户可以直接进入APP进行事件的添加、查看和删除操作。界面设计以简洁为主,采用白色背景,文字大小、字体、颜色等都经过精心设计,确保用户操作时的舒适感。

2.2.2 后台设计

APP不区分客户端和管理员,所有用户都可以直接使用APP进行事件的记录。权限方面没有特殊设置,用户无需注册登录即可使用。

2.3 系统总体设计方案思路

记事本APP主要分为三个模块:主页展示、添加事件、删除事件。用户进入APP后,可以直接看到已添加的事件,点击事件可以进行查看,已完成的事件可以进行删除。

整体设计思路如下:

  • Android开发:使用Android Studio作为开发环境。
  • 数据库:采用SQLite作为本地数据库。
  • UI界面:使用Java进行页面布局和跳转。
  • 功能完善:通过Java代码实现数据的增删改查功能。

2.4 详细设计思路

功能的设计与实现流程如下:

  1. 打开APP,进入主界面。
  2. 主界面展示已添加的事件。
  3. 用户可以点击“添加事件”按钮,进入添加事件页面。
  4. 添加完成后,返回主界面,事件展示在主页面。
  5. 用户可以点击事件进行查看,或长按事件进行删除。
  6. 退出APP时,需要按两次返回键确认退出。

2.5 技术方案

2.5.1 技术架构
  • 开发环境:Android Studio
  • 开发语言:Java
  • 数据库:SQLite
2.5.2 模块化设计

采用MVC(Model-View-Controller)模式,将界面(View)模块和数据处理(Model)模块通过Java代码进行控制,便于团队分工和后期维护。

2.5.3 优先原则

为了便于后续的功能扩展和维护,优先采用MVC模式进行开发,确保代码结构清晰,模块功能明确。

2.6 技术路线及规范

  1. 需求分析:根据用户需求确定APP的基本功能。
  2. 系统设计:包括开发语言、数据库设计、界面设计等。
  3. 代码编写与调试:根据系统设计完成代码编写,并进行功能调试。
  4. 软件测试:进行功能测试,确保APP的稳定性和可靠性。
  5. 系统集成与部署:将APP部署到Android设备上,进行实际运行测试。

2.7 工具设备要求

  • 数据库:SQLite
  • 开发工具:Android Studio
  • 系统要求:Windows 7/Windows 10,内存4GB
  • 开发语言:Java

2.8 实现方案

通过MVC模式和SQLite数据库的结合,实现记事本APP的基本功能。用户可以直接进入APP进行事件的添加、查看和删除操作,操作简单易懂,减少了用户的学习成本。

3. 功能设计

3.1 用户主要功能

  • 主页面展示:展示已添加的事件。
  • 添加事件:用户可以添加新的事件。
  • 查看事件:点击事件可以查看详细信息。
  • 删除事件:长按事件可以进行删除。
  • 退出APP:按两次返回键退出APP。

3.2 系统功能细分

  • 主页事件展示:用户进入APP后,主页面展示已添加的事件。
  • 事件添加:用户可以根据需求添加新的事件。
  • 事件查看:点击事件可以查看详细信息。
  • 事件删除:长按事件可以进行删除。
  • 退出记事本:按两次返回键退出APP。

3.3 性能特点

  • 可扩展性好:模块化设计,便于后续功能扩展。
  • 界面友好:操作简单,用户易于掌握。
  • 数据存储量大:SQLite数据库支持大量数据存储,未来扩展性强。

4. 数据库设计

4.1 SQLite技术

SQLite是一款轻量级的嵌入式数据库,具有自给自足、无服务器、零配置等特点,非常适合移动设备的本地数据存储。

4.2 Android技术

Android是一个开源的移动操作系统,基于Linux内核,广泛应用于智能手机和平板电脑等设备。Android开发使用Java语言,入门门槛较低,适合快速开发。

4.3 Java技术

Java是一种面向对象的编程语言,具有平台无关性、安全性、健壮性等特点。Java广泛应用于Web开发、移动开发等领域,是Android开发的主要语言。

5. 界面实现

APP界面设计以简洁为主,采用白色背景,文字大小、字体、颜色等都经过精心设计,确保用户操作时的舒适感。用户可以直接进入APP进行事件的添加、查看和删除操作,操作简单易懂。

6. 功能实现

6.1 开源部分功能

6.1.1 主页展示模块

主页展示模块的核心代码如下:

package com.example.notebook.activity;import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import com.chad.library.adapter.base.BaseQuickAdapter;
import com.example.notebook.R;
import com.example.notebook.adapter.NotebookAdapter;
import com.example.notebook.bean.NotebookBean;import com.example.notebook.db.DBManager;import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private static final String TAG = MainActivity.class.getSimpleName();private static final int QR_CODE = 1001;private static final int REQUEST_CODE = 1002;private RecyclerView recyclerView;private Button btnAdd;private List<NotebookBean> mNotebookList;private NotebookAdapter mAdapter;private DBManager mDBManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);checkPermission();initView();initRecyclerView();mDBManager = new DBManager(this);getNotebookList();}private void initView() {recyclerView = findViewById(R.id.recycler_view);btnAdd = findViewById(R.id.btn_add);btnAdd.setOnClickListener(this);}private void initRecyclerView() {mNotebookList = new ArrayList<>();mAdapter = new NotebookAdapter(R.layout.item_notebook, mNotebookList);recyclerView.setLayoutManager(new LinearLayoutManager(this));recyclerView.setAdapter(mAdapter);mAdapter.bindToRecyclerView(recyclerView);mAdapter.setEmptyView(R.layout.view_no_data);mAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {@Overridepublic void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {Intent intent = new Intent(MainActivity.this, AddNotebookActivity.class);intent.putExtra("isAdd", false);intent.putExtra("notebook", mNotebookList.get(position));startActivityForResult(intent, REQUEST_CODE);}});mAdapter.setOnItemChildLongClickListener(new BaseQuickAdapter.OnItemChildLongClickListener() {@Overridepublic boolean onItemChildLongClick(BaseQuickAdapter adapter, View view, int position) {showDeleteDialog(position, mNotebookList.get(position).getNotebookId());return true;}});}private void getNotebookList() {mNotebookList.clear();mNotebookList.addAll(mDBManager.selectNotebookList());mAdapter.notifyDataSetChanged();}private void showDeleteDialog(final int position, final int notebookId) {View view = LayoutInflater.from(this).inflate(R.layout.dialog_delete_notebook, null, false);AlertDialog.Builder builder = new AlertDialog.Builder(this).setView(view);final AlertDialog alertDialog = builder.create();alertDialog.show();alertDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);view.findViewById(R.id.btn_confirm).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mDBManager.deleteNotebook(notebookId);alertDialog.dismiss();mNotebookList.remove(position);mAdapter.notifyItemRemoved(position);mAdapter.notifyItemRangeChanged(position, mNotebookList.size() - position);}});view.findViewById(R.id.btn_cancel).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {alertDialog.dismiss();}});}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.btn_add:Intent intent = new Intent(MainActivity.this, AddNotebookActivity.class);intent.putExtra("isAdd", true);startActivityForResult(intent, REQUEST_CODE);break;}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {getNotebookList();}}private boolean keyPress = true;@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {if (keyPress) {Toast.makeText(MainActivity.this, "再按一次返回键退出记事本", Toast.LENGTH_SHORT).show();keyPress = false;new Timer().schedule(new TimerTask() {@Overridepublic void run() {keyPress = true;}}, 2000);} else {finish();}return false;}return super.onKeyDown(keyCode, event);}private List<String> requestPermissions;private static String[] permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};private boolean checkPermission() {boolean flag = true;requestPermissions = new ArrayList<>();if (ContextCompat.checkSelfPermission(this, permissions[0]) == PackageManager.PERMISSION_DENIED) {requestPermissions.add(permissions[0]);flag = false;}if (ContextCompat.checkSelfPermission(this, permissions[1]) == PackageManager.PERMISSION_DENIED) {requestPermissions.add(permissions[1]);flag = false;}return flag;}
}

6.2 个人编写功能

6.2.1 添加记事功能模块

添加记事功能模块的核心代码如下:

package com.example.notebook.activity;import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;import com.example.notebook.R;
import com.example.notebook.bean.NotebookBean;
import com.example.notebook.db.DBManager;public class AddNotebookActivity extends AppCompatActivity implements View.OnClickListener {private ImageView imageBack;private ImageView imageDelete;private EditText editContent;private Button btnSave;private TextView tvTitle;private boolean bIsAdd;private DBManager mDBManager;private int mNotebookId;private NotebookBean mNotebookBean;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_add_notebook);initView();mDBManager = new DBManager(this);bIsAdd = getIntent().getBooleanExtra("isAdd", true);if (bIsAdd) {imageDelete.setVisibility(View.GONE);} else {mNotebookBean = getIntent().getParcelableExtra("notebook");imageDelete.setVisibility(View.VISIBLE);btnSave.setVisibility(View.GONE);editContent.setText(mNotebookBean.getContent());}}private void initView() {imageBack = findViewById(R.id.image_back);imageDelete = findViewById(R.id.image_delete);editContent = findViewById(R.id.edit_notebook);btnSave = findViewById(R.id.btn_save);tvTitle = findViewById(R.id.tv_title);imageBack.setOnClickListener(this);imageDelete.setOnClickListener(this);btnSave.setOnClickListener(this);editContent.setOnFocusChangeListener(new View.OnFocusChangeListener() {@Overridepublic void onFocusChange(View view, boolean b) {if (b && !bIsAdd) {btnSave.setVisibility(View.VISIBLE);imageDelete.setVisibility(View.GONE);tvTitle.setText("编辑记事本");}}});}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.image_back:finish();break;case R.id.image_delete:showDeleteDialog();break;case R.id.btn_save:save(editContent.getText().toString().trim());break;}}private void save(String content) {if (TextUtils.isEmpty(content)) {Toast.makeText(AddNotebookActivity.this, "您还未输入内容", Toast.LENGTH_SHORT).show();} else {if (mNotebookBean != null) {mNotebookBean.setContent(content);mNotebookBean.setEditTime(System.currentTimeMillis());mDBManager.updateNotebook(mNotebookBean);} else {NotebookBean notebookBean = new NotebookBean();notebookBean.setContent(content);notebookBean.setEditTime(System.currentTimeMillis());mDBManager.insertNotebook(notebookBean);}setResult(RESULT_OK);finish();}}private void showDeleteDialog() {View view = LayoutInflater.from(this).inflate(R.layout.dialog_delete_notebook, null, false);AlertDialog.Builder builder = new AlertDialog.Builder(this).setView(view);final AlertDialog alertDialog = builder.create();alertDialog.show();alertDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);view.findViewById(R.id.btn_confirm).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mDBManager.deleteNotebook(mNotebookBean.getNotebookId());setResult(RESULT_OK);finish();alertDialog.dismiss();}});view.findViewById(R.id.btn_cancel).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {alertDialog.dismiss();}});}
}

7. 工作小结

通过本次记事本APP的设计与实现,我学到了很多关于Android开发的知识,尤其是在数据库操作和界面设计方面有了更深入的理解。虽然在开发过程中遇到了许多挑战,但通过团队的合作和老师的指导,最终顺利完成了项目。这次项目不仅提升了我的编程能力,也让我更加明确了未来的学习方向。

结语

本次记事本APP的设计与实现是一个非常有意义的项目,它不仅帮助我巩固了所学的知识,还让我在实践中积累了宝贵的经验。希望通过本文的分享,能够帮助更多对Android开发感兴趣的读者,快速入门并掌握基本的开发技能。

好的,关于这个问题我们今天就先分享到这里,希望能帮助到屏幕前为代码发愁的您。如果觉得有帮助,希望能在Taobao搜索“鹿溪IT工作室”买一个Android小项目来练手,友友们给个好评,支持一下创作者不易。点击下方链接获取项目源代码和文档报告。
简单记事本带文档

相关文章:

基于Android的记事本APP设计与实现:从需求分析到功能实现(超级简单记事本,附源码+文档报告)

基于Android的记事本APP设计与实现&#xff1a;从需求分析到功能实现 &#xff08;以前大学课堂作业&#xff0c;抄在这里当个回忆吧&#xff09; 引言 随着社会的不断进步&#xff0c;信息化建设不断发展&#xff0c;电子文字输入在生活、学习、工作中占有越来越重要的作用…...

eNSP中路由器的CON/AUX接口、GE Combo接口、Mini USB接口、USB接口、WAN侧uplink接口、FE接口、GE接口介绍

路由器常见接口的详细介绍及其应用示例&#xff1a; 1. CON/AUX 接口 全称&#xff1a;Console/Auxiliary&#xff08;控制台/辅助接口&#xff09;作用&#xff1a; CON&#xff08;Console&#xff09;&#xff1a;通过命令行界面&#xff08;CLI&#xff09;直接配置路由器…...

Hello Mr. My Yesterday日文歌词附假名注音,祭奠逝去的青春

hello mr. my yesterday Hundred Percent Free Hello Mr. my yesterday云っておくれよ “夢叶うその瞬間にまた逢える”と 前方の幾多前途多難の未知 後方の道後悔も知った 経験と価値 夢なかば 一本の道結果だが ひとつだけ知りたいよ 神様がいるのなら “幸せの定義っ…...

ubuntu ollama+dify实践

安装ollama 官网的指令太慢了&#xff0c;使用以下指令加速&#xff1a; export OLLAMA_MIRROR"https://ghproxy.cn/https://github.com/ollama/ollama/releases/latest/download" curl -fsSL https://ollama.com/install.sh | sed "s|https://ollama.com/dow…...

S7-1200 G2移植旧版本S7-1200程序的具体方法示例

S7-1200 G2移植旧版本S7-1200程序的具体方法示例 前期概要: S7-1200 G2必须基于TIA博途V20,之前的程序可通过移植的方式在新硬件上使用。 该移植工具可自动将TIA Portal 项目从 S7-1200 移植到更新的S7-1200 G2。 注意: 该插件支持在同一TIA Portal项目实例内将软件和/或硬…...

新办公室哪款空气净化器除甲醛效果好?高效除甲醛,提升效率

现代办公环境中&#xff0c;空气质量对员工的健康与工作效率产生着不可忽视的影响。尤其是新装修的办公室&#xff0c;往往因为空气中的甲醛浓度超标而导致一系列健康问题。因此&#xff0c;选择一款性能优越的除甲醛空气净化器就显得尤为重要。合适的空气净化器不仅可以有效过…...

塑造企业数字化形象:企业信息化UI界面设计的关键要素

引言 在数字化转型的大潮中&#xff0c;企业信息化系统的UI&#xff08;用户界面&#xff09;界面设计不仅是技术实现的最后一环&#xff0c;更是塑造企业数字化形象、提升用户体验、增强业务效率的重要手段。优秀的UI设计能够直观展现企业价值观&#xff0c;提升用户粘性&…...

大视频背景暗黑风格的wordpress企业主题免费下载

整体风格是黑色的&#xff0c;首页首屏大视频背景&#xff0c;动态效果非常好。向下滚动时&#xff0c;滚动的特效也不错。 原文 https://www.bixugao.com/wp/26.html...

CUDA编程之内存零拷贝技术

一、实现原理 零拷贝内存通过将‌主机锁页内存‌直接映射到设备地址空间&#xff0c;实现CPU与GPU共享内存&#xff0c;避免显式数据拷贝‌。锁页内存通过cudaHostAlloc或cudaHostRegister分配&#xff0c;确保物理地址固定且不被操作系统换页&#xff0c;从而支持DMA&#xff…...

C语言基础知识04

指针 指针概念 指针保存地址&#xff0c;地址是字节的编号 指针类型和保存的地址类型要一直 使用时注意&#xff0c;把地址转换为&变量的格式来看 int a[3]; a转为&a[0] 指针的大小 64bit 固定8字节&#xff0c; 32bit 固定4字节 指针…...

在 Java 中,== 和 equals 的区别

1. 运算符 作用&#xff1a;比较两个对象的 内存地址&#xff08;引用类型&#xff09;或 值&#xff08;基本数据类型&#xff09;。 适用场景&#xff1a; 基本数据类型&#xff08;int, char, boolean 等&#xff09;&#xff1a;直接比较值是否相等。 引用类型&#xff…...

Qt开发:QtWebEngine中操作选择文本

查找选择 在QtWebEngine中&#xff0c;可以使用QWebEnginePage的findText方法来查找文本&#xff0c;查找成功以后&#xff0c;将自动选择当前文本。 QWebEnginePage可以通过QWebEngineView的page()来取得。 比如&#xff0c;如下代码可以在页面中查找hello,world并选择。 …...

VUE的脚手架搭建引入类库

VUE的小白脚手架搭建 真的好久好久自己没有发布自己博客了,对于一直在做后端开发的我 ,由于社会卷啊卷只好学习下怎么搭建前端,一起学习成长吧~哈哈哈(最终目的,能够懂并简易开发) 文章目录 VUE的小白脚手架搭建1.下载node.js2.安装vue脚手架3.创建一个项目4.代码规范约束配置(…...

分布式系统日志排查综合场景

排查背景 在一个大型分布式电商系统中&#xff0c;用户反馈在进行商品结算时出现了报错。系统由多个子系统构成&#xff0c;包括商品管理系统、订单系统、支付系统等&#xff0c;各子系统分布在不同服务器上&#xff0c;且日志文件分散存储。 排查过程 确定当前位置并切换到可…...

android lmkd.rc 介绍

service service lmkd /system/bin/lmkdclass coreuser lmkdgroup lmkd system readproccapabilities DAC_OVERRIDE KILL IPC_LOCK SYS_NICE SYS_RESOURCEcriticalsocket lmkd seqpacketpasscred 0660 system systemtask_profiles ServiceCapacityLow属于核心服务组&#xff0…...

Android Studio执行Run操作报Couldn‘t terminate previous instance of app错误

步骤1、在项目根目录下build.gradle文件最后添加如下内容 //自定义任务名&#xff1a;assembleAndInstall tasks.register(assembleAndInstall, Exec.class, new Action<Exec>() {Overridevoid execute(Exec exec) {//设置自定义任务组名exec.setGroup(custom task)//当…...

Matlab 双线性插值(二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 双线性插值是一种 二维插值方法,用于计算 栅格(Grid) 或 像素点 之间的插值值。它主要用于 图像缩放、旋转、变换 等操作,以在新像素位置估算灰度值或颜色值。 如上图所示,假设存在一个二维离散函数(如图像)…...

1700. 无法吃午餐的学生数量

无法吃午餐的学生数量 题目描述尝试做法推荐做法 题目描述 学校的自助午餐提供圆形和方形的三明治&#xff0c;分别用数字 0 和 1 表示。所有学生站在一个队列里&#xff0c;每个学生要么喜欢圆形的要么喜欢方形的。 餐厅里三明治的数量与学生的数量相同。所有三明治都放在一个…...

uv命令介绍(高性能Python包管理工具,旨在替代pip、pip-tools和virtualenv等传统工具)

文章目录 **主要功能**1. **快速安装和管理 Python 包**2. **生成和管理锁文件 (requirements.lock)**3. **创建虚拟环境**4. **与 poetry 兼容** **核心优势**1. **极快的速度**&#xff1a;基于 Rust 实现&#xff0c;利用多线程和缓存大幅加速依赖解析。2. **轻量且独立**&a…...

杨辉三角形(信息学奥赛一本通-2043)

【题目描述】 例5.11 打印杨辉三角形的前n(2≤n≤20)行。杨辉三角形如下图&#xff1a; 当n5时 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 输出&#xff1a; 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 【输入】 输入行数n。 【输出】 输出如题述三角形。n行&#…...

使用easyexcel实现单元格样式设置和下拉框设置

1.单元格样式设置 1.1实体类 public class DemoData {ExcelProperty("PK")private String name;ExcelProperty("年龄")private int age;// 必须提供无参构造方法public DemoData() {}public DemoData(String name, int age) {this.name name;this.age …...

TCP 三次握手四次挥手过程详解

注&#xff1a;本文为 “TCP 的三次握手与四次挥手” 相关文章合辑。 英文引文&#xff0c;机翻未校。 中文引文&#xff0c;未整理去重。 英文引文第二篇&#xff0c;实为国内《稀土掘金技术社区》文章&#xff0c;没检索到原文&#xff0c;此处 “出口转内销” 。 如有内…...

射频相关概念

射频&#xff08;Radio Frequency, RF) 是电磁波谱中频率范围在 3 kHz 到 300GHz的电磁波&#xff0c;广泛应用于通信、雷达、广播、医疗等领域。其基本原理涉及电磁波的产生、传播、调制与解调&#xff0c;以及射频系统的设计。以下是射频技术的核心要点&#xff1a; 1. 电磁…...

几款可用于绘制工艺原理图的开源框架

一、LogicFlow 由滴滴团队开发的开源流程图框架&#xff0c;支持高度定制的工艺原理图绘制。 • 核心特性&#xff1a; • 提供拖拽式界面和丰富的节点类型&#xff08;矩形、圆形、多边形等&#xff09;&#xff0c;支持自定义节点形状、样式和交互逻辑。 • 支持插件扩展&am…...

27.卷2的答案

CSP-J离我们不远了&#xff0c;加加油啦&#xff01; 1.堆排序最坏时间复杂度是&#xff1f; 解析&#xff1a;平时多多练习可知&#xff0c;最坏时间复杂度是O(n log n)。 2.哪条能将s中的数值保留一位&#xff0c;并将第二位四舍五入&#xff1f; 解析&#xff1a;经过试…...

程序编译生成的文件

目录 .i 文件 .s 文件 .o文件 总结 在 C 编程中&#xff0c;.i、.s和 .o 文件是编译过程中生成的不同阶段的文件&#xff0c;它们代表不同的含义&#xff1a; .i 文件 全称 &#xff1a;预处理后的文件&#xff08;Intermediate File&#xff09;。 含义&#xff1a;.i文件…...

C++类的基础题(4)

练习1&#xff1a;&#xff08;简单&#xff09; 基于如下程序&#xff0c;按要求修改和完善。 #include <iostream> using namespace std; class Student {public: Student(int n,float s):num(n),score(s){} void change(int n,float s) {numn;scores;} void displ…...

浏览器中输入某个地址后发生了什么

首先浏览器会进行DNS解析&#xff0c;将网址中的域名&#xff08;比如&#xff1a;jcm.com&#xff09;解析为IP地址。理解&#xff1a;DNS为电话本&#xff0c;域名为名字&#xff0c;IP地址为电话号码&#xff1b;其次浏览器需要和网站服务器建立连接&#xff0c;也就是通过三…...

MindGYM:一个用于增强视觉-语言模型推理能力的合成数据集框架,通过生成自挑战问题来提升模型的多跳推理能力。

2025-03-13&#xff0c;由中山大学和阿里巴巴集团的研究团队提出了MindGYM框架&#xff0c;通过合成自挑战问题来增强视觉-语言模型&#xff08;VLMs&#xff09;的推理能力。MindGYM框架通过生成多跳推理问题和结构化课程训练&#xff0c;显著提升了模型在推理深度和广度上的表…...

WPS 搭配 Zotero 插件使用

安装Zotero后&#xff0c;Word自动引入了插件&#xff0c;但WPS却没有&#xff0c;做为WPS的重度用户&#xff0c;这是不行的。 解决方案&#xff1a; 1.找到 Zotero.dotm 一般在安装目录下&#xff0c; 2.然后复制到WPS的startup下 我的目录是&#xff1a;C:\Users\lianq…...