jiajia00chen
jiajia00chen
采纳率25%
2021-03-05 15:14

程序设计课在线作业系统的实现--中间作业程序运行有困难

已采纳

一次作业可以有多道程序设计题,设置参考答案,设置测试案例的输入输出(输出根据参考答案运行得出)

参考程序的运行;根据输入得出测试案例的输出;

要实现如上想法,如何在一个网站上,直接对上传的C语言的文件进行即时的运行得出结果呢?使得网站可以自动判断作业(提交的C语言文件)是正确的

 

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • include_iostream_ include_iostream_ 1月前

    你指的是要实现OJ的判题逻辑吗?先说说可以怎样实现吧。

    如果是希望把源代码送入指定位置后pending再判题的话,用python就很简单,subprocess模块有个Popen类型,用Popen函数一顿操作后可以打开管道进行交互,wait成员函数可以设置timeout,timeout后进程未结束就会抛出异常,可以用于判断超时。运行结束后:Popen对象名.returncode可以判断进程返回值,为0就是没问题,否则就是Runtime Error(其实不一定,可能有人main函数忘记写return,这时主函数返回值是标准没有规定的,可能返回0也可能是其他东西。但完全准确地识别非0值是不是正常返回值几乎是不可能的,而进程返回0一定表示没有RE,所以习惯上这样判断)。最后,通过python提供的文件操作调用比较输出与标准输出的异同,最终裁定程序结果的正确性。

    用C++也是可以的,不过涉及到底层系统调用(毕竟评测机前端要开新进程,这是C++标准库里没有的东西,只能调OS API),比较麻烦。

    =================================================

    由于需求不是特别明确,附加说明哪些事情不可能做到或者通常不这样实现。

    首先直接从源码文件运行出结果几乎是不可能的,的确存在C语言的解释器,但作为OJ的运行环境来使用存在从可靠性到兼容性在内的一系列问题,必须要经过服务器后端编译后再运行才比较稳妥。我见过大大小小十来个C语言OJ,从来没有一个是直接用源码就能判题的,都必须经过后台编译,换句话说,前端一定会有一个pending过程。哪怕是python语言OJ,OJ后台也是要排队的,所以这是一个无可置疑的结论:完全实时的OJ不可能实现,因为系统资源是有限的,更别提C语言编译需要额外的时间。提交等待队列无论如何也不可能省略,除非你能研究出时间机器。

    理论上OJ可以提供随机测试点,只需要一个std标程和一个数据生成器,把同一次的生成数据送入std和选手程序,输出结果比对即可。但我很少见到这种OJ,多数OJ中题目的输入输出cases都是提前写好的。

    =================================================

    这样讲可能还是有不少不清楚的地方,我正好在研究这样的需求如何实现,有什么进一步的问题可以私信交流下。

    点赞 1 评论 复制链接分享
  • jiajia00chen jiajia00chen 1月前

    我们要用python写,好像你说的就是我们需要的欸!!感谢你!!!不过我们刚开始弄,我得慢慢琢磨,有什么不懂的,还需要大佬帮忙!万分感谢

    点赞 评论 复制链接分享