Арифметический тренажер. exitcode = 201 - Free Pascal
Формулировка задачи:
Постановка задачи:
нужно создать арифметический тренажер, который бы после выбора учителем параметров разрядности операций (*, 1*, 1**) и действия с числами (= - * /) генерировал бы случайные задачи в заданном диапазоне, например на умножение двузначных чисел или на сложение однозначных, потом в сгенерированном примере прога должна закрывать одно число знаком вопроса, ученик должен ввести число, которое там должно быть. Также программа ведет статистику ошибок и верных ответов. Также необходимо реализовать меню. Вот сам код:PROGRAM ArTrening;
uses Crt;
const
NORM=$17;
SEL=$70;
N=3;
NN=4;
var menu:array[1..N] of string[12];{ названия пунктов меню }
menu2:array[1..NN] of string[12];
punkt:integer; { номер выделенного пункта }
ch:char; { введенный символ }
x,y:integer; { координаты первой строки меню }
a,b,c,i,j,k,n2,m,v,mist:Integer;
PROCEDURE Main(a,b,c,v,m:Integer; var mist:Integer);
VAR ch:Char; ans,pans:Integer;
Begin
case v of
1:begin
c:=a+b;
ch:='+';
end;
2:begin
c:=a-b;
ch:='-';
end;
3:begin
c:=a*b;
ch:='*';
end;
4:begin
c:=b;
b:=a;
a:=b*c;
ch:='/';
end;
end;
m:=random(3);
case m of
1:begin
ans:=a;
Writeln(' ? ',ch,' ',b,' = ',c);
readln (pans); if pans=a then mist:=mist+0 else mist:=mist+1;
end;
2:begin
ans:=b;
writeln(a,' ',ch,' ? = ',c);
readln (pans); if pans=b then mist:=mist+0 else mist:=mist+1;
end;
3:begin
ans:=c;
writeln(a,' ',ch,' ',b,' = ?');
readln (pans); if pans=c then mist:=mist+0 else mist:=mist+1;
end;
end;
End;
Procedure MenuToScr;
var i:integer;
begin
ClrScr;
for i:=1 to N do begin
GoToXY(x,y+i-1);
write(menu[i]);
end;
TextAttr:=SEL;
GoToXY(x,y+punkt-1);
write(menu[punkt]);
TextAttr:=NORM;
end;
Procedure MenuToScr2;
var i:integer;
begin
ClrScr;
for i:=1 to NN do begin
GoToXY(x,y+i-1);
write(menu[i]);
end;
TextAttr:=SEL;
GoToXY(x,y+punkt-1);
write(menu[punkt]);
TextAttr:=NORM;
end;
begin
WriteLn('Vvedite kol-vo primerov');
ReadLn(i);
menu[1]:='Edinici';
menu[2]:='Decyatki';
menu[3]:='Sotni';
punkt:=1;
x:=5;
y:=5; TextAttr:=NORM;
MenuToScr;
repeat
ch:=ReadKey;
if ch=char(0) then
begin
ch:=ReadKey;
case ch of
chr(80):{ стрелка вниз }
if punkt<N then
begin
GoToXY(x,y+punkt-1);
write(menu[punkt]);
punkt:=punkt+1;
TextAttr:=SEl;
GoToXY(x,y+punkt-1);
write(menu[punkt]);
TextAttr:=NORM;
end;
chr(72):{ стрелка вверх }
if punkt>1 then
begin
GoToXY(x,y+punkt-1);
write(menu[punkt]);
punkt:=punkt-1;
TextAttr:=SEl;
GoToXY(x,y+punkt-1);
write(menu[punkt]);
TextAttr:=NORM;
end;
end;
end
else
if ch=chr(13) then
begin { нажата клавиша <Enter> }
n2:=punkt;
ClrScr;
menu2[1]:='+';
menu2[2]:='-';
menu2[3]:='/';
menu2[4]:='*';
punkt:=1;
x:=5;
y:=5; TextAttr:=NORM;
MenuToScr2;
repeat
ch:=ReadKey;
if ch=char(0) then
begin
ch:=ReadKey;
case ch of
chr(80):{ стрелка вниз }
if punkt<N then
begin
GoToXY(x,y+punkt-1);
write(menu[punkt]);
punkt:=punkt+1;
TextAttr:=SEl;
GoToXY(x,y+punkt-1);
write(menu[punkt]);
TextAttr:=NORM;
end;
chr(72):{ стрелка вверх }
if punkt>1 then
begin
GoToXY(x,y+punkt-1);
write(menu[punkt]);
punkt:=punkt-1;
TextAttr:=SEl;
GoToXY(x,y+punkt-1);
write(menu[punkt]);
TextAttr:=NORM;
end;
end;
end
else
if ch=chr(13) then
begin
v:=punkt;
ClrScr;
For j:=1 to i do begin
Case n2 of
1:begin
a:=random(9);
b:=random(9);
end;
2:begin
a:=random(90)+10;
b:=random(90)+10;
end;
3:begin
a:=random(900)+100;
b:=random(900)+100;
end;
end;
main(a,b,c,v,m,mist);
end;
WriteLn ('Тест завершен! Правильных ответов: ', (i-mist), ',ошибок: ', mist);
ReadKey;
end;
until ch=chr(27);
end;
until ch=chr(27);
end.Решение задачи: «Арифметический тренажер. exitcode = 201»
textual
Листинг программы
var menu:array[1..N] of string[12]; // Запомнил? Индексация - от 1 до ТРЕХ