--- capa/capa51/pProj/capaCommon.c 2000/02/22 18:19:02 1.9 +++ capa/capa51/pProj/capaCommon.c 2000/03/22 21:08:03 1.10 @@ -596,7 +596,7 @@ int set; ans_p[length]='\0'; sprintf(fmtbuf, "%%%dc",(3*length-1)); sscanf(oneline + MAX_STUDENT_NUMBER+1+length+1,fmtbuf,tries_p); - tries_p[3*length-1]; + tries_p[3*length-1]='\0'; entry->answers = ans_p; entry->tries = tries_p; entry->e_probs = nq; @@ -2612,7 +2612,7 @@ answers_string(mode, p)int mode;Problem_ str_bb = format_toTeX(lower); } else { /* answer could be string, choice */ str_bb = (char *)capa_malloc(strlen(lower)+MAX_BUFFER_SIZE,1); - if (p->ans_type == ANSWER_IS_FORMULA || 1) + if (p->verbatim == DO_VERBATIM) sprintf(str_bb,"\\begin{verbatim}%s\\end{verbatim}",lower); else strcpy(str_bb,lower); @@ -2867,7 +2867,7 @@ answers_string(mode, p)int mode;Problem_ /* <== This routine checks user input string *ans against correct answer *s ==> */ int -capa_check_ans(ai,ans) AnswerInfo_t *ai; char *ans; +capa_check_ans(ai,ans, error) AnswerInfo_t *ai; char *ans; char **error; { int t; /* ans_type */ char *s; /* ans_str */ @@ -2910,9 +2910,12 @@ capa_check_ans(ai,ans) AnswerInfo_t *ai outcome = split_num_unit(ans,&n_part,num_str,unit_str); if( outcome > 1 ) { /* with both num and unit parts or only unit part */ if( u_p != NULL ) { - result = check_correct_unit(unit_str,u_p,&scale); + if (UNIT_FAIL == (result = check_correct_unit(unit_str,u_p,&scale))) { + *error=strsave(unit_str); + } } else { /* what to do when no unit is specified but student entered a unit? */ result = UNIT_NOTNEEDED; + *error=strsave(unit_str); } } else { if( u_p != NULL ) { @@ -2927,8 +2930,10 @@ capa_check_ans(ai,ans) AnswerInfo_t *ai } given = n_part * scale; /* convert the given answer into proper scale for units */ sig = calc_sig( num_str ); - if( (sig < sl) || (sig > su) ) { - result = SIG_FAIL; + if( ((sig < sl ) || (sig > su )) && (sig!=0)) { + result = SIG_FAIL; + *error=capa_malloc(1,ANSWER_STRING_LENG); + sprintf(*error,"%d",sig); } else { switch( tt ) { /* tolerence type */ case TOL_ABSOLUTE: @@ -2970,7 +2975,7 @@ capa_check_ans(ai,ans) AnswerInfo_t *ai } /* end sig check */ } /* end if unit check */ } else { /* user entered alphabets, but no number */ - result = INCORRECT; + result = WANTED_NUMERIC; } } break; @@ -3025,7 +3030,7 @@ capa_check_ans(ai,ans) AnswerInfo_t *ai int -capa_check_answer(p, answer) Problem_t *p; char *answer; +capa_check_answer(p, answer, error) Problem_t *p; char *answer; char **error; { int type; char *correct; @@ -3066,10 +3071,12 @@ capa_check_answer(p, answer) Problem_t * outcome = split_num_unit(answer,&n_part,input,unit_str); if( outcome > 1 ) { /* with both num and unit parts or only unit part */ if( p->ans_unit != NULL ) { - result = check_correct_unit(unit_str,p->ans_unit,&scale); - + if ( UNIT_FAIL == ( result = check_correct_unit(unit_str,p->ans_unit,&scale) ) ) { + *error=strsave(unit_str); + } } else { /* what to do when no unit is specified but student entered a unit? */ result = UNIT_NOTNEEDED; + *error=strsave(unit_str); } } else { if( p->ans_unit != NULL ) { @@ -3086,6 +3093,8 @@ capa_check_answer(p, answer) Problem_t * sig = calc_sig( input ); if( ((sig < sig_l) || (sig > sig_u)) && (sig!=0)) { result = SIG_FAIL; + *error=capa_malloc(1,ANSWER_STRING_LENG); + sprintf(*error,"%d",sig); } else { switch( tol_type ) { case TOL_ABSOLUTE: @@ -3127,7 +3136,7 @@ capa_check_answer(p, answer) Problem_t * } /* end sig check */ } /* end if unit check */ } else { /* user entered alphabet, but no number */ - result = INCORRECT; + result = WANTED_NUMERIC; } } break; @@ -3312,20 +3321,23 @@ int tol_type;double tol;char *lower;char /* New check answers routine checks the /AND and /OR group of answers */ /* use array of char pointers char **a */ int -capa_check_answers(p,answers,cnt) Problem_t *p; char **answers; int cnt; +capa_check_answers(p,answers,cnt,error) +Problem_t *p; char **answers; int cnt; char **error; { AnswerInfo_t *ai; int ii, done, result; int *outcomes; + char **errormsg; + errormsg=(char**)capa_malloc(cnt,sizeof(char*)); if(p->ans_op == ANS_AND) { /* ans /and ans */ if( (cnt != p->ans_cnt) ) { return (ANS_CNT_NOT_MATCH); } - if( cnt == 1 ) { return (capa_check_answer(p, answers[0])); } /* there is only one answer */ + if( cnt == 1 ) { return (capa_check_answer(p, answers[0], error)); } /* there is only one answer */ outcomes = (int *)capa_malloc(sizeof(int),cnt); for(ii=0;iians_list; ai; ii++,ai = ai->ans_next ) { - outcomes[ii] = capa_check_ans(ai,answers[ii]); + outcomes[ii] = capa_check_ans(ai,answers[ii],&(errormsg[ii])); } done = ii = 0; result = 0; @@ -3334,16 +3346,29 @@ capa_check_answers(p,answers,cnt) Proble (outcomes[ii] == NO_UNIT) || (outcomes[ii] == UNIT_NOTNEEDED) ) { result = outcomes[ii]; + if (result != NO_UNIT) { *error=strsave(errormsg[ii]); } done = 1; } ii++; if(ii==cnt) done = 1; } + if( result == 0 ) { /* check if any of the outcome has failed to be a numeric */ + done = ii = 0; + while( !done ) { + if( outcomes[ii] == WANTED_NUMERIC ) { + result = outcomes[ii]; + done = 1; + } + ii++; + if(ii==cnt) done = 1; + } + } if( result == 0 ) { /* check if any of the outcome has failed on sig figs */ done = ii = 0; while( !done ) { if( outcomes[ii] == SIG_FAIL ) { result = outcomes[ii]; + *error = strsave(errormsg[ii]); done = 1; } ii++; @@ -3361,18 +3386,30 @@ capa_check_answers(p,answers,cnt) Proble if(ii==cnt) done = 1; } } + for (ii=0;iians_cnt == 1 ) { return (capa_check_answer(p, answers[0])); } - result = capa_check_answer(p, answers[0]); + if( p->ans_cnt == 1 ) { return (capa_check_answer(p, answers[0], error)); } + result = capa_check_answer(p, answers[0], error); ii = 1; ai = p->ans_list; while( (iians_cnt) && ( (result != EXACT_ANS) && (result != APPROX_ANS) ) ) { - result = capa_check_ans(ai,answers[0]); - ai = ai->ans_next; ii++; + if((ii!=1)&&((result==UNIT_FAIL)||(result==SIG_FAIL)||(result==UNIT_NOTNEEDED))) { + capa_mfree((char*)error); + } + result = capa_check_ans(ai,answers[0],error); + ai = ai->ans_next; ii++; } } return (result);