#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; }
}
}