void inverse(struct var_struct * s, struct var_struct * A) { int i,j; double ration; struct var_struct temp,tempA; makesure(A->height==A->width,8); temp.p = 0; tempA.p = 0; makesize(&temp, A->height, A->height); setunit(&temp); copy_var(A, &tempA); makesure(1,0); for (i=0;i<temp.height;i++) { if (tempA.p[i][i]==0) { for (j=i+1;j<temp.height;j++) { if (tempA.p[j][i]!=0) { swaprow(&tempA,i,j); swaprow(&temp,i,j); break; } } } if(fabs(tempA.p[i][i])<MINIMUM) { del(&temp); del(&tempA); calcerr=13; return; } //保证对角线元素不为零 ration=1/tempA.p[i][i]; multrow(&tempA,i,ration); multrow(&temp,i,ration); for (j=i+1;j<temp.height;j++) { ration=-tempA.p[j][i]; plusrow(&tempA,i,j,ration); plusrow(&temp,i,j,ration); } } //现已变成对角线元素为1的上三角阵 for (i=0;i<temp.height;i++) { for (j=0;j<i;j++) { ration=-tempA.p[j][i]; plusrow(&tempA,i,j,ration); plusrow(&temp,i,j,ration); } } copy_var(&temp,s); del(&temp); del(&tempA); }
int get_parameter(const char *data, size_t data_len, const char *name, char *dst, int dst_len) { const char *value_start, *data_end, *value_end; int len; char search[data_len]; if (dst == NULL || dst_len == 0) { len = -2; } else if (data == NULL || name == NULL || data_len == 0) { len = -1; dst[0] = '\0'; } else { data_end = data + data_len; len = -1; dst[0] = '\0'; snprintf(search, data_len, ":%s=", name); if ((value_start = strstr(data, search))) { value_start += strlen(search); value_end = (const char *) memchr(value_start, ':', (size_t)(data_end - value_start)); if (value_end == NULL) { value_end = data_end; } len = value_end - value_start < dst_len ? value_end - value_start : dst_len; copy_var(value_start, dst, len); } } return len; }
double envalue(struct var_struct * s) { int i,j,flag; double result,ration; struct var_struct temp; if(calcerr) return 0; if(s->height!=s->width) { calcerr=8; return 0; } temp.p = 0; copy_var(s, &temp); if(calcerr) return 0; result=1; for (i=0;i<temp.height;i++) { if (temp.p[i][i]==0) { flag=0; for (j=i+1;j<temp.height;j++) { if (temp.p[j][i]!=0) { swaprow(&temp,i,j); result*=-1; flag=1; break; } } } if (fabs(temp.p[i][i])<MINIMUM) { del(&temp); return 0; } //保证对角线元素不为零 for (j=i+1;j<temp.height;j++) { ration=-temp.p[j][i]/temp.p[i][i]; plusrow(&temp,i,j,ration); } result*=temp.p[i][i]; } del(&temp); return result; }
void eval(struct var_struct * p, char * s, int l, int r) { int i,j,n; char op[9]=";, +-*/^E"; char buf[1000]; while(s[l]==' '&&l<=r) l++; while(s[r]==' '&&l<=r) r--; makesure(l<=r,11); while((s[l]=='('&&s[r]==')'&&get_rl(s,r,l)==l)|| (s[l]=='['&&s[r]==']'&&get_rl3(s,r,l)==l)) { l++; r--; while(s[l]==' '&&l<=r) l++; while(s[r]==' '&&l<=r) r--; } if(check_var_name(s+l, r-l+1)||(s[l]=='%'&&check_var_name(s+l+1, r-l))) { strncpy(buf, s+l, 1000); buf[r-l+1]=0; i=get_var(buf); copy_var(vars+i, p); return; } if(check_var_double(s+l, r-l+1)) { double f; strncpy(buf, s+l, 1000); buf[r-l+1]=0; f = atof(buf); set_var(p, f); return; } if(check_var_array(s+l, r-l+1)) { double f1,f2,f3; strncpy(buf, s+l, 1000); buf[r-l+1]=0; i=check_var_array(s+l,r-l+1); if(buf[0]==':'&&!buf[1]) { p->p=0; return; } else if(i==1) { sscanf(buf, "%lf:%lf", &f1, &f2); if(f1<f2) f3=1; else f3=-1; } else { sscanf(buf, "%lf:%lf:%lf", &f1, &f2, &f3); if(fabs(f3)<MINIMUM) { calcerr=17; return; } if((f2-f1)/f3<0) f3=-f3; } if(f3>0) makesize(p, 1, (int)((f2-f1+MINIMUM)/f3)+1); else makesize(p, 1, (int)((f2-f1-MINIMUM)/f3)+1); makesure(1,0); i=0; do{ p->p[0][i]=f1; f1+=f3; i++; if(i>p->width) break; }while((f1-MINIMUM<=f2&&f3>0)||(f1+MINIMUM>=f2&&f3<0)); return; } i=l; while(isalpha(s[i])&&i<=r) i++; if(i>l&&s[i]=='('&&s[r]==')'&&get_rl(s,r,l)==i) { struct var_struct u,v; u.p=0; v.p=0; strncpy(buf, s+l, 1000); buf[i-l]=0; j=0; while(funcname[j][0]) { if(!strncasecmp(funcname[j],buf,10)) break; j++; } if(funcname[j][0]) { eval(&u, s, i+1, r-1); makesure(1,0); take_func(p, &u, j); del(&u); } else { int k; char* kk; j=get_var(buf); strncpy(buf, s+i+1, 1000); buf[r-1-i]=0; kk=strchr(buf, ','); if(!kk) { calcerr=18; return; } k=kk-buf; eval(&u, buf, 0, k-1); makesure(1,0); eval(&v, buf, k+1, strlen(buf)-1); makesure(1,0); selmatrix(vars+j, &u, &v, p); del(&u); del(&v); } return ; } for(j=0;j<9;j++) { n=r; do{ if(toupper(s[n])==op[j]) { struct var_struct m1,m2,m3; m1.p=0; m2.p=0; m3.p=0; if(n>l&&s[n-1]=='.'&&(j==4||j==5||j==6)) eval(&m1,s,l,n-2); else eval(&m1,s,l,n-1); makesure(1,0); eval(&m2,s,n+1,r); makesure(1,0); switch(j) { case 0: link_h(&m1, &m2, p); break; case 1: case 2: link_w(&m1, &m2, p); break; case 3: add_var(&m1, &m2, p); break; case 4: sub_var(&m1, &m2, p); break; case 5: if(n>l&&s[n-1]=='.') domatrix(&m1,&m2,p,4); else mul_var(&m1, &m2, p); break; case 6: if(n>l&&s[n-1]=='.') domatrix(&m1,&m2,p,5); else { inverse(&m3, &m2); mul_var(&m1, &m3, p); del(&m3); } break; case 7: if(n>l&&s[n-1]=='.') domatrix(&m1,&m2,p,6); else { makesure(is_single_var(&m1)&&is_single_var(&m2),12); makesure((**(m1.p))>0,7); set_var(p, exp(log(**(m1.p))*(**(m2.p)))); } break; case 8: makesure(is_single_var(&m1)&&is_single_var(&m2),12); set_var(p, exp(log(10)*(**(m2.p)))*(**m1.p)); break; } del(&m1); del(&m2); return; } if(s[n]==')') n=get_rl(s,n,l); if(s[n]==']') n=get_rl3(s,n,l); n--; }while(n>=l); } if(s[r]=='\'') { struct var_struct m; m.p = 0; eval(&m, s, l, r-1); makesure(1,0); reverse(&m,p); del(&m); return; } calcerr=18; }