【蓝桥杯-单片机】基于定时器的倒计时程序设计

基于定时器的倒计时程序

题目如下所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实现过程中遇到的一些问题

01 如何改变Seg_Buf数组的值数码管总是一致地显示0 1 2 3 4 5

首先这个问题不是在main.c中关于数码管显示部分的逻辑错误,就是发生在数码管的底层错误。
检查了逻辑部分,没有发现问题
转而查找底层上面的错误。
底层的Seg.c是这样写的:

#include <Seg.h>

unsigned char code Seg_Dula[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f ,0x00};
unsigned char code Seg_Wela[] = {0xfe ,0xfd ,0xfb,0xf7,0xef,0xdf};

void Seg_Disp(unsigned char wela,dala)
{
	//消影
	P0 = 0x00;
	P2_6 = 1;
	P2_6 = 0;
	
	P0 = Seg_Wela[wela];
	P2_7 = 1;
	P2_7 = 0;
	
	P0 = Seg_Dula[wela];//问题出现在这里!
	P2_6 = 1;
	P2_6 = 0;
}

果然被我发现了,段选数组的索引写错了,写成了wela,这样无论如何,数码管的每一位都会按照传入的wela来显示(wela在main函数中即Seg_Pos,这个变量在0-5范围内循环)

	if(++Seg_Pos == 6) Seg_Pos = 0;
	Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos]);

02 按下设置按键KEY4设置好倒计时参数后,该参数应该在什么时机传输给Time_Count倒计时变量用于倒计时呢?

(1)设置完就对Time_Count赋值

//按键处理函数Key_Proc()
void Key_Proc()
{
	if(Key_Slow_Down)return;
	Key_Slow_Down = 1;//按键减速程序
	
	//这三行要背下来
	Key_Val = Key_Read();//读取按下的键码值
	Key_Down = Key_Val &(Key_Val ^ Key_Old);//捕获下降沿
	Key_Old = Key_Val;//辅助扫描
	
	switch(Key_Down)
	{
		//框架先搭好,内容先不写
		case 1:
			if(Seg_Mode == 0) System_Flag = 1;
		break;
		
		case 3:
			Seg_Mode ^= 1;
		break;
		
		case 4:
			if(Seg_Mode == 1)
			{
				if(++Set_Dat_Index == 3) Set_Dat_Index = 0;
				Time_Count = Set_Dat[Set_Dat_Index];//设置完就对Time_Count赋值!!!!!!
			}
		break;
			
		case 2:
			if(Seg_Mode == 0) Time_Count = Set_Dat[Set_Dat_Index];
		break;
	}
}

如果这样的话,会导致切换回显示模式后已经倒计时了一段时间了,不是从设置的值开始倒计时的。想要切换回显示模式从设置的值开始倒计时,需要在切换回显示模式后,再对Time_Count赋值。

(2)在切换成显示模式后对Time_Count赋值

//按键处理函数Key_Proc()
void Key_Proc()
{
	if(Key_Slow_Down)return;
	Key_Slow_Down = 1;//按键减速程序
	
	//这三行要背下来
	Key_Val = Key_Read();//读取按下的键码值
	Key_Down = Key_Val &(Key_Val ^ Key_Old);//捕获下降沿
	Key_Old = Key_Val;//辅助扫描
	
	switch(Key_Down)
	{
		//框架先搭好,内容先不写
		case 1:
			if(Seg_Mode == 0) System_Flag = 1;
		break;
		
		case 3:
			Seg_Mode ^= 1;
			if(Seg_Mode == 0)
				Time_Count = Set_Dat[Set_Dat_Index]  ;//切换到显示界面再对Time_Count赋值!!!!!!
		break;
		
		case 4:
			if(Seg_Mode == 1)
			{
				if(++Set_Dat_Index == 3) Set_Dat_Index = 0;
				//Time_Count = Set_Dat[Set_Dat_Index];
			}
		break;
			
		case 2:
			if(Seg_Mode == 0) Time_Count = Set_Dat[Set_Dat_Index];
		break;
	}
}

03 倒计时到0之后为什么数码管又变成55再倒计时呢?

