作为C语言初学者,尝试完成了一个可以实现四则运算和单位换算的简易计算器,请多指教。
一、需求分析
1、四则运算:
(1) 能识别用户输入的运算(加+、减、乘*、除/)表达式并计算,如:用户输入189+219,按回车确定后可计算该加法运算的结果并打印输出,其它运算以此类推;
(2)能检测表达式中的错误或不符合运算法则的情况并提示。
2、单位转换:
(1)能实现长度单位换算:英寸、英尺、毫米、厘米、米;
(2)能实现质量单位换算:磅、盎司、克、千克、斤、吨;
(3)能实现面积单位换算:公顷、亩、平方米、平方英尺;
二、分析
四则运算功能采用 switch 语句判断运算符;
单位转换功能使用全局变量存储各单位数值,采用switch语句判断单位表示;
四则运算和单位换算用两个函数实现,其中不同类型的单位换算也用函数实现;
用while语句实现循环运行。
三、程序实现
笔者采用VS2008编写C语言程序,代码如下:
/*
功能:实现四则运算和单位换算的简易计算器
单位换算包括长度单位、质量单位和面积单位
时间:2020/07/12
作者:抬手摘星辰
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define FT_TO_M ((float)0.3048)
#define FT_TO_IN (12)
#define IN_TO_CM (2.54)
#define LB_TO_OZ (16)
#define LB_TO_G (453.5924)
#define OZ_TO_G (28.3595)
// 四则运算
void FourArithmetic(float data1, float data2, char op)
{
printf("* 结果为:\n");
switch(op)
{
case'+':
printf("%.2f + %.2f = %.2f\n",data1,data2,data1+data2);
break;
case'-':
printf("%.2f - %.2f = %.2f\n",data1,data2,data1-data2);
break;
case'*':
printf("%.2f * %.2f = %.2f\n",data1,data2,data1*data2);
break;
case'/':
if(0==data2)
printf("Division by zero!\n");
else
printf("%.2f / %.2f = %.2f\n",data1,data2,data1/data2);
break;
case'%':
printf("%.2f% % %.2f = %.2f\n",data1,data2,(int)data1%(int)data2);
break;
default:
printf("* 无效的运算符号,请重新输入!\n");
}
}
//长度单位换算
void LengthUnit(float data1, char op1[5], char op2[5])
{
int i = 0;
float data3 = 0.0;
//长度单位换算
if (strcmp(op1, "in") == 0) i = 1;
else if (strcmp(op1, "ft") == 0) i = 2;
else if (strcmp(op1, "mm") == 0) i = 3;
else if (strcmp(op1, "cm") == 0) i = 4;
else if (strcmp(op1, "m") == 0) i = 5;
else printf("* 请检查单位字母输入是否正确!\n");
switch(i)
{
case 1: //in
if(strcmp(op2, "ft") == 0) data3 = data1/FT_TO_IN;
else if(strcmp(op2, "mm") == 0) data3 = data1*(IN_TO_CM*10);
else if(strcmp(op2, "cm") == 0) data3 = data1*IN_TO_CM;
else if(strcmp(op2, "m") == 0) data3 = data1*(IN_TO_CM*0.01);
else data3 = data1;
break;
case 2: //ft
if(strcmp(op2, "ft") == 0) data3 = data1;
else if(strcmp(op2, "mm") == 0) data3 = data1*(FT_TO_M*1000);
else if(strcmp(op2, "cm") == 0) data3 = data1*(FT_TO_M*100);
else if(strcmp(op2, "m") == 0) data3 = data1*FT_TO_M;
else data3 = data1*FT_TO_IN;
break;
case 3: //mm
if (strcmp(op2, "in") == 0) data3 = data1/IN_TO_CM*10;
else if(strcmp(op2, "ft") == 0) data3 = data1/FT_TO_M*1000;
else if(strcmp(op2, "mm") == 0) data3 = data1;
else if(strcmp(op2, "cm") == 0) data3 = data1/10;
else data3 = data1/1000;
break;
case 4: //cm
if (strcmp(op2, "in") == 0) data3 = data1/IN_TO_CM;
else if(strcmp(op2, "ft") == 0) data3 = data1/FT_TO_M *100;
else if(strcmp(op2, "mm") == 0) data3 = data1*10;
else if(strcmp(op2, "cm") == 0) data3 = data1;
else data3 = data1/100;
break;
case 5: //m
if (strcmp(op2, "in") == 0) data3 = data1/IN_TO_CM*100;
else if(strcmp(op2, "ft") == 0) data3 = data1/FT_TO_M;
else if(strcmp(op2, "mm") == 0) data3 = data1*1000;
else if(strcmp(op2, "cm") == 0) data3 = data1*100;
else data3 = data1;
break;
default:
printf("* 无法换算,请重新输入!\n");
}
printf("%.3f %s = %.3f %s\n",data1,op1,data3, op2);
}
// 质量单位换算
void WeightUnit(float data1, char op1[5], char op2[5])
{
int i = 0;
float data3 = 0.0;
if (strcmp(op1, "lb") == 0) i = 1;
else if (strcmp(op1, "oz") == 0) i = 2;
else if (strcmp(op1, "g") == 0) i = 3;
else if (strcmp(op1, "kg") == 0) i = 4;
else if (strcmp(op1, "Jin") == 0) i = 5;
else if (strcmp(op1, "ton") == 0) i = 6;
else printf("* 请检查单位字母输入是否正确!\n");
switch(i)
{
case 1: //lb
if(strcmp(op2, "oz") == 0) data3 = data1 * LB_TO_OZ;
else if(strcmp(op2, "g") == 0) data3 = data1*LB_TO_G;
else if(strcmp(op2, "kg") == 0) data3 = data1*LB_TO_G / 1000;
else if(strcmp(op2, "Jin") == 0) data3 = data1*0.9071;
else if(strcmp(op2, "ton") == 0) data3 = data1*LB_TO_G*1e-6;
else data3 = data1;
break;
case 2: //oz
if(strcmp(op2, "lb") == 0) data3 = data1 / LB_TO_OZ;
else if(strcmp(op2, "g") == 0) data3 = data1 * OZ_TO_G;
else if(strcmp(op2, "kg") == 0) data3 = data1*OZ_TO_G / 1e3;
else if(strcmp(op2, "Jin") == 0) data3 = data1 * 0.056699;
else if(strcmp(op2, "ton") == 0) data3 = data1*OZ_TO_G*1e-6;
else data3 = data1;
break;
case 3://g
if(strcmp(op2, "lb") == 0) data3 = data1/LB_TO_G;
else if(strcmp(op2, "oz") == 0) data3 = data1 / OZ_TO_G;
else if(strcmp(op2, "kg") == 0) data3 = data1/1000;
else if(strcmp(op2, "Jin") == 0) data3 = data1 / 500;
else if(strcmp(op2, "ton") == 0) data3 = data1*1e-6;
else data3 = data1;
break;
case 4: //kg
if(strcmp(op2, "lb") == 0) data3 = data1/LB_TO_G * 1000;
else if(strcmp(op2, "oz") == 0) data3 = data1 / OZ_TO_G * 1000;
else if(strcmp(op2, "g") == 0) data3 = data1*1000;
else if(strcmp(op2, "Jin") == 0) data3 = data1 * 2;
else if(strcmp(op2, "ton") == 0) data3 = data1*1e-3;
else data3 = data1;
break;
case 5: //Jin
if(strcmp(op2, "lb") == 0) data3 = data1 * 1.10231;
else if(strcmp(op2, "oz") == 0) data3 = data1 * 17.63698;
else if(strcmp(op2, "g") == 0) data3 = data1* 500;
else if(strcmp(op2, "kg") == 0) data3 = data1 / 2;
else if(strcmp(op2, "ton") == 0) data3 = data1*5*1e-4;
else data3 = data1;
break;
case 6: //ton
if(strcmp(op2, "lb") == 0) data3 = data1 * 2204.6226;
else if(strcmp(op2, "oz") == 0) data3 = data1 * 35273.9619;
else if(strcmp(op2, "g") == 0) data3 = data1 * 1e6;
else if(strcmp(op2, "kg") == 0) data3 = data1 * 1e3;
else if(strcmp(op2, "Jin") == 0) data3 = data1 * 2000;
else data3 = data1;
break;
default:
printf("* 无法换算,请重新输入!\n");
}
printf("%.3f %s = %.3f %s\n",data1,op1,data3, op2);
}
// 面积单位换算
void AreaUnit(float data1, char op1[5], char op2[5])
{
int i = 0;
float data3 = 0.0;
if (strcmp(op1, "hm2") == 0) i = 1;
else if (strcmp(op1, "Mu") == 0) i = 2;
else if (strcmp(op1, "m2") == 0) i = 3;
else if (strcmp(op1, "ft2") == 0) i = 4;
else printf("* 请检查单位字母输入是否正确!\n");
switch(i)
{
case 1: //hm2
if(strcmp(op2, "Mu") == 0) data3 = data1 * 15;
else if(strcmp(op2, "m2") == 0) data3 = data1 * 10000;
else if(strcmp(op2, "ft2") == 0) data3 = data1 * 107639.1042;
else data3 = data1;
break;
case 2: //Mu
if(strcmp(op2, "hm2") == 0) data3 = data1 / 15;
else if(strcmp(op2, "m2") == 0) data3 = data1 / 15 * 10000;
else if(strcmp(op2, "ft2") == 0) data3 = data1 * 7175.9403;
else data3 = data1;
break;
case 3: //m2
if(strcmp(op2, "hm2") == 0) data3 = data1 / 1000;
else if(strcmp(op2, "Mu") == 0) data3 = data1 * 0.0015 ;
else if(strcmp(op2, "ft2") == 0) data3 = data1 * 10.76391;
else data3 = data1;
break;
case 4: //ft2
if(strcmp(op2, "hm2") == 0) data3 = data1 * 9.2903e-6;
else if(strcmp(op2, "Mu") == 0) data3 = data1 * 0.0001394;
else if(strcmp(op2, "m2") == 0) data3 = data1 * 0.092903;
else data3 = data1;
break;
default:
printf("* 无法换算,请重新输入!\n");
}
printf("%.3f %s = %.3f %s\n",data1,op1,data3, op2);
}
// 单位换算
void UnitConversion(float data1, char op1[5], char op2[5], int type)
{
if (type == 1)
LengthUnit(data1, op1, op2);
else if (type == 2)
WeightUnit(data1, op1, op2);
else
AreaUnit(data1, op1, op2);
}
void main()
{
printf("********** 简易计算器 **********\n\n");
printf("注意:按ESC退出,按任意键继续!\n");
printf("单位用如下字母表示:\n");
printf("*********************************\n");
printf("* 长度单位换算\n* (英寸(in)、英尺(ft)、毫米(mm)、厘米(cm)、米(m));\n");
printf("* 质量单位换算\n* (磅(lb)、盎司(oz)、克(g)、千克(kg)、斤(Jin)、吨(ton));\n");
printf("* 面积单位换算\n* (公顷(hm2)、亩(Mu)、平方米(m2)、平方英尺(ft2));\n");
printf("*********************************\n");
float data1,data2;
int a,type;
char op,key = '\0';
char op1[5], op2[5];
printf("* 请选择操作:\n");
while((key = _getch()) != 0x1b) // 0x1b: ESC
{
printf("1.四则运算; 2.单位换算\n");
scanf_s("%d",&a);
if(a == 1)
{
printf("* 请输入表达式(如:1+2):\n");
scanf("%f%c%f",&data1,&op,&data2);
FourArithmetic(data1, data2, op); // 四则运算
}
else if(a == 2)
{
printf("* 请输入需要换算的单位(如:100m):\n");
scanf("%f%s",&data1,&op1);
printf("* 请输入换算后的单位(如:m):\n");
scanf("%s",&op2);
if (strcmp(op1, "ft") == 0 || strcmp(op1, "in") == 0 || strcmp(op1, "mm") == 0 \
|| strcmp(op1, "cm") == 0|| strcmp(op1, "m") == 0)
type = 1;
else if (strcmp(op1, "lb") == 0 || strcmp(op1, "oz") == 0 || strcmp(op1, "g") == 0 \
|| strcmp(op1, "kg") == 0 || strcmp(op1, "Jin") == 0 || strcmp(op1, "ton") == 0 )
type = 2;
else if (strcmp(op1, "hm2") == 0 || strcmp(op1, "Mu") == 0 || strcmp(op1, "m2") == 0 \
|| strcmp(op1, "ft2") == 0 )
type = 3;
else printf("* 请检查单位字母输入是否正确!\n");
UnitConversion(data1, op1, op2, type); //单位换算
}
else
printf("* 暂不支持该选项,请重新选择!\n");
printf("\n******************************\n");
printf("* 请再次选择操作(ESC退出):\n");
}
system("pause");
}
运行结果:
四、小结
上述简易计算器比较简单,主要用了函数、while语句、if语句、switch语句、对输入字符串的判断等知识点,但是代码较多,或许有更简单的实现方式,笔者还在学习之中,不妥之处,请多指教。