Re: Re: looping
- To: mathgroup at smc.vnet.net
- Subject: [mg106832] Re: [mg106766] Re: [mg106704] looping
- From: Leonid Shifrin <lshifr at gmail.com>
- Date: Sun, 24 Jan 2010 05:43:44 -0500 (EST)
- References: <201001210955.EAA16523@smc.vnet.net>
Hi Bobby,
I agree - your modification makes it more elegant. I particularly liked
your use of indexed variables and RandomChoice.
Cheers,
Leonid
On Sat, Jan 23, 2010 at 12:48 PM, DrMajorBob <btreat1 at austin.rr.com> wrote:
> I'd style this a bit differently:
>
> Clear[makeScorePanel];
> makeScorePanel[names : {__String}] :=
> Module[{text, k = Length@names, name = RandomChoice@names,
> studentInfo, classFlag = True, buttons, class, percent, next,
> correct, questions},
>
> "internal functions";
> correct[_] = 0; questions[_] = 0;
> percent[name_] /; questions[name] == 0 = 0;
> percent[name_] := Round[100*correct[name]/questions[name]];
>
> "display elements";
>
> text = "Was the answer correct?";
> next := (questions[name]++; name = RandomChoice@names);
>
> class :=
> If[classFlag,
> Panel[Grid[
> Prepend[Transpose[{names, getQuestionCount[],
> getCorrectCount[], getPercent[]}], {"Name", "Questions",
> "# correct", "% correct"}], Spacings -> 3,
> Dividers -> Center]], ""];
> buttons :=
> Row[{Button[" Yes ", correct[name]++; next],
> Button[" No ", next],
> Button[If[classFlag, "Hide Roster", "Show Roster"],
> classFlag = ! classFlag]}];
> studentInfo :=
> Panel[
> Grid[{{"Name", name}, {"Questions",
> questions@name}, {"Correct answers",
> correct@name}, {"% correct", percent@name}},
> Alignment -> Left]];
>
> "exported functions";
> Clear[getCorrectCount, getQuestionCount, getPercent,
> displayPanel];
> getCorrectCount[] := correct /@ names;
> getQuestionCount[] := questions /@ names;
> getPercent[] := percent /@ names;
> displayPanel[] :=
>
> Dynamic@Panel[Column[{studentInfo, text, buttons, class}]]
> ];
> makeScorePanel[{"apple", "bob", "cat", "dog", "ear", "frog", "greg",
> "hippo", "i9", "joe"}]
> displayPanel[]
>
> Bobby
>
>
> On Sat, 23 Jan 2010 06:30:56 -0600, Leonid Shifrin <lshifr at gmail.com>
> wrote:
>
> Hi Glenn,
>>
>> You don't need a loop at all, if I understand your goal correctly. What
>> you
>> need is a bit of Dynamic functionality. Hope this will get you started:
>>
>> Clear[makeScorePanel, getScores, getCalled, getPrcntp, bpanel];
>> makeScorePanel[names : {__String}] :=
>> Module[{text, n = RandomInteger[Length[names] - 1] + 1, studentInfo,
>> classFlag = False, buttons, class, percent, next,
>> score , called , prcnt},
>> Clear[getScores, getCalled, getPrcntp, bpanel];
>> score = called = prcnt = Table[0, {Length[names]}];
>> getScores[] := score;
>> getCalled[] := called;
>> getPrcntp[] := prcnt;
>> text := "Was the answer correct?";
>> next := (called[[n]]++; n = RandomInteger[Length[names] - 1] + 1);
>> class :=
>> If[classFlag,
>> Panel[Grid[
>> Transpose[{names, score,
>> IntegerPart[100*score/(called /. (0 -> 1))]/100.}
>> ],
>> Spacings -> 3, Dividers -> Center]],
>> ""];
>> buttons :=
>> Row[{
>> Button[" Yes ", score[[n]]++; next],
>> Button["Class", classFlag = ! classFlag],
>> Button[" No ", next]}];
>> percent :=
>> If[called[[n]] == 0, 0,
>> IntegerPart[100*score[[n]]/called[[n]]]/100.];
>> studentInfo :=
>> Panel[Grid[
>> {{"Name", names[[n]]},
>> {"Times called", called[[n]]},
>> {"# of correct answers", score[[n]]},
>> {"Your % ", percent}},
>> Alignment -> Left]];
>> bpanel[] :=
>> Dynamic@Panel[Column[{
>> studentInfo,
>> text,
>> buttons,
>> class
>> }]]];
>>
>> The way to use: first call the makeScorePanel[] with your actual list of
>> names, then call bpanel[]:
>>
>> makeScorePanel[{"apple", "bob", "cat", "dog", "ear", "frog", "greg",
>> "hippo", "i9", "joe"}]
>>
>> bpanel[]
>>
>> You stop when you feel like it. You can also call getScores[],
>> getCalled[]
>> , getPrcntp[] at any time to get the current state of these variables (if
>> you need that for further processing).
>>
>> Regards,
>> Leonid
>>
>>
>>
>> On Thu, Jan 21, 2010 at 12:55 PM, glenn kuhaneck <mcguyver128 at yahoo.com
>> >wrote:
>>
>> this code is supposed to randomly select a student from a list, keep
>>> track
>>> of how many times he/she has been called, and how many answers they have
>>> gotten correct.
>>>
>>> I am having problems getting the following code to repeat on request: i
>>> have tried do loops, while loops, and labels none have worked. please
>>> help
>>>
>>> These are the sample lists I am using for the code below
>>> name = ( {
>>> {"apple"},
>>> {"bob"},
>>> {"cat"},
>>> {"dog"},
>>> {"ear"},
>>> {"frog"},
>>> {"greg"},
>>> {"hippo"},
>>> {"i9"},
>>> {"joe"}
>>> }); score = ({
>>> {0},
>>> {0},
>>> {0},
>>> {0},
>>> {0},
>>> {0},
>>> {0},
>>> {0},
>>> {0},
>>> {0}
>>> }); called = ({
>>> {0},
>>> {0},
>>> {0},
>>> {0},
>>> {0},
>>> {0},
>>> {0},
>>> {0},
>>> {0},
>>> {0}
>>> }); prcnt = ( {
>>> {0},
>>> {0},
>>> {0},
>>> {0},
>>> {0},
>>> {0},
>>> {0},
>>> {0},
>>> {0},
>>> {0}
>>> } );
>>>
>>>
>>>
>>>
>>> this is the code to manipulate the lists created above
>>> repeat = "yes";
>>> c = "wrong";
>>> l = Length[name];
>>> n = RandomInteger[l - 1] + 1;
>>>
>>>
>>> Label[begin]
>>> "Student #"
>>> n
>>> name[[n]]
>>> called[[n]] += 1;
>>> "# times called"
>>> called
>>> "Old Score"
>>> score
>>> Input["Was the answer correct?", Button["Yes", c = "Right"]];
>>> If[c == "Right", score[[n]] += 1]; c
>>> "New Score"
>>> score
>>> "Your # of Correct Answers"
>>> score[[n]]
>>> "Your %"
>>> prcnt[[n]] = score[[n]]/called[[n]]
>>> "Class %"
>>> prcnt
>>> Input["Another ?", Button["No", repeat = "no"]];
>>> If[repeat == "yes", Goto[begin], Goto[end]];
>>> Label[end];
>>> prcnt[[n]]
>>>
>>>
>>>
>>> thank you for your assistance,
>>> Mr. Glenn J. Kuhaneck
>>>
>>>
>>>
>>
>>
>
> --
> DrMajorBob at yahoo.com
>
- References:
- looping
- From: glenn kuhaneck <mcguyver128@yahoo.com>
- looping