这是因为Time_Count–,没有对其作任何限制的情况下,Time_Count减为0之后会再从255开始减递减(Time_Count是一个unsigned char类型的变量,该变量8bit,变量可以表示的范围为0-255)。而我们只让数码管显示到十位数,因此我们看到的就是数码管从55开始倒计时。

对中断服务函数代码作如下修改:

void Timer0Server() interrupt 1
{
	//定时器的初值一定要记得从上面复制过来
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	if(++Key_Slow_Down == 10) Key_Slow_Down = 0;
	if(++Seg_Slow_Down == 500) Seg_Slow_Down = 0;
	if(++Seg_Pos == 6) Seg_Pos = 0;
	Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos]);
	
	//模板以外的东西
	if(System_Flag == 1)
		//倒计时开始
	{
		if(++Timer_1000ms == 1000)
		{
			Timer_1000ms = 0;
			Time_Count--;//相当于1s中减少一次(倒计时一次)
			if(Time_Count==255) Time_Count=0;//修改代码!!!!!!!!!!!!!!!!!!
		}
	}
}

修改代码之后数码管会停在00的位置。

在这里插入图片描述

至此,所有代码如下所示(不包含设置参数以1s为周期闪烁):

//头文件声明
#include <REGX52.H>
#include <Key.h>
#include <Seg.h>//动态数码管会用到数码管的底层?

//变量声明
unsigned char Key_Slow_Down;//按键减速专用变量 10ms
unsigned char Key_Val,Key_Down,Key_Old;//按键扫描专用变量

unsigned int Seg_Slow_Down;//数码管减速专用变量 500mschar:0-255.char不够用

//动态数码管
unsigned char Seg_Pos;//数码管扫描变量
unsigned char Seg_Buf[6] = {10,10,10,10,10,10};//数码管显示数据存放数组

unsigned char Seg_Mode;//数码管显示页面 0-显示 1-设置,默认为0
unsigned int Timer_1000ms;//1000ms标志位
unsigned char Time_Count = 30;//倒计时变量

//按键
bit System_Flag;//0-暂停 1-开始倒计时

unsigned char Set_Dat[3] = {15,30,60};//设置参数储存数组
unsigned char Set_Dat_Index = 1;

//LED点亮标志位
bit Timer0Flag;//0-倒计时没有到0;1-倒计时到0


//按键处理函数Key_Proc()
void Key_Proc()
{
	if(Key_Slow_Down)return;
	Key_Slow_Down = 1;//按键减速程序
	
	//这三行要背下来
	Key_Val = Key_Read();//读取按下的键码值
	Key_Down = Key_Val &(Key_Val ^ Key_Old);//捕获下降沿
	Key_Old = Key_Val;//辅助扫描
	
	switch(Key_Down)
	{
		//框架先搭好,内容先不写
		case 1:
			if(Seg_Mode == 0) System_Flag = 1;
		break;
		
		case 3:
			Seg_Mode ^= 1;
			//if(Seg_Mode == 0)
				//Time_Count = Set_Dat[Set_Dat_Index];
		break;
		
		case 4:
			if(Seg_Mode == 1)
			{
				if(++Set_Dat_Index == 3) Set_Dat_Index = 0;
				Time_Count = Set_Dat[Set_Dat_Index];
			}
		break;
			
		case 2:
			if(Seg_Mode == 0) Time_Count = Set_Dat[Set_Dat_Index];
		break;
	}
}

//信息显示函数Seg_Proc()
void Seg_Proc()
{
	if(Seg_Slow_Down)return;
	Seg_Slow_Down = 1;//数码管减速程序
	
	//现在没有要显示的信息,这里先空着。(模板以外的东西)
	Seg_Buf[0] = Seg_Mode + 1;
	if(Seg_Mode == 0)//显示模式
	{
		Seg_Buf[4] = Time_Count/10%10;//可以写成Time_Count/10嘛
		Seg_Buf[5] = Time_Count%10;
	}
	else//处于设置模式
	{
		Seg_Buf[4] = Set_Dat[Set_Dat_Index]/10%10;
		Seg_Buf[5] = Set_Dat[Set_Dat_Index]%10;
		
	}


}

