模拟使用main函数参数实现简单计算器

模拟使用main函数参数实现简单计算器,其中还用到函数指针、回调函数、指针数组、类等。

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

int ADD(int x, int y)
{
    return x + y;
}

int SUB(int x, int y)
{
    return x - y;
}

int MUL(int x, int y)
{
    return x * y;
}

int DIV(int x, int y)
{
    return x / y;
}

int (*pf)(int a, int b) = NULL;  //定义一个函数指针

struct JISUAN  //创建一个类,其中包括函数相关名称,函数指针,运算符号
{
    char name[8];
    int (*p)(int x, int y);
    char c;
}js[] = 
{
    {"add",ADD,'+'},
    {"sub",SUB,'-'},
    {"mul",MUL,'*'},
    {"div",DIV,'/'}
};  //创建类数组,函数相关字符串,函数地址,函数运算符号
void jisuan(char *argv[], int sz)
{
    int i = 0;
    int x = 0;
    int y = 0;
    pf = NULL;
    for(i=0; i<sizeof(js)/sizeof(struct JISUAN); i++)
    //循环类的个数次,遍历类的个数次
    {
        if(strcmp(js[i].name,argv[0]) == 0)
        //找出与用户输入的运算相同的类名
        {
            pf = js[i].p; 
            //把该类中函数地址赋值给定义的函数指针
            break;
        }
    }
    if(pf != NULL)
//pf不为空时才可以执行以下代码。否则找不到对应函数,后果不堪设想
    {
        x = atoi(argv[1]);
        y = atoi(argv[2]);  //将解析好的字符转换为整数赋值
        printf("%s %c %s = %d\n",argv[1],js[i].c,
                                 argv[2],pf(x,y));
             //计算得出结果并输出
    }
}

do_calculate(char *buf)
{
    int start = 0;    //标记单词,单词开始时标记1,否则标记0
    int argc = 0;
    int i = 0;
    char *argv[10];       //创建一个数组指针
    for(i=0; buf[i]; i++) 
    {
        if((start == 0) && (!isspace(buf[i])))
        //当字符串不为空则进入单词
        {
            start = 1; //将状态置为1
            argv[argc++] = buf + i;
            //将遇到的第一个有效字符地址记录,
            //赋值给数组的第一个元素
        }else  if(isspace(buf[i]))//遇到空字符
        {
            start = 0;  //将状态置为0
            buf[i] = 0; //将空字符改为0,完成切割字符串
        }
    }
    argv[argc] = NULL;  //完成切割后,将后面的指针置为空。
    //for(i=0; i<argc; i++)
    //{
    //  printf("%s ",argv[i]);
    //}
    jisuan(argv,argc); //将切割好的字符拿出来运算
}


int main()
{   
    char buf[500];//定义一个数组接收用户输入
    while(1)
    {   
        scanf("%[^\n]%*c",&buf);
        //接收一串非换行字符,并且将换行符接收并丢弃掉
        //printf("[%s]\n",buf);       //检查是否接收成功
        if(strcmp(buf,"exit") == 0) break;
        //设置退出条件
        do_calculate(buf);    //解析字符串
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41804778/article/details/80233775