当前位置: 首页 > news >正文

C语言之饭店外卖信息管理系统


🌟 嗨,我是LucianaiB!

🌍 总有人间一两风,填我十万八千梦。

🚀 路漫漫其修远兮,吾将上下而求索。



C语言之饭店外卖信息管理系统

目录

  1. 设计题目
  2. 设计目的
  3. 设计任务描述
  4. 设计要求
  5. 输入和输出要求
  6. 验收要求
  7. 进度安排
  8. 系统分析
  9. 总体设计
  10. 详细设计
  11. 程序实现
  12. 测试数据和运行结果
  13. 日志
  14. 总结与思考
  15. 参考文献

设计题目

饭店外卖信息管理系统


设计目的

  1. 加深学生对课程基础知识和基本理论的理解,培养学生独立分析和解决问题的能力。
  2. 培养学生在计算机软硬件开发、理论计算、查阅资料等方面的能力,树立正确的设计思想。
  3. 加强理论联系实际,培养学生科学严谨、实事求是的工作作风和创新精神。

设计任务描述

某饭店为了扩大营业范围,增加了外卖送餐业务。同城顾客可以通过移动端订餐,饭店按照顾客的订单要求及时送餐上门。外卖点餐的主要信息包括:订单号、顾客电话、姓名、地址、订餐时间、所订菜单信息、订餐总金额等。设计一个饭店外卖信息管理系统,要求完成以下功能:

  1. 菜单信息管理:录入、修改饭店菜单的相关信息(编号、菜名、单价)。
  2. 订餐业务:顾客查看菜单信息,完成订餐并付费。
    • 订单号由系统自动生成。
    • 付费金额在100200元之间,餐费打9.5折;200300元,打9折;300元以上打8.5折。
  3. 取消订餐:若饭店在规定时间内(如2小时)未能及时送餐,顾客可取消订餐。
  4. 订单查询:饭店可按订单号、订餐时间、电话等多种形式查询订单信息。
  5. 统计查询:统计显示当日菜单上所有菜的订单数;统计并显示当日外卖的营业额。

设计要求

  1. 按照分析、设计、编码、调试和测试的软件开发过程独立完成系统。
  2. 应用模块化编程思想,各项功能分别用函数实现。
  3. 系统功能设计成菜单形式,用户通过菜单选择操作。

输入和输出要求

  1. 系统界面友好、直观、易操作。
  2. 用户根据提示输入数据。
  3. 输入数据时提供清晰的提示信息。
  4. 处理完成后,清楚地显示运行结果。

验收要求

  1. 运行所设计的系统。
  2. 回答有关问题。
  3. 提交课程设计报告。
  4. 提交源程序。

进度安排

  1. 系统分析、设计准备阶段:6学时
  2. 编程调试阶段:26学时
  3. 总结和书写报告阶段:6学时
  4. 考核阶段:2学时

系统分析

饭店外卖信息管理系统旨在简化外卖订单的处理流程,提高饭店的运营效率,同时为顾客提供便捷的订餐服务。系统需要实现以下功能:

  • 菜单信息管理
  • 订餐业务
  • 取消订餐
  • 订单查询
  • 统计查询

总体设计

系统采用模块化设计,主要模块包括:

  1. 菜单信息管理模块:添加、修改和删除菜单项。
  2. 顾客信息管理模块:管理顾客的基本信息。
  3. 订单处理模块:处理顾客的订餐请求。
  4. 订单取消模块:允许顾客在规定时间内取消订单。
  5. 订单查询模块:按订单号、订餐时间、电话等查询订单。
  6. 营业统计模块:统计当日订单数量和营业额。
  7. 折扣应用模块:根据订单金额自动应用折扣。
  8. 用户界面模块:提供友好的用户界面。
  9. 数据持久化模块:将数据存储到文件系统。
  10. 安全与权限模块:实现用户权限控制。

详细设计

3.1 数据结构设计

typedef struct {int id;           // 菜品IDchar name[50];    // 菜品名称float price;      // 菜品价格
} MenuItem;typedef struct {int order_id;                     // 订单IDchar customer_phone[20];          // 顾客电话char customer_name[50];           // 顾客姓名char address[100];                // 顾客地址char order_time[20];              // 订单时间MenuItem items[MAX_MENU];         // 订单包含的菜品列表int items_count;                  // 订单中菜品的数量float total_amount;               // 订单总金额
} Order;

3.2 函数接口设计

