= g_qsize ) {
+ if ( g_qchar_cnt+2 > g_qsize-2 ) {
char *temp_text;
- g_qsize=g_qchar_cnt*2;
+ g_qsize=(g_qchar_cnt+2)*2;
temp_text=capa_malloc(g_qsize,sizeof(char));
strncpy(temp_text,g_question_txt,g_qsize);
capa_mfree(g_question_txt);
@@ -1465,30 +1504,43 @@ char *class_dir; char *c_owner;char *cla
append_qtext("
\n");
}
}
+ */
}
}
}
if(mode == VIEW_PREVIOUS_MODE) { /* VIEW_PREVIOUS_MODE */
- if( display_ans ) {
+ /*
if( prob_idx->ans_type == ANSWER_IS_FLOAT ) {
a = (double)atof(prob_idx->answer);
sprintf(cmp_ans,prob_idx->ans_fmt, a);
} else {
- strcpy(cmp_ans,prob_idx->answer);
+ if ( prob_idx->ans_type == ANSWER_IS_SUBJECTIVE) {
+ strcpy(cmp_ans,"Subjective Answer");
+ } else {
+ if (prob_idx->answer) {
+ strcpy(cmp_ans,prob_idx->answer);
+ } else {
+ strcpy(cmp_ans,"No Answer");
+ }
+ }
}
if( prob_idx->ans_unit ) {
sprintf(buf,"Answer: %s %s
\n",cmp_ans, prob_idx->unit_str);
} else {
sprintf(buf,"
Answer: %s
\n",cmp_ans);
}
+ */
+ if( display_ans ) {
+ c_ans=answers_string(ANSWER_STRING_MODE, prob_idx);
+ sprintf(buf,"
Answer: %s
",c_ans);
append_qtext(buf);
+ capa_mfree(c_ans);
if ( prob_idx->explain) {
sprintf(buf,"
Explanation: \n
%s
\n",prob_idx->explain);
append_qtext(buf);
}
- }
- } else { /* could be TRY_SET_MODE, CHECK_ANSWER_MODE */
-
+ }
+ } else { /* could be TRY_SET_MODE, CHECK_ANSWER_MODE */
if( g_passdue ) {
get_response(header.partial_credit[question_idx],entry.answers[question_idx],question_idx,prob_idx);
}else{
@@ -1512,7 +1564,7 @@ char *class_dir; char *c_owner;char *cla
append_qtext("\n\n");
if( EndText_p ) append_qtext(EndText_p);
free_problems(first_prob);
-
+ free_units();
#ifdef CGI_DBUG
fprintf(g_cgi,"End display each problem\n"); fflush(g_cgi);
#endif /* CGI_DBUG */
@@ -1895,7 +1947,7 @@ int gather_answers(char ***ans,int q_idx
int cnt;
if(p->ans_op==ANS_AND) {
int i; StudentAnswer_t *sa_p;
- *ans=(char**)capa_malloc(p->ans_cnt,1);
+ *ans=(char**)capa_malloc(p->ans_cnt,sizeof(char*));
sa_p= g_stu_ans_pp[q_idx+1];
for(i=0;((ians_cnt)&&(sa_p));i++){
ans[0][i]=sa_p->a_str;
@@ -1905,7 +1957,7 @@ int gather_answers(char ***ans,int q_idx
cnt=p->ans_cnt;
if (ians_cnt) return -1;
} else {
- *ans=(char**)capa_malloc(p->ans_cnt,1);
+ *ans=(char**)capa_malloc(p->ans_cnt,sizeof(char*));
ans[0][0]=g_stu_ans_pp[q_idx+1]->a_str;
if ((strlen(ans[0][0])+1) > ANSWER_STRING_LENG) ans[0][0][ANSWER_STRING_LENG]='\0';
cnt=1;
@@ -1918,21 +1970,23 @@ void
log_user_ans(int q_idx,Problem_t *p)
{
char **ans;
+ char *error;
int cnt;
if (p->ans_type==ANSWER_IS_SUBJECTIVE) {
/*capa_set_subjective(g_login_set,q_idx+1,g_student_number,
g_stu_ans_pp[q_idx+1]->a_str);*/
} else {
if (-1 != (cnt=gather_answers(&ans,q_idx,p))) {
- switch( capa_check_answers(p,ans,cnt) ) {
+ switch( capa_check_answers(p,ans,cnt,&error) ) {
case EXACT_ANS: g_log_string[q_idx]='Y'; break;
case APPROX_ANS: g_log_string[q_idx]='Y'; break;
- case SIG_FAIL: g_log_string[q_idx]='S'; break;
- case UNIT_FAIL: g_log_string[q_idx]='U'; break;
- case UNIT_NOTNEEDED: g_log_string[q_idx]='U'; break;
+ case SIG_FAIL: g_log_string[q_idx]='S'; capa_mfree(error); break;
+ case UNIT_FAIL: g_log_string[q_idx]='U'; capa_mfree(error); break;
+ case UNIT_NOTNEEDED: g_log_string[q_idx]='U'; capa_mfree(error); break;
case NO_UNIT: g_log_string[q_idx]='u'; break;
case BAD_FORMULA: g_log_string[q_idx]='F'; break;
case INCORRECT: g_log_string[q_idx]='N'; break;
+ case WANTED_NUMERIC: g_log_string[q_idx]='s'; break;
}
}
}
@@ -1977,7 +2031,8 @@ int sig_u;
char *a_fmt;
int tries;
char buf[MAX_BUFFER_SIZE];
-
+ char *error;
+
a_tpe = p->ans_type;
t_tpe = p->tol_type;
tol = p->tolerance;
@@ -2014,7 +2069,7 @@ int tries;
return;
}
- switch( capa_check_answers(p,ans,cnt) ) {
+ switch( capa_check_answers(p,ans,cnt,&error) ) {
case EXACT_ANS:
case APPROX_ANS:
c_ans=answers_string(ANSWER_STRING_MODE, p);
@@ -2024,18 +2079,28 @@ int tries;
g_log_string[q_idx]='Y';
capa_mfree(c_ans);
break;
+ case WANTED_NUMERIC:
+ create_answer_area(p,q_idx);
+ g_tried[q_idx]--; /* don't count as a try */
+ sprintf(buf,"
This question expects a numeric answer, tries %d/%d.\n",g_tried[q_idx],tries);
+ append_qtext(buf);
+ g_new_answerdb[q_idx] = 'N';
+ g_log_string[q_idx]='s';
+ break;
case SIG_FAIL:
create_answer_area(p,q_idx);
g_tried[q_idx]--; /* don't count as a try */
- sprintf(buf,"
Please adjust significant figures, tries %d/%d.\n",g_tried[q_idx],tries);
+ sprintf(buf,"
Please adjust significant figures, you provided %s significant figures, tries %d/%d.\n",error,g_tried[q_idx],tries);
append_qtext(buf);
+ capa_mfree(error);
g_new_answerdb[q_idx] = 'N';
g_log_string[q_idx]='S';
break;
case UNIT_FAIL:
create_answer_area(p,q_idx);
g_tried[q_idx]--; /* don't count as a try */
- sprintf(buf,"
Units incorrect, tries %d/%d.\n",g_tried[q_idx],tries);
+ sprintf(buf,"
Units incorrect, Computer reads units as %s, tries %d/%d.\n",error,g_tried[q_idx],tries);
+ capa_mfree(error);
append_qtext(buf);
g_new_answerdb[q_idx] = 'N';
g_log_string[q_idx]='U';
@@ -2044,9 +2109,10 @@ int tries;
create_answer_area(p,q_idx);
g_tried[q_idx]--; /* don't count as a try */
if(tries > 0) {
- sprintf(buf,"
Only a number required, tries %d/%d.\n",g_tried[q_idx],tries);
+ sprintf(buf,"
Only a number required, Computer reads units of %s, tries %d/%d.\n",error,g_tried[q_idx],tries);
append_qtext(buf);
}
+ capa_mfree(error);
g_new_answerdb[q_idx] = 'N';
g_log_string[q_idx]='U';
break;
@@ -2097,7 +2163,8 @@ int sig_u;
char *a_fmt;
int tries;
char buf[MAX_BUFFER_SIZE];
-
+ char *error;
+
a_tpe = p->ans_type;
c_ans = p->answer;
t_tpe = p->tol_type;
@@ -2136,23 +2203,30 @@ int tries;
return;
}
- switch( capa_check_answers(p,ans,cnt) ) {
+ switch( capa_check_answers(p,ans,cnt,&error) ) {
case EXACT_ANS:
case APPROX_ANS:
g_new_answerdb[q_idx] = 'Y';
g_log_string[q_idx]='Y';
break;
+ case WANTED_NUMERIC:
+ g_new_answerdb[q_idx] = 'N';
+ g_log_string[q_idx]='s';
+ break;
case SIG_FAIL:
g_new_answerdb[q_idx] = 'N';
g_log_string[q_idx]='S';
+ capa_mfree(error);
break;
case UNIT_FAIL:
g_new_answerdb[q_idx] = 'N';
g_log_string[q_idx]='U';
+ capa_mfree(error);
break;
case UNIT_NOTNEEDED:
g_new_answerdb[q_idx] = 'N';
g_log_string[q_idx]='U';
+ capa_mfree(error);
break;
case NO_UNIT:
g_new_answerdb[q_idx] = 'N';
@@ -2597,7 +2671,7 @@ FILE *out;
fprintf(out,"\n");
- fprintf(out,"