简单计算器(C语言)

任务

在这里插入图片描述

代码

#include<stdio.h>
#include<math.h>
#define e 2.71828
#define PI 3.1415926
float Add(float x, float y)
{
	return x + y;
}
float Sub(float x, float y)
{
	return x - y;
}
float Mul(float x, float y)
{
	return x * y;
}
float Div(float x, float y)
{
	return x / y;
}
float Mod(float x, float y)
{
	return (int)x % (int)y;// % 两边是整形
}
void menu1()
{
	printf("********************\n");
	printf("**** 1.算术运算 ****\n");
	printf("**** 2.对数运算 ****\n");
	printf("**** 3.三角运算 ****\n");
	printf("**** 4.其他     ****\n");
	printf("**** 0.退出     ****\n");
	printf("********************\n");

}
void menu2()
{
	printf("*******************\n");
	printf("**** 1.加法 *******\n");
	printf("**** 2.减法 *******\n");
	printf("**** 3.乘法 *******\n");
	printf("**** 4.除法 *******\n");
	printf("**** 5.模运算 *****\n");
	printf("**** 0.返回上层****\n");
	printf("*******************\n");

}
void menu3()
{
	printf("********************\n");
	printf("**** 1.以10为底 ****\n");
	printf("**** 2.以e为底 *****\n");
	printf("**** 0.返回上层 ****\n");
	printf("********************\n");

}
void menu4()
{
	printf("********************\n");
	printf("**** 1.sin *********\n");
	printf("**** 2.cox *********\n");
	printf("**** 3.tan *********\n");
	printf("**** 0.返回上层 ****\n");
	printf("********************\n");

}
void menu5()
{
	printf("********************\n");
	printf("**** 1.倒数     ****\n");
	printf("**** 2.平方     ****\n");
	printf("**** 3.平方根   ****\n");
	printf("**** 4.e的指数  ****\n");
	printf("**** 0.返回上层 ****\n");
	printf("********************\n");

}
void Calc(float(*p)(float ,float))//p 是存放函数地址的变量
{
	float x = 0;
	float y = 0;
	printf("请输入两个操作数:\n");
	scanf("%f%f", &x, &y);
	float ret = (*p)(x, y);//地址解引用,找到对应的函数,也可以去掉*,是一样的
	printf("%.2f\n", ret);
}
int main()
{
	
	int choose = 0;//选择运算类型
	int choose2 = 0;//选择 算术,对数,函数 运算类型
	float num3 = 0;// 对数,其他运算的操作数
	float angle = 0;//三角函数角度
	do
	{
		menu1();
		printf("请选择运算类型:\n");
		scanf("%d", &choose);

		switch (choose)
		{
		case 1://算术运算
		{
			do
			{
				menu2();//算术运算
				printf("请选择算术运算类型:\n");
				scanf("%d", &choose2);
				switch (choose2)
				{
				  case 1:Calc(Add);//Add是函数的地址,Calc函数形参部分要用函数指针接受
					break;
				  case 2:Calc(Sub);
					break;
				  case 3:Calc(Mul);
					break;
				  case 4:Calc(Div);
					break;
				  case 5:Calc(Mod);
					break;
			  	  case 0: printf("返回上层\n");
					break;
				  default:printf("选择错误,请重新选择\n\n");
					break;
				}
			} while (choose2);
		}
		break;
		case 2://对数运算
		{
			
			do
			{
				menu3();
				printf("请选择对数运算类型:\n");
				scanf("%d", &choose2);
				switch (choose2)
				{
					case 1://以10为底
						{
						printf("请输入操作数:\n");
						scanf("%f",&num3);
						printf("%.2f\n", log10(num3));

						}
						break;
					case 2:
						{
						printf("请输入操作数:\n");
						scanf("%f", &num3);
						printf("%.2f\n", log(num3));
						}
						break;
					case 0:printf("返回上层\n");
						break;
					default:printf("输入错误,请重新输入:\n\n");
						break;

				}

			} while (choose2);
		}
			break;
		case 3://三角函数
		{
			
			do
			{
				menu4();
				printf("请选择三角函数类型:\n");
				scanf("%d", &choose2);
				if (choose2 == 1)//sin()中的参数是double形,以弧度来算,要把角度转换成弧度
				{
					printf("请输出计算的角度:\n");
					scanf("%f", &angle);
					printf("%.2f\n", sin(PI * angle / 180) );
				}
				else if (choose2 == 2)//cox()中的参数是double形,以弧度来算,要把角度转换成弧度
				{
					printf("请输出计算的角度:\n");
					scanf("%f", &angle);
					printf("%.2f\n", cos(PI * angle / 180) );

				}
				else if (choose2 == 3)//tan
				{
					printf("请输出计算的角度:\n");
					scanf("%f", &angle);
					printf("%.2f\n", sin(PI * angle / 180) / cos(PI * angle / 180) );

				}
				else if (choose2 == 0)
				{
					printf("返回上层\n");
				}
				else printf("输入错误,请重新输入\n\n");

			} while (choose2);
		}
			break;
		case 4://其他
		{
			do
			{
				menu5();
				printf("请选择运算类型:\n");
				scanf("%d", &choose2);
				switch (choose2)
				{
				case 1://倒数
					{
					printf("请输入操作数:\n");
					scanf("%f", &num3);
					printf("%.2f\n", 1 / num3);
					}
					break;
				case 2://平方
					{
					printf("请输入操作数:\n");
					scanf("%f", &num3);
					printf("%.2f\n", num3* num3);
					}
					break;
				case 3://立方根
					{
					printf("请输入操作数:\n");
					scanf("%f", &num3);
					printf("%.2f\n", pow(num3,3));
					}
					break;
				case 4://e的指数
					{
					printf("请输入操作数:\n");
					scanf("%f", &num3);
					printf("%.2f\n", pow(e, num3));
					}
					break;
				case 0:printf("返回上层\n");
					break;
				default:printf("输入错误,请重新输入:\n\n");
					break;

				}
			} while (choose2);
		}
			break;
		case 0:
			printf("退出计算器\n");
			break;
		default:
			printf("选择错误,请重新选择\n\n");
			break;
		}
	} while (choose);

	return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值