C语言菜单流程式简易计算器 (带输入验证)

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原创发布,本文可以转载,但请注明作者!

posted @ 2021-08-19 19:28  QU头  阅读(416)  评论(0编辑  收藏  举报