Balancing Chemical Equations
Adam Burkhard & Rebecca Loshelder
Math 151 Honors Section 202
Fall 2013
Instructor: Philip Yasskin
Serious
Not serious
The layout for Step 3 is totally different from Steps 1 and 2. fixed.
I improved the hints.
I improved the formating of the molecules.
You don't need sprintf if there is only a string.
restart:
with(Maplets[Tools]): with(Maplets[Elements]): with(plots):
StartEngine();
randomize():
randacid:=rand(1..4):
randbase:=rand(1..4):
randrespc:=rand(1..8):
randrespi:=rand(1..8):
randresps:=rand(1..8):
Acid:=[`H Cl`,`H F`,`H Br`,`H I`]:
Base:=[`Na O H`,`K O H`,`Ca (O H)_2`,`Ba (O H)_2`]:
Salt:=[[`Na Cl`,`K Cl`,`Ca Cl_2`,`Ba Cl_2`],[`Na F`,`K F`,`Ca F_2`,`Ba F_2`],[`Na Br`,`K Br`,`Ca Br_2`,`Ba Br_2`],[`Na I`,`K I`,`Ca I_2`,`Ba I_2`]]:
Aqua:=[`H_2 O`]:
ELEM1:=[Cl,F,Br,I]:
ELEM2:=[Na,K,Ca,Ba]:
HAcid:=[1,1,1,1]:
HBase:=[1,1,2,2]:
HSalt:=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]:
HAqua:=[2]:
OAcid:=[0,0,0,0]:
OBase:=[1,1,2,2]:
OSalt:=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]:
OAqua:=[1]:
Elem1Acid:=[1,1,1,1]:
Elem1Base:=[0,0,0,0]:
Elem1Salt:=[[1,1,2,2],[1,1,2,2],[1,1,2,2],[1,1,2,2]]:
Elem1Aqua:=[0]:
Elem2Acid:=[0,0,0,0]:
Elem2Base:=[1,1,1,1]:
Elem2Salt:=[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]:
Elem2Aqua:=[0]:
Coefa:=[[1,1,2,2],[1,1,2,2],[1,1,2,2],[1,1,2,2]]:
Coefb:=[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]:
Coefc:=[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]:
Coefd:=[[1,1,2,2],[1,1,2,2],[1,1,2,2],[1,1,2,2]]:
RESPC:=["Terrific!","Great Job!","Are you an exothermic reaction? Because you're on fire!","You deserve a cookie!", "If I had a cookie, I would give it to you.","I've got my ion you, future chemist!", "Are you smarter than a tea sip? You bet you are!","BTHO Balancing Chemical Equations!"]:
RESPI:=["That's okay, try again!","You'll get it next time!","Getting warmer. Try again.","A for effort, F for accuracy.","If I had a cookie, I would eat it myself.", "Programmers:7,Student:0.", "No, it's not rigged, you're actually wrong.","If at first you don't succeed...don't push the 'show' button."]:
RESPS:=["Next time try it yourself.","Cheaters never prosper.","I guess I'll let it go this time. Keep trying!","You DON'T deserve a cookie.","Do you actually need help or are you just too lazy to do this problem?", "Aggie Honor Code...","Okay, now it's your turn, young grasshopper.","Yeah,I didn't know there was a procedure for balancing chemical equations either."]:
NewProblem:=proc()
global ranACID,ranBASE,ranSALT,ranAQUA, ranELEM1, ranELEM2, ranHAcid, ranHBase, ranHSalt, ranHAqua, ranOAcid, ranOBase, ranOSalt, ranOAqua, ranElem1Acid, ranElem1Base, ranElem1Salt, ranElem1Aqua, ranElem2Acid, ranElem2Base, ranElem2Salt, ranElem2Aqua, ranCoefa, ranCoefb, ranCoefc, ranCoefd;
local acid, base;
acid:=randacid();
base:=randbase();
ranACID:=Acid[acid];
ranBASE:=Base[base];
ranSALT:=Salt[acid,base];
ranAQUA:=Aqua[1];
ranELEM1:=ELEM1[acid];
ranELEM2:=ELEM2[base];
ranHAcid:=HAcid[acid];
ranHBase:=HBase[base];
ranHSalt:=HSalt[acid,base];
ranHAqua:=HAqua[1];
ranOAcid:=OAcid[acid];
ranOBase:=OBase[base];
ranOSalt:=OSalt[acid,base];
ranOAqua:=OAqua[1];
ranElem1Acid:=Elem1Acid[acid];
ranElem1Base:=Elem1Base[base];
ranElem1Salt:=Elem1Salt[acid,base];
ranElem1Aqua:=Elem1Aqua[1];
ranElem2Acid:=Elem2Acid[acid];
ranElem2Base:=Elem2Base[base];
ranElem2Salt:=Elem2Salt[acid,base];
ranElem2Aqua:=Elem2Aqua[1];
ranCoefa:=Coefa[acid,base];
ranCoefb:=Coefb[acid,base];
ranCoefc:=Coefc[acid,base];
ranCoefd:=Coefd[acid,base];
Set(HintBox="", HintBox(background)=white);
Set(acidi=ranACID);
Set(basei=ranBASE);
Set(salti=ranSALT);
Set(wateri=ranAQUA);
Set(acidii=ranACID);
Set(baseii=ranBASE);
Set(saltii=ranSALT);
Set(waterii=ranAQUA);
Set(HYDR="H");
Set(OXYG="O");
Set(Elem1=ranELEM1);
Set(Elem2=ranELEM2);
Set(TFHa="", TFHa(background)=turquoise);
Set(TFHb="", TFHb(background)=turquoise);
Set(TFHc="", TFHc(background)=turquoise);
Set(TFHd="", TFHd(background)=turquoise);
Set(TFckEq1="", TFckEq1(background)=white);
Set(TFOa="", TFHa(background)=turquoise);
Set(TFOb="", TFHb(background)=turquoise);
Set(TFOc="", TFHc(background)=turquoise);
Set(TFOd="", TFHd(background)=turquoise);
Set(TFckEq2="", TFckEq2(background)=white);
Set(TFElem1a="", TFHa(background)=turquoise);
Set(TFElem1b="", TFHb(background)=turquoise);
Set(TFElem1c="", TFHc(background)=turquoise);
Set(TFElem1d="", TFHd(background)=turquoise);
Set(TFckEq3="", TFckEq3(background)=white);
Set(TFElem2a="", TFHa(background)=turquoise);
Set(TFElem2b="", TFHb(background)=turquoise);
Set(TFElem2c="", TFHc(background)=turquoise);
Set(TFElem2d="", TFHd(background)=turquoise);
Set(TFckEq4="", TFckEq4(background)=white);
Set(TFCea="", TFCea(background)=turquoise);
Set(TFCeb="", TFCeb(background)=turquoise);
Set(TFCec="", TFCec(background)=turquoise);
Set(TFCed="", TFCed(background)=turquoise);
Set(TFCer="", TFCer(background)=white);
Set(COEFa="", COEFa(background)=turquoise);
Set(COEFb="", COEFb(background)=turquoise);
Set(COEFc="", COEFc(background)=turquoise);
Set(COEFd="", COEFd(background)=turquoise);
Set(TFEq="", TFEq(background)=white)
end proc:
HintEq1:=proc()
Set(HintBox = " Take the number of atoms of an element existent in each compound and multiply it by that compound's coefficient, the unknown, to find the equation.",
HintBox(background)=Orange, HintBox(foreground)=black):
end proc:
HintEq1:=proc()
Set(HintBox = sprintf(" Enter the number of %A atoms in each reactant or product.", H),
HintBox(background)=Orange, HintBox(foreground)=black):
end proc:
CheckEq1:=proc()
global ranACID,ranBASE,ranSALT,ranAQUA, ranELEM1, ranELEM2, ranHAcid, ranHBase, ranHSalt, ranHAqua, ranOAcid, ranOBase, ranOSalt, ranOAqua, ranElem1Acid, ranElem1Base, ranElem1Salt, ranElem1Aqua, ranElem2Acid, ranElem2Base, ranElem2Salt, ranElem2Aqua;
local user_Ha, user_Hb, user_Hc, user_Hd, ranRESPC, ranRESPI, ranRESPS;
ranRESPC:=RESPC[randrespc()]:
ranRESPI:=RESPI[randrespi()]:
ranRESPS:=RESPS[randresps()]:
user_Ha:=Get(TFHa::integer, corrections=true, update=true);
user_Hb:=Get(TFHb::integer, corrections=true, update=true);
user_Hc:=Get(TFHc::integer, corrections=true, update=true);
user_Hd:=Get(TFHd::integer, corrections=true, update=true);
if user_Ha=ranHAcid then
if user_Hb=ranHBase then
if user_Hc=ranHSalt then
if user_Hd=ranHAqua then
Set(TFckEq1="Correct", TFckEq1(background)=green, TFckEq1(foreground)=black, HintBox=ranRESPC, HintBox(background)=green, HintBox(foreground)=black);
else
Set(TFckEq1="Incorrect", TFckEq1(background)=red, TFckEq1(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
else
Set(TFckEq1="Incorrect", TFckEq1(background)=red, TFckEq1(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
else
Set(TFckEq1="Incorrect", TFckEq1(background)=red, TFckEq1(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
else
Set(TFckEq1="Incorrect", TFckEq1(background)=red, TFckEq1(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
end proc:
ShowEq1:=proc()
global ranACID,ranBASE,ranSALT,ranAQUA, ranELEM1, ranELEM2, ranHAcid, ranHBase, ranHSalt, ranHAqua, ranOAcid, ranOBase, ranOSalt, ranOAqua, ranElem1Acid, ranElem1Base, ranElem1Salt, ranElem1Aqua, ranElem2Acid, ranElem2Base, ranElem2Salt, ranElem2Aqua, ranRESPC, ranRESPI, ranRESPS;
ranRESPC:=RESPC[randrespc()]:
ranRESPI:=RESPI[randrespi()]:
ranRESPS:=RESPS[randresps()]:
Set(TFHa=ranHAcid, TFHb=ranHBase, TFHc=ranHSalt, TFHd=ranHAqua);
Set(TFckEq1="Shown", TFckEq1(background)=yellow, TFckEq1(foreground)=black, HintBox=ranRESPS, HintBox(background)=yellow, HintBox(foreground)=black);
end proc:
HintEq2:=proc()
Set(HintBox = sprintf(" Enter the number of %A atoms in each reactant or product.", O),
HintBox(background)=Orange, HintBox(foreground)=black):
end proc:
CheckEq2:=proc()
global ranACID,ranBASE,ranSALT,ranAQUA, ranELEM1, ranELEM2, ranHAcid, ranHBase, ranHSalt, ranHAqua, ranOAcid, ranOBase, ranOSalt, ranOAqua, ranElem1Acid, ranElem1Base, ranElem1Salt, ranElem1Aqua, ranElem2Acid, ranElem2Base, ranElem2Salt, ranElem2Aqua;
local user_Oa, user_Ob, user_Oc, user_Od, ranRESPC, ranRESPI, ranRESPS;
ranRESPC:=RESPC[randrespc()]:
ranRESPI:=RESPI[randrespi()]:
ranRESPS:=RESPS[randresps()]:
user_Oa:=Get(TFOa::integer, corrections=true, update=true);
user_Ob:=Get(TFOb::integer, corrections=true, update=true);
user_Oc:=Get(TFOc::integer, corrections=true, update=true);
user_Od:=Get(TFOd::integer, corrections=true, update=true);
if user_Oa=ranOAcid then
if user_Ob=ranOBase then
if user_Oc=ranOSalt then
if user_Od=ranOAqua then
Set(TFckEq2="Correct", TFckEq2(background)=green, TFckEq2(foreground)=black, HintBox=ranRESPC, HintBox(background)=green, HintBox(foreground)=black);
else
Set(TFckEq2="Incorrect", TFckEq2(background)=red, TFckEq2(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
else
Set(TFckEq2="Incorrect", TFckEq2(background)=red, TFckEq2(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
else
Set(TFckEq2="Incorrect", TFckEq2(background)=red, TFckEq2(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
else
Set(TFckEq2="Incorrect", TFckEq2(background)=red, TFckEq2(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
end proc:
ShowEq2:=proc()
global ranACID,ranBASE,ranSALT,ranAQUA, ranELEM1, ranELEM2, ranHAcid, ranHBase, ranHSalt, ranHAqua, ranOAcid, ranOBase, ranOSalt, ranOAqua, ranElem1Acid, ranElem1Base, ranElem1Salt, ranElem1Aqua, ranElem2Acid, ranElem2Base, ranElem2Salt, ranElem2Aqua, ranRESPC, ranRESPI, ranRESPS;
ranRESPC:=RESPC[randrespc()]:
ranRESPI:=RESPI[randrespi()]:
ranRESPS:=RESPS[randresps()]:
Set(TFOa=ranOAcid, TFOb=ranOBase, TFOc=ranOSalt, TFOd=ranOAqua);
Set(TFckEq2="Shown", TFckEq2(background)=yellow, TFckEq2(foreground)=black, HintBox=ranRESPS, HintBox(background)=yellow, HintBox(foreground)=black);
end proc:
HintEq3:=proc()
global ranACID,ranBASE,ranSALT,ranAQUA, ranELEM1, ranELEM2, ranHAcid, ranHBase, ranHSalt, ranHAqua, ranOAcid, ranOBase, ranOSalt, ranOAqua, ranElem1Acid, ranElem1Base, ranElem1Salt, ranElem1Aqua, ranElem2Acid, ranElem2Base, ranElem2Salt, ranElem2Aqua, ranCoefa, ranCoefb, ranCoefc, ranCoefd;
Set(HintBox = sprintf(" Enter the number of %A atoms in each reactant or product.", ranELEM1),
HintBox(background)=Orange, HintBox(foreground)=black):
end proc:
CheckEq3:=proc()
global ranACID,ranBASE,ranSALT,ranAQUA, ranELEM1, ranELEM2, ranHAcid, ranHBase, ranHSalt, ranHAqua, ranOAcid, ranOBase, ranOSalt, ranOAqua, ranElem1Acid, ranElem1Base, ranElem1Salt, ranElem1Aqua, ranElem2Acid, ranElem2Base, ranElem2Salt, ranElem2Aqua;
local user_Elem1a, user_Elem1b, user_Elem1c, user_Elem1d, ranRESPC, ranRESPI, ranRESPS;
ranRESPC:=RESPC[randrespc()]:
ranRESPI:=RESPI[randrespi()]:
ranRESPS:=RESPS[randresps()]:
user_Elem1a:=Get(TFElem1a::integer, corrections=true, update=true);
user_Elem1b:=Get(TFElem1b::integer, corrections=true, update=true);
user_Elem1c:=Get(TFElem1c::integer, corrections=true, update=true);
user_Elem1d:=Get(TFElem1d::integer, corrections=true, update=true);
if user_Elem1a=ranElem1Acid then
if user_Elem1b=ranElem1Base then
if user_Elem1c=ranElem1Salt then
if user_Elem1d=ranElem1Aqua then
Set(TFckEq3="Correct", TFckEq3(background)=green, TFckEq3(foreground)=black, HintBox=ranRESPC, HintBox(background)=green, HintBox(foreground)=black);
else
Set(TFckEq3="Incorrect", TFckEq3(background)=red, TFckEq3(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
else
Set(TFckEq3="Incorrect", TFckEq3(background)=red, TFckEq3(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
else
Set(TFckEq3="Incorrect", TFckEq3(background)=red, TFckEq3(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
else
Set(TFckEq3="Incorrect", TFckEq3(background)=red, TFckEq3(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
end proc:
ShowEq3:=proc()
global ranACID,ranBASE,ranSALT,ranAQUA, ranELEM1, ranELEM2, ranHAcid, ranHBase, ranHSalt, ranHAqua, ranOAcid, ranOBase, ranOSalt, ranOAqua, ranElem1Acid, ranElem1Base, ranElem1Salt, ranElem1Aqua, ranElem2Acid, ranElem2Base, ranElem2Salt, ranElem2Aqua, ranRESPC, ranRESPI, ranRESPS;
ranRESPC:=RESPC[randrespc()]:
ranRESPI:=RESPI[randrespi()]:
ranRESPS:=RESPS[randresps()]:
Set(TFElem1a=ranElem1Acid, TFElem1b=ranElem1Base, TFElem1c=ranElem1Salt, TFElem1d=ranElem1Aqua);
Set(TFckEq3="Shown", TFckEq3(background)=yellow, TFckEq3(foreground)=black, HintBox=ranRESPS, HintBox(background)=yellow, HintBox(foreground)=black);
end proc:
HintEq4:=proc()
global ranACID,ranBASE,ranSALT,ranAQUA, ranELEM1, ranELEM2, ranHAcid, ranHBase, ranHSalt, ranHAqua, ranOAcid, ranOBase, ranOSalt, ranOAqua, ranElem1Acid, ranElem1Base, ranElem1Salt, ranElem1Aqua, ranElem2Acid, ranElem2Base, ranElem2Salt, ranElem2Aqua, ranCoefa, ranCoefb, ranCoefc, ranCoefd;
Set(HintBox = sprintf(" Enter the number of %A atoms in each reactant or product.", ranELEM2),
HintBox(background)=Orange, HintBox(foreground)=black):
end proc:
CheckEq4:=proc()
global ranACID,ranBASE,ranSALT,ranAQUA, ranELEM1, ranELEM2, ranHAcid, ranHBase, ranHSalt, ranHAqua, ranOAcid, ranOBase, ranOSalt, ranOAqua, ranElem1Acid, ranElem1Base, ranElem1Salt, ranElem1Aqua, ranElem2Acid, ranElem2Base, ranElem2Salt, ranElem2Aqua;
local user_Elem2a, user_Elem2b, user_Elem2c, user_Elem2d, ranRESPC, ranRESPI, ranRESPS;
ranRESPC:=RESPC[randrespc()]:
ranRESPI:=RESPI[randrespi()]:
ranRESPS:=RESPS[randresps()]:
user_Elem2a:=Get(TFElem2a::integer, corrections=true, update=true);
user_Elem2b:=Get(TFElem2b::integer, corrections=true, update=true);
user_Elem2c:=Get(TFElem2c::integer, corrections=true, update=true);
user_Elem2d:=Get(TFElem2d::integer, corrections=true, update=true);
if user_Elem2a=ranElem2Acid then
if user_Elem2b=ranElem2Base then
if user_Elem2c=ranElem2Salt then
if user_Elem2d=ranElem2Aqua then
Set(TFckEq4="Correct", TFckEq4(background)=green, TFckEq4(foreground)=black, HintBox=ranRESPC, HintBox(background)=green, HintBox(foreground)=black);
else
Set(TFckEq4="Incorrect", TFckEq4(background)=red, TFckEq4(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
else
Set(TFckEq4="Incorrect", TFckEq4(background)=red, TFckEq4(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
else
Set(TFckEq4="Incorrect", TFckEq4(background)=red, TFckEq4(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
else
Set(TFckEq4="Incorrect", TFckEq4(background)=red, TFckEq4(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
end proc:
ShowEq4:=proc()
global ranACID,ranBASE,ranSALT,ranAQUA, ranELEM1, ranELEM2, ranHAcid, ranHBase, ranHSalt, ranHAqua, ranOAcid, ranOBase, ranOSalt, ranOAqua, ranElem1Acid, ranElem1Base, ranElem1Salt, ranElem1Aqua, ranElem2Acid, ranElem2Base, ranElem2Salt, ranElem2Aqua, ranRESPC, ranRESPI, ranRESPS;
ranRESPC:=RESPC[randrespc()]:
ranRESPI:=RESPI[randrespi()]:
ranRESPS:=RESPS[randresps()]:
Set(TFElem2a=ranElem2Acid, TFElem2b=ranElem2Base, TFElem2c=ranElem2Salt, TFElem2d=ranElem2Aqua);
Set(TFckEq4="Shown", TFckEq4(background)=yellow, TFckEq4(foreground)=black, HintBox=ranRESPS, HintBox(background)=yellow, HintBox(foreground)=black);
end proc:
LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYjLUkjbWlHRiQ2I1EhRic=
HintCer:=proc()
Set(HintBox = " Use 3 equations to express 3 variables in terms of the 4th. Check the 4th equation is satisfied. Pick the 4th variable so that all variables are the smallest possible positive integers.",
HintBox(background)=Orange, HintBox(foreground)=black):
end proc:
CheckCer:=proc()
global ranACID,ranBASE,ranSALT,ranAQUA, ranELEM1, ranELEM2, ranHAcid, ranHBase, ranHSalt, ranHAqua, ranOAcid, ranOBase, ranOSalt, ranOAqua, ranElem1Acid, ranElem1Base, ranElem1Salt, ranElem1Aqua, ranElem2Acid, ranElem2Base, ranElem2Salt, ranElem2Aqua, ranCoefa, ranCoefb, ranCoefc, ranCoefd;
local user_Cea, user_Ceb, user_Cec, user_Ced, ranRESPC, ranRESPI, ranRESPS;
ranRESPC:=RESPC[randrespc()]:
ranRESPI:=RESPI[randrespi()]:
ranRESPS:=RESPS[randresps()]:
user_Cea:=Get(TFCea::integer, corrections=true, update=true);
user_Ceb:=Get(TFCeb::integer, corrections=true, update=true);
user_Cec:=Get(TFCec::integer, corrections=true, update=true);
user_Ced:=Get(TFCed::integer, corrections=true, update=true);
if user_Cea=ranCoefa then
if user_Ceb=ranCoefb then
if user_Cec=ranCoefc then
if user_Ced=ranCoefd then
Set(TFCer="Correct", TFCer(background)=green, TFCer(foreground)=black, HintBox=ranRESPC, HintBox(background)=green, HintBox(foreground)=black);
else
Set(TFCer="Incorrect", TFCer(background)=red, TFCer(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
else
Set(TFCer="Incorrect", TFCer(background)=red, TFCer(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
else
Set(TFCer="Incorrect", TFCer(background)=red, TFCer(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
else
Set(TFCer="Incorrect", TFCer(background)=red, TFCer(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
end proc:
ShowCer:=proc()
global ranACID,ranBASE,ranSALT,ranAQUA, ranELEM1, ranELEM2, ranHAcid, ranHBase, ranHSalt, ranHAqua, ranOAcid, ranOBase, ranOSalt, ranOAqua, ranElem1Acid, ranElem1Base, ranElem1Salt, ranElem1Aqua, ranElem2Acid, ranElem2Base, ranElem2Salt, ranElem2Aqua, ranCoefa, ranCoefb, ranCoefc, ranCoefd, ranRESPC, ranRESPI, ranRESPS;
ranRESPC:=RESPC[randrespc()]:
ranRESPI:=RESPI[randrespi()]:
ranRESPS:=RESPS[randresps()]:
Set(TFCea=ranCoefa, TFCeb=ranCoefb, TFCec=ranCoefc, TFCed=ranCoefd);
Set(TFCer="Shown", TFCer(background)=yellow, TFCer(foreground)=black, HintBox=ranRESPS, HintBox(background)=yellow, HintBox(foreground)=black);
end proc:
LUklbXJvd0c2Iy9JK21vZHVsZW5hbWVHNiJJLFR5cGVzZXR0aW5nR0koX3N5c2xpYkdGJzYjLUkjbWlHRiQ2I1EhRic=
HintEq:=proc()
Set(HintBox = " Plug the values of a, b, c and d, found in step 2, back into the original chemical equation to balance it.",
HintBox(background)=Orange, HintBox(foreground)=black):
end proc:
CheckEq:=proc()
global ranACID,ranBASE,ranSALT,ranAQUA, ranELEM1, ranELEM2, ranHAcid, ranHBase, ranHSalt, ranHAqua, ranOAcid, ranOBase, ranOSalt, ranOAqua, ranElem1Acid, ranElem1Base, ranElem1Salt, ranElem1Aqua, ranElem2Acid, ranElem2Base, ranElem2Salt, ranElem2Aqua, ranCoefa, ranCoefb, ranCoefc, ranCoefd;
local user_Coefa, user_Coefb, user_Coefc, user_Coefd, ranRESPC, ranRESPI, ranRESPS;
ranRESPC:=RESPC[randrespc()]:
ranRESPI:=RESPI[randrespi()]:
ranRESPS:=RESPS[randresps()]:
user_Coefa:=Get(COEFa::integer, corrections=true, update=true);
user_Coefb:=Get(COEFb::integer, corrections=true, update=true);
user_Coefc:=Get(COEFc::integer, corrections=true, update=true);
user_Coefd:=Get(COEFd::integer, corrections=true, update=true);
if user_Coefa=ranCoefa then
if user_Coefb=ranCoefb then
if user_Coefc=ranCoefc then
if user_Coefd=ranCoefd then
Set(TFEq="Correct", TFEq(background)=green, TFEq(foreground)=black, HintBox=ranRESPC, HintBox(background)=green, HintBox(foreground)=black);
else
Set(TFEq="Incorrect", TFEq(background)=red, TFEq(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
else
Set(TFEq="Incorrect", TFEq(background)=red, TFEq(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
else
Set(TFEq="Incorrect", TFEq(background)=red, TFEq(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
else
Set(TFEq="Incorrect", TFEq(background)=red, TFEq(foreground)=white, HintBox=ranRESPI, HintBox(background)=red, HintBox(foreground)=white);
end if;
end proc:
ShowEq:=proc()
global ranACID,ranBASE,ranSALT,ranAQUA, ranELEM1, ranELEM2, ranHAcid, ranHBase, ranHSalt, ranHAqua, ranOAcid, ranOBase, ranOSalt, ranOAqua, ranElem1Acid, ranElem1Base, ranElem1Salt, ranElem1Aqua, ranElem2Acid, ranElem2Base, ranElem2Salt, ranElem2Aqua, ranCoefa, ranCoefb, ranCoefc, ranCoefd, ranRESPC, ranRESPI, ranRESPS;
ranRESPC:=RESPC[randrespc()]:
ranRESPI:=RESPI[randrespi()]:
ranRESPS:=RESPS[randresps()]:
Set(COEFa=ranCoefa, COEFb=ranCoefb, COEFc=ranCoefc, COEFd=ranCoefd);
Set(TFEq="Shown", TFEq(background)=yellow, TFEq(foreground)=black, HintBox=ranRESPS, HintBox(background)=yellow, HintBox(foreground)=black);
end proc:
BalancingChemicalEquations:=Maplet(onstartup = RunWindow(MAIN),
Window[MAIN](title="Balancing Chemical Equations",
[ valign=none, inset=0, spacing=0,
[ halign=none,
Button("New Equation", Evaluate(function="NewProblem"), background=magenta),
BoxRow( halign=none, border=true,
caption="Goal: Balance the chemical equation:",
HorizontalGlue(),
" a ",
TextField[acidi](width=7, editable=false, background=white),
" + b ",
TextField[basei](width=7, editable=false, background=white),
" --> c ",
TextField[salti](width=7, editable=false, background=white),
" + d ",
TextField[wateri](width=7, editable=false, background=white),
HorizontalGlue()
),
Button("Quit", Shutdown(), background=pink)
],
BoxColumn( valign=none, border=true,
caption="Step 1: Write an equation to balance the amount of each element on the two sides of the reaction.",
[ halign=none, inset=0,
TextField[HYDR](width=2, editable=false, background=white),
":",
HorizontalGlue(),
TextField[TFHa](width=2, background=turquoise),
"a +",
TextField[TFHb](width=2, background=turquoise),
"b =",
TextField[TFHc](width=2, background=turquoise),
"c +",
TextField[TFHd](width=2, background=turquoise),
"d",
HorizontalGlue(),
Button("Hint", Evaluate(function="HintEq1"), background="Orange"),
Button("Check", Evaluate(function="CheckEq1"), background=green),
TextField[TFckEq1](width=6, editable=false, background=white),
Button("Show", Evaluate(function="ShowEq1"), background=yellow)
],
[ halign=none, inset=0,
TextField[OXYG](width=2, editable=false, background=white),
":",
HorizontalGlue(),
TextField[TFOa](width=2, background=turquoise),
"a +",
TextField[TFOb](width=2, background=turquoise),
"b =",
TextField[TFOc](width=2, background=turquoise),
"c +",
TextField[TFOd](width=2, background=turquoise),
"d",
HorizontalGlue(),
Button("Hint", Evaluate(function="HintEq2"), background="Orange"),
Button("Check", Evaluate(function="CheckEq2"), background=green),
TextField[TFckEq2](width=6, editable=false, background=white),
Button("Show", Evaluate(function="ShowEq2"), background=yellow)
],
[ halign=none, inset=0,
TextField[Elem1](width=2, editable=false, background=white),
":",
HorizontalGlue(),
TextField[TFElem1a](width=2, background=turquoise),
"a +",
TextField[TFElem1b](width=2, background=turquoise),
"b =",
TextField[TFElem1c](width=2, background=turquoise),
"c +",
TextField[TFElem1d](width=2, background=turquoise),
"d",
HorizontalGlue(),
Button("Hint", Evaluate(function="HintEq3"), background="Orange"),
Button("Check", Evaluate(function="CheckEq3"), background=green),
TextField[TFckEq3](width=6, editable=false, background=white),
Button("Show", Evaluate(function="ShowEq3"), background=yellow)
],
[ halign=none, inset=0,
TextField[Elem2](width=2, editable=false, background=white),
":",
HorizontalGlue(),
TextField[TFElem2a](width=2, background=turquoise),
"a +",
TextField[TFElem2b](width=2, background=turquoise),
"b =",
TextField[TFElem2c](width=2, background=turquoise),
"c +",
TextField[TFElem2d](width=2, background=turquoise),
"d",
HorizontalGlue(),
Button("Hint", Evaluate(function="HintEq4"), background="Orange"),
Button("Check", Evaluate(function="CheckEq4"), background=green),
TextField[TFckEq4](width=6, editable=false, background=white),
Button("Show", Evaluate(function="ShowEq4"), background=yellow)
]
),
[ halign=none, border=true,
caption="Step 2: Solve the system of equations. Give the smallest positive solution.",
HorizontalGlue(),
"a =",
TextField[TFCea](width=2, background=turquoise),
HorizontalGlue(),
"b =",
TextField[TFCeb](width=2, background=turquoise),
HorizontalGlue(),
"c =",
TextField[TFCec](width=2, background=turquoise),
HorizontalGlue(),
"d =",
TextField[TFCed](width=2, background=turquoise),
HorizontalGlue(),
Button("Hint", Evaluate(function="HintCer"), background="Orange"),
Button("Check", Evaluate(function="CheckCer"), background=green),
TextField[TFCer](width=6, editable=false, background=white),
Button("Show", Evaluate(function="ShowCer"), background=yellow)
],
[ halign=none, border=true,
caption="Step 3: Plug the solution into the chemical equation." ,
TextField[COEFa](width=2, background=turquoise),
TextField[acidii](width=7, editable=false, background=white),
"+",
TextField[COEFb](width=2, background=turquoise),
TextField[baseii](width=7, editable=false, background=white),
" --> ",
TextField[COEFc](width=2, background=turquoise),
TextField[saltii](width=7, editable=false, background=white),
"+",
TextField[COEFd](width=2, background=turquoise),
TextField[waterii](width=7, editable=false, background=white),
HorizontalGlue(),
Button("Hint", Evaluate(function="HintEq"), background="Orange"),
Button("Check", Evaluate(function="CheckEq"), background=green),
TextField[TFEq](width=6, editable=false, background=white),
Button("Show", Evaluate(function="ShowEq"), background=yellow)
],
[ TextBox[HintBox](editable=false, width=60,height=3)
],
[ halign=none, inset=0, spacing=3,
"Instructor: Philip Yasskin",
HorizontalGlue(),
"Programmers: Adam Burkhard and Rebecca Loshelder",
HorizontalGlue(),
"Copyright: Yasskin 2013"
]
]
)
):
Maplets[Display]( BalancingChemicalEquations );