《Android编程权威指南》之第二个activity源码及挑战

文章目录

  • 前言
  • 效果图
  • 依赖
  • Mainactivity
    • Kotlin的“ ?”
      • kotlin的符号
  • QuizViewModel
  • Question类
  • CheatActivity
    • onBackPressed()
    • companion
  • CheatViewModel
  • string.xml

前言

实现禁止一题多答,按题记录作弊状态、偷看次数限制、横竖屏切换依旧保存状态数据
个人思维的项目分析
在这里插入图片描述

效果图

请添加图片描述
请添加图片描述

依赖

android {
....buildFeatures {viewBinding true//kotlin数据绑定}
}
dependencies {//生命周期implementation 'androidx.constraintlayout:constraintlayout:1.1.2'implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
}

Mainactivity

import android.app.Activity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityOptionsCompat
import androidx.lifecycle.ViewModelProvider
import com.example.myapplication.databinding.ActivityMainBindingprivate const val TAG = "MainActivity"
private const val KEY_INDEX = "index"
const val EXTRA_ANSWER_SHOW = "extra_answer_show"
const val DEFAULT_CAN_CHEAT_NUM: Int = 3
const val KEY_CHEAT_NUM = "cheat_num"class MainActivity : AppCompatActivity() {private lateinit var mBinding: ActivityMainBindingprivate val quizViewModel by lazy { ViewModelProvider(this)[QuizViewModel::class.java] }/*** 当启动一个新的Activity并等待其结果时,如果这个新Activity表明用户可能作弊(通过显示答案),那么就增加用户的作弊次数并更新这个数值*/private val startForResult =//启动一个新Activity并等待其结果的函数。// ActivityResultContracts.StartActivityForResult()是一个预定义的合约,用于处理StartActivityForResult的请求和结果registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {//检查新Activity的返回结果是否为"OK"的代码。// "it"是一个包含Activity结果的Bundle对象。// 如果新Activity成功完成(即没有错误),那么它的返回码将是Activity.RESULT_OKif (it.resultCode == Activity.RESULT_OK) {quizViewModel.isCheater =//尝试从返回的Bundle中获取名为EXTRA_ANSWER_SHOW的布尔值,如果这个值不存在,那么就返回默认值falseit.data?.getBooleanExtra(EXTRA_ANSWER_SHOW, false) ?: falseif (quizViewModel.isCheater) {// 如果偷看了答案quizViewModel.cheatNum++updateCheatNum()}}}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)mBinding = ActivityMainBinding.inflate(layoutInflater)setContentView(mBinding.root)if (savedInstanceState != null) {quizViewModel.currentIndex = savedInstanceState.getInt(KEY_INDEX, 0)quizViewModel.cheatNum = savedInstanceState.getInt(KEY_CHEAT_NUM, 0)}Log.i(TAG, "onCreate(savedInstanceState: Bundle?) called")// 回答问题mBinding.trueButton.setOnClickListener { checkAnswer(true) }mBinding.falseButton.setOnClickListener { checkAnswer(false) }// 下个问题mBinding.nextButton.setOnClickListener {quizViewModel.moveToNext()updateQuestion()}// 上个问题mBinding.preButton.setOnClickListener {quizViewModel.moveToPre()updateQuestion()}// 点文字下个问题mBinding.questionTextView.setOnClickListener {quizViewModel.moveToNext()updateQuestion()}// 偷看答案mBinding.btnCheat.setOnClickListener {val answer = quizViewModel.currentQuestionAnswerval option =//创建一个ClipReveal动画ActivityOptionsCompat.makeClipRevealAnimation(it, 0, 0, it.width, it.height)//启动一个新的Activity。startForResult是一个方法,用于启动一个新的Activity并等待其结果startForResult.launch(CheatActivity.newIntent(this, answer), option)}mBinding.tvResult.setOnClickListener {getScoreResult()}// 更新问题updateQuestion()//更新查看答案次数updateCheatNum()}/*** 更新问题*/private fun updateQuestion() {val questionTextResId = quizViewModel.currentQuestionTextmBinding.questionTextView.setText(questionTextResId)
//如果quizViewModel.mQuestionsAnswered不为null,
//并且其第quizViewModel.currentIndex个元素不为null,则将按钮设置为启用状态(即true),否则设置为禁用状态(即false)setBtnEnabled(!quizViewModel.mQuestionsAnswered?.get(quizViewModel.currentIndex)!!)}private fun updateCheatNum() {var canCheatNum = DEFAULT_CAN_CHEAT_NUM - quizViewModel.cheatNummBinding.tvCheatNum.text = "还可以偷看答案 $canCheatNum 次"if (canCheatNum == 0) {mBinding.btnCheat.isEnabled = false}}/***检测选的答案  里面还需要更新回答正确的题目数,以及已经回答过的题目index*/private fun checkAnswer(userAnswer: Boolean) {// 得到当前题目的答案val correctAnswer = quizViewModel.currentQuestionAnswerval messageResId = when {//如果偷看了答案答题quizViewModel.isCheater -> R.string.judgment_toast//没有作弊答题userAnswer == correctAnswer -> {// 回答正确的题目数量quizViewModel.mTrueAnswerCount++R.string.correct_toast}else ->R.string.incorrect_toast}Toast.makeText(this, messageResId, Toast.LENGTH_SHORT).show()setBtnEnabled(false)//如果用户已经回答了当前的问题(即在mQuestionsAnswered列表的currentIndex位置已经有值),那么就将这个值设置为truequizViewModel.mQuestionsAnswered?.set(quizViewModel.currentIndex, true)// 重置一下是否偷看了答案,此题回答过了,一来不可重复回答,二来解决回答下个问题时此参数还是原来的quizViewModel.isCheater = false}//成绩private fun getScoreResult() {//检查用户是否回答了所有的问题,对于每个问题,如果用户没有回答,就将isAllAnswered设置为false,并立即结束循环。// 如果对所有问题用户都已回答(即isAllAnswered保持为truevar isAllAnswered = true
//        for (i in 0 until quizViewModel.questionSize) {
//            if (!quizViewModel.mQuestionsAnswered?.get(i)!!) {
//                isAllAnswered = false
//                return
//            }//       }if (isAllAnswered) {Toast.makeText(this,"${quizViewModel.mTrueAnswerCount * 100 / quizViewModel.questionSize}",Toast.LENGTH_LONG).show()//mBinding.tvResult.text = "评分:${quizViewModel.mTrueAnswerCount * 100 / quizViewModel.questionSize} "}}override fun onStart() {super.onStart()Log.i(TAG, "onStart() called")}override fun onResume() {super.onResume()overridePendingTransition(0, 0);Log.i(TAG, "onResume() called")}override fun onPause() {super.onPause()Log.i(TAG, "onPause() called")}override fun onStop() {super.onStop()Log.i(TAG, "onStop() called")}override fun onDestroy() {super.onDestroy()Log.i(TAG, "onDestroy() called")}//横竖屏切换时调用方法,保存数据,在create中取出override fun onSaveInstanceState(savedInstanceState: Bundle) {super.onSaveInstanceState(savedInstanceState)Log.i(TAG, "onSaveInstanceState")savedInstanceState.putInt(KEY_INDEX, quizViewModel.currentIndex)// 当前显示的题目的indexsavedInstanceState.putInt(KEY_CHEAT_NUM, quizViewModel.cheatNum)// 偷看答案次数}// 禁止一题多答,设置button状态private fun setBtnEnabled(enabled: Boolean) {mBinding.trueButton.isEnabled = enabledmBinding.falseButton.isEnabled = enabled}
}

Kotlin的“ ?”

在 Kotlin 中,? 是一个可空类型标记符,用于表示某个变量可以为空(null)。

可以使用 ? 标记来声明一个可空类型的变量,例如:

var nullableString: String? = null

在上面的例子中,我们声明了一个类型为 String? 的变量 nullableString,它可以存储一个字符串或空值(null)。

当我们使用可空类型时,需要注意使用安全调用运算符 ?. 避免空指针异常。

例如,以下代码将仅在 nullableString 不为 null 时打印字符串:

nullableString?.let { println(it) }

还可以使用非空断言运算符 !! 来操作可空类型的变量,但是需要注意,如果该变量为 null,将会触发空指针异常。因此,应该尽量避免使用 !!

总之,在 Kotlin 中,使用 ? 标记符可以确保代码的健壮性,避免空指针异常。

kotlin的符号

在 Kotlin 中,符号 . 用于引用类的成员,例如:

val list = listOf(1, 2, 3)
list.size // 使用 . 符号访问 list 对象的 size 属性
list.get(0) // 等价于 list[0],使用 [] 符号访问 list 对象的成员函数或下标运算符

另外,Kotlin 中还有一些其他的符号:

  • =:用于赋值或复制操作,例如:val b = a。注意,它不同于 Java 中的 == 相等运算符。
  • ?:: Elvis 运算符,用于当一个变量为 null 时提供一个默认值,例如:val result = nullableVariable ?: defaultValue
  • !!:非空断言(Not-null Assertion)运算符,用于断言一个变量不为 null,并强制进行类型转换,例如:val strLength = str!!.length
  • ?:可空类型标记符,用于表示某个变量可以为空(null),例如:var nullableString: String? = null
  • :::引用一个类或函数的引用,例如:val functionRef = :: functionName 表示 functionRef 是一个对 functionName 函数的引用。

以上是 Kotlin 中的一些常用符号,当然,还有其他的一些符号,如Lambda表达式中的->、区间运算符..等,都是 Kotlin 中的基础语法符号,需要深入了解。

QuizViewModel

使用ViewModel,可以把所有要显示在用户界面上的数据汇集在一处,统一格式化加工处理供其他对象获取

import android.util.Log
import androidx.lifecycle.ViewModel
import com.pyn.androidguide.Questionprivate const val TAG = "QuizViewModel"class QuizViewModel : ViewModel() {// 当前显示的题目的indexvar currentIndex = 0// 回答正确的题目数量var mTrueAnswerCount = 0// 是否偷看了答案var isCheater = false// 偷看答案次数,默认0var cheatNum = 0// 题目库private val questionBank = listOf(Question(R.string.question_australia, true),Question(R.string.question_oceans, true),Question(R.string.question_mideast, false),Question(R.string.question_africa, false),Question(R.string.question_americas, true),Question(R.string.question_asia, true))// 已经回答过的问题var mQuestionsAnswered: BooleanArray? = BooleanArray(questionBank.size)// 得到当前题目的答案val currentQuestionAnswer: Boolean get() = questionBank[currentIndex].answer// 得到当前题目文本val currentQuestionText: Int get() = questionBank[currentIndex].textResId// 得到当前总题目数量val questionSize: Int get() = questionBank.size// 移动下一个题目fun moveToNext() {currentIndex = (currentIndex + 1) % questionBank.size}// 上一个题目fun moveToPre(){currentIndex = (currentIndex + questionBank.size - 1) % questionBank.size}// testinit {Log.i(TAG, "ViewModel instance created")}/*** On cleared* onCleared()函数的调用恰好在ViewModel被销毁之前。适合做一些善后清理工作,比如解绑某个数据源。*/override fun onCleared() {super.onCleared()Log.i(TAG, "ViewModel instance about to destroyed")}
}

Question类

data class Question(@StringRes val textResId: Int, val answer: Boolean)

data 是一个关键字,用于在类中自动生成一些特殊的方法。当你在类声明中使用 data 关键字时,Kotlin 会自动为这个类生成以下方法:

  1. equals(): 这个方法用于比较两个对象是否相等。在 data 类中,Kotlin 会自动将所有的属性用于 equals() 方法的比较。
  2. hashCode(): 这个方法返回对象的哈希码。在 data 类中,Kotlin 会自动为每个属性计算哈希码,并将其组合以产生最终的哈希码。
  3. toString(): 这个方法返回对象的字符串表示形式。在 data 类中,Kotlin 会自动将所有属性用于 toString() 方法的生成。
  4. Kotlin 还会为 data 类生成一个 copy() 方法,该方法用于创建一个新对象,其属性值与原始对象相同

CheatActivity

import android.app.Activity
import android.content.Context
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.ViewModelProvider
import com.example.myapplication.databinding.ActivityCheatBindingprivate const val EXTRA_ANSWER = "extra_answer"
private const val IS_SHOW_ANSWER = "is_show_answer"class CheatActivity : AppCompatActivity() {private lateinit var mBinding: ActivityCheatBindingprivate var answer = falseprivate val cheatViewModel by lazy { ViewModelProvider(this)[CheatViewModel::class.java] }override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)mBinding = ActivityCheatBinding.inflate(layoutInflater)setContentView(mBinding.root)if (savedInstanceState != null) {cheatViewModel.isShowAnswer = savedInstanceState.getBoolean(IS_SHOW_ANSWER, false)}answer = intent.getBooleanExtra(EXTRA_ANSWER, false)mBinding.btnShowAnswer.setOnClickListener {cheatViewModel.isShowAnswer = trueval answerText = when {answer -> R.string.true_buttonelse -> R.string.false_button}mBinding.tvAnswer.setText(answerText)}}// 每次返回的时候,把结果带回去,如果看了答案,则作弊机会-1override fun onBackPressed() {setAnswerShowResult(cheatViewModel.isShowAnswer)super.onBackPressed()}override fun onSaveInstanceState(savedInstanceState: Bundle) {super.onSaveInstanceState(savedInstanceState)savedInstanceState.putBoolean(IS_SHOW_ANSWER, cheatViewModel.isShowAnswer)}/*** 给第一个activity返回是否偷看了答案*/fun setAnswerShowResult(isAnswerShown: Boolean) {//创建了一个新的Intent对象,并通过apply函数添加了一个额外的数据val data = Intent().apply { putExtra(EXTRA_ANSWER_SHOW, isAnswerShown) }//将上述创建的Intent设置为这个Activity的返回结果。// Activity.RESULT_OK表示这个Activity的执行结果是成功的,而data则是与这个结果相关的数据setResult(Activity.RESULT_OK, data)}companion object {fun newIntent(packageContext: Context, answerIsTrue: Boolean): Intent {//Intent被初始化为以CheatActivity类作为目标(即这个Intent将被用来启动CheatActivity)。// apply是一个Kotlin函数,它允许在一个对象上执行一系列操作return Intent(packageContext, CheatActivity::class.java).apply {//使用putExtra方法将一个名为EXTRA_ANSWER_IS_TRUE的键和对应的值(即answerIsTrue)添加到Intent中putExtra(IS_SHOW_ANSWER, answerIsTrue)}}}
}

