/*
* 程序功能:简单计算器,实现加减乘除平方
* 作者版本日期:2015.11.08 zhouhb OK
* 源代码:李明 《新概念C语言培训》第33集 C语言Shell命令解释器的实现
* 代码存储位置 :133 /home/zhouhb/test/calculator.c
* 整体思路:函数指针,main函数传参
*/

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

int m_debug = 0;
int (*pf)(int ,int);
char opchar_math;//打印运算符

//函数和名字对应
struct operation{
char name[8];
int (*pf)(int,int);
char opchar;
};

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 divi(int a,int b)//div是C的函数
{
if(b<=0)
return 0;
return a/b;
}
int power(int a,int b)
{
int i = 0,num = 1;
for(i=0;i<b;i++)
{
num = num * a;
}
return num;
}
struct operation op[]={
{"add",add,'+'},
{"sub",sub,'-'},
{"mul",mul,'*'},
{"div",divi,'/'},
{"pow",power,'^'}
};

int math(int argc,char *argv[])
{
int a=0,b=0,num=0;
int result;

a = atoi(argv[1]);
b = atoi(argv[2]);
result = pf(a,b);
printf("%d %c %d = %d\n",a,opchar_math,b,result);
}

//函数和函数指针对应
int command_do(int argc,char* argv[])
{
#if 0
if(strncmp(argv[0],"add",3)==0)
pf = add;
if(strncmp(argv[0],"sub",3)==0)
pf = sub;
if(strncmp(argv[0],"mul",3)==0)
pf = mul;
if(strncmp(argv[0],"divi",4)==0)
pf = divi;
if(strncmp(argv[0],"pow",3)==0)
pf = power;
#endif

int i = 0;
for(i = 0;i<sizeof(op)/sizeof(op[0]);i++)
{
if(strcmp(argv[0],op[i].name)==0)
{
pf = op[i].pf;
opchar_math = op[i].opchar;
break;
}
}
math(argc,argv);
}

//模拟main对输入进行处理
void shell_parse(char* buff)
{
int argc = 0;
char *argv[8];
int state = 0;
int i = 0;

while(*buff)
{
char c = *buff;
if(c == ' '&&state == 0)//" add 100"开始有空格
state = 0;
else if(c != ' '&& state == 0)//"add 100"解析第一个
{
argv[argc++] = buff;
state = 1;
}
else if(c == ' ' && state ==1)//"a dd 100"解析完add遇到空格
{
*buff = '\0';
state = 0;
}
else if(c != ' '&&state == 1)//"add 100"解析add中d
{
state = 1;
}
buff++;
if(*buff == '\n')//传入有回车
*buff = '\n';
}

argv[argc] = NULL;//避免出现乱编
if(m_debug==1)
{
printf("argc = %d\n",argc);
for(i=0;i<argc;i++)
{
printf("argv[%d]:%s\n",i,argv[i]);
}
}

command_do(argc,argv);
}

int main(int argc,char* argv[],char* env[])
{
int i=0;
char buff[254];
int num=0;

if(argc >1 && strlen(argv[1])>1 && strncmp(argv[1],"-d",2)==0)
m_debug = 1;

printf("input name num1 num2\n");
while(1)
{
printf("NCCL#");
fgets(buff,254,stdin);//不用scanf,gets
if(m_debug)
printf("buff=%s\n",buff);
shell_parse(buff);
}

#if 0
printf("argc = %d\n",argc);
for(i=0;i<argc;i++)
{
printf("argv[%d]:%s\n",i,argv[i]);
}
for(i=0;i<=3;i++)
printf("env[%d]:%s\n",i,env[i]);
#endif

}

