|
Delphi: Тест для Большого Дяди на все 100! Лозовский Александр Xakep, номер #055, стр. 055-066-5 Post Mortem Напоследок я хочу рассказать тебе один интересный случай из практики. Несколько месяцев назад мне пришлось сдавать тест. Сделан он был в далеком 92-ом в каком-то питерском институте и имел прекрасный борландовский интерфейс. Так вот, вместо заявленных 20 я ответил на 40 вопросов и на несколько ситуационных задач, получив в итоге 0.4 балла из 10 возможных. Я знал лучше, что и подтвердил стоявший за моей спиной препод. Так как же удалось профессиональным кодерам написать такую глючную прогу? Проблема, видимо, в ее простоте :), поэтому автор слегка расслабился, что едва не обернулось для меня весьма печально. Мораль: читай свой исходник. Как бы банально это ни звучало. Листинг procedure TForm1.BitBtn1Click procedure TForm1.BitBtn1Click(Sender: TObject); var n, i: integer; userans, corranswer: string; begin IF Edit1.Text<> '' then //Если хоть что-то написано, то begin n:=1; i:=1; //Инициализируем переменные totvarans:= DBMemo1.Lines.Count; //Сколько вариантов totcorrcount:= length(ClientDataSet1CorrectAnswer.Value);//Сколько из них правильных userans:= Edit1.text;//Возьмем вариант юзера corranswer:= ClientDataSet1CorrectAnswer.Value;//И возьмем ПРАВИЛЬНЫЙ вариант :) balls:=0; //Пока 0 баллов REPEAT //Начнем последовательно сравнивать - каждый вариант юзера со всеми правильными IF userans[i]=corranswer[n] then //Если правильно, то begin Inc(i);//Проверим следующий пользовательский n:=1; //Начиная с первого символа правильного ответа balls:= balls+(100 div totcorrcount); //Вычислим, скольких баллов достоин end else //А если неправильно begin IF n<>length(corranswer) then INC(n) else //если правильные кончились, значит юзер //не прав и этот ответ не засчитывается. Если не кончились, то сравним со следующим begin INC (i); //Перейдем к следующему варианту n:=1; //Сравнивать будем с первым правильным end; end; UNTIL i>length(userans); //Завяжем, если кончатся все варианты TotalBalls:= totalballs + balls; //Подсчитаем итоговое число баллов Inc(lim); //Еще один вопрос отвечен... IF lim=limit then //Если лимит достигнут, то ShowMessage ('Вы набрали '+ inttostr((totalballs*100) div (limit*100))+' из 100 возможных!') //Пересчитаем общее число баллов на 100 и выдадим заключение else Clientdataset1.Next; //Иначе перейдем к следующему вопросу end; //Здесь ты можешь поставить else на случай пустого Edit’а end; |