您的位置:首页 > 编程语言 > C语言/C++

c语言 命令行计算器——增加求累加,平均功能

2017-10-11 15:09 441 查看
上一篇:

更新:

1.增加求累加,求平均值功能

2.增加循环空功能

3.解决多读入回车符问题

# include <stdio.h>
#include<math.h>

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<b)
    {
        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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: