[c4droid源码]一个简单的计算器源码
c4droid吧
全部回复
仅看楼主
level 13
QAIU 楼主
如题楼下贴代码
2017年03月14日 10点03分 1
level 13
QAIU 楼主
/*
简易单步骤计算器v1.0
by:千百度
创建于2017-3-1
计算精度为15位
*/
//使用库函数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//宏定义用于判断计算结果是否为整数
#define PD jsjg-(int)jsjg
char a[100]={0x00};//存放输入的表达式
double jsjg;//计算结果
/*计算函数*/
double jsq(char*a)
{
char *d;//分隔符字符串
char c;//运算符
double x,y,b;
//x,y:用于计算的两个浮点变量
//b:函数返回值计算结果
if (strchr(a,'-')!=NULL)
//判断运算符是否为"-",下同。
{
d="-";
//将"-"赋值给分隔符用于分割表达式
c='-';
//运算符赋值用于计算
}
if (strchr(a,'+')!=NULL)
{
d="+";
c='+';
}
if (strchr(a,'*')!=NULL)
{
d="*";
c='*';
}
if (strchr(a,'/')!=NULL)
{
d="/";
c='/';
}
if (strstr(a,"--")!=NULL)
{
d="--";
c='+';
}
x=atof(a);
//将输入的字符串转为算式第一个数值
/*PS:之所以不采用分割后的字符串转
换,因为第一个数值做减法运算时会因分割而丢失符号*/
strtok(a,d);//分割字符串
y=atof(strtok(NULL,d));
//字符串第二段转换为算式第二个数值
switch (c)
//通过运算符变量的值决定计算方式
{
case '+':
b=x+y;//加
break;
case '-':
b=x-y;
break;
case '*':
b=x*y;
break;
case '/':
b=x/y;
break;
default:
printf("输入有误\n");
//不支持的运算符
break;
}
return b;//返回运算结果
}
/*主函数*/
int main(void)
{
while (1)//无限循环
{
printf("请输入算式\n");
scanf("%s",a);//输入算式字符串
jsjg=jsq(a);//调用计算函数
if (PD!=0)//判断计算结果是否为整数
printf("=%lf\n", jsjg);
//如果是小数,打印浮点值
else
printf("=%d\n", (int)jsjg);
//打印整数值
}
return 0;
}
2017年03月14日 10点03分 2
level 13
QAIU 楼主
继续更新
支持任意表达式的多步计算器
[无效] http://pan.baidu.com/s/1hrRkpaG
2017年03月15日 08点03分 3
level 11