onBackPressed()

onBackPressed()方法是Android中的一个方法,用于处理用户按下设备上的“返回”按钮时的操作。当用户按下“返回”按钮时,系统会自动调用此方法。onBackPressed()方法通常被覆盖,以提供自定义的返回行为。例如,您可以使用onBackPressed()方法来关闭一个活动或片段,或在退出应用程序之前显示确认对话框。

companion

在Kotlin中,每个类都可以包含一个称为伴生对象的对象。关键字“companion”用于定义伴生对象。伴生对象类似于Java中的静态方法和变量。
伴生对象在类的内部定义,但是它的成员可以直接访问类的私有成员。它们还可以访问其伴生对象的私有成员。
伴生对象的使用如下:

class MyClass {// 外部无法访问,只能在该类的成员内部访问的属性或方法private val myPrivateVar = 10companion object {// 外部可直接访问该属性val myPublicVar = 20// 外部可通过该方法访问该类的私有成员fun accessPrivateVar() = MyClass().myPrivateVar}
}

在上面的示例中,我们定义了一个名为“MyClass”的类和一个伴生对象。在伴生对象中,我们定义了一个名为“myPublicVar”的公共属性,它可以直接从类外部访问。我们还定义了一个名为“accessPrivateVar”的公共方法,它可以从类的外部访问该类的私有成员“myPrivateVar”。

