calc

//
// Created by liberty on 2018/6/7.
//

#include 
#include 
#include 
#include 
#include 

int is_prime(int n);         /* 判断素数*/

void sum(int n);             /*统计计算*/

void fact(int n);            /*阶乘*/

int arithmetic1();

double cal(char *str);

int trans();


void B_D(int a) {
    int i, s = 0;
    int result = 0;
    for (i = 1; a != 0; i *= 2) {
        if (a % 10 > 1) {
            s = 1;
            break;
        } else {
            result += (a % 10) * i;
            a = a / 10;
        }
    }
    if (s == 1) {
        printf("你的输入有误,请重新输入\n");
    } else {
        printf("\n转换后的数为: %d\n", result);
    }
}

void B_X(int a) {
    int i, j, k, s = 0;
    char p[30];
    int result = 0;
    for (i = 1; a != 0; i *= 2) {
        if (a % 10 > 1) {
            s = 1;
            break;
        } else {
            result += (a % 10) * i;
            a = a / 10;
        }
    }
    for (j = 0; result != 0; j++) {
        p[j] = result % 16;
        result = result / 16;
        if (p[j] > 10) {
            switch (p[j]) {
                case 10:
                    p[j] = 'A';
                    break;
                case 11:
                    p[j] = 'B';
                    break;
                case 12:
                    p[j] = 'C';
                    break;
                case 13:
                    p[j] = 'D';
                    break;
                case 14:
                    p[j] = 'E';
                    break;
                case 15:
                    p[j] = 'F';
                    break;
            }
        } else {
            p[j] += 48;
        }
    }
    if (s == 1) {
        printf("你的输入有误,请重新输入\n");
    } else {
        printf("\n转换后的数为:");
        for (k = j - 1; k >= 0; k--) {
            printf("%c", p[k]);
        }
        printf("\n");
    }
}

void X_D(char a[], int k) {
    int i, j, s = 0;
    int result = 0;
    int b[50];
    for (i = 0; i < k; i++) {
        if (a[i] <= '9' && a[i] >= '1') {
            b[i] = a[i] - 48;

        } else {
            switch (toupper(a[i])) {
                case 'A':
                    b[i] = 10;
                    break;
                case 'B':
                    b[i] = 11;
                    break;
                case 'C':
                    b[i] = 12;
                    break;
                case 'D':
                    b[i] = 13;
                    break;
                case 'E':
                    b[i] = 14;
                    break;
                case 'F':
                    b[i] = 15;
                    break;
                default:
                    s = 1;
            }
        }
    }
    for (i = 1, j = k - 1; j >= 0; j--, i *= 16) {
        result += b[j] * i;
    }
    if (s == 1) {
        printf("你的输入有误,请重新输入\n");
    } else {
        printf("\n转换后的数为:%d", result);
    }
}


void X_B(char a[], int k) {
    int i, j, s = 0;
    int result = 0;
    int b[50];
    int p[30];
    for (i = 0; i < k; i++) {
        if (a[i] <= '9' && a[i] >= '1') {
            b[i] = a[i] - 48;
        } else {
            switch (toupper(a[i])) {
                case 'A':
                    b[i] = 10;
                    break;
                case 'B':
                    b[i] = 11;
                    break;
                case 'C':
                    b[i] = 12;
                    break;
                case 'D':
                    b[i] = 13;
                    break;
                case 'E':
                    b[i] = 14;
                    break;
                case 'F':
                    b[i] = 15;
                    break;
                default:
                    s = 1;
            }
        }
    }
    for (j = k - 1, i = 1; j >= 0; j--, i * 16) {
        result += b[j] * i;
    }
    for (j = 0; result != 0; j++) {
        p[j] = result % 2;
        result = result / 2;
    }
    if (s == 1) {
        printf("你的输入有误,请重新输入\n");
    } else {
        printf("\n转换后的数为:");
        for (k = j - 1; k >= 0; k--) {
            printf("%d", p[k]);
        }
        printf("\n");
    }
}

void D_B(int a) {
    int j, k;
    int p[30];
    for (j = 0; a != 0; j++) {
        p[j] = a % 2;
        a = a / 2;
    }
    printf("\n转换后的数为:");
    for (k = j - 1; k >= 0; k--) {
        printf("%d", p[k]);
    }
    printf("\n");
}

