密码生成器(HTML+CSS+JavaScript)

news2024/11/15 14:07:29

  🌏个人博客主页:心.c

前言:前两天写了密码生成器,现在跟大家分享一下,大家如果想使用随便拿,如果哪里有问题还请大佬们给我指出,感谢支持

🔥🔥🔥专题文章:密码生成器

😽感谢大家的点赞👍收藏⭐️评论✍您的一键三连是我更新的动力 💓 

目录

作品展示: 

 功能介绍:

 核心: 

 所用字符显示:

上下按钮点击事件:

单选按钮点击事件:

 更新遍历:

 随机数的生成:

 密码的复制:

代码展示(源代码):

HTML:

CSS:

JavaScript:


作品展示: 

 功能介绍:

 核心: 

numArr是我创建的一个用了储存状态的数组,用来设定按钮绑定,‘1’就是绑定的numberArr,'2'就是绑定的smallArr,‘3’绑定的就是bigArr,‘4’就是绑定的middleArr,初始化为‘1’是因为第一个单选按钮是默认已经被点击的,因为开始给第一个radiobox设置了clicked被点击事件,所以开始把‘1’添加上,如果后面监听radiobox时被点击了,我们只需要通过遍历numArr就可以更改totalArr,显示内容和修改密码了

  let numArr = ['1']
 所用字符显示:

下面是四个数组,分别是数字,大写字母,小写字母,和常用符号,主要是用于将这些字符显示在总的totalArr数组里面,所用字符就是totalArr数组里面的内容所用字符内容可以通过下方的所含字符进行修改