伴生对象与类相关联,因此它们可以像类一样调用,例如:

val myVar = MyClass.myPublicVar       // 直接访问伴生对象的公共属性
val myPrivateVar = MyClass.accessPrivateVar()     // 通过伴生对象访问类的私有成员

CheatViewModel

import androidx.lifecycle.ViewModelclass CheatViewModel : ViewModel() {// 是否偷看了答案var isShowAnswer = false
}

string.xml

<resources><string name="app_name">MyApplication</string><string name="true_button">正确</string><string name="false_button">错误</string><string name="next_button">下一题</string><string name="pre_button">PRE</string><string name="correct_toast">答对了</string><string name="incorrect_toast">答错了!</string><string name="warning_text">你确定吗</string><string name="show_answer_button">显示答案</string><string name="cheat_button">作弊</string><string name="judgment_toast">作弊不对</string><string name="question_australia">1、Canberra is the capital of Australia.</string><string name="question_oceans">2、The Pacific Ocean is larger than the Atlantic Ocean.</string><string name="question_mideast">3、The Suez Canal connects the Red Sea and the Indian Ocean.</string><string name="question_africa">4、The source of the Nile River is in Egypt.</string><string name="question_americas">5、The Amazon River is the longest river in the Americas.</string><string name="question_asia">6、Lake Baikal is the world\'s oldest and deepest freshwater lake.</string></resources>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql分布式集群部署---MySQL集群Cluster将数据分成多个片段,每个片段存储在不同的服务器上

