pascalabcnet/bin/Lib/Tasks1BoolIfCase.pas

436 lines
14 KiB
ObjectPascal
Raw Permalink Normal View History

unit Tasks1BoolIfCase;
uses LightPT;
var AllTaskNames: array of string;
procedure CheckTaskT(name: string);
begin
ClearOutputListFromSpaces;
case name of
'Types1': begin
CheckData(Empty);
CheckOutput(cInt,cRe,cStr);
end;
'Types2': begin
CheckData(Input := |cInt,cRe,cStr|);
CheckOutput(Int(0),Re(1),Str(2));
end;
'Types3': begin
CheckData(Empty);
CheckOutput(cInt,cRe,cStr);
end;
'Boo1': begin
end;
'Boo2': begin
CheckOutput(False,True);
if TaskResult = BadSolution then
TaskResult := InitialTask
end;
'Boo3': begin
FilterOnlyNumbersAndBools;
CheckData(Empty);
CheckOutput(54,54 mod 3 = 0,54,54 mod 3 = 5)
end;
'Boo4': begin
// Задачник
end;
'Boo5_And_Or': begin
FilterOnlyNumbersAndBools;
CheckData(Empty);
CheckOutput(cBool,cBool);
end;
'Boo7': begin
FilterOnlyNumbersAndBools;
CheckOutput(True);
//if TaskResult = BadSolution then
// TaskResult := InitialTask
end;
'If1Пароль': begin
CheckData(InitialInput := |cInt|);
//if int(0)=777 then // и без этого работает. Тёмное дело...
CheckOutput('Пароль правильный'); // Когда по одной ветке ничего не выводится, это сложная ситуация. Это не проконтролируешь
end;
'If2Пароль': begin
CheckData(Input := |cInt|);
TestCount := 10;
GenerateTestData := tnum -> begin
var a := Random(1,1000);
if tnum = 5 then
a := 777;
InputList.AddTestData(|a|);
end;
if int(0)=777 then
CheckOutput('Пароль правильный')
else CheckOutput('Попытка взлома системы!');
end;
'If3ПроверкаИмени': begin
CheckData(InitialInput := |cStr|);
TestCount := 10;
GenerateTestData := tnum -> begin
var a := Arr('Саша','Петя','Вася','Оля').RandomElement;
if tnum = 5 then
a := 'Саша';
InputList.AddTestData(|a|);
end;
if Str(0)='Саша' then
CheckOutput('Привет Саша! Я тебя знаю')
else CheckOutput('Я тебя не знаю');
end;
'If4Четное': begin
CheckData(InitialInput := |cInt|);
GenerateTests(20,|tInt(1,100)|);
if Int(0) mod 2 = 0 then
CheckOutput(Int(0),'Четное')
else CheckOutput(Int(0),'Нечетное');
end;
'If5ЛогинПарольAnd': begin
CancelMessagesIfInitial := False; // Это важнейший флаг.
// Обычно если запускается программа с Initial вводом-выводом, то подсказки не выводятся
// А здесь выводятся - ученика сразу настраивают, что ему надо вывести
CheckData(InitialInput := |cStr,cInt|);
TestCount := 10;
GenerateTestData := tnum -> begin
var a := Arr('Angel','Demon','Ogr').RandomElement;
var p := Arr(777,666,555).RandomElement;
if tnum = 5 then
(a,p) := ('Angel',777);
InputList.AddTestData(|object(a),object(p)|); // Приведение к object - это приём, позволяющий записывать в тестовые данные разные типы
end;
if (Str(0) = 'Angel') and (Int(1) = 777) then
CheckOutput('Вход разрешен')
else CheckOutput('Попытка взлома системы!');
end;
'If6ЛогинOr': begin
CheckData(InitialInput := |cStr|);
TestCount := 10;
GenerateTestData := tnum -> begin
var a := Arr('Angel','Demon','Alex','John','Olga','Iris').RandomElement;
if tnum = 5 then
a := 'Angel'
else if tnum = 6 then
a := 'Demon';
InputList.AddTestData(a);
end;
if (Str(0) = 'Angel') or (Str(0) = 'Devil') then
CheckOutput('Вход разрешен')
else CheckOutput('Попытка взлома системы!');
end;
'If7Not': begin
FilterOnlyNumbersAndBools;
CheckOutput(True,False);
if TaskResult = BadSolution then
TaskResult := PartialSolution;
end;
'If8Зима': begin
CheckData(Input := |cInt|);
var m := Int(0);
TestCount := 10;
GenerateTestData := tnum -> begin
var a := Random(1,12);
case tnum of
5: a := 12;
6: a := 1;
7: a := 2;
end;
InputList.AddTestData(a);
end;
CheckOutput(m in |12,1,2|? 'Зима':'Не зима')
end;
'If8ЧетДвузнач': begin
CheckData(Input := |cInt|);
var x := Int(0);
TestCount := 20;
GenerateTestData := tnum -> begin
var x := Random(5,15);
case tnum of
5: x := 9;
6: x := 10;
7: x := 99;
8: x := 100;
end;
InputList.AddTestData(x);
end;
var b := x.IsEven and (x in 10..99);
if b then
CheckOutput('Это чётное двузначное')
else CheckOutput();
end;
'If9ВДиапазоне': begin
CheckData(Input := |cInt|);
var x := Int(0);
var b := x in 3..5;
TestCount := 20;
GenerateTestData := tnum -> begin
var x := Random(1,5);
case tnum of
5: x := 2;
6: x := 3;
7: x := 5;
8: x := 6;
end;
InputList.AddTestData(x);
end;
if b then
CheckOutput('экзамен сдан')
else CheckOutput('экзамен не сдан')
end;
'If9НеВДиапазоне': begin
CheckData(Input := |cInt|);
var H := Int(0);
TestCount := 20;
GenerateTestData := tnum -> begin
var x := Random(100,200);
case tnum of
5: x := 149;
6: x := 150;
7: x := 190;
8: x := 191;
end;
InputList.AddTestData(x);
end;
var b := H not in 150..190;
if b then
CheckOutput('Необычный рост')
else CheckOutput('Норма')
end;
'Minmax_2': begin
CheckData(InitialOutput := |cInt|);
CheckOutput(3,5,3,5,6,6);
end;
'ВложенныеIf2': begin
CheckData(Input := |cStr,cInt|);
TestCount := 10;
GenerateTestData := tnum -> begin
var name := Arr('Alex','Bob','John').RandomElement;
var pass := Arr(555,666,777).RandomElement;
case tnum of
1: (name,pass) := ('Alex',666);
2: (name,pass) := ('Alex',777);
3: (name,pass) := ('Bob',666);
4: (name,pass) := ('Bob',444);
end;
InputList.AddTestData(name);
InputList.AddTestData(pass);
end;
if (Str(0) = 'Alex') then
if (Int(1) = 666) then
CheckOutput('Вход разрешен')
else CheckOutput('Пароль неверен')
else CheckOutput('Логин неверен');
end;
епочечныеIf1': begin
CheckData(Input := |cInt|);
GenerateTests(20,|tInt(1,4)|);
case Int(0) of
1: CheckOutput('Зима');
2: CheckOutput('Весна');
3: CheckOutput('Лето');
4: CheckOutput('Осень');
end;
end;
епочечныеIf2': begin
CheckData(Input := |cInt|);
GenerateTests(20,|tInt(2,5)|);
case Int(0) of
2: CheckOutput('неудовлетворительно');
3: CheckOutput('удовлетворительно');
4: CheckOutput('хорошо');
5: CheckOutput('отлично');
end;
end;
//'ЦепочечныеIf3': begin end;
епочечныеIf4': begin
CheckData(Input := |cStr|);
TestCount := 4;
GenerateTestData := tnum -> begin
var word: string;
case tnum of
1: word := 'черное';
2: word := 'высокий';
3: word := 'худой';
4: word := 'хорошо';
end;
// жуткое исключение если в InputList ничего не добавить!!!
InputList.AddTestData(word);
end;
case Str(0) of
'черное' : CheckOutput('белое');
'высокий': begin
CheckOutputSilent('низкий'); // о это прикольно. Это когда возможны несколько решений. Вначале проверяем одно, потом другое
if TaskResult = TaskStatus.BadSolution then
CheckOutput('невысокий');
end;
'худой' : begin
CheckOutputSilent('толстый');
if TaskResult = TaskStatus.BadSolution then
CheckOutputSilent('полный');
if TaskResult = TaskStatus.BadSolution then
CheckOutput('жирный');
end;
'хорошо' : CheckOutput('плохо');
else CheckOutput('');
end;
end;
епочечныеIf5': begin
CheckData(Input := |cInt|);
//GenerateTests(20,tInt(1,6)*1);
GenerateTests(1,2,3,4,5,6);
// Хотелось бы генерировать неслучайные тесты из некоторого диапазона
// Непонятно, как совмещать несколько параметров
case Int(0) of
1,5: CheckOutput(1);
3,4: CheckOutput(2);
2,6: CheckOutput(3);
end;
end;
'If0Situations1': begin
CheckData(Input := |cInt|);
GenerateTests(10,tInt(-1,1)*1);
if Int(0)<0 then
CheckOutput('отрицательное')
else if Int(0)=0 then
CheckOutput('равно 0')
else CheckOutput('положительное')
end;
'Holidays': begin
CheckData(Input := |cInt,cInt|);
var (d,m) := (Int(0),Int(1));
//GenerateTests(список кортежей)
//GenerateTests(список значений)
GenerateTests((1,1),(12,12),(23,2),(8,3),(1,5),(9,5),(12,6),(4,11),(7,13));
if (d,m) = (1,1) then
CheckOutput('Новый год')
else if (d,m) = (23,2) then
CheckOutput('День защитника Отечества')
else if (d,m) = (8,3) then
CheckOutput('Международный женский день')
else if (d,m) = (1,5) then
CheckOutput('Первомай')
else if (d,m) = (9,5) then
CheckOutput('День Победы')
else if (d,m) = (12,6) then
CheckOutput('День России')
else if (d,m) = (4,11) then
CheckOutput('День народного единства')
//else CheckOutput('');
end;
'IfXSituations2': begin
CheckData(Input := |cInt|);
GenerateTests(2,3,4,5,6);
if Int(0) < 3 then
CheckOutput('x меньше 3')
else if Int(0) in 3..5 then
CheckOutput('x от 3 до 5')
else if Int(0) > 5 then
CheckOutput('x больше 5')
end;
'IfDiscriminant': begin
CheckData(Input := |cRe,cRe,cRe|);
GenerateTests(20,tRe(-3,3,digits := 1)*3);
var (a,b,c) := (Re(0),Re(1),Re(2));
var d := B*B-4*A*C;
if d<0 then
CheckOutput('Корней нет')
else if d=0 then
CheckOutput('Один корень')
else CheckOutput('Два корня')
end;
'Case1': begin
CheckData(InitialInput := |cInt|);
GenerateTests(1,2,3,4,5,6,7);
case Int(0) of
1: CheckOutput('Понедельник');
2: CheckOutput('Вторник');
3: CheckOutput('Среда');
4: CheckOutput('Четверг');
5: CheckOutput('Пятница');
6: CheckOutput('Суббота');
7: CheckOutput('Воскресенье');
end;
end;
'Case2': begin
CheckData(InitialInput := |cInt|);
GenerateTests(1,2,3,4,5,6);
case Int(0) of
2: CheckOutput('Двойка');
3: CheckOutput('Тройка');
4: CheckOutput('Четверка');
5: CheckOutput('Пятерка');
else CheckOutput('Не оценка');
end;
end;
'Case3': begin
CheckData(InitialInput := |cInt|);
GenerateTests(1,2,3,4,5,6,7,8,9,10,11,12);
case Int(0) of
12,1,2: CheckOutput('Зима');
3..5: CheckOutput('Весна');
6..8: CheckOutput('Лето');
9..11: CheckOutput('Осень');
end;
end;
'Case4': begin
CheckData(InitialInput := |cInt|);
GenerateTests(1,2,3,4,5,6,7,8,9,10,11,12);
case Int(0) of
4,6,9,11: CheckOutput(30);
2: CheckOutput(28);
else CheckOutput(31);
end;
end;
'Diapason1_Case': begin
CheckData(InitialInput := |cInt|);
GenerateTests(20,tInt(80,230)*1);
case Int(0) of
80..119: CheckOutput('Карлик');
120..149: CheckOutput('Низкий');
150..179: CheckOutput('Средний');
180..230: CheckOutput('Высокий');
end;
end;
'TranslateRobot': begin
CheckData(InitialInput := |cStr|);
GenerateTests('Left','Right','Up','Down');
case Str(0) of
'Left': CheckOutput('Влево');
'Right': CheckOutput('Вправо');
'Up': CheckOutput('Вверх');
'Down': CheckOutput('Вниз');
end;
end;
'Комнаты': begin
CheckData(InitialInput := |cInt|);
GenerateTests(1,2,3,4,5,6);
case Int(0) of
1,5: CheckOutput(1);
3,4: CheckOutput(2);
2,6: CheckOutput(3);
end;
end;
'Спецагенты': begin
CheckData(InitialInput := |cStr|);
GenerateTests('Икс','Омега','Игрек','Кси','Бета','Зед','Пси','Вася','Петя','Оля');
case Str(0) of
'Икс', 'Омега': CheckOutput(1);
'Игрек', 'Кси', 'Бета': CheckOutput(2);
'Зед', 'Пси': CheckOutput(3);
else CheckOutput(999);
end;
end;
end;
end;
initialization
CheckTask := CheckTaskT;
AllTaskNames := Arr('Types1','Types2','Types3',
'Boo1','Boo2','Boo3','Boo4','Boo5_And_Or','Boo7',
'If1Пароль','If2Пароль','If3ПроверкаИмени','If4Четное','If5ЛогинПарольAnd','If6ЛогинOr','If7Not',
'If8Зима','Зима','If8ЧетДвузнач','If9ВДиапазоне','If9НеВДиапазоне','Minmax_2','ВложенныеIf2',
епочечныеIf1',епочечныеIf2',епочечныеIf3',епочечныеIf4',епочечныеIf5',
'If0Situations1','Holidays','IfXSituations2','IfDiscriminant',
'Case1','Case2','Case3','Case4','Diapason1_Case','TranslateRobot','Комнаты','Спецагенты');
finalization
end.