好,我们现在讨论在技术上如何实现。假设有这样一个答案表,字段分别是:ID(ID)、TM(题目ID)、DA(答案)、CX(本题答案序列号)、DF1(答案分)、DF2(速度分)、CF(答案重复)、USR(用户名)、TIM(提交时间),判断答案重复在前端进行,用存储过程计分,讨论一下计分存储过程的丝路(先不写过程) 好的!基于你提供的答案表结构和需求,我们可以设计一个存储过程来实现计分逻辑。以下是实现思路的详细讨论: 存储过程设计思路:输入参数: 题目ID(TM):用于筛选当前题目的答案记录。 速度总分(固定为30分):用于计算速度分间距。 步骤: 步骤1:统计当前题目的答案总数,并计算速度分间距。 步骤2:遍历每个答案,计算答案数量得分(DF1)。 步骤3:根据答案的序列号(CX)计算速度得分(DF2)。 步骤4:判断是否为首次提交,如果是,则加5分。 步骤5:更新答案表中的得分字段(DF1、DF2、CF)。 关键逻辑: 答案数量得分(DF1): 根据题目答案总数动态调整: 1个答案:20分。2个答案:10分。3个答案:7分。4个及以上答案:6分。 速度得分(DF2): 速度分间距 = 30 / 答案总数。 速度得分 = 30 - (序列号 - 1) * 间距。 首次提交: 如果当前答案是该答案的第一个提交,则加5分。 可以通过DA字段判断是否有重复答案。 输出: 更新答案表中的DF1、DF2、CF字段。 伪代码逻辑:sql 复制 CREATE PROCEDURE CalculateScores(@TM INT)ASBEGIN -- 步骤1:统计当前题目的答案总数 DECLARE @TotalAnswers INT; SELECT @TotalAnswers = COUNT(*) FROM 答案表 WHERE TM = @TM; -- 计算速度分间距 DECLARE @SpeedInterval FLOAT; SET @SpeedInterval = 30.0 / @TotalAnswers; -- 步骤2:遍历每个答案,计算得分 DECLARE @CurrentID INT, @CurrentDA NVARCHAR(MAX), @CurrentCX INT, @CurrentUser NVARCHAR(MAX); DECLARE @DF1 INT, @DF2 FLOAT, @CF INT; DECLARE AnswerCursor CURSOR FOR SELECT ID, DA, CX, USR FROM 答案表 WHERE TM = @TM ORDER BY CX; OPEN AnswerCursor; FETCH NEXT FROM AnswerCursor INTO @CurrentID, @CurrentDA, @CurrentCX, @CurrentUser; WHILE @@FETCH_STATUS = 0 BEGIN -- 计算答案数量得分(DF1) IF @TotalAnswers = 1 SET @DF1 = 20; ELSE IF @TotalAnswers = 2 SET @DF1 = 10; ELSE IF @TotalAnswers = 3 SET @DF1 = 7; ELSE SET @DF1 = 6; -- 计算速度得分(DF2) SET @DF2 = 30 - (@CurrentCX - 1) * @SpeedInterval; -- 判断是否为首次提交 IF NOT EXISTS (SELECT 1 FROM 答案表 WHERE TM = @TM AND DA = @CurrentDA AND CX < @CurrentCX) SET @CF = 5; -- 首次提交加5分 ELSE SET @CF = 0; -- 更新答案表 UPDATE 答案表 SET DF1 = @DF1, DF2 = @DF2, CF = @CF WHERE ID = @CurrentID; FETCH NEXT FROM AnswerCursor INTO @CurrentID, @CurrentDA, @CurrentCX, @CurrentUser; END; CLOSE AnswerCursor; DEALLOCATE AnswerCursor;END; 这个存储过程的设计思路清晰且易于实现,你觉得如何?如果有进一步的需求或调整,可以继续讨论!
|