/* old score extrapolator widget Copyright (C) 1992-2000 Michigan State University The CAPA system is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The CAPA system is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the CAPA system; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. As a special exception, you have permission to link this program with the TtH/TtM library and distribute executables, as long as you follow the requirements of the GNU GPL in regard to all of the software in the executable aside from TtH/TtM. */ import java.applet.*; import java.awt.*; import java.lang.*; import java.util.*; import java.net.*; import java.awt.event.*; public class TScore extends Applet implements Runnable { public float W[]; public int Entry_cnt, Exam_cnt; public float S[], F[]; public int X[], C[], R[]; public float SF_ratio[], SF_percent[]; public float Sum_ratio[], Sum_percent[]; public float Exam_ratio[], Raw_exam_ratio[], Raw_epc_ratio[]; public float Term_score; ExpPanel [] HQpanel; ExmPanel [] EXpanel; Label TitleL; Label EqL; public void init() { String p; int fs; int idx; C = new int[2]; R = new int[2]; W = new float[5]; // final exam set number p=getParameter("FS"); fs = (p==null)?1:Integer.valueOf(p).intValue(); // how many entries Entry_cnt= ((fs == 0)? 2 : 1 + 2*fs); // how many exams Exam_cnt = (Entry_cnt - 3 ) / 2; S = new float[Entry_cnt]; F = new float[Entry_cnt]; X = new int[Entry_cnt]; SF_ratio = new float[Entry_cnt]; SF_percent= new float[Entry_cnt]; Sum_ratio = new float[Entry_cnt]; Sum_percent = new float[Entry_cnt]; Raw_exam_ratio = new float[Exam_cnt]; Raw_epc_ratio = new float[Exam_cnt]; Exam_ratio = new float[Exam_cnt]; p=getParameter("HW_W"); W[0] =(p==null)?1:Float.valueOf(p).floatValue(); p=getParameter("QZ_W"); W[1] =(p==null)?1:Float.valueOf(p).floatValue(); p=getParameter("EX_W"); W[2] =(p==null)?1:Float.valueOf(p).floatValue(); p=getParameter("FE_W"); W[3] =(p==null)?1:Float.valueOf(p).floatValue(); p=getParameter("PC_W"); W[4] =(p==null)?1:Float.valueOf(p).floatValue(); p=getParameter("HW_C"); C[0] =(p==null)?1:Integer.valueOf(p).intValue(); p=getParameter("HW_R"); R[0] =(p==null)?1:Integer.valueOf(p).intValue(); p=getParameter("QZ_C"); C[1] =(p==null)?1:Integer.valueOf(p).intValue(); p=getParameter("QZ_R"); R[1] =(p==null)?1:Integer.valueOf(p).intValue(); for(idx=0;idx1) && (X[idx]==1) ) { // midterm exam, final extrapolated SF_ratio[idx] = (float)0.0; SF_percent[idx]= (float)0.0; if( idx == (Entry_cnt - 1) ) { // final exam extrapolated, from hw Sum_ratio[idx] = SF_ratio[0]; Sum_percent[idx] = SF_percent[0]; } } else { // homework, quiz extrapolated or not;exam,final not extrapolated p=getParameter("S"+idx); S[idx]=(p==null)?1:Float.valueOf(p).floatValue(); p=getParameter("F"+idx); F[idx] =(p==null)?1:Float.valueOf(p).floatValue(); if ((float)F[idx] < 0.00000001) { SF_ratio[idx] = (float) 0.0; } else { SF_ratio[idx] = (float) ((float)S[idx] / (float)F[idx]); } int tmp_i = (int) (10000 * SF_ratio[idx] ); SF_percent[idx]= (float)tmp_i / (float)100.0; if( idx == (Entry_cnt - 1) ) { // final exam Sum_ratio[idx] = SF_ratio[idx]; Sum_percent[idx] = SF_percent[idx]; } } } Sum_ratio[0] = (float)(S[0] + ((float)R[0]*F[0]*SF_ratio[0]/(float)C[0])) / (float)(F[0]*(1.0 + (float)R[0]/(float)C[0])); int tmp_i = (int)(10000 * Sum_ratio[0]); Sum_percent[0] = (float)tmp_i / (float)100.0; Sum_ratio[0] = Sum_percent[0] / (float)100.0; Sum_ratio[1] = (float)(S[1] + (R[1]*F[1]*SF_ratio[1]/C[1])) / (float)(F[1]*(1.0 + R[1]/C[1])); tmp_i = (int)(10000 * Sum_ratio[1]); Sum_percent[1] = (float)tmp_i / (float)100.0; Sum_ratio[1] = Sum_percent[1] / (float)100.0; // if exam 1 is not given, use homework as default to extrapolate // if epc 1 is not given, use exam 1 as epc 1 // if exam 2 is not given, use exam 1 to extrapolate // if exam 3 is not given, use exam 2 to extrapolate // I am lying, I only use the homework score float exam_sum = (float)0.0; for(idx=0;idx Raw_exam_ratio[idx] ) { Exam_ratio[idx] = Raw_exam_ratio[idx] + W[4]*( Raw_epc_ratio[idx] - Raw_exam_ratio[idx] ) ; } else { Exam_ratio[idx] = Raw_exam_ratio[idx]; } //System.out.print("idx="+idx+":Exam_ratio="+Exam_ratio[idx]+"\n"); Sum_ratio[2*(idx+1)] = Exam_ratio[idx]; tmp_i = (int)(10000 * Exam_ratio[idx] ); Sum_percent[2*(idx+1)] = (float)tmp_i / (float)100.0; Sum_ratio[2*(idx+1)] = Sum_percent[2*(idx+1)] / (float)100.0; exam_sum += Exam_ratio[idx]; } exam_sum = (float)exam_sum / (float)Exam_cnt; Term_score = Sum_ratio[0] * W[0] + Sum_ratio[1] * W[1] + exam_sum * W[2] + Sum_ratio[Entry_cnt - 1] * W[3]; tmp_i = (int)(10000 * Term_score); Term_score = (float)tmp_i / (float)100.0; // call to setup User Interface initGUI(); } public void initGUI() { int row_cnt = Exam_cnt + 4; int idx; String [] title = {"Homework", "Quizz" }; HQpanel = new ExpPanel[2]; EXpanel = new ExmPanel[Exam_cnt+2]; setLayout(new GridLayout(row_cnt,0,4,4)); String t_str = "Term Score Extrapolation Applet"; TitleL = new Label(t_str, Label.CENTER); add(TitleL); for(idx = 0; idx < 2; idx++) { HQpanel[idx] = new ExpPanel(this,title[idx],X[idx], S[idx],F[idx],C[idx],R[idx]); add(HQpanel[idx]); } // Midterm Exam for(idx =0; idx < Exam_cnt; idx++) { EXpanel[idx] = new ExmPanel(this,idx+1,X[2*(idx+1)],1,X[2*idx+3], S[2*(idx+1)],F[2*(idx+1)],W[4],S[2*idx+3],F[2*idx+3],Sum_ratio[2*(idx+1)]); add(EXpanel[idx]); } // Final Exam EXpanel[Exam_cnt] = new ExmPanel(this,0,X[Entry_cnt-1],0,0, S[Entry_cnt-1],F[Entry_cnt-1],W[3],S[Entry_cnt-1],F[Entry_cnt-1],Sum_ratio[Entry_cnt-1]); add(EXpanel[Exam_cnt]); String eq_str = "Term score=" + Sum_percent[0] + "*" + W[0] ; eq_str = eq_str + "+" + Sum_percent[1] + "*" + W[1] ; eq_str = eq_str + "+" + "(" ; for(idx =1;idx<=Exam_cnt;idx++) { if(idx>1) { eq_str = eq_str + "+ "; } eq_str = eq_str + Sum_percent[2*idx] ; } eq_str = eq_str + ") *" + W[2] + "/" + Exam_cnt + "+"; eq_str = eq_str + Sum_percent[2*idx] + "*" + W[3] + " = "; eq_str = eq_str + " " + Term_score + "%"; // EqL = new Label(eq_str, Label.LEFT); // add(EqL); } public void recalcTermScore() { float score[]; int idx; float term_summ, exam_summ; score = new float[Exam_cnt+3]; term_summ = (float)0.0; exam_summ = (float)0.0; for(idx=0;idx<2;idx++) { score[idx] = HQpanel[idx].getSubTotal(); term_summ = term_summ + score[idx] * W[idx]; } for(idx =0; idx < Exam_cnt; idx++) { score[idx+2] = EXpanel[idx].getSubTotal(); exam_summ = exam_summ + score[idx+2]; } score[Exam_cnt+2] = EXpanel[Exam_cnt].getSubTotal(); exam_summ = exam_summ * W[2] / Exam_cnt; term_summ = term_summ + exam_summ + score[Exam_cnt+2] * W[3]; int tmp_i = (int) ((float)100.0*term_summ); term_summ = (float)(tmp_i / (float)100.0); String eq_str = "Term score=" + score[0] + "*" + W[0] ; eq_str = eq_str + "+" + score[1] + "*" + W[1] ; eq_str = eq_str + "+" + "(" ; for(idx=0;idx0) { eq_str = eq_str + "+ "; } eq_str = eq_str + score[idx+2] ; } eq_str = eq_str + ") *" + W[2] + "/" + Exam_cnt + "+"; eq_str = eq_str + score[Exam_cnt+2] + "*" + W[3] + " = "; eq_str = eq_str + " " + term_summ + " %"; // TitleL.setText("TTT"); TitleL.setText(eq_str); } public void paint(Graphics g) { Dimension d = getSize(); g.drawRect(0,0, d.width - 1, d.height - 1); } public void run() { } public void start() { recalcTermScore(); } public void stop() { } } class ExpPanel extends Panel implements ActionListener, AdjustmentListener { TScore controller; TextField exT; Scrollbar sB; Label sumL; int max = 100; int block = 1; float ff,ss; int rr,cc; ExpPanel(TScore u,String t, int x,float a,float b,int m,int n) { GridBagConstraints c = new GridBagConstraints(); GridBagLayout gridbag = new GridBagLayout(); setLayout(gridbag); int tmp_i; controller = u; ss = a; ff = b; cc = m; rr = n; float sf_ratio = (float)ss / (float)ff; tmp_i = (int)(10000 * sf_ratio); float sf_percent = (float)tmp_i / (float)100.0; float sum_ratio = (float)(ss + ((float)rr*ff*sf_ratio/(float)(cc+rr))) / (float)(ff*(1.0 + (float)rr/(float)(cc+rr))); //System.out.print("ss ="+ss+":rr="+rr+":ff="+ff+":sf_ratio="+sf_ratio+":cc="+cc+":sum_ratio="+sum_ratio+"\n"); tmp_i = (int)(10000 * sum_ratio); float sum_percent = (float)tmp_i / (float)100.0; String cs = " " + ss + "/" + ff; cs = cs + " = " + sf_percent + "%"; String r = "remaining " + rr + " sets at (%) "; String s = " " + sum_percent + "%"; //Set up default layout constraints. c.fill = GridBagConstraints.NONE; Label tL = new Label(t, Label.LEFT); // c.gridwidth = GridBagConstraints.REMAINDER; //It ends a row. c.gridwidth = 1; c.gridx = 0; c.gridy = 0; gridbag.setConstraints(tL, c); add(tL); Label cL = new Label(cs, Label.CENTER); c.gridwidth = 2; c.gridx = 1; c.gridy = 0; gridbag.setConstraints(cL, c); add(cL); Label sL = new Label("subtotal=", Label.RIGHT); c.gridwidth = 1; c.gridx = 3; c.gridy = 0; gridbag.setConstraints(sL, c); add(sL); sumL = new Label(s, Label.RIGHT); c.gridwidth = GridBagConstraints.REMAINDER; //It ends a row. c.gridx = 4; c.gridy = 0; gridbag.setConstraints(sumL, c); add(sumL); if(x==1) { Label rL = new Label(r, Label.RIGHT); c.gridwidth = 2; c.gridx = 0; c.gridy = 1; gridbag.setConstraints(rL, c); add(rL); exT = new TextField("0", 3); c.anchor = GridBagConstraints.EAST; c.gridwidth = 1; //The default value. c.gridx = 2; c.gridy = 1; gridbag.setConstraints(exT, c); add(exT); exT.addActionListener(this); c.anchor = GridBagConstraints.CENTER; // default //Add the slider. It's horizontal, and it has the maximum //value specified by the instance variable max. Its initial //and minimum values are the default (0). A click increments //the value by block units. sB = new Scrollbar(Scrollbar.HORIZONTAL); sB.setMaximum(max + 10); sB.setBlockIncrement(block); // c.gridwidth = GridBagConstraints.REMAINDER; //It ends a row. c.fill = GridBagConstraints.HORIZONTAL; c.gridwidth = 2; c.gridx = 3; c.gridy = 1; gridbag.setConstraints(sB, c); add(sB); sB.addAdjustmentListener(this); exT.setText(String.valueOf(sf_percent)); sB.setValue((int)sf_percent); } } // Draws a box around this panel. public void paint(Graphics g) { Dimension d = getSize(); g.drawRect(0,0, d.width - 1, d.height - 1); } public Insets getInsets() { return new Insets(5,5,5,8); } float getSubTotal() { String s_str = sumL.getText().replace('%','\0').trim(); float s_real = Float.valueOf(s_str).floatValue(); return (s_real); } double getValue() { double f; try { f = (double)Double.valueOf(exT.getText()).doubleValue(); if (f > max) {f=max;} } catch (java.lang.NumberFormatException e) { f = 0.0; } return f; } // entered into exT public void actionPerformed(ActionEvent e) { int tf = (int) getValue(); if (tf > max) tf = max; if (tf < 0) tf = 0; sB.setValue(tf); exT.setText(String.valueOf((int)tf)); recalcSumm(tf); } // slider sB changed public void adjustmentValueChanged(AdjustmentEvent e) { Scrollbar source = (Scrollbar)e.getSource(); int my_i = (int)source.getValue(); exT.setText(String.valueOf(e.getValue())); recalcSumm(my_i); } void recalcSumm(int tf) { float my_r = (float) tf / (float)100.0; int tmp_i= (int)(10000*(ss+((float)rr*ff*my_r/(cc+rr)))/(float)(ff*(1.0+(float)rr/(cc+rr)))); //System.out.print("ss ="+ss+":rr="+rr+":ff="+ff+":my_r="+my_r+":cc="+cc+":tmp_i="+((float)tmp_i/10000.0)+"\n"); float sum = (float)tmp_i / (float)100.0; sumL.setText(sum + "%"); controller.recalcTermScore(); } // Set the values in the slider and text field. void setValue(double f) { setSliderValue(f); exT.setText(String.valueOf((float)f)); } void setSliderValue(double f) { int sliderValue = (int)f; if (sliderValue > max) sliderValue = max; if (sliderValue < 0) sliderValue = 0; sB.setValue(sliderValue); } } class ExmPanel extends Panel implements ActionListener, AdjustmentListener { TScore controller; TextField exT_ex, exT_pc; Scrollbar sB_ex, sB_pc; Label sumL; int max = 100; int block = 1; int show_pc, exam_ex, epc_ex; float s_ex, f_ex, s_pc, f_pc; float c_factor; // exam_type 0 Final // 1, 2, 3, 4 ExmPanel(TScore u,int exam_type,int exam_x,int show_epc,int epc_x, float a,float b,float w,float m,float n,float ex_default) { GridBagConstraints c = new GridBagConstraints(); GridBagLayout gridbag = new GridBagLayout(); setLayout(gridbag); Label tL; float exam_ratio, epc_ratio; float sum; int tmp_i; controller = u; c_factor = w; show_pc = show_epc; exam_ex = exam_x; epc_ex = epc_x; s_ex = a; f_ex = b; s_pc = m; f_pc = n; //Set up default layout constraints. c.fill = GridBagConstraints.NONE; //Add the label. It displays this panel's title, centered. if(exam_type == 0 ) { // Final exam tL = new Label("Final", Label.LEFT); } else { tL = new Label("Exam " + exam_type, Label.LEFT); } c.anchor = GridBagConstraints.WEST; c.gridwidth = 1; c.gridx = 0; c.gridy = 0; gridbag.setConstraints(tL, c); add(tL); c.anchor = GridBagConstraints.CENTER; if( exam_x == 0 ) { // exam not extrapolated if ((float)f_ex < 0.00000001) { exam_ratio = (float) 0.0; } else { exam_ratio = (float)s_ex / (float)f_ex; } tmp_i = (int) (10000 * exam_ratio ); float percent = (float)tmp_i / (float)100.0; String cs = " " + a + "/" + b + " = " + percent + " %"; Label cL = new Label(cs, Label.CENTER); c.gridwidth = 2; c.gridx = 1; c.gridy = 0; gridbag.setConstraints(cL, c); add(cL); } else { // extrapolate exam exam_ratio = ex_default; exT_ex = new TextField("0", 3); exT_ex.setName("EXAM"); c.gridwidth = 1; //The default value. c.gridx = 2; c.gridy = 0; gridbag.setConstraints(exT_ex, c); add(exT_ex); exT_ex.addActionListener(this); sB_ex = new Scrollbar(Scrollbar.HORIZONTAL); sB_ex.setName("EXAMS"); sB_ex.setMaximum(max + 10); sB_ex.setBlockIncrement(block); c.gridwidth = 2; c.gridx = 3; c.gridy = 0; gridbag.setConstraints(sB_ex, c); add(sB_ex); sB_ex.addAdjustmentListener(this); } epc_ratio = exam_ratio; if(show_pc == 1) { if(epc_x == 1) { epc_ratio = exam_ratio; } else { epc_ratio = (float)s_pc / (float)f_pc; } if( epc_ratio > exam_ratio ) { tmp_i= (int)(10000 * (exam_ratio + c_factor * (epc_ratio - exam_ratio))); sum = (float)tmp_i / (float)100.0; } else { tmp_i= (int)(10000 * exam_ratio); sum = (float)tmp_i / (float)100.0; } } else { tmp_i= (int)(10000 * exam_ratio); sum = (float)tmp_i / (float)100.0; } Label sL = new Label("subtotal=", Label.RIGHT); c.gridwidth = 1; c.gridx = 5; c.gridy = 0; gridbag.setConstraints(sL, c); add(sL); String s = " " + sum + "%"; sumL = new Label(s, Label.CENTER); c.anchor = GridBagConstraints.EAST; c.gridwidth = GridBagConstraints.REMAINDER; //It ends a row. c.gridx = 6; c.gridy = 0; gridbag.setConstraints(sumL, c); add(sumL); c.anchor = GridBagConstraints.CENTER; if( show_epc == 1 ) { Label eL = new Label("Correction " + exam_type, Label.LEFT); c.gridwidth = 1; c.gridx = 0; c.gridy = 1; gridbag.setConstraints(eL, c); add(eL); if( epc_x == 0 ) { float ratio; if ((float)f_pc < 0.00000001) { ratio = (float) 0.0; } else { ratio = (float) ( s_pc / f_pc); } tmp_i = (int) (10000 * ratio ); float percent = (float)tmp_i / (float)100.0; String cs = " " + s_pc + "/" + f_pc + " = " + percent + " %"; Label cL = new Label(cs, Label.CENTER); c.gridwidth = 2; c.gridx = 1; c.gridy = 1; gridbag.setConstraints(cL, c); add(cL); } else { exT_pc = new TextField("0", 3); exT_pc.setName("PC"); c.anchor = GridBagConstraints.EAST; c.gridwidth = 1; //The default value. c.gridx = 2; c.gridy = 1; gridbag.setConstraints(exT_pc, c); add(exT_pc); exT_pc.addActionListener(this); sB_pc = new Scrollbar(Scrollbar.HORIZONTAL); sB_pc.setName("PCS"); sB_pc.setMaximum(max + 10); sB_pc.setBlockIncrement(block); c.gridwidth = GridBagConstraints.REMAINDER; c.anchor = GridBagConstraints.CENTER; c.fill = GridBagConstraints.HORIZONTAL; // c.gridwidth = 2; c.gridx = 3; c.gridy = 1; gridbag.setConstraints(sB_pc, c); add(sB_pc); sB_pc.addAdjustmentListener(this); } } setExValue(exam_ratio,epc_ratio); } // Draws a box around this panel. public void paint(Graphics g) { Dimension d = getSize(); g.drawRect(0,0, d.width - 1, d.height - 1); } public Insets getInsets() { return new Insets(5,5,5,8); } float getSubTotal() { String s_str = sumL.getText().replace('%','\0').trim(); float s_real = Float.valueOf(s_str).floatValue(); return (s_real); } // entered into exT public void actionPerformed(ActionEvent e) { TextField source = (TextField)e.getSource(); String name = source.getName(); int tf = (int)Integer.valueOf(source.getText()).intValue(); if (tf > max) tf = max; if (tf < 0) tf = 0; if( name.equals(String.valueOf("EXAM")) ) { sB_ex.setValue(tf); exT_ex.setText(String.valueOf((int)tf)); } else { sB_pc.setValue(tf); exT_pc.setText(String.valueOf((int)tf)); } recalcSumm(); } // slider sB changed public void adjustmentValueChanged(AdjustmentEvent e) { Scrollbar source = (Scrollbar)e.getSource(); String name = source.getName(); int my_i = (int)source.getValue(); if( name.equals(String.valueOf("EXAMS")) ) { sB_ex.setValue(my_i); exT_ex.setText(String.valueOf((int)my_i)); } else { sB_pc.setValue(my_i); exT_pc.setText(String.valueOf((int)my_i)); } recalcSumm(); } void recalcSumm() { int tmp_i; float exam , epc, sum; if( exam_ex == 1 ) { tmp_i = (int)Integer.valueOf(exT_ex.getText()).intValue(); exam = (float) tmp_i / (float)100.0; } else { exam = (float)s_ex / (float)f_ex; } if( show_pc == 1 ) { if(epc_ex == 1) { tmp_i = (int)Integer.valueOf(exT_pc.getText()).intValue(); epc = (float) tmp_i / (float)100.0; } else { epc = (float)s_pc / (float)f_pc; } if( epc > exam ) { tmp_i= (int)(10000 * (exam + c_factor * (epc - exam))); sum = (float)tmp_i / (float)100.0; } else { tmp_i= (int)(10000 * exam); sum = (float)tmp_i / (float)100.0; } } else { tmp_i= (int)(10000 * exam); sum = (float)tmp_i / (float)100.0; } sumL.setText(sum + "%"); controller.recalcTermScore(); } void setExValue (float a, float b) { int exm, epc; exm = (int) (a*100.0); epc = (int) (b*100.0); if (exm > max) exm = max; if (exm < 0) exm = 0; if (epc > max) epc = max; if (epc < 0) epc = 0; if( exam_ex ==1 ) { sB_ex.setValue(exm); exT_ex.setText(String.valueOf(exm)); } if( (show_pc == 1) && (epc_ex==1) ) { sB_pc.setValue(epc); exT_pc.setText(String.valueOf(epc)); } } } 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.