C语言菜单流程式简易计算器
详情如图:
基于C Primer Plus 8.11编程练习 第8题 改造而来,可以给各位提供一个输入验证知识的参考
代码如下
#include <stdio.h>
/**
* @Description C语言简易计算器实现
* @author aquawius
* @create 2021-08-19
*/
int getChoice(void);
void getFirstNum(void);
void getSecondNum(void);
double numAdd(double i, double j);
double numSubtract(double i, double j);
double numDivide(double i,double j);
double numMultiply(double i,double j);
int askQuit(void);
double i, j; //得到的两个数 进行计算
double result;
int ch; //用于接收字符
int isQuit = 1; //1代表不退出,0 代表退出
/**
* @brief 主函数,负责分配工作
* @return int
*/
int main(void)
{
while (isQuit)
{
ch = getChoice();
//这里可以使用switch-case
if (ch == 'q')
{
isQuit = askQuit();
}
if (ch == 'a')
{
printf("You have selected the add!\n");
getFirstNum();
getSecondNum();
result = numAdd(i, j);
printf("%lf \n\n", result);
}
if (ch == 's')
{
printf("You have selected the subtract!\n");
getFirstNum();
getSecondNum();
result = numSubtract(i, j);
printf("%lf \n\n", result);
}
if (ch == 'm')
{
printf("You have selected the multiply!\n");
getFirstNum();
getSecondNum();
result = numMultiply(i, j);
printf("%lf \n\n", result);
}
if (ch == 'd')
{
printf("You have selected the divide!\n");
getFirstNum();
getSecondNum();
result = numDivide(i, j);
printf("%lf \n\n", result);
}
}
printf("Bye!\n");
return 0;
}
/**
* @brief 得到输入的字符,不正确的会要求重新输入
* @return int 返回的int为字符数据
*/
int getChoice(void)
{
printf("Enter the operation of your choice: (a/s/m/d/q)\n");
printf("\t a.add \t\t s.subtract\n");
printf("\t m.mutiply\t\t d.divide\n");
printf("\t q.exit\n\n");
while ((ch = getchar()) != '\n')
{
while (getchar() != '\n')
{
continue; //排除\n用的
}
if (ch == 'a' || ch == 's' || ch == 'm' || ch == 'd' || ch == 'q')
{
return ch;
}
else
{
printf("You have type the wrong character!\n");
printf("Please enter a new character!\n");
}
}
}
/**
* @brief 得到输入的第一个double类型数字
* @return double
*/
void getFirstNum(void)
{
printf("Please input the first num:\n");
while (scanf("%lf", &i) != 1)
{
while ((ch = getchar()) != '\n')
{
putchar(ch);
}
printf(" is not a DOUBLE type of Num!\n"); //反馈错误信息
printf("Please input first num!\n");
}
while (getchar() != '\n')
{
continue; //排除\n用的
}
printf("You have input the first Num is %lf\n", i);
return;
}
/**
* @brief 得到输入的第二个double类型数字
* @return double
*/
void getSecondNum(void)
{
printf("Please input the second num:\n");
while (scanf("%lf", &j) != 1)
{
while ((ch = getchar()) != '\n')
{
putchar(ch);
}
printf(" is not a DOUBLE type of Num!\n"); //反馈错误信息
printf("Please input second num!\n");
}
while (getchar() != '\n')
{
continue; //排除\n用的
}
printf("You have input the second Num is %lf\n", j);
return;
}
/**
* @brief 进行加法运算,不会进行数据校验
* @param i 第一个数据
* @param j 第二个数据
* @return double 计算结果
*/
double numAdd(double i, double j)
{
printf("%lf + %lf equals ", i, j);
return i + j;
}
/**
* @brief 进行减法运算,不会进行数据校验
* @param i 第一个数据
* @param j 第二个数据
* @return double 计算结果
*/
double numSubtract(double i, double j)
{
printf("%lf - %lf equals ", i, j);
return i - j;
}
/**
* @brief 进行除法运算,不会进行数据校验
* @param i 第一个数据
* @param j 第二个数据
* @return double 计算结果
*/
double numDivide(double i, double j)
{
printf("%lf / %lf equals ", i, j);
if (j == 0.0)
{
printf("ERROR! Divide by 0!!!\n");
return 0;
}
return i / j;
}
/**
* @brief 进行乘法运算,不会进行数据校验
* @param i 第一个数据
* @param j 第二个数据
* @return double 计算结果
*/
double numMultiply(double i, double j)
{
printf("%lf * %lf equals ", i, j);
return i * j;
}
int askQuit(void)
{
printf("Do you want to continue? (y/n) \n");
while ((ch = getchar()) != '\n')
{
while (getchar() != '\n')
{
continue; //排除\n用的
}
if (ch == 'y' || ch == 'n')
{
if (ch == 'n')
{
return 0;
}
if (ch == 'y')
{
printf("Let\'s Continue!\n\n");
return 1;
}
}
else
{
printf("You have type the wrong character!\n");
printf("Please enter a new character!\n");
}
}
return 1;
}
本文由aquawius原创发布,本文可以转载,但请注明作者!