谁有题库随机抽题的源程序(200分)

  • 主题发起人 主题发起人 liaoyangming
  • 开始时间 开始时间
L

liaoyangming

Unregistered / Unconfirmed
GUEST, unregistred user!
谁有题库随机抽题的源程序
 
查查前面,有人讨论过这个问题.
 
为每道题编号(惟一索引),题号不一定要连续;
取得编号最大值,取得最小值;
产生一个介于二者之间的随机数;
查找第一个题号大于等于该值的题(根据数据库不同使用TOP 1 或 LIMIT 1)
会了吧!
 
看看下面这个.也许对你有帮助.
http://www.delphibbs.com/delphibbs/dispq.asp?lid=698884
 
能否提供些资料看看
thanks
有源程序最好
可以加分
 
呵,不用源程序,这句帮你搞定
库中有个ID一个要连续,否则可能会出空值
然后后就这样
for i:=0 to N do
begin
query1.close;
query1.sql.text:='select * from table where id=( CAST(RAND() * N AS int))'
query1.open;
下面是赋值,略过,记住N一定要是数值哟
.......
end;
 
仅供参考,这是我的题库系统中的节选(因保密问题述不能公布):
for k:=1 to zhangN do
begin
BMtemp:=IntToStr(k);
for m:=1 to tixN do
begin

TXTemp:=IntToStr(m);
for d := 1 to 3 do
begin
dmod.Query1.Close;
dmod.Query1.SQL.Clear;
dmod.Query1.SQL.Add('Select * From zhub');//zhub--主库
NDtemp := IntToStr(d);
dmod.Query1.SQL.Add('Where BM like :Q1 and TX=:Q2 and D=:like :Q3 ');
dmod.Query1.ParamByName('Q1').AsString := BMtemp + '%';
dmod.Query1.ParamByName('Q2').AsString :=TxTemp;
dmod.Query1.ParamByName('Q3').AsString := NDtemp;
end;
if dmod.Query1.Prepared = False then
dmod.Query1.Prepare;
dmod.Query1.Open;
st := dmod.Query1.RecordCount;
Ntemp := NumN[k, m, d];//k-章,m-题型,d-难度,应抽取得的题数
s0 := s0 + Ntemp;
f := 1;
while (f <= Ntemp) and (st > 0) do
begin
//
okit := true;
s1 := 0;
while okit and (s1 < 150) do
begin
Num := Random(st) + 1;
dmod.Query1.first;
dmod.Query1.MoveBy(Num - 1);
checkit;//判断所取题是否符合要求,返回okit,true or false
s1 := s1 + 1;
end;
if si>=150 then
begin
.......
end;

end;
end;
end;
 
我正在做这个毕业设计,两个人和做的,如果你用做商业,我不能保证软件没问题,
如果你是拿来骗骗老师或者小MM,我可以把数据库维护这部门先发给你,这部分是我
实现的,等过段时间,我们把程序拼好了,可以全部发给你,请留下地址。
 
to zhao0707
我的地址为zhaoliao@163.com
thank
 
to zhao0707
我的地址为wokill@x263.com
thank
 
我有个模块,现成的代码,随机生成试题题号,保证题目不能重复,
并且可以按照不同题型的比例出题
谁想要?
 
to problemkid
给我一份全分加上
 
My
linsb3031@0451.com
谢谢!
 
好吧,你给分吧
 
给你们发EMAIL太费力,我比较懒,呵呵,特此粘贴,大家共享
名称:考试系统随机出题
procedure TdmTest.RandomGetQuestion;
var
iQuestionID:integer;
cQuestionID:string;
i, j, m:integer;
QuestionRate:integer;
QuestionType:string;
QuestionCount:integer;
IsRepeat:boolean;
Buffer1:array [0..99] of integer;
//100道题目
Buffer2:integer;
begin
//以下为在题库中随机取100道题

dmTest.tblST.Open;
//打开试题库
dmTest.tblTK.Open;
//打开考试题库
Buffer2:=0;

dmSystem.vtbCTBL.First ;
//出题的题型数据表打开移动到第一条记录
for i:=1 to dmSystem.vtbCTBL.RecordCount do
//针对每种题型进行循环
begin
QuestionType:=dmsystem.vtbCTBL.FieldByName('c_TX').AsString;
//取得题型
QuestionRate:=dmsystem.vtbCTBL.FieldByName('N_BL').AsInteger;
//取得该题型比例
tblTK.Filtered:=false;
tblTK.Filter:='C_TX='''+QuestionType+'''';
tblTK.Filtered:=true;
//按照题型过滤题库
QuestionCount:=dmTest.tblTK.RecordCount;
//过滤后题库的题目数量
for j:=1 to QuestionRate do
//按照比例数量生成题号
begin
//取随机数
Repeat
IsRepeat:=false;
iQuestionID:=RandomRange(1,QuestionCount);
cQuestionID:=IntToStr(iQuestionID);
Buffer1[j]:=iQuestionID;
for m:=1 to j-1 do
begin
if Buffer1[m]=Buffer1[j] then
begin
IsRepeat:=true;
Break;
end ;
end;
until
IsRepeat=false;
//查找和随机数对应的题号的试题
tblTK.locate('n_th;c_tx;n_yy',VarArrayOf([iQuestionID,QuestionType,I_LANGUAGE]),[]);
//写进本地考试试题表
with tblST do
begin
Append;
FieldByName('N_YY').AsInteger:=I_LANGUAGE;
//语种
FieldByName('N_XH').AsInteger:=Buffer2+j;
//考试题目序号(1--100)
FieldByName('N_TH').AsInteger:=iQuestionID;
//题库中号码
FieldByName('C_TX').AsString:=QuestionType;
//题目类型
.......
Post;
end;
end;
dmSystem.vtbCTBL.Next;
//下一题型
Buffer2:=Buffer2+QuestionRate;
//考试题库指针位置改变,下一题目从该位置开始
end;
tblST.Close ;
tblTK.Close ;
end;


说明:
1 该考试系统为100道题目,每种题型所占百分比为1---100之间的整数,保存在题型的比例表中
2 tblst 为考试试题库,每次动态产生100题,下次考试重新刷新
3 tbltk 为试题题库,每次试题从这个库中提取
4 dmSystem.vtbCTBL 为一个数据集合,存储各种题型的名称和所占比例
 
该给分了吧,这个算法很不错,我感觉这个模块200分有点少了
:(
 
linsb老师您好,我想写一套信息技术试题考试系统,让自己的学生使用,但是我才开始学习Delphi,
如果老师能够送我源代码,将感激不尽。分数问题好商量,我只有最低的210分,如果您需要,我把所有
的分数都送上,另外,我需要能够有程序自己写加密类型的题库。
如果方便,请联系我: bcg2002@163.com 谢谢!
 
to problemkid:
tblst tbltk 这两个表的结构是如何建立和相关联的
你有全部源程序(包括数据库)吗?我共有500分可以全部送上
 
后退
顶部