『壹』 c语言中如何实现计算器功能

如果你的表达式不超过一级括号,可以不使用栈.
如你的例题,但象这样不用栈很烦

3*(4*(3+(2+6)/3))

如只有一级,没人写,就加我.

『贰』 C语言:任意算术表达式的求值

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

jmp_buf jmpenv;

double opdstack[100];
char optstack[100];
double* sp1 = opdstack;
char* sp2 = optstack;
#define OPD sp1
#define OPT sp2
#define PUSH( s, n ) (*s++ = n)
#define POP( s ) (*--s)
#define TOP( s ) (*(s-1))
#define V( s ) ((void*)(s))
#define EMPTY( s ) ( V(s) == V(sp1) ? V(s) == V(opdstack) : V(s) == V(optstack) )
#define SIZE( s ) ( (double*)s == sp1 ? (double*)s - opdstack : (char*)s - optstack )

int getpred( char c )
{
char* pred[] = { "0123456789","+-", "*/", "()" };
int i = 0;
for ( i = 0; i < 3; ++i )
if ( strchr( pred[i], c ) != NULL )
break;
return i;
}

void initerror()
{
int r;
switch( r = setjmp( jmpenv ) )
{
case 1: puts( "invalid operator combination." ); break;
case 2: puts( "invalid character." ); break;
case 3: puts( "expression is not valid." ); break;
}
if ( r ) exit( 0 );
}

void docal()
{
double a, b;
char c;
b = POP( OPD );a = POP( OPD );c = POP( OPT );
switch( c )
{
case '+': a += b; break;
case '-': a -= b; break;
case '*': a *= b; break;
case '/': a /= b; break;
default: longjmp( jmpenv, 1 );
}
PUSH( OPD, a );
}

double eval( char* expr )
{
char* fwd = expr;
int n;
double num;
while( *fwd ) {
switch( getpred( *fwd ) )
{
case 0:
sscanf( fwd, "%lf%n", &num, &n );
fwd += n;
PUSH( OPD, num );
if ( *fwd == '(' )
longjmp( jmpenv, 1 );
break;
case 1: case 2:
while( TOP( OPT ) != '(' && SIZE( OPD ) > 1 && getpred( *fwd ) <= getpred( TOP( OPT ) ) )
docal();
PUSH( OPT, *fwd );
++fwd;
break;
case 3:
if ( *fwd == '(' ) {
PUSH( OPT, *fwd );
} else {
while( TOP(OPT) != '(' )
docal();
POP( OPT );
}
++fwd;
break;
default:
longjmp( jmpenv, 2 );
exit( 0 );
break;
}
}
while ( !EMPTY( OPT ) )
docal();
num = POP( OPD );
if( !( EMPTY( OPT ) && EMPTY( OPD ) ) )
longjmp( jmpenv, 3 );
return num;
}

int main()
{
initerror();
char a[100] = "2*12+((1+2)/3)*(3-4/4)";
printf( "example:\n%s=%g\n\n", a, eval( a ) );
printf( "please input a valid expr:\n" );
gets( a );
printf( "%s=%g\n", a, eval( a ) );
}

『叁』 问个很菜鸟的问题 刚接触汇编 JMP NEAR PTR OPD 中的PTR是什么意思

ptr是临时的类型转换,相当于C语言中的强制类型转换

cmp word ptr[si],'#'
是用si所指向的内存的连续两个字节与#比较
要是改成
cmp byte ptr[si],'#'
那就是用si指向的那个存储单元的内容(一个字节)与#比较了

jmp near ptr opd
是无条件转移指令,转移到段内的标号opd所标识的位置(临时说明成近类型)
若是
jmp far ptr opd
那就是转移到另外一个代码段的opd所标识的位置了(远类型)

不管用在什么位置,ptr的作用就是临时指定类型
可以放在ptr前面的类型有byte(字节)、word(字)、dword(双字)、qword(四字)、tbyte(十字节)、far(远类型)和near(近类型)

『肆』 求达人用C语言编写一个带括号的四则运算

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

char* next;

double opd[1000];
int opt;
double *popd = opd;
#define PUSH(n) { *popd++ = n; }
#define POP() (*--popd)
#define TOP() (*(popd-1))
#define EMPTY() (popd == opd)
#define SIZE() (popd - opd)

void fail(char* s)
{
printf("match '%s' failed near '%c'.\n", s, *--next);
exit(0);
}

#define lbr() { if(*next++ == '(') ; else fail("("); }
#define rbr() { if(*next++ == ')') ; else fail(")"); }
void term();
void lv1();
void lv2();
void cal(char);

void expr()
{
term(); lv1();
}

void term()
{
double num = 0;
if(isdigit(*next)) {
do {
num = num * 10 + (*next - '0');
} while(isdigit(*++next));
printf("%g ", num);
PUSH(num);
} else if(*next == '(') {
lbr(); expr(); rbr();
} else {
fail("term");
}
}

