C语言怎么增加多个功能,c语言 命令行计算器——增加求累加,平均功能

上一篇:

更新:

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.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值