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;           // 菜品ID
    char name[50];    // 菜品名称
    float price;      // 菜品价格
} MenuItem;

typedef struct {
    int order_id;                     // 订单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;

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 100

typedef 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;            // 菜品ID

    char name[50];     // 菜品名称

    float price;       // 菜品价格

} MenuItem;



// 定义订单结构体

typedef struct {

    int order_id;      // 订单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();                // 添加菜单项

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 ,获取最新动态,⚡️ 让信息传递更加迅速。

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

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

相关文章

【数学建模美赛速成系列】O奖论文绘图复现代码

文章目录 引言折线图 带误差棒得折线图单个带误差棒得折线图立体饼图完整复现代码 引言 美赛的绘图是非常重要得&#xff0c;这篇文章给大家分享我自己复现2024年美赛O奖优秀论文得代码&#xff0c;基于Matalab来实现&#xff0c;可以直接运行出图。 折线图 % MATLAB 官方整理…

wordpress安装完后台无格式解决方法(样式加载不出来)

刚安装的wordpress,进入后台后,没有样式。 1.如果ip进入,可能一切正常 2.域名进入,遇到这种情况概率大(经过了nginx代理) 正常访问文章的话是没问题的,只是管理后台存在这样的代码,样式没加载出来。 美国随机地址生成器:美国随机地址生成器(随机地址生成器 - 生成全…

R语言基础| 回归分析

写在前面 R语言拥有丰富的数据处理、统计分析和机器学习工具包&#xff0c;涵盖了从简单的描述统计到复杂的模型建立的各个方面。再加上数据的处理可以完美的衔接后续的可视化&#xff0c;这使得它成为处理各种类型和规模的数据集的理想选择。回归分析是统计学中一种用于探究自…

数据结构-ArrayList和顺序表

1.线性表 线性表是n个具有相同类型的数据元素所组成的有限序列&#xff0c;当n0时&#xff0c;线性表为一个空表。 常见的线性表&#xff1a;顺序表&#xff0c;链表&#xff0c;栈和队列... 线性表在逻辑上是线性结构&#xff0c;可以说是连续的一条直线。但是在物理结构上…

计算机视觉算法实战——人类情感识别(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​​​​​​​​​​​​​​ 1. 引言✨✨ 人类情感识别&#xff08;Facial Expression Recognition, FER&#xff09;是计算机视觉领…

08_游戏启动逻辑

1.GameRoot.cs 控制 服务层Svc.cs 和业务层Sys.cs 的初始化 创建脚本GameRoot.cs&#xff08;游戏入口 已进入就初始化各个系统&#xff09; 创建资源加载服务.cs Res 将服务层Svc设置成单例类所以需要挂载在GameRoot身上&#xff0c;这样就可以通过GameRoot来调各个服务 接…

当使用 npm 时,出现 `certificate has expired` 错误通常意味着请求的证书已过期。

当使用 npm 时&#xff0c;出现 certificate has expired 错误通常意味着请求的证书已过期。这可能是由于以下几种情况&#xff1a; 网络代理问题&#xff1a;如果使用了网络代理&#xff0c;代理服务器的证书可能过期或配置有误。系统时间错误&#xff1a;系统时间不准确可能导…

2024年,我的技术探索与成长之路

2024年&#xff0c;我的技术探索与成长之路 2024年已经过去&#xff0c;作为一名技术爱好者和写作者&#xff0c;我回顾了过去一年在博客上记录的点滴&#xff0c;感慨良多。这一年&#xff0c;我不仅见证了技术的飞速发展&#xff0c;也在不断学习和实践中找到了自己的成长方向…

ASP.NET Blazor部署方式有哪些?

今天我们来说说Blazor的三种部署方式&#xff0c;如果大家还不了解Blazor&#xff0c;那么我先简单介绍下Blazor Blazor 是一种 .NET 前端 Web 框架&#xff0c;在单个编程模型中同时支持服务器端呈现和客户端交互性&#xff1a; ● 使用 C# 创建丰富的交互式 UI。 ● 共享使用…

【LeetCode】--- MySQL刷题集合

1.组合两个表&#xff08;外连接&#xff09; select p.firstName,p.lastName,a.city,a.state from Person p left join Address a on p.personId a.personId; 以左边表为基准&#xff0c;去连接右边的表。取两表的交集和左表的全集 2.第二高的薪水 &#xff08;子查询、if…

【C++】模板(进阶)

本篇我们来介绍更多关于C模板的知识。模板初阶移步至&#xff1a;【C】模板&#xff08;初阶&#xff09; 1.非类型模板参数 1.1 非类型模板参数介绍 模板参数可以是类型形参&#xff0c;也可以是非类型形参。类型形参就是我们目前接触到的一些模板参数。 //类型模板参数 …

ASP .NET Core 学习(.NET9)配置接口访问路由

新创建的 ASP .NET Core Web API项目中Controller进行请求时&#xff0c;是在地址:端口/Controller名称进行访问的&#xff0c;这个时候Controller的默认路由配置如下 访问接口时&#xff0c;是通过请求方法&#xff08;GET、Post、Put、Delete&#xff09;进行接口区分的&…

用于牙科的多任务视频增强

Multi-task Video Enhancement for Dental Interventions 2022 miccai Abstract 微型照相机牢牢地固定在牙科手机上&#xff0c;这样牙医就可以持续地监测保守牙科手术的进展情况。但视频辅助牙科干预中的视频增强减轻了低光、噪音、模糊和相机握手等降低视觉舒适度的问题。…

一部手机如何配置内网电脑同时访问内外网

做过运维的朋友都知道&#xff0c;最麻烦的是运维电脑不能远程&#xff0c;每次都得现场进行维护&#xff0c;明明客户那边有可以访问内网的电脑&#xff0c;怎么操作能将这台电脑能访问跟到外网呢&#xff0c;这样不就能通过远程软件远程了吗&#xff1f;嘿嘿。按以下步骤试试…

基于STM32的智能门锁安防系统(开源)

目录 项目演示 项目概述 硬件组成&#xff1a; 功能实现 1. 开锁模式 1.1 按键密码开锁 1.2 门禁卡开锁 1.3 指纹开锁 2. 功能备注 3. 硬件模块工作流程 3.1 步进电机控制 3.2 蜂鸣器提示 3.3 OLED显示 3.4 指纹与卡片管理 项目源代码分析 1. 主程序流程 (main…

(三)线性代数之二阶和三阶行列式详解

在前端开发中&#xff0c;尤其是在WebGL、图形渲染、或是与地图、模型计算相关的应用场景里&#xff0c;行列式的概念常常在计算变换矩阵、进行坐标变换或进行图形学算法时被使用。理解二阶和三阶行列式对于理解矩阵运算、旋转、平移等操作至关重要。下面&#xff0c;我将结合具…

基于GRU实现股价多变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…

【EdgeAI实战】(1)STM32 边缘 AI 生态系统

【EdgeAI实战】&#xff08;1&#xff09;STM32 边缘 AI 生态系统 【EdgeAI实战】&#xff08;1&#xff09;STM32 边缘 AI 生态系统 1. STM32 边缘人工智能1.1 X-CUBE-AI 扩展包1.2 STM32 AI Model Zoo1.3 ST AIoT Craft 2. STM32N6 AI 生态系统 (STM32N6-AI)2.1 STM32N6 AI 产…

DeepSeek-R1性能如何?如何使用DeepSeek-R1和o1 Pro模型

我们一起来看看DeepSeek-R1模型和OpenAI o1模型的能力如何&#xff1f;接下来&#xff0c;我们先看数据结果&#xff0c;然后再实际体验&#xff0c;我们今天就让他们写个python爬虫脚本来爬取所有有关孙颖莎和樊振东的相关报道和图片。 DeepSeek-R1 DeepSeek介绍自己说 &quo…

FunASR语言识别的环境安装、推理

目录 一、环境配置 1、创建虚拟环境 2、安装环境及pytorch 官网&#xff1a;pytorch下载地址 3、安装funasr之前&#xff0c;确保已经安装了下面依赖环境: python代码调用&#xff08;推荐&#xff09; 4、模型下载 5、启动funasr服务 二、 客户端连接 2.1 html连接 …