1.1 目的 部署MysqlCluster集群环境 1.2 MySQL集群Cluster原理 1 数据分片 MySQL集群Cluster将数据分成多个片段&#xff0c;每个片段存储在不同的服务器上。这样可以将数据负载分散到多个服务器上&#xff0c;提高系统的性能和可扩展性。 2. 数据同步 MySQL集群Cluster使…

在线教育小程序正在成为教育行业的新生力量

教育数字化转型是目前教育领域的一个热门话题&#xff0c;那么到底什么是教育数字化转型&#xff1f;如何做好教育数字化转型&#xff1f; 教育数字化转型是利用信息技术和数字工具改变和优化教育的过程。主要特征包括技术整合、在线学习、个性化学习、大数据分析、云计算、虚拟…

基于HSV空间色彩的图像分割方法(含python代码实现)

文章目录 1. 介绍2. HSV颜色空间3. python实现HSV图像分割3.1. 代码实现3.2. 运行结果 1. 介绍 HSV颜色系统简介&#xff1a; HSV 即使用色相&#xff08;Hue&#xff09;、饱和度&#xff08;Saturation&#xff09;、明度&#xff08;Value&#xff09;来表示色彩的一种方式…

贝锐花生壳3大安全能力,保障网络服务安全远程连接

在没有公网IP的情况下&#xff0c;使用内网穿透工具&#xff0c;将本地局域网服务映射至外网&#xff0c;虽然高效快捷&#xff0c;但信息安全也是不可忽略的方面。 对此&#xff0c;贝锐花生壳提供了多维度的安全防护能力&#xff0c;满足不同场景下用户安全远程访问内网服务的…

