【C语言】C语言 文具店商品库存管理系统(源码+数据文件)【独一无二】
👉博__主👈:米码收割机
👉技__能👈:C++/Python语言
👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。
系列文章目录
目录
- 系列文章目录
- 一、设计要求
- 1. 项目名称
- 2. 项目简介
- 1. 系统功能要求
- 二、设计思路
- 1. 总体设计思路
- 2. 数据结构设计
- 3. 模块说明与代码分析
- 3.1 数据合法性校验
- 3.2 数据文件操作模块
- 3.2.1 从文件加载数据
- 3.2.2 保存数据到文件
- 3.3 商品操作模块
- 3.3.1 批量录入初始商品信息
- 3.3.2 浏览全部商品信息
- 3.3.3 查询商品信息
- 3.3.4 添加新商品
- 3.3.5 删除商品信息
- 3.3.6 修改商品信息
- 3.3.7 按类别统计商品数量
- 3.3.8 按单价排序商品
- 3.3.9 计算库存总价值
- 3.4 主菜单及主函数
- 3.4.1 菜单函数
- 3.4.2 主函数
- 三、结果
一、设计要求
1. 项目名称
文具店商品库存管理系统
2. 项目简介
设计并开发一款商品库存管理系统,用于高效管理文具店的商品库存。该系统支持商品的入库、出库操作,并提供库存查询功能,帮助文具零售店优化库存管理、提高运营效率。
文具商品的基本信息包括:
- 商品编号
- 商品名称
- 数据类型:字符数组
- 示例:签字笔、水彩笔、田格本、日记本等(可自行设计)
- 类别
- 包括:笔、本、颜料、其他
- 品牌
- 示例:晨光、得力等(可自行设计)
- 商品单价
- 数据类型:浮点型
- 商品库存
- 数据类型:int
1. 系统功能要求
系统主要功能模块示意见“图1”以及“图2”(图示仅供参考),具体功能如下:
-
批量录入初始商品信息
- 提示用户批量录入初始商品信息,要求录入的商品数量不少于 5 条。
- 商品信息可以通过读取指定文本文件(例如:test.txt,格式参见图3)实现录入。
- 在录入过程中,对商品编号进行查重,同一编号的商品不能重复出现。
- 对于重复数据,应跳过录入并反馈提示信息,如“商品序号 xxx 已存在,跳过此商品”。
- 确保录入后的商品数据完整、有效,并保存于系统中以备后续操作。
-
浏览全部商品信息
- 在屏幕上显示仓库中所有商品的全部信息,要求数据对齐、格式美观。
- 如果当前仓库中没有商品,则显示提示“当前仓库无商品”。
- 显示格式参考图5。
-
查询商品信息
- 用户可根据以下条件查询商品信息:
- 商品编号
- 商品名称
- 品牌
- 类别
- 用户选择查询条件后,系统根据输入内容匹配相应商品信息,并以整齐、格式化的方式显示查询结果(参见图6)。
- 若未找到符合条件的商品,系统应提示“未找到符合条件的商品信息”。
- 用户可根据以下条件查询商品信息:
-
增加商品信息
- 提示用户按照规定的格式输入一条新增的商品信息(参考图7)。
- 系统需对新增商品的商品编号进行查重,若编号已存在,则提示“编号已存在,请重新输入”,直至输入有效。
- 新增的信息必须保证格式正确且数据完整。
-
删除商品信息
- 提示用户输入要删除的商品编号或商品名称。
- 系统显示该商品的全部信息(参照图8),并询问用户是否确认删除。
- 若存在同名商品,系统应提示“找到多条同名商品,将同时删除”,并在用户确认后进行删除操作。
-
修改商品信息
- 提示用户输入需要修改的商品编号,系统根据该编号显示商品的全部信息(参见图9)。
- 系统随后询问用户需要修改哪一项信息(除商品编号外的所有数据项均可修改)。
- 修改完成后,系统应提示“修改成功”。
-
按类别统计商品数量
- 提示用户输入需要统计的商品类别,系统统计该类别商品的数量,并以清晰格式显示结果(参考图10)。
- 若输入类别不存在,则提示“未找到该类别的商品信息”。
-
按单价对商品排序
- 系统根据商品单价对商品进行排序:
- 默认按单价升序显示,同一单价的商品按商品编号升序排序。
- 用户可选择按单价降序排序,同一单价的商品仍按商品编号升序排列。
- 查询结果应以整齐格式展示(参考图11)。
- 系统根据商品单价对商品进行排序:
-
计算当前库存商品的总价值
- 系统计算当前仓库中所有商品的总价值:
- 对每个商品,计算公式为:商品单价 × 库存数量
- 总价值为所有商品个别计算值的累加结果
- 计算结果应清晰显示(参考图12)。
- 若仓库中无商品,系统提示“当前仓库无商品,无法计算总价值”。
- 系统计算当前仓库中所有商品的总价值:
-
退出系统
- 在退出前提示用户是否退出系统,经确认后退出。

