社区
其它技术问题
帖子详情
饼子堂比武贴--在命令行下计算简单的数学表达式
laomai
2006-07-07 11:30:04
如题,给一个简单的数学表达式(包括四则运算和括号),用命令行工具求出他的值。
要求:
1、方法通用,即所用的工具是系统上自带的,无须另外安装软件
2、步骤尽可能简单
3、如达不到2的要求,则方法尽可能BT:-)
优胜者奖励100分,其他人酌情鼓励。
老规矩,抢楼、发灌水回复者杀!
...全文
1678
45
打赏
收藏
饼子堂比武贴--在命令行下计算简单的数学表达式
如题,给一个简单的数学表达式(包括四则运算和括号),用命令行工具求出他的值。 要求: 1、方法通用,即所用的工具是系统上自带的,无须另外安装软件 2、步骤尽可能简单 3、如达不到2的要求,则方法尽可能BT:-) 优胜者奖励100分,其他人酌情鼓励。 老规矩,抢楼、发灌水回复者杀!
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
45 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
KenYuan2016
2007-04-07
打赏
举报
回复
哎呀,我刚好写了1个四则运算的表达式。
不想低调
2007-03-25
打赏
举报
回复
饼子堂比武贴-
老规矩,抢楼、发灌水回复者杀!
。。。好偏激。。
FengYuanMSFT
2007-03-25
打赏
举报
回复
class CExpression
{
const char * m_exp;
double m_number;
char m_token;
public:
CExpression(const char * exp) : m_exp(exp)
{
}
void GetToken(void)
{
while (isspace(*m_exp))
{
m_exp ++;
}
if (isdigit(*m_exp))
{
m_number = 0;
while (isdigit(*m_exp))
{
m_number = m_number * 10 + (*m_exp - '0');
m_exp ++;
}
m_token = '0';
}
else
{
m_token = * m_exp ++;
}
}
double Factor()
{
double val;
switch (m_token)
{
case '0':
val = m_number;
GetToken();
break;
case '-':
GetToken();
return - Factor();
case '(':
GetToken();
val = Expression();
assert(m_token == ')');
GetToken();
break;
default:
assert(false);
}
return val;
}
double Term()
{
double val1 = Factor();
char oper = m_token;
while ((oper == '*') | (oper == '/'))
{
GetToken();
double val2 = Factor();
if (oper == '*')
{
val1 *= val2;
}
else
{
val1 /= val2;
}
oper = m_token;
}
return val1;
}
double Expression()
{
double val1 = Term();
char oper = m_token;
while ((oper == '+') | (oper == '-'))
{
GetToken();
double val2 = Term();
if (oper == '+')
{
val1 += val2;
}
else
{
val1 -= val2;
}
oper = m_token;
}
return val1;
}
};
void Test()
{
CExpression exp(" 1 + 2 / 4 ");
exp.GetToken();
double val = exp.Expression();
}
FengYuanMSFT
2007-03-25
打赏
举报
回复
up
chenqiu1024
2007-03-24
打赏
举报
回复
MS YDYS
Long_Sword
2007-01-29
打赏
举报
回复
这问题 linix unix 下很容易 我就不写了 ,搂主 给点分巴。
借用搂主的地盘。
我叫 长剑 是这里的新手,特别喜欢讨论技术,尤其是 C/C++ 技术。在5年工作中积累了很多经验和问题想和各位说说。
直接说问题: 有一个项目4个成手两年能够完成,但是项目部要求一年内完成。我们派了 10位主力( 每个都是成手+ )程序员,结果非常遗憾没有完成项目。延期半年多。项目长被拿下。 次年我们同样遇到这样的问题,多个项目遇到这样的问题。
现在软件开发中出现了这样的数学问题 4*2 〉10,在实际工作中我们得到实际结果数据是这样的 4*2 ~= 12*1 ; 4*2 ~= 30*( 6个月 )。
这样的问题不只在我们公司,据我了解 (同学交流),百度,联想 ,方正 ,等国内大型软件企业以及国际知名软件企业如 微软,google ,思科,都存在这样的问题。
****************对以上问题个人经验( 我讲些实际数据供大家参考 ):
数据1。我们公司是一家 大型软件公司(不便说出名字),怎么形容呢,联想阿方正阿赫我们公司比起来肯定算是 小公司,我们公司是 世界100强(为了让你掌握问题的真实数据),说这些是想让你打消我们没有好的设计人员这个念头 。
数据2。这个问题公司是在2003年发现并重视且不断在实际中探索解决方法,我们大约有将近 几十位项目长都对这样的实际问题困扰,我个人也关注这个问题2-3年了,我们一直没有解决这个问题。
数据3。我们研发的都是大型研发项目开发成本高达上亿,(c++)代码在100万以上,上面那个提到的被拿下的项目长所带的是我们的子项目最终完成后代码~20万,在~13万的时候就被拿下了。
数据4。我就是那个项目的一员,我不是项目长。但是我关心这个问题。我既是喜欢研究问题而已。
===================我个人的分析:
第一决不是设计实现的问题。
第二应该不是软件管理实施问题。
第三应该不是 沟通交流等协同工作问题 。
我个人偏向于 软件过程问题。就是 开发过程 的设计问题。
不同的软件模型应该采用 不同的开发实施过程。
%%%%%%%%%%%% 希望有过经验或是有启发的朋友多多回帖!
希望到我blog回帖 这个版我发不出来贴。
Oversense
2007-01-22
打赏
举报
回复
zzzl 正解
zzzl
2007-01-20
打赏
举报
回复
显示、设置或删除 cmd.exe 环境变量。
SET [variable=[string]]
variable 指定环境变量名。
string 指定要指派给变量的一系列字符串。
要显示当前环境变量,键入不带参数的 SET。
如果命令扩展名被启用,SET 会如下改变:
可仅用一个变量激活 SET 命令,等号或值不显示所有前缀匹配
SET 命令已使用的名称的所有变量的值。例如:
SET P
会显示所有以字母 P 打头的变量
如果在当前环境中找不到该变量名称,SET 命令将把 ERRORLEVEL
设置成 1。
SET 命令不允许变量名含有等号。
在 SET 命令中添加了两个新命令行开关:
SET /A expression
SET /P variable=[promptString]
/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
评估器很简单并以递减的优先权顺序支持下列操作:
() - 分组
! ~ - - 一元运算符
* / % - 算数运算符
+ - - 算数运算符
<< >> - 逻辑移位
- 按位“与”
^ - 按位“异”
| - 按位“或”
= *= /= %= += -= - 赋值
&= ^= |= <<= >>=
, - 表达式分隔符
如果您使用任何逻辑或取余操作符, 您需要将表达式字符串用
引号扩起来。在表达式中的任何非数字字符串键作为环境变量
名称,这些环境变量名称的值已在使用前转换成数字。如果指定
了一个环境变量名称,但未在当前环境中定义,那么值将被定为
零。这使您可以使用环境变量值做计算而不用键入那些 % 符号
来得到它们的值。如果 SET /A 在命令脚本外的命令行执行的,
那么它显示该表达式的最后值。该分配的操作符在分配的操作符
左边需要一个环境变量名称。除十六进制有 0x 前缀, 八进制
有 0 前缀的,数字值为十进位数字。因此, 0x12 与 18 和 022
相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,
因为 8 和 9 不是有效的八进制位数。
/P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入
行之前,显示指定的 promptString。promptString 可以是空的。
环境变量替换已如下增强:
%PATH:str1=str2%
会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
也可以为扩展名指定子字符串。
%PATH:~10,5%
会扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏
移量 10)字符开始的五个字符。如果没有指定长度,则采用默认
值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数,
使用的数字则是环境变量数值长度加上指定的偏移量或长度。
%PATH:~-10%
会提取 PATH 变量的最后十个字符。
%PATH:~0,-2%
会提取 PATH 变量的所有字符,除了最后两个。
终于添加了延迟环境变量扩充的支持。该支持总是按默认值被
停用,但也可以通过 CMD.EXE 的 /V 命令行开关而被启用/停用。
请参阅 CMD /?
考虑到读取一行文本时所遇到的目前扩充的限制时,延迟环境
变量扩充是很有用的,而不是执行的时候。以下例子说明直接
变量扩充的问题:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
不会显示消息,因为在读到第一个 IF 语句时,BOTH IF 语句中
的 %VAR% 会被代替;原因是: 它包含 IF 的文体,IF 是一个
复合语句。所以,复合语句中的 IF 实际上是在比较 "before" 和
"after",这两者永远不会相等。同样,以下这个例子也不会达到
预期效果:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
原因是,它不会在目前的目录中建立一个文件列表,而只是将
LIST 变量设成找到的最后一个文件。这也是因为 %LIST% 在
FOR 语句被读取时,只被扩充了一次;而且,那时的 LIST 变量
是空的。因此,我们真正执行的 FOR 循环是:
for %i in (*) do set LIST= %i
这个循环继续将 LIST 设成找到的最后一个文件。
延迟环境变量扩充允许您使用一个不同的字符(惊叹号)在执行
时间扩充环境变量。如果延迟的变量扩充被启用,可以将上面
例子写成以下所示,以达到预期效果:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%
如果命令扩展名被启用,有几个动态环境变量可以被扩展,但
不会出现在 SET 显示的变量列表中。每次变量数值被扩展时,
这些变量数值都会被动态计算。如果用户用这些名称中任何
一个定义变量,那个定义会替代下面描述的动态定义:
%CD% - 扩展到当前目录字符串。
%DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。
%TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。
%RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。
%ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。
%CMDEXTVERSION% - 扩展到当前命令处理器扩展名版本号。
%CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。
zzzl
2007-01-20
打赏
举报
回复
看来这分是我的了
set /a2+3
lbing7
2007-01-19
打赏
举报
回复
用232传到单片机,算完再送回来...
yuanchuang
2006-10-27
打赏
举报
回复
好长时间没有回帖了,借村长宝地留名冒泡。
事先打好招呼,不带删回复的,嘿嘿
Jokar
2006-10-25
打赏
举报
回复
借问:饼子堂到底是什么东西:)
DarknessTM
2006-10-25
打赏
举报
回复
居然没人用 VBS?或者说HTML+JavaScript
goodbee
2006-10-11
打赏
举报
回复
太强悍了。还是比winodws吧,*nix下的到底什么叫自带的不好定义阿
OOPhaisky
2006-09-07
打赏
举报
回复
比武贴阿,我的内功不好^_^
mathe
2006-09-01
打赏
举报
回复
呵呵,比较有意思.
gdb算不算?
可以
p 1+2
mathe
2006-09-01
打赏
举报
回复
村支书的还有个问题
#include <stdio.h>同后面的必须分行.
不过实际上c当中我们可以不需要这个头文件,可以简化为:
echo 'main(){ printf("%d", expr);}' > p.c && gcc p.c && ./a.out && rm a.out&& rm p.c
Arthur_
2006-08-28
打赏
举报
回复
elisp可以嗎
gemenhao
2006-08-15
打赏
举报
回复
//欢迎测试
//可以输入 + - / * 和()以及数字
// "-"只表示减法,有些情况无法正确输出 如 1 - (-1), -1等
#include <deque>
using namespace std;
struct expre{
char oper;
int priority;
expre(char Oper){
oper = Oper;
if (Oper == '+' || Oper == '-')
priority = 1;
else if (Oper == '*' || Oper == '/')
priority = 2;
else if (Oper == '(')
priority = 3;
else if (Oper == ')')
priority = 0;
}
};
deque<int> dint;
deque<expre> dexp;
void cal(){
if (dint.size() < 2 || dexp.size() < 1)
return;
int a = dint.back(); dint.pop_back();
int b = dint.back(); dint.pop_back();
char oper = dexp.back().oper;
if (oper == '*')
dint.push_back(a * b);
else if (oper == '/')
dint.push_back(b / a);
else if (oper == '+')
dint.push_back(a + b);
else if (oper == '-')
dint.push_back(b - a);
dexp.pop_back();
}
int atoi(char* &exp){
int num = 0;
while(*exp >= '0' && *exp <= '9')
num = 10*num + *exp++ - '0';
exp--;
return num;
}
int expval(char *exp){
while(*exp){
char c = *exp;
if (c >= '0' && c <= '9'){
dint.push_back(atoi(exp));
if (dint.size() >= 2 && dexp.back().priority == 2)
cal();
}
else if (c == '+' || c == '-' || c == '*' || c == '/' ){
dexp.push_back(expre(c));
if (dint.size() >= 2 && dexp[dexp.size() - 2].priority != 3 && dexp.back().priority <= dexp[dexp.size() - 2].priority ){
dexp.pop_back();
cal();
dexp.push_back(expre(c));
}
}
else if (c == '(' || c == ')'){
if (c == ')'){
while (dexp.back().oper != '(')
cal();
dexp.pop_back();
}
else
dexp.push_back(expre(c));
while (dexp.size() > 0 && dexp.back().priority == 2 )
cal();
}
exp++;
}
while (dint.size() >= 2)
cal();
int ab = dint[0];
dint.clear();
dexp.clear();
return ab;
}
int main( )
{
char exp[110];
while (gets(exp) && *exp)
printf("%s = %d\n",exp,expval(exp));
return 0;
}
eplanet
2006-08-07
打赏
举报
回复
还是用搜索引擎的方法最XX
加载更多回复(25)
WMI学习技术知识必须要知道的内容(1)(转)
原文地址:http://blog.csdn.net/bubble4629/article/details/3793174 WMI和软件开发 通常软件开发工作可以进行分类,这取决于它们将重点放在结构的哪个部件—应用程序、Schema或提供程序。 应用程序开发—通过收集和分析管理数据以及报告和反应事件通知来交付产品 WMI对象模型通信时,应用程序可以使用: ...
WMI基础知识(整理中)
文章目录一、基本语法架构(一)什么是WMI?(二)WMI的组成部分:(三)获取这些具体属性信息的步骤(编写脚本的步骤):1、过程概述2、过程标准步骤1、命名空间常用命名空间2、常用脚本对象库(五)获取属性实例步骤拆解获取过程拆解1、初始化,定义SWbemLocator的实例2、将实例连接3、获取数据集合4、获得精确结果二、语法架构详解(一)创建实例和连接1、标准方式:先创建实例,后连接2、创建并连接方式(1)用**SwbemLocator**对象的**ConnectServer方法**连接(2)用**mon
WMI的讲解(是什么,做什么,为什么)
讲在前面: 笔者在阅读了WMI的微软官方文档以及国内优秀前辈的介绍文章后,获益匪浅,WMI是一个较为老的知识点了,但是对于想要
简单
理解WMI的同学来说,对于一个新的知识点进行理解最好是能够有生动形象的例子进行抛砖引玉式的解读,将晦涩难懂的知识点吃透、理解后用
简单
的话语将其作用表达清楚,使其读者能够快速的理解并为读者接下来深入理解打好基础,以便在攻防中更好的利用WMI,所以此篇文章笔者使用通俗的话语将WMI表达清楚,在下文中对于基础薄弱的同学对于COM组件、Pr
WMI系列--关于WMI
WMI的全称是,即Windows管理规范,在Windows操作系统中,随着WMI技术的引入并在之后随着时间的推移而过时,它作为一项功能强大的技术,从和Windows 95开始,始终保持其一致性。它出现在所有的Windows操作系统中,并由一组强大的工具集合组成,用于管理本地或远程的Windows系统。虽然WMI已经被大众熟知,并且从其创始以来,已经被系统管理员大量使用,但随着WMI。
WMI攻击-基础篇(一)
为什么是WMI?WMI 是 Microsoft 的一组规范,是为了对 Windows 系统进行快速高效的管理。WMI 存在于所有可用的 Windows 操作系统版本中。正如你可能知道的那样,安全规则说“任何对管理有用的东西也很容易被攻击者滥用”。WMI 确实可以做很多事情——从收集
计算
机状态和配置设置到运行应用程序和执行代码。什么是WMI?
其它技术问题
3,881
社区成员
9,044
社区内容
发帖
与我相关
我的任务
其它技术问题
C/C++ 其它技术问题
复制链接
扫一扫
分享
社区描述
C/C++ 其它技术问题
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章