uniapp 数组添加不重复元素

一、效果图 二、代码 //点击事件rightBtn(sub, index) {console.log(sub, index)//uniapp 数组添加不重复元素if (this.selectList.includes(sub.type)) {this.selectList this.selectList.filter((item) > {return item ! sub.type;});} else {this.selectList.push(sub.t…

cache 2.单机并发缓存

0.对原教程的一些见解 个人认为原教程中两点知识的引入不够友好。 首先是只读数据结构 ByteView 的引入使用是有点迷茫的&#xff0c;可能不能很好理解为什么需要ByteView。 第二是主体结构 Group的引入也疑惑。其实要是熟悉groupcache&#xff0c;那对结构Group的使用是清晰…

销售技巧培训之如何提高手机销售技巧

销售技巧培训之如何提高手机销售技巧 随着科技的迅速发展&#xff0c;手机已成为我们日常生活中不可或缺的一部分。作为一名手机销售员&#xff0c;了解手机销售技巧是必不可少的。本文将通过案例分析与实践&#xff0c;为你揭示手机销售的奥秘。 一、了解客户需求 在销售过程…

CRM系统选择技巧,什么样的CRM系统好用?

SaaS行业发展迅速&#xff0c;更多的企业逐渐选择CRM管理系统。打开搜索引擎&#xff0c;有非常多的结果。怎样在数十万个搜索结果中选择适合您的CRM系统&#xff1f;下面我们将聊聊&#xff0c;怎样选择CRM系统。 第一步&#xff1a;明确自身需求 重要性&#xff1a;每家企业…

【Java Web学习笔记】5 - XML

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/xml 零、在线文档 XML系列教程 一、XML引出 1.为什么需要XML 1.需求1 :两个程序间进行数据通信? 2.需求2:给一台服务器&#xff0c;做一个配置文件&#xff0c;当服务器程序启动时&#xff0c;去…

