jiajia00chen 2021-03-05 15:14 采纳率: 50%
浏览 26
已采纳

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

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

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

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

 

  • 写回答

2条回答 默认 最新

  • include_iostream_ 2021-03-05 18:54
    关注

    你指的是要实现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条)

报告相同问题?

悬赏问题

  • ¥100 求数学坐标画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站