/* 其他显示函数 */
//Led_Proc()
void Led_Proc()
{
	if(Time_Count == 0)
	{
		P1 = 0x00;//LED全亮
		P2_3 = 0;//蜂鸣器使能
	}
	else
	{
		P1 = 0xff;//LED全灭
		P2_3 = 1;//蜂鸣器关闭
	}
}

//Timer0Init()定时器0的中断初始化函数
void Timer0Init(void)		//1毫秒@12.000MHz
{
	//AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	
	//复制过来之后不要忘记加上两句话
	ET0 = 1;
	EA = 1;
}


//Server定时器0的中断服务函数
//a++是先进行取值,后进行自增。++a是先进行自增,后进行取值
void Timer0Server() interrupt 1
{
	//定时器的初值一定要记得从上面复制过来
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	if(++Key_Slow_Down == 10) Key_Slow_Down = 0;
	if(++Seg_Slow_Down == 500) Seg_Slow_Down = 0;
	if(++Seg_Pos == 6) Seg_Pos = 0;
	Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos]);
	
	//模板以外的东西
	if(System_Flag == 1)
		//倒计时开始
	{
		if(++Timer_1000ms == 1000)
		{
			Timer_1000ms = 0;
			Time_Count--;//相当于1s中减少一次(倒计时一次)
			if(Time_Count==255) Time_Count=0;
		}
	}
}
//主函数
void main()
{
	Timer0Init();//上电时立即调用定时器初始化函数
	while(1)
	{
		//三大处理单元:按键、数码管、LED
		Key_Proc();
		Seg_Proc();
		Led_Proc();
	}
}

04 如何实现设置参数以1s为周期闪烁?

(1)在变量声明区新增两个变量:
注:以1s为周期闪烁,即500ms亮,500ms灭。

unsigned int Timer_500ms;//500ms标志位
bit Seg_Flag;//数码管标志位,即控制数码管的亮灭

(2)在中断服务函数中

	if(++Timer_500ms == 500)
	{
		Timer_500ms = 0;
		Seg_Flag ^= 1;
		//因为默认值为0,只需要对其取反即可,不需要赋值,可以用^=1来对一个变量取反
	}

(3)在数码管显示函数中

//信息显示函数Seg_Proc()
void Seg_Proc()
{
	if(Seg_Slow_Down)return;
	Seg_Slow_Down = 1;//数码管减速程序
	
	//现在没有要显示的信息,这里先空着。(模板以外的东西)
	Seg_Buf[0] = Seg_Mode + 1;
	if(Seg_Mode == 0)//显示模式
	{
		Seg_Buf[4] = Time_Count/10%10;//可以写成Time_Count/10嘛
		Seg_Buf[5] = Time_Count%10;
	}
	else//处于设置模式
	{
//		Seg_Buf[4] = Set_Dat[Set_Dat_Index]/10%10;
//		Seg_Buf[5] = Set_Dat[Set_Dat_Index]%10;
//修改如下:
		if(Seg_Flag == 1)
		{
			Seg_Buf[4] = 10;
			Seg_Buf[5] = 10;
		}
		else
		{
			Seg_Buf[4] = Set_Dat[Set_Dat_Index]/10%10;
			Seg_Buf[5] = Set_Dat[Set_Dat_Index]%10;
		}
	}
}

05 最终版代码

//头文件声明
#include <REGX52.H>
#include <Key.h>
#include <Seg.h>//动态数码管会用到数码管的底层?

//变量声明
unsigned char Key_Slow_Down;//按键减速专用变量 10ms
unsigned char Key_Val,Key_Down,Key_Old;//按键扫描专用变量

unsigned int Seg_Slow_Down;//数码管减速专用变量 500mschar:0-255.char不够用

//动态数码管
unsigned char Seg_Pos;//数码管扫描变量
unsigned char Seg_Buf[6] = {10,10,10,10,10,10};//数码管显示数据存放数组

unsigned char Seg_Mode;//数码管显示页面 0-显示 1-设置,默认为0
unsigned int Timer_1000ms;//1000ms标志位
unsigned char Time_Count = 30;//倒计时变量

//按键
bit System_Flag;//0-暂停 1-开始倒计时

