Annotation of loncom/homework/caparesponse/caparesponse.c, revision 1.14

1.7       albertel    1: /* The LearningOnline Network with CAPA 
                      2:  * CAPA wrapper code
1.14    ! albertel    3:  * $Id: caparesponse.c,v 1.13 2004/03/12 23:46:06 albertel Exp $
1.7       albertel    4:  *
                      5:  * Copyright Michigan State University Board of Trustees
                      6:  *
                      7:  * This file is part of the LearningOnline Network with CAPA (LON-CAPA).
                      8:  *
                      9:  * LON-CAPA is free software; you can redistribute it and/or modify
                     10:  * it under the terms of the GNU General Public License as published by
                     11:  * the Free Software Foundation; either version 2 of the License, or
                     12:  * (at your option) any later version.
                     13:  *
                     14:  * LON-CAPA is distributed in the hope that it will be useful,
                     15:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
                     16:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     17:  * GNU General Public License for more details.
                     18:  *
                     19:  * You should have received a copy of the GNU General Public License
                     20:  * along with LON-CAPA; if not, write to the Free Software
                     21:  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
                     22:  *
                     23:  * /home/httpd/html/adm/gpl.txt
                     24:  *
                     25:  * http://www.lon-capa.org/
                     26:  */
                     27: 
1.1       albertel   28: #include <capaCommon.h>
1.6       albertel   29: #include <ranlib.h>
                     30: 
                     31: PointsList_t * parse_pts_list (char *pts_list) {
                     32:   PointsList_t *new=NULL, *end=NULL, *beforeend=NULL, *rlist=NULL;
                     33:   char *idx_pts=pts_list;
                     34:   int done=0;
1.11      albertel   35:   /*fprintf(stderr,"ids %s\n",id_list);
                     36:     fprintf(stderr,"pts %s\n",pts_list);*/
1.6       albertel   37:   while (!done) {
                     38:     int idx;
1.11      albertel   39:     /*fprintf(stderr,"pts; %s\n",idx_pts);*/
1.6       albertel   40:     new=gen_ptslist_str(idx_pts);
                     41:     if (!new) break;
                     42:     if (!rlist) { rlist=new; }
                     43:     if (end) { 
                     44:       end->pts_next=new; 
                     45:       idx=end->pts_idx;
                     46:     } else {
                     47:       idx=-1;
                     48:     }
                     49:     end=new;
                     50:     while (end) {
                     51:       idx++;
                     52:       end->pts_idx=idx;
1.11      albertel   53:       /*fprintf(stderr,"end is:%d:%d:%s:%d\n",idx,end->pts_idx,end->pts_str,
                     54: 	end->pts_next);*/
1.6       albertel   55:       beforeend=end;
                     56:       end=end->pts_next;
                     57:     }
                     58:     end=beforeend;
                     59:     idx_pts=strchr(idx_pts,';');
                     60:     if (idx_pts) { idx_pts++; } else { done=1; }
                     61:   }
                     62:   
                     63:   return rlist;
                     64: }
                     65: 