//生成四个数组
  let numberArr = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
  let smallArr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
  let bigArr = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
  let middleArr = ['~', '!', '@', '#', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+']
  let totalArr = []
上下按钮点击事件:

下方是我的图标点击改变密码长度事件,密码长度限制在6-20之间,当超出范围时,会有提示,num变量是我的全局变量,用来检测生成密码的长度

 //获得两个小图标的dom元素
  let top = this.document.querySelector('.icon_top')
  let bottom = this.document.querySelector('.icon_bottom')
  //给向上箭头添加事件监听
  top.addEventListener('click', function () {
    if (num >= 6 && num <= 19) {
      num++
      number.innerHTML = num
    } else {
      alert('数字已达上限')
    }
  })
  //给向下箭头添加事件监听
  bottom.addEventListener('click', function () {
    if (num >= 7 && num <= 20) {
      num--
      number.innerHTML = num
    } else {
      alert('数字已达下限')
    }
  })
单选按钮点击事件:

点击按钮时会对checkbox进行监听,我的4个小按钮都是有一个class checkbox类名,当点击时获得它的data-id 为几,把id添加到我的numArr数组里面或者从中删除(判断是否删除还是进行添加就判断它是否被点击过),‘1’就是绑定的numberArr,'2'就是绑定的smallArr,‘3’绑定的就是bigArr,‘4’就是绑定的middleArr

举例:(如果点击第二个checkbox,如果判断它没有被点击,那么将它的id=2添加到我的numArr当中,这样后面我可以通过遍历我的numArr来改变我的totalArr)

sort排序是为了显示totalArr内容时一直保持数字在前,然后是小写字母,大学字母,字符,不会因为先点击谁而改变顺序(谁下标小先显示谁)


  //获得单选按钮
  let check = this.document.querySelector('.checkbox')
  //给父级check添加冒泡事件监听
  check.addEventListener('click', function (e) {
    if (e.target.tagName === 'INPUT') {
      let id = e.target.dataset.id
      if (e.target.checked) {
        //添加numArr元素
        numArr.push(id)
        numArr = numArr.sort()
        render()
      } else {
        const index = numArr.indexOf(id);
        if (index !== -1) {
          //删除numArr元素
          numArr.splice(index, 1);
        }
        render()
      }

      text.innerHTML = totalArr.join('');
    }
  })
 更新遍历:

通过遍历numArr里面的内容来修改我的totalArr


  // 通过numArr更新totalArr数组
  function render() {
    totalArr = [];  // 清空 totalArr
    for (let i = 0; i < numArr.length; i++) {
      let id = numArr[i];
      switch (id) {
        case '1':
          totalArr = totalArr.concat(numberArr);
          break;
        case '2':
          totalArr = totalArr.concat(smallArr);
          break;
        case '3':
          totalArr = totalArr.concat(bigArr);
          break;
        case '4':
          totalArr = totalArr.concat(middleArr);
          break;
      }
    }
  }

 随机数的生成:

将遍历totalArr的数组随机显示num长度的密码,并将其显示到页面当中(如果按钮哪个也不选,就返回-1)

 let btn = document.querySelector('.btn')
  //给按钮添加事件监听,将内容进行添加
  btn.addEventListener('click', function () {
    for (let i = 0; i < 6; i++) {
      let box_text = document.querySelector(`.content [data-id="${i + 1}"] .text`);
      box_text.innerHTML = getRandom()
    }
  })

  //根据num和totalArr生成随机数
  function getRandom() {
    let result = '';
    if (!totalArr) {
      for (let i = 0; i < num; i++) {
        // 生成一个介于 0 和 totalArr.length-1 之间的随机索引
        let index = Math.floor(Math.random() * totalArr.length);
        result += totalArr[index];
      }
      return result
    } else {
      return -1
    }
  }
 密码的复制:

因为div里面的字体不能复制,所以我就添加了一个复制功能,下面是实现复制的代码


  // 选择所有.copy
  const copyButtons = this.document.querySelectorAll('.copy');
  //添加点击事件监听器
  copyButtons.forEach(function (copy) {
    copy.addEventListener('click', function () {
      // 获取对应的 .text 元素
      let textElement = copy.previousElementSibling;

      // 创建一个隐藏的可编辑区域
      const textarea = document.createElement('textarea');
      textarea.value = textElement.textContent.trim();
      textarea.style.position = 'absolute';
      textarea.style.left = '-9999px';
      document.body.appendChild(textarea);

      // 选择文本
      textarea.select();
      // 执行复制命令
      try {
        if (textarea.value === '') {
          alert('内容为空不可复制')
        } else {
          document.execCommand('copy');
          alert("内容已复制到剪贴板!");
        }

      } catch (err) {
        console.error('无法复制文本: ', err);
      }
      // 清理
      document.body.removeChild(textarea);
    });
  });

代码展示(源代码):

HTML:
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./password.css">
  <link rel="stylesheet" href="./iconfont/iconfont.css">
</head>

<body>
  <div class="entire wrapper">
    <!-- 标题 -->
    <div class="title">
      <h2>随机密码生成器</h2>
    </div>

    <!-- 密码长度显示框 -->
    <div class="password_length">
      <span><strong>密码长度:</strong></span>
      <div class="text"></div>
      <div class="icon">
        <i class="iconfont icon_top">&#xe685;</i>
        <i class="iconfont icon_bottom">&#xe686;</i>
      </div>
    </div>

    <!-- 所用字母显示 -->
    <div class="word_show">
      <span><strong>所用字符:</strong></span>
      <div class="text"></div>
    </div>

    <!-- 所含字符 -->
    <div class="word_select">
      <span class="char"><strong>所含字符:</strong></span>
      <div class="checkbox">
        <div class="number"><input type="checkbox" checked name="number" data-id="1"><span>数字0-9</span></div>
        <div class="small"><input type="checkbox" name="small" data-id="2"><span>小写字母a-z</span></div>
        <div class="big"><input type="checkbox" name="big" data-id="3"><span>大写字母A-Z</span></div>
        <div class="middle"><input type="checkbox" name="middle" data-id="4"><span>常用符号~!@#$%^&*()_+</span></div>
      </div>
    </div>

    <!-- 生成密码 -->
    <button class="btn"><strong>生成密码</strong></button>
    <hr>

    <!-- 生成结果 -->
    <div class="result">
      <span><strong>生成结果</strong></span>
      <div class="content">
        <div data-id="1" class="box">
          <div class="text"></div>
          <div class="copy">复制</div>
        </div>
        <div data-id="2" class="box">
          <div class="text"></div>
          <div class="copy">复制</div>
        </div>
        <div data-id="3" class="box">
          <div class="text"></div>
          <div class="copy">复制</div>
        </div>
        <div data-id="4" class="box">
          <div class="text"></div>
          <div class="copy">复制</div>
        </div>
        <div data-id="5" class="box">
          <div class="text"></div>
          <div class="copy">复制</div>
        </div>
        <div data-id="6" class="box">
          <div class="text"></div>
          <div class="copy">复制</div>
        </div>
      </div>
    </div>
  </div>

  <script src="./password.js"></script>
</body>

</html>
CSS:
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  user-select: none;
}

