【负载均衡式在线OJ项目day6】源文件路由功能及文件版题库构建

一.前言

前文讲到了OJ模块的设计思路,毫无疑问这是一个网络服务,我们先使用httplib,将源文件的路由功能实现,先把框架写好,后续再更改回调方法。

随后计划编写Modify模块,提供增删查改题库的功能(主要是查),所以在这之前,我们必须先构建一个题库。题库有文件和MySQL两种版本,我们暂时先写文件版的。

二.源文件路由功能

所谓的路由,即用户访问不同的URL,我们调用不同的方法来构建response,这需要我们在启动服务之前注册回调函数。

#include <iostream>
#include "../Common/httplib.h"using namespace httplib;int main()
{Server svr;//获取题目列表svr.Get("/all_questions", [](const Request& req, Response& resp){resp.set_content("这是所有题目的列表", "text/plain; charset=utf-8");});//根据题目编号,获取题目内容svr.Get(R"(/questions/(\d+))", [](const Request& req, Response& resp){std::string number = req.matches[1]; //拿到正则表达式匹配到的内容resp.set_content("这是指定的一道题:" + number, "text/plain; charset=utf-8");});//提交代码判题获取结果svr.Get(R"(/judge/(\d+))", [](const Request& req, Response& resp){std::string number = req.matches[1]; //拿到正则表达式匹配到的内容resp.set_content("这是指定的一道题判题:" + number, "text/plain; charset=utf-8");});//设置web根目录,首页就是wwwroot下的index.htmlsvr.set_base_dir("./wwwroot");svr.listen("0.0.0.0", 8080);return 0;
}

 回调函数中的内容等我们完成MVC三个模块后再更改

三.文件版题库构建

一道题目的相关信息如下:

  1. 题目编号
  2. 题目名称
  3. 题目难度
  4. 题目内容
  5. 时间和空间资源约束
  6. 预设的初始代码
  7. 用来测试用户提交代码正确性的代码,包含多组测试用例

其中1-6是会展示给用户,而用来测试的代码是OjServer自己内部使用的。OjServer收到了用户提交的代码,再把测试代码拼接到尾部,构造一个完整的源文件,再放到编译运行模块去运行,得到运行结果,看看通过了几组测试用例。

也就是说,我们设计的是类似leetcode的OJ模式,只让用户实现核心功能,用户不能自己编写main函数。

把这些内容都放在一个文件里不太合适,题目内容,初始代码,测试代码内容较多,应该分开存放,其余内容用一个文件存放即可。

即所有题目的题号,名称,难度,时间约束,空间约束都放在questions.list中,一个题目相关的信息占一行。

一个题目的内容,初始代码,测试代码放到一个文件以题号命名的文件夹中,分三个文件存放。有多少个题目,就建立多少个文件夹。结构如下图:

将来题库是需要加载到内存中的,先加载questions.list文件,而每行都含有题号,根据题号,去相应的以题号命名的文件夹中就能找到对应的题目内容,初始代码和测试代码。所以这两批文件就通过用题号给文件夹命名的方法关联起来了。

四.题目实例

下面以题库中的第一题为例,看看文件里都有什么内容

questions.list:

1/desc.txt: 

1/header.cpp: 

1/tail.cpp: 

说明:如果不引入header.cpp,就没有Solution类,编写测试代码时就会有语法报错,所以开头的条件编译是为了编写tail.cpp时更加方便,不产生语法报错。

正式提交给编译模块的时候,用户提交的代码和tail.cpp已经合并到一块。我们可以在稍微更改一下编译模块,加上-D COMPILE_ONLINE,引入这个宏常量后就不会执行#include了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【贪心算法】最小生成树Kruskal算法Python实现

文章目录 [toc]问题描述最小生成树的性质证明 Kruskal算法Python实现时间复杂性 问题描述 设 G ( V , E ) G (V , E) G(V,E)是无向连通带权图&#xff0c; E E E中每条边 ( v , w ) (v , w) (v,w)的权为 c [ v ] [ w ] c[v][w] c[v][w]如果 G G G的一个子图 G ′ G^{} G′是…

acer笔记本怎样进行系统还原?教你两招!

acer笔记本怎样进行系统还原&#xff1f;教你两招&#xff01; 作为笔记本用户&#xff0c;你在日常使用中可能会遇到各种各样的电脑问题。一般来说&#xff0c;对于一些小问题&#xff0c;我们可以通过一些简单的操作来解决&#xff0c;比如重新启动电脑或者长按电源键强制关机…

深入探讨布隆过滤器算法:高效的数据查找与去重工具

在处理海量数据时&#xff0c;我们经常需要快速地进行数据查找和去重操作。然而&#xff0c;传统的数据结构可能无法满足这些需求&#xff0c;特别是在数据量巨大的情况下。在这种情况下&#xff0c;布隆过滤器&#xff08;Bloom Filter&#xff09;算法就显得尤为重要和有效。…

MongoDB聚合运算符:$toLong

MongoDB聚合运算符&#xff1a;$toLong 文章目录 MongoDB聚合运算符&#xff1a;$toLong语法使用举例 $toLong聚合运算符将指定的值转换为长整数类型。如果指定的值为空或缺失&#xff0c;则返回null&#xff1b;如果值无法被转换为长整数&#xff0c;则报错。 语法 {$toLong:…

提高静态住宅代理稳定性妙招

在数字化时代的浪潮中&#xff0c;静态住宅代理因其独特的优势&#xff0c;如固定的IP地址、更高的隐私保护性等&#xff0c;逐渐成为网络爬虫、数据分析等领域不可或缺的工具。然而&#xff0c;静态住宅代理的稳定性问题一直是用户关注的焦点。本文将为您揭示提高静态住宅代理…

