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.