void addMenuItem();                   // 添加菜单项
void modifyMenuItem(int id);          // 修改菜单项
void displayMenu();                   // 显示菜单
void placeOrder();                    // 下订单
void cancelOrder(int order_id);       // 取消订单
void searchOrderByID(int order_id);   // 通过订单ID搜索订单
void searchOrderByPhone(const char *phone); // 通过电话号码搜索订单
void statistics();                    // 统计信息
void applyDiscount(float *amount);    // 应用折扣
void printOrder(const Order *order);  // 打印订单详情
void clearOrder(Order *order);        // 清除订单数据

3.3 主要函数流程图

1
2
3
4
5
6
开始
显示主菜单
用户选择
添加/修改菜单项
下订单
取消订单
搜索订单
统计信息
退出系统
结束

在这里插入图片描述

程序实现

4.1 源代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_MENU 100
#define MAX_ORDER 100typedef struct {int id;char name[50];float price;
} MenuItem;typedef struct {int order_id;char customer_phone[20];char customer_name[50];char address[100];char order_time[20];MenuItem items[MAX_MENU];int items_count;float total_amount;
} Order;MenuItem menu[MAX_MENU] = {0};
Order orders[MAX_ORDER] = {0};
int menu_count = 0;
int order_count = 0;void addMenuItem() {if (menu_count >= MAX_MENU) {printf("菜单已满,无法添加更多菜品。\n");return;}printf("输入菜品ID,名称和价格: ");scanf("%d %49s %f", &menu[menu_count].id, menu[menu_count].name, &menu[menu_count].price);menu_count++;
}void displayMenu() {printf("菜单:\n");for (int i = 0; i < menu_count; i++) {printf("%d. %s - $%.2f\n", menu[i].id, menu[i].name, menu[i].price);}
}void placeOrder() {if (order_count >= MAX_ORDER) {printf("订单数量已达上限,无法下新订单。\n");return;}int item_id;float total = 0;orders[order_count].items_count = 0;displayMenu();printf("输入顾客的电话、姓名、地址和下单时间: ");scanf("%19s %49s %9
9s %19s", orders[order_count].customer_phone, orders[order_count].customer_name, orders[order_count].address, orders[order_count].order_time);while (1) {printf("输入菜品ID(0结束): ");scanf("%d", &item_id);if (item_id == 0) break;for (int i = 0; i < menu_count; i++) {if (menu[i].id == item_id) {if (orders[order_count].items_count < MAX_MENU) {orders[order_count].items[orders[order_count].items_count++] = menu[i];total += menu[i].price;} else {printf("一个订单中不能添加超过 %d 个菜品。\n", MAX_MENU);break;}}}}applyDiscount(&total);orders[order_count].total_amount = total;orders[order_count].order_id = order_count + 1;printf("订单成功创建。订单ID: %d\n", orders[order_count].order_id);order_count++;
}void applyDiscount(float *amount) {if (*amount > 300) *amount *= 0.85f;else if (*amount > 200) *amount *= 0.9f;else if (*amount > 100) *amount *= 0.95f;
}void printOrder(const Order *order) {if (order == NULL) {printf("订单为空。\n");return;}printf("订单ID: %d\n", order->order_id);printf("顾客电话: %s\n", order->customer_phone);printf("顾客姓名: %s\n", order->customer_name);printf("地址: %s\n", order->address);printf("下单时间: %s\n", order->order_time);if (order->items_count == 0) {printf("该订单没有包含任何菜品。\n");} else {printf("订单项:\n");for (int i = 0; i < order->items_count; i++) {printf(" - %s ($%.2f)\n", order->items[i].name, order->items[i].price);}}printf("总金额: $%.2f\n", order->total_amount);
}int main() {int choice;do {printf("\n1. 添加/修改菜单项\n2. 下订单\n3. 取消订单\n4. 搜索订单\n5. 统计信息\n6. 退出\n");printf("输入你的选择: ");scanf("%d", &choice);switch (choice) {case 1:addMenuItem();break;case 2:placeOrder();break;case 3:printf("输入要取消的订单ID: ");scanf("%d", &choice);cancelOrder(choice);break;case 4:printf("通过 (1) 订单ID 或 (2) 电话号码搜索: ");scanf("%d", &choice);if (choice == 1) {int order_id;printf("输入订单ID: ");scanf("%d", &order_id);searchOrderByID(order_id);} else if (choice == 2) {char phone[20];printf("输入电话号码: ");scanf("%s", phone);searchOrderByPhone(phone);}break;case 5:statistics();break;case 6:printf("退出系统.\n");break;default:printf("无效选择,请重新输入.\n");}} while (choice != 6);return 0;
}

4.2 测试数据和运行结果

测试数据
  1. 添加菜单项:

    输入菜品ID,名称和价格: 1 Pizza 15.99
    输入菜品ID,名称和价格: 2 Burger 9.99
    
  2. 下订单:

    输入顾客的电话、姓名、地址和下单时间: 1234567890 John Doe 123 Main St 2024-06-01 12:00
    输入菜品ID(0结束): 1
    输入菜品ID(0结束): 2
    输入菜品ID(0结束): 0
    
  3. 查询订单:

    输入订单ID: 1
    
  4. 取消订单:

    输入要取消的订单ID: 1
    
  5. 统计信息:

    今日总收入: $25.98
    Pizza 被订购了 1 次。
    Burger 被订购了 1 次。
    

总结与思考

优点

  1. 功能完善:系统涵盖了菜单管理、订单处理、订单查询、统计信息等核心功能。
  2. 数据持久化:程序利用文件系统实现了数据的持久化存储。

改进方向

  1. 数据完整性:系统尚未实现将所有相关信息存储到文件中,导致后台查询时需要额外调用计费函数。
  2. 安全性问题:当前系统缺乏密码机制,存在安全隐患。
  3. 用户体验:系统界面需要进一步优化,提升用户体验。

参考文献

  1. C语言课程设计 第3版
  2. C程序设计实训教程 第2版
  3. C语言从入门到项目实战

附录代码

#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_MENU 100  // 定义菜单项的最大数量#define MAX_ORDER 100 // 定义订单的最大数量// 定义菜单项结构体typedef struct {int id;            // 菜品IDchar name[50];     // 菜品名称float price;       // 菜品价格} MenuItem;// 定义订单结构体typedef struct {int order_id;      // 订单IDchar customer_phone[20];  // 顾客电话char customer_name[50];    // 顾客姓名char address[100];         // 顾客地址char order_time[20];       // 订单时间MenuItem items[MAX_MENU]; // 订单包含的菜品列表int items_count;           // 订单中菜品的数量float total_amount;        // 订单总金额} Order;// 定义全局变量MenuItem menu[MAX_MENU] = {0};Order orders[MAX_ORDER] = {0};int menu_count = 0;int order_count = 0;// 函数声明void addMenuItem();                // 添加菜单项void modifyMenuItem(int id);       // 修改菜单项void displayMenu();                // 显示菜单void placeOrder();                  // 下订单void cancelOrder(int order_id);     // 取消订单void searchOrderByID(int order_id); // 通过订单ID搜索订单void searchOrderByPhone(const char *phone); // 通过电话号码搜索订单void statistics();                  // 统计信息void applyDiscount(float *amount);  // 应用折扣void printOrder(const Order *order); // 打印订单详情void clearOrder(Order *order);      // 清除订单数据// 主函数int main() {int choice;do {printf("\n1. 添加/修改菜单项\n2. 下订单\n3. 取消订单\n4. 搜索订单\n5. 统计信息\n6. 退出\n");printf("输入你的选择: ");scanf("%d", &choice);switch (choice) {case 1:addMenuItem();break;case 2:placeOrder();break;case 3:printf("输入要取消的订单ID: ");scanf("%d", &choice);cancelOrder(choice);break;case 4:printf("通过 (1) 订单ID 或 (2) 电话号码搜索: ");scanf("%d", &choice);if (choice == 1) {int order_id;printf("输入订单ID: ");scanf("%d", &order_id);searchOrderByID(order_id);} else if (choice == 2) {char phone[20];printf("输入电话号码: ");scanf("%s", phone);searchOrderByPhone(phone);}break;case 5:statistics();break;case 6:printf("退出系统.\n");break;default:printf("无效选择,请重新输入.\n");}} while (choice != 6);return 0;}// 添加菜单项void addMenuItem() {if (menu_count >= MAX_MENU) {printf("菜单已满,无法添加更多菜品。\n");return;}printf("输入菜品ID,名称和价格: ");scanf("%d %49s %f", &menu[menu_count].id, menu[menu_count].name, &menu[menu_count].price);menu_count++;}// 修改菜单项void modifyMenuItem(int id) {for (int i = 0; i < menu_count; i++) {if (menu[i].id == id) {printf("输入新的名称和价格: ");scanf("%49s %f", menu[i].name, &menu[i].price);return;}}printf("未找到菜品。\n");}// 显示菜单void displayMenu() {printf("菜单:\n");for (int i = 0; i < menu_count; i++) {printf("%d. %s - $%.2f\n", menu[i].id, menu[i].name, menu[i].price);}}// 下订单void placeOrder() {if (order_count >= MAX_ORDER) {printf("订单数量已达上限,无法下新订单。\n");return;}int item_id;float total = 0;orders[order_count].items_count = 0;displayMenu();printf("输入顾客的电话、姓名、地址和下单时间: ");scanf("%19s %49s %99s %19s", orders[order_count].customer_phone, orders[order_count].customer_name, orders[order_count].address, orders[order_count].order_time);while (1) {printf("输入菜品ID(0结束): ");scanf("%d", &item_id);if (item_id == 0) break;for (int i = 0; i < menu_count; i++) {if (menu[i].id == item_id) {if (orders[order_count].items_count < MAX_MENU) {orders[order_count].items[orders[order_count].items_count++] = menu[i];total += menu[i].price;} else {printf("一个订单中不能添加超过 %d 个菜品。\n", MAX_MENU);break;}}}}applyDiscount(&total);orders[order_count].total_amount = total;orders[order_count].order_id = order_count + 1; // 简单的订单ID生成逻辑printf("订单成功创建。订单ID: %d\n", orders[order_count].order_id);order_count++;}// 取消订单void cancelOrder(int order_id) {for (int i = 0; i < order_count; i++) {if (orders[i].order_id == order_id) {printf("订单 %d 已取消。\n", order_id);clearOrder(&orders[i]); // 清除订单数据for (int j = i; j < order_count - 1; j++) {memcpy(&orders[j], &orders[j + 1], sizeof(Order));}order_count--;return;}}printf("未找到订单。\n");}// 通过订单ID搜索订单void searchOrderByID(int order_id) {int found = 0; // 用于标记是否找到订单for (int i = 0; i < order_count; i++) {if (orders[i].order_id == order_id) {printOrder(&orders[i]);found = 1; // 标记找到订单break;}}if (!found) {printf("没有找到订单。\n");}}// 通过电话号码搜索订单void searchOrderByPhone(const char *phone) {int found = 0; // 用于标记是否找到订单for (int i = 0; i < order_count; i++) {if (strcmp(orders[i].customer_phone, phone) == 0) {printOrder(&orders[i]);found = 1; // 标记找到订单}}if (!found) {printf("没有找到该电话号码的订单。\n");}}// 统计信息void statistics() {// 示例统计信息 - 可以根据实际需求扩展int order_count_per_item[MAX_MENU] = {0};float total_revenue = 0;for (int i = 0; i < order_count; i++) {total_revenue += orders[i].total_amount;for (int j = 0; j < orders[i].items_count; j++) {int item_id = orders[i].items[j].id;order_count_per_item[item_id]++;}}printf("今日总收入: %.2f\n", total_revenue);for (int i = 0; i < menu_count; i++) {if (order_count_per_item[menu[i].id] > 0) {printf("%s 被订购了 %d 次。\n", menu[i].name, order_count_per_item[menu[i].id]);}}}// 应用折扣void applyDiscount(float *amount) {if (*amount > 300) *amount *= 0.85f;else if (*amount > 200) *amount *= 0.9f;else if (*amount > 100) *amount *= 0.95f;}// 打印订单详情void printOrder(const Order *order) {if (order == NULL) {printf("订单为空。\n");return;}// 打印订单头部信息printf("订单ID: %d\n", order->order_id);printf("顾客电话: %s\n", order->customer_phone);printf("顾客姓名: %s\n", order->customer_name);printf("地址: %s\n", order->address);printf("下单时间: %s\n", order->order_time);// 检查是否有订单项if (order->items_count == 0) {printf("该订单没有包含任何菜品。\n");} else {printf("订单项:\n");for (int i = 0; i < order->items_count; i++) {// 打印每个订单项的名称和价格printf(" - %s ($%.2f)\n", order->items[i].name, order->items[i].price);}}// 打印订单总金额printf("总金额: $%.2f\n", order->total_amount);}// 清除订单数据void clearOrder(Order *order) {memset(order, 0, sizeof(Order));}

嗨,我是LucianaiB。如果你觉得我的分享有价值,不妨通过以下方式表达你的支持:👍 点赞来表达你的喜爱,📁 关注以获取我的最新消息,💬 评论与我交流你的见解。我会继续努力,为你带来更多精彩和实用的内容。

点击这里👉LucianaiB ,获取最新动态,⚡️ 让信息传递更加迅速。

相关文章:

C语言之饭店外卖信息管理系统

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 C语言之饭店外卖信息管理系统 目录 设计题目设计目的设计任务描述设计要求输入和输出要求验…...

记一次 .NET某数字化协同管理系统 内存暴涨分析

一&#xff1a;背景 1. 讲故事 高级调试训练营里的一位朋友找到我&#xff0c;说他们跑在linux上的.NET程序出现了内存泄露的情况&#xff0c;上windbg观察发现内存都是IMAGE给吃掉了&#xff0c;那些image都标记了 doublemapper__deleted_ 字样&#xff0c;问我为啥会这样&a…...

部门管理查询部门,nginx反向代理,前端如何访问到后端Tomcat 注解@RequestParam

接口开发 增删改通常是不用返回data数据&#xff0c;返回null 列表查询-结果封装&#xff0c;时间 前后端联调测试 nginx反向代理&#xff0c;前端如何访问到后端Tomcat服务器 删除部门...

JS通过ASCII码值实现随机字符串的生成(可指定长度以及解决首位不出现数值)

在之前写过一篇“JS实现随机生成字符串&#xff08;可指定长度&#xff09;”&#xff0c;当时写的过于简单和传统&#xff0c;比较粗放。此次针对此问题&#xff0c;对随机生成字符串的功能进行优化处理&#xff0c;对随机取到的字符都通过程序自动来完成。 在写之前&#xff…...

速通Docker === 快速部署Redis主从集群

目录 镜像仓库介绍 持久化你的数据库 连接到其他容器 创建自定义网络 部署主节点 部署从节点 验证部署 总结 在现代应用架构中&#xff0c;Redis作为一个高性能的内存数据库&#xff0c;被广泛应用于缓存、会话存储、实时分析等多个领域。为了提高Redis的可用性和数据的…...

论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(一)

Understanding Diffusion Models: A Unified Perspective&#xff08;一&#xff09; 文章概括引言&#xff1a;生成模型背景&#xff1a;ELBO、VAE 和分层 VAE证据下界&#xff08;Evidence Lower Bound&#xff09;变分自编码器 &#xff08;Variational Autoencoders&#x…...

stm32使用MDK5.35时遇到*** TOOLS.INI: TOOLCHAIN NOT INSTALLED

mdk5.35出现*** TOOLS.INI: TOOLCHAIN NOT INSTALLED的问题&#xff01;&#xff01;&#xff01;&#xff01; 以管理员身份重新打开MDK5.35.0.0&#xff0c;用keygen破解密码&#xff0c;但是一直提示我是没有破解成功。 解决办法&#xff1a; target 改成ARM...

在Ubuntu上安装RabbitMQ教程

1、安装erlang 因为rabbitmq是基于erlang开发的&#xff0c;所以要安装rabbitmq&#xff0c;首先需要安装erlang运行环境 apt-get install erlang执行命令查是否安装成功&#xff1a;erl&#xff0c;疯狂 Ctrlc 就能退出命令行 2、安装rabbitmq 1、查看erlang与rabbitmq版本…...

【算法】集合List和队列

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 零&#xff1a;集合&#xff0c;队列的用法 一&#xff1a;字母异位词分组 二&#xff1a;二叉树的锯…...

uniapps使用HTML5的io模块拷贝文件目录

最近在集成sqlite到uniapp的过程中&#xff0c;因为要将sqlite数据库预加载&#xff0c;所以需要使用HTML5的plus.io模块。使用过程中遇到了许多问题&#xff0c;比如文件路径总是解析不到等。尤其是应用私有文档目录’_doc’。 根据官方文档&#xff1a; 为了安全管理应用的…...

css‘s hover VS mobile

.animation {animation: 30s move infinite linear;/* &:hover {animation-play-state: paused;*/ }原本写的好好的&#xff0c;测试说&#xff1a;“移动端点击滚动条&#xff0c;跳转到其他页面后&#xff0c;返回当前页面&#xff0c;滚动条不滚动&#xff1b;可以优化位…...

工业制造离不开的BOM

在制造业的浩瀚星空中&#xff0c;物料清单&#xff08;BOM&#xff09;犹如“北极星”&#xff0c;牢牢指引着产品从设计蓝图迈向实物诞生的全过程。 BOM的分类 按照设计制造的不同阶段&#xff0c;将BOM划分为设计BOM、工艺BOM、制造BOM三种类型。 设计BOM Engineering BO…...

HTML中的`<!DOCTYPE html>`是什么意思?

诸神缄默不语-个人CSDN博文目录 在学习HTML时&#xff0c;我们经常会看到HTML文档的开头出现<!DOCTYPE html>&#xff0c;它是HTML文件的第一行。很多初学者可能会疑惑&#xff0c;为什么需要这行代码&#xff1f;它到底有什么作用呢&#xff1f;在这篇文章中&#xff0…...

C语言之斗地主游戏

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 ​ C语言之斗地主游戏 目录 程序概述程序设计 Card类CardGroup类Player类LastCards类Land…...

【玩转全栈】----Django制作部门管理页面

目录 大致效果 BootStrap BootStrap简介 BootStrap配置 BootStrap使用 基本配置 部分代码解释及注意&#xff1a; 用户编辑&#xff1a; 新添数据&#xff1a; 删除数据&#xff1a; 大致效果 我先给个大致效果&#xff0c;基本融合了Django、Bootstrap、css、html等等。 基于D…...

Unreal Engine 5 C++ Advanced Action RPG 十章笔记

第十章 Survival Game Mode 2-Game Mode Test Map 设置游戏规则进行游戏玩法 生成敌人玩家是否死亡敌人死亡是否需要刷出更多 肯定:难度增加否定:玩家胜利 流程 新的游戏模式类游戏状态新的数据表来指定总共有多少波敌人生成逻辑UI告诉当前玩家的敌人波数 3-Survival Game M…...

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证9)