void lv1()
{
while(1) {
char c = *next;
if(c == '+' || c == '-') {
++next;
lv2(); printf("%c ", c); ++opt; cal(c);
} else if(*next == '*' || *next == '/') {
lv2();
} else {
break;
}
}
}

void lv2()
{
while(1) {
char c = *next;
if(c == '*' || c == '/') {
++next;
term(); printf("%c ", c); ++opt; cal(c);
} else if(isdigit(*next)) {
term();
} else {
break;
}
}
}

double eval(char* s)
{
next = s;
expr();
if(*next || opt != 0) {
puts("invalid expression.");
exit(0);
}
return TOP();
}

void cal(char c)
{
double lhs, rhs, r;
if(SIZE() > 1) {
rhs = POP();
lhs = POP();
switch(c)
{
case '+': r = lhs + rhs; break;
case '-': r = lhs - rhs; break;
case '*': r = lhs * rhs; break;
case '/': r = lhs / rhs; break;
}
PUSH(r);
--opt;
}
}

int main()
{
printf("\n%g\n", eval("123+213-67*34+345/23*45*(34+34-345+245+567)"));
return 0;
}

『伍』 汽车安装opd有什么作用

汽车安装opd是车载自动诊断系统,作用是在OBDⅡ计划实施之后,任一技师可以使用同一个诊断仪器诊断任何根据标准生产的汽车。

OBD系统将从发动机的运行状况随时监控汽车是否尾气超标,一旦超标就会马上发出警示。当系统出现故障时,故障(MIL)灯或检查发动机(Check Engine)警告灯亮。

同时动力总成控制模块(PCM)将故障信息存入存储器,通过一定的程序可以将故障码从PCM中读出。根据故障码的提示,维修人员能迅速准确地确定故障的性质和部位。OBD的功能之一是当系统点亮故障灯时,记录下全部传感器和驱动器的数据,可以最大程度地满足诊断维修的需要。

(5)C语言opd扩展阅读

SAEJ2010规定了一个5位标准故障代码:

一、第1位

1、P:代表动力系统

2、B:代表车身

3、C:代表底盘

4、u:代表未定义的系统。

二、第2位

1、0:SAE(美国汽车工程师协会)定义的通用故障码

2、1:汽车厂家定义的扩展故障码

3、2或3:随系统字符的不同而不同,动力系统故障码的2或3由SAE留作将来使用。车身或底盘故障码的2为厂家保留,车身或底盘故障码的3由SAE保留。

三、第3位

1、1:燃油或空气计量故障

2、2:燃油或空气计量故障

3、3:点火故障或发动机缺火

4、4:辅助排放控制系统故障

5、5:汽车或怠速控制系统故障

6、6:电脑或输出电路故障

7、7:变速器控制系统

8、8:变速器控制系统

四、最后两位字符表示触发故障码的条件,不同的传感器、执行器和电路分配了不同区段的数字,区段中较小的数字表示通用故障,即通用故障码。较大的数字表示扩展码,提供了更具体的信息,如电压低或高,响应慢,或信号超出范围。

『陆』 c语言程序中怎样实现"任意两个32位数相加"

/*我做了一个,你看看,应该可以很容易懂得*/
/*原来做的是任意两个大数(小于50位的数)相加的*/
/*你这个只要求32位,所以也应该适合的*/
/*不过这段代码是有缺陷的,但你的要求来说,是满足要求的*/

#include<string.h>
#define M 50
main()
{char a[M],b[M],c[M],d[M];
int ia,ib,ic,id;
printf("input a:");
scanf("%s",a);/*输入a*/
printf("\ninput b:");
scanf("%s",b);/*输入b*/
ia=strlen(a);
ib=strlen(b);/*求出a,b的长度(也是输入数据的位数)*/
if(ia>ib){strcpy(c,a);strcpy(d,b);}/*比较两个的长短,把长的那个放到c里,短的放到d里*/
else if(ia==ib&&(a[0]+b[0]-'0'>'9')){/*如果两数位数一样,考虑首位相加进位,并事先多准备一个位置*/
ic=ia+1;c[0]='0';c[1]='\0';strcat(c,a);strcpy(d,b);}
else {strcpy(c,b);strcpy(d,a);}/*比较两个的长短,把长的那个放到c里,短的放到d里*/
ic=strlen(c);
id=strlen(d);/*求出实际参加运算的c,d的长度*/
do{id--;ic--;
c[ic]=c[ic]+d[id]-'0';/*运算*/
if(c[ic]>'9'){c[ic]-=10;c[ic-1]+=1;}/* 处理进位,逢十进一,原位减十,前位加一*/
}while(ic!=0&&id!=0);
printf("\n%s+%s=%s\n",a,b,c);
}

/*具体情况,请参见以下网址*/
/*http://..com/question/13895234.html*/