抽题系统核心。

前一阵子开发了一个小项目,做了一个抽题系统,主要功能就是根据题目类型、难易程度、题量和分数来抽取对应的题目,生成一套带有答案的试题,话不多说先看实例:

function super(){
		for($i=0;$i<101;$i++)
			$sum[]=$i;
		$keres=Db::table('ke')->select();
		if(isset($_POST['sub'])){
			//接收难度系数比,判断是否和为1
			$nan=$_POST['nan']/10;
			$zhong=$_POST['zhong']/10;
			$yi=$_POST['yi']/10;
			if($nan+$zhong+$yi!=1)
				echo "<script>alert('难度系数比错误,请重新选择!');location.href='super/super'</script>";
			//判断是否选择了科目
			if(empty($_POST['ke']))
				echo "<script>alert('请选择科目!');location.href='super/super'</script>";
			//每个题目的数量
			$danxuansum=$_POST['danxuan'];
			$duoxuansum=$_POST['duoxuan'];
			$panduansum=$_POST['panduan'];
			$tiankongsum=$_POST['tiankong'];
			$datisum=$_POST['dati'];
			$shuliang=$danxuansum;
			$shuliang.=','.$duoxuansum;
			$shuliang.=','.$panduansum;
			$shuliang.=','.$tiankongsum;
			$shuliang.=','.$datisum;
			//判断是否选择了题型
			if($danxuansum==0&&$duoxuansum==0&&$panduansum==0&&$tiankongsum==0&&$datisum==0)
				echo "<script>alert('请至少选择一种题型!');location.href='super/super'</script>";
			//接受所有题目的分数
			$danxuanfs=$_POST['danxuanfs'];
			$duoxuanfs=$_POST['duoxuanfs'];
			$panduanfs=$_POST['panduanfs'];
			$tiankongfs=$_POST['tiankongfs'];
			$datifs=$_POST['datifs'];
			//计算分数是否正确
			$zongfen=$_POST['zongfen'];
			$zf=$zongfen;
			$jianyan=$danxuansum*$danxuanfs+$duoxuansum*$duoxuanfs+$panduansum*$panduanfs+$tiankongsum*$tiankongfs+$datisum*$datifs;
			if($zongfen!=$jianyan)
				echo "<script>alert('每题分数和总分不符!');location.href='super/super'</script>";
			if($_POST['text']=="")
				echo "<script>alert('请输入考试题目!');location.href='super/super'</script>";
			if($_POST['ktime']=="")
				echo "<script>alert('请输入考试时间!');location.href='super/super'</script>";
			//把接受的科目id转化成字符串,方便查找
			$ke=implode(",",$_POST['ke']);
			//计算每个难度对应的分数
			$nansum=$nan*$zongfen;
			$zhongsum=$zhong*$zongfen;
			$yisum=$yi*$zongfen;
			//定义存储随机数字的数组
			$copy=array();
			//计算题库tid的最大值
			$aaa=Db::table('test')->field('count(tid) as max')->find();
			$max=$aaa['max'];
			//给定重点题分数
			$key=ceil($zongfen/2);
			//定义存储题库tid的数组
			$tid=array();
			for($abc=1;$abc>0;$abc++){
				if($zongfen==0){
					$tid=implode(',',$tid);
					$defen=$danxuanfs;
					$defen.=','.$duoxuanfs;
					$defen.=','.$panduanfs;
					$defen.=','.$tiankongfs;
					$defen.=','.$datifs;
					$res=Db::table('guodu')->where('id',1)->update(['zongfen'=>$zf,'text'=>input('text'),'ktime'=>input('ktime'),'tihao'=>$tid,'uid'=>Session::get('uid'),'shuliang'=>$shuliang,'defen'=>$defen,'time'=>date('Y-m-d H:i:s',time())]);
					if($res||$res==0){
						$this->success('生成中……',url('index/super/xs'));
					}else
						$this->error('生成失败!');
					break;
				}
				if(count($copy)==$max){
					echo "<script>alert('题目数量不足!');location.href='super/super'</script>";
					break;
				}
				//生成随机数字,随机查询题目
				$sj=rand(1,$max);
				$res=Db::table('test')
					->join('jie','jie.jieid=test.jieid')
					->join('zhang','zhang.zhangid=jie.zhangid')
					->join('ke','ke.keid=zhang.keid')
					->where(['tid'=>['=',$sj],'ke.keid'=>['in',$ke]])
					->field('keyid,nanid,lid')
					->find();
				//优先循环重点题目
				if($res['keyid']!=1&&$key>0)
					continue;
				//判断该随机数字是否被抽到过
				if(in_array($sj,$copy))
					continue;
				//储存随机数
				$copy[]=$sj;
				//判断某个字段是否有值,如果空则无该题
				if(empty($res['keyid']))
					continue;
				//如果难题分数已够,则跳出循环
				if($nansum<=0&&$res['nanid']==1)
					continue;
				//如果中等题分数已够,则跳出循环
				if($zhongsum<=0&&$res['nanid']==2)
					continue;
				//如果简单题分数已够,则跳出循环
				if($yisum<=0&&$res['nanid']==3)
					continue;
				/******************************************单选筛选***********************************/
				if($res['lid']==1&&$danxuansum!=0){
					if($res['nanid']==1){
						$nansum-=$danxuanfs;
						$danxuansum--;
						$zongfen-=$danxuanfs;
						$tid[]=$sj;
					}
					if($res['nanid']==2){
						$zhongsum-=$danxuanfs;
						$danxuansum--;
						$zongfen-=$danxuanfs;
						$tid[]=$sj;
					}
					if($res['nanid']==3){
						$yisum-=$danxuanfs;
						$danxuansum--;
						$zongfen-=$danxuanfs;
						$tid[]=$sj;
					}
					if($res['keyid']==1)
						$key-=$danxuanfs;
				}
				/******************************************多选筛选***********************************/
				if($res['lid']==2&&$duoxuansum!=0){
					if($res['nanid']==1){
						$nansum-=$duoxuanfs;
						$duoxuansum--;
						$zongfen-=$duoxuanfs;
						$tid[]=$sj;
					}
					if($res['nanid']==2){
						$zhongsum-=$duoxuanfs;
						$duoxuansum--;
						$zongfen-=$duoxuanfs;
						$tid[]=$sj;
					}
					if($res['nanid']==3){
						$yisum-=$duoxuanfs;
						$duoxuansum--;
						$zongfen-=$duoxuanfs;
						$tid[]=$sj;
					}
					if($res['keyid']==1)
						$key-=$duoxuanfs;
				}
				/******************************************判断筛选***********************************/
				if($res['lid']==3&&$panduansum!=0){
					if($res['nanid']==1){
						$nansum-=$panduanfs;
						$panduansum--;
						$zongfen-=$panduanfs;
						$tid[]=$sj;
					}
					if($res['nanid']==2){
						$zhongsum-=$panduanfs;
						$panduansum--;
						$zongfen-=$panduanfs;
						$tid[]=$sj;
					}
					if($res['nanid']==3){
						$yisum-=$panduanfs;
						$panduansum--;
						$zongfen-=$panduanfs;
						$tid[]=$sj;
					}
					if($res['keyid']==1)
						$key-=$panduanfs;
				}
				/******************************************填空筛选***********************************/
				if($res['lid']==4&&$tiankongsum!=0){
					if($res['nanid']==1){
						$nansum-=$tiankongfs;
						$tiankongsum--;
						$zongfen-=$tiankongfs;
						$tid[]=$sj;
					}
					if($res['nanid']==2){
						$zhongsum-=$tiankongfs;
						$tiankongsum--;
						$zongfen-=$tiankongfs;
						$tid[]=$sj;
					}
					if($res['nanid']==3){
						$yisum-=$tiankongfs;
						$tiankongsum--;
						$zongfen-=$tiankongfs;
						$tid[]=$sj;
					}
					if($res['keyid']==1)
						$key-=$tiankongfs;
				}
				/******************************************大题筛选***********************************/
				if($res['lid']==5&&$datisum!=0){
					if($res['nanid']==1){
						$nansum-=$datifs;
						$datisum--;
						$zongfen-=$datifs;
						$tid[]=$sj;
					}
					if($res['nanid']==2){
						$zhongsum-=$datifs;
						$datisum--;
						$zongfen-=$datifs;
						$tid[]=$sj;
					}
					if($res['nanid']==3){
						$yisum-=$datifs;
						$datisum--;
						$zongfen-=$datifs;
						$tid[]=$sj;
					}
					if($res['keyid']==1)
						$key-=$datifs;
				}
			}
		}
		return view('super',['keres'=>$keres,'sum'=>$sum]);
	}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
