version 1.23, 2004/03/26 20:02:03
|
version 1.29, 2007/01/23 07:26:09
|
Line 2454 check_input_usymb(u_symb)char *u_symb;
|
Line 2454 check_input_usymb(u_symb)char *u_symb;
|
/* num_p : the numerical part in string */ |
/* num_p : the numerical part in string */ |
/* unit_p : the unit string */ |
/* unit_p : the unit string */ |
/* num_p is used to calculate sig figs */ |
/* num_p is used to calculate sig figs */ |
/* return : 0 empty string */ |
/* return : -1 invalid string */ |
|
/* 0 empty string */ |
/* 1 number without units */ |
/* 1 number without units */ |
/* 2 empty number with units */ |
/* 2 empty number with units */ |
/* 3 number with units */ |
/* 3 number with units */ |
Line 2505 char *buf;double *num; char *num_p; char
|
Line 2506 char *buf;double *num; char *num_p; char
|
|
|
e_part = 1.0; /* default power */ |
e_part = 1.0; /* default power */ |
base_str[b_idx] = 0; /* initialize base_str[] */ |
base_str[b_idx] = 0; /* initialize base_str[] */ |
while( isdigit(buf[idx]) || buf[idx] == '.' ) { /* should start with a digit or . */ |
if( buf[idx] == '1' && buf[idx+1] == '0') { |
base_str[b_idx++] = buf[idx++]; |
base_str[b_idx++] = buf[idx++]; |
|
base_str[b_idx++] = buf[idx++]; |
|
} else { |
|
return (-1); |
} |
} |
base_str[b_idx] = 0; /* terminate base_str[] */ |
base_str[b_idx] = 0; /* terminate base_str[] */ |
while( isspace(buf[idx]) ) { idx++; } /* skip over white spaces */ |
while( isspace(buf[idx]) ) { idx++; } /* skip over white spaces */ |
Line 2520 char *buf;double *num; char *num_p; char
|
Line 2524 char *buf;double *num; char *num_p; char
|
while( isspace(buf[idx]) ) { idx++; } |
while( isspace(buf[idx]) ) { idx++; } |
if( isdigit(buf[idx]) || buf[idx] == '+' || buf[idx] == '-' ) { |
if( isdigit(buf[idx]) || buf[idx] == '+' || buf[idx] == '-' ) { |
exp_str[e_idx] = 0; /* initialize exp_str[], again */ |
exp_str[e_idx] = 0; /* initialize exp_str[], again */ |
while( isdigit(buf[idx]) || buf[idx] == '.' || buf[idx] == '+' || buf[idx] == '-' ) { |
while( isdigit(buf[idx]) /*|| buf[idx] == '.'*/ || buf[idx] == '+' || buf[idx] == '-' ) { |
exp_str[e_idx++] = buf[idx++]; |
exp_str[e_idx++] = buf[idx++]; |
} |
} |
exp_str[e_idx] = 0; /* terminate exp_str[] */ |
exp_str[e_idx] = 0; /* terminate exp_str[] */ |
Line 2554 char *buf;double *num; char *num_p; char
|
Line 2558 char *buf;double *num; char *num_p; char
|
while( isspace(buf[idx]) ) { idx++; } |
while( isspace(buf[idx]) ) { idx++; } |
if( isdigit(buf[idx]) || buf[idx] == '+' || buf[idx] == '-' ) { |
if( isdigit(buf[idx]) || buf[idx] == '+' || buf[idx] == '-' ) { |
exp_str[e_idx] = 0; |
exp_str[e_idx] = 0; |
while( isdigit(buf[idx]) || buf[idx] == '.' || buf[idx] == '+' || buf[idx] == '-' ) { |
while( isdigit(buf[idx]) /*|| buf[idx] == '.'*/ || buf[idx] == '+' || buf[idx] == '-' ) { |
exp_str[e_idx++] = buf[idx++]; |
exp_str[e_idx++] = buf[idx++]; |
} |
} |
exp_str[e_idx] = 0; |
exp_str[e_idx] = 0; |
Line 2565 char *buf;double *num; char *num_p; char
|
Line 2569 char *buf;double *num; char *num_p; char
|
} |
} |
sscanf(exp_str, "%lg", &e_part); |
sscanf(exp_str, "%lg", &e_part); |
sscanf(num_str, "%lg", &n_part); |
sscanf(num_str, "%lg", &n_part); |
|
if( n_part != 10 ) { |
|
return (-1); |
|
} |
result = pow(n_part,e_part); |
result = pow(n_part,e_part); |
errcode = errcode | 1; |
errcode = errcode | 1; |
} else { /* number unit */ |
} else { /* number unit */ |
Line 2638 answers_string(mode, p)int mode;Problem_
|
Line 2645 answers_string(mode, p)int mode;Problem_
|
if(len_dd == 0 ) { /* no unit_str */ |
if(len_dd == 0 ) { /* no unit_str */ |
sprintf(ans_str," %s [%s,%s]\n\n", str_aa,str_bb,str_cc); |
sprintf(ans_str," %s [%s,%s]\n\n", str_aa,str_bb,str_cc); |
} else { |
} else { |
sprintf(ans_str," %s [%s,%s] $%s$\n\n", str_aa,str_bb,str_cc,p->unit_str); |
sprintf(ans_str," %s [%s,%s] $\\mathrm{%s}$\n\n", str_aa,str_bb,str_cc,p->unit_str); |
} |
} |
capa_mfree((char *)str_aa); |
capa_mfree((char *)str_aa); |
capa_mfree((char *)str_bb); |
capa_mfree((char *)str_bb); |
Line 2660 answers_string(mode, p)int mode;Problem_
|
Line 2667 answers_string(mode, p)int mode;Problem_
|
if(len_dd == 0 ) { /* no unit_str */ |
if(len_dd == 0 ) { /* no unit_str */ |
sprintf(ans_str," %s\n", str_bb); |
sprintf(ans_str," %s\n", str_bb); |
} else { |
} else { |
sprintf(ans_str," %s $%s$\n", str_bb,p->unit_str); |
sprintf(ans_str," %s $\\mathrm{%s}$\n", str_bb,p->unit_str); |
} |
} |
capa_mfree((char *)str_bb); |
capa_mfree((char *)str_bb); |
} |
} |
Line 2927 capa_check_ans(ai,ans, error) AnswerInfo
|
Line 2934 capa_check_ans(ai,ans, error) AnswerInfo
|
char *us; /* ans_unit_str */ |
char *us; /* ans_unit_str */ |
Unit_t *u_p; /* ans_unit */ |
Unit_t *u_p; /* ans_unit */ |
int input_len, all_alphabet = 1, idx, ii, type; |
int input_len, all_alphabet = 1, idx, ii, type; |
int outcome, result = INCORRECT; |
int outcome=-1, result = INCORRECT; |
int sig, corr_len; |
int sig, corr_len; |
int choice[ANSWER_STRING_LENG]; |
int choice[MAX_ASCII]; |
char num_str[ANSWER_STRING_LENG], unit_str[ANSWER_STRING_LENG]; |
char num_str[ANSWER_STRING_LENG], unit_str[ANSWER_STRING_LENG]; |
char fmted[ANSWER_STRING_LENG], correctans[ANSWER_STRING_LENG], answer[ANSWER_STRING_LENG]; |
char fmted[ANSWER_STRING_LENG], correctans[MAX_ASCII], answer[ANSWER_STRING_LENG]; |
double n_part; |
double n_part; |
double given, target, ratio, fmted_target, target_u, target_l, scale=1.0; |
double given, target, ratio, fmted_target, target_u, target_l, scale=1.0; |
double delta; |
double delta; |
Line 2953 capa_check_ans(ai,ans, error) AnswerInfo
|
Line 2960 capa_check_ans(ai,ans, error) AnswerInfo
|
all_alphabet = 0; |
all_alphabet = 0; |
} |
} |
} |
} |
if( !all_alphabet ) { /* answer string is not all alphabets */ |
if( !all_alphabet ) { |
outcome = split_num_unit(ans,&n_part,num_str,unit_str); |
outcome = split_num_unit(ans,&n_part,num_str,unit_str); |
|
} |
|
if( outcome > 0 ) { |
if( outcome > 1 ) { /* with both num and unit parts or only unit part */ |
if( outcome > 1 ) { /* with both num and unit parts or only unit part */ |
if( u_p != NULL ) { |
if( u_p != NULL ) { |
result = check_correct_unit(unit_str,u_p,&scale); |
result = check_correct_unit(unit_str,u_p,&scale); |
Line 3031 capa_check_ans(ai,ans, error) AnswerInfo
|
Line 3040 capa_check_ans(ai,ans, error) AnswerInfo
|
{ |
{ |
corr_len = strlen(s); input_len = strlen(ans); |
corr_len = strlen(s); input_len = strlen(ans); |
if( corr_len == input_len ) { |
if( corr_len == input_len ) { |
for(idx=0;idx<ANSWER_STRING_LENG;idx++) { |
for(idx=0;idx<MAX_ASCII;idx++) { |
choice[idx] = 0;correctans[idx] = 0; |
choice[idx] = 0;correctans[idx] = 0; |
} |
} |
result = EXACT_ANS; |
result = EXACT_ANS; |
for(ii=0;ii<corr_len; ii++) { |
for(ii=0;ii<corr_len; ii++) { |
idx = toupper(s[ii]) - 'A'; choice[idx] = 1; |
idx = toupper(s[ii]); choice[idx] = 1; |
} |
} |
for(ii=0;ii<input_len;ii++) { |
for(ii=0;ii<input_len;ii++) { |
idx = toupper(ans[ii]) - 'A'; correctans[idx] = 1; |
idx = toupper(ans[ii]); correctans[idx] = 1; |
} |
} |
for(ii=0;ii<ANSWER_STRING_LENG;ii++) { |
for(ii=0;ii<MAX_ASCII;ii++) { |
if(choice[ii] != correctans[ii] ) result = INCORRECT; |
if(choice[ii] != correctans[ii] ) result = INCORRECT; |
} |
} |
} else { result = INCORRECT; } |
} else { result = INCORRECT; } |
Line 3092 capa_check_answer(p, answer, error) Prob
|
Line 3101 capa_check_answer(p, answer, error) Prob
|
int sig_l; |
int sig_l; |
int sig_u; |
int sig_u; |
char *fmt; |
char *fmt; |
int choice[ANSWER_STRING_LENG], correctans[ANSWER_STRING_LENG]; |
int choice[MAX_ASCII], correctans[MAX_ASCII]; |
int ii, idx, corr_len, input_len; |
int ii, idx, corr_len, input_len; |
int result = INCORRECT, sig, outcome, all_alphabet; |
int result = INCORRECT, sig, outcome=-1, all_alphabet; |
char fmted[FORMAT_STRING_LENG]; |
char fmted[FORMAT_STRING_LENG]; |
double given, target, ratio, fmted_target, target_u, target_l, scale=1.0; |
double given, target, ratio, fmted_target, target_u, target_l, scale=1.0; |
double delta; |
double delta; |
Line 3122 capa_check_answer(p, answer, error) Prob
|
Line 3131 capa_check_answer(p, answer, error) Prob
|
} |
} |
if( !all_alphabet ) { |
if( !all_alphabet ) { |
outcome = split_num_unit(answer,&n_part,input,unit_str); |
outcome = split_num_unit(answer,&n_part,input,unit_str); |
|
} |
|
if( outcome > 0 ) { |
if( outcome > 1 ) { /* with both num and unit parts or only unit part */ |
if( outcome > 1 ) { /* with both num and unit parts or only unit part */ |
if( p->ans_unit != NULL ) { |
if( p->ans_unit != NULL ) { |
result = check_correct_unit(unit_str,p->ans_unit,&scale); |
result = check_correct_unit(unit_str,p->ans_unit,&scale); |
Line 3198 capa_check_answer(p, answer, error) Prob
|
Line 3209 capa_check_answer(p, answer, error) Prob
|
{ |
{ |
corr_len = strlen(correct); input_len = strlen(answer); |
corr_len = strlen(correct); input_len = strlen(answer); |
if( corr_len == input_len ) { |
if( corr_len == input_len ) { |
for(idx=0;idx<ANSWER_STRING_LENG;idx++) { |
for(idx=0;idx<MAX_ASCII;idx++) { |
choice[idx] = 0;correctans[idx] = 0; |
choice[idx] = 0;correctans[idx] = 0; |
} |
} |
result = EXACT_ANS; |
result = EXACT_ANS; |
for(ii=0;ii<corr_len; ii++) { |
for(ii=0;ii<corr_len; ii++) { |
idx = toupper(correct[ii]) - 'A'; choice[idx] = 1; |
idx = toupper(correct[ii]); choice[idx] = 1; |
} |
} |
for(ii=0;ii<input_len;ii++) { |
for(ii=0;ii<input_len;ii++) { |
idx = toupper(answer[ii]) - 'A'; correctans[idx] = 1; |
idx = toupper(answer[ii]); correctans[idx] = 1; |
} |
} |
for(ii=0;ii<ANSWER_STRING_LENG;ii++) { |
for(ii=0;ii<MAX_ASCII;ii++) { |
if(choice[ii] != correctans[ii] ) result = INCORRECT; |
if(choice[ii] != correctans[ii] ) result = INCORRECT; |
} |
} |
} else { result = INCORRECT; } |
} else { result = INCORRECT; } |
break; |
break; |
Line 3239 capa_check_answer(p, answer, error) Prob
|
Line 3250 capa_check_answer(p, answer, error) Prob
|
return (result); |
return (result); |
} |
} |
|
|
|
int check_tol (formula_val,tol_type,tol) |
|
double formula_val;int tol_type;double tol; |
|
{ |
|
double diff; |
|
int outcome=APPROX_ANS; |
|
if( tol_type == TOL_ABSOLUTE ) { |
|
diff = tol - formula_val; |
|
if( diff < 0.0 ) { |
|
outcome = INCORRECT; |
|
} |
|
} else { |
|
diff = fabs(1.0 - formula_val) * 100.0 ; |
|
if( diff > tol ) { |
|
outcome = INCORRECT; |
|
} |
|
} |
|
return outcome; |
|
} |
|
|
/* -------------------------------------------------------------------------- */ |
/* -------------------------------------------------------------------------- */ |
/* assumming the formula is *fml_str and the student input is *input_str */ |
/* assumming the formula is *fml_str and the student input is *input_str */ |
/* according to the type of tolerance, we form the final formula as */ |
/* according to the type of tolerance, we form the final formula as */ |
Line 3251 char *fml_str;char *input_str;char *var_
|
Line 3281 char *fml_str;char *input_str;char *var_
|
char *check_fml_str; |
char *check_fml_str; |
int f_len, i_len, outcome, error_code; |
int f_len, i_len, outcome, error_code; |
PointsList_t *pt, *next; |
PointsList_t *pt, *next; |
double formula_val, diff; |
double formula_val; |
|
|
f_len = strlen(fml_str); |
f_len = strlen(fml_str); |
i_len = strlen(input_str); |
i_len = strlen(input_str); |
Line 3263 char *fml_str;char *input_str;char *var_
|
Line 3293 char *fml_str;char *input_str;char *var_
|
sprintf(check_fml_str,"(%s) / (%s)",input_str,fml_str); |
sprintf(check_fml_str,"(%s) / (%s)",input_str,fml_str); |
} |
} |
outcome = APPROX_ANS; |
outcome = APPROX_ANS; |
|
if( pts_list==NULL ) { |
|
error_code = f_eval_formula(&formula_val,check_fml_str, var_list, NULL); |
|
if( ! error_code ) { |
|
outcome = check_tol(formula_val,tol_type,tol); |
|
} else { |
|
outcome = BAD_FORMULA; |
|
} |
|
} |
|
|
for(pt= pts_list; pt!=NULL ; pt=next) { |
for(pt= pts_list; pt!=NULL ; pt=next) { |
next=pt->pts_next; |
next=pt->pts_next; |
error_code = f_eval_formula(&formula_val,check_fml_str, var_list, pt->pts_str); |
error_code = f_eval_formula(&formula_val,check_fml_str, var_list, pt->pts_str); |
if( ! error_code ) { |
if( ! error_code ) { |
if( tol_type == TOL_ABSOLUTE ) { |
outcome = check_tol(formula_val,tol_type,tol); |
diff = tol - formula_val; |
|
if( diff < 0.0 ) { |
|
outcome = INCORRECT; |
|
} |
|
} else { |
|
diff = abs(1.0 - formula_val) * 100.0 ; |
|
if( diff > tol ) { |
|
outcome = INCORRECT; |
|
} |
|
} |
|
} else { |
} else { |
outcome = BAD_FORMULA; |
outcome = BAD_FORMULA; |
break; |
break; |
} |
} |
|
if (outcome != APPROX_ANS) { |
|
break; |
|
} |
} |
} |
capa_mfree((char *)check_fml_str); |
capa_mfree((char *)check_fml_str); |
|
|