智慧大棚数据库版

创建一个SMartBigHouse数据库

在数据库创建一个表用来存储数据 这边将id设为主键并将标识增量设为1

搭建Winfrom

搭建历史查询界面

串口数据,(这边是用的一个虚拟的串口工具,需要的话私)

 ModbusSerialMaster master;DataPointCollection wenduValues; //温度DataPointCollection shiduValues; //湿度DataPointCollection yangqiValues; //氧气DataPointCollection fengsuValues; //风速public Form1(){InitializeComponent();#region 串口数据serialPort1.PortName = "COM2";serialPort1.BaudRate = 9600;serialPort1.Parity = System.IO.Ports.Parity.None;serialPort1.DataBits = 8;serialPort1.StopBits =(StopBits)1;#endregion//使用nmodbus4第三方进行数据读取master = ModbusSerialMaster.CreateRtu(serialPort1);serialPort1.Open();//初始化图表数据wenduValues = chart1.Series[0].Points;shiduValues = chart1.Series[1].Points;yangqiValues = chart1.Series[2].Points;fengsuValues = chart1.Series[3].Points;//设置数据点文本 #VALY :Y轴的数据值chart1.Series[0].Label = "#VALY℃";chart1.Series[1].Label = "#VALY%RH";chart1.Series[2].Label = "#VALY%VOL";chart1.Series[3].Label = "#VALYM/S";// 设置鼠标悬浮时候显示文本,chart1.Series[0].XValueType = ChartValueType.String;chart1.Series[1].XValueType = ChartValueType.String;chart1.Series[2].XValueType = ChartValueType.String;chart1.Series[3].XValueType = ChartValueType.String;chart1.Series[0].ToolTip = "#VALX:#VALY℃";//11-12-30:28℃chart1.Series[1].ToolTip = "#VALX:#VALY%RH";chart1.Series[2].ToolTip = "#VALX:#VALY%VOL";chart1.Series[3].ToolTip = "#VALX:#VALYM/S";//设置x可以使用鼠标选中进行局部放大效果chart1.ChartAreas[0].CursorX.IsUserEnabled = true;//是否允许用户操作x轴chart1.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;//是否允许用户选择滚动条;//设置滚动条样式chart1.ChartAreas[0].AxisX.ScrollBar.BackColor = Color.Red; //滚动条的整体颜色chart1.ChartAreas[0].AxisX.ScrollBar.ButtonColor = Color.Green;//滚动条按钮的颜色}
