今天的第一篇是用来补昨天的,不知道为啥昨天写的没有保存。今天写的比较少,只是在原来的基础上夹了一个幂乘,修复了选择运算模式的时候输入浮点数出错的问题,然后把所有整形运算扩充到可以进行浮点运算。
贴代码:
#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;
}
收获
- 用scanf("%d", &flag)语句对flag赋值的时候,我们期望使用程序的人能够按照我们的要求输入整数,但如果用户偏偏不按照我们的设想进行,那我们就得自己做好擦屁股的准备,如果输入的是整数,皆大欢喜,如果输入的是浮点数,如1.1,程序会把1赋给flag,然后保留后面的.1,一次赋给后面的scanf要赋值的变量,这就会造成后面scanf的输入错误,怎么来解决呢,用getchar()把后面多余的部分吃掉
- 不想浮点数显示多余的0时,用%g输出,但有时会省略部分数字