pascalabcnet/bin/Lib/Tasks1Begin.pas

235 lines
7.5 KiB
ObjectPascal
Raw Normal View History

unit Tasks1Begin;
uses LightPT;
var AllTaskNames: array of string;
procedure CheckTaskT(name: string);
begin
ClearOutputListFromSpaces;
case name of
'Var_1': begin
CheckData(InitialOutput := |cInt|);
CheckOutput(3,32);
end;
'Var_2': begin
CheckData(InitialOutput := cInt*2);
CheckOutput(3,4,20,45);
end;
'Var_4': begin
CheckData(Input := Empty);
CheckOutput(25,3.14,100,0.75);
end;
'Var_5': begin
TaskResult := Solved;
end;
'Var_6': begin
CheckData(Input := Empty);
CompareTypeWithOutput(cStr,cStr,cStr,cStr,cInt,cInt);
end;
'Calculations1': begin
CheckData(InitialOutput := |cInt|*3);
CheckOutput(35,65,35+65,35*65);
end;
'Calculations2': begin
CheckData(InitialOutput := |cInt,cInt,cStr,cInt|);
CheckOutput(35,65,cStr,35+65,cStr,35*65); // Это круто - можно перемежать типы и значения!
end;
'Calculations3': begin
CheckData(InitialOutput := |cStr,cInt,cInt,cInt|);
CheckOutput(cStr,3,4,5,cStr,3+4+5);
end;
'Calculations4': begin
CheckData(InitialOutput := |cStr,cInt|);
CheckOutput(cStr,253,cStr,253/10,cStr,253/100);
end;
'Read1': begin
CheckData(InitialInput := |cInt,cInt|);
TestCount := 5;
GenerateTestData := tnum -> begin
var (a,b) := Random2(1,100);
InputList.AddTestData(|a,b|);
end;
CheckOutput(Int(0)+Int(1));
end;
'Read2': begin
FilterOnlyNumbersAndBools;
CheckData(Input := |cRe,cRe|);
var S := Re(0)*Re(1);
var P := 2*(Re(0)+Re(1));
TestCount := 10;
GenerateTests(10, tRe(1,10,digits := 0)*2);
CheckOutputSilent(S,P); // Все сообщения ColoredMessage гасятся
if TaskResult <> Solved then // Это прикольный способ - проверить, что вывел то, но не в том порядке!
CheckOutput(P,S);
end;
'Task1': begin
FilterOnlyNumbersAndBools;
CheckData(Input := |cRe,cRe|);
var S := Re(0)+Re(1);
var P := Re(0)*Re(1);
GenerateTests(10,tRe(1,10,0)*2); // Это когда нет особых случаев
CheckOutputSilent(S,P); // Все сообщения ColoredMessage гасятся
if TaskResult <> Solved then
CheckOutput(P,S);
end;
'Task2': begin
FilterOnlyNumbersAndBools;
CheckData(Input := |cRe|);
var x := Re(0);
TestCount := 10;
GenerateTestData := tnum -> begin // это когда есть особый случай
var a: real;
if tnum = 5 then
a := RandomReal(1,100,digits := 0)
else a := RandomReal(1,10,digits := 0);
InputList.AddTestData(|a|);
end;
CheckOutput(x*x,x*x*x,x*x*x*x);
end;
'Intermediate1': begin
CheckData(Input := Empty);
CheckOutput(27);
end;
'Intermediate2': begin
CheckData(Input := Empty);
CheckOutput(2.5);
end;
'Swap1':
begin
FilterOnlyNumbers;
CheckData(Input := Empty);
CheckOutput(666.666, 555.555);
end;
'Swap2': CheckOutput('Иванов', 'Петров', 'Петров', 'Иванов');
'AssignAdd1':
begin
FilterOnlyNumbers;
CheckData(InitialOutput := |cInt, cInt|);
CheckOutput(Arr(1..9));
end;
'AssignAdd2':
begin
FilterOnlyNumbers;
CheckInitialOutput(cInt, cInt, cInt);
CheckOutput(1, 2, 4, 7, 11, 16, 22, 29, 37, 46);
end;
'AssignMult':
begin
FilterOnlyNumbers;
CheckInitialOutput(cInt, cInt);
CheckOutput(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024);
end;
'AssignMultAddGame':
begin
FilterOnlyNumbers;
CheckData(Input := Empty);
if OutputList.Count <> 1 then
begin
ColoredMessage('Вы должны вывести ровно одно значение');
exit;
end;
TaskResult := TaskStatus.PartialSolution;
if CompareValues(OutputList[0],18) then
exit;
if CompareValues(OutputList[0],33) then
ColoredMessage('Молодец! Теперь получи в переменной a значение 67',MsgColorGray)
else CheckOutput(67);
end;
'AssignMultAddКруги':
begin
FilterOnlyNumbers;
CheckData(Input := Empty);
CheckOutput(38);
end;
'Sqrt1':
begin
FilterOnlyNumbers;
CheckData(Input := Empty);
if OutputList.Count <> 1 then
begin
ColoredMessage('Вы должны вывести ровно одно значение');
exit;
end;
TaskResult := TaskStatus.PartialSolution;
if CompareValues(OutputList[0],Sqrt(2)) then
exit;
if CompareValues(OutputList[0],Sqrt(3)) then
ColoredMessage('Молодец! Теперь получи значение Sqrt(5)',MsgColorGray)
else if CompareValues(OutputList[0],Sqrt(5)) then
ColoredMessage('Молодец! Теперь получи значение Sqrt(7)',MsgColorGray)
else if CompareValues(OutputList[0],Sqrt(7)) then
CheckOutput(Sqrt(7)) // Верно
else CheckOutput(Sqrt(7)) // Неверно
end;
'Abs_1':
begin
FilterOnlyNumbers;
CheckData(Input := Empty);
// Просто поясняющее сообщение. Ничего не проверяется
ColoredMessage('Abs - функция, убирающая знак числа. В математике известна как модуль числа', MsgColorGray);
end;
'Abs_2_AB':
begin
FilterOnlyNumbers;
CheckData(InitialOutput := cInt * 6);
CheckOutput(5,3,2,-1,5,6,7,4,3,9,18,9);
end;
'SwapProc1':
begin
FilterOnlyNumbers;
CheckData(Input := Empty);
CheckOutput(3,1,7,5,1,3,5,7);
end;
'SwapProc2':
begin
FilterOnlyNumbers;
CheckData(Input := Empty);
CheckOutput(1,2,3,4,2,1,3,4,2,3,1,4,2,3,4,1);
end;
'DivMod01':
begin
FilterOnlyNumbers;
CheckData(Input := Empty);
// Просто поясняющее сообщение
ColoredMessage('Перепишите результат в тетрадь', MsgColorGray);
end;
'DivMod02':
begin
FilterOnlyNumbers;
CheckData(InitialOutput := |cInt|*6);
CheckOutputAfterInitial(3,1,5,1,7,1);
//ColoredMessage('Если x - четно, то x mod 2 = 0', MsgColorGray);
end;
'DivMod03':
begin
TaskResult := PartialSolution;
FilterOnlyNumbers;
CheckData(Input := Empty);
if OutputList.Count = 6 then
begin
if CompareValues(OutputList[0],37) then // Здесь используется CompareValues, а не CompareWithOutput т к логика сложнее
ColoredMessage('Измените значение a на 123', MsgColorGray)
else if CompareValues(OutputList[0],123) then
ColoredMessage('Верно. Проверьте еще значение a = 12345', MsgColorGray)
else if CompareValues(OutputList[0],12345) then
begin
ColoredMessage('Верно!', MsgColorGreen);
TaskResult := Solved;
end;
end;
end;
end;
end;
initialization
CheckTask := CheckTaskT;
AllTaskNames := Arr('Var_1','Var_2','Var_4','Var_5','Var_6',
'Calculations1','Calculations2','Calculations3','Calculations4',
'Read1','Read2','Task1','Task2','Intermediate1','Intermediate2','Swap1','Swap2',
'AssignAdd1','AssignAdd2','AssignMult','AssignMultAddGame','AssignMultAddКруги',
'Sqrt1','Abs_1','Abs_2_AB','SwapProc1','SwapProc2','DivMod01','DivMod02','DivMod03' );
finalization
end.