unsigned char Set_Dat[3] = {15,30,60};//设置参数储存数组
unsigned char Set_Dat_Index = 1;

//设置参数闪烁
unsigned int Timer_500ms;//500ms标志位
bit Seg_Flag;//数码管标志位

//LED点亮标志位
bit Timer0Flag;//0-倒计时没有到0;1-倒计时到0


//按键处理函数Key_Proc()
void Key_Proc()
{
	if(Key_Slow_Down)return;
	Key_Slow_Down = 1;//按键减速程序
	
	//这三行要背下来
	Key_Val = Key_Read();//读取按下的键码值
	Key_Down = Key_Val &(Key_Val ^ Key_Old);//捕获下降沿
	Key_Old = Key_Val;//辅助扫描
	
	switch(Key_Down)
	{
		//框架先搭好,内容先不写
		case 1:
			if(Seg_Mode == 0) System_Flag = 1;
		break;
		
		case 3:
			Seg_Mode ^= 1;
			//if(Seg_Mode == 0)
				//Time_Count = Set_Dat[Set_Dat_Index];
		break;
		
		case 4:
			if(Seg_Mode == 1)
			{
				if(++Set_Dat_Index == 3) Set_Dat_Index = 0;
				Time_Count = Set_Dat[Set_Dat_Index];
			}
		break;
			
		case 2:
			if(Seg_Mode == 0) Time_Count = Set_Dat[Set_Dat_Index];
		break;
	}
}

//信息显示函数Seg_Proc()
void Seg_Proc()
{
	if(Seg_Slow_Down)return;
	Seg_Slow_Down = 1;//数码管减速程序
	
	//现在没有要显示的信息,这里先空着。(模板以外的东西)
	Seg_Buf[0] = Seg_Mode + 1;
	if(Seg_Mode == 0)//显示模式
	{
		Seg_Buf[4] = Time_Count/10%10;//可以写成Time_Count/10嘛
		Seg_Buf[5] = Time_Count%10;
	}
	else//处于设置模式
	{
//		Seg_Buf[4] = Set_Dat[Set_Dat_Index]/10%10;
//		Seg_Buf[5] = Set_Dat[Set_Dat_Index]%10;
		if(Seg_Flag == 1)
		{
			Seg_Buf[4] = 10;
			Seg_Buf[5] = 10;
		}
		else
		{
			Seg_Buf[4] = Set_Dat[Set_Dat_Index]/10%10;
			Seg_Buf[5] = Set_Dat[Set_Dat_Index]%10;
		}
	}
}

/* 其他显示函数 */
//Led_Proc()
void Led_Proc()
{
	if(Time_Count == 0)
	{
		P1 = 0x00;//LED全亮
		P2_3 = 0;//蜂鸣器使能
	}
	else
	{
		P1 = 0xff;//LED全灭
		P2_3 = 1;//蜂鸣器关闭
	}
}

//Timer0Init()定时器0的中断初始化函数
void Timer0Init(void)		//1毫秒@12.000MHz
{
	//AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	
	//复制过来之后不要忘记加上两句话
	ET0 = 1;
	EA = 1;
}


//Server定时器0的中断服务函数
//a++是先进行取值,后进行自增。++a是先进行自增,后进行取值
void Timer0Server() interrupt 1
{
	//定时器的初值一定要记得从上面复制过来
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	if(++Key_Slow_Down == 10) Key_Slow_Down = 0;
	if(++Seg_Slow_Down == 500) Seg_Slow_Down = 0;
	if(++Seg_Pos == 6) Seg_Pos = 0;
	Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos]);
	
	//模板以外的东西
	if(System_Flag == 1)
		//倒计时开始
	{
		if(++Timer_1000ms == 1000)
		{
			Timer_1000ms = 0;
			Time_Count--;//相当于1s中减少一次(倒计时一次)
			if(Time_Count==255) Time_Count=0;
		}
	}
	
	if(++Timer_500ms == 500)
	{
		Timer_500ms = 0;
		Seg_Flag ^= 1;
		//因为默认值为0,只需要对其取反即可,不需要赋值,可以用^=1来对一个变量取反
	}
}
//主函数
void main()
{
	Timer0Init();//上电时立即调用定时器初始化函数
	while(1)
	{
		//三大处理单元:按键、数码管、LED
		Key_Proc();
		Seg_Proc();
		Led_Proc();
	}
}

