c语言混合计算器

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
struct ybl {
    char name[5];
    char expression[50];
    long double value[15];
};
struct bl {
    char name[5];
    int length = 0;
    long double value[15];
};
struct cons {
    char name[5];
    int cmark = 0;
    char expression[50];
    long double value;
};
ybl y[8]; bl b[22]; cons co[15];
int o = 0, q = 0, z = 1, cc = 0; int cas = 0; bool degree = 0;
void again0()
{
    if (degree) {
        printf("角度制\n---------\n");
    }
    else {
        printf("弧度制\n---------\n");
    }
}
int op(char c)
{
    if (c == '+' || c == '-' || c == '*' || c == '/' || c == '^') { return 1; }
    else if (c == 'p' || c == 'z' || c == 'd' || c == 'x' || c == 'h' || c == 'w') { return 2; }
    else if (c == 's' || c == 'c' || c == 't' || c == 'l' || c == 'S' || c == 'C' || c == 'T' || c == 'e') { return 3; }
    return 0;
}
void clear(char* s)
{
    for (int i = 0; s[i] != '\0'; i++) {
        s[i] = '\0';
    }
}
void clean(char* s, int mark)
{
    for (int i = 0; s[i] != '\0'; i++) {
        if (mark && s[i] == '=') { break; }
        else if (s[i] == ' ') {
            int j = i + 1;
            for (; s[j] == ' ' && s[j] != '\0'; j++);
            j = j - i;
            for (int k = i; s[k + j - 1] != '\0'; k++) {
                s[k] = s[k + j];
            }
            if (mark && s[i] == '=') { break; }
        }
    }
}
int nam_num(char* s)
{
    int i = 0;
    if (s[0] == '.') { return 0; }
    if (s[0] == '0' && s[1] != '.' && s[1] != '\0') { return 0; }
    for (int count = 1; i < 17 && s[i] != '\0'; i++) {
        if (count && s[i] == '.') { count = 0; continue; }
        if (s[i] > '9' || s[i] < '0') { break; }
    }
    if (i == 17) { return 0; }
    if (s[i] == '\0' && s[i - 1] != '.') { return 2; }
    if (s[0] < '9' + 1 && s[0]>'0' - 1) { return 0; }
    for (i = 0; s[i] != '\0' && i < 5; i++) {
        if (s[i] < 'Z' + 1 && s[i]>'A' - 1) {}
        else if (s[i] < 'z' + 1 && s[i]>'a' - 1) {}
        else if (s[i] < '9' + 1 && s[i]>'0' - 1) {}
        else { return 0; }
    }
    if (i != 5) { return 1; }
    return 0;
}
void cdel(int index) {
    for (int i = index; i < cc; i++) {
        co[i].cmark = co[i + 1].cmark;
        for (int j = 0; j < 4; j++) {
            co[i].name[j] = co[i + 1].name[j];
        }
        for (int j = 0; j < 50; j++) {
            co[i].expression[j] = co[i + 1].expression[j];
        }
    }co[cc].cmark = cas;
    if (cc) { cc--; }
}
int ysearch(char* s)
{
    for (int i = 0; i < o; i++) {
        if (strcmp(s, y[i].name) == 0) { return i; }
    }
    return -1;
}
void again2(int);
void again1(int back) {
    again0();
    if (cas) { printf("cast\n---------\n"); }
    for (int i = 0; i < q; i++) {
        if (b[i].length != 0) {
            printf("%%");
            printf("%-4s=", b[i].name);
            for (int j = 0; j < b[i].length; j++) {
                printf("|%-10.5Lg", b[i].value[j]);
            }
            printf("\n");
        }
    }int mark = cas;
    for (int i = 0; i < cc; i++) {
        if (co[i].cmark == 1 && mark) { printf("---------\n"); mark = 0; }
        printf("#");
        printf("%s=%s\n", co[i].name, co[i].expression);
    }if (mark == 1) { printf("---------\n"); }
    if (back) { again2(0); }
    if (cas == 0) { printf("---------\n因变量:\n"); }
    for (int i = 0; i < o; i++) {
        printf("%s=%s\n", y[i].name, y[i].expression);
    }
}
void shuaxin1(int index) {
    if (index > o - 1) { o++; }
    system("CLS");
}
int in_fail(char* x, char* y)
{
    if (x[0] == '\0') { return -1; }
    int i = 0, j, mark = 0; if (x[0] == '-') { i++; }
    for (; x[i] != '\0'; i = j + 1) {
        for (j = i; x[j] != '\0'; j++) {
            while (x[j] == '(') {
                if (i == j) {}
                else if (x[i + 1] == '(') {
                    if (op(x[i]) == 1 || op(x[i]) == 3) {}
                    else { return -1; }
                }
                else { return -1; }
                if (x[j + 1] == '-') { j++; }
                j++; i = j; mark++;
            }
            if (op(x[j]) == 1) { break; }
            else if (x[j] == ')') { break; }
        }
        char tmp[18]; int l = 0, k = i;
        for (; k < j && l < 17; k++, l++) {
            tmp[l] = x[k];
        }tmp[l] = '\0';
        if (tmp[0] == '\0') { return -1; }
        if (l == 17) { return -1; }
        if (strcmp(y, tmp) == 0) { return 1; }
        if (nam_num(tmp) == 0) { return -1; }
        if (x[j] == ')') {
            while (x[j] == ')') { j++; mark--; }
            if (x[j] != '\0' && op(x[j]) != 1) { return -1; }
        }
    }
    if (mark != 0 || op(x[i - 1]) == 1) { return -1; }
    return 0;
}
bool cant(int* rank)
{
    int count[8] = { 0 };
    for (int i = 0; i < o; i++) {
        count[i]++;
        if (count[i] > o) { printf("因变量互相包含!\n"); return 1; }
        for (int j = i; j < o; j++) {
            int f = in_fail(y[rank[i]].expression, y[rank[j]].name);
            if (f == -1) { printf("%s 表达式错误!\n", y[rank[i]].name); return 1; }
            if (f == 1) {
                int tmp = rank[i];
                rank[i] = rank[j];
                rank[j] = tmp;
                i--; break;
            }
        }
    }
    return 0;
}
int bsearch(char* s)
{
    for (int i = 0; i < q; i++) {
        if (strcmp(s, b[i].name) == 0) { return i; }
    }
    return -1;
}
int csearch(char* s)
{
    for (int i = 0; i < cc; i++) {
        if (strcmp(s, co[i].name) == 0) { return i; }
    }
    return -1;
}
int b_co_check(char* pp, int* len)
{
    int i, j;
    char* x;
    for (int p = 0; p < cc; p++) {
        x = co[p].expression; int count = 0, mark1 = -1, mark = 1; strcpy(pp, co[p].name);
        if (x[0] == '\0') { return 1; }
        if (cas == 2 && x[0] != 'h' && x[0] != 'j' && x[0] != 'f') { return 1; }
        i = 0; if (x[0] == '-') { i++; }
        for (; x[i] != '\0'; i = j + 1)
        {
            for (j = i; x[j] != '\0'; j++) {
                while (x[j] == '(') {
                    if (i == j) {}
                    else if (x[i + 1] == '(') {
                        if (op(x[i]) == 3 || op(x[i]) == 1) {}
                        else if ((cas < 2 && op(x[i]) == 2) || (cas == 2 && (x[i] == 'h' || x[i] == 'j' || x[i] == 'f')))
                        {
                            if (mark1 > -1) { return 3; }mark1 = i;
                        }
                        else { return 1; }
                    }
                    else { return 1; }
                    if (x[j + 1] == '-') { j++; }
                    j++; i = j; count++;
                }
                if (op(x[j]) == 1) { break; }
                else if (x[j] == ')') { break; }
            }
            char tmp[18]; int l = 0, k = i;
            for (; k < j && l < 17; k++, l++) {
                tmp[l] = x[k];
            }tmp[l] = '\0';
            if (tmp[0] == '\0' || l == 17) { return 1; }
            if (cas == 3) { if (nam_num(tmp) != 2) { return 1; } }
            else {
                if (nam_num(tmp) == 0) { return 1; }
                else if (nam_num(tmp) == 1) {
                    if (mark1 == -1) { return 1; }
                    else {
                        k = 0;
                        for (l = mark1; l < i; l++) {
                            if (x[l] == '(') { k++; }
                            else if (x[l] == ')') { k--; if (k == 0) { break; } }
                        }if (l != i) { return 1; }
                    }
                    l = bsearch(tmp);
                    if (l == -1) {
                        printf("#%s: %s???\n", pp, tmp);
                        return 4;
                    }
                    else {
                        l = b[l].length;
                        if (l) { k = l; }
                        else { k = z; }
                        if (mark) { len[p] = k; mark = 0; }
                        else if (len[p] != k) { return 2; }
                    }
                }
            }
            if (x[j] == ')') {
                while (x[j] == ')') { j++; count--; }
                if (x[j] != '\0' && op(x[j]) != 1) { return 1; }
            }
        }if (count != 0 || op(x[i - 1]) == 1) { return 1; }
    }
    if (cas == 0) {
        for (int p = 0; p < o; p++) {
            x = y[p].expression; i = 0; if (x[0] == '-') { i++; }
            for (; x[i] != '\0'; i = j + 1)
            {
                for (j = i; x[j] != '\0'; j++) {
                    while (x[j] == '(') { if (x[j] == '-') { j++; }j++; i = j; }
                    if (op(x[j]) == 1) { break; }
                    else if (x[j] == ')') { break; }
                }
                char tmp[18]; int l = 0, k = i;
                for (; k < j; k++, l++) {
                    tmp[l] = x[k];
                }tmp[l] = '\0';
                if (nam_num(tmp) == 2) { continue; }
                if (nam_num(tmp) == 1) {
                    l = bsearch(tmp);
                    if (l == -1 && csearch(tmp) == -1 && ysearch(tmp) == -1) { printf("%s: %s???\n", y[p].name, tmp); return 5; }
                    else if (b[l].length != 0) { printf("%s: %s???", y[p].name, tmp); return 5; }
                }
            }
        }
    }
    return 0;
}
long double dushu(char* s, int i)
{
    long long int n = 0, j = 0; int mark = 1;
    if (s[i] == '-') { mark = -1; i++; }
    for (int k = i; s[k] != '\0' && s[k] != ' '; k++) {
        if (s[k] == '.') { j = 1; }
        else { n *= 10; n += s[k] - '0'; j *= 10; }
    }
    n *= mark;
    if (j) { return (n + 0.0) / j; }
    return n;
}
void clear_(long double* v)
{
    for (int i = 0; i < z; i++) {
        v[i] = 0;
    }
}
void bdel(int index)
{
    for (int i = index; i < q; i++) {
        b[i].length = b[i + 1].length;
        for (int j = 0; j < 4; j++) {
            b[i].name[j] = b[i + 1].name[j];
        }
        int l;
        if ((l = b[i + 1].length) == 0) { l = z; }
        for (int j = 0; j < l; j++) {
            b[i].value[j] = b[i + 1].value[j];
        }
    }
    b[q].length = 0;
    if (q) { q--; }
}
int duru1(char* s)
{
    if (o + q == 20) { printf("饱和!\n"); return -1; }
    int i = 0; char tmp[6];
    for (; s[i] != '='; i++) {
        if (i > 4) { return -1; }
        tmp[i] = s[i];
    }tmp[i] = '\0';
    if (nam_num(tmp) != 1 || csearch(tmp) != -1 || bsearch(tmp) != -1) { printf("无效名字!\n"); return -1; }
    int j;
    if (o == 0) {
        for (j = 0; j < i; j++) {
            y[0].name[j] = tmp[j];
        }y[0].name[j] = '\0'; i += 1;
        for (j = 0; s[i] != '\0' && j < 50; i++, j++) {
            y[0].expression[j] = s[i];
        }y[0].expression[j] = '\0';
        return 2000;
    }
    int index = ysearch(tmp); i += 1;
    if (index == -1) {
        if (o == 8) { printf("饱和!\n"); return -1; }
        index = o;
        for (j = 0; j < i; j++) {
            y[index].name[j] = tmp[j];
        }y[index].name[j] = '\0';
    }
    else { clear(y[index].expression); }
    for (j = 0; s[i] != '\0' && s[i] != ' ' && j < 50; i++, j++) {
        y[index].expression[j] = s[i];
    }y[index].expression[j] = '\0';
    return index;
}
int duru2(char* s, int way)
{
    if (o + q == 21) { printf("饱和!\n"); return -2; }
    int i; char tmp[6];
    for (i = 0; s[i] != '='; i++) {
        if (i > 4) { return -1; }
        if (way == 1) { tmp[i] = s[i + 1]; }
        else { tmp[i] = s[i]; }
    }if (way == 1) { tmp[i - 1] = '\0'; }
    else { tmp[i] = '\0'; }
    tmp[i] = '\0';
    if (nam_num(tmp) != 1 || ysearch(tmp) != -1 || csearch(tmp) != -1) { printf("无效名字!\n"); return -2; }
    int j = i + 1;
    while (s[j] == ' ') { j++; }
    if (s[j] == '\0') { printf("无效内容!\n"); return -2; }
    int len = 0;
    if (q == 0) {
        for (j = 0; j < i; j++) {
            b[0].name[j] = tmp[j];
        }i += 1; if (way == 1) { b[0].name[j - 1] = '\0'; }
        else { b[0].name[j] = '\0'; }
        for (j = 0; s[i] != '\0' && j < 15; j++) {
            while (s[i] == ' ') { i++; }if (s[i] == '\0') { break; }
            b[0].value[j] = dushu(s, i); if (way == 2) { len++; }
            else { b[0].length++; }
            while (s[i] != ' ' && s[i] != '\0') { i++; }
        }
        if (way == 2) { if (len > z) { z = len; }b[0].length = 0; }
        return 2000;
    }
    int index = bsearch(tmp);
    if (index == -1) {
        index = q;
        for (j = 0; j < i; j++) {
            b[index].name[j] = tmp[j];
        }if (way == 1) { b[index].name[j - 1] = '\0'; }
        else { b[index].name[j] = '\0'; }
    }
    else { clear_(b[index].value); }
    i += 1;
    for (j = 0; s[i] != '\0' && j < 15; j++) {
        while (s[i] == ' ') { i++; }if (s[i] == '\0') { break; }
        b[index].value[j] = dushu(s, i); len++;
        while (s[i] != ' ' && s[i] != '\0') { i++; }
    }
    if (way == 2) { if (len > z) { z = len; }b[index].length = 0; }
    else if (way == 1) { b[index].length = len; }
    return index;
}
int duru3(char* s)
{
    int i = 1;
    char tmp[6];
    for (; s[i] != '='; i++) {
        if (i > 4) { return -1; }
        tmp[i - 1] = s[i];
    }tmp[i - 1] = '\0';
    if (nam_num(tmp) != 1 || ysearch(tmp) != -1 || bsearch(tmp) != -1) { printf("无效名字!\n"); return -1; }
    int j;
    if (cc == 0) {
        if (cas == 1) { co[0].cmark = 1; }
        for (j = 0; j < i; j++) {
            co[0].name[j] = tmp[j];
        }co[0].name[j] = '\0'; i += 1;
        for (j = 0; s[i] != '\0' && j < 50; i++, j++) {
            co[0].expression[j] = s[i];
        }co[0].expression[j] = '\0';
        return 2000;
    }i += 1;
    int index = csearch(tmp);
    if (index == -1) {
        if (cc == 15) { printf("饱和!\n"); return -1; }
        index = cc;
        for (j = 0; j < i; j++) {
            co[index].name[j] = tmp[j];
        }co[index].name[j] = '\0';
    }
    else if (cas == 1 && co[index].cmark == 0) { printf("无法覆盖!\n"); return -1; }
    else { clear(co[index].expression); }
    for (j = 0; s[i] != '\0' && j < 50; i++, j++) {
        co[index].expression[j] = s[i];
    }co[index].expression[j] = '\0';
    if (cas == 1) { co[index].cmark = 1; }
    return index;
}
void again2(int normal)
{
    if (normal) { again1(0); }
    printf("---------\n变量:\n");
    for (int i = 0; i < q; i++) {
        if (b[i].length == 0) {
            printf("%-4s=", b[i].name);
            for (int j = 0; j < z; j++) {
                printf("|%-10.5Lg", b[i].value[j]);
            }
            printf("\n");
        }
    }
}
void show();
void again3()
{
    again2(1); show();
}
void shuaxin2(int index)
{
    if (index > q - 1) { q++; }
    system("CLS");
}
void shuaxin3(int index)
{
    if (index > cc - 1) { cc++; }
    system("CLS");
}
void ydel(int index) {
    for (int i = index; i < o; i++) {
        for (int j = 0; j < 4; j++) {
            y[i].name[j] = y[i + 1].name[j];
        }
        for (int j = 0; j < 50; j++) {
            y[i].expression[j] = y[i + 1].expression[j];
        }
    }if (o) { o--; }
}
long double read(char* s, int m)
{
    if (nam_num(s) == 1) {
        int i = bsearch(s);
        if (i != -1) { return b[i].value[m]; }
        else {
            i = ysearch(s);
            if (i != -1) { return y[ysearch(s)].value[m]; }
            return co[csearch(s)].value;
        }
    }
    return dushu(s, 0);
}
int prio(char s)
{
    if (s == '+' || s == '-') { return 1; }
    else if (s == '*' || s == '/') { return 2; }
    else if (s == '^') { return 3; }
    else if (op(s) == 3) { return 4; }
    else { printf("error1%c", s); exit(0); }
    return 0;
}
long double cal_(double a, double c, char s)
{
    if (s == '+') { return a + c; }
    else if (s == '-') { return a - c; }
    else if (s == '*') { return a * c; }
    else if (s == '/') { if (c == 0) { return NAN; }return a / c; }
    else if (s == '^') { return powl(a, c); }
    else { printf("error2%c", s); exit(0); }
    return 0;
}
long double cal_1(double a, char s)
{
    if (s == '(') { return a; }
    else if (s == 'e') { return expl(a); }
    else if (s == 'l') { return logl(a); }
    long double tmp = 57.2957795130823;
    if (degree == 0) { tmp = 1; }
    if (s == 'S') { return asinl(a) * tmp; }
    else if (s == 'C') { return acosl(a) * tmp; }
    else if (s == 'T') { return atanl(a) * tmp; }
    while (degree && a >= 360) { a -= 360; }
    if (degree && a >= 90) {
        a = 90 - a;
        if (s == 'c') { return sinl(a / tmp); }
        else if (s == 's') { return cosl(a / tmp); }
        else if (s == 't') { return 1 / tanl(a / tmp); }
    }
    else if (s == 's') { return sinl(a / tmp); }
    else if (s == 'c') { return cosl(a / tmp); }
    else if (s == 't') { return tanl(a / tmp); }
    else { printf("error3%c", s); exit(0); }
    return 0;
}
long double cal0(char* x, int len)
{
    char a[25]; long double c[20][15]; int u = -1, v = -1; int i, j; int mark = 0;
    for (i = 0; x[i] != '\0'; i = j + 1) {
        for (j = i; x[j] != '\0'; j++) {
            while (x[j] == '(') { if (j && op(x[i]) == 2) { mark = 1; }u++; a[u] = x[i]; j++; i = j; }
            if (op(x[j]) == 1) { u++; a[u] = x[j]; break; }
            else if (x[j] == ')') { u++; a[u] = ')'; break; }
        }
        char tmp[18]; int l = 0, k = i;
        for (; k < j; k++, l++) {
            tmp[l] = x[k];
        }tmp[l] = '\0'; v++;
        if (mark == 1) { for (int m = 0; m < len; m++) { c[v][m] = read(tmp, m); } }
        else { c[v][0] = dushu(tmp, 0); }
        while (v > 0 && u > 0 && a[u] != ')' && a[u - 1] != '(' && op(a[u - 1]) < 2 && prio(a[u]) <= prio(a[u - 1]))
        {
            if (mark == 1) { for (int m = 0; m < len; m++) { c[v - 1][m] = cal_(c[v - 1][m], c[v][m], a[u - 1]); } }
            else { c[v - 1][0] = cal_(c[v - 1][0], c[v][0], a[u - 1]); }
            a[u - 1] = a[u];
            v--; u--;
        }
        if (x[j] == ')') {
            u--;
            while (x[j] == ')') {
                while (op(a[u]) == 1)
                {
                    if (mark == 1) {
                        for (int m = 0; m < len; m++) { c[v - 1][m] = cal_(c[v - 1][m], c[v][m], a[u]); }
                    }
                    else { c[v - 1][0] = cal_(c[v - 1][0], c[v][0], a[u]); }
                    v--; u--;
                }
                if (mark == 1) {
                    if (a[u] == 'p' || a[u] == 'w') {
                        long double tp = c[v][0];
                        for (int m = 1; m < len; m++) { c[v][0] += c[v][m]; }c[v][0] /= len; mark++;
                        if (a[u] == 'w') {
                            tp = c[v][0] - tp; tp = tp > 0 ? tp : -tp; double g;
                            for (int m = 1; m < len; m++) {
                                if ((g = c[v][m] - c[v][0]) > 0) { tp += g; }
                                else { tp -= g; }
                            }c[v][0] = tp / len;
                        }
                    }
                    else if (a[u] == 'z') {
                        int n = len / 2; double t = 0;
                        for (int m = 0; m < n; m++) { t += c[v][m + n] - c[v][m]; }c[v][0] = t / (n * n); mark++;
                    }
                    else if (a[u] == 'd') {
                        for (int m = 1; m < len; m++) { if (c[v][m] > c[v][0]) { c[v][0] = c[v][m]; } }mark++;
                    }
                    else if (a[u] == 'x') {
                        for (int m = 1; m < len; m++) { if (c[v][m] < c[v][0]) { c[v][0] = c[v][m]; } }mark++;
                    }
                    else if (a[u] == 'h') {
                        for (int m = 1; m < len; m++) { c[v][0] += c[v][m]; }mark++;
                    }
                    else {
                        for (int m = 0; m < len; m++) { c[v][m] = cal_1(c[v][m], a[u]); }
                    }
                }
                else { c[v][0] = cal_1(c[v][0], a[u]); }
                u--; j++;
            }
            if (x[j] != '\0') { u++; a[u] = x[j]; }
            while (v > 0 && u > 0 && a[u] != ')' && a[u - 1] != '(' && op(a[u - 1]) < 2 && prio(a[u]) <= prio(a[u - 1]))
            {
                if (mark == 1) { for (int m = 0; m < len; m++) { c[v - 1][m] = cal_(c[v - 1][m], c[v][m], a[u - 1]); } }
                else { c[v - 1][0] = cal_(c[v - 1][0], c[v][0], a[u - 1]); }
                a[u - 1] = a[u];
                v--; u--;
            }
        }
    }
    while (u > -1) {
        c[v - 1][0] = cal_(c[v - 1][0], c[v][0], a[u]);
        v--; u--;
    }
    return c[0][0];
}


