上一篇:
更新:
1.增加求累加,求平均值功能
2.增加循环空功能
3.解决多读入回车符问题
# include
#include
static int GCD(int,int);
static int LCM(int,int);
static void primeFactors(int);
void generalOperation();//普通运算
void otherOperation();//复杂运算
int isNumber(char c);//判断字符是不是数字
int isAdd(char c);//判断字符是不是字母
int sum_avg(int* pflag,int *pcount);//求累加,和平均值
int functionInput();//判断输入的是什么函数
int main() {
int doAgain=1;
int mode;
while(doAgain==1)
{
printf("---------------------计算器----------------------\n");
printf("输入计算模式:\n");
printf("-----1:简单运算\n");
printf("----------1.1两位数加减乘除----------\n");
printf("----------1.3求最大公约数,最小公倍数\n");
printf("----------1.2分解质因数--------------\n");
printf("-----2:复杂运算:\n");
printf("----------2.1累加求和,平均值--------\n");
printf(":");
scanf("%d",&mode);
switch(mode)
{
case 1:
generalOperation();
break;
case 2:
otherOperation();
break;
}
// printf("");
// printf("");
printf("\n继续选择模式[1/0]?:");
scanf("%d",&doAgain);
}
// otherOperation();
return 0;
}
//一元二元运算:加减乘除求余,分解质因数
//二元运算:求最大公约数,最小公倍数
void generalOperation()
{
char operator;
double firstNumber,secondNumber;
int Again=1;
while(Again==1)
{
printf(" ---------------------普通运算输入格式:----------------------\n");
printf(" 1.两位数加减乘除:number1[+|-|*|/|%]number2\n");
printf(" 2.求两个数的[最大公约数|最小公倍数]:number1[G|L]number2\n");
printf(" 3.一个数分解质因数:number1[p]\n");
printf(" --------------------------------------------------------------\n");
printf(" 输入公式:");
scanf("%lf%c",&firstNumber,&operator);
if(operator=="p"|operator=="P")
{
primeFactors((int)firstNumber);
}
else
{
scanf("%lf",&secondNumber);
//switch 语句及case 的类型 表达式必须是整数、字符或枚举量值。
//C语言的switch case 语句的case不能匹配字符串常量,只能匹配整型类常量,如int short long char.
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;
case "%":
printf(" %d %% %d = %d",(int)firstNumber, (int)secondNumber, (int)firstNumber%(int)secondNumber);
break;
case "G":
case "g":
printf(" %d和%d的最大公约数为:%d",(int)firstNumber, (int)secondNumber, GCD((int)firstNumber,(int)secondNumber));
break;
case "L":
case "l":
printf(" %d和%d的最小公倍数为:%d",(int)firstNumber, (int)secondNumber, LCM((int)firstNumber,(int)secondNumber));
break;
// operator doesn"t match any case constant (+, -, *, /)
default:
printf("Error! operator is not correct");
}
}
printf("\n 继续普通运算[1/0]?:");
scanf("%d",&Again);
}
}
//使用辗转相除法求最大公约数
static int GCD(int a,int b)
{
//确保a存放大的数,b存放小的数
if(a
{
a=a^b;
b=a^b;
a=a^b;
}
primeFactors(a);
primeFactors(b);
int c=a%b;
while(c!=0)//当c!=0时继续
{
a=b;
b=c;
c=a%b;
}
return b;//当c等于零,b就是最大公约数
}
static int LCM(int a,int b)
{
return a*b/GCD(a,b);
}
static void primeFactors(int n)
{
int factor=2;
int flag=0;
printf(" 分解质因数%d=",n);
while(factor<=n)//因数小于等于被除数
{
if(n%factor==0)
{
if(flag==1)//如果flag==1
printf("*");
else
flag=1;
printf("%d",factor);
n=n/factor;
}
else
{
factor++;
}
}printf("\n");
flag=0;
}
void otherOperation()
{
// char operators[10];
// printf("输入函数名:");
// scanf("%s",operators);
switch(functionInput())
{
case 1:
printSumAvg();
break;
}
}
int functionInput()
{
char operators[10];
printf(" -------------------------函数列表---------------------------\n");
printf(" 1. sum_avg :求累加,和平均值\n");
printf(" ------------------------------------------------------------\n");
printf(" 输入函数名:");
scanf("%s",operators);
char enter=getchar();//回车符无效;
if(strcmp(operators,"sum_avg")==0)//如果输入累计函数名sum_avg
{
// printf("return 1\n");
return 1;
}
}
int isNumber(char c)//判断字符是不是数字
{
return (c>="0"&&c<="9");
}
int isAdd(char c)//判断字符是不是字母
{
return (c=="+");//如果是加号的话
}
void printSumAvg()
{
int flag=1;
int *pflag=&flag;
int count=1;
int *pcount=&count;
int sum=0;
while(flag)
{
sum=sum_avg(pflag,pcount);
printf("\n ---sum=%d\n",sum);
printf(" ---avg=%.2lf\n",(double)sum/(count-1));
}
}
int sum_avg(int* pflag,int *pcount)//求累加,和平均值
{
int sum=0;
int temp=0;
int this_Num=0;
char ch;//读入一个字符
int again;
printf(" -----------------------------累加求和运算---------------------\n");
printf(" 输入“回车”返回结果,并进行下一趟求和(例:1+2+3...\"回车\")\n");
printf(" 输入“#” 返回结果,并结束求和运算 (例:1+2+3...#)\n");
printf(" --------------------------------------------------------------\n");
printf(" 输入累加公式:\n");
while(1)//如果读入的是一个数字
{
printf(" ");//对齐空白符
ch=getchar();
if(isNumber(ch))
{
this_Num=((int)ch-48);//把字符转换成数字
// printf("this_Num=%d\n",this_Num);
// printf("temp*10=%d\n",temp*10);
temp=temp*10+this_Num;//存放到temp中
// printf("temp=%d\n",temp);
}
if(isAdd(ch)||ch=="\n"||ch=="#")//如果读入的是加法
{
sum+=temp;//求和
*pcount=(*pcount)+1;//求和计数,也就是元素的个数
// printf("*pcount=%d\n",*pcount);
temp=0;
// printf("sum=%d\n",sum);
if(ch=="\n")
break;
if(ch=="#")
*pflag=0;//函数内通过指针来控制外部的循环变量,把外部循环控制符改变,使得循环终止
}
}
//输出结果
// printf("---sum=%d\n",sum);
return sum;
}测试:
---------------------计算器----------------------
输入计算模式:
-----1:简单运算
----------1.1两位数加减乘除----------
----------1.3求最大公约数,最小公倍数
----------1.2分解质因数--------------
-----2:复杂运算:
----------2.1累加求和,平均值--------
:1
---------------------普通运算输入格式:----------------------
1.两位数加减乘除:number1[+|-|*|/|]number2
2.求两个数的[最大公约数|最小公倍数]:number1[G|L]number2
3.一个数分解质因数:number1[p]
--------------------------------------------------------------
输入公式:2+3
2.0 + 3.0 = 5.0
继续普通运算[1/0]?:1
---------------------普通运算输入格式:----------------------
1.两位数加减乘除:number1[+|-|*|/|]number2
2.求两个数的[最大公约数|最小公倍数]:number1[G|L]number2
3.一个数分解质因数:number1[p]
--------------------------------------------------------------
输入公式:23G46
分解质因数46=2*23
分解质因数23=23
23和46的最大公约数为:23
继续普通运算[1/0]?:1
---------------------普通运算输入格式:----------------------
1.两位数加减乘除:number1[+|-|*|/|]number2
2.求两个数的[最大公约数|最小公倍数]:number1[G|L]number2
3.一个数分解质因数:number1[p]
--------------------------------------------------------------
输入公式:22L3
分解质因数22=2*11
分解质因数3=3
22和3的最小公倍数为:66
继续普通运算[1/0]?:1
---------------------普通运算输入格式:----------------------
1.两位数加减乘除:number1[+|-|*|/|]number2
2.求两个数的[最大公约数|最小公倍数]:number1[G|L]number2
3.一个数分解质因数:number1[p]
--------------------------------------------------------------
输入公式:1234P
分解质因数1234=2*617
继续普通运算[1/0]?:0
继续选择模式[1/0]?:1
---------------------计算器----------------------
输入计算模式:
-----1:简单运算
----------1.1两位数加减乘除----------
----------1.3求最大公约数,最小公倍数
----------1.2分解质因数--------------
-----2:复杂运算:
----------2.1累加求和,平均值--------
:2
-------------------------函数列表---------------------------
1. sum_avg :求累加,和平均值
------------------------------------------------------------
输入函数名:sum_avg
-----------------------------累加求和运算---------------------
输入“回车”返回结果,并进行下一趟求和(例:1+2+3..."回车")
输入“#” 返回结果,并结束求和运算 (例:1+2+3...#)
--------------------------------------------------------------
输入累加公式:
1+23+34+12
---sum=70
---avg=17.50
-----------------------------累加求和运算---------------------
输入“回车”返回结果,并进行下一趟求和(例:1+2+3..."回车")
输入“#” 返回结果,并结束求和运算 (例:1+2+3...#)
--------------------------------------------------------------
输入累加公式:
#
---sum=0
---avg=0.00
继续选择模式[1/0]?:0
Process returned 0 (0x0) execution time : 81.495 s
Press any key to continue.