参考视频:https://www.bilibili.com/video/BV1TR4y1k7iz?p=6&vd_source=5af7b905774c79f1754cd4ab83975115

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

玩转C语言——深入理解指针

一、指针概念 1.1 内存和地址 在开始学习指针前&#xff0c;我们先来讲一个例子&#xff0c;假如你身处一栋楼中&#xff0c;你点了一份外卖&#xff0c;那么&#xff0c;外卖员如何能找到你&#xff1f;有两种方法。法一&#xff1a;直接一间一间找&#xff0c;这样做不仅消耗…

线程和进程的区别和联系

一、什么是进程 进程(Process), 是一个具有独立功能的程序关于某个数据集合的一次运行活动&#xff0c;是系统进行 【资源分配和调度】 的一个独立单位。 进程是【程序】的【一次执行】(是计算机中程序的执行过程&#xff0c;而不是计算机中的程序)进程是系统进行【资源分配和…

十二 超级数据查看器 讲解稿 详情7 其他功能

十二 超级数据查看器 讲解稿 详情7 其他功能 点击此处 以新页面 打开B站 播放当前教学视频 点击访问app下载页面 百度手机助手 下载地址 ​ 讲解稿全文&#xff1a; 其他操作&#xff0c;主要用来完成替换和批量修改&#xff0c; 这里&#xff0c;我们想给成语字段增…

YOLOv9改进策略:卷积魔改 | 分布移位卷积(DSConv),提高卷积层的内存效率和速度

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; YOLOv9如何魔改卷积进一步提升检测精度&#xff1f;提出了一种卷积的变体&#xff0c;称为DSConv&#xff08;分布偏移卷积&#xff09;&#xff0c;其可以容易地替换进标准神经网络体系结构并且实现较低的存…

二、Kubernetes(k8s)中部署项目wordpress(php博客项目,数据库mysql)

前期准备 1、关机顺序 2、开机顺序 (1)、k8s-ha1、k8s-ha2 (2)、master01、master02、master03 (3)、node01、node02 一、集群服务对外提供访问&#xff0c;需要通过Ingress代理发布域名 mast01上传 ingress-nginx.yaml node01、node02 上传 ingress-nginx.tar 、kube-webh…

【知识库系统】JWT实现前后端分离验证

本文会先从理论和实践两部分讲述如何去理解和实现通过JWT进行身份认证。 一、理论 1. SpringSecurity 默认的认证是需要通过 UsernamePasswordAuthenticationFilter 进行认证的&#xff0c;该过滤器认证前&#xff0c;会到 SecurityContextHolder 中寻找是否有符合的 Authent…

Issue 2046:Missing array size check in NewFixedArray

文章目录 环境搭建漏洞分析漏洞触发 漏洞利用总结参考 环境搭建 sudo apt install pythongit reset --hard 64cadfcf4a56c0b3b9d3b5cc00905483850d6559 export DEPOT_TOOLS_UPDATE0 gclient sync -D// debug version tools/dev/v8gen.py x64.debug ninja -C out.gn/x64.debug/…

java数据结构与算法刷题-----LeetCode135. 分发糖果

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 左右遍历2. 进阶&#xff1a;常数空间遍历&#xff0c;升序降…

Visual Studio - 添加快捷键图标

Visual Studio - 添加快捷键图标 1. Text Editor Toolbar Options -> Add or Remove Buttons -> Customize2. Toolbars3. Commands -> Debug4. Add Command...References 1. Text Editor Toolbar Options -> Add or Remove Buttons -> Customize 2. Toolbars B…

并发编程之synchronized的详细解析

4.2 synchronized 解决方案 应用之互斥 为了避免临界区的竞态条件发生&#xff0c;有多种手段可以达到目的。 阻塞式的解决方案&#xff1a;synchronized&#xff0c;Lock 非阻塞式的解决方案&#xff1a;原子变量 本次课使用阻塞式的解决方案&#xff1a;synchronized&am…