测试数据库中只有之前记录温湿度及烟雾值的表中数据较多&#xff0c;在该数据库中增加AppUser表&#xff0c;用于登录用户身份查询&#xff0c;数据库表如下所示&#xff1a;   项目中安装SqlSugarCore包&#xff0c;然后修改控制器类的登录函数及分页查询数据函数&#xff…...

缓存之美:万文详解 Caffeine 实现原理(上)

由于社区最大字数限制&#xff0c;本文章将分为两篇&#xff0c;第二篇文章为缓存之美&#xff1a;万文详解 Caffeine 实现原理&#xff08;下&#xff09; 大家好&#xff0c;我是 方圆。文章将采用“总-分-总”的结构对配置固定大小元素驱逐策略的 Caffeine 缓存进行介绍&…...

Spark/Kafka

文章目录 项目地址一、Spark1. RDD1.1 五大核心属性1.2 执行原理1.3 四种创建方式二、Kafka2.1 生产者(1)分区器(2)生产者提高吞吐量(3) 生产者数据可靠性数据传递语义幂等性和事务数据有序2.2 Broker(1)Broker工作流程(2)节点服役和退役2.3 副本(1)Follower故障细…...

深入浅出:Go语言中的Unicode与字符编码详解

深入浅出:Go语言中的Unicode与字符编码详解 引言 在当今的编程世界中,字符编码和Unicode是不可或缺的技术基础。Go语言作为一种强大的编程语言,其对Unicode的支持和字符编码的处理方式,对于开发者来说至关重要。本文将从Unicode的基础知识入手,逐步深入探讨Go语言中字符编…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

