编写一个程序,显示一个提供加法、减法、乘法、除法的菜单。[C Primer Plus](第六版)8.8

编写一个程序,显示一个提供加法、减法、乘法、除法的菜单。[C Primer Plus](第六版)8.8

参考链接:择yi的博客.

题目:编写一个程序,显示一个提供加法、减法、乘法、除法的菜单。获得用户选择的选项后,程序提示用户输入两个数字,然后执行用户刚才的操作。该程序只接受菜单提供的选项。程序使用float类型的变量储存用户刚才的数字,如果用户输入失败,则允许再次输入。进行除法运算时,如果用户输入0作为第2个数(除数),程序应提示用户重新输入一个新值。

题目要求除正常的加减乘除的算法功能之外,还要求能够:

  • 输入“22 .4"识别成”22.4“正常输入
  • 输入英文以及其他字符,要求重新输入
  • 除法计算除数不能为0,要求重新输入

一、注意

1.字符的输入

每次输入字符时,都非常可能输入之前的换行符’\n’,导致程序不能正常运行。
而 getchar() scanf() 输入字符都会输入之前的’\n’

  1. 在输入之后加 getchar() 能“吃掉”换行符 但是如果其他字符不能“吃掉”
  2. while((ch=geichar())!=’\n’) continue; 能“吃掉”其他的字符

2.scanf()

当scanf("%d",&i)输入不是整型而是字符时,输入并不会储存在i中,用ch=getchar()可得到此时输入的字符。
此时scaf("%d",&i)返回0,输入为整型时返回1。

二、代码

    #include <stdio.h>
    #include <ctype.h>
    
    void display();
    float check(float m);
    void add(float m,float n);
    void subtract(float m,float n);
    void multiply(float m,float n);
    void divide(float m,float n);
    
    int judge;
    
    int main(void)
    {
        float first,second;
        char option;
    
        display();
        scanf("%c",&option);
        getchar();
        while(option!='q')
        {
            printf("Enter first number:");
            judge=scanf("%f",&first);
            first=check(first);
    
            printf("Enter second number:");
            judge=scanf("%f",&second);
            second=check(second);
    
            while(second==0&&option=='d')
                   {
                      printf("Enter a number other than 0:");
                      scanf("%f",&second);
                      check(second);
                   }
            switch(option)
            {
                case 'a':add(first,second);break;
                case 's':subtract(first,second);break;
                case 'm':multiply(first,second);break;
                case 'd':divide(first,second);break;
                default :printf("It doesn't work.\n");break;
            }
    
            display();
            scanf("%c",&option);
            while(getchar() !='\n')
                continue;
        }
        printf("Bye.\n");
    
        return 0;
    }
    
    void display()
    {
        printf("Enter the operation of your choice:\n");
        printf("a. add           s. subtract\n");
        printf("m. multiply      d. divide\n");
        printf("q. quit\n");
    }
    
    float check(float m)
    {
        char ch,sh;
        float other;
        while(judge==0)
        {
            while((ch=getchar())!='\n')
                putchar(ch);
            printf(" is not an number.\n");
            printf("Please enter a number, such as 2.5, -1.78E8, or 3:");
            judge=scanf("%f",&m);
        }
    
        sh=getchar();
        if(sh==' ')
        {
            scanf("%f",&other);
            m+=other;
        }
    
        return m;
    }
    
    void add(float m,float n)
    {
        printf("%.1f + %.1f = %.1f\n",m,n,m+n);
    }
    
    void subtract(float m,float n)
    {
        printf("%.1f - %.1f = %.1f\n",m,n,m-n);
    }
    
    void multiply(float m,float n)
    {
        printf("%.1f * %.1f = %.1f\n",m,n,m*n);
    }
    
    void divide(float m,float n)
    {
        printf("%.1f / %.1f = %.1f\n",m,n,m/n);
    }

三、运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值