长安链智能合约标准协议第二草案——BNS与DID协议邀请社区用户评审

长安链智能合约标准协议 在智能合约编写过程中&#xff0c;不同的产品及开发人员对业务理解和编程习惯不同&#xff0c;即使同一业务所编写的合约在具体实现上也可能有很大差异&#xff0c;在运维或业务对接中面临较大的学习和理解成本&#xff0c;现有公链合约协议规范又不能完…

C++:类和对象(上篇)

目录&#xff1a; 一&#xff1a;面向对象和过程的介绍 二&#xff1a;类的引入 三&#xff1a;类的定义 四&#xff1a;类的访问限定符以及封装 五&#xff1a;类的作用域 六&#xff1a;类的实例化 七&#xff1a;类对象大小的计算 八&#xff1a;类成员函数的this指…

C语言经典算法-7

文章目录 其他经典例题跳转链接36.排序法 - 改良的选择排序37.快速排序法&#xff08;一&#xff09;38.快速排序法&#xff08;二&#xff09;39.快速排序法&#xff08;三&#xff09;40.合并排序法 其他经典例题跳转链接 C语言经典算法-1 1.汉若塔 2. 费式数列 3. 巴斯卡三…

JJJ:改善ubuntu网速慢的方法

Ubuntu 系统默认的软件下载源由于服务器的原因&#xff0c; 在国内的下载速度往往比较慢&#xff0c;这时我 们可以将 Ubuntu 系统的软件下载源更改为国内软件源&#xff0c;譬如阿里源、中科大源、清华源等等&#xff0c; 下载速度相比 Ubuntu 官方软件源会快很多&#xff01;…

Linux实践 - 命令行解释器 简易版

~~~~ 前言解决的问题为什么shell要以子进程的方式执行我们的命令&#xff1f;为什么直接使用程序名ls&#xff0c;而不是路径/usr/bin/ls&#xff1f; 头文件包含命令行提示符接受用户命令行输入解析用户的输入内建命令&&特殊处理ls 时目录等文件不带高亮颜色cd时目录不…

electron-builder 打包问题,下载慢解决方案

目录 问题说明设置下载源 &#xff1f;解决方案思路下载Electron下载winCodeSign下载nsis下载nsis-resources 总结 问题说明 项目使用了Electron&#xff0c;在第一次打包时会遇见下载慢&#xff0c;导致打包进度几乎停滞不前&#xff0c;甚至可能直接报错 其实这是因为Electr…

【SpringBoot3+Mybatis】框架快速搭建

文章目录 GitHub 项目一、依赖二、 配置文件三、启动类四、SpringBoot3兼容Druid报错五、工具类5.1 结果封装类5.2 解决枚举类5.3 MD5加密工具类 GitHub 项目 springboot-part——springboot-integrate-07 Mybatis-plus版完整CRUD项目文档记录&#xff1a; 【SpringBoot3Myba…

【Python循环6/6】循环的综合运用

目录 回顾 for循环遍历列表 for循环进行累加/累乘的计算 复杂的条件判断 嵌套 嵌套循环 练习 遍历整数列表 总结 回顾 在之前的博文中&#xff0c;我们学习了for计数循环&#xff1b;while条件循环&#xff1b;以及跳出循环的两种方法break&#xff0c;continu…

CMU 10-414/714: Deep Learning Systems --hw3

实现功能 在ndarray.py文件中完成一些python array操作 我们实现的NDArray底层存储就是一个一维向量&#xff0c;只不过会有一些额外的属性&#xff08;如shape、strides&#xff09;来表明这个flat array在维度上的分布。底层运算&#xff08;如加法、矩阵乘法&#xff09;都…

幻兽帕鲁游戏搭建(docker)

系列文章目录 第一章&#xff1a; 幻兽帕陆游戏搭建 文章目录 系列文章目录前言一、镜像安装1.创建游戏目录2.拉取镜像3.下载配置文件4.启动游戏 二、自定义配置总结 前言 这段时间一直在写论文还有找工作&#xff0c;也没学啥新技术&#xff0c;所以博客也很长时间没写了&am…