(* ::Package:: *) BeginPackage["Symbex25MTH140TRIG`"]; (* Author Dara O Shayda, Nov 2012 - Present *) qPanel1::usage = "Sample question"; qPanel2::usage = "Sample question"; qPanel3::usage = "Sample question"; qPanel4::usage = "Sample question"; qPanel5::usage = "Sample question"; qPanel6::usage = "Sample question"; qPanel7::usage = "Sample question"; qPanel8::usage = "Sample question"; qSend::usage = "Send the clicks out"; qSendHD::usage = "Send the clicks out into hard disk"; qSendLocal::usage = "Send the clicks out"; readTitle::usage="Output test info + initialize"; Begin["`Private`"]; examIDString = "MTH140, Jan 2015, Prof. Nara Jung"; examIDString2 = "MTH140, Jan 2015, Prof. Nara Jung"; examName = "Trigonometrics Module"; examName2 = "Trigonometrics"; qMagnification = 1.2; bigNumber = 1000102010004455; (* [[2]] told me, I told [[3]], [[4]] book, it is all [[5]] *) qNamesList={{"Boza", "he", "him", "his", "his"}, {"Dara", "he", "him", "his", "his"} , {"Jack", "he", "him", "his", "his"}, {"Ginger", "she", "her", "her", "hers"}, {"Wayne", "he", "him", "his", "his"}, {"Spomenka", "she", "her", "her", "hers"}, {"George", "he", "him", "his", "his"}, {"Kevin", "he", "him", "his", "his"}, {"Tina", "she", "her", "her", "hers"}, {"Lucia", "she", "her", "her", "hers"}, {"Ahmad", "he", "him", "his", "his"},{"Abaz", "he", "him", "his", "his"}}; qNumList={{"one",1}, {"two",2}, {"three",3}, {"four",4}, {"five",5}, {"six",6}, {"seven",7}, {"eight",8}, {"nine",9}, {"ten",10}}; qColorList={"red", "green", "blue", "yellow", "black", "white", "pink", "brown", "purple"}; qRandList[list0_]:=list0[[RandomInteger[{1, Length[list0]}]]] qCaps[x0_]:=Module[{x=x0}, x=Characters[x]; StringJoin[Join[{ToUpperCase[x[[1]]]}, Drop[x,1]]] ] (* only counts the True click *) qClick[n0_]:=DynamicModule[{n=n0}, (*qClicks[[n]][[2]] = 1;*) qAppend[{n,1,0}]; ] qClickPlus[n0_]:=DynamicModule[{n=n0}, (*qClicks[[n]][[3]] = 1;*) qAppend[{n,0,1}]; ] qTryAgainNOT[n_]:="" qNum = 0; (* number of questions *) qFlush[text_,id_]:=Module[{s,fname}, (*fname=FileNameJoin[{$TemporaryDirectory,StringReplace[DateString[], {" "->"_", ":"->"_"}]<>"symbolix.txt"}];*) fname=FileNameJoin[{$UserDocumentsDirectory,If[id==="","NOID",StringDrop[StringDrop[id,1],-1]]<>StringReplace[DateString[], {" "->"_", ":"->"_"}]<>"symbolix.txt"}]; s=OpenWrite[fname]; Write[s,text]; {Close[s], fname} ] qAppend[text_]:=Module[{s,fname}, (*fname=FileNameJoin[{$TemporaryDirectory,StringReplace[DateString[], {" "->"_", ":"->"_"}]<>"symbolix.txt"}];*) fname=FileNameJoin[{$UserDocumentsDirectory,"DARADARADARA"<>"symbolix.txt"}]; s=OpenAppend[fname]; Write[s,text]; {Close[s], fname} ] qFlushLAN[text_,id_]:=Module[{s,fname}, (*fname=FileNameJoin[{$TemporaryDirectory,StringReplace[DateString[], {" "->"_", ":"->"_"}]<>"symbolix.txt"}];*) fname=FileNameJoin[{"\\\\trinity.arts.ryerson.ca\\artslabshare\\dropbox",If[id==="","NOID",StringDrop[StringDrop[id,1],-1]]<>StringReplace[DateString[], {" "->"_", ":"->"_"}]<>"symbolix.txt"}]; s=OpenWrite[fname]; Write[s,text]; {Close[s], fname} ] qFlush2[dir_, prefix_,text_]:=Module[{s,fname}, fname=FileNameJoin[{dir,prefix<>"symbolix.txt"}]; s=OpenWrite[fname]; Write[s,text]; Close[s] ] qFlushLAN2[text_]:=Module[{s,fname}, fname=FileNameJoin[{"\\\\trinity.arts.ryerson.ca\\artslabshare\\dropbox","symbolix.txt"}]; s=OpenWrite[fname]; Write[s,text]; Close[s] ] qFlush2[dir_, prefix_,text_]:=Module[{s,fname}, fname=FileNameJoin[{dir,prefix<>"symbolix.txt"}]; s=OpenWrite[fname]; Write[s,text]; Close[s] ] writeID[id_]:=Module[{s,fname}, fname=FileNameJoin[{$UserDocumentsDirectory,"id"<>"symbolix.txt"}]; s=OpenWrite[fname]; Write[s,id]; {Close[s], fname}; ] readID[]:=Module[{s,fname}, fname=FileNameJoin[{$UserDocumentsDirectory,"id"<>"symbolix.txt"}]; Off[Import::nffil]; If[Import[fname,"Text"]===$Failed, "",Import[fname,"Text"]] ] qSendHD[]:=DynamicModule[{status="",a, body,text,ret1,ret2,tmp="",msg,res=False, track,res2,arg,Gg2, Gg3,qClicks,q,first=True,studentID="", buttonEnable=False ,resF ,ID}, Manipulate[ (*Refresh[If[first==True,studentID=readID[], If[readID[]==="",studentID,studentID=readID[]]],UpdateInterval->1];*) text=Dynamic[status]; buttonEnable=Dynamic[If[studentID!="", True]]; body={{Dynamic[If[res==True,Text[Style["Checked Marks Indicate Correct Answers\n"<>"\nTo Track this test: email "<>ToString[track]<>", "<>IntegerString[Hash[ToString[Gg2]<>ToString[track]<>"Mehran1339","MD5"],16]<>" to Deidre Lam \n"<>"Test results stored in file: "<>res2[[2]],Red,Background->Yellow]], ""]],Dynamic[If[res==True,CheckboxBar[Range[qNum]*Gg3,Range[qNum], Appearance->"Vertical",Enabled->False], ""]], Dynamic[Which[(Mean[Gg3] >= 0.8)&& (res == True), "\n\!\(\* StyleBox[\"Congratulations\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"!\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"You\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"passed\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"the\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)"<> examName <>" \!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"..\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\".\",\nFontColor->RGBColor[1, 0, 0]]\)\n\!\(\* StyleBox[\"Grade\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\":\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)"<>ToString[Ceiling[qTrunc4[Mean[Gg3]]*100]],(Mean[Gg3] < 0.8)&& (res == True), "\n \!\(\* StyleBox[\"Please\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"study\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"the\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)"<> examName <>" \!\(\* StyleBox[\"and\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"write\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"this\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"test\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"again\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\".\",\nFontColor->RGBColor[1, 0, 0]]\)\n\!\(\* StyleBox[\"Grade\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\":\",\nFontColor->RGBColor[1, 0, 0]]\) "<>ToString[Ceiling[qTrunc4[Mean[Gg3]]*100]],True,""]]},{"","",""}}; Deploy[ Style[Panel[Grid[Transpose[body],Alignment->Left,Spacings->{4,0.5}(*,ItemSize->20)*)],text,ImageMargins->1],DefaultOptions->{InputField->{ContinuousAction->True},FontSize->Large}]], {{a, 0,""}, Column[{InputField[Dynamic[studentID], String, ContinuousAction->True,FieldHint->"Enter your ID"],Style[Dynamic[ Button["Send Answers",Off[Import::nffil];Off[DeleteFile::nffil]; If[ first == True,q=Import[FileNameJoin[{$UserDocumentsDirectory,"DARADARADARA"<>"symbolix.txt"}],"List"]; Gg2=DeleteDuplicates[Table[ToExpression[q[[i]]],{i, 1, Length[q]}]]; Table[qClicks[[Gg2[[i]][[1]]]]=Gg2[[i]],{i,1 Length[Gg2]}]]; Gg2=qClicks[[1;;qNum]]; Gg3=Gg2[[1;;qNum,2]]; res=True; arg=studentID<>" , "<>examName2<>" , "<>ToString[Ceiling[qTrunc4[Mean[Gg3]]*100]]<>" , "<>ToString[Gg2]<>" , "<>examIDString2<>" , "<>DateString[]<>" , "<>ToString[track]<>" , "<>IntegerString[Hash[ToString[Gg3]<>ToString[track]<>"gilan1339","MD5"],16];res2=qFlush[arg,studentID]; resF=URLFetch["http://symbolicexams.lossofgenerality.com/wp-content/plugins/test-receiver/results.php","Parameters"->{"results"->studentID<>" , "<>examName2<>" , "<>ToString[Ceiling[qTrunc4[Mean[Gg3]]*100]]<>" , "<>ToString[Gg2]<>" , "<>examIDString2<>" , "<>DateString[]<>" , "<>ToString[track]<>" , "<>IntegerString[Hash[ToString[Gg3]<>ToString[track]<>"Mehran1339","MD5"],16]},"ReadTimeout"->10,"ConnectTimeout"->50,"Method"->"POST"]; (*qLog[ToString[resF],studentID];*) status=If[resF===$Failed,"Failure to Send Answers, see MY DOCUMENTS for results file\nTake snapshot of the screen","Answers Sent, Good Luck!\n"];If[ first==True,DeleteFile[FileNameJoin[{$UserDocumentsDirectory,"DARADARADARA"<>"symbolix.txt"}]]];first=False;DeleteFile[FileNameJoin[{$UserDocumentsDirectory,"id"<>"symbolix.txt"}]];(*<>ToString[res2[[1]]]*)(*Clear["Global`*"];ClearAll[qClickPlus,qClick,readName]*),Method->"Queued" ,Enabled->buttonEnable]],DynamicEvaluationTimeout->Infinity] }]&}, TrackedSymbols->Manipulate, SaveDefinitions->True,AppearanceElements->None,SynchronousUpdating->False,ContinuousAction->False, Initialization:>(track=RandomInteger[{100000,900000}];qClicks = {{1, 0, -1, ""}, {2, 0, -1, ""}, {3, 0, -1, ""}, {4, 0, -1, ""}, {5, 0, -1, ""}, {6, 0, -1, ""},{7, 0, -1, ""},{8, 0, -1, ""},{9, 0, -1, ""},{10, 0, -1, ""}};first=True;studentID="";buttonEnable=False)] ] qSendLocal[]:=DynamicModule[{status="",a, body,text,ret1,ret2,tmp="",msg,res=False, track,res2,arg,Gg2, Gg3,qClicks,q,first=True,studentID="", buttonEnable=False ,resF ,ID}, Manipulate[ (*Refresh[If[first==True,studentID=readID[], If[readID[]==="",studentID,studentID=readID[]]],UpdateInterval->1];*) text=Dynamic[status]; buttonEnable=Dynamic[If[studentID!="", True]]; body={{Dynamic[If[res==True,Text[Style["Checked Marks Indicate Correct Answers\n"<>"\nTo Track this test: email "<>ToString[track]<>", "<>IntegerString[Hash[ToString[Gg2]<>ToString[track]<>"Mehran1339","MD5"],16]<>" to Deidre Lam \n"<>"Test results stored in file: "<>res2[[2]],Red,Background->Yellow]], ""]],Dynamic[If[res==True,CheckboxBar[Range[qNum]*Gg3,Range[qNum], Appearance->"Vertical",Enabled->False], ""]], Dynamic[Which[(Mean[Gg3] >= 0.8)&& (res == True), "\n\!\(\* StyleBox[\"Congratulations\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"!\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"You\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"passed\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"the\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)"<> examName <>" \!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"..\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\".\",\nFontColor->RGBColor[1, 0, 0]]\)\n\!\(\* StyleBox[\"Grade\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\":\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)"<>ToString[Ceiling[qTrunc4[Mean[Gg3]]*100]],(Mean[Gg3] < 0.8)&& (res == True), "\n \!\(\* StyleBox[\"Please\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"study\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"the\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)"<> examName <>" \!\(\* StyleBox[\"and\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"write\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"this\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"test\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\" \",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\"again\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\".\",\nFontColor->RGBColor[1, 0, 0]]\)\n\!\(\* StyleBox[\"Grade\",\nFontColor->RGBColor[1, 0, 0]]\)\!\(\* StyleBox[\":\",\nFontColor->RGBColor[1, 0, 0]]\) "<>ToString[Ceiling[qTrunc4[Mean[Gg3]]*100]],True,""]]},{"","",""}}; Deploy[ Style[Panel[Grid[Transpose[body],Alignment->Left,Spacings->{4,0.5}(*,ItemSize->20)*)],text,ImageMargins->1],DefaultOptions->{InputField->{ContinuousAction->True},FontSize->Large}]], {{a, 0,""}, Column[{InputField[Dynamic[studentID], String, FieldHint->"Enter your ID"],Style[Dynamic[ Button["Send Answers",Off[Import::nffil];Off[DeleteFile::nffil]; If[ first == True,q=Import[FileNameJoin[{$UserDocumentsDirectory,"DARADARADARA"<>"symbolix.txt"}],"List"]; Gg2=DeleteDuplicates[Table[ToExpression[q[[i]]],{i, 1, Length[q]}]]; Table[qClicks[[Gg2[[i]][[1]]]]=Gg2[[i]],{i,1 Length[Gg2]}]]; Gg2=qClicks[[1;;qNum]]; Gg3=Gg2[[1;;qNum,2]]; res=True; arg=studentID<>" , "<>examName2<>" , "<>ToString[Ceiling[qTrunc4[Mean[Gg3]]*100]]<>" , "<>ToString[Gg2]<>" , "<>examIDString2<>" , "<>DateString[]<>" , "<>ToString[track]<>" , "<>IntegerString[Hash[ToString[Gg3]<>ToString[track]<>"gilan1339","MD5"],16];res2=qFlushLAN[arg,studentID]; resF=URLFetch["http://symbolicexams.lossofgenerality.com/wp-content/plugins/test-receiver/results.php","Parameters"->{"results"->studentID<>" , "<>examName2<>" , "<>ToString[Ceiling[qTrunc4[Mean[Gg3]]*100]]<>" , "<>ToString[Gg2]<>" , "<>examIDString2<>" , "<>DateString[]<>" , "<>ToString[track]<>" , "<>IntegerString[Hash[ToString[Gg3]<>ToString[track]<>"Mehran1339","MD5"],16]},"ReadTimeout"->10,"ConnectTimeout"->50,"Method"->"POST"]; (*qLog[ToString[resF],studentID];*) status=If[resF===$Failed,"Failure to Send Answers, see MY DOCUMENTS for results file\nTake snapshot of the screen","Answers Sent, Good Luck!\n"];If[ first==True,DeleteFile[FileNameJoin[{$UserDocumentsDirectory,"DARADARADARA"<>"symbolix.txt"}]]];first=False;DeleteFile[FileNameJoin[{$UserDocumentsDirectory,"id"<>"symbolix.txt"}]];(*<>ToString[res2[[1]]]*)(*Clear["Global`*"];ClearAll[qClickPlus,qClick,readName]*),Method->"Queued" ,Enabled->buttonEnable]],DynamicEvaluationTimeout->Infinity] }]&}, TrackedSymbols->Manipulate, SaveDefinitions->True,AppearanceElements->None,SynchronousUpdating->False,ContinuousAction->False, Initialization:>(track=RandomInteger[{100000,900000}];qClicks = {{1, 0, -1, ""}, {2, 0, -1, ""}, {3, 0, -1, ""}, {4, 0, -1, ""}, {5, 0, -1, ""}, {6, 0, -1, ""},{7, 0, -1, ""},{8, 0, -1, ""},{9, 0, -1, ""},{10, 0, -1, ""}};first=True;studentID="";buttonEnable=False)] ] readTitle[]:=DynamicModule[{x="",a, body,inputs, text=Null,studentID}, Manipulate[ Deploy[ Panel[Column[{examIDString,examName,"\[Copyright] 2014-Present Ryerson Universtiy"}]]], "", TrackedSymbols->Manipulate, SaveDefinitions->True,AppearanceElements->None,SynchronousUpdating->False, Initialization:>(Off[Import::nffil];Off[DeleteFile::nffil];qClicks = {{1, 0, -1, ""}, {2, 0, -1, ""}, {3, 0, -1, ""}, {4, 0, -1, ""}, {5, 0, -1, ""}, {6, 0, -1, ""},{7, 0, -1, ""},{8, 0, -1, ""},{9, 0, -1, ""},{10, 0, -1, ""}};qNum=0;studentID=""; DeleteFile[FileNameJoin[{$UserDocumentsDirectory,"DARADARADARA"<>"symbolix.txt"}]];DeleteFile[FileNameJoin[{$UserDocumentsDirectory,"id"<>"symbolix.txt"}];qNum=0;](*If[DayCount[dateIssued, DateList[]] > experationInterval, Exit[]];*)),Paneled->False] ] readName[]:=DynamicModule[{x="",a, body,inputs, text=Null,studentID}, Manipulate[ (* If has to use TrueQ[]!!! *) text=Dynamic[If[TrueQ[x==Null], "", "ID Registered: "<>studentID]]; inputs=InputField[Dynamic[x], String, FieldHint->"Enter your ID"]; body={{inputs,Text[Style[examName<>"\n"<>examIDString,Red]]},{"",""}}; (*Refresh[studentID=studentID2 ,UpdateInterval->2,TrackedSymbols:>{studentID2}];*) Deploy[ Style[Panel[Grid[Transpose[body],Alignment->Left,Spacings->{4,0.5}(*,ItemSize->20)*)],text,ImageMargins->1],DefaultOptions->{InputField->{ContinuousAction->True},FontSize->Large}]], {{a, 0,""}, Button["Press To Register ID", studentID = x;writeID[studentID]]&}, TrackedSymbols->Manipulate, SaveDefinitions->True,AppearanceElements->None,SynchronousUpdating->False, Initialization:>(Off[Import::nffil];Off[DeleteFile::nffil];studentID=""; (*DeleteFile[FileNameJoin[{$UserDocumentsDirectory,"DARADARADARA"<>"symbolix.txt"}]];*)DeleteFile[FileNameJoin[{$UserDocumentsDirectory,"id"<>"symbolix.txt"}]]),Paneled->False] ] qTrunc1[a0_]:=If[IntegerQ[Ceiling[100*a0]/100], Ceiling[100*a0]/100, N[Ceiling[100*a0]/100]] qTrunc2[a0_]:=N[Floor[100*a0]/100] qTrunc3[a0_]:=N[Ceiling[10*a0]/10] qTrunc4[a0_]:=N[Floor[10*a0]/10] qTrunc5[a0_]:=N[Round[10*a0]/10] qSign[a0_]:=Which[a0>0, "+"<>ToString[Abs[a0]], a0<0, "-"<>ToString[Abs[a0]], a0==0, "0"] qSign2[a0_]:=Which[a0>0, "+", a0<0, "-", a0==0, ""] qSign3[a0_]:=Which[a0>0, "+"<>ToString[Abs[a0]], a0<0, "-"<>ToString[Abs[a0]], a0==0, "-0"] qSign4[a0_]:=Which[a0>0, "+"<>ToString[Abs[a0]], a0<0, "-"<>ToString[Abs[a0]], a0==0, "+0"] qSign5[a0_]:=Which[a0>0, "+"<>ToString[Abs[a0],StandardForm], a0<0, "-"<>ToString[Abs[a0],StandardForm], a0==0, ""] qSign6[a0_]:=Which[a0==1, "",a0>0, "+"<>ToString[Abs[a0],StandardForm], a0<0, "-"<>ToString[Abs[a0],StandardForm], a0==0, ""] not0[x_]:=If[x==0, 1, x] threeDifferent[list_]:=Module[{i,j,k}, i=1;j=1;k=1; While[i==j||j==k||i==k, i=RandomInteger[{1, Length[list]}];j=RandomInteger[{1, Length[list]}];k=RandomInteger[{1, Length[list]}];]; {list[[i]], list[[j]], list[[k]]} ] twoDifferent[list_]:=Module[{i,j}, i=1;j=1; While[i==j, i=RandomInteger[{1, Length[list]}];j=RandomInteger[{1, Length[list]}];]; {list[[i]], list[[j]]} ] qPanelsolution1[vars_]:=DynamicModule[{body,index,a,b,c,d,p,q,lhs,rhs,f,y,f2,f3,x,sols,X,xx1,xx2,expr1,expr2,yy1,yy2,lhs2,rhs2,min,max,fc,fx,n1,n2,n3,nn1,nn2,nn3,g1,g2,g3}, {index,a,b}=vars; body={ {{ ToString["Sin\[Theta]="]<>ToString["y"/"r", StandardForm], ToString["Since Sin(\[Theta])=",StandardForm]<>ToString[a/b,StandardForm]<>", y="<>ToString[a,StandardForm]<>", r="<>ToString[b,StandardForm], g1=ListLinePlot[{{0,0},{Sqrt[b^2-a^2],a}, {Sqrt[b^2-a^2],0}}]; g2=Graphics[Text[b, ({0,0.3}+{Sqrt[b^2-a^2],a})/2]]; g3=Graphics[Text[a, ({Sqrt[b^2-a^2],0}+ {Sqrt[b^2-a^2],a}+{0.3,0})/2]]; Show[g1,g2,g3, PlotRange->All], (*ToString["Sin\[Theta]",StandardForm]<>"="<>ToString[a/b,StandardForm]<>" and we know that "<>ToString["Sin"^2*"\[Theta]"+"Cos"^2*"\[Theta]" ,StandardForm]<>"=1",*) "Find x by using Pythagorean Theorem:", ToString["x"^2+(a)^"2" ,TraditionalForm]<>"="<>ToString[ToString[b,StandardForm]^2,StandardForm], ToString["x"^2 ,TraditionalForm]<>"="<>ToString[ToString[b^2-a^2,StandardForm],StandardForm], "x=\[PlusMinus]"<>ToString[ToString[Sqrt[b^2-a^2],StandardForm],StandardForm], "Since \[Theta] is acute, x=+"<>ToString[ToString[Sqrt[b^2-a^2],StandardForm],StandardForm], ToString["Therefore, Cos\[Theta]=" ,StandardForm]<>ToString[ToString[Sqrt[b^2-a^2]/b,StandardForm],StandardForm] }, {Null,Null,Null,Null,Null,Null,Null,Null,Null}}, {{ ToString["Cos\[Theta]="]<>ToString["x"/"r", StandardForm], ToString["Since Cos(\[Theta])=",StandardForm]<>ToString[a/b,StandardForm]<>", x="<>ToString[a,StandardForm]<>", r="<>ToString[b,StandardForm], g1=ListLinePlot[{{0,0},{a,Sqrt[b^2-a^2]}, {a,0}}]; g2=Graphics[Text[b, ({0,0.3}+{a,Sqrt[b^2-a^2]})/2]]; g3=Graphics[Text[a, ({a,0}+{0,0.3})/2]]; Show[g1,g2,g3, PlotRange->All], (*ToString["Sin\[Theta]",StandardForm]<>"="<>ToString[a/b,StandardForm]<>" and we know that "<>ToString["Sin"^2*"\[Theta]"+"Cos"^2*"\[Theta]" ,StandardForm]<>"=1",*) "Find y by using Pythagorean Theorem:", ToString["y"^2+(a)^"2" ,TraditionalForm]<>"="<>ToString[ToString[b,StandardForm]^2,StandardForm], ToString["y"^2 ,TraditionalForm]<>"="<>ToString[ToString[b^2-a^2,StandardForm],StandardForm], "y=\[PlusMinus]"<>ToString[ToString[Sqrt[b^2-a^2],StandardForm],StandardForm], "Since \[Theta] is acute, y=+"<>ToString[ToString[Sqrt[b^2-a^2],StandardForm],StandardForm], ToString["Therefore, Sin\[Theta]=" ,StandardForm]<>ToString[ToString[Sqrt[b^2-a^2]/b,StandardForm],StandardForm] }, {Null,Null,Null,Null,Null,Null,Null,Null,Null}}, {{ ToString["tan\[Theta]="]<>ToString["y"/"x", StandardForm], ToString["Since Sin(\[Theta])=",StandardForm]<>ToString[a/b,StandardForm]<>", y="<>ToString[a,StandardForm]<>", r="<>ToString[b,StandardForm], g1=ListLinePlot[{{0,0},{Sqrt[b^2-a^2],a}, {Sqrt[b^2-a^2],0}}]; g2=Graphics[Text[b, ({0,0.3}+{Sqrt[b^2-a^2],a})/2]]; g3=Graphics[Text[a, ({Sqrt[b^2-a^2],0}+ {Sqrt[b^2-a^2],a}+{0.3,0})/2]]; Show[g1,g2,g3, PlotRange->All], (*ToString["Sin\[Theta]",StandardForm]<>"="<>ToString[a/b,StandardForm]<>" and we know that "<>ToString["Sin"^2*"\[Theta]"+"Cos"^2*"\[Theta]" ,StandardForm]<>"=1",*) "Find x by using Pythagorean Theorem:", ToString["x"^2+(a)^"2" ,TraditionalForm]<>"="<>ToString[ToString[b,StandardForm]^2,StandardForm], ToString["x"^2 ,TraditionalForm]<>"="<>ToString[ToString[b^2-a^2,StandardForm],StandardForm], "x=\[PlusMinus]"<>ToString[ToString[Sqrt[b^2-a^2],StandardForm],StandardForm], "Since \[Theta] is acute, x=+"<>ToString[ToString[Sqrt[b^2-a^2],StandardForm],StandardForm], ToString["Therefore, Tan\[Theta]=" ,StandardForm]<>ToString[ToString[a/Sqrt[b^2-a^2],StandardForm],StandardForm] }, {Null,Null,Null,Null,Null,Null,Null,Null,Null}} }; Panel[Grid[Transpose[body[[index]]]]] ] qPanelVariation1[pn_, vars_]:=Module[{variations,index, a,b,c,d,lhs,rhs,lhs2,rhs2,p,q,x}, {index, a,b}=vars; variations={{Which[index==1, ToString["Sin\[Theta]",StandardForm]<>"="<>ToString[a/b,StandardForm]<>" and \[Theta] is acute, the value of "<>ToString["Cos\[Theta]",StandardForm]<>" is:", index==2, ToString["Cos\[Theta]",StandardForm]<>"="<>ToString[a/b,StandardForm]<>" and \[Theta] is acute, the value of "<>ToString["Sin\[Theta]",StandardForm]<>" is:", index==3,ToString["Sin\[Theta]",StandardForm]<>"="<>ToString[a/b,StandardForm]<>" and \[Theta] is acute, the value of "<>ToString["Tan\[Theta]",StandardForm]<>" is:"]} }; text=ToString[pn]<>". "<>qRandList[variations] ] qPanelAnswers1[vars_]:=Module[{index, a,b,c,d,lhs,rhs,f,f3,X,y,xx1,xx2,sols,sols2,sols3,m1,m2,m3,a2,x,xx,expr1,expr2,yy1,yy2}, {index,a,b}=vars; { Which[index==1, ToString[Sqrt[1-(a/b)^2]/2,StandardForm],index==2,ToString[Sqrt[1-(a/b)^2]/2,StandardForm], index==3,ToString[ToString[(1/2)*a/Sqrt[b^2-a^2],StandardForm],StandardForm]], Which[index==1, ToString[Sqrt[1-(a/b)],StandardForm],index==2,ToString[Sqrt[1-(a/b)],StandardForm], index==3,ToString[ToString[a/(b^2-a^2),StandardForm],StandardForm]], Which[index==1, ToString[Sqrt[1-(a/b)^2],StandardForm],index==2,ToString[Sqrt[1-(a/b)^2],StandardForm], index==3,ToString[ToString[a/Sqrt[b^2-a^2],StandardForm],StandardForm]], Which[index==1, ToString[Sqrt[1-(a/b)^2]/3,StandardForm],index==2,ToString[Sqrt[1-(a/b)^2]/3,StandardForm], index==3,ToString[ToString[(1/3)*a/Sqrt[b^2-a^2],StandardForm],StandardForm]]} ] qPanelTRYAGAIN1[]:=Module[{index, a,b,c,x,rhs,lhs,p,q,d,list}, list=Join[{1},Table[Prime[n],{n,4}]]; a=2; b=2; While[a==b || a>b, a=list[[RandomInteger[{1,Length[list]}]]]; b=list[[RandomInteger[{1,Length[list]}]]];]; index=RandomInteger[{1,3}]; {index,a,b} ] qPaneHint1[vars_]:=Module[{}, ToString["Sin\[Theta]="<>ToString["y"/"r", StandardForm],StandardForm]<>ToString[", Cos\[Theta]="<>ToString["x"/"r", StandardForm],StandardForm]<>ToString[", tan\[Theta]="<>ToString["y"/"x", StandardForm],StandardForm]<>".\n Draw a diagram and use Pythagorean Theorem:\n "<>ToString["x"^2 + "y"^2 ,StandardForm]<>"="<>ToString[ "r"^2,StandardForm] ] qPaneHint1v2[vars_]:=Module[{alpha}, (* code adopted from Izidor Hafner *) Style[ Manipulate[If[ch=="first",Graphics[ { RGBColor[.79, .71, 0.26], Polygon[{{0,0},{1,0},{Cos[alpha]^2,Cos[alpha]Sin[alpha]}}], Black, Text[Style["\[Alpha]",12],{Cos[alpha/2],Sin[alpha/2]}/6], Text[Style[\[Pi]/2-"\[Alpha]",12],{1,0}-{Cos[Pi/4-alpha/2],-Sin[Pi/4-alpha/2]}/6], Arrow[{{.55, -.1}, {1,-.1}}], Arrow[{{.45, -.1}, {0,-.1}}], Text[Style[1,16],{0.5+0.01,-0.1}], RGBColor[0, 0, 1], Line[{{Cos[alpha]^2,Cos[alpha]Sin[alpha]},{Cos[alpha]^2,0}}], If[sh, {Black, Text[Style[Cos["\[Alpha]"],12],{Cos[alpha]^2,Cos[alpha]Sin[alpha]}/2], Text[Style[Sin["\[Alpha]"],12],{Cos[alpha]^2+Sin[alpha]^2/2,Cos[alpha]Sin[alpha]/2}], Text[Style[TraditionalForm[Cos["\[Alpha]"]^2],16],{Cos[alpha]^2/2,-0.04}], Text[Style[TraditionalForm[Sin["\[Alpha]"]^2],16],{Cos[alpha]^2+Sin[alpha]^2/2,-0.04}]},{}]}, PlotRange->{{-.2,1.2},{-.2,.7}},ImageSize->{500,350}],With[{betha=Pi/2-alpha},With[{triangle1=Polygon[{{0,0},{Cos[betha],0},{Cos[betha],Sin[betha]}}],triangle2=Polygon[{{0,0},{Cos[alpha],0},{Cos[alpha],-Sin[alpha]}}], rhombus=Line[{{0,0},{Cos[alpha],-Sin[alpha]},{Cos[alpha],-Sin[alpha]}+{Cos[betha],Sin[betha]},{Cos[betha],Sin[betha]},{0,0}}]},Graphics[{{RGBColor[.33, .6, .7],Polygon[{{Cos[betha],0},{Cos[alpha],0},{Cos[alpha],-Sin[alpha]},{Cos[alpha],-Sin[alpha]}+{Cos[betha],Sin[betha]},{Cos[betha],Sin[betha]}}]},rhombus, Translate[{{RGBColor[0.6, .73, 0.36],triangle1}},k{Cos[alpha],-Sin[alpha]}], Translate[{{RGBColor[.9, .42, .17],triangle2}},k{Cos[betha],Sin[betha]}], Line[{{0,0},{Cos[alpha]+Cos[betha],0}}], Text[Style[\[Pi]/2-"\[Alpha]",12],{Cos[betha],Sin[betha]/2}/3], Text[Style["\[Alpha]",12],{Cos[alpha],-Sin[alpha]/3}/3], Text[Style[1,16],{Cos[alpha]-0.08,-Sin[alpha]}/2], Text[Style[1,16],{Cos[betha]-0.08,Sin[betha]}/2], If[sh, {Translate[{Text[Style[Sin["\[Alpha]"],12],{Cos[betha]/2,0.03}]},k{Cos[alpha],-Sin[alpha]}], Translate[{Text[Style[Cos["\[Alpha]"],12],{Cos[alpha]/2,-0.03}]},k{Cos[betha],Sin[betha]}], Text[Style[TraditionalForm[Sin["\[Alpha]"]],12],{Cos[alpha],-Sin[alpha]/2}], Text[Style[Cos["\[Alpha]"],12],{Cos[betha],Sin[betha]/2}]},{}]}, PlotRange->{{-0.1,2},{-1,1}},ImageSize->{500,350}]]]], {{ch,"first","proof"},{"first","second"}}, {{alpha,Pi/3.,"\[Alpha]"},0.,Pi/2.,Appearance->"Labeled"}, PaneSelector[{ True->Control@{{k,0,"translate"},0,1,Enabled->ch=="second"} },Dynamic[ch==="second"]], {{sh,True,"show tip"},{False,True}},AutorunSequencing->{1,2,4}] , DynamicBoxOptions -> {BaseStyle -> Magnification -> 2*qMagnification/3}] ] qPanelEXPR1[]:="" makeVARS1[]:=Module[{list, i, y1,y2,y3, p,q,d,c,x}, {} ] qPanel1[pn0_,diag0_]:= DynamicModule[{xxx, pn=pn0,text,person,variations,A1=False,B1=False,C1=False,D1=False,vars,answer,b,bb,c,cc,aa,a,d,dd,rem,m,n,myEnabled=True,text2,body, answers, checks,answersShuffled,checksShuffled,index,answerStudent,tryAgain=True, state=False, stateH=False,diag=diag0,g }, qNum +=1; If[diag==False, (* this is diagnosis training test *) Style[Manipulate[ xxx=xxx; (* kludge *) vars=qPanelTRYAGAIN1[]; text=qPanelVariation1[pn, vars]; answer="?"; answerStudent=Dynamic[Which [A1,myEnabled=False;qClickPlus[pn];text<>"\n\nAnswer \!\(\* StyleBox[\"Incorrect\",\nFontColor->RGBColor[1, 0, 0]]\)",C1,qClick[pn];qTryAgainNOT[pn];myEnabled=False;text<>"\n\nAnswer Correct",B1,qClickPlus[pn];myEnabled=False;text<>"\n\nAnswer \!\(\* StyleBox[\"Incorrect\",\nFontColor->RGBColor[1, 0, 0]]\)",D1, myEnabled=False;qClickPlus[pn];text<>"\n\nAnswer \!\(\* StyleBox[\"Incorrect\",\nFontColor->RGBColor[1, 0, 0]]\)", True, text<>"\n\nAnswer ?"]]; answers=qPanelAnswers1[vars]; checks = {Checkbox[Dynamic[A1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[B1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[C1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[D1],Enabled->Dynamic[myEnabled]]}; (* Shuffle the answer keys *) index = RandomSample[Range[Length[answers]]]; answersShuffled = Table[answers[[index[[i]]]], {i, 1,Length[answers]}]; checksShuffled = Table[checks[[index[[i]]]], {i, 1,Length[answers]}]; body = { (* First row/colum the answer key *) {"A","B","C","D"}, (* First row/colum the proposed answers key *) answersShuffled, (* First row/colum the answer check boxes*) checksShuffled }; (* Kludge: answerStudent has problem with <>, so concatenated earlier*) Deploy[ Style[Panel[Grid[Transpose[body],Alignment->Left],Column[{answerStudent,qPanelEXPR1[]}],ImageMargins->10]]], {{xxx,1,""}, (* initial value of xxx, xxx=RandomReal[0.5] has to be in the button or else the test would not repeat*) Grid[{ {OpenerView[{Button["New Question",qTryAgain[pn];xxx=RandomReal[0.5];vars=qPanelTRYAGAIN1[];myEnabled=True;A1=False; B1=False;C1=False; D1= False], "Try again"}], OpenerView[{Button["Hint",qTryAgain[pn];stateH=Not[stateH]],qPaneHint1[vars]},stateH], OpenerView[{Button["Solution",qTryAgain[pn];state=Not[state]],qPanelsolution1[vars]},state]} ,{Null,Null,Null}}] &}, TrackedSymbols->Manipulate, SaveDefinitions->True,AppearanceElements->None,Initialization:>(qClicks = {{1, 0, 0, ""}, {2, 0, 0, ""}, {3, 0, 0, ""}, {4, 0, 0, ""}, {5, 0, 0, ""}, {6, 0, 0, ""},{7, 0, 0, ""},{8, 0, 0, ""},{9, 0, 0, ""},{10, 0, 0, ""}})] (*Manipulate*) , DynamicBoxOptions -> {BaseStyle -> Magnification -> qMagnification}] , (* Else if actual test *) Style[Manipulate[ vars=qPanelTRYAGAIN1[]; text=qPanelVariation1[pn,vars]; answer="?"; answerStudent=Dynamic[Which [A1,myEnabled=False;qClickPlus[pn];text<>"",C1,qClick[pn];qTryAgainNOT[pn];myEnabled=False;text<>"",B1,qClickPlus[pn];myEnabled=False;text<>"",D1, myEnabled=False;qClickPlus[pn];text<>"", True, text<>""]]; answers=qPanelAnswers1[vars]; checks = {Checkbox[Dynamic[A1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[B1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[C1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[D1],Enabled->Dynamic[myEnabled]]}; (* Shuffle the answer keys *) index = RandomSample[Range[Length[answers]]]; answersShuffled = Table[answers[[index[[i]]]], {i, 1,Length[answers]}]; checksShuffled = Table[checks[[index[[i]]]], {i, 1,Length[answers]}]; body = { (* First row/colum the answer key *) {"A","B","C","D"}, (* First row/colum the proposed answers key *) answersShuffled, (* First row/colum the answer check boxes*) checksShuffled }; (* Kludge: answerStudent has problem with <>, so concatenated earlier*) Deploy[ Style[Panel[Grid[Transpose[body],Alignment->Left],Column[{answerStudent,qPanelEXPR1[]}],ImageMargins->10]]], "", TrackedSymbols->Manipulate, SaveDefinitions->True, AppearanceElements->None,Initialization:>(qClicks = {{1, 0, 0, ""}, {2, 0, 0, ""}, {3, 0, 0, ""}, {4, 0, 0, ""}, {5, 0, 0, ""}, {6, 0, 0, ""},{7, 0, 0, ""},{8, 0, 0, ""},{9, 0, 0, ""},{10, 0, 0, ""}})] (*Manipulate*) , DynamicBoxOptions -> {BaseStyle -> Magnification -> qMagnification}] ] ] qPanelsolution2[vars_]:=DynamicModule[{body,a,b,c,d,p,q,lhs,rhs,f,y,f2,f3,x,sols,X,xx1,xx2,expr1,expr2,yy1,yy2,lhs2,rhs2,min,max,fc,fx,n1,n2,n3,nn1,nn2,nn3}, {a,c}=vars; body={{ "Note: Tan("<>ToString[a*Pi,StandardForm]<>")=Tan("<>ToString[ArcTan[Tan[a*Pi]],StandardForm]<>")=Tan("<>ToString[Round[N[ArcTan[Tan[a*Pi]]/Degree]],StandardForm]<>"\[Degree])="<>ToString[Tan[a*Pi],StandardForm], ToString["tan("<>"x"<>"-"<>ToString[a*Pi,StandardForm]<>")", StandardForm]<>"="<>ToString[(ToString[Tan["x"], TraditionalForm]-ToString[Tan[ToString[a*Pi,StandardForm]], TraditionalForm])/("1+"<>ToString[Tan["x"], TraditionalForm]<>ToString["tan("<>ToString[a*Pi,StandardForm]<>")", StandardForm]),StandardForm], "="<>ToString[(ToString[c]-ToString[Tan[ToString[a*Pi,StandardForm]], TraditionalForm])/("1+("<>ToString[c,StandardForm]<>")\[Cross]"<>ToString["tan("<>ToString[a*Pi,StandardForm]<>")", StandardForm]),StandardForm], (*ANNA*) "="<>ToString[(ToString[c]-ToString["("<>ToString[(Tan[a*Pi]), TraditionalForm]<>")",TraditionalForm])/("1+("<>ToString[c,StandardForm]<>")\[Cross]"<>ToString["("<>ToString[(Tan[a*Pi]),TraditionalForm]<>")", StandardForm]),StandardForm], "="<>If[(IntegerQ[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]]==True && IntegerQ[Numerator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]] == True ) || (IntegerQ[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]]==True && IntegerQ[Numerator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]] == False ) , ToString[(ToString[Simplify[(c-Tan[a*Pi])],TraditionalForm]<>" ")/ToString[Simplify[(1+c*Tan[a*Pi])],TraditionalForm], TraditionalForm] ,ToString[(c-Tan[a*Pi])/(1+c*Tan[a*Pi]),StandardForm]], "="<>Which[ (IntegerQ[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]]==False && IntegerQ[Numerator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]] == False ) , ToString[ToString[(c-Tan[a*Pi])/(1+c*Tan[a*Pi]),StandardForm]<>" x "<>ToString[(ToString[(1-c*Tan[a*Pi]),TraditionalForm]<>" ")/ToString[(1-c*Tan[a*Pi]),TraditionalForm], TraditionalForm]<>"\n="<> ToString[(ToString[ "("<>ToString[1*c,TraditionalForm]<>")+("<>ToString[c*(-c*Tan[a*Pi]),TraditionalForm]<>")+("<>ToString[-Tan[a*Pi],TraditionalForm]<>")+("<>ToString[Tan[a*Pi]*(c*Tan[a*Pi]),TraditionalForm]<>")" ,TraditionalForm]<>" ")/ToString[ToString[1,TraditionalForm]<>"-"<>ToString[Power[c*Tan[a*Pi],2],TraditionalForm],TraditionalForm], TraditionalForm] <>"\n="<> ToString[(ToString[Expand[(c-Tan[a*Pi])*(1-c*Tan[a*Pi])],TraditionalForm]<>" ")/ToString[Simplify[1-Power[c*Tan[a*Pi],2]],TraditionalForm], TraditionalForm] (**)<>"\n ="<> If[IntegerQ[1-Power[c*Tan[a*Pi],2]] ==False, ToString["("<>ToString[Expand[(c-Tan[a*Pi])*(1-c*Tan[a*Pi])],TraditionalForm]<>") x ("<> ToString[Simplify[1/(1-Power[c*Tan[a*Pi],2])],TraditionalForm]<>") \n = ("<> ToString[(ToString[Numerator[Expand[(c-Tan[a*Pi])*(1-c*Tan[a*Pi])][[1]] ] * Denominator[Expand[(c-Tan[a*Pi])*(1-c*Tan[a*Pi])][[2]]] + Denominator[Expand[(c-Tan[a*Pi])*(1-c*Tan[a*Pi])][[1]]]* Numerator[Expand[(c-Tan[a*Pi])*(1-c*Tan[a*Pi])][[2]]] ,TraditionalForm]<>" ")/ToString[(Denominator[Expand[(c-Tan[a*Pi])*(1-c*Tan[a*Pi])][[1]]]*Denominator[Expand[(c-Tan[a*Pi])*(1-c*Tan[a*Pi])][[2]]]),TraditionalForm], TraditionalForm]<>") x ("<>ToString[Simplify[1/(1-Power[c*Tan[a*Pi],2])],TraditionalForm]<>") \n = (" <> ToString[(ToString[Numerator[Expand[(c-Tan[a*Pi])*(1-c*Tan[a*Pi])][[1]] ] * Denominator[Expand[(c-Tan[a*Pi])*(1-c*Tan[a*Pi])][[2]]] + Denominator[Expand[(c-Tan[a*Pi])*(1-c*Tan[a*Pi])][[1]]]* Numerator[Expand[(c-Tan[a*Pi])*(1-c*Tan[a*Pi])][[2]]] ,TraditionalForm]<>" ")/ToString[(Denominator[Expand[(c-Tan[a*Pi])*(1-c*Tan[a*Pi])][[2]]]*Denominator[Simplify[1/(1-Power[c*Tan[a*Pi],2])]] ),TraditionalForm], TraditionalForm]<> If[ Simplify[1/(1-Power[c*Tan[a*Pi],2])] > 0 ,") x (",") x (-"] <>ToString[(ToString[Denominator[Expand[(c-Tan[a*Pi])*(1-c*Tan[a*Pi])][[2]]],TraditionalForm]<>" ")/ToString[Denominator[Expand[(c-Tan[a*Pi])*(1-c*Tan[a*Pi])][[2]]],TraditionalForm], TraditionalForm]<>")" , TraditionalForm]<>"\n = "<> ToString[Simplify[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],StandardForm]<>" Simplified" , If[ (IntegerQ[Denominator[ Simplify[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])] ]]==True && Denominator[ Simplify[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])] ]!=1 && Simplify[1-Power[c*Tan[a*Pi],2]] <0 ), ToString[(ToString[Expand[-(c-Tan[a*Pi])*(1-c*Tan[a*Pi])],TraditionalForm]<>" ")/ToString[Abs[Simplify[1-Power[c*Tan[a*Pi],2]]],TraditionalForm], TraditionalForm] <>"Simplified" ,ToString[Simplify[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],StandardForm]<>"Simplified" ] ] (*<>"\n koniec="<> ToString[Simplify[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],StandardForm] <>" Simplified" *) ,TraditionalForm ], (IntegerQ[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]]==False && IntegerQ[Numerator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]] == True && ((c-Tan[a*Pi])/(1+c*Tan[a*Pi]))>=0 ) , ToString[ ToString[(c-Tan[a*Pi])/(1+c*Tan[a*Pi]),StandardForm]<>" x " <>ToString[ (ToString[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],TraditionalForm]<>" ")/ToString[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],TraditionalForm] , TraditionalForm] <>"="<>ToString[(ToString[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],TraditionalForm]<>" ")/ToString[Power[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],2],TraditionalForm] , TraditionalForm]<>" Simplified" ,TraditionalForm], (IntegerQ[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]]==False && IntegerQ[Numerator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]] == True && ((c-Tan[a*Pi])/(1+c*Tan[a*Pi]))<0 ) , ToString[ ToString[(c-Tan[a*Pi])/(1+c*Tan[a*Pi]),StandardForm]<>" x " <>ToString[ (ToString[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],TraditionalForm]<>" ")/ToString[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],TraditionalForm] , TraditionalForm] <>"= -"<>ToString[(ToString[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],TraditionalForm]<>" ")/ToString[Power[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],2],TraditionalForm] , TraditionalForm]<>" Simplified" ,TraditionalForm], (IntegerQ[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]]==True && IntegerQ[Numerator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]] == True ) , ToString[ ToString[Simplify[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],StandardForm]<>" Simplified" ,TraditionalForm], (IntegerQ[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]]==True && IntegerQ[Numerator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]] == False ) , ToString[ ToString[Simplify[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],StandardForm]<>" Simplified" ,TraditionalForm] ] (*ANNA*) (* original: (*ANNA*) (*KLUDGE: it is not working good !!!*) "="<>ToString[(c-Tan[a*Pi])/(1+c*Tan[a*Pi]),StandardForm]<>" x "<>ToString[(ToString[(1-c*Tan[a*Pi]),TraditionalForm]<>" ")/ToString[(1-c*Tan[a*Pi]),TraditionalForm], TraditionalForm], (*ANNA*) *) (*"="<>ToString[Simplify[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],StandardForm]<>" Simplified"*) }, {Null,Null,Null,Null,Null,Null} }; Panel[Grid[Transpose[body]]] ] qPanelVariation2[pn_, vars_]:=Module[{a,b,c,d,lhs,rhs,lhs2,rhs2,p,q,x}, {a,c}=vars; variations={{"If "<>ToString[Tan["x"], TraditionalForm]<>"="<>ToString[c]<>", "<>ToString["tan("<>"x"<>"-"<>ToString[a*Pi,StandardForm]<>")", StandardForm]<>" equals:"} }; text=ToString[pn]<>". "<>qRandList[variations] ] qPanelAnswers2[vars_]:=Module[{a,b,c,d,lhs,rhs,f,f3,X,y,xx1,xx2,sols,sols2,sols3,m1,m2,m3,a2,x,xx,expr1,expr2,yy1,yy2,correct,p,q}, {a,c}=vars; correct=Which[ (IntegerQ[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]]==False && IntegerQ[Numerator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]] == False && Denominator[Simplify[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]]==1 ) , ToString[Simplify[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],TraditionalForm], (IntegerQ[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]]==False && IntegerQ[Numerator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]] == False && Denominator[Simplify[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]]!=1 ) ,ToString[(ToString[Expand[-(c-Tan[a*Pi])*(1-c*Tan[a*Pi])],TraditionalForm]<>" ")/ToString[Abs[Simplify[1-Power[c*Tan[a*Pi],2]]],TraditionalForm], TraditionalForm] , (IntegerQ[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]]==False && IntegerQ[Numerator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]] == True && ((c-Tan[a*Pi])/(1+c*Tan[a*Pi]))>=0 ) , ToString[(ToString[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],TraditionalForm]<>" ")/ToString[Power[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],2],TraditionalForm] , TraditionalForm], (IntegerQ[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]]==False && IntegerQ[Numerator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]] == True && ((c-Tan[a*Pi])/(1+c*Tan[a*Pi]))<0 ) , ToString["-"<>ToString[(ToString[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],TraditionalForm]<>" ")/ToString[Power[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],2],TraditionalForm] , TraditionalForm],TraditionalForm], (IntegerQ[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]]==True && IntegerQ[Numerator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]] == True ) , ToString[Simplify[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],TraditionalForm], (IntegerQ[Denominator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]]==True && IntegerQ[Numerator[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]] == False ) ,ToString[Simplify[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],TraditionalForm] ]; p=Numerator[Simplify[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]]; q=Denominator[Simplify[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])]]; {Which[(p+1)==0, 0,q!=1 && q!=-1 , ToString[ToString[(p+1),TraditionalForm]/ToString[(q),TraditionalForm],TraditionalForm],True, ToString[ToString[q*(p+1),TraditionalForm],TraditionalForm]], Which[(p+2)==0, 0,q!=1 && q!=-1 , ToString[ToString[(p+2),TraditionalForm]/ToString[(q),TraditionalForm],TraditionalForm], True, ToString[ToString[q*(p+2),TraditionalForm],TraditionalForm]], correct, (*ToString[Simplify[(c-Tan[a*Pi])/(1+c*Tan[a*Pi])],StandardForm],*) Which[(p-1)==0, 0,q!=1 && q!=-1 , ToString[ToString[(p-1),TraditionalForm]/ToString[(q),TraditionalForm],TraditionalForm], True,ToString[ToString[q*(p-1),TraditionalForm],TraditionalForm]]} ] qPanelTRYAGAIN2[]:=Module[{a,b,c,x,rhs,lhs,p,q,d,list}, makeVARS2[] ] qPaneHint2[vars_]:=Module[{}, "Use identity: Tan(A+B) or Tan(A-B)." ] qPaneHint2v2[vars_]:=Module[{y}, (* code adopted from \[NonBreakingSpace]C. Ormullion *) Style[ Manipulate[ DynamicModule[{theta,pt,pconstrained}, pt[a_]:={Cos[a],Sin[a]}; theta= Mod[ArcTan@@plocator,2 Pi,0]; pconstrained=pt[theta]; Column[{ Graphics[ { AbsoluteThickness[2], LightGray, Circle[], (* line joining centre to locator on circle *) Arrowheads[{-.025,.025}], Black, Line[{{0,0},pconstrained}], If[Abs[theta] >0.01, { (* angle arc indicator *) { Arrowheads[{.01}], (* do the arrow on arc the hard way *) Arrow[Table[{.15 Cos[k],.15 Sin[k]},{k,0,theta,theta/25}]], Style[Text["\[Theta]",{0.1,0.05}],16, Black] }, (* sin *) { Darker@Red, Arrowheads[{-.025,.025}], Arrow[{{pconstrained[[1]],0}, pconstrained}], White, Disk[Mean[{{pconstrained[[1]],0.1},pconstrained}],.04], Darker@Red, Tooltip[ Style[Text["sin \[Theta]",Mean[{{pconstrained[[1]],0.1},pconstrained}]],14], StringForm["sin(``) = ``",NumberForm[theta,2],Sin[theta]]] }, (* cos *) { Darker@Orange, Arrow[{{0,0.02},{pconstrained[[1]],0.02}}], Tooltip[ Style[Text["cos \[Theta]", {pconstrained[[1]] /2,0.04}],14], StringForm["cos(``) = ``",NumberForm[theta,2],Cos[theta]]] }, (* tangent *) { Darker@Yellow, Arrow[{pconstrained,{Sec[theta],0}}], White, Disk[ Mean[{pconstrained,{Sec[theta],0}}],.06], Darker@Yellow, Tooltip[ Style[Text["tan \[Theta]", Mean[{pconstrained,{Sec[theta],0}}]],14], StringForm["tan(``) = ``",NumberForm[theta,2],Tan[theta]]] }, (* secant *) { Darker@Green, Arrow[{{0,-0.01},{Sec[theta],-0.01}}], Tooltip[ Style[Text["sec \[Theta]", {Min[Sec[theta]/2,1.2] ,-0.06}],14], StringForm["sec(``) = ``",NumberForm[theta,2],Sec[theta]]] }, (* cosecant *) { Darker@Blue, Arrow[{{-0.02,0},{-0.02,Csc[theta]}}], White, Disk[Mean[{{-0.02,0},{-0.02,Csc[theta]}}],.04], Darker@Blue, Tooltip[ Style[Text["csc \[Theta]", Mean[{{-0.03,0},{-0.03,Csc[theta]}}]],14], StringForm["csc(``) = ``",NumberForm[theta,2],Csc[theta]]] }, (* cotangent *) { Darker@Magenta, Arrow[{{0,Csc[theta]},pconstrained}], White, Disk[Mean[{pconstrained,{0,Csc[theta]}}],.04], Darker@Magenta, Tooltip[ Style[Text["cot \[Theta]", Mean[{pconstrained,{0,Csc[theta]}}]],14], StringForm["cot(``) = ``",NumberForm[theta,2],Cot[theta]]] } } ] (* if *), (* moving text next to red dot *) Gray, Text[NumberForm[#,2]& /@ pconstrained,pconstrained,-2 pconstrained], (* the red dot, showing the locator's constrained position *) {PointSize[.02], Red, Point[pconstrained]} }, PlotRange->{{-1.6,1.6},{-1.4,1.4}}, Axes -> True, Ticks -> None, AxesStyle -> Gray, AxesLabel->{"x","y"}, ImageSize -> {580,420} ],(* end of graphics *) (* display of angle - use nearestRat function to find nearest Pi-related fraction *) Text@Style[Row[{"\[Theta] = ",NumberForm[theta,2]," (\[TildeTilde] ",nearestRat[theta], ") radians, ", theta /Degree, "\[Degree]"}], 14] }, Alignment -> Center, ItemSize -> {Automatic,5}] (* column *) ], (* controls *) {{plocator,{1.0,1}},Locator, Appearance -> None}, Initialization:> (nearestRat[a_] := First@Nearest[ Table[p, {p,0, 2 Pi, Pi/24}], a])] , DynamicBoxOptions -> {BaseStyle -> Magnification -> 2*qMagnification/3}] ] qPanelEXPR2[]:="" makeVARS2[]:=Module[{list, i, y1,y2,y3, p,q,d,c,x,a}, list={1/3,1/4,1/6}; a=1/4; c=Tan[Pi*3/4]; While[1+Tan[Pi*a]*c==0, a=list[[RandomInteger[{1, Length[list]}]]]+RandomInteger[{0,4}]/2; c=RandomInteger[{-2,2}];]; {a,c} ] qPanel2[pn0_,diag0_]:= DynamicModule[{xxx, pn=pn0,text,person,variations,A1=False,B1=False,C1=False,D1=False,vars,answer,b,bb,c,cc,aa,a,d,dd,rem,m,n,myEnabled=True,text2,body, answers, checks,answersShuffled,checksShuffled,index,answerStudent,tryAgain=True, state=False, stateH=False,diag=diag0,g }, qNum +=1; If[diag==False, (* this is diagnosis training test *) Style[Manipulate[ xxx=xxx; (* kludge *) vars=qPanelTRYAGAIN2[]; text=qPanelVariation2[pn, vars]; answer="?"; answerStudent=Dynamic[Which [A1,myEnabled=False;qClickPlus[pn];text<>"\n\nAnswer \!\(\* StyleBox[\"Incorrect\",\nFontColor->RGBColor[1, 0, 0]]\)",C1,qClick[pn];qTryAgainNOT[pn];myEnabled=False;text<>"\n\nAnswer Correct",B1,qClickPlus[pn];myEnabled=False;text<>"\n\nAnswer \!\(\* StyleBox[\"Incorrect\",\nFontColor->RGBColor[1, 0, 0]]\)",D1, myEnabled=False;qClickPlus[pn];text<>"\n\nAnswer \!\(\* StyleBox[\"Incorrect\",\nFontColor->RGBColor[1, 0, 0]]\)", True, text<>"\n\nAnswer ?"]]; answers=qPanelAnswers2[vars]; checks = {Checkbox[Dynamic[A1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[B1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[C1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[D1],Enabled->Dynamic[myEnabled]]}; (* Shuffle the answer keys *) index = RandomSample[Range[Length[answers]]]; answersShuffled = Table[answers[[index[[i]]]], {i, 1,Length[answers]}]; checksShuffled = Table[checks[[index[[i]]]], {i, 1,Length[answers]}]; body = { (* First row/colum the answer key *) {"A","B","C","D"}, (* First row/colum the proposed answers key *) answersShuffled, (* First row/colum the answer check boxes*) checksShuffled }; (* Kludge: answerStudent has problem with <>, so concatenated earlier*) Deploy[ Style[Panel[Grid[Transpose[body],Alignment->Left],Column[{answerStudent,qPanelEXPR2[]}],ImageMargins->10]]], {{xxx,1,""}, (* initial value of xxx, xxx=RandomReal[0.5] has to be in the button or else the test would not repeat*) Grid[{ {OpenerView[{Button["New Question",qTryAgain[pn];xxx=RandomReal[0.5];vars=qPanelTRYAGAIN2[];myEnabled=True;A1=False; B1=False;C1=False; D1= False], "Try again"}], OpenerView[{Button["Hint",qTryAgain[pn];stateH=Not[stateH]],qPaneHint2[vars]},stateH], OpenerView[{Button["Solution",qTryAgain[pn];state=Not[state]],qPanelsolution2[vars]},state]} ,{Null,Null,Null}}] &}, TrackedSymbols->Manipulate, SaveDefinitions->True,AppearanceElements->None,Initialization:>(qClicks = {{1, 0, 0, ""}, {2, 0, 0, ""}, {3, 0, 0, ""}, {4, 0, 0, ""}, {5, 0, 0, ""}, {6, 0, 0, ""},{7, 0, 0, ""},{8, 0, 0, ""},{9, 0, 0, ""},{10, 0, 0, ""}})] (*Manipulate*) , DynamicBoxOptions -> {BaseStyle -> Magnification -> qMagnification}] , (* Else if actual test *) Style[Manipulate[ vars=qPanelTRYAGAIN2[]; text=qPanelVariation2[pn,vars]; answer="?"; answerStudent=Dynamic[Which [A1,myEnabled=False;qClickPlus[pn];text<>"",C1,qClick[pn];qTryAgainNOT[pn];myEnabled=False;text<>"",B1,qClickPlus[pn];myEnabled=False;text<>"",D1, myEnabled=False;qClickPlus[pn];text<>"", True, text<>""]]; answers=qPanelAnswers2[vars]; checks = {Checkbox[Dynamic[A1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[B1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[C1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[D1],Enabled->Dynamic[myEnabled]]}; (* Shuffle the answer keys *) index = RandomSample[Range[Length[answers]]]; answersShuffled = Table[answers[[index[[i]]]], {i, 1,Length[answers]}]; checksShuffled = Table[checks[[index[[i]]]], {i, 1,Length[answers]}]; body = { (* First row/colum the answer key *) {"A","B","C","D"}, (* First row/colum the proposed answers key *) answersShuffled, (* First row/colum the answer check boxes*) checksShuffled }; (* Kludge: answerStudent has problem with <>, so concatenated earlier*) Deploy[ Style[Panel[Grid[Transpose[body],Alignment->Left],Column[{answerStudent,qPanelEXPR2[]}],ImageMargins->10]]], "", TrackedSymbols->Manipulate, SaveDefinitions->True, AppearanceElements->None,Initialization:>(qClicks = {{1, 0, 0, ""}, {2, 0, 0, ""}, {3, 0, 0, ""}, {4, 0, 0, ""}, {5, 0, 0, ""}, {6, 0, 0, ""},{7, 0, 0, ""},{8, 0, 0, ""},{9, 0, 0, ""},{10, 0, 0, ""}})] (*Manipulate*) , DynamicBoxOptions -> {BaseStyle -> Magnification -> qMagnification}] ] ] qPanelsolution3[vars_]:=DynamicModule[{body,a,b,c,d,p,q,lhs,rhs,f,y,f2,f3,x,sols,X,xx1,xx2,expr1,expr2,yy1,yy2,lhs2,rhs2,min,max,fc,fx,n1,n2,n3,nn1,nn2,nn3,region}, {a,b}=vars; region=ImplicitRegion[0<=y<=2*Pi,{y}]; sols=DeleteDuplicates[Solve[a*Cos[x]==1&&0<=x<=2*Pi,x,Reals]]; body={{ ToString[(ToString["Sin"^2,StandardForm])<>(ToString[b]<>"x")<>"+"<>(ToString["Cos"^2,StandardForm])<>(ToString[b]<>"x") ,StandardForm]<>"="<>ToString[a,StandardForm]<>"Cos x", "1="<>ToString[a,StandardForm]<>"Cos x", "Cos x ="<>ToString[1/a,StandardForm], If[Length[sols]==2, "x="<>ToString[(x/.sols)[[1]],StandardForm]<>", "<>ToString[(x/.sols)[[2]],StandardForm],"x="<>ToString[(x/.sols)[[1]],StandardForm]] }, {Null,Null,Null,Null}}; Panel[Grid[Transpose[body]]] ] qPanelVariation3[pn_, vars_]:=Module[{a,b,c,d,lhs,rhs,lhs2,rhs2,p,q,x}, {a,b}=vars; variations={{"Solve in interval [0, 2\[Pi]].\n"<>ToString[(ToString["Sin"^2,StandardForm])<>(ToString[b]<>"x")<>"+"<>(ToString["Cos"^2,StandardForm])<>(ToString[b]<>"x") ,StandardForm]<>"="<>ToString[a,StandardForm]<>"Cos x"} }; text=ToString[pn]<>". "<>qRandList[variations] ] qPanelAnswers3[vars_]:=Module[{a,b,c,d,lhs,rhs,f,f3,X,y,xx1,xx2,sols,sols2,sols3,m1,m2,m3,a2,x,xx,expr1,expr2,yy1,yy2,region}, {a,b}=vars; region=ImplicitRegion[0<=y<=2*Pi,{y}]; sols=DeleteDuplicates[Solve[a*Cos[x]==1&&0<=x<=2*Pi,x,Reals]]; {If[Length[sols]==2, "x = "<>ToString[(x/.sols)[[1]],StandardForm]<>", "<>ToString[-(x/.sols)[[2]],StandardForm],"x = "<>ToString[-(x/.sols)[[1]],StandardForm]],If[Length[sols]==2, "x = "<>ToString[(x/.sols)[[1]],StandardForm]<>", "<>ToString[2*(x/.sols)[[2]],StandardForm],"x = "<>ToString[3*(x/.sols)[[1]],StandardForm]],If[Length[sols]==2, "x = "<>ToString[(x/.sols)[[1]],StandardForm]<>", "<>ToString[(x/.sols)[[2]],StandardForm],"x = "<>ToString[(x/.sols)[[1]],StandardForm]],If[Length[sols]==2, "x = "<>ToString[2*(x/.sols)[[1]],StandardForm]<>", "<>ToString[(x/.sols)[[2]],StandardForm],"x = "<>ToString[2*(x/.sols)[[1]],StandardForm]]} ] qPanelTRYAGAIN3[]:=Module[{a,b,c,x,rhs,lhs,p,q,d,list}, makeVARS3[] ] qPaneHint3[vars_]:=Module[{}, "Use Trig Identity: \n"<>ToString["Sin"^2*"\[Theta]"+"Cos"^2*"\[Theta]" ,StandardForm]<>"=1" ] qPaneHint3v2[vars_]:=Module[{a,b}, {a,b}=vars; (* code adopted from \[NonBreakingSpace]Abby Brown *) Style[ Manipulate[Module[{anglegraph,maingraph}, anglegraph[th_,showtext_]:=Show[ Graphics[{ {Lighter[Gray,0.5],Circle[{0,0},1]}, {Darker[Green,0.2],Thick,Circle[{0,0},1,{0,th}]}, {Lighter[Gray,0.5],Line[{{0,0},{Cos[th],Sin[th]}}]}, {Red,Thick,Line[{{0,Sin[th]},{Cos[th],Sin[th]}}]}, If[showtext,Text[Style[N[Cos[th]],11],{Cos[th]/2,Sin[th]+0.12}],{}] }], PlotRange->1,ImageSize->145,BaseStyle->{12},Axes->True,Ticks->{{-1,1},{-1,1}},PlotRange->{{-1,1},{-1,1}},PlotRangePadding->0.25]; maingraph[th_,showtext_]:=Module[{}, Show[Plot[{Cos[x],1/a},{x,0.0001,th},PlotRange->{{0,2Pi},{-1,1}},PlotRangePadding->{0,0.25},ImagePadding->{{30,12},{0,0}},PlotRangeClipping->False,PlotStyle->Gray, Ticks->{Table[{n Pi/4,n Pi/4},{n,0,8}],Table[n,{n,-1,1,1/2}]}, GridLines->{Table[{n Pi/4,Lighter[Gray,0.7]},{n,-2,8}],Table[{n,Lighter[Gray,0.7]},{n,-1,1,1/2}]},ImageSize->{Automatic,145},BaseStyle->{12},PlotLabel->ToString["Cos(x)="<>ToString[(1/a),StandardForm]<>"="<>ToString[N[1/a]],StandardForm]], Graphics[{ If[showtext,Rotate[Text[Style[N[Cos[th]],11],{th+0.15,Cos[th]/2-0.1}],3Pi/2,{th+0.15,Cos[th]/2-0.1}],{}], {Darker[Green,0.2],Thick,Line[{{0,0},{th,0}}]}, {Red,Thick,Line[{{th,0},{th,Cos[th]}}]} }],AspectRatio->Automatic]]; DynamicModule[{pt={Cos[ptctrl],Sin[ptctrl]},pt2={ptctrl,0}}, Grid[{ {LocatorPane[Dynamic[pt, {(pt={Cos[pt2[[1]]],Sin[pt2[[1]]]})&, (pt=Normalize[#];pt2={If[pt2=={2Pi,0},2Pi,Mod[ArcTan[#[[1]],#[[2]]],2 Pi]],0})&, (pt=Normalize[#];ptctrl=pt2[[1]])&}], Dynamic[anglegraph[If[pt2=={2Pi,0},2Pi,Mod[ArcTan[pt[[1]],pt[[2]]],2 Pi]],showvalue]]], LocatorPane[Dynamic[pt2, {(pt2={If[pt2=={2Pi,0},2Pi,Mod[ArcTan[pt[[1]],pt[[2]]],2 Pi]],0})&, (pt2={#[[1]],0};pt={Cos[#[[1]]],Sin[#[[1]]]})&, (pt2={#[[1]],0};ptctrl=#[[1]])&}], Dynamic[maingraph[If[pt2=={2Pi,0},2Pi,Mod[ArcTan[pt[[1]],pt[[2]]],2 Pi]],showvalue]]]}},Spacings->0]] ], {{showvalue,False,"show value"},{False,True}}, {{ptctrl,ArcCos[1/a],"angle"},0,2Pi},TrackedSymbols:>{showvalue,ptctrl},SaveDefinitions->True] , DynamicBoxOptions -> {BaseStyle -> Magnification -> 2*qMagnification/3}] ] qPanelEXPR3[]:="" makeVARS3[]:=Module[{list, i, y1,y2,y3, p,q,d,c,x,a}, list={1/6,1/4,1/3,1}; {1/Cos[Pi*list[[RandomInteger[{1,Length[list]}]]]],not0[RandomInteger[{2,5}]]} ] qPanel3[pn0_,diag0_]:= DynamicModule[{xxx, pn=pn0,text,person,variations,A1=False,B1=False,C1=False,D1=False,vars,answer,b,bb,c,cc,aa,a,d,dd,rem,m,n,myEnabled=True,text2,body, answers, checks,answersShuffled,checksShuffled,index,answerStudent,tryAgain=True, state=False, stateH=False,diag=diag0,g }, qNum +=1; If[diag==False, (* this is diagnosis training test *) Style[Manipulate[ xxx=xxx; (* kludge *) vars=qPanelTRYAGAIN3[]; text=qPanelVariation3[pn, vars]; answer="?"; answerStudent=Dynamic[Which [A1,myEnabled=False;qClickPlus[pn];text<>"\n\nAnswer \!\(\* StyleBox[\"Incorrect\",\nFontColor->RGBColor[1, 0, 0]]\)",C1,qClick[pn];qTryAgainNOT[pn];myEnabled=False;text<>"\n\nAnswer Correct",B1,qClickPlus[pn];myEnabled=False;text<>"\n\nAnswer \!\(\* StyleBox[\"Incorrect\",\nFontColor->RGBColor[1, 0, 0]]\)",D1, myEnabled=False;qClickPlus[pn];text<>"\n\nAnswer \!\(\* StyleBox[\"Incorrect\",\nFontColor->RGBColor[1, 0, 0]]\)", True, text<>"\n\nAnswer ?"]]; answers=qPanelAnswers3[vars]; checks = {Checkbox[Dynamic[A1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[B1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[C1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[D1],Enabled->Dynamic[myEnabled]]}; (* Shuffle the answer keys *) index = RandomSample[Range[Length[answers]]]; answersShuffled = Table[answers[[index[[i]]]], {i, 1,Length[answers]}]; checksShuffled = Table[checks[[index[[i]]]], {i, 1,Length[answers]}]; body = { (* First row/colum the answer key *) {"A","B","C","D"}, (* First row/colum the proposed answers key *) answersShuffled, (* First row/colum the answer check boxes*) checksShuffled }; (* Kludge: answerStudent has problem with <>, so concatenated earlier*) Deploy[ Style[Panel[Grid[Transpose[body],Alignment->Left],Column[{answerStudent,qPanelEXPR3[]}],ImageMargins->10]]], {{xxx,1,""}, (* initial value of xxx, xxx=RandomReal[0.5] has to be in the button or else the test would not repeat*) Grid[{ {OpenerView[{Button["New Question",qTryAgain[pn];xxx=RandomReal[0.5];vars=qPanelTRYAGAIN3[];myEnabled=True;A1=False; B1=False;C1=False; D1= False], "Try again"}], OpenerView[{Button["Hint",qTryAgain[pn];stateH=Not[stateH]],qPaneHint3[vars]},stateH], OpenerView[{Button["Solution",qTryAgain[pn];state=Not[state]],qPanelsolution3[vars]},state]} ,{Null,Null,Null}}] &}, TrackedSymbols->Manipulate, SaveDefinitions->True,AppearanceElements->None,Initialization:>(qClicks = {{1, 0, 0, ""}, {2, 0, 0, ""}, {3, 0, 0, ""}, {4, 0, 0, ""}, {5, 0, 0, ""}, {6, 0, 0, ""},{7, 0, 0, ""},{8, 0, 0, ""},{9, 0, 0, ""},{10, 0, 0, ""}})] (*Manipulate*) , DynamicBoxOptions -> {BaseStyle -> Magnification -> qMagnification}] , (* Else if actual test *) Style[Manipulate[ vars=qPanelTRYAGAIN3[]; text=qPanelVariation3[pn,vars]; answer="?"; answerStudent=Dynamic[Which [A1,myEnabled=False;qClickPlus[pn];text<>"",C1,qClick[pn];qTryAgainNOT[pn];myEnabled=False;text<>"",B1,qClickPlus[pn];myEnabled=False;text<>"",D1, myEnabled=False;qClickPlus[pn];text<>"", True, text<>""]]; answers=qPanelAnswers3[vars]; checks = {Checkbox[Dynamic[A1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[B1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[C1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[D1],Enabled->Dynamic[myEnabled]]}; (* Shuffle the answer keys *) index = RandomSample[Range[Length[answers]]]; answersShuffled = Table[answers[[index[[i]]]], {i, 1,Length[answers]}]; checksShuffled = Table[checks[[index[[i]]]], {i, 1,Length[answers]}]; body = { (* First row/colum the answer key *) {"A","B","C","D"}, (* First row/colum the proposed answers key *) answersShuffled, (* First row/colum the answer check boxes*) checksShuffled }; (* Kludge: answerStudent has problem with <>, so concatenated earlier*) Deploy[ Style[Panel[Grid[Transpose[body],Alignment->Left],Column[{answerStudent,qPanelEXPR3[]}],ImageMargins->10]]], "", TrackedSymbols->Manipulate, SaveDefinitions->True, AppearanceElements->None,Initialization:>(qClicks = {{1, 0, 0, ""}, {2, 0, 0, ""}, {3, 0, 0, ""}, {4, 0, 0, ""}, {5, 0, 0, ""}, {6, 0, 0, ""},{7, 0, 0, ""},{8, 0, 0, ""},{9, 0, 0, ""},{10, 0, 0, ""}})] (*Manipulate*) , DynamicBoxOptions -> {BaseStyle -> Magnification -> qMagnification}] ] ] qPanelsolution4[vars_]:=DynamicModule[{body,a,b,c,d,p,q,lhs,rhs,f,y,f2,f3,x,sols,X,xx1,xx2,expr1,expr2,yy1,yy2,lhs2,rhs2,min,max,fc,fx,n1,n2,n3,nn1,nn2,nn3}, {a,b,c,d,f}=vars; body={{ (*"Think of a function "<>ToString[("a"*Cos["b"*"x"+"d"]+"c"), TraditionalForm], "Figure out the distance between 2 peaks: "<>ToString[2*Pi/b,StandardForm]<>"=b", "Set x=0 \[DoubleLongRightArrow] "ToString[("a"*Cos["d"]+"c"), TraditionalForm]<>" and try to estimate d", "If Max intersecting the y-axis at x=0 \[DoubleLongRightArrow] d=0", "Else estimate how far off Max is long x-axis", "d="<>ToString[d,StandardForm], "Now give d, measure where the intercept is on y-axis", "Estimate a,c accordigly a="<>ToString[a,StandardForm]<>", c="<>ToString[c,StandardForm]*) (*ANNA*)"Think of a function y = "(*ANNA*)<>ToString[("a"*Cos["b"*"x"+"d"]+"c"), TraditionalForm], "Find a \n a="<>ToString[Abs[("Max"-"Min")]/2, TraditionalForm]<>"="<>ToString[a, TraditionalForm], "Find c\n c="<>ToString[("Max"+"Min")/2, TraditionalForm]<>"="<>ToString[c, TraditionalForm], " Find d\n We know a and c, set x = 0 and solve for d:", ToString[(a*Cos["b"*"x"+"d"]+c), TraditionalForm]<>"="<>ToString[(a*Cos["d"]+c), TraditionalForm]<>"=y_intercept="<>ToString[(a*Cos[d]+c), TraditionalForm], ToString[(a*Cos["d"]), TraditionalForm]<>"="<>ToString[(a*Cos[d]), TraditionalForm]<>"\[DoubleLongRightArrow]"<>ToString[(Cos["d"]), TraditionalForm]<>"="<>ToString[(Cos[d]), TraditionalForm]<>"\[DoubleLongRightArrow] d="<>ToString[d, TraditionalForm], "Measure the length of a full-period: period="<>ToString[2*Pi/b, TraditionalForm], "Find b\n b="<>ToString[2*Pi/"period", TraditionalForm]<>"="<>ToString[2*Pi/ToString[2*Pi/b, TraditionalForm], TraditionalForm]<>"="<>ToString[b, TraditionalForm]<>"\nEquation:\n", (*Anna*)"y = "(*Anna*)<>ToString[(ToString[qSign6[a],StandardForm]<>ToString[Cos[ToString[qSign6[b],StandardForm]*"x"<>ToString[qSign5[d],StandardForm]],TraditionalForm]<>ToString[qSign5[c],StandardForm]), TraditionalForm] }, {Null,Null,Null,Null,Null,Null,Null,Null,Null}}; Panel[Grid[Transpose[body]]] ] qPanelVariation4[pn_, vars_]:=Module[{a,b,c,d,lhs,rhs,lhs2,rhs2,p,q,x}, variations={{"Predict an equation for the following graph:"} }; text=ToString[pn]<>". "<>qRandList[variations] ] qPanelAnswers4[vars_]:=Module[{a,b,c,d,lhs,rhs,f,f3,X,y,xx1,xx2,sols,sols2,sols3,m1,m2,m3,a2,x,xx,expr1,expr2,yy1,yy2}, {a,b,c,d,f}=vars; { (*ANNA*) "y = "<>ToString[(ToString[qSign6[a+1],StandardForm]<>ToString[Cos[ToString[qSign6[b],StandardForm]*"x"<>ToString[qSign5[d],StandardForm]],TraditionalForm]<>ToString[qSign5[c],StandardForm]), TraditionalForm], "y = "<>ToString[(ToString[qSign6[a],StandardForm]<>ToString[Cos[ToString[qSign6[b+1],StandardForm]*"x"<>ToString[qSign5[d],StandardForm]],TraditionalForm]<>ToString[qSign5[c],StandardForm]), TraditionalForm], "y = "<>ToString[(ToString[qSign6[a],StandardForm]<>ToString[Cos[ToString[qSign6[b],StandardForm]*"x"<>ToString[qSign5[d],StandardForm]],TraditionalForm]<>ToString[qSign5[c],StandardForm]), TraditionalForm], "y = "<>ToString[(ToString[qSign6[a],StandardForm]<>ToString[Cos[ToString[qSign6[b],StandardForm]*"x"<>ToString[qSign5[d],StandardForm]],TraditionalForm]<>ToString[qSign5[1+c],StandardForm]), TraditionalForm] (*ANNA*) } ] qPanelTRYAGAIN4[]:=Module[{a,b,c,x,rhs,lhs,p,q,d,list}, makeVARS4[] ] qPaneHint4[vars_]:=Module[{a,b}, "Use: "<>ToString[("a"*Cos["b"*"x"+"d"]+"c"), TraditionalForm] ] qPanelEXPR4[vars_]:=Module[{a,b,c,d,k,x,f}, {a,b,c,d,f}=vars; list=Table[Pi*k, {k,-4,4}]; list2=Table[k, {k,-8,8}]; Plot[f/.{"x"->x}, {x, -4*Pi, 4*Pi},AxesOrigin->{0,0},Ticks->{list,list2},ImageSize->300] ] makeVARS4[]:=Module[{list, i, y1,y2,y3, p,q,d,c,x,a,b}, a=not0[RandomInteger[{1,2}]]*2; d=RandomInteger[{0,1}]*Pi/2; list3={1,2,4,1/2}; b=list3[[RandomInteger[{1,Length[list3]}]]]; c=RandomInteger[{-1,1}]*4; {a,b,c,d,(a*Cos[b*x+d])+c}/.{x->"x"} ] qPanel4[pn0_,diag0_]:= DynamicModule[{xxx, pn=pn0,text,person,variations,A1=False,B1=False,C1=False,D1=False,vars,answer,b,bb,c,cc,aa,a,d,dd,rem,m,n,myEnabled=True,text2,body, answers, checks,answersShuffled,checksShuffled,index,answerStudent,tryAgain=True, state=False, stateH=False,diag=diag0,g }, qNum +=1; If[diag==False, (* this is diagnosis training test *) Style[Manipulate[ xxx=xxx; (* kludge *) vars=qPanelTRYAGAIN4[]; text=qPanelVariation4[pn, vars]; answer="?"; answerStudent=Dynamic[Which [A1,myEnabled=False;qClickPlus[pn];text<>"\n\nAnswer \!\(\* StyleBox[\"Incorrect\",\nFontColor->RGBColor[1, 0, 0]]\)",C1,qClick[pn];qTryAgainNOT[pn];myEnabled=False;text<>"\n\nAnswer Correct",B1,qClickPlus[pn];myEnabled=False;text<>"\n\nAnswer \!\(\* StyleBox[\"Incorrect\",\nFontColor->RGBColor[1, 0, 0]]\)",D1, myEnabled=False;qClickPlus[pn];text<>"\n\nAnswer \!\(\* StyleBox[\"Incorrect\",\nFontColor->RGBColor[1, 0, 0]]\)", True, text<>"\n\nAnswer ?"]]; answers=qPanelAnswers4[vars]; checks = {Checkbox[Dynamic[A1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[B1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[C1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[D1],Enabled->Dynamic[myEnabled]]}; (* Shuffle the answer keys *) index = RandomSample[Range[Length[answers]]]; answersShuffled = Table[answers[[index[[i]]]], {i, 1,Length[answers]}]; checksShuffled = Table[checks[[index[[i]]]], {i, 1,Length[answers]}]; body = { (* First row/colum the answer key *) {"A","B","C","D"}, (* First row/colum the proposed answers key *) answersShuffled, (* First row/colum the answer check boxes*) checksShuffled }; (* Kludge: answerStudent has problem with <>, so concatenated earlier*) Deploy[ Style[Panel[Grid[Transpose[body],Alignment->Left],Column[{answerStudent,qPanelEXPR4[vars]}],ImageMargins->10]]], {{xxx,1,""}, (* initial value of xxx, xxx=RandomReal[0.5] has to be in the button or else the test would not repeat*) Grid[{ {OpenerView[{Button["New Question",qTryAgain[pn];xxx=RandomReal[0.5];vars=qPanelTRYAGAIN4[];myEnabled=True;A1=False; B1=False;C1=False; D1= False], "Try again"}], OpenerView[{Button["Hint",qTryAgain[pn];stateH=Not[stateH]],qPaneHint4[vars]},stateH], OpenerView[{Button["Solution",qTryAgain[pn];state=Not[state]],qPanelsolution4[vars]},state]} ,{Null,Null,Null}}] &}, TrackedSymbols->Manipulate, SaveDefinitions->True,AppearanceElements->None,Initialization:>(qClicks = {{1, 0, 0, ""}, {2, 0, 0, ""}, {3, 0, 0, ""}, {4, 0, 0, ""}, {5, 0, 0, ""}, {6, 0, 0, ""},{7, 0, 0, ""},{8, 0, 0, ""},{9, 0, 0, ""},{10, 0, 0, ""}})] (*Manipulate*) , DynamicBoxOptions -> {BaseStyle -> Magnification -> qMagnification}] , (* Else if actual test *) Style[Manipulate[ vars=qPanelTRYAGAIN4[]; text=qPanelVariation4[pn,vars]; answer="?"; answerStudent=Dynamic[Which [A1,myEnabled=False;qClickPlus[pn];text<>"",C1,qClick[pn];qTryAgainNOT[pn];myEnabled=False;text<>"",B1,qClickPlus[pn];myEnabled=False;text<>"",D1, myEnabled=False;qClickPlus[pn];text<>"", True, text<>""]]; answers=qPanelAnswers4[vars]; checks = {Checkbox[Dynamic[A1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[B1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[C1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[D1],Enabled->Dynamic[myEnabled]]}; (* Shuffle the answer keys *) index = RandomSample[Range[Length[answers]]]; answersShuffled = Table[answers[[index[[i]]]], {i, 1,Length[answers]}]; checksShuffled = Table[checks[[index[[i]]]], {i, 1,Length[answers]}]; body = { (* First row/colum the answer key *) {"A","B","C","D"}, (* First row/colum the proposed answers key *) answersShuffled, (* First row/colum the answer check boxes*) checksShuffled }; (* Kludge: answerStudent has problem with <>, so concatenated earlier*) Deploy[ Style[Panel[Grid[Transpose[body],Alignment->Left],Column[{answerStudent,qPanelEXPR4[vars]}],ImageMargins->10]]], "", TrackedSymbols->Manipulate, SaveDefinitions->True, AppearanceElements->None,Initialization:>(qClicks = {{1, 0, 0, ""}, {2, 0, 0, ""}, {3, 0, 0, ""}, {4, 0, 0, ""}, {5, 0, 0, ""}, {6, 0, 0, ""},{7, 0, 0, ""},{8, 0, 0, ""},{9, 0, 0, ""},{10, 0, 0, ""}})] (*Manipulate*) , DynamicBoxOptions -> {BaseStyle -> Magnification -> qMagnification}] ] ] qPanelsolution5[vars_]:=DynamicModule[{body,a,b,c,d,p,q,lhs,rhs,f,y,f2,f3,x,sols,X,xx1,xx2,expr1,expr2,yy1,yy2,lhs2,rhs2,y1,y2,sols2,region,yy}, {a,b}=vars; expr2=2*y^2-a*y*Sin[b]-1; sols=Solve[expr2==0,y]; If[Length[sols]==2, {y1,y2}=Sort[y/.sols,Less], y1=y/.sols[[1]]]; region=ImplicitRegion[0<=y<=2*Pi,{y}]; sols2=TrigExpand[Simplify[DeleteDuplicates[Solve[Cos[2*x]-a*Sin[x+b]==0&&0<=x<=2*Pi,x]]]]; sols2=x/.sols2; body={{ ToString[Cos[2*"x"],TraditionalForm]<>"="<>ToString[a*Sin["x"+ToString[b,TraditionalForm]],TraditionalForm]<>"\n="<>If[a>0,ToString[TrigExpand[a*Sin["x"+ToString[b,TraditionalForm]]],TraditionalForm], "-("<>ToString[-TrigExpand[a*Sin["x"+ToString[b,TraditionalForm]]],TraditionalForm]<>")\n= -"<>ToString[-TrigExpand[a*Sin["x"+ToString[b,TraditionalForm]]][[1]],TraditionalForm]<>" - "<>ToString[-TrigExpand[a*Sin["x"+ToString[b,TraditionalForm]]][[2]],TraditionalForm]] , ToString[Sin[ToString[b,TraditionalForm]],TraditionalForm]<>"="<>ToString[Sin[b]]<>", "<>ToString[Cos[ToString[b,TraditionalForm]],TraditionalForm]<>"="<>ToString[Cos[b]], ToString[Cos[2*"x"],TraditionalForm]<>"="<>ToString[a*Sin["x"+b],TraditionalForm], ToString[2*Cos["x"]^2-1 + If[-a*Sin[b]<0, "("<>ToString[-a*Sin[b]*Cos["x"],TraditionalForm]<>")", ToString[-a*Sin[b]*Cos["x"],TraditionalForm]],TraditionalForm]<>"=0", "Replace cos(x) with y for ease", ToString[2*"y"^2-1 - a*Sin[b]*"y",StandardForm]<>"=0", "Solve the quadratic y ="<>ToString[((-"b")\[PlusMinus]Sqrt["b"^2-"4ac"])/"2a",StandardForm]<>":", If[Length[sols]==2, "y="<>ToString[y1, StandardForm]<>", "<>ToString[y2, StandardForm],"y="<>ToString[y1, StandardForm] ], If[Length[sols]==2, "Cos(x)="<>ToString[y1, StandardForm]<>", "<>ToString[y2, StandardForm],"x="<>ToString[y1, StandardForm] ], yy=Sort[{ArcCos[y1],ArcCos[y2]}];yy1=yy[[1]];yy2=yy[[2]]; If[Length[sols]==2, "x="<>ToString[yy1, StandardForm]<>"+"<>ToString[2*Pi*"k", StandardForm]<>", "<>ToString[yy2, StandardForm]<>"+"<>ToString[2*Pi*"k", StandardForm]<>" where k \[Element] \[ScriptCapitalI]","x="<>ToString[ArcCos[y1], StandardForm]<>"+"<>ToString[2*Pi*"k", StandardForm] ], "Using values of k that give answers in the interval [0, 2\[Pi]] ", "x = {"<>(StringJoin/@Table[ToString[sols2[[i]], StandardForm]<>If[i!=Length[sols2],", "," "], {i, 1, Length[sols2]}])<>"}" }, {Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null,Null}}; Panel[Grid[Transpose[body]]] ] qPanelVariation5[pn_, vars_]:=Module[{a,b,c,d,lhs,rhs,lhs2,rhs2,p,q,x}, {a,b}=vars; variations={{"Solve in interval [0, 2\[Pi]].\n"<>ToString[Cos[2*"x"],TraditionalForm]<>"="<>ToString[a*Sin["x"+ToString[b,TraditionalForm]],TraditionalForm]} }; text=ToString[pn]<>". "<>qRandList[variations] ] qPanelAnswers5[vars_]:=Module[{a,b,c,d,lhs,rhs,f,f3,X,y,xx1,xx2,sols,sols2,sols3,m1,m2,m3,a2,x,xx,expr1,expr2,yy1,yy2,region}, {a,b}=vars; region=ImplicitRegion[0<=y<=2*Pi,{y}]; sols2=TrigExpand[Simplify[DeleteDuplicates[Solve[Cos[2*x]-a*Sin[x+b]==0&&0<=x<=2*Pi,x]]]]; sols2=x/.sols2; {"x = {"<>(StringJoin/@Table[ToString[sols2[[i]]/2, StandardForm]<>If[i!=Length[sols2],", "," "], {i, 1, Length[sols2]}])<>"}","x = {"<>(StringJoin/@Table[ToString[sols2[[i]]/3, StandardForm]<>If[i!=Length[sols2],", "," "], {i, 1, Length[sols2]}])<>"}","x = {"<>(StringJoin/@Table[ToString[sols2[[i]], StandardForm]<>If[i!=Length[sols2],", "," "], {i, 1, Length[sols2]}])<>"}","x = {"<>(StringJoin/@Table[ToString[sols2[[i]]*2, StandardForm]<>If[i!=Length[sols2],", "," "], {i, 1, Length[sols2]}])<>"}"} ] qPanelTRYAGAIN5[]:=Module[{a,b,c,x,rhs,lhs,p,q,d,list}, makeVARS5[] ] qPaneHint5[vars_]:=Module[{a,b}, "Use the identity for Cos(2x) and Sin(A+B)." ] qPanelEXPR5[vars_]:=Module[{a,b,c,d,k,x,f}, "" ] makeVARS5[]:=Module[{lista,list,b,a}, lista = {1,-1}; list={-((5 \[Pi])/2),-(\[Pi]/2),(3 \[Pi])/2,(7 \[Pi])/2,-((3 \[Pi])/2),\[Pi]/2,(5 \[Pi])/2,(9 \[Pi])/2}; b=list[[RandomInteger[{1,Length[list]}]]]; a=lista[[RandomInteger[{1, Length[lista]}]]]; {a,b} ] qPanel5[pn0_,diag0_]:= DynamicModule[{xxx, pn=pn0,text,person,variations,A1=False,B1=False,C1=False,D1=False,vars,answer,b,bb,c,cc,aa,a,d,dd,rem,m,n,myEnabled=True,text2,body, answers, checks,answersShuffled,checksShuffled,index,answerStudent,tryAgain=True, state=False, stateH=False,diag=diag0,g }, qNum +=1; If[diag==False, (* this is diagnosis training test *) Style[Manipulate[ xxx=xxx; (* kludge *) vars=qPanelTRYAGAIN5[]; text=qPanelVariation5[pn, vars]; answer="?"; answerStudent=Dynamic[Which [A1,myEnabled=False;qClickPlus[pn];text<>"\n\nAnswer \!\(\* StyleBox[\"Incorrect\",\nFontColor->RGBColor[1, 0, 0]]\)",C1,qClick[pn];qTryAgainNOT[pn];myEnabled=False;text<>"\n\nAnswer Correct",B1,qClickPlus[pn];myEnabled=False;text<>"\n\nAnswer \!\(\* StyleBox[\"Incorrect\",\nFontColor->RGBColor[1, 0, 0]]\)",D1, myEnabled=False;qClickPlus[pn];text<>"\n\nAnswer \!\(\* StyleBox[\"Incorrect\",\nFontColor->RGBColor[1, 0, 0]]\)", True, text<>"\n\nAnswer ?"]]; answers=qPanelAnswers5[vars]; checks = {Checkbox[Dynamic[A1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[B1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[C1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[D1],Enabled->Dynamic[myEnabled]]}; (* Shuffle the answer keys *) index = RandomSample[Range[Length[answers]]]; answersShuffled = Table[answers[[index[[i]]]], {i, 1,Length[answers]}]; checksShuffled = Table[checks[[index[[i]]]], {i, 1,Length[answers]}]; body = { (* First row/colum the answer key *) {"A","B","C","D"}, (* First row/colum the proposed answers key *) answersShuffled, (* First row/colum the answer check boxes*) checksShuffled }; (* Kludge: answerStudent has problem with <>, so concatenated earlier*) Deploy[ Style[Panel[Grid[Transpose[body],Alignment->Left],Column[{answerStudent,qPanelEXPR5[vars]}],ImageMargins->10]]], {{xxx,1,""}, (* initial value of xxx, xxx=RandomReal[0.5] has to be in the button or else the test would not repeat*) Grid[{ {OpenerView[{Button["New Question",qTryAgain[pn];xxx=RandomReal[0.5];vars=qPanelTRYAGAIN5[];myEnabled=True;A1=False; B1=False;C1=False; D1= False], "Try again"}], OpenerView[{Button["Hint",qTryAgain[pn];stateH=Not[stateH]],qPaneHint5[vars]},stateH], OpenerView[{Button["Solution",qTryAgain[pn];state=Not[state]],qPanelsolution5[vars]},state]} ,{Null,Null,Null}}] &}, TrackedSymbols->Manipulate, SaveDefinitions->True,AppearanceElements->None,Initialization:>(qClicks = {{1, 0, 0, ""}, {2, 0, 0, ""}, {3, 0, 0, ""}, {4, 0, 0, ""}, {5, 0, 0, ""}, {6, 0, 0, ""},{7, 0, 0, ""},{8, 0, 0, ""},{9, 0, 0, ""},{10, 0, 0, ""}})] (*Manipulate*) , DynamicBoxOptions -> {BaseStyle -> Magnification -> qMagnification}] , (* Else if actual test *) Style[Manipulate[ vars=qPanelTRYAGAIN5[]; text=qPanelVariation5[pn,vars]; answer="?"; answerStudent=Dynamic[Which [A1,myEnabled=False;qClickPlus[pn];text<>"",C1,qClick[pn];qTryAgainNOT[pn];myEnabled=False;text<>"",B1,qClickPlus[pn];myEnabled=False;text<>"",D1, myEnabled=False;qClickPlus[pn];text<>"", True, text<>""]]; answers=qPanelAnswers5[vars]; checks = {Checkbox[Dynamic[A1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[B1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[C1],Enabled->Dynamic[myEnabled]],Checkbox[Dynamic[D1],Enabled->Dynamic[myEnabled]]}; (* Shuffle the answer keys *) index = RandomSample[Range[Length[answers]]]; answersShuffled = Table[answers[[index[[i]]]], {i, 1,Length[answers]}]; checksShuffled = Table[checks[[index[[i]]]], {i, 1,Length[answers]}]; body = { (* First row/colum the answer key *) {"A","B","C","D"}, (* First row/colum the proposed answers key *) answersShuffled, (* First row/colum the answer check boxes*) checksShuffled }; (* Kludge: answerStudent has problem with <>, so concatenated earlier*) Deploy[ Style[Panel[Grid[Transpose[body],Alignment->Left],Column[{answerStudent,qPanelEXPR5[vars]}],ImageMargins->10]]], "", TrackedSymbols->Manipulate, SaveDefinitions->True, AppearanceElements->None,Initialization:>(qClicks = {{1, 0, 0, ""}, {2, 0, 0, ""}, {3, 0, 0, ""}, {4, 0, 0, ""}, {5, 0, 0, ""}, {6, 0, 0, ""},{7, 0, 0, ""},{8, 0, 0, ""},{9, 0, 0, ""},{10, 0, 0, ""}})] (*Manipulate*) , DynamicBoxOptions -> {BaseStyle -> Magnification -> qMagnification}] ] ] End[]; EndPackage[];