C語言opd
『壹』 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*/