ubuntu中安装conda的后遗症

缘由: 在编译rk3588的sdk时&#xff0c;遇到编译buildroot失败&#xff0c;提示如下&#xff1a; 提示缺失expect&#xff0c;但是实测相关工具是在的&#xff0c;如下显示&#xff1a; 然后查找借助各个ai工具&#xff0c;重新安装相关的工具&#xff0c;依然无解。 解决&am…...

算法250609 高精度

加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...

鸿蒙Navigation路由导航-基本使用介绍

1. Navigation介绍 Navigation组件是路由导航的根视图容器&#xff0c;一般作为Page页面的根容器使用&#xff0c;其内部默认包含了标题栏、内容区和工具栏&#xff0c;其中内容区默认首页显示导航内容&#xff08;Navigation的子组件&#xff09;或非首页显示&#xff08;Nav…...

JavaScript 标签加载

目录 JavaScript 标签加载script 标签的 async 和 defer 属性&#xff0c;分别代表什么&#xff0c;有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...

RFID推动新能源汽车零部件生产系统管理应用案例

RFID推动新能源汽车零部件生产系统管理应用案例 一、项目背景 新能源汽车零部件场景 在新能源汽车零部件生产领域&#xff0c;电子冷却水泵等关键部件的装配溯源需求日益增长。传统 RFID 溯源方案采用 “网关 RFID 读写头” 模式&#xff0c;存在单点位单独头溯源、网关布线…...