开发一个多功能简易计算器,基本信息包括:四则运算、常见单位转换。
1.四则运算:
(1)能识别用户输入的运算(加+、减-、乘*、除/)表达式并计算,如:用户输入189+219,按回车确定后可计算该加法运算的结果并打印输出,其它运算以此类推;
(2)能检测表达式中的错误或不符合运算法则的情况并提示。如,在除法运算中除数为0的情况,表达式错误的情况12376a+31p等;
2.单位转换:
(1)能实现长度单位换算:英寸、英尺、毫米、厘米、米;
(2)能实现质量单位换算:磅、盎司、克、千克、斤、吨;
(3)能实现面积单位换算:公顷、亩、平方米、平方英尺;
附代码:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
int v4(char c)//判断字符是否为加减乘除,如果含有'+','-','*','/'则返回1,否则返回0
{
if (c == '+' || c == '-' || c == '*' || c == '/')
{
return 1;
}
else
{
return 0;
}
}
void arithmetic()//四则运算
{
system("cls"); //清屏
printf("输入表达式(例如1+1)(输入RETURN:返回)(输入EXIT:退出):\n");
while (1)
{
printf("-------------------------------------\n");
printf("输入表达式:");
char str[48] = "";//初始化字符串,用于接收计算式
int add = 0;//运算符次数累加初始值为0
scanf_s("%s", str, (unsigned int)sizeof(str));//获取表达式
if (strcmp(str, "RETURN") == 0) //输入RETURN返回上一层
{
system("cls"); //清屏
return;
}
else if (strcmp(str, "EXIT") == 0) //输入EXIT退出程序
{
exit(0);
}
else
{
int i = 0;
size_t len;
len = strlen(str);
while (i < len)//计算运算符次数累(加减乘除符号出现次数)
{
if (v4(str[i]))
{
add++;
}
i++;
}
for (i = 0; i < len; i++)
{
if (add != 1)//运算符号不为1次时,提示错误,跳出计算,重新获取计算式
{
printf("输入错误,请重新输入\n");
break;
}
if (isdigit(str[i]) || v4(str[i]) || str[i] == '.' && !isalpha(v4(str[i])))//输入满足数字、运算符且不为字母
{
if (v4(str[i]))//检测到运算符号时进行计算
{
char *num1 = NULL, *num2 = NULL;//两个数字初始化,设置空值
const char plus[2] = "+";
const char minus[2] = "-";
const char multiply[2] = "*";
const char divide[2] = "/";
switch (str[i])
{
case '+'://当运算符号为加法
num1 = strtok_s(str, plus, &num2);//通过运算符号'+'分离字符串,得到num1和num2两个数(字符串形式)
printf("%f", atof(num1));//字符串num1转浮点型
printf("+");
printf("%f", atof(num2));//字符串num2转浮点型
printf("=");
printf("%.2f\n", atof(num1) + atof(num2));
break;
case '-'://当运算符号为减法
num1 = strtok_s(str, minus, &num2);//通过运算符号'-'分离字符串,得到num1和num2两个数(字符串形式)
printf("%f", atof(num1));
printf("-");
printf("%f", atof(num2));
printf("=");
printf("%.2f\n", atof(num1) - atof(num2));
break;
case '*'://当运算符号为乘法
num1 = strtok_s(str, multiply, &num2);//通过运算符号'*'分离字符串,得到num1和num2两个数(字符串形式)
printf("%f", atof(num1));
printf("*");
printf("%f", atof(num2));
printf("=");
printf("%.2f\n", atof(num1) * atof(num2));
break;
case '/'://当运算符号为除法
num1 = strtok_s(str, divide, &num2);//通过运算符号'/'分离字符串,得到num1和num2两个数(字符串形式)
if (strcmp(num2, "0") == 0)//被除数为0进行提示,并跳出计算
{
printf("被除数不能为0\n");
break;
}
printf("%f", atof(num1));
printf("/");
printf("%f", atof(num2));
printf("=");
printf("%.2f\n", atof(num1) / atof(num2));
break;
default:
printf("\n无效输入\n");
break;
}
}
}
else
{
printf("输入错误,请重新输入\n");
break;
}
}
}
}
}
void Length()//能实现长度单位换算:英寸、英尺、毫米、厘米、米;
{
system("cls"); //清屏
printf("-------------单位转换器--------------\n");
printf("1:英尺 2:英寸 3:毫米 4:厘米 5:米 9:返回 0:退出\n");
printf("-------------------------------------\n");
while (1)
{
int selection; //存储用户选择
printf("请选择当前单位(输入对应数字):");
//读取用户选择
scanf_s("%d", &selection);
if (selection == 9)//选项为9返回上一层
{
system("cls"); //清屏
return;
}
else if (selection == 0)//选项为0退出程序
{
printf("程序结束!");
exit(0);
}
else if (selection < 1 || selection >5)//选项不在范围内提示错误
{
printf("输入错误,请重新输入\n");
selection = 9;
}
else//进行单位转换
{
printf("-------------------------------------\n");
printf("请输入当前单位的值:");
float all; //存储用户输入的值
//读取用户输入值
scanf_s("%f", &all);
switch (selection)//根据选项进行单位转换
{
case 1://英尺转换其他单位
printf("**************转换结果***************\n");
printf("%f英尺,%f英寸,%f毫米,%f厘米,%f米\n",
all, all * 12, all*304.8, all*30.48, all*0.3048);
printf("*************************************\n");
break;
case 2://英寸转换其他单位
printf("**************转换结果***************\n");
printf("%f英尺,%f英寸,%f毫米,%f厘米,%f米\n",
all / 12, all, all*25.4, all*2.54, all*0.0254);
printf("*************************************\n");
break;
case 3://毫米转换其他单位
printf("**************转换结果***************\n");
printf("%f英尺,%f英寸,%f毫米,%f厘米,%f米\n",
all / 304.8, all / 25.4, all, all*0.1, all*0.001);
printf("*************************************\n");
break;
case 4://厘米转换其他单位
printf("**************转换结果***************\n");
printf("%f英尺,%f英寸,%f毫米,%f厘米,%f米\n",
all / 30.48, all / 30.48 * 12, all * 10, all, all * 100);
printf("*************************************\n");
break;
case 5://米转换其他单位
printf("**************转换结果***************\n");
printf("%f英尺,%f英寸,%f毫米,%f厘米,%f米\n",
all / 30.48, all * 12 / 30.48, all * 1000, all * 100, all);
printf("*************************************\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
}
}
}
void quality()//能实现质量单位换算:磅、盎司、克、千克、斤、吨;
{
system("cls"); //清屏
printf("-------------单位转换器--------------\n");
printf("1:磅 2:盎司 3:克 4:千克 5:斤 6:吨 9:返回 0:退出\n");
printf("-------------------------------------\n");
while (1)
{
int selection; //存储用户选择
printf("请选择当前单位(输入对应数字):");
//读取用户选择
scanf_s("%d", &selection);
if (selection == 9)//选项为9返回上一层
{
system("cls"); //清屏
return;
}
else if (selection == 0)//选项为0退出程序
{
printf("程序结束!");
exit(0);
}
else if (selection < 1 || selection >6)//选项不在范围内提示错误
{
printf("输入错误,请重新输入\n");
selection = 9;
}
else//进行单位转换
{
printf("-------------------------------------\n");
printf("请输入当前单位的值:");
float all; //存储用户输入的值
//读取用户输入值
scanf_s("%f", &all);
switch (selection)
{
case 1://磅转换其他单位
printf("**************转换结果***************\n");
printf("%f磅,%f盎司,%f克,%f千克,%f斤,%f吨\n",
all, all * 16, all * 1000 / 2.2046, all / 2.2046, all * 2 / 2.2046, all / 2204.6);
printf("*************************************\n");
break;
case 2://盎司转换其他单位
printf("**************转换结果***************\n");
printf("%f磅,%f盎司,%f克,%f千克,%f斤,%f吨\n",
all / 16, all, all * 1000 / 35.2746, all / 35.2746, all * 2 / 35.2746, all / 2204.6 / 16);
printf("*************************************\n");
break;
case 3://克转换其他单位
printf("**************转换结果***************\n");
printf("%f磅,%f盎司,%f克,%f千克,%f斤,%f吨\n",
all*2.2046 / 1000, all * 35.2746 / 1000, all, all / 1000, all * 2 / 1000, all / 1000000);
printf("*************************************\n");
break;
case 4://千克转换其他单位
printf("**************转换结果***************\n");
printf("%f磅,%f盎司,%f克,%f千克,%f斤,%f吨\n",
all*2.2046, all * 35274.6, all * 1000, all, all * 2, all / 1000);
printf("*************************************\n");
break;
case 5://斤转换其他单位
printf("**************转换结果***************\n");
printf("%f磅,%f盎司,%f克,%f千克,%f斤,%f吨\n",
all*2.2046 / 2, all * 35274.6 / 2, all * 500, all / 2, all, all / 2000);
printf("*************************************\n");
break;
case 6://吨转换其他单位
printf("**************转换结果***************\n");
printf("%f磅,%f盎司,%f克,%f千克,%f斤,%f吨\n",
all*2204.6, all * 35274600, all * 1000 * 1000, all * 1000, all * 2000, all);
printf("*************************************\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
}
}
}
void area()//能实现面积单位换算:公顷、亩、平方米、平方英尺;
{
system("cls"); //清屏
printf("-------------单位转换器--------------\n");
printf("1:公顷 2:亩 3:平方米 4:平方英尺 9:返回 0:退出\n");
printf("-------------------------------------\n");
while (1)
{
int selection; //存储用户选择
printf("请选择当前单位(输入对应数字):");
//读取用户选择
scanf_s("%d", &selection);
if (selection == 9)//选项为9返回上一层
{
system("cls"); //清屏
return;
}
else if (selection == 0)//选项为0退出程序
{
printf("程序结束!");
exit(0);
}
else if (selection < 1 || selection >4)//选项不在范围内提示错误
{
printf("输入错误,请重新输入\n");
selection = 9;
}
else//进行单位转换
{
printf("-------------------------------------\n");
printf("请输入当前单位的值:");
float all; //存储用户输入的值
//读取用户输入值
scanf_s("%f", &all);
switch (selection)
{
case 1://公顷转换其他单位
printf("**************转换结果***************\n");
printf("%f公顷,%f亩,%f平方米,%f平方英尺\n",
all, all * 15, all * 10000, all*107639.104167);
printf("*************************************\n");
break;
case 2://亩转换其他单位
printf("**************转换结果***************\n");
printf("%f公顷,%f亩,%f平方米,%f平方英尺\n",
all / 15, all, all * 10000 / 15, all*107639.104167 / 15);
printf("*************************************\n");
break;
case 3://平方米转换其他单位
printf("**************转换结果***************\n");
printf("%f公顷,%f亩,%f平方米,%f平方英尺\n",
all / 10000, all * 15 / 10000, all, all*10.7639104167);
printf("*************************************\n");
break;
case 4://平方英尺转换其他单位
printf("**************转换结果***************\n");
printf("%f公顷,%f亩,%f平方米,%f平方英尺\n",
all / 107639.104167, all * 15 / 107639.104167, all * 10000 / 107639.104167, all);
printf("*************************************\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
}
}
}
void conversion()//单位转换
{
char answer = 'q';
while (1) {
system("cls"); //清屏
printf("\n选择操作:\n"
"长度单位换算,输入 L\n"
"质量单位换算,输入 M\n"
"面积单位换算,输入 S\n"
"返回,输入R\n"
"退出程序,输入 Q\n");
scanf_s(" %c", &answer, (unsigned int)sizeof(answer));
switch (toupper(answer))
{
case 'L':
Length();//长度单位换算
break;
case 'M':
quality();//质量单位换算
break;
case 'S':
area();//面积单位换算
break;
case 'R':
system("cls"); //清屏
return;
break;
case 'Q':
printf("程序结束!");
exit(0);
default:
printf("\n无效选择项\n");
break;
}
}
}
int main()
{
system("cls"); //清屏
char answer = 'q';
while (1)
{
printf("\n选择操作:\n"
"四则运算,输入 A\n"
"单位转换,输入 B\n"
"退出程序,输入 Q\n");
scanf_s(" %c", &answer, (unsigned int)sizeof(answer));//获取进行操作的字符
switch (toupper(answer))
{
case 'A':
arithmetic();//四则运算
break;
case 'B':
conversion();//单位转换
break;
case 'Q':
printf("程序结束!");
exit(0);//退出程序
default:
printf("\n无效选择项\n");
break;
}
}
return 0;
}
测试结果:
1.运行程序,出现选择操作界面;输入A进行四则运算,输入B进行单位换算,输入Q退出程序
2.此时输入A,进行四则运算测试
3.根据提示输入表达式,如1+1,输入return则会返回上一层,输入exit退出程序
4.输入一些加减乘除的计算式
5.输入return,返回到上一层界面
6.输入B,进行单位转换
7.此时有三个单位换算,输入L进行长度单位换算,输入M进行质量单位换算,输入S进行面积单位换算,输入R返回上一层,输入Q退出程序
8.输入L测试长度换算
9.根据提示依次输入单位数字,以及该单位的值
10.进行不同单位的测试
这个程序中四则运算只实现了正数的计算,当输入负数会提示错误,还有些小问题不够完善,仅供大家参考。
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。