void D_X(int a) {
    int j, k;
    int p[30];
    for (j = 0; a != 0; j++) {
        p[j] = a % 16;
        a = a / 16;
        if (p[j] < 10) {
            p[j] += 48;
        } else {
            switch (p[j]) {
                case 10:
                    p[j] = 'A';
                    break;
                case 11:
                    p[j] = 'B';
                    break;
                case 12:
                    p[j] = 'C';
                    break;
                case 13:
                    p[j] = 'D';
                    break;
                case 14:
                    p[j] = 'E';
                    break;
                case 15:
                    p[j] = 'F';
                    break;
            }
        }
    }
    printf("\n转换后的数为:");
    for (k = j - 1; k >= 0; k--) {
        printf("%c", p[k]);
    }
    printf("\n");
}

int main() {
    int x = 1, y = 1, z = 1, w = 1, j = 1, k = 1;
    while (1) {
        printf("+=========================================+\n");
        printf("|           欢迎使用科学计算器.             |");
        printf("+=========================================+\n");
        printf("**********按 数 字 选 择 功 能***************");
        printf("   1  2   3   4    5          ");
        scanf("%d", &x);
        if (x == 0) {
            printf("thanks to use , goodbye");
            break;
        }
        y = 1;
        while (x == 1 && y) {
            y = arithmetic1();
        }
        while (x == 2 && y != 0) {
            y = trans();
        }
        while (x == 3 && y != 0) {
            printf("输入需要处理的数的个数n(n=0)返回上一级:");
            scanf("%d", &y);
            if (y == 0) {
                break;
            }
            sum(y);
        }
        while (x == 4 && y != 0) {
            printf("请输入n!中的n(n=0)返回上一级:");
            scanf("%d", &y);
            if (y == 0) {
                break;
            }
            fact(y);
        }
        while (x == 5 && y != 0) {
            printf("输入需要判断的整数n(n=0)返回上一级:");
            scanf("%d", &y);
            if (is_prime(y)) {
                printf("%d 是一个素数\n", y);
            } else {
                printf("%d 是一个素数\n", y);
            }
        }
    }
    return 0;
}

double cal(char *str) {
    double ans = 0, value = 0, tp = 0;
    int i, flag = 2, fg;
    for (i = 0; str[i] != '=' && str[i] != '\0'; i++) {
        while (str[i] != '+' && str[i] != '-' && str[i] != '*' && str[i] != '/') {
            if (str[i] == '=') {
                break;
            }
            if (str[i] == ' ') {
                i++;
                continue;
            }
            value = value * 10 + str[i] - '0';
            i++;
        }
        if (str[i] == '=') {
            if (flag == 2) {
                ans += value;
            } else if (flag == 3) {
                ans -= value;
            }
            break;
        }
        if (str[i] == '+' || str[i] == '-') {
            switch (flag) {
                case 2:
                    ans += value;
                    value = 0;
                    flag = str[i] == '+' ? 2 : 3;
                    break;
                case 3:
                    ans -= value;
                    value = 0;
                    flag = str[i] == '+' ? 2 : 3;
                    break;
                default:
                    break;
            }

        } else if (str[i] == '*' || str[i] == '/') {
            tp = 0;
            if (str[i] == '*') {
                fg = 4;
            } else {
                fg = 5;
            }
            i++;
            while (str[i] != '+' && str[i] != '-' && str[i] != '=') {
                while (str[i] != '=' && str[i] != '+' && str[i] != '-' && str[i] != '*' && str[i] != '/') {
                    if (str[i] == ' ') {
                        i++;
                        continue;
                    }
                    tp = tp * 10 + str[i] - '0';
                    i++;
                }
                switch (fg) {
                    case 4:
                        value *= tp;
                        tp = 0;
                        break;
                    case 5:
                        value = value / (1.0 * tp);
                        tp = 0;
                        break;
                }
                switch (str[i]) {
                    case '=':
                        fg = 1;
                        break;
                    case '+':
                        fg = 2;
                        break;
                    case '-':
                        fg = 3;
                        break;
                    case '*':
                        fg = 4;
                        break;
                    case '/':
                        fg = 5;
                        break;
                }
                if (fg <= 3)
                    break;
                i++;
            }
            switch (flag) {
                case 2:
                    ans += value;
                    value = 0;
                    flag = (fg == 2 ? 2 : 3);
                    break;
                case 3:
                    ans -= value;
                    value = 0;
                    flag = (fg == 2 ? 2 : 3);
                    break;
            }
            if (fg == 1) {
                break;
            }
        }
    }
    return ans;
}