二、设计思路
1. 总体设计思路
该系统主要目的是管理文具店的商品库存,通过文件实现数据持久化。系统支持以下主要操作:
-
数据文件操作
程序启动时从文件中加载商品数据,退出时保存所有数据到文件。 -
数据合法性校验
每条商品记录在录入时需进行合法性检查,确保输入数据完整且符合要求。 -
基础数据操作
支持批量录入初始商品、浏览全部商品、查询、添加、删除、修改商品信息。 -
统计与排序功能
根据商品类别统计数量、按照单价排序展示商品、计算库存总价值。 -
菜单式操作
采用文本菜单驱动系统,用户根据提示输入指令,实现对各种操作模块调用。
整个系统基于结构体数组实现数据存储,每个功能模块独立成函数,主函数中先加载数据再进入菜单循环操作,最后退出前保存数据。

2. 数据结构设计
系统使用如下结构体存储商品信息:
#define NAME_LEN 50
#define BRAND_LEN 20
#define CATEGORY_LEN 20typedef struct {int id; // 商品编号char name[NAME_LEN]; // 商品名称char category[CATEGORY_LEN]; // 类别char brand[BRAND_LEN]; // 品牌float price; // 单价int quantity; // 库存数量
} Product;
说明:
- 每个商品由编号、名称、类别、品牌、单价和库存数量构成。
- 全局数组
products[MAX_PRODUCTS]用于存储所有商品记录,整型变量productCount表示当前商品数量。
3. 模块说明与代码分析
3.1 数据合法性校验
为了保证录入的数据是符合要求的,定义了函数 validateProduct()。
// 数据合法性校验函数,判断一个商品记录是否有效
int validateProduct(Product p) {if (p.id <= 0 || strlen(p.name) == 0 || strlen(p.category) == 0 ||strlen(p.brand) == 0 || p.price <= 0 || p.quantity < 0) {return 0; // 不合法}return 1; // 合法
}
思路:
- 检查商品编号是否大于零;
- 检查名称、类别、品牌字符串不为空;
- 保证商品单价大于零、库存数量不为负。
3.2 数据文件操作模块
为确保数据的持久化,提供了加载和保存文件的两个函数。
3.2.1 从文件加载数据
void loadProductsFromFile() {FILE *file = fopen("test.txt", "r");if (file == NULL) {printf("未找到数据文件,已创建新文件。\n");return;}char line[256];while (fgets(line, sizeof(line), file)) {Product newProduct;int fieldsRead = sscanf(line, "%d %s %s %s %f %d", &newProduct.id, newProduct.name,newProduct.category, newProduct.brand, &newProduct.price, &newProduct.quantity);// 检查数据完整性if (fieldsRead != 6 || !validateProduct(newProduct)) {printf("跳过格式错误或无效的数据行:%s", line);continue;}// 检查商品编号是否重复int duplicate = 0;for (int i = 0; i < productCount; i++) {if (products[i].id == newProduct.id) {printf("商品编号 %d 重复,跳过此行:%s", newProduct.id, line);duplicate = 1;break;}}if (!duplicate) {products[productCount++] = newProduct;}}fclose(file);printf("数据加载完成,共加载 %d 条商品记录。\n", productCount);
}
说明:
- 采用
fgets()逐行读取数据文件; - 使用
sscanf()分析每行中各个字段的值; - 对数据完整性与合法性进行验证;
- 对重复的商品编号进行检查,跳过重复数据。
3.2.2 保存数据到文件
void saveProductsToFile() {FILE *file = fopen("test.txt", "w");if (file == NULL) {printf("无法保存数据。\n");return;}for (int i = 0; i < productCount; i++) {fprintf(file, "%d %s %s %s %.2f %d\n", products[i].id, products[i].name, products[i].category,products[i].brand, products[i].price, products[i].quantity);}fclose(file);printf("数据保存成功!\n");
}
说明:
- 文件以写模式打开,遍历所有商品记录,用格式化输出写入文件。
3.3 商品操作模块

3.3.1 批量录入初始商品信息
void addInitialProducts() {int count;printf("请输入要录入的商品数量(不少于5):");scanf("%d", &count);if (count < 5) {printf("录入数量不足5条。\n");return;}// 此处略 10行代码 .....int duplicate = 0;for (int j = 0; j < productCount; j++) {if (products[j].id == newProduct.id) {printf("商品编号 %d 已存在,跳过此商品。\n", newProduct.id);duplicate = 1;break;}}if (!duplicate) {products[productCount++] = newProduct;}}
}
说明:
- 要求用户录入不少于 5 条商品信息;
- 逐条录入时先读取各项数据,再进行数据合法性和查重处理;
- 如果数据不合法或编号重复,则循环重新输入。
3.3.2 浏览全部商品信息
void displayAllProducts() {if (productCount == 0) {printf("当前仓库无商品。\n");return;}printf("编号\t名称\t类别\t品牌\t单价\t库存\n");for (int i = 0; i < productCount; i++) {printf("%d\t%s\t%s\t%s\t%.2f\t%d\n", products[i].id, products[i].name,products[i].category, products[i].brand, products[i].price, products[i].quantity);}
}
说明:
- 如果当前商品数量为 0,则提示“当前仓库无商品”;
- 否则以表格形式输出所有商品信息。
3.3.3 查询商品信息
void queryProduct() {int option;printf("请选择查询条件:1.编号 2.名称 3.品牌 4.类别\n");scanf("%d", &option);char queryStr[NAME_LEN];int queryId;int found = 0;// 此处略 10行代码 .....}if (!found) {printf("未找到符合条件的商品信息。\n");}
}
说明:
- 用户可以根据编号、名称、品牌或类别进行查询;
- 根据用户选择,程序分别比较对应字段;
- 如果没有找到任何匹配记录,则提示“未找到符合条件的商品信息”。
3.3.4 添加新商品
void addProduct() {Product newProduct;while (1) {printf("请输入新增商品信息(编号 名称 类别 品牌 单价 库存):\n");scanf("%d %s %s %s %f %d", &newProduct.id, newProduct.name, newProduct.category,newProduct.brand, &newProduct.price, &newProduct.quantity);// 查重// 此处略 10行代码 .....printf("商品添加成功!\n");
}
说明:
- 循环读取输入直到用户输入的商品编号不重复;
- 将新商品直接存入数组中,并更新商品数量。
3.3.5 删除商品信息

void deleteProduct() {int id;printf("请输入要删除的商品编号:");scanf("%d", &id);for (int i = 0; i < productCount; i++) {if (products[i].id == id) {printf("删除商品:编号 %d 名称 %s\n", products[i].id, products[i].name);for (int j = i; j < productCount - 1; j++) {products[j] = products[j + 1];}productCount--;printf("商品删除成功!\n");return;}}printf("未找到指定编号的商品。\n");
}
说明:
- 根据用户输入的商品编号查找对应商品;
- 找到后,将该商品从数组中删除,并后移后续记录,最后减少
productCount。
3.3.6 修改商品信息
void modifyProduct() {int id;printf("请输入要修改的商品编号:");scanf("%d", &id);for (int i = 0; i < productCount; i++) {// 此处略 10行代码 .....scanf("%d", &option);switch (option) {case 1:printf("请输入新名称:");scanf("%s", products[i].name);break;case 2:printf("请输入新类别:");scanf("%s", products[i].category);break;case 3:printf("请输入新品牌:");scanf("%s", products[i].brand);break;case 4:printf("请输入新单价:");scanf("%f", &products[i].price);break;case 5:printf("请输入新库存:");scanf("%d", &products[i].quantity);break;default:printf("无效选项。\n");}printf("商品信息修改成功!\n");return;}}printf("未找到指定编号的商品。\n");
}
说明:
- 用户输入目标商品编号,程序显示该商品所有信息;
- 用户选择要修改的项(除商品编号外的项),修改后提示“修改成功”。
3.3.7 按类别统计商品数量
void categoryStatistics() {char category[CATEGORY_LEN];printf("请输入要统计的类别:");scanf("%s", category);int count = 0;for (int i = 0; i < productCount; i++) {if (strcmp(products[i].category, category) == 0) {count++;}}if (count > 0) {printf("类别 %s 的商品数量为 %d。\n", category, count);} else {printf("未找到该类别的商品信息。\n");}
}
说明:
- 用户输入需要统计的类别,遍历数组统计该类别的商品数量,最后输出统计结果或错误提示。
3.3.8 按单价排序商品
void sortProducts() {int option;printf("请选择排序方式:1.升序 2.降序\n");scanf("%d", &option);for (int i = 0; i < productCount - 1; i++) {for (int j = 0; j < productCount - i - 1; j++) {// 此处略 10行代码 .....products[j + 1] = temp;}}}printf("排序完成,结果如下:\n");displayAllProducts();
}
说明:
- 用户选择升序或者降序排序;
- 采用冒泡排序算法,根据商品的单价进行排序;
- 排序完成后调用
displayAllProducts()显示排序结果。
3.3.9 计算库存总价值
void calculateTotalValue() {if (productCount == 0) {printf("当前仓库无商品,无法计算总价值。\n");return;}float totalValue = 0;for (int i = 0; i < productCount; i++) {totalValue += products[i].price * products[i].quantity;}printf("当前库存商品的总价值为:%.2f\n", totalValue);
}
说明:
- 遍历所有商品,将每个商品的单价与库存数量相乘,累加得到总价值;
- 如果没有商品则提示无法计算。
3.4 主菜单及主函数
3.4.1 菜单函数
void menu() {int choice;do {printf("\n************文具店商品库存管理系统************\n");printf("\n--------------------------------------------\n");printf("---------1. 批量录入初始商品信息---------\n");printf("---------2. 浏览全部商品信息---------\n");printf("---------3. 查询商品信息---------\n");printf("---------4. 增加商品信息---------\n");printf("---------5. 删除商品信息---------\n");printf("---------6. 修改商品信息---------\n");printf("---------7. 按类别统计商品数量---------\n");printf("---------8. 按单价排序商品---------\n");printf("---------9. 计算库存总价值---------\n");printf("---------10. 退出---------\n");printf("请选择功能:");scanf("%d", &choice);switch (choice) {case 1: addInitialProducts(); break;case 2: displayAllProducts(); break;case 3: queryProduct(); break;case 4: addProduct(); break;case 5: deleteProduct(); break;case 6: modifyProduct(); break;case 7: categoryStatistics(); break;case 8: sortProducts(); break;case 9: calculateTotalValue(); break;case 10: printf("系统已退出。\n"); break;default: printf("无效选择,请重新输入。\n");}} while (choice != 10);
}
说明:
- 使用 do…while 循环持续显示菜单;
- 根据用户输入的选项调用对应的操作函数;
- 当用户选择退出 (10) 时结束循环。
3.4.2 主函数
int main() {loadProductsFromFile(); // 程序启动时加载文件数据menu(); // 进入主菜单saveProductsToFile(); // 程序退出时保存数据return 0;
}
说明:
- 程序启动时先调用
loadProductsFromFile()从数据文件加载商品记录; - 进入菜单驱动的操作界面;
- 用户操作结束退出后,再调用
saveProductsToFile()将最新数据保存至文件中。
通过模块化编程方式将文具店商品库存管理系统各项功能分解为独立函数,在满足业务需求的同时实现以下目标:
- 数据输入、校验与持久化:通过文件读写与数据合法性检查确保数据可靠性;
- 商品管理与查询:提供批量录入、浏览、查询、添加、删除、修改等全方位操作;
- 数据统计与排序:支持按类别统计、按单价排序及计算库存总价值,有助于快速了解库存状况;
- 用户交互:基于简单的文本菜单实现友好的用户操作体验。

三、结果








—
相关文章:
【C语言】C语言 文具店商品库存管理系统(源码+数据文件)【独一无二】
👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 系列文章目录 目录 系列文章目录一、设计要求1. 项…...
LangChain系列: 使用工具和工具包构建代理实战教程
让我们在LangChain中构建简单代理示例,以帮助我们理解代理的基本概念和构建块。通过保持简单,我们可以更好地掌握这些代理背后的基本思想,使我们能够在未来构建更复杂的代理。 什么是代理 LangChain官方文档有非常好的章节来介绍其代理的高级…...
布隆过滤器(简单介绍)
布隆过滤器(Bloom Filter) 是一种高效的概率型数据结构,用于快速判断一个元素是否可能存在于某个集合中。它的核心特点是空间效率极高,但存在一定的误判率(可能误报存在,但不会漏报)。 核心原理…...
C++ 利器:inline 与 nullptr
探秘 C 利器:inline 与 nullptr 引言 在 C 的浩瀚海洋中,有着许多实用且强大的特性,它们如同夜空中闪烁的繁星,照亮了开发者前行的道路。今天,我们要深入探索其中两颗耀眼的星星:inline 关键字和 nullptr …...
给一个单体项目加装Feign
1.导入pom坐标 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>4.1.2</version> </dependency> 2.主函数注解 EnableFeignClients public cl…...
可以使用Deepseek R1模型的平台集锦
最近Deepseek掀起了AI浪潮,就在今天百度文心一言和ChatGPT宣布要在近期实施免费开放,日渐减少的用户。Deepseek这么火爆,其官网却一直遭受攻击,访问速度很慢。自己本地部署,又负担不起硬件费用,相比之下&am…...
“探索1688平台:高效获取店铺商品信息的实用指南“
在电商领域,获取店铺所有商品信息对于商家进行数据分析、库存管理、竞品分析等方面具有重要意义。1688平台作为中国领先的B2B电商平台,提供了丰富的API接口供开发者使用,其中就包括获取店铺所有商品信息的接口。本文将详细介绍如何使用该接口…...
在fedora41中安装钉钉dingtalk_7.6.25.4122001_amd64
在Fedora-Workstation-Live-x86_64-41-1.4中安装钉钉dingtalk_7.6.25.4122001_amd64.deb 到官网下载钉钉Linux客户端com.alibabainc.dingtalk_7.6.25.4122001_amd64.deb https://page.dingtalk.com/wow/z/dingtalk/simple/ddhomedownload#/ 一、直接使用dpkg命令安装deb包报错…...
数据结构:图论入门
图论起源于欧拉对哥尼斯堡七桥问题的解决. 他构建的图模型将陆地用点来表示, 桥梁则用线表示, 如此一来, 该问题便转化为在图中能否不重复地遍历每条边的问题. 图论的应用 地图着色 在地图着色问题中, 我们用顶点代表国家, 将相邻国家之间用边相连. 这样, 问题就转化为用最少…...
有限状态系统的抽象定义及CEGAR分析解析理论篇
文章目录 一、有限状态系统的抽象定义及相关阐述1、有限状态系统定义2、 有限状态系统间的抽象关系(Abstract)2.1 基于函数的抽象定义2.2 基于等价关系的抽象定义 二、 基于上面的定义出发,提出的思考1. 为什么我们想要/需要进行抽象2. 抽象是…...
Apache Hive用PySpark统计指定表中各字段的空值、空字符串或零值比例
from pyspark.sql import SparkSession from pyspark.sql.functions import col, coalesce, trim, when, lit, sum from pyspark.sql.types import StringType, NumericType# 初始化SparkSession spark SparkSession.builder \.appName("Hive Data Quality Analysis"…...
高校元宇宙实训室解决方案:以技术驱动教育,用数字人链接未来
在AIGC技术的浪潮下,AI数字人正成为数字营销、文化传播等领域的核心工具。为助力高校培养适应未来需求的新型人才,广州虚拟动力推出高校元宇宙实训室解决方案,通过动作捕捉设备与虚拟数字人技术,构建沉浸式教学场景,赋…...
提升编程效率,体验智能编程助手—豆包MarsCode一键Apply功能测评
提升编程效率,体验智能编程助手—豆包MarsCode一键Apply功能测评 🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 目录 引言豆包…...
【前端开发】query参数和params参数的区别
在Web开发中,query参数(URL查询参数)和params参数(路由参数)是两种不同的URL传参方式,它们的核心区别如下: 一、 位置不同 query参数params参数位置URL中?之后,用&连接多个参数…...
推荐系统召回算法
推荐系统召回算法 召回算法UserCFItemCFSwing矩阵分解 召回算法 基于协同过滤的召回算法主要是应用在推荐环节的早期阶段,大致可以分为基于用户、基于物品的。两者各有优劣,优点是具有较好的可解释性,缺点是对于稀疏的交互矩阵,效…...
Python基础(上)
1. 基础语法 1.1 环境安装 Python版本: 推荐使用Python 3.6.6及以上开发工具: PyCharm 1.2 基本语法 输出: print("Hello World") 注释: 单行注释: # 注释内容(快捷键 Ctrl/) 多行注释: 使用三引号 注释内容 注意:不推…...
【DuodooBMS】给PDF附件加“受控”水印的完整Python实现
给PDF附件加“受控”水印的完整Python实现 功能需求 在实际工作中,许多文件需要添加水印以标识其状态,例如“受控”“机密”等。对于PDF文件,添加水印不仅可以增强文件的可识别性,还可以防止未经授权的使用。本代码的功能需求是…...
【虚幻引擎UE】UE4.23到UE5.5的核心功能变化
简单总结从UE4.23到UE5.5,虚幻引擎的重大变化: 1. WebGL/HTML5 平台支持和像素流 UE4.23-UE4.25:移除官方HTML5支持,改为社区插件维护。 但通过第三方插件(如WebAssemblyWebGPU)可在浏览器运行部分项目。U…...
阿里云《AI 剧本生成与动画创作》解决方案技术评测
引言 随着人工智能技术的发展,越来越多的工具和服务被应用于内容创作领域。阿里云推出的《AI 剧本生成与动画创作》解决方案,利用函数计算 FC 构建 Web 服务,结合百炼模型服务和 ComfyUI 工具,实现了从故事剧本撰写、插图设计、声…...
commons-io 包 IOUtils、FileUtils、FilenameUtils
1. IOUtils void IOUtils.closeQuietly(Closeable... closeables) 无条件关闭流。int IOUtils.copy(InputStream inputStream, OutputStream outputStream) 将字节从InputStream复制到OutputStream,返回复制的长度,流最大不能超过2G,默认缓冲…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...