a {
  text-decoration: none;
}

li {
  list-style: none;
}

.wrapper {
  margin: auto;
}

.entire {
  margin-top: 30px;
  height: 580px;
  width: 1000px;
  background-color: #f2fffc;
  padding: 30px;
  border-radius: 30px;
  border: 1px solid rgb(38, 118, 68);
}

.title {
  width: 200px;
  height: 40px;
  margin-bottom: 20px;
}

.title h2 {
  color: #78a878;
}

.password_length {
  display: flex;
  align-items: center;
  height: 30px;
  width: 400px;
  margin-bottom: 20px;

}

.password_length span {
  /* padding-top: 10px; */
  width: 80px;
}

.password_length .text {
  font-size: 14px;
  padding: 4px;
  height: 25px;
  width: 300px;
  border: 1px solid rgb(156, 156, 156);
  background-color: #ffffff;
}

.password_length .icon {
  text-align: center;
  vertical-align: middle;
  width: 20px;
  height: 25.25px;
  border: #afafaf 1px solid;
  border-left: none;
}

.icon i {
  display: block;
  color: #757575;
  font-size: 8px;
}

.icon .icon_top,
.icon .icon_bottom {
  width: 20px;
  height: 11.8px;
}

.icon .icon_top:hover,
.icon .icon_bottom:hover {
  background-color: #67938d;
  color: #ffffff;
}

.icon .icon_top {
  border-bottom: 1px solid rgb(135, 135, 135);
}


.word_show {
  display: flex;
  align-items: center;
  height: 30px;
  width: 800px;
  margin-bottom: 20px;
  /* background-color: #b0a0a0; */
}

.word_show span {
  /* padding-top: 10px; */
  width: 80px;
}

.word_show .text {
  padding: 3px;
  align-items: center;
  font-size: 13px;
  width: 720px;
  height: 25px;
  background-color: #fff;
  border: 1px solid rgb(158, 158, 158);
}

.word_select {
  display: flex;
  align-items: center;
  height: 30px;
  width: 800px;
  margin-bottom: 20px;
  /* background-color: #bbbbbb; */
}

.word_select .char {
  /* padding-top: 10px; */
  width: 80px;
}

.word_select .checkbox {
  line-height: 30px;
  font-size: 13px;
  color: #797979;
  display: flex;
  width: 720px;
  justify-content: space-between;


}

.checkbox input {
  width: 16px;
  height: 16px;
  margin-right: 3px;
  margin-top: 9px;

}

.checkbox span {
  display: block;
  margin-top: 2px;
}

.checkbox .number,
.checkbox .small,
.checkbox .big,
.checkbox .middle {
  display: flex;
  height: 30px;
}

.btn {
  width: 100px;
  height: 30px;
  background-color: #579081;
  border: none;
  border-radius: 2px;
  color: #ffffff;
  margin-bottom: 20px;
}

.result {
  width: 940px;
  height: 260px;
  /* background-color: #e0e0e0; */
  margin-bottom: 20px;
}

hr {
  margin-bottom: 25px;
}

.result .content {
  margin-top: 20px;
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
}



.content .box {
  margin-bottom: 25px;
  display: flex;
  border: 1px solid rgb(136, 136, 136);
  background-color: #f2fffc;
  width: 300px;
  height: 45px;
  align-items: center;
}

.content .box .text {
  font-size: 16px;
  color: #636363;
  width: 250px;
  padding: 12px;
}

