Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
}