/*
* 程序功能:简单计算器,实现加减乘除平方
* 作者版本日期: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. wazuh安装手册

    一.wazhu部署架构 1.服务器上运行的Agent端会将采集到的各种信息通过加密信道传输到管理端. 2.管理端负责分析从代理接收的数据,并在事件与告警规则匹配时触发警报. 3.LogStash会将告 ...

  2. django中的转义

    什么是html转义? 所谓html转义就是将  html关键字(包括标签,特殊字符等)  进行过滤替换.过滤替换格式如下: 接下来我们通过实例演示django中转义的细节以及如何关闭转义 一  dja ...

  3. .Net Framework4.0 ashx页面报错:检测到有潜在危险的Request.Form值

    前些日子做项目的时候遇到一个问题,在ASP.NET 中使用JQuery的AJAX调用一般处理程序ashx出错,在处理程序中错误提示如下:从客户端(Text="<img alt=&quo ...

  4. [非常重要的总结] Linux C相关函数

    (1)字符测试函数 isalnum(测试字符是否为英文字母或数字) isalpha(测试字符是否为英文字母) isascii(测试字符是否为ASCII码字符) isblank(测试字符是否为空格字符) ...

  5. ETL测试

    今天让我在休息之余给我的测试朋友介绍一个在我的测试沙龙上的需要和提升技能之一,例如ETL测试(Extract,Transform,and Load,中文名称为数据提取.转换和加载),这篇文章告诉你ET ...

  6. angularJS 控制输入的百分数在0%-100%之间

    想了老半天了,记录一下 app.directive("percentageCheck", function () { return { restrict: 'A', require ...

  7. [译]Quartz.NET 框架 教程(中文版)2.2.x 之第五课 SimpleTrigger

    第五课 SimpleTrigger 如果你需要在一个指定时间段内执行一次作业任务或是在指定的时间间隔内多次执行作业任务,SimpleTrigger应该能满足你的调度需求.例如,你希望触发器在2015年 ...

  8. [转载]Require.js Example – Setup Time 2 Minutes

    http://www.sitepoint.com/require-js-setup-time-2-minutes/ Setup Require.js in just 2 minutes. or dow ...

  9. 纯javascript代码实现浏览器图片选择预览、旋转、批量上传

    工作中遇到的业务场景,和同事一起研究了下,主要是为了兼容IE版本 其实就是一些琐碎的知识点在网上搜集下解决方式,然后集成了下,主要有以下点: 1. IE input type=file的图片预览要用I ...

  10. 【Hadoop】Win7上搭建Hadoop开发环境,方法一

    在Win7上,编写hadoop程序 操作系统:win7 hadoop版本:CDH3u6 1.下载安装JDK,以及Eclipse 2.新建JAVA Project 3.去cloudera网站下载hado ...