pascalabcnet/TestSuite/CompilationSamples/Tasks1BoolIfCase.pas
Mikhalkovich Stanislav 7f988c9bb2 3.9.0.3500
Хороший коммит )
2024-07-02 22:07:23 +03:00

436 lines
14 KiB
ObjectPascal
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.