1.1       albertel   66: int caparesponse_capa_check_answer(char *response,char *correct,
                     67: 				   int type,int tol_type,double tolerance,
                     68: 				   int sig_lbound,int sig_ubound, 
                     69: 				   char *ans_fmt, char *unit_str,
1.6       albertel   70: 				   int calc, char *id_list, char *pts_list, 
1.12      albertel   71: 				   char *rndseed, char** reterror)
1.6       albertel   72: 				   
1.1       albertel   73: {
1.6       albertel   74:   long result,seed1,seed2;
1.1       albertel   75:   Problem_t p;
                     76:   char *error=NULL,filename[FILE_NAME_LENGTH];
                     77:   FILE *fp;
1.11      albertel   78: 
1.9       bowersj2   79:   /* need to initialize unit parser*/
1.13      albertel   80:   *reterror=NULL;
1.4       albertel   81:   sprintf(filename,"/home/httpd/html/res/adm/includes/capa.units");
1.1       albertel   82:   if ((fp=fopen(filename,"r"))==NULL) {
                     83:     /* printf("Error: can't open %s\n",filename);*/
                     84:       return (-1); 
                     85:   }
                     86:   u_getunit(fp);
                     87:   fclose(fp);
1.6       albertel   88:   /* need to setup random generator (FIXME) should only do this if 
                     89:      it hasn't been yet*/
                     90:   phrtsd(rndseed,&seed1,&seed2);
                     91:   setall(seed1,seed2);
1.1       albertel   92: 
1.6       albertel   93:   /* assign_id_list and assign_pts_list exist in capaGrammerDef.y */
                     94:   p.id_list=NULL;
                     95:   p.pts_list=NULL;
1.11      albertel   96: 
1.6       albertel   97:   if (type == ANSWER_IS_FORMULA) {
                     98:     p.id_list=id_list;
                     99:     p.pts_list=parse_pts_list(pts_list);
                    100:   }
1.2       albertel  101:   p.ans_type   = type;
                    102:   p.answer     = correct;
                    103:   p.tol_type   = tol_type;
                    104:   p.tolerance  = tolerance;
                    105:   p.sig_lbound = sig_lbound;
                    106:   p.sig_ubound = sig_ubound;
1.8       bowersj2  107:   
                    108:   if (ans_fmt != NULL ) {
                    109:     strncpy(p.ans_fmt,ans_fmt,ANSWER_STRING_LENG-1);
                    110:   }
                    111:   if (unit_str != NULL && unit_str[0]!='\0') {
1.5       albertel  112:     strncpy(p.unit_str,unit_str,ANSWER_STRING_LENG-1);
                    113:     p.ans_unit   = u_parse_unit(unit_str);
                    114:   } else {
                    115:     p.unit_str[0]='\0';
1.9       bowersj2  116:     p.ans_unit=NULL;
1.5       albertel  117:   }
1.2       albertel  118:   p.calc       = calc;
1.1       albertel  119: 
                    120:   result=capa_check_answer(&p,response,&error);
1.12      albertel  121:   *reterror=error;
                    122:   // Caller is expected to free reterror
                    123:   //  if (error!=NULL) {free(error);}
1.1       albertel  124: 
                    125:   return result;
                    126: }
1.14    ! albertel  127: 
        !           128: int caparesponse_get_real_response (char* unit_str, char* answer,
        !           129: 				    double* scaled) {
        !           130:   //double caparesponse_get_real_response (char* unit_str, char* answer) {
        !           131:   int     input_len,all_alphabet,idx,outcome,result;
        !           132:   double  n_part,scale=1.0,given,target;
        !           133:   char    input[ANSWER_STRING_LENG],filename[FILE_NAME_LENGTH];
        !           134:   Unit_t *ans_unit;
        !           135:   long    seed1,seed2;
        !           136:   FILE   *fp;
        !           137:   sprintf(filename,"/home/httpd/html/res/adm/includes/capa.units");
        !           138:   if ((fp=fopen(filename,"r"))==NULL) {
        !           139:     /* printf("Error: can't open %s\n",filename);*/
        !           140:     return (-1); 
        !           141:   }
        !           142:   u_getunit(fp);
        !           143:   fclose(fp);
        !           144: 
        !           145:   if (unit_str != NULL && unit_str[0]!='\0') {
        !           146:     ans_unit   = u_parse_unit(unit_str);
        !           147:   } else {
        !           148:     ans_unit=NULL;
        !           149:   }
        !           150:   input_len = strlen(answer);
        !           151:   all_alphabet = 1;
        !           152:   for(idx=0;idx<input_len;idx++) {
        !           153:     if( isdigit(answer[idx]) ) {
        !           154:       all_alphabet = 0;
        !           155:     }
        !           156:   }
        !           157:   if( !all_alphabet ) {
        !           158:     outcome = split_num_unit(answer,&n_part,input,unit_str);
        !           159:     if( outcome > 1 ) { /* with both num and unit parts or only unit part */
        !           160:       if( ans_unit != NULL ) {
        !           161: 	result = check_correct_unit(unit_str,ans_unit,&scale);
        !           162:       } else {
        !           163: 	/* what to do when no unit is specified but student entered a unit? */
        !           164: 	result = UNIT_NOTNEEDED;
        !           165:       }
        !           166:     } else {
        !           167:       if( ans_unit != NULL ) {
        !           168: 	result = NO_UNIT;
        !           169:       }
        !           170:     }
        !           171:     if( (result != NO_UNIT) && (!check_for_unit_fail(result)) && ( result != UNIT_NOTNEEDED) ) {
        !           172:       given = n_part * scale;
        !           173:       *scaled=given;
        !           174:       /* convert the given answer into proper scale for units */
        !           175:     } /* end if unit check */
        !           176:   } else { /* user entered a
        !           177: lphabet, but no number */
        !           178:     result = WANTED_NUMERIC;
        !           179:   } 
        !           180:   return result;
        !           181: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>