version 1.10, 2000/03/22 21:08:03
|
version 1.16, 2000/09/14 20:20:45
|
Line 1
|
Line 1
|
|
/* Library of useful functions |
|
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. |
|
*/ |
|
|
/* =||>|===================== capaCommon.c =====================|<||= */ |
/* =||>|===================== capaCommon.c =====================|<||= */ |
/* created 1994 by Isaac Tsai */ |
/* created 1994 by Isaac Tsai */ |
/* 1994, 1995, 1996, 1997, 1998, 1999 copyrighted by Isaac Tsai */ |
|
/* TODO: restructure capa_check_ans*() calls into one */ |
/* TODO: restructure capa_check_ans*() calls into one */ |
/* =||>|===================== capaCommon.c =====================|<||= */ |
/* =||>|===================== capaCommon.c =====================|<||= */ |
#include <ctype.h> |
#include <ctype.h> |
Line 25 int yyparse();
|
Line 48 int yyparse();
|
extern FILE *yyin; |
extern FILE *yyin; |
extern void yyrestart(); |
extern void yyrestart(); |
|
|
|
extern FILE *dfp; |
|
|
/*----------------------------------------------------------*/ |
/*----------------------------------------------------------*/ |
/* RETURN: -1 file error */ |
/* RETURN: -1 file error */ |
/* 0 success */ |
/* 0 success */ |
Line 2124 extern int Symb_count;
|
Line 2149 extern int Symb_count;
|
extern int first_run; |
extern int first_run; |
extern int Stop_Parser; |
extern int Stop_Parser; |
extern void (*Status_Func)(); |
extern void (*Status_Func)(); |
|
#ifdef TTH |
|
extern void tth_restart(); |
|
extern char* tth_err; |
|
#endif /*TTH*/ |
long seed1, seed2; |
long seed1, seed2; |
T_student a_student; |
T_student a_student; |
char *class, *classname, warn_msg[WARN_MSG_LENGTH]; |
char *class, *classname, warn_msg[WARN_MSG_LENGTH]; |
Line 2152 extern void (*Status_Func)();
|
Line 2181 extern void (*Status_Func)();
|
} |
} |
u_getunit(fp); |
u_getunit(fp); |
fclose(fp); |
fclose(fp); |
|
#ifdef TTH |
|
if(tth_err) { free(tth_err); tth_err=NULL; } |
|
tth_restart(); |
|
#endif /*TTH*/ |
strncpy(Parse_name,a_student.s_nm,MAX_NAME_CHAR+1); |
strncpy(Parse_name,a_student.s_nm,MAX_NAME_CHAR+1); |
strncpy(Parse_student_number,student_number,MAX_STUDENT_NUMBER+1); |
strncpy(Parse_student_number,student_number,MAX_STUDENT_NUMBER+1); |
Parse_section = a_student.s_sec; |
Parse_section = a_student.s_sec; |
Line 3169 capa_check_answer(p, answer, error) Prob
|
Line 3202 capa_check_answer(p, answer, error) Prob
|
/* and the result will be given back as 0 or 1 to indicate the */ |
/* and the result will be given back as 0 or 1 to indicate the */ |
/* given answer is correct or not */ |
/* given answer is correct or not */ |
/* arguments are given to the program as */ |
/* arguments are given to the program as */ |
|
/* before running the program, check its existance first */ |
|
/* should we specify a time out period in capa.config file? */ |
|
/* set up a timer for this purpose */ |
|
/* FILE *popen (const char *command,const char *type ); */ |
|
|
break; |
break; |
|
|
Line 3176 capa_check_answer(p, answer, error) Prob
|
Line 3213 capa_check_answer(p, answer, error) Prob
|
return (result); |
return (result); |
} |
} |
|
|
/* ----------------------------------------------------------------------------------- */ |
/* -------------------------------------------------------------------------- */ |
/* 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 */ |
/* absolute tolerance: (*fml_str) - (*input_str) */ |
/* absolute tolerance: (*fml_str) - (*input_str) */ |
Line 3336 Problem_t *p; char **answers; int cnt; c
|
Line 3373 Problem_t *p; char **answers; int cnt; c
|
outcomes = (int *)capa_malloc(sizeof(int),cnt); |
outcomes = (int *)capa_malloc(sizeof(int),cnt); |
for(ii=0;ii<cnt;ii++) outcomes[ii]=0; /* initialize the outcomes array */ |
for(ii=0;ii<cnt;ii++) outcomes[ii]=0; /* initialize the outcomes array */ |
outcomes[0] = capa_check_answer(p, answers[0], &errormsg[0]); |
outcomes[0] = capa_check_answer(p, answers[0], &errormsg[0]); |
|
#ifdef COMMON_DBUG |
|
fprintf(dfp,"CAPA_CHECK_ANSWER(%s,%s):: outcome[0]=%d\n", |
|
p->answer,answers[0],outcomes[0]); fflush(dfp); |
|
#endif |
for(ii=1, ai = p->ans_list; ai; ii++,ai = ai->ans_next ) { |
for(ii=1, ai = p->ans_list; ai; ii++,ai = ai->ans_next ) { |
outcomes[ii] = capa_check_ans(ai,answers[ii],&(errormsg[ii])); |
outcomes[ii] = capa_check_ans(ai,answers[ii],&(errormsg[ii])); |
|
#ifdef COMMON_DBUG |
|
fprintf(dfp,"CAPA_CHECK_ANS(%s,%s): outcome[%d]=%d\n", ai->ans_str,answers[ii],ii,outcomes[ii]); fflush(dfp); |
|
#endif |
} |
} |
done = ii = 0; |
done = ii = 0; |
result = 0; |
result = 0; |
Line 3352 Problem_t *p; char **answers; int cnt; c
|
Line 3396 Problem_t *p; char **answers; int cnt; c
|
ii++; |
ii++; |
if(ii==cnt) done = 1; |
if(ii==cnt) done = 1; |
} |
} |
if( result == 0 ) { /* check if any of the outcome has failed to be a numeric */ |
if( result == 0 ) { |
|
/* check if any of the outcome has failed to be a numeric |
|
or was a malformed equation */ |
done = ii = 0; |
done = ii = 0; |
while( !done ) { |
while( !done ) { |
if( outcomes[ii] == WANTED_NUMERIC ) { |
if( outcomes[ii] == WANTED_NUMERIC || outcomes[ii] == BAD_FORMULA ) { |
result = outcomes[ii]; |
result = outcomes[ii]; |
done = 1; |
done = 1; |
} |
} |
Line 3363 Problem_t *p; char **answers; int cnt; c
|
Line 3409 Problem_t *p; char **answers; int cnt; c
|
if(ii==cnt) done = 1; |
if(ii==cnt) done = 1; |
} |
} |
} |
} |
if( result == 0 ) { /* check if any of the outcome has failed on sig figs */ |
if( result == 0 ) {/*check if any of the outcome has failed on sig figs*/ |
done = ii = 0; |
done = ii = 0; |
while( !done ) { |
while( !done ) { |
if( outcomes[ii] == SIG_FAIL ) { |
if( outcomes[ii] == SIG_FAIL ) { |