docker compose kafka集群部署

kafka集群部署 目录 部署zookeeper准备工作2、部署kafka准备工作3、编辑docker-compose.yml文件4、启动服务5、测试kafka6、web监控管理 部署zookeeper准备工作 mkdir data/zookeeper-{1,2,3}/{data,datalog,logs,conf} -p cat >data/zookeeper-1/conf/zoo.cfg<<EOF…

JS代码随想录(一):数组

代码随想录 一、数组理论基础 二、LeetCode 704. 二分查找 三、LeetCode 27. 移除元素 四、LeetCode 977.有序数组的平方 五、LeetCode 209.长度最小的子数组 六、LeetCode 59.螺旋矩阵II 七、数组总结 一、数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 数组…

3 PWM控制

Esp32的PWM控制也配置库函数&#xff0c;以下就是PWM所用到的函数 1 PWM通道初始化设置 函数原型uint32_t ledcSetup(uint8_t chan, uint32_t freq, uint8_t bit_num)函数功能设定指定LEDC通道的PWM信号频率和占空比分辨率返回值通道PWM信号的频率参数说明chan&#xff08;LE…

boost asio同步编程(附源码api)

首先注明&#xff0c;这里我写的都是关于tcp的通信。 通信大致流程 创建端点 创建tcp端点的api是boost::asio::ip::tcp::endpoint; 当然创建udp端点的api则是boost::asio::ip::udp::endpoint; 是一个表示 TCP/UDP 端点的类&#xff0c;在 Boost.Asio 库中用于网络编程。它通…

鸿蒙ArkUI:【编程范式:命令式->声明式】

命令式 简单讲就是需要开发用代码一步一步进行布局&#xff0c;这个过程需要开发全程参与。 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 Objective-C ObjectiveC 复制代码 UIView *cardView …

day3_prefixSum

一、前缀和技巧 重点 前缀和技巧适用于快速、频繁地计算一个索引区间内的元素之和 个人理解&#xff1b;预计算&#xff0c;空间换时间 1.(一维数组的前缀和)303区域和检索-数组不可变 获取闭区间值 [left,right] -> preSum[right 1] - preSum[left],其中preSum[right…

Linux下VMamba 环境复现+环境测试

# 1. 创建自己的虚拟环境 conda create -n VMamba python3.10.13 conda activate VMamba # 2. cuda-11.8 conda install cudatoolkit11.8 -c nvidia # 3. torch torchvision torchaudio 与 官网命令一致 pip install torch2.1.1 torchvision0.16.1 torchaudio2.1.1 --index-url…

苹果电脑怎么清内存?2024有哪些好用的工具?

在使用苹果电脑的过程中&#xff0c;我们可能会遇到系统运行缓慢、程序响应迟缓或频繁出现应用程序崩溃的情况&#xff0c;这些问题很可能是由于内存占用过高所导致。内存&#xff0c;或称为RAM&#xff08;RandomAccessMemory&#xff09;&#xff0c;是计算机的临时存储区&am…

[C++][PCL]pcl安装包预编译包国内源下载地址

版本名称下载地址PCL-1.14.1-AllInOne-msvc2022-win64含pdb.zip点我下载PCL-1.14.0-AllInOne-msvc2022-win64含pdb.zip点我下载PCL-1.13.1-AllInOne-msvc2022-win64含pdb.zip点我下载PCL-1.13.0-AllInOne-msvc2022-win64含pdb.zip点我下载PCL-1.12.1-AllInOne-msvc2019-win64含…

超级好看的html网站维护源码

源码介绍 好看的html网站维护源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c; 源码截图 源码下载 好看的html网站维护源码

py黑帽子学习笔记_网络编程工具

tcp客户端 socket.AF_INET表示使用标准IPV4地址和主机名 SOCK_STREAM表示这是一个TCP客户端 udp客户端 udp无需连接&#xff0c;因此不需要client.connect这种代码 socket.SOCK_DGRAM是udp的 tcp服务端 server.listen(5)表示设置最大连接数为5 发现kill server后端口仍占用…

【服务治理中间件】consul介绍和基本原理

目录 一、CAP定理 二、服务注册中心产品比较 三、Consul概述 3.1 什么是Consul 3.2 Consul架构 3.3 Consul的使用场景 3.4 Consul健康检查 四、部署consul集群 4.1 服务器部署规划 4.2 下载解压 4.3 启动consul 五、服务注册到consul 一、CAP定理 CAP定理&#xff…

i春秋-Backdoor

题目 考点 git源码泄露 Linux文件恢复 代码审计 http 解题 参考wp https://blog.csdn.net/cbhjerry/article/details/105791056https://www.pianshen.com/article/19461342501/扫描 题目给出提示&#xff1a;敏感文件泄漏 于是使用dirsearch扫一下 python dirsearch.py -…

【C++风云录】跨越时空的分析:古生物学与化石记录

古生物学数字化&#xff1a;C库的应用和影响 前言 在本文中&#xff0c;我们将深入探讨和评估几个重要的C库及其在古生物学和化石记录分析中的应用。此外&#xff0c;我们还将介绍MorphoSource API&#xff0c;以及使用C进行API接入的过程。文章还会讲述化石校准工具的重要性…

STM32H5 擦除flash时,GetSector进入Error_Handler

背景及问题&#xff1a;开发项目时&#xff0c;操作内部flash&#xff0c;调用getsetcor时&#xff0c;进入hardfault&#xff0c;经调试发现FLASH_BANK_SIZE读不到值&#xff0c;FLASH_BANK_SIZE取值来源于以下步骤&#xff1a;一时没有任何思路 ((((*((uint16_t *)FLASHSIZE…