模拟使用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)
{
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;
int argc = 0;
int i = 0;
char *argv[10];
for(i=0; buf[i]; i++)
{
if((start == 0) && (!isspace(buf[i])))
{
start = 1;
argv[argc++] = buf + i;
}else if(isspace(buf[i]))
{
start = 0;
buf[i] = 0;
}
}
argv[argc] = NULL;
jisuan(argv,argc);
}
int main()
{
char buf[500];
while(1)
{
scanf("%[^\n]%*c",&buf);
if(strcmp(buf,"exit") == 0) break;
do_calculate(buf);
}
return 0;
}