JUnit 之初体验

文章目录 1.定义2.引入1&#xff09;使用 Maven 工具2&#xff09;使用 Gradle 工具3&#xff09;使用 Jar 包 2.样例0&#xff09;前提1&#xff09;测试类2&#xff09;测试方法3&#xff09;测试断言4&#xff09;实施 总结 1.定义 JUnit 是一个流行的 Java 单元测试框架&a…

初识 pytest 及断言使用

章节目录&#xff1a; 一、pytest 相关概述二、环境搭建三、使用前提四、断言4.1 常用断言4.2 异常断言4.3 断言装饰器 五、结束语 一、pytest 相关概述 pytest 是一个基于 Python 编写的测试框架&#xff0c;用于编写和运行各种类型的软件测试。它提供了丰富的功能和灵活的语法…

Vue:绘制图例

本文记录使用Vue框架绘制图例的代码片段。 可以嵌入到cesium视图中,也可以直接绘制到自己的原生系统中。 一、绘制图例Vue组件 <div v-for="(color, index) in colors" :key="index" class="legend-item"><div class="color-…

机器学习中的特征工程

1 特征工程概述 特征工程是机器学习中的一个关键步骤&#xff0c;在机器学习领域中占有非常重要的地位&#xff0c;是机器学习中不可或缺的一部分&#xff0c;下图展示了一个常规的机器学习流程&#xff1a; 特征工程涉及从原始数据中提取、选择和转换特征&#xff0c;以改善模…

计算机网络TCP篇②

来源自小林Coding博客&#xff0c;阅读后部分精简笔记 目录 一、TCP 重传、滑动窗口、流量控制、拥塞控制 1.1、重传机制 1.1.1、超时重传 1.1.2、快速重传 1.1.3、SACK 方法 1.1.4、Duplicate SACK 1.2、滑动窗口 1.3、流量控制 1.3.1、操作系统缓冲区与滑动窗口的关…

13、pytest为失败的断言定义自己的解释

官方实例 # content of ocnftest.py from test_foocompare import Foodef pytest_assertrepr_compare(op, left, right):if isinstance(left, Foo) and isinstance(right, Foo) and op "":return["Comparing Foo instances:",f" vals:{left.val} !…

【数据结构第 6 章 ②】- 图的存储结构(详解邻接矩阵)- 用 C 语言实现

目录 一、邻接矩阵表示法 二、AMGraph.h 三、AMGraph.c 四、Test.c 【数据结构第 6 章 ① 】- 图的定义和基本术语-CSDN博客 由于图的结构比较复杂&#xff0c;任意两个顶点之间都可能存在联系&#xff0c;因此无法以数据元素在存储区中的物理位置来表示元素之间的关系&…

Leetcode2477. 到达首都的最少油耗

Every day a Leetcode 题目来源&#xff1a;2477. 到达首都的最少油耗 解法1&#xff1a;贪心 深度优先搜索 题目等价于给出了一棵以节点 0 为根结点的树&#xff0c;并且初始树上的每一个节点上都有一个人&#xff0c;现在所有人都需要通过「车子」向结点 0 移动。 对于…

微软NativeApi-NtQuerySystemInformation

微软有一个比较实用的Native接口&#xff1a;NtQuerySystemInformation&#xff0c;具体可以参考微软msdn官方文档&#xff1a;NtQuerySystemInformation&#xff0c; 是一个系统函数&#xff0c;用于收集特定于所提供的指定种类的系统信息。ProcessHacker等工具使用NtQuerySys…

C/C++,优化算法——双离子推销员问题(Bitonic Travelling Salesman Problem)的计算方法与源代码

1 文本格式 // C program for the above approach #include <bits/stdc.h> using namespace std; // Size of the array a[] const int mxN 1005; // Structure to store the x and // y coordinates of a point struct Coordinates { double x, y; } a[mxN]; //…

luceda ipkiss教程 43:画渐变圆弧型波导

案例分享&#xff1a; from si_fab import all as pdk import ipkiss3.all as i3 from ipcore.properties.restrictions import RestrictTuple from ipkiss.geometry.shapes.modifiers import __ShapePathBase__ import numpy as np from math import atan2class ShapePathTa…