c#和c++脚本解释器科学运算
说明:
我希望用c#和c++写一个脚本解释器,用于科学运算
效果图:
step1: c#
C:\Users\wangrusheng\RiderProjects\WinFormsApp3\WinFormsApp3\Form1.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;namespace WinFormsApp3;public partial class Form1 : Form
{private Dictionary<string, double> variables = new Dictionary<string, double>();// Windows Forms 设计器代码private TextBox txtScript;private Button btnExecute;private TextBox txtOutput;public Form1(){InitializeComponent();this.txtScript = new TextBox();this.btnExecute = new Button();this.txtOutput = new TextBox();this.SuspendLayout();// txtScriptthis.txtScript.Multiline = true;this.txtScript.Location = new System.Drawing.Point(12, 12);this.txtScript.Size = new System.Drawing.Size(400, 150);this.txtScript.ScrollBars = ScrollBars.Vertical;// btnExecutethis.btnExecute.Location = new System.Drawing.Point(12, 170);this.btnExecute.Size = new System.Drawing.Size(75, 23);this.btnExecute.Text = "执行";this.btnExecute.Click += new System.EventHandler(this.btnExecute_Click);// txtOutputthis.txtOutput.Multiline = true;this.txtOutput.Location = new System.Drawing.Point(12, 200);this.txtOutput.Size = new System.Drawing.Size(400, 150);this.txtOutput.ScrollBars = ScrollBars.Vertical;this.txtOutput.ReadOnly = true;// MainFormthis.ClientSize = new System.Drawing.Size(424, 361);this.Controls.Add(this.txtOutput);this.Controls.Add(this.btnExecute);this.Controls.Add(this.txtScript);this.Text = "简单脚本解释器";this.ResumeLayout(false);this.PerformLayout();}private void btnExecute_Click(object sender, EventArgs e){variables.Clear();txtOutput.Clear();string[] lines = txtScript.Text.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);foreach (string line in lines){try{var result = ProcessLine(line.Trim());if (!string.IsNullOrEmpty(result)){txtOutput.AppendText(result + "\r\n");}}catch (Exception ex){txtOutput.AppendText($"错误: {ex.Message}\r\n");}}}private string ProcessLine(string line){if (string.IsNullOrWhiteSpace(line)) return "";// 处理赋值语句if (line.Contains("=")){var match = Regex.Match(line, @"^\s*([a-zA-Z_]\w*)\s*=\s*(.+?)\s*$");if (!match.Success) throw new ArgumentException("无效的赋值语句");string varName = match.Groups[1].Value;double value = EvaluateExpression(match.Groups[2].Value);variables[varName] = value;return $"{varName} = {value}";}// 处理普通表达式return EvaluateExpression(line).ToString();}private double EvaluateExpression(string expr){// 替换变量为实际值string resolvedExpr = Regex.Replace(expr, @"\b([a-zA-Z_]\w*)\b", match =>{string varName = match.Groups[1].Value;if (variables.TryGetValue(varName, out double value)){return value.ToString();}throw new ArgumentException($"未定义的变量: {varName}");});// 计算数学表达式DataTable table = new DataTable();table.Columns.Add("expr", typeof(string), resolvedExpr);DataRow row = table.NewRow();table.Rows.Add(row);return Convert.ToDouble(row["expr"]);}}
step2: C++代码 C:\Users\wangrusheng\CLionProjects\untitled28\main.cpp
#include <iostream>
#include <string>
#include <map>
#include <regex>
#include <cctype>
#include <vector>
#include <algorithm>
#include <sstream>
#include <stdexcept>using namespace std;map<string, double> variables;// 辅助函数:跳过空白字符
void skip_whitespace(const string& expr, size_t& pos) {while (pos < expr.size() && isspace(expr[pos])) pos++;
}// 表达式解析函数声明
double eval_expression(const string& expr, size_t& pos);
double eval_term(const string& expr, size_t& pos);
double eval_factor(const string& expr, size_t& pos);
double eval_primary(const string& expr, size_t& pos);// 主解析函数
double evaluate(const string& expr) {size_t pos = 0;double result = eval_expression(expr, pos);skip_whitespace(expr, pos);if (pos != expr.size()) {throw runtime_error("Unexpected characters in expression");}return result;
}// 表达式解析实现
double eval_expression(const string& expr, size_t& pos) {return eval_term(expr, pos);
}double eval_term(const string& expr, size_t& pos) {double left = eval_factor(expr, pos);skip_whitespace(expr, pos);while (pos < expr.size()) {char op = expr[pos];if (op != '+' && op != '-') break;pos++;double right = eval_factor(expr, pos);if (op == '+') left += right;else left -= right;skip_whitespace(expr, pos);}return left;
}double eval_factor(const string& expr, size_t& pos) {double left = eval_primary(expr, pos);skip_whitespace(expr, pos);while (pos < expr.size()) {char op = expr[pos];if (op != '*' && op != '/') break;pos++;double right = eval_primary(expr, pos);if (op == '*') left *= right;else {if (right == 0) throw runtime_error("Division by zero");left /= right;}skip_whitespace(expr, pos);}return left;
}double eval_primary(const string& expr, size_t& pos) {skip_whitespace(expr, pos);if (pos >= expr.size()) {throw runtime_error("Unexpected end of expression");}if (expr[pos] == '(') {pos++;double value = eval_expression(expr, pos);skip_whitespace(expr, pos);if (pos >= expr.size() || expr[pos] != ')') {throw runtime_error("Missing closing parenthesis");}pos++;return value;}if (expr[pos] == '+' || expr[pos] == '-') {bool negative = (expr[pos] == '-');pos++;double value = eval_primary(expr, pos);return negative ? -value : value;}if (isdigit(expr[pos]) || expr[pos] == '.') {size_t start = pos;bool has_decimal = false;while (pos < expr.size() && (isdigit(expr[pos]) || expr[pos] == '.')) {if (expr[pos] == '.') {if (has_decimal) throw runtime_error("Invalid number format");has_decimal = true;}pos++;}return stod(expr.substr(start, pos - start));}throw runtime_error("Unexpected character: " + string(1, expr[pos]));
}// 变量替换函数
string replace_variables(const string& expr) {regex var_re(R"(\b([a-zA-Z_]\w*)\b)");smatch match;string result;size_t last = 0;auto begin = expr.cbegin();while (regex_search(begin, expr.cend(), match, var_re)) {result += string(begin, begin + match.position());string var = match[1];if (!variables.count(var)) {throw runtime_error("Undefined variable: " + var);}result += to_string(variables[var]);begin += match.position() + match.length();last = begin - expr.begin();}result += expr.substr(last);return result;
}// 处理单行输入
void process_line(const string& line) {try {string trimmed = line;trimmed.erase(remove_if(trimmed.begin(), trimmed.end(), ::isspace), trimmed.end());if (trimmed.empty()) return;// 处理赋值语句smatch match;regex assign_re(R"(^([a-zA-Z_]\w*)=(.*)$)");if (regex_match(trimmed, match, assign_re)) {string var = match[1];string expr = replace_variables(match[2]);variables[var] = evaluate(expr);cout << var << " = " << variables[var] << endl;}// 处理普通表达式else {string expr = replace_variables(trimmed);double result = evaluate(expr);cout << result << endl;}} catch (const exception& e) {cerr << "Error: " << e.what() << endl;}
}int main() {cout << "Simple C++ Script Interpreter (type 'exit' to quit)" << endl;string line;while (true) {cout << "> ";getline(cin, line);if (line == "exit") break;process_line(line);}return 0;
}
step3:运行
C:\Users\wangrusheng\CLionProjects\untitled28\cmake-build-debug\untitled28.exe
Simple C++ Script Interpreter (type 'exit' to quit)
>a=5*3a = 15
>b=a*2b = 30
>c=5/0>Error: Division by zero
a=9a = 9
>88
>3/4*((2-(5/6))/(7/12)+(1/3)*(9/5)-(2/15))1.85
>-2*2*((3/(-4)+0.5))-(((-5)*2-3)/7)2.85714
>1/(1+(1/(2+(1/(3+(1/4))))))0.697674
>2.5*((6-(3/2))*(6-(3/2)))/1.25-(5*5-(4*3))/(2*-1)47
>
手动分割线:
step101:C:\Users\wangrusheng\CLionProjects\untitled28\main.cpp
#include <iostream>
#include <string>
#include <map>
#include <regex>
#include <cctype>
#include <vector>
#include <algorithm>
#include <sstream>
#include <stdexcept>
#include <fstream> // 新增文件流支持using namespace std;map<string, double> variables;// 辅助函数:跳过空白字符
void skip_whitespace(const string& expr, size_t& pos) {while (pos < expr.size() && isspace(expr[pos])) pos++;
}// 表达式解析函数声明
double eval_expression(const string& expr, size_t& pos);
double eval_term(const string& expr, size_t& pos);
double eval_factor(const string& expr, size_t& pos);
double eval_primary(const string& expr, size_t& pos);// 主解析函数
double evaluate(const string& expr) {size_t pos = 0;double result = eval_expression(expr, pos);skip_whitespace(expr, pos);if (pos != expr.size()) {throw runtime_error("Unexpected characters in expression");}return result;
}// 表达式解析实现
double eval_expression(const string& expr, size_t& pos) {return eval_term(expr, pos);
}double eval_term(const string& expr, size_t& pos) {double left = eval_factor(expr, pos);skip_whitespace(expr, pos);while (pos < expr.size()) {char op = expr[pos];if (op != '+' && op != '-') break;pos++;double right = eval_factor(expr, pos);if (op == '+') left += right;else left -= right;skip_whitespace(expr, pos);}return left;
}double eval_factor(const string& expr, size_t& pos) {double left = eval_primary(expr, pos);skip_whitespace(expr, pos);while (pos < expr.size()) {char op = expr[pos];if (op != '*' && op != '/') break;pos++;double right = eval_primary(expr, pos);if (op == '*') left *= right;else {if (right == 0) throw runtime_error("Division by zero");left /= right;}skip_whitespace(expr, pos);}return left;
}double eval_primary(const string& expr, size_t& pos) {skip_whitespace(expr, pos);if (pos >= expr.size()) {throw runtime_error("Unexpected end of expression");}if (expr[pos] == '(') {pos++;double value = eval_expression(expr, pos);skip_whitespace(expr, pos);if (pos >= expr.size() || expr[pos] != ')') {throw runtime_error("Missing closing parenthesis");}pos++;return value;}if (expr[pos] == '+' || expr[pos] == '-') {bool negative = (expr[pos] == '-');pos++;double value = eval_primary(expr, pos);return negative ? -value : value;}if (isdigit(expr[pos]) || expr[pos] == '.') {size_t start = pos;bool has_decimal = false;while (pos < expr.size() && (isdigit(expr[pos]) || expr[pos] == '.')) {if (expr[pos] == '.') {if (has_decimal) throw runtime_error("Invalid number format");has_decimal = true;}pos++;}return stod(expr.substr(start, pos - start));}throw runtime_error("Unexpected character: " + string(1, expr[pos]));
}// 变量替换函数
string replace_variables(const string& expr) {regex var_re(R"(\b([a-zA-Z_]\w*)\b)");smatch match;string result;size_t last = 0;auto begin = expr.cbegin();while (regex_search(begin, expr.cend(), match, var_re)) {result += string(begin, begin + match.position());string var = match[1];if (!variables.count(var)) {throw runtime_error("Undefined variable: " + var);}result += to_string(variables[var]);begin += match.position() + match.length();last = begin - expr.begin();}result += expr.substr(last);return result;
}// 处理单行输入
void process_line(const string& line) {try {string trimmed = line;trimmed.erase(remove_if(trimmed.begin(), trimmed.end(), ::isspace), trimmed.end());if (trimmed.empty()) return;// 处理赋值语句smatch match;regex assign_re(R"(^([a-zA-Z_]\w*)=(.*)$)");if (regex_match(trimmed, match, assign_re)) {string var = match[1];string expr = replace_variables(match[2]);variables[var] = evaluate(expr);cout << var << " = " << variables[var] << endl;}// 处理普通表达式else {string expr = replace_variables(trimmed);double result = evaluate(expr);cout << result << endl;}} catch (const exception& e) {cerr << "Error: " << e.what() << endl;}
}int main() {// 设置默认文件路径(使用原始字符串避免转义)const string filepath = R"(C:\Users\wangrusheng\CLionProjects\untitled28\cmake-build-debug\input.txt)";// 打开输入文件ifstream input_file(filepath);if (!input_file.is_open()) {cerr << "Error: Could not open input file at:\n" << filepath << endl;return 1;}// 逐行读取并处理string line;while (getline(input_file, line)) {process_line(line);}input_file.close();return 0;
}
step102:C:\Users\wangrusheng\CLionProjects\untitled28\cmake-build-debug\input.txt
3/4*((2-(5/6))/(7/12)+(1/3)*(9/5)-(2/15))
-2*2*((3/(-4)+0.5))-(((-5)*2-3)/7)
1/(1+(1/(2+(1/(3+(1/4))))))2.5*((6-(3/2))*(6-(3/2)))/1.25-(5*5-(4*3))/(2*-1)
step103:运行
C:\Users\wangrusheng\CLionProjects\untitled28\cmake-build-debug\untitled28.exe
1.85
2.85714
0.697674
47Process finished with exit code 0
手动分割线
用python实现
step201:
import reclass Evaluator:def __init__(self):self.variables = {}def skip_whitespace(self, expr, pos):while pos[0] < len(expr) and expr[pos[0]].isspace():pos[0] += 1def eval_expression(self, expr, pos):return self.eval_term(expr, pos)def eval_term(self, expr, pos):left = self.eval_factor(expr, pos)self.skip_whitespace(expr, pos)while pos[0] < len(expr):op = expr[pos[0]]if op not in '+-':breakpos[0] += 1right = self.eval_factor(expr, pos)if op == '+':left += rightelse:left -= rightself.skip_whitespace(expr, pos)return leftdef eval_factor(self, expr, pos):left = self.eval_primary(expr, pos)self.skip_whitespace(expr, pos)while pos[0] < len(expr):op = expr[pos[0]]if op not in '*/':breakpos[0] += 1right = self.eval_primary(expr, pos)if op == '*':left *= rightelse:if right == 0:raise RuntimeError("Division by zero")left /= rightself.skip_whitespace(expr, pos)return leftdef eval_primary(self, expr, pos):self.skip_whitespace(expr, pos)if pos[0] >= len(expr):raise RuntimeError("Unexpected end of expression")if expr[pos[0]] == '(':pos[0] += 1value = self.eval_expression(expr, pos)self.skip_whitespace(expr, pos)if pos[0] >= len(expr) or expr[pos[0]] != ')':raise RuntimeError("Missing closing parenthesis")pos[0] += 1return valueif expr[pos[0]] in '+-':sign = -1 if expr[pos[0]] == '-' else 1pos[0] += 1primary = self.eval_primary(expr, pos)return sign * primaryif expr[pos[0]].isdigit() or expr[pos[0]] == '.':start = pos[0]has_decimal = Falsewhile pos[0] < len(expr) and (expr[pos[0]].isdigit() or expr[pos[0]] == '.'):if expr[pos[0]] == '.':if has_decimal:raise RuntimeError("Invalid number format")has_decimal = Truepos[0] += 1num_str = expr[start:pos[0]]try:return float(num_str)except ValueError:raise RuntimeError(f"Invalid number: {num_str}")raise RuntimeError(f"Unexpected character: {expr[pos[0]]} at position {pos[0]}")def replace_variables(self, expr):def replacer(match):var_name = match.group(1)if var_name not in self.variables:raise RuntimeError(f"Undefined variable: {var_name}")return str(self.variables[var_name])try:replaced_expr = re.sub(r'\b([a-zA-Z_]\w*)\b', replacer, expr)except RuntimeError as e:raise ereturn replaced_exprdef process_line(self, line):stripped = line.replace(' ', '')if not stripped:returntry:match = re.fullmatch(r'^([a-zA-Z_]\w*)=(.*)$', stripped)if match:var = match.group(1)expr = match.group(2)replaced_expr = self.replace_variables(expr)pos = [0]value = self.eval_expression(replaced_expr, pos)if pos[0] != len(replaced_expr):raise RuntimeError(f"Unexpected characters in expression: {replaced_expr[pos[0]:]}")self.variables[var] = valueprint(f"{var} = {value}")else:replaced_expr = self.replace_variables(stripped)pos = [0]value = self.eval_expression(replaced_expr, pos)if pos[0] != len(replaced_expr):raise RuntimeError(f"Unexpected characters in expression: {replaced_expr[pos[0]:]}")print(value)except Exception as e:print(f"Error: {e}")def main():evaluator = Evaluator()filepath = r'C:\Users\wangrusheng\CLionProjects\untitled28\cmake-build-debug\input.txt'try:with open(filepath, 'r') as f:for line in f:evaluator.process_line(line.strip())except IOError as e:print(f"Error opening file: {e}")if __name__ == '__main__':main()
step202:运行
(.venv) PS C:\Users\wangrusheng\PycharmProjects\FastAPIProject1> python hello.py
1.8499999999999996
2.857142857142857
0.6976744186046512
47.0
a = 5.0
b = -7.0
c = -2.0
(.venv) PS C:\Users\wangrusheng\PycharmProjects\FastAPIProject1>
end
相关文章:
c#和c++脚本解释器科学运算
说明: 我希望用c#和c写一个脚本解释器,用于科学运算 效果图: step1: c# C:\Users\wangrusheng\RiderProjects\WinFormsApp3\WinFormsApp3\Form1.cs using System; using System.Collections.Generic; using System.Data; using System.Tex…...
2025年嵌入式大厂春招高频面试真题及解析
以下是 2025 年嵌入式大厂春招高频面试真题及解析,结合真题分类和核心知识点整理: 一、C/C++编程基础 1.1 指针与内存 野指针的成因及避免方法(未初始化、释放后未置空) malloc与calloc的区别(后者自动初始化为0) 指针与数组的区别(内存分配方…...
【C++】nlohmann::json 配置加载技术实践:从基础到高级应用
一、nlohmann::json 库概况与核心特性 nlohmann::json 是 C 社区最受欢迎的 JSON 库之一,其设计理念简洁即美,通过单头文件实现完整的 JSON 解析、序列化和操作功能。 1.1 基本特性 nlohmann::json是一个现代C编写的开源JSON库,采用MIT协议…...
ngx_regex_init
定义在 src\core\ngx_regex.c void ngx_regex_init(void) { #if !(NGX_PCRE2)pcre_malloc ngx_regex_malloc;pcre_free ngx_regex_free; #endif } NGX_PCRE21 #if !(NGX_PCRE2) 就为假 条件不成立 ngx_regex_init 函数就成了空实现 NGX_PCRE2 被定义,则表示 Ngin…...
【前端扫盲】postman介绍及使用
Postman 是一款专为 API 开发与测试设计的 全流程协作工具,程序员可通过它高效完成接口调试、自动化测试、文档管理等工作。以下是针对程序员的核心功能介绍和应用场景说明: 一、核心功能亮点 接口请求构建与调试 支持所有 HTTP 方法(GET/POS…...
Lua中os模块函数使用详解
目录 os.clock()os.date([format [, time]])os.difftime(t2, t1)os.execute(command)os.exit([code [, close]])os.getenv(varname)os.remove(filename)os.rename(oldname, newname)os.setlocale(locale [, category])os.time([table])os.tmpname()总结 以下是 Lua 中 os 模块的…...
量子计算与经典计算的拉锯战:一场关于计算未来的辩论
在计算科学领域,一场关于未来的激烈辩论正在上演。2025年3月,D-Wave量子公司的研究人员在《Science》杂志上发表了一项突破性成果,声称他们的量子退火处理器在几分钟内解决了一个经典超级计算机需要数百万年才能完成的复杂现实问题。这一声明…...
MySQL 基础入门
写在前面 关于MySQL的下载安装和其图形化软件Navicat的下载安装,网上已经有了很多的教程,这里就不再赘述了,本文主要是介绍了关于MySQL数据库的基础知识。 MySQL数据库 MySQL数据库基础 MySQL数据库概念 MySQL 数据库: 是一个关系型数据库管理系统 。 支持SQL语…...
GPT模型搭建
GPT模型搭建 1. 章节介绍 本章节聚焦于从0搭建GPT模型,通过事先准备的基础代码,引导学习者逐步构建模型。旨在让程序员、软件架构师和工程师等掌握GPT模型搭建的核心流程,理解其关键组件与技术细节,为实际应用和面试做好准备。 …...
BUUCTF-web刷题篇(8)
17.EasyCalcS 查看源码,发现有段代码有php文件,即calc.php 经过代码审计之后应该要访问calc.php文件,打开后: <?php error_reporting(0); if(!isset($_GET[num])){show_source(__FILE__); }else{$str $_GET[num];$blackli…...
AI SEO内容优化指南:如何打造AI平台青睐的高质量内容
AI SEO内容优化指南:如何打造AI平台青睐的高质量内容 在生成式AI平台(如DeepSeek、Kimi、豆包、腾讯元宝等)主导的搜索新时代,内容优化已成为企业抢占流量入口的核心策略。本文将从内容创作、分发到效果维护全链路,解…...
无需预对齐即可消除批次效应,东京大学团队开发深度学习框架STAIG,揭示肿瘤微环境中的详细基因信息
生物组织是由多种类型细胞构成的复杂网络,这些细胞通过特定的空间配置执行重要功能。近年来,10x Visium、Slide-seq、Stereo-seq 和 STARmap 等空间转录组学 (ST) 技术的进步,使得生物学家们能够在空间结构内绘制基因数据,从而各类…...
B2B2C多用户商城系统:打造新零售电商生态的创新解决方案
在当今数字化时代,电商行业正以前所未有的速度蓬勃发展,而新零售作为电商与传统零售的深度融合,正逐渐成为市场的新宠。为了满足这一变革带来的多元化需求,B2B2C多用户商城系统应运而生,为商家和消费者搭建了一个高效、…...
走向多模态AI之路(二):多模态 AI 如何工作?
目录 前言一、跨模态对齐(Cross-modal Alignment):AI 如何理解不同模态的关系二、多模态融合(Multimodal Fusion):AI 如何整合不同模态的信息三、多模态生成(Multimodal Generation)…...
MCP 实战:实现server端,并在cline调用
本文动手实现一个简单的MCP服务端的编写,并通过MCP Server 实现成绩查询的调用。 一、配置环境 安装mcp和uv, mcp要求python版本 Python >3.10; pip install mcppip install uv 二、编写并启用服务端 # get_score.py from mcp.server.fastmcp import…...
C#游戏开发【第18天】 | 深入理解队列(Queue)与栈(Stack):从基础到任务队列实战
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
2.5路径问题专题:LeetCode 64. 最小路径和
动态规划解决最小路径和问题 1. 题目链接 LeetCode 64. 最小路径和 2. 题目描述 给定一个包含非负整数的 m x n 网格 grid,从网格的左上角出发,每次只能向右或向下移动一步,最终到达右下角。要求找到一条路径,使得路径上的数字…...
办公设备管理系统(springboot+ssm+jsp+maven)
基于springboot的办公设备管理系统(springbootssmjspmaven) 系统功能主要有: 欢迎页账号管理 管理员账号管理系统账号添加密码修改 普通管理员管理 用户管理用户添加用户查询 资产类型管理资产信息管理资产档案管理资产报表...
蓝桥杯2024JavaB组的一道真题的解析
文章目录 1.问题描述2.问题描述3.思路分析4.代码分析 1.问题描述 这个是我很久之前写的一个题目,当时研究了这个题目好久,发布了一篇题解,后来很多人点赞,我都没有意识到这个问题的严重性,我甚至都在怀疑自己…...
数据库--SQL
SQL:Structured Query Language,结构化查询语言 SQL是用于管理关系型数据库并对其中的数据进行一系列操作(包括数据插入、查询、修改删除)的一种语言 分类:数据定义语言DDL、数据操纵语言DML、数据控制语言DCL、事务处…...
SQL Server:Log Shipping 说明
目录标题 SQL Server Log Shipping与Oracle归档日志备份对比分析一、SQL Server Log Shipping的日志截断机制二、Oracle归档日志备份对比三、关键配置对比表四、最佳实践建议 如何修改和查看SQL Server默认备份配置防止自动删除?一、查看现有备份配置二、修改备份配…...
Zephyr实时操作系统初步介绍
一、概述 Zephyr是由Linux基金会托管的开源实时操作系统(RTOS),专为资源受限的物联网设备设计。其核心特性包括模块化架构、跨平台兼容性、安全性优先以及丰富的连接协议支持。基于Apache 2.0协议,Zephyr允许商业和非商业用途的自…...
【大模型系列篇】大模型基建工程:基于 FastAPI 自动构建 SSE MCP 服务器 —— 进阶篇
🔥🔥🔥 上期 《大模型基建工程:基于 FastAPI 自动构建 SSE MCP 服务器》中我们使用fastapi-mcp自动挂载fastapi到mcp工具,通过源码分析和实践,我们发现每次sse请求又转到了内部fastapi RESTful api接口&…...
深度学习deeplearn3
# Jupyter Notebook魔法命令,用于在Notebook中内联显示图表 %matplotlib inline# 导入NumPy库,用于高效的数值计算 import numpy as np# 从matplotlib_inline库导入backend_inline模块,用于设置图表显示格式 from matplotlib_inline import b…...
(九)图形管线
一图说明问题 顶点数据->顶点着色器->细分着色器->几何着色器->光栅化->片元着色器->颜色混合 创建图形管线函数放在后面位置 void MyApplication::initVulkan() { createInstance(); createSurface(); pickPhysicalDevice(); createLogicalDevice(); cre…...
7-3 逆序的三位数
程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。 输入格式: 每个测试是一个3位的正整数。 输出格式: 输出按位逆序…...
git从历史版本创建新分支或标签
git从某个历史版本创建标签 # 查看历史版本 git log git tag tag-v1.0 780e2a7fc714faf388ba71git从某个分支的指定历史版本中创建新分支 # 查看历史版本 git log # 从历史分支创建标签 git checkout -b new-branch 780e2a7fc714faf388ba71...
HTML 音频(Audio)学习笔记
一、HTML 音频概述 在 HTML 中,音频可以通过多种方式播放,但要确保音频在不同浏览器和设备上都能正常播放,需要掌握一些技巧。HTML5 引入了 <audio> 元素,为音频播放提供了一种标准方法,但在 HTML4 中ÿ…...
五种音频器件综合对比——《器件手册--音频器件》
目录 音频器件 简述 1. 扬声器(Speakers) 2. 麦克风(Microphones) 3. 放大器(Amplifiers) 4. 音频接口(Audio Interfaces) 5. 音频处理器(Audio Processors)…...
数据结构复习(单调栈,单调队列,KMP,manacher,tire,字符串哈希)
单调栈: 介绍: 单调栈用于解决"寻找每个元素左侧/右侧第一个比它小/大的元素"类问题。栈中元素保持单调性,时间复杂度O(n)。 维护一个严格递增栈。对于每个元素a[i],不断弹出栈顶比a[i]大的元素,剩下的栈顶即…...
(学习总结32)Linux 基础 IO
Linux 基础 IO 一、什么是 " 文件 "二、C 文件接口打开文件写文件读文件其它介绍 三、系统文件 I/O传递标志位系统接口写文件系统接口读文件部分系统调用接口介绍打开文件函数 open关闭文件函数 close写入文件函数 write读取文件函数 read 文件描述符 fdfd 0 & 1…...
操作系统(一):概念及主流系统全分析
目录 一.操作系统是什么 二.操作系统的分类 2.1 按应用场景分类 2.2 按实时性分类 2.3 按内核架构分类 2.4 按用户与任务分类 三.主流操作系统比较 四.未来趋势 一.操作系统是什么 操作系统(Operating System, OS)是计算机系统的核心软件&#x…...
三、GPIO
一、GPIO简介 GPIO(General Purpose Input Output)通用输入输出口GPIO引脚电平:0V(低电平)~3.3V(高电平),部分引脚可容忍5V 容忍5V,即部分引脚输入5V的电压,…...
Ceph异地数据同步之-RBD异地同步复制(上)
#作者:闫乾苓 文章目录 前言基于快照的模式(Snapshot-based Mode)工作原理单向同步配置步骤单向同步复制测试双向同步配置步骤双向同步复制测试 前言 Ceph的RBD(RADOS Block Device)支持在两个Ceph集群之间进行异步镜…...
fastapi完全离线环境(无外网)的访问Swagger所做特殊处理
在互联网环境中,只要 启动FastAPI 服务运行在本地机器上,访问 http://localhost:8000/docs(Swagger UI)就可以访问到Swagger界面,但是在完全离线环境(无外网)下如何访问Swagger页面呢࿱…...
在网络中加入预训练的多层感知机(MLP)有什么作用?
在网络中加入预训练的多层感知机(MLP)通常是为了引入先验知识、提升特征表示能力或dropout,具体作用取决于MLP的设计和预训练任务。以下是常见的应用场景和优势: 1. 特征融合与迁移学习:预训练的MLP可以作为特征提取器࿰…...
3.2/Q2,GBD数据库最新文章解读
文章题目:Temporal trends in the burden of vertebral fractures caused by falls in China and globally from 1990 to 2021: a systematic analysis of the Global Burden of Disease Study 2021 DOI:10.1186/s13690-025-01500-y 中文标题:…...
机器学习的一百个概念(9)学习曲线
前言 本文隶属于专栏《机器学习的一百个概念》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…...
浅谈Tomcat数据源连接池
目录 为什么需要JDBC连接池 Tomcat JDBC Pool 相关参数 1. 基本配置 2. 连接池大小控制 3. 连接验证与测试 4. 空闲连接回收 5. 连接泄漏与超时 Tomcat JDBC Pool 源码分析(tomcat 8.5.3) DataSourceFactory DataSource ConnectionPool Pool…...
Techub 财报解读:Circle 冲刺 IPO,但收入增长难掩利润困局
作者:Techub 财报解读 撰文:Yangz,Techub News 4 月 1 日,Circle 向美国证券交易委员会(SEC)提交 S-1 文件,计划进行首次公开募股(IPO),股票代码为 CRCL&…...
C++中的链表操作
在C中,链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。C标准库(STL)中提供了std::list和std::forward_list两种链表实现,分别对应双向链表和单向链表。此外&am…...
Vue2 生命周期
文章目录 前言🔄 Vue2 生命周期流程(8个核心钩子)📝 代码中典型用法示例一、您的描述验证二、完整生命周期代码示例三、关键阶段行为说明🔍 常见问题 前言 提示:以下是本篇文章正文内容,下面案…...
2007-2022年 上市公司政府补助数据 -社科数据
上市公司政府补助数据(2007-2022年)-社科数据https://download.csdn.net/download/paofuluolijiang/90028547 https://download.csdn.net/download/paofuluolijiang/90028547 政府补助是指政府为支持企业发展,提供的资金或资源支持。对于上市…...
设计心得——状态机
一、状态机 在设计一些与硬件交互或者游戏等开发中,经常会听到状态机(State Machines)这个字眼,而在设计模式(GoF)中,又经常听到状态模式这个概念,它们之间有什么联系和不同呢&…...
python match case语法
学习路线:B站 普通的if判断 def if_traffic_light(color):if color red:return Stopelif color yellow:return Slow downelif color green:return Goelse:return Invalid colorprint(if_traffic_light(red)) # Output: Stop print(if_traffic_light(yellow)) …...
Lua中协程相关函数使用详解
目录 1. coroutine.create(f)2. coroutine.resume(co [, val1, ...])3. coroutine.yield([val1, ...])4. coroutine.status(co)5. coroutine.wrap(f)6. coroutine.running()7. coroutine.isyieldable()协程状态转换示例总结 Lua 中的协程(coroutine)提供…...
代码拟有感
最近的日子像被按了0.5倍速播放键。腱鞘炎让手腕转动时发出咯吱声,尾骨的钝痛让久坐变成酷刑,落枕的脖子和酸胀的手臂组成了“疼痛交响乐”——这些隐秘的、持续的身体抗议,让原本枯燥的代码练习变成了一场生理与意志的拉锯战。 我盯着屏幕苦…...
《实战AI智能体》MCP对Agent有哪些好处
首先MCP为Agent提供了标准化的方式来接入各种工具和数据源,无论是本地运行的工具,例如通过stdio服务器,还是远程托管的服务HTTP over SSE服务, Agent都可以通过统一的接口与它们进行交互,极大扩展了第三方工具库。 例如,在金融领域,Agent 可以接入股票分析的MCP工具。当…...
maptalks获取所有图层并把图层按照zIndex排序
maptalks获取所有图层并把图层按照zIndex排序 获取所有图层 通过调用 map.getLayers() 可以返回当前地图上所有的图层集合。此方法会返回一个数组形式的结果,其中包含了地图上的每一个图层层级对象。 图层属性中的 ZINDEX 每种图层类型(如矢量图层、…...
GUI-Guider 按钮按下 选项卡 右移动一个,到最右边停下
extern lv_ui guider_ui; // 在文件顶部添加// 在按钮事件中使用: lv_obj_t * tabview guider_ui.screen_tabview_1; // 替换为你的实际 TabView 名称 uint16_t current lv_tabview_get_tab_act(tabview); lv_tabview_set_act(tabview, current 1, LV_ANIM_ON); …...