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.
更新:
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.
相关文章推荐
- 【晨哥的C语言之旅】逆波兰表达式实现计算器功能
- 给XP的右键菜单增加“在命令行中打开这里……”功能
- 【汇编】命令行下获取用户输入,实现类似C语言fgets函数功能
- 为右键菜单增加dos命令行功能
- opencv:累加图像求平均(c语言版本)
- c语言实现的货物管理系统实例代码(增加删除 查找货物信息等功能)
- C语言用函数指针的数组简单实现计算器功能
- 用C语言完成简单的计算器功能(1)
- C语言-----循环双向链表(增加文件读写链表功能)
- 用c语言实现 一个通讯录(实现 增加、删除、查找、修改、显示、清空功能)
- Odoo 条码扫码功能 采购订单、销售订单通过扫码增加明细
- C语言 宏定义的方式实现“bool”数据类型的功能作用
- 给Webkit内核的浏览器控件增加互交功能
- c语言数据结构线性表之顺序表功能函数
- 用C语言实现一个revert函数,它的功能是将输入的字符串在原串上倒序后返回...
- 增加类的功能
- C语言中如何在命令行中输入EOF,即文本结束符
- 为rm增加回收站功能&用trash-cli避免误删Linux文件
- Uliweb增加在IPython notebook中显示Model的关系图功能
- 下一步CSDN Blog要增加和完善的功能