开始停止
private void button2_Click(object sender, EventArgs e)
{if (timer1.Enabled){timer1.Stop();}else{timer1.Start();}
}
定时器的事件
 double? lastWendu = null; //上一个温度double? lastShiDu = null;double? lastYangQi = null;double? lastFengSu = null;private void timer1_Tick(object sender, EventArgs e){DateTime d1 = DateTime.Now;string time = d1.ToString("HH-mm-ss");double ? nowWendu = null; //当前温度double ? nowShiDu = null;double ? nowYangQi = null;double? nowFengSu = null;if (checkBox1.Checked) //温度选中{//ReadHoldingRegisters 读取寄存器的数据ushort[] values =  master.ReadHoldingRegisters(1, 0x000, 1);nowWendu = values[0] / 10;//当前温度wenduValues.AddXY(time, nowWendu);lastWendu = nowWendu ?? lastWendu; //记录当前温度,}else //温度未选中{int index =  wenduValues.AddXY(time,lastWendu); //添加x轴时间 y轴数据 index添加点的索引值DataPoint point =  wenduValues[index]; //找到隐藏点point.Color = Color.Transparent;//设置为透明颜色}if (wenduValues.Count == 11){wenduValues.RemoveAt(0); //保留界面只有20个点}if (checkBox2.Checked) //湿度选中{//ReadHoldingRegisters 读取寄存器的数据ushort[] values = master.ReadHoldingRegisters(1, 0x001, 1);nowShiDu = values[0] / 10;shiduValues.AddXY(time, nowShiDu);lastShiDu = nowShiDu ?? lastShiDu;}else //湿度选中{int index = shiduValues.AddXY(time, lastShiDu); //添加x轴时间 y轴数据 index添加点的索引值DataPoint point = shiduValues[index]; //找到隐藏点point.Color = Color.Transparent;//设置为透明颜色}if (shiduValues.Count == 11){shiduValues.RemoveAt(0); //保留界面只有20个点}if (checkBox3.Checked) //湿度选中{//ReadHoldingRegisters 读取寄存器的数据ushort[] values = master.ReadHoldingRegisters(1, 0x002, 1);nowYangQi = values[0] / 10;yangqiValues.AddXY(time, nowYangQi);lastYangQi = nowYangQi ?? lastYangQi;}else //湿度选中{int index = yangqiValues.AddXY(time, lastYangQi); //添加x轴时间 y轴数据 index添加点的索引值DataPoint point = yangqiValues[index]; //找到隐藏点point.Color = Color.Transparent;//设置为透明颜色}if (yangqiValues.Count == 11){yangqiValues.RemoveAt(0); //保留界面只有20个点}if (checkBox4.Checked) //湿度选中{//ReadHoldingRegisters 读取寄存器的数据ushort[] values = master.ReadHoldingRegisters(1, 0x003, 1);nowFengSu = values[0] / 10;fengsuValues.AddXY(time, nowFengSu);lastFengSu = nowFengSu ?? lastFengSu;}else //湿度选中{int index = fengsuValues.AddXY(time, lastFengSu); //添加x轴时间 y轴数据 index添加点的索引值DataPoint point = fengsuValues[index]; //找到隐藏点point.Color = Color.Transparent;//设置为透明颜色}if (fengsuValues.Count == 11){fengsuValues.RemoveAt(0); //保留界面只有20个点}//添加到数据库里面//1 连接数据库 数据库的配置在App.config进行配置//2 创建数据库操作文件,sqlhelper文件 把数据库的增删改查操作封装的sqlhelper文件//3 在使用数据库操作的时候调用sqlhelper方法即可//组织sql语句  update("")string sql = "insert into Log (time,wendu,shidu,o2,fengsu) values('{0}',{1},{2},{3},{4})";string w = nowWendu is null?"NULL":((nowWendu??0)*10).ToString(); //string s = nowShiDu is null ? "NULL" : ((nowShiDu ?? 0) * 10).ToString();string y = nowYangQi is null ? "NULL" : ((nowYangQi ?? 0) * 10).ToString();string f = nowFengSu is null ? "NULL" : ((nowFengSu ?? 0) * 10).ToString();sql = string.Format(sql, d1.ToString(), w, s, y, f);SqlHelper.Update(sql);}

//添加到数据库里面
//1 连接数据库 数据库的配置在App.config进行配置
//2 创建数据库操作文件,sqlhelper文件 把数据库的增删改查操作封装的sqlhelper文件
//3 在使用数据库操作的时候调用sqlhelper方法即可

 //组织sql语句  update("")string sql = "insert into Log (time,wendu,shidu,o2,fengsu) values('{0}',{1},{2},{3},{4})";string w = nowWendu is null?"NULL":((nowWendu??0)*10).ToString(); //string s = nowShiDu is null ? "NULL" : ((nowShiDu ?? 0) * 10).ToString();string y = nowYangQi is null ? "NULL" : ((nowYangQi ?? 0) * 10).ToString();string f = nowFengSu is null ? "NULL" : ((nowFengSu ?? 0) * 10).ToString();sql = string.Format(sql, d1.ToString(), w, s, y, f);SqlHelper.Update(sql);
跳转功能
private void button4_Click(object sender, EventArgs e)
{Form2 f2 = new Form2();f2.Show();
}
这边添加一个SqlHelper封装方法
internal class SqlHelper
{// 数据库连接信息,需要读取项目配置中的数据库连接信息//点击引用 ---》添加引用---》搜索ConfigurationManager ---》找到system.ConfigurationManager --->确定即可private static string connString = ConfigurationManager.ConnectionStrings["Serial"].ConnectionString;/// <summary>/// 根据传入的Sql执行第一行第一列的查询操作/// </summary>/// <param name="sql">要执行的Sql</param>/// <returns>第一行第一列的结果,其他数据将会被忽略,如果没有查询到任何数据返回null</returns>public static object GetSingleValue(string sql){using (SqlConnection conn = new SqlConnection(connString)){using (SqlCommand cmd = new SqlCommand(sql, conn)){try{conn.Open();object res = cmd.ExecuteScalar();return res;}catch (Exception ex){// 记录日志File.AppendAllText("sqlError.log", $"[{DateTime.Now}] (SQL:{sql}) {ex.Message}");throw ex;}}}}/// <summary>/// 根据传入的Sql执行第一行第一列的查询操作/// </summary>/// <param name="sql">要执行的Sql</param>/// <param name="parameters">给Sql中添加的参数列表</param>/// <returns>第一行第一列的结果,其他数据将会被忽略,如果没有查询到任何数据返回null</returns>public static object GetSingleValue(string sql, SqlParameter[] parameters){using (SqlConnection conn = new SqlConnection(connString)){using (SqlCommand cmd = new SqlCommand(sql, conn)){// 添加参数cmd.Parameters.AddRange(parameters);try{conn.Open();object res = cmd.ExecuteScalar();return res;}catch (Exception ex){// 记录日志File.AppendAllText("sqlError.log", $"[{DateTime.Now}] (SQL:{sql}) {ex.Message}");throw ex;}}}}/// <summary>/// 执行增删改操作/// </summary>/// <param name="sql">要执行的Sql</param>/// <returns>受影响的行数</returns>/// Update("insert into")public static int Update(string sql){using (SqlConnection conn = new SqlConnection(connString)){using (SqlCommand cmd = new SqlCommand(sql, conn)){try{conn.Open();int res = cmd.ExecuteNonQuery();return res;}catch (Exception ex){// 记录日志File.AppendAllText("sqlError.log", $"[{DateTime.Now}] (SQL:{sql}) {ex.Message}");throw ex;}}}}/// <summary>/// 执行增删改操作/// </summary>/// <param name="sql">要执行的Sql</param>/// <param name="parameters">Sql中携带的参数</param>/// <returns>受影响的行数</returns>public static int Update(string sql, SqlParameter[] parameters){using (SqlConnection conn = new SqlConnection(connString)){using (SqlCommand cmd = new SqlCommand(sql, conn)){cmd.Parameters.AddRange(parameters); // 添加参数try{conn.Open();int res = cmd.ExecuteNonQuery();return res;}catch (Exception ex){// 记录日志File.AppendAllText("sqlError.log", $"[{DateTime.Now}] (SQL:{sql}) {ex.Message}");throw ex;}}}}/// <summary>/// 执行查询操作/// </summary>/// <param name="sql">要执行的sql</param>/// <returns>查询结果的SqlDataReader</returns>public static SqlDataReader GetValue(string sql){SqlConnection conn = new SqlConnection(connString);SqlCommand cmd = new SqlCommand(sql, conn);try{conn.Open();SqlDataReader res = cmd.ExecuteReader();return res;}catch (Exception ex){// 记录日志File.AppendAllText("sqlError.log", $"[{DateTime.Now}] (SQL:{sql}) {ex.Message}");throw ex;}}
}

历史查询界面

