zoukankan      html  css  js  c++  java
  • 抽题系统核心。

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

    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]);
    	}
    
    博客园:https://www.cnblogs.com/huixincode
    如果此文章对您有所帮助记得打赏哦,一分也是对我的支持和鼓励,谢谢!
    转载文章请务必保留出处和署名,谢谢!
  • 相关阅读:
    数据绑定表达式语法(Eval,Bind区别)
    使用博客园的第一件事 自定义主题
    sql2000 跨服务器复制表数据
    使用UpdatePanel 局部刷新出现中文乱码的解决方法!!
    MMC不能打开文件MSC文件
    sql 日期 、时间相关
    loaded AS2 swf call function in AS3 holder
    Rewrite the master page form action attribute in asp.net 2.0
    100万个不重复的8位的随机数
    flash 中实现斜切变型
  • 原文地址:https://www.cnblogs.com/shx1024/p/11931255.html
Copyright © 2011-2022 走看看