calc
2018-06-08 本文已影响0人
liberty926
//
// Created by liberty on 2018/6/7.
//
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <stdlib.h>
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;
}