const Add = 'a'; Subtr = 's'; Mult = 't'; Divide = 'd'; Quit = 'x'; Rndm = 'r'; Specific = 'p'; MRec = 'n'; DRec = 'w'; numstud = 10; type Ttestrec = record name : string; number : integer; correct_answers : integer; num_questions : integer; end; var op_choice : char; op1 : integer; op2 : integer; op : string; answer : integer; correct : integer; tt_choice : char; numq : integer; n : integer; numright : integer; rm_choice : integer; mm_choice : integer; studrec : Ttestrec; procedure proc_exit; begin writeln('Bye bye'); end; procedure display_mmenu; begin writeln('1 to go to the record menu'); writeln('2 to take a test'); writeln('3 to exit'); readln(mm_choice); end; procedure display_opmenu; begin writeln('m for main menu'); writeln('a to add two numbers'); writeln('s to subtract one number from another'); writeln('t to multiply two numbers'); writeln('d to divide one number by another'); writeln('x to exit'); write('choice >'); readln(op_choice); end; procedure random_operator; var rnd_op : integer; begin randomize; rnd_op := random(4); case rnd_op of 1: op_choice :='a'; 2: op_choice :='s'; 3: op_choice :='t'; 4: op_choice :='d'; end; end; procedure display_testtype_menu; begin writeln('r for random operators'); writeln('p for specified operators'); write('choice >'); readln(tt_choice); case tt_choice of Rndm: random_operator; Specific: display_opmenu; end; end; {procedures to set the operators and operand - can be replaced later with the random operator selector} procedure proc_add; begin op1 := random(50); op2 := random(50); op := '+'; correct := op1 + op2; end; procedure proc_subtr; begin op1 := random(100); op2 := random(op1); op := '-'; correct := op1 - op2; end; procedure proc_mult; begin op1 := random(12); op2 := random(12); op := '*'; correct := op1 * op2 end; procedure proc_div; { divide procedure not yet fixed } begin op1 := random(144); op2 := random(12); op := '/'; {correct := op1 / op2}; correct := 3; end; {ask the question and respond according to whether the answer given is correct} procedure ask_question; begin writeln('Question ',n, ' of ',numq,':'); writeln(op1,op,op2,' = '); readln(answer); if answer = correct then begin numright := numright+1; writeln(answer,' is correct.'); end else writeln('Incorrect. The correct answer is ', correct); end; procedure many_questions; begin numright := 0; writeln('How many questions?'); readln(numq); begin case op_choice of Add: begin for n := 1 to numq do begin proc_add; ask_question; end; end; Subtr: begin for n := 1 to numq do begin proc_subtr; ask_question; end; end; Mult: begin for n := 1 to numq do begin proc_mult; ask_question; end; end; Divide: for n := 1 to numq do begin proc_div; ask_question; end; Quit: proc_exit; end; end; end; procedure display_score; begin writeln('----------------------------'); writeln('You got ',numright,' correct out of ',numq,' questions.'); writeln('Press enter to return to menu'); readln; end; procedure record_menu; begin {while rm_choice <> 'x' do} writeln('1 to create a new student record'); writeln('2 to display the record'); writeln('3 to return'); write('choice > '); readln(rm_choice); case rm_choice of 1: begin write('Student number: '); readln(studrec.number); write('Student name: '); readln(studrec.name); writeln('Record updated. Thank you.'); end; 2: begin writeln('Student number: ',studrec.number); writeln('Student name: ',studrec.name); writeln('Correct answers: ',studrec.correct_answers); writeln('Out of ',studrec.num_questions,' studrec.questions.'); writeln('Press enter to return to record menu.'); end; end; end; {program starts here} procedure execute; begin randomize; display_mmenu; case mm_choice of 1: begin record_menu; execute; end; 2: begin display_testtype_menu; many_questions; display_score; execute; end; 3: proc_exit; end; end; begin execute; end; end.