int arithmetic1() {
    char str[300];
    printf("\t证书四则运算 不限括号\n");
    printf("输入表达式:  ");
    getchar();
    gets(str);
    if (strlen(str) == 0) {
        return 0;
    }
    printf("%.11f\n", cal(str));
    return 1;
}


void fact(int n) {
    int i, j, r, t;
    int dig[30001];
    memset(dig, 0, sizeof(dig));
    dig[0] = 1;
    for (i = 2; i <= n; i++) {
        r = 0;
        for (j = 0; j < 30001; j++) {
            t = i * dig[j] + r;
            dig[j] = t % 10;
            r = t / 10;
        }
    }
    j = 30000;
    while (dig[j] == 0) {
        j--;
    }
    printf("%d!=", n);
    for (; j >= 0; j--) {
        printf("%d", dig[j]);
    }
    printf("\n");
    return;
}

int is_prime(int n) {
    int i, tmp;
    if (n == 1) {
        return 0;
    }
    tmp = (int) sqrt(n);
    for (i = 2; i <= tmp; i++) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}

void sum(int n) {
    double total = 0;
    int i, x;
    printf("输入%d个数:", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &x);
        total += x;
    }
    printf("n 个数的和=%.31f\n", total);
    printf("n 个数的平均值=%.31f\n", total / n);
}

int trans() {
    char r[40];
    int y, j, k;
    printf("\t按数字选择被转换的数\n");
    printf("  1 2 3  0");
    scanf("%d", &y);
    if (y == 0) {
        return 0;
    }
    switch (y) {
        case 1:
            printf("\n选择转换后的进制:\n0:退出\n1:BIN\n2:digit\n3:HEX\n");
            scanf("%d", &j);
            if (j == 0) {
                return 0;
            }
            switch (j) {
                case 1:
                    printf("\n 同进制不用转换\n");
                    break;
                case 2:
                    printf("\n 输入要转化的数: ");
                    scanf("%d", &k);
                    B_D(k);
                    break;
                case 3:
                    printf("\n 输入要转化的数: ");
                    scanf("%d", &k);
                    B_X(k);
                    break;
                default:
                    break;
            }
            break;
        case 2:
            printf("\n选择转换后的进制:\n0:退出\n1:BIN\n2:digit\n3:HEX\n");
            scanf("%d", &j);
            switch (j) {
                case 2:
                    printf("\n 同进制不用转换\n");
                    break;
                case 1:
                    printf("\n 输入要转化的数: ");
                    scanf("%d", &k);
                    D_B(k);
                    break;
                case 3:
                    printf("\n 输入要转化的数: ");
                    scanf("%d", &k);
                    D_X(k);
                    break;
                default:
                    break;
            }
            break;
        case 3:
            printf("\n选择转换后的进制:\n0:退出\n1:BIN\n2:digit\n3:HEX\n");
            scanf("%d", &j);
            switch (j) {
                case 3:
                    printf("\n 同进制不用转换\n");
                    break;
                case 1:
                    printf("\n 输入要转化的数: ");
                    fflush(stdin);
                    gets(r);
                    for (k = 0;; k++) {
                        if (r[k] == '\0') {
                            break;
                        }
                    }
                    X_B(r, k);
                    break;
                case 2:
                    printf("\n 输入要转化的数: ");
                    fflush(stdin);
                    gets(r);
                    for (k = 0;; k++) {
                        if (r[k] == '\0') {
                            break;
                        }
                    }
                    X_D(r, k);
                    break;
                default:
                    break;
            }
            break;
    }
    return 1;
}

你可能感兴趣的:(calc)