DataPointCollection wenduValues; //温度
DataPointCollection shiduValues; //湿度
DataPointCollection yangqiValues; //氧气
DataPointCollection fengsuValues; //风速
public Form2()
{InitializeComponent();DateTime d1 = DateTime.Now;d1 = d1.AddHours(24-d1.Hour); //24-当前小时  d1 = d1.AddMinutes(-d1.Minute);d1 = d1.AddSeconds(-d1.Second);dateTimePicker1.MaxDate = d1;//结束时间最大值的要求 :开始时间的后的一天dateTimePicker2.MaxDate = d1;//首次触发dateTimePicker1_ValueChanged 手动调用一次dateTimePicker1_ValueChanged(null, null);dataGridView1.AutoGenerateColumns = false;// 表格禁止自动生成列//初始化图表数据wenduValues = chart1.Series[0].Points;shiduValues = chart1.Series[1].Points;yangqiValues = chart1.Series[2].Points;fengsuValues = chart1.Series[3].Points;//设置数据点文本 #VALY :Y轴的数据值chart1.Series[0].Label = "#VALY℃";chart1.Series[1].Label = "#VALY%RH";chart1.Series[2].Label = "#VALY%VOL";chart1.Series[3].Label = "#VALYM/S";// 设置鼠标悬浮时候显示文本,chart1.Series[0].XValueType = ChartValueType.String;chart1.Series[1].XValueType = ChartValueType.String;chart1.Series[2].XValueType = ChartValueType.String;chart1.Series[3].XValueType = ChartValueType.String;chart1.Series[0].ToolTip = "#VALX:#VALY℃";//11-12-30:28℃chart1.Series[1].ToolTip = "#VALX:#VALY%RH";chart1.Series[2].ToolTip = "#VALX:#VALY%VOL";chart1.Series[3].ToolTip = "#VALX:#VALYM/S";//设置x可以使用鼠标选中进行局部放大效果chart1.ChartAreas[0].CursorX.IsUserEnabled = true;//是否允许用户操作x轴chart1.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;//是否允许用户选择滚动条;//设置滚动条样式chart1.ChartAreas[0].AxisX.ScrollBar.BackColor = Color.Red; //滚动条的整体颜色chart1.ChartAreas[0].AxisX.ScrollBar.ButtonColor = Color.Green;//滚动条按钮的颜色}
查询功能
清空之前的数据
 wenduValues.Clear();shiduValues.Clear();yangqiValues.Clear();fengsuValues.Clear();
1查询数据
string sql = $"select id,time,wendu,shidu,o2,fengsu from Log where time >='{dateTimePicker1.Value}' and time<='{dateTimePicker2.Value}'";List<Log> list = new List<Log>();
3调用查询数据库方法 进行list添加数据
SqlDataReader sr =  SqlHelper.GetValue(sql); //读取一条之后 放到sr对象中while (sr.Read()) // 如果能读到数据{list.Add(new Log(){id = Convert.ToInt16(sr["id"]),time = Convert.ToDateTime(sr["time"]),// DBNull 数据的null、 如果数据库wendu为空,表格显示未记录,如果不为空 取出除以10wendu = sr["wendu"] is DBNull ? "未记录" : ((Convert.ToInt16(sr["wendu"]) / 10).ToString()),shidu = sr["shidu"] is DBNull ? "未记录" : ((Convert.ToInt16(sr["shidu"]) / 10).ToString()),o2 = sr["o2"] is DBNull ? "未记录" : ((Convert.ToInt16(sr["o2"]) / 10).ToString()),fengsu = sr["fengsu"] is DBNull ? "未记录" : ((Convert.ToInt16(sr["fengsu"]) / 10).ToString()),}); }sr.Close();dataGridView1.DataSource = list; //设置表格数据源
添加图表数据 把查询到list数据添加到图表中
    for(int i = 0; i < list.Count; i++){Log log = list[i]; //遍历string time = log.time.ToString(); //取时间if(log.wendu == "未记录" && wenduValues.Count>0) //温度未被存到数据库里面,{// 设置点为透明颜色//wenduValues[i - 1].YValues 添加前一个点的y坐标 wenduValues.AddXY(time, wenduValues[i - 1].YValues[0]);DataPoint p = wenduValues[i];p.Color = Color.Transparent;// 设置为透明颜色}else  //温度有数据 把数据添加图标上{wenduValues.AddXY(time, log.wendu); //添加点}if (log.shidu == "未记录" && shiduValues.Count > 0) //温度未被存到数据库里面,{// 设置点为透明颜色//wenduValues[i - 1].YValues 添加前一个点的y坐标 shiduValues.AddXY(time, shiduValues[i - 1].YValues[0]);DataPoint p = shiduValues[i];p.Color = Color.Transparent;// 设置为透明颜色}else  //温度有数据 把数据添加图标上{shiduValues.AddXY(time, log.shidu); //添加点}if (log.o2 == "未记录" && yangqiValues.Count > 0) //温度未被存到数据库里面,{// 设置点为透明颜色//wenduValues[i - 1].YValues 添加前一个点的y坐标 yangqiValues.AddXY(time, yangqiValues[i - 1].YValues[0]);DataPoint p = yangqiValues[i];p.Color = Color.Transparent;// 设置为透明颜色}else  //温度有数据 把数据添加图标上{yangqiValues.AddXY(time, log.o2); //添加点}if (log.fengsu == "未记录" && fengsuValues.Count > 0) //温度未被存到数据库里面,{// 设置点为透明颜色//wenduValues[i - 1].YValues 添加前一个点的y坐标 fengsuValues.AddXY(time, fengsuValues[i - 1].YValues[0]);DataPoint p = fengsuValues[i];p.Color = Color.Transparent;// 设置为透明颜色}else  //温度有数据 把数据添加图标上{fengsuValues.AddXY(time, log.fengsu); //添加点}}
}

设置结束时间 最小值是在开始时间的30分钟之后,
            //MinDate 最小值
            // AddMinutes 添加30分钟

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{//设置结束时间 最小值是在开始时间的30分钟之后,//MinDate 最小值// AddMinutes 添加30分钟dateTimePicker2.MinDate = dateTimePicker1.Value.AddMinutes(30);
}
Log 包含每一条数据信息
public class Log
{public DateTime time { get; set; }public int id { get; set; }public string wendu { get; set; }public string shidu { get; set; }public string o2 { get; set; }public string fengsu { get; set; }
}

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

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

相关文章

opencascade AIS_Line源码学习

前言 AIS_Line 是 OpenCASCADE 库中的一个类&#xff0c;用于表示和操作三维直线。它可以通过几何线&#xff08;Geom_Line&#xff09;或者两个几何点&#xff08;Geom_Point&#xff09;来初始化。 方法 1 //! 初始化直线 aLine。 Standard_EXPORT AIS_Line(const Handl…

单片机学习历程

学习单片机的过程可以分为几个主要阶段&#xff0c;每个阶段都涉及不同的学习内容和技能提升。下面我将以一个典型的学习历程为例进行介绍&#xff1a; 初学阶段 1.入门理论学习&#xff1a; 开始接触单片机的基础知识&#xff0c;学习其工作原理、体系结构和常见的芯片类型…

Linux_make/Makefile的理解

1.make是一个命令&#xff0c;makefile是一个文件, 依赖关系和依赖方法. a.快速使用一下 i.创建一个Makefile文件(首字母也可以小写) b.依赖关系和依赖方法 i.依赖关系: 我为什么要帮你? mybin:mytest.c ii.依赖方法: 怎么帮? gcc -o mybin mytest.c make之前要注意先创建…

IDEA搭建Vue开发环境(安装Node.js、安装vue-cli、创建项目、编译项目、启动项目、yarn启动项目、npm和yarn命令行命令简单使用)

目录 1. 安装Node.js2. 安装vue-cli构建工具3. 使用vue-cli创建项目4. 启动项目5. IDEA启动vue6. 在IDEA编译vue项目7. 用yarn启动vue项目8. npm和yarn命令行命令简单使用8.1 npm8.2 yarn 1. 安装Node.js Node.js基于Google的V8引擎&#xff0c;形成了一个Javascript的运行环境…

AI绘画SD万能模型 ControlNet Union (也称ControlNet++ 或 ControlNetPlus)!10余种控制效果一键生成!

大家好&#xff0c;我是画画的小强 Controlnet 可以说是目前最重要的一款 AI 绘画控制插件&#xff0c;可以帮我们实现轮廓、深度、动作姿势、颜色等多种控制效果。由于每种控制条件都需要调用不同的控制模型&#xff0c;加上 SD1.5 和 SDXL 的生态并不互通&#xff0c;大家肯…

photoshop学习笔记——选区

选区工具快捷键&#xff1a;M shift M 切换 矩形/椭圆选区工具 基本用法 选区框选出的地方被激活&#xff08;其后进行的操作&#xff0c;仅在选区中生效&#xff09; 选区工具选择后&#xff08;以矩形选区为例&#xff09; 按下鼠标左键拖动&#xff0c;画出一块矩形区…

腾讯云COS异步操作上传(Python)

文章目录 相关概念介绍相关术语SDK使用异步上传文件 相关概念介绍 COS全称“云对象存储”&#xff08;Cloud Object Storage&#xff09;&#xff0c;是一种分布式存储服务&#xff0c;通过将数据作为对象存储&#xff0c;可以实现数据的高可靠性和可扩展性。它通常用于存储非…

《后端程序猿 · @Value 注释说明》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

SQL labs-SQL注入(四,sqlmap对于post传参方式的注入)

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 序言&#xff1a;本文主要讲解基于SQL labs靶场&#xff0c;sqlmap工具进行的post传参方式的SQL注入。 传参方式有两类&#xff0c;一类是直接在url栏内进行url编码后进行的传参&am…

Android APK混淆处理方案分析

这里写目录标题 一、前言1.1 相关工具二、Apk 分析2.1 apk 解压文件2.2 apk 签名信息2.3 apk AndroidManifest.xml2.4 apk code三、Apk 处理3.1 添加垃圾文件3.2 AndroidManifest.xml 处理3.3 dex 混淆处理3.4 zipalign对齐3.5 apk 重新签名3.6 apk 安装测试四、总结一、前言 提…

sentinel 服务流量控制 、熔断降级

1、什么是 sentinel,可以用来干什么 sentinel是用来在微服务系统中保护微服务对的作用,如何避免服务的雪崩、熔断、降级,说白了就是用来替换hystrix。 Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 官网:GitHub - alibaba/Se…

Ubuntu安装QQ教程

Ubuntu安装QQ教程 腾讯更新Linux版的QQ&#xff0c;这里安装一下&#xff1b; 首先&#xff0c;进入官网找到合适对应的安装包&#xff1b; QQLinux版本官网&#xff1a;https://im.qq.com/linuxqq/index.shtml 我们是ubuntu系统选择X86下的deb版本&#xff0c;如果是arm开…

5G单北斗定位工卡

UWB卫星定位工卡&#xff08;HXZK-UBK&#xff09;融合定位系统结合了两种定位技术的优势&#xff0c;从而能够在各种环境下实现更精准、更可靠的定位,UWB&#xff08;ULtra-Wideband&#xff0c;超宽带&#xff09;技术和GNGSS&#xff08;GLobal Positioning System&#xff…

上海浦东装修公司推荐:高端选择,品质生活

在上海浦东这样一个经济繁荣、文化多元的地区&#xff0c;居住环境的品质直接关系到家的感觉。为了追求高品质生活的您&#xff0c;我们精心挑选了五大豪华装修公司。1.即住空间装饰即住空间装饰以其“高效、省心、精工”为核心理念&#xff0c;专注于为追求高品质生活的业主提…

【word转pdf】【最新版本jar】Java使用aspose-words实现word文档转pdf

【aspose-words-22.12-jdk17.jar】word文档转pdf 前置工作1、下载依赖2、安装依赖到本地仓库 项目1、配置pom.xml2、配置许可码文件&#xff08;不配置会有水印&#xff09;3、工具类4、效果 踩坑1、pdf乱码2、word中带有图片转换 前置工作 1、下载依赖 通过百度网盘分享的文…

嵌入式linux系统中压力测试的方法

在Linux环境下,确保系统各项资源充分且稳定地运行对任何系统管理员来说都至关重要。特别是在生产环境中,理解如何对系统资源进行基准测试和压力测试可以帮助预防未来的问题,同时也能够优化现有系统的性能。 在本文中,我们将探讨如何使用命令行工具来对Linux系统的CPU、内存…

科技前沿:Llama 3.1的突破与革新

在科技的长河中&#xff0c;每一次模型的更新都是对人类智慧的致敬。今天&#xff0c;我们将聚焦于Meta公司最新发布的Llama 3.1系列模型&#xff0c;探索其在AI领域的前沿突破。 新模型的诞生 自去年以来&#xff0c;Meta公司不断推进人工智能技术的发展&#xff0c;终于在近…

2024软件测试面试题及答案

【纯干货&#xff01;&#xff01;&#xff01;】花费了整整3天&#xff0c;整理出来的全网最实用软件测试面试大全&#xff0c;一共30道题目答案的纯干货&#xff0c;希望大家多多支持&#xff0c;建议 点赞&#xff01;&#xff01;收藏&#xff01;&#xff01;长文警告&…

学习华为IPD流程黑话2.0

目录 1、内容简介 2、概念六&#xff1a;管道管理 3、概念七&#xff1a;业务计划 4、概念八&#xff1a;IPMT 的投资活动 5、概念九&#xff1a;BETA、ESS、ESP 作者简介 1、内容简介 学习任何新事物都是从概念开始的。 以我个人最近遇到的一个事为例&#xff1a; 前…

双向链表(C语言版)

1. 双向链表的结构 注意&#xff1a;这里的“带头”跟单链表的“头结点”是两个概念&#xff0c;实际上在单链表阶段称呼不太严谨&#xff0c;但是为了更好地理解就直接称为单链表的头结点。带头链表里的头结点&#xff0c;实际为“哨兵位”&#xff0c;哨兵位结点不存储任何有…