.content .box .copy {
  width: 50px;
  text-align: center;
  border-left: 1px solid rgb(98, 98, 98);
  cursor: pointer;

}
JavaScript:
window.addEventListener('load', function () {

  //生成四个数组
  let numberArr = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
  let smallArr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
  let bigArr = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
  let middleArr = ['~', '!', '@', '#', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+']

  //checked默认
  let numArr = ['1']

  //初始化num为6
  let num = 6;
  let number = this.document.querySelector('.password_length .text')
  number.innerHTML = num

  //将numberArr初始化到totalArr进行显示
  let totalArr = []
  totalArr = totalArr.concat(numberArr)
  let text = this.document.querySelector('.word_show .text')
  text.innerHTML = totalArr.join('');

  //获得两个小图标的dom元素
  let top = this.document.querySelector('.icon_top')
  let bottom = this.document.querySelector('.icon_bottom')
  //给向上箭头添加事件监听
  top.addEventListener('click', function () {
    if (num >= 6 && num <= 19) {
      num++
      number.innerHTML = num
    } else {
      alert('数字已达上限')
    }
  })
  //给向下箭头添加事件监听
  bottom.addEventListener('click', function () {
    if (num >= 7 && num <= 20) {
      num--
      number.innerHTML = num
    } else {
      alert('数字已达下限')
    }
  })

  //获得单选按钮
  let check = this.document.querySelector('.checkbox')
  //给父级check添加冒泡事件监听
  check.addEventListener('click', function (e) {
    if (e.target.tagName === 'INPUT') {
      let id = e.target.dataset.id
      if (e.target.checked) {
        //添加numArr元素
        numArr.push(id)
        numArr = numArr.sort()
        render()
      } else {
        const index = numArr.indexOf(id);
        if (index !== -1) {
          //删除numArr元素
          numArr.splice(index, 1);
        }
        render()
      }

      text.innerHTML = totalArr.join('');
    }
  })

  // 通过numArr更新totalArr数组
  function render() {
    totalArr = [];  // 清空 totalArr
    for (let i = 0; i < numArr.length; i++) {
      let id = numArr[i];
      switch (id) {
        case '1':
          totalArr = totalArr.concat(numberArr);
          break;
        case '2':
          totalArr = totalArr.concat(smallArr);
          break;
        case '3':
          totalArr = totalArr.concat(bigArr);
          break;
        case '4':
          totalArr = totalArr.concat(middleArr);
          break;
      }
    }
  }

  let btn = document.querySelector('.btn')
  //给按钮添加事件监听,将内容进行添加
  btn.addEventListener('click', function () {
    for (let i = 0; i < 6; i++) {
      let box_text = document.querySelector(`.content [data-id="${i + 1}"] .text`);
      box_text.innerHTML = getRandom()
    }
  })

  //根据num和totalArr生成随机数
  function getRandom() {
    let result = '';
    if (!totalArr) {
      for (let i = 0; i < num; i++) {
        // 生成一个介于 0 和 totalArr.length-1 之间的随机索引
        let index = Math.floor(Math.random() * totalArr.length);
        result += totalArr[index];
      }
      return result
    } else {
      return -1
    }
  }

  // 选择所有.copy
  const copyButtons = this.document.querySelectorAll('.copy');
  //添加点击事件监听器
  copyButtons.forEach(function (copy) {
    copy.addEventListener('click', function () {
      // 获取对应的 .text 元素
      let textElement = copy.previousElementSibling;

      // 创建一个隐藏的可编辑区域
      const textarea = document.createElement('textarea');
      textarea.value = textElement.textContent.trim();
      textarea.style.position = 'absolute';
      textarea.style.left = '-9999px';
      document.body.appendChild(textarea);

      // 选择文本
      textarea.select();
      // 执行复制命令
      try {
        if (textarea.value === '') {
          alert('内容为空不可复制')
        } else {
          document.execCommand('copy');
          alert("内容已复制到剪贴板!");
        }

      } catch (err) {
        console.error('无法复制文本: ', err);
      }
      // 清理
      document.body.removeChild(textarea);
    });
  });


})

 到这里就分享完成了,感谢大家的观看 ! ! !

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《断点回归的非参数估计及 Stata 实现》

目录 一、引言 二、文献综述 三、理论原理 四、实证模型 五、稳健性检验 六、程序代码及解释 七、代码运行结果及解释 一、引言 断点回归&#xff08;Regression Discontinuity&#xff0c;RD&#xff09;设计是一种准实验方法&#xff0c;用于评估政策或干预措施的因果…

鉴权Cookies、授权session、token

2 鉴权、授权 区别&#xff1a;一个存在浏览器&#xff0c;一个存在服务器&#xff0c;session存到服务端当中 问1&#xff1a;http协议是一个典型的无状态协议&#xff0c;无记忆&#xff0c;那第一次登录下次是不是还要登录一次&#xff1f; ANS&#xff1a;不需要 因为Co…

C++设计模式3:工厂模式

工厂模式都是在那种有着大量类的程序里面使用的&#xff0c;比如我突然要产生许多的类&#xff0c;这时候就可以用工厂模式&#xff0c;工厂模式有如下三种类型。 简单工厂 用户输入实例化的信息(比如产品名称)&#xff0c;向工厂申请对象&#xff0c;工厂返回相应的对象&…

npm install报错,解决记录:11个步骤诊断和解决问题

在处理npm install报错时&#xff0c;可以遵循以下步骤来诊断和解决问题&#xff1a; 查看错误信息&#xff1a; 错误信息通常会给出问题的线索&#xff0c;例如依赖包版本冲突、网络问题、权限问题等。 更新npm和Node.js&#xff1a; 首先尝试更新npm和Node.js到最新版本&…

地平线—征程2(Journey 2-J2)芯片详解(16)—DDR系统

写在前面 本系列文章主要讲解地平线征程2(Journey 2-J2)芯片的相关知识,希望能帮助更多的同学认识和了解征程2(Journey 2-J2)芯片。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 错过其他章节的同学可以电梯直达目录↓↓↓ 地平线—征程2(Journey 2-J2)芯片详解…

新开发体育直播平台的创业指南:降低赛事版权成本方法

在全球化浪潮下&#xff0c;体育赛事已成为连接世界各地观众的情感纽带&#xff0c;其巨大的影响力不仅激发了全球观众的热情&#xff0c;也催生了体育赛事直播行业的蓬勃发展。然而&#xff0c;高昂的版权费用如同一道难以逾越的门槛&#xff0c;让众多新进入者和小型体育直播…

【与C++的邂逅】--- 类与对象(下)

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 与C的邂逅 本节我们继续学习类与对象下&#xff0c;下面给出本节内容大纲。 &#x1f3e0; 再谈构造 &#x1f4cc; 构造函数体赋值 在创建对象时&…

【图形学】TA之路-基于Unity Shader编程之初体验

学习shader之前你必须知道的事情&#xff1a; Unity开发引擎、Direct3D、Shader他们之间的关系 Direct3D 是一个底层图形 API&#xff0c;它直接与 GPU &#xff08;显卡&#xff09;交互&#xff0c;提供了访问硬件加速功能的接口。Unity 开发引擎&#xff0c;它封装了很多底…

[Linux] 认识系统服务(daemon)

参考&#xff1a;《鸟哥的Linux私房菜》 一、什么是 daemon 与服务&#xff08;service&#xff09; 在英语中的daemon就有守护进程&#xff0c;后台程序的意思。简单来说就是一直在后台运行的进程&#xff0c;我们就称之为服务(service)&#xff0c;或者是守护进程(daemon)。…

Java爬虫图像处理:从获取到解析

在互联网时代&#xff0c;数据的价值日益凸显&#xff0c;而爬虫技术作为获取网络数据的重要手段&#xff0c;其应用范围越来越广泛。本文将探讨Java爬虫在图像处理方面的应用&#xff0c;包括如何从网络中获取图像数据&#xff0c;以及如何对这些数据进行解析和处理。 Java爬…

实现Kruskal算法连通游戏地图地牢

前置知识 c分享&#xff5c;并查集从入门到出门 - 力扣&#xff08;LeetCode&#xff09; 彻底搞懂克鲁斯卡尔&#xff08;Kruskal&#xff09;算法&#xff08;附C代码实现&#xff09; - QuanHa - 博客园 (cnblogs.com) 白色点矩形是地牢&#xff0c;其中白线是按照krsukal…

网络编程知识点总结

物理链路网络运输会话表示应用 物链网运会表应 实际的数据帧 TCP和UDP的异同&#xff08;笔试面试&#xff09; 主机&#xff1a;host 转换&#xff1a;to 网络&#xff1a;network uint32_t htonl(uint32_t hostlong); //将4字节无符号整数的主机字节序转换为网络字节序&a…

云计算实训32——roles基本用法、使用剧本安装nginx、使用roles实现lnmp

一、安装nginx并更改其端口 编辑hosts配置文件 [rootmo ~]# vim /etc/ansible/hosts 创建目录 [rootmo ~]# mkdir /etc/ansible/playbook 编辑配置文件 [rootmo ~]# vim /etc/ansible/playbook/nginx.yml 执行测试 [rootmo ~]# ansible-playbook /etc/ansible/playbook/n…

菜鸟的进击之.net6控制台应用程序接收参数

1、新建控制台应用程序&#xff0c;新建-添加项目-控制台应用 2、3、下一步&#xff0c;填写项目名称和代码存放的位置 3、下一步&#xff0c;框架选择.net 6 &#xff0c;点击创建 4、然后项目就创建完成啦&#xff0c; 5、在可以直接在Program.cs写方法一些简单的逻辑&#x…

Rustrover、IDEA 的 Rust 类型不显示(已解决)

关键词&#xff1a;rustrover 类型不显示&#xff0c;rustrover 不显示类型&#xff0c;IntelliJ IDEA Rust 类型不显示&#xff0c;IntelliJ IDEA Rust 不显示类型 若移动端访问不佳&#xff0c;请使用 –> Github版 背景 博主手欠&#xff0c;使用 IntelliJ IDEA 时&am…

四款流行英文翻译工具,助你轻松应对翻译难题

作为一名教培行业的工作人员&#xff0c;我经常需要处理大量的英文文件&#xff0c;从教材到学术论文&#xff0c;再到各种国际交流的资料。翻译工具成了我工作中不可或缺的帮手。今天&#xff0c;我就来跟大家聊聊我用过的几款翻译工具在翻译英文文件时的表现如何呢&#xff1…

超越IP-Adapter!阿里提出UniPortrait,可通过文本定制生成高保真的单人或多人图像。

阿里提出UniPortrait&#xff0c;能根据用户提供的文本描述&#xff0c;快速生成既忠实于原图又能灵活调整的个性化人像&#xff0c;用户甚至可以通过简单的句子来描述多个不同的人物&#xff0c;而不需要一一指定每个人的位置。这种设计大大简化了用户的操作&#xff0c;提升了…

手机游玩植物大战僵尸杂交版V2.3.7最新版教程(文章末尾免费直接下载链接)

手机游玩植物大战僵尸杂交版V2.3.7最新版教程 【V2.3.7全面升级】植物大战僵尸杂交版&#xff1a;跨平台终极安装指南 - 苹果、安卓、电脑、电视兼容&#xff0c;界面革新&#xff0c;16卡槽扩展&#xff0c;高分辨率支持&#xff0c;BUG修复&#xff0c;畅享游戏乐趣 前言 …

市盈率的概念

写篇有关市盈率的【不务正业】的内容。 重要公式 市盈率 官方的定义 平均市盈率&#xff1d;∑(收盘价发行数量)/∑(每股收益发行数量)&#xff0c;统计时剔除亏损及暂停上市的上市公司。 静态市盈率 滚动市盈率&#xff08;TTM&#xff09; 股票市盈率的意义 如果某股票有较…

探索数据结构:图(二)之图的遍历,Kruskal与Prim算法

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 图的遍历 图的遍历方式一般分为两种&#xff1a;深度优先遍历与广度…