(简单题)程序设计基础:简易计算器的设计(急,6.5号16:00截止哦)

课题2.简易计算器的设计

问题描述:能够实现两个数的算术运算功能(加、减、乘、除)

1.基本要求

(1)依次输入第一个操作数、运算符、第二个操作数,然后输出运算结果,例如

输入: 13*8

输出: 13*8=104

(2)对错误的表达式有识别功能,例如输入: 12/0

输出: error! Please input again.

(3)除法运算的结果要保留小数位数2位;(4)当输入“exit”时,退出计算器;

(5)利用函数调用的方法实现计算器的计算功

能。

附上整个系统数据结构的定义及系统源代码,各自定义函数的声明部分中,要求对主要变量的作用进行注释,语句部分中要求对关键语句进行注释,以方便阅读和理解程序。

供参考:

#include <stdio.h>
#include <string.h>

void plus(double a, double b)
{
    printf("%g + %g = %g\n", a, b, a + b);
}
void minus(double a, double b)
{
    printf("%g - %g = %g\n", a, b, a - b);
}
void multiply(double a, double b)
{
    printf("%g * %g = %g\n", a, b, a * b);
}
void divide(double a, double b)
{        
    printf("%g / %g = %.2f\n", a, b, a / b);
}
int main(void)
{
    int  ret;
    char in[64] = { 0 }, x[16], y[16], op[10];
    double a, b;//参加运算的两个数
    while (1)
    {
        gets(in);//输入算式
        if (strcmp(in, "exit") == 0) break; //输入“exit”时,退出计算器
        ret = sscanf(in, "%[0-9.] %[^0-9. ] %[0-9.]", x, op, y);
        if (ret == 3) {
            sscanf(x, "%lf", &a);
            sscanf(y, "%lf", &b);
            if (strcmp(op, "+") == 0)
                plus(a, b);
            else if (strcmp(op, "-") == 0)
                minus(a, b);
            else if (strcmp(op, "*") == 0)
                multiply(a, b);
            else if (strcmp(op, "/") == 0 && b != 0)
                divide(a, b);
            else
                printf("error!Please input again.\n");
        }
        else
            printf("error!Please input again.\n");
    }
    return 0;
}

第一种方法,用简单的switch语句,分别讨论,但是这个有局限性,只能实行二元运算,讨论情况繁多。
第二种方法,用栈,构建两个栈,分别存储运算符和值,把表达式改为后缀表达式或者前缀表达式,进行操作。


#include<stdio.h>

int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int div(int a, int b);


int main(int argc, const char *argv[])
{
    /*
    * 定义接收变量,运算字符;
    */
    int a,b,d;
    char ch;

    /*
    * 赋初值
    */
    a = 0;
    b = 0;
    ch = '0';


    /*
    * 控制台输入运算变量,运算符;
    */
    printf("请输入需要计算的数及运算符;格式如:'num1 +-x/ num2' \n");
    scanf("%d%c%d",&a,&ch,&b);

    /*
    * 输入数据判断
    */
    while((ch != '+')&&(ch != '-')&&(ch != '*')&&(ch != '/'))
    {
        //fflush(stdin);此种清空缓冲区无效
        setbuf(stdin,NULL);
        printf("输入运算符有误,请重新输入:\n");
        scanf("%c",&ch);
    }

    /*
    * 除数为0做判断
    */
    if((ch == '/')&&(b==0))
    {
        setbuf(stdin,NULL);
        printf("除数不能为0,请重新输入:\n");
        scanf("%d",&b);
    }


    /*
    * 识别不同运算字符,做不同的运算;
    */
    switch(ch)
    {
        case '+':
            printf("%d+%d=%d\n",a,b,add(a,b));
            break;
        case '-':
            printf("%d-%d=%d\n",a,b,sub(a,b));
            break;
        case '*':
            printf("%d*%d=%d\n",a,b,mul(a,b));
            break;
        case '/':
            printf("%d/%d=%d\n",a,b,div(a,b));
            break;
        default:
            printf("Error\n");
    }

    return 0;
}

/*
* 定义运算函数
*/
int add(int a, int b)
{
    return a+b;
}

int sub(int a, int b)
{
    return a-b;
}

int mul(int a, int b)
{
    return a*b;
}

int div(int a, int b)
{
    return a/b;
}