文章目录
1.蓝桥杯必备知识点
蓝桥杯是一个面向全国高校计算机相关专业学生的学科竞赛,涵盖多个赛道,常见的有软件类(如 C/C++ 程序设计、Java 软件开发、Python 程序设计)和电子类(如嵌入式设计与开发、单片机设计与开发等)。以下为你分别介绍软件类和电子类省赛的必备知识点:
软件类
编程语言基础
C/C++
基本语法:变量、数据类型(如整型、浮点型、字符型、指针等)、运算符、控制结构(如 if-else、for、while 循环)等。
函数:函数的定义、调用、参数传递(值传递、指针传递、引用传递)。
数组和字符串:数组的定义、初始化、访问,字符串的处理(如字符串的输入输出、字符串函数的使用)。
结构体和联合体:结构体和联合体的定义、使用,结构体数组等。
文件操作:文件的打开、读写、关闭操作。
Java
基本语法:变量、数据类型、运算符、控制语句。
面向对象编程:类、对象、继承、多态、封装等概念,以及类的定义、方法的使用。
字符串处理:String 类、StringBuilder 类的使用。
集合框架:List、Set、Map 等集合的使用,以及迭代器的遍历。
异常处理:try-catch-finally 语句的使用。
Python
基本语法:变量、数据类型(如列表、元组、字典、集合)、控制流语句。
函数和模块:函数的定义和调用,模块的导入和使用。
文件操作:文件的读写操作。
面向对象编程:类和对象的创建,方法和属性的使用。
数据结构
数组:一维数组、多维数组的使用,数组的排序(如冒泡排序、快速排序)和查找(如二分查找)。
链表:单链表、双向链表的实现,链表的插入、删除、查找操作。
栈和队列:栈和队列的基本概念,栈的后进先出(LIFO)和队列的先进先出(FIFO)特性,以及栈和队列的实现和应用。
树:二叉树的遍历(前序、中序、后序遍历),二叉搜索树的基本操作。
图:图的表示(邻接矩阵、邻接表),图的遍历(深度优先搜索、广度优先搜索)。
算法
搜索算法:深度优先搜索(DFS)、广度优先搜索(BFS),常用于解决迷宫问题、路径搜索问题等。
动态规划:通过将原问题分解为相对简单的子问题,并保存子问题的解来避免重复计算,常用于解决最优子结构问题,如背包问题、最长公共子序列问题。
贪心算法:在每一步选择中都采取当前状态下的最优选择,期望通过局部最优达到全局最优,如哈夫曼编码、活动选择问题。
排序算法:除了上述提到的冒泡排序、快速排序,还需要掌握选择排序、插入排序、归并排序等排序算法的原理和实现。
数学知识
数论:质数的判断、最大公约数(GCD)和最小公倍数(LCM)的计算,以及同余定理等。
组合数学:排列组合的计算,常用于解决计数问题。
电子类
电路基础
电路元件:电阻、电容、电感等基本元件的特性和参数计算。
电路定律:欧姆定律、基尔霍夫定律(电流定律和电压定律)的应用。
电路分析方法:节点电压法、网孔电流法等电路分析方法。
单片机知识
单片机原理:单片机的基本结构、工作原理,如 CPU、存储器、I/O 接口等。
编程语言:常见的单片机编程语言为 C 语言,需要掌握单片机 C 语言的编程规范和技巧。
外设驱动:掌握单片机的各种外设驱动,如定时器、计数器、串口通信、中断系统等。
传感器与执行器
传感器:了解常见传感器的工作原理和使用方法,如温度传感器、光照传感器、加速度传感器等。
执行器:掌握执行器的控制方法,如电机驱动、继电器控制等。
PCB 设计基础
原理图设计:使用专业的 PCB 设计软件(如 Altium Designer)进行原理图的绘制。
PCB 布局布线:掌握 PCB 布局布线的基本原则和方法,避免电磁干扰等问题。
2. 题型1
### 2.1代码
# @File: 14.星期一计数.py
# @Author: chen_song
# @Time: 2025-02-25 10:41
from datetime import datetime, timedelta
# 分割日期字符串为年、月、日
def divideToThreeParts(date):
years = int(date[:4])
month = int(date[4:6])
day = int(date[6:8])
return years, month, day
# 判断是否闰年
def isLeapYear(year):
return (year % 400 == 0) or (year % 4 == 0 and year % 100 != 0)
# 获取1 - 12月的天数
def getDaysOfMonthAccording2Year(month, year):
if month in [1, 3, 5, 7, 8, 10, 12]:
return 31
if month in [4, 6, 9, 11]:
return 30
if month == 2:
return 29 if isLeapYear(year) else 28
# 写一个函数实现对任意日期之间天数计算
def countDaysBetweenRandomDates(date1, date2):
year1, month1, day1 = divideToThreeParts(date1)
year2, month2, day2 = divideToThreeParts(date2)
# 计算起始日期到当年年底的天数
days1 = 0
for m in range(month1, 13):
if m == month1:
days1 += getDaysOfMonthAccording2Year(m, year1) - day1
else:
days1 += getDaysOfMonthAccording2Year(m, year1)
# 计算中间完整年份的天数
days2 = 0
for y in range(year1 + 1, year2):
days2 += 366 if isLeapYear(y) else 365
# 计算结束日期所在年份年初到结束日期的天数
days3 = 0
for m in range(1, month2):
# 获取最后一年前几个月的天数
days3 += getDaysOfMonthAccording2Year(m, year2)
days3 += day2
return days1 + days2 + days3
date1 = input()
year1, month1, day1 = divideToThreeParts(date1)
dateTime1 = datetime(year1, month1, day1)
# 获得第一个周一
while dateTime1.weekday() != 0:
dateTime1 += timedelta(days=1)
date1 = dateTime1.strftime("%Y%m%d")
date2 = input()
year2, month2, day2 = divideToThreeParts(date2)
dateTime2 = datetime(year2, month2, day2)
# 检查第一个周一是否超过结束日期
if dateTime1 > dateTime2:
result = 0
else:
days = countDaysBetweenRandomDates(date1, date2)
result = days // 7 + 1
print(result)
3.需求2
## 3.1代码
from datetime import datetime
# 获取用户输入的日期
input_date = input()
a, b, c = map(int, input_date.split('/'))
# 定义日期范围
start_date = datetime(1960, 1, 1)
end_date = datetime(2059, 12, 31)
# 定义一个函数来判断日期是否合法
def is_valid_date(year, month, day):
try:
# 尝试创建日期对象,如果日期不合法会抛出 ValueError 异常
date = datetime(year, month, day)
return start_date <= date <= end_date
except ValueError:
return False
# 生成所有可能的日期组合 枚举
all_combinations = [
(1900 + a, b, c), (2000 + a, b, c),
(1900 + c, a, b), (2000 + c, a, b),
(1900 + c, b, a), (2000 + c, b, a)
]
# 存储合法的日期
valid_dates = []
for year, month, day in all_combinations:
if is_valid_date(year, month, day):
valid_dates.append(datetime(year, month, day))
# 去除重复的日期并排序
unique_dates = sorted(set(valid_dates))
# 输出结果
for date in unique_dates:
print(date.strftime("%Y-%m-%d"))