简单计算器的C实现-函数指针,main函数传参的更多相关文章

  1. C++中的二级指针和指针引用函数传参

    在函数的使用过程中,我们都明白传值和传引用会使实参的值发生改变.那么能够通过传指针改变指针所指向的地址吗? 在解决这个问题之前,也许我们应该先了解指针非常容易混淆的三个属性: ①.指针变量地址(&am ...

  2. VC与JavaScript交互(三) --- CWebPage类调用javascript函数(给js函数传参,并取得返回值)

    ①需要一个别人写好的类CWebPage,将其对于的两个文件WebPage.h和WebPage.cpp添加到工程中. ②添加WebBrowser控件,在视图/对话框类的头文件中#include &quo ...

  3. VC/MFC中通过CWebPage类调用javascript函数(给js函数传参,并取得返回值)

    转自:http://www.cnblogs.com/javaexam2/archive/2012/07/14/2632959.html ①需要一个别人写好的类CWebPage,将其对于的两个文件Web ...

  4. C语言函数指针实验

    上次看Atmel的示例工程,发现人家使用了函数指针的结构体(函数指针结构体).感叹人家的C语言功夫审核,自己费劲还是只能读懂的份.不过,函数指针确实好用.今天就试试这个超牛的东西.Now let's ...

  5. C语言函数指针基础

    本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...

  6. C语言函数指针和回调函数

    彻底搞定C指针-函数名与函数指针 函数名&函数名取地址 函数指针 通常我们可以将指针指向某类型的变量,称为类型指针(如,整型指针).若将一个指针指向函数,则称为函数指针. 函数名的意义 函数名 ...

  7. python笔记之强制函数以关键字参数传参

    最近学习python,学到了函数传参,看到了以下这个特殊情况,特此来做个笔记 def add(*, x, y): print(x, y) 以上函数定义后,该怎么传参?前面的那个*号是做什么用的? 我们 ...

  8. c语言的函数指针和函数指针数组的简单demo

    今天,简单记录一下,函数指针和函数指针数组的使用,废话不多说,直接贴上代码,里面有详细的注释,方便以后查阅. #include <cstdio> #include <Windows. ...

  9. C函数指针简单用例

    (1)函数指针:可以指向 一类 固定形参类型和返回值类型 的函数 的指针声明:int fun(int, int)    ||    \/int (*pfun)(int, int) pfun就是函数指针 ...

随机推荐

  1. Webpack + React 开发 03 props

    React中组件的用法与原生的 HTML 标签完全一致,可以任意加入属性,比如 <HelloWorld name="John"> ,就是 HelloWorld 组件加入 ...

  2. android studio 代码混淆如何忽略第三方jar包

    日前在打包混淆包含第三方jar包的Android studio项目时 报出了各种错误,但是debug版本却能正常运行,于是怀疑android studio 打包的时候把第三方jar包给混淆了,第三方j ...

  3. bzoj 4332 FFT型的快速幂(需要强有力的推导公式能力)

     有n个小朋友,m颗糖,你要把所有糖果分给这些小朋友. 规则第 i 个小朋友没有糖果,那么他之后的小朋友都没有糖果..如果一个小朋友分到了 xx 个糖果,那么的他的权值是 f(x) = ox^2 +  ...

  4. 5.Qt模块简介

    Qt 5 与 Qt 4 最大的一个区别之一是底层架构有了修改.Qt 5 引入了模块化的概念,将众多功能细分到几个模块之中.Qt 4 也有模块的概念,但是是一种很粗的划分,而 Qt 5 则更加细化.本节 ...

  5. Git7:使用Gitlab管理远程仓库

    目录 1.安装 2.gitlab基本配置 3.gitlab的邮件配置 3.1.使用本地的postfix发送邮件 3.2.使用邮件发送模板 3.3.使用腾讯企业邮箱配置发送邮件 3.4.使用163邮箱来 ...

  6. NYOJ 数独 DFS

    数独 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 数独是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一 ...

  7. 容器启动报iptables错误

    # systemctl stop docker # iptables -t nat -F # ifconfig docker0 down # brctl delbr docker0   # 命令由br ...

  8. 监控redis数据库应用状态:python,tornado实现

    公司里最近redis服务器压力越来越大,其大概情况,只能从操作系统层面看,并不详尽,故同事在网上找了一个叫做 redis-live的开源项目,我配合部署了一下,还真有点意思,并解决了其中部分小debu ...

  9. Flash数据的采集方法-搜房房价走势采集

    一般来说flash中的数据是不能被现有技术很容易采集到的,但是也不能谈flash色变,要具体问题具体分析,有些flash是可以通过一些分析发现背后的数据.然后采集就变得很容易了. 具体案例:搜房房价走 ...

  10. 【Foreign】tty的方程math [数学]

    tty的方程math Time Limit: 50 Sec  Memory Limit: 128 MB Description 给定n.m.k.p. a+b+c=n, a^2+b^2+c^2=m, a ...