进击的小白Day006——计算器(二)(完结)

今天的第一篇是用来补昨天的,不知道为啥昨天写的没有保存。今天写的比较少,只是在原来的基础上夹了一个幂乘,修复了选择运算模式的时候输入浮点数出错的问题,然后把所有整形运算扩充到可以进行浮点运算。

贴代码:

#define _CRT_SECURE_NO_WARNINGS  /*预定义常量,解决scanf不安全的报错,需要放在#include <stdio.h>之前*/
#include <stdio.h>
int main()
{
	/*各种定义*/
	char ch;
	int flag;
	int Add();
	int Sub();
	int Mul();
	int Div();
	int Mi();

	/*引导*/
	printf("这是一个计算器,可以进行加、减、乘、除的运算。\n");

	while (1)
	{
		/*选择运算模式*/
		printf("请选择需要运算的类型:\n");
		printf("1.加	2.减	3.乘	4.除	5.幂乘\n");
		scanf("%d", &flag);

		while (1)
		{
			if (flag < 0 || flag > 5)
			{
				printf("输入有误,请重新输入:");
				scanf("%d", &flag);
			}
			else
			{
				break;
			}
		}

		while (getchar() != '\n')
		{
			ch = getchar();
		}

		/*进入运算*/
		if (flag == 1)
		{
			/*加法*/
			Add();
		}
		else if (flag == 2)
		{
			/*减法*/
			Sub();
		}
		else if (flag == 3)
		{
			/*乘法*/
			Mul();
		}
		else if (flag == 4)
		{
			/*除法*/
			Div();
		}
		else
		{
			/*幂乘*/
			Mi();
		}
	}
	return 0;
}

/*求和*/
int Add(void)
{
	/*各种定义*/
	double add;
	double a[100];
	int i, j;

	/*获取数字*/
	printf("请输入所有需要相加的数字,数字间以空格隔开:");
	i = 0;
	do
	{
		scanf("%lf", &a[i++]);
	} while (getchar() != '\n');

	/*求和*/
	for (j = 0, add = 0; j < i; j++)
	{
		add = add + a[j];
	}

	printf("add=%g\n\n", add);
	return 0;
}

int Sub(void)
{
	/*各种定义*/
	double sub;
	double a[100];
	int i, j;

	/*获取数字*/
	printf("请输入所有需要相加的数字,数字间以空格隔开:");
	i = 0;
	do
	{
		scanf("%lf", &a[i++]);
	} while (getchar() != '\n');

	/*求差*/
	for (j = 1, sub = a[0]; j < i; j++)
	{
		sub = sub - a[j];
	}

	printf("sub=%g\n\n", sub);
	return 0;
}

int Mul(void)
{
	/*各种定义*/
	double mul;
	double a[100];
	int i, j;

	/*获取数字*/
	printf("请输入所有需要相加的数字,数字间以空格隔开:");
	i = 0;
	do
	{
		scanf("%lf", &a[i++]);
	} while (getchar() != '\n');

	/*求积*/
	for (j = 0, mul = a[0]; j < i; j++)
	{
		mul = mul * a[j];
	}

	printf("mul=%g\n\n", mul);
	return 0;
}

int Div(void)
{
	/*各种定义*/
	double div;
	double a[100];
	int i, j;

	/*获取数字*/
	printf("请输入所有需要相加的数字,数字间以空格隔开:");
	i = 0;
	do
	{
		scanf("%lf", &a[i++]);
	} while (getchar() != '\n');

	/*求商*/
	for (j = 1, div = a[0]; j < i; j++)
	{
		div = div / a[j];
	}

	printf("div=%g\n\n", div);
	return 0;
}

int Mi(void)
{
	/*各种定义*/
	double mi;
	double a[2];
	int i, j;

	/*获取数字*/
	printf("请输入需要幂乘的数字,用空格隔开,其中第一个数字为底数,第二个数字为指数,第二个数需要为整数:");
	i = 0;
	do
	{
		scanf("%lf", &a[i++]);
	} while (getchar() != '\n');

	/*幂乘*/
	for (j = 0, mi = a[0]; j < (a[1] - 1); j++)
	{
		mi = mi * a[0];
	}

	printf("mi=%g\n\n", mi);
	return 0;
}

收获

  1. 用scanf("%d", &flag)语句对flag赋值的时候,我们期望使用程序的人能够按照我们的要求输入整数,但如果用户偏偏不按照我们的设想进行,那我们就得自己做好擦屁股的准备,如果输入的是整数,皆大欢喜,如果输入的是浮点数,如1.1,程序会把1赋给flag,然后保留后面的.1,一次赋给后面的scanf要赋值的变量,这就会造成后面scanf的输入错误,怎么来解决呢,用getchar()把后面多余的部分吃掉
  2. 不想浮点数显示多余的0时,用%g输出,但有时会省略部分数字

猜你喜欢

转载自blog.csdn.net/u011232393/article/details/83855997
今日推荐