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;

Назад на стр. 055-066-4  Содержание