void cal(int* rank, int* len)
{
    for (int i = 0; i < cc; i++) {
        co[i].value = cal0(co[i].expression, len[i]);
    }
    if (cas == 0) {
        char a[25]; long double c[20][15]; int u, v;
        int i, j;
        for (int p = 0; p < o; p++) {
            char* x = y[rank[p]].expression; u = v = -1;
            for (i = 0; x[i] != '\0'; i = j + 1)
            {
                for (j = i; x[j] != '\0'; j++) {
                    while (x[j] == '(') { u++; a[u] = x[i]; j++; i = j; }
                    if (op(x[j]) == 1) { u++; a[u] = x[j]; break; }
                    else if (x[j] == ')') { u++; a[u] = ')'; break; }
                }
                char tmp[18]; int l = 0, k = i;
                for (; k < j; k++, l++) {
                    tmp[l] = x[k];
                }tmp[l] = '\0'; v++;
                for (int m = 0; m < z; m++) { c[v][m] = read(tmp, m); }
                while (v > 0 && u > 0 && a[u] != ')' && a[u - 1] != '(' && op(a[u - 1]) < 2 && prio(a[u]) <= prio(a[u - 1]))
                {
                    for (int m = 0; m < z; m++) { c[v - 1][m] = cal_(c[v - 1][m], c[v][m], a[u - 1]); }
                    a[u - 1] = a[u];
                    v--; u--;
                }
                if (x[j] == ')') {
                    u--;
                    while (x[j] == ')') {
                        while (op(a[u]) == 1) {
                            for (int m = 0; m < z; m++) { c[v - 1][m] = cal_(c[v - 1][m], c[v][m], a[u]); }
                            v--; u--;
                        }
                        for (int m = 0; m < z; m++) { c[v][m] = cal_1(c[v][m], a[u]); }
                        u--; j++;
                    }
                    if (x[j] != '\0') { u++; a[u] = x[j]; }
                    while (v > 0 && u > 0 && a[u] != ')' && a[u - 1] != '(' && op(a[u - 1]) < 2 && prio(a[u]) <= prio(a[u - 1]))
                    {
                        for (int m = 0; m < z; m++) { c[v - 1][m] = cal_(c[v - 1][m], c[v][m], a[u - 1]); }
                        a[u - 1] = a[u];
                        v--; u--;
                    }
                }
            }
            while (u > -1) {
                for (int m = 0; m < z; m++) { c[v - 1][m] = cal_(c[v - 1][m], c[v][m], a[u]); }
                v--; u--;
            }
            for (int m = 0; m < z; m++) { y[rank[p]].value[m] = c[0][m]; }
        }
    }
}
void show()
{
    printf("---------\n");
    for (int i = 0; i < cc; i++) {
        printf("#%-4s = %.10Lg\n", co[i].name, co[i].value);
    }
    if (o) {
        for (int i = 0; i < z; i++) {
            printf("第%d组:\n", i + 1);
            for (int j = 0; j < o; j++) {
                printf(" %-4s = %.10Lg\n", y[j].name, y[j].value[i]);
            }
        }
    }printf("---------\n");
}
void cast(ybl* ry, int* ll)
{
    cas = 1; int i, j; ll[23] = o; ll[24] = q;
    for (i = 0; i < o; i++) {
        for (j = 0; j < 4; j++) { b[i + q].name[j] = ry[i].name[j] = y[i].name[j]; }
        for (j = 0; j < 50; j++) { ry[i].expression[j] = y[i].expression[j]; }
        for (j = 0; j < z; j++) { b[i + q].value[j] = ry[i].value[j] = y[i].value[j]; }
        b[i + q].length = z;
    }
    for (i = 0; i < q; i++) { ll[i] = b[i].length; if (b[i].length == 0) { b[i].length = z; } }
    q += o; o = 0;
    system("CLS"); again1(0);
}
void cast_end(ybl* ry, int* ll) {
    cas = 0; int i, j; o = ll[23]; q = ll[24];
    for (i = 0; i < q; i++) {
        b[i].length = ll[i];
    }
    for (i = 0; i < o; i++) {
        for (j = 0; j < 4; j++) { y[i].name[j] = ry[i].name[j]; }
        for (j = 0; j < 50; j++) { y[i].expression[j] = ry[i].expression[j]; }
        for (j = 0; j < z; j++) { y[i].value[j] = ry[i].value[j]; }
    }
    for (i = 0; i < cc; i++) {
        if (co[i].cmark == 1) {
            cdel(i); i--;
        }
    }
    system("CLS"); again2(1); show();
}
int getlen(char* s, long double a[]) {
    int i = ysearch(s);
    if (i != -1) {
        for (int j = 0; j < z; j++) {
            a[j] = y[i].value[j];
        }return z;
    }
    i = bsearch(s);
    if (i != -1) {
        for (int j = 0; j < 15; j++) {
            a[j] = b[i].value[j];
        }i = b[i].length;
        if (i) { return i; }
        else { return z; }
    }
    return -1;
}
void xy(long  double r1[], long  double r2[], int r, char p1[], char p2[])
{
    if (r < 2) { printf("点个数不足"); return; }
    long double a1 = 0, a2 = 0, A = 0, B = 0; int i;
    for (i = 0; i < r; i++) {
        a1 += r1[i]; a2 += r2[i];
    }a1 /= r; a2 /= r;
    for (i = 0; i < r; i++) {
        r1[i] -= a1; r2[i] -= a2;
    }
    for (i = 0; i < r; i++) {
        A += r1[i] * r2[i];
        B += r1[i] * r1[i];
    }A = A / B;
    printf("%s=%.4f%s", p2, (float)(A), p1);
    A = a2 - A * a1; if (A >= 0) { printf("+"); }
    printf("%.4f\n", (float)(A));
}
void cal2(int n, long double start, long double d)
{
    long double* t = (long double*)(malloc((n + 1) * sizeof(long double)));
    char a[24];  int u, v; long double c[20];
    int j; char* x = co[0].expression; long double value;
    int p;
    for (p = 0; p < n + 1; p++) {
        u = v = -1; value = start+p*d;
        for (int i = 1; x[i] != '\0'; i = j + 1)
        {
            for (j = i; x[j] != '\0'; j++) {
                while (x[j] == '(') { u++; a[u] = x[i]; j++; i = j; }
                if (op(x[j]) == 1) { u++; a[u] = x[j]; break; }
                else if (x[j] == ')') { u++; a[u] = ')'; break; }
            }
            char tmp[18]; int l = 0, k = i;
            for (; k < j; k++, l++) {
                tmp[l] = x[k];
            }tmp[l] = '\0'; v++;
            if (strcmp(tmp, "x") == 0) { c[v] = value; }
            else { c[v] = dushu(tmp, 0); }
            while (v > 0 && u > 0 && a[u] != ')' && a[u - 1] != '(' && op(a[u - 1]) < 2 && prio(a[u]) <= prio(a[u - 1]))
            {
                c[v - 1] = cal_(c[v - 1], c[v], a[u - 1]);
                a[u - 1] = a[u];
                v--; u--;
            }
            if (x[j] == ')') {
                u--;
                while (x[j] == ')') {
                    while (op(a[u]) == 1) {
                        c[v - 1] = cal_(c[v - 1], c[v], a[u]);
                        v--; u--;
                    }
                    c[v] = cal_1(c[v], a[u]);
                    u--; j++;
                }
                if (x[j] != '\0') { u++; a[u] = x[j]; }
                while (v > 0 && u > 0 && a[u] != ')' && a[u - 1] != '(' && op(a[u - 1]) < 2 && prio(a[u]) <= prio(a[u - 1]))
                {
                    c[v - 1] = cal_(c[v - 1], c[v], a[u - 1]);
                    a[u - 1] = a[u];
                    v--; u--;
                }
            }
        }
        while (u > -1) {
            c[v - 1] = cal_(c[v - 1], c[v], a[u]);
            v--; u--;
        }
        t[p] = c[0];
        if (isnan(t[p])) {
            printf("\n\nstop when first nan appear@%.7Lg\n\n结束\n", start + p * d); free(t); return;
        }
    }
    value = t[0];
    if (x[0] == 'j') {
        co[1].value = 0;
        for (p = 0; p < n + 1; p++) {
            if (isinf(t[p])) { printf("stop when first inf appear@%.7Lg\n", start + p * d); free(t); return; }
            if (t[p] >= value) { co[1].value += t[p] - value; }
            else { co[1].value += value - t[p]; }
            value = t[p];
        }
        value = t[0]; for (p = 1; p < n + 1; p++) { value += t[p]; }
        value -= (t[0] + t[n]) / 2;
        value *= d; if (d > 0.00001) { printf("警告:间距大于e-5精度缺失\n"); }
        co[1].value = co[1].value * d * 0.5;
        printf("\n最大误差: %.7Lg\n", co[1].value);
        printf("\n估计结果: %.7Lg\n", value);
        printf("\n真实值介于%.7Lg与%.7Lg之间\n", value - co[1].value, value + co[1].value);
    }
    else if (x[0] == 'h') {
        for (p = 1; p < n + 1; p++) { value += t[p]; }printf("\n%.7Lg\n", value);
    }
    else {
        c[0] = 'e'; u = 0;
        printf("\n趋势:\n");
        for (p = 0; p < n + 1; p++) {
            if (u > 10) { printf("\n存在震荡区间或为常数\n"); break; }
            else if (isinf(t[p])) { c[0] = 'e'; while (p < n + 1 && isinf(t[p])) { p++; } }
            else if (t[p] > value && c[0] != 'u') { u++; c[0] = 'u'; }
            else if (t[p] < value && c[0] != 'd') { u++; c[0] = 'd'; }
            value = t[p];
        }
        if (u != 11) {
            c[0] = 'e'; j = 0;
            //为'e'则必打印
            u = 0; value = t[0];
            for (p = 0; p < n + 1; p++) {
                if (isinf(t[p]) && t[p] > 0) {
                    printf("@%.8Lf->", start + p * d); while (p < n + 1 && isinf(t[p]) && t[p] > 0) { p++; }
                    printf("%.8Lf,+inf\n", start + (p - 1) * d); c[0] = 'e'; j = p + 1;
                }
                else if (isinf(t[p]) && t[p] < 0) {
                    printf("@%.8Lf->", start + p * d); while (p < n + 1 && isinf(t[p]) && t[p] < 0) { p++; }
                    printf("%%.8Lf,-inf\n", start + (p - 1) * d); c[0] = 'e'; j = p + 1;
                }
                else if (t[p] > value && c[0] != 'u') { printf("@%.8Lf,%.7Lg\n", start + (p - 1) * d, value); c[0] = 'u'; j = p + 1; }
                else if (t[p] < value && c[0] != 'd') { printf("@%.8Lf,%.7Lg\n", start + (p - 1) * d, value); c[0] = 'd'; j = p + 1; }
                value = t[p];
            }
            if (j != n + 1) { printf("@%.8Lf,%.7Lg\n", start + n * d, t[n]); }
        }
        printf("\n零点(+-型跳跃间断点):\n");
        u = 0;
        for (p = 0; p < n + 1; p++) {
            if (u == 15) { printf("熔断\n"); break; }
            if (t[p] == 0) {
                printf("@%.8Lf", start + p * d);
                if (p < n && t[p + 1] == 0) {
                    for (j = p + 2; j < n + 1 && t[j] == 0; j++);
                    printf("->%.8Lf", start + (j - 1) * d);
                    p = j - 1;
                }
                printf("\n"); u++;
            }
            else if (p > 0 && ((t[p - 1] < 0 && t[p] > 0) || (t[p - 1] > 0 && t[p] < 0)))
            {
                printf("@%.8Lf <= X <= %.8Lf\n", start + (p - 1) * d, start + p * d); u++;
            }
        }
        printf("\n最大值: ");
        value = t[0];
        for (p = 1; p < n + 1; p++) { if (value < t[p]) { value = t[p]; } }
        printf("%.7Lg\n", value);
        if (isinf(value) == false) {
            for (p = 0; p < n + 1; p++) {
                if (value == t[p]) {
                    printf("@%.8Lf", start + p * d);
                    if (p < n && value == t[p + 1]) {
                        for (j = p + 2; j < n + 1 && t[j] == value; j++);
                        printf("->%.8Lf", start + (j - 1) * d);
                        p = j - 1;
                    }
                    printf("\n");
                }
            }
        }
        else { for (p = 0; p < n + 1; p++) { if (t[p] == value) { printf("stop when first inf appear@%.8Lf\n", start + p * d); break; } } }
        printf("\n最小值: ");
        value = t[0];
        for (p = 1; p < n + 1; p++) { if (value > t[p]) { value = t[p]; } }
        printf("%.7Lg\n", value);
        if (isinf(value) == false) {
            for (p = 0; p < n + 1; p++) {
                if (value == t[p]) {
                    printf("@%.8Lf", start + p * d);
                    if (p < n && value == t[p + 1]) {
                        for (j = p + 2; j < n + 1 && t[j] == value; j++);
                        printf("->%.8Lf", start + (j - 1) * d);
                        p = j - 1;
                    }
                    printf("\n");
                }
            }
        }
        else { for (p = 0; p < n + 1; p++) { if (t[p] == value) { printf("stop when first inf appear@%.8Lf\n", start + p * d); break; } } }
    }
    free(t);
    printf("\n结束\n");
}
int main()
{
    printf("welcome\n");
    while (getchar() != '\n'); system("CLS");
    printf("指令:\na->advance\nc->cast\nd->delete,degree\ne->end\nl->long\nr->radian\ns->set\nxy->线性回归\n\n");
    printf("符号:\nd->最大值\nf->分析函数\nh->求和\nj->积分\np->平均值\nw->(平均值)误差\nx->最小值\nz->(逐差法)间距\n\n");
    printf("数据:\n(%%,变量)->#->(应变量)->(cast模式下的临时#)\n\n");
    while (getchar() != '\n'); system("CLS");
    int r; int len[25] = { 0 }; cas = 3; cc = 1;
    while (1) {
        again0();
        clear(co[0].expression);
        r = scanf("%[^\n]", co[0].expression); getchar();
        if (strcmp(co[0].expression, "a") == 0) { break; }
        else if (strcmp(co[0].expression, "l") == 0)
        {
        loopa:
            do {
                system("CLS");
                again0();
                printf("long\n---------\n");
                r = scanf("%[^\n]", co[0].expression); getchar();
            } while (r != 1);
            if (strcmp("e", co[0].expression) == 0) { system("CLS"); continue; }
            r = 0; cas = 0; b[1].value[2] = 0.00001;
            while (co[0].expression[r] != '\0' && cas != 3) {
                while (co[0].expression[r] == ' ' && co[0].expression[r] != '\0') { r++; }
                b[1].value[cas] = dushu(co[0].expression, r); cas++;
                while (co[0].expression[r] != ' ' && co[0].expression[r] != '\0') { r++; }
            }
            int tmp = (b[1].value[1] - b[1].value[0]) / b[1].value[2];
            b[1].value[3] = b[1].value[1] - b[1].value[0] - tmp * b[1].value[2];
            if (tmp % 10 == 9 && ((b[1].value[3] - b[1].value[2]) < 0.0000000000001) && ((b[1].value[3] - b[1].value[2]) > -0.0000000000001)) { tmp++; }
            if ((b[1].value[0] >= b[1].value[1]) || b[1].value[2] <= 0 || tmp <= 0) { printf("有误或超限!\n"); goto loopa; }
            b[0].name[0] = 'x'; b[0].name[1] = '\0'; q = 1; cas = 2;
        loopb:
            do {
                clear(co[0].expression);
                system("CLS");
                again0();
                printf("long\n---------\n|%-11Lg |%-11Lg 理想上限|%-11Lg 间距|%-11Lg \n", b[1].value[0], b[1].value[0] + tmp * b[1].value[2], b[1].value[1], b[1].value[2]);
                r = scanf("%[^\n]", co[0].expression); getchar();
            } while (r != 1);
            clean(co[0].expression, 0);
            for (r = strlen(co[0].expression); r < 50; r++) { co[0].expression[r] = '\0'; }
            if (strcmp("d", co[0].expression) == 0) { degree = 1; goto loopb; }
            else if (strcmp("r", co[0].expression) == 0) { degree = 0; goto loopb; }
            else if (strcmp("e", co[0].expression) == 0) { system("CLS"); continue; }
            else if (b_co_check(co[1].expression, len) != 0 || co[0].expression[49] != '\0') { printf("算式错误或无效数字!\n"); goto loopb; }
            system("CLS");
            again0();
            printf("long\n---------\n|%-11Lg |%-11Lg 理想上限|%-11Lg 间距|%-11Lg \n", b[1].value[0], b[1].value[0] + tmp * b[1].value[2], b[1].value[1], b[1].value[2]);
            printf("%s\n", co[0].expression);
            cal2(tmp, b[1].value[0], b[1].value[2]);
            q = 0; cas = 3;
            while (getchar() != '\n');
        }
        else if (strcmp("d", co[0].expression) == 0) { degree = 1; system("CLS"); continue; }
        else if (strcmp("r", co[0].expression) == 0) { degree = 0;  system("CLS"); continue; }
        clean(co[0].expression, 0);
        for (r = strlen(co[0].expression); r < 50; r++) { co[0].expression[r] = '\0'; }
        //必须使\0后面一个也是\0,因为)需要
        if (b_co_check(co[1].expression, len) != 0 || co[0].expression[49] != '\0') { printf("算式错误或无效数字!\n"); system("CLS"); continue; }
        //保证式子长度小于50
        else { system("CLS"); again0(); printf("%s\n", co[0].expression); printf("%.10Lg\n", cal0(co[0].expression, 0)); }
        while (getchar() != '\n'); system("CLS");
    }
    system("CLS"); cas = 0; cc = 0; clear(co[0].expression);
    again0();
    printf("---------\n因变量:\n");
    char s[60]; char tmp[20]; int i = 0; ybl ry[8]; int ll[25]; bool back = 0;
    //ll的长度决定了是否成功cast_end中的o,p
loop1:
    while (1) {
        int r = scanf("%[^\n]", s); getchar();
        if (r != 1) { system("CLS"); again1(back); break; }
        if (strcmp("d", s) == 0) { degree = 1; system("CLS"); again1(back); continue; }
        else if (strcmp("r", s) == 0) { degree = 0; system("CLS"); again1(back); continue; }
        else if (s[0] == 'd' && s[1] == ' ') {
            i = 2; int  j;
            while (s[i] == ' ') { i++; }
            for (j = 0; j < 5; j++, i++) {
                tmp[j] = s[i];
            }tmp[j] = '\0';
            i = csearch(tmp);
            if (i != -1) { if (co[i].cmark == 0 && cas == 1) { printf("无法删除!\n"); } else { cdel(i); } }
            else if (cas == 1) { printf("无法删除!\n"); }
            else {
                i = ysearch(tmp);
                if (i != -1) { ydel(i); }
                else {
                    i = bsearch(tmp);
                    if (i != -1) { bdel(i); }
                }
            }
            system("CLS"); again1(back);
            continue;
        }
        clean(s, 1);
        if (cas == 0 && s[0] == '%') { shuaxin2(duru2(s, 1)); again1(back); continue; }
        clean(s, 0);
        if (s[0] == '#') { shuaxin3(duru3(s)); again1(back); continue; }
        else if (cas == 1 && strcmp("e", s) == 0) { cas = 2; goto loop3; }
        if (cas == 0) { shuaxin1(duru1(s)); }
        else { system("CLS"); }
        again1(back);
    }
    if (cas == 0) {
        if (back) { system("CLS"); again2(1); }
        else { printf("---------\n变量:\n"); }
    }
    while (cas == 0) {
    loop2:
        int r = scanf("%[^\n]", s); getchar(); if (r != 1) { system("CLS"); again2(1); break; }
        if (strcmp("b", s) == 0) { system("CLS"); back = 1; again1(1); goto loop1; }
        else if (strcmp("d", s) == 0) { degree = 1;  system("CLS"); again2(1); continue; }
        else if (strcmp("r", s) == 0) { degree = 0;  system("CLS"); again2(1); continue; }
        else if (s[0] == 's' && s[1] == ' ') {
            i = 2;
            while (s[i] == ' ') { i++; }
            z = dushu(s, i);
            if (z < 1) { z = 1; }
            else if (z > 15) { z = 15; }
            system("CLS"); again2(1); continue;
        }
        else if (s[0] == 'd' && s[1] == ' ') {
            if (q == 0 && o == 0 && cc == 0) { system("CLS"); again2(1); continue; }
            i = 2; int j;
            while (s[i] == ' ') { i++; }
            for (j = 0; j < 5; j++, i++) {
                tmp[j] = s[i];
            }tmp[j] = '\0';
            i = bsearch(tmp);
            if (i != -1) { bdel(i); }
            else {
                i = ysearch(tmp);
                if (i != -1) { ydel(i); }
                else {
                    i = csearch(tmp);
                    if (i != -1) { cdel(i); }
                }
            }
            system("CLS"); again2(1);
            continue;
        }
        clean(s, 1);
        if (s[0] == '#') { clean(s, 0); shuaxin3(duru3(s)); again2(1); continue; }
        else if (s[0] == '%') { shuaxin2(duru2(s, 1)); again2(1); continue; }
        shuaxin2(duru2(s, 2));
        again2(1);
    }
    int rank[8];
    if (cas == 0) {
        for (i = 0; i < 8; i++) {
            rank[i] = i;
        }
        if (cant(rank)) {
            system("CLS");
            if (cas == 1) { again1(0); goto loop1; }
            else { again2(1); goto loop2; }
        }
    }
    for (i = 0; i < 15; i++) { len[i] = 0; }
    i = b_co_check(tmp, len);
    if (i > 0) {
        if (i == 1) { printf("#%s 表达式错误!\n", tmp); }
        else if (i == 2) { printf("#%s 位数不齐!\n", tmp); }
        else if (i == 3) { printf("#%s 仅允许一个z,p,d,x,h运算!\n", tmp); }
        system("CLS"); if (cas == 1) { again1(0); goto loop1; }
        else { again2(1); goto loop2; }
    }
    cal(rank, len);
    show();
loop3:if (cas == 2) { cast_end(ry, ll); }
    while (1) {
        int r = scanf("%[^\n]", s); getchar(); if (r != 1) { system("CLS"); if (cas == 1) { again1(0); show(); } else { again3(); }goto loop3; }
        if (strcmp("b", s) == 0) { system("CLS"); if (cas == 1) { back = 0; again1(0); goto loop1; } else { again2(1); goto loop2; } }
        else if (cas == 1 && strcmp("e", s) == 0) { cas = 2; goto loop3; }
        else if (s[0] == 'x' && s[1] == 'y' && s[2] == ' ') {
            i = 3; int j = 0; long  double r1[15], r2[15]; char a1[5], a2[5];
            while (s[i] == ' ' && s[i] != '\0') { i++; }
            for (j = 0; s[i] != '\0' && s[i] != ' '; j++, i++) {
                a1[j] = s[i];
            }a1[j] = '\0';
            r = getlen(a1, r1); if (r < 2 || j>4) { printf("无效!\n"); system("CLS"); if (cas == 1) { again1(0); show(); } else { again3(); }goto loop3; }
            while (s[i] == ' ' && s[i] != '\0') { i++; }
            for (j = 0; s[i] != '\0' && s[i] != ' '; j++, i++) {
                a2[j] = s[i];
            }a2[j] = '\0';
            if (j > 4 || r != getlen(a2, r2)) { printf("无效!\n"); system("CLS"); if (cas == 1) { again1(0); show(); } else { again3(); }goto loop3; }
            system("CLS");
            for (j = 0; j < 15; j++) {
                len[j] = 0;
            }
            printf("xy %s %s\n---------\n", a1, a2);
            for (j = 0; j < r; j++) {
                printf("点%d(%g,%g)\n", j + 1, (double)(r1[j]), (double)(r2[j]));
            }printf("\n");
            j = scanf("%[^\n]", tmp);
            if (j != 1) { getchar(); xy(r1, r2, r, a1, a2); }
            else {
                i = 0; int mark = 0;
                while (i < 20 && tmp[i] != '\0') {
                    while (tmp[i] == ' ' && tmp[i] != '\0') { i++; }
                    j = dushu(tmp, i); j--; if (j < 15) { len[j] = 1; mark = 1; }
                    while (tmp[i] != ' ' && tmp[i] != '\0') { i++; }
                }
                if (mark) { printf("去除点:"); }mark = 0;
                for (j = 0; j < r; j++) {
                    if (len[j]) {
                        printf("%d ", j + 1);
                        for (i = j - mark; i < r - 1 - mark; i++) {
                            r1[i] = r1[i + 1]; r2[i] = r2[i + 1];
                        }
                        mark++;
                    }
                }printf("\n");
                xy(r1, r2, r - mark, a1, a2);
                while (getchar() != '\n');
                goto loop3;
            }
        }
        else if (strcmp(s, "c") == 0 && cas == 0) {
            cast(ry, ll); back = 0;
            goto loop1;
        }
        else { system("CLS"); if (cas == 1) { again1(0); show(); } else { again3(); }goto loop3; }
    }
}

