--- loncom/homework/caparesponse/caparesponse.c 2004/03/12 21:06:19 1.12 +++ loncom/homework/caparesponse/caparesponse.c 2024/04/29 00:34:55 1.23 @@ -1,6 +1,6 @@ /* The LearningOnline Network with CAPA * CAPA wrapper code - * $Id: caparesponse.c,v 1.12 2004/03/12 21:06:19 albertel Exp $ + * $Id: caparesponse.c,v 1.23 2024/04/29 00:34:55 raeburn Exp $ * * Copyright Michigan State University Board of Trustees * @@ -27,6 +27,7 @@ #include #include +#include /* isdigit() */ PointsList_t * parse_pts_list (char *pts_list) { PointsList_t *new=NULL, *end=NULL, *beforeend=NULL, *rlist=NULL; @@ -34,7 +35,7 @@ PointsList_t * parse_pts_list (char *pts int done=0; /*fprintf(stderr,"ids %s\n",id_list); fprintf(stderr,"pts %s\n",pts_list);*/ - while (!done) { + while (!done && pts_list) { int idx; /*fprintf(stderr,"pts; %s\n",idx_pts);*/ new=gen_ptslist_str(idx_pts); @@ -77,6 +78,7 @@ int caparesponse_capa_check_answer(char FILE *fp; /* need to initialize unit parser*/ + *reterror=NULL; sprintf(filename,"/home/httpd/html/res/adm/includes/capa.units"); if ((fp=fopen(filename,"r"))==NULL) { /* printf("Error: can't open %s\n",filename);*/ @@ -96,6 +98,9 @@ int caparesponse_capa_check_answer(char if (type == ANSWER_IS_FORMULA) { p.id_list=id_list; p.pts_list=parse_pts_list(pts_list); +// if ( p.id_list == NULL || p.pts_list == NULL) { +// return BAD_FORMULA; +// } } p.ans_type = type; p.answer = correct; @@ -109,7 +114,10 @@ int caparesponse_capa_check_answer(char } if (unit_str != NULL && unit_str[0]!='\0') { strncpy(p.unit_str,unit_str,ANSWER_STRING_LENG-1); - p.ans_unit = u_parse_unit(unit_str); + //p.ans_unit = u_parse_unit(unit_str); + p.ans_unit = parse_unit_expr(unit_str); + p.ans_unit = process_utree(p.ans_unit); + //print_unit_t(p.ans_unit); } else { p.unit_str[0]='\0'; p.ans_unit=NULL; @@ -123,3 +131,77 @@ int caparesponse_capa_check_answer(char return result; } + +int caparesponse_get_real_response (char* unit_str, char* answer, + double* scaled) { + //double caparesponse_get_real_response (char* unit_str, char* answer) { + int input_len,all_alphabet,idx,outcome=-1,result; + ouble n_part,scale=1.0,given; + char input[ANSWER_STRING_LENG],filename[FILE_NAME_LENGTH], + tmp_unit_str[ANSWER_STRING_LENG]; + Unit_t *ans_unit; + FILE *fp; + sprintf(filename,"/home/httpd/html/res/adm/includes/capa.units"); + if ((fp=fopen(filename,"r"))==NULL) { + /* printf("Error: can't open %s\n",filename);*/ + return (-1); + } + u_getunit(fp); + fclose(fp); + + if (unit_str != NULL && unit_str[0]!='\0') { + ans_unit = parse_unit_expr(unit_str); + ans_unit = process_utree(ans_unit); + } else { + ans_unit=NULL; + } + input_len = strlen(answer); + all_alphabet = 1; + for(idx=0;idx 0 ) { + if( outcome > 1 ) { /* with both num and unit parts or only unit part */ + if( ans_unit != NULL ) { + result = check_correct_unit(tmp_unit_str,ans_unit,&scale); + } else { + /* what to do when no unit is specified but student entered a unit? */ + result = UNIT_NOTNEEDED; + } + } else { + if( ans_unit != NULL ) { + result = NO_UNIT; + } + } + if( (result != NO_UNIT) && (!check_for_unit_fail(result)) && ( result != UNIT_NOTNEEDED) ) { + given = n_part * scale; + *scaled=given; + /* convert the given answer into proper scale for units */ + } /* end if unit check */ + } else { /* user entered alphabet, but no number */ + result = WANTED_NUMERIC; + } + return result; +} + +/* Testing harness +int main(void) { + int result=0; + char *reterror=NULL; + result= caparesponse_capa_check_answer("10^3","1000", + ANSWER_IS_FORMULA, + TOL_ABSOLUTE,1E-3, + 3,5,NULL,NULL, + CALC_UNFORMATED, + "","4", + "rndseed", + &reterror); + fprintf(stderr,"result %d\nreterror: %s\n",result,reterror); +} +*/