2017年03月16日 00点03分 4
level 12
可惜没有运算符优先级,不过还是支持个!吧里有位更流弊的计算器,支持表达式计算,并支持运算符优先级!
2017年03月17日 14点03分 5
明天之前我发一个科学计算器 包涵优先级,函数,统计等 等下哈亲😊
2017年03月18日 10点03分
level 13
QAIU 楼主
来更新了。。。。为何我的帖子好冷
2017年03月19日 09点03分 8
level 13
QAIU 楼主
/*
>>控制台科学计算器源码
>>部分源码参考c4droid代码手册
>>by:千百度
>>date:2017.3.18
*/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h>
#include <time.h>
//初始化系统常量
#define N 200
#define P M_PI
#define E M_E
#define MAX INT_MAX
#define MIN INT_MIN
#define MIN_XS 0.000001
#define PD jg-(int)jg
//初始化界面文本
const char *SM="--------------------------------------------\n-->>科学计算器v1.0 by千百度\n--------------------------------------------\n-->数据统计函数:tj(x1;x2;...;xn)\n-->相关关系函数:gx(x1,y1;x2,y2;...,...;xn,yn)\n-->排列组合函数:npr(n,r) ncr(n,r)\n-->二项分布和超几何分布:pxb(k;n;p) pxh(k;N;M;n)\n-->支持幂指数:x^y\n-->在(0,1)之间产生一个随机小数:rand0\n-->三角函数请输入角度如:sin(90)\n-->函数指数暂时仅支持单步运算\n-->支持任意表达式优先级如:(1+2)*3\n--------------------------------------------\n";
const char *d1 = "abcdefghijklmnopqrstuvwxyz^!();",*d2="1234567890.";
double FS(void);//数值及括号处理函数
char token[N]; // 存放表达式字符串数组
char str[N];//获取输入字符串数组
//char result[N / 4]; //存放结果的数组
int n = 0, m = 0, t = 0;
int c = 0; //判断是否已经计算0表示没有
//数据统计
void tj(double a[N][2],int n)
{
printf("*****数据统计。求平均数,方差,标准差。*****\n");
int i;
float x=0,s=0;
for (i=0; i<n;i++)
{
printf("x%d=%f\n",i+1,a[i][0],i+1);
x=x+a[i][0];
}
int p=0;
x=x/n;
printf("平均值为:%.3f",x);
for (p;p<n;p++)
s=s+(a[p][0]-x)*(a[p][0]-x);
s=s/n;
printf("\n方差为:%.3f",s);
s=sqrt(s);
printf("\n标准差为:%.3f\n元素个数n",s);
}
//变量间相关关系 回归方程
void gx(double a[N][2],int n)
{
int i;
double s1=0,x=0,y=0;
double c,b,s2=0,s3=0,r;printf("******变量相关关系分析******\n");
for (i=0;i<n;i++)
{
printf("x%d=%f->y%d=%f\n",i+1,a[i][0],i+1,a[i][1]);
//printf("%f>>%f\n",a[i][0],a[i][1]);
s1=s1+a[i][0]*a[i][1];
s2=s2+a[i][0]*a[i][0];
s3=s3+a[i][1]*a[i][1];
x=x+a[i][0];y=y+a[i][1];
}
x=x/n;y=y/n;
s1=s1-x*y*n;
s2=s2-n*x*x;
s3=s3-n*y*y;
b=s1/s2;
c=y-b*x;
printf("\n回归方程:y=%.3fx+%.3f",b,c);
r=s2*s3;
r=s1/sqrt(r);
printf("\n相关系数r=%f",r);
if (r<-0.75)
printf("\n负相关关系很强");
else
if (r>0.75)
printf("\n正相关关系很强");
else
if (-0.75<r&&r<-0.3||0.3<r&&r<0.75)
printf("\n相关性一般");
else
if (-0.25<r&&r<0.25)
printf("\n相关性较弱");
else
printf("\n参数错误!");
printf("\n元素个数n");
}
//阶乘
double jc(int a)
{
double b=1;
if (a)
{
for (int i=1;i<=a;i++)
b*=i;
}
return b;
}
//排列
double npr(int a,int b)
{
if (b<=a)
return jc(a)/jc(a-b);
else
{
printf("参数有误error");
return -1;
}
}
//组合
double ncr(int a,int b)
{
if (b<=a)
return npr(a,b)/jc(b);
else
{
printf("参数有误error");
return -1;
}
}
double pxb(double a[N][2])
{
int k=(int)a[0][0];
int n=(int)a[1][0];
double p=a[2][0];
if (n>=k&&p>=0&&p<=1)
{
printf("数学期望EX=%f\n",n*p);
printf("方差DX=%f\n",n*p*(1-p));
printf("在%d次独立重复试验中,事件A发生%d次的概率为:",n,k);
return ncr(n,k)*pow(p,k)*pow(1-p,n-k);
}
else
{
printf("参数要求\n->n不小于k\n->p的取值范围[0,1]\nerror");
return 0;
}
}
double pxh(double a[N][2])
{
int k=(int)a[0][0];
int n=(int)a[1][0];
int m=(int)a[2][0];
int n1=(int)a[3][0];
if (n>=n1&&m>=k&&n1>=k&&n>=m)
{
printf("数学期望EX=%f\n",((double)n1)*((double)m)/((double)n));
printf("方差DX=%f\n",n1*m*(n-m)*(n-n1)/(pow(n,2)*(n-1)));
printf("产品总数N=%d\n含有次品数M=%d\n不放回抽取件数n=%d\n其中含X件次品\n则事件{X=%d}发生的概率p(X=%d)",n,m,n1,k,k);
return ncr(m,k)*ncr(n-m,n1-k)/ncr(n,n1);
}
else
{
printf("参数要求\n->N不小于M\n->n不小于k\n->M不小于k\n->N不小于n\nerror");
return 0;
}
}
//角度转弧度
double jtoh(double a)
{
return P*a/180;
}
2017年03月19日 09点03分 9
level 13
QAIU 楼主
//弧度转角度
//接楼上
double htoj(double a)
{
return 180*a/P;
}
//产生0~1之间的浮点随机数
double rand0(void)
{
/* 初始化伪随机数生成器 */
srand((unsigned int)time(NULL));
return (double)rand() / RAND_MAX;
}
/*函数计算*/
double math_hs(char *str)
{
char str0[N],*s,*s0;
char*p[N];
double x[N][2],d=0;
int i=0,n=0,j=0;
strcpy(str0,str);
s0 = strtok(str0,d2);
p[i] = strtok(str, d1);
while ((s = strtok(NULL, d1)))
{
i++;
n=i+1;
p[i] = s;
//printf(">>%s\n",p[i]);
}
for (j=0;j<=i;j++)
{
if(strchr(p[j],','))
{
x[j][0]=atof(strtok(p[j],","));
x[j][1]=atof(strtok(NULL,","));
}
else
x[j][0]=atof(p[j]);
}
if (strstr(s0,"sin"))
{
printf("三角正弦:sin(%gº)",x[0][0]);
d=sin(jtoh(x[0][0]));
}
if (strstr(s0,"cos"))
{
printf("三角余弦:cos(%gº)",x[0][0]);
d=cos(jtoh(x[0][0]));
}
if (strstr(s0,"tan"))
{
printf("三角正切:tan(%gº)",x[0][0]);
d=tan(jtoh(x[0][0]));
}
if (strstr(s0,"asin"))
{
printf("反正弦:asin(%g)",x[0][0]);
d=htoj(asin(x[0][0]));
}
if (strstr(s0,"acos"))
{
printf("反余弦:acos(%g)",x[0][0]);
d=htoj(acos(x[0][0]));
}
if (strstr(s0,"atan"))
{
printf("反正弦:atan(%g)",x[0][0]);
d=htoj(atan(x[0][0]));
}
if (strstr(s0,"sinh"))
{
printf("双曲正弦:sinh(%g)",x[0][0]);
d=sinh(x[0][0]);
}
if (strstr(s0,"cosh"))
{
printf("双曲余弦:cosh(%g)",x[0][0]);
d=cosh(x[0][0]);
}
if (strstr(s0,"tanh"))
{
printf("双曲正切:tanh(%g)",x[0][0]);
d=tanh(x[0][0]);
}
if (strstr(s0,"lg"))
{
printf("常用对数:lg(%g)",x[0][0]);
d=log10(x[0][0]);
}
if (strstr(s0,"ln"))
{
printf("自然对数:ln(%g)",x[0][0]);
d=log(x[0][0]);
}
if (strstr(s0,"sqrt"))
{
printf("开方:√(%g)",x[0][0]);
d=sqrt(x[0][0]);
}
if (strstr(s0,"exp"))
{
printf("开方:e^(%g)",x[0][0]);
d=exp(x[0][0]);
}
if (strstr(s0,"^"))
{
printf("%g^%g",x[0][0],x[1][0]);
d=pow(x[0][0],x[1][0]);
}
if (strstr(s0,"tj"))
{
d=n;
tj(x,n);
}
if (strstr(s0,"gx"))
{
d=n;
gx(x,n);
}
if (strstr(s0,"npr"))
d=npr((int)x[0][0],(int)x[0][1]);
if (strstr(s0,"ncr"))
d=ncr((int)x[0][0],(int)x[0][1]);
if (strstr(s0,"pxb"))
d=pxb(x);
if (strstr(s0,"pxh"))
d=pxh(x);
if (strstr(s0,"!"))
d=jc((int)x[0][0]);
if (strstr(s0,"rand"))
d=rand0();
return d;
}
/* 处理乘除并计算 */
double CX(void)
{
double cs;
double acting = FS();
while ((token[m] == '*') || (token[m] == '/'))
switch (token[m])
{
case '*':
token[++m] = str[t++];
acting *= FS();
break;
case '/':
token[++m] = str[t++];
cs = FS();
if (cs == 0)/*除数为0时*/
{
printf("除数不能为零,或者");
}
acting /= cs;
break;
}
return acting;
}
/* 处理加减并计算 */
double JJ(void)
{
double acting = CX();
while ((token[m] == '+') || (token[m] == '-'))
switch (token[m])
{
case '+':
token[++m] = str[t++];
acting += CX();
break;
case '-':
token[++m] = str[t++];
acting -= CX();
break;
}
return acting;
}
/* 处理括号,数字,小数点 */
double FS(void)
{
double acting;
char number[N];
int i = 0;
if (token[m] == '(')
{
token[++m] = str[t++];
acting = JJ();
if (token[m] == ')')
token[++m] = str[t++];
}
else if (isdigit(token[m]) || token[m] == '.')
{
while (isdigit(token[m]) || token[m] == '.')/* 将字符串转换为浮点数 */
{
number[i++] = token[m++];
token[m] = str[t++];
}
number[i] = '\0';
acting = atof(number);
}
return acting;
}
/*主函数*/
int main(void)
{
double jg;
int k=0;
printf(SM);
while (1)
{
scanf("%s",str);
n=strlen(str);
if (strpbrk(str,d2)==NULL)
strcpy(str,"0");
if ( str[0] == '-' || str[0] == '+' || str[0] == '*' || str[0] == '/' )
{
for ( int b = n;b >=1;b-- )
str[b] = str[b-1];
str[0] = '0';
}
c = 1;
m = t = 0;
if (islower(str[0])||strchr(str,'!')||strchr(str,'^'))
{
jg=math_hs(str);
if (islower(str[0])&&!strstr(str,"ncr")&&!strstr(str,"ncr"))
k=1;
}
else
{
token[m] = str[t++];
jg=JJ();
k=0;
}
if ((jg>MAX||jg<MIN||(jg>0&&jg<MIN_XS))&&!k)
printf("=%g\n",jg);
else
{
if (PD==0)
printf("=%d\n",(int)jg);
else
printf("=%lf\n",jg);
}
printf("--------------------------------------------\n");
if (c == 1)
{
for (; n >= 0; --n)
str[n] = '\0';
n = c = 0;
}
}
return 0;
}
//转载请注明来源谢谢(*°∀°)=3
2017年03月19日 09点03分 10
level 13
不错![真棒][真棒][真棒]
建议模块化,看得头疼!
写程序之前,先弄个流程图:可以用最简单的瀑布型
2017年03月19日 10点03分 11
level 13
帖子冷清正常!我也是一个偶然机会才使用贴吧的!但账号早在7、8年前就注册了!
进来的人潜水者居多!其实多看看贴吧可以吸收不同的思维模式!
看楼主挺有钻研精神,但代码大部分是在模仿加创新!最后有一天,估计你会把这些代码全部推翻重写!这是必经之路!
2017年03月19日 10点03分 12
感谢大神关照[呵呵]
2017年03月19日 10点03分
新手路过
2017年03月21日 00点03分
level 13
QAIU 楼主
新版预告:
真正意义上的科学计算器v1.1(最终版)
支持算法优先级,多步运算
支持是(反)三角函数(反)双曲函数,指数,对数,并支持多步运算
支持简单数据统计,线性回归统计相关分析,二项分布,超几何分布:求期望,方差;
支持,排列组合;
若无bug,不再继续更新。。。
2017年03月21日 09点03分 13
level 13
QAIU 楼主
2017年03月21日 09点03分 14
level 9
支持
2017年03月22日 02点03分 15
level 2
dd
2017年03月22日 17点03分 16
level 13
QAIU 楼主
https://pan.bai去掉du.com/s/1dFmVyaH
所有的源码都现在这儿了。。。
2017年03月22日 23点03分 17
1 2 尾页