这是一个用C语言编写的简单计算器程序,它可以接受用户输入的两个数字和一个运算符,并根据运算符进行相应的运算,然后输出结果。这个程序使用了switch语句来判断运算符,并根据不同的运算符执行不同的操作。用户可以输入加、减、乘、除四种运算符进行混合运算。这个程序可以帮助初学者更好地理解C语言的基本语法和逻辑运算。 代码解析: 首先引入了头文件,这是C语言标准输入输出库,包含了一些常用的输入输出函数,例如printf和scanf。然后定义了三个变量,分别是运算符和两个数字。接着使用printf函数提示用户输入运算符和两个数字,并使用scanf函数读取用户输入的值。最后使用switch语句判断运算符,并根据不同的运算符执行不同的操作,最终输出结果。 代码如下: ``` #include <stdio.h> int main() { char operator; double firstNumber,secondNumber; printf("输入操作符 (+, -, *,/): "); scanf("%c", &operator); printf("输入两个数字: "); scanf("%lf %lf",&firstNumber, &secondNumber); switch(operator) { case '+': printf("%.1lf + %.1lf = %.1lf",firstNumber, secondNumber, firstNumber + secondNumber); break; case '-': printf("%.1lf - %.1lf = %.1lf",firstNumber, secondNumber, firstNumber - secondNumber); break; case '*': printf("%.1lf * %.1lf = %.1lf",firstNumber, secondNumber, firstNumber * secondNumber); break; case '/': printf("%.1lf / %.1lf = %.1lf",firstNumber, secondNumber, firstNumber / secondNumber); break; // operator doesn't match any case constant (+, -, *, /) default: printf("Error! operator is not correct"); } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值