========================================== 系统名称:ISchool随机抽题考试系统 系统版本:V3.7.1 系统开发:方卡在线 技术支持:http://www.fangka.net/ 技 术 QQ:861118936 联系邮箱:admin@fangka.net ========================================== 程序定位 本程序定位于学校或企业单位进行非严格要求的随机抽题考试,系统采用考试项目数据库独立方式,虽采用了ACCESS数据库,但能支持长期的考试要求,至少能支撑2000次以上5000人规模(非同时考试)的在线考试任务。 默认信息 默认管理员用户名密码都为admin 架设说明 请见用户手册:http://pan.baidu.com/share/link?shareid=136678&uk=1980501779 专题介绍站点:http://ks.ifangka.com/ 收费版请见:http://ks.ifangka.com/buy.html 安装注意事项 1.请先看下用户手册中的内容 2.请确认本地测试环境能够很好的运行ASP+ACCESS程序 3.请确认给予本考试系统所在目录IIS用户或者everyone可写权限!! 程序特点 1.考试项目数据库独立存在,实现高考生数据量承载。 2.考题按格式简单录入,减少了录入难度。 3.抽题规则自定义,自由设定考题形成规则,通过分类控制可以实现不同类型的考试 4.主观题简单阅卷,主观题阅卷方式简单高效,充分降低阅卷难度 5.导入导出设置,考生采用一考一导模式,导入结构简单,考试成绩和主观答题均可进行导出 6.支持考试时间设置,系统时间确定,保证无法进行时间作弊 7.抽题后保持抽题结果选择,如选定考题固定,则该用户抽题完成后即使退出重新登录也会保持题目 8.支持练习模式,答题后即可看到答题结果并且可以查错 更新日志: V3.7.1(20130315) 1.修正数个BUG V3.7.0(20121207) 1.系统整体优化改进 V3.6.7(20111025) 1.增加考试时长记录 2.考生进入页面改良 3.主观题评分页面,增加是否评分筛选 4.内部结构优化 V3.6.6(20110921) 1.主观题打分过滤无主观题评分的考试 2.增加后台表格操作行背景变色 3.优化考生导入提示 4.修正已知BUG V3.6.5(20110830) 1.考试情况查看考生增加分页 2.试题列表试题题干缩略,便于查阅 3.加强试题录入格式校验 V3.6.4(20110823) 1.增加考试强制提交冗余时长设置功能 2.完善操作执行超时提示 3.出现弹出框时自动回到页面顶部 4.修改部分提示,使其更人性化 5.修改操作成功提示,避免遮挡 V3.6.3(20110816) 1.试题列表增加试题点击预览功能 2.导出内容改为先生成文件后导出,完美解决迅雷拦截问题 3.增加重考次数限制功能 4.修正考生无法修改的问题 V3.6.2(20110809) 1.增加试题导入题干和选项换行符“[换行]” 2.增加试题导入题干结束符“|题干结束|”(独立一行),支持多行题干导入 3.增加试题库翻页功能 4.增加切换栏目自动回到页面顶部功能 V3.6.1(20110714) 1.增加安装部分自动跳转 2.拆分前台考生文件,为加入新界面方案做准备 3.重新加入试题导出 4.细节修正 V3.6.0(20110701) 1.暂时取消试题导出功能(目前的试题导出存在部分问题,后续会重新增加) 2.主观题评分增加js段判断分值是否合法 3.试题库管理增加题库题量统计显示 4.考试项目增加及格分数选项 5.考试情况页面增加及格率显示 6.改良初始化提示便于理解 V3.5.9(20110524) 1.修正安装时未显示友好提示 2.修正考生登录页CSS兼容 3.修正后台各功能检索多浏览兼容 4.成绩列表增加考试IP、考试时间显示 5.细节修正 V3.5.8(20110415) 1.重写安装部分 2.增加管理员cookies前缀 3.测试试卷增加打印按钮 4.修正已知BUG V3.5.7(20110309) 1.增加试题导出功能 2.增加考试情况人员名单查看 3.增加考试情况考试中名单 V3.5.6(20110301) 1.增加准考IP段限制功能 2.增加“考试中”状态显示 3.模块化考试部分代码 4.修正考生退出信息不对称的问题 V3.5.5(20110123) 1.增加试题复制、移动到其他题库功能 2.增加考试项目注意事项选项 3.改良安装页面 4.修正导出